From 2ec4ccd887dc9dfa2a093f8e41c5b2efba670eba Mon Sep 17 00:00:00 2001 From: Arin Choi Date: Tue, 29 Oct 2024 14:44:43 -0700 Subject: [PATCH 01/13] Add basic form/controller/view/migration for health insurance premium payment --- .../id_health_insurance_premium_controller.rb | 7 + .../id_health_insurance_premium_form.rb | 21 +++ .../state_file_id_question_navigation.rb | 1 + app/models/state_file_base_intake.rb | 4 + app/models/state_file_dependent.rb | 42 +++--- app/models/state_file_id_intake.rb | 119 +++++++++-------- .../id_health_insurance_premium/edit.html.erb | 59 +++++++++ config/locales/en.yml | 31 +++++ config/locales/es.yml | 30 +++++ ...premium_columns_to_id_state_file_intake.rb | 6 + db/schema.rb | 4 +- ...ealth_insurance_premium_controller_spec.rb | 32 +++++ spec/factories/state_file_id_intakes.rb | 112 ++++++++-------- .../state_file/complete_intake_spec.rb | 9 ++ .../id_health_insurance_premium_form_spec.rb | 125 ++++++++++++++++++ spec/models/state_file_id_intake_spec.rb | 112 ++++++++-------- 16 files changed, 528 insertions(+), 186 deletions(-) create mode 100644 app/controllers/state_file/questions/id_health_insurance_premium_controller.rb create mode 100644 app/forms/state_file/id_health_insurance_premium_form.rb create mode 100644 app/views/state_file/questions/id_health_insurance_premium/edit.html.erb create mode 100644 db/migrate/20241029213429_add_health_insurance_premium_columns_to_id_state_file_intake.rb create mode 100644 spec/controllers/state_file/questions/id_health_insurance_premium_controller_spec.rb create mode 100644 spec/forms/state_file/id_health_insurance_premium_form_spec.rb diff --git a/app/controllers/state_file/questions/id_health_insurance_premium_controller.rb b/app/controllers/state_file/questions/id_health_insurance_premium_controller.rb new file mode 100644 index 0000000000..bb0e2bba07 --- /dev/null +++ b/app/controllers/state_file/questions/id_health_insurance_premium_controller.rb @@ -0,0 +1,7 @@ +module StateFile + module Questions + class IdHealthInsurancePremiumController < QuestionsController + include ReturnToReviewConcern + end + end +end diff --git a/app/forms/state_file/id_health_insurance_premium_form.rb b/app/forms/state_file/id_health_insurance_premium_form.rb new file mode 100644 index 0000000000..65b73c8f81 --- /dev/null +++ b/app/forms/state_file/id_health_insurance_premium_form.rb @@ -0,0 +1,21 @@ +module StateFile + class IdHealthInsurancePremiumForm < QuestionsForm + set_attributes_for :intake, :has_health_insurance_premium, :health_insurance_paid_amount + + validates :has_health_insurance_premium, inclusion: { in: %w[yes no], message: :blank } + validates :health_insurance_paid_amount, + presence: true, + numericality: { + allow_blank: true, + greater_than_or_equal_to: 0, + message: I18n.t("validators.not_a_number") + }, + if: -> { has_health_insurance_premium == "yes" } + + def save + attributes_to_save = attributes_for(:intake) + attributes_to_save[:health_insurance_paid_amount] = nil if has_health_insurance_premium == "no" + @intake.update!(attributes_to_save) + end + end +end \ No newline at end of file diff --git a/app/lib/navigation/state_file_id_question_navigation.rb b/app/lib/navigation/state_file_id_question_navigation.rb index 3f0b00b035..2a78f6e291 100644 --- a/app/lib/navigation/state_file_id_question_navigation.rb +++ b/app/lib/navigation/state_file_id_question_navigation.rb @@ -30,6 +30,7 @@ class StateFileIdQuestionNavigation < Navigation::StateFileBaseQuestionNavigatio Navigation::NavigationStep.new(StateFile::Questions::DataTransferOffboardingController, false), Navigation::NavigationStep.new(StateFile::Questions::IncomeReviewController), Navigation::NavigationStep.new(StateFile::Questions::UnemploymentController), + Navigation::NavigationStep.new(StateFile::Questions::IdHealthInsurancePremiumController), Navigation::NavigationStep.new(StateFile::Questions::IdSalesUseTaxController), Navigation::NavigationStep.new(StateFile::Questions::IdReviewController), Navigation::NavigationStep.new(StateFile::Questions::EsignDeclarationController), # creates EfileSubmission and transitions to preparing diff --git a/app/models/state_file_base_intake.rb b/app/models/state_file_base_intake.rb index 22f35b3601..4a27d1f378 100644 --- a/app/models/state_file_base_intake.rb +++ b/app/models/state_file_base_intake.rb @@ -181,6 +181,10 @@ def filer_count filing_status_mfj? ? 2 : 1 end + def household_count + filer_count + dependents.size + end + def primary Person.new(self, :primary) end diff --git a/app/models/state_file_dependent.rb b/app/models/state_file_dependent.rb index 65c3ac0437..e3c4457c07 100644 --- a/app/models/state_file_dependent.rb +++ b/app/models/state_file_dependent.rb @@ -2,26 +2,28 @@ # # Table name: state_file_dependents # -# id :bigint not null, primary key -# ctc_qualifying :boolean -# dob :date -# eic_disability :integer default("unfilled") -# eic_qualifying :boolean -# eic_student :integer default("unfilled") -# first_name :string -# intake_type :string not null -# last_name :string -# middle_initial :string -# months_in_home :integer -# needed_assistance :integer default("unfilled"), not null -# odc_qualifying :boolean -# passed_away :integer default("unfilled"), not null -# relationship :string -# ssn :string -# suffix :string -# created_at :datetime not null -# updated_at :datetime not null -# intake_id :bigint not null +# id :bigint not null, primary key +# ctc_qualifying :boolean +# dob :date +# eic_disability :integer default("unfilled") +# eic_qualifying :boolean +# eic_student :integer default("unfilled") +# first_name :string +# id_has_grocery_credit_ineligible_months :integer default(0), not null +# id_months_ineligible_for_grocery_credit :integer default(0) +# intake_type :string not null +# last_name :string +# middle_initial :string +# months_in_home :integer +# needed_assistance :integer default("unfilled"), not null +# odc_qualifying :boolean +# passed_away :integer default("unfilled"), not null +# relationship :string +# ssn :string +# suffix :string +# created_at :datetime not null +# updated_at :datetime not null +# intake_id :bigint not null # # Indexes # diff --git a/app/models/state_file_id_intake.rb b/app/models/state_file_id_intake.rb index 59c6e3690d..5a5cc9a966 100644 --- a/app/models/state_file_id_intake.rb +++ b/app/models/state_file_id_intake.rb @@ -2,61 +2,69 @@ # # Table name: state_file_id_intakes # -# id :bigint not null, primary key -# account_number :string -# account_type :integer default("unfilled"), not null -# bank_name :string -# consented_to_terms_and_conditions :integer default("unfilled"), not null -# contact_preference :integer default("unfilled"), not null -# current_sign_in_at :datetime -# current_sign_in_ip :inet -# current_step :string -# date_electronic_withdrawal :date -# df_data_import_failed_at :datetime -# df_data_imported_at :datetime -# eligibility_emergency_rental_assistance :integer default("unfilled"), not null -# eligibility_withdrew_msa_fthb :integer default("unfilled"), not null -# email_address :citext -# email_address_verified_at :datetime -# failed_attempts :integer default(0), not null -# federal_return_status :string -# has_unpaid_sales_use_tax :integer default("unfilled"), not null -# hashed_ssn :string -# last_sign_in_at :datetime -# last_sign_in_ip :inet -# locale :string default("en") -# locked_at :datetime -# message_tracker :jsonb -# payment_or_deposit_type :integer default("unfilled"), not null -# phone_number :string -# phone_number_verified_at :datetime -# primary_birth_date :date -# primary_esigned :integer default("unfilled"), not null -# primary_esigned_at :datetime -# primary_first_name :string -# primary_last_name :string -# primary_middle_initial :string -# primary_suffix :string -# raw_direct_file_data :text -# raw_direct_file_intake_data :jsonb -# referrer :string -# routing_number :integer -# sign_in_count :integer default(0), not null -# source :string -# spouse_birth_date :date -# spouse_esigned :integer default("unfilled"), not null -# spouse_esigned_at :datetime -# spouse_first_name :string -# spouse_last_name :string -# spouse_middle_initial :string -# spouse_suffix :string -# total_purchase_amount :decimal(12, 2) -# unsubscribed_from_email :boolean default(FALSE), not null -# withdraw_amount :integer -# created_at :datetime not null -# updated_at :datetime not null -# federal_submission_id :string -# visitor_id :string +# id :bigint not null, primary key +# account_number :string +# account_type :integer default("unfilled"), not null +# bank_name :string +# consented_to_terms_and_conditions :integer default("unfilled"), not null +# contact_preference :integer default("unfilled"), not null +# current_sign_in_at :datetime +# current_sign_in_ip :inet +# current_step :string +# date_electronic_withdrawal :date +# df_data_import_failed_at :datetime +# df_data_imported_at :datetime +# donate_grocery_credit :integer default(0), not null +# eligibility_emergency_rental_assistance :integer default("unfilled"), not null +# eligibility_withdrew_msa_fthb :integer default("unfilled"), not null +# email_address :citext +# email_address_verified_at :datetime +# failed_attempts :integer default(0), not null +# federal_return_status :string +# has_health_insurance_premium :integer default(0), not null +# has_unpaid_sales_use_tax :integer default("unfilled"), not null +# hashed_ssn :string +# health_insurance_paid_amount :decimal(12, 2) +# household_has_grocery_credit_ineligible_months :integer default(0), not null +# last_sign_in_at :datetime +# last_sign_in_ip :inet +# locale :string default("en") +# locked_at :datetime +# message_tracker :jsonb +# payment_or_deposit_type :integer default("unfilled"), not null +# phone_number :string +# phone_number_verified_at :datetime +# primary_birth_date :date +# primary_esigned :integer default("unfilled"), not null +# primary_esigned_at :datetime +# primary_first_name :string +# primary_has_grocery_credit_ineligible_months :integer default(0), not null +# primary_last_name :string +# primary_middle_initial :string +# primary_months_ineligible_for_grocery_credit :integer default(0) +# primary_suffix :string +# raw_direct_file_data :text +# raw_direct_file_intake_data :jsonb +# referrer :string +# routing_number :integer +# sign_in_count :integer default(0), not null +# source :string +# spouse_birth_date :date +# spouse_esigned :integer default("unfilled"), not null +# spouse_esigned_at :datetime +# spouse_first_name :string +# spouse_has_grocery_credit_ineligible_months :integer default(0), not null +# spouse_last_name :string +# spouse_middle_initial :string +# spouse_months_ineligible_for_grocery_credit :integer default(0) +# spouse_suffix :string +# total_purchase_amount :decimal(12, 2) +# unsubscribed_from_email :boolean default(FALSE), not null +# withdraw_amount :integer +# created_at :datetime not null +# updated_at :datetime not null +# federal_submission_id :string +# visitor_id :string # # Indexes # @@ -73,6 +81,7 @@ class StateFileIdIntake < StateFileBaseIntake enum eligibility_withdrew_msa_fthb: { unfilled: 0, yes: 1, no: 2 }, _prefix: :eligibility_withdrew_msa_fthb enum eligibility_emergency_rental_assistance: { unfilled: 0, yes: 1, no: 2 }, _prefix: :eligibility_emergency_rental_assistance enum has_unpaid_sales_use_tax: { unfilled: 0, yes: 1, no: 2 }, _prefix: :has_unpaid_sales_use_tax + enum has_health_insurance_premium: { unfilled: 0, yes: 1, no: 2 }, _prefix: :has_health_insurance_premium def disqualifying_df_data_reason; end diff --git a/app/views/state_file/questions/id_health_insurance_premium/edit.html.erb b/app/views/state_file/questions/id_health_insurance_premium/edit.html.erb new file mode 100644 index 0000000000..252fcb52e2 --- /dev/null +++ b/app/views/state_file/questions/id_health_insurance_premium/edit.html.erb @@ -0,0 +1,59 @@ +<% title = t('.title', year: MultiTenantService.statefile.current_tax_year) %> +<% content_for :page_title, title %> + +<% content_for :card do %> +

