From ee155eab881402a10409eb46cab4489b0ef0b1dd Mon Sep 17 00:00:00 2001 From: Matt Gardner Date: Mon, 26 Aug 2024 12:31:27 -0400 Subject: [PATCH] 987: Adds Caseworker PDF view (#219) * WIP * Passing rspec * Remove vestigial * Map in all found identities * Use locals * Check for correct job * Add supported for identity job --- .../pinwheel_data_point_component.rb | 7 +++ .../controllers/cbv/summaries_controller.rb | 6 +- .../concerns/cbv/reports_helper.rb | 22 +++++++- app/app/mailers/caseworker_mailer.rb | 5 +- app/app/models/pinwheel_account.rb | 5 +- app/app/services/pinwheel_service.rb | 4 ++ app/app/services/pinwheel_webhook_manager.rb | 1 + app/app/views/cbv/summaries/show.pdf.erb | 53 +++++++++++++++++- app/config/locales/en.yml | 13 +++++ ...050_add_error_event_column_for_identity.rb | 6 ++ app/db/schema.rb | 4 +- .../cbv/summaries_controller_spec.rb | 4 +- .../concerns/cbv/reports_helper_spec.rb | 7 ++- app/spec/factories/pinwheel_account.rb | 1 + app/spec/mailers/caseworker_mailer_spec.rb | 4 +- .../previews/caseworker_mailer_preview.rb | 3 +- .../pinwheel/request_identity_response.json | 1 + app/spec/support/pinwheel_api_helper.rb | 9 +++ app/spec/support/test_helpers.rb | 32 +++++++++++ docs/app/rendered/database-schema.pdf | Bin 36883 -> 37158 bytes 20 files changed, 173 insertions(+), 14 deletions(-) create mode 100644 app/db/migrate/20240826161050_add_error_event_column_for_identity.rb create mode 100644 app/spec/support/fixtures/pinwheel/request_identity_response.json diff --git a/app/app/components/pinwheel_data_point_component.rb b/app/app/components/pinwheel_data_point_component.rb index 11bbe879..300cc810 100644 --- a/app/app/components/pinwheel_data_point_component.rb +++ b/app/app/components/pinwheel_data_point_component.rb @@ -97,4 +97,11 @@ def employer_address(address) value: address } end + + def client_full_name(full_name) + { + label: I18n.t("cbv.summaries.show.pdf.caseworker.client_full_name"), + value: full_name + } + end end diff --git a/app/app/controllers/cbv/summaries_controller.rb b/app/app/controllers/cbv/summaries_controller.rb index ff0172f9..a2baadb8 100644 --- a/app/app/controllers/cbv/summaries_controller.rb +++ b/app/app/controllers/cbv/summaries_controller.rb @@ -6,6 +6,7 @@ class Cbv::SummariesController < Cbv::BaseController before_action :set_employments, only: %i[show update] before_action :set_incomes, only: %i[show update] before_action :set_payments, only: %i[show update] + before_action :set_identities, only: %i[show update] skip_before_action :ensure_cbv_flow_not_yet_complete, if: -> { params[:format] == "pdf" } def show @@ -22,7 +23,7 @@ def show cbv_flow_id: @cbv_flow.id }) - render pdf: "#{@cbv_flow.id}", layout: "pdf" + render pdf: "#{@cbv_flow.id}", layout: "pdf", locals: { is_caseworker: false } end end end @@ -70,7 +71,8 @@ def transmit_to_caseworker cbv_flow: @cbv_flow, payments: @payments, employments: @employments, - incomes: @incomes + incomes: @incomes, + identities: @identities ).summary_email.deliver_now @cbv_flow.touch(:transmitted_at) end diff --git a/app/app/controllers/concerns/cbv/reports_helper.rb b/app/app/controllers/concerns/cbv/reports_helper.rb index e7f3ac97..b8d60213 100644 --- a/app/app/controllers/concerns/cbv/reports_helper.rb +++ b/app/app/controllers/concerns/cbv/reports_helper.rb @@ -4,7 +4,7 @@ module Cbv::ReportsHelper include Cbv::PaymentsHelper def payments_grouped_by_employer - summarize_by_employer(@payments, @employments, @incomes) + summarize_by_employer(@payments, @employments, @incomes, @identities) end def set_employments(account_id = nil) @@ -15,11 +15,15 @@ def set_incomes(account_id = nil) @incomes = account_id.nil? ? fetch_incomes : fetch_incomes_for_account_id(account_id) end + def set_identities(account_id = nil) + @identities = account_id.nil? ? fetch_identities : fetch_identity_for_account_id(account_id) + end + def total_gross_income @payments.reduce(0) { |sum, payment| sum + payment[:gross_pay_amount] } end - def summarize_by_employer(payments, employments, incomes) + def summarize_by_employer(payments, employments, incomes, identities) payments .each_with_object({}) do |payment, hash| account_id = payment[:account_id] @@ -33,7 +37,8 @@ def summarize_by_employer(payments, employments, incomes) has_income_data: has_income_data, has_employment_data: has_employment_data, income: has_income_data && incomes.find { |income| income["account_id"] == account_id }, - employment: has_employment_data && employments.find { |employment| employment["account_id"] == account_id } + employment: has_employment_data && employments.find { |employment| employment["account_id"] == account_id }, + identity: identities.find { |identity| identity["account_id"] == account_id } } hash[account_id][:total] += payment[:gross_pay_amount] hash[account_id][:payments] << payment @@ -64,6 +69,17 @@ def fetch_incomes_for_account_id(account_id) pinwheel.fetch_income_metadata(account_id: account_id)["data"] end + def fetch_identities + fetch_end_user_account_ids.map do |account_id| + next [] unless does_pinwheel_account_support_job?(account_id, "identity") + fetch_identity_for_account_id account_id + end.flatten + end + + def fetch_identity_for_account_id(account_id) + pinwheel.fetch_identity(account_id: account_id)["data"] + end + def does_pinwheel_account_support_job?(account_id, job) pinwheel_account = PinwheelAccount.find_by_pinwheel_account_id(account_id) return false unless pinwheel_account diff --git a/app/app/mailers/caseworker_mailer.rb b/app/app/mailers/caseworker_mailer.rb index b45aa2da..e103aa2b 100644 --- a/app/app/mailers/caseworker_mailer.rb +++ b/app/app/mailers/caseworker_mailer.rb @@ -23,11 +23,14 @@ def set_params @payments = params[:payments] if params[:payments] @employments = params[:employments] @incomes = params[:incomes] + @identities = params[:identities] + # shows caseworker-specific data + @is_caseworker = true end def generate_pdf WickedPdf.new.pdf_from_string( - render_to_string(template: "cbv/summaries/show", layout: "pdf", formats: [ :pdf ]) + render_to_string(template: "cbv/summaries/show", layout: "pdf", formats: [ :pdf ], locals: { is_caseworker: true }) ) end end diff --git a/app/app/models/pinwheel_account.rb b/app/app/models/pinwheel_account.rb index e38c1593..3a23ed74 100644 --- a/app/app/models/pinwheel_account.rb +++ b/app/app/models/pinwheel_account.rb @@ -4,19 +4,22 @@ class PinwheelAccount < ApplicationRecord EVENTS_MAP = { "employment.added" => :employment_synced_at, "income.added" => :income_synced_at, + "identity.added" => :identity_synced_at, "paystubs.fully_synced" => :paystubs_synced_at } EVENTS_ERRORS_MAP = { "employment.added" => :employment_errored_at, "income.added" => :income_errored_at, + "identity.added" => :identity_errored_at, "paystubs.fully_synced" => :paystubs_errored_at } def has_fully_synced? (supported_jobs.exclude?("paystubs") || paystubs_synced_at.present?) && (supported_jobs.exclude?("employment") || employment_synced_at.present?) && - (supported_jobs.exclude?("income") || income_synced_at.present?) + (supported_jobs.exclude?("income") || income_synced_at.present?) && + (supported_jobs.exclude?("identity") || income_synced_at.present?) end def job_succeeded?(job) diff --git a/app/app/services/pinwheel_service.rb b/app/app/services/pinwheel_service.rb index efb62b37..e1a8e257 100644 --- a/app/app/services/pinwheel_service.rb +++ b/app/app/services/pinwheel_service.rb @@ -75,6 +75,10 @@ def fetch_employment(account_id:) @http.get(build_url("#{ACCOUNTS_ENDPOINT}/#{account_id}/employment")).body end + def fetch_identity(account_id:) + @http.get(build_url("#{ACCOUNTS_ENDPOINT}/#{account_id}/identity")).body + end + def fetch_income_metadata(account_id:) @http.get(build_url("#{ACCOUNTS_ENDPOINT}/#{account_id}/income")).body end diff --git a/app/app/services/pinwheel_webhook_manager.rb b/app/app/services/pinwheel_webhook_manager.rb index 2cf42427..454c6a12 100644 --- a/app/app/services/pinwheel_webhook_manager.rb +++ b/app/app/services/pinwheel_webhook_manager.rb @@ -13,6 +13,7 @@ class PinwheelWebhookManager paystubs.fully_synced employment.added income.added + identity.added ] def initialize diff --git a/app/app/views/cbv/summaries/show.pdf.erb b/app/app/views/cbv/summaries/show.pdf.erb index 0fc2fbc8..9993cf40 100644 --- a/app/app/views/cbv/summaries/show.pdf.erb +++ b/app/app/views/cbv/summaries/show.pdf.erb @@ -1,16 +1,56 @@

<%= t(".pdf.client.header") %>

-

<%= t(".pdf.client.description") %>

+<% if is_caseworker %> +

<%= t(".pdf.caseworker.description") %>

+
+
+

+ <%= t(".pdf.caseworker.how_to_header") %> + <%= t(".pdf.caseworker.how_to") %> +

+
+
+<% else %> +

<%= t(".pdf.client.description") %>

+<% end %>

<%= t(".pdf.client.client_report_information") %>

+<% if is_caseworker %> + <%= render(TableComponent.new) do |table| %> + <%= table.with_header do %> +

Client Information

+ <% end %> + <%= table.with_row( + label: t(".pdf.caseworker.first_name"), + value: @cbv_flow.cbv_flow_invitation.first_name + ) %> + <%= table.with_row( + label: t(".pdf.caseworker.middle_name"), + value: @cbv_flow.cbv_flow_invitation.middle_name + ) %> + <%= table.with_row( + label: t(".pdf.caseworker.last_name"), + value: @cbv_flow.cbv_flow_invitation.last_name + ) %> + <%= table.with_row( + label: t(".pdf.caseworker.client_id_number"), + value: @cbv_flow.cbv_flow_invitation.client_id_number + ) %> + <%= table.with_row( + label: t(".pdf.caseworker.case_number"), + value: @cbv_flow.cbv_flow_invitation.case_number + ) %> + <% end %> +<% end %> + <%= render(TableComponent.new) do |table| %> <%= table.with_header do %>

Report details

<% end %> <% if @cbv_flow.confirmation_code.present? %> <%= table.with_row( - label: t(".confirmation_code"), + label: t(".pdf.shared.confirmation_code"), value: @cbv_flow.confirmation_code) %> <% end %> @@ -26,6 +66,12 @@ label: t(".pdf.client.date_range"), value: "#{format_parsed_date(@cbv_flow.cbv_flow_invitation.paystubs_query_begins_at)} to #{format_parsed_date(@cbv_flow.cbv_flow_invitation.snap_application_date)}") %> + <% if is_caseworker %> + <%= table.with_row( + label: t(".pdf.caseworker.agreement_consent_timestamp"), + value: @cbv_flow.consented_to_authorized_use_at) + %> + <% end %> <% end %>

