diff --git a/app/app/channels/paystubs_channel.rb b/app/app/channels/paystubs_channel.rb index 4de688ca..ca6e4639 100644 --- a/app/app/channels/paystubs_channel.rb +++ b/app/app/channels/paystubs_channel.rb @@ -15,10 +15,6 @@ def check_pinwheel_account_synchrony broadcast_to(@cbv_flow, { event: "cbv.status_update", account_id: pinwheel_account.pinwheel_account_id, - employment: pinwheel_account.job_completed?("employment"), - identity: pinwheel_account.job_completed?("identity"), - paystubs: pinwheel_account.job_completed?("paystubs"), - income: pinwheel_account.job_completed?("income"), has_fully_synced: pinwheel_account.has_fully_synced? }) end diff --git a/app/app/controllers/cbv/synchronizations_controller.rb b/app/app/controllers/cbv/synchronizations_controller.rb index 5c2bf3eb..458d05c0 100644 --- a/app/app/controllers/cbv/synchronizations_controller.rb +++ b/app/app/controllers/cbv/synchronizations_controller.rb @@ -1,6 +1,4 @@ class Cbv::SynchronizationsController < Cbv::BaseController - helper_method :job_completed? - def show account_id = params[:user][:account_id] @@ -10,10 +8,4 @@ def show redirect_to cbv_flow_payment_details_path(user: { account_id: @pinwheel_account.pinwheel_account_id }) end end - - private - - def job_completed?(job) - @pinwheel_account.present? && @pinwheel_account.job_completed?(job) - end end diff --git a/app/app/controllers/webhooks/pinwheel/events_controller.rb b/app/app/controllers/webhooks/pinwheel/events_controller.rb index c2bd4122..79b0bf60 100644 --- a/app/app/controllers/webhooks/pinwheel/events_controller.rb +++ b/app/app/controllers/webhooks/pinwheel/events_controller.rb @@ -30,8 +30,9 @@ def create track_account_synced_event(@cbv_flow, pinwheel_account) PaystubsChannel.broadcast_to(@cbv_flow, { - event: "cbv.payroll_data_available", - account_id: params["payload"]["account_id"] + event: "cbv.status_update", + account_id: params["payload"]["account_id"], + has_fully_synced: true }) end end diff --git a/app/app/helpers/application_helper.rb b/app/app/helpers/application_helper.rb index 7e5a63dd..f1b7413a 100644 --- a/app/app/helpers/application_helper.rb +++ b/app/app/helpers/application_helper.rb @@ -68,4 +68,9 @@ def feedback_form_url APPLICANT_FEEDBACK_FORM end end + + # some job statuses we consider completed even if they failed + def coalesce_to_completed(status) + [ :unsupported, :failed ].include?(status) ? :completed : status + end end diff --git a/app/app/javascript/controllers/cbv/synchronizations_controller.js b/app/app/javascript/controllers/cbv/synchronizations_controller.js index 8a56021b..0da0c017 100644 --- a/app/app/javascript/controllers/cbv/synchronizations_controller.js +++ b/app/app/javascript/controllers/cbv/synchronizations_controller.js @@ -2,20 +2,10 @@ import { Controller } from "@hotwired/stimulus" import * as ActionCable from '@rails/actioncable' export default class extends Controller { - static targets = ["form", "userAccountId", "employmentJob", "identityJob", "paystubsJob", "incomeJob"]; + static targets = ["form", "userAccountId"]; cable = ActionCable.createConsumer(); - updateIndicatorStatus(element, completed) { - if (completed) { - element.querySelector('.completed').classList.remove('display-none'); - element.querySelector('.in-progress').classList.add('display-none'); - } else { - element.querySelector('.completed').classList.add('display-none'); - element.querySelector('.in-progress').classList.remove('display-none'); - } - } - connect() { this.cable.subscriptions.create({ channel: 'PaystubsChannel', account_id: this.userAccountIdTarget.value }, { connected: () => { @@ -31,11 +21,6 @@ export default class extends Controller { this.userAccountIdTarget.value = accountId; this.formTarget.submit(); } - - this.updateIndicatorStatus(this.employmentJobTarget, data.employment); - this.updateIndicatorStatus(this.identityJobTarget, data.identity); - this.updateIndicatorStatus(this.paystubsJobTarget, data.paystubs); - this.updateIndicatorStatus(this.incomeJobTarget, data.income); } } }); diff --git a/app/app/models/pinwheel_account.rb b/app/app/models/pinwheel_account.rb index ad3d19da..00a37bbd 100644 --- a/app/app/models/pinwheel_account.rb +++ b/app/app/models/pinwheel_account.rb @@ -1,6 +1,12 @@ class PinwheelAccount < ApplicationRecord belongs_to :cbv_flow + after_update_commit { + I18n.with_locale(cbv_flow.cbv_flow_invitation.language) do + broadcast_replace target: self, partial: "cbv/synchronizations/indicators", locals: { pinwheel_account: self } + end + } + EVENTS_MAP = { "employment.added" => :employment_synced_at, "income.added" => :income_synced_at, @@ -29,11 +35,19 @@ def job_succeeded?(job) supported_jobs.include?(job) && send(sync_column).present? && send(error_column).blank? end - def job_completed?(job) + def synchronization_status(job) error_column, sync_column = event_columns_for(job) return nil unless error_column.present? - supported_jobs.include?(job) && (send(sync_column).present? || send(error_column).present?) + if supported_jobs.exclude?(job) + :unsupported + elsif job_succeeded?(job) + :succeeded + elsif supported_jobs.include?(job) && (send(sync_column).blank? && send(error_column).blank?) + :in_progress + elsif supported_jobs.include?(job) && (send(error_column).present?) + :failed + end end private diff --git a/app/app/views/cbv/synchronizations/_indicator.html.erb b/app/app/views/cbv/synchronizations/_indicator.html.erb index 99a34506..9cb02d01 100644 --- a/app/app/views/cbv/synchronizations/_indicator.html.erb +++ b/app/app/views/cbv/synchronizations/_indicator.html.erb @@ -1,11 +1,38 @@ - usa-icon border-05 rotate border-base-light radius-pill padding-1 usa-icon--size-5" aria-hidden="true" focusable="false" role="img"> - " - > - +<% if status == :in_progress %> +
+ +
+
+ <%= label %> +
+<% end %> - usa-icon border-05 bg-primary text-white border-primary radius-pill padding-1 usa-icon--size-5" aria-hidden="true" focusable="false" role="img"> - " - > - +<% if status == :succeeded || status == :completed %> +
+ +
+
+ <%= label %> +
+<% end %> + +<% if status == :failed %> +
+ +
+
+ <%= label %> +
+<% end %> diff --git a/app/app/views/cbv/synchronizations/_indicators.html.erb b/app/app/views/cbv/synchronizations/_indicators.html.erb new file mode 100644 index 00000000..4b9c3a1b --- /dev/null +++ b/app/app/views/cbv/synchronizations/_indicators.html.erb @@ -0,0 +1,22 @@ +
+
+ <%= render partial: "cbv/synchronizations/indicator", locals: { label: t(".income"), status: coalesce_to_completed(pinwheel_account.synchronization_status("income")) } %> +
+
+ <%= render partial: "cbv/synchronizations/indicator", locals: { label: t(".employment"), status: coalesce_to_completed(pinwheel_account.synchronization_status("employment")) } %> +
+
+ <%= render partial: "cbv/synchronizations/indicator", locals: { label: t(".paystubs"), status: pinwheel_account.synchronization_status("paystubs") } %> +
+
+ <%= render partial: "cbv/synchronizations/indicator", locals: { label: t(".identity"), status: coalesce_to_completed(pinwheel_account.synchronization_status("identity")) } %> +
+
diff --git a/app/app/views/cbv/synchronizations/show.html.erb b/app/app/views/cbv/synchronizations/show.html.erb index 0483d915..c81ec8f5 100644 --- a/app/app/views/cbv/synchronizations/show.html.erb +++ b/app/app/views/cbv/synchronizations/show.html.erb @@ -12,35 +12,9 @@
-
-
- <%= render partial: "cbv/synchronizations/indicator", locals: { completed: job_completed?("income") } %> -

