From 942d60c3e0151cf0b329f7694d3149694fda3f93 Mon Sep 17 00:00:00 2001 From: Jason Jordan Date: Tue, 3 Mar 2026 22:53:21 -0500 Subject: [PATCH 01/25] stable, before a refactor --- Gemfile | 5 +- Gemfile.lock | 2 +- app/controllers/employers_controller.rb | 6 +- app/controllers/sample_id_cards_controller.rb | 25 +- app/form_builders/tailwind_form_builder.rb | 2 +- ...troller.js => add_exception_controller.js} | 27 +-- .../add_exception_item_controller.js | 51 ++++ .../controllers/general_form_controller.js | 43 ++++ .../controllers/logo_upload_controller.js | 9 +- app/models/card_exception.rb | 10 + app/models/card_exception_item.rb | 25 ++ app/models/card_logo_file.rb | 10 + app/models/employer.rb | 5 +- app/models/vhcs/hl_egg_id_card_dependent.rb | 2 +- app/models/vhcs/hlid_card_egg_data.rb | 219 ++++++++++++++++++ app/models/vhcs/hlid_cards_egg.rb | 2 +- app/queries/call_stored_proc.rb | 14 ++ .../get_all_id_card_data_by_plan_tpa_query.rb | 94 ++++++++ app/queries/get_id_card_data_tpa_query.rb | 95 ++++++++ app/queries/temp.rb | 0 app/services/employer_cards/data_formatter.rb | 55 ++++- .../employer_cards/jasper_url_generator.rb | 20 +- app/services/employer_cards_generator.rb | 43 +++- app/services/sample_card/data_formatter.rb | 16 +- .../sample_card/jasper_url_generator.rb | 14 +- app/services/sample_card/pdf_printer.rb | 2 +- app/views/employer_setup/edit.html.erb | 2 +- .../_alt_network_logo_fields_new.html.erb | 15 ++ app/views/employers/edit.html.erb | 3 +- app/views/employers/index.html.erb | 44 ++-- app/views/employers/new_new.html.erb | 170 ++++++++++++++ app/views/employers/show.html.erb | 14 +- app/views/welcome/tailwind_colors.html.erb | 12 +- compose.yaml | 48 ++-- config/database.yml | 4 +- config/puma.rb | 2 +- config/routes.rb | 2 + .../20260116181849_create_card_exceptions.rb | 11 + ...60116182836_create_card_exception_items.rb | 13 ++ ...113_add_aspect_ratio_to_card_logo_files.rb | 5 + ...3223545_add_last_name_to_sample_id_card.rb | 5 + ...ield_exceptions_to_card_exception_items.rb | 5 + ...60227213305_add_title_to_card_providers.rb | 5 + ...rk_provider_to_employer_setup_processes.rb | 0 ...etwork_logo_to_employer_setup_processes.rb | 0 ...go_filename_on_employer_setup_processes.rb | 0 ...pl_plan_key_to_employer_setup_processes.rb | 0 .../20251205215553_add_plan_id_to_plan.rb | 0 ...loyer_set_up_process_to_card_logo_files.rb | 0 ...02210_allow_null_es_pon_card_logo_files.rb | 5 + ...25054626_change_mb_member_key_to_string.rb | 5 + ...name_employer_setup_process_to_employer.rb | 5 + ...0260107143914_update_fields_on_employer.rb | 14 ++ ...4720_update_belongs_to_key_for_employer.rb | 7 + ...107173606_add_pb_entity_key_to_employer.rb | 5 + ...81416_add_image_type_to_employer_images.rb | 5 + ...13150100_add_card_provider_to_employers.rb | 5 + ..._line_and_claim_to12_to_sample_id_cards.rb | 6 + ...14184154_add_id_card_fields_to_employer.rb | 5 + .../20260114205055_add_plan_id_to_member.rb | 5 + db/schema.rb | 28 ++- db/seeds.rb | 134 +++++------ development3.Dockerfile | 2 +- lib/tasks/employer.rake | 83 +++++++ lib/tasks/member.rake | 26 +++ web.config | 19 ++ 66 files changed, 1321 insertions(+), 194 deletions(-) rename app/javascript/controllers/{add_alt_network_logo_controller.js => add_exception_controller.js} (66%) create mode 100644 app/javascript/controllers/add_exception_item_controller.js create mode 100644 app/javascript/controllers/general_form_controller.js create mode 100644 app/models/card_exception.rb create mode 100644 app/models/card_exception_item.rb create mode 100644 app/models/vhcs/hlid_card_egg_data.rb create mode 100644 app/queries/call_stored_proc.rb create mode 100644 app/queries/get_all_id_card_data_by_plan_tpa_query.rb create mode 100644 app/queries/get_id_card_data_tpa_query.rb create mode 100644 app/queries/temp.rb create mode 100644 app/views/employers/_alt_network_logo_fields_new.html.erb create mode 100644 app/views/employers/new_new.html.erb create mode 100644 db/migrate/20260116181849_create_card_exceptions.rb create mode 100644 db/migrate/20260116182836_create_card_exception_items.rb create mode 100644 db/migrate/20260206202113_add_aspect_ratio_to_card_logo_files.rb create mode 100644 db/migrate/20260223223545_add_last_name_to_sample_id_card.rb create mode 100644 db/migrate/20260227192437_rename_card_field_exceptions_to_card_exception_items.rb create mode 100644 db/migrate/20260227213305_add_title_to_card_providers.rb rename db/{migrate => old}/20251203143745_add_network_provider_to_employer_setup_processes.rb (100%) rename db/{migrate => old}/20251204151226_add_network_logo_to_employer_setup_processes.rb (100%) rename db/{migrate => old}/20251204151452_rename_logo_filename_on_employer_setup_processes.rb (100%) rename db/{migrate => old}/20251205150421_add_pl_plan_key_to_employer_setup_processes.rb (100%) rename db/{migrate => old}/20251205215553_add_plan_id_to_plan.rb (100%) rename db/{migrate => old}/20251209182135_add_employer_set_up_process_to_card_logo_files.rb (100%) create mode 100644 db/old/20251210202210_allow_null_es_pon_card_logo_files.rb create mode 100644 db/old/20251225054626_change_mb_member_key_to_string.rb create mode 100644 db/old/20260107143335_rename_employer_setup_process_to_employer.rb create mode 100644 db/old/20260107143914_update_fields_on_employer.rb create mode 100644 db/old/20260107154720_update_belongs_to_key_for_employer.rb create mode 100644 db/old/20260107173606_add_pb_entity_key_to_employer.rb create mode 100644 db/old/20260107181416_add_image_type_to_employer_images.rb create mode 100644 db/old/20260113150100_add_card_provider_to_employers.rb create mode 100644 db/old/20260113165019_add_provder_line_and_claim_to12_to_sample_id_cards.rb create mode 100644 db/old/20260114184154_add_id_card_fields_to_employer.rb create mode 100644 db/old/20260114205055_add_plan_id_to_member.rb create mode 100644 lib/tasks/employer.rake create mode 100644 lib/tasks/member.rake create mode 100644 web.config diff --git a/Gemfile b/Gemfile index b5ab2c1..fa5d223 100644 --- a/Gemfile +++ b/Gemfile @@ -3,7 +3,7 @@ source "https://rubygems.org" git_source(:github) { |repo| "https://github.com/#{repo}.git" } -ruby "3.3.9" +ruby "3.4.8" # Bundle edge Rails instead: # gem "rails", github: "rails/rails", branch: "7-2-stable" @@ -87,4 +87,5 @@ gem 'rubyzip' gem 'httparty' gem 'combine_pdf' gem 'rails_icons' -gem 'fastimage' \ No newline at end of file +gem 'fastimage' +gem 'rubyzip', require: 'zip' \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index 2e188b3..bd1fa19 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -434,7 +434,7 @@ DEPENDENCIES web-console RUBY VERSION - ruby 3.3.9p170 + ruby 3.4.8p72 BUNDLED WITH 2.5.22 diff --git a/app/controllers/employers_controller.rb b/app/controllers/employers_controller.rb index 901b215..4a67fae 100644 --- a/app/controllers/employers_controller.rb +++ b/app/controllers/employers_controller.rb @@ -11,7 +11,7 @@ class EmployersController < ApplicationController @employer = Employer.new @employer.build_plan_with_default_benefits @plan_templates = IdCardBenefitsTemplate.where.not(title: "BLANK") - render :new + render :new_new end def import @@ -23,7 +23,7 @@ class EmployersController < ApplicationController @employer = Employer.new @employer.build_plan_with_default_benefits end - render :new + render :new_new end def create @@ -37,7 +37,7 @@ class EmployersController < ApplicationController redirect_to employer_path(@employer.slug), notice: 'Employer Saved' else @plan_templates = IdCardBenefitsTemplate.where.not(title: "BLANK") - render :new + render :new_new end end diff --git a/app/controllers/sample_id_cards_controller.rb b/app/controllers/sample_id_cards_controller.rb index 4a08a7d..caa8911 100644 --- a/app/controllers/sample_id_cards_controller.rb +++ b/app/controllers/sample_id_cards_controller.rb @@ -14,7 +14,7 @@ class SampleIdCardsController < ApplicationController def generate_print @employer = Employer.find_by(slug: params[:employer_slug]) - sample_cards_pdf = EmployerCardsGenerator.new(@employer).call + sample_cards_pdf = EmployerCardsGenerator.new(@employer, "PrintCard").call send_data sample_cards_pdf.to_pdf, filename: "#{@employer.name.parameterize(separator: "_")}_print_cards_#{Date.today}.pdf", @@ -22,4 +22,27 @@ class SampleIdCardsController < ApplicationController disposition: 'attachment' end + + def generate_mobile_display + @employer = Employer.find_by(slug: params[:employer_slug]) + sample_cards_pdf = EmployerCardsGenerator.new(@employer, "MobileDisplayCard").call + + send_data sample_cards_pdf.to_pdf, + filename: "#{@employer.name.parameterize(separator: "_")}_mobile_display_cards_#{Date.today}.pdf", + type: "application/pdf", + disposition: 'attachment' + + end + + def generate_full_page + @employer = Employer.find_by(slug: params[:employer_slug]) + sample_cards_pdf = EmployerCardsGenerator.new(@employer, "FullPageCard").call + + sample_cards_pdf.rewind + send_data sample_cards_pdf.sysread, + filename: "#{@employer.name.parameterize(separator: "_")}_full_page_cards_#{Date.today}.zip", + type: 'application/zip', + disposition: 'attachment' + + end end \ No newline at end of file diff --git a/app/form_builders/tailwind_form_builder.rb b/app/form_builders/tailwind_form_builder.rb index d678454..3b037e9 100644 --- a/app/form_builders/tailwind_form_builder.rb +++ b/app/form_builders/tailwind_form_builder.rb @@ -70,7 +70,7 @@ class TailwindFormBuilder < ActionView::Helpers::FormBuilder text, label_opts = if label_options.present? [label_options[:text], label_options.except(:text)] else - [nil, {}] + [object_method.to_s.titleize, {}] end label_classes = label_opts[:class] || "block text-platinum font-bold md:text-right mb-1 md:mb-0 pr-4" diff --git a/app/javascript/controllers/add_alt_network_logo_controller.js b/app/javascript/controllers/add_exception_controller.js similarity index 66% rename from app/javascript/controllers/add_alt_network_logo_controller.js rename to app/javascript/controllers/add_exception_controller.js index 6edf386..bd235f1 100644 --- a/app/javascript/controllers/add_alt_network_logo_controller.js +++ b/app/javascript/controllers/add_exception_controller.js @@ -4,19 +4,23 @@ export default class extends Controller { static values = { formColor: { type: Array, default: [] } // Declares 'items' as an Array value } - static targets = ["template", "container", "networkLogo", "button"] + static targets = ["exceptionTemplate", "exceptionContainer", "exception", "exceptionButton"] - add(event) { + connect(){ + console.log(this.formColorValue) + } + + addExemption(event) { event.preventDefault() event.stopPropagation() - const content = this.#updateTemplateNetwork() + const content = this.#newExemption() - this.buttonTarget.insertAdjacentHTML('beforebegin', content); + this.exceptionButtonTarget.insertAdjacentHTML('beforebegin', content); // this.containerTarget.insertAdjacentHTML("beforeend", content) } - remove(event) { + removeExemption(event) { event.preventDefault(); const wrapper = event.target.closest(".network-item"); if (wrapper.dataset.newRecord === "true") { @@ -30,22 +34,19 @@ export default class extends Controller { } } - #updateTemplateNetwork() { - const nextIndex = this.networkLogoTargets.length + #newExemption() { + const nextIndex = this.exceptionTargets.length const num_of_colors = this.formColorValue.length let colorIndex = 0 - let newSecondaryColor = "copper" if (nextIndex != 0) { colorIndex = nextIndex % num_of_colors - if (nextIndex % 2 == 1) { - newSecondaryColor = "bronze" - } } const newColor = this.formColorValue[colorIndex] - return this.templateTarget.innerHTML + + return this.exceptionTemplateTarget.innerHTML .replace(/NEW_RECORD/g, nextIndex) .replace(/NEXT_COLOR/g, newColor) - .replace(/NEXT_SECONDARY_COLOR/g, newSecondaryColor) } + } diff --git a/app/javascript/controllers/add_exception_item_controller.js b/app/javascript/controllers/add_exception_item_controller.js new file mode 100644 index 0000000..5d1e090 --- /dev/null +++ b/app/javascript/controllers/add_exception_item_controller.js @@ -0,0 +1,51 @@ +import { Controller } from "@hotwired/stimulus" + +export default class extends Controller { + static targets = ["exceptionItemTemplate", "exceptionItemContainer", "exceptionItem", "exceptionItemButton"] + + connect() { + const content = this.#newExemptionItem() + + this.exceptionItemButtonTarget.insertAdjacentHTML('beforebegin', content); + } + + addExemptionItem(event) { + event.preventDefault() + event.stopPropagation() + + const content = this.#newExemptionItem() + + this.exceptionItemButtonTarget.insertAdjacentHTML('beforebegin', content); + // this.containerTarget.insertAdjacentHTML("beforeend", content) + } + + removeExemptionItem(event) { + console.log("in remove") + event.preventDefault(); + const wrapper = event.target.closest(".exception-item"); + if (wrapper.dataset.newRecord === "true") { + wrapper.remove(); + } else { + wrapper.style.display = "none"; + const destroyInput = wrapper.querySelector("input[name*='[_destroy]']"); + if (destroyInput) { + destroyInput.value = "1"; + } + } + } + + #newExemptionItem() { + const nextIndex = this.exceptionItemTargets.length + const buttonElement = this.exceptionItemButtonTarget; + + // Get the computed style (returns rgb/rgba value) + const bgColor = window.getComputedStyle(buttonElement).backgroundColor; + const newColor = `[${bgColor}]` + + return this.exceptionItemTemplateTarget.innerHTML + .replace(/NEW_ITEM_RECORD/g, nextIndex) + .replace(/NEXT_COLOR/g, newColor) + + + } +} diff --git a/app/javascript/controllers/general_form_controller.js b/app/javascript/controllers/general_form_controller.js new file mode 100644 index 0000000..ac5b3af --- /dev/null +++ b/app/javascript/controllers/general_form_controller.js @@ -0,0 +1,43 @@ +import { Controller } from "@hotwired/stimulus" + +export default class extends Controller { + static targets = ["dependentField"] + + connect() { + } + + toggleFields() { + console.log("--- in toggle --- ") + const selector = this.element.querySelector('[data-action*="change->general-form#toggleFields"]'); + if (selector) { + const selectedValue = selector.value + this.field_match = false; + this.dependentFieldTargets.forEach((field) => { + // Check a data attribute on the field to see if it matches the selected value + if (field.dataset.parentValue === selectedValue) { + if (selectedValue == "network_logo") { + field.parentElement.parentElement.classList.remove("hidden"); + } else { + field.parentElement.classList.remove("hidden"); + } + this.field_match = true; + console.log("- ", selectedValue) + console.log("-- ", this.field_match) + } else { + if (field.dataset.parentValue == "network_logo") { + field.parentElement.parentElement.classList.add("hidden"); + } else { + field.parentElement.classList.add("hidden"); + } + } + }); + if (!this.field_match) { + console.log("--- ", this.field_match) + const defaultOption = this.dependentFieldTargets.find(target => { + return target.dataset.parentValue === 'default'; + }); + defaultOption.parentElement.classList.remove("hidden"); + } + } + } +} \ No newline at end of file diff --git a/app/javascript/controllers/logo_upload_controller.js b/app/javascript/controllers/logo_upload_controller.js index 62d07f3..ce0bd5a 100644 --- a/app/javascript/controllers/logo_upload_controller.js +++ b/app/javascript/controllers/logo_upload_controller.js @@ -4,6 +4,7 @@ export default class extends Controller { static targets = ["preview", "previewContainer", "logoSelect", "logofield", "initialLogoFile"]; async connect() { + console.log('in connect'); console.log(this.logofieldTarget.value) if (this.logofieldTarget.value.includes("Logo.")) { const response = await fetch(`/card_logo_files/${this.logofieldTarget.value}/image`); // Fetch the binary data @@ -82,13 +83,13 @@ export default class extends Controller { const blankOptionIndex = 0; const newOption = new Option(name, name, true, true) - if (this.logoSelectTarget.options.length > blankOptionIndex + 1) { - this.logoSelectTarget.insertBefore(newOption, this.logoSelectTarget.options[blankOptionIndex + 1]); + if (this.logofieldTarget.options.length > blankOptionIndex + 1) { + this.logofieldTarget.insertBefore(newOption, this.logofieldTarget.options[blankOptionIndex + 1]); } else { - this.logoSelectTarget.appendChild(newOption); + this.logofieldTarget.appendChild(newOption); } - this.logoSelectTarget.value = name; + this.logofieldTarget.value = name; } determineNetworkFilename(file) { diff --git a/app/models/card_exception.rb b/app/models/card_exception.rb new file mode 100644 index 0000000..fd3bc76 --- /dev/null +++ b/app/models/card_exception.rb @@ -0,0 +1,10 @@ +class CardException < ApplicationRecord + belongs_to :employer + has_many :card_exception_items + accepts_nested_attributes_for :card_exception_items, allow_destroy: true, reject_if: :all_blank + + VALID_TYPES = ['zipcode', 'state', 'family_id'] + + validates :type, inclusion: { in: VALID_TYPES, + message: "%{value} is not a valid exception type" } +end diff --git a/app/models/card_exception_item.rb b/app/models/card_exception_item.rb new file mode 100644 index 0000000..273187e --- /dev/null +++ b/app/models/card_exception_item.rb @@ -0,0 +1,25 @@ +class CardExceptionItem < ApplicationRecord + belongs_to :card_exception + belongs_to :card_logo_file, optional: true + belongs_to :card_provider, optional: true + + validate :only_one_exception_field_present + + FIELDS_TO_VALIDATE = [:field_value, :card_logo_file_id, :card_provider_id].freeze + + VALID_FIELD_NAMES = ['network_logo', 'provider_section', 'effective_date'] + + validates :field_name, inclusion: { in: VALID_FIELD_NAMES, + message: "%{value} is not a valid Id Card Field Name" } + + + private + + def only_one_exception_field_present + present_fields = FIELDS_TO_VALIDATE.count { |field| self[field].present? } + + if present_fields != 1 + errors.add(:base, "Only one exception field can be present at a time") + end + end +end diff --git a/app/models/card_logo_file.rb b/app/models/card_logo_file.rb index 0f09caf..9c0d5fe 100644 --- a/app/models/card_logo_file.rb +++ b/app/models/card_logo_file.rb @@ -1,4 +1,14 @@ class CardLogoFile < ApplicationRecord has_many :employer_card_logos, dependent: :destroy has_many :employers, through: :employer_card_logos + + before_save :round_aspect_ratio + + private + + def round_aspect_ratio + if self.aspect_ratio.present? + self.aspect_ratio = self.aspect_ratio.round(2) + end + end end diff --git a/app/models/employer.rb b/app/models/employer.rb index 20a94e9..602d7bd 100644 --- a/app/models/employer.rb +++ b/app/models/employer.rb @@ -22,6 +22,9 @@ class Employer < ApplicationRecord belongs_to :card_provider, optional: true belongs_to :card_rx, optional: true + has_many :card_exceptions, dependent: :destroy + accepts_nested_attributes_for :card_exceptions, allow_destroy: true, reject_if: :all_blank + scope :active, -> { where(active: true) } scope :inactive, -> { where(active: false) } @@ -128,7 +131,7 @@ class Employer < ApplicationRecord self.plans.each_with_index do |plan, i| plan.plan_benefits.each do |bene| Vhcs::HlEgglestonCardBenefit.create!( - plan_id: plan.plan_id, + plan_id: plan.pb_product_key, benefit_desc: bene.benefit_desc, benefit: bene.benefit, sequence: bene.sequence, diff --git a/app/models/vhcs/hl_egg_id_card_dependent.rb b/app/models/vhcs/hl_egg_id_card_dependent.rb index 3bc0ffb..1d147f4 100644 --- a/app/models/vhcs/hl_egg_id_card_dependent.rb +++ b/app/models/vhcs/hl_egg_id_card_dependent.rb @@ -1,5 +1,5 @@ module Vhcs - class HLEggIdCardDependent < VhcsRecord + class HlEggIdCardDependent < VhcsRecord self.table_name = 'HLEggIdCardDependent' diff --git a/app/models/vhcs/hlid_card_egg_data.rb b/app/models/vhcs/hlid_card_egg_data.rb new file mode 100644 index 0000000..b9a2cff --- /dev/null +++ b/app/models/vhcs/hlid_card_egg_data.rb @@ -0,0 +1,219 @@ +module Vhcs + class HlidCardEggData < VhcsRecord + + self.table_name = 'HLIDCardEggData' + + alias_attribute :id, :ID + alias_attribute :facility, :Facility + alias_attribute :division, :Division + alias_attribute :full_name, :FullName + alias_attribute :ssn, :SSN + alias_attribute :medical_coverage, :MedicalCoverage + alias_attribute :medical_eff_date, :MedicalEffDate + alias_attribute :medical_group_num, :MedicalGroupNum + alias_attribute :dental_coverage, :DentalCoverage + alias_attribute :dental_eff_date, :DentalEffDate + alias_attribute :dental_group_num, :DentalGroupNum + alias_attribute :card_type, :CardType + alias_attribute :provider_code, :ProviderCode + alias_attribute :provider_line_1, :ProviderLine1 + alias_attribute :provider_line_2, :ProviderLine2 + alias_attribute :provider_line_3, :ProviderLine3 + alias_attribute :provider_line_4, :ProviderLine4 + alias_attribute :provider_line_5, :ProviderLine5 + alias_attribute :provider_line_6, :ProviderLine6 + alias_attribute :provider_line_7, :ProviderLine7 + alias_attribute :provider_line_8, :ProviderLine8 + alias_attribute :provider_line_9, :ProviderLine9 + alias_attribute :provider_line_1_0, :ProviderLine10 + alias_attribute :provider_line_1_1, :ProviderLine11 + alias_attribute :mail_to, :MailTo + alias_attribute :mail_to_2, :MailTo2 + alias_attribute :claim_to_1, :ClaimTo1 + alias_attribute :claim_to_2, :ClaimTo2 + alias_attribute :claim_to_3, :ClaimTo3 + alias_attribute :claim_to_4, :ClaimTo4 + alias_attribute :claim_to_5, :ClaimTo5 + alias_attribute :claim_to_6, :ClaimTo6 + alias_attribute :claim_to_7, :ClaimTo7 + alias_attribute :claim_to_8, :ClaimTo8 + alias_attribute :claim_to_9, :ClaimTo9 + alias_attribute :claim_to_1_0, :ClaimTo10 + alias_attribute :claim_to_1_1, :ClaimTo11 + alias_attribute :contact_line_1, :ContactLine1 + alias_attribute :contact_line_2, :ContactLine2 + alias_attribute :contact_line_3, :ContactLine3 + alias_attribute :group_number, :GroupNumber + alias_attribute :family_id, :FamilyId + alias_attribute :group_no, :GroupNo + alias_attribute :rx_group_id, :RXGroupID + alias_attribute :help_desk, :HelpDesk + alias_attribute :customer_service, :CustomerService + alias_attribute :web_url, :WebUrl + alias_attribute :expr_1, :Expr1 + alias_attribute :line_3, :Line3 + alias_attribute :dependent_1, :Dependent1 + alias_attribute :dependent_2, :Dependent2 + alias_attribute :dependent_3, :Dependent3 + alias_attribute :dependent_4, :Dependent4 + alias_attribute :dependent_5, :Dependent5 + alias_attribute :dependent_6, :Dependent6 + alias_attribute :dependent_7, :Dependent7 + alias_attribute :dependent_8, :Dependent8 + alias_attribute :ben_desc_1, :BenDesc1 + alias_attribute :ben_1, :Ben1 + alias_attribute :ben_desc_2, :BenDesc2 + alias_attribute :ben_2, :Ben2 + alias_attribute :ben_desc_3, :BenDesc3 + alias_attribute :ben_3, :Ben3 + alias_attribute :ben_desc_4, :BenDesc4 + alias_attribute :ben_4, :Ben4 + alias_attribute :ben_desc_5, :BenDesc5 + alias_attribute :ben_5, :Ben5 + alias_attribute :ben_desc_6, :BenDesc6 + alias_attribute :ben_6, :Ben6 + alias_attribute :ben_desc_7, :BenDesc7 + alias_attribute :ben_7, :Ben7 + alias_attribute :ben_desc_8, :BenDesc8 + alias_attribute :ben_8, :Ben8 + alias_attribute :ben_desc_9, :BenDesc9 + alias_attribute :ben_9, :Ben9 + alias_attribute :ben_desc_1_0, :BenDesc10 + alias_attribute :ben_1_0, :Ben10 + alias_attribute :ben_desc_1_1, :BenDesc11 + alias_attribute :ben_1_1, :Ben11 + alias_attribute :ben_desc_1_2, :BenDesc12 + alias_attribute :ben_1_2, :Ben12 + alias_attribute :ben_desc_1_3, :BenDesc13 + alias_attribute :ben_1_3, :Ben13 + alias_attribute :ben_desc_1_4, :BenDesc14 + alias_attribute :ben_1_4, :Ben14 + alias_attribute :pl_plan_key, :PLPlanKey + alias_attribute :primary_mb_member_key, :PrimaryMBMemberKey + alias_attribute :ppo_lookup_1, :PPOLookup1 + alias_attribute :ppo_lookup_2, :PPOLookup2 + alias_attribute :precert_1, :Precert1 + alias_attribute :precert_2, :Precert2 + alias_attribute :precert_3, :Precert3 + alias_attribute :precert_4, :Precert4 + alias_attribute :precert_5, :Precert5 + alias_attribute :precert_6, :Precert6 + alias_attribute :misc_data, :MiscData + alias_attribute :ppo_data, :PPOData + alias_attribute :ppo_data_2, :PPOData2 + alias_attribute :ppo_data_3, :PPOData3 + alias_attribute :last_name, :LastName + alias_attribute :provider_line_1_2, :ProviderLine12 + alias_attribute :claim_to_1_2, :ClaimTo12 + + def attributes + rails_like = { + id: self.id, + facility: self.facility, + division: self.division, + full_name: self.full_name, + ssn: self.ssn, + medical_coverage: self.medical_coverage, + medical_eff_date: self.medical_eff_date, + medical_group_num: self.medical_group_num, + dental_coverage: self.dental_coverage, + dental_eff_date: self.dental_eff_date, + dental_group_num: self.dental_group_num, + card_type: self.card_type, + provider_code: self.provider_code, + provider_line_1: self.provider_line_1, + provider_line_2: self.provider_line_2, + provider_line_3: self.provider_line_3, + provider_line_4: self.provider_line_4, + provider_line_5: self.provider_line_5, + provider_line_6: self.provider_line_6, + provider_line_7: self.provider_line_7, + provider_line_8: self.provider_line_8, + provider_line_9: self.provider_line_9, + provider_line_1_0: self.provider_line_1_0, + provider_line_1_1: self.provider_line_1_1, + mail_to: self.mail_to, + mail_to_2: self.mail_to_2, + claim_to_1: self.claim_to_1, + claim_to_2: self.claim_to_2, + claim_to_3: self.claim_to_3, + claim_to_4: self.claim_to_4, + claim_to_5: self.claim_to_5, + claim_to_6: self.claim_to_6, + claim_to_7: self.claim_to_7, + claim_to_8: self.claim_to_8, + claim_to_9: self.claim_to_9, + claim_to_1_0: self.claim_to_1_0, + claim_to_1_1: self.claim_to_1_1, + contact_line_1: self.contact_line_1, + contact_line_2: self.contact_line_2, + contact_line_3: self.contact_line_3, + group_number: self.group_number, + family_id: self.family_id, + group_no: self.group_no, + rx_group_id: self.rx_group_id, + help_desk: self.help_desk, + customer_service: self.customer_service, + web_url: self.web_url, + expr_1: self.expr_1, + line_3: self.line_3, + dependent_1: self.dependent_1, + dependent_2: self.dependent_2, + dependent_3: self.dependent_3, + dependent_4: self.dependent_4, + dependent_5: self.dependent_5, + dependent_6: self.dependent_6, + dependent_7: self.dependent_7, + dependent_8: self.dependent_8, + ben_desc_1: self.ben_desc_1, + ben_1: self.ben_1, + ben_desc_2: self.ben_desc_2, + ben_2: self.ben_2, + ben_desc_3: self.ben_desc_3, + ben_3: self.ben_3, + ben_desc_4: self.ben_desc_4, + ben_4: self.ben_4, + ben_desc_5: self.ben_desc_5, + ben_5: self.ben_5, + ben_desc_6: self.ben_desc_6, + ben_6: self.ben_6, + ben_desc_7: self.ben_desc_7, + ben_7: self.ben_7, + ben_desc_8: self.ben_desc_8, + ben_8: self.ben_8, + ben_desc_9: self.ben_desc_9, + ben_9: self.ben_9, + ben_desc_1_0: self.ben_desc_1_0, + ben_1_0: self.ben_1_0, + ben_desc_1_1: self.ben_desc_1_1, + ben_1_1: self.ben_1_1, + ben_desc_1_2: self.ben_desc_1_2, + ben_1_2: self.ben_1_2, + ben_desc_1_3: self.ben_desc_1_3, + ben_1_3: self.ben_1_3, + ben_desc_1_4: self.ben_desc_1_4, + ben_1_4: self.ben_1_4, + pl_plan_key: self.pl_plan_key, + primary_mb_member_key: self.primary_mb_member_key, + ppo_lookup_1: self.ppo_lookup_1, + ppo_lookup_2: self.ppo_lookup_2, + precert_1: self.precert_1, + precert_2: self.precert_2, + precert_3: self.precert_3, + precert_4: self.precert_4, + precert_5: self.precert_5, + precert_6: self.precert_6, + misc_data: self.misc_data, + ppo_data: self.ppo_data, + ppo_data_2: self.ppo_data_2, + ppo_data_3: self.ppo_data_3, + last_name: self.last_name, + provider_line_1_2: self.provider_line_1_2, + claim_to_1_2: self.claim_to_1_2, + } + super.merge(rails_like) + end + + + end +end \ No newline at end of file diff --git a/app/models/vhcs/hlid_cards_egg.rb b/app/models/vhcs/hlid_cards_egg.rb index b96fdd2..1661c96 100644 --- a/app/models/vhcs/hlid_cards_egg.rb +++ b/app/models/vhcs/hlid_cards_egg.rb @@ -1,5 +1,5 @@ module Vhcs - class HLIDCardsEgg < VhcsRecord + class HlidCardsEgg < VhcsRecord self.table_name = 'HLIDCardsEgg' diff --git a/app/queries/call_stored_proc.rb b/app/queries/call_stored_proc.rb new file mode 100644 index 0000000..5a8bb49 --- /dev/null +++ b/app/queries/call_stored_proc.rb @@ -0,0 +1,14 @@ +class CallStoredProc + def initialize(procedure_name, args = {}) + @procedure_name = procedure_name + @args = args + end + + def call + params_sql = @args.map { |key, value| "@#{key} = :#{key}" }.join(', ') + sql_template = "EXEC #{@procedure_name} #{params_sql}" + sanitized_sql = VhcsRecord.send(:sanitize_sql_array, [sql_template, @args]) + + VhcsRecord.connection.exec_query(sanitized_sql) + end +end diff --git a/app/queries/get_all_id_card_data_by_plan_tpa_query.rb b/app/queries/get_all_id_card_data_by_plan_tpa_query.rb new file mode 100644 index 0000000..6f08b6a --- /dev/null +++ b/app/queries/get_all_id_card_data_by_plan_tpa_query.rb @@ -0,0 +1,94 @@ +class GetAllIDCardDataByPlanTPAQuery + + def initialize(pl_plan_key) + @pl_plan_key = ActiveRecord::Base.connection.quote(pl_plan_key) + end + + def call + VhcsRecord.connection.exec_query(sql).rows + end + + def to_id_cards_data + raw_data = call + + all_id_cards_data = [] + raw_data.each do |rd| + id_card_data = { + id: rd[0], + mb_member_key: rd[1], + mbr_type: rd[2], + division: rd[3], + full_name: rd[7], + family_id: rd[8], + mbr_class: rd[9], + effect_date: rd[11], + state: rd[12], + pl_plan_key: rd[14], + group_number: rd[15], + medical_group_num: rd[16], + dental_group_num: rd[17], + pb_product_key: rd[18], + mb_member_key: rd[19] + } + + all_id_cards_data.push(id_card_data) + end + + all_id_cards_data + end + + private + + def sql + <<~SQL + SELECT DISTINCT ROW_NUMBER() OVER(ORDER BY pbm.FamilyId ASC) as Id, pbc.MBMemberKey, + CASE WHEN div.PBENtityKey = 344215 OR div.PBENtityKey = 344217 THEN 'OSB' ELSE ou.CompanyNumber END as MbrType, + substring(div.LastName,0,41) as Div , + substring(pbe.FirstName,0,25) as MbrFirst, + substring(pbe.MiddleName,0,25) as MbrMiddle, + substring(pbe.LastName,0,50) as MbrLast, + (substring(pbe.FirstName, 0, 25) + ' ' + substring(pbe.LastName, 0, 50)) as FullName, + pbm.FamilyId, + UPPER(lct.shortdesc) as MbrClass, + 2 as MedOrDent,pp.InEffect as EffectDate, + pbea.State,ISNULL(oua.State,pbea.State) as EmpState, + M.PLPlanKey, + PC.GroupNumber, + PC.MedicalNumber, + PC.DentalNumber, + P.PBProductKey, + m.PBEntityKey as PrimaryMBMemberKey + FROM VWMBMember M INNER JOIN PBEntityClaimsData pbc on pbc.MBMemberKey=M.MBMemberKey + LEFT OUTER Join HLPlanCode PC ON PC.PlanKey = M.PLPlanKey + INNER JOIN PBMember pbm on pbm.PBEntityKey=pbc.PBEntityKey and pbm.EnrolleeTypeKey=1044 + INNER JOIN PBEntity pbe on pbe.PBEntityKey=pbm.PBEntityKey + INNER JOIN PBEntityAddress pbea on pbea.PBEntityKey=pbe.PBEntityKey and pbea.AddressTypeID=1137 + INNER JOIN PBCoveredEntities ce on ce.PBEntityKey=pbe.PBEntityKey + INNER JOIN PBProductParticipation pp on pp.PBProductParticipationKey=ce.PBProductParticipationKey + INNER JOIN (SELECT ce1.PBEntityKey, pp1.PBProductAvailabilityKey, MAX(pp1.WhenLastChanged) as WhenLastChanged, + pp1.CoverageTypeCode + FROM PBCoveredEntities ce1 + INNER JOIN PBProductParticipation pp1 on pp1.PBProductParticipationKey = ce1.PBProductParticipationKey + GROUP BY ce1.PBEntityKey, pp1.PBProductAvailabilityKey,pp1.CoverageTypeCode) + cepp ON cepp.PBEntityKey = ce.PBEntityKey AND cepp.PBProductAvailabilityKey = pp.PBProductAvailabilityKey + and cepp.CoverageTypeCode = pp.CoverageTypeCode + INNER JOIN GEN_LookupTables lct ON lct.RecordID = pp.CoverageTypeCode + INNER JOIN PBProductAvailability pa on pa.PBProductAvailabilityKey=pp.PBProductAvailabilityKey + INNER JOIN PBProduct p on p.PBProductKey=pa.PBProductKey + INNER JOIN PBAffiliation aff ON aff.PBAffiliationKey = pp.PBAffiliationKey + INNER JOIN PBEntity div on div.PBEntityKey=aff.ParentPBEntityKey + LEFT OUTER JOIN PBOrgUnit ou on ou.PBEntityKey=div.PBEntityKey + LEFT OUTER JOIN PBEntityAddress oua on oua.PBEntityKey=ou.PBEntityKey and oua.AddressTypeID=1137 WHERE p.PBProductKey in (Select DISTINCT PBProductKey From PBProduct Where FullDescription NOT LIKE '%LIFE%' AND FullDescription NOT LIKE '%VIS%') + AND pp.InEffect <= getdate() +90 + AND (pp.OutOfEffect-1 > getdate() AND + pp.OutOfEffect>pp.InEffect) + AND pp.OutOfEffect=(Select Max(Part.OutOfEffect) From PBProductParticipation Part + INNER JOIN PBProductAvailability Aval on Aval.PBProductAvailabilityKey=Part.PBProductAvailabilityKey + INNER JOIN PBProduct Prod on Prod.PBProductKey=Aval.PBProductKey + Where Prod.PBProductKey = p.PBProductKey + AND Part.PBProductParticipationKey = pp.PBProductParticipationKey) + AND M.EnrolleeTypeKey = '1044' + AND M.PLPlanKey = #{@pl_plan_key} + SQL + end +end \ No newline at end of file diff --git a/app/queries/get_id_card_data_tpa_query.rb b/app/queries/get_id_card_data_tpa_query.rb new file mode 100644 index 0000000..37ffc77 --- /dev/null +++ b/app/queries/get_id_card_data_tpa_query.rb @@ -0,0 +1,95 @@ +class GetIdCardDataTpaQuery + def initialize(family_id) + @family_id = ActiveRecord::Base.connection.quote(family_id) + if family_id.length == 9 + @entity_type = ActiveRecord::Base.connection.quote("FamilyId") + else + @entity_type = ActiveRecord::Base.connection.quote("PBEntityKey") + end + end + + def call + VhcsRecord.connection.exec_query(sql).rows.first + end + + def to_id_card_data + raw_data = call + + id_card_data = { + id: raw_data[0], + mb_member_key: raw_data[1], + mbr_type: raw_data[2], + division: raw_data[3], + full_name: raw_data[7], + family_id: raw_data[8], + mbr_class: raw_data[9], + effect_date: raw_data[11], + state: raw_data[12], + pl_plan_key: raw_data[14], + group_number: raw_data[15], + medical_group_num: raw_data[16], + dental_group_num: raw_data[17], + pb_product_key: raw_data[18], + mb_member_key: raw_data[19] + } + + [id_card_data] + end + + private + + def sql + <<~SQL + SELECT DISTINCT ROW_NUMBER() OVER(ORDER BY pbm.FamilyId ASC) as Id, pbc.MBMemberKey, + isnull(ou.CompanyNumber,'') as MbrType, + CASE WHEN m.PLPlanKey = '14' THEN 'DUPLIN COUNTY GOVERNMENT' ELSE substring(div.LastName,0,41) END as Div, + substring(pbe.FirstName,0,25) as MbrFirst, + substring(pbe.MiddleName,0,25) as MbrMiddle, + substring(pbe.LastName,0,50) as MbrLast, + (substring(pbe.FirstName, 0, 25) + ' ' + substring(pbe.LastName, 0, 50)) as FullName, + pbm.FamilyId, + UPPER(lct.shortdesc) as MbrClass, + 2 as MedOrDent, + pp.InEffect as EffectDate, + pbea.State,ISNULL(oua.State,pbea.State) as EmpState, + M.PLPlanKey, + PC.GroupNumber, + PC.MedicalNumber, + PC.DentalNumber, + P.PBProductKey, + m.PBEntityKey as PrimaryMBMemberKey + FROM VWMBMember M + INNER JOIN PBEntityClaimsData pbc on pbc.MBMemberKey=M.MBMemberKey + Inner Join HLPlanCode PC ON PC.PlanKey = M.PLPlanKey + INNER JOIN PBMember pbm on pbm.PBEntityKey=pbc.PBEntityKey and pbm.EnrolleeTypeKey=1044 + INNER JOIN PBEntity pbe on pbe.PBEntityKey=pbm.PBEntityKey + INNER JOIN PBEntityAddress pbea on pbea.PBEntityKey=pbe.PBEntityKey and pbea.AddressTypeID=1137 + INNER JOIN PBCoveredEntities ce on ce.PBEntityKey=pbe.PBEntityKey + INNER JOIN PBProductParticipation pp on pp.PBProductParticipationKey=ce.PBProductParticipationKey + INNER JOIN (SELECT ce1.PBEntityKey, pp1.PBProductAvailabilityKey, MAX(pp1.WhenLastChanged) as WhenLastChanged, + pp1.CoverageTypeCode + FROM PBCoveredEntities ce1 + INNER JOIN PBProductParticipation pp1 on pp1.PBProductParticipationKey = ce1.PBProductParticipationKey + GROUP BY ce1.PBEntityKey, pp1.PBProductAvailabilityKey,pp1.CoverageTypeCode) + cepp ON cepp.PBEntityKey = ce.PBEntityKey AND cepp.PBProductAvailabilityKey = pp.PBProductAvailabilityKey + and cepp.CoverageTypeCode = pp.CoverageTypeCode + INNER JOIN GEN_LookupTables lct ON lct.RecordID = pp.CoverageTypeCode + INNER JOIN PBProductAvailability pa on pa.PBProductAvailabilityKey=pp.PBProductAvailabilityKey + INNER JOIN PBProduct p on p.PBProductKey=pa.PBProductKey + INNER JOIN PBAffiliation aff ON aff.PBAffiliationKey = pp.PBAffiliationKey + INNER JOIN PBEntity div on div.PBEntityKey=aff.ParentPBEntityKey + LEFT OUTER JOIN PBOrgUnit ou on ou.PBEntityKey=div.PBEntityKey + LEFT OUTER JOIN PBEntityAddress oua on oua.PBEntityKey=ou.PBEntityKey and oua.AddressTypeID=1137 + WHERE p.PBProductKey in (Select PBProductKey From PBProduct Where FullDescription NOT LIKE '%LIFE%' AND FullDescription NOT LIKE '%VISION%' AND FullDescription NOT LIKE '%DENT%') + AND pp.InEffect <= getdate() +90 + AND (pp.OutOfEffect-1 > getdate() AND pp.OutOfEffect>pp.InEffect) + AND pp.OutOfEffect=(Select Max(Part.OutOfEffect) From PBProductParticipation Part + INNER JOIN PBProductAvailability Aval on Aval.PBProductAvailabilityKey=Part.PBProductAvailabilityKey + INNER JOIN PBProduct Prod on Prod.PBProductKey=Aval.PBProductKey + Where Prod.PBProductKey = p.PBProductKey + AND Part.PBProductParticipationKey = pp.PBProductParticipationKey) + AND pbm.#{@entity_type}=#{@family_id} + AND M.EnrolleeTypeKey='1044' + SQL + end +end diff --git a/app/queries/temp.rb b/app/queries/temp.rb new file mode 100644 index 0000000..e69de29 diff --git a/app/services/employer_cards/data_formatter.rb b/app/services/employer_cards/data_formatter.rb index 52f3fa1..fbd186b 100644 --- a/app/services/employer_cards/data_formatter.rb +++ b/app/services/employer_cards/data_formatter.rb @@ -6,7 +6,7 @@ module EmployerCards end def call - @members = @employer.members + @members = @employer.members.order(:name) @employer_cards = [] init_cards_and_set_member_fields @@ -19,6 +19,31 @@ module EmployerCards private + def init_cards_and_set_common_fields + employer_attributes = { + employer_name: @employer.id_card_display_name, + group_number: @employer.group_number, + rx_group: @employer.rx_group_number + } + + rx_attributes = @employer.card_rx.attributes.with_indifferent_access.slice( + :customer_service, + :web_url + ) + + provider_attributes = @employer.card_provider.attributes.with_indifferent_access.slice( + :provider_code, :provider_line_1, :provider_line_2, :provider_line_3, :provider_line_4, :provider_line_5, :provider_line_6, + :provider_line_7, :provider_line_8, :provider_line_9, :provider_line_10, :provider_line_11, :provider_line_12, + :claim_to_1, :claim_to_2, :claim_to_3, :claim_to_4, :claim_to_5, :claim_to_6, + :claim_to_7, :claim_to_8, :claim_to_9, :claim_to_10, :claim_to_11, :claim_to_12 + ) + + selected_attributes = employer_attributes.merge(rx_attributes).merge(provider_attributes) + @employer_cards.each do |card| + card.assign_attributes(selected_attributes) + end + end + def set_common_fields employer_attributes = { employer_name: @employer.id_card_display_name, @@ -32,7 +57,7 @@ module EmployerCards ) provider_attributes = @employer.card_provider.attributes.with_indifferent_access.slice( - :provider_line_1, :provider_line_2, :provider_line_3, :provider_line_4, :provider_line_5, :provider_line_6, + :provider_code, :provider_line_1, :provider_line_2, :provider_line_3, :provider_line_4, :provider_line_5, :provider_line_6, :provider_line_7, :provider_line_8, :provider_line_9, :provider_line_10, :provider_line_11, :provider_line_12, :claim_to_1, :claim_to_2, :claim_to_3, :claim_to_4, :claim_to_5, :claim_to_6, :claim_to_7, :claim_to_8, :claim_to_9, :claim_to_10, :claim_to_11, :claim_to_12 @@ -58,21 +83,29 @@ module EmployerCards end def init_cards_and_set_member_fields + @group_dependents = Vhcs::VwmbMember.where(pl_plan_key: @employer.pl_plan_key) @members.each do |me| effect_date = determine_eff_date(me) if effect_date member_card = SampleIdCard.new() - selected_attributes = { + member_attributes = { full_name: me.id_card_display_name, - primary_mb_member_key: me.mb_member_key, + name: me.name, + primary_mb_member_key: me.pb_entity_key, family_id: me.family_id, plan_id: me.plan_id, medical_eff_date: effect_date.strftime("%m/%d/%Y") - } + dependent_attributes = get_dependent_fields(me) + + selected_attributes = member_attributes.merge(dependent_attributes) member_card.assign_attributes(selected_attributes) @employer_cards.push(member_card) + + if dependent_attributes.present? + @employer_cards.push(member_card) + end end end end @@ -102,7 +135,7 @@ module EmployerCards def determine_eff_date(member) - participation = Vhcs::PbProductParticipation.joins('INNER JOIN "PBCoveredEntities" ON "PBProductParticipation"."PBProductParticipationKey" = "PBCoveredEntities"."PBProductParticipationKey"').where('"PBCoveredEntities"."PBEntityKey" = ?', member.pb_entity_key).first + participation = Vhcs::PbProductParticipation.joins('INNER JOIN "PBCoveredEntities" ON "PBProductParticipation"."PBProductParticipationKey" = "PBCoveredEntities"."PBProductParticipationKey"').where('"PBCoveredEntities"."PBEntityKey" = ?', member.pb_entity_key).last in_effect = participation.in_effect out_of_effect = participation.out_of_effect @@ -114,8 +147,14 @@ module EmployerCards end - def set_dependent_fields - # Not needed for sample card + def get_dependent_fields(member) + dependent_attributes = {} + dependents = @group_dependents.where(family_id: member.family_id).where.not(pb_entity_key: member.pb_entity_key) + dependents.each do |dep| + dependent_name = dep.first_name + ' ' + dep.last_name + dependent_attributes["dependent_#{dep.sequence_number - 1}".to_sym] = dependent_name + end + dependent_attributes end end end \ No newline at end of file diff --git a/app/services/employer_cards/jasper_url_generator.rb b/app/services/employer_cards/jasper_url_generator.rb index ae22c21..9c78fb0 100644 --- a/app/services/employer_cards/jasper_url_generator.rb +++ b/app/services/employer_cards/jasper_url_generator.rb @@ -1,17 +1,14 @@ module EmployerCards class JasperUrlGenerator - def initialize(employer, family_id) + def initialize(employer, family_id, layout) @family_id = family_id @employer = employer + @layout = layout end def call - # @net_logo = determine_network_logo - card_front_url = URI::HTTP.build(url_components("Front")) - card_back_url = URI::HTTP.build(url_components("Back")) - - [card_front_url, card_back_url] + URI::HTTP.build(url_components) end private @@ -30,17 +27,12 @@ module EmployerCards end # http://localhost:8080/trunk/PdfServlet?reportConn=BrittonConnect&id=&reportName=FairosRxSampleIDCard-Half&family_id=Classic%202K&employer_logo=BryanPestControl.jpeg&network_logo=CignaLogo.png&reportDir=secure/Documents&SUBREPORT_DIR=/&ImageDir=secure/Documents&netToken=3a4a8b03f4dfb0e6e3fc82dd369f70ef&FileType=PDF # http://localhost:8080/trunk/PdfServlet?reportConn=BrittonConnect&id=&reportName=FairosRxSampleIDCard-Half&family_id=Classic%202K&employer_logo=BryanPestControl.jpeg&network_logo=CignaLogo.png&reportDir=secure/Documents&SUBREPORT_DIR=/&ImageDir=secure/Documents&netToken=3a4a8b03f4dfb0e6e3fc82dd369f70ef&FileType=PDF - def url_components(card_side) - if card_side == "Back" && @employer.single_card_template.include?("-Half") - template = @employer.single_card_template.gsub("-Half", "") - else - template = @employer.single_card_template - end + def url_components { host: '10.41.1.115', port: 8080, - path: '/trunk/PdfServlet', - query: "reportConn=BrittonConnect&id=&reportName=#{template}-#{card_side}-Print&family_id=#{@family_id}&employer_logo=#{@employer.employer_logo_filename}&network_logo=#{determine_network_logo}&reportDir=secure/Documents&SUBREPORT_DIR=/&ImageDir=secure/Documents&netToken=3a4a8b03f4dfb0e6e3fc82dd369f70ef&FileType=PDF" + path: '/trunk/IdCardsServlet', + query: "reportConn=BrittonConnect&cardTemplate=#{@employer.single_card_template}&printType=#{@layout}&family_id=#{@family_id }&employer_logo=#{@employer.employer_logo_filename}&network_logo=#{determine_network_logo}&FileType=PDF" } end diff --git a/app/services/employer_cards_generator.rb b/app/services/employer_cards_generator.rb index 617cbc3..2b7d5a0 100644 --- a/app/services/employer_cards_generator.rb +++ b/app/services/employer_cards_generator.rb @@ -1,22 +1,47 @@ class EmployerCardsGenerator - def initialize(employer) + def initialize(employer, layout) @employer = employer + @layout = layout end def call SampleIdCard.where(employer_name: @employer.id_card_display_name).destroy_all EmployerCards::DataFormatter.new(@employer).call - group_cards_pdf = CombinePDF.new - SampleIdCard.where(employer_name: @employer.id_card_display_name).each do |card| - urls = EmployerCards::JasperUrlGenerator.new(@employer, card.family_id).call - puts urls - card_front_pdf = SampleCard::JasperPdfGenerator.new(urls.first).call - card_back_pdf = SampleCard::JasperPdfGenerator.new(urls.last).call + if @layout == "FullPageCard" + group_cards_pdf_array = [] + reprint = Vhcs::HlidCardEggData.where(group_number: @employer.group_number).pluck(:family_id) + SampleIdCard.where(employer_name: @employer.id_card_display_name).each do |card| + if reprint.include?(card.family_id) + url = EmployerCards::JasperUrlGenerator.new(@employer, card.family_id, @layout).call + puts url + card_pdf = SampleCard::JasperPdfGenerator.new(url).call + card_filename = "#{card.name.gsub(", ","_")}_digital_card_#{Date.today}.pdf" + # group_cards_pdf_array.add(card_filename, pdf_object.to_pdf) + group_cards_pdf_array << { name: card_filename, data: card_pdf.to_pdf } + end + end - group_cards_pdf << card_front_pdf - group_cards_pdf << card_back_pdf + # Initialize a string-based IO object + group_cards_pdf = Zip::OutputStream.write_buffer do |zio| + group_cards_pdf_array.each do |file| + zio.put_next_entry(file[:name]) + zio.write(file[:data]) + end + end + else + group_cards_pdf = CombinePDF.new + reprint = Vhcs::HlidCardEggData.where(group_number: @employer.group_number).pluck(:family_id) + SampleIdCard.where(employer_name: @employer.id_card_display_name).each do |card| + if reprint.include?(card.family_id) + url = EmployerCards::JasperUrlGenerator.new(@employer, card.family_id, @layout).call + puts url + card_pdf = SampleCard::JasperPdfGenerator.new(url).call + + group_cards_pdf << card_pdf + end + end end # todays_date = DateTime.current.strftime('%Y%m%d%H%M%S') diff --git a/app/services/sample_card/data_formatter.rb b/app/services/sample_card/data_formatter.rb index 648043f..439d449 100644 --- a/app/services/sample_card/data_formatter.rb +++ b/app/services/sample_card/data_formatter.rb @@ -12,6 +12,7 @@ module SampleCard set_generic_fields() set_rx_fields() set_network_fields() + # set_dependent_fields() sample_cards = set_plan_fields() sample_cards.each(&:save!) @@ -33,7 +34,8 @@ module SampleCard plans_sample_cards = [] @employer.plans.each do |plan| plan_sample_card = @sample_card.dup - plan_sample_card.family_id = plan.title + plan_name = plan.title.split(/(?<=\d[kK])/).first + plan_sample_card.family_id = plan_name plan.plan_benefits.each do |bene| plan_sample_card["benefit_desc_#{bene.sequence}".to_sym] = bene.benefit_desc plan_sample_card["benefit_#{bene.sequence}".to_sym] = bene.benefit @@ -60,6 +62,9 @@ module SampleCard :claim_to_1, :claim_to_2, :claim_to_3, :claim_to_4, :claim_to_5, :claim_to_6, :claim_to_7, :claim_to_8, :claim_to_9, :claim_to_10, :claim_to_11, :claim_to_12 ) + if @employer.network_provider == "Cigna" + @sample_card.provider_code = "5" + end @sample_card.assign_attributes(selected_attributes) end @@ -75,7 +80,14 @@ module SampleCard end def set_dependent_fields - # Not needed for sample card + @sample_card.dependent_1 = "John Doe" + @sample_card.dependent_2 = "Molly Doe" + @sample_card.dependent_3 = "Jonathan Doe" + @sample_card.dependent_4 = "Calvin Doe" + @sample_card.dependent_5 = "Richard Doe" + @sample_card.dependent_6 = "Jannet Doe" + @sample_card.dependent_7 = "Longername Doe" + @sample_card.dependent_8 = "Robbert Doe" end end end \ No newline at end of file diff --git a/app/services/sample_card/jasper_url_generator.rb b/app/services/sample_card/jasper_url_generator.rb index 9ce88c7..21fd304 100644 --- a/app/services/sample_card/jasper_url_generator.rb +++ b/app/services/sample_card/jasper_url_generator.rb @@ -24,11 +24,11 @@ module SampleCard # end # end # @network_logos.find_by(default: true).net_logo - if @employer.single_card_template.include?("Half") - "FairosRxSampleIDCard-Half-Display" - else - "FairosRxSampleIDCard-Display" - end + # if @employer.single_card_template.include?("Half") + # "FairosRxSampleIDCard-Half-Display" + # else + # "FairosRxSampleIDCard-Display" + # end end def determine_network_logo @@ -49,8 +49,8 @@ module SampleCard { host: '10.41.1.115', port: 8080, - path: '/trunk/PdfServlet', - query: "reportConn=BrittonConnect&id=&reportName=#{determine_card_template}&family_id=#{@plan_name}&employer_logo=#{@employer.employer_logo_filename}&network_logo=#{determine_network_logo}&reportDir=secure/Documents&SUBREPORT_DIR=/&ImageDir=secure/Documents&netToken=3a4a8b03f4dfb0e6e3fc82dd369f70ef&FileType=PDF" + path: '/trunk/IdCardsServlet', + query: "reportConn=BrittonConnect&cardTemplate=FairosRxIDCard&printType=SampleCard&family_id=#{@plan_name}&employer_logo=#{@employer.employer_logo_filename}&network_logo=#{determine_network_logo}&FileType=PDF" } end diff --git a/app/services/sample_card/pdf_printer.rb b/app/services/sample_card/pdf_printer.rb index 16a1a15..a8ee2c0 100644 --- a/app/services/sample_card/pdf_printer.rb +++ b/app/services/sample_card/pdf_printer.rb @@ -17,7 +17,7 @@ module SampleCard end employer_name = @process.employer_name.downcase.tr(" ", "_") - todays_date = Date.today.strftime("%m-%d-%Y") + todays_date = Date.today.strftime("%m/%d/%Y") group_cards_pdf.save("tmp/#{employer_name}_sample_cards_#{todays_date}.pdf") group_cards_pdf diff --git a/app/views/employer_setup/edit.html.erb b/app/views/employer_setup/edit.html.erb index be5ed88..40d73c5 100644 --- a/app/views/employer_setup/edit.html.erb +++ b/app/views/employer_setup/edit.html.erb @@ -10,7 +10,7 @@
- <%= f.text_field :employer_name, label: { text: "Employer Name" }, data: { logo_upload_target: "initialLogoFile" }, class: "w-full" %> + <%= f.text_field :employer_name, label: { text: "Employer Name" }, class: "w-full" %>
<%= f.text_field :slug, label: { text: "Slug" }, class: "w-full" %> diff --git a/app/views/employers/_alt_network_logo_fields_new.html.erb b/app/views/employers/_alt_network_logo_fields_new.html.erb new file mode 100644 index 0000000..b37cef5 --- /dev/null +++ b/app/views/employers/_alt_network_logo_fields_new.html.erb @@ -0,0 +1,15 @@ + + diff --git a/app/views/employers/edit.html.erb b/app/views/employers/edit.html.erb index 9249e23..29d520b 100644 --- a/app/views/employers/edit.html.erb +++ b/app/views/employers/edit.html.erb @@ -118,8 +118,9 @@ <% end %>
-
+
<%= f.submit "Submit" %> + <%= link_to "Back", employer_path(@employer.slug), class: "flex justify-center items-center cursor-pointer bg-atmosphere hover:bg-deepcove border-2 border-atmosphere text-platinum font-bold px-3 rounded-sm h-10 transition duration-100" %>
<% end %> diff --git a/app/views/employers/index.html.erb b/app/views/employers/index.html.erb index 0171c62..e1e1f55 100644 --- a/app/views/employers/index.html.erb +++ b/app/views/employers/index.html.erb @@ -1,21 +1,33 @@
-

Employers

- <% plan_colors = EmployerSetupPlansForm::PLAN_COLORS.push('copper', 'bronze').shuffle %> -

In Process:

- <% @employers.inactive.each_with_index do |es, index| %> - <% item_color_index = index == 0 ? 0 : index % plan_colors.length %> -
"> - <%= link_to es.name, employer_path(es.slug), class: "hover:text-atmosphere" %> -
- <% end %> -
- <%= link_to "New Employer", new_employer_path, class: "hover:text-verdigris" %> +
+

Employers

+ <%= link_to new_employer_path, class: "flex justify-center items-center h-8 w-8 ml-2 mb-6 text-sm text-bronze bg-deepcove hover:bg-cobalt font-semibold p-1 rounded-lg border-2 border-cobalt" do %> + <%= icon "clipboard-plus", library: "lucide" %> + <% end %> +
-

Live:

- <% @employers.active.each_with_index do |es, index| %> - <% item_color_index = index == 0 ? 0 : index % plan_colors.length %> -
"> - <%= link_to es.name, employer_path(es.slug), class: "hover:text-atmosphere" %> + <% plan_colors = EmployerSetupPlansForm::PLAN_COLORS.push('copper', 'bronze').shuffle %> + <% @color_index = 0 %> +

In Process:

+ <% @employers.inactive.each_with_index do |emp, index| %> + <% item_color_index = @color_index == 0 ? 0 : @color_index % plan_colors.length %> +
"> + <%= link_to emp.name, employer_path(emp.slug), class: "hover:text-#{plan_colors[item_color_index]}" %> +
+ <%= "(Effective #{emp.effective_date})" %> +
+ <% @color_index += 1 %> + <% end %> +

Live:

+ <% @employers.active.each_with_index do |emp, index| %> + <% item_color_index = @color_index == 0 ? 0 : @color_index % plan_colors.length %> +
"> + <%= link_to emp.name, employer_path(emp.slug), class: "hover:text-#{plan_colors[item_color_index]}" %> +
+ <%= "(#{emp.members.count} Members)" %> +
+
+ <% @color_index += 1 %> <% end %>
\ No newline at end of file diff --git a/app/views/employers/new_new.html.erb b/app/views/employers/new_new.html.erb new file mode 100644 index 0000000..f15a818 --- /dev/null +++ b/app/views/employers/new_new.html.erb @@ -0,0 +1,170 @@ +
+
+

New Employer

+ <%= form_with model: @employer, url: import_employers_path, data: { turbo: false }, local: true, multipart: true do |form| %> +
+
+ <%= form.label :import_from_word, 'ID Card Setup Word Doc', class: "block text-platinum font-bold mb-1 md:mb-0 pr-4" %> + <%= form.file_field :import_from_word %> +
+ <%= form.submit "Import", class: "h-[40px]" %> +
+ <% end %> +
+ <%= form_with model: @employer, local: true, multipart: true do |f| %> +
+
+

General Information

+
+
+
+
+
+
+ <%= f.text_field :name, label: { text: "Employer Name" }, data: { logo_upload_target: "employer" }, class: "w-full" %> +
+
+ <%= f.text_field :group_number, label: { text: "Group/Medical Number" }, class: "w-full" %> +
+
+
+
+ <%= f.text_field :effective_date, label: { text: "Effective Date" }, class: "w-full" %> +
+
+ <%= f.select :network_provider, options_for_select(["Cigna", "Medcost"]), label: { text: "Provider Network" }, data: { logo_upload_target: "network" }, class: "w-full" %> + <%= f.hidden_field :single_card_template, value: @employer.single_card_template %> + <%= f.hidden_field :default_network_logo, value: @employer.default_network_logo %> + <%= f.hidden_field :card_provider_id, value: @employer.card_provider_id %> + <%= f.hidden_field :card_rx_id, value: @employer.card_rx_id %> +
+
+
+
+
+ <%= f.text_field :employer_logo_filename, label: { text: "Employer Logo" }, default: "No logo added", data: { logo_upload_target: "logofield" }, class: "w-full rounded-r-none", readonly: true %> +
+
+ +
+
+ + <%= f.file_field :add_or_update_logo, class: "hidden", id: "file_upload_input_employer", data: { logo_upload_target: "previewContainer", logo_upload_type_param: "employer", action: "change->logo-upload#uploadLogo" }, direct_upload: true %> +
+
+
+
+

Plans Information

+
+
+
+
+ <% @employer.plans.each_with_index do |plan, index| %> + <%= f.fields_for :plans, plan, child_index: index do |plan_fields| %> +
+
">
+
-ml-[6px] z-2 w-full"> + <%= "Plan #{index + 1}" %> +
+ <%= render 'plan_fields', plan_fields: plan_fields, f: f, index: index %> +
"> + Benefit Values +
+
ml-[3px]">
+ <%= plan_fields.fields_for :plan_benefits do |plan_benefits_fields| %> + <%= render 'plan_benefits_fields', plan_benefits_fields: plan_benefits_fields %> + <% end %> +
+ <%= plan_fields.hidden_field :_destroy %> + <%= button_tag "Remove Plan #{index + 1}", class: "cursor-pointer bg-deepcove hover:bg-brightlava text-xl font-bold text-copper hover:text-platinum py-2 px-4 font-semibold leading-tight rounded-lg border-3 border-copper w-full", data: { action: "add-plan#remove" } %> +
+
+ <% end %> + <% end %> + <%= button_tag "Add a Plan", class: "cursor-pointer text-2xl font-bold py-2 pr-6 mt-10 w-[calc(24%-1rem)] w-1/4 min-h-[940px] text-[#E0E0E0] rounded-lg font-medium border border-[#E0E0E0] bg-[#173057] hover:bg-transparent hover:shadow-[0_0_10px_3px_#93c5fd] transition-colors duration-150", data: { action: "add-plan#add", add_plan_target: "button" } %> +
+ +
+
+ +
+

ID Card Exceptions Information

+
+
+
+ <%= button_tag "Add an Exception", class: "cursor-pointer text-lg font-medium py-2 px-4 rounded w-1/7 h-35 my-8 text-[#E0E0E0] rounded-lg border border-[#C2C2C2] hover:shadow-[0_0_10px_3px_#93c5fd]", data: { action: "add-exception#addExemption", add_exception_target: "exceptionButton" } %> + +
+
+ <%= f.submit "Submit" %> +
+
+ <% end %> +
diff --git a/app/views/employers/show.html.erb b/app/views/employers/show.html.erb index dbc99f4..2893391 100644 --- a/app/views/employers/show.html.erb +++ b/app/views/employers/show.html.erb @@ -25,17 +25,21 @@
<% @employer.attributes.with_indifferent_access.slice(:pl_plan_key, :company_pb_entity_key, :group_number).each do |attribute_name, attribute_value| %>

"> - ├── <%= attribute_name.humanize %>: + ├── <%= attribute_name.titleize %>: <%= attribute_value.present? ? attribute_value.to_s : "waiting" %>

<% end %>
└── Plans
- <% @employer.plans.pluck(:title).each do |plan_title| %> + <% @employer.plans.pluck(:title, :pb_product_key).each do |plan| %>
- ├── <%= plan_title %> + ├── <%= plan.first %>
+

"> + └── PB Product Key: + <%= plan.last.present? ? plan.last.to_s : "waiting" %> +

<% end %>
@@ -51,8 +55,8 @@
<%= link_to 'Generate Sample Cards', generate_sample_sample_id_cards_path(employer_slug: @employer.slug ), data: { turbo: false }, class: "flex justify-center items-center w-2/3 cursor-pointer bg-atmosphere hover:bg-deepcove border-2 border-atmosphere text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %> <%= link_to 'Generate Group Cards (for print)', generate_print_sample_id_cards_path(employer_slug: @employer.slug ),data: { turbo: false }, class: "flex justify-center items-center w-2/3 #{@employer.active ? "" : "pointer-events-none opacity-50 cursor-not-allowed"} bg-atmosphere hover:bg-deepcove border-2 border-atmosphere text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %> - <%= link_to 'Generate Group Cards (for display)', generate_sample_sample_id_cards_path(employer_slug: @employer.slug ), data: { turbo: false }, class: "flex justify-center items-center w-2/3 pointer-events-none opacity-50 cursor-not-allowed bg-atmosphere hover:bg-deepcove border-2 border-atmosphere text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %> - <%= link_to 'Generate Group Cards (for download)', generate_sample_sample_id_cards_path(employer_slug: @employer.slug ), data: { turbo: false }, class: "flex justify-center items-center w-2/3 pointer-events-none opacity-50 cursor-not-allowed bg-atmosphere hover:bg-deepcove border-2 border-atmosphere text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %> + <%= link_to 'Generate Group Cards (for display)', generate_mobile_display_sample_id_cards_path(employer_slug: @employer.slug ), data: { turbo: false }, class: "flex justify-center items-center w-2/3 #{@employer.active ? "" : "pointer-events-none opacity-50 cursor-not-allowed"} bg-atmosphere hover:bg-deepcove border-2 border-atmosphere text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %> + <%= link_to 'Generate Group Cards (for download)', generate_full_page_sample_id_cards_path(employer_slug: @employer.slug ), data: { turbo: false }, class: "flex justify-center items-center w-2/3 #{@employer.active ? "" : "pointer-events-none opacity-50 cursor-not-allowed"} bg-atmosphere hover:bg-deepcove border-2 border-atmosphere text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %>
\ No newline at end of file diff --git a/app/views/welcome/tailwind_colors.html.erb b/app/views/welcome/tailwind_colors.html.erb index 37e5d80..168ecc9 100644 --- a/app/views/welcome/tailwind_colors.html.erb +++ b/app/views/welcome/tailwind_colors.html.erb @@ -1,9 +1,9 @@ -
co
-
co
-
co
-
co
-
co
-
co
+
co
+
co
+
co
+
co
+
co
+
co
co
co
co
diff --git a/compose.yaml b/compose.yaml index 5ee3deb..3862076 100644 --- a/compose.yaml +++ b/compose.yaml @@ -17,30 +17,30 @@ services: - TAILWIND_POLLING=true tty: true stdin_open: true - depends_on: - db: - condition: service_healthy - redis: - condition: service_started - db: - build: - context: . - dockerfile: Dockerfile.db - volumes: - - ./mssql-data:/var/opt/mssql - ports: - - "1434:1434" - healthcheck: - test: ["CMD", "/opt/mssql-tools/bin/sqlcmd", "-Usa", "-PBr1tt0nPassw0rd", "-Q", "select 1"] - interval: 10s - timeout: 3s - retries: 10 - start_period: 10s - redis: - image: redis - volumes: - - redis_data:/data + # depends_on: + # db: + # condition: service_healthy + # redis: + # condition: service_started + # db: + # build: + # context: . + # dockerfile: Dockerfile.db + # volumes: + # - ./mssql-data:/var/opt/mssql + # ports: + # - "1434:1434" + # healthcheck: + # test: ["CMD", "/opt/mssql-tools/bin/sqlcmd", "-Usa", "-PBr1tt0nPassw0rd", "-Q", "select 1"] + # interval: 10s + # timeout: 3s + # retries: 10 + # start_period: 10s + # redis: + # image: redis + # volumes: + # - redis_data:/data volumes: - redis_data: + # redis_data: bundle: diff --git a/config/database.yml b/config/database.yml index ab607a7..724021d 100644 --- a/config/database.yml +++ b/config/database.yml @@ -34,8 +34,8 @@ development: tds_version: 7.3 vhcs: <<: *default - # host: 10.41.82.72 #Prod - host: 10.41.82.73 #Dev + host: 10.41.82.72 #Prod + # host: 10.41.82.73 #Dev port: 1433 database: VHCS_HIPAA username: BSTI diff --git a/config/puma.rb b/config/puma.rb index 2620821..17feadd 100644 --- a/config/puma.rb +++ b/config/puma.rb @@ -29,7 +29,7 @@ port ENV.fetch("PORT", 3002) # Allow puma to be restarted by `bin/rails restart` command. plugin :tmp_restart -plugin :tailwindcss +# plugin :tailwindcss # Only use a pidfile when requested pidfile ENV["PIDFILE"] if ENV["PIDFILE"] diff --git a/config/routes.rb b/config/routes.rb index 2e5e28e..53cfe3e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -17,6 +17,8 @@ Rails.application.routes.draw do collection do get 'generate_sample' get 'generate_print' + get 'generate_mobile_display' + get 'generate_full_page' end end diff --git a/db/migrate/20260116181849_create_card_exceptions.rb b/db/migrate/20260116181849_create_card_exceptions.rb new file mode 100644 index 0000000..dcca654 --- /dev/null +++ b/db/migrate/20260116181849_create_card_exceptions.rb @@ -0,0 +1,11 @@ +class CreateCardExceptions < ActiveRecord::Migration[7.2] + def change + create_table :card_exceptions do |t| + t.string :type + t.string :value + t.belongs_to :employer, null: false, foreign_key: true + + t.timestamps + end + end +end diff --git a/db/migrate/20260116182836_create_card_exception_items.rb b/db/migrate/20260116182836_create_card_exception_items.rb new file mode 100644 index 0000000..b830c78 --- /dev/null +++ b/db/migrate/20260116182836_create_card_exception_items.rb @@ -0,0 +1,13 @@ +class CreateCardExceptionItems < ActiveRecord::Migration[7.2] + def change + create_table :card_exception_items do |t| + t.string :field_name + t.string :field_value + t.belongs_to :card_exception, null: false, foreign_key: true + t.belongs_to :card_logo_file, null: true, foreign_key: true + t.belongs_to :card_provider, null: true, foreign_key: true + + t.timestamps + end + end +end diff --git a/db/migrate/20260206202113_add_aspect_ratio_to_card_logo_files.rb b/db/migrate/20260206202113_add_aspect_ratio_to_card_logo_files.rb new file mode 100644 index 0000000..c40a647 --- /dev/null +++ b/db/migrate/20260206202113_add_aspect_ratio_to_card_logo_files.rb @@ -0,0 +1,5 @@ +class AddAspectRatioToCardLogoFiles < ActiveRecord::Migration[7.2] + def change + add_column :card_logo_files, :aspect_ratio, :float + end +end diff --git a/db/migrate/20260223223545_add_last_name_to_sample_id_card.rb b/db/migrate/20260223223545_add_last_name_to_sample_id_card.rb new file mode 100644 index 0000000..5659ade --- /dev/null +++ b/db/migrate/20260223223545_add_last_name_to_sample_id_card.rb @@ -0,0 +1,5 @@ +class AddLastNameToSampleIdCard < ActiveRecord::Migration[7.2] + def change + add_column :sample_id_cards, :name, :string + end +end diff --git a/db/migrate/20260227192437_rename_card_field_exceptions_to_card_exception_items.rb b/db/migrate/20260227192437_rename_card_field_exceptions_to_card_exception_items.rb new file mode 100644 index 0000000..5bee1e2 --- /dev/null +++ b/db/migrate/20260227192437_rename_card_field_exceptions_to_card_exception_items.rb @@ -0,0 +1,5 @@ +class RenameCardFieldExceptionsToCardExceptionItems < ActiveRecord::Migration[7.2] + def change + rename_table :card_field_exceptions, :card_exception_items + end +end diff --git a/db/migrate/20260227213305_add_title_to_card_providers.rb b/db/migrate/20260227213305_add_title_to_card_providers.rb new file mode 100644 index 0000000..0fcb52f --- /dev/null +++ b/db/migrate/20260227213305_add_title_to_card_providers.rb @@ -0,0 +1,5 @@ +class AddTitleToCardProviders < ActiveRecord::Migration[7.2] + def change + add_column :card_providers, :title, :string + end +end diff --git a/db/migrate/20251203143745_add_network_provider_to_employer_setup_processes.rb b/db/old/20251203143745_add_network_provider_to_employer_setup_processes.rb similarity index 100% rename from db/migrate/20251203143745_add_network_provider_to_employer_setup_processes.rb rename to db/old/20251203143745_add_network_provider_to_employer_setup_processes.rb diff --git a/db/migrate/20251204151226_add_network_logo_to_employer_setup_processes.rb b/db/old/20251204151226_add_network_logo_to_employer_setup_processes.rb similarity index 100% rename from db/migrate/20251204151226_add_network_logo_to_employer_setup_processes.rb rename to db/old/20251204151226_add_network_logo_to_employer_setup_processes.rb diff --git a/db/migrate/20251204151452_rename_logo_filename_on_employer_setup_processes.rb b/db/old/20251204151452_rename_logo_filename_on_employer_setup_processes.rb similarity index 100% rename from db/migrate/20251204151452_rename_logo_filename_on_employer_setup_processes.rb rename to db/old/20251204151452_rename_logo_filename_on_employer_setup_processes.rb diff --git a/db/migrate/20251205150421_add_pl_plan_key_to_employer_setup_processes.rb b/db/old/20251205150421_add_pl_plan_key_to_employer_setup_processes.rb similarity index 100% rename from db/migrate/20251205150421_add_pl_plan_key_to_employer_setup_processes.rb rename to db/old/20251205150421_add_pl_plan_key_to_employer_setup_processes.rb diff --git a/db/migrate/20251205215553_add_plan_id_to_plan.rb b/db/old/20251205215553_add_plan_id_to_plan.rb similarity index 100% rename from db/migrate/20251205215553_add_plan_id_to_plan.rb rename to db/old/20251205215553_add_plan_id_to_plan.rb diff --git a/db/migrate/20251209182135_add_employer_set_up_process_to_card_logo_files.rb b/db/old/20251209182135_add_employer_set_up_process_to_card_logo_files.rb similarity index 100% rename from db/migrate/20251209182135_add_employer_set_up_process_to_card_logo_files.rb rename to db/old/20251209182135_add_employer_set_up_process_to_card_logo_files.rb diff --git a/db/old/20251210202210_allow_null_es_pon_card_logo_files.rb b/db/old/20251210202210_allow_null_es_pon_card_logo_files.rb new file mode 100644 index 0000000..ac2d84a --- /dev/null +++ b/db/old/20251210202210_allow_null_es_pon_card_logo_files.rb @@ -0,0 +1,5 @@ +class AllowNullEsPonCardLogoFiles < ActiveRecord::Migration[7.2] + def change + change_column_null :card_logo_files, :employer_setup_process_id, true + end +end diff --git a/db/old/20251225054626_change_mb_member_key_to_string.rb b/db/old/20251225054626_change_mb_member_key_to_string.rb new file mode 100644 index 0000000..f7ffa4a --- /dev/null +++ b/db/old/20251225054626_change_mb_member_key_to_string.rb @@ -0,0 +1,5 @@ +class ChangeMbMemberKeyToString < ActiveRecord::Migration[7.2] + def change + change_column :sample_id_cards, :primary_mb_member_key, :string + end +end diff --git a/db/old/20260107143335_rename_employer_setup_process_to_employer.rb b/db/old/20260107143335_rename_employer_setup_process_to_employer.rb new file mode 100644 index 0000000..ce0c929 --- /dev/null +++ b/db/old/20260107143335_rename_employer_setup_process_to_employer.rb @@ -0,0 +1,5 @@ +class RenameEmployerSetupProcessToEmployer < ActiveRecord::Migration[7.2] + def change + rename_table :employer_setup_processes, :employers + end +end diff --git a/db/old/20260107143914_update_fields_on_employer.rb b/db/old/20260107143914_update_fields_on_employer.rb new file mode 100644 index 0000000..bd41540 --- /dev/null +++ b/db/old/20260107143914_update_fields_on_employer.rb @@ -0,0 +1,14 @@ +class UpdateFieldsOnEmployer < ActiveRecord::Migration[7.2] + def change + remove_column :employers, :form_method, :string + remove_column :employers, :status, :string + remove_column :employers, :current_step, :string + remove_column :employers, :applied_to_prod, :boolean + remove_column :employers, :applied_to_dev, :boolean + rename_column :employers, :employer_name, :name + rename_column :employers, :card_template, :single_card_template + add_column :employers, :multiple_card_template, :string + add_column :employers, :plan_id, :integer + add_column :employers, :active, :boolean, default: false + end +end diff --git a/db/old/20260107154720_update_belongs_to_key_for_employer.rb b/db/old/20260107154720_update_belongs_to_key_for_employer.rb new file mode 100644 index 0000000..d72795f --- /dev/null +++ b/db/old/20260107154720_update_belongs_to_key_for_employer.rb @@ -0,0 +1,7 @@ +class UpdateBelongsToKeyForEmployer < ActiveRecord::Migration[7.2] + def change + rename_column :alternate_network_logos, :employer_setup_process_id, :employer_id + rename_column :card_logo_files, :employer_setup_process_id, :employer_id + rename_column :plans, :employer_setup_process_id, :employer_id + end +end diff --git a/db/old/20260107173606_add_pb_entity_key_to_employer.rb b/db/old/20260107173606_add_pb_entity_key_to_employer.rb new file mode 100644 index 0000000..786c611 --- /dev/null +++ b/db/old/20260107173606_add_pb_entity_key_to_employer.rb @@ -0,0 +1,5 @@ +class AddPbEntityKeyToEmployer < ActiveRecord::Migration[7.2] + def change + add_column :employers, :company_pb_entity_key, :integer + end +end diff --git a/db/old/20260107181416_add_image_type_to_employer_images.rb b/db/old/20260107181416_add_image_type_to_employer_images.rb new file mode 100644 index 0000000..ffbf54e --- /dev/null +++ b/db/old/20260107181416_add_image_type_to_employer_images.rb @@ -0,0 +1,5 @@ +class AddImageTypeToEmployerImages < ActiveRecord::Migration[7.2] + def change + add_column :employer_images, :image_type, :string + end +end diff --git a/db/old/20260113150100_add_card_provider_to_employers.rb b/db/old/20260113150100_add_card_provider_to_employers.rb new file mode 100644 index 0000000..38328b9 --- /dev/null +++ b/db/old/20260113150100_add_card_provider_to_employers.rb @@ -0,0 +1,5 @@ +class AddCardProviderToEmployers < ActiveRecord::Migration[7.2] + def change + add_reference :employers, :card_provider, null: true, foreign_key: true + end +end diff --git a/db/old/20260113165019_add_provder_line_and_claim_to12_to_sample_id_cards.rb b/db/old/20260113165019_add_provder_line_and_claim_to12_to_sample_id_cards.rb new file mode 100644 index 0000000..239ab57 --- /dev/null +++ b/db/old/20260113165019_add_provder_line_and_claim_to12_to_sample_id_cards.rb @@ -0,0 +1,6 @@ +class AddProvderLineAndClaimTo12ToSampleIdCards < ActiveRecord::Migration[7.2] + def change + add_column :sample_id_cards, :provider_line_12, :string + add_column :sample_id_cards, :claim_to_12, :string + end +end diff --git a/db/old/20260114184154_add_id_card_fields_to_employer.rb b/db/old/20260114184154_add_id_card_fields_to_employer.rb new file mode 100644 index 0000000..c1a0304 --- /dev/null +++ b/db/old/20260114184154_add_id_card_fields_to_employer.rb @@ -0,0 +1,5 @@ +class AddIdCardFieldsToEmployer < ActiveRecord::Migration[7.2] + def change + add_column :employers, :id_card_display_name, :string + end +end diff --git a/db/old/20260114205055_add_plan_id_to_member.rb b/db/old/20260114205055_add_plan_id_to_member.rb new file mode 100644 index 0000000..222b6a9 --- /dev/null +++ b/db/old/20260114205055_add_plan_id_to_member.rb @@ -0,0 +1,5 @@ +class AddPlanIdToMember < ActiveRecord::Migration[7.2] + def change + add_reference :members, :plans, null: true, foreign_key: true + end +end diff --git a/db/schema.rb b/db/schema.rb index e6f7ba1..0e20515 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.2].define(version: 2026_01_14_183848) do +ActiveRecord::Schema[7.2].define(version: 2026_02_27_213305) do create_table "action_text_rich_texts", force: :cascade do |t| t.string "name", null: false t.text "body" @@ -59,6 +59,26 @@ ActiveRecord::Schema[7.2].define(version: 2026_01_14_183848) do t.index ["employer_id"], name: "index_alternate_network_logos_on_employer_id" end + create_table "card_exception_items", force: :cascade do |t| + t.string "field_name" + t.string "field_value" + t.bigint "card_logo_file_id" + t.bigint "card_provider_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["card_logo_file_id"], name: "index_card_exception_items_on_card_logo_file_id" + t.index ["card_provider_id"], name: "index_card_exception_items_on_card_provider_id" + end + + create_table "card_exceptions", force: :cascade do |t| + t.string "type" + t.string "value" + t.bigint "employer_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["employer_id"], name: "index_card_exceptions_on_employer_id" + end + create_table "card_logo_files", force: :cascade do |t| t.string "filename" t.binary "image_data" @@ -67,6 +87,7 @@ ActiveRecord::Schema[7.2].define(version: 2026_01_14_183848) do t.boolean "active", default: false t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.float "aspect_ratio" end create_table "card_providers", force: :cascade do |t| @@ -113,6 +134,7 @@ ActiveRecord::Schema[7.2].define(version: 2026_01_14_183848) do t.string "precert_6" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.string "title" end create_table "card_rxes", force: :cascade do |t| @@ -281,11 +303,15 @@ ActiveRecord::Schema[7.2].define(version: 2026_01_14_183848) do t.string "benefit_14" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.string "name" end add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id" add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id" add_foreign_key "alternate_network_logos", "employers" + add_foreign_key "card_exception_items", "card_logo_files" + add_foreign_key "card_exception_items", "card_providers" + add_foreign_key "card_exceptions", "employers" add_foreign_key "employer_card_logos", "card_logo_files" add_foreign_key "employer_card_logos", "employers" add_foreign_key "employers", "card_providers" diff --git a/db/seeds.rb b/db/seeds.rb index 5130bef..e8c50c8 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -83,30 +83,30 @@ def determine_network_logos(pl_plan_key) end end -benefit_descriptions = ["Primary Visit", - "Specialist Visit", - "Urgent Care", - "INN–Ind Ded", - "INN–Family Ded", - "OON–Ind Ded", - "OON–Family Ded", - "Co-Insurance", - "INN–Ind OOP", - "INN–Family OOP", - "OON–Ind OOP", - "OON–Family OOP", - "Emergency Room", - "Preventive Care"] +# benefit_descriptions = ["Primary Visit", +# "Specialist Visit", +# "Urgent Care", +# "INN–Ind Ded", +# "INN–Family Ded", +# "OON–Ind Ded", +# "OON–Family Ded", +# "Co-Insurance", +# "INN–Ind OOP", +# "INN–Family OOP", +# "OON–Ind OOP", +# "OON–Family OOP", +# "Emergency Room", +# "Preventive Care"] -default = IdCardBenefitsTemplate.create(title: "BLANK") -benefit_descriptions.each_with_index do |bene, i| - IdCardBenefit.create(sequence: i + 1, benefit_desc: bene, id_card_benefits_template: default) -end +# default = IdCardBenefitsTemplate.create(title: "BLANK") +# benefit_descriptions.each_with_index do |bene, i| +# IdCardBenefit.create(sequence: i + 1, benefit_desc: bene, id_card_benefits_template: default) +# end -temp_2 = IdCardBenefitsTemplate.create(title: "Jason's Template") -(1..14).each do |seq| - IdCardBenefit.create(sequence: seq, benefit: "#{seq} hit wonder", id_card_benefits_template: temp_2) -end +# temp_2 = IdCardBenefitsTemplate.create(title: "Jason's Template") +# (1..14).each do |seq| +# IdCardBenefit.create(sequence: seq, benefit: "#{seq} hit wonder", id_card_benefits_template: temp_2) +# end # temp_1 = IdCardBenefitsTemplate.create(title: "Rebekah's Template") # (1..14).each do |seq| @@ -130,7 +130,7 @@ end # Imports employers and members from VHCS -sql_query = "SELECT PLPlanKey, PlanId, ShortDesc FROM PLPlanHeader WHERE ActiveInactive = 'Active' AND PLPlanKey = 61" +sql_query = "SELECT PLPlanKey, PlanId, ShortDesc FROM PLPlanHeader WHERE ActiveInactive = 'Active' AND PLPlanKey = 65" plan_headers = VhcsRecord.connection.select_all(sql_query) plan_headers.each do |ph| @@ -202,57 +202,57 @@ plan_headers.each do |ph| end end -Vhcs::HlidCardProvider.all.each do |vhcs| - CardProvider.find_or_create_by(provider_code: vhcs.provider_code) do |cp| - cp.provider_line_1 = vhcs.provider_line_1 - cp.provider_line_2 = vhcs.provider_line_2 - cp.provider_line_3 = vhcs.provider_line_3 - cp.provider_line_4 = vhcs.provider_line_4 - cp.provider_line_5 = vhcs.provider_line_5 - cp.provider_line_6 = vhcs.provider_line_6 - cp.provider_line_7 = vhcs.provider_line_7 - cp.provider_line_8 = vhcs.provider_line_8 - cp.provider_line_9 = vhcs.provider_line_9 - cp.provider_line_10 = vhcs.provider_line_10 - cp.provider_line_11 = vhcs.provider_line_11 - cp.provider_line_12 = vhcs.provider_line_12 +# Vhcs::HlidCardProvider.all.each do |vhcs| +# CardProvider.find_or_create_by(provider_code: vhcs.provider_code) do |cp| +# cp.provider_line_1 = vhcs.provider_line_1 +# cp.provider_line_2 = vhcs.provider_line_2 +# cp.provider_line_3 = vhcs.provider_line_3 +# cp.provider_line_4 = vhcs.provider_line_4 +# cp.provider_line_5 = vhcs.provider_line_5 +# cp.provider_line_6 = vhcs.provider_line_6 +# cp.provider_line_7 = vhcs.provider_line_7 +# cp.provider_line_8 = vhcs.provider_line_8 +# cp.provider_line_9 = vhcs.provider_line_9 +# cp.provider_line_10 = vhcs.provider_line_10 +# cp.provider_line_11 = vhcs.provider_line_11 +# cp.provider_line_12 = vhcs.provider_line_12 - cp.claim_to_1 = vhcs.claim_to_1 - cp.claim_to_2 = vhcs.claim_to_2 - cp.claim_to_3 = vhcs.claim_to_3 - cp.claim_to_4 = vhcs.claim_to_4 - cp.claim_to_5 = vhcs.claim_to_5 - cp.claim_to_6 = vhcs.claim_to_6 - cp.claim_to_7 = vhcs.claim_to_7 - cp.claim_to_8 = vhcs.claim_to_8 - cp.claim_to_9 = vhcs.claim_to_9 - cp.claim_to_10 = vhcs.claim_to_10 - cp.claim_to_11 = vhcs.claim_to_11 - cp.claim_to_12 = vhcs.claim_to_12 +# cp.claim_to_1 = vhcs.claim_to_1 +# cp.claim_to_2 = vhcs.claim_to_2 +# cp.claim_to_3 = vhcs.claim_to_3 +# cp.claim_to_4 = vhcs.claim_to_4 +# cp.claim_to_5 = vhcs.claim_to_5 +# cp.claim_to_6 = vhcs.claim_to_6 +# cp.claim_to_7 = vhcs.claim_to_7 +# cp.claim_to_8 = vhcs.claim_to_8 +# cp.claim_to_9 = vhcs.claim_to_9 +# cp.claim_to_10 = vhcs.claim_to_10 +# cp.claim_to_11 = vhcs.claim_to_11 +# cp.claim_to_12 = vhcs.claim_to_12 - cp.mail_to = vhcs.mail_to - cp.mail_to_2 = vhcs.mail_to_2 +# cp.mail_to = vhcs.mail_to +# cp.mail_to_2 = vhcs.mail_to_2 - cp.contact_line_1 = vhcs.contact_line_1 - cp.contact_line_2 = vhcs.contact_line_2 - cp.contact_line_3 = vhcs.contact_line_3 +# cp.contact_line_1 = vhcs.contact_line_1 +# cp.contact_line_2 = vhcs.contact_line_2 +# cp.contact_line_3 = vhcs.contact_line_3 - cp.group_number = vhcs.group_number - cp.rx_group_id = vhcs.rx_group_id - cp.rx_contact = vhcs.rx_contact +# cp.group_number = vhcs.group_number +# cp.rx_group_id = vhcs.rx_group_id +# cp.rx_contact = vhcs.rx_contact - cp.provider_lookup_1 = vhcs.provider_lookup_1 - cp.provider_lookup_2 = vhcs.provider_lookup_2 +# cp.provider_lookup_1 = vhcs.provider_lookup_1 +# cp.provider_lookup_2 = vhcs.provider_lookup_2 - cp.precert_1 = vhcs.precert_1 - cp.precert_2 = vhcs.precert_2 - cp.precert_3 = vhcs.precert_3 - cp.precert_4 = vhcs.precert_4 - cp.precert_5 = vhcs.precert_5 - cp.precert_6 = vhcs.precert_6 +# cp.precert_1 = vhcs.precert_1 +# cp.precert_2 = vhcs.precert_2 +# cp.precert_3 = vhcs.precert_3 +# cp.precert_4 = vhcs.precert_4 +# cp.precert_5 = vhcs.precert_5 +# cp.precert_6 = vhcs.precert_6 - end -end +# end +# end Vhcs::HlrxCrosRef.all.each do |vhcs| rx = CardRx.find_or_create_by(help_desk: vhcs.help_desk, customer_service: vhcs.customer_service, web_url: vhcs.web_url) diff --git a/development3.Dockerfile b/development3.Dockerfile index f338595..0d7468b 100644 --- a/development3.Dockerfile +++ b/development3.Dockerfile @@ -1,6 +1,6 @@ # ----- Build Stage ----- # Using a specific Ruby version (e.g., 3.3) for stability -ARG RUBY_VERSION=3.3.9 +ARG RUBY_VERSION=3.4.8 FROM docker.io/library/ruby:$RUBY_VERSION-slim as base # Install production system dependencies diff --git a/lib/tasks/employer.rake b/lib/tasks/employer.rake new file mode 100644 index 0000000..665d4fc --- /dev/null +++ b/lib/tasks/employer.rake @@ -0,0 +1,83 @@ +namespace :employer do + + desc "TODO" + # rake employer:vhcs_sync_all + task vhcs_sync_all: :environment do + sql_query = "SELECT PLPlanKey, PlanId, ShortDesc FROM PLPlanHeader WHERE ActiveInactive = 'Active' AND PLPlanKey = 65" + plan_headers = VhcsRecord.connection.select_all(sql_query) + + plan_headers.each do |ph| + import_employer = Employer.find_or_create_by!(pl_plan_key: ph['PLPlanKey']) do |em| + puts "Importing #{ph['ShortDesc'].strip}" + em.name = ph['ShortDesc'].strip + em.plan_id = ph['PlanId'].strip.to_i + + + id_card_templates = determine_id_card_templates(em.pl_plan_key) + em.single_card_template = id_card_templates[:single_card_template] + em.multiple_card_template = id_card_templates[:multiple_card_template] + + plan_code = Vhcs::HlPlanCode.find_by(plan_key: em.pl_plan_key) + em.group_number = plan_code.group_number + em.rx_group_number = plan_code.medical_number + em.effective_date = plan_code.effect_date.strftime("%m/%d/%Y") + + pb_company_plan = Vhcs::PbCompanyPlans.find_by(pl_plan_key: em.pl_plan_key) + em.company_pb_entity_key = pb_company_plan.company_pb_entity_key + + card_display_name = Vhcs::PbEntity.find_by(company_pb_entity_key: em.company_pb_entity_key).last_name + em.id_card_display_name = em.employer_trim_name(card_display_name) + + em.default_network_logo = determine_network_logos(em.pl_plan_key) + end + + vhcs_plans = Vhcs::PbProduct.where(company_pb_entity_key: import_employer.company_pb_entity_key) + vhcs_plans.each do |vp| + puts "~~ Importing #{vp.short_description}" + import_plan = import_employer.plans.find_or_create_by!(pb_product_key: vp.pb_product_key) do |pl| + pl.title = vp.short_description + end + vhcs_plan_benefits = Vhcs::HlEgglestonCardBenefit.where(plan_id: import_plan.pb_product_key) + vhcs_plan_benefits.each do |vb| + import_plan.plan_benefits.find_or_create_by!(benefit_desc: vb.benefit_desc) do |pb| + pb.sequence = vb.sequence + pb.benefit = vb.benefit + end + end + end + end + end + + + + desc "TODO" + # rake employer:import_members_from_vhcs[67] + task :import_members_from_vhcs, [:pl_plan_key] => :environment do |t, args| + pl_plan_key = args[:pl_plan_key] + employer = Employer.find_by(pl_plan_key: pl_plan_key) + + vw_mb_members = Vhcs::VwmbMember.where(enrollee_type_value_id: 1, pl_plan_key: pl_plan_key).select(:mb_member_key, :pb_entity_key, :pl_plan_key, :family_id, :full_name_last_name_first) + vw_mb_members_count = vw_mb_members.length + + vw_mb_members.each_with_index do |vwm, i| + Member.find_or_create_by!(mb_member_key: vwm.mb_member_key) do |me| + me.name = vwm.full_name_last_name_first.titleize + me.pb_entity_key = vwm.pb_entity_key + me.family_id = vwm.family_id + me.pl_plan_key = vwm.pl_plan_key + me.employer = employer + + card_display_name = Vhcs::PbEntity.find_by(pb_entity_key: me.pb_entity_key).full_name + me.id_card_display_name = card_display_name + + plan_pb_product_key = Vhcs::PbProduct.joins('INNER JOIN "PBProductAvailability" ON "PBProductAvailability"."PBProductKey" = "PBProduct"."PBProductKey" INNER JOIN "PBProductParticipation" ON "PBProductParticipation"."PBProductAvailabilityKey" = "PBProductAvailability"."PBProductAvailabilityKey" INNER JOIN "PBCoveredEntities" ON "PBProductParticipation"."PBProductParticipationKey" = "PBCoveredEntities"."PBProductParticipationKey"').where('"PBCoveredEntities"."PBEntityKey" = ?', me.pb_entity_key).first.pb_product_key + if plan = Plan.find_by(pb_product_key: plan_pb_product_key) + me.plan = plan + end + end + puts "Employer #{employer.name} (#{i}/#{vw_mb_members_count}) members imported" + end + + end + +end diff --git a/lib/tasks/member.rake b/lib/tasks/member.rake new file mode 100644 index 0000000..a3e2408 --- /dev/null +++ b/lib/tasks/member.rake @@ -0,0 +1,26 @@ +namespace :member do + desc "TODO" + # rake member:import_from_vhcs[123456,1] + task :import_from_vhcs, [:mb_member_key, :employer_id] => :environment do |t, args| + mb_member_key = args[:mb_member_key] + employer_id = args[:employer_id] + + Member.find_or_create_by!(mb_member_key: mb_member_key) do |me| + me.name = vwm.full_name_last_name_first.titleize + me.pb_entity_key = vwm.pb_entity_key + me.family_id = vwm.family_id + me.pl_plan_key = vwm.pl_plan_key + me.employer_id = employer_id + + card_display_name = Vhcs::PbEntity.find_by(pb_entity_key: me.pb_entity_key).full_name + me.id_card_display_name = card_display_name + + plan_pb_product_key = Vhcs::PbProduct.joins('INNER JOIN "PBProductAvailability" ON "PBProductAvailability"."PBProductKey" = "PBProduct"."PBProductKey" INNER JOIN "PBProductParticipation" ON "PBProductParticipation"."PBProductAvailabilityKey" = "PBProductAvailability"."PBProductAvailabilityKey" INNER JOIN "PBCoveredEntities" ON "PBProductParticipation"."PBProductParticipationKey" = "PBCoveredEntities"."PBProductParticipationKey"').where('"PBCoveredEntities"."PBEntityKey" = ?', me.pb_entity_key).first.pb_product_key + if plan = Plan.find_by(pb_product_key: plan_pb_product_key) + me.plan = plan + end + end + + end + +end diff --git a/web.config b/web.config new file mode 100644 index 0000000..17b45af --- /dev/null +++ b/web.config @@ -0,0 +1,19 @@ + + + + + + + + + + + + + From ea07afb75170d52df2380d79e00bb56b882b5c30 Mon Sep 17 00:00:00 2001 From: Jason Jordan Date: Tue, 3 Mar 2026 22:55:58 -0500 Subject: [PATCH 02/25] gitignore update --- .gitignore | 1 + app/assets/tailwind/application.css | 2 ++ 2 files changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 1097e8c..6d20035 100644 --- a/.gitignore +++ b/.gitignore @@ -74,6 +74,7 @@ yarn-debug.log* .DS_Store /app/assets/builds/* +/app/assets/svg/* !/app/assets/builds/.keep /mssql-data \ No newline at end of file diff --git a/app/assets/tailwind/application.css b/app/assets/tailwind/application.css index f2e87b0..87fa021 100644 --- a/app/assets/tailwind/application.css +++ b/app/assets/tailwind/application.css @@ -35,4 +35,6 @@ --color-verdigris-tinted: #496A6F; /* alert red */ --color-brightlava: #f80800; + /* alert green */ + --color-limegreen: #32CD32; } From b5a1517330d62c092e498ed58581bece0fc87c26 Mon Sep 17 00:00:00 2001 From: Jason Jordan Date: Thu, 5 Mar 2026 11:30:24 -0500 Subject: [PATCH 03/25] Halfway through table redesign, saving to revert to working version --- app/controllers/employers_controller.rb | 25 +- .../id_card/employer_logos_controller.rb | 56 +++ app/controllers/id_card/setup_controller.rb | 236 ++++++++++++ .../id_card_employer_logos_controller.rb | 57 +++ app/helpers/card_providers_helper.rb | 2 + app/helpers/card_rxes_helper.rb | 2 + .../controllers/logo_upload_controller.js | 33 +- app/models/card_exception.rb | 10 - app/models/card_provider.rb | 3 - app/models/card_rx.rb | 3 - app/models/employer.rb | 102 ++--- app/models/id_card.rb | 5 + app/models/id_card/employer_logo.rb | 14 + app/models/id_card/exception.rb | 10 + .../exception_item.rb} | 8 +- app/models/id_card/network_logo.rb | 11 + app/models/id_card/plan.rb | 33 ++ app/models/id_card/plan_benefit.rb | 3 + .../print_data.rb} | 2 +- app/models/id_card/provider_section.rb | 3 + app/models/id_card/rx_section.rb | 3 + app/models/id_card/setup.rb | 27 ++ .../{ => old}/alternate_network_logo.rb | 0 app/models/{ => old}/card_logo_file.rb | 0 app/models/{ => old}/employer_card_logo.rb | 0 .../{ => old}/employer_setup_process.rb | 0 app/models/{ => old}/id_card_benefit.rb | 0 .../{ => old}/id_card_benefits_template.rb | 0 app/models/plan.rb | 18 - app/models/plan_benefit.rb | 3 - app/views/employers/edit.html.erb | 99 +---- app/views/employers/new.html.erb | 100 +---- app/views/employers/show.html.erb | 34 +- .../_alt_network_logo_fields.html.erb | 0 .../_alt_network_logo_fields_new.html.erb | 0 .../_first_plan_fields.html.erb | 0 .../_plan_benefit_only_fields.erb | 0 .../_plan_benefits_desc_fields.html.erb | 0 .../_plan_benefits_fields.html.erb | 0 .../_plan_fields.html.erb | 0 app/views/employers_old/edit.html.erb | 127 ++++++ .../general_information.html.erb | 0 app/views/employers_old/index.html.erb | 33 ++ .../network_exceptions.html.erb | 0 app/views/employers_old/new.html.erb | 136 +++++++ .../new_new.html.erb | 0 .../plans.html.erb | 0 app/views/employers_old/show.html.erb | 62 +++ .../summary.html.erb | 0 app/views/id_cards/setup/edit.html.erb | 34 ++ app/views/id_cards/setup/new.html.erb | 48 +++ compose.yaml | 34 +- config/database.yml | 20 +- config/routes.rb | 35 +- ...te_active_storage_tables.active_storage.rb | 57 --- ...3_create_action_text_tables.action_text.rb | 26 -- ..._to_active_storage_blobs.active_storage.rb | 22 -- ..._storage_variant_records.active_storage.rb | 27 -- ...e_storage_blobs_checksum.active_storage.rb | 8 - ...71719_create_id_card_benefits_templates.rb | 9 - .../20251104171752_create_id_card_benefits.rb | 12 - db/migrate/20251202140122_create_employers.rb | 10 - db/migrate/20251202142443_create_plans.rb | 11 - .../20251202142512_create_plan_benefits.rb | 12 - ...44134_create_id_card_provider_sections.rb} | 5 +- ...51202152220_create_id_card_rx_sections.rb} | 4 +- ...203091559_create_id_card_network_logos.rb} | 6 +- ...203145750_create_id_card_employer_logos.rb | 13 + .../20251204041154_create_id_card_setups.rb | 18 + .../20251204142443_create_id_card_plans.rb | 12 + ...1204142512_create_id_card_plan_benefits.rb | 12 + .../20251205091559_create_network_logos.rb | 12 - ...251206190810_create_id_card_print_data.rb} | 6 +- ...260107180344_create_employer_card_logos.rb | 11 - ...20260113152431_add_card_rx_to_employers.rb | 6 - db/migrate/20260114183848_create_members.rb | 2 +- .../20260116181849_create_card_exceptions.rb | 11 - ...0260116181849_create_id_card_exceptions.rb | 11 + ...60116182836_create_card_exception_items.rb | 13 - ...16182836_create_id_card_exception_items.rb | 13 + ...113_add_aspect_ratio_to_card_logo_files.rb | 5 - ...3223545_add_last_name_to_sample_id_card.rb | 5 - ...ield_exceptions_to_card_exception_items.rb | 5 - ...60227213305_add_title_to_card_providers.rb | 5 - db/schema.rb | 364 ++++++++---------- init.sql | 6 +- 86 files changed, 1286 insertions(+), 884 deletions(-) create mode 100644 app/controllers/id_card/employer_logos_controller.rb create mode 100644 app/controllers/id_card/setup_controller.rb create mode 100644 app/controllers/id_card_employer_logos_controller.rb create mode 100644 app/helpers/card_providers_helper.rb create mode 100644 app/helpers/card_rxes_helper.rb delete mode 100644 app/models/card_exception.rb delete mode 100644 app/models/card_provider.rb delete mode 100644 app/models/card_rx.rb create mode 100644 app/models/id_card.rb create mode 100644 app/models/id_card/employer_logo.rb create mode 100644 app/models/id_card/exception.rb rename app/models/{card_exception_item.rb => id_card/exception_item.rb} (77%) create mode 100644 app/models/id_card/network_logo.rb create mode 100644 app/models/id_card/plan.rb create mode 100644 app/models/id_card/plan_benefit.rb rename app/models/{sample_id_card.rb => id_card/print_data.rb} (94%) create mode 100644 app/models/id_card/provider_section.rb create mode 100644 app/models/id_card/rx_section.rb create mode 100644 app/models/id_card/setup.rb rename app/models/{ => old}/alternate_network_logo.rb (100%) rename app/models/{ => old}/card_logo_file.rb (100%) rename app/models/{ => old}/employer_card_logo.rb (100%) rename app/models/{ => old}/employer_setup_process.rb (100%) rename app/models/{ => old}/id_card_benefit.rb (100%) rename app/models/{ => old}/id_card_benefits_template.rb (100%) delete mode 100644 app/models/plan.rb delete mode 100644 app/models/plan_benefit.rb rename app/views/{employers => employers_old}/_alt_network_logo_fields.html.erb (100%) rename app/views/{employers => employers_old}/_alt_network_logo_fields_new.html.erb (100%) rename app/views/{employers => employers_old}/_first_plan_fields.html.erb (100%) rename app/views/{employers => employers_old}/_plan_benefit_only_fields.erb (100%) rename app/views/{employers => employers_old}/_plan_benefits_desc_fields.html.erb (100%) rename app/views/{employers => employers_old}/_plan_benefits_fields.html.erb (100%) rename app/views/{employers => employers_old}/_plan_fields.html.erb (100%) create mode 100644 app/views/employers_old/edit.html.erb rename app/views/{employers => employers_old}/general_information.html.erb (100%) create mode 100644 app/views/employers_old/index.html.erb rename app/views/{employers => employers_old}/network_exceptions.html.erb (100%) create mode 100644 app/views/employers_old/new.html.erb rename app/views/{employers => employers_old}/new_new.html.erb (100%) rename app/views/{employers => employers_old}/plans.html.erb (100%) create mode 100644 app/views/employers_old/show.html.erb rename app/views/{employers => employers_old}/summary.html.erb (100%) create mode 100644 app/views/id_cards/setup/edit.html.erb create mode 100644 app/views/id_cards/setup/new.html.erb delete mode 100644 db/migrate/20211216184102_create_active_storage_tables.active_storage.rb delete mode 100644 db/migrate/20211216184103_create_action_text_tables.action_text.rb delete mode 100644 db/migrate/20230326154217_add_service_name_to_active_storage_blobs.active_storage.rb delete mode 100644 db/migrate/20230326154218_create_active_storage_variant_records.active_storage.rb delete mode 100644 db/migrate/20230326154219_remove_not_null_on_active_storage_blobs_checksum.active_storage.rb delete mode 100644 db/migrate/20251104171719_create_id_card_benefits_templates.rb delete mode 100644 db/migrate/20251104171752_create_id_card_benefits.rb delete mode 100644 db/migrate/20251202142443_create_plans.rb delete mode 100644 db/migrate/20251202142512_create_plan_benefits.rb rename db/migrate/{20260113144134_create_card_providers.rb => 20251202144134_create_id_card_provider_sections.rb} (89%) rename db/migrate/{20260113152220_create_card_rxes.rb => 20251202152220_create_id_card_rx_sections.rb} (56%) rename db/migrate/{20251205145750_create_card_logo_files.rb => 20251203091559_create_id_card_network_logos.rb} (55%) create mode 100644 db/migrate/20251203145750_create_id_card_employer_logos.rb create mode 100644 db/migrate/20251204041154_create_id_card_setups.rb create mode 100644 db/migrate/20251204142443_create_id_card_plans.rb create mode 100644 db/migrate/20251204142512_create_id_card_plan_benefits.rb delete mode 100644 db/migrate/20251205091559_create_network_logos.rb rename db/migrate/{20251206190810_create_sample_id_cards.rb => 20251206190810_create_id_card_print_data.rb} (92%) delete mode 100644 db/migrate/20260107180344_create_employer_card_logos.rb delete mode 100644 db/migrate/20260113152431_add_card_rx_to_employers.rb delete mode 100644 db/migrate/20260116181849_create_card_exceptions.rb create mode 100644 db/migrate/20260116181849_create_id_card_exceptions.rb delete mode 100644 db/migrate/20260116182836_create_card_exception_items.rb create mode 100644 db/migrate/20260116182836_create_id_card_exception_items.rb delete mode 100644 db/migrate/20260206202113_add_aspect_ratio_to_card_logo_files.rb delete mode 100644 db/migrate/20260223223545_add_last_name_to_sample_id_card.rb delete mode 100644 db/migrate/20260227192437_rename_card_field_exceptions_to_card_exception_items.rb delete mode 100644 db/migrate/20260227213305_add_title_to_card_providers.rb diff --git a/app/controllers/employers_controller.rb b/app/controllers/employers_controller.rb index 4a67fae..d070121 100644 --- a/app/controllers/employers_controller.rb +++ b/app/controllers/employers_controller.rb @@ -9,23 +9,31 @@ class EmployersController < ApplicationController def new @employer = Employer.new - @employer.build_plan_with_default_benefits - @plan_templates = IdCardBenefitsTemplate.where.not(title: "BLANK") - render :new_new + render :new end def import word_doc = params[:employer][:import_from_word] - @plan_templates = IdCardBenefitsTemplate.where.not(title: "BLANK") if word_doc.present? && word_doc.is_a?(ActionDispatch::Http::UploadedFile) @employer = BenefitsWordDocProcessor.new(word_doc.tempfile).call else @employer = Employer.new - @employer.build_plan_with_default_benefits end - render :new_new + render :new end + # def import_old + # word_doc = params[:employer][:import_from_word] + # @plan_templates = IdCardBenefitsTemplate.where.not(title: "BLANK") + # if word_doc.present? && word_doc.is_a?(ActionDispatch::Http::UploadedFile) + # @employer = BenefitsWordDocProcessor.new(word_doc.tempfile).call + # else + # @employer = Employer.new + # @employer.build_plan_with_default_benefits + # end + # render :new + # end + def create employer_params = Employer.permitted_params(params) puts "---Params---" @@ -36,16 +44,13 @@ class EmployersController < ApplicationController # update_logos_with_employer_setup_information() redirect_to employer_path(@employer.slug), notice: 'Employer Saved' else - @plan_templates = IdCardBenefitsTemplate.where.not(title: "BLANK") - render :new_new + render :new end end def edit @employer = Employer.find_by(slug: params[:id]) - @plan_templates = IdCardBenefitsTemplate.where.not(title: "BLANK") render :edit - # @resource = Resource.find(params[:id]) end def update diff --git a/app/controllers/id_card/employer_logos_controller.rb b/app/controllers/id_card/employer_logos_controller.rb new file mode 100644 index 0000000..18d8f6f --- /dev/null +++ b/app/controllers/id_card/employer_logos_controller.rb @@ -0,0 +1,56 @@ +class IdCard::EmployerLogosController < ApplicationController + + def index + end + + def show + end + + def image + logo_file = IdCard::EmployerLogo.find(params[:id]) + puts params[:id] + logo_binary = logo_file.image_data + logo_filename = logo_file.filename + + send_data logo_binary, + filename: logo_filename, + disposition: 'inline' + end + + def new + end + + def create + file = card_logo_file_params["logo_file"] + if file.present? && file.is_a?(ActionDispatch::Http::UploadedFile) + filename = file.original_filename + # binary_data = file.read + binary_data = File.binread(file) + meme_type = Marcel::MimeType.for(file) + + employerlogo = IdCard::EmployerLogo.create( + filename: filename, + image_data: binary_data, + content_type: meme_type + ) + + render json: employerlogo, only: [:id], status: :ok + end + end + + def edit + end + + def update + end + + def destroy + end + + private + + def card_logo_file_params + params.require(:card_logo_file).permit(:logo_file, :logo_type) + end + +end \ No newline at end of file diff --git a/app/controllers/id_card/setup_controller.rb b/app/controllers/id_card/setup_controller.rb new file mode 100644 index 0000000..906b554 --- /dev/null +++ b/app/controllers/id_card/setup_controller.rb @@ -0,0 +1,236 @@ +class IdCard::SetupController < ApplicationController + + def new + @employer = Employer.find_by(slug: params[:id]) + @setup = @employer.id_card_setup.new + render :new + end + + def create + employer_params = Employer.permitted_params(params) + puts "---Params---" + puts employer_params + # post_image_processing_params = process_logos(employer_setup_process_params) + @employer = Employer.new(employer_params) + if @employer.save + # update_logos_with_employer_setup_information() + redirect_to employer_path(@employer.slug), notice: 'Employer Saved' + else + render :new + end + end + + def edit + @employer = Employer.find_by(slug: params[:id]) + render :edit + end + + def update + puts "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + employer_params = Employer.permitted_params(params) + @employer = Employer.find(params[:id]) + + if @employer.update(employer_params) + puts "sucess" + redirect_to employer_path(@employer.slug), notice: 'Employer was successfully updated.' + else + puts "fail" + render :edit, status: :unprocessable_entity + end + + end + + def destroy + # @resource = Resource.find(params[:id]) + # @resource.destroy + # redirect_to resources_url, notice: 'Resource was successfully destroyed.' + end + + private + + # def process_logos(employer_setup_process_params) + # @uploaded_logos = [] + # employer_logo = employer_setup_process_params["employer_logo"] + # if employer_logo.present? && employer_logo.is_a?(ActionDispatch::Http::UploadedFile) + # filename = employer_logo.original_filename + # binary_data = employer_logo.read + # meme_type = Marcel::MimeType.for(employer_logo) + + # CardLogoFile.create( + # filename: filename, + # image_data: binary_data, + # content_type: meme_type, + # logo_type: "employer" + # ) + + # @uploaded_logos.push(filename) + # employer_setup_process_params["employer_logo"] = filename + # end + + # network_logos = employer_setup_process_params["alternate_network_logos_attributes"] + # if network_logos.present? + # network_logos.each do |alt| + + # network_logo = alt.last["network_logo"] + # if network_logo.present? && network_logo.is_a?(ActionDispatch::Http::UploadedFile) + # filename = network_logo.original_filename + # binary_data = network_logo.read + # meme_type = Marcel::MimeType.for(network_logo) + + # CardLogoFile.create( + # filename: filename, + # image_data: binary_data, + # content_type: meme_type, + # logo_type: "network" + # ) + + # @uploaded_logos.push(filename) + # end + # alt.last["network_logo"] = @uploaded_logos.last + # end + # end + # employer_setup_process_params + # end + + # def update_logos_with_employer_setup_information() + # @uploaded_logos.each do |logo| + # logo_file = CardLogoFile.find_by(filename: logo) + # if logo_file.present? && @employer.present? + # logo_file.employer_setup_process = @employer + # logo_file.save + # end + # end + + # end + + # def general_information_params + # params.require(:employer_setup_general_information_form).permit( + # :name, + # :employer_logo, + # :group_number, + # :dental, + # :pl_plan_key, + # :effect_date, + # :number_of_plans, + # :network, + # :number_of_additional_network_logos + # ) + # end + + # def plans_params + # params.require(:employer_setup_plans_form).permit( + # plans: permited_plans_keys, + # benefit_descs: benefit_sequence_keys + # ) + # end + + # def network_exceptions_params + # params.require(:employer_setup_network_exceptions_form).permit( + # network_exceptions: [:network_logo, exceptions: [:type, :value]], + # ) + # end + + # def form_for_step + # step_name = @top_form.current_step + # form_method = "EmployerSetup#{step_name.camelize}Form".constantize + # # puts "/////\\\\\\||||||" + # # puts session[:employer_setup_data] + # # puts session[:employer_setup_data]['employer_setup_process_id'] + # puts form_method + # form_method.new(session[:employer_setup_data]['employer_setup_process_id']) + # end + + # def process_step(step_name) + # @form_method = "EmployerSetup#{step_name.camelize}Form".constantize + # session_data_name = "#{step_name}_data" + # # puts "1--------------params----" + # # puts params + # # puts "8--------------session----" + # # puts session[:employer_setup_data] + # employer_setup_process_id = session[:employer_setup_data]['employer_setup_process_id'] + # # puts session[:employer_setup_data] + # puts "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + # puts params + # @form = @form_method.new(employer_setup_process_id, params) + # if @form.pl_plan_key.blank? + # @form.pl_plan_key = session[:employer_setup_data]['pl_plan_key'] + # end + # if @form.valid? && @form.save + # pl_plan_key = @top_form.pl_plan_key || @form.pl_plan_key + # # session[:employer_setup_data].merge!({current_step: step_name, pl_plan_key: pl_plan_key}) + # # form_fields = @form.attributes.merge!(global_params(step_name)) + # # session[:employer_setup_data][session_data_name] = form_fields + # # session[:employer_setup_data].merge!(global_params(step_name)) + # # puts session[:employer_setup_data][session_data_name] + # true + # else + # false + # end + # end + + # def step_params(step_name) + # form_name_sym = "employer_setup_#{step_name}_form".to_sym + # params.require(form_name_sym).permit(@form_method.permitted_params) + # end + + # def global_params(step_name) + # form_name_sym = "employer_setup_#{step_name}_form".to_sym + # params.require(form_name_sym).permit(EmployerSetupForm.permitted_params) + # end + + # def process_step(step_name) + # form_name = "employer_setup_#{step_name}_form".camelize.constantize + # form_params_name = "#{step_name}_params".to_sym + # allowed_params = [:general_information_params, :plans_params, :network_exceptions_params] + # if allowed_params.include?(form_params_name) + # form_params = send(form_params_name) + # @form = form_name.new(form_params) + # if @form.valid? + # session[:employer_setup_data]["#{step_name}_data"] = form_params + # true + # else + # false + # end + # end + # false + # end + + # def employer_setup_params + # params.require(:employer_setup_form).permit( + # :current_step, + # :name, + # :employer_logo, + # :group_number, + # :pl_plan_key, + # :effect_date, + # :number_of_plans, + # :network, + # :number_of_additional_network_logos, + # network_exceptions: [:network_logo, exceptions: [:type, :value]], + # plans: permited_plans_keys, + # benefit_descs: benefit_sequence_keys + # ) + # end + + # def benefit_sequence_keys + # (1..14).map { |i| i.to_s.to_sym } + # end + + # def permited_plans_keys + # benefit_sequence_keys.push(:plan_id) + # end + + # def plans_params + # plans_keys = params[:plans]&.keys || [] + + # plans_keys.each_with_object({}) do |key, hash| + # if key == 'benefit_descs' || key.match?(/^plan_\d$/) + # hash[key.to_sym] = permited_plan_param_list + # end + # end + # end + + # def permited_plan_param_list + # (1..14).map { |i| i.to_s.to_sym }.push(:plan_id) + # end +end diff --git a/app/controllers/id_card_employer_logos_controller.rb b/app/controllers/id_card_employer_logos_controller.rb new file mode 100644 index 0000000..c4cc5d3 --- /dev/null +++ b/app/controllers/id_card_employer_logos_controller.rb @@ -0,0 +1,57 @@ +class IdCardEmployerLogoController < ApplicationController + + def index + end + + def show + end + + def image + logo_file = IdCard::EmployerLogo.find_by(filename: params[:id]) + puts params[:id] + if logo_file + logo_binary = logo_file.image_data + logo_filename = logo_file.filename + + send_data logo_binary, + filename: logo_filename, + disposition: 'inline' + end + end + + def new + end + + def create + file = card_logo_file_params["logo_file"] + if file.present? && file.is_a?(ActionDispatch::Http::UploadedFile) + filename = file.original_filename + # binary_data = file.read + binary_data = File.binread(file) + meme_type = Marcel::MimeType.for(file) + + CardLogoFile.create( + filename: filename, + image_data: binary_data, + content_type: meme_type, + logo_type: card_logo_file_params["logo_type"] + ) + end + end + + def edit + end + + def update + end + + def destroy + end + + private + + def card_logo_file_params + params.require(:card_logo_file).permit(:logo_file, :logo_type) + end + +end \ No newline at end of file diff --git a/app/helpers/card_providers_helper.rb b/app/helpers/card_providers_helper.rb new file mode 100644 index 0000000..d50854e --- /dev/null +++ b/app/helpers/card_providers_helper.rb @@ -0,0 +1,2 @@ +module CardProvidersHelper +end diff --git a/app/helpers/card_rxes_helper.rb b/app/helpers/card_rxes_helper.rb new file mode 100644 index 0000000..6188961 --- /dev/null +++ b/app/helpers/card_rxes_helper.rb @@ -0,0 +1,2 @@ +module CardRxesHelper +end diff --git a/app/javascript/controllers/logo_upload_controller.js b/app/javascript/controllers/logo_upload_controller.js index ce0bd5a..052810b 100644 --- a/app/javascript/controllers/logo_upload_controller.js +++ b/app/javascript/controllers/logo_upload_controller.js @@ -1,13 +1,18 @@ import { Controller } from "@hotwired/stimulus"; export default class extends Controller { + static values = { + logoType: String, + employerName: String + } static targets = ["preview", "previewContainer", "logoSelect", "logofield", "initialLogoFile"]; async connect() { console.log('in connect'); - console.log(this.logofieldTarget.value) - if (this.logofieldTarget.value.includes("Logo.")) { - const response = await fetch(`/card_logo_files/${this.logofieldTarget.value}/image`); // Fetch the binary data + const initValue = this.logofieldTarget.value + console.log(initValue) + if (initValue) { + const response = await fetch(`/id_card/${this.logoTypeValue}_logos/${initValue}/image`); // Fetch the binary data const blob = await response.blob(); const objectUrl = URL.createObjectURL(blob); this.previewTarget.src = objectUrl; @@ -23,7 +28,7 @@ export default class extends Controller { const file = event.target.files[0]; if (!file) return; - const logoType = event.params.type + const logoType = this.logoTypeValue let newFileName = file.name if (logoType == "network") { @@ -32,14 +37,15 @@ export default class extends Controller { this.addOptionToSelect(newFileName) } else if (logoType == "employer") { newFileName = this.determineEmployerFilename(file) - this.logofieldTarget.value = newFileName; + file.name = newFileName } - + this.previewFile(file); - - // this.uploadLogoToServer(file); - - + this.uploadLogoToServer(file); + + + + this.logofieldTarget.value = newFileName; } previewFile(file) { @@ -55,13 +61,12 @@ export default class extends Controller { async uploadLogoToServer(file) { console.log('in uploadLogoToServer'); const formData = new FormData(); - formData.append("card_logo_file[logo_file]", file); - formData.append("card_logo_file[logo_type]", "employer"); + formData.append(`id_card_${this.logoTypeValue}_logo[logo_file]`, file); const csrfToken = document.querySelector("meta[name='csrf-token']").content; try { - const response = await fetch("/card_logo_files/", { + const response = await fetch(`/id_card/${this.logoTypeValue}_logos/`, { method: "POST", headers: { "X-CSRF-Token": csrfToken @@ -103,7 +108,7 @@ export default class extends Controller { determineEmployerFilename(file) { const fileExtension = file.name.split('.').pop(); - const employerName = prompt("Enter the name for the new Employer (minus any 'The's, 'LLC', or 'Health Plan'):"); + const employerName = this.employerNameValue const logoFilename = this.titleizeText(employerName).concat("Logo.").concat(fileExtension).replaceAll(' ', ''); return logoFilename diff --git a/app/models/card_exception.rb b/app/models/card_exception.rb deleted file mode 100644 index fd3bc76..0000000 --- a/app/models/card_exception.rb +++ /dev/null @@ -1,10 +0,0 @@ -class CardException < ApplicationRecord - belongs_to :employer - has_many :card_exception_items - accepts_nested_attributes_for :card_exception_items, allow_destroy: true, reject_if: :all_blank - - VALID_TYPES = ['zipcode', 'state', 'family_id'] - - validates :type, inclusion: { in: VALID_TYPES, - message: "%{value} is not a valid exception type" } -end diff --git a/app/models/card_provider.rb b/app/models/card_provider.rb deleted file mode 100644 index ff74ae6..0000000 --- a/app/models/card_provider.rb +++ /dev/null @@ -1,3 +0,0 @@ -class CardProvider < ApplicationRecord - has_many :employers -end diff --git a/app/models/card_rx.rb b/app/models/card_rx.rb deleted file mode 100644 index e9bb94d..0000000 --- a/app/models/card_rx.rb +++ /dev/null @@ -1,3 +0,0 @@ -class CardRx < ApplicationRecord - has_many :employers -end diff --git a/app/models/employer.rb b/app/models/employer.rb index 602d7bd..dd106a3 100644 --- a/app/models/employer.rb +++ b/app/models/employer.rb @@ -1,29 +1,6 @@ class Employer < ApplicationRecord has_many :members - has_many :plans, dependent: :destroy - accepts_nested_attributes_for :plans, allow_destroy: true, reject_if: :all_blank - - has_many :alternate_network_logos, dependent: :destroy - accepts_nested_attributes_for :alternate_network_logos, allow_destroy: true, reject_if: :all_blank - - has_many :employer_card_logos, dependent: :destroy - accepts_nested_attributes_for :employer_card_logos - has_many :card_logo_files, through: :employer_card_logos - has_one :employer_brand_logo, -> { where(logo_type: 'employer') }, - class_name: 'EmployerCardLogo', - dependent: :destroy - has_one :employer_logo, through: :employer_brand_logo, source: :card_logo_file - - has_many :network_images, -> { where(logo_type: 'network') }, - class_name: 'EmployerCardLogo', - dependent: :destroy - has_many :network_logos, through: :network_images, source: :card_logo_file - - belongs_to :card_provider, optional: true - belongs_to :card_rx, optional: true - - has_many :card_exceptions, dependent: :destroy - accepts_nested_attributes_for :card_exceptions, allow_destroy: true, reject_if: :all_blank + has_one :id_card_setup, class_name: 'IdCard::Setup' scope :active, -> { where(active: true) } scope :inactive, -> { where(active: false) } @@ -33,37 +10,37 @@ class Employer < ApplicationRecord # before_save :process_employer_logo # before_save :process_employer_logo, if: :employer_logo_filename_changed? before_save :create_slug, if: :new_record? - after_save :process_employer_logo, if: :saved_change_to_employer_logo_filename? + # after_save :process_employer_logo, if: :saved_change_to_employer_logo_filename? - def process_employer_logo - # if self.employer_logo.present? && !self.employer_logo.is_a?(String) - # self.card_logo_files.new( - # filename: self.employer_logo.filename, - # logo_type: 'employer', - # image: self.employer_logo.data, - # pl_plan_key: self.pl_plan_key || "" - # ) - # end - if self.employer_logo_filename.present? && self.employer_logo_filename.is_a?(String) - image_file = CardLogoFile.find_by(filename: self.employer_logo_filename) - if image_file.present? - if self.employer_brand_logo.present? - self.employer_brand_logo.update(card_logo_file: image_file) - else - self.create_employer_brand_logo(card_logo_file: image_file, logo_type: 'employer') - end - end + # def process_employer_logo + # # if self.employer_logo.present? && !self.employer_logo.is_a?(String) + # # self.card_logo_files.new( + # # filename: self.employer_logo.filename, + # # logo_type: 'employer', + # # image: self.employer_logo.data, + # # pl_plan_key: self.pl_plan_key || "" + # # ) + # # end + # if self.employer_logo_filename.present? && self.employer_logo_filename.is_a?(String) + # image_file = CardLogoFile.find_by(filename: self.employer_logo_filename) + # if image_file.present? + # if self.employer_brand_logo.present? + # self.employer_brand_logo.update(card_logo_file: image_file) + # else + # self.create_employer_brand_logo(card_logo_file: image_file, logo_type: 'employer') + # end + # end - end - end + # end + # end def create_slug self.slug = employer_trim_name(self.name).parameterize end - def name_to_logo_filename(extension) - self.employer_trim_name(self.name).titleize.gsub(/\s+/, '').concat('Logo').concat(extension.downcase) - end + # def name_to_logo_filename(extension) + # self.employer_trim_name(self.name).titleize.gsub(/\s+/, '').concat('Logo').concat(extension.downcase) + # end def employer_trim_name(name) regex_source = Regexp.union(["health", "plan", "the", "inc", "llc"]).source @@ -74,35 +51,10 @@ class Employer < ApplicationRecord def self.permitted_params(params) params.require(:employer).permit( :name, + :slug, :group_number, :pl_plan_key, - :effective_date, - :employer_logo_filename, - :network_provider, - :default_network_logo, - :single_card_template, - :card_provider_id, - :card_rx_id, - plans_attributes: [ - :id, - :title, - :pb_product_key, - :_destroy, - plan_benefits_attributes: [ - :id, - :benefit_desc, - :benefit, - :sequence, - :_destroy, - ] - ], - alternate_network_logos_attributes: [ - :id, - :network_logo, - :exception_type, - :exception_value, - :_destroy - ] + :effective_date ) end diff --git a/app/models/id_card.rb b/app/models/id_card.rb new file mode 100644 index 0000000..acea285 --- /dev/null +++ b/app/models/id_card.rb @@ -0,0 +1,5 @@ +module IdCard + def self.table_name_prefix + "id_card_" + end +end diff --git a/app/models/id_card/employer_logo.rb b/app/models/id_card/employer_logo.rb new file mode 100644 index 0000000..2a250c5 --- /dev/null +++ b/app/models/id_card/employer_logo.rb @@ -0,0 +1,14 @@ +class IdCard::EmployerLogo < ApplicationRecord + before_save :calculate_aspect_ratio, if: :image_data_changed? + + private + + def calculate_aspect_ratio + image_io = StringIO.new(self.image_data) + width, height = FastImage.size(image_io) + image_ratio = width.to_f / height + if image_ratio + self.aspect_ratio = image_ratio.round(2) + end + end +end diff --git a/app/models/id_card/exception.rb b/app/models/id_card/exception.rb new file mode 100644 index 0000000..907b751 --- /dev/null +++ b/app/models/id_card/exception.rb @@ -0,0 +1,10 @@ +class IdCard::Exception < ApplicationRecord + belongs_to :id_card_setup + has_many :id_card_exception_items + accepts_nested_attributes_for :id_card_exception_items, allow_destroy: true, reject_if: :all_blank + + VALID_TYPES = ['zipcode', 'state', 'family_id'] + + validates :type, inclusion: { in: VALID_TYPES, + message: "%{value} is not a valid exception type" } +end diff --git a/app/models/card_exception_item.rb b/app/models/id_card/exception_item.rb similarity index 77% rename from app/models/card_exception_item.rb rename to app/models/id_card/exception_item.rb index 273187e..3729e33 100644 --- a/app/models/card_exception_item.rb +++ b/app/models/id_card/exception_item.rb @@ -1,7 +1,7 @@ -class CardExceptionItem < ApplicationRecord - belongs_to :card_exception - belongs_to :card_logo_file, optional: true - belongs_to :card_provider, optional: true +class IdCard::ExceptionItem < ApplicationRecord + belongs_to :id_card_exception + belongs_to :id_card_network_logo, optional: true + belongs_to :id_card_provider_section, optional: true validate :only_one_exception_field_present diff --git a/app/models/id_card/network_logo.rb b/app/models/id_card/network_logo.rb new file mode 100644 index 0000000..1200e3a --- /dev/null +++ b/app/models/id_card/network_logo.rb @@ -0,0 +1,11 @@ +class IdCard::NetworkLogo < ApplicationRecord + before_save :round_aspect_ratio + + private + + def round_aspect_ratio + if self.aspect_ratio.present? + self.aspect_ratio = self.aspect_ratio.round(2) + end + end +end diff --git a/app/models/id_card/plan.rb b/app/models/id_card/plan.rb new file mode 100644 index 0000000..d899b34 --- /dev/null +++ b/app/models/id_card/plan.rb @@ -0,0 +1,33 @@ +class IdCard::Plan < ApplicationRecord + belongs_to :id_card_setup + has_many :id_card_plan_benefits, dependent: :destroy + accepts_nested_attributes_for :id_card_plan_benefits, allow_destroy: true, reject_if: :all_blank + + # after_initialize :create_default_benefits, if: :new_record? + + + def self.permitted_params(params) + params.require(:id_card_plan).permit( + :title, + :pb_product_key, + :pl_plan_key, + :_destroy, + id_card_plan_benefits_attributes: [ + :id, + :benefit_desc, + :benefit, + :sequence, + :_destroy, + ] + ) + end + + private + + def build_and_create_default_benefits + benefits = IdCardBenefitsTemplate.find_by(title: "BLANK").id_card_benefits.sort_by(&:sequence) + benefits.each do |ben| + id_card_plan_benefits.new(benefit_desc: ben.benefit_desc, sequence: ben.sequence) + end + end +end \ No newline at end of file diff --git a/app/models/id_card/plan_benefit.rb b/app/models/id_card/plan_benefit.rb new file mode 100644 index 0000000..26b140a --- /dev/null +++ b/app/models/id_card/plan_benefit.rb @@ -0,0 +1,3 @@ +class IdCard::PlanBenefit < ApplicationRecord + belongs_to :id_card_plan +end diff --git a/app/models/sample_id_card.rb b/app/models/id_card/print_data.rb similarity index 94% rename from app/models/sample_id_card.rb rename to app/models/id_card/print_data.rb index ffa4e87..8ef2659 100644 --- a/app/models/sample_id_card.rb +++ b/app/models/id_card/print_data.rb @@ -1,4 +1,4 @@ -class SampleIdCard < ApplicationRecord +class IdCard::PrintData < ApplicationRecord STRING_ATTRIBUTES = %w[provider_line_1 provider_line_2 provider_line_3 provider_line_4 provider_line_5 provider_line_6 provider_line_7 provider_line_8 provider_line_9 provider_line_10 provider_line_11 claim_to_1 claim_to_2 claim_to_3 claim_to_4 claim_to_5 claim_to_6 claim_to_7 claim_to_8 claim_to_9 claim_to_10 claim_to_11 dependent_1 dependent_2 dependent_3 dependent_4 dependent_5 dependent_6 dependent_7 dependent_8] diff --git a/app/models/id_card/provider_section.rb b/app/models/id_card/provider_section.rb new file mode 100644 index 0000000..fef5856 --- /dev/null +++ b/app/models/id_card/provider_section.rb @@ -0,0 +1,3 @@ +class IdCard::ProviderSection < ApplicationRecord + +end diff --git a/app/models/id_card/rx_section.rb b/app/models/id_card/rx_section.rb new file mode 100644 index 0000000..12c751c --- /dev/null +++ b/app/models/id_card/rx_section.rb @@ -0,0 +1,3 @@ +class IdCard::RxSection < ApplicationRecord + +end diff --git a/app/models/id_card/setup.rb b/app/models/id_card/setup.rb new file mode 100644 index 0000000..14f33af --- /dev/null +++ b/app/models/id_card/setup.rb @@ -0,0 +1,27 @@ +class IdCard::Setup < ApplicationRecord + belongs_to :employer + belongs_to :id_card_employer_logo + belongs_to :id_card_network_logo + belongs_to :id_card_provider_section + belongs_to :id_card_rx_section + + has_many :card_exceptions, dependent: :destroy + + # def employer_logo_filename + # self.id_card_employer_logo.filename + # end + + # def network_logo_filename + # self.id_card_network_logo.filename + # end + + def self.permitted_params(params) + params.require(:id_card_setup).permit( + :print_name, + :network_provider, + :card_template, + :rx_group_number, + :id_card_employer_logo_id + ) + end +end diff --git a/app/models/alternate_network_logo.rb b/app/models/old/alternate_network_logo.rb similarity index 100% rename from app/models/alternate_network_logo.rb rename to app/models/old/alternate_network_logo.rb diff --git a/app/models/card_logo_file.rb b/app/models/old/card_logo_file.rb similarity index 100% rename from app/models/card_logo_file.rb rename to app/models/old/card_logo_file.rb diff --git a/app/models/employer_card_logo.rb b/app/models/old/employer_card_logo.rb similarity index 100% rename from app/models/employer_card_logo.rb rename to app/models/old/employer_card_logo.rb diff --git a/app/models/employer_setup_process.rb b/app/models/old/employer_setup_process.rb similarity index 100% rename from app/models/employer_setup_process.rb rename to app/models/old/employer_setup_process.rb diff --git a/app/models/id_card_benefit.rb b/app/models/old/id_card_benefit.rb similarity index 100% rename from app/models/id_card_benefit.rb rename to app/models/old/id_card_benefit.rb diff --git a/app/models/id_card_benefits_template.rb b/app/models/old/id_card_benefits_template.rb similarity index 100% rename from app/models/id_card_benefits_template.rb rename to app/models/old/id_card_benefits_template.rb diff --git a/app/models/plan.rb b/app/models/plan.rb deleted file mode 100644 index d2937d7..0000000 --- a/app/models/plan.rb +++ /dev/null @@ -1,18 +0,0 @@ -class Plan < ApplicationRecord - belongs_to :employer - has_many :plan_benefits, dependent: :destroy - accepts_nested_attributes_for :plan_benefits, allow_destroy: true, reject_if: :all_blank - - # after_initialize :create_default_benefits, if: :new_record? - - - - private - - def build_and_create_default_benefits - benefits = IdCardBenefitsTemplate.find_by(title: "BLANK").id_card_benefits.sort_by(&:sequence) - benefits.each do |ben| - plan_benefits.new(benefit_desc: ben.benefit_desc, sequence: ben.sequence) - end - end -end \ No newline at end of file diff --git a/app/models/plan_benefit.rb b/app/models/plan_benefit.rb deleted file mode 100644 index 8812fc2..0000000 --- a/app/models/plan_benefit.rb +++ /dev/null @@ -1,3 +0,0 @@ -class PlanBenefit < ApplicationRecord - belongs_to :plan -end diff --git a/app/views/employers/edit.html.erb b/app/views/employers/edit.html.erb index 29d520b..bdef2b9 100644 --- a/app/views/employers/edit.html.erb +++ b/app/views/employers/edit.html.erb @@ -2,10 +2,6 @@

Edit Employer

<%= form_with model: @employer, local: true, multipart: true do |f| %>
-
-

General Information

-
-
@@ -16,110 +12,21 @@ <%= f.text_field :slug, label: { text: "Slug" }, class: "w-full" %>
- <%= f.text_field :group_number, label: { text: "Group/Medical Number" }, class: "w-full" %> + <%= f.text_field :pl_plan_key, label: { text: "Pl Plan Key" }, class: "w-full" %>
- <%= f.text_field :pl_plan_key, label: { text: "Pl Plan Key" }, class: "w-full" %> + <%= f.text_field :group_number, label: { text: "Group/Medical Number" }, class: "w-full" %>
<%= f.text_field :effective_date, label: { text: "Effective Date" }, class: "w-full" %>
-
- <%= f.select :network_provider, options_for_select(["Cigna", "Medcost"]), label: { text: "Provider Network" }, class: "w-full" %> -
-
-
-
- <%= f.text_field :employer_logo_filename, data: { logo_upload_target: "logofield" }, class: "w-full rounded-r-none", readonly: true %> -
-
- -
- - <%= f.file_field :add_or_update_logo, class: "hidden", id: "file_upload_input_employer", data: { logo_upload_target: "previewContainer", logo_upload_type_param: "employer", action: "change->logo-upload#uploadLogo" }, direct_upload: true %>
- -
-

Plans Information

-
-
-
-
- <% @employer.plans.each_with_index do |plan, index| %> - <%= f.fields_for :plans, plan, child_index: index do |plan_fields| %> -
-
">
-
-ml-[6px] z-2 w-full"> - <%= "Plan #{index + 1}" %> -
- <%= render 'plan_fields', plan_fields: plan_fields, f: f, index: index %> -
"> - Benefit Values -
-
ml-[3px]">
- <%= plan_fields.fields_for :plan_benefits do |plan_benefits_fields| %> - <%= render 'plan_benefits_fields', plan_benefits_fields: plan_benefits_fields %> - <% end %> -
- <%= plan_fields.hidden_field :_destroy %> - <%= button_tag "Remove Plan #{index + 1}", class: "cursor-pointer bg-deepcove hover:bg-brightlava text-xl font-bold text-#{index % 2 == 1 ? 'bronze' : 'copper'} hover:text-platinum py-2 px-4 font-semibold leading-tight rounded-lg border-3 border-NEXT_SECONDARY_COLOR w-full", data: { action: "add-plan#remove" } %> -
-
- - <% end %> - <% end %> - <%= button_tag "Add a Plan", class: "cursor-pointer text-2xl font-bold py-2 pr-6 mt-10 w-[calc(24%-1rem)] w-1/4 min-h-[940px] text-[#E0E0E0] rounded-lg font-medium border border-[#E0E0E0] bg-[#173057] hover:bg-transparent hover:shadow-[0_0_10px_3px_#93c5fd] transition-colors duration-150", data: { action: "add-plan#add", add_plan_target: "button" } %> - -
-
- -
-

Alternative Network Information

-
-
-
-
- <%= button_tag "Add a Regional Logo", class: "cursor-pointer text-lg font-medium py-2 px-4 rounded w-1/7 h-75 my-8 text-[#E0E0E0] rounded-lg border border-[#C2C2C2] hover:shadow-[0_0_10px_3px_#93c5fd]", data: { action: "add-alt-network-logo#add", add_alt_network_logo_target: "button" } %> -
- -
- <%= f.submit "Submit" %> + <%= f.submit "Save Employer" %> <%= link_to "Back", employer_path(@employer.slug), class: "flex justify-center items-center cursor-pointer bg-atmosphere hover:bg-deepcove border-2 border-atmosphere text-platinum font-bold px-3 rounded-sm h-10 transition duration-100" %>
diff --git a/app/views/employers/new.html.erb b/app/views/employers/new.html.erb index 3412b07..6c75634 100644 --- a/app/views/employers/new.html.erb +++ b/app/views/employers/new.html.erb @@ -13,10 +13,6 @@ <%= form_with model: @employer, local: true, multipart: true do |f| %>
-
-

General Information

-
-
@@ -31,105 +27,11 @@
<%= f.text_field :effective_date, label: { text: "Effective Date" }, class: "w-full" %>
-
- <%= f.select :network_provider, options_for_select(["Cigna", "Medcost"]), label: { text: "Provider Network" }, data: { logo_upload_target: "network" }, class: "w-full" %> - <%= f.hidden_field :single_card_template, value: @employer.single_card_template %> - <%= f.hidden_field :default_network_logo, value: @employer.default_network_logo %> - <%= f.hidden_field :card_provider_id, value: @employer.card_provider_id %> - <%= f.hidden_field :card_rx_id, value: @employer.card_rx_id %> -
-
-
-
-
- <%= f.text_field :employer_logo_filename, label: { text: "Employer Logo" }, default: "No logo added", data: { logo_upload_target: "logofield" }, class: "w-full rounded-r-none", readonly: true %> -
-
- -
-
- - <%= f.file_field :add_or_update_logo, class: "hidden", id: "file_upload_input_employer", data: { logo_upload_target: "previewContainer", logo_upload_type_param: "employer", action: "change->logo-upload#uploadLogo" }, direct_upload: true %>
-
-

Plans Information

-
-
-
-
- <% @employer.plans.each_with_index do |plan, index| %> - <%= f.fields_for :plans, plan, child_index: index do |plan_fields| %> -
-
">
-
-ml-[6px] z-2 w-full"> - <%= "Plan #{index + 1}" %> -
- <%= render 'plan_fields', plan_fields: plan_fields, f: f, index: index %> -
"> - Benefit Values -
-
ml-[3px]">
- <%= plan_fields.fields_for :plan_benefits do |plan_benefits_fields| %> - <%= render 'plan_benefits_fields', plan_benefits_fields: plan_benefits_fields %> - <% end %> -
- <%= plan_fields.hidden_field :_destroy %> - <%= button_tag "Remove Plan #{index + 1}", class: "cursor-pointer bg-deepcove hover:bg-brightlava text-xl font-bold text-copper hover:text-platinum py-2 px-4 font-semibold leading-tight rounded-lg border-3 border-copper w-full", data: { action: "add-plan#remove" } %> -
-
- <% end %> - <% end %> - <%= button_tag "Add a Plan", class: "cursor-pointer text-2xl font-bold py-2 pr-6 mt-10 w-[calc(24%-1rem)] w-1/4 min-h-[940px] text-[#E0E0E0] rounded-lg font-medium border border-[#E0E0E0] bg-[#173057] hover:bg-transparent hover:shadow-[0_0_10px_3px_#93c5fd] transition-colors duration-150", data: { action: "add-plan#add", add_plan_target: "button" } %> -
- -
-
- -
-

Alternative Network Information

-
-
-
-
- <%= button_tag "Add a Regional Logo", class: "cursor-pointer text-lg font-medium py-2 px-4 rounded w-1/7 h-55 my-8 text-[#E0E0E0] rounded-lg border border-[#C2C2C2] hover:shadow-[0_0_10px_3px_#93c5fd]", data: { action: "add-alt-network-logo#add", add_alt_network_logo_target: "button" } %> -
- -
- <%= f.submit "Submit" %> + <%= f.submit "Create New Employer" %>
<% end %> diff --git a/app/views/employers/show.html.erb b/app/views/employers/show.html.erb index 2893391..c8ea842 100644 --- a/app/views/employers/show.html.erb +++ b/app/views/employers/show.html.erb @@ -2,7 +2,9 @@

<%= @employer.name %>

- <%= image_tag image_card_logo_file_path(@employer.employer_logo_filename), class: "max-h-[50px] object-contain shadow-[0_0_10px_3px_#93c5fd]" %> + <% if @employer&.id_card_setup&.id_card_employer_logo&.filename %> + <%= image_tag image_id_card_employer_logo_path(@employer.id_card_setup.id_card_employer_logo.filename), class: "max-h-[50px] object-contain shadow-[0_0_10px_3px_#93c5fd]" %> + <% end %>
@@ -29,17 +31,19 @@ <%= attribute_value.present? ? attribute_value.to_s : "waiting" %>

<% end %> -
- └── Plans -
- <% @employer.plans.pluck(:title, :pb_product_key).each do |plan| %> -
- ├── <%= plan.first %> + <% if @employer&.id_card_setup&.id_card_plans %> +
+ └── Plans
-

"> - └── PB Product Key: - <%= plan.last.present? ? plan.last.to_s : "waiting" %> -

+ <% @employer.id_card_setup.id_card_plans.pluck(:title, :pb_product_key).each do |plan| %> +
+ ├── <%= plan.first %> +
+

"> + └── PB Product Key: + <%= plan.last.present? ? plan.last.to_s : "waiting" %> +

+ <% end %> <% end %>
@@ -53,10 +57,10 @@

Actions

- <%= link_to 'Generate Sample Cards', generate_sample_sample_id_cards_path(employer_slug: @employer.slug ), data: { turbo: false }, class: "flex justify-center items-center w-2/3 cursor-pointer bg-atmosphere hover:bg-deepcove border-2 border-atmosphere text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %> - <%= link_to 'Generate Group Cards (for print)', generate_print_sample_id_cards_path(employer_slug: @employer.slug ),data: { turbo: false }, class: "flex justify-center items-center w-2/3 #{@employer.active ? "" : "pointer-events-none opacity-50 cursor-not-allowed"} bg-atmosphere hover:bg-deepcove border-2 border-atmosphere text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %> - <%= link_to 'Generate Group Cards (for display)', generate_mobile_display_sample_id_cards_path(employer_slug: @employer.slug ), data: { turbo: false }, class: "flex justify-center items-center w-2/3 #{@employer.active ? "" : "pointer-events-none opacity-50 cursor-not-allowed"} bg-atmosphere hover:bg-deepcove border-2 border-atmosphere text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %> - <%= link_to 'Generate Group Cards (for download)', generate_full_page_sample_id_cards_path(employer_slug: @employer.slug ), data: { turbo: false }, class: "flex justify-center items-center w-2/3 #{@employer.active ? "" : "pointer-events-none opacity-50 cursor-not-allowed"} bg-atmosphere hover:bg-deepcove border-2 border-atmosphere text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %> + <%= link_to 'Generate Sample Cards', generate_sample_id_card_print_data_path(employer_slug: @employer.slug ), data: { turbo: false }, class: "flex justify-center items-center w-2/3 cursor-pointer bg-atmosphere hover:bg-deepcove border-2 border-atmosphere text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %> + <%= link_to 'Generate Group Cards (for print)', generate_print_id_card_print_data_path(employer_slug: @employer.slug ),data: { turbo: false }, class: "flex justify-center items-center w-2/3 #{@employer.active ? "" : "pointer-events-none opacity-50 cursor-not-allowed"} bg-atmosphere hover:bg-deepcove border-2 border-atmosphere text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %> + <%= link_to 'Generate Group Cards (for display)', generate_mobile_display_id_card_print_data_path(employer_slug: @employer.slug ), data: { turbo: false }, class: "flex justify-center items-center w-2/3 #{@employer.active ? "" : "pointer-events-none opacity-50 cursor-not-allowed"} bg-atmosphere hover:bg-deepcove border-2 border-atmosphere text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %> + <%= link_to 'Generate Group Cards (for download)', generate_full_page_id_card_print_data_path(employer_slug: @employer.slug ), data: { turbo: false }, class: "flex justify-center items-center w-2/3 #{@employer.active ? "" : "pointer-events-none opacity-50 cursor-not-allowed"} bg-atmosphere hover:bg-deepcove border-2 border-atmosphere text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %>
\ No newline at end of file diff --git a/app/views/employers/_alt_network_logo_fields.html.erb b/app/views/employers_old/_alt_network_logo_fields.html.erb similarity index 100% rename from app/views/employers/_alt_network_logo_fields.html.erb rename to app/views/employers_old/_alt_network_logo_fields.html.erb diff --git a/app/views/employers/_alt_network_logo_fields_new.html.erb b/app/views/employers_old/_alt_network_logo_fields_new.html.erb similarity index 100% rename from app/views/employers/_alt_network_logo_fields_new.html.erb rename to app/views/employers_old/_alt_network_logo_fields_new.html.erb diff --git a/app/views/employers/_first_plan_fields.html.erb b/app/views/employers_old/_first_plan_fields.html.erb similarity index 100% rename from app/views/employers/_first_plan_fields.html.erb rename to app/views/employers_old/_first_plan_fields.html.erb diff --git a/app/views/employers/_plan_benefit_only_fields.erb b/app/views/employers_old/_plan_benefit_only_fields.erb similarity index 100% rename from app/views/employers/_plan_benefit_only_fields.erb rename to app/views/employers_old/_plan_benefit_only_fields.erb diff --git a/app/views/employers/_plan_benefits_desc_fields.html.erb b/app/views/employers_old/_plan_benefits_desc_fields.html.erb similarity index 100% rename from app/views/employers/_plan_benefits_desc_fields.html.erb rename to app/views/employers_old/_plan_benefits_desc_fields.html.erb diff --git a/app/views/employers/_plan_benefits_fields.html.erb b/app/views/employers_old/_plan_benefits_fields.html.erb similarity index 100% rename from app/views/employers/_plan_benefits_fields.html.erb rename to app/views/employers_old/_plan_benefits_fields.html.erb diff --git a/app/views/employers/_plan_fields.html.erb b/app/views/employers_old/_plan_fields.html.erb similarity index 100% rename from app/views/employers/_plan_fields.html.erb rename to app/views/employers_old/_plan_fields.html.erb diff --git a/app/views/employers_old/edit.html.erb b/app/views/employers_old/edit.html.erb new file mode 100644 index 0000000..29d520b --- /dev/null +++ b/app/views/employers_old/edit.html.erb @@ -0,0 +1,127 @@ +
+

Edit Employer

+ <%= form_with model: @employer, local: true, multipart: true do |f| %> +
+
+

General Information

+
+
+
+
+
+
+ <%= f.text_field :name, label: { text: "Employer Name" }, class: "w-full" %> +
+
+ <%= f.text_field :slug, label: { text: "Slug" }, class: "w-full" %> +
+
+ <%= f.text_field :group_number, label: { text: "Group/Medical Number" }, class: "w-full" %> +
+
+
+
+ <%= f.text_field :pl_plan_key, label: { text: "Pl Plan Key" }, class: "w-full" %> +
+
+ <%= f.text_field :effective_date, label: { text: "Effective Date" }, class: "w-full" %> +
+
+ <%= f.select :network_provider, options_for_select(["Cigna", "Medcost"]), label: { text: "Provider Network" }, class: "w-full" %> +
+
+
+
+ <%= f.text_field :employer_logo_filename, data: { logo_upload_target: "logofield" }, class: "w-full rounded-r-none", readonly: true %> +
+
+ +
+ + <%= f.file_field :add_or_update_logo, class: "hidden", id: "file_upload_input_employer", data: { logo_upload_target: "previewContainer", logo_upload_type_param: "employer", action: "change->logo-upload#uploadLogo" }, direct_upload: true %> +
+
+
+ +
+

Plans Information

+
+
+
+
+ <% @employer.plans.each_with_index do |plan, index| %> + <%= f.fields_for :plans, plan, child_index: index do |plan_fields| %> +
+
">
+
-ml-[6px] z-2 w-full"> + <%= "Plan #{index + 1}" %> +
+ <%= render 'plan_fields', plan_fields: plan_fields, f: f, index: index %> +
"> + Benefit Values +
+
ml-[3px]">
+ <%= plan_fields.fields_for :plan_benefits do |plan_benefits_fields| %> + <%= render 'plan_benefits_fields', plan_benefits_fields: plan_benefits_fields %> + <% end %> +
+ <%= plan_fields.hidden_field :_destroy %> + <%= button_tag "Remove Plan #{index + 1}", class: "cursor-pointer bg-deepcove hover:bg-brightlava text-xl font-bold text-#{index % 2 == 1 ? 'bronze' : 'copper'} hover:text-platinum py-2 px-4 font-semibold leading-tight rounded-lg border-3 border-NEXT_SECONDARY_COLOR w-full", data: { action: "add-plan#remove" } %> +
+
+ + <% end %> + <% end %> + <%= button_tag "Add a Plan", class: "cursor-pointer text-2xl font-bold py-2 pr-6 mt-10 w-[calc(24%-1rem)] w-1/4 min-h-[940px] text-[#E0E0E0] rounded-lg font-medium border border-[#E0E0E0] bg-[#173057] hover:bg-transparent hover:shadow-[0_0_10px_3px_#93c5fd] transition-colors duration-150", data: { action: "add-plan#add", add_plan_target: "button" } %> + +
+
+ +
+

Alternative Network Information

+
+
+
+
+ <%= button_tag "Add a Regional Logo", class: "cursor-pointer text-lg font-medium py-2 px-4 rounded w-1/7 h-75 my-8 text-[#E0E0E0] rounded-lg border border-[#C2C2C2] hover:shadow-[0_0_10px_3px_#93c5fd]", data: { action: "add-alt-network-logo#add", add_alt_network_logo_target: "button" } %> +
+ +
+
+ <%= f.submit "Submit" %> + <%= link_to "Back", employer_path(@employer.slug), class: "flex justify-center items-center cursor-pointer bg-atmosphere hover:bg-deepcove border-2 border-atmosphere text-platinum font-bold px-3 rounded-sm h-10 transition duration-100" %> +
+
+ <% end %> +
diff --git a/app/views/employers/general_information.html.erb b/app/views/employers_old/general_information.html.erb similarity index 100% rename from app/views/employers/general_information.html.erb rename to app/views/employers_old/general_information.html.erb diff --git a/app/views/employers_old/index.html.erb b/app/views/employers_old/index.html.erb new file mode 100644 index 0000000..e1e1f55 --- /dev/null +++ b/app/views/employers_old/index.html.erb @@ -0,0 +1,33 @@ +
+
+

Employers

+ <%= link_to new_employer_path, class: "flex justify-center items-center h-8 w-8 ml-2 mb-6 text-sm text-bronze bg-deepcove hover:bg-cobalt font-semibold p-1 rounded-lg border-2 border-cobalt" do %> + <%= icon "clipboard-plus", library: "lucide" %> + <% end %> + +
+ <% plan_colors = EmployerSetupPlansForm::PLAN_COLORS.push('copper', 'bronze').shuffle %> + <% @color_index = 0 %> +

In Process:

+ <% @employers.inactive.each_with_index do |emp, index| %> + <% item_color_index = @color_index == 0 ? 0 : @color_index % plan_colors.length %> +
"> + <%= link_to emp.name, employer_path(emp.slug), class: "hover:text-#{plan_colors[item_color_index]}" %> +
+ <%= "(Effective #{emp.effective_date})" %> +
+
+ <% @color_index += 1 %> + <% end %> +

Live:

+ <% @employers.active.each_with_index do |emp, index| %> + <% item_color_index = @color_index == 0 ? 0 : @color_index % plan_colors.length %> +
"> + <%= link_to emp.name, employer_path(emp.slug), class: "hover:text-#{plan_colors[item_color_index]}" %> +
+ <%= "(#{emp.members.count} Members)" %> +
+
+ <% @color_index += 1 %> + <% end %> +
\ No newline at end of file diff --git a/app/views/employers/network_exceptions.html.erb b/app/views/employers_old/network_exceptions.html.erb similarity index 100% rename from app/views/employers/network_exceptions.html.erb rename to app/views/employers_old/network_exceptions.html.erb diff --git a/app/views/employers_old/new.html.erb b/app/views/employers_old/new.html.erb new file mode 100644 index 0000000..3412b07 --- /dev/null +++ b/app/views/employers_old/new.html.erb @@ -0,0 +1,136 @@ +
+
+

New Employer

+ <%= form_with model: @employer, url: import_employers_path, data: { turbo: false }, local: true, multipart: true do |form| %> +
+
+ <%= form.label :import_from_word, 'ID Card Setup Word Doc', class: "block text-platinum font-bold mb-1 md:mb-0 pr-4" %> + <%= form.file_field :import_from_word %> +
+ <%= form.submit "Import", class: "h-[40px]" %> +
+ <% end %> +
+ <%= form_with model: @employer, local: true, multipart: true do |f| %> +
+
+

General Information

+
+
+
+
+
+
+ <%= f.text_field :name, label: { text: "Employer Name" }, data: { logo_upload_target: "employer" }, class: "w-full" %> +
+
+ <%= f.text_field :group_number, label: { text: "Group/Medical Number" }, class: "w-full" %> +
+
+
+
+ <%= f.text_field :effective_date, label: { text: "Effective Date" }, class: "w-full" %> +
+
+ <%= f.select :network_provider, options_for_select(["Cigna", "Medcost"]), label: { text: "Provider Network" }, data: { logo_upload_target: "network" }, class: "w-full" %> + <%= f.hidden_field :single_card_template, value: @employer.single_card_template %> + <%= f.hidden_field :default_network_logo, value: @employer.default_network_logo %> + <%= f.hidden_field :card_provider_id, value: @employer.card_provider_id %> + <%= f.hidden_field :card_rx_id, value: @employer.card_rx_id %> +
+
+
+
+
+ <%= f.text_field :employer_logo_filename, label: { text: "Employer Logo" }, default: "No logo added", data: { logo_upload_target: "logofield" }, class: "w-full rounded-r-none", readonly: true %> +
+
+ +
+
+ + <%= f.file_field :add_or_update_logo, class: "hidden", id: "file_upload_input_employer", data: { logo_upload_target: "previewContainer", logo_upload_type_param: "employer", action: "change->logo-upload#uploadLogo" }, direct_upload: true %> +
+
+
+
+

Plans Information

+
+
+
+
+ <% @employer.plans.each_with_index do |plan, index| %> + <%= f.fields_for :plans, plan, child_index: index do |plan_fields| %> +
+
">
+
-ml-[6px] z-2 w-full"> + <%= "Plan #{index + 1}" %> +
+ <%= render 'plan_fields', plan_fields: plan_fields, f: f, index: index %> +
"> + Benefit Values +
+
ml-[3px]">
+ <%= plan_fields.fields_for :plan_benefits do |plan_benefits_fields| %> + <%= render 'plan_benefits_fields', plan_benefits_fields: plan_benefits_fields %> + <% end %> +
+ <%= plan_fields.hidden_field :_destroy %> + <%= button_tag "Remove Plan #{index + 1}", class: "cursor-pointer bg-deepcove hover:bg-brightlava text-xl font-bold text-copper hover:text-platinum py-2 px-4 font-semibold leading-tight rounded-lg border-3 border-copper w-full", data: { action: "add-plan#remove" } %> +
+
+ <% end %> + <% end %> + <%= button_tag "Add a Plan", class: "cursor-pointer text-2xl font-bold py-2 pr-6 mt-10 w-[calc(24%-1rem)] w-1/4 min-h-[940px] text-[#E0E0E0] rounded-lg font-medium border border-[#E0E0E0] bg-[#173057] hover:bg-transparent hover:shadow-[0_0_10px_3px_#93c5fd] transition-colors duration-150", data: { action: "add-plan#add", add_plan_target: "button" } %> +
+ +
+
+ +
+

Alternative Network Information

+
+
+
+
+ <%= button_tag "Add a Regional Logo", class: "cursor-pointer text-lg font-medium py-2 px-4 rounded w-1/7 h-55 my-8 text-[#E0E0E0] rounded-lg border border-[#C2C2C2] hover:shadow-[0_0_10px_3px_#93c5fd]", data: { action: "add-alt-network-logo#add", add_alt_network_logo_target: "button" } %> +
+ +
+
+ <%= f.submit "Submit" %> +
+
+ <% end %> + diff --git a/app/views/employers/new_new.html.erb b/app/views/employers_old/new_new.html.erb similarity index 100% rename from app/views/employers/new_new.html.erb rename to app/views/employers_old/new_new.html.erb diff --git a/app/views/employers/plans.html.erb b/app/views/employers_old/plans.html.erb similarity index 100% rename from app/views/employers/plans.html.erb rename to app/views/employers_old/plans.html.erb diff --git a/app/views/employers_old/show.html.erb b/app/views/employers_old/show.html.erb new file mode 100644 index 0000000..2893391 --- /dev/null +++ b/app/views/employers_old/show.html.erb @@ -0,0 +1,62 @@ +
+
+

<%= @employer.name %>

+
+ <%= image_tag image_card_logo_file_path(@employer.employer_logo_filename), class: "max-h-[50px] object-contain shadow-[0_0_10px_3px_#93c5fd]" %> +
+
+
+
+
+

Employer Information

+
+
+
+

"> + └── Status: + <%= @employer.active == false ? "inactive" : "active" %> +

+

+ ├── Effective Date: + <%= @employer.effective_date %> +

+
+ └── Key Chain +
+ <% @employer.attributes.with_indifferent_access.slice(:pl_plan_key, :company_pb_entity_key, :group_number).each do |attribute_name, attribute_value| %> +

"> + ├── <%= attribute_name.titleize %>: + <%= attribute_value.present? ? attribute_value.to_s : "waiting" %> +

+ <% end %> +
+ └── Plans +
+ <% @employer.plans.pluck(:title, :pb_product_key).each do |plan| %> +
+ ├── <%= plan.first %> +
+

"> + └── PB Product Key: + <%= plan.last.present? ? plan.last.to_s : "waiting" %> +

+ <% end %> +
+
+ <%= link_to 'Edit', edit_employer_path(@employer.slug), class: "hover:text-atmosphere" %> +

|

+ <%= link_to 'Back', employers_path, class: "hover:text-atmosphere" %> +
+
+
+
+

Actions

+
+
+ <%= link_to 'Generate Sample Cards', generate_sample_sample_id_cards_path(employer_slug: @employer.slug ), data: { turbo: false }, class: "flex justify-center items-center w-2/3 cursor-pointer bg-atmosphere hover:bg-deepcove border-2 border-atmosphere text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %> + <%= link_to 'Generate Group Cards (for print)', generate_print_sample_id_cards_path(employer_slug: @employer.slug ),data: { turbo: false }, class: "flex justify-center items-center w-2/3 #{@employer.active ? "" : "pointer-events-none opacity-50 cursor-not-allowed"} bg-atmosphere hover:bg-deepcove border-2 border-atmosphere text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %> + <%= link_to 'Generate Group Cards (for display)', generate_mobile_display_sample_id_cards_path(employer_slug: @employer.slug ), data: { turbo: false }, class: "flex justify-center items-center w-2/3 #{@employer.active ? "" : "pointer-events-none opacity-50 cursor-not-allowed"} bg-atmosphere hover:bg-deepcove border-2 border-atmosphere text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %> + <%= link_to 'Generate Group Cards (for download)', generate_full_page_sample_id_cards_path(employer_slug: @employer.slug ), data: { turbo: false }, class: "flex justify-center items-center w-2/3 #{@employer.active ? "" : "pointer-events-none opacity-50 cursor-not-allowed"} bg-atmosphere hover:bg-deepcove border-2 border-atmosphere text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %> +
+
+
\ No newline at end of file diff --git a/app/views/employers/summary.html.erb b/app/views/employers_old/summary.html.erb similarity index 100% rename from app/views/employers/summary.html.erb rename to app/views/employers_old/summary.html.erb diff --git a/app/views/id_cards/setup/edit.html.erb b/app/views/id_cards/setup/edit.html.erb new file mode 100644 index 0000000..16ad5a3 --- /dev/null +++ b/app/views/id_cards/setup/edit.html.erb @@ -0,0 +1,34 @@ +
+

Edit Employer

+ <%= form_with model: @employer, local: true, multipart: true do |f| %> +
+
+
+
+
+ <%= f.text_field :name, label: { text: "Employer Name" }, class: "w-full" %> +
+
+ <%= f.text_field :slug, label: { text: "Slug" }, class: "w-full" %> +
+
+ <%= f.text_field :group_number, label: { text: "Group/Medical Number" }, class: "w-full" %> +
+
+
+
+ <%= f.text_field :pl_plan_key, label: { text: "Pl Plan Key" }, class: "w-full" %> +
+
+ <%= f.text_field :effective_date, label: { text: "Effective Date" }, class: "w-full" %> +
+
+
+
+
+ <%= f.submit "Save Employer" %> + <%= link_to "Back", employer_path(@employer.slug), class: "flex justify-center items-center cursor-pointer bg-atmosphere hover:bg-deepcove border-2 border-atmosphere text-platinum font-bold px-3 rounded-sm h-10 transition duration-100" %> +
+
+ <% end %> +
diff --git a/app/views/id_cards/setup/new.html.erb b/app/views/id_cards/setup/new.html.erb new file mode 100644 index 0000000..521f989 --- /dev/null +++ b/app/views/id_cards/setup/new.html.erb @@ -0,0 +1,48 @@ +
+
+

New ID Card Setup:

+

(<%= @employer.name %>)

+
+ <%= form_with model: @setup, local: true, multipart: true do |f| %> +
+
> +
+
+
+ <%= f.text_field :print_name, label: { text: "Print Name" }, class: "w-full" %> +
+
+ <%= f.text_field :rx_group_number, label: { text: "Rx Group Number" }, class: "w-full" %> +
+
+
+
+ <%= f.select :network_provider, options_for_select(["Cigna", "Medcost", "Other"]), { label: { text: "Provider Network" }, include_blank: "Select", class: "w-full" } %> +
+
+ <%= f.select :card_template, options_for_select([["FairosRx", "FairosRxIDCard"], ["Tandemloc", "TandemlocIDCard"], ["smART", "SmartIDCard"], ["QRCode (Healthbus)", "QRCodeIDCard"]]), { label: { text: "Card Template" }, include_blank: "Select", class: "w-full" } %> +
+
+
+
+
Employer Logo
+
+ +
+
+ + <%= f.hidden_field :id_card_employer_logo_id, data: { logo_upload_target: "logofield", logo_upload_target: "employer" } %> + <%= f.file_field :add_or_update_logo, class: "hidden", id: "employer_logo_file", data: { logo_upload_target: "previewContainer", parent_value: "network_logo", action: "change->logo-upload#uploadLogo" }, direct_upload: true %> +
+
+
+
+ <%= f.submit "Create New Employer" %> +
+
+ <% end %> +
diff --git a/compose.yaml b/compose.yaml index 3862076..5d5e73e 100644 --- a/compose.yaml +++ b/compose.yaml @@ -17,25 +17,25 @@ services: - TAILWIND_POLLING=true tty: true stdin_open: true - # depends_on: - # db: - # condition: service_healthy + depends_on: + db: + condition: service_healthy # redis: # condition: service_started - # db: - # build: - # context: . - # dockerfile: Dockerfile.db - # volumes: - # - ./mssql-data:/var/opt/mssql - # ports: - # - "1434:1434" - # healthcheck: - # test: ["CMD", "/opt/mssql-tools/bin/sqlcmd", "-Usa", "-PBr1tt0nPassw0rd", "-Q", "select 1"] - # interval: 10s - # timeout: 3s - # retries: 10 - # start_period: 10s + db: + build: + context: . + dockerfile: Dockerfile.db + volumes: + - ./mssql-data:/var/opt/mssql + ports: + - "1434:1434" + healthcheck: + test: ["CMD", "/opt/mssql-tools/bin/sqlcmd", "-Usa", "-PBr1tt0nPassw0rd", "-Q", "select 1"] + interval: 10s + timeout: 3s + retries: 10 + start_period: 10s # redis: # image: redis # volumes: diff --git a/config/database.yml b/config/database.yml index 724021d..b2faefa 100644 --- a/config/database.yml +++ b/config/database.yml @@ -22,16 +22,16 @@ default: &default development: baclight: <<: *default - # host: db - # database: dev_tools_dev - # username: sa - # password: Br1tt0nPassw0rd - host: 10.41.82.73 #Dev - port: 1433 - database: BrittonConnect - username: BSTI - password: BSTIBOY - tds_version: 7.3 + host: db + database: baclight_dev + username: sa + password: Br1tt0nPassw0rd + # host: 10.41.82.73 #Dev + # port: 1433 + # database: BrittonConnect + # username: BSTI + # password: BSTIBOY + # tds_version: 7.3 vhcs: <<: *default host: 10.41.82.72 #Prod diff --git a/config/routes.rb b/config/routes.rb index 53cfe3e..cb03dbe 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,10 +1,24 @@ # frozen_string_literal: true Rails.application.routes.draw do - resources :card_rxes - resources :card_providers - resources :card_logo_files do - get 'image', on: :member, constraints: { id: /.*/ } + namespace :id_card do + resources :setup, constraints: { id: /.*/ } + resources :rx_sections + resources :provider_sections + resources :employer_logos do + get 'image', on: :member + end + resources :network_logos do + get 'image', on: :member, constraints: { id: /.*/ } + end + resources :print_data do + collection do + get 'generate_sample' + get 'generate_print' + get 'generate_mobile_display' + get 'generate_full_page' + end + end end # resources :employer_setup resources :employers do @@ -13,24 +27,11 @@ Rails.application.routes.draw do end end - resources :sample_id_cards do - collection do - get 'generate_sample' - get 'generate_print' - get 'generate_mobile_display' - get 'generate_full_page' - end - end - get 'id_card_benefits_templates/get_template_benefits/:id', to: 'id_card_benefits_templates#get_template_benefits' # Reveal health status on /up that returns 200 if the app boots with no exceptions, otherwise 500. # Can be used by load balancers and uptime monitors to verify that the app is live. get "up" => "rails/health#show", as: :rails_health_check - resources :articles do - resources :comments - end - root "welcome#index" end diff --git a/db/migrate/20211216184102_create_active_storage_tables.active_storage.rb b/db/migrate/20211216184102_create_active_storage_tables.active_storage.rb deleted file mode 100644 index 0abe016..0000000 --- a/db/migrate/20211216184102_create_active_storage_tables.active_storage.rb +++ /dev/null @@ -1,57 +0,0 @@ -# This migration comes from active_storage (originally 20170806125915) -class CreateActiveStorageTables < ActiveRecord::Migration[5.2] - def change - # Use Active Record's configured type for primary and foreign keys - primary_key_type, foreign_key_type = primary_and_foreign_key_types - - create_table :active_storage_blobs, id: primary_key_type do |t| - t.string :key, null: false - t.string :filename, null: false - t.string :content_type - t.text :metadata - t.string :service_name, null: false - t.bigint :byte_size, null: false - t.string :checksum - - if connection.supports_datetime_with_precision? - t.datetime :created_at, precision: 6, null: false - else - t.datetime :created_at, null: false - end - - t.index [ :key ], unique: true - end - - create_table :active_storage_attachments, id: primary_key_type do |t| - t.string :name, null: false - t.references :record, null: false, polymorphic: true, index: false, type: foreign_key_type - t.references :blob, null: false, type: foreign_key_type - - if connection.supports_datetime_with_precision? - t.datetime :created_at, precision: 6, null: false - else - t.datetime :created_at, null: false - end - - t.index [ :record_type, :record_id, :name, :blob_id ], name: :index_active_storage_attachments_uniqueness, unique: true - t.foreign_key :active_storage_blobs, column: :blob_id - end - - create_table :active_storage_variant_records, id: primary_key_type do |t| - t.belongs_to :blob, null: false, index: false, type: foreign_key_type - t.string :variation_digest, null: false - - t.index [ :blob_id, :variation_digest ], name: :index_active_storage_variant_records_uniqueness, unique: true - t.foreign_key :active_storage_blobs, column: :blob_id - end - end - - private - def primary_and_foreign_key_types - config = Rails.configuration.generators - setting = config.options[config.orm][:primary_key_type] - primary_key_type = setting || :primary_key - foreign_key_type = setting || :bigint - [ primary_key_type, foreign_key_type ] - end -end diff --git a/db/migrate/20211216184103_create_action_text_tables.action_text.rb b/db/migrate/20211216184103_create_action_text_tables.action_text.rb deleted file mode 100644 index c1c0a9d..0000000 --- a/db/migrate/20211216184103_create_action_text_tables.action_text.rb +++ /dev/null @@ -1,26 +0,0 @@ -# This migration comes from action_text (originally 20180528164100) -class CreateActionTextTables < ActiveRecord::Migration[6.0] - def change - # Use Active Record's configured type for primary and foreign keys - primary_key_type, foreign_key_type = primary_and_foreign_key_types - - create_table :action_text_rich_texts, id: primary_key_type do |t| - t.string :name, null: false - t.text :body, size: :long - t.references :record, null: false, polymorphic: true, index: false, type: foreign_key_type - - t.timestamps - - t.index [ :record_type, :record_id, :name ], name: "index_action_text_rich_texts_uniqueness", unique: true - end - end - - private - def primary_and_foreign_key_types - config = Rails.configuration.generators - setting = config.options[config.orm][:primary_key_type] - primary_key_type = setting || :primary_key - foreign_key_type = setting || :bigint - [ primary_key_type, foreign_key_type ] - end -end diff --git a/db/migrate/20230326154217_add_service_name_to_active_storage_blobs.active_storage.rb b/db/migrate/20230326154217_add_service_name_to_active_storage_blobs.active_storage.rb deleted file mode 100644 index a15c6ce..0000000 --- a/db/migrate/20230326154217_add_service_name_to_active_storage_blobs.active_storage.rb +++ /dev/null @@ -1,22 +0,0 @@ -# This migration comes from active_storage (originally 20190112182829) -class AddServiceNameToActiveStorageBlobs < ActiveRecord::Migration[6.0] - def up - return unless table_exists?(:active_storage_blobs) - - unless column_exists?(:active_storage_blobs, :service_name) - add_column :active_storage_blobs, :service_name, :string - - if configured_service = ActiveStorage::Blob.service.name - ActiveStorage::Blob.unscoped.update_all(service_name: configured_service) - end - - change_column :active_storage_blobs, :service_name, :string, null: false - end - end - - def down - return unless table_exists?(:active_storage_blobs) - - remove_column :active_storage_blobs, :service_name - end -end diff --git a/db/migrate/20230326154218_create_active_storage_variant_records.active_storage.rb b/db/migrate/20230326154218_create_active_storage_variant_records.active_storage.rb deleted file mode 100644 index 94ac83a..0000000 --- a/db/migrate/20230326154218_create_active_storage_variant_records.active_storage.rb +++ /dev/null @@ -1,27 +0,0 @@ -# This migration comes from active_storage (originally 20191206030411) -class CreateActiveStorageVariantRecords < ActiveRecord::Migration[6.0] - def change - return unless table_exists?(:active_storage_blobs) - - # Use Active Record's configured type for primary key - create_table :active_storage_variant_records, id: primary_key_type, if_not_exists: true do |t| - t.belongs_to :blob, null: false, index: false, type: blobs_primary_key_type - t.string :variation_digest, null: false - - t.index %i[ blob_id variation_digest ], name: "index_active_storage_variant_records_uniqueness", unique: true - t.foreign_key :active_storage_blobs, column: :blob_id - end - end - - private - def primary_key_type - config = Rails.configuration.generators - config.options[config.orm][:primary_key_type] || :primary_key - end - - def blobs_primary_key_type - pkey_name = connection.primary_key(:active_storage_blobs) - pkey_column = connection.columns(:active_storage_blobs).find { |c| c.name == pkey_name } - pkey_column.bigint? ? :bigint : pkey_column.type - end -end diff --git a/db/migrate/20230326154219_remove_not_null_on_active_storage_blobs_checksum.active_storage.rb b/db/migrate/20230326154219_remove_not_null_on_active_storage_blobs_checksum.active_storage.rb deleted file mode 100644 index 93c8b85..0000000 --- a/db/migrate/20230326154219_remove_not_null_on_active_storage_blobs_checksum.active_storage.rb +++ /dev/null @@ -1,8 +0,0 @@ -# This migration comes from active_storage (originally 20211119233751) -class RemoveNotNullOnActiveStorageBlobsChecksum < ActiveRecord::Migration[6.0] - def change - return unless table_exists?(:active_storage_blobs) - - change_column_null(:active_storage_blobs, :checksum, true) - end -end diff --git a/db/migrate/20251104171719_create_id_card_benefits_templates.rb b/db/migrate/20251104171719_create_id_card_benefits_templates.rb deleted file mode 100644 index 5d5bf6b..0000000 --- a/db/migrate/20251104171719_create_id_card_benefits_templates.rb +++ /dev/null @@ -1,9 +0,0 @@ -class CreateIdCardBenefitsTemplates < ActiveRecord::Migration[7.2] - def change - create_table :id_card_benefits_templates do |t| - t.string :title - - t.timestamps - end - end -end diff --git a/db/migrate/20251104171752_create_id_card_benefits.rb b/db/migrate/20251104171752_create_id_card_benefits.rb deleted file mode 100644 index 1f98816..0000000 --- a/db/migrate/20251104171752_create_id_card_benefits.rb +++ /dev/null @@ -1,12 +0,0 @@ -class CreateIdCardBenefits < ActiveRecord::Migration[7.2] - def change - create_table :id_card_benefits do |t| - t.string :benefit_desc - t.string :benefit - t.integer :sequence - t.references :id_card_benefits_template, null: false, foreign_key: true - - t.timestamps - end - end -end diff --git a/db/migrate/20251202140122_create_employers.rb b/db/migrate/20251202140122_create_employers.rb index 052aa7d..019bdc2 100644 --- a/db/migrate/20251202140122_create_employers.rb +++ b/db/migrate/20251202140122_create_employers.rb @@ -2,24 +2,14 @@ class CreateEmployers < ActiveRecord::Migration[7.2] def change create_table :employers do |t| t.string :name - t.string :id_card_display_name t.string :slug t.string :pl_plan_key t.integer :company_pb_entity_key t.integer :plan_id t.string :group_number - t.string :rx_group_number t.string :effective_date - t.string :employer_logo_filename - t.string :network_provider - t.string :default_network_logo - t.string :single_card_template - t.string :multiple_card_template t.boolean :active, default: false - - - t.timestamps end end diff --git a/db/migrate/20251202142443_create_plans.rb b/db/migrate/20251202142443_create_plans.rb deleted file mode 100644 index 5b19fd7..0000000 --- a/db/migrate/20251202142443_create_plans.rb +++ /dev/null @@ -1,11 +0,0 @@ -class CreatePlans < ActiveRecord::Migration[7.2] - def change - create_table :plans do |t| - t.string :title - t.integer :pb_product_key - t.references :employer, null: false, foreign_key: true - - t.timestamps - end - end -end diff --git a/db/migrate/20251202142512_create_plan_benefits.rb b/db/migrate/20251202142512_create_plan_benefits.rb deleted file mode 100644 index 9574860..0000000 --- a/db/migrate/20251202142512_create_plan_benefits.rb +++ /dev/null @@ -1,12 +0,0 @@ -class CreatePlanBenefits < ActiveRecord::Migration[7.2] - def change - create_table :plan_benefits do |t| - t.string :benefit_desc - t.string :benefit - t.integer :sequence - t.references :plan, null: false, foreign_key: true - - t.timestamps - end - end -end diff --git a/db/migrate/20260113144134_create_card_providers.rb b/db/migrate/20251202144134_create_id_card_provider_sections.rb similarity index 89% rename from db/migrate/20260113144134_create_card_providers.rb rename to db/migrate/20251202144134_create_id_card_provider_sections.rb index d72bd1d..f03e3fe 100644 --- a/db/migrate/20260113144134_create_card_providers.rb +++ b/db/migrate/20251202144134_create_id_card_provider_sections.rb @@ -1,6 +1,7 @@ -class CreateCardProviders < ActiveRecord::Migration[7.2] +class CreateIdCardProviderSections < ActiveRecord::Migration[7.2] def change - create_table :card_providers do |t| + create_table :id_card_provider_sections do |t| + t.string :title t.string :provider_code t.string :provider_line_1 t.string :provider_line_2 diff --git a/db/migrate/20260113152220_create_card_rxes.rb b/db/migrate/20251202152220_create_id_card_rx_sections.rb similarity index 56% rename from db/migrate/20260113152220_create_card_rxes.rb rename to db/migrate/20251202152220_create_id_card_rx_sections.rb index 6f83b1f..6f01e46 100644 --- a/db/migrate/20260113152220_create_card_rxes.rb +++ b/db/migrate/20251202152220_create_id_card_rx_sections.rb @@ -1,6 +1,6 @@ -class CreateCardRxes < ActiveRecord::Migration[7.2] +class CreateIdCardRxSections < ActiveRecord::Migration[7.2] def change - create_table :card_rxes do |t| + create_table :id_card_rx_sections do |t| t.string :help_desk t.string :customer_service t.string :web_url diff --git a/db/migrate/20251205145750_create_card_logo_files.rb b/db/migrate/20251203091559_create_id_card_network_logos.rb similarity index 55% rename from db/migrate/20251205145750_create_card_logo_files.rb rename to db/migrate/20251203091559_create_id_card_network_logos.rb index 8278732..b6dbe5e 100644 --- a/db/migrate/20251205145750_create_card_logo_files.rb +++ b/db/migrate/20251203091559_create_id_card_network_logos.rb @@ -1,10 +1,10 @@ -class CreateCardLogoFiles < ActiveRecord::Migration[7.2] +class CreateIdCardNetworkLogos < ActiveRecord::Migration[7.2] def change - create_table :card_logo_files do |t| + create_table :id_card_network_logos do |t| t.string :filename t.binary :image_data t.string :content_type - t.string :logo_type + t.float :aspect_ratio t.boolean :active, default: false t.timestamps diff --git a/db/migrate/20251203145750_create_id_card_employer_logos.rb b/db/migrate/20251203145750_create_id_card_employer_logos.rb new file mode 100644 index 0000000..14541a6 --- /dev/null +++ b/db/migrate/20251203145750_create_id_card_employer_logos.rb @@ -0,0 +1,13 @@ +class CreateIdCardEmployerLogos < ActiveRecord::Migration[7.2] + def change + create_table :id_card_employer_logos do |t| + t.string :filename + t.binary :image_data + t.string :content_type + t.float :aspect_ratio + t.boolean :active, default: false + + t.timestamps + end + end +end diff --git a/db/migrate/20251204041154_create_id_card_setups.rb b/db/migrate/20251204041154_create_id_card_setups.rb new file mode 100644 index 0000000..adcca2a --- /dev/null +++ b/db/migrate/20251204041154_create_id_card_setups.rb @@ -0,0 +1,18 @@ +class CreateIdCardSetups < ActiveRecord::Migration[7.2] + def change + create_table :id_card_setups do |t| + t.string :print_name + t.string :network_provider + t.string :card_template + t.string :rx_group_number + t.boolean :active, default: false + t.belongs_to :employer, null: false, foreign_key: true + t.belongs_to :id_card_employer_logo, null: true, foreign_key: true + t.belongs_to :id_card_network_logo, null: true, foreign_key: true + t.belongs_to :id_card_provider_section, null: false, foreign_key: true + t.belongs_to :id_card_rx_section, null: false, foreign_key: true + + t.timestamps + end + end +end diff --git a/db/migrate/20251204142443_create_id_card_plans.rb b/db/migrate/20251204142443_create_id_card_plans.rb new file mode 100644 index 0000000..209d452 --- /dev/null +++ b/db/migrate/20251204142443_create_id_card_plans.rb @@ -0,0 +1,12 @@ +class CreateIdCardPlans < ActiveRecord::Migration[7.2] + def change + create_table :id_card_plans do |t| + t.string :title + t.integer :pb_product_key + t.string :pl_plan_key + t.belongs_to :id_card_setup, null: true, foreign_key: true + + t.timestamps + end + end +end diff --git a/db/migrate/20251204142512_create_id_card_plan_benefits.rb b/db/migrate/20251204142512_create_id_card_plan_benefits.rb new file mode 100644 index 0000000..418d47d --- /dev/null +++ b/db/migrate/20251204142512_create_id_card_plan_benefits.rb @@ -0,0 +1,12 @@ +class CreateIdCardPlanBenefits < ActiveRecord::Migration[7.2] + def change + create_table :id_card_plan_benefits do |t| + t.string :benefit_desc + t.string :benefit + t.integer :sequence + t.belongs_to :id_card_plan, null: false, foreign_key: true + + t.timestamps + end + end +end diff --git a/db/migrate/20251205091559_create_network_logos.rb b/db/migrate/20251205091559_create_network_logos.rb deleted file mode 100644 index 9fa3a67..0000000 --- a/db/migrate/20251205091559_create_network_logos.rb +++ /dev/null @@ -1,12 +0,0 @@ -class CreateNetworkLogos < ActiveRecord::Migration[7.0] - def change - create_table :alternate_network_logos do |t| - t.string :network_logo_filename - t.string :exception_type - t.string :exception_value - t.belongs_to :employer, null: false, foreign_key: true - - t.timestamps - end - end -end diff --git a/db/migrate/20251206190810_create_sample_id_cards.rb b/db/migrate/20251206190810_create_id_card_print_data.rb similarity index 92% rename from db/migrate/20251206190810_create_sample_id_cards.rb rename to db/migrate/20251206190810_create_id_card_print_data.rb index 47cc635..f0311df 100644 --- a/db/migrate/20251206190810_create_sample_id_cards.rb +++ b/db/migrate/20251206190810_create_id_card_print_data.rb @@ -1,10 +1,12 @@ -class CreateSampleIdCards < ActiveRecord::Migration[7.0] +class CreateIdCardPrintData < ActiveRecord::Migration[7.0] def change - create_table :sample_id_cards do |t| + create_table :id_card_print_data do |t| t.string :full_name + t.string :full_name_last_name_first t.string :family_id t.string :primary_mb_member_key t.string :employer_name + t.string :pl_plan_key t.string :group_number t.string :rx_group t.string :medical_eff_date diff --git a/db/migrate/20260107180344_create_employer_card_logos.rb b/db/migrate/20260107180344_create_employer_card_logos.rb deleted file mode 100644 index c7bd394..0000000 --- a/db/migrate/20260107180344_create_employer_card_logos.rb +++ /dev/null @@ -1,11 +0,0 @@ -class CreateEmployerCardLogos < ActiveRecord::Migration[7.2] - def change - create_table :employer_card_logos do |t| - t.references :employer, null: false, foreign_key: true - t.references :card_logo_file, null: false, foreign_key: true - t.string :logo_type - - t.timestamps - end - end -end diff --git a/db/migrate/20260113152431_add_card_rx_to_employers.rb b/db/migrate/20260113152431_add_card_rx_to_employers.rb deleted file mode 100644 index f74259d..0000000 --- a/db/migrate/20260113152431_add_card_rx_to_employers.rb +++ /dev/null @@ -1,6 +0,0 @@ -class AddCardRxToEmployers < ActiveRecord::Migration[7.2] - def change - add_reference :employers, :card_provider, null: true, foreign_key: true - add_reference :employers, :card_rx, null: true, foreign_key: true - end -end diff --git a/db/migrate/20260114183848_create_members.rb b/db/migrate/20260114183848_create_members.rb index 414baac..73f929e 100644 --- a/db/migrate/20260114183848_create_members.rb +++ b/db/migrate/20260114183848_create_members.rb @@ -8,7 +8,7 @@ class CreateMembers < ActiveRecord::Migration[7.2] t.integer :pb_entity_key t.integer :pl_plan_key t.belongs_to :employer, foreign_key: true - t.belongs_to :plan, null: true, foreign_key: true + t.belongs_to :id_card_plan, null: true, foreign_key: true t.timestamps end diff --git a/db/migrate/20260116181849_create_card_exceptions.rb b/db/migrate/20260116181849_create_card_exceptions.rb deleted file mode 100644 index dcca654..0000000 --- a/db/migrate/20260116181849_create_card_exceptions.rb +++ /dev/null @@ -1,11 +0,0 @@ -class CreateCardExceptions < ActiveRecord::Migration[7.2] - def change - create_table :card_exceptions do |t| - t.string :type - t.string :value - t.belongs_to :employer, null: false, foreign_key: true - - t.timestamps - end - end -end diff --git a/db/migrate/20260116181849_create_id_card_exceptions.rb b/db/migrate/20260116181849_create_id_card_exceptions.rb new file mode 100644 index 0000000..0f508f9 --- /dev/null +++ b/db/migrate/20260116181849_create_id_card_exceptions.rb @@ -0,0 +1,11 @@ +class CreateIdCardExceptions < ActiveRecord::Migration[7.2] + def change + create_table :id_card_exceptions do |t| + t.string :type + t.string :value + t.belongs_to :id_card_setup, null: false, foreign_key: true + + t.timestamps + end + end +end diff --git a/db/migrate/20260116182836_create_card_exception_items.rb b/db/migrate/20260116182836_create_card_exception_items.rb deleted file mode 100644 index b830c78..0000000 --- a/db/migrate/20260116182836_create_card_exception_items.rb +++ /dev/null @@ -1,13 +0,0 @@ -class CreateCardExceptionItems < ActiveRecord::Migration[7.2] - def change - create_table :card_exception_items do |t| - t.string :field_name - t.string :field_value - t.belongs_to :card_exception, null: false, foreign_key: true - t.belongs_to :card_logo_file, null: true, foreign_key: true - t.belongs_to :card_provider, null: true, foreign_key: true - - t.timestamps - end - end -end diff --git a/db/migrate/20260116182836_create_id_card_exception_items.rb b/db/migrate/20260116182836_create_id_card_exception_items.rb new file mode 100644 index 0000000..39e233e --- /dev/null +++ b/db/migrate/20260116182836_create_id_card_exception_items.rb @@ -0,0 +1,13 @@ +class CreateIdCardExceptionItems < ActiveRecord::Migration[7.2] + def change + create_table :id_card_exception_items do |t| + t.string :field_name + t.string :field_value + t.belongs_to :id_card_exception, null: false, foreign_key: true + t.belongs_to :id_card_network_logo, null: true, foreign_key: true + t.belongs_to :id_card_provider_section, null: true, foreign_key: true + + t.timestamps + end + end +end diff --git a/db/migrate/20260206202113_add_aspect_ratio_to_card_logo_files.rb b/db/migrate/20260206202113_add_aspect_ratio_to_card_logo_files.rb deleted file mode 100644 index c40a647..0000000 --- a/db/migrate/20260206202113_add_aspect_ratio_to_card_logo_files.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddAspectRatioToCardLogoFiles < ActiveRecord::Migration[7.2] - def change - add_column :card_logo_files, :aspect_ratio, :float - end -end diff --git a/db/migrate/20260223223545_add_last_name_to_sample_id_card.rb b/db/migrate/20260223223545_add_last_name_to_sample_id_card.rb deleted file mode 100644 index 5659ade..0000000 --- a/db/migrate/20260223223545_add_last_name_to_sample_id_card.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddLastNameToSampleIdCard < ActiveRecord::Migration[7.2] - def change - add_column :sample_id_cards, :name, :string - end -end diff --git a/db/migrate/20260227192437_rename_card_field_exceptions_to_card_exception_items.rb b/db/migrate/20260227192437_rename_card_field_exceptions_to_card_exception_items.rb deleted file mode 100644 index 5bee1e2..0000000 --- a/db/migrate/20260227192437_rename_card_field_exceptions_to_card_exception_items.rb +++ /dev/null @@ -1,5 +0,0 @@ -class RenameCardFieldExceptionsToCardExceptionItems < ActiveRecord::Migration[7.2] - def change - rename_table :card_field_exceptions, :card_exception_items - end -end diff --git a/db/migrate/20260227213305_add_title_to_card_providers.rb b/db/migrate/20260227213305_add_title_to_card_providers.rb deleted file mode 100644 index 0fcb52f..0000000 --- a/db/migrate/20260227213305_add_title_to_card_providers.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddTitleToCardProviders < ActiveRecord::Migration[7.2] - def change - add_column :card_providers, :title, :string - end -end diff --git a/db/schema.rb b/db/schema.rb index 0e20515..0d7dea3 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,230 +10,89 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.2].define(version: 2026_02_27_213305) do - create_table "action_text_rich_texts", force: :cascade do |t| - t.string "name", null: false - t.text "body" - t.string "record_type", null: false - t.bigint "record_id", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.index ["record_type", "record_id", "name"], name: "index_action_text_rich_texts_uniqueness", unique: true - end - - create_table "active_storage_attachments", force: :cascade do |t| - t.string "name", null: false - t.string "record_type", null: false - t.bigint "record_id", null: false - t.bigint "blob_id", null: false - t.datetime "created_at", null: false - t.index ["blob_id"], name: "index_active_storage_attachments_on_blob_id" - t.index ["record_type", "record_id", "name", "blob_id"], name: "index_active_storage_attachments_uniqueness", unique: true - end - - create_table "active_storage_blobs", force: :cascade do |t| - t.string "key", null: false - t.string "filename", null: false - t.string "content_type" - t.text "metadata" - t.string "service_name", null: false - t.bigint "byte_size", null: false - t.string "checksum" - t.datetime "created_at", null: false - t.index ["key"], name: "index_active_storage_blobs_on_key", unique: true - end - - create_table "active_storage_variant_records", force: :cascade do |t| - t.bigint "blob_id", null: false - t.string "variation_digest", null: false - t.index ["blob_id", "variation_digest"], name: "index_active_storage_variant_records_uniqueness", unique: true - end - - create_table "alternate_network_logos", force: :cascade do |t| - t.string "network_logo_filename" - t.string "exception_type" - t.string "exception_value" - t.bigint "employer_id", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.index ["employer_id"], name: "index_alternate_network_logos_on_employer_id" - end - - create_table "card_exception_items", force: :cascade do |t| - t.string "field_name" - t.string "field_value" - t.bigint "card_logo_file_id" - t.bigint "card_provider_id" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.index ["card_logo_file_id"], name: "index_card_exception_items_on_card_logo_file_id" - t.index ["card_provider_id"], name: "index_card_exception_items_on_card_provider_id" - end - - create_table "card_exceptions", force: :cascade do |t| - t.string "type" - t.string "value" - t.bigint "employer_id", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.index ["employer_id"], name: "index_card_exceptions_on_employer_id" - end - - create_table "card_logo_files", force: :cascade do |t| - t.string "filename" - t.binary "image_data" - t.string "content_type" - t.string "logo_type" - t.boolean "active", default: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.float "aspect_ratio" - end - - create_table "card_providers", force: :cascade do |t| - t.string "provider_code" - t.string "provider_line_1" - t.string "provider_line_2" - t.string "provider_line_3" - t.string "provider_line_4" - t.string "provider_line_5" - t.string "provider_line_6" - t.string "provider_line_7" - t.string "provider_line_8" - t.string "provider_line_9" - t.string "provider_line_10" - t.string "provider_line_11" - t.string "provider_line_12" - t.string "claim_to_1" - t.string "claim_to_2" - t.string "claim_to_3" - t.string "claim_to_4" - t.string "claim_to_5" - t.string "claim_to_6" - t.string "claim_to_7" - t.string "claim_to_8" - t.string "claim_to_9" - t.string "claim_to_10" - t.string "claim_to_11" - t.string "claim_to_12" - t.string "mail_to" - t.string "mail_to_2" - t.string "contact_line_1" - t.string "contact_line_2" - t.string "contact_line_3" - t.string "group_number" - t.string "rx_group_id" - t.string "rx_contact" - t.string "provider_lookup_1" - t.string "provider_lookup_2" - t.string "precert_1" - t.string "precert_2" - t.string "precert_3" - t.string "precert_4" - t.string "precert_5" - t.string "precert_6" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.string "title" - end - - create_table "card_rxes", force: :cascade do |t| - t.string "help_desk" - t.string "customer_service" - t.string "web_url" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - end - - create_table "employer_card_logos", force: :cascade do |t| - t.bigint "employer_id", null: false - t.bigint "card_logo_file_id", null: false - t.string "logo_type" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.index ["card_logo_file_id"], name: "index_employer_card_logos_on_card_logo_file_id" - t.index ["employer_id"], name: "index_employer_card_logos_on_employer_id" - end - +ActiveRecord::Schema[7.2].define(version: 2026_01_16_182836) do create_table "employers", force: :cascade do |t| t.string "name" - t.string "id_card_display_name" t.string "slug" t.string "pl_plan_key" t.integer "company_pb_entity_key" t.integer "plan_id" t.string "group_number" - t.string "rx_group_number" t.string "effective_date" - t.string "employer_logo_filename" - t.string "network_provider" - t.string "default_network_logo" - t.string "single_card_template" - t.string "multiple_card_template" t.boolean "active", default: false t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.bigint "card_provider_id" - t.bigint "card_rx_id" - t.index ["card_provider_id"], name: "index_employers_on_card_provider_id" - t.index ["card_rx_id"], name: "index_employers_on_card_rx_id" end - create_table "id_card_benefits", force: :cascade do |t| + create_table "id_card_employer_logos", force: :cascade do |t| + t.string "filename" + t.binary "image_data" + t.string "content_type" + t.float "aspect_ratio" + t.boolean "active", default: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "id_card_exception_items", force: :cascade do |t| + t.string "field_name" + t.string "field_value" + t.bigint "id_card_exception_id", null: false + t.bigint "id_card_network_logo_id" + t.bigint "id_card_provider_section_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["id_card_exception_id"], name: "index_id_card_exception_items_on_id_card_exception_id" + t.index ["id_card_network_logo_id"], name: "index_id_card_exception_items_on_id_card_network_logo_id" + t.index ["id_card_provider_section_id"], name: "index_id_card_exception_items_on_id_card_provider_section_id" + end + + create_table "id_card_exceptions", force: :cascade do |t| + t.string "type" + t.string "value" + t.bigint "id_card_setup_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["id_card_setup_id"], name: "index_id_card_exceptions_on_id_card_setup_id" + end + + create_table "id_card_network_logos", force: :cascade do |t| + t.string "filename" + t.binary "image_data" + t.string "content_type" + t.float "aspect_ratio" + t.boolean "active", default: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "id_card_plan_benefits", force: :cascade do |t| t.string "benefit_desc" t.string "benefit" t.integer "sequence" - t.bigint "id_card_benefits_template_id", null: false + t.bigint "id_card_plan_id", null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.index ["id_card_benefits_template_id"], name: "index_id_card_benefits_on_id_card_benefits_template_id" + t.index ["id_card_plan_id"], name: "index_id_card_plan_benefits_on_id_card_plan_id" end - create_table "id_card_benefits_templates", force: :cascade do |t| - t.string "title" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - end - - create_table "members", force: :cascade do |t| - t.string "name" - t.string "id_card_display_name" - t.string "family_id" - t.integer "mb_member_key" - t.integer "pb_entity_key" - t.integer "pl_plan_key" - t.bigint "employer_id" - t.bigint "plan_id" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.index ["employer_id"], name: "index_members_on_employer_id" - t.index ["plan_id"], name: "index_members_on_plan_id" - end - - create_table "plan_benefits", force: :cascade do |t| - t.string "benefit_desc" - t.string "benefit" - t.integer "sequence" - t.bigint "plan_id", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.index ["plan_id"], name: "index_plan_benefits_on_plan_id" - end - - create_table "plans", force: :cascade do |t| + create_table "id_card_plans", force: :cascade do |t| t.string "title" t.integer "pb_product_key" - t.bigint "employer_id", null: false + t.string "pl_plan_key" + t.bigint "id_card_setup_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.index ["employer_id"], name: "index_plans_on_employer_id" + t.index ["id_card_setup_id"], name: "index_id_card_plans_on_id_card_setup_id" end - create_table "sample_id_cards", force: :cascade do |t| + create_table "id_card_print_data", force: :cascade do |t| t.string "full_name" + t.string "full_name_last_name_first" t.string "family_id" t.string "primary_mb_member_key" t.string "employer_name" + t.string "pl_plan_key" t.string "group_number" t.string "rx_group" t.string "medical_eff_date" @@ -303,22 +162,109 @@ ActiveRecord::Schema[7.2].define(version: 2026_02_27_213305) do t.string "benefit_14" t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.string "name" end - add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id" - add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id" - add_foreign_key "alternate_network_logos", "employers" - add_foreign_key "card_exception_items", "card_logo_files" - add_foreign_key "card_exception_items", "card_providers" - add_foreign_key "card_exceptions", "employers" - add_foreign_key "employer_card_logos", "card_logo_files" - add_foreign_key "employer_card_logos", "employers" - add_foreign_key "employers", "card_providers" - add_foreign_key "employers", "card_rxes" - add_foreign_key "id_card_benefits", "id_card_benefits_templates" + create_table "id_card_provider_sections", force: :cascade do |t| + t.string "title" + t.string "provider_code" + t.string "provider_line_1" + t.string "provider_line_2" + t.string "provider_line_3" + t.string "provider_line_4" + t.string "provider_line_5" + t.string "provider_line_6" + t.string "provider_line_7" + t.string "provider_line_8" + t.string "provider_line_9" + t.string "provider_line_10" + t.string "provider_line_11" + t.string "provider_line_12" + t.string "claim_to_1" + t.string "claim_to_2" + t.string "claim_to_3" + t.string "claim_to_4" + t.string "claim_to_5" + t.string "claim_to_6" + t.string "claim_to_7" + t.string "claim_to_8" + t.string "claim_to_9" + t.string "claim_to_10" + t.string "claim_to_11" + t.string "claim_to_12" + t.string "mail_to" + t.string "mail_to_2" + t.string "contact_line_1" + t.string "contact_line_2" + t.string "contact_line_3" + t.string "group_number" + t.string "rx_group_id" + t.string "rx_contact" + t.string "provider_lookup_1" + t.string "provider_lookup_2" + t.string "precert_1" + t.string "precert_2" + t.string "precert_3" + t.string "precert_4" + t.string "precert_5" + t.string "precert_6" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "id_card_rx_sections", force: :cascade do |t| + t.string "help_desk" + t.string "customer_service" + t.string "web_url" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "id_card_setups", force: :cascade do |t| + t.string "print_name" + t.string "network_provider" + t.string "card_template" + t.string "rx_group_number" + t.boolean "active", default: false + t.bigint "employer_id", null: false + t.bigint "id_card_employer_logo_id" + t.bigint "id_card_network_logo_id" + t.bigint "id_card_provider_section_id", null: false + t.bigint "id_card_rx_section_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["employer_id"], name: "index_id_card_setups_on_employer_id" + t.index ["id_card_employer_logo_id"], name: "index_id_card_setups_on_id_card_employer_logo_id" + t.index ["id_card_network_logo_id"], name: "index_id_card_setups_on_id_card_network_logo_id" + t.index ["id_card_provider_section_id"], name: "index_id_card_setups_on_id_card_provider_section_id" + t.index ["id_card_rx_section_id"], name: "index_id_card_setups_on_id_card_rx_section_id" + end + + create_table "members", force: :cascade do |t| + t.string "name" + t.string "id_card_display_name" + t.string "family_id" + t.integer "mb_member_key" + t.integer "pb_entity_key" + t.integer "pl_plan_key" + t.bigint "employer_id" + t.bigint "id_card_plan_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["employer_id"], name: "index_members_on_employer_id" + t.index ["id_card_plan_id"], name: "index_members_on_id_card_plan_id" + end + + add_foreign_key "id_card_exception_items", "id_card_exceptions" + add_foreign_key "id_card_exception_items", "id_card_network_logos" + add_foreign_key "id_card_exception_items", "id_card_provider_sections" + add_foreign_key "id_card_exceptions", "id_card_setups" + add_foreign_key "id_card_plan_benefits", "id_card_plans" + add_foreign_key "id_card_plans", "id_card_setups" + add_foreign_key "id_card_setups", "employers" + add_foreign_key "id_card_setups", "id_card_employer_logos" + add_foreign_key "id_card_setups", "id_card_network_logos" + add_foreign_key "id_card_setups", "id_card_provider_sections" + add_foreign_key "id_card_setups", "id_card_rx_sections" add_foreign_key "members", "employers" - add_foreign_key "members", "plans" - add_foreign_key "plan_benefits", "plans" - add_foreign_key "plans", "employers" + add_foreign_key "members", "id_card_plans" end diff --git a/init.sql b/init.sql index 9bfa0d9..1f307cb 100644 --- a/init.sql +++ b/init.sql @@ -1,5 +1,5 @@ -IF NOT EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'britton_dev_tools_dev') +IF NOT EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'britton_baclight_dev') BEGIN - CREATE DATABASE [britton_dev_tools_dev]; - CREATE DATABASE [britton_dev_tools_test]; + CREATE DATABASE [britton_baclight_dev]; + CREATE DATABASE [britton_baclight_test]; END; \ No newline at end of file From 8ecabf60ff34bc24a7e419559363769a8dd44777 Mon Sep 17 00:00:00 2001 From: Jason Jordan Date: Thu, 5 Mar 2026 14:40:53 -0500 Subject: [PATCH 04/25] self merge conflicts are fun --- app/controllers/id_card/setup_controller.rb | 2 +- app/javascript/controllers/logo_upload_controller.js | 9 +++------ app/views/employers/show.html.erb | 4 +++- config/routes.rb | 2 +- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/app/controllers/id_card/setup_controller.rb b/app/controllers/id_card/setup_controller.rb index 906b554..c611b35 100644 --- a/app/controllers/id_card/setup_controller.rb +++ b/app/controllers/id_card/setup_controller.rb @@ -1,7 +1,7 @@ class IdCard::SetupController < ApplicationController def new - @employer = Employer.find_by(slug: params[:id]) + @employer = Employer.find_by(slug: params[:employer]) @setup = @employer.id_card_setup.new render :new end diff --git a/app/javascript/controllers/logo_upload_controller.js b/app/javascript/controllers/logo_upload_controller.js index 052810b..e6dbae4 100644 --- a/app/javascript/controllers/logo_upload_controller.js +++ b/app/javascript/controllers/logo_upload_controller.js @@ -4,7 +4,7 @@ export default class extends Controller { static values = { logoType: String, employerName: String - } + } static targets = ["preview", "previewContainer", "logoSelect", "logofield", "initialLogoFile"]; async connect() { @@ -39,12 +39,10 @@ export default class extends Controller { newFileName = this.determineEmployerFilename(file) file.name = newFileName } - + this.previewFile(file); this.uploadLogoToServer(file); - - - + this.logofieldTarget.value = newFileName; } @@ -122,4 +120,3 @@ export default class extends Controller { }); } } - diff --git a/app/views/employers/show.html.erb b/app/views/employers/show.html.erb index c8ea842..8e25f44 100644 --- a/app/views/employers/show.html.erb +++ b/app/views/employers/show.html.erb @@ -54,9 +54,11 @@
-

Actions

+

ID Card Actions

+ <%= link_to "Setup", new_id_card_setup_path(employer: @employer.slug), data: { turbo: false }, class: "flex justify-center items-center w-2/3 cursor-pointer bg-atmosphere hover:bg-deepcove border-2 border-atmosphere text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %> + <%= link_to 'Generate Sample Cards', generate_sample_id_card_print_data_path(employer_slug: @employer.slug ), data: { turbo: false }, class: "flex justify-center items-center w-2/3 cursor-pointer bg-atmosphere hover:bg-deepcove border-2 border-atmosphere text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %> <%= link_to 'Generate Group Cards (for print)', generate_print_id_card_print_data_path(employer_slug: @employer.slug ),data: { turbo: false }, class: "flex justify-center items-center w-2/3 #{@employer.active ? "" : "pointer-events-none opacity-50 cursor-not-allowed"} bg-atmosphere hover:bg-deepcove border-2 border-atmosphere text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %> <%= link_to 'Generate Group Cards (for display)', generate_mobile_display_id_card_print_data_path(employer_slug: @employer.slug ), data: { turbo: false }, class: "flex justify-center items-center w-2/3 #{@employer.active ? "" : "pointer-events-none opacity-50 cursor-not-allowed"} bg-atmosphere hover:bg-deepcove border-2 border-atmosphere text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %> diff --git a/config/routes.rb b/config/routes.rb index cb03dbe..f05a4dc 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,7 +2,7 @@ Rails.application.routes.draw do namespace :id_card do - resources :setup, constraints: { id: /.*/ } + resources :setup resources :rx_sections resources :provider_sections resources :employer_logos do From 6a068243f437bc9ce409b34d9d568fce5263a320 Mon Sep 17 00:00:00 2001 From: Jason Jordan Date: Fri, 6 Mar 2026 10:56:20 -0500 Subject: [PATCH 05/25] Employer table broken up and new idcard module setup --- app/controllers/employers_controller.rb | 24 +- .../id_card/employer_logos_controller.rb | 109 +++-- app/controllers/id_card/setup_controller.rb | 462 +++++++++--------- .../controllers/general_form_controller.js | 84 ++-- .../controllers/hello_controller.js | 32 +- .../controllers/logo_upload_controller.js | 66 ++- app/models/employer.rb | 2 +- app/models/id_card/employer_logo.rb | 20 +- app/models/id_card/exception.rb | 16 +- app/models/id_card/exception_item.rb | 30 +- app/models/id_card/network_logo.rb | 14 +- app/models/id_card/plan.rb | 50 +- app/models/id_card/plan_benefit.rb | 8 +- app/models/id_card/print_data.rb | 17 +- app/models/id_card/provider_section.rb | 6 +- app/models/id_card/rx_section.rb | 6 +- app/models/id_card/setup.rb | 46 +- app/queries/call_stored_proc.rb | 28 +- .../map_plans_information.rb | 16 +- app/services/image_processor.rb | 2 +- app/services/sample_card/data_formatter.rb | 4 +- .../_alt_network_logo_fields.html.erb | 62 +-- .../{id_cards => id_card}/setup/edit.html.erb | 0 .../{id_cards => id_card}/setup/new.html.erb | 11 +- compose.yaml | 2 + .../20251204041154_create_id_card_setups.rb | 8 +- .../20251204142443_create_id_card_plans.rb | 3 +- ...1204142512_create_id_card_plan_benefits.rb | 2 +- ...0260116181849_create_id_card_exceptions.rb | 2 +- ...16182836_create_id_card_exception_items.rb | 6 +- db/schema.rb | 61 +-- 31 files changed, 628 insertions(+), 571 deletions(-) rename app/views/{id_cards => id_card}/setup/edit.html.erb (100%) rename app/views/{id_cards => id_card}/setup/new.html.erb (78%) diff --git a/app/controllers/employers_controller.rb b/app/controllers/employers_controller.rb index d070121..34b18ab 100644 --- a/app/controllers/employers_controller.rb +++ b/app/controllers/employers_controller.rb @@ -1,4 +1,6 @@ class EmployersController < ApplicationController + + # View Methods def index @employers = Employer.all end @@ -12,16 +14,6 @@ class EmployersController < ApplicationController render :new end - def import - word_doc = params[:employer][:import_from_word] - if word_doc.present? && word_doc.is_a?(ActionDispatch::Http::UploadedFile) - @employer = BenefitsWordDocProcessor.new(word_doc.tempfile).call - else - @employer = Employer.new - end - render :new - end - # def import_old # word_doc = params[:employer][:import_from_word] # @plan_templates = IdCardBenefitsTemplate.where.not(title: "BLANK") @@ -74,6 +66,18 @@ class EmployersController < ApplicationController # redirect_to resources_url, notice: 'Resource was successfully destroyed.' end + # API Methods + + def import + word_doc = params[:employer][:import_from_word] + if word_doc.present? && word_doc.is_a?(ActionDispatch::Http::UploadedFile) + @employer = BenefitsWordDocProcessor.new(word_doc.tempfile).call + else + @employer = Employer.new + end + render :new + end + private # def process_logos(employer_setup_process_params) diff --git a/app/controllers/id_card/employer_logos_controller.rb b/app/controllers/id_card/employer_logos_controller.rb index 18d8f6f..43cce98 100644 --- a/app/controllers/id_card/employer_logos_controller.rb +++ b/app/controllers/id_card/employer_logos_controller.rb @@ -1,56 +1,61 @@ -class IdCard::EmployerLogosController < ApplicationController +module IdCard + class EmployerLogosController < ApplicationController - def index - end - - def show - end - - def image - logo_file = IdCard::EmployerLogo.find(params[:id]) - puts params[:id] - logo_binary = logo_file.image_data - logo_filename = logo_file.filename - - send_data logo_binary, - filename: logo_filename, - disposition: 'inline' - end - - def new - end - - def create - file = card_logo_file_params["logo_file"] - if file.present? && file.is_a?(ActionDispatch::Http::UploadedFile) - filename = file.original_filename - # binary_data = file.read - binary_data = File.binread(file) - meme_type = Marcel::MimeType.for(file) - - employerlogo = IdCard::EmployerLogo.create( - filename: filename, - image_data: binary_data, - content_type: meme_type - ) - - render json: employerlogo, only: [:id], status: :ok + # View Methods + def index end + + def show + end + + def new + end + + def create + file = logo_params["logo_file"] + if file.present? && file.is_a?(ActionDispatch::Http::UploadedFile) + filename = file.original_filename + # binary_data = file.read + binary_data = File.binread(file) + meme_type = Marcel::MimeType.for(file) + + employerlogo = IdCard::EmployerLogo.create( + filename: filename, + image_data: binary_data, + content_type: meme_type + ) + + render json: employerlogo, only: [:id], status: :ok + end + end + + def edit + end + + def update + end + + def destroy + end + + # API Methods + + def image + logo_file = IdCard::EmployerLogo.find(params[:id]) + puts params[:id] + logo_binary = logo_file.image_data + logo_filename = logo_file.filename + + send_data logo_binary, + filename: logo_filename, + disposition: 'inline' + end + + private + + def logo_params + params.require(:id_card_employer_logo).permit(:logo_file) + end + end - - def edit - end - - def update - end - - def destroy - end - - private - - def card_logo_file_params - params.require(:card_logo_file).permit(:logo_file, :logo_type) - end - end \ No newline at end of file diff --git a/app/controllers/id_card/setup_controller.rb b/app/controllers/id_card/setup_controller.rb index c611b35..c462e23 100644 --- a/app/controllers/id_card/setup_controller.rb +++ b/app/controllers/id_card/setup_controller.rb @@ -1,236 +1,242 @@ -class IdCard::SetupController < ApplicationController +module IdCard + class SetupController < ApplicationController - def new - @employer = Employer.find_by(slug: params[:employer]) - @setup = @employer.id_card_setup.new - render :new - end - - def create - employer_params = Employer.permitted_params(params) - puts "---Params---" - puts employer_params - # post_image_processing_params = process_logos(employer_setup_process_params) - @employer = Employer.new(employer_params) - if @employer.save - # update_logos_with_employer_setup_information() - redirect_to employer_path(@employer.slug), notice: 'Employer Saved' - else + # View Methods + def new + @employer = Employer.find_by(slug: params[:employer]) + @setup = @employer.create_id_card_setup render :new end - end - def edit - @employer = Employer.find_by(slug: params[:id]) - render :edit - end - - def update - puts "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" - employer_params = Employer.permitted_params(params) - @employer = Employer.find(params[:id]) - - if @employer.update(employer_params) - puts "sucess" - redirect_to employer_path(@employer.slug), notice: 'Employer was successfully updated.' - else - puts "fail" - render :edit, status: :unprocessable_entity + def create + xyz + employer_params = Employer.permitted_params(params) + puts "---Params---" + puts employer_params + # post_image_processing_params = process_logos(employer_setup_process_params) + @employer = Employer.new(employer_params) + if @employer.save + # update_logos_with_employer_setup_information() + redirect_to employer_path(@employer.slug), notice: 'Employer Saved' + else + render :new + end end + def edit + @employer = Employer.find_by(slug: params[:id]) + render :edit + end + + def update + puts "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + employer_params = Employer.permitted_params(params) + @employer = Employer.find(params[:id]) + + if @employer.update(employer_params) + puts "sucess" + redirect_to employer_path(@employer.slug), notice: 'Employer was successfully updated.' + else + puts "fail" + render :edit, status: :unprocessable_entity + end + + end + + def destroy + # @resource = Resource.find(params[:id]) + # @resource.destroy + # redirect_to resources_url, notice: 'Resource was successfully destroyed.' + end + + # API Methods + + private + + # def process_logos(employer_setup_process_params) + # @uploaded_logos = [] + # employer_logo = employer_setup_process_params["employer_logo"] + # if employer_logo.present? && employer_logo.is_a?(ActionDispatch::Http::UploadedFile) + # filename = employer_logo.original_filename + # binary_data = employer_logo.read + # meme_type = Marcel::MimeType.for(employer_logo) + + # CardLogoFile.create( + # filename: filename, + # image_data: binary_data, + # content_type: meme_type, + # logo_type: "employer" + # ) + + # @uploaded_logos.push(filename) + # employer_setup_process_params["employer_logo"] = filename + # end + + # network_logos = employer_setup_process_params["alternate_network_logos_attributes"] + # if network_logos.present? + # network_logos.each do |alt| + + # network_logo = alt.last["network_logo"] + # if network_logo.present? && network_logo.is_a?(ActionDispatch::Http::UploadedFile) + # filename = network_logo.original_filename + # binary_data = network_logo.read + # meme_type = Marcel::MimeType.for(network_logo) + + # CardLogoFile.create( + # filename: filename, + # image_data: binary_data, + # content_type: meme_type, + # logo_type: "network" + # ) + + # @uploaded_logos.push(filename) + # end + # alt.last["network_logo"] = @uploaded_logos.last + # end + # end + # employer_setup_process_params + # end + + # def update_logos_with_employer_setup_information() + # @uploaded_logos.each do |logo| + # logo_file = CardLogoFile.find_by(filename: logo) + # if logo_file.present? && @employer.present? + # logo_file.employer_setup_process = @employer + # logo_file.save + # end + # end + + # end + + # def general_information_params + # params.require(:employer_setup_general_information_form).permit( + # :name, + # :employer_logo, + # :group_number, + # :dental, + # :pl_plan_key, + # :effect_date, + # :number_of_plans, + # :network, + # :number_of_additional_network_logos + # ) + # end + + # def plans_params + # params.require(:employer_setup_plans_form).permit( + # plans: permited_plans_keys, + # benefit_descs: benefit_sequence_keys + # ) + # end + + # def network_exceptions_params + # params.require(:employer_setup_network_exceptions_form).permit( + # network_exceptions: [:network_logo, exceptions: [:type, :value]], + # ) + # end + + # def form_for_step + # step_name = @top_form.current_step + # form_method = "EmployerSetup#{step_name.camelize}Form".constantize + # # puts "/////\\\\\\||||||" + # # puts session[:employer_setup_data] + # # puts session[:employer_setup_data]['employer_setup_process_id'] + # puts form_method + # form_method.new(session[:employer_setup_data]['employer_setup_process_id']) + # end + + # def process_step(step_name) + # @form_method = "EmployerSetup#{step_name.camelize}Form".constantize + # session_data_name = "#{step_name}_data" + # # puts "1--------------params----" + # # puts params + # # puts "8--------------session----" + # # puts session[:employer_setup_data] + # employer_setup_process_id = session[:employer_setup_data]['employer_setup_process_id'] + # # puts session[:employer_setup_data] + # puts "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + # puts params + # @form = @form_method.new(employer_setup_process_id, params) + # if @form.pl_plan_key.blank? + # @form.pl_plan_key = session[:employer_setup_data]['pl_plan_key'] + # end + # if @form.valid? && @form.save + # pl_plan_key = @top_form.pl_plan_key || @form.pl_plan_key + # # session[:employer_setup_data].merge!({current_step: step_name, pl_plan_key: pl_plan_key}) + # # form_fields = @form.attributes.merge!(global_params(step_name)) + # # session[:employer_setup_data][session_data_name] = form_fields + # # session[:employer_setup_data].merge!(global_params(step_name)) + # # puts session[:employer_setup_data][session_data_name] + # true + # else + # false + # end + # end + + # def step_params(step_name) + # form_name_sym = "employer_setup_#{step_name}_form".to_sym + # params.require(form_name_sym).permit(@form_method.permitted_params) + # end + + # def global_params(step_name) + # form_name_sym = "employer_setup_#{step_name}_form".to_sym + # params.require(form_name_sym).permit(EmployerSetupForm.permitted_params) + # end + + # def process_step(step_name) + # form_name = "employer_setup_#{step_name}_form".camelize.constantize + # form_params_name = "#{step_name}_params".to_sym + # allowed_params = [:general_information_params, :plans_params, :network_exceptions_params] + # if allowed_params.include?(form_params_name) + # form_params = send(form_params_name) + # @form = form_name.new(form_params) + # if @form.valid? + # session[:employer_setup_data]["#{step_name}_data"] = form_params + # true + # else + # false + # end + # end + # false + # end + + # def employer_setup_params + # params.require(:employer_setup_form).permit( + # :current_step, + # :name, + # :employer_logo, + # :group_number, + # :pl_plan_key, + # :effect_date, + # :number_of_plans, + # :network, + # :number_of_additional_network_logos, + # network_exceptions: [:network_logo, exceptions: [:type, :value]], + # plans: permited_plans_keys, + # benefit_descs: benefit_sequence_keys + # ) + # end + + # def benefit_sequence_keys + # (1..14).map { |i| i.to_s.to_sym } + # end + + # def permited_plans_keys + # benefit_sequence_keys.push(:plan_id) + # end + + # def plans_params + # plans_keys = params[:plans]&.keys || [] + + # plans_keys.each_with_object({}) do |key, hash| + # if key == 'benefit_descs' || key.match?(/^plan_\d$/) + # hash[key.to_sym] = permited_plan_param_list + # end + # end + # end + + # def permited_plan_param_list + # (1..14).map { |i| i.to_s.to_sym }.push(:plan_id) + # end end - - def destroy - # @resource = Resource.find(params[:id]) - # @resource.destroy - # redirect_to resources_url, notice: 'Resource was successfully destroyed.' - end - - private - - # def process_logos(employer_setup_process_params) - # @uploaded_logos = [] - # employer_logo = employer_setup_process_params["employer_logo"] - # if employer_logo.present? && employer_logo.is_a?(ActionDispatch::Http::UploadedFile) - # filename = employer_logo.original_filename - # binary_data = employer_logo.read - # meme_type = Marcel::MimeType.for(employer_logo) - - # CardLogoFile.create( - # filename: filename, - # image_data: binary_data, - # content_type: meme_type, - # logo_type: "employer" - # ) - - # @uploaded_logos.push(filename) - # employer_setup_process_params["employer_logo"] = filename - # end - - # network_logos = employer_setup_process_params["alternate_network_logos_attributes"] - # if network_logos.present? - # network_logos.each do |alt| - - # network_logo = alt.last["network_logo"] - # if network_logo.present? && network_logo.is_a?(ActionDispatch::Http::UploadedFile) - # filename = network_logo.original_filename - # binary_data = network_logo.read - # meme_type = Marcel::MimeType.for(network_logo) - - # CardLogoFile.create( - # filename: filename, - # image_data: binary_data, - # content_type: meme_type, - # logo_type: "network" - # ) - - # @uploaded_logos.push(filename) - # end - # alt.last["network_logo"] = @uploaded_logos.last - # end - # end - # employer_setup_process_params - # end - - # def update_logos_with_employer_setup_information() - # @uploaded_logos.each do |logo| - # logo_file = CardLogoFile.find_by(filename: logo) - # if logo_file.present? && @employer.present? - # logo_file.employer_setup_process = @employer - # logo_file.save - # end - # end - - # end - - # def general_information_params - # params.require(:employer_setup_general_information_form).permit( - # :name, - # :employer_logo, - # :group_number, - # :dental, - # :pl_plan_key, - # :effect_date, - # :number_of_plans, - # :network, - # :number_of_additional_network_logos - # ) - # end - - # def plans_params - # params.require(:employer_setup_plans_form).permit( - # plans: permited_plans_keys, - # benefit_descs: benefit_sequence_keys - # ) - # end - - # def network_exceptions_params - # params.require(:employer_setup_network_exceptions_form).permit( - # network_exceptions: [:network_logo, exceptions: [:type, :value]], - # ) - # end - - # def form_for_step - # step_name = @top_form.current_step - # form_method = "EmployerSetup#{step_name.camelize}Form".constantize - # # puts "/////\\\\\\||||||" - # # puts session[:employer_setup_data] - # # puts session[:employer_setup_data]['employer_setup_process_id'] - # puts form_method - # form_method.new(session[:employer_setup_data]['employer_setup_process_id']) - # end - - # def process_step(step_name) - # @form_method = "EmployerSetup#{step_name.camelize}Form".constantize - # session_data_name = "#{step_name}_data" - # # puts "1--------------params----" - # # puts params - # # puts "8--------------session----" - # # puts session[:employer_setup_data] - # employer_setup_process_id = session[:employer_setup_data]['employer_setup_process_id'] - # # puts session[:employer_setup_data] - # puts "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" - # puts params - # @form = @form_method.new(employer_setup_process_id, params) - # if @form.pl_plan_key.blank? - # @form.pl_plan_key = session[:employer_setup_data]['pl_plan_key'] - # end - # if @form.valid? && @form.save - # pl_plan_key = @top_form.pl_plan_key || @form.pl_plan_key - # # session[:employer_setup_data].merge!({current_step: step_name, pl_plan_key: pl_plan_key}) - # # form_fields = @form.attributes.merge!(global_params(step_name)) - # # session[:employer_setup_data][session_data_name] = form_fields - # # session[:employer_setup_data].merge!(global_params(step_name)) - # # puts session[:employer_setup_data][session_data_name] - # true - # else - # false - # end - # end - - # def step_params(step_name) - # form_name_sym = "employer_setup_#{step_name}_form".to_sym - # params.require(form_name_sym).permit(@form_method.permitted_params) - # end - - # def global_params(step_name) - # form_name_sym = "employer_setup_#{step_name}_form".to_sym - # params.require(form_name_sym).permit(EmployerSetupForm.permitted_params) - # end - - # def process_step(step_name) - # form_name = "employer_setup_#{step_name}_form".camelize.constantize - # form_params_name = "#{step_name}_params".to_sym - # allowed_params = [:general_information_params, :plans_params, :network_exceptions_params] - # if allowed_params.include?(form_params_name) - # form_params = send(form_params_name) - # @form = form_name.new(form_params) - # if @form.valid? - # session[:employer_setup_data]["#{step_name}_data"] = form_params - # true - # else - # false - # end - # end - # false - # end - - # def employer_setup_params - # params.require(:employer_setup_form).permit( - # :current_step, - # :name, - # :employer_logo, - # :group_number, - # :pl_plan_key, - # :effect_date, - # :number_of_plans, - # :network, - # :number_of_additional_network_logos, - # network_exceptions: [:network_logo, exceptions: [:type, :value]], - # plans: permited_plans_keys, - # benefit_descs: benefit_sequence_keys - # ) - # end - - # def benefit_sequence_keys - # (1..14).map { |i| i.to_s.to_sym } - # end - - # def permited_plans_keys - # benefit_sequence_keys.push(:plan_id) - # end - - # def plans_params - # plans_keys = params[:plans]&.keys || [] - - # plans_keys.each_with_object({}) do |key, hash| - # if key == 'benefit_descs' || key.match?(/^plan_\d$/) - # hash[key.to_sym] = permited_plan_param_list - # end - # end - # end - - # def permited_plan_param_list - # (1..14).map { |i| i.to_s.to_sym }.push(:plan_id) - # end end diff --git a/app/javascript/controllers/general_form_controller.js b/app/javascript/controllers/general_form_controller.js index ac5b3af..28be673 100644 --- a/app/javascript/controllers/general_form_controller.js +++ b/app/javascript/controllers/general_form_controller.js @@ -1,43 +1,43 @@ -import { Controller } from "@hotwired/stimulus" - -export default class extends Controller { - static targets = ["dependentField"] - - connect() { - } - - toggleFields() { - console.log("--- in toggle --- ") - const selector = this.element.querySelector('[data-action*="change->general-form#toggleFields"]'); - if (selector) { - const selectedValue = selector.value - this.field_match = false; - this.dependentFieldTargets.forEach((field) => { - // Check a data attribute on the field to see if it matches the selected value - if (field.dataset.parentValue === selectedValue) { - if (selectedValue == "network_logo") { - field.parentElement.parentElement.classList.remove("hidden"); - } else { - field.parentElement.classList.remove("hidden"); - } - this.field_match = true; - console.log("- ", selectedValue) - console.log("-- ", this.field_match) - } else { - if (field.dataset.parentValue == "network_logo") { - field.parentElement.parentElement.classList.add("hidden"); - } else { - field.parentElement.classList.add("hidden"); - } - } - }); - if (!this.field_match) { - console.log("--- ", this.field_match) - const defaultOption = this.dependentFieldTargets.find(target => { - return target.dataset.parentValue === 'default'; - }); - defaultOption.parentElement.classList.remove("hidden"); - } - } - } +import { Controller } from "@hotwired/stimulus" + +export default class extends Controller { + static targets = ["dependentField"] + + connect() { + } + + toggleFields() { + console.log("--- in toggle --- ") + const selector = this.element.querySelector('[data-action*="change->general-form#toggleFields"]'); + if (selector) { + const selectedValue = selector.value + this.field_match = false; + this.dependentFieldTargets.forEach((field) => { + // Check a data attribute on the field to see if it matches the selected value + if (field.dataset.parentValue === selectedValue) { + if (selectedValue == "network_logo") { + field.parentElement.parentElement.classList.remove("hidden"); + } else { + field.parentElement.classList.remove("hidden"); + } + this.field_match = true; + console.log("- ", selectedValue) + console.log("-- ", this.field_match) + } else { + if (field.dataset.parentValue == "network_logo") { + field.parentElement.parentElement.classList.add("hidden"); + } else { + field.parentElement.classList.add("hidden"); + } + } + }); + if (!this.field_match) { + console.log("--- ", this.field_match) + const defaultOption = this.dependentFieldTargets.find(target => { + return target.dataset.parentValue === 'default'; + }); + defaultOption.parentElement.classList.remove("hidden"); + } + } + } } \ No newline at end of file diff --git a/app/javascript/controllers/hello_controller.js b/app/javascript/controllers/hello_controller.js index 7571df8..bf3a3db 100644 --- a/app/javascript/controllers/hello_controller.js +++ b/app/javascript/controllers/hello_controller.js @@ -1,16 +1,16 @@ -import { Controller } from "@hotwired/stimulus" - -export default class extends Controller { - static targets = [ "name", "output" ] - - connect() { - // this.element.textContent = "Hello World!" - console.log('Hello World hello_controller.js'); - } - - greet() { - console.log('greet'); - this.outputTarget.textContent = - `Hello, ${this.nameTarget.value}!` - } -} +import { Controller } from "@hotwired/stimulus" + +export default class extends Controller { + static targets = [ "name", "output" ] + + connect() { + // this.element.textContent = "Hello World!" + console.log('Hello World hello_controller.js'); + } + + greet() { + console.log('greet'); + this.outputTarget.textContent = + `Hello, ${this.nameTarget.value}!` + } +} diff --git a/app/javascript/controllers/logo_upload_controller.js b/app/javascript/controllers/logo_upload_controller.js index e6dbae4..10220c7 100644 --- a/app/javascript/controllers/logo_upload_controller.js +++ b/app/javascript/controllers/logo_upload_controller.js @@ -4,12 +4,12 @@ export default class extends Controller { static values = { logoType: String, employerName: String - } - static targets = ["preview", "previewContainer", "logoSelect", "logofield", "initialLogoFile"]; + } + static targets = ["preview", "previewContainer", "logoSelect", "logoField", "initialLogoFile"]; async connect() { console.log('in connect'); - const initValue = this.logofieldTarget.value + const initValue = this.logoFieldTarget.value console.log(initValue) if (initValue) { const response = await fetch(`/id_card/${this.logoTypeValue}_logos/${initValue}/image`); // Fetch the binary data @@ -25,41 +25,49 @@ export default class extends Controller { uploadLogo(event) { console.log('in uploadLogo'); event.preventDefault() - const file = event.target.files[0]; - if (!file) return; + let logoFile = event.target.files[0]; + if (!logoFile) return; const logoType = this.logoTypeValue - let newFileName = file.name + let newFileName = logoFile.name if (logoType == "network") { console.log("n " + newFileName); - newFileName = this.determineNetworkFilename(file) + newFileName = this.determineNetworkFilename(logoFile) this.addOptionToSelect(newFileName) + logoFile = new File([logoFile], newFileName) } else if (logoType == "employer") { - newFileName = this.determineEmployerFilename(file) - file.name = newFileName + newFileName = this.determineEmployerFilename(logoFile) + logoFile = new File([logoFile], newFileName) } - - this.previewFile(file); - this.uploadLogoToServer(file); - - this.logofieldTarget.value = newFileName; + + this.uploadLogoToServer(logoFile) + .then((result) => { + console.log(result); + const logoId = result.id + this.previewFile(logoFile); + this.logoFieldTarget.value = logoId; + }) + .catch((error) => { + // Handle any errors that occurred + console.error(error); + }); } - previewFile(file) { + previewFile(logoFile) { console.log('in previewFile'); const reader = new FileReader(); reader.onload = (e) => { this.previewTarget.src = e.target.result; this.previewContainerTarget.classList.remove("hidden"); }; - reader.readAsDataURL(file); + reader.readAsDataURL(logoFile); } - async uploadLogoToServer(file) { + async uploadLogoToServer(logoFile) { console.log('in uploadLogoToServer'); const formData = new FormData(); - formData.append(`id_card_${this.logoTypeValue}_logo[logo_file]`, file); + formData.append(`id_card_${this.logoTypeValue}_logo[logo_file]`, logoFile); const csrfToken = document.querySelector("meta[name='csrf-token']").content; @@ -74,11 +82,14 @@ export default class extends Controller { if (response.ok) { console.log('Upload successful!') + const data = await response.json(); + return data; } else { - console.error("Failed to track event."); + throw new Error(`HTTP error! status: ${response.status}`); } } catch (error) { console.error("Network error:", error); + throw new Error("Network error:", error); } } @@ -86,17 +97,17 @@ export default class extends Controller { const blankOptionIndex = 0; const newOption = new Option(name, name, true, true) - if (this.logofieldTarget.options.length > blankOptionIndex + 1) { - this.logofieldTarget.insertBefore(newOption, this.logofieldTarget.options[blankOptionIndex + 1]); + if (this.logoFieldTarget.options.length > blankOptionIndex + 1) { + this.logoFieldTarget.insertBefore(newOption, this.logoFieldTarget.options[blankOptionIndex + 1]); } else { - this.logofieldTarget.appendChild(newOption); + this.logoFieldTarget.appendChild(newOption); } - this.logofieldTarget.value = name; + this.logoFieldTarget.value = name; } - determineNetworkFilename(file) { - const fileExtension = file.name.split('.').pop(); + determineNetworkFilename(logoFile) { + const fileExtension = logoFile.name.split('.').pop(); const primaryNetworkName = prompt("Enter the name for the primary network (Usually 'Cigna' or 'MedCost':"); const secondaryNetworkName = prompt("Enter the name for the primary network (ex: Health Partners):"); const logoFilename = this.titleizeText(primaryNetworkName).concat(this.titleizeText(secondaryNetworkName)).concat("Logo.").concat(fileExtension).replaceAll(' ', ''); @@ -104,8 +115,8 @@ export default class extends Controller { return logoFilename } - determineEmployerFilename(file) { - const fileExtension = file.name.split('.').pop(); + determineEmployerFilename(logoFile) { + const fileExtension = logoFile.name.split('.').pop(); const employerName = this.employerNameValue const logoFilename = this.titleizeText(employerName).concat("Logo.").concat(fileExtension).replaceAll(' ', ''); @@ -120,3 +131,4 @@ export default class extends Controller { }); } } + diff --git a/app/models/employer.rb b/app/models/employer.rb index dd106a3..31f3eda 100644 --- a/app/models/employer.rb +++ b/app/models/employer.rb @@ -1,6 +1,6 @@ class Employer < ApplicationRecord has_many :members - has_one :id_card_setup, class_name: 'IdCard::Setup' + has_one :id_card_setup, class_name: 'IdCard::Setup', dependent: :destroy scope :active, -> { where(active: true) } scope :inactive, -> { where(active: false) } diff --git a/app/models/id_card/employer_logo.rb b/app/models/id_card/employer_logo.rb index 2a250c5..586d2c1 100644 --- a/app/models/id_card/employer_logo.rb +++ b/app/models/id_card/employer_logo.rb @@ -1,14 +1,16 @@ -class IdCard::EmployerLogo < ApplicationRecord - before_save :calculate_aspect_ratio, if: :image_data_changed? +module IdCard + class EmployerLogo < ApplicationRecord + before_save :calculate_aspect_ratio, if: :image_data_changed? - private + private - def calculate_aspect_ratio - image_io = StringIO.new(self.image_data) - width, height = FastImage.size(image_io) - image_ratio = width.to_f / height - if image_ratio - self.aspect_ratio = image_ratio.round(2) + def calculate_aspect_ratio + image_io = StringIO.new(self.image_data) + width, height = FastImage.size(image_io) + image_ratio = width.to_f / height + if image_ratio + self.aspect_ratio = image_ratio.round(2) + end end end end diff --git a/app/models/id_card/exception.rb b/app/models/id_card/exception.rb index 907b751..cfa76d0 100644 --- a/app/models/id_card/exception.rb +++ b/app/models/id_card/exception.rb @@ -1,10 +1,12 @@ -class IdCard::Exception < ApplicationRecord - belongs_to :id_card_setup - has_many :id_card_exception_items - accepts_nested_attributes_for :id_card_exception_items, allow_destroy: true, reject_if: :all_blank +module IdCard + class Exception < ApplicationRecord + belongs_to :setup + has_many :exception_items + accepts_nested_attributes_for :exception_items, allow_destroy: true, reject_if: :all_blank - VALID_TYPES = ['zipcode', 'state', 'family_id'] + VALID_TYPES = ['zipcode', 'state', 'family_id'] - validates :type, inclusion: { in: VALID_TYPES, - message: "%{value} is not a valid exception type" } + validates :type, inclusion: { in: VALID_TYPES, + message: "%{value} is not a valid exception type" } + end end diff --git a/app/models/id_card/exception_item.rb b/app/models/id_card/exception_item.rb index 3729e33..769ba46 100644 --- a/app/models/id_card/exception_item.rb +++ b/app/models/id_card/exception_item.rb @@ -1,25 +1,27 @@ -class IdCard::ExceptionItem < ApplicationRecord - belongs_to :id_card_exception - belongs_to :id_card_network_logo, optional: true - belongs_to :id_card_provider_section, optional: true +module IdCard + class ExceptionItem < ApplicationRecord + belongs_to :exception + belongs_to :network_logo, optional: true + belongs_to :provider_section, optional: true - validate :only_one_exception_field_present + validate :only_one_exception_field_present - FIELDS_TO_VALIDATE = [:field_value, :card_logo_file_id, :card_provider_id].freeze + FIELDS_TO_VALIDATE = [:field_value, :card_logo_file_id, :card_provider_id].freeze - VALID_FIELD_NAMES = ['network_logo', 'provider_section', 'effective_date'] + VALID_FIELD_NAMES = ['network_logo', 'provider_section', 'effective_date'] - validates :field_name, inclusion: { in: VALID_FIELD_NAMES, - message: "%{value} is not a valid Id Card Field Name" } + validates :field_name, inclusion: { in: VALID_FIELD_NAMES, + message: "%{value} is not a valid Id Card Field Name" } - private + private - def only_one_exception_field_present - present_fields = FIELDS_TO_VALIDATE.count { |field| self[field].present? } + def only_one_exception_field_present + present_fields = FIELDS_TO_VALIDATE.count { |field| self[field].present? } - if present_fields != 1 - errors.add(:base, "Only one exception field can be present at a time") + if present_fields != 1 + errors.add(:base, "Only one exception field can be present at a time") + end end end end diff --git a/app/models/id_card/network_logo.rb b/app/models/id_card/network_logo.rb index 1200e3a..be4c67c 100644 --- a/app/models/id_card/network_logo.rb +++ b/app/models/id_card/network_logo.rb @@ -1,11 +1,13 @@ -class IdCard::NetworkLogo < ApplicationRecord - before_save :round_aspect_ratio +module IdCard + class NetworkLogo < ApplicationRecord + before_save :round_aspect_ratio - private + private - def round_aspect_ratio - if self.aspect_ratio.present? - self.aspect_ratio = self.aspect_ratio.round(2) + def round_aspect_ratio + if self.aspect_ratio.present? + self.aspect_ratio = self.aspect_ratio.round(2) + end end end end diff --git a/app/models/id_card/plan.rb b/app/models/id_card/plan.rb index d899b34..fea15b3 100644 --- a/app/models/id_card/plan.rb +++ b/app/models/id_card/plan.rb @@ -1,33 +1,35 @@ -class IdCard::Plan < ApplicationRecord - belongs_to :id_card_setup - has_many :id_card_plan_benefits, dependent: :destroy - accepts_nested_attributes_for :id_card_plan_benefits, allow_destroy: true, reject_if: :all_blank +module IdCard + class Plan < ApplicationRecord + belongs_to :setup + has_many :plan_benefits, dependent: :destroy + accepts_nested_attributes_for :plan_benefits, allow_destroy: true, reject_if: :all_blank - # after_initialize :create_default_benefits, if: :new_record? + # after_initialize :create_default_benefits, if: :new_record? - def self.permitted_params(params) - params.require(:id_card_plan).permit( - :title, - :pb_product_key, - :pl_plan_key, - :_destroy, - id_card_plan_benefits_attributes: [ - :id, - :benefit_desc, - :benefit, - :sequence, + def self.permitted_params(params) + params.require(:id_card_plan).permit( + :title, + :pb_product_key, + :pl_plan_key, :_destroy, - ] - ) - end + id_card_plan_benefits_attributes: [ + :id, + :benefit_desc, + :benefit, + :sequence, + :_destroy, + ] + ) + end - private + private - def build_and_create_default_benefits - benefits = IdCardBenefitsTemplate.find_by(title: "BLANK").id_card_benefits.sort_by(&:sequence) - benefits.each do |ben| - id_card_plan_benefits.new(benefit_desc: ben.benefit_desc, sequence: ben.sequence) + def build_and_create_default_benefits + benefits = IdCardBenefitsTemplate.find_by(title: "BLANK").id_card_benefits.sort_by(&:sequence) + benefits.each do |ben| + id_card_plan_benefits.new(benefit_desc: ben.benefit_desc, sequence: ben.sequence) + end end end end \ No newline at end of file diff --git a/app/models/id_card/plan_benefit.rb b/app/models/id_card/plan_benefit.rb index 26b140a..1846981 100644 --- a/app/models/id_card/plan_benefit.rb +++ b/app/models/id_card/plan_benefit.rb @@ -1,3 +1,5 @@ -class IdCard::PlanBenefit < ApplicationRecord - belongs_to :id_card_plan -end +module IdCard + class PlanBenefit < ApplicationRecord + belongs_to :plan + end +end \ No newline at end of file diff --git a/app/models/id_card/print_data.rb b/app/models/id_card/print_data.rb index 8ef2659..c9c509c 100644 --- a/app/models/id_card/print_data.rb +++ b/app/models/id_card/print_data.rb @@ -1,14 +1,15 @@ -class IdCard::PrintData < ApplicationRecord +module IdCard + class PrintData < ApplicationRecord - STRING_ATTRIBUTES = %w[provider_line_1 provider_line_2 provider_line_3 provider_line_4 provider_line_5 provider_line_6 provider_line_7 provider_line_8 provider_line_9 provider_line_10 provider_line_11 claim_to_1 claim_to_2 claim_to_3 claim_to_4 claim_to_5 claim_to_6 claim_to_7 claim_to_8 claim_to_9 claim_to_10 claim_to_11 dependent_1 dependent_2 dependent_3 dependent_4 dependent_5 dependent_6 dependent_7 dependent_8] + STRING_ATTRIBUTES = %w[provider_line_1 provider_line_2 provider_line_3 provider_line_4 provider_line_5 provider_line_6 provider_line_7 provider_line_8 provider_line_9 provider_line_10 provider_line_11 claim_to_1 claim_to_2 claim_to_3 claim_to_4 claim_to_5 claim_to_6 claim_to_7 claim_to_8 claim_to_9 claim_to_10 claim_to_11 dependent_1 dependent_2 dependent_3 dependent_4 dependent_5 dependent_6 dependent_7 dependent_8] - before_validation :assign_blank_strings_to_unassigned_params + before_validation :assign_blank_strings_to_unassigned_params - def assign_blank_strings_to_unassigned_params - STRING_ATTRIBUTES.each do |attr| - # Use the blank? method which checks for nil, false, empty, or whitespace strings - self[attr] = "" if self[attr].blank? + def assign_blank_strings_to_unassigned_params + STRING_ATTRIBUTES.each do |attr| + # Use the blank? method which checks for nil, false, empty, or whitespace strings + self[attr] = "" if self[attr].blank? + end end end - end \ No newline at end of file diff --git a/app/models/id_card/provider_section.rb b/app/models/id_card/provider_section.rb index fef5856..21ebc7d 100644 --- a/app/models/id_card/provider_section.rb +++ b/app/models/id_card/provider_section.rb @@ -1,3 +1,5 @@ -class IdCard::ProviderSection < ApplicationRecord +module IdCard + class ProviderSection < ApplicationRecord -end + end +end \ No newline at end of file diff --git a/app/models/id_card/rx_section.rb b/app/models/id_card/rx_section.rb index 12c751c..deefd43 100644 --- a/app/models/id_card/rx_section.rb +++ b/app/models/id_card/rx_section.rb @@ -1,3 +1,5 @@ -class IdCard::RxSection < ApplicationRecord +module IdCard + class RxSection < ApplicationRecord -end + end +end \ No newline at end of file diff --git a/app/models/id_card/setup.rb b/app/models/id_card/setup.rb index 14f33af..fdf76dc 100644 --- a/app/models/id_card/setup.rb +++ b/app/models/id_card/setup.rb @@ -1,27 +1,31 @@ -class IdCard::Setup < ApplicationRecord - belongs_to :employer - belongs_to :id_card_employer_logo - belongs_to :id_card_network_logo - belongs_to :id_card_provider_section - belongs_to :id_card_rx_section +module IdCard + class Setup < ApplicationRecord + belongs_to :employer, class_name: 'Employer' + belongs_to :employer_logo, optional: true + belongs_to :network_logo, optional: true + belongs_to :provider_section, optional: true + belongs_to :rx_section, optional: true - has_many :card_exceptions, dependent: :destroy + has_many :plans, dependent: :destroy - # def employer_logo_filename - # self.id_card_employer_logo.filename - # end + has_many :exceptions, dependent: :destroy - # def network_logo_filename - # self.id_card_network_logo.filename - # end + # def employer_logo_filename + # self.employer_logo.filename + # end - def self.permitted_params(params) - params.require(:id_card_setup).permit( - :print_name, - :network_provider, - :card_template, - :rx_group_number, - :id_card_employer_logo_id - ) + # def network_logo_filename + # self.network_logo.filename + # end + + def self.permitted_params(params) + params.require(:id_card_setup).permit( + :print_name, + :network_provider, + :card_template, + :rx_group_number, + :id_card_employer_logo_id + ) + end end end diff --git a/app/queries/call_stored_proc.rb b/app/queries/call_stored_proc.rb index 5a8bb49..925c932 100644 --- a/app/queries/call_stored_proc.rb +++ b/app/queries/call_stored_proc.rb @@ -1,14 +1,14 @@ -class CallStoredProc - def initialize(procedure_name, args = {}) - @procedure_name = procedure_name - @args = args - end - - def call - params_sql = @args.map { |key, value| "@#{key} = :#{key}" }.join(', ') - sql_template = "EXEC #{@procedure_name} #{params_sql}" - sanitized_sql = VhcsRecord.send(:sanitize_sql_array, [sql_template, @args]) - - VhcsRecord.connection.exec_query(sanitized_sql) - end -end +class CallStoredProc + def initialize(procedure_name, args = {}) + @procedure_name = procedure_name + @args = args + end + + def call + params_sql = @args.map { |key, value| "@#{key} = :#{key}" }.join(', ') + sql_template = "EXEC #{@procedure_name} #{params_sql}" + sanitized_sql = VhcsRecord.send(:sanitize_sql_array, [sql_template, @args]) + + VhcsRecord.connection.exec_query(sanitized_sql) + end +end diff --git a/app/services/benefits_word_doc/map_plans_information.rb b/app/services/benefits_word_doc/map_plans_information.rb index 87534ea..3f9abc7 100644 --- a/app/services/benefits_word_doc/map_plans_information.rb +++ b/app/services/benefits_word_doc/map_plans_information.rb @@ -15,13 +15,17 @@ module BenefitsWordDoc plan_lines = @word_doc_section.slice(plan_index + 1, 14) plan_lines.each_with_index do |line, i| field_mapping = mapping_array[i] - field_regex = field_mapping[:doc_to_employer_regex] - if line.match(field_regex) - field_value = line.match(field_regex)[0].strip - elsif line.match(default_benefit_regex(field_mapping[:employer_benefit_desc_field])) - field_value = line.match(default_benefit_regex(field_mapping[:employer_benefit_desc_field]))[0].strip + if line.match(/:.*/) + field_value = line.match(/:.*/)[0].strip else - field_value = line + field_regex = field_mapping[:doc_to_employer_regex] + if line.match(field_regex) + field_value = line.match(field_regex)[0].strip + elsif line.match(default_benefit_regex(field_mapping[:employer_benefit_desc_field])) + field_value = line.match(default_benefit_regex(field_mapping[:employer_benefit_desc_field]))[0].strip + else + field_value = line + end end employer_benefit_desc_field = field_mapping[:employer_benefit_desc_field] new_benefit = new_plan.plan_benefits[i] diff --git a/app/services/image_processor.rb b/app/services/image_processor.rb index a14a61f..2eff15f 100644 --- a/app/services/image_processor.rb +++ b/app/services/image_processor.rb @@ -21,7 +21,7 @@ class ImageProcessor filename: filename, image_data: binary_data, content_type: meme_type, - logo_type: "network" + logo_type: "employer" ) end end \ No newline at end of file diff --git a/app/services/sample_card/data_formatter.rb b/app/services/sample_card/data_formatter.rb index 439d449..b16754f 100644 --- a/app/services/sample_card/data_formatter.rb +++ b/app/services/sample_card/data_formatter.rb @@ -23,7 +23,7 @@ module SampleCard def set_employer_fields selected_attributes = { employer_name: @employer.name, - group_number: @employer.group_number || "999999", + group_number: @employer.group_number.present? ? @employer.group_number : "999999", medical_eff_date: @employer.effective_date } @@ -49,7 +49,7 @@ module SampleCard selected_attributes = { full_name: "JANE DOE", primary_mb_member_key: "888888", - rx_group: @employer.group_number || "999999" + rx_group: @employer.group_number.present? ? @employer.group_number : "999999" } @sample_card.assign_attributes(selected_attributes) diff --git a/app/views/employers_old/_alt_network_logo_fields.html.erb b/app/views/employers_old/_alt_network_logo_fields.html.erb index 3246b9c..41f0d76 100644 --- a/app/views/employers_old/_alt_network_logo_fields.html.erb +++ b/app/views/employers_old/_alt_network_logo_fields.html.erb @@ -1,32 +1,32 @@ -
-
-
-
- <%= f.select :network_logo, options_for_select(CardLogoFile.where(logo_type: 'network').pluck(:filename).map { |fn| [fn, fn]}), { include_blank: "Select or Add Network Logo", class: "rounded-r-none" }, { data: { logo_upload_target: "logoSelect" }} %> -
-
- -
- -
-
- <%= network_fields.file_field :network_logo_file, class: "hidden", id: "file_upload_input_NEW_RECORD", data: { add_alt_network_logo_target: "networkLogo", logo_upload_type_param: "network", action: "change->logo-upload#uploadLogo" }, direct_upload: true %> -
-
-
- <%= network_fields.select :exception_type, options_for_select(["Zip","State"]), label: { text: "Exception Type" }, prompt: "Select Type", class: "w-full" %> -
-
- <%= network_fields.text_field :exception_value, label: { text: "Exception Value" }, class: "w-full" %> -
-
-
-
- <%= network_fields.hidden_field :_destroy %> - <%= button_tag "Remove", class: "cursor-pointer bg-deepcove hover:bg-brightlava text-xl font-bold text-NEXT_SECONDARY_COLOR hover:text-platinum py-1 px-2 font-semibold leading-tight rounded-lg border-3 border-NEXT_SECONDARY_COLOR w-full", data: { action: "add-alt-network-logo#remove" } %> -
+
+
+
+
+ <%= f.select :network_logo, options_for_select(CardLogoFile.where(logo_type: 'network').pluck(:filename).map { |fn| [fn, fn]}), { include_blank: "Select or Add Network Logo", class: "rounded-r-none" }, { data: { logo_upload_target: "logoSelect" }} %> +
+
+ +
+ +
+
+ <%= network_fields.file_field :network_logo_file, class: "hidden", id: "file_upload_input_NEW_RECORD", data: { add_alt_network_logo_target: "networkLogo", logo_upload_type_param: "network", action: "change->logo-upload#uploadLogo" }, direct_upload: true %> +
+
+
+ <%= network_fields.select :exception_type, options_for_select(["Zip","State"]), label: { text: "Exception Type" }, prompt: "Select Type", class: "w-full" %> +
+
+ <%= network_fields.text_field :exception_value, label: { text: "Exception Value" }, class: "w-full" %> +
+
+
+
+ <%= network_fields.hidden_field :_destroy %> + <%= button_tag "Remove", class: "cursor-pointer bg-deepcove hover:bg-brightlava text-xl font-bold text-NEXT_SECONDARY_COLOR hover:text-platinum py-1 px-2 font-semibold leading-tight rounded-lg border-3 border-NEXT_SECONDARY_COLOR w-full", data: { action: "add-alt-network-logo#remove" } %> +
\ No newline at end of file diff --git a/app/views/id_cards/setup/edit.html.erb b/app/views/id_card/setup/edit.html.erb similarity index 100% rename from app/views/id_cards/setup/edit.html.erb rename to app/views/id_card/setup/edit.html.erb diff --git a/app/views/id_cards/setup/new.html.erb b/app/views/id_card/setup/new.html.erb similarity index 78% rename from app/views/id_cards/setup/new.html.erb rename to app/views/id_card/setup/new.html.erb index 521f989..71fad9a 100644 --- a/app/views/id_cards/setup/new.html.erb +++ b/app/views/id_card/setup/new.html.erb @@ -1,9 +1,10 @@
-
+

New ID Card Setup:

(<%= @employer.name %>)

<%= form_with model: @setup, local: true, multipart: true do |f| %> + <%= form_with model: @employer, url: import_employers_path, data: { turbo: false }, local: true, multipart: true do |form| %>
>
@@ -25,7 +26,7 @@
-
Employer Logo
+
Employer Logo
- <%= f.submit "Create New Employer" %> + <%= f.submit "Create ID Card Setup" %>
<% end %> diff --git a/compose.yaml b/compose.yaml index 5d5e73e..eae5076 100644 --- a/compose.yaml +++ b/compose.yaml @@ -15,6 +15,8 @@ services: - HISTFILE=/usr/src/app/log/.bash_history - RAILS_ENV=development - TAILWIND_POLLING=true + - PUID=1000 + - PGID=100 tty: true stdin_open: true depends_on: diff --git a/db/migrate/20251204041154_create_id_card_setups.rb b/db/migrate/20251204041154_create_id_card_setups.rb index adcca2a..3683d5f 100644 --- a/db/migrate/20251204041154_create_id_card_setups.rb +++ b/db/migrate/20251204041154_create_id_card_setups.rb @@ -7,10 +7,10 @@ class CreateIdCardSetups < ActiveRecord::Migration[7.2] t.string :rx_group_number t.boolean :active, default: false t.belongs_to :employer, null: false, foreign_key: true - t.belongs_to :id_card_employer_logo, null: true, foreign_key: true - t.belongs_to :id_card_network_logo, null: true, foreign_key: true - t.belongs_to :id_card_provider_section, null: false, foreign_key: true - t.belongs_to :id_card_rx_section, null: false, foreign_key: true + t.belongs_to :employer_logo, null: true, foreign_key: { to_table: :id_card_employer_logos } + t.belongs_to :network_logo, null: true, foreign_key: { to_table: :id_card_network_logos } + t.belongs_to :provider_section, null: true, foreign_key: { to_table: :id_card_provider_sections } + t.belongs_to :rx_section, null: true, foreign_key: { to_table: :id_card_rx_sections } t.timestamps end diff --git a/db/migrate/20251204142443_create_id_card_plans.rb b/db/migrate/20251204142443_create_id_card_plans.rb index 209d452..79d10c1 100644 --- a/db/migrate/20251204142443_create_id_card_plans.rb +++ b/db/migrate/20251204142443_create_id_card_plans.rb @@ -4,7 +4,8 @@ class CreateIdCardPlans < ActiveRecord::Migration[7.2] t.string :title t.integer :pb_product_key t.string :pl_plan_key - t.belongs_to :id_card_setup, null: true, foreign_key: true + t.boolean :template + t.belongs_to :setup, null: true, foreign_key: { to_table: :id_card_setups } t.timestamps end diff --git a/db/migrate/20251204142512_create_id_card_plan_benefits.rb b/db/migrate/20251204142512_create_id_card_plan_benefits.rb index 418d47d..c0cdcdc 100644 --- a/db/migrate/20251204142512_create_id_card_plan_benefits.rb +++ b/db/migrate/20251204142512_create_id_card_plan_benefits.rb @@ -4,7 +4,7 @@ class CreateIdCardPlanBenefits < ActiveRecord::Migration[7.2] t.string :benefit_desc t.string :benefit t.integer :sequence - t.belongs_to :id_card_plan, null: false, foreign_key: true + t.belongs_to :plan, null: false, foreign_key: { to_table: :id_card_plans } t.timestamps end diff --git a/db/migrate/20260116181849_create_id_card_exceptions.rb b/db/migrate/20260116181849_create_id_card_exceptions.rb index 0f508f9..98d7540 100644 --- a/db/migrate/20260116181849_create_id_card_exceptions.rb +++ b/db/migrate/20260116181849_create_id_card_exceptions.rb @@ -3,7 +3,7 @@ class CreateIdCardExceptions < ActiveRecord::Migration[7.2] create_table :id_card_exceptions do |t| t.string :type t.string :value - t.belongs_to :id_card_setup, null: false, foreign_key: true + t.belongs_to :setup, null: false, foreign_key: { to_table: :id_card_setups } t.timestamps end diff --git a/db/migrate/20260116182836_create_id_card_exception_items.rb b/db/migrate/20260116182836_create_id_card_exception_items.rb index 39e233e..ed71b2c 100644 --- a/db/migrate/20260116182836_create_id_card_exception_items.rb +++ b/db/migrate/20260116182836_create_id_card_exception_items.rb @@ -3,9 +3,9 @@ class CreateIdCardExceptionItems < ActiveRecord::Migration[7.2] create_table :id_card_exception_items do |t| t.string :field_name t.string :field_value - t.belongs_to :id_card_exception, null: false, foreign_key: true - t.belongs_to :id_card_network_logo, null: true, foreign_key: true - t.belongs_to :id_card_provider_section, null: true, foreign_key: true + t.belongs_to :exception, null: false, foreign_key: { to_table: :id_card_exceptions } + t.belongs_to :network_logo, null: true, foreign_key: { to_table: :id_card_network_logos } + t.belongs_to :provider_section, null: true, foreign_key: { to_table: :id_card_provider_sections } t.timestamps end diff --git a/db/schema.rb b/db/schema.rb index 0d7dea3..b9ba7d8 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -37,23 +37,23 @@ ActiveRecord::Schema[7.2].define(version: 2026_01_16_182836) do create_table "id_card_exception_items", force: :cascade do |t| t.string "field_name" t.string "field_value" - t.bigint "id_card_exception_id", null: false - t.bigint "id_card_network_logo_id" - t.bigint "id_card_provider_section_id" + t.bigint "exception_id", null: false + t.bigint "network_logo_id" + t.bigint "provider_section_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.index ["id_card_exception_id"], name: "index_id_card_exception_items_on_id_card_exception_id" - t.index ["id_card_network_logo_id"], name: "index_id_card_exception_items_on_id_card_network_logo_id" - t.index ["id_card_provider_section_id"], name: "index_id_card_exception_items_on_id_card_provider_section_id" + t.index ["exception_id"], name: "index_id_card_exception_items_on_exception_id" + t.index ["network_logo_id"], name: "index_id_card_exception_items_on_network_logo_id" + t.index ["provider_section_id"], name: "index_id_card_exception_items_on_provider_section_id" end create_table "id_card_exceptions", force: :cascade do |t| t.string "type" t.string "value" - t.bigint "id_card_setup_id", null: false + t.bigint "setup_id", null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.index ["id_card_setup_id"], name: "index_id_card_exceptions_on_id_card_setup_id" + t.index ["setup_id"], name: "index_id_card_exceptions_on_setup_id" end create_table "id_card_network_logos", force: :cascade do |t| @@ -70,20 +70,21 @@ ActiveRecord::Schema[7.2].define(version: 2026_01_16_182836) do t.string "benefit_desc" t.string "benefit" t.integer "sequence" - t.bigint "id_card_plan_id", null: false + t.bigint "plan_id", null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.index ["id_card_plan_id"], name: "index_id_card_plan_benefits_on_id_card_plan_id" + t.index ["plan_id"], name: "index_id_card_plan_benefits_on_plan_id" end create_table "id_card_plans", force: :cascade do |t| t.string "title" t.integer "pb_product_key" t.string "pl_plan_key" - t.bigint "id_card_setup_id" + t.boolean "template" + t.bigint "setup_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.index ["id_card_setup_id"], name: "index_id_card_plans_on_id_card_setup_id" + t.index ["setup_id"], name: "index_id_card_plans_on_setup_id" end create_table "id_card_print_data", force: :cascade do |t| @@ -226,17 +227,17 @@ ActiveRecord::Schema[7.2].define(version: 2026_01_16_182836) do t.string "rx_group_number" t.boolean "active", default: false t.bigint "employer_id", null: false - t.bigint "id_card_employer_logo_id" - t.bigint "id_card_network_logo_id" - t.bigint "id_card_provider_section_id", null: false - t.bigint "id_card_rx_section_id", null: false + t.bigint "employer_logo_id" + t.bigint "network_logo_id" + t.bigint "provider_section_id" + t.bigint "rx_section_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["employer_id"], name: "index_id_card_setups_on_employer_id" - t.index ["id_card_employer_logo_id"], name: "index_id_card_setups_on_id_card_employer_logo_id" - t.index ["id_card_network_logo_id"], name: "index_id_card_setups_on_id_card_network_logo_id" - t.index ["id_card_provider_section_id"], name: "index_id_card_setups_on_id_card_provider_section_id" - t.index ["id_card_rx_section_id"], name: "index_id_card_setups_on_id_card_rx_section_id" + t.index ["employer_logo_id"], name: "index_id_card_setups_on_employer_logo_id" + t.index ["network_logo_id"], name: "index_id_card_setups_on_network_logo_id" + t.index ["provider_section_id"], name: "index_id_card_setups_on_provider_section_id" + t.index ["rx_section_id"], name: "index_id_card_setups_on_rx_section_id" end create_table "members", force: :cascade do |t| @@ -254,17 +255,17 @@ ActiveRecord::Schema[7.2].define(version: 2026_01_16_182836) do t.index ["id_card_plan_id"], name: "index_members_on_id_card_plan_id" end - add_foreign_key "id_card_exception_items", "id_card_exceptions" - add_foreign_key "id_card_exception_items", "id_card_network_logos" - add_foreign_key "id_card_exception_items", "id_card_provider_sections" - add_foreign_key "id_card_exceptions", "id_card_setups" - add_foreign_key "id_card_plan_benefits", "id_card_plans" - add_foreign_key "id_card_plans", "id_card_setups" + add_foreign_key "id_card_exception_items", "id_card_exceptions", column: "exception_id" + add_foreign_key "id_card_exception_items", "id_card_network_logos", column: "network_logo_id" + add_foreign_key "id_card_exception_items", "id_card_provider_sections", column: "provider_section_id" + add_foreign_key "id_card_exceptions", "id_card_setups", column: "setup_id" + add_foreign_key "id_card_plan_benefits", "id_card_plans", column: "plan_id" + add_foreign_key "id_card_plans", "id_card_setups", column: "setup_id" add_foreign_key "id_card_setups", "employers" - add_foreign_key "id_card_setups", "id_card_employer_logos" - add_foreign_key "id_card_setups", "id_card_network_logos" - add_foreign_key "id_card_setups", "id_card_provider_sections" - add_foreign_key "id_card_setups", "id_card_rx_sections" + add_foreign_key "id_card_setups", "id_card_employer_logos", column: "employer_logo_id" + add_foreign_key "id_card_setups", "id_card_network_logos", column: "network_logo_id" + add_foreign_key "id_card_setups", "id_card_provider_sections", column: "provider_section_id" + add_foreign_key "id_card_setups", "id_card_rx_sections", column: "rx_section_id" add_foreign_key "members", "employers" add_foreign_key "members", "id_card_plans" end From 8c885b3e768c8c284bbbde913fa64de5e31be342 Mon Sep 17 00:00:00 2001 From: Jason Jordan Date: Fri, 13 Mar 2026 08:47:13 -0400 Subject: [PATCH 06/25] DB restructure, print page --- app/assets/tailwind/application.css | 4 + .../id_card/network_logos_controller.rb | 61 +++++++++ app/controllers/id_card/plans_controller.rb | 35 +++++ app/controllers/id_card/printer_controller.rb | 27 ++++ .../id_card/provider_sections_controller.rb | 40 ++++++ app/controllers/id_card/setup_controller.rb | 125 +++++++++++++----- .../add_exception_item_controller.js | 8 +- .../controllers/add_plan_controller.js | 1 + .../benefits_template_picker_controller.js | 2 +- .../exceptions_toggle_controller.js | 57 ++++++++ .../controllers/general_form_controller.js | 71 +++++++++- .../controllers/logo_upload_controller.js | 52 +++++--- .../controllers/provider_update_controller.js | 25 ++++ app/models/employer.rb | 10 +- app/models/id_card/employer_logo.rb | 4 +- app/models/id_card/exception.rb | 12 -- app/models/id_card/field_exception.rb | 35 +++++ ...eption_item.rb => field_exception_item.rb} | 0 app/models/id_card/network_logo.rb | 26 +++- app/models/id_card/plan.rb | 73 +++++++--- app/models/id_card/provider_section.rb | 31 +++++ app/models/id_card/setup.rb | 29 +++- .../benefits_word_doc/map_employer_logo.rb | 21 ++- .../map_network_information.rb | 30 +++-- app/services/employer_cards/queue_counter.rb | 13 ++ app/services/image_processor.rb | 20 ++- app/services/sample_card/data_formatter.rb | 6 +- .../_first_plan_fields.html.erb | 4 +- app/views/employer_setup/edit.html.erb | 14 +- app/views/employer_setup/index.html.erb | 2 +- .../network_exceptions.html.erb | 2 +- app/views/employer_setup/new.html.erb | 10 +- app/views/employer_setup/plans.html.erb | 6 +- app/views/employers/index.html.erb | 2 +- app/views/employers/show.html.erb | 99 +++++++++++--- .../employers_old/_first_plan_fields.html.erb | 4 +- app/views/employers_old/edit.html.erb | 10 +- app/views/employers_old/index.html.erb | 2 +- .../employers_old/network_exceptions.html.erb | 2 +- app/views/employers_old/new.html.erb | 10 +- app/views/employers_old/new_new.html.erb | 10 +- app/views/employers_old/plans.html.erb | 6 +- app/views/id_card/printer/index.html.erb | 34 +++++ .../setup/_alt_network_logo_fields.html.erb | 16 +++ .../id_card/setup/_claim_fields.html.erb | 5 + .../setup/_plan_benefits_fields.html.erb | 5 + app/views/id_card/setup/_plan_fields.html.erb | 13 ++ .../id_card/setup/_provider_fields.html.erb | 5 + app/views/id_card/setup/edit.html.erb | 34 ----- .../id_card/setup/field_exceptions.html.erb | 119 +++++++++++++++++ app/views/id_card/setup/general.html.erb | 93 +++++++++++++ app/views/id_card/setup/network.html.erb | 57 ++++++++ app/views/id_card/setup/new.html.erb | 3 +- app/views/id_card/setup/plans.html.erb | 63 +++++++++ app/views/welcome/tailwind_colors.html.erb | 4 +- config/database.yml | 4 +- config/routes.rb | 22 ++- ...144134_create_id_card_provider_sections.rb | 1 + ...251202152220_create_id_card_rx_sections.rb | 1 + ...1203091559_create_id_card_network_logos.rb | 1 + ...04041154_create_id_card_configurations.rb} | 5 +- .../20251204142443_create_id_card_plans.rb | 2 +- ...0260116181849_create_id_card_exceptions.rb | 11 -- ...6181849_create_id_card_field_exceptions.rb | 11 ++ ...6_create_id_card_field_exception_items.rb} | 6 +- db/schema.rb | 30 +++-- db/seeds.rb | 119 +++++++++-------- lib/tasks/employer.rake | 22 +-- logo_files/employer/AqualisLogo.png | Bin 0 -> 36681 bytes logo_files/employer/BryanPestControlLogo.jpg | Bin 0 -> 24047 bytes logo_files/employer/ZndusLogo.jpg | Bin 0 -> 15714 bytes logo_files/network/CignaLogo.png | Bin 0 -> 14917 bytes logo_files/network/MedCostLogo.png | Bin 0 -> 20496 bytes 73 files changed, 1362 insertions(+), 325 deletions(-) create mode 100644 app/controllers/id_card/network_logos_controller.rb create mode 100644 app/controllers/id_card/plans_controller.rb create mode 100644 app/controllers/id_card/printer_controller.rb create mode 100644 app/controllers/id_card/provider_sections_controller.rb create mode 100644 app/javascript/controllers/exceptions_toggle_controller.js create mode 100644 app/javascript/controllers/provider_update_controller.js delete mode 100644 app/models/id_card/exception.rb create mode 100644 app/models/id_card/field_exception.rb rename app/models/id_card/{exception_item.rb => field_exception_item.rb} (100%) create mode 100644 app/services/employer_cards/queue_counter.rb create mode 100644 app/views/id_card/printer/index.html.erb create mode 100644 app/views/id_card/setup/_alt_network_logo_fields.html.erb create mode 100644 app/views/id_card/setup/_claim_fields.html.erb create mode 100644 app/views/id_card/setup/_plan_benefits_fields.html.erb create mode 100644 app/views/id_card/setup/_plan_fields.html.erb create mode 100644 app/views/id_card/setup/_provider_fields.html.erb delete mode 100644 app/views/id_card/setup/edit.html.erb create mode 100644 app/views/id_card/setup/field_exceptions.html.erb create mode 100644 app/views/id_card/setup/general.html.erb create mode 100644 app/views/id_card/setup/network.html.erb create mode 100644 app/views/id_card/setup/plans.html.erb rename db/migrate/{20251204041154_create_id_card_setups.rb => 20251204041154_create_id_card_configurations.rb} (82%) delete mode 100644 db/migrate/20260116181849_create_id_card_exceptions.rb create mode 100644 db/migrate/20260116181849_create_id_card_field_exceptions.rb rename db/migrate/{20260116182836_create_id_card_exception_items.rb => 20260116182836_create_id_card_field_exception_items.rb} (57%) create mode 100644 logo_files/employer/AqualisLogo.png create mode 100644 logo_files/employer/BryanPestControlLogo.jpg create mode 100644 logo_files/employer/ZndusLogo.jpg create mode 100644 logo_files/network/CignaLogo.png create mode 100644 logo_files/network/MedCostLogo.png diff --git a/app/assets/tailwind/application.css b/app/assets/tailwind/application.css index 87fa021..7b9bd11 100644 --- a/app/assets/tailwind/application.css +++ b/app/assets/tailwind/application.css @@ -19,6 +19,8 @@ --color-cobalt: #0047AB; /* cobalt blue */ --color-cobalt-tinted: #003B8F; + /* cobalt blue */ + --color-cobalt-vivid: #005DE0; /* platinum */ --color-platinum: #E0E0E0; /* copper */ @@ -33,6 +35,8 @@ --color-verdigris: #588288; /* oxidized copper/bronze green-blue */ --color-verdigris-tinted: #496A6F; + /* oxidized copper/bronze green-blue */ + --color-verdigris-vivid: #618D94; /* alert red */ --color-brightlava: #f80800; /* alert green */ diff --git a/app/controllers/id_card/network_logos_controller.rb b/app/controllers/id_card/network_logos_controller.rb new file mode 100644 index 0000000..70279ff --- /dev/null +++ b/app/controllers/id_card/network_logos_controller.rb @@ -0,0 +1,61 @@ +module IdCard + class NetworkLogosController < ApplicationController + + # View Methods + def index + end + + def show + end + + def new + end + + def create + file = logo_params["logo_file"] + if file.present? && file.is_a?(ActionDispatch::Http::UploadedFile) + filename = file.original_filename + # binary_data = file.read + binary_data = File.binread(file) + meme_type = Marcel::MimeType.for(file) + + networklogo = IdCard::NetworkLogo.create( + filename: filename, + image_data: binary_data, + content_type: meme_type + ) + + render json: networklogo, only: [:id], status: :ok + end + end + + def edit + end + + def update + end + + def destroy + end + + # API Methods + + def image + logo_file = IdCard::NetworkLogo.find(params[:id]) + puts params[:id] + logo_binary = logo_file.image_data + logo_filename = logo_file.filename + + send_data logo_binary, + filename: logo_filename, + disposition: 'inline' + end + + private + + def logo_params + params.require(:id_card_network_logo).permit(:logo_file) + end + + end +end \ No newline at end of file diff --git a/app/controllers/id_card/plans_controller.rb b/app/controllers/id_card/plans_controller.rb new file mode 100644 index 0000000..0611a89 --- /dev/null +++ b/app/controllers/id_card/plans_controller.rb @@ -0,0 +1,35 @@ +module IdCard + class PlansController < ApplicationController + + # View Methods + def new + + end + + def create + + end + + def edit + + end + + def update + + end + + def destroy + + end + + # API Methods + + def get_plan_benefits + @plan_benefits = IdCard::Plan.find(params[:id]).plan_benefits + render json: @plan_benefits.as_json + end + + private + + end +end \ No newline at end of file diff --git a/app/controllers/id_card/printer_controller.rb b/app/controllers/id_card/printer_controller.rb new file mode 100644 index 0000000..7eae725 --- /dev/null +++ b/app/controllers/id_card/printer_controller.rb @@ -0,0 +1,27 @@ +module IdCard + class PrinterController < ApplicationController + + # View Methods + def index + @employer_configurations = IdCard::Configuration.active.to_a.sort_by { |config| config.pl_plan_key.to_i } + add_queued_count_to_card_configuration + render :index + end + + # API Methods + + private + + + def add_queued_count_to_card_configuration + @queue_counts = EmployerCards::QueueCounter.new().call + @queue_counts.each do |qc| + match = @employer_configurations.find { |configuration| configuration.pl_plan_key == qc["PLPlanKey"] } + if match.present? + match.queued_card_count = qc["QueuedCardsCount"] + end + end + end + + end +end \ No newline at end of file diff --git a/app/controllers/id_card/provider_sections_controller.rb b/app/controllers/id_card/provider_sections_controller.rb new file mode 100644 index 0000000..5af0b6d --- /dev/null +++ b/app/controllers/id_card/provider_sections_controller.rb @@ -0,0 +1,40 @@ +module IdCard + class ProviderSectionsController < ApplicationController + + # View Methods + def index + end + + def show + end + + def new + end + + def create + end + + def edit + end + + def update + end + + def destroy + end + + # API Methods + + def get_section_data + @provider_section = IdCard::ProviderSection.find(params[:id]) + render json: @provider_section.as_json + end + + private + + def logo_params + params.require(:id_card_network_logo).permit(:logo_file) + end + + end +end \ No newline at end of file diff --git a/app/controllers/id_card/setup_controller.rb b/app/controllers/id_card/setup_controller.rb index c462e23..6656160 100644 --- a/app/controllers/id_card/setup_controller.rb +++ b/app/controllers/id_card/setup_controller.rb @@ -1,41 +1,25 @@ module IdCard - class SetupController < ApplicationController + class ConfigurationController < ApplicationController + before_action :set_employer_and_setup # View Methods - def new - @employer = Employer.find_by(slug: params[:employer]) - @setup = @employer.create_id_card_setup - render :new - end - - def create - xyz - employer_params = Employer.permitted_params(params) - puts "---Params---" - puts employer_params - # post_image_processing_params = process_logos(employer_setup_process_params) - @employer = Employer.new(employer_params) - if @employer.save - # update_logos_with_employer_setup_information() - redirect_to employer_path(@employer.slug), notice: 'Employer Saved' - else - render :new - end - end - def edit - @employer = Employer.find_by(slug: params[:id]) + @employer = Employer.find_by(slug: params[:employer_id]) + if @employer.id_card_enabled? + @setup = @employer.id_card_setup + else + @setup = @employer.create_id_card_setup + end render :edit end def update - puts "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" - employer_params = Employer.permitted_params(params) - @employer = Employer.find(params[:id]) + setup_params = IdCard::Configuration.permitted_params(params) + @setup = IdCard::Configuration.find(params[:id]) - if @employer.update(employer_params) + if @setup.update(setup_params) puts "sucess" - redirect_to employer_path(@employer.slug), notice: 'Employer was successfully updated.' + redirect_to employer_path(@setup.employer.slug), notice: 'ID Card Configuration was successfully updated.' else puts "fail" render :edit, status: :unprocessable_entity @@ -43,6 +27,66 @@ module IdCard end + def general + provider_defaults = IdCard::ProviderSection.defaults + @provider_options = provider_defaults.map { |p| ["Default #{p.title}", p.id] }.concat(provider_defaults.map { |p| ["New #{p.title}", "new|#{p.id}"] }) + if @setup.provider_section_id.present? && provider_defaults.map(&:id).exclude?(@setup.provider_section_id) + @provider_options.insert(0, ["#{@employer.name} Custom", @setup.provider_section_id]) + end + @rx_options = IdCard::RxSection.all + @fairos_rx_id = IdCard::RxSection.find_by(title: "FairosRx").id + render :general + end + + def update_general + if params[:id_card_setup]["provider_section_id"].include?("new|") + new_provider_section_params = IdCard::ProviderSection.permitted_params(params) + new_provider_section = IdCard::ProviderSection.create(new_provider_section_params) + params[:id_card_setup]["provider_section_id"] = new_provider_section.id + end + general_params = IdCard::Configuration.permitted_params(params) + if @setup.update(general_params) + puts "sucess" + redirect_to employer_path(@employer.slug), notice: 'ID Card Configuration was successfully updated.' + else + puts "fail" + render :general, status: :unprocessable_entity + end + end + + def plans + @plan_templates = IdCard::Plan.templates + render :plans + end + + def update_plans + plans_params = IdCard::Plan.permitted_params(params) + if @setup.update(plans_params) + puts "sucess" + redirect_to employer_path(@setup.employer.slug), notice: 'ID Card Plans successfully updated.' + else + puts "fail" + render :plans, status: :unprocessable_entity + end + + end + + def field_exceptions + render :field_exceptions + end + + def update_field_exceptions + field_exceptions_params = IdCard::FieldException.permitted_params(params) + if @setup.update(field_exceptions_params) + puts "sucess" + redirect_to employer_path(@setup.employer.slug), notice: 'ID Card Exceptions successfully updated.' + else + puts "fail" + render :field_exceptions, status: :unprocessable_entity + end + + end + def destroy # @resource = Resource.find(params[:id]) # @resource.destroy @@ -53,6 +97,15 @@ module IdCard private + def set_employer_and_setup + @employer = Employer.find_by(slug: params[:employer_id]) + if @employer.id_card_setup.present? + @setup = @employer.id_card_setup + else + @setup = @employer.create_id_card_setup + end + end + # def process_logos(employer_setup_process_params) # @uploaded_logos = [] # employer_logo = employer_setup_process_params["employer_logo"] @@ -129,15 +182,15 @@ module IdCard # ) # end - # def network_exceptions_params - # params.require(:employer_setup_network_exceptions_form).permit( - # network_exceptions: [:network_logo, exceptions: [:type, :value]], + # def network_field_exceptions_params + # params.require(:employer_setup_network_field_exceptions_form).permit( + # network_field_exceptions: [:network_logo, field_exceptions: [:type, :value]], # ) # end # def form_for_step # step_name = @top_form.current_step - # form_method = "EmployerSetup#{step_name.camelize}Form".constantize + # form_method = "EmployerConfiguration#{step_name.camelize}Form".constantize # # puts "/////\\\\\\||||||" # # puts session[:employer_setup_data] # # puts session[:employer_setup_data]['employer_setup_process_id'] @@ -146,7 +199,7 @@ module IdCard # end # def process_step(step_name) - # @form_method = "EmployerSetup#{step_name.camelize}Form".constantize + # @form_method = "EmployerConfiguration#{step_name.camelize}Form".constantize # session_data_name = "#{step_name}_data" # # puts "1--------------params----" # # puts params @@ -180,13 +233,13 @@ module IdCard # def global_params(step_name) # form_name_sym = "employer_setup_#{step_name}_form".to_sym - # params.require(form_name_sym).permit(EmployerSetupForm.permitted_params) + # params.require(form_name_sym).permit(EmployerConfigurationForm.permitted_params) # end # def process_step(step_name) # form_name = "employer_setup_#{step_name}_form".camelize.constantize # form_params_name = "#{step_name}_params".to_sym - # allowed_params = [:general_information_params, :plans_params, :network_exceptions_params] + # allowed_params = [:general_information_params, :plans_params, :network_field_exceptions_params] # if allowed_params.include?(form_params_name) # form_params = send(form_params_name) # @form = form_name.new(form_params) @@ -211,7 +264,7 @@ module IdCard # :number_of_plans, # :network, # :number_of_additional_network_logos, - # network_exceptions: [:network_logo, exceptions: [:type, :value]], + # network_field_exceptions: [:network_logo, field_exceptions: [:type, :value]], # plans: permited_plans_keys, # benefit_descs: benefit_sequence_keys # ) diff --git a/app/javascript/controllers/add_exception_item_controller.js b/app/javascript/controllers/add_exception_item_controller.js index 5d1e090..06e71e2 100644 --- a/app/javascript/controllers/add_exception_item_controller.js +++ b/app/javascript/controllers/add_exception_item_controller.js @@ -4,9 +4,10 @@ export default class extends Controller { static targets = ["exceptionItemTemplate", "exceptionItemContainer", "exceptionItem", "exceptionItemButton"] connect() { - const content = this.#newExemptionItem() - - this.exceptionItemButtonTarget.insertAdjacentHTML('beforebegin', content); + if (this.exceptionItemTargets.length > 0) { + const content = this.#newExemptionItem() + this.exceptionItemButtonTarget.insertAdjacentHTML('beforebegin', content); + } } addExemptionItem(event) { @@ -36,6 +37,7 @@ export default class extends Controller { #newExemptionItem() { const nextIndex = this.exceptionItemTargets.length + console.log(nextIndex) const buttonElement = this.exceptionItemButtonTarget; // Get the computed style (returns rgb/rgba value) diff --git a/app/javascript/controllers/add_plan_controller.js b/app/javascript/controllers/add_plan_controller.js index 86e94bd..74c5ba1 100644 --- a/app/javascript/controllers/add_plan_controller.js +++ b/app/javascript/controllers/add_plan_controller.js @@ -33,6 +33,7 @@ export default class extends Controller { #updateTemplatePlan() { const nextIndex = this.planTargets.length + console.log(nextIndex) const num_of_colors = this.formColorValue.length let colorIndex = 0 let newSecondaryColor = "copper" diff --git a/app/javascript/controllers/benefits_template_picker_controller.js b/app/javascript/controllers/benefits_template_picker_controller.js index dc3f861..67c435f 100644 --- a/app/javascript/controllers/benefits_template_picker_controller.js +++ b/app/javascript/controllers/benefits_template_picker_controller.js @@ -14,7 +14,7 @@ export default class extends Controller { return; } - const url = `/id_card_benefits_templates/get_template_benefits/${templateId}` + const url = `/id_card/plans/${templateId}/get_plan_benefits` const response = await fetch(url); const templateBenefitsData = await response.json(); diff --git a/app/javascript/controllers/exceptions_toggle_controller.js b/app/javascript/controllers/exceptions_toggle_controller.js new file mode 100644 index 0000000..42b62da --- /dev/null +++ b/app/javascript/controllers/exceptions_toggle_controller.js @@ -0,0 +1,57 @@ +import { Controller } from "@hotwired/stimulus" + +export default class extends Controller { + static targets = ["dependentField", "providerField", "selectField"] + + connect() { + console.log("--- in toggle connect --- ") + const selector = this.selectFieldTarget; + if (selector.value) { + const selectedValue = selector.value + this.dependentFieldTargets.forEach((field) => { + if (field.value) { + if (selectedValue == "network_logo") { + field.parentElement.parentElement.parentElement.classList.remove("hidden"); + } else { + field.parentElement.classList.remove("hidden"); + } + } + }) + } + } + + toggleFields() { + console.log("--- in toggle --- ") + const selector = this.selectFieldTarget; + if (selector.value) { + const selectedValue = selector.value + this.field_match = false; + this.dependentFieldTargets.forEach((field) => { + // console.log("- ", selectedValue) + // console.log("-- ", this.field_match) + // Check a data attribute on the field to see if it matches the selected value + if (field.dataset.parentValue === selectedValue) { + if (selectedValue == "network_logo") { + field.parentElement.parentElement.parentElement.classList.remove("hidden"); + } else { + field.parentElement.classList.remove("hidden"); + } + this.field_match = true; + } else { + if (field.dataset.parentValue == "network_logo") { + field.parentElement.parentElement.parentElement.classList.add("hidden"); + } else { + field.parentElement.classList.add("hidden"); + } + } + }); + if (!this.field_match) { + console.log("--- ", this.field_match) + const defaultOption = this.dependentFieldTargets.find(target => { + return target.dataset.parentValue === 'default'; + }); + defaultOption.parentElement.classList.remove("hidden"); + } + } + } +} \ No newline at end of file diff --git a/app/javascript/controllers/general_form_controller.js b/app/javascript/controllers/general_form_controller.js index 28be673..2bdecbd 100644 --- a/app/javascript/controllers/general_form_controller.js +++ b/app/javascript/controllers/general_form_controller.js @@ -1,9 +1,78 @@ import { Controller } from "@hotwired/stimulus" export default class extends Controller { - static targets = ["dependentField"] + static targets = ["dependentField", "providerField", "selectField"] connect() { + if (this.selectFieldTarget.value) { + this.toggleNewFieldSection(); + } + } + + async initNewFieldSection() { + console.log("--- in init async --- ") + const selector = this.selectFieldTarget + console.log(selector.textContent) + console.log(selector.value) + if (selector && selector.value && !selector.textContent.includes("Default")) { + const sectionId = selector.value + + const response = await fetch(`/id_card/provider_sections/${sectionId}/get_section_data`); + const templateSectionData = await response.json(); + + this.#updateFields(templateSectionData) + + this.dependentFieldTarget.classList.remove("hidden"); + } + } + + async toggleNewFieldSection() { + console.log("--- in new field toggle --- ") + const selector = this.selectFieldTarget + const selectedOption = selector.options[selector.selectedIndex] + const selectedValue = selectedOption.value + const selectedLabel = selectedOption.textContent + + if (selectedValue && selectedLabel.includes("Default")) { + this.dependentFieldTarget.classList.add("hidden"); + } else if (selectedValue) { + let sectionId = selectedValue + if (selectedValue.includes("new")) { + sectionId = selectedValue.split('|')[1] + } + const response = await fetch(`/id_card/provider_sections/${sectionId}/get_section_data`); + const sectionData = await response.json(); + + this.#updateFields(sectionData) + + this.dependentFieldTarget.classList.remove("hidden"); + } + + } + + async #updateFields(templateSectionData) { + const providerFieldTargetsList = this.providerFieldTargets + console.log(templateSectionData) + providerFieldTargetsList.forEach(function(formField) { + const dbField = formField.id.replace('id_card_configuration_provider_section_', '') + const dbValue = templateSectionData[dbField] + formField.value = dbValue; + + }) + + + + + // templateSectionData.forEach(function(data) { + // const targetElement = providerFieldTargetsList.find( + // (element) => element.dataset.sequence == data.sequence + // ); + // if (targetElement) { + // targetElement.value = data.benefit; + // } else { + // console.error(`Target not found for sequence: ${data.sequence}`); + // } + // }); } toggleFields() { diff --git a/app/javascript/controllers/logo_upload_controller.js b/app/javascript/controllers/logo_upload_controller.js index 10220c7..cdeb740 100644 --- a/app/javascript/controllers/logo_upload_controller.js +++ b/app/javascript/controllers/logo_upload_controller.js @@ -5,21 +5,38 @@ export default class extends Controller { logoType: String, employerName: String } - static targets = ["preview", "previewContainer", "logoSelect", "logoField", "initialLogoFile"]; + static targets = ["preview", "previewContainer", "logoSelect", "logoIdField", "logoNameField", "initialLogoFile"]; async connect() { console.log('in connect'); - const initValue = this.logoFieldTarget.value + this.setPreviewImage() + // Remember to revoke the URL when the controller is disconnected if necessary + // this.disconnect = () => URL.revokeObjectURL(objectUrl); + } + + async setPreviewImage() { + const initValue = this.logoIdFieldTarget.value console.log(initValue) + console.log(this.logoTypeValue) if (initValue) { const response = await fetch(`/id_card/${this.logoTypeValue}_logos/${initValue}/image`); // Fetch the binary data + const logoType = this.logoTypeValue + if (logoType == "employer") { + const contentDisposition = response.headers.get('Content-Disposition'); + const filename = contentDisposition.match(/filename="?([^"]+)"?/)[1]; + this.logoNameFieldTarget.value = filename; + } const blob = await response.blob(); const objectUrl = URL.createObjectURL(blob); this.previewTarget.src = objectUrl; this.previewContainerTarget.classList.remove("hidden"); + } else { + this.previewContainerTarget.classList.add("hidden"); } - // Remember to revoke the URL when the controller is disconnected if necessary - // this.disconnect = () => URL.revokeObjectURL(objectUrl); + } + + setSelectPreview(event) { + this.setPreviewImage() } uploadLogo(event) { @@ -34,19 +51,25 @@ export default class extends Controller { if (logoType == "network") { console.log("n " + newFileName); newFileName = this.determineNetworkFilename(logoFile) - this.addOptionToSelect(newFileName) - logoFile = new File([logoFile], newFileName) } else if (logoType == "employer") { newFileName = this.determineEmployerFilename(logoFile) - logoFile = new File([logoFile], newFileName) } + logoFile = new File([logoFile], newFileName) this.uploadLogoToServer(logoFile) .then((result) => { console.log(result); const logoId = result.id this.previewFile(logoFile); - this.logoFieldTarget.value = logoId; + if (logoType == "network") { + this.addOptionToSelect(newFileName, logoId) + } else { + this.logoNameFieldTarget.value = newFileName; + } + + this.logoIdFieldTarget.value = logoId; + + }) .catch((error) => { // Handle any errors that occurred @@ -93,23 +116,22 @@ export default class extends Controller { } } - addOptionToSelect(name) { + addOptionToSelect(name, id) { const blankOptionIndex = 0; - const newOption = new Option(name, name, true, true) + const newOption = new Option(name, id, true, true) - if (this.logoFieldTarget.options.length > blankOptionIndex + 1) { - this.logoFieldTarget.insertBefore(newOption, this.logoFieldTarget.options[blankOptionIndex + 1]); + if (this.logoIdFieldTarget.options.length > blankOptionIndex + 1) { + this.logoIdFieldTarget.insertBefore(newOption, this.logoIdFieldTarget.options[blankOptionIndex + 1]); } else { - this.logoFieldTarget.appendChild(newOption); + this.logoIdFieldTarget.appendChild(newOption); } - this.logoFieldTarget.value = name; } determineNetworkFilename(logoFile) { const fileExtension = logoFile.name.split('.').pop(); const primaryNetworkName = prompt("Enter the name for the primary network (Usually 'Cigna' or 'MedCost':"); - const secondaryNetworkName = prompt("Enter the name for the primary network (ex: Health Partners):"); + const secondaryNetworkName = prompt("Enter the name for the partner network (ex: Health Partners):"); const logoFilename = this.titleizeText(primaryNetworkName).concat(this.titleizeText(secondaryNetworkName)).concat("Logo.").concat(fileExtension).replaceAll(' ', ''); return logoFilename diff --git a/app/javascript/controllers/provider_update_controller.js b/app/javascript/controllers/provider_update_controller.js new file mode 100644 index 0000000..722513d --- /dev/null +++ b/app/javascript/controllers/provider_update_controller.js @@ -0,0 +1,25 @@ +import { Controller } from "@hotwired/stimulus" + +export default class extends Controller { + static targets = ["providerNetworkField", "networkLogoField", "providerSectionField"] + + connect() { + console.log("---provider update---") + } + + syncDefaults() { + const pnValue = this.providerNetworkFieldTarget.value + if (pnValue == "Cigna") { + this.networkLogoFieldTarget.value = 1 + this.providerSectionFieldTarget.value = 30 + } else if (pnValue == "Medcost") { + this.networkLogoFieldTarget.value = 2 + this.providerSectionFieldTarget.value = 26 + } else { + this.networkLogoFieldTarget.value = "" + this.providerSectionFieldTarget.value = "" + } + const event = new Event('change', { bubbles: true }); + this.networkLogoFieldTarget.dispatchEvent(event); + } +} \ No newline at end of file diff --git a/app/models/employer.rb b/app/models/employer.rb index 31f3eda..3f6ec6f 100644 --- a/app/models/employer.rb +++ b/app/models/employer.rb @@ -1,6 +1,6 @@ class Employer < ApplicationRecord has_many :members - has_one :id_card_setup, class_name: 'IdCard::Setup', dependent: :destroy + has_one :id_card_configuration, class_name: 'IdCard::Configuration', dependent: :destroy scope :active, -> { where(active: true) } scope :inactive, -> { where(active: false) } @@ -38,6 +38,14 @@ class Employer < ApplicationRecord self.slug = employer_trim_name(self.name).parameterize end + def id_card_enabled? + self.id_card_configuration.present? + end + + def claims_check_enabled? + false + end + # def name_to_logo_filename(extension) # self.employer_trim_name(self.name).titleize.gsub(/\s+/, '').concat('Logo').concat(extension.downcase) # end diff --git a/app/models/id_card/employer_logo.rb b/app/models/id_card/employer_logo.rb index 586d2c1..1311d06 100644 --- a/app/models/id_card/employer_logo.rb +++ b/app/models/id_card/employer_logo.rb @@ -5,11 +5,11 @@ module IdCard private def calculate_aspect_ratio - image_io = StringIO.new(self.image_data) + image_io = StringIO.new(image_data) width, height = FastImage.size(image_io) image_ratio = width.to_f / height if image_ratio - self.aspect_ratio = image_ratio.round(2) + aspect_ratio = image_ratio.round(2) end end end diff --git a/app/models/id_card/exception.rb b/app/models/id_card/exception.rb deleted file mode 100644 index cfa76d0..0000000 --- a/app/models/id_card/exception.rb +++ /dev/null @@ -1,12 +0,0 @@ -module IdCard - class Exception < ApplicationRecord - belongs_to :setup - has_many :exception_items - accepts_nested_attributes_for :exception_items, allow_destroy: true, reject_if: :all_blank - - VALID_TYPES = ['zipcode', 'state', 'family_id'] - - validates :type, inclusion: { in: VALID_TYPES, - message: "%{value} is not a valid exception type" } - end -end diff --git a/app/models/id_card/field_exception.rb b/app/models/id_card/field_exception.rb new file mode 100644 index 0000000..14e8d4e --- /dev/null +++ b/app/models/id_card/field_exception.rb @@ -0,0 +1,35 @@ +module IdCard + class FieldException < ApplicationRecord + belongs_to :configuration + has_many :field_exception_items, dependent: :destroy + accepts_nested_attributes_for :field_exception_items, allow_destroy: true, reject_if: :all_blank + + VALID_TYPES = ['zipcode', 'state', 'family_id'] + + validates :exception_type, inclusion: { in: VALID_TYPES, + message: "%{value} is not a valid exception type" } + + + class << self + + def permitted_params(params) + params.require(:id_card_configuration).permit( + field_exceptions_attributes: [ + :exception_type, + :exception_value, + :_destroy, + field_exception_items_attributes: [ + :field_name, + :field_value, + :network_logo_id, + :provider_section_id, + :_destroy + ] + ] + ) + end + + end + + end +end diff --git a/app/models/id_card/exception_item.rb b/app/models/id_card/field_exception_item.rb similarity index 100% rename from app/models/id_card/exception_item.rb rename to app/models/id_card/field_exception_item.rb diff --git a/app/models/id_card/network_logo.rb b/app/models/id_card/network_logo.rb index be4c67c..1f5905a 100644 --- a/app/models/id_card/network_logo.rb +++ b/app/models/id_card/network_logo.rb @@ -1,13 +1,31 @@ module IdCard class NetworkLogo < ApplicationRecord - before_save :round_aspect_ratio + before_validation :calculate_aspect_ratio, if: :image_data_changed? + + scope :defaults, -> { where(default: true) } + + class << self + + def medcost + defaults.where("filename LIKE ?", "%Medcost%") + end + + def cigna + defaults.where("filename LIKE ?", "%Cigna%") + end + + end private - def round_aspect_ratio - if self.aspect_ratio.present? - self.aspect_ratio = self.aspect_ratio.round(2) + def calculate_aspect_ratio + image_io = StringIO.new(image_data) + width, height = FastImage.size(image_io) + image_ratio = width.to_f / height + if image_ratio + self.aspect_ratio = image_ratio.round(2) end end + end end diff --git a/app/models/id_card/plan.rb b/app/models/id_card/plan.rb index fea15b3..6caac56 100644 --- a/app/models/id_card/plan.rb +++ b/app/models/id_card/plan.rb @@ -1,27 +1,68 @@ module IdCard class Plan < ApplicationRecord - belongs_to :setup + belongs_to :configuration, optional: true has_many :plan_benefits, dependent: :destroy accepts_nested_attributes_for :plan_benefits, allow_destroy: true, reject_if: :all_blank - # after_initialize :create_default_benefits, if: :new_record? + scope :templates, -> { where(template: true) } + BENEFIT_FIELDS = ["Primary Visit", + "Specialist Visit", + "Urgent Care", + "INN-Ind Ded", + "INN-Family Ded", + "OON-Ind Ded", + "OON-Family Ded", + "Co-Insurance", + "INN-Ind OOP", + "INN-Family OOP", + "OON-Ind OOP", + "OON-Family OOP", + "Emergency Room", + "Preventive Care"].freeze - def self.permitted_params(params) - params.require(:id_card_plan).permit( - :title, - :pb_product_key, - :pl_plan_key, - :_destroy, - id_card_plan_benefits_attributes: [ - :id, - :benefit_desc, - :benefit, - :sequence, - :_destroy, - ] - ) + after_initialize :build_plan_benefits, if: :new_record? + + def build_plan_benefits + BENEFIT_FIELDS.each_with_index do |bene, i| + self.plan_benefits.build(benefit_desc: bene, sequence: (i + 1)) end + end + + def format_template + formatted_title = title + if pl_plan_key.present? + employer_name = Employer.find_by(pl_plan_key: pl_plan_key).pluck(:name) + formatted_title.concat( " (#{employer_name})" ) + end + { id: id, title: formatted_title } + end + + class << self + + # def templates + # active_templates.map(&:format_template) + # end + + def permitted_params(params) + params.require(:id_card_configuration).permit( + plans_attributes: [ + :title, + :pb_product_key, + :pl_plan_key, + :_destroy, + plan_benefits_attributes: [ + :id, + :benefit_desc, + :benefit, + :sequence, + :_destroy, + ] + ] + ) + end + + end private diff --git a/app/models/id_card/provider_section.rb b/app/models/id_card/provider_section.rb index 21ebc7d..af11423 100644 --- a/app/models/id_card/provider_section.rb +++ b/app/models/id_card/provider_section.rb @@ -1,5 +1,36 @@ module IdCard class ProviderSection < ApplicationRecord + scope :defaults, -> { where(default: true) } + + def self.permitted_params(params) + params.require(:id_card_configuration).require(:provider_section).permit( + :provider_line_1, + :provider_line_2, + :provider_line_3, + :provider_line_4, + :provider_line_5, + :provider_line_6, + :provider_line_7, + :provider_line_8, + :provider_line_9, + :provider_line_10, + :provider_line_11, + :provider_line_12, + :claim_to_1, + :claim_to_2, + :claim_to_3, + :claim_to_4, + :claim_to_5, + :claim_to_6, + :claim_to_7, + :claim_to_8, + :claim_to_9, + :claim_to_10, + :claim_to_11, + :claim_to_12 + ) + end + end end \ No newline at end of file diff --git a/app/models/id_card/setup.rb b/app/models/id_card/setup.rb index fdf76dc..cd4a779 100644 --- a/app/models/id_card/setup.rb +++ b/app/models/id_card/setup.rb @@ -1,5 +1,5 @@ module IdCard - class Setup < ApplicationRecord + class Configuration < ApplicationRecord belongs_to :employer, class_name: 'Employer' belongs_to :employer_logo, optional: true belongs_to :network_logo, optional: true @@ -7,8 +7,17 @@ module IdCard belongs_to :rx_section, optional: true has_many :plans, dependent: :destroy + has_many :field_exceptions, dependent: :destroy - has_many :exceptions, dependent: :destroy + accepts_nested_attributes_for :plans, allow_destroy: true, reject_if: :all_blank + accepts_nested_attributes_for :field_exceptions, allow_destroy: true, reject_if: :all_blank + + attribute :queued_card_count, :integer, default: 0 + + scope :active, -> { where(active: true) } + + FORM_COLORS = ['atmosphere', 'verdigris', 'bluemana', 'cobalt'] + MODULE_COLOR = 'atmosphere' # def employer_logo_filename # self.employer_logo.filename @@ -18,13 +27,25 @@ module IdCard # self.network_logo.filename # end + def build_plan_with_default_benefits(attributes = {}) + plan = plans.new(attributes) + benefits = IdCardBenefitsTemplate.find_by(title: "BLANK").id_card_benefits.sort_by(&:sequence) + benefits.each do |ben| + plan.plan_benefits.new(benefit_desc: ben.benefit_desc, sequence: ben.sequence) + end + plan + end + def self.permitted_params(params) - params.require(:id_card_setup).permit( + params.require(:id_card_configuration).permit( :print_name, :network_provider, :card_template, :rx_group_number, - :id_card_employer_logo_id + :employer_logo_id, + :network_logo_id, + :rx_section_id, + :provider_section_id ) end end diff --git a/app/services/benefits_word_doc/map_employer_logo.rb b/app/services/benefits_word_doc/map_employer_logo.rb index 2ed07cb..59ca9d7 100644 --- a/app/services/benefits_word_doc/map_employer_logo.rb +++ b/app/services/benefits_word_doc/map_employer_logo.rb @@ -19,10 +19,9 @@ module BenefitsWordDoc filename = @employer.name_to_logo_filename(file_extension) - logo = CardLogoFile.find_or_create_by(filename: filename) do |clf| + logo = IdCard::EmployerLogo.find_or_create_by(filename: filename) do |clf| clf.image_data = image_binary clf.content_type = meme_type - clf.logo_type = "employer" end # new_logo = CardLogoFile.create!( @@ -32,16 +31,16 @@ module BenefitsWordDoc # logo_type: "employer" # ) - image_io = StringIO.new(image_binary) - width, height = FastImage.size(image_io) - image_ratio = width.to_f / height - if (0.8..1.2).cover?(image_ratio) - @employer.single_card_template = "FairosRxIDCard-Half" - else - @employer.single_card_template = "FairosRxIDCard" - end + # image_io = StringIO.new(image_binary) + # width, height = FastImage.size(image_io) + # image_ratio = width.to_f / height + # if (0.8..1.2).cover?(image_ratio) + # @employer.single_card_template = "FairosRxIDCard-Half" + # else + # @employer.single_card_template = "FairosRxIDCard" + # end - @employer.employer_logo_filename = logo.filename + @employer.id_card_configuration.employer_logo = logo end end @employer diff --git a/app/services/benefits_word_doc/map_network_information.rb b/app/services/benefits_word_doc/map_network_information.rb index 7c49443..a9c084c 100644 --- a/app/services/benefits_word_doc/map_network_information.rb +++ b/app/services/benefits_word_doc/map_network_information.rb @@ -7,19 +7,29 @@ module BenefitsWordDoc end def call - network_matches = [] - @word_doc_section.each do |line| - if network_matches.exclude?("Cigna") && line.match?(/cigna/i) - network_matches.push("Cigna") - elsif network_matches.exclude?("Medcost") && line.match?(/medcost/i) - network_matches.push("Medcost") + # network = @word_doc_section.each do |line| + # if line.match?(/cigna/i) + # return "Cigna" + # elsif line.match?(/medcost/i) + # return "Medcost" + # end + # end + + network = @word_doc_section.find do |line| + if line.match?(/cigna/i) + break "Cigna" + elsif line.match?(/medcost/i) + break "Medcost" end end - if network_matches.length == 1 - network_provider = network_matches.first - @employer.network_provider = network_provider - @employer.default_network_logo = "#{network_provider}Logo.png" + # yellow_fruit_names_filtered = @word_doc_section.filter_map do |line| + # item[:name] if item[:color] == 'yellow' + # end + + if network + @employer.id_card_configuration.network_provider = network + @employer.id_card_configuration.network_logo = IdCard::NetworkLogo provider_code = network_provider == "Cigna" ? "5" : "2" @employer.card_provider = CardProvider.find_by(provider_code: provider_code) @employer.card_rx = CardRx.find_by(web_url: "www.FairosRx.com") diff --git a/app/services/employer_cards/queue_counter.rb b/app/services/employer_cards/queue_counter.rb new file mode 100644 index 0000000..bfe84b7 --- /dev/null +++ b/app/services/employer_cards/queue_counter.rb @@ -0,0 +1,13 @@ +module EmployerCards + class QueueCounter + + def initialize() + @employer_pl_plan_keys = IdCard::Configuration.active.pluck(:pl_plan_key).join(',') + end + + def call + CallStoredProc.new('HLGetQueuedIdCardsTPANewCount', { PLPlanKeys: @employer_pl_plan_keys }).call.to_ary + end + + end +end \ No newline at end of file diff --git a/app/services/image_processor.rb b/app/services/image_processor.rb index 2eff15f..fc8365e 100644 --- a/app/services/image_processor.rb +++ b/app/services/image_processor.rb @@ -1,8 +1,14 @@ class ImageProcessor + ALLOWED_LOGO_TYPES = ['Network', 'Employer'].freeze - def initialize(image_path, new_filename = nil) + def initialize(image_path, logo_type, new_filename = nil) @image_path = image_path + @logo_type = logo_type.capitalize @new_filename = new_filename + + unless ALLOWED_LOGO_TYPES.include?(@logo_type) + raise ArgumentError, "Invalid logo type: #{@logo_type}. Must be one of: #{ALLOWED_LOGO_TYPES.join(', ')}" + end end def call @@ -17,11 +23,11 @@ class ImageProcessor # binary_data = File.open(@image_path, 'rb').read meme_type = Marcel::MimeType.for Pathname.new(@image_path) - CardLogoFile.create( - filename: filename, - image_data: binary_data, - content_type: meme_type, - logo_type: "employer" - ) + logo_model = "IdCard::#{@logo_type}Logo".constantize + + logo_model.find_or_create_by(filename: filename) do |logo| + logo.image_data = binary_data + logo.content_type = meme_type + end end end \ No newline at end of file diff --git a/app/services/sample_card/data_formatter.rb b/app/services/sample_card/data_formatter.rb index b16754f..56112b3 100644 --- a/app/services/sample_card/data_formatter.rb +++ b/app/services/sample_card/data_formatter.rb @@ -32,7 +32,7 @@ module SampleCard def set_plan_fields plans_sample_cards = [] - @employer.plans.each do |plan| + @employer.id_card_configuration.plans.each do |plan| plan_sample_card = @sample_card.dup plan_name = plan.title.split(/(?<=\d[kK])/).first plan_sample_card.family_id = plan_name @@ -56,7 +56,7 @@ module SampleCard end def set_network_fields - selected_attributes = @employer.card_provider.attributes.with_indifferent_access.slice( + selected_attributes = @employer.id_card_configuration.provider_section.attributes.with_indifferent_access.slice( :provider_line_1, :provider_line_2, :provider_line_3, :provider_line_4, :provider_line_5, :provider_line_6, :provider_line_7, :provider_line_8, :provider_line_9, :provider_line_10, :provider_line_11, :provider_line_12, :claim_to_1, :claim_to_2, :claim_to_3, :claim_to_4, :claim_to_5, :claim_to_6, @@ -71,7 +71,7 @@ module SampleCard def set_rx_fields # fairos_information = Vhcs::HlrxCrosRef.where(pl_plan_key: 52).first - selected_attributes = @employer.card_rx.attributes.with_indifferent_access.slice( + selected_attributes = @employer.id_card_configuration.rx_section.attributes.with_indifferent_access.slice( :customer_service, :web_url ) diff --git a/app/views/employer_setup/_first_plan_fields.html.erb b/app/views/employer_setup/_first_plan_fields.html.erb index 5c36417..5e3eb78 100644 --- a/app/views/employer_setup/_first_plan_fields.html.erb +++ b/app/views/employer_setup/_first_plan_fields.html.erb @@ -4,8 +4,8 @@ <% end %>
-
rounded-bl-lg">
-
-ml-[6px] z-2 w-full"> +
rounded-bl-lg">
+
-ml-[6px] z-2 w-full"> <%= "Plan #{i + 1}" %>
diff --git a/app/views/employer_setup/edit.html.erb b/app/views/employer_setup/edit.html.erb index 40d73c5..09c8d7e 100644 --- a/app/views/employer_setup/edit.html.erb +++ b/app/views/employer_setup/edit.html.erb @@ -1,6 +1,6 @@

Edit Employer

- <%= form_with model: @employer_setup, url: employer_setup_index_path, local: true, multipart: true do |f| %> + <%= form_with model: @employer_configuration, url: employer_configuration_index_path, local: true, multipart: true do |f| %>

General Information

@@ -51,17 +51,17 @@

Plans Information

-
+
- <% @employer_setup.plans.each_with_index do |plan, index| %> + <% @employer_configuration.plans.each_with_index do |plan, index| %> <%= f.fields_for :plans, plan, child_index: index do |plan_fields| %>
-
">
-
-ml-[6px] z-2 w-full"> +
">
+
-ml-[6px] z-2 w-full"> <%= "Plan #{index + 1}" %>
<%= render 'plan_fields', plan_fields: plan_fields, f: f, index: index %> -
"> +
"> Benefit Values
ml-[3px]">
@@ -106,7 +106,7 @@

Alternative Network Information

-
+
<%= button_tag "Add a Regional Logo", class: "cursor-pointer text-lg font-medium py-2 px-4 rounded w-1/7 h-75 my-8 text-[#E0E0E0] rounded-lg border border-[#C2C2C2] hover:shadow-[0_0_10px_3px_#93c5fd]", data: { action: "add-alt-network-logo#add", add_alt_network_logo_target: "button" } %>
diff --git a/app/views/employer_setup/index.html.erb b/app/views/employer_setup/index.html.erb index 5dbbcfb..a14b1d2 100644 --- a/app/views/employer_setup/index.html.erb +++ b/app/views/employer_setup/index.html.erb @@ -1,6 +1,6 @@

Employer Setups

- <% plan_colors = EmployerSetupPlansForm::PLAN_COLORS.push('copper', 'bronze').shuffle %> + <% plan_colors = IdCard::Configuration::FORM_COLORS.push('copper', 'bronze').shuffle %> <% @employer_setups.each_with_index do |es, index| %> <% item_color_index = index == 0 ? 0 : index % plan_colors.length %>
"> diff --git a/app/views/employer_setup/network_exceptions.html.erb b/app/views/employer_setup/network_exceptions.html.erb index f577c56..478dc55 100644 --- a/app/views/employer_setup/network_exceptions.html.erb +++ b/app/views/employer_setup/network_exceptions.html.erb @@ -1,4 +1,4 @@ -
+

New Employer Setup

Provider Network

<%= form_with model: @form, url: employer_setup_index_path, local: true do |f| %> diff --git a/app/views/employer_setup/new.html.erb b/app/views/employer_setup/new.html.erb index 7fabfb4..b624e2f 100644 --- a/app/views/employer_setup/new.html.erb +++ b/app/views/employer_setup/new.html.erb @@ -57,16 +57,16 @@

Plans Information

-
+
<%= f.fields_for :plans, @employer_setup.plans.first, child_index: 0 do |plan_fields| %>
-
">
-
-ml-[6px] z-2 w-full"> +
">
+
-ml-[6px] z-2 w-full"> <%= "Plan 1" %>
<%= render 'plan_fields', plan_fields: plan_fields, f: f, index: 0 %> -
"> +
"> Benefit Values
@@ -110,7 +110,7 @@

Alternative Network Information

-
+
<%= button_tag "Add a Regional Logo", class: "cursor-pointer text-lg font-medium py-2 px-4 rounded w-1/7 h-55 my-8 text-[#E0E0E0] rounded-lg border border-[#C2C2C2] hover:shadow-[0_0_10px_3px_#93c5fd]", data: { action: "add-alt-network-logo#add", add_alt_network_logo_target: "button" } %>
diff --git a/app/views/employer_setup/plans.html.erb b/app/views/employer_setup/plans.html.erb index 1bb1bf7..4c68935 100644 --- a/app/views/employer_setup/plans.html.erb +++ b/app/views/employer_setup/plans.html.erb @@ -1,4 +1,4 @@ -
+

New Employer Setup

Medical Plans

@@ -17,8 +17,8 @@
<% @form.plans.each_with_index do |plan, i| %>
-
rounded-bl-lg">
-
-ml-[6px] z-2 w-full"> +
rounded-bl-lg">
+
-ml-[6px] z-2 w-full"> <%= "Plan #{i + 1}" %>
<%= f.fields_for :plans, index: i do |plan_fields| %> diff --git a/app/views/employers/index.html.erb b/app/views/employers/index.html.erb index e1e1f55..ecf4281 100644 --- a/app/views/employers/index.html.erb +++ b/app/views/employers/index.html.erb @@ -6,7 +6,7 @@ <% end %>
- <% plan_colors = EmployerSetupPlansForm::PLAN_COLORS.push('copper', 'bronze').shuffle %> + <% plan_colors = IdCard::Configuration::FORM_COLORS.push('copper', 'bronze').shuffle %> <% @color_index = 0 %>

In Process:

<% @employers.inactive.each_with_index do |emp, index| %> diff --git a/app/views/employers/show.html.erb b/app/views/employers/show.html.erb index 8e25f44..32fc768 100644 --- a/app/views/employers/show.html.erb +++ b/app/views/employers/show.html.erb @@ -1,17 +1,20 @@
+ <%= link_to employers_path, class: "flex h-10 w-10 text-xl transition duration-100" do %> + <%= icon "arrow-big-left-dash", library: "lucide", class: "h-full w-full text-center text-bluemana hover:text-bronze" %> + <% end %>

<%= @employer.name %>

- <% if @employer&.id_card_setup&.id_card_employer_logo&.filename %> - <%= image_tag image_id_card_employer_logo_path(@employer.id_card_setup.id_card_employer_logo.filename), class: "max-h-[50px] object-contain shadow-[0_0_10px_3px_#93c5fd]" %> + <% if @employer&.id_card_configuration&.employer_logo&.filename %> + <%= image_tag image_id_card_employer_logo_path(@employer.id_card_configuration.employer_logo.id), class: "max-h-[50px] object-contain shadow-[0_0_10px_3px_#93c5fd]" %> <% end %>
-
+
-

Employer Information

-
+

Employer Information

+

"> @@ -23,7 +26,7 @@ <%= @employer.effective_date %>

- └── Key Chain + └── Key Chain
<% @employer.attributes.with_indifferent_access.slice(:pl_plan_key, :company_pb_entity_key, :group_number).each do |attribute_name, attribute_value| %>

"> @@ -31,11 +34,11 @@ <%= attribute_value.present? ? attribute_value.to_s : "waiting" %>

<% end %> - <% if @employer&.id_card_setup&.id_card_plans %> + <% if @employer&.id_card_configuration&.plans.present? %>
└── Plans
- <% @employer.id_card_setup.id_card_plans.pluck(:title, :pb_product_key).each do |plan| %> + <% @employer.id_card_configuration.plans.pluck(:title, :pb_product_key).each do |plan| %>
├── <%= plan.first %>
@@ -45,24 +48,76 @@

<% end %> <% end %> -
-
- <%= link_to 'Edit', edit_employer_path(@employer.slug), class: "hover:text-atmosphere" %> -

|

- <%= link_to 'Back', employers_path, class: "hover:text-atmosphere" %> +
+ <%= link_to 'Edit Employer', edit_employer_path(@employer.slug), data: { turbo: false }, class: "flex justify-center items-center w-full cursor-pointer bg-brightlava hover:bg-deepcove border-2 border-brightlava text-platinum text-lg font-bold px-3 rounded-lg h-10 transition duration-100" %>
-
-
-

ID Card Actions

-
+
+
+ <% module_color = IdCard::Configuration::MODULE_COLOR %> +
+

ID Card Module

+
- <%= link_to "Setup", new_id_card_setup_path(employer: @employer.slug), data: { turbo: false }, class: "flex justify-center items-center w-2/3 cursor-pointer bg-atmosphere hover:bg-deepcove border-2 border-atmosphere text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %> +
+ <% if @employer.id_card_enabled? %> +
+
+
+ Setup +
+ +
+
+ <%= link_to "General", general_employer_id_card_configuration_index_path(employer_id: @employer.slug), data: { turbo: false }, class: "flex justify-center items-center w-full cursor-pointer bg-#{module_color} hover:bg-deepcove border-2 border-#{module_color} text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %> + <%= link_to "Plans", plans_employer_id_card_configuration_index_path(employer_id: @employer.slug), data: { turbo: false }, class: "flex justify-center items-center w-full cursor-pointer bg-#{module_color} hover:bg-deepcove border-2 border-#{module_color} text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %> + <%= link_to 'Exceptions (Optional)', field_exceptions_employer_id_card_configuration_index_path(employer_id: @employer.slug ), data: { turbo: false }, class: "flex justify-center items-center w-full cursor-pointer bg-#{module_color} hover:bg-deepcove border-2 border-#{module_color} text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %> +
+
+
+
+
+ Actions +
+ +
+
+ <%= link_to 'Generate Sample Cards', generate_sample_id_card_print_data_path(employer_slug: @employer.slug ), data: { turbo: false }, class: "flex justify-center items-center w-full cursor-pointer bg-#{module_color} hover:bg-deepcove border-2 border-#{module_color} text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %> + <%= link_to 'Generate Group Cards (for print)', generate_print_id_card_print_data_path(employer_slug: @employer.slug ),data: { turbo: false }, class: "flex justify-center items-center w-full #{@employer.active ? "" : "pointer-events-none opacity-50 cursor-not-allowed"} bg-#{module_color} hover:bg-deepcove border-2 border-#{module_color} text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %> + <%= link_to 'Generate Group Cards (for display)', generate_mobile_display_id_card_print_data_path(employer_slug: @employer.slug ), data: { turbo: false }, class: "flex justify-center items-center w-full #{@employer.active ? "" : "pointer-events-none opacity-50 cursor-not-allowed"} bg-#{module_color} hover:bg-deepcove border-2 border-#{module_color} text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %> + <%= link_to 'Generate Group Cards (for download)', generate_full_page_id_card_print_data_path(employer_slug: @employer.slug ), data: { turbo: false }, class: "flex justify-center items-center w-full #{@employer.active ? "" : "pointer-events-none opacity-50 cursor-not-allowed"} bg-#{module_color} hover:bg-deepcove border-2 border-#{module_color} text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %> +
+
+ <% else %> + <%= link_to "Enable ID Card", general_employer_id_card_configuration_index_path(employer_id: @employer.slug), data: { turbo: false }, class: "flex justify-center items-center w-full h-full cursor-pointer bg-#{module_color} hover:bg-deepcove border-4 border-atmosphere text-platinum text-xl font-bold px-3 rounded-md mt-3 transition duration-100" %> + <% end %> +
+
+
+
+

Claims Check Module

+
+
+
+ <% if @employer.claims_check_enabled? %> - <%= link_to 'Generate Sample Cards', generate_sample_id_card_print_data_path(employer_slug: @employer.slug ), data: { turbo: false }, class: "flex justify-center items-center w-2/3 cursor-pointer bg-atmosphere hover:bg-deepcove border-2 border-atmosphere text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %> - <%= link_to 'Generate Group Cards (for print)', generate_print_id_card_print_data_path(employer_slug: @employer.slug ),data: { turbo: false }, class: "flex justify-center items-center w-2/3 #{@employer.active ? "" : "pointer-events-none opacity-50 cursor-not-allowed"} bg-atmosphere hover:bg-deepcove border-2 border-atmosphere text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %> - <%= link_to 'Generate Group Cards (for display)', generate_mobile_display_id_card_print_data_path(employer_slug: @employer.slug ), data: { turbo: false }, class: "flex justify-center items-center w-2/3 #{@employer.active ? "" : "pointer-events-none opacity-50 cursor-not-allowed"} bg-atmosphere hover:bg-deepcove border-2 border-atmosphere text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %> - <%= link_to 'Generate Group Cards (for download)', generate_full_page_id_card_print_data_path(employer_slug: @employer.slug ), data: { turbo: false }, class: "flex justify-center items-center w-2/3 #{@employer.active ? "" : "pointer-events-none opacity-50 cursor-not-allowed"} bg-atmosphere hover:bg-deepcove border-2 border-atmosphere text-platinum font-bold px-3 rounded-lg h-10 transition duration-100" %> + <% else %> + <%= link_to "Enable Claims Check", general_employer_id_card_configuration_index_path(employer_id: @employer.slug), data: { turbo: false }, class: "flex justify-center items-center w-full h-full cursor-pointer bg-cobalt-vivid hover:bg-deepcove border-4 border-cobalt-vivid text-platinum text-xl font-bold px-3 rounded-md mt-3 transition duration-100" %> + <% end %> +
+
+
+
+

FairosRx Eligibility Module

+
+
+
+ <% if @employer.claims_check_enabled? %> + + <% else %> + <%= link_to "Enable FairosRx Eligibility", general_employer_id_card_configuration_index_path(employer_id: @employer.slug), data: { turbo: false }, class: "flex justify-center items-center w-full h-full cursor-pointer bg-verdigris-vivid hover:bg-deepcove border-4 border-verdigris-vivid text-platinum text-xl font-bold px-3 rounded-md mt-3 transition duration-100" %> + <% end %> +
\ No newline at end of file diff --git a/app/views/employers_old/_first_plan_fields.html.erb b/app/views/employers_old/_first_plan_fields.html.erb index 5c36417..5e3eb78 100644 --- a/app/views/employers_old/_first_plan_fields.html.erb +++ b/app/views/employers_old/_first_plan_fields.html.erb @@ -4,8 +4,8 @@ <% end %>
-
rounded-bl-lg">
-
-ml-[6px] z-2 w-full"> +
rounded-bl-lg">
+
-ml-[6px] z-2 w-full"> <%= "Plan #{i + 1}" %>
diff --git a/app/views/employers_old/edit.html.erb b/app/views/employers_old/edit.html.erb index 29d520b..eec77ac 100644 --- a/app/views/employers_old/edit.html.erb +++ b/app/views/employers_old/edit.html.erb @@ -51,17 +51,17 @@

Plans Information

-
+
<% @employer.plans.each_with_index do |plan, index| %> <%= f.fields_for :plans, plan, child_index: index do |plan_fields| %>
-
">
-
-ml-[6px] z-2 w-full"> +
">
+
-ml-[6px] z-2 w-full"> <%= "Plan #{index + 1}" %>
<%= render 'plan_fields', plan_fields: plan_fields, f: f, index: index %> -
"> +
"> Benefit Values
ml-[3px]">
@@ -106,7 +106,7 @@

Alternative Network Information

-
+
<%= button_tag "Add a Regional Logo", class: "cursor-pointer text-lg font-medium py-2 px-4 rounded w-1/7 h-75 my-8 text-[#E0E0E0] rounded-lg border border-[#C2C2C2] hover:shadow-[0_0_10px_3px_#93c5fd]", data: { action: "add-alt-network-logo#add", add_alt_network_logo_target: "button" } %>
diff --git a/app/views/employers_old/index.html.erb b/app/views/employers_old/index.html.erb index e1e1f55..ecf4281 100644 --- a/app/views/employers_old/index.html.erb +++ b/app/views/employers_old/index.html.erb @@ -6,7 +6,7 @@ <% end %>
- <% plan_colors = EmployerSetupPlansForm::PLAN_COLORS.push('copper', 'bronze').shuffle %> + <% plan_colors = IdCard::Configuration::FORM_COLORS.push('copper', 'bronze').shuffle %> <% @color_index = 0 %>

In Process:

<% @employers.inactive.each_with_index do |emp, index| %> diff --git a/app/views/employers_old/network_exceptions.html.erb b/app/views/employers_old/network_exceptions.html.erb index f577c56..478dc55 100644 --- a/app/views/employers_old/network_exceptions.html.erb +++ b/app/views/employers_old/network_exceptions.html.erb @@ -1,4 +1,4 @@ -
+

New Employer Setup

Provider Network

<%= form_with model: @form, url: employer_setup_index_path, local: true do |f| %> diff --git a/app/views/employers_old/new.html.erb b/app/views/employers_old/new.html.erb index 3412b07..da0ba82 100644 --- a/app/views/employers_old/new.html.erb +++ b/app/views/employers_old/new.html.erb @@ -61,17 +61,17 @@

Plans Information

-
+
<% @employer.plans.each_with_index do |plan, index| %> <%= f.fields_for :plans, plan, child_index: index do |plan_fields| %>
-
">
-
-ml-[6px] z-2 w-full"> +
">
+
-ml-[6px] z-2 w-full"> <%= "Plan #{index + 1}" %>
<%= render 'plan_fields', plan_fields: plan_fields, f: f, index: index %> -
"> +
"> Benefit Values
ml-[3px]">
@@ -116,7 +116,7 @@

Alternative Network Information

-
+
<%= button_tag "Add a Regional Logo", class: "cursor-pointer text-lg font-medium py-2 px-4 rounded w-1/7 h-55 my-8 text-[#E0E0E0] rounded-lg border border-[#C2C2C2] hover:shadow-[0_0_10px_3px_#93c5fd]", data: { action: "add-alt-network-logo#add", add_alt_network_logo_target: "button" } %>
diff --git a/app/views/employers_old/new_new.html.erb b/app/views/employers_old/new_new.html.erb index f15a818..5707c34 100644 --- a/app/views/employers_old/new_new.html.erb +++ b/app/views/employers_old/new_new.html.erb @@ -61,17 +61,17 @@

Plans Information

-
+
<% @employer.plans.each_with_index do |plan, index| %> <%= f.fields_for :plans, plan, child_index: index do |plan_fields| %>
-
">
-
-ml-[6px] z-2 w-full"> +
">
+
-ml-[6px] z-2 w-full"> <%= "Plan #{index + 1}" %>
<%= render 'plan_fields', plan_fields: plan_fields, f: f, index: index %> -
"> +
"> Benefit Values
ml-[3px]">
@@ -116,7 +116,7 @@

ID Card Exceptions Information

-
+
<%= button_tag "Add an Exception", class: "cursor-pointer text-lg font-medium py-2 px-4 rounded w-1/7 h-35 my-8 text-[#E0E0E0] rounded-lg border border-[#C2C2C2] hover:shadow-[0_0_10px_3px_#93c5fd]", data: { action: "add-exception#addExemption", add_exception_target: "exceptionButton" } %>