<%= t(".pdf.client.employment_payment_details") %>

@@ -38,6 +84,9 @@ <%= table.with_header do %>

<%= summary[:employer_name] %> Employment Information

<% end %> + <% if is_caseworker %> + <%= table.with_data_point(:client_full_name, summary[:identity]["full_name"]) %> + <% end %> <% if summary[:has_employment_data] %> <%= table.with_data_point(:employer_phone, summary[:employment]["employer_phone_number"]["value"]) %> <%= table.with_data_point(:employer_address, summary[:employment]["employer_address"]["raw"]) %> diff --git a/app/config/locales/en.yml b/app/config/locales/en.yml index 8e87f557..0d9d71e5 100644 --- a/app/config/locales/en.yml +++ b/app/config/locales/en.yml @@ -235,6 +235,17 @@ en: none_found: No payments found. Please refresh the page after a few minutes. payment: Payment of %{amount} before taxes on %{date} pdf: + caseworker: + agreement_consent_timestamp: Agreement Consent Timestamp + case_number: Case number + client_full_name: Client full name (linked to payroll account) + client_id_number: CIN + description: The following income information was retrieved with the client's consent and has been submitted by them to their benefits agency. The client is also able to download a client-facing copy of this report. + first_name: Client's first name + how_to: This report includes payment information from the past 90 days. In most cases, you only need to review income from the last 30 days for eligibility purposes. Use data beyond the 30-day period only if necessary. Key fields for income verification are highlighted in yellow. + how_to_header: 'How to use this report:' + last_name: Client's last name + middle_name: Client's middle name client: address: Employer address client_report_information: Client and Report Information @@ -243,6 +254,8 @@ en: description: We have collected your income information with your consent and sent it to your benefits agency. Any additional income that you weren't able to add to this report should be shared separately with your benefits agency. employment_payment_details: Employment and payment details header: Income Verification Report + shared: + confirmation_code: Confirmation code phone_number: Employer phone send_report: Share my report with benefits agency table_caption: 'Employer %{number}: %{employer_name}' diff --git a/app/db/migrate/20240826161050_add_error_event_column_for_identity.rb b/app/db/migrate/20240826161050_add_error_event_column_for_identity.rb new file mode 100644 index 00000000..4c15a0a5 --- /dev/null +++ b/app/db/migrate/20240826161050_add_error_event_column_for_identity.rb @@ -0,0 +1,6 @@ +class AddErrorEventColumnForIdentity < ActiveRecord::Migration[7.1] + def change + add_column :pinwheel_accounts, :identity_errored_at, :timestamp + add_column :pinwheel_accounts, :identity_synced_at, :timestamp + end +end diff --git a/app/db/schema.rb b/app/db/schema.rb index 1c120fcd..99c7a4cd 100644 --- a/app/db/schema.rb +++ b/app/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.1].define(version: 2024_08_14_203311) do +ActiveRecord::Schema[7.1].define(version: 2024_08_26_161050) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -74,6 +74,8 @@ t.datetime "employment_errored_at", precision: nil t.datetime "income_errored_at", precision: nil t.datetime "paystubs_errored_at", precision: nil + t.datetime "identity_errored_at", precision: nil + t.datetime "identity_synced_at", precision: nil t.index ["cbv_flow_id"], name: "index_pinwheel_accounts_on_cbv_flow_id" end diff --git a/app/spec/controllers/cbv/summaries_controller_spec.rb b/app/spec/controllers/cbv/summaries_controller_spec.rb index fbc1b7cb..71617459 100644 --- a/app/spec/controllers/cbv/summaries_controller_spec.rb +++ b/app/spec/controllers/cbv/summaries_controller_spec.rb @@ -3,7 +3,7 @@ RSpec.describe Cbv::SummariesController do include PinwheelApiHelper - let(:supported_jobs) { %w[income paystubs employment] } + let(:supported_jobs) { %w[income paystubs employment identity] } let(:flow_started_seconds_ago) { 300 } let(:employment_errored_at) { nil } let(:cbv_flow) { create(:cbv_flow, :with_pinwheel_account, created_at: flow_started_seconds_ago.seconds.ago, case_number: "ABC1234", supported_jobs: supported_jobs, employment_errored_at: employment_errored_at) } @@ -27,6 +27,7 @@ stub_request_end_user_paystubs_response stub_request_employment_info_response unless employment_errored_at stub_request_income_metadata_response if supported_jobs.include?("income") + stub_request_identity_response end context "when rendering views" do @@ -113,6 +114,7 @@ stub_request_end_user_paystubs_response stub_request_employment_info_response stub_request_income_metadata_response + stub_request_identity_response end context "without consent" do diff --git a/app/spec/controllers/concerns/cbv/reports_helper_spec.rb b/app/spec/controllers/concerns/cbv/reports_helper_spec.rb index 6da130bf..99b2488c 100644 --- a/app/spec/controllers/concerns/cbv/reports_helper_spec.rb +++ b/app/spec/controllers/concerns/cbv/reports_helper_spec.rb @@ -17,6 +17,10 @@ load_relative_json_file('request_income_metadata_response.json')['data'] end + let(:identities) do + load_relative_json_file('request_identity_response.json')['data'] + end + let(:parsed_payments) do helper.parse_payments(payments) end @@ -29,7 +33,7 @@ describe "aggregate payments" do it "groups by employer" do - expect(helper.summarize_by_employer(parsed_payments, [ employments ], [ incomes ])).to eq({ + expect(helper.summarize_by_employer(parsed_payments, [ employments ], [ incomes ], [ identities ])).to eq({ account_id => { employer_name: "Acme Corp", payments: [ @@ -56,6 +60,7 @@ has_employment_data: true, employment: employments, income: incomes, + identity: identities, total: 480720 } }) diff --git a/app/spec/factories/pinwheel_account.rb b/app/spec/factories/pinwheel_account.rb index ab9fab30..b0c57693 100644 --- a/app/spec/factories/pinwheel_account.rb +++ b/app/spec/factories/pinwheel_account.rb @@ -5,5 +5,6 @@ paystubs_synced_at { DateTime.now } employment_synced_at { DateTime.now } income_synced_at { DateTime.now } + identity_synced_at { DateTime.now } end end diff --git a/app/spec/mailers/caseworker_mailer_spec.rb b/app/spec/mailers/caseworker_mailer_spec.rb index 0e6862f7..ab3f0658 100644 --- a/app/spec/mailers/caseworker_mailer_spec.rb +++ b/app/spec/mailers/caseworker_mailer_spec.rb @@ -6,6 +6,7 @@ let(:payments) { stub_post_processed_payments(account_id) } let(:employments) { stub_employments(account_id) } let(:incomes) { stub_incomes(account_id) } + let(:identities) { stub_identities(account_id) } let(:email_address) { "test@example.com" } let(:mail) { CaseworkerMailer.with( @@ -13,7 +14,8 @@ cbv_flow: cbv_flow, payments: payments, employments: employments, - incomes: incomes + incomes: incomes, + identities: identities ).summary_email.deliver_now } diff --git a/app/spec/mailers/previews/caseworker_mailer_preview.rb b/app/spec/mailers/previews/caseworker_mailer_preview.rb index 01cd45dd..0be54ded 100644 --- a/app/spec/mailers/previews/caseworker_mailer_preview.rb +++ b/app/spec/mailers/previews/caseworker_mailer_preview.rb @@ -9,6 +9,7 @@ def summary_email payments = stub_post_processed_payments(cbv_flow.pinwheel_accounts.first.pinwheel_account_id) employments = stub_employments(cbv_flow.pinwheel_accounts.first.pinwheel_account_id) incomes = stub_incomes(cbv_flow.pinwheel_accounts.first.pinwheel_account_id) - CaseworkerMailer.with(cbv_flow: cbv_flow, case_number: "12345", payments: payments, employments: employments, incomes: incomes).summary_email + identities = stub_identities(cbv_flow.pinwheel_accounts.first.pinwheel_account_id) + CaseworkerMailer.with(cbv_flow: cbv_flow, case_number: "12345", payments: payments, employments: employments, incomes: incomes, identities: identities).summary_email end end diff --git a/app/spec/support/fixtures/pinwheel/request_identity_response.json b/app/spec/support/fixtures/pinwheel/request_identity_response.json new file mode 100644 index 00000000..64daa3b1 --- /dev/null +++ b/app/spec/support/fixtures/pinwheel/request_identity_response.json @@ -0,0 +1 @@ +{"data":{"id":"9583558c-f54c-455d-9519-554416106a0a","created_at":"2024-08-23T19:26:34.541298+00:00","updated_at":"2024-08-23T19:26:34.541298+00:00","account_id":"03e29160-f7e7-4a28-b2d8-813640e030d3","full_name":"Ash Userton","emails":["user_good@example.com"],"date_of_birth":"1993-08-28","last_four_ssn":"1234","address":{"raw":"20429 Pinwheel Drive, New York City, NY 99999","line1":"20429 Pinwheel Drive","line2":null,"city":"New York City","state":"NY","postal_code":"99999","country":"US"},"phone_numbers":[{"value":"+12345556789","type":null}]},"meta":{"refreshed_at":"2024-08-23T19:26:34.676325+00:00"}} diff --git a/app/spec/support/pinwheel_api_helper.rb b/app/spec/support/pinwheel_api_helper.rb index c836e30d..d788e84d 100644 --- a/app/spec/support/pinwheel_api_helper.rb +++ b/app/spec/support/pinwheel_api_helper.rb @@ -98,6 +98,15 @@ def request_employment_info_response_null_employment_status_bug ) end + def stub_request_identity_response + stub_request(:get, %r{#{PinwheelService::ACCOUNTS_ENDPOINT}/[0-9a-fA-F\-]{36}/identity}) + .to_return( + status: 200, + body: load_relative_json_file('request_identity_response.json').to_json, + headers: { 'Content-Type': 'application/json;charset=UTF-8' } + ) + end + def load_relative_file(filename) File.read(File.join( File.dirname(__FILE__), diff --git a/app/spec/support/test_helpers.rb b/app/spec/support/test_helpers.rb index 3ffaae10..0ddae4f2 100644 --- a/app/spec/support/test_helpers.rb +++ b/app/spec/support/test_helpers.rb @@ -55,4 +55,36 @@ def stub_incomes(account_id = SecureRandom.uuid) } end end + + def stub_identities(account_id = SecureRandom.uuid) + 5.times.map do |i| + { + "id" => "9583558c-f54c-455d-9519-554416106a0a", + "created_at" => "2024-08-23T19:26:34.541298+00:00", + "updated_at" => "2024-08-23T19:26:34.541298+00:00", + "account_id" => account_id, + "full_name" => "Ash Userton", + "emails" => [ + "user_good@example.com" + ], + "date_of_birth" => "1993-08-28", + "last_four_ssn" => "1234", + "address" => { + "raw" => "20429 Pinwheel Drive, New York City, NY 99999", + "line1" => "20429 Pinwheel Drive", + "line2" => nil, + "city" => "New York City", + "state" => "NY", + "postal_code" => "99999", + "country" => "US" + }, + "phone_numbers" => [ + { + "value" => "+12345556789", + "type" => nil + } + ] + } + end + end end diff --git a/docs/app/rendered/database-schema.pdf b/docs/app/rendered/database-schema.pdf index 0ec53604e31a05a31b330ec3f9536e09b7751489..fb4a3e7ec017eb3b1a911661c76e883c47c75625 100644 GIT binary patch delta 12488 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 delta 12129 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 ZArFkH<%1bAe2%FNw(5KD2HPxmXYMr zynQ7nb}5?f<4*r~90!Yv3I&S05iY_<#Vz0iPq< z=%I7q(P}kL?2SGTiVPM?wnl>|yh<1r7w3ArOw*AzM)sFh*+hSvCXR347?Q5l-Bvon zV!ISfg$ExU=J(Q2@Carjc&BqK*ZRlnGXHp%m3S`m*}8MS z-y)v}c1909>N*smzJ-i*LPt-H>}(&x)OEtIaAu&X+W4+5eYc7ZyLEtGI`9KoJs3q6 z*_?UwgUa39tv?pSzx_7S$uHg9*YhX1Z|9qS0jR%kACrEM9|AZqlb??)0x&p}Fl-r< zkSPR{>W@T!y{mx%6bA6~GTg;iMk(DwOeCp0$i`bT@joaZWirU;#q0YWZx;RmG2MSa z+{Gq~Qg>2jg_Y;Y^6T_0=R8M5o==0=M2JB#r9>350#k&U1(SCV`Wc{}LGc1cchLO- zjS4Ua$uAh+IPHM@lY9Zsiu?iJ0mMIu3nbR$2$CU9kb8hUR~EM91WIX8b&@csWl0^> z2cYQy-vJT_?J}8w&J1W=uFVNg)2^UrXPGD%sANetVCW|?(jW`A{D1#NAx1@SA=9TK XFC0cRMw9-K9tt%uGzujpMNdWwa&mx)