<%= t(".jobs.income") %>

-
-
- <%= render partial: "cbv/synchronizations/indicator", locals: { completed: job_completed?("employment") } %> -

<%= t(".jobs.employment") %>

-
-
- <%= render partial: "cbv/synchronizations/indicator", locals: { completed: job_completed?("paystubs") } %> -

<%= t(".jobs.paystubs") %>

-
-
- <%= render partial: "cbv/synchronizations/indicator", locals: { completed: job_completed?("identity") } %> -

<%= t(".jobs.identity") %>

-
-
+ <%= turbo_stream_from(@pinwheel_account) %> + <% if @pinwheel_account.present? %> + <%= render partial: "cbv/synchronizations/indicators", locals: { pinwheel_account: @pinwheel_account } %> + <% end %>
diff --git a/app/config/locales/en.yml b/app/config/locales/en.yml index cdb2e6b7..c0bbadfa 100644 --- a/app/config/locales/en.yml +++ b/app/config/locales/en.yml @@ -364,14 +364,14 @@ en: update: consent_to_authorize_warning: You must check the legal agreement checkbox to proceed. synchronizations: + indicators: + employment: Employment + identity: Personal details + income: Income + paystubs: Paystubs show: fetching_payroll_description: This may take a few minutes. Please keep this window open while we work on this. header: We’re gathering your payment details from your employer - jobs: - employment: Employment - identity: Personal details - income: Income - paystubs: Paystubs date: formats: default: "%Y-%m-%d" diff --git a/app/config/locales/es.yml b/app/config/locales/es.yml index 93f4b37d..8fc7b310 100644 --- a/app/config/locales/es.yml +++ b/app/config/locales/es.yml @@ -240,14 +240,14 @@ es: update: consent_to_authorize_warning: Debe marcar la casilla de acuerdo legal para proceder. synchronizations: + indicators: + employment: Empleo + identity: Datos personales + income: Ingresos + paystubs: Recibos de pago show: fetching_payroll_description: Esto puede tardar unos minutos. Mantenga esta ventana abierta mientras trabajamos en esto. header: Estamos recopilando los datos de pago de su empleador - jobs: - employment: Empleo - identity: Datos personales - income: Ingresos - paystubs: Recibos de pago date: abbr_day_names: - Dom diff --git a/app/spec/helpers/application_helper_spec.rb b/app/spec/helpers/application_helper_spec.rb index 373cb0fd..2261a77d 100644 --- a/app/spec/helpers/application_helper_spec.rb +++ b/app/spec/helpers/application_helper_spec.rb @@ -119,4 +119,14 @@ end end end + + describe "#coalesce_to_completed" do + it "returns succeeded when the status is failed" do + expect(helper.coalesce_to_completed(:failed)).to eq(:completed) + end + + it "returns in progress when the status is in progress" do + expect(helper.coalesce_to_completed(:in_progress)).to eq(:in_progress) + end + end end diff --git a/app/spec/models/pinwheel_account_spec.rb b/app/spec/models/pinwheel_account_spec.rb index f8544b90..7ed9277f 100644 --- a/app/spec/models/pinwheel_account_spec.rb +++ b/app/spec/models/pinwheel_account_spec.rb @@ -71,4 +71,34 @@ end end end + + describe "#synchronization_status" do + context "when status is succeeded" do + it "returns succeeded" do + pinwheel_account.update!(income_synced_at: Time.current) + expect(pinwheel_account.synchronization_status('income')).to eq(:succeeded) + end + end + + context "when status is failed" do + it "returns failed" do + pinwheel_account.update!(income_synced_at: Time.current, income_errored_at: Time.current) + expect(pinwheel_account.synchronization_status('income')).to eq(:failed) + end + end + + context "when status is in_progress" do + it "returns in_progress" do + pinwheel_account.update!(income_synced_at: nil, income_errored_at: nil) + expect(pinwheel_account.synchronization_status('income')).to eq(:in_progress) + end + end + + context "when status is unsupported" do + it "returns unsupported" do + pinwheel_account.update!(supported_jobs: supported_jobs.reject { |job| job == 'income' }) + expect(pinwheel_account.synchronization_status('income')).to eq(:unsupported) + end + end + end end