<%= title %>

+

<%= t(".subtitle", count: current_intake.household_count) %>

+ <%= form_with model: @form, url: { action: :update }, local: true, method: "put", builder: VitaMinFormBuilder do |f| %> +
+

<%= t('.what_is_title') %>

+
<%= t('.what_is_content_html') %>
+
+ +
+

<%= t('.qualifications_title') %>

+
<%= t('.qualifications_content') %>
+
+ +
+

<%= t('.medicaid_title') %>

+
<%= t('.medicaid_content') %>
+
+ +
+
+
+ <% spouse_text = current_intake.filing_status_mfj? ? ', your spouse' : "" %> + <% dependents_text = current_intake.dependents.present? ? ', and/or your dependents' : "" %> + <%= + f.cfa_radio_set( + :has_health_insurance_premium, + label_text: t('.health_insurance_premium_question', spouse_text: spouse_text, dependents_text: dependents_text), + collection: [ + { value: :yes, label: t("general.affirmative"), input_html: { "data-follow-up": "#sut-field" } }, + { value: :no, label: t("general.negative") }, + ] + ) + %> +
+
+ + +
+ + <% if params[:return_to_review].present? %> + <%= hidden_field_tag "return_to_review", params[:return_to_review] %> + <% end %> + <%= f.continue %> + <% end %> +<% end %> \ No newline at end of file diff --git a/config/locales/en.yml b/config/locales/en.yml index 71f8eeaa43..eaefe6fe0a 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2510,6 +2510,37 @@ en: withdrew_msa_fthb_list: bullet_1_html: "Medical Savings Account and use it for non-qualifying expenses" bullet_2_html: "First-Time Homebuyer Account and didn’t use it for eligible home costs" + id_health_insurance_premium: + edit: + title: You might be eligible for the Idaho Health Insurance Premium Deduction! + subtitle: + one: To see if you qualify, we need more information about you. + other: To see if you qualify, we need more information about you and your household. + health_insurance_premium_question: Did you pay health insurance premiums for yourself%{spouse_text}%{dependents_text} in 2024? + what_is_title: What is a health insurance premium? + what_is_content_html: | + A health insurance premium is the monthly fee you pay for your health coverage. + + You can find your premium amounts on your: + + qualifications_title: Which health coverage premiums qualify? + qualifications_content: You can deduct health insurance premiums paid for yourself, your spouse, and your dependents, including Medicaid, dental, and vision, as long as they haven’t been deducted from your income pre-tax. + medicaid_title: Do Medicaid payments count? + medicaid_content: Yes, if you are on Medicaid, your health insurance premium counts.  Check your monthly letter from the Idaho Department of Health and Welfare for your premium amount. It could be as low as $0, depending on your income and other factors. + qualifying_amount_help_text: Enter the total amount of qualifying health insurance premiums your household paid in %{year}. + amount_paid_helper_text: Total amount paid in %{year} + do_not_include_notice_html: | + Some health insurance premiums do not qualify for this subtraction. Do not include any premiums paid using the following: + + id_sales_use_tax: edit: sales_tax_content: This is a tax collected at the point of sale when you buy goods within your state. diff --git a/config/locales/es.yml b/config/locales/es.yml index a76819635f..a1d0e18b36 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -2483,6 +2483,36 @@ es: withdrew_msa_fthb_list: bullet_1_html: "Cuenta de Ahorros Médicos y lo utilizó para gastos no calificados" bullet_2_html: "Cuenta para Compradores de Vivienda por Primera Vez y no lo usó para costos elegibles de vivienda" + id_health_insurance_premium: + edit: + title: ¡Es posible que sea elegible para la deducción de la prima del seguro médico de Idaho! + subtitle: + one: Para ver si califica, necesitamos más información sobre usted. + other: Para ver si califica, necesitamos más información sobre usted y su hogar. + health_insurance_premium_question: ¿Pagó usted primas de seguro médico%{spouse_text}%{dependents_text}en 2024? + what_is_title: ¿Qué es una prima de seguro médico? + what_is_content_html: | + Una prima de seguro médico es la tarifa mensual que paga por su cobertura médica. + + Puede encontrar los montos de sus primas en su: + + qualifications_title: ¿Qué primas de cobertura médica califican? + qualifications_content: Puede deducir las primas de seguro médico pagadas para usted, su cónyuge y sus dependientes, incluidos Medicaid, dental y de la vista, siempre que no se hayan deducido de sus ingresos antes de impuestos. + medicaid_title: ¿Cuentan los pagos de Medicaid? + medicaid_content: Sí, si tiene Medicaid, la prima de su seguro médico cuenta. Consulte su carta mensual del Departamento de Salud y Bienestar de Idaho para conocer el monto de su prima. Podría ser tan bajo como $0, dependiendo de sus ingresos y otros factores. + qualifying_amount_help_text: Ingrese el monto total de las primas de seguro médico calificadas que su hogar pagó en %{year}. + amount_paid_helper_text: Importe total pagado en %{year} + do_not_include_notice_html: | + Algunas primas de seguros médicos no califican para esta resta. No incluya ninguna prima pagada utilizando lo siguiente: + id_sales_use_tax: edit: sales_tax_content: Este es un impuesto que se recauda en el punto de venta cuando se compran productos dentro de su estado. diff --git a/db/migrate/20241029213429_add_health_insurance_premium_columns_to_id_state_file_intake.rb b/db/migrate/20241029213429_add_health_insurance_premium_columns_to_id_state_file_intake.rb new file mode 100644 index 0000000000..8452ac7169 --- /dev/null +++ b/db/migrate/20241029213429_add_health_insurance_premium_columns_to_id_state_file_intake.rb @@ -0,0 +1,6 @@ +class AddHealthInsurancePremiumColumnsToIdStateFileIntake < ActiveRecord::Migration[7.1] + def change + add_column :state_file_id_intakes, :has_health_insurance_premium, :integer, default: 0, null: false + add_column :state_file_id_intakes, :health_insurance_paid_amount, :decimal, precision: 12, scale: 2 + end +end diff --git a/db/schema.rb b/db/schema.rb index ed733e57d4..82c5418272 100644 --- a/db/schema.rb +++ b/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_10_21_173228) do +ActiveRecord::Schema[7.1].define(version: 2024_10_29_213429) do # These are extensions that must be enabled in order to support this database enable_extension "citext" enable_extension "plpgsql" @@ -1827,8 +1827,10 @@ t.integer "failed_attempts", default: 0, null: false t.string "federal_return_status" t.string "federal_submission_id" + t.integer "has_health_insurance_premium", default: 0, null: false t.integer "has_unpaid_sales_use_tax", default: 0, null: false t.string "hashed_ssn" + t.decimal "health_insurance_paid_amount", precision: 12, scale: 2 t.datetime "last_sign_in_at" t.inet "last_sign_in_ip" t.string "locale", default: "en" diff --git a/spec/controllers/state_file/questions/id_health_insurance_premium_controller_spec.rb b/spec/controllers/state_file/questions/id_health_insurance_premium_controller_spec.rb new file mode 100644 index 0000000000..3aa04811a5 --- /dev/null +++ b/spec/controllers/state_file/questions/id_health_insurance_premium_controller_spec.rb @@ -0,0 +1,32 @@ +require "rails_helper" + +RSpec.describe StateFile::Questions::IdHealthInsurancePremiumController do + let(:intake) { create :state_file_id_intake } + before do + sign_in intake + end + + describe "#edit" do + render_views + it 'succeeds' do + get :edit + expect(response).to be_successful + end + end + + describe "#update" do + # use the return_to_review_concern shared example if the page + # should skip to the review page when the return_to_review param is present + # requires form_params to be set with any other required params + it_behaves_like :return_to_review_concern do + let(:form_params) do + { + state_file_id_sales_use_tax_form: { + has_unpaid_sales_use_tax: "yes", + total_purchase_amount: "100" + } + } + end + end + end +end \ No newline at end of file diff --git a/spec/factories/state_file_id_intakes.rb b/spec/factories/state_file_id_intakes.rb index 2db6c08d68..1b59431bb7 100644 --- a/spec/factories/state_file_id_intakes.rb +++ b/spec/factories/state_file_id_intakes.rb @@ -2,61 +2,63 @@ # # Table name: state_file_id_intakes # -# id :bigint not null, primary key -# account_number :string -# account_type :integer default("unfilled"), not null -# bank_name :string -# consented_to_terms_and_conditions :integer default("unfilled"), not null -# contact_preference :integer default("unfilled"), not null -# current_sign_in_at :datetime -# current_sign_in_ip :inet -# current_step :string -# date_electronic_withdrawal :date -# df_data_import_failed_at :datetime -# df_data_imported_at :datetime -# eligibility_emergency_rental_assistance :integer default("unfilled"), not null -# eligibility_withdrew_msa_fthb :integer default("unfilled"), not null -# email_address :citext -# email_address_verified_at :datetime -# failed_attempts :integer default(0), not null -# federal_return_status :string -# has_unpaid_sales_use_tax :integer default("unfilled"), not null -# hashed_ssn :string -# last_sign_in_at :datetime -# last_sign_in_ip :inet -# locale :string default("en") -# locked_at :datetime -# message_tracker :jsonb -# payment_or_deposit_type :integer default("unfilled"), not null -# phone_number :string -# phone_number_verified_at :datetime -# primary_birth_date :date -# primary_esigned :integer default("unfilled"), not null -# primary_esigned_at :datetime -# primary_first_name :string -# primary_last_name :string -# primary_middle_initial :string -# primary_suffix :string -# raw_direct_file_data :text -# raw_direct_file_intake_data :jsonb -# referrer :string -# routing_number :integer -# sign_in_count :integer default(0), not null -# source :string -# spouse_birth_date :date -# spouse_esigned :integer default("unfilled"), not null -# spouse_esigned_at :datetime -# spouse_first_name :string -# spouse_last_name :string -# spouse_middle_initial :string -# spouse_suffix :string -# total_purchase_amount :decimal(12, 2) -# unsubscribed_from_email :boolean default(FALSE), not null -# withdraw_amount :integer -# created_at :datetime not null -# updated_at :datetime not null -# federal_submission_id :string -# visitor_id :string +# id :bigint not null, primary key +# account_number :string +# account_type :integer default("unfilled"), not null +# bank_name :string +# consented_to_terms_and_conditions :integer default("unfilled"), not null +# contact_preference :integer default("unfilled"), not null +# current_sign_in_at :datetime +# current_sign_in_ip :inet +# current_step :string +# date_electronic_withdrawal :date +# df_data_import_failed_at :datetime +# df_data_imported_at :datetime +# eligibility_emergency_rental_assistance :integer default("unfilled"), not null +# eligibility_withdrew_msa_fthb :integer default("unfilled"), not null +# email_address :citext +# email_address_verified_at :datetime +# failed_attempts :integer default(0), not null +# federal_return_status :string +# has_health_insurance_premium :integer default(0), not null +# has_unpaid_sales_use_tax :integer default("unfilled"), not null +# hashed_ssn :string +# health_insurance_paid_amount :decimal(12, 2) +# last_sign_in_at :datetime +# last_sign_in_ip :inet +# locale :string default("en") +# locked_at :datetime +# message_tracker :jsonb +# payment_or_deposit_type :integer default("unfilled"), not null +# phone_number :string +# phone_number_verified_at :datetime +# primary_birth_date :date +# primary_esigned :integer default("unfilled"), not null +# primary_esigned_at :datetime +# primary_first_name :string +# primary_last_name :string +# primary_middle_initial :string +# primary_suffix :string +# raw_direct_file_data :text +# raw_direct_file_intake_data :jsonb +# referrer :string +# routing_number :integer +# sign_in_count :integer default(0), not null +# source :string +# spouse_birth_date :date +# spouse_esigned :integer default("unfilled"), not null +# spouse_esigned_at :datetime +# spouse_first_name :string +# spouse_last_name :string +# spouse_middle_initial :string +# spouse_suffix :string +# total_purchase_amount :decimal(12, 2) +# unsubscribed_from_email :boolean default(FALSE), not null +# withdraw_amount :integer +# created_at :datetime not null +# updated_at :datetime not null +# federal_submission_id :string +# visitor_id :string # # Indexes # diff --git a/spec/features/state_file/complete_intake_spec.rb b/spec/features/state_file/complete_intake_spec.rb index 7c78a5ae87..dbcb6514b9 100644 --- a/spec/features/state_file/complete_intake_spec.rb +++ b/spec/features/state_file/complete_intake_spec.rb @@ -490,12 +490,21 @@ # 1099G Review click_on I18n.t("general.continue") + # Health Insurance Premium + expect(page).to have_text I18n.t('state_file.questions.id_health_insurance_premium.edit.title') + choose I18n.t("general.affirmative") + fill_in 'state_file_id_health_insurance_premium_health_insurance_paid', with: "1234.60" + click_on I18n.t("general.continue") + + # Sales/Use Tax expect(page).to have_text I18n.t('state_file.questions.id_sales_use_tax.edit.title', year: MultiTenantService.statefile.current_tax_year) choose I18n.t("general.affirmative") fill_in 'state_file_id_sales_use_tax_form_total_purchase_amount', with: "290" # ID Review page click_on I18n.t("general.continue") + expect(page).to have_text "Idaho Health Insurance Premium Subtraction" + expect(page).to have_text "1234.60" # TODO: uncomment when the name dob page is added; test fails without a name # expect(page).to have_text(I18n.t('state_file.questions.unemployment.index.1099_label', name: StateFileIdIntake.last.primary.full_name)) diff --git a/spec/forms/state_file/id_health_insurance_premium_form_spec.rb b/spec/forms/state_file/id_health_insurance_premium_form_spec.rb new file mode 100644 index 0000000000..27629003ad --- /dev/null +++ b/spec/forms/state_file/id_health_insurance_premium_form_spec.rb @@ -0,0 +1,125 @@ +require "rails_helper" + +RSpec.describe StateFile::IdHealthInsurancePremiumForm do + let(:intake_has_health_insurance_premium) { "no" } + let(:health_insurance_paid_amount) { nil } + let(:intake) do + create :state_file_id_intake, + has_health_insurance_premium: intake_has_health_insurance_premium, + health_insurance_paid_amount: health_insurance_paid_amount + end + + describe "validations" do + let(:form) { described_class.new(intake, params) } + + context "invalid params" do + context "has_health_insurance_premium is required" do + let(:params) do + { + has_health_insurance_premium: nil, + } + end + + it "is invalid" do + expect(form.valid?).to eq false + + expect(form.errors[:has_health_insurance_premium]).to include "Can't be blank." + end + end + + context "health_insurance_paid_amount is required if client has_health_insurance_premium" do + let(:params) do + { + has_health_insurance_premium: "yes", + health_insurance_paid_amount: nil + } + end + + it "is invalid" do + expect(form.valid?).to eq false + + expect(form.errors[:health_insurance_paid_amount]).to include "Can't be blank." + end + end + + context "with a non numeric health_insurance_paid_amount" do + let(:params) do + { + has_health_insurance_premium: "yes", + health_insurance_paid_amount: "NaN", + } + end + + it "is valid" do + expect(form.valid?).to eq false + expect(form.errors[:health_insurance_paid_amount]).to include "Please enter numbers only." + end + end + + context "with a value less than 0" do + let(:params) do + { + has_health_insurance_premium: "yes", + health_insurance_paid_amount: "-1", + } + end + + it "is invalid" do + expect(form.valid?).to eq false + expect(form.errors[:health_insurance_paid_amount]).to include "Please enter numbers only." + end + end + end + + context "valid params" do + + context "with a non integer sales-use-tax" do + let(:params) do + { + has_health_insurance_premium: "yes", + health_insurance_paid_amount: "30.5", + } + end + + it "is invalid" do + expect(form.valid?).to eq true + end + end + + end + end + + describe "#save" do + let(:form) { described_class.new(intake, valid_params) } + + context "has unpaid sales use tax" do + let(:valid_params) do + { has_health_insurance_premium: "yes", + health_insurance_paid_amount: 1699.51 } + end + + it "saves values" do + expect(form.valid?).to eq true + form.save + + expect(intake.has_health_insurance_premium).to eq "yes" + expect(intake.health_insurance_paid_amount).to eq 1699.51 + end + end + + context "no longer has unpaid sales use tax (switched after selecting 'yes' and inputting value)" do + let(:valid_params) do + { has_health_insurance_premium: "no", + health_insurance_paid_amount: 1699.51 } + end + + it "saves values" do + expect(form.valid?).to eq true + form.save + + expect(intake.has_health_insurance_premium).to eq "no" + expect(intake.health_insurance_paid_amount).to eq nil + end + end + end +end diff --git a/spec/models/state_file_id_intake_spec.rb b/spec/models/state_file_id_intake_spec.rb index 7ea706a060..a50b27264b 100644 --- a/spec/models/state_file_id_intake_spec.rb +++ b/spec/models/state_file_id_intake_spec.rb @@ -2,61 +2,63 @@ # # Table name: state_file_id_intakes # -# id :bigint not null, primary key -# account_number :string -# account_type :integer default("unfilled"), not null -# bank_name :string -# consented_to_terms_and_conditions :integer default("unfilled"), not null -# contact_preference :integer default("unfilled"), not null -# current_sign_in_at :datetime -# current_sign_in_ip :inet -# current_step :string -# date_electronic_withdrawal :date -# df_data_import_failed_at :datetime -# df_data_imported_at :datetime -# eligibility_emergency_rental_assistance :integer default("unfilled"), not null -# eligibility_withdrew_msa_fthb :integer default("unfilled"), not null -# email_address :citext -# email_address_verified_at :datetime -# failed_attempts :integer default(0), not null -# federal_return_status :string -# has_unpaid_sales_use_tax :integer default("unfilled"), not null -# hashed_ssn :string -# last_sign_in_at :datetime -# last_sign_in_ip :inet -# locale :string default("en") -# locked_at :datetime -# message_tracker :jsonb -# payment_or_deposit_type :integer default("unfilled"), not null -# phone_number :string -# phone_number_verified_at :datetime -# primary_birth_date :date -# primary_esigned :integer default("unfilled"), not null -# primary_esigned_at :datetime -# primary_first_name :string -# primary_last_name :string -# primary_middle_initial :string -# primary_suffix :string -# raw_direct_file_data :text -# raw_direct_file_intake_data :jsonb -# referrer :string -# routing_number :integer -# sign_in_count :integer default(0), not null -# source :string -# spouse_birth_date :date -# spouse_esigned :integer default("unfilled"), not null -# spouse_esigned_at :datetime -# spouse_first_name :string -# spouse_last_name :string -# spouse_middle_initial :string -# spouse_suffix :string -# total_purchase_amount :decimal(12, 2) -# unsubscribed_from_email :boolean default(FALSE), not null -# withdraw_amount :integer -# created_at :datetime not null -# updated_at :datetime not null -# federal_submission_id :string -# visitor_id :string +# id :bigint not null, primary key +# account_number :string +# account_type :integer default("unfilled"), not null +# bank_name :string +# consented_to_terms_and_conditions :integer default("unfilled"), not null +# contact_preference :integer default("unfilled"), not null +# current_sign_in_at :datetime +# current_sign_in_ip :inet +# current_step :string +# date_electronic_withdrawal :date +# df_data_import_failed_at :datetime +# df_data_imported_at :datetime +# eligibility_emergency_rental_assistance :integer default("unfilled"), not null +# eligibility_withdrew_msa_fthb :integer default("unfilled"), not null +# email_address :citext +# email_address_verified_at :datetime +# failed_attempts :integer default(0), not null +# federal_return_status :string +# has_health_insurance_premium :integer default(0), not null +# has_unpaid_sales_use_tax :integer default("unfilled"), not null +# hashed_ssn :string +# health_insurance_paid_amount :decimal(12, 2) +# last_sign_in_at :datetime +# last_sign_in_ip :inet +# locale :string default("en") +# locked_at :datetime +# message_tracker :jsonb +# payment_or_deposit_type :integer default("unfilled"), not null +# phone_number :string +# phone_number_verified_at :datetime +# primary_birth_date :date +# primary_esigned :integer default("unfilled"), not null +# primary_esigned_at :datetime +# primary_first_name :string +# primary_last_name :string +# primary_middle_initial :string +# primary_suffix :string +# raw_direct_file_data :text +# raw_direct_file_intake_data :jsonb +# referrer :string +# routing_number :integer +# sign_in_count :integer default(0), not null +# source :string +# spouse_birth_date :date +# spouse_esigned :integer default("unfilled"), not null +# spouse_esigned_at :datetime +# spouse_first_name :string +# spouse_last_name :string +# spouse_middle_initial :string +# spouse_suffix :string +# total_purchase_amount :decimal(12, 2) +# unsubscribed_from_email :boolean default(FALSE), not null +# withdraw_amount :integer +# created_at :datetime not null +# updated_at :datetime not null +# federal_submission_id :string +# visitor_id :string # # Indexes # From 7ecd681dc874fe5506eac91b314f86e5845f3143 Mon Sep 17 00:00:00 2001 From: Arin Choi Date: Tue, 29 Oct 2024 15:03:13 -0700 Subject: [PATCH 02/13] Add health insurance premium paid field to xml --- app/lib/efile/id/id39_r_calculator.rb | 5 +++++ .../ty2024/states/id/documents/id39_r.rb | 1 + spec/lib/efile/id/id39_r_calculator_spec.rb | 19 +++++++++++++++++++ .../ty2024/states/id/documents/id39_r_spec.rb | 1 + 4 files changed, 26 insertions(+) diff --git a/app/lib/efile/id/id39_r_calculator.rb b/app/lib/efile/id/id39_r_calculator.rb index e0c3f5a543..a398298200 100644 --- a/app/lib/efile/id/id39_r_calculator.rb +++ b/app/lib/efile/id/id39_r_calculator.rb @@ -12,6 +12,7 @@ def initialize(value_access_tracker:, lines:, intake:) def calculate set_line(:ID39R_B_LINE_3, :calculate_sec_b_line_3) + set_line(:ID39R_B_LINE_18, :calculate_sec_b_line_18) @lines.transform_values(&:value) end @@ -25,6 +26,10 @@ def calculate_sec_b_line_3 end sum.round end + + def calculate_sec_b_line_18 + @intake.has_health_insurance_premium_yes? ? @intake.health_insurance_paid_amount&.round : 0 + end end end end diff --git a/app/lib/submission_builder/ty2024/states/id/documents/id39_r.rb b/app/lib/submission_builder/ty2024/states/id/documents/id39_r.rb index 4bdeaf8a70..db83388300 100644 --- a/app/lib/submission_builder/ty2024/states/id/documents/id39_r.rb +++ b/app/lib/submission_builder/ty2024/states/id/documents/id39_r.rb @@ -9,6 +9,7 @@ class Id39R < SubmissionBuilder::Document def document build_xml_doc("Form39R") do |xml| xml.IncomeUSObligations calculated_fields.fetch(:ID39R_B_LINE_3) + xml.HealthInsurancePaid calculated_fields.fetch(:ID39R_B_LINE_18) end end diff --git a/spec/lib/efile/id/id39_r_calculator_spec.rb b/spec/lib/efile/id/id39_r_calculator_spec.rb index 19e8882d04..50ec0ca639 100644 --- a/spec/lib/efile/id/id39_r_calculator_spec.rb +++ b/spec/lib/efile/id/id39_r_calculator_spec.rb @@ -28,4 +28,23 @@ end end end + + describe "Section B Line 18: Health Insurance Premium" do + context "when there are health insurance premiums" do + before do + intake.update(has_health_insurance_premium: "yes", health_insurance_paid_amount: 12.55) + end + it "sums the interest from government bonds across all reports" do + instance.calculate + expect(instance.lines[:ID39R_B_LINE_18].value).to eq(13) + end + end + + context "when there are no interest reports" do + it "returns 0" do + instance.calculate + expect(instance.lines[:ID39R_B_LINE_18].value).to eq(0) + end + end + end end \ No newline at end of file diff --git a/spec/lib/submission_builder/ty2024/states/id/documents/id39_r_spec.rb b/spec/lib/submission_builder/ty2024/states/id/documents/id39_r_spec.rb index b7722b8532..0afaf8d8d1 100644 --- a/spec/lib/submission_builder/ty2024/states/id/documents/id39_r_spec.rb +++ b/spec/lib/submission_builder/ty2024/states/id/documents/id39_r_spec.rb @@ -11,6 +11,7 @@ let(:intake) { create(:state_file_id_intake, :df_data_1099_int) } it "correctly fills answers" do expect(xml.at("IncomeUSObligations").text).to eq "2" + expect(xml.at("HealthInsurancePaid").text).to eq "0" end end end From b5210576f0bf888bdbc4f1e7066a6b7b7ae48d0e Mon Sep 17 00:00:00 2001 From: Arin Choi Date: Tue, 29 Oct 2024 15:06:29 -0700 Subject: [PATCH 03/13] Fill Pdf and line data --- app/lib/efile/line_data.yml | 2 ++ app/lib/pdf_filler/id39r_pdf.rb | 3 ++- spec/lib/pdf_filler/id39r_pdf_spec.rb | 7 +++++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/app/lib/efile/line_data.yml b/app/lib/efile/line_data.yml index cc185c9e00..a6012d408b 100644 --- a/app/lib/efile/line_data.yml +++ b/app/lib/efile/line_data.yml @@ -168,6 +168,8 @@ NYC_EIC_RATE_WK_LINE_6: label: 'Subtract line 4 from line 5 or enter the decimal from the NYC EIC rate table. Also enter on Worksheet C, line 2.' ID39R_B_LINE_3: label: 'Interest from U.S. government obligations' +ID39R_B_LINE_18: + label: 'Health insurance premium paid amount for household' ID40_LINE_6A: label: '6a Count primary filer as part of household count when primary filer not claimed as dependent' ID40_LINE_6B: diff --git a/app/lib/pdf_filler/id39r_pdf.rb b/app/lib/pdf_filler/id39r_pdf.rb index de2afdd215..36a7d49e08 100644 --- a/app/lib/pdf_filler/id39r_pdf.rb +++ b/app/lib/pdf_filler/id39r_pdf.rb @@ -16,7 +16,8 @@ def initialize(submission) def hash_for_pdf answers = { - "BL3" => @xml_document.at('IncomeUSObligations')&.text + "BL3" => @xml_document.at('IncomeUSObligations')&.text, + "BL18" => @xml_document.at('HealthInsurancePaid')&.text, } @submission.data_source.dependents.drop(4).first(3).each_with_index do |dependent, index| answers.merge!( diff --git a/spec/lib/pdf_filler/id39r_pdf_spec.rb b/spec/lib/pdf_filler/id39r_pdf_spec.rb index 197f87bf12..b837f3b99e 100644 --- a/spec/lib/pdf_filler/id39r_pdf_spec.rb +++ b/spec/lib/pdf_filler/id39r_pdf_spec.rb @@ -51,6 +51,13 @@ expect(pdf_fields["BL3"]).to eq "2" end end + + context "fills out Health Insurance Premium amount" do + let(:intake) { create(:state_file_id_intake, has_health_insurance_premium: "yes", health_insurance_paid_amount: 15.30) } + it "correctly fills answers" do + expect(pdf_fields["BL18"]).to eq "15" + end + end end end From 4f96e1ba0e257243805b97bd9e03c07b8b8329ea Mon Sep 17 00:00:00 2001 From: Arin Choi Date: Tue, 29 Oct 2024 15:10:19 -0700 Subject: [PATCH 04/13] Remove extra text on sales/use tax page --- app/views/state_file/questions/id_sales_use_tax/edit.html.erb | 1 - 1 file changed, 1 deletion(-) diff --git a/app/views/state_file/questions/id_sales_use_tax/edit.html.erb b/app/views/state_file/questions/id_sales_use_tax/edit.html.erb index 785b4c3ebd..1c68e397fa 100644 --- a/app/views/state_file/questions/id_sales_use_tax/edit.html.erb +++ b/app/views/state_file/questions/id_sales_use_tax/edit.html.erb @@ -11,7 +11,6 @@ <%= f.cfa_radio_set( :has_unpaid_sales_use_tax, - label_text: t('.unpaid_sales_use_tax_label_html'), collection: [ { value: :yes, label: t("general.affirmative"), input_html: { "data-follow-up": "#sut-field" } }, { value: :no, label: t("general.negative") }, From 64920410028a16fd675235c1ca7c773f0d041a49 Mon Sep 17 00:00:00 2001 From: Arin Choi Date: Tue, 29 Oct 2024 15:21:56 -0700 Subject: [PATCH 05/13] Add health insurance premium data to the final review screen for ID --- app/views/state_file/questions/id_review/edit.html.erb | 8 ++++++++ config/locales/en.yml | 3 +++ config/locales/es.yml | 3 +++ spec/features/state_file/complete_intake_spec.rb | 6 +++--- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/app/views/state_file/questions/id_review/edit.html.erb b/app/views/state_file/questions/id_review/edit.html.erb index 30a7dad1b4..cc2a95c52a 100644 --- a/app/views/state_file/questions/id_review/edit.html.erb +++ b/app/views/state_file/questions/id_review/edit.html.erb @@ -2,5 +2,13 @@ <% content_for :card do %> <%= render "state_file/questions/shared/review_header" %> +
+
+

<%=t(".health_insurance_premium_title") %>

+

<%=number_to_currency(current_intake.health_insurance_paid_amount || 0, precision: 2)%>

+ <%= link_to t("general.edit"), StateFile::Questions::IdHealthInsurancePremiumController.to_path_helper(return_to_review: "y"), class: "button--small" %> +
+
+ <%= render "state_file/questions/shared/review_footer" %> <% end %> diff --git a/config/locales/en.yml b/config/locales/en.yml index 68acf17363..b663b42213 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2550,6 +2550,9 @@ en:
  • Salary reduction plans: Premiums deducted from your paycheck before taxes do not qualify.
  • Social Security Medicare A and B: No deduction for employer-required Medicare A payments.
  • + id_review: + edit: + health_insurance_premium_title: "Idaho Health Insurance Premium Subtraction" id_sales_use_tax: edit: sales_tax_content: This is a tax collected at the point of sale when you buy goods within your state. diff --git a/config/locales/es.yml b/config/locales/es.yml index de28b54479..311b3344ab 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -2522,6 +2522,9 @@ es:
  • Planes de reducción salarial: Las primas deducidas de su cheque de pago antes de impuestos no califican.
  • Seguro Social Medicare A y B: Sin deducción por pagos de Medicare A requeridos por el empleador.
  • + id_review: + edit: + health_insurance_premium_title: "Resta de primas de seguro médico de Idaho" id_sales_use_tax: edit: sales_tax_content: Este es un impuesto que se recauda en el punto de venta cuando se compran productos dentro de su estado. diff --git a/spec/features/state_file/complete_intake_spec.rb b/spec/features/state_file/complete_intake_spec.rb index c7a178845e..ea4acb5abb 100644 --- a/spec/features/state_file/complete_intake_spec.rb +++ b/spec/features/state_file/complete_intake_spec.rb @@ -495,18 +495,18 @@ # Health Insurance Premium expect(page).to have_text I18n.t('state_file.questions.id_health_insurance_premium.edit.title') choose I18n.t("general.affirmative") - fill_in 'state_file_id_health_insurance_premium_health_insurance_paid', with: "1234.60" + fill_in 'state_file_id_health_insurance_premium_form_health_insurance_paid_amount', with: "1234.60" click_on I18n.t("general.continue") # Sales/Use Tax expect(page).to have_text I18n.t('state_file.questions.id_sales_use_tax.edit.title', year: MultiTenantService.statefile.current_tax_year) choose I18n.t("general.affirmative") fill_in 'state_file_id_sales_use_tax_form_total_purchase_amount', with: "290" + click_on I18n.t("general.continue") # ID Review page - click_on I18n.t("general.continue") expect(page).to have_text "Idaho Health Insurance Premium Subtraction" - expect(page).to have_text "1234.60" + expect(page).to have_text "$1,234.60" # TODO: uncomment when the name dob page is added; test fails without a name # expect(page).to have_text(I18n.t('state_file.questions.unemployment.index.1099_label', name: StateFileIdIntake.last.primary.full_name)) From 8593c52ced348bf62e68b1d51bc55243af1914aa Mon Sep 17 00:00:00 2001 From: Arin Choi Date: Tue, 29 Oct 2024 15:27:32 -0700 Subject: [PATCH 06/13] Annotate/normalize and remove accidental additions --- app/models/state_file_dependent.rb | 42 ++++---- app/models/state_file_id_intake.rb | 120 +++++++++++------------ config/locales/en.yml | 36 +++---- config/locales/es.yml | 34 +++---- spec/factories/state_file_id_intakes.rb | 114 ++++++++++----------- spec/models/state_file_id_intake_spec.rb | 114 ++++++++++----------- 6 files changed, 226 insertions(+), 234 deletions(-) diff --git a/app/models/state_file_dependent.rb b/app/models/state_file_dependent.rb index e3c4457c07..65c3ac0437 100644 --- a/app/models/state_file_dependent.rb +++ b/app/models/state_file_dependent.rb @@ -2,28 +2,26 @@ # # Table name: state_file_dependents # -# id :bigint not null, primary key -# ctc_qualifying :boolean -# dob :date -# eic_disability :integer default("unfilled") -# eic_qualifying :boolean -# eic_student :integer default("unfilled") -# first_name :string -# id_has_grocery_credit_ineligible_months :integer default(0), not null -# id_months_ineligible_for_grocery_credit :integer default(0) -# intake_type :string not null -# last_name :string -# middle_initial :string -# months_in_home :integer -# needed_assistance :integer default("unfilled"), not null -# odc_qualifying :boolean -# passed_away :integer default("unfilled"), not null -# relationship :string -# ssn :string -# suffix :string -# created_at :datetime not null -# updated_at :datetime not null -# intake_id :bigint not null +# id :bigint not null, primary key +# ctc_qualifying :boolean +# dob :date +# eic_disability :integer default("unfilled") +# eic_qualifying :boolean +# eic_student :integer default("unfilled") +# first_name :string +# intake_type :string not null +# last_name :string +# middle_initial :string +# months_in_home :integer +# needed_assistance :integer default("unfilled"), not null +# odc_qualifying :boolean +# passed_away :integer default("unfilled"), not null +# relationship :string +# ssn :string +# suffix :string +# created_at :datetime not null +# updated_at :datetime not null +# intake_id :bigint not null # # Indexes # diff --git a/app/models/state_file_id_intake.rb b/app/models/state_file_id_intake.rb index 5a5cc9a966..142b95ac4b 100644 --- a/app/models/state_file_id_intake.rb +++ b/app/models/state_file_id_intake.rb @@ -2,69 +2,63 @@ # # Table name: state_file_id_intakes # -# id :bigint not null, primary key -# account_number :string -# account_type :integer default("unfilled"), not null -# bank_name :string -# consented_to_terms_and_conditions :integer default("unfilled"), not null -# contact_preference :integer default("unfilled"), not null -# current_sign_in_at :datetime -# current_sign_in_ip :inet -# current_step :string -# date_electronic_withdrawal :date -# df_data_import_failed_at :datetime -# df_data_imported_at :datetime -# donate_grocery_credit :integer default(0), not null -# eligibility_emergency_rental_assistance :integer default("unfilled"), not null -# eligibility_withdrew_msa_fthb :integer default("unfilled"), not null -# email_address :citext -# email_address_verified_at :datetime -# failed_attempts :integer default(0), not null -# federal_return_status :string -# has_health_insurance_premium :integer default(0), not null -# has_unpaid_sales_use_tax :integer default("unfilled"), not null -# hashed_ssn :string -# health_insurance_paid_amount :decimal(12, 2) -# household_has_grocery_credit_ineligible_months :integer default(0), not null -# last_sign_in_at :datetime -# last_sign_in_ip :inet -# locale :string default("en") -# locked_at :datetime -# message_tracker :jsonb -# payment_or_deposit_type :integer default("unfilled"), not null -# phone_number :string -# phone_number_verified_at :datetime -# primary_birth_date :date -# primary_esigned :integer default("unfilled"), not null -# primary_esigned_at :datetime -# primary_first_name :string -# primary_has_grocery_credit_ineligible_months :integer default(0), not null -# primary_last_name :string -# primary_middle_initial :string -# primary_months_ineligible_for_grocery_credit :integer default(0) -# primary_suffix :string -# raw_direct_file_data :text -# raw_direct_file_intake_data :jsonb -# referrer :string -# routing_number :integer -# sign_in_count :integer default(0), not null -# source :string -# spouse_birth_date :date -# spouse_esigned :integer default("unfilled"), not null -# spouse_esigned_at :datetime -# spouse_first_name :string -# spouse_has_grocery_credit_ineligible_months :integer default(0), not null -# spouse_last_name :string -# spouse_middle_initial :string -# spouse_months_ineligible_for_grocery_credit :integer default(0) -# spouse_suffix :string -# total_purchase_amount :decimal(12, 2) -# unsubscribed_from_email :boolean default(FALSE), not null -# withdraw_amount :integer -# created_at :datetime not null -# updated_at :datetime not null -# federal_submission_id :string -# visitor_id :string +# id :bigint not null, primary key +# account_number :string +# account_type :integer default("unfilled"), not null +# bank_name :string +# consented_to_terms_and_conditions :integer default("unfilled"), not null +# contact_preference :integer default("unfilled"), not null +# current_sign_in_at :datetime +# current_sign_in_ip :inet +# current_step :string +# date_electronic_withdrawal :date +# df_data_import_failed_at :datetime +# df_data_imported_at :datetime +# eligibility_emergency_rental_assistance :integer default("unfilled"), not null +# eligibility_withdrew_msa_fthb :integer default("unfilled"), not null +# email_address :citext +# email_address_verified_at :datetime +# failed_attempts :integer default(0), not null +# federal_return_status :string +# has_health_insurance_premium :integer default("unfilled"), not null +# has_unpaid_sales_use_tax :integer default("unfilled"), not null +# hashed_ssn :string +# health_insurance_paid_amount :decimal(12, 2) +# last_sign_in_at :datetime +# last_sign_in_ip :inet +# locale :string default("en") +# locked_at :datetime +# message_tracker :jsonb +# payment_or_deposit_type :integer default("unfilled"), not null +# phone_number :string +# phone_number_verified_at :datetime +# primary_birth_date :date +# primary_esigned :integer default("unfilled"), not null +# primary_esigned_at :datetime +# primary_first_name :string +# primary_last_name :string +# primary_middle_initial :string +# primary_suffix :string +# raw_direct_file_data :text +# raw_direct_file_intake_data :jsonb +# referrer :string +# routing_number :integer +# sign_in_count :integer default(0), not null +# source :string +# spouse_birth_date :date +# spouse_esigned :integer default("unfilled"), not null +# spouse_esigned_at :datetime +# spouse_first_name :string +# spouse_last_name :string +# spouse_middle_initial :string +# spouse_suffix :string +# total_purchase_amount :decimal(12, 2) +# unsubscribed_from_email :boolean default(FALSE), not null +# withdraw_amount :integer +# created_at :datetime not null +# updated_at :datetime not null +# federal_submission_id :string +# visitor_id :string # # Indexes # diff --git a/config/locales/en.yml b/config/locales/en.yml index b663b42213..70e8fd7839 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2521,12 +2521,25 @@ en: bullet_2_html: "First-Time Homebuyer Account and didn’t use it for eligible home costs" id_health_insurance_premium: edit: - title: You might be eligible for the Idaho Health Insurance Premium Deduction! + amount_paid_helper_text: Total amount paid in %{year} + do_not_include_notice_html: | + Some health insurance premiums do not qualify for this subtraction. Do not include any premiums paid using the following: + +
      +
    • Idaho medical savings account: Funds used from this account cannot be deducted again.
    • +
    • Salary reduction plans: Premiums deducted from your paycheck before taxes do not qualify.
    • +
    • Social Security Medicare A and B: No deduction for employer-required Medicare A payments.
    • +
    + health_insurance_premium_question: Did you pay health insurance premiums for yourself%{spouse_text}%{dependents_text} in 2024? + medicaid_content: Yes, if you are on Medicaid, your health insurance premium counts.  Check your monthly letter from the Idaho Department of Health and Welfare for your premium amount. It could be as low as $0, depending on your income and other factors. + medicaid_title: Do Medicaid payments count? + qualifications_content: You can deduct health insurance premiums paid for yourself, your spouse, and your dependents, including Medicaid, dental, and vision, as long as they haven’t been deducted from your income pre-tax. + qualifications_title: Which health coverage premiums qualify? + qualifying_amount_help_text: Enter the total amount of qualifying health insurance premiums your household paid in %{year}. subtitle: one: To see if you qualify, we need more information about you. other: To see if you qualify, we need more information about you and your household. - health_insurance_premium_question: Did you pay health insurance premiums for yourself%{spouse_text}%{dependents_text} in 2024? - what_is_title: What is a health insurance premium? + title: You might be eligible for the Idaho Health Insurance Premium Deduction! what_is_content_html: | A health insurance premium is the monthly fee you pay for your health coverage. @@ -2536,23 +2549,10 @@ en:
  • Form 1095-C
  • Form 1095-A, by subtracting the total of column C from the total of column A.
  • - qualifications_title: Which health coverage premiums qualify? - qualifications_content: You can deduct health insurance premiums paid for yourself, your spouse, and your dependents, including Medicaid, dental, and vision, as long as they haven’t been deducted from your income pre-tax. - medicaid_title: Do Medicaid payments count? - medicaid_content: Yes, if you are on Medicaid, your health insurance premium counts.  Check your monthly letter from the Idaho Department of Health and Welfare for your premium amount. It could be as low as $0, depending on your income and other factors. - qualifying_amount_help_text: Enter the total amount of qualifying health insurance premiums your household paid in %{year}. - amount_paid_helper_text: Total amount paid in %{year} - do_not_include_notice_html: | - Some health insurance premiums do not qualify for this subtraction. Do not include any premiums paid using the following: - -
      -
    • Idaho medical savings account: Funds used from this account cannot be deducted again.
    • -
    • Salary reduction plans: Premiums deducted from your paycheck before taxes do not qualify.
    • -
    • Social Security Medicare A and B: No deduction for employer-required Medicare A payments.
    • -
    + what_is_title: What is a health insurance premium? id_review: edit: - health_insurance_premium_title: "Idaho Health Insurance Premium Subtraction" + health_insurance_premium_title: Idaho Health Insurance Premium Subtraction id_sales_use_tax: edit: sales_tax_content: This is a tax collected at the point of sale when you buy goods within your state. diff --git a/config/locales/es.yml b/config/locales/es.yml index 311b3344ab..74291da73a 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -2494,12 +2494,24 @@ es: bullet_2_html: "Cuenta para Compradores de Vivienda por Primera Vez y no lo usó para costos elegibles de vivienda" id_health_insurance_premium: edit: - title: ¡Es posible que sea elegible para la deducción de la prima del seguro médico de Idaho! + amount_paid_helper_text: Importe total pagado en %{year} + do_not_include_notice_html: | + Algunas primas de seguros médicos no califican para esta resta. No incluya ninguna prima pagada utilizando lo siguiente: +
      +
    • Cuenta de ahorros médicos de Idaho: Los fondos utilizados de esta cuenta no se pueden deducir nuevamente.
    • +
    • Planes de reducción salarial: Las primas deducidas de su cheque de pago antes de impuestos no califican.
    • +
    • Seguro Social Medicare A y B: Sin deducción por pagos de Medicare A requeridos por el empleador.
    • +
    + health_insurance_premium_question: "¿Pagó usted primas de seguro médico%{spouse_text}%{dependents_text}en 2024?" + medicaid_content: Sí, si tiene Medicaid, la prima de su seguro médico cuenta. Consulte su carta mensual del Departamento de Salud y Bienestar de Idaho para conocer el monto de su prima. Podría ser tan bajo como $0, dependiendo de sus ingresos y otros factores. + medicaid_title: "¿Cuentan los pagos de Medicaid?" + qualifications_content: Puede deducir las primas de seguro médico pagadas para usted, su cónyuge y sus dependientes, incluidos Medicaid, dental y de la vista, siempre que no se hayan deducido de sus ingresos antes de impuestos. + qualifications_title: "¿Qué primas de cobertura médica califican?" + qualifying_amount_help_text: Ingrese el monto total de las primas de seguro médico calificadas que su hogar pagó en %{year}. subtitle: one: Para ver si califica, necesitamos más información sobre usted. other: Para ver si califica, necesitamos más información sobre usted y su hogar. - health_insurance_premium_question: ¿Pagó usted primas de seguro médico%{spouse_text}%{dependents_text}en 2024? - what_is_title: ¿Qué es una prima de seguro médico? + title: "¡Es posible que sea elegible para la deducción de la prima del seguro médico de Idaho!" what_is_content_html: | Una prima de seguro médico es la tarifa mensual que paga por su cobertura médica. @@ -2509,22 +2521,10 @@ es:
  • Formulario 1095-C
  • Formulario 1095-A, restando el total de la columna C del total de la columna A.
  • - qualifications_title: ¿Qué primas de cobertura médica califican? - qualifications_content: Puede deducir las primas de seguro médico pagadas para usted, su cónyuge y sus dependientes, incluidos Medicaid, dental y de la vista, siempre que no se hayan deducido de sus ingresos antes de impuestos. - medicaid_title: ¿Cuentan los pagos de Medicaid? - medicaid_content: Sí, si tiene Medicaid, la prima de su seguro médico cuenta. Consulte su carta mensual del Departamento de Salud y Bienestar de Idaho para conocer el monto de su prima. Podría ser tan bajo como $0, dependiendo de sus ingresos y otros factores. - qualifying_amount_help_text: Ingrese el monto total de las primas de seguro médico calificadas que su hogar pagó en %{year}. - amount_paid_helper_text: Importe total pagado en %{year} - do_not_include_notice_html: | - Algunas primas de seguros médicos no califican para esta resta. No incluya ninguna prima pagada utilizando lo siguiente: -
      -
    • Cuenta de ahorros médicos de Idaho: Los fondos utilizados de esta cuenta no se pueden deducir nuevamente.
    • -
    • Planes de reducción salarial: Las primas deducidas de su cheque de pago antes de impuestos no califican.
    • -
    • Seguro Social Medicare A y B: Sin deducción por pagos de Medicare A requeridos por el empleador.
    • -
    + what_is_title: "¿Qué es una prima de seguro médico?" id_review: edit: - health_insurance_premium_title: "Resta de primas de seguro médico de Idaho" + health_insurance_premium_title: Resta de primas de seguro médico de Idaho id_sales_use_tax: edit: sales_tax_content: Este es un impuesto que se recauda en el punto de venta cuando se compran productos dentro de su estado. diff --git a/spec/factories/state_file_id_intakes.rb b/spec/factories/state_file_id_intakes.rb index f3be64e176..6c12926884 100644 --- a/spec/factories/state_file_id_intakes.rb +++ b/spec/factories/state_file_id_intakes.rb @@ -2,63 +2,63 @@ # # Table name: state_file_id_intakes # -# id :bigint not null, primary key -# account_number :string -# account_type :integer default("unfilled"), not null -# bank_name :string -# consented_to_terms_and_conditions :integer default("unfilled"), not null -# contact_preference :integer default("unfilled"), not null -# current_sign_in_at :datetime -# current_sign_in_ip :inet -# current_step :string -# date_electronic_withdrawal :date -# df_data_import_failed_at :datetime -# df_data_imported_at :datetime -# eligibility_emergency_rental_assistance :integer default("unfilled"), not null -# eligibility_withdrew_msa_fthb :integer default("unfilled"), not null -# email_address :citext -# email_address_verified_at :datetime -# failed_attempts :integer default(0), not null -# federal_return_status :string -# has_health_insurance_premium :integer default(0), not null -# has_unpaid_sales_use_tax :integer default("unfilled"), not null -# hashed_ssn :string -# health_insurance_paid_amount :decimal(12, 2) -# last_sign_in_at :datetime -# last_sign_in_ip :inet -# locale :string default("en") -# locked_at :datetime -# message_tracker :jsonb -# payment_or_deposit_type :integer default("unfilled"), not null -# phone_number :string -# phone_number_verified_at :datetime -# primary_birth_date :date -# primary_esigned :integer default("unfilled"), not null -# primary_esigned_at :datetime -# primary_first_name :string -# primary_last_name :string -# primary_middle_initial :string -# primary_suffix :string -# raw_direct_file_data :text -# raw_direct_file_intake_data :jsonb -# referrer :string -# routing_number :integer -# sign_in_count :integer default(0), not null -# source :string -# spouse_birth_date :date -# spouse_esigned :integer default("unfilled"), not null -# spouse_esigned_at :datetime -# spouse_first_name :string -# spouse_last_name :string -# spouse_middle_initial :string -# spouse_suffix :string -# total_purchase_amount :decimal(12, 2) -# unsubscribed_from_email :boolean default(FALSE), not null -# withdraw_amount :integer -# created_at :datetime not null -# updated_at :datetime not null -# federal_submission_id :string -# visitor_id :string +# id :bigint not null, primary key +# account_number :string +# account_type :integer default("unfilled"), not null +# bank_name :string +# consented_to_terms_and_conditions :integer default("unfilled"), not null +# contact_preference :integer default("unfilled"), not null +# current_sign_in_at :datetime +# current_sign_in_ip :inet +# current_step :string +# date_electronic_withdrawal :date +# df_data_import_failed_at :datetime +# df_data_imported_at :datetime +# eligibility_emergency_rental_assistance :integer default("unfilled"), not null +# eligibility_withdrew_msa_fthb :integer default("unfilled"), not null +# email_address :citext +# email_address_verified_at :datetime +# failed_attempts :integer default(0), not null +# federal_return_status :string +# has_health_insurance_premium :integer default("unfilled"), not null +# has_unpaid_sales_use_tax :integer default("unfilled"), not null +# hashed_ssn :string +# health_insurance_paid_amount :decimal(12, 2) +# last_sign_in_at :datetime +# last_sign_in_ip :inet +# locale :string default("en") +# locked_at :datetime +# message_tracker :jsonb +# payment_or_deposit_type :integer default("unfilled"), not null +# phone_number :string +# phone_number_verified_at :datetime +# primary_birth_date :date +# primary_esigned :integer default("unfilled"), not null +# primary_esigned_at :datetime +# primary_first_name :string +# primary_last_name :string +# primary_middle_initial :string +# primary_suffix :string +# raw_direct_file_data :text +# raw_direct_file_intake_data :jsonb +# referrer :string +# routing_number :integer +# sign_in_count :integer default(0), not null +# source :string +# spouse_birth_date :date +# spouse_esigned :integer default("unfilled"), not null +# spouse_esigned_at :datetime +# spouse_first_name :string +# spouse_last_name :string +# spouse_middle_initial :string +# spouse_suffix :string +# total_purchase_amount :decimal(12, 2) +# unsubscribed_from_email :boolean default(FALSE), not null +# withdraw_amount :integer +# created_at :datetime not null +# updated_at :datetime not null +# federal_submission_id :string +# visitor_id :string # # Indexes # diff --git a/spec/models/state_file_id_intake_spec.rb b/spec/models/state_file_id_intake_spec.rb index a50b27264b..fc0dfde825 100644 --- a/spec/models/state_file_id_intake_spec.rb +++ b/spec/models/state_file_id_intake_spec.rb @@ -2,63 +2,63 @@ # # Table name: state_file_id_intakes # -# id :bigint not null, primary key -# account_number :string -# account_type :integer default("unfilled"), not null -# bank_name :string -# consented_to_terms_and_conditions :integer default("unfilled"), not null -# contact_preference :integer default("unfilled"), not null -# current_sign_in_at :datetime -# current_sign_in_ip :inet -# current_step :string -# date_electronic_withdrawal :date -# df_data_import_failed_at :datetime -# df_data_imported_at :datetime -# eligibility_emergency_rental_assistance :integer default("unfilled"), not null -# eligibility_withdrew_msa_fthb :integer default("unfilled"), not null -# email_address :citext -# email_address_verified_at :datetime -# failed_attempts :integer default(0), not null -# federal_return_status :string -# has_health_insurance_premium :integer default(0), not null -# has_unpaid_sales_use_tax :integer default("unfilled"), not null -# hashed_ssn :string -# health_insurance_paid_amount :decimal(12, 2) -# last_sign_in_at :datetime -# last_sign_in_ip :inet -# locale :string default("en") -# locked_at :datetime -# message_tracker :jsonb -# payment_or_deposit_type :integer default("unfilled"), not null -# phone_number :string -# phone_number_verified_at :datetime -# primary_birth_date :date -# primary_esigned :integer default("unfilled"), not null -# primary_esigned_at :datetime -# primary_first_name :string -# primary_last_name :string -# primary_middle_initial :string -# primary_suffix :string -# raw_direct_file_data :text -# raw_direct_file_intake_data :jsonb -# referrer :string -# routing_number :integer -# sign_in_count :integer default(0), not null -# source :string -# spouse_birth_date :date -# spouse_esigned :integer default("unfilled"), not null -# spouse_esigned_at :datetime -# spouse_first_name :string -# spouse_last_name :string -# spouse_middle_initial :string -# spouse_suffix :string -# total_purchase_amount :decimal(12, 2) -# unsubscribed_from_email :boolean default(FALSE), not null -# withdraw_amount :integer -# created_at :datetime not null -# updated_at :datetime not null -# federal_submission_id :string -# visitor_id :string +# id :bigint not null, primary key +# account_number :string +# account_type :integer default("unfilled"), not null +# bank_name :string +# consented_to_terms_and_conditions :integer default("unfilled"), not null +# contact_preference :integer default("unfilled"), not null +# current_sign_in_at :datetime +# current_sign_in_ip :inet +# current_step :string +# date_electronic_withdrawal :date +# df_data_import_failed_at :datetime +# df_data_imported_at :datetime +# eligibility_emergency_rental_assistance :integer default("unfilled"), not null +# eligibility_withdrew_msa_fthb :integer default("unfilled"), not null +# email_address :citext +# email_address_verified_at :datetime +# failed_attempts :integer default(0), not null +# federal_return_status :string +# has_health_insurance_premium :integer default("unfilled"), not null +# has_unpaid_sales_use_tax :integer default("unfilled"), not null +# hashed_ssn :string +# health_insurance_paid_amount :decimal(12, 2) +# last_sign_in_at :datetime +# last_sign_in_ip :inet +# locale :string default("en") +# locked_at :datetime +# message_tracker :jsonb +# payment_or_deposit_type :integer default("unfilled"), not null +# phone_number :string +# phone_number_verified_at :datetime +# primary_birth_date :date +# primary_esigned :integer default("unfilled"), not null +# primary_esigned_at :datetime +# primary_first_name :string +# primary_last_name :string +# primary_middle_initial :string +# primary_suffix :string +# raw_direct_file_data :text +# raw_direct_file_intake_data :jsonb +# referrer :string +# routing_number :integer +# sign_in_count :integer default(0), not null +# source :string +# spouse_birth_date :date +# spouse_esigned :integer default("unfilled"), not null +# spouse_esigned_at :datetime +# spouse_first_name :string +# spouse_last_name :string +# spouse_middle_initial :string +# spouse_suffix :string +# total_purchase_amount :decimal(12, 2) +# unsubscribed_from_email :boolean default(FALSE), not null +# withdraw_amount :integer +# created_at :datetime not null +# updated_at :datetime not null +# federal_submission_id :string +# visitor_id :string # # Indexes # From 505d01e0bd882612360f357fcbf39abfb45097bd Mon Sep 17 00:00:00 2001 From: Arin Choi Date: Tue, 29 Oct 2024 16:00:52 -0700 Subject: [PATCH 07/13] Update copy to be more consistent and utilize current_year in copy --- .../questions/id_health_insurance_premium/edit.html.erb | 8 +++----- config/locales/en.yml | 4 +++- config/locales/es.yml | 4 +++- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/app/views/state_file/questions/id_health_insurance_premium/edit.html.erb b/app/views/state_file/questions/id_health_insurance_premium/edit.html.erb index 252fcb52e2..1fd25af5f7 100644 --- a/app/views/state_file/questions/id_health_insurance_premium/edit.html.erb +++ b/app/views/state_file/questions/id_health_insurance_premium/edit.html.erb @@ -23,12 +23,10 @@
    - <% spouse_text = current_intake.filing_status_mfj? ? ', your spouse' : "" %> - <% dependents_text = current_intake.dependents.present? ? ', and/or your dependents' : "" %> <%= f.cfa_radio_set( :has_health_insurance_premium, - label_text: t('.health_insurance_premium_question', spouse_text: spouse_text, dependents_text: dependents_text), + label_text: t('.health_insurance_premium_question', count: intake.household_count, year: MultiTenantService.statefile.current_tax_year), collection: [ { value: :yes, label: t("general.affirmative"), input_html: { "data-follow-up": "#sut-field" } }, { value: :no, label: t("general.negative") }, @@ -43,8 +41,8 @@
    -
    <%= t(".qualifying_amount_help_text", year: MultiTenantService.new(:statefile).current_tax_year) %>
    -

    <%= t(".amount_paid_helper_text", year: MultiTenantService.new(:statefile).current_tax_year) %>

    +
    <%= t(".qualifying_amount_help_text", year: MultiTenantService.statefile.current_tax_year) %>
    +

    <%= t(".amount_paid_helper_text", year: MultiTenantService.statefile.current_tax_year) %>

    <%= f.vita_min_money_field(:health_insurance_paid_amount, "", classes: ["form-width--long"]) %>
    diff --git a/config/locales/en.yml b/config/locales/en.yml index 70e8fd7839..ff693d4c33 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2530,7 +2530,9 @@ en:
  • Salary reduction plans: Premiums deducted from your paycheck before taxes do not qualify.
  • Social Security Medicare A and B: No deduction for employer-required Medicare A payments.
  • - health_insurance_premium_question: Did you pay health insurance premiums for yourself%{spouse_text}%{dependents_text} in 2024? + health_insurance_premium_question: + one: Did you pay health insurance premiums for yourself in %{year}? + other: Did you pay health insurance premiums for yourself and your household in %{year}? medicaid_content: Yes, if you are on Medicaid, your health insurance premium counts.  Check your monthly letter from the Idaho Department of Health and Welfare for your premium amount. It could be as low as $0, depending on your income and other factors. medicaid_title: Do Medicaid payments count? qualifications_content: You can deduct health insurance premiums paid for yourself, your spouse, and your dependents, including Medicaid, dental, and vision, as long as they haven’t been deducted from your income pre-tax. diff --git a/config/locales/es.yml b/config/locales/es.yml index 74291da73a..ec55824290 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -2502,7 +2502,9 @@ es:
  • Planes de reducción salarial: Las primas deducidas de su cheque de pago antes de impuestos no califican.
  • Seguro Social Medicare A y B: Sin deducción por pagos de Medicare A requeridos por el empleador.
  • - health_insurance_premium_question: "¿Pagó usted primas de seguro médico%{spouse_text}%{dependents_text}en 2024?" + health_insurance_premium_question: + one: ¿Pagó usted primas de seguro médico en %{year}? + other: ¿Pagó primas de seguro médico para usted y su hogar en %{year}? medicaid_content: Sí, si tiene Medicaid, la prima de su seguro médico cuenta. Consulte su carta mensual del Departamento de Salud y Bienestar de Idaho para conocer el monto de su prima. Podría ser tan bajo como $0, dependiendo de sus ingresos y otros factores. medicaid_title: "¿Cuentan los pagos de Medicaid?" qualifications_content: Puede deducir las primas de seguro médico pagadas para usted, su cónyuge y sus dependientes, incluidos Medicaid, dental y de la vista, siempre que no se hayan deducido de sus ingresos antes de impuestos. From 06ddcb79d69e5677181b5f02989ec897e5c6ecf0 Mon Sep 17 00:00:00 2001 From: Arin Choi Date: Tue, 29 Oct 2024 16:03:07 -0700 Subject: [PATCH 08/13] Normalize --- config/locales/es.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/locales/es.yml b/config/locales/es.yml index ec55824290..7518356fe2 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -2503,8 +2503,8 @@ es:
  • Seguro Social Medicare A y B: Sin deducción por pagos de Medicare A requeridos por el empleador.
  • health_insurance_premium_question: - one: ¿Pagó usted primas de seguro médico en %{year}? - other: ¿Pagó primas de seguro médico para usted y su hogar en %{year}? + one: "¿Pagó usted primas de seguro médico en %{year}?" + other: "¿Pagó primas de seguro médico para usted y su hogar en %{year}?" medicaid_content: Sí, si tiene Medicaid, la prima de su seguro médico cuenta. Consulte su carta mensual del Departamento de Salud y Bienestar de Idaho para conocer el monto de su prima. Podría ser tan bajo como $0, dependiendo de sus ingresos y otros factores. medicaid_title: "¿Cuentan los pagos de Medicaid?" qualifications_content: Puede deducir las primas de seguro médico pagadas para usted, su cónyuge y sus dependientes, incluidos Medicaid, dental y de la vista, siempre que no se hayan deducido de sus ingresos antes de impuestos. From d7c8575ec88776973f48bb173120a83e989a304a Mon Sep 17 00:00:00 2001 From: Arin Choi Date: Tue, 29 Oct 2024 16:05:19 -0700 Subject: [PATCH 09/13] Fix wrong reference --- .../questions/id_health_insurance_premium/edit.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/state_file/questions/id_health_insurance_premium/edit.html.erb b/app/views/state_file/questions/id_health_insurance_premium/edit.html.erb index 1fd25af5f7..b5d6b3d9d3 100644 --- a/app/views/state_file/questions/id_health_insurance_premium/edit.html.erb +++ b/app/views/state_file/questions/id_health_insurance_premium/edit.html.erb @@ -26,7 +26,7 @@ <%= f.cfa_radio_set( :has_health_insurance_premium, - label_text: t('.health_insurance_premium_question', count: intake.household_count, year: MultiTenantService.statefile.current_tax_year), + label_text: t('.health_insurance_premium_question', count: current_intake.household_count, year: MultiTenantService.statefile.current_tax_year), collection: [ { value: :yes, label: t("general.affirmative"), input_html: { "data-follow-up": "#sut-field" } }, { value: :no, label: t("general.negative") }, From 3487e10c9ba44f23a247994d87975e13979a2cd4 Mon Sep 17 00:00:00 2001 From: Arin Choi Date: Tue, 29 Oct 2024 22:19:10 -0700 Subject: [PATCH 10/13] Fix up specs --- .../id_health_insurance_premium_controller_spec.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spec/controllers/state_file/questions/id_health_insurance_premium_controller_spec.rb b/spec/controllers/state_file/questions/id_health_insurance_premium_controller_spec.rb index 3aa04811a5..9cb2bbb3a2 100644 --- a/spec/controllers/state_file/questions/id_health_insurance_premium_controller_spec.rb +++ b/spec/controllers/state_file/questions/id_health_insurance_premium_controller_spec.rb @@ -21,9 +21,9 @@ it_behaves_like :return_to_review_concern do let(:form_params) do { - state_file_id_sales_use_tax_form: { - has_unpaid_sales_use_tax: "yes", - total_purchase_amount: "100" + state_file_id_health_insurance_premium_form: { + has_health_insurance_premium: "yes", + health_insurance_paid_amount: "123" } } end From b25597e2bdc1461c26561948403593c0c6deadf0 Mon Sep 17 00:00:00 2001 From: Arin Choi Date: Tue, 29 Oct 2024 22:20:09 -0700 Subject: [PATCH 11/13] Add to EfileError expected paths --- spec/models/efile_error_spec.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/spec/models/efile_error_spec.rb b/spec/models/efile_error_spec.rb index 43c7a6c365..d68989a0e5 100644 --- a/spec/models/efile_error_spec.rb +++ b/spec/models/efile_error_spec.rb @@ -57,6 +57,7 @@ "esign-declaration", "federal-info", "id-eligibility-residence", + "id-health-insurance-premium", "id-review", "id-sales-use-tax", "income-review", From da8e760ecef5c0757cdf4975160770f123979bfa Mon Sep 17 00:00:00 2001 From: Arin Choi Date: Tue, 29 Oct 2024 22:34:35 -0700 Subject: [PATCH 12/13] Correct inaccurate description of tests --- .../state_file/id_health_insurance_premium_form_spec.rb | 6 +++--- spec/lib/efile/id/id39_r_calculator_spec.rb | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/spec/forms/state_file/id_health_insurance_premium_form_spec.rb b/spec/forms/state_file/id_health_insurance_premium_form_spec.rb index 27629003ad..7512b63ad4 100644 --- a/spec/forms/state_file/id_health_insurance_premium_form_spec.rb +++ b/spec/forms/state_file/id_health_insurance_premium_form_spec.rb @@ -73,7 +73,7 @@ context "valid params" do - context "with a non integer sales-use-tax" do + context "with a non integer health insurance paid amount" do let(:params) do { has_health_insurance_premium: "yes", @@ -92,7 +92,7 @@ describe "#save" do let(:form) { described_class.new(intake, valid_params) } - context "has unpaid sales use tax" do + context "has health_insurance_premium" do let(:valid_params) do { has_health_insurance_premium: "yes", health_insurance_paid_amount: 1699.51 } @@ -107,7 +107,7 @@ end end - context "no longer has unpaid sales use tax (switched after selecting 'yes' and inputting value)" do + context "no longer has health insurance premium (switched after selecting 'yes' and inputting value)" do let(:valid_params) do { has_health_insurance_premium: "no", health_insurance_paid_amount: 1699.51 } diff --git a/spec/lib/efile/id/id39_r_calculator_spec.rb b/spec/lib/efile/id/id39_r_calculator_spec.rb index 50ec0ca639..2c9ea2a4fb 100644 --- a/spec/lib/efile/id/id39_r_calculator_spec.rb +++ b/spec/lib/efile/id/id39_r_calculator_spec.rb @@ -40,7 +40,7 @@ end end - context "when there are no interest reports" do + context "when there are no health insurance premiums" do it "returns 0" do instance.calculate expect(instance.lines[:ID39R_B_LINE_18].value).to eq(0) From 5f5c401e3ba1f7d2a2fd7a5af4a8bc00b27c2fae Mon Sep 17 00:00:00 2001 From: Arin Choi Date: Thu, 31 Oct 2024 20:27:13 -0700 Subject: [PATCH 13/13] Remove instructions page (page 27) of ID39R pdf --- app/lib/pdfs/idform39r-TY2023.pdf | Bin 307219 -> 258553 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/app/lib/pdfs/idform39r-TY2023.pdf b/app/lib/pdfs/idform39r-TY2023.pdf index 928bb7dee80f676bd0a097754b52b0e8007ea86f..5806632c7f5ecf9d710b8b6b4545249747a77f68 100644 GIT binary patch delta 3612 zcmZ8jX*d)N+cjg5eJuuM8S^09>@#*VB1;j;PT4}1kR`+r8L~_a#!ewUvWzWDM93DE zlqLHbV_&m8^gZ8qy}duaANQa8zRr(xuKQf)P-gg!=DGQxH?HU^z!kBa(7E}~L!4|F z1XW@SaH$Fg;{hU2)aUk~i^(u%4vf+@7jIX8H*o|CMoH$mNFM@#;RAfstYCFY7L9l`n`Nh(Q0*gR&vS4uDZ;GNP0VU_roFiXvD{5Ed=NsV8s1 zWRMjxz)2Wn<+;NEnZ0=QA1vk%mKzR3{ZSK+L7^$Lykf-Z`{Nj%GmFDf4U~YaNlK(- z#1PJnRtC81YA3P~neLYTO1@DbZTMt0NQzvYa>@oP2rVG1P5qkOPLf=aUzC!t%1TK& zFOFvYkhen?Qu!9bBmb}EH^aiddBY+xM+C8O-%T0NH z!Jfg1Kn#}v+JZ7)EXaWSr1UhjtzO9ASdvL5L&UCXBs~&6!tKBpoO-&SktM{mH7*Rl+ zNki$#R9QOHj}O5~YBKQF9372Lc&gel`M`}xEx6qe=~mm3+IijznqL}JtYBQH<%zC# z^ug}x*jhY2Zpd3^nb&tzlQ4=2aDaCB#_Dt2l?pWmAKb&mN2nw&TEq2$N_bpvUIU_-!GIby>&NKsxIVP8XZ3z#gdzxPwJv; zKadJ6iCr)A)cd}lUPf*saP^s$*10+l0yFEAPrMlhR(E$xeCO*)Xh8>K$BFNTa}|#! z)>yg|L#?E?Z3HO|BT8|h>+?&RD&9mj_H7Z~+3dE4MZ>vtjg7t5?%Wpnjo0Vx!b&Ve z+8bn!61Hh6p8teYH$3L{s|;z4=C@n*zj9DC9WZST{D|n|dKnhS_|MwYs@ji>B-g!< z6<=vmdSiEL)l&jTE7R~h>|?KASJe4?w=MrXZ&!QEVl~iElO8yA5F&cpeP}$0sOqjq zxHxCJpEk%c4kl_o4h?|}K4!<;*(I^)SlqoKH|?uAHFDK%+>Us=ZU2Ob;UcAa{LOPE zcA}n-t5!|vpUBL1mwAz8km$_Rg)Uw}`0rue&>10-Wh-EP!hhkk8;A)ovEFO41U7m8bNz0-2BTj8?c>;H{hh5n(U8ilt1bc1 zZc0yU$K>|hCnHUwip>lumn*>K=NL1J=X3+OW3pbm}Ux)1E${3;y2Dk<;R3XRrzx7dpcjirz-yD`vvy| zG8g?lq-=E(sQ&7x#Om7g@p6O=JwW@`(6V-AXz4-ST98?ty=N9z> zr}h%#w*v80iCg*iIQ9KK4n+l?(RBA)US5Z-3#@naZ`!wMRz)i^58=*f?L zEJbg0WkcLzG!}?`;j700zL%=n>s(7+$z{y1m&1LG1Ly&DaxJc}&C0WNO<$e3ac{4= z+~!Q=ekDJ-FoGA>YS=KsWX}N7T0&nBHBJlpUuqtZ&i2}<=gTD<=AUq4Zhr|HJe7

    oj zi5bQYes!xHo-Qs2w5uc6ja}OMU<%Tf;EBFu!ZAwkP|Zo$jNvtdIX_Lo;_dvv-_OOti~80V#0o%A3+zFc{*8N1IO0!2p)sic zjXC1lO&gDKn82{{piMT(JY_!HfVFm8m}6a7n4I(kCSYTPc9iR3D3w0jE#r`>&>OT97kz5`r%eE2NHR|h&!kHrPE*upWOTjE4>jDy#{fG=$GwU z+8nI!rpC3#{9hf0Is zSkQF_0}~F+h8Oe^v_P0i1Ho+bgsko$&{Qz>MV3Li5t|t0U4$;w=aKCK<8q*PzQMaZZ{xz}V3E?3SIHmpoQc_U$-U zOFF>UiyiW#V)!Mm`O1NjWno}_X^oG!|EFW^pdFx+E+qd%;&XVkBc{mxez;j$*zwAi zAZAB%M_jc9UA)$Y9QN?KD`H|$LhP4Gia7%iM&IV<_LtE zTVfCgElO+m`-Qgm>LVdsJB%#9CLX0l^|EvAV0RR+jor@_Y>5k=W)flm<+K_9r~Bak zbRT}W@_#=Ijz%jPi6hXIZL|=vKe39lLyLpa!XeY_P0?>E2*m6t2yWjx^N8L7VoZx4 zPQ**f26S-jGrM0QF~h&4`Xmq{9*0P-B!Ce^!oa~72rHDHD`s@z16QwPVSBpIs~xd# z*85VmNQ>Mk>%OsKEAl&3h7Xm~JgB-u{!{M$4$hOK*?y>Ly}LI2z)9F@!)WLrymR;6 zZcpSd7&S<%Zf!)D6G)HqRF#iCBUxsPc&^ z(4MuJqglW}`JqIr!IrJet(m`Xl)k4Fy>P4J46O!Uiu!QpQ6>AB-EjiBAEdG5lWwli#_)v0TWsZ#@{>E;72KQ>;@ zB}h^rqelcmJI-I1t?y&~u5E(k(nZ!>)iZXhnkJHn{mW5^9@}|EJCmc4>$R5T>BEMs z1Iu3+A*jkq`#Vl$^tV|o?6lVrd1 zh9+6PVUsMl!T1~YnPcvAXCDeHE{e6V!WiU6NeonaB}kMLfyUzC7)~fu$5@y1e*hSO BrqBQY delta 49848 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 Fe*nIglgR)8