diff --git a/Gemfile b/Gemfile
index 253f562..c74854c 100644
--- a/Gemfile
+++ b/Gemfile
@@ -85,7 +85,11 @@ gem "tailwindcss-rails"
gem 'docx'
gem 'httparty'
gem 'combine_pdf'
+gem 'pdf-reader'
gem 'rails_icons'
gem 'fastimage'
gem 'rubyzip', require: 'zip'
-gem "solid_queue"
\ No newline at end of file
+gem "solid_queue"
+gem 'image_processing'
+gem 'whenever', require: false
+gem 'amatch'
\ No newline at end of file
diff --git a/Gemfile.lock b/Gemfile.lock
index 8f53c16..2bd7965 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,6 +1,7 @@
GEM
remote: https://rubygems.org/
specs:
+ Ascii85 (2.0.1)
actioncable (7.2.3)
actionpack (= 7.2.3)
activesupport (= 7.2.3)
@@ -79,6 +80,10 @@ GEM
tzinfo (~> 2.0, >= 2.0.5)
addressable (2.8.9)
public_suffix (>= 2.0.2, < 8.0)
+ afm (1.0.0)
+ amatch (0.6.0)
+ mize
+ tins (~> 1)
ast (2.4.3)
base64 (0.3.0)
bcrypt (3.1.22)
@@ -103,6 +108,7 @@ GEM
regexp_parser (>= 1.5, < 3.0)
xpath (~> 3.2)
cgi (0.5.1)
+ chronic (0.10.2)
coderay (1.1.3)
combine_pdf (1.0.31)
matrix
@@ -128,11 +134,13 @@ GEM
et-orbi (1.4.0)
tzinfo
fastimage (2.4.1)
+ ffi (1.17.4-x86_64-linux-gnu)
fugit (1.12.1)
et-orbi (~> 1.4)
raabro (~> 1.4)
globalid (1.3.0)
activesupport (>= 6.1)
+ hashery (2.1.2)
httparty (0.24.2)
csv
mini_mime (>= 1.0.0)
@@ -141,6 +149,9 @@ GEM
concurrent-ruby (~> 1.0)
icons (0.8.1)
nokogiri (~> 1.16, >= 1.16.4)
+ image_processing (1.14.0)
+ mini_magick (>= 4.9.5, < 6)
+ ruby-vips (>= 2.0.17, < 3)
importmap-rails (2.2.3)
actionpack (>= 6.0.0)
activesupport (>= 6.0.0)
@@ -170,10 +181,13 @@ GEM
marcel (1.1.0)
matrix (0.4.3)
method_source (1.1.0)
+ mini_magick (5.3.1)
+ logger
mini_mime (1.1.5)
minitest (6.0.2)
drb (~> 2.0)
prism (~> 1.5)
+ mize (0.6.1)
msgpack (1.8.0)
multi_xml (0.8.1)
bigdecimal (>= 3.1, < 5)
@@ -194,6 +208,12 @@ GEM
parser (3.3.10.2)
ast (~> 2.4.1)
racc
+ pdf-reader (2.15.1)
+ Ascii85 (>= 1.0, < 3.0, != 2.0.0)
+ afm (>= 0.2.1, < 2)
+ hashery (~> 2.0)
+ ruby-rc4
+ ttfunk
pp (0.6.3)
prettyprint
prettyprint (0.2.0)
@@ -264,6 +284,8 @@ GEM
erb
psych (>= 4.0.0)
tsort
+ readline (0.0.4)
+ reline
regexp_parser (2.11.3)
reline (0.6.3)
io-console (~> 0.5)
@@ -321,6 +343,9 @@ GEM
rubocop (~> 1.81)
ruby-progressbar (1.13.0)
ruby-rc4 (0.1.5)
+ ruby-vips (2.3.0)
+ ffi (~> 1.12)
+ logger
rubyzip (3.2.2)
securerandom (0.4.1)
selenium-webdriver (4.41.0)
@@ -347,15 +372,22 @@ GEM
stimulus-rails (1.3.4)
railties (>= 6.0.0)
stringio (3.2.0)
+ sync (0.5.0)
tailwindcss-rails (4.4.0)
railties (>= 7.0.0)
tailwindcss-ruby (~> 4.0)
tailwindcss-ruby (4.2.1-x86_64-linux-gnu)
thor (1.5.0)
timeout (0.6.1)
+ tins (1.52.0)
+ bigdecimal
+ mize (~> 0.6)
+ readline
+ sync
tiny_tds (3.4.0-x86_64-linux-gnu)
bigdecimal (>= 2.0.0)
tsort (0.2.0)
+ ttfunk (1.7.0)
turbo-rails (2.0.23)
actionpack (>= 7.1.0)
railties (>= 7.1.0)
@@ -377,6 +409,8 @@ GEM
base64
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.5)
+ whenever (1.1.2)
+ chronic (>= 0.6.3)
xpath (3.2.0)
nokogiri (~> 1.8)
zeitwerk (2.7.5)
@@ -386,6 +420,7 @@ PLATFORMS
DEPENDENCIES
activerecord-sqlserver-adapter
+ amatch
bootsnap
brakeman
bundler-audit
@@ -395,8 +430,10 @@ DEPENDENCIES
docx
fastimage
httparty
+ image_processing
importmap-rails
jbuilder
+ pdf-reader
pry-rails
puma (~> 6.5)
pundit
@@ -417,6 +454,7 @@ DEPENDENCIES
turbo-rails
tzinfo-data
web-console
+ whenever
RUBY VERSION
ruby 3.4.8p72
diff --git a/app/controllers/employers_controller.rb b/app/controllers/employers_controller.rb
index eb60505..4e6c8c0 100644
--- a/app/controllers/employers_controller.rb
+++ b/app/controllers/employers_controller.rb
@@ -69,6 +69,18 @@ class EmployersController < ApplicationController
# API Methods
+ def refresh_employer_information
+ @employer = Employer.find(params[:id])
+ @employer.sync_with_vhcs
+ redirect_to employer_path(@employer.slug)
+ end
+
+ def refresh_employer_members_information
+ @employer = Employer.find(params[:id])
+ @employer.sync_members_with_vhcs
+ redirect_to employer_path(@employer.slug)
+ end
+
def import
word_doc = params[:employer][:import_from_word]
if word_doc.present? && word_doc.is_a?(ActionDispatch::Http::UploadedFile)
diff --git a/app/controllers/id_card/print_controller.rb b/app/controllers/id_card/print_controller.rb
index da1007c..f00a766 100644
--- a/app/controllers/id_card/print_controller.rb
+++ b/app/controllers/id_card/print_controller.rb
@@ -4,39 +4,31 @@ module IdCard
# View Methods
def index
@employer_setups = IdCard::Setup.active.to_a
- @queue_counts = IdCardQueueService::GetQueuedCounts.new().call
- add_queued_count_to_card_setup
- @queued = @employer_setups.select { |setup| setup.queued_card_count > 0 }.sort_by { |setup| setup.pl_plan_key.to_i }
- @not_queued = @employer_setups.select { |setup| setup.queued_card_count == 0 }.sort_by { |setup| setup.pl_plan_key.to_i }
+ @queue_members = IdCardQueueService::GetQueuedMembers.new().call
+ add_queued_count_to_employer_setup(@queue_members)
+ @queued = @employer_setups.select { |setup| setup.queued_card_count > 0 }.sort_by { |setup| setup.print_name }
+ @not_queued = @employer_setups.select { |setup| setup.queued_card_count == 0 }.sort_by { |setup| setup.print_name }
render :index
end
# API Methods
def print_all_queued
- @queue_members = IdCardQueueService::GetQueuedCards.new().call
- cards_pdf = IdCardPrinterService::QueuedCardsGenerator.new(@queue_members).call
+ @queue_members = IdCardQueueService::GetQueuedMembers.new().call
+ cards_pdf = IdCardPrinterService::CardsGenerator.new(@queue_members, "PrintCard").call
- if cards_pdf.is_a?(CombinePDF::PDF)
- send_data cards_pdf.to_pdf,
- filename: "queued_cards_#{Date.today}.pdf",
- type: "application/pdf",
- disposition: 'attachment'
- else
- cards_pdf.rewind
- send_data cards_pdf.read,
- filename: "queued_cards_#{Date.today}.zip",
- type: 'application/zip',
- disposition: 'attachment'
- end
+ send_data cards_pdf.to_pdf,
+ filename: "all_queued_cards_#{Date.today}.pdf",
+ type: "application/pdf",
+ disposition: 'attachment'
end
def print_queued_by_employer
pl_plan_key = params[:id].to_s
@employer = Employer.find_by(pl_plan_key: pl_plan_key)
- @queue_members = IdCardQueueService::GetQueuedCards.new(pl_plan_key).call
- cards_pdf = IdCardPrinterService::QueuedCardsGenerator.new(@queue_members).call
+ @queue_members = IdCardQueueService::GetQueuedMembers.new(pl_plan_key).call
+ cards_pdf = IdCardPrinterService::CardsGenerator.new(@queue_members, "PrintCard").call
send_data cards_pdf.to_pdf,
filename: "#{@employer.name.parameterize(separator: "_")}_queued_cards_#{Date.today}.pdf",
@@ -104,7 +96,8 @@ module IdCard
slug = params[:id]
@employer = Employer.find_by(slug: slug)
end
- cards_pdf = IdCardPrinterService::EmployerCardsGenerator.new(@employer, "FullPageCard", true).call
+ cards_pdf = IdCardPrinterService::CardsGenerator.new(@employer.employer_member_keys, "FullPageCard", true).call
+ # cards_pdf = IdCardPrinterService::EmployerCardsGenerator.new(@employer, "FullPageCard", true).call
cards_pdf.rewind
send_data cards_pdf.sysread,
@@ -117,11 +110,11 @@ module IdCard
private
- def add_queued_count_to_card_setup
- @queue_counts.each do |qc|
- match = @employer_setups.find { |setup| setup.pl_plan_key == qc["PLPlanKey"] }
+ def add_queued_count_to_employer_setup(queued_employer_members)
+ queued_employer_members.each do |queued_employer|
+ match = @employer_setups.find { |setup| setup.pl_plan_key == queued_employer[:pl_plan_key] }
if match.present?
- match.queued_card_count = qc["QueuedCardsCount"]
+ match.queued_card_count = queued_employer[:member_keys].length
end
end
end
diff --git a/app/javascript/controllers/add_exception_item_controller.js b/app/javascript/controllers/add_exception_item_controller.js
index 06e71e2..141065f 100644
--- a/app/javascript/controllers/add_exception_item_controller.js
+++ b/app/javascript/controllers/add_exception_item_controller.js
@@ -4,10 +4,10 @@ export default class extends Controller {
static targets = ["exceptionItemTemplate", "exceptionItemContainer", "exceptionItem", "exceptionItemButton"]
connect() {
- if (this.exceptionItemTargets.length > 0) {
- 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) {
diff --git a/app/jobs/process_id_card_data_job.rb b/app/jobs/process_id_card_data_job.rb
deleted file mode 100644
index 7b0cf00..0000000
--- a/app/jobs/process_id_card_data_job.rb
+++ /dev/null
@@ -1,90 +0,0 @@
-class ProcessIdCardDataJob < ApplicationJob
- queue_as :default
-
- def perform(member_key, field_exception_ids, has_divisions = false)
- member = Member.find_by(pb_entity_key: member_key)
-
- effect_date = determine_eff_date(member)
- if effect_date
- member_card = @base_card.dup
- member_attributes = {
- full_name: member.id_card_display_name,
- full_name_last_name_first: member.name,
- primary_mb_member_key: member.pb_entity_key,
- family_id: member.family_id,
- plan_id: member.id_card_plan_id,
- medical_eff_date: effect_date.strftime("%m/%d/%Y")
- }
-
- dependent_attributes = get_dependent_fields(member)
- if dependent_attributes.present?
- member_attributes.merge!(dependent_attributes)
- end
-
- if has_divisions
- member_attributes.merge!({employer_name: member.division})
- end
-
- if field_exception_ids.present?
- exceptions_attributes = {}
- field_exceptions = IdCard::FieldException.where(id: field_exception_ids)
- member_exception_values = member.id_card_field_exception_values
- field_exceptions.each do |fe|
- if member_exception_values[fe.field_type] == fe.field_value
- fe.field_exception_items.each do |fei|
- if fei.field_value.present?
- exceptions_attributes[fei.field_name] = fei.field_value
- elsif fei.provider_section_id.present?
- provider_attributes = IdCard::ProviderSection.find(fei.provider_section_id).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,
- :claim_to_7, :claim_to_8, :claim_to_9, :claim_to_10, :claim_to_11, :claim_to_12
- )
- exceptions_attributes.merge!(provider_attributes)
- elsif fei.network_logo_id.present?
- exceptions_attributes.merge!(network_logo_id: fei.network_logo_id)
- exceptions_attributes.merge!(network_logo_filename: fei.network_logo.filename)
- end
- end
- end
- end
- member_attributes.merge!(exceptions_attributes)
- end
-
- member_card = IdCard::PrintData.find_by(pl_plan_key: member.pl_plan_key, plan_id: member.id_card_plan_id, primary_mb_member_key: nil).dup
- member_card.assign_attributes(member_attributes)
- member_card.save
- end
-
- true
-
- # BatchProcess.increment_counter(:completed_jobs, batch_process_id)
-
- end
-
- private
-
- def determine_eff_date(member)
- 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
-
- if in_effect <= (Date.today + 90.days) && (out_of_effect - 1.day) > Date.today && out_of_effect > in_effect
- in_effect
- else
- false
- end
- end
-
- def get_dependent_fields(member)
- dependent_attributes = {}
- dependents = Vhcs::VwmbMember.where(pl_plan_key: member.pl_plan_key, 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
\ No newline at end of file
diff --git a/app/jobs/process_member_card_data_job.rb b/app/jobs/process_member_card_data_job.rb
new file mode 100644
index 0000000..7786a6d
--- /dev/null
+++ b/app/jobs/process_member_card_data_job.rb
@@ -0,0 +1,118 @@
+class ProcessMemberCardDataJob < ApplicationJob
+ queue_as :default
+
+ def perform(member_key, member_card_exceptions_attrs, has_divisions = false, has_dental = false)
+ member = Member.find_by(pb_entity_key: member_key)
+
+ effect_date = determine_eff_date(member)
+ if effect_date
+ member_card = @base_card.dup
+ member_attributes = {
+ full_name: member.id_card_display_name,
+ full_name_last_name_first: member.name,
+ primary_mb_member_key: member.pb_entity_key,
+ family_id: member.family_id,
+ plan_id: member.id_card_plan_id,
+ medical_eff_date: effect_date.strftime("%m/%d/%Y")
+ }
+
+ if member.dependents.present?
+ dependent_attributes = format_dependent_attributes(member)
+ member_attributes.merge!(dependent_attributes)
+ end
+
+ if has_divisions
+ member_attributes.merge!({employer_name: member.division})
+ end
+
+ if member_card_exceptions_attrs.present?
+ # exceptions_attributes = {}
+ # field_exceptions = IdCard::FieldException.where(id: field_exception_ids)
+ # member_exception_values = member.id_card_field_exception_values
+ # field_exceptions.each do |fe|
+ # if fe.exception_values.include?(member_exception_values[fe.exception_type.to_sym])
+ # fe.field_exception_items.each do |fei|
+ # if fei.field_value.present?
+ # exception_eff_date = Date.strptime(fei.field_value, "%m/%d/%Y")
+ # member_eff_date = Date.strptime(member_attributes[:medical_eff_date], "%m/%d/%Y")
+ # if exception_eff_date > member_eff_date
+ # exceptions_attributes[fei.field_name.to_sym] = fei.field_value
+ # end
+ # elsif fei.provider_section_id.present?
+ # provider_attributes = IdCard::ProviderSection.find(fei.provider_section_id).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,
+ # :claim_to_7, :claim_to_8, :claim_to_9, :claim_to_10, :claim_to_11, :claim_to_12
+ # )
+ # exceptions_attributes.merge!(provider_attributes)
+ # elsif fei.network_logo_id.present?
+ # exceptions_attributes.merge!(network_logo_filename: fei.network_logo.filename)
+ # end
+ # end
+ # end
+ # end
+ member_attributes.merge!(member_card_exceptions_attrs)
+ end
+
+ if has_dental
+ if member.dental_plan_key
+ member_attributes.merge!({dental_coverage: member.coverage_class.upcase})
+ unless member.id_card_plan_id
+ member_attributes.merge!({group_number: "", medical_eff_date: ""})
+ # dental_plan = IdCard::Plan.find_by(pb_product_key: 1025)
+ if IdCard::Plan.find_by(pb_product_key: member.dental_plan_key).blank?
+ member_attributes.merge!({employer_name: 'COBRA'})
+ end
+ end
+ end
+ end
+
+ if member.id_card_plan.present? && member.id_card_plan.title.upcase.include?('COBRA')
+ member_attributes.merge!({employer_name: 'COBRA'})
+ end
+
+ if member.id_card_plan_id.present?
+ member_card = IdCard::PrintData.find_by(pl_plan_key: member.pl_plan_key, plan_id: member.id_card_plan_id, primary_mb_member_key: nil).dup
+ else
+ member_card = IdCard::PrintData.where(pl_plan_key: member.pl_plan_key, primary_mb_member_key: nil).first.dup
+ end
+
+ member_card.assign_attributes(member_attributes)
+ member_card.save
+ # if dependent_attributes.present?
+ # dependent_card = member_card.dup
+ # dependent_card.full_name_last_name_first = dependent_card.full_name_last_name_first.concat(" dependent")
+ # dependent_card.save
+ # end
+ end
+
+ true
+
+ # BatchProcess.increment_counter(:completed_jobs, batch_process_id)
+
+ end
+
+ private
+
+ def determine_eff_date(member)
+ participation = Vhcs::PbProductParticipation.joins('INNER JOIN "PBCoveredEntities" ON "PBProductParticipation"."PBProductParticipationKey" = "PBCoveredEntities"."PBProductParticipationKey"').where('"PBCoveredEntities"."PBEntityKey" = ?', member.pb_entity_key).order(out_of_effect: :desc).first
+ in_effect = participation.in_effect
+ out_of_effect = participation.out_of_effect
+
+ if in_effect <= (Date.today + 90.days) && (out_of_effect - 1.day) > Date.today && out_of_effect > in_effect
+ in_effect
+ else
+ false
+ end
+ end
+
+ def format_dependent_attributes(member)
+ dependent_attributes = {}
+ member.dependents.each_with_index do |dep, index|
+ dependent_attributes["dependent_#{index + 1}".to_sym] = dep
+ end
+ dependent_attributes
+ end
+
+end
\ No newline at end of file
diff --git a/app/jobs/update_employer_job.rb b/app/jobs/update_employer_job.rb
new file mode 100644
index 0000000..f56bddd
--- /dev/null
+++ b/app/jobs/update_employer_job.rb
@@ -0,0 +1,126 @@
+class UpdateEmployerJob < ApplicationJob
+ queue_as :default
+
+ def perform(pl_plan_key, plan_header = {}, full_sync = false)
+
+ unless plan_header.present?
+ sql_query = "SELECT PLPlanKey, PlanId, ShortDesc FROM PLPlanHeader WHERE PLPlanKey = #{pl_plan_key}"
+ plan_header = VhcsRecord.connection.select_all(sql_query).first
+ end
+
+ puts "== Updating #{plan_header['ShortDesc'].strip.titleize} =="
+
+ plan_code = Vhcs::HlPlanCode.find_by(plan_key: plan_header['PLPlanKey'])
+ pb_company_plan = Vhcs::PbCompanyPlans.find_by(pl_plan_key: plan_header['PLPlanKey'])
+ employer = Employer.find_or_create_by!(pl_plan_key: plan_header['PLPlanKey'])
+ full_sync = employer.previously_new_record? || full_sync
+ # id_card_setup = employer.id_card_setup || employer.create_id_card_setup(pl_plan_key: employer.pl_plan_key)
+ # id_card_setup = employer.id_card_setup.find_or_create_by(pl_plan_key: employer.pl_plan_key)
+
+ employer_update_attrs = {}
+ setup_update_attrs = {}
+
+ employer_update_attrs.merge!({
+ plan_id: plan_header['PlanId'].strip.to_i,
+ company_pb_entity_key: pb_company_plan.company_pb_entity_key
+ })
+
+ if plan_code.present?
+ employer_update_attrs.merge!({
+ group_number: plan_code.group_number,
+ effective_date: plan_code.effect_date.strftime("%m/%d/%Y")
+ })
+ setup_update_attrs.merge!({
+ rx_group_number: plan_code.medical_number
+ })
+ end
+
+ # id_card_setup = employer.id_card_setup.find_or_create_by(pl_plan_key: employer.pl_plan_key)
+ # employer.name = plan_header['ShortDesc'].strip.titleize
+ # employer.plan_id = plan_header['PlanId'].strip.to_i
+
+
+ # id_card_templates = determine_id_card_templates(employer.pl_plan_key)
+ # employer.single_card_template = id_card_templates[:single_card_template]
+ # employer.multiple_card_template = id_card_templates[:multiple_card_template]
+
+ if full_sync
+ employer_update_attrs.merge!({
+ name: plan_header['ShortDesc'].strip.titleize
+ })
+ setup_update_attrs.merge!({
+ print_name: determine_card_print_name(pb_company_plan.company_pb_entity_key, @pl_plan_key)
+ })
+ end
+ employer.update(employer_update_attrs)
+ # if full_sync
+ # setup_update_attrs.merge!{
+ # print_name: card_print_name
+ # }
+ # end
+ id_card_setup = employer.id_card_setup || employer.create_id_card_setup!(pl_plan_key: employer.pl_plan_key)
+ id_card_setup.update(setup_update_attrs)
+
+ # plan_code = Vhcs::HlPlanCode.find_by(plan_key: employer.pl_plan_key)
+ # employer.group_number = plan_code.group_number
+ # id_card_setup.rx_group_number = plan_code.medical_number
+ # employer.effective_date = plan_code.effect_date.strftime("%m/%d/%Y")
+
+ # pb_company_plan = Vhcs::PbCompanyPlans.find_by(pl_plan_key: employer.pl_plan_key)
+ # employer.company_pb_entity_key = pb_company_plan.company_pb_entity_key
+
+ # card_print_name = Vhcs::PbEntity.where(company_pb_entity_key: employer.company_pb_entity_key, entity_type_id: 1007).last.last_name
+ # id_card_setup.print_name = card_print_name
+
+ # if employer.up_to_date?
+ # employer.active = true
+ # end
+
+ # employer.default_network_logo = determine_network_logos(employer.pl_plan_key)
+
+ # plan_codes = Vhcs::HlEgglestonCardBenefit.where(plan_key: employer.pl_plan_key).pluck(:plan_id).uniq
+ employer_plans = employer.id_card_setup.plans
+ plan_titles = employer_plans.pluck(:title)
+ vhcs_plans = Vhcs::PbProduct.where(company_pb_entity_key: pb_company_plan.company_pb_entity_key, is_active: 255)
+ vhcs_plans.each do |vp|
+ if employer_plans.present? && plan_titles.all?(&:present?) && employer_plans.find_by(pb_product_key: vp.pb_product_key).nil?
+ plan_title_matcher = Amatch::JaroWinkler.new(vp.short_description)
+ closest_title = plan_titles.max_by { |title| plan_title_matcher.match(title) }
+ plan = employer_plans.find_or_create_by(title: closest_title)
+ plan.update(
+ title: vp.short_description,
+ pb_product_key: vp.pb_product_key,
+ pl_plan_key: employer.pl_plan_key
+ )
+ plan_titles.delete(closest_title)
+ elsif employer_plans.blank?
+ employer_plans.create!(
+ pb_product_key: vp.pb_product_key,
+ title: vp.short_description,
+ pl_plan_key: employer.pl_plan_key
+ )
+ # plan.update(
+ # title: vp.short_description,
+ # pl_plan_key: employer.pl_plan_key
+ # )
+ end
+ end
+
+ employer
+ end
+
+ private
+
+ def determine_card_print_name(company_pb_entity_key, pl_plan_key)
+ card_print_names = Vhcs::PbEntity.where(company_pb_entity_key: company_pb_entity_key, entity_type_id: 1007)
+ .where.not("LastName LIKE ? OR LastName LIKE ? OR LastName LIKE ?", "%COBRA%", "Active", ".%").pluck(:last_name)
+ if pl_plan_key == "2"
+ "sm ART"
+ elsif card_print_names.count > 2
+ Employer.employer_trim_name(card_print_names.first)
+ else
+ card_print_names.last
+ end
+ end
+
+end
\ No newline at end of file
diff --git a/app/jobs/update_member_job.rb b/app/jobs/update_member_job.rb
new file mode 100644
index 0000000..944c6ca
--- /dev/null
+++ b/app/jobs/update_member_job.rb
@@ -0,0 +1,104 @@
+class UpdateMemberJob < ApplicationJob
+ queue_as :default
+
+ def perform(pb_entity_key, employer_id, has_divisions = false, has_dental = false, vw_mb_member = {})
+
+ unless vw_mb_member.present?
+ vw_mb_member = Vhcs::VwmbMember.find_by(enrollee_type_value_id: 1, pb_entity_key: pb_entity_key).attributes.with_indifferent_access.slice(:mb_member_key, :pb_entity_key, :pl_plan_key, :family_id, :full_name_last_name_first, :social_security_number)
+ end
+
+ pb_products = 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" = ?
+ AND "PBProductParticipation"."InEffect" <= ?
+ AND "PBProductParticipation"."OutOfEffect" > ?',
+ vw_mb_member[:pb_entity_key], 2.month.from_now , 1.day.ago
+ )
+
+ if pb_products.present? && vw_mb_member[:social_security_number].present?
+ member = Member.find_or_create_by!(pb_entity_key: vw_mb_member[:pb_entity_key], employer_id: employer_id)
+ member.name = vw_mb_member[:full_name_last_name_first].titleize
+ member.mb_member_key = vw_mb_member[:mb_member_key]
+ member.family_id = vw_mb_member[:family_id]
+ member.pl_plan_key = vw_mb_member[:pl_plan_key]
+
+ card_display_name = Vhcs::PbEntity.find_by(pb_entity_key: member.pb_entity_key).full_name
+ member.id_card_display_name = card_display_name
+
+ if has_divisions
+ division = Vhcs::PbEntity.joins('
+ INNER JOIN "PBAffiliation" ON "PBAffiliation"."ParentPBEntityKey" = "PBEntity"."PBEntityKey"
+ INNER JOIN "PBProductParticipation" ON "PBProductParticipation"."PBAffiliationKey" = "PBAffiliation"."PBAffiliationKey"
+ INNER JOIN "PBCoveredEntities" ON "PBProductParticipation"."PBProductParticipationKey" = "PBCoveredEntities"."PBProductParticipationKey"
+ ').find_by('
+ "PBCoveredEntities"."PBEntityKey" = ?
+ AND "PBProductParticipation"."OutOfEffect" > ?',
+ member.pb_entity_key, 1.day.ago
+ ).last_name
+ member.division = division
+ end
+
+ if has_dental
+ medical_pb_product_key = pb_products.where(short_description: "Medical")&.first&.pb_product_key
+ dental_pb_product_key = pb_products.where("ShortDescription LIKE ?", "%Dental%")&.first&.pb_product_key
+ # dental_pb_product_key = pb_products.where(short_description: "Dental")&.first&.pb_product_key
+ if dental_pb_product_key
+ member.dental_plan_key = dental_pb_product_key
+
+ coverage_class = Vhcs::GenLookupTables.joins('
+ INNER JOIN "PBProductParticipation" ON "PBProductParticipation"."CoverageTypeCode" = "GEN_LookupTables"."RecordID"
+ INNER JOIN "PBCoveredEntities" ON "PBProductParticipation"."PBProductParticipationKey" = "PBCoveredEntities"."PBProductParticipationKey"
+ INNER JOIN "PBProductAvailability" ON "PBProductAvailability"."PBProductAvailabilityKey" = "PBProductParticipation"."PBProductAvailabilityKey"
+ INNER JOIN "PBProduct" ON "PBProduct"."PBProductKey" = "PBProductAvailability"."PBProductKey"
+ ').find_by('
+ "PBCoveredEntities"."PBEntityKey" = ?
+ AND "PBProductParticipation"."InEffect" <= ?
+ AND "PBProductParticipation"."OutOfEffect" > ?
+ AND "PBProduct"."PBProductKey" = ?',
+ member.pb_entity_key, 1.month.from_now, 1.day.ago, dental_pb_product_key
+ ).short_desc
+ member.coverage_class = coverage_class
+ end
+ else
+ medical_pb_product_key = pb_products.first.pb_product_key
+ end
+ if medical_pb_product_key && plan = IdCard::Plan.find_by(pb_product_key: medical_pb_product_key)
+ member.id_card_plan = plan
+ end
+ member.dependents = get_dependent_names_by_sequence(member)
+ # if employer_members_update
+ # member
+ # else
+
+ # end
+ end
+ puts "---- #{member.name}"
+ member.presence
+
+ end
+
+ private
+
+ def get_dependent_names_by_sequence(member)
+ dependents = Vhcs::VwmbMember.joins('
+ INNER JOIN "PBCoveredEntities" ON "PBCoveredEntities"."PBEntityKey" = "vwMBMember"."PBEntityKey"
+ INNER JOIN "PBProductParticipation" ON "PBProductParticipation"."PBProductParticipationKey" = "PBCoveredEntities"."PBProductParticipationKey"
+ INNER JOIN "PBProductAvailability" ON "PBProductAvailability"."PBProductAvailabilityKey" = "PBProductParticipation"."PBProductAvailabilityKey"
+ INNER JOIN "PBProduct" ON "PBProduct"."PBProductKey" = "PBProductAvailability"."PBProductKey"
+ ').where('
+ "EnrolleeTypeKey" != 1044 AND "PLPlanKey" = ? AND "PBProductParticipation"."OutOfEffect" >= ? AND "FamilyID" = ?', member.pl_plan_key, Date.today.strftime("%m/%d/%Y"), member.family_id
+ )
+ if member.pl_plan_key == 3
+ dependents = dependents.where('"PBProduct"."PBProductKey" != 1024')
+ elsif member.pl_plan_key == 2
+ dependents = dependents.where('"PBProduct"."PBProductKey" != 1019')
+ end
+ dependent_names = dependents.order(:sequence_number).map { |dep| dep.first_name + ' ' + dep.last_name}.uniq
+ dependent_names
+end
+
+
+end
\ No newline at end of file
diff --git a/app/models/batch_process.rb b/app/models/batch_process.rb
new file mode 100644
index 0000000..5214540
--- /dev/null
+++ b/app/models/batch_process.rb
@@ -0,0 +1,5 @@
+class BatchProcess < ApplicationRecord
+
+
+
+end
diff --git a/app/models/concerns/employer_automation.rb b/app/models/concerns/employer_automation.rb
index d113441..fcc4dbd 100644
--- a/app/models/concerns/employer_automation.rb
+++ b/app/models/concerns/employer_automation.rb
@@ -1,12 +1,36 @@
module EmployerAutomation
extend ActiveSupport::Concern
-# included do
-# # Code in this block becomes instance methods or class macros (like scopes, validations, associations) in the including class.
-# scope :visible, -> { where(visible: true) }
-# scope :invisible, -> { where(visible: false) }
-# validates :status, inclusion: { in: %w(visible invisible), message: "%{value} is not a valid status" }
-# end
+ included do
+ scope :new_groups, -> {
+ where(active: false)
+ .where.not(pl_plan_key: [nil, ''])
+ }
+
+ scope :with_plans, -> {
+ joins(id_card_setup: :plans).distinct
+ }
+
+ # scope :with_survey_and_no_questions, -> {
+ # joins(:survey) # join has_one
+ # .left_joins(survey: :questions) # join has_many through has_one
+ # .where(questions: { id: nil }) # filter where has_many is empty
+ # }
+
+ scope :missing_keychain_values, -> {
+ new_groups
+ .where(
+ arel_table[:company_pb_entity_key].in([nil, ''])
+ .or(arel_table[:plan_id].in([nil, '']))
+ .or(arel_table[:group_number].in([nil, '']))
+ .or(arel_table[:effective_date].in([nil, '']))
+ )
+ }
+
+ scope :missing_initial_members, -> {
+ new_groups.with_plans
+ }
+ end
# class_methods do
# # Methods in this block become class methods of the including class.
@@ -16,16 +40,20 @@ module EmployerAutomation
# end
# Any other methods defined here become instance methods automatically.
- def up_to_date?
- self.pl_plan_key.present? &&
- self.company_pb_entity_key.present? &&
- self.plan_id.present? &&
- self.group_number.present? &&
- self.effect_date.present?
+ # def up_to_date?
+ # self.pl_plan_key.present? &&
+ # self.company_pb_entity_key.present? &&
+ # self.plan_id.present? &&
+ # self.group_number.present? &&
+ # self.effective_date.present?
+ # end
+
+ def sync_members_with_vhcs
+ AutomationService::EmployerMembersUpdate.new(self.pl_plan_key).call
end
+
def sync_with_vhcs
- sql_query = "SELECT PLPlanKey, PlanId, ShortDesc FROM PLPlanHeader WHERE ActiveInactive = 'Active' And PLPlanKey = 57"
- plan_header = VhcsRecord.connection.select_all(sql_query).first
+ AutomationService::EmployerUpdate.new(self.pl_plan_key).call
end
end
\ No newline at end of file
diff --git a/app/models/concerns/member_automation.rb b/app/models/concerns/member_automation.rb
new file mode 100644
index 0000000..509f9e6
--- /dev/null
+++ b/app/models/concerns/member_automation.rb
@@ -0,0 +1,30 @@
+module MemberAutomation
+ extend ActiveSupport::Concern
+
+# included do
+# # Code in this block becomes instance methods or class macros (like scopes, validations, associations) in the including class.
+# scope :visible, -> { where(visible: true) }
+# scope :invisible, -> { where(visible: false) }
+# validates :status, inclusion: { in: %w(visible invisible), message: "%{value} is not a valid status" }
+# end
+
+# class_methods do
+# # Methods in this block become class methods of the including class.
+# def count_all_visible
+# visible.count
+# end
+# end
+
+ # Any other methods defined here become instance methods automatically.
+ # def up_to_date?
+ # self.pl_plan_key.present? &&
+ # self.company_pb_entity_key.present? &&
+ # self.plan_id.present? &&
+ # self.group_number.present? &&
+ # self.effective_date.present?
+ # end
+
+ def sync_with_vhcs
+ AutomationService::MemberUpdate.new(self.employer.pl_plan_key, self.pb_entity_key).call
+ end
+end
\ No newline at end of file
diff --git a/app/models/employer.rb b/app/models/employer.rb
index 177dc62..959708a 100644
--- a/app/models/employer.rb
+++ b/app/models/employer.rb
@@ -1,7 +1,10 @@
class Employer < ApplicationRecord
- has_many :members
+ include EmployerAutomation
+ has_many :members, dependent: :destroy
+ accepts_nested_attributes_for :members, allow_destroy: true, reject_if: :all_blank
has_one :id_card_setup, class_name: 'IdCard::Setup', dependent: :destroy
+
scope :active, -> { where(active: true) }
scope :inactive, -> { where(active: false) }
@@ -9,7 +12,9 @@ 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?
+ # before_save :create_slug, if: :new_record?
+ before_save :create_slug, if: :will_save_change_to_name?
+ # before_save :set_active_status, unless: :will_save_change_to_active?
# after_save :process_employer_logo, if: :saved_change_to_employer_logo_filename?
# def process_employer_logo
@@ -35,7 +40,17 @@ class Employer < ApplicationRecord
# end
def create_slug
- self.slug = employer_trim_name(self.name).parameterize
+ self.slug = Employer.employer_trim_name(self.name).parameterize
+ end
+
+ def set_active_status
+ self.active = (
+ self.pl_plan_key.present? &&
+ self.company_pb_entity_key.present? &&
+ self.plan_id.present? &&
+ self.group_number.present? &&
+ self.effective_date.present?
+ )
end
def id_card_enabled?
@@ -54,12 +69,12 @@ class Employer < ApplicationRecord
end
def name_to_logo_filename(extension)
- self.employer_trim_name(self.name).titleize.gsub(/[^a-zA-Z]/, '').concat('Logo').concat(extension.downcase)
+ Employer.employer_trim_name(self.name).titleize.gsub(/[^a-zA-Z]/, '').concat('Logo').concat(extension.downcase)
end
- def employer_trim_name(name = nil)
- employer_name = name.present? ? name : self.name
- regex_source = Regexp.union(["health ", "plan", "the", "inc", "llc"]).source
+ def self.employer_trim_name(employer_name)
+ # employer_name = name.present? ? name : self.name
+ regex_source = Regexp.union(["health ", "plan", "the", "inc", "llc", "group"]).source
case_insensitive_regex = Regexp.new(regex_source, "i")
employer_name.gsub(case_insensitive_regex, "").gsub(/[^[:alpha:][:space:]]/, "").squish
end
@@ -82,21 +97,20 @@ class Employer < ApplicationRecord
medical_number: self.group_number,
dental_number: '',
plan_key: self.pl_plan_key,
- effect_date: self.effective_date
+ effect_date: DateTime.strptime(self.effective_date, "%m/%d/%y")
)
- # Replace fairos_info with template like for benefits
- fairos_info = Vhcs::HlrxCrosRef.where(pl_plan_key: 52).first
+ rx_info = self.id_card_setup.rx_section
Vhcs::HlrxCrosRef.create!(
group_no: self.group_number,
rx_group_id: self.group_number,
- help_desk: fairos_info.help_desk,
- customer_service: fairos_info.customer_service,
- web_url: fairos_info.web_url,
+ help_desk: rx_info.help_desk,
+ customer_service: rx_info.customer_service,
+ web_url: rx_info.web_url,
pl_plan_key: self.pl_plan_key
)
- self.plans.each_with_index do |plan, i|
+ self.id_card_setup.plans.each_with_index do |plan, i|
plan.plan_benefits.each do |bene|
Vhcs::HlEgglestonCardBenefit.create!(
plan_id: plan.pb_product_key,
diff --git a/app/models/id_card/employer_logo.rb b/app/models/id_card/employer_logo.rb
index a60ee1b..e62ccc6 100644
--- a/app/models/id_card/employer_logo.rb
+++ b/app/models/id_card/employer_logo.rb
@@ -1,16 +1,50 @@
module IdCard
class EmployerLogo < ApplicationRecord
- before_validation :calculate_aspect_ratio, if: :image_data_changed?
+ # before_validation :resize_logo, if: :image_data_changed?
+ # before_validation :calculate_aspect_ratio, if: :image_data_changed?
+ before_validation :process_image, 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
+ def process_image
+ image = Vips::Image.new_from_buffer(self.image_data, "")
+
+ resized_image = ImageProcessing::Vips
+ .source(image)
+ .resize_to_limit(nil, 400)
+
+ processed_image = resized_image.convert("png").call
+ new_image_data = processed_image.read
+ if new_image_data
+ self.image_data = new_image_data
+ self.filename = File.basename(self.filename, File.extname(self.filename)) + ".png"
+ self.content_type = "image/png"
+ end
+
+ image_ratio = image.width.to_f / image.height
if image_ratio
self.aspect_ratio = image_ratio.round(2)
end
end
+
+ # def resize_logo
+ # image = Vips::Image.new_from_buffer(self.image_data, "")
+
+ # processed_image = ImageProcessing::Vips
+ # .source(image)
+ # .resize_to_limit(nil, 200)
+ # .call
+
+ # self.image_data = processed_image.read
+ # end
+
+ # 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/field_exception.rb b/app/models/id_card/field_exception.rb
index 2ae01e8..b5cf0b7 100644
--- a/app/models/id_card/field_exception.rb
+++ b/app/models/id_card/field_exception.rb
@@ -4,19 +4,27 @@ module IdCard
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']
+ serialize :exception_values, coder: JSON
+
+ VALID_TYPES = ['family_id', 'zipcode', 'state'].freeze
+
+ before_validation :format_exception_values, if: :exception_values_changed?
validates :exception_type, inclusion: { in: VALID_TYPES,
message: "%{value} is not a valid exception type" }
+ def to_card_attrs
+ self.field_exception_items.map(&:card_attrs).reduce({}, :merge)
+ end
+
class << self
def permitted_params(params)
params.require(:id_card_setup).permit(
field_exceptions_attributes: [
:exception_type,
- :exception_value,
+ :exception_values,
:_destroy,
field_exception_items_attributes: [
:field_name,
@@ -31,5 +39,13 @@ module IdCard
end
+ private
+
+ def format_exception_values
+ if self.exception_values.is_a?(String)
+ self.exception_values = self.exception_values.split(",").map(&:strip)
+ end
+ end
+
end
end
diff --git a/app/models/id_card/field_exception_item.rb b/app/models/id_card/field_exception_item.rb
index 30a7513..49fcdc4 100644
--- a/app/models/id_card/field_exception_item.rb
+++ b/app/models/id_card/field_exception_item.rb
@@ -6,14 +6,30 @@ module IdCard
validate :only_one_exception_field_present
- FIELDS_TO_VALIDATE = [:field_value, :card_logo_file_id, :card_provider_id].freeze
+ FIELDS_TO_VALIDATE = [:field_value, :network_logo_id, :provider_section_id].freeze
- VALID_FIELD_NAMES = ['network_logo', 'provider_section', 'effective_date']
+ VALID_FIELD_NAMES = ['network_logo', 'provider_section', 'medical_eff_date']
validates :field_name, inclusion: { in: VALID_FIELD_NAMES,
message: "%{value} is not a valid Id Card Field Name" }
+ def card_attrs
+ case self.field_name
+ when "network_logo"
+ {"network_logo_filename" => IdCard::NetworkLogo.find(self.network_logo_id).filename}
+ when "provider_section"
+ IdCard::ProviderSection.find(self.provider_section_id).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,
+ :claim_to_7, :claim_to_8, :claim_to_9, :claim_to_10, :claim_to_11, :claim_to_12
+ )
+ when "medical_eff_date"
+ {"medical_eff_date" => self.field_value}
+ end
+ end
+
private
def only_one_exception_field_present
diff --git a/app/models/id_card/network_logo.rb b/app/models/id_card/network_logo.rb
index 61ae8a7..2231aab 100644
--- a/app/models/id_card/network_logo.rb
+++ b/app/models/id_card/network_logo.rb
@@ -1,6 +1,8 @@
module IdCard
class NetworkLogo < ApplicationRecord
- before_validation :calculate_aspect_ratio, if: :image_data_changed?
+ # before_validation :resize_logo, if: :image_data_changed?
+ # before_validation :calculate_aspect_ratio, if: :image_data_changed?
+ before_validation :process_image, if: :image_data_changed?
scope :defaults, -> { where(default: true) }
@@ -18,14 +20,46 @@ module IdCard
private
- def calculate_aspect_ratio
- image_io = StringIO.new(image_data)
- width, height = FastImage.size(image_io)
- image_ratio = width.to_f / height
+ def process_image
+ image = Vips::Image.new_from_buffer(self.image_data, "")
+
+ resized_image = ImageProcessing::Vips
+ .source(image)
+ .resize_to_limit(nil, 400)
+
+ processed_image = resized_image.convert("png").call
+ new_image_data = processed_image.read
+ if new_image_data
+ self.image_data = new_image_data
+ self.filename = File.basename(self.filename, File.extname(self.filename)) + ".png"
+ self.content_type = "image/png"
+ end
+
+ image_ratio = image.width.to_f / image.height
if image_ratio
self.aspect_ratio = image_ratio.round(2)
end
end
+ # def resize_logo
+ # image = Vips::Image.new_from_buffer(self.image_data, "")
+
+ # processed_image = ImageProcessing::Vips
+ # .source(image)
+ # .resize_to_limit(nil, 400)
+ # .call
+
+ # self.image_data = processed_image.read
+ # end
+
+ # 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/print_data.rb b/app/models/id_card/print_data.rb
index c9c509c..5823234 100644
--- a/app/models/id_card/print_data.rb
+++ b/app/models/id_card/print_data.rb
@@ -1,7 +1,7 @@
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 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 dependent_1 dependent_2 dependent_3 dependent_4 dependent_5 dependent_6 dependent_7 dependent_8 dental_coverage]
before_validation :assign_blank_strings_to_unassigned_params
diff --git a/app/models/id_card/setup.rb b/app/models/id_card/setup.rb
index 01ef045..ebd27b3 100644
--- a/app/models/id_card/setup.rb
+++ b/app/models/id_card/setup.rb
@@ -40,6 +40,45 @@ module IdCard
self.field_exceptions.present?
end
+ def field_exceptions_card_attributes_by_member_id(member_array = nil)
+ unless member_array.present?
+ member_array = self.employer.members.pluck(:pb_entity_key)
+ end
+
+ card_fes = self.field_exceptions.includes(:field_exception_items).in_order_of(:exception_type, IdCard::FieldException::VALID_TYPES)
+ # fe_by_value = card_fes.in_order_of(:exception_type, IdCard::FieldException::VALID_TYPES).group_by(&:exception_type)
+ # .transform_values { |fes| fes.map { |fe| [fe.id, fe.exception_values] }.to_h }
+ # .compact_blank
+
+ # field_exception_types = card_fes.pluck(:exception_type).uniq
+ # if field_exception_types.include?("family_id")
+ # members = Member.where(pb_entity_key: member_array)
+ # end
+ # if field_exception_types.intersect?(["state", "zipcode"])
+ # member_addresses = Vhcs::PbEntityAddress.where(pb_entity_key: member_array)
+ # end
+ card_exceptions_map = {}
+ card_fes.each do |fe|
+ if fe.exception_type == "family_id"
+ matches = Member.where(pb_entity_key: member_array, family_id: fe.exception_values).pluck(:pb_entity_key)
+ elsif fe.exception_type == "zipcode"
+ matches = Vhcs::PbEntityAddress.where(pb_entity_key: member_array, zip: fe.exception_values).pluck(:pb_entity_key)
+ elsif fe.exception_type == "state"
+ matches = Vhcs::PbEntityAddress.where(pb_entity_key: member_array, state: fe.exception_values).pluck(:pb_entity_key)
+ end
+ if matches.present?
+ card_exceptions_map[fe.id] = fe.to_card_attrs
+ matches.each do |match|
+ unless card_exceptions_map[match].present?
+ card_exceptions_map[match] = fe.id
+ end
+ end
+ end
+ end
+
+ card_exceptions_map
+ end
+
def self.permitted_params(params)
params.require(:id_card_setup).permit(
:print_name,
diff --git a/app/models/member.rb b/app/models/member.rb
index aa81b8f..6d0f6f0 100644
--- a/app/models/member.rb
+++ b/app/models/member.rb
@@ -1,7 +1,11 @@
class Member < ApplicationRecord
+ include MemberAutomation
belongs_to :id_card_plan, class_name: 'IdCard::Plan', optional: true
belongs_to :employer
+ serialize :dependents, coder: JSON
+ before_validation :format_dependents, if: :dependents_changed?
+
def id_card_field_exception_values
address = Vhcs::PbEntityAddress.find_by(pb_entity_key: self.pb_entity_key)
{
@@ -11,6 +15,14 @@ class Member < ApplicationRecord
}
end
+ private
+
+ def format_dependents
+ if self.dependents.is_a?(String)
+ self.dependents = self.dependents.split(",").map(&:strip)
+ end
+ end
+
diff --git a/app/models/report.rb b/app/models/report.rb
new file mode 100644
index 0000000..2ac1031
--- /dev/null
+++ b/app/models/report.rb
@@ -0,0 +1,5 @@
+module Report
+ def self.table_name_prefix
+ "report_"
+ end
+end
diff --git a/app/models/report/comparison_error.rb b/app/models/report/comparison_error.rb
new file mode 100644
index 0000000..eefb1ed
--- /dev/null
+++ b/app/models/report/comparison_error.rb
@@ -0,0 +1,4 @@
+class Report::ComparisonError < ApplicationRecord
+ belongs_to :employer_card_comparison, optional: true
+ belongs_to :member_card_comparison, optional: true
+end
diff --git a/app/models/report/employer_card_comparison.rb b/app/models/report/employer_card_comparison.rb
new file mode 100644
index 0000000..92c90ac
--- /dev/null
+++ b/app/models/report/employer_card_comparison.rb
@@ -0,0 +1,15 @@
+module Report
+ class EmployerCardComparison < ApplicationRecord
+ has_many :comparison_errors, dependent: :destroy
+ accepts_nested_attributes_for :comparison_errors, allow_destroy: true, reject_if: :all_blank
+
+ has_many :member_card_comparisons
+ has_many :member_comparison_errors, through: :member_card_comparisons, source: :comparison_errors
+
+
+ def employer_total_errors
+ self.comparison_errors.count + self.member_comparison_errors.count
+ end
+
+ end
+end
diff --git a/app/models/report/member_card_comparison.rb b/app/models/report/member_card_comparison.rb
new file mode 100644
index 0000000..4b8ac82
--- /dev/null
+++ b/app/models/report/member_card_comparison.rb
@@ -0,0 +1,9 @@
+module Report
+ class MemberCardComparison < ApplicationRecord
+ has_many :comparison_errors, dependent: :destroy
+ accepts_nested_attributes_for :comparison_errors, allow_destroy: true, reject_if: :all_blank
+
+ belongs_to :employer_card_comparison, optional: true
+
+ end
+end
diff --git a/app/models/report/old_card_duplicate.rb b/app/models/report/old_card_duplicate.rb
new file mode 100644
index 0000000..7979974
--- /dev/null
+++ b/app/models/report/old_card_duplicate.rb
@@ -0,0 +1,2 @@
+class Report::OldCardDuplicate < ApplicationRecord
+end
diff --git a/app/models/vhcs/gen_lookup_tables.rb b/app/models/vhcs/gen_lookup_tables.rb
new file mode 100644
index 0000000..c9588ec
--- /dev/null
+++ b/app/models/vhcs/gen_lookup_tables.rb
@@ -0,0 +1,43 @@
+module Vhcs
+ class GenLookupTables < VhcsRecord
+
+ self.table_name = 'GEN_LookupTables'
+
+ alias_attribute :record_id, :RecordID
+ alias_attribute :table_id, :TableID
+ alias_attribute :value_id, :ValueID
+ alias_attribute :company_pb_entity_key, :CompanyPBEntityKey
+ alias_attribute :short_desc, :ShortDesc
+ alias_attribute :long_desc, :LongDesc
+ alias_attribute :is_active, :IsActive
+ alias_attribute :is_default, :IsDefault
+ alias_attribute :is_bit_flag, :IsBitFlag
+ alias_attribute :is_company_specific, :IsCompanySpecific
+ alias_attribute :is_editable, :IsEditable
+ alias_attribute :long_description, :LongDescription
+ alias_attribute :sort_value, :SortValue
+ alias_attribute :system_id_bit_mask, :SystemIDBitMask
+
+ def attributes
+ rails_like = {
+ record_id: self.record_id,
+ table_id: self.table_id,
+ value_id: self.value_id,
+ company_pb_entity_key: self.company_pb_entity_key,
+ short_desc: self.short_desc,
+ long_desc: self.long_desc,
+ is_active: self.is_active,
+ is_default: self.is_default,
+ is_bit_flag: self.is_bit_flag,
+ is_company_specific: self.is_company_specific,
+ is_editable: self.is_editable,
+ long_description: self.long_description,
+ sort_value: self.sort_value,
+ system_id_bit_mask: self.system_id_bit_mask,
+ }
+ super.merge(rails_like)
+ end
+
+
+ end
+end
\ No newline at end of file
diff --git a/app/models/vhcs/hlid_card_egg_data.rb b/app/models/vhcs/hlid_card_egg_data.rb
index b9a2cff..4a6bad4 100644
--- a/app/models/vhcs/hlid_card_egg_data.rb
+++ b/app/models/vhcs/hlid_card_egg_data.rb
@@ -5,12 +5,12 @@ module Vhcs
alias_attribute :id, :ID
alias_attribute :facility, :Facility
- alias_attribute :division, :Division
+ alias_attribute :employer_name, :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 :group_number, :MedicalGroupNum
alias_attribute :dental_coverage, :DentalCoverage
alias_attribute :dental_eff_date, :DentalEffDate
alias_attribute :dental_group_num, :DentalGroupNum
@@ -25,8 +25,8 @@ module Vhcs
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 :provider_line_10, :ProviderLine10
+ alias_attribute :provider_line_11, :ProviderLine11
alias_attribute :mail_to, :MailTo
alias_attribute :mail_to_2, :MailTo2
alias_attribute :claim_to_1, :ClaimTo1
@@ -38,15 +38,15 @@ module Vhcs
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 :claim_to_10, :ClaimTo10
+ alias_attribute :claim_to_11, :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 :rx_group, :RXGroupID
alias_attribute :help_desk, :HelpDesk
alias_attribute :customer_service, :CustomerService
alias_attribute :web_url, :WebUrl
@@ -60,34 +60,34 @@ module Vhcs
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 :benefit_desc_1, :BenDesc1
+ alias_attribute :benefit_1, :Ben1
+ alias_attribute :benefit_desc_2, :BenDesc2
+ alias_attribute :benefit_2, :Ben2
+ alias_attribute :benefit_desc_3, :BenDesc3
+ alias_attribute :benefit_3, :Ben3
+ alias_attribute :benefit_desc_4, :BenDesc4
+ alias_attribute :benefit_4, :Ben4
+ alias_attribute :benefit_desc_5, :BenDesc5
+ alias_attribute :benefit_5, :Ben5
+ alias_attribute :benefit_desc_6, :BenDesc6
+ alias_attribute :benefit_6, :Ben6
+ alias_attribute :benefit_desc_7, :BenDesc7
+ alias_attribute :benefit_7, :Ben7
+ alias_attribute :benefit_desc_8, :BenDesc8
+ alias_attribute :benefit_8, :Ben8
+ alias_attribute :benefit_desc_9, :BenDesc9
+ alias_attribute :benefit_9, :Ben9
+ alias_attribute :benefit_desc_10, :BenDesc10
+ alias_attribute :benefit_10, :Ben10
+ alias_attribute :benefit_desc_11, :BenDesc11
+ alias_attribute :benefit_11, :Ben11
+ alias_attribute :benefit_desc_12, :BenDesc12
+ alias_attribute :benefit_12, :Ben12
+ alias_attribute :benefit_desc_13, :BenDesc13
+ alias_attribute :benefit_13, :Ben13
+ alias_attribute :benefit_desc_14, :BenDesc14
+ alias_attribute :benefit_14, :Ben14
alias_attribute :pl_plan_key, :PLPlanKey
alias_attribute :primary_mb_member_key, :PrimaryMBMemberKey
alias_attribute :ppo_lookup_1, :PPOLookup1
@@ -103,19 +103,19 @@ module Vhcs
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
+ alias_attribute :provider_line_12, :ProviderLine12
+ alias_attribute :claim_to_12, :ClaimTo12
def attributes
rails_like = {
id: self.id,
facility: self.facility,
- division: self.division,
+ employer_name: self.employer_name,
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,
+ group_number: self.group_number,
dental_coverage: self.dental_coverage,
dental_eff_date: self.dental_eff_date,
dental_group_num: self.dental_group_num,
@@ -130,8 +130,8 @@ module Vhcs
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,
+ provider_line_10: self.provider_line_10,
+ provider_line_11: self.provider_line_11,
mail_to: self.mail_to,
mail_to_2: self.mail_to_2,
claim_to_1: self.claim_to_1,
@@ -143,15 +143,15 @@ module Vhcs
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,
+ claim_to_10: self.claim_to_10,
+ claim_to_11: self.claim_to_11,
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,
+ rx_group: self.rx_group,
help_desk: self.help_desk,
customer_service: self.customer_service,
web_url: self.web_url,
@@ -165,34 +165,34 @@ module Vhcs
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,
+ benefit_desc_1: self.benefit_desc_1,
+ benefit_1: self.benefit_1,
+ benefit_desc_2: self.benefit_desc_2,
+ benefit_2: self.benefit_2,
+ benefit_desc_3: self.benefit_desc_3,
+ benefit_3: self.benefit_3,
+ benefit_desc_4: self.benefit_desc_4,
+ benefit_4: self.benefit_4,
+ benefit_desc_5: self.benefit_desc_5,
+ benefit_5: self.benefit_5,
+ benefit_desc_6: self.benefit_desc_6,
+ benefit_6: self.benefit_6,
+ benefit_desc_7: self.benefit_desc_7,
+ benefit_7: self.benefit_7,
+ benefit_desc_8: self.benefit_desc_8,
+ benefit_8: self.benefit_8,
+ benefit_desc_9: self.benefit_desc_9,
+ benefit_9: self.benefit_9,
+ benefit_desc_10: self.benefit_desc_10,
+ benefit_10: self.benefit_10,
+ benefit_desc_11: self.benefit_desc_11,
+ benefit_11: self.benefit_11,
+ benefit_desc_12: self.benefit_desc_12,
+ benefit_12: self.benefit_12,
+ benefit_desc_13: self.benefit_desc_13,
+ benefit_13: self.benefit_13,
+ benefit_desc_14: self.benefit_desc_14,
+ benefit_14: self.benefit_14,
pl_plan_key: self.pl_plan_key,
primary_mb_member_key: self.primary_mb_member_key,
ppo_lookup_1: self.ppo_lookup_1,
@@ -208,8 +208,8 @@ module Vhcs
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,
+ provider_line_12: self.provider_line_12,
+ claim_to_12: self.claim_to_12,
}
super.merge(rails_like)
end
diff --git a/app/models/vhcs/hlid_cards_view_egg.rb b/app/models/vhcs/hlid_cards_view_egg.rb
new file mode 100644
index 0000000..46ff85e
--- /dev/null
+++ b/app/models/vhcs/hlid_cards_view_egg.rb
@@ -0,0 +1,217 @@
+module Vhcs
+ class HlidCardsViewEgg < VhcsRecord
+
+ self.table_name = 'HLIDCardsViewEgg'
+
+ 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 :mb_member_key, :MBMemberKey
+ alias_attribute :provider_lookup_1, :ProviderLookup1
+ alias_attribute :provider_lookup_2, :ProviderLookup2
+ 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 :miscdata, :MISCDATA
+ alias_attribute :ppodata, :PPODATA
+ alias_attribute :ppodata_2, :PPODATA2
+ alias_attribute :ppodata_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 = {
+ 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,
+ mb_member_key: self.mb_member_key,
+ provider_lookup_1: self.provider_lookup_1,
+ provider_lookup_2: self.provider_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,
+ miscdata: self.miscdata,
+ ppodata: self.ppodata,
+ ppodata_2: self.ppodata_2,
+ ppodata_3: self.ppodata_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/services/automation_service/employer_members_update.rb b/app/services/automation_service/employer_members_update.rb
new file mode 100644
index 0000000..e6aa8f7
--- /dev/null
+++ b/app/services/automation_service/employer_members_update.rb
@@ -0,0 +1,35 @@
+module AutomationService
+ class EmployerMembersUpdate
+
+ def initialize(pl_plan_key)
+ @pl_plan_key = pl_plan_key
+ end
+
+ def call
+ employer = Employer.includes(:id_card_setup).find_by(pl_plan_key: @pl_plan_key)
+ card_setup = employer.id_card_setup
+ puts "-- #{employer.name}"
+
+ # employer_members =[]
+ 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, :social_security_number)
+ # vw_mb_members.each do |vw_mb_member|
+ # member = UpdateMemberJob.perform_now(@pb_entity_key, employer.id, card_setup.has_divisions, card_setup.has_dental, true, vw_mb_member)
+ # end
+ # employer.members = employer_members
+ # employer.save
+
+ member_update_futures = vw_mb_members.map do |vw_mb_member|
+ Concurrent::Future.execute do
+ ActiveRecord::Base.connection_pool.with_connection do
+ UpdateMemberJob.perform_now(@pb_entity_key, employer.id, card_setup.has_divisions, card_setup.has_dental, vw_mb_member)
+ end
+ end
+ end
+
+ member_updates = member_update_futures.map(&:value).compact
+ employer.members = member_updates
+ employer.save
+
+ end
+ end
+end
\ No newline at end of file
diff --git a/app/services/automation_service/employer_update.rb b/app/services/automation_service/employer_update.rb
new file mode 100644
index 0000000..cffb0ad
--- /dev/null
+++ b/app/services/automation_service/employer_update.rb
@@ -0,0 +1,23 @@
+module AutomationService
+ class EmployerUpdate
+
+ def initialize(pl_plan_key, full_sync = false)
+ @pl_plan_key = pl_plan_key
+ @full_sync = full_sync
+ end
+
+ def call
+ # employer = Employer.includes(:id_card_setup).find_by(pl_plan_key: @pl_plan_key)
+ # card_setup = employer.id_card_setup
+ UpdateEmployerJob.new.perform(@pl_plan_key, {}, @full_sync)
+ # if employer.present?
+ # employer.save
+ # else
+ # Member.find_by(pb_entity_key: vw_mb_member[:pb_entity_key]).destroy
+ # end
+ end
+
+ end
+end
+
+# AutomationService::MemberUpdate('13', 337710)
\ No newline at end of file
diff --git a/app/services/automation_service/member_update.rb b/app/services/automation_service/member_update.rb
new file mode 100644
index 0000000..215c6ce
--- /dev/null
+++ b/app/services/automation_service/member_update.rb
@@ -0,0 +1,23 @@
+module AutomationService
+ class MemberUpdate
+
+ def initialize(pl_plan_key, pb_entity_key)
+ @pl_plan_key = pl_plan_key
+ @pb_entity_key = pb_entity_key
+ end
+
+ def call
+ employer = Employer.includes(:id_card_setup).find_by(pl_plan_key: @pl_plan_key)
+ card_setup = employer.id_card_setup
+ member = UpdateMemberJob.perform_now(@pb_entity_key, employer.id, card_setup.has_divisions, card_setup.has_dental)
+ if member.present?
+ member.save
+ else
+ Member.find_by(pb_entity_key: vw_mb_member[:pb_entity_key]).destroy
+ end
+ end
+
+ end
+end
+
+# AutomationService::MemberUpdate('13', 337710)
\ No newline at end of file
diff --git a/app/services/id_card_printer_service/card_data_formatter.rb b/app/services/id_card_printer_service/card_data_formatter.rb
index 5ab5f63..ce48803 100644
--- a/app/services/id_card_printer_service/card_data_formatter.rb
+++ b/app/services/id_card_printer_service/card_data_formatter.rb
@@ -3,7 +3,7 @@ module IdCardPrinterService
def initialize(employers_member_keys)
# @employer = employer
- @employers_member_keys = employers_member_keys
+ @employers_member_keys = Array.wrap(employers_member_keys)
# @employer = Employer.includes(id_card_setup: [:provider_section, :rx_section]).find_by(pl_plan_key: pl_plan_key)
# @card_setup = @employer.id_card_setup
@@ -41,7 +41,6 @@ module IdCardPrinterService
group_number: @employer.group_number,
rx_group: @card_setup.rx_group_number,
network_provider: @card_setup.network_provider,
- network_logo_id: @card_setup.network_logo_id,
network_logo_filename: @card_setup.network_logo.filename,
employer_logo_filename: @card_setup.employer_logo.filename
}
@@ -58,7 +57,8 @@ module IdCardPrinterService
: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
+ :claim_to_7, :claim_to_8, :claim_to_9, :claim_to_10, :claim_to_11, :claim_to_12,
+ :precert_1, :precert_2, :precert_3, :precert_4
)
selected_attributes = employer_attributes.merge(rx_attributes).merge(provider_attributes)
@@ -83,11 +83,16 @@ module IdCardPrinterService
end
def create_member_cards_async
- field_exceptions = @card_setup.field_exceptions.pluck(:id)
+ field_exceptions_map = @card_setup.field_exceptions_card_attributes_by_member_id(@member_keys)
mmember_card_futures = @member_keys.map do |member_key|
+ member_card_exceptions_attrs = {}
+ member_card_exception_id = field_exceptions_map[member_key]
+ if member_card_exception_id
+ member_card_exceptions_attrs = field_exceptions_map[member_card_exception_id]
+ end
Concurrent::Future.execute do
ActiveRecord::Base.connection_pool.with_connection do
- ProcessIdCardDataJob.perform_now(member_key, field_exceptions, @card_setup.has_divisions)
+ ProcessMemberCardDataJob.perform_now(member_key, member_card_exceptions_attrs, @card_setup.has_divisions, @card_setup.has_dental)
end
end
end
diff --git a/app/services/id_card_printer_service/cards_generator.rb b/app/services/id_card_printer_service/cards_generator.rb
index a68ce0f..34bca88 100644
--- a/app/services/id_card_printer_service/cards_generator.rb
+++ b/app/services/id_card_printer_service/cards_generator.rb
@@ -15,13 +15,30 @@ module IdCardPrinterService
IdCard::PrintData.where(pl_plan_key: pl_plan_keys, primary_mb_member_key: nil).destroy_all
pdf_array = []
- batches = break_into_batches(pl_plan_keys)
- batches.each do |card_template, batch_pl_plan_keys|
- jasper_batch_id = "#{batch_pl_plan_keys.join('_')}-#{Time.current.utc.to_i}"
- batch = IdCard::PrintData.where(pl_plan_key: batch_pl_plan_keys)
- batch.update!(jasper_batch_id: jasper_batch_id)
- batch_pdf = IdCardPrinterService::PdfBatchProcessor.new(card_template, jasper_batch_id, @layout).call
- pdf_array << batch_pdf
+ template_groups = break_up_by_template(pl_plan_keys)
+ template_groups.each do |card_template, template_pl_plan_keys|
+ batch = IdCard::PrintData.where(pl_plan_key: template_pl_plan_keys)
+ # all_template_cards.in_batches(of: 75).each_with_index do |batch, index|
+ jasper_batch_id = "#{template_pl_plan_keys.join('_')}-#{Time.current.utc.to_i}"
+ # binding.pry
+ batch.update!(jasper_batch_id: jasper_batch_id)
+ if @layout == "PrintCard"
+ add_dependent_cards(batch)
+ end
+ batch_pdf = IdCardPrinterService::PdfBatchProcessor.new(card_template, jasper_batch_id, @layout).call
+ pdf_array << batch_pdf
+ # end
+ # jasper_batches = break_into_jasper_batches(group_pl_plan_keys)
+ # jasper_batches.each_with_index do |batch, index|
+ # jasper_batch_id = "#{group_pl_plan_keys.join('_')}-#{index + 1}-#{Time.current.utc.to_i}"
+ # binding.pry
+ # batch.update!(jasper_batch_id: jasper_batch_id)
+ # if @layout == "PrintCard"
+ # add_dependent_cards(batch)
+ # end
+ # batch_pdf = IdCardPrinterService::PdfBatchProcessor.new(card_template, jasper_batch_id, @layout).call
+ # pdf_array << batch_pdf
+ # end
end
# @employers_member_keys.each do |emk|
# employer_jasper_batches = IdCard::PrintData.where(pl_plan_key: emk[:pl_plan_key]).pluck(:network_logo_id).uniq
@@ -44,18 +61,47 @@ module IdCardPrinterService
private
- def break_into_batches(pl_plan_keys)
+ def break_up_by_template(pl_plan_keys)
batches_by_card_template = IdCard::Setup.where(pl_plan_key: pl_plan_keys).group_by(&:card_template)
.transform_values { |setups| setups.map(&:pl_plan_key) }
.compact_blank
end
+ def break_into_jasper_batches(pl_plan_keys)
+ all_cards = IdCard::PrintData.where(pl_plan_key: pl_plan_keys)
+ binding.pry
+ jasper_batches = all_cards.each_slice(75).to_a
+ jasper_batches
+ end
+
+ def add_dependent_cards(batch)
+ batch.where.not(dependent_1: [nil, ""]).find_each do |member_card|
+ dependent_card = member_card.dup
+ dependent_card.update(
+ full_name_last_name_first: member_card.full_name_last_name_first.concat(" dependent")
+ )
+ dependent_card.save
+ end
+ end
+
def combine_pdfs(pdf_array)
if @zip
group_cards_pdf = Zip::OutputStream.write_buffer do |zio|
- pdf_array.each do |file|
- zio.put_next_entry(file[:name])
- zio.write(file[:data])
+ pdf_file = pdf_array.first
+ puts "-- CombinePdfPages --"
+ puts pdf_file.pages.count
+ pdf_file.pages.reverse.each do |page|
+ page_pdf = CombinePDF.new
+ page_pdf << page
+ page_data = page_pdf.to_pdf
+ full_name_last_name_first = get_watermark_field(page_data)
+ if full_name_last_name_first.present?
+ page_filename = "#{full_name_last_name_first.gsub(", ", "_")}_digital_card_#{Date.today}.pdf"
+ puts "-- Filename --"
+ puts page_filename
+ zio.put_next_entry(page_filename)
+ zio.write(page_data)
+ end
end
end
else
@@ -64,5 +110,19 @@ module IdCardPrinterService
end
group_cards_pdf
end
+
+ def get_watermark_field(page_data)
+ watermark_field = ""
+ reader = PDF::Reader.new(StringIO.new(page_data))
+ puts "-- ReaderPages --"
+ puts reader.pages.count
+ page = reader.pages.first
+ if watermark_match = page.text.match(/:WATERMARK:([^:]*):/)
+ watermark_field = page.text.match(/:WATERMARK:([^:]*):/)[1].strip
+ else
+ puts "blank page"
+ end
+ watermark_field
+ end
end
end
diff --git a/app/services/id_card_printer_service/jasper_batch_url_generator.rb b/app/services/id_card_printer_service/jasper_batch_url_generator.rb
index 7876167..4c0f3d4 100644
--- a/app/services/id_card_printer_service/jasper_batch_url_generator.rb
+++ b/app/services/id_card_printer_service/jasper_batch_url_generator.rb
@@ -32,7 +32,7 @@ module IdCardPrinterService
host: '10.41.1.115',
port: 8080,
path: '/trunk/IdCardsServlet',
- query: "reportConn=BrittonConnect&cardTemplate=#{@card_template}Batch&printType=Batch#{@layout}&jasper_batch_id=#{@jasper_batch_id}&FileType=PDF"
+ query: "reportConn=BrittonConnect&cardTemplate=#{@card_template}&printType=#{@layout}&jasper_batch_id=#{@jasper_batch_id}&FileType=PDF"
}
end
diff --git a/app/services/id_card_printer_service/jasper_pdf_generator.rb b/app/services/id_card_printer_service/jasper_pdf_generator.rb
index 206bcde..5160a3e 100644
--- a/app/services/id_card_printer_service/jasper_pdf_generator.rb
+++ b/app/services/id_card_printer_service/jasper_pdf_generator.rb
@@ -9,6 +9,7 @@ module IdCardPrinterService
def call
response = HTTParty.get(@jasper_url)
+ # response.body
CombinePDF.parse(response.body)
end
diff --git a/app/services/id_card_printer_service/pdf_formatter.rb b/app/services/id_card_printer_service/pdf_formatter.rb
new file mode 100644
index 0000000..1077440
--- /dev/null
+++ b/app/services/id_card_printer_service/pdf_formatter.rb
@@ -0,0 +1,118 @@
+module IdCardPrinterService
+ class PdfFormatter
+
+ def initialize(pdf_array ,layout, zip=false)
+ @pdf_array = pdf_array
+ @layout = layout
+ @zip = zip
+ end
+
+ def call
+
+ if @layout == "FullPageCard"
+ pdf_file = @pdf_array.first
+ puts "-- CombinePdfPages --"
+ puts pdf_file.pages.count
+ pdf_file.pages.reverse.each do |page|
+ page_pdf = CombinePDF.new
+ page_pdf << page
+ page_data = page_pdf.to_pdf
+ full_name_last_name_first = get_watermark_field(page_data)
+ if full_name_last_name_first.present?
+ page_filename = "#{full_name_last_name_first.gsub(", ", "_")}_digital_card_#{Date.today}.pdf"
+ group_cards_pdf_array << { name: page_filename, data: page_data }
+ end
+ end
+
+ group_cards_pdf = Zip::OutputStream.write_buffer do |zio|
+ pdf_file = pdf_array.first
+ puts "-- CombinePdfPages --"
+ puts pdf_file.pages.count
+ pdf_file.pages.reverse.each do |page|
+ page_pdf = CombinePDF.new
+ page_pdf << page
+ page_data = page_pdf.to_pdf
+ full_name_last_name_first = get_watermark_field(page_data)
+ if full_name_last_name_first.present?
+ page_filename = "#{full_name_last_name_first.gsub(", ", "_")}_digital_card_#{Date.today}.pdf"
+ puts "-- Filename --"
+ puts page_filename
+ zio.put_next_entry(page_filename)
+ zio.write(page_data)
+ end
+ end
+ end
+ else
+ group_cards_pdf = CombinePDF.new
+ pdf_array.each { |pdf| group_cards_pdf << pdf }
+ end
+ group_cards_pdf
+
+
+
+ end
+
+ private
+
+ def get_watermark_field(page_data)
+ watermark_field = ""
+ reader = PDF::Reader.new(StringIO.new(page_data))
+ puts "-- ReaderPages --"
+ puts reader.pages.count
+ page = reader.pages.first
+ if watermark_match = page.text.match(/:WATERMARK:([^:]*):/)
+ watermark_field = page.text.match(/:WATERMARK:([^:]*):/)[1].strip
+ else
+ puts "blank page"
+ end
+ watermark_field
+ end
+
+ def break_into_batches(pl_plan_keys)
+ batches_by_card_template = IdCard::Setup.where(pl_plan_key: pl_plan_keys).group_by(&:card_template)
+ .transform_values { |setups| setups.map(&:pl_plan_key) }
+ .compact_blank
+ end
+
+ def combine_pdfs(pdf_array)
+ if @zip
+ group_cards_pdf = Zip::OutputStream.write_buffer do |zio|
+ pdf_file = pdf_array.first
+ puts "-- CombinePdfPages --"
+ puts pdf_file.pages.count
+ pdf_file.pages.reverse.each do |page|
+ page_pdf = CombinePDF.new
+ page_pdf << page
+ page_data = page_pdf.to_pdf
+ full_name_last_name_first = get_watermark_field(page_data)
+ if full_name_last_name_first.present?
+ page_filename = "#{full_name_last_name_first.gsub(", ", "_")}_digital_card_#{Date.today}.pdf"
+ puts "-- Filename --"
+ puts page_filename
+ zio.put_next_entry(page_filename)
+ zio.write(page_data)
+ end
+ end
+ end
+ else
+ group_cards_pdf = CombinePDF.new
+ pdf_array.each { |pdf| group_cards_pdf << pdf }
+ end
+ group_cards_pdf
+ end
+
+ def get_watermark_field(page_data)
+ watermark_field = ""
+ reader = PDF::Reader.new(StringIO.new(page_data))
+ puts "-- ReaderPages --"
+ puts reader.pages.count
+ page = reader.pages.first
+ if watermark_match = page.text.match(/:WATERMARK:([^:]*):/)
+ watermark_field = page.text.match(/:WATERMARK:([^:]*):/)[1].strip
+ else
+ puts "blank page"
+ end
+ watermark_field
+ end
+ end
+end
diff --git a/app/services/id_card_queue_service/get_queued_cards.rb b/app/services/id_card_queue_service/get_queued_members.rb
similarity index 82%
rename from app/services/id_card_queue_service/get_queued_cards.rb
rename to app/services/id_card_queue_service/get_queued_members.rb
index bf3cc4e..e5e11d3 100644
--- a/app/services/id_card_queue_service/get_queued_cards.rb
+++ b/app/services/id_card_queue_service/get_queued_members.rb
@@ -1,5 +1,5 @@
module IdCardQueueService
- class GetQueuedCards
+ class GetQueuedMembers
def initialize(pl_plan_keys = nil)
if pl_plan_keys
@@ -10,7 +10,7 @@ module IdCardQueueService
end
def call
- raw_employers_member_keys = CallStoredProc.new('BrittonGetQueuedIdCardMemberKeysTPA', { PLPlanKeys: @employer_pl_plan_keys }).call.to_ary
+ raw_employers_member_keys = CallStoredProc.new('HLGetQueuedIdCardMemberKeysTPA', { PLPlanKeys: @employer_pl_plan_keys }).call.to_ary
format_employers_member_keys(raw_employers_member_keys)
end
diff --git a/app/services/reports_service/card_comparisons.rb b/app/services/reports_service/card_comparisons.rb
new file mode 100644
index 0000000..c7d04ec
--- /dev/null
+++ b/app/services/reports_service/card_comparisons.rb
@@ -0,0 +1,237 @@
+module ReportsService
+ class CardComparisons
+
+ def initialize(pl_plan_key, member_pb_entity_key = nil)
+ @pl_plan_key = pl_plan_key
+ @member_pb_entity_key = member_pb_entity_key
+ @hlid_ids_compared = []
+ end
+
+ def call
+ if @member_pb_entity_key
+ IdCard::PrintData.where(primary_mb_member_key: @member_pb_entity_key).destroy_all
+ CallStoredProc.new('HLQueueIDCardByKey', { PBEntityKey: @member_pb_entity_key }).call
+ IdCardPrinterService::CardDataFormatter.new([{pl_plan_key: @pl_plan_key, member_keys: [@member_pb_entity_key]}]).call
+ puts "use ID Cards app for group #{@pl_plan_key}, then press enter."
+ continue = gets
+
+ compare_member_cards(@member_pb_entity_key)
+ else
+ employer_card_comparison = Report::CardComparison.find_or_create_by(member_number: "#{@pl_plan_key}-Group", pl_plan_key: @pl_plan_key)
+
+ AutomationService::EmployerMembersUpdate.new(@pl_plan_key).call
+ employer_member_keys = Employer.find_by(pl_plan_key: @pl_plan_key).employer_member_keys
+ IdCard::PrintData.where(pl_plan_key: @pl_plan_key).destroy_all
+ CallStoredProc.new('HLQueueAllIDCardsByPlan', { PLPlanKey: @pl_plan_key }).call
+ IdCardPrinterService::CardDataFormatter.new(employer_member_keys).call
+
+ puts "use ID Cards app for group #{@pl_plan_key}, then press enter."
+ continue = gets
+
+ IdCard::PrintData.where(pl_plan_key: @pl_plan_key, primary_mb_member_key: nil).destroy_all
+
+
+ # new_cards = IdCard::PrintData.where(pl_plan_key: @pl_plan_key)
+ # add_dependent_cards(new_cards)
+ new_card_member_keys = IdCard::PrintData.where(pl_plan_key: @pl_plan_key).pluck(:primary_mb_member_key).uniq
+ old_card_member_keys = Vhcs::HlidCardEggData.where(pl_plan_key: @pl_plan_key).pluck(:primary_mb_member_key).uniq.map(&:to_s)
+
+ missing_from_new = old_card_member_keys - new_card_member_keys
+ missing_from_old = new_card_member_keys - old_card_member_keys
+
+ if missing_from_new.present? || missing_from_old.present?
+ employer_card_comparison.comparison_errors.new(
+ card_field: "Missing Cards",
+ new_value: missing_from_old.join(', '),
+ old_value: missing_from_new.join(', ')
+ )
+ end
+
+ # group_errors = []
+ # unless new_card_count == old_card_count
+ # group_errors.push({
+ # employer: @pl_plan_key,
+ # field: 'Card Count Mismatch',
+ # new_value: new_card_count,
+ # old_value: old_card_count
+ # })
+ # end
+ member_keys_array = new_card_member_keys | old_card_member_keys
+ member_keys_array.each do |member_key|
+ compare_member_cards(member_key)
+ end
+
+ failed_cards = Report::CardComparison.where(pl_plan_key: @pl_plan_key, passed: false).where.not(member_number: @pl_plan_key)
+ if failed_cards.empty?
+ employer_card_comparison.passed = true
+ end
+
+ employer_card_comparison.save
+ @hlid_ids_compared
+ end
+
+ end
+
+ private
+
+ def compare_member_cards(member_pb_entity_key)
+ member_card_comparison = Report::CardComparison.find_or_create_by(member_number: member_pb_entity_key, pl_plan_key: @pl_plan_key)
+ new_card = IdCard::PrintData.find_by(primary_mb_member_key: member_pb_entity_key)
+ old_card = Vhcs::HlidCardEggData.where(primary_mb_member_key: member_pb_entity_key).first
+ @hlid_ids_compared << old_card.id
+
+ errors = []
+ if new_card.present? && old_card.present?
+
+ # :pl_plan_key, :primary_mb_member_key, :family_id, :full_name, :medical_eff_date, :dental_coverage,
+ # :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,
+ # :precert_1, :precert_2, :precert_3, :precert_4, :customer_service, :web_url, :dependent_1, :dependent_2, :dependent_3,
+ # :dependent_4, :dependent_5, :dependent_6, :dependent_7, :dependent_8, :benefit_desc_1,
+
+ new_card_common = new_card.attributes.with_indifferent_access.except(
+ :id, :created_at, :full_name_last_name_first, :network_provider, :plan_id,
+ :network_logo_filename, :employer_logo_filename, :sample_plan_title, :jasper_batch_id, :updated_at
+ )
+ new_card_common.delete_if { |key, value| key.match?(/[[:upper:]]/) }
+
+ new_card_dependents = new_card.attributes.with_indifferent_access.slice(
+ :dependent_1, :dependent_2, :dependent_3, :dependent_4, :dependent_5, :dependent_6, :dependent_7, :dependent_8
+ )
+ new_card_dependents.delete_if { |key, value| key.match?(/[[:upper:]]/) }
+
+ new_card_dental = new_card[:dental_coverage]
+ new_card_eff_date = new_card[:medical_eff_date]
+
+ # old_card_common = old_card.attributes.except(
+ # :id, :facility, :ssn, :medical_coverage, :dental_eff_date, :dental_group_num, :mail_to, :mail_to_2, :contact_line_1,
+ # :contact_line_2, :contact_line_3, :group_number, :group_no, :help_desk, :expr_1, :line_3, :ppo_lookup_1, :ppo_lookup_2,
+ # :precert_5, :precert_6, :misc_data, :ppo_data, :ppo_data_2, :ppo_data_3, :last_name, :card_type, :provider_code
+ # )
+ old_card_common = old_card.attributes.with_indifferent_access.slice(
+ :employer_name, :full_name, :group_number, :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, :family_id, :rx_group, :customer_service, :web_url, :benefit_desc_1, :benefit_1, :benefit_desc_2, :benefit_2, :benefit_desc_3, :benefit_3,
+ :benefit_desc_4, :benefit_4, :benefit_desc_5, :benefit_5, :benefit_desc_6, :benefit_6, :benefit_desc_7, :benefit_7, :benefit_desc_8, :benefit_8,
+ :benefit_desc_9, :benefit_9, :benefit_desc_10, :benefit_10, :benefit_desc_11, :benefit_11, :benefit_desc_12, :benefit_12, :benefit_desc_13, :benefit_13,
+ :benefit_desc_14, :benefit_14, :pl_plan_key, :primary_mb_member_key, :provider_line_12, :claim_to_12
+ ) # :precert_1, :precert_2, :precert_3, :precert_4
+ old_card_common.transform_keys!(division: :employer_name, medical_group_num: :group_number, rx_group_id: :rx_group)
+
+ old_card_dependents = old_card.attributes.with_indifferent_access.slice(
+ :dependent_1, :dependent_2, :dependent_3, :dependent_4, :dependent_5, :dependent_6, :dependent_7, :dependent_8
+ )
+ old_card_dependents.delete_if { |key, value| key.match?(/[[:upper:]]/) }
+
+ old_card_dental = old_card[:dental_coverage]
+ old_card_eff_date = old_card[:medical_eff_date]
+
+ old_card_common.each do |key, value|
+ # if key == :benefit_desc_4
+ # binding.pry
+ # end
+ unless new_card_common[key].to_s.downcase.strip.gsub(/\W/, ' ') == value.to_s.downcase.strip.gsub(/\W/, ' ')
+ comp_error = member_card_comparison.comparison_errors.find_or_create_by(card_field: key.to_s)
+ comp_error.update!(new_value: new_card_common[key], old_value: value)
+ # errors.push({
+ # member: old_card_common[:primary_mb_member_key],
+ # field: key,
+ # new_value: value,
+ # old_value: new_card_common[key]
+ # })
+ end
+ end
+
+ unless old_card_dependents.values.sort == new_card_dependents.values.sort
+
+ missing_from_new = (old_card_dependents.values - new_card_dependents.values).compact_blank
+ missing_from_old = (new_card_dependents.values - old_card_dependents.values).compact_blank
+
+ # member_card_comparison.comparison_errors.new(
+ # card_field: "Missing Dependent(s)",
+ # new_value: missing_from_old.join(', '),
+ # old_value: missing_from_new.join(', ')
+ # )
+
+ comp_error = member_card_comparison.comparison_errors.find_or_create_by(card_field: "Missing Dependent(s)")
+ comp_error.update!(new_value: missing_from_old.join(', '), old_value: missing_from_new.join(', '))
+
+ # errors.push({
+ # member: old_card_common[:primary_mb_member_key],
+ # field: 'Missing Dependent(s)',
+ # new_value: new_card_dependents.values,
+ # old_value: old_card_dependents.values
+ # })
+ end
+
+ unless new_card_dental == old_card_dental || (old_card_dental == "NONE" && new_card_dental.empty?)
+ member_card_comparison.comparison_errors.new(
+ card_field: "dental_coverage",
+ new_value: new_card_dental,
+ old_value: old_card_dental
+ )
+
+ comp_error = member_card_comparison.comparison_errors.find_or_create_by(card_field: "dental_coverage")
+ comp_error.update!(new_value: new_card_dental, old_value: old_card_dental)
+
+ # errors.push({
+ # member: old_card_common[:primary_mb_member_key],
+ # field: :dental_coverage,
+ # new_value: new_card_dental,
+ # old_value: old_card_dental
+ # })
+ end
+
+ unless new_card_eff_date.to_date == old_card_eff_date.to_date
+ # member_card_comparison.comparison_errors.new(
+ # card_field: "medical_eff_date",
+ # new_value: new_card_eff_date,
+ # old_value: old_card_eff_date
+ # )
+
+ comp_error = member_card_comparison.comparison_errors.find_or_create_by(card_field: "medical_eff_date")
+ comp_error.update!(new_value: new_card_eff_date, old_value: old_card_eff_date)
+
+ # errors.push({
+ # member: old_card_common[:primary_mb_member_key],
+ # field: :medical_eff_date,
+ # new_value: new_card_eff_date,
+ # old_value: old_card_eff_date
+ # })
+ end
+ else
+ comp_error = member_card_comparison.comparison_errors.find_or_create_by(card_field: "Missing Member")
+ comp_error.update!(new_value: new_card.present?, old_value: old_card.present?)
+ # member_card_comparison.comparison_errors.new(
+ # card_field: "Missing Member",
+ # new_value: new_card.present?,
+ # old_value: old_card.present?
+ # )
+ # errors.push({
+ # member: old_card[:primary_mb_member_key],
+ # field: "Missing Member",
+ # new_value: new_card.present?,
+ # old_value: old_card.present?
+ # })
+ end
+ if member_card_comparison.comparison_errors.empty?
+ member_card_comparison.passed = true
+ end
+ member_card_comparison.save
+ end
+
+ # def add_dependent_cards(batch)
+ # batch.where.not(dependent_1: [nil, ""]).find_each do |member_card|
+ # dependent_card = member_card.dup
+ # dependent_card.update(
+ # full_name_last_name_first: member_card.full_name_last_name_first.concat(" dependent")
+ # )
+ # dependent_card.save
+ # end
+ # end
+
+ end
+end
\ No newline at end of file
diff --git a/app/services/reports_service/duplicate_old_cards.rb b/app/services/reports_service/duplicate_old_cards.rb
new file mode 100644
index 0000000..9732d41
--- /dev/null
+++ b/app/services/reports_service/duplicate_old_cards.rb
@@ -0,0 +1,56 @@
+module ReportsService
+ class DuplicateOldCards
+
+ def initialize(pl_plan_keys)
+ @pl_plan_keys = Array.wrap(pl_plan_keys)
+ end
+
+ def call
+ @pl_plan_keys.each do |pl_plan_key|
+ Vhcs::HlidCardEggData.destroy_all
+ clear_out_queue()
+ CallStoredProc.new('HLQueueAllIDCardsByPlan', { PLPlanKey: pl_plan_key }).call
+ puts "---------------------------------------------------------------------------------"
+ puts "---------------------------------------------------------------------------------"
+ puts "use ID Cards app to pull queued for group #{pl_plan_key}, then press enter."
+ puts "---------------------------------------------------------------------------------"
+ puts "---------------------------------------------------------------------------------"
+ continue = gets
+
+ old_cards = Vhcs::HlidCardEggData.where(pl_plan_key: pl_plan_key)
+ old_cards.each do |card|
+ duplicate_card(card)
+ end
+
+ end
+
+ end
+
+ private
+
+ def duplicate_card(card)
+ unless Report::OldCardDuplicate.exists?(primary_mb_member_key: card.primary_mb_member_key)
+ dup_attrs = card.attributes.with_indifferent_access.slice(
+ :employer_name, :full_name, :group_number, :medical_eff_date, :dental_coverage, :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,:family_id, :rx_group, :customer_service, :web_url, :benefit_desc_1,
+ :benefit_1, :benefit_desc_2, :benefit_2, :benefit_desc_3, :benefit_3, :benefit_desc_4, :benefit_4, :benefit_desc_5, :benefit_5,
+ :benefit_desc_6, :benefit_6, :benefit_desc_7, :benefit_7, :benefit_desc_8, :benefit_8, :benefit_desc_9, :benefit_9, :benefit_desc_10,
+ :benefit_10, :benefit_desc_11, :benefit_11, :benefit_desc_12, :benefit_12, :benefit_desc_13, :benefit_13, :benefit_desc_14, :benefit_14,
+ :dependent_1, :dependent_2, :dependent_3, :dependent_4, :dependent_5, :dependent_6, :dependent_7, :dependent_8, :pl_plan_key, :primary_mb_member_key
+ )
+ Report::OldCardDuplicate.create(dup_attrs)
+ end
+ end
+
+ def clear_out_queue
+ VhcsRecord.connection.execute("
+ UPDATE CLDocument
+ SET DocStatus = 'Printed', PrintDate = GetDate()
+ where DocStatus <> 'Printed'
+ ")
+ end
+
+ end
+end
diff --git a/app/services/reports_service/employer_card_comparisons.rb b/app/services/reports_service/employer_card_comparisons.rb
new file mode 100644
index 0000000..bb1da3d
--- /dev/null
+++ b/app/services/reports_service/employer_card_comparisons.rb
@@ -0,0 +1,147 @@
+module ReportsService
+ class EmployerCardComparisons
+
+ def initialize(pl_plan_keys)
+ @pl_plan_keys = Array.wrap(pl_plan_keys)
+ @hlid_ids_compared = []
+ end
+
+ def call
+ @pl_plan_keys.each do |pl_plan_key|
+ employer = Employer.find_by(pl_plan_key: pl_plan_key)
+ employer_card_comparison = Report::EmployerCardComparison.find_or_create_by(pl_plan_key: pl_plan_key)
+ employer_card_comparison.employer_name = employer.name
+
+ AutomationService::EmployerMembersUpdate.new(pl_plan_key).call
+ employer_member_keys = employer.employer_member_keys
+ IdCard::PrintData.where(pl_plan_key: pl_plan_key).destroy_all
+ IdCardPrinterService::CardDataFormatter.new(employer_member_keys).call
+ IdCard::PrintData.where(pl_plan_key: pl_plan_key, primary_mb_member_key: nil).destroy_all
+
+ new_card_member_keys = IdCard::PrintData.where(pl_plan_key: pl_plan_key).pluck(:primary_mb_member_key).uniq
+ old_card_member_keys = Report::OldCardDuplicate.where(pl_plan_key: pl_plan_key).pluck(:primary_mb_member_key).uniq.map(&:to_s)
+
+ missing_from_new = old_card_member_keys - new_card_member_keys
+ missing_from_old = new_card_member_keys - old_card_member_keys
+
+ if missing_from_new.present? || missing_from_old.present?
+ comp_error = employer_card_comparison.comparison_errors.find_or_create_by(card_field: "Missing Cards")
+ comp_error.update(new_value: missing_from_old.join(', '), old_value: missing_from_new.join(', '))
+ end
+
+ employer_card_comparison.new_cards_count = new_card_member_keys.count
+ employer_card_comparison.old_cards_count = old_card_member_keys.count
+
+ member_keys_array = new_card_member_keys | old_card_member_keys
+ member_keys_array.each do |member_key|
+ compare_member_cards(member_key, pl_plan_key, employer_card_comparison.id)
+ end
+
+ employer_card_comparison.total_errors_count = employer_card_comparison.employer_total_errors
+ if employer_card_comparison.total_errors_count == 0
+ employer_card_comparison.passed = true
+ end
+
+ employer_card_comparison.save
+
+ end
+ end
+
+ private
+
+ def compare_member_cards(member_pb_entity_key, pl_plan_key, employer_card_comparison_id)
+ member_card_comparison = Report::MemberCardComparison.find_or_create_by(member_number: member_pb_entity_key, pl_plan_key: pl_plan_key, employer_card_comparison_id: employer_card_comparison_id)
+ new_card = IdCard::PrintData.find_by(primary_mb_member_key: member_pb_entity_key)
+ old_card = Report::OldCardDuplicate.find_by(primary_mb_member_key: member_pb_entity_key)
+
+ current_errors = []
+ if new_card.present? && old_card.present?
+ new_card_common = new_card.attributes.with_indifferent_access.except(
+ :id, :created_at, :full_name_last_name_first, :network_provider, :plan_id,
+ :network_logo_filename, :employer_logo_filename, :sample_plan_title, :jasper_batch_id, :updated_at,
+ :dependent_1, :dependent_2, :dependent_3, :dependent_4, :dependent_5, :dependent_6, :dependent_7, :dependent_8,
+ :precert_1, :precert_2, :precert_3, :precert_4
+ )
+ new_card_common.delete_if { |key, value| key.match?(/[[:upper:]]/) }
+
+ new_card_dependents = new_card.attributes.with_indifferent_access.slice(
+ :dependent_1, :dependent_2, :dependent_3, :dependent_4, :dependent_5, :dependent_6, :dependent_7, :dependent_8
+ )
+ new_card_dependents.delete_if { |key, value| key.match?(/[[:upper:]]/) }
+
+ new_card_dental = new_card[:dental_coverage]
+ new_card_eff_date = new_card[:medical_eff_date]
+
+ old_card_common = old_card.attributes.with_indifferent_access.except(
+ :id, :created_at, :updated_at, :dental_coverage, :medical_eff_date,
+ :dependent_1, :dependent_2, :dependent_3, :dependent_4, :dependent_5, :dependent_6, :dependent_7, :dependent_8,
+ :precert_1, :precert_2, :precert_3, :precert_4
+ )
+ if pl_plan_key = '2'
+ old_card_common.except!(
+ :benefit_desc_1, :benefit_1, :benefit_desc_2, :benefit_2, :benefit_desc_3, :benefit_3,
+ :benefit_desc_4, :benefit_4, :benefit_desc_5, :benefit_5, :benefit_desc_6, :benefit_6, :benefit_desc_7, :benefit_7, :benefit_desc_8, :benefit_8,
+ :benefit_desc_9, :benefit_9, :benefit_desc_10, :benefit_10, :benefit_desc_11, :benefit_11, :benefit_desc_12, :benefit_12, :benefit_desc_13, :benefit_13,
+ :benefit_desc_14, :benefit_14
+ )
+ end
+ old_card_common.delete_if { |key, value| key.match?(/[[:upper:]]/) }
+
+ old_card_dependents = old_card.attributes.with_indifferent_access.slice(
+ :dependent_1, :dependent_2, :dependent_3, :dependent_4, :dependent_5, :dependent_6, :dependent_7, :dependent_8
+ )
+ old_card_dependents.delete_if { |key, value| key.match?(/[[:upper:]]/) }
+
+ old_card_dental = old_card[:dental_coverage]
+ old_card_eff_date = old_card[:medical_eff_date]
+
+ old_card_common.each do |key, value|
+ unless new_card_common[key].to_s.downcase.squish.gsub(/\W/, ' ') == value.to_s.downcase.squish.gsub(/\W/, ' ')
+ comp_error = member_card_comparison.comparison_errors.find_or_create_by(card_field: key.to_s)
+ comp_error.assign_attributes(new_value: new_card_common[key], old_value: value)
+ current_errors << comp_error
+ end
+ end
+
+ unless old_card_dependents.values.map(&:squish).sort == new_card_dependents.values.map(&:squish).sort
+ missing_from_new = (old_card_dependents.values - new_card_dependents.values).compact_blank
+ missing_from_old = (new_card_dependents.values - old_card_dependents.values).compact_blank
+
+ comp_error = member_card_comparison.comparison_errors.find_or_create_by(card_field: "Missing Dependent(s)")
+ comp_error.assign_attributes(new_value: missing_from_old.join(', '), old_value: missing_from_new.join(', '))
+ current_errors << comp_error
+ end
+
+ unless (new_card_dental == old_card_dental) || (old_card_dental == "NONE" && new_card_dental.empty?)
+ comp_error = member_card_comparison.comparison_errors.find_or_create_by(card_field: "dental_coverage")
+ comp_error.assign_attributes(new_value: new_card_dental, old_value: old_card_dental)
+ current_errors << comp_error
+ end
+
+ unless (old_card_eff_date.present?) || (convert_to_date(new_card_eff_date) == convert_to_date(old_card_eff_date))
+ comp_error = member_card_comparison.comparison_errors.find_or_create_by(card_field: "medical_eff_date")
+ comp_error.assign_attributes(new_value: new_card_eff_date, old_value: old_card_eff_date)
+ current_errors << comp_error
+ end
+ else
+ comp_error = member_card_comparison.comparison_errors.find_or_create_by(card_field: "Missing Member")
+
+ comp_error.assign_attributes(
+ new_value: new_card.presence&.primary_mb_member_key || "Missing",
+ old_value: old_card.presence&.primary_mb_member_key || "Missing"
+ )
+ current_errors << comp_error
+ end
+ member_card_comparison.comparison_errors = current_errors
+ if current_errors.empty?
+ member_card_comparison.passed = true
+ end
+ member_card_comparison.save
+ end
+
+ def convert_to_date(string_date)
+ string_date.presence&.then { |s| Date.strptime(s, '%m/%d/%Y') }
+ end
+
+ end
+end
\ No newline at end of file
diff --git a/app/views/employer_setup/_alt_network_logo_fields.html.erb b/app/views/employer_setup/_alt_network_logo_fields.html.erb
index 3246b9c..4a1acbf 100644
--- a/app/views/employer_setup/_alt_network_logo_fields.html.erb
+++ b/app/views/employer_setup/_alt_network_logo_fields.html.erb
@@ -21,7 +21,7 @@
<%= 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.text_field :exception_values, label: { text: "Exception Values" }, class: "w-full" %>
diff --git a/app/views/employers/show.html.erb b/app/views/employers/show.html.erb
index 97bff89..f597b86 100644
--- a/app/views/employers/show.html.erb
+++ b/app/views/employers/show.html.erb
@@ -60,8 +60,8 @@
- <%= link_to 'Sync Employer with VHCS', generate_sample_id_card_print_path(id: @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" %>
- <%= link_to 'Sync Members with VHCS', generate_print_id_card_print_path(id: @employer.slug),data: { turbo: false }, class: "flex justify-center items-center w-full bg-brightlava hover:bg-deepcove border-2 border-brightlava text-platinum text-lg font-bold px-3 rounded-lg h-10 transition duration-100" %>
+ <%= link_to 'Sync Employer with VHCS', refresh_employer_information_employers_path(id: @employer.id), 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" %>
+ <%= link_to 'Sync Members with VHCS', refresh_employer_members_information_employers_path(id: @employer.id),data: { turbo: false }, class: "flex justify-center items-center w-full bg-brightlava hover:bg-deepcove border-2 border-brightlava text-platinum text-lg font-bold px-3 rounded-lg h-10 transition duration-100" %>
diff --git a/app/views/id_card/print/index.html.erb b/app/views/id_card/print/index.html.erb
index 60823d9..13d7695 100644
--- a/app/views/id_card/print/index.html.erb
+++ b/app/views/id_card/print/index.html.erb
@@ -10,7 +10,6 @@
<% @queued.each do |qu| %>
- <%= qu.pl_plan_key %> -
<%= qu.employer.name %>
(
@@ -32,7 +31,6 @@
<% end %>
- <%= nq.pl_plan_key %> -
<%= nq.employer.name %>
(
diff --git a/app/views/id_card/setup/_alt_network_logo_fields.html.erb b/app/views/id_card/setup/_alt_network_logo_fields.html.erb
index e42bda9..3fd1b69 100644
--- a/app/views/id_card/setup/_alt_network_logo_fields.html.erb
+++ b/app/views/id_card/setup/_alt_network_logo_fields.html.erb
@@ -1,7 +1,7 @@
- <%= exception_item_fields.select :network_logo_id, options_for_select(IdCard::NetworkLogo.pluck(:filename, :id)), { include_blank: "Select/Add Network Logo", class: "rounded-r-none flex flex-col" }, data: { exceptions_toggle_target: "dependentField", parent_value: "network_logo", logo_upload_target: "logoIdField", action: "change->logo-upload#setSelectPreview" } %>
+ <%= exception_item_fields.select :network_logo_id, options_for_select(IdCard::NetworkLogo.order(:filename).pluck(:filename, :id), exception_item_fields.object.network_logo_id), { include_blank: "Select/Add Network Logo", class: "rounded-r-none flex flex-col" }, data: { exceptions_toggle_target: "dependentField", parent_value: "network_logo", logo_upload_target: "logoIdField", action: "change->logo-upload#setSelectPreview" } %>
- <%= form_with model: @setup, url: update_field_exceptions_employer_id_card_setup_index_path(@employer.slug), local: true, multipart: true do |f| %>
-
+
+ <%= form_with model: @setup, url: update_field_exceptions_employer_id_card_setup_index_path(@employer.slug), local: true, multipart: true do |f| %>
<% @setup.field_exceptions.each_with_index do |exc, index| %>
<%= f.fields_for :field_exceptions, exc, child_index: index do |exception_fields| %>
-
-
-
- <%= exception_fields.select :exception_type, options_for_select(IdCard::FieldException::VALID_TYPES.map { |type| [type.titleize(keep_id_suffix: true), type] }), { label: { text: "Exception Based On" }, prompt: "Select Type", class: "w-full" }, data: { add_exception_target: "exception" } %>
+
+
+
+ <%= exception_fields.select :exception_type, options_for_select(IdCard::FieldException::VALID_TYPES.map { |type| [type.titleize(keep_id_suffix: true), type]}, exc.exception_type), { label: { text: "Exception Based On" }, prompt: "Select Type", class: "w-full" }, data: { add_exception_target: "exception" } %>
+
+
+ <%= exception_fields.text_field :exception_values, value: exc.exception_values.join(', '), label: { text: "Exception Values" }, class: "w-full" %>
+
+
+
+ Field Exception Items
+
+
+
+ <%= exception_fields.fields_for :field_exception_items do |exception_item_fields| %>
+
+
+ <%= exception_item_fields.select :field_name, options_for_select(IdCard::FieldExceptionItem::VALID_FIELD_NAMES.map { |field_name| [field_name.titleize, field_name] }, exception_item_fields.object.field_name ), { label: { text: "Card Field" }, prompt: "Select Card Field", class: "w-full" }, { data: { action: "change->exceptions-toggle#toggleFields", add_exception_item_target: "exceptionItem", exceptions_toggle_target: "selectField" } } %>
-
- <%= exception_fields.text_field :exception_value, label: { text: "Exception Value" }, class: "w-full" %>
+
+ <%= exception_item_fields.text_field :field_value, value: exception_item_fields.object.field_value, label: { text: "New Value" }, data: { exceptions_toggle_target: "dependentField", parent_value: "default" }, class: "w-full" %>
-
-
- Field Exception Items
-
-
-
- <%= exception_fields.fields_for :field_exception_items do |exception_item_fields| %>
+ <%= render 'alt_network_logo_fields', exception_item_fields: exception_item_fields %>
+
+ <%= exception_item_fields.select :provider_section_id, options_for_select(IdCard::ProviderSection.where.not(title: nil).map { |provider| [provider.title, provider.id] }, exception_item_fields.object.provider_section_id), { prompt: "Select Provider Template", class: "w-full" }, { data: { exceptions_toggle_target: "dependentField", parent_value: "provider_section" } } %>
+
+
+ <%= exception_item_fields.hidden_field :_destroy %>
+ <%= button_tag "Remove", class: "cursor-pointer flex items-center justify-center bg-brightlava font-bold text-lg text-platinum py-[6px] px-1 font-semibold leading-tight rounded-lg border-3 border-brightlava w-full", data: { action: "add-exception-item#removeExemptionItem" } %>
+
+
+ <% end %>
+ <%= button_tag "Add Another Item To Exception", class: "cursor-pointer bg-NEXT_COLOR hover:bg-deepcove text-xl font-bold text-platinum my-3 py-1 font-semibold leading-tight rounded border-3 border-NEXT_COLOR w-full", data: { action: "add-exception-item#addExemptionItem", add_exception_item_target: "exceptionItemButton" } %>
+
+ <%= exception_fields.fields_for :field_exception_items, IdCard::FieldExceptionItem.new, child_index: 'NEW_ITEM_RECORD' do |exception_item_fields| %>
- <%= exception_item_fields.select :field_name, options_for_select(IdCard::FieldExceptionItem::VALID_FIELD_NAMES.map { |field_name| [field_name.titleize, field_name] }, exception_item_fields.object.field_name ), { label: { text: "Card Field" }, prompt: "Select Card Field", class: "w-full" }, { data: { action: "change->exceptions-toggle#toggleFields", add_exception_item_target: "exceptionItem", exceptions_toggle_target: "selectField" } } %>
+ <%= exception_item_fields.select :field_name, options_for_select(IdCard::FieldExceptionItem::VALID_FIELD_NAMES.map { |field_name| [field_name.titleize, field_name] }), { label: { text: "Card Field" }, prompt: "Select Card Field", class: "w-full" }, { data: { action: "change->exceptions-toggle#toggleFields", add_exception_item_target: "exceptionItem", exceptions_toggle_target: "selectField" } } %>
- <%= exception_item_fields.text_field :field_value, value: exception_item_fields.object.field_value, label: { text: "New Value" }, data: { exceptions_toggle_target: "dependentField", parent_value: "default" }, class: "w-full" %>
+ <%= exception_item_fields.text_field :field_value, label: { text: "New Value" }, data: { exceptions_toggle_target: "dependentField", parent_value: "default" }, class: "w-full" %>
<%= render 'alt_network_logo_fields', exception_item_fields: exception_item_fields %>
- <%= exception_item_fields.select :provider_section_id, options_for_select(IdCard::ProviderSection.where.not(title: nil).map { |provider| [provider.title, provider.id] }, exception_item_fields.object.provider_section_id), { prompt: "Select Provider Template", class: "w-full" }, { data: { exceptions_toggle_target: "dependentField", parent_value: "provider_section" } } %>
+ <%= exception_item_fields.select :provider_section_id, options_for_select(IdCard::ProviderSection.where.not(title: nil).map { |provider| [provider.title, provider.id] }), { prompt: "Select Provider Template", class: "w-full" }, { data: { exceptions_toggle_target: "dependentField", parent_value: "provider_section" } } %>
<%= exception_item_fields.hidden_field :_destroy %>
@@ -41,33 +61,12 @@
<% end %>
- <%= button_tag "Add Another Item To Exception", class: "cursor-pointer bg-NEXT_COLOR hover:bg-deepcove text-xl font-bold text-platinum my-3 py-1 font-semibold leading-tight rounded border-3 border-NEXT_COLOR w-full", data: { action: "add-exception-item#addExemptionItem", add_exception_item_target: "exceptionItemButton" } %>
-
- <%= exception_fields.fields_for :field_exception_items, IdCard::FieldExceptionItem.new, child_index: 'NEW_ITEM_RECORD' do |exception_item_fields| %>
-
-
- <%= exception_item_fields.select :field_name, options_for_select(IdCard::FieldExceptionItem::VALID_FIELD_NAMES.map { |field_name| [field_name.titleize, field_name] }), { label: { text: "Card Field" }, prompt: "Select Card Field", class: "w-full" }, { data: { action: "change->exceptions-toggle#toggleFields", add_exception_item_target: "exceptionItem", exceptions_toggle_target: "selectField" } } %>
-
-
- <%= exception_item_fields.text_field :field_value, label: { text: "New Value" }, data: { exceptions_toggle_target: "dependentField", parent_value: "default" }, class: "w-full" %>
-
- <%= render 'alt_network_logo_fields', exception_item_fields: exception_item_fields %>
-
- <%= exception_item_fields.select :provider_section_id, options_for_select(IdCard::ProviderSection.where.not(title: nil).map { |provider| [provider.title, provider.id] }), { prompt: "Select Provider Template", class: "w-full" }, { data: { exceptions_toggle_target: "dependentField", parent_value: "provider_section" } } %>
-
-
- <%= exception_item_fields.hidden_field :_destroy %>
- <%= button_tag "Remove", class: "cursor-pointer flex items-center justify-center bg-brightlava font-bold text-lg text-platinum py-[6px] px-1 font-semibold leading-tight rounded-lg border-3 border-brightlava w-full", data: { action: "add-exception-item#removeExemptionItem" } %>
-
-
- <% end %>
-
-
+
<% end %>
<% end %>
- <%= button_tag "Add an Exception", class: "cursor-pointer text-lg font-medium py-2 px-4 rounded w-1/2 h-4/5 mt-3 text-[#E0E0E0] rounded-lg border border-[#C2C2C2] hover:shadow-[0_0_10px_3px_#93c5fd]", data: { action: "add-exception#addExemption", add_exception_target: "exceptionButton" } %>
+ <%= button_tag "Add an Exception", class: "cursor-pointer text-lg font-medium py-2 px-4 rounded w-1/2 min-h-[340px] mt-3 text-[#E0E0E0] rounded-lg border border-[#C2C2C2] hover:shadow-[0_0_10px_3px_#93c5fd]", data: { action: "add-exception#addExemption", add_exception_target: "exceptionButton" } %>
<%= f.fields_for :field_exceptions, @setup.field_exceptions.build, child_index: 'NEW_RECORD' do |exception_fields| %>
@@ -76,7 +75,7 @@
<%= exception_fields.select :exception_type, options_for_select(IdCard::FieldException::VALID_TYPES.map { |type| [type.titleize(keep_id_suffix: true), type] }), { label: { text: "Exception Based On" }, prompt: "Select Type", class: "w-full" }, data: { add_exception_target: "exception" } %>
- <%= exception_fields.text_field :exception_value, label: { text: "Exception Value" }, class: "w-full" %>
+ <%= exception_fields.text_field :exception_values, label: { text: "Exception Values" }, class: "w-full" %>
@@ -114,6 +113,6 @@
<%= f.submit "Submit Network" %>
-
- <% end %>
+ <% end %>
+
diff --git a/compose.yaml b/compose.yaml
index 4152005..44a0f75 100644
--- a/compose.yaml
+++ b/compose.yaml
@@ -19,25 +19,25 @@ services:
- PGID=100
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
+ 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:
diff --git a/config/routes.rb b/config/routes.rb
index a7d6cff..286339f 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -38,6 +38,8 @@ Rails.application.routes.draw do
resources :employers do
collection do
post 'import'
+ get 'refresh_employer_information'
+ get 'refresh_employer_members_information'
end
namespace :id_card do
resources :setup, only: [:index, :update, :destroy] do
diff --git a/config/schedule.rb b/config/schedule.rb
new file mode 100644
index 0000000..4ca5e5f
--- /dev/null
+++ b/config/schedule.rb
@@ -0,0 +1,9 @@
+set :output, "./log/cron_log.log"
+
+every 1.day, at: ['6:00 am', '6:00 pm'] do
+ rake "employer_automation:employer_members_update"
+end
+
+every '0,15,30,45 7-18 * * 1-5' do
+ rake "employer_automation:employer_update"
+end
diff --git a/db/migrate/20251202140122_create_employers.rb b/db/migrate/20251202140122_create_employers.rb
index 019bdc2..8ca7245 100644
--- a/db/migrate/20251202140122_create_employers.rb
+++ b/db/migrate/20251202140122_create_employers.rb
@@ -13,4 +13,4 @@ class CreateEmployers < ActiveRecord::Migration[7.2]
t.timestamps
end
end
-end
+end
\ No newline at end of file
diff --git a/db/migrate/20251204041154_create_id_card_setups.rb b/db/migrate/20251204041154_create_id_card_setups.rb
index c932354..b0b69b1 100644
--- a/db/migrate/20251204041154_create_id_card_setups.rb
+++ b/db/migrate/20251204041154_create_id_card_setups.rb
@@ -9,6 +9,7 @@ class CreateIdCardSetups < ActiveRecord::Migration[7.2]
t.string :pl_plan_key
t.boolean :active, default: false
t.boolean :has_divisions, default: false
+ t.boolean :has_dental, default: false
t.belongs_to :employer, 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 }
diff --git a/db/migrate/20251206190810_create_id_card_print_data.rb b/db/migrate/20251206190810_create_id_card_print_data.rb
index d00f3ca..45defb8 100644
--- a/db/migrate/20251206190810_create_id_card_print_data.rb
+++ b/db/migrate/20251206190810_create_id_card_print_data.rb
@@ -10,6 +10,7 @@ class CreateIdCardPrintData < ActiveRecord::Migration[7.0]
t.string :full_name
t.string :rx_group
t.string :medical_eff_date
+ t.string :dental_coverage
t.string :network_provider
t.string :provider_line_1
t.string :provider_line_2
@@ -74,11 +75,12 @@ class CreateIdCardPrintData < ActiveRecord::Migration[7.0]
t.string :benefit_13
t.string :benefit_desc_14
t.string :benefit_14
- t.integer :network_logo_id
+ t.string :precert_1
+ t.string :precert_2
+ t.string :precert_3
+ t.string :precert_4
t.string :network_logo_filename
t.string :employer_logo_filename
- t.boolean :sample, default: false
- t.string :sample_key
t.string :sample_plan_title
t.string :jasper_batch_id
diff --git a/db/migrate/20260114183848_create_members.rb b/db/migrate/20260114183848_create_members.rb
index b8b3136..e667efe 100644
--- a/db/migrate/20260114183848_create_members.rb
+++ b/db/migrate/20260114183848_create_members.rb
@@ -7,7 +7,9 @@ class CreateMembers < ActiveRecord::Migration[7.2]
t.integer :pb_entity_key
t.integer :pl_plan_key
t.string :id_card_display_name
+ t.string :coverage_class
t.string :division
+ t.string :dental_plan_key
t.belongs_to :employer, foreign_key: true
t.belongs_to :id_card_plan, null: true, foreign_key: true
diff --git a/db/migrate/20260116181849_create_id_card_field_exceptions.rb b/db/migrate/20260116181849_create_id_card_field_exceptions.rb
index c85090c..a33f1e1 100644
--- a/db/migrate/20260116181849_create_id_card_field_exceptions.rb
+++ b/db/migrate/20260116181849_create_id_card_field_exceptions.rb
@@ -2,7 +2,7 @@ class CreateIdCardFieldExceptions < ActiveRecord::Migration[7.2]
def change
create_table :id_card_field_exceptions do |t|
t.string :exception_type
- t.string :exception_value
+ t.string :exception_values
t.belongs_to :setup, null: false, foreign_key: { to_table: :id_card_setups }
t.timestamps
diff --git a/db/migrate/20260407161888_create_report_employer_card_comparisons.rb b/db/migrate/20260407161888_create_report_employer_card_comparisons.rb
new file mode 100644
index 0000000..10d4198
--- /dev/null
+++ b/db/migrate/20260407161888_create_report_employer_card_comparisons.rb
@@ -0,0 +1,14 @@
+class CreateReportEmployerCardComparisons < ActiveRecord::Migration[7.2]
+ def change
+ create_table :report_employer_card_comparisons do |t|
+ t.string :employer_name
+ t.string :pl_plan_key
+ t.integer :new_cards_count
+ t.integer :old_cards_count
+ t.integer :total_errors_count
+ t.boolean :passed, default: false
+
+ t.timestamps
+ end
+ end
+end
diff --git a/db/migrate/20260407162454_create_report_member_card_comparisons.rb b/db/migrate/20260407162454_create_report_member_card_comparisons.rb
new file mode 100644
index 0000000..469bc10
--- /dev/null
+++ b/db/migrate/20260407162454_create_report_member_card_comparisons.rb
@@ -0,0 +1,12 @@
+class CreateReportMemberCardComparisons < ActiveRecord::Migration[7.2]
+ def change
+ create_table :report_member_card_comparisons do |t|
+ t.integer :member_number
+ t.string :pl_plan_key
+ t.boolean :passed, default: false
+ t.belongs_to :employer_card_comparison, null: true, foreign_key: { to_table: :report_employer_card_comparisons }
+
+ t.timestamps
+ end
+ end
+end
diff --git a/db/migrate/20260408164533_create_report_comparison_errors.rb b/db/migrate/20260408164533_create_report_comparison_errors.rb
new file mode 100644
index 0000000..726a915
--- /dev/null
+++ b/db/migrate/20260408164533_create_report_comparison_errors.rb
@@ -0,0 +1,14 @@
+class CreateReportComparisonErrors < ActiveRecord::Migration[7.2]
+ def change
+ create_table :report_comparison_errors do |t|
+ t.string :card_field
+ t.string :new_value
+ t.string :old_value
+ t.boolean :disabled, default: false
+ t.belongs_to :employer_card_comparison, null: true, foreign_key: { to_table: :report_employer_card_comparisons }
+ t.belongs_to :member_card_comparison, null: true, foreign_key: { to_table: :report_member_card_comparisons }
+
+ t.timestamps
+ end
+ end
+end
diff --git a/db/migrate/20260408210447_create_report_old_card_duplicates.rb b/db/migrate/20260408210447_create_report_old_card_duplicates.rb
new file mode 100644
index 0000000..cc2cb06
--- /dev/null
+++ b/db/migrate/20260408210447_create_report_old_card_duplicates.rb
@@ -0,0 +1,80 @@
+class CreateReportOldCardDuplicates < ActiveRecord::Migration[7.2]
+ def change
+ create_table :report_old_card_duplicates do |t|
+ t.string :employer_name
+ t.string :full_name
+ t.string :group_number
+ t.string :medical_eff_date
+ t.string :dental_coverage
+ 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 :family_id
+ t.string :rx_group
+ t.string :customer_service
+ t.string :web_url
+ t.string :benefit_desc_1
+ t.string :benefit_1
+ t.string :benefit_desc_2
+ t.string :benefit_2
+ t.string :benefit_desc_3
+ t.string :benefit_3
+ t.string :benefit_desc_4
+ t.string :benefit_4
+ t.string :benefit_desc_5
+ t.string :benefit_5
+ t.string :benefit_desc_6
+ t.string :benefit_6
+ t.string :benefit_desc_7
+ t.string :benefit_7
+ t.string :benefit_desc_8
+ t.string :benefit_8
+ t.string :benefit_desc_9
+ t.string :benefit_9
+ t.string :benefit_desc_10
+ t.string :benefit_10
+ t.string :benefit_desc_11
+ t.string :benefit_11
+ t.string :benefit_desc_12
+ t.string :benefit_12
+ t.string :benefit_desc_13
+ t.string :benefit_13
+ t.string :benefit_desc_14
+ t.string :benefit_14
+ t.string :dependent_1
+ t.string :dependent_2
+ t.string :dependent_3
+ t.string :dependent_4
+ t.string :dependent_5
+ t.string :dependent_6
+ t.string :dependent_7
+ t.string :dependent_8
+ t.string :pl_plan_key
+ t.string :primary_mb_member_key
+
+ t.timestamps
+ end
+ end
+end
+
diff --git a/db/migrate/20260409175359_add_dependents_to_member.rb b/db/migrate/20260409175359_add_dependents_to_member.rb
new file mode 100644
index 0000000..104cf97
--- /dev/null
+++ b/db/migrate/20260409175359_add_dependents_to_member.rb
@@ -0,0 +1,5 @@
+class AddDependentsToMember < ActiveRecord::Migration[7.2]
+ def change
+ add_column :members, :dependents, :text
+ end
+end
diff --git a/db/old/20260320165424_create_batch_process.rb b/db/old/20260320165424_create_batch_process.rb
new file mode 100644
index 0000000..8b1ce6a
--- /dev/null
+++ b/db/old/20260320165424_create_batch_process.rb
@@ -0,0 +1,10 @@
+class CreateBatchProcess < ActiveRecord::Migration[7.2]
+ def change
+ create_table :batch_processes do |t|
+ t.integer :total_jobs, default: 0, null: false
+ t.integer :completed_jobs, default: 0, null: false
+
+ t.timestamps
+ end
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 0b1b494..5647796 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_03_20_152726) do
+ActiveRecord::Schema[7.2].define(version: 2026_04_09_175359) do
create_table "employers", force: :cascade do |t|
t.string "name"
t.string "slug"
@@ -49,7 +49,7 @@ ActiveRecord::Schema[7.2].define(version: 2026_03_20_152726) do
create_table "id_card_field_exceptions", force: :cascade do |t|
t.string "exception_type"
- t.string "exception_value"
+ t.string "exception_values"
t.bigint "setup_id", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
@@ -98,6 +98,7 @@ ActiveRecord::Schema[7.2].define(version: 2026_03_20_152726) do
t.string "full_name"
t.string "rx_group"
t.string "medical_eff_date"
+ t.string "dental_coverage"
t.string "network_provider"
t.string "provider_line_1"
t.string "provider_line_2"
@@ -162,11 +163,12 @@ ActiveRecord::Schema[7.2].define(version: 2026_03_20_152726) do
t.string "benefit_13"
t.string "benefit_desc_14"
t.string "benefit_14"
- t.integer "network_logo_id"
+ t.string "precert_1"
+ t.string "precert_2"
+ t.string "precert_3"
+ t.string "precert_4"
t.string "network_logo_filename"
t.string "employer_logo_filename"
- t.boolean "sample", default: false
- t.string "sample_key"
t.string "sample_plan_title"
t.string "jasper_batch_id"
t.datetime "created_at", null: false
@@ -239,6 +241,7 @@ ActiveRecord::Schema[7.2].define(version: 2026_03_20_152726) do
t.string "pl_plan_key"
t.boolean "active", default: false
t.boolean "has_divisions", default: false
+ t.boolean "has_dental", default: false
t.bigint "employer_id", null: false
t.bigint "employer_logo_id"
t.bigint "network_logo_id"
@@ -260,15 +263,128 @@ ActiveRecord::Schema[7.2].define(version: 2026_03_20_152726) do
t.integer "pb_entity_key"
t.integer "pl_plan_key"
t.string "id_card_display_name"
+ t.string "coverage_class"
t.string "division"
+ t.string "dental_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.text "dependents"
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
+ create_table "report_comparison_errors", force: :cascade do |t|
+ t.string "card_field"
+ t.string "new_value"
+ t.string "old_value"
+ t.boolean "disabled", default: false
+ t.bigint "employer_card_comparison_id"
+ t.bigint "member_card_comparison_id"
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.index ["employer_card_comparison_id"], name: "index_report_comparison_errors_on_employer_card_comparison_id"
+ t.index ["member_card_comparison_id"], name: "index_report_comparison_errors_on_member_card_comparison_id"
+ end
+
+ create_table "report_employer_card_comparisons", force: :cascade do |t|
+ t.string "employer_name"
+ t.string "pl_plan_key"
+ t.integer "new_cards_count"
+ t.integer "old_cards_count"
+ t.integer "total_errors_count"
+ t.boolean "passed", default: false
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ end
+
+ create_table "report_member_card_comparisons", force: :cascade do |t|
+ t.integer "member_number"
+ t.string "pl_plan_key"
+ t.boolean "passed", default: false
+ t.bigint "employer_card_comparison_id"
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.index ["employer_card_comparison_id"], name: "idx_on_employer_card_comparison_id_43d268709e"
+ end
+
+ create_table "report_old_card_duplicates", force: :cascade do |t|
+ t.string "employer_name"
+ t.string "full_name"
+ t.string "group_number"
+ t.string "medical_eff_date"
+ t.string "dental_coverage"
+ 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 "family_id"
+ t.string "rx_group"
+ t.string "customer_service"
+ t.string "web_url"
+ t.string "benefit_desc_1"
+ t.string "benefit_1"
+ t.string "benefit_desc_2"
+ t.string "benefit_2"
+ t.string "benefit_desc_3"
+ t.string "benefit_3"
+ t.string "benefit_desc_4"
+ t.string "benefit_4"
+ t.string "benefit_desc_5"
+ t.string "benefit_5"
+ t.string "benefit_desc_6"
+ t.string "benefit_6"
+ t.string "benefit_desc_7"
+ t.string "benefit_7"
+ t.string "benefit_desc_8"
+ t.string "benefit_8"
+ t.string "benefit_desc_9"
+ t.string "benefit_9"
+ t.string "benefit_desc_10"
+ t.string "benefit_10"
+ t.string "benefit_desc_11"
+ t.string "benefit_11"
+ t.string "benefit_desc_12"
+ t.string "benefit_12"
+ t.string "benefit_desc_13"
+ t.string "benefit_13"
+ t.string "benefit_desc_14"
+ t.string "benefit_14"
+ t.string "dependent_1"
+ t.string "dependent_2"
+ t.string "dependent_3"
+ t.string "dependent_4"
+ t.string "dependent_5"
+ t.string "dependent_6"
+ t.string "dependent_7"
+ t.string "dependent_8"
+ t.string "pl_plan_key"
+ t.string "primary_mb_member_key"
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ end
+
create_table "solid_queue_blocked_executions", force: :cascade do |t|
t.bigint "job_id", null: false
t.string "queue_name", null: false
@@ -403,6 +519,9 @@ ActiveRecord::Schema[7.2].define(version: 2026_03_20_152726) do
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"
+ add_foreign_key "report_comparison_errors", "report_employer_card_comparisons", column: "employer_card_comparison_id"
+ add_foreign_key "report_comparison_errors", "report_member_card_comparisons", column: "member_card_comparison_id"
+ add_foreign_key "report_member_card_comparisons", "report_employer_card_comparisons", column: "employer_card_comparison_id"
add_foreign_key "solid_queue_blocked_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade
add_foreign_key "solid_queue_claimed_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade
add_foreign_key "solid_queue_failed_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade
diff --git a/db/seeds.rb b/db/seeds.rb
index 333c466..ff9950c 100644
--- a/db/seeds.rb
+++ b/db/seeds.rb
@@ -1,3 +1,6 @@
+require "vips"
+require "image_processing/vips"
+
def determine_id_card_templates(pl_plan_key)
case pl_plan_key
when "2"
@@ -42,7 +45,19 @@ def determine_id_card_network(pl_plan_key)
end
def determine_divisions(pl_plan_key)
- if pl_plan_key == "16"
+ division_employers = ["2", "16"]
+
+ if division_employers.include?(pl_plan_key)
+ true
+ else
+ false
+ end
+end
+
+def determine_dental(pl_plan_key)
+ dental_employers = ["2", "3"]
+
+ if dental_employers.include?(pl_plan_key)
true
else
false
@@ -57,6 +72,111 @@ def determine_card_color(pl_plan_key)
end
end
+def determine_field_exceptions(pl_plan_key)
+ exceptions_map = {
+ "3" => [{
+ exception_type: "state",
+ exception_values: ["AZ", "MO", "IL"],
+ field_exception_items_attributes: [
+ {field_name: "provider_section", provider_section_id: 3},
+ {field_name: "network_logo", network_logo_id: 8}
+ ]
+ }],
+ "13" => [{
+ exception_type: "zipcode",
+ exception_values: ["14422", "14623", "14624"],
+ field_exception_items_attributes: [
+ {field_name: "network_logo", network_logo_id: 3}
+ ]
+ }],
+ "16" => [{
+ exception_type: "state",
+ exception_values: ["VA"],
+ field_exception_items_attributes: [
+ {field_name: "medical_eff_date", field_value: "12/01/2025"},
+ {field_name: "provider_section", provider_section_id: 7},
+ {field_name: "network_logo", network_logo_id: 6}
+ ]
+ }],
+ "21" => [{
+ exception_type: "state",
+ exception_values: ["VA"],
+ field_exception_items_attributes: [
+ {field_name: "network_logo", network_logo_id: 3}
+ ]
+ }],
+ "51" => [{
+ exception_type: "zipcode",
+ exception_values: ["41456", "41149", "41124"],
+ field_exception_items_attributes: [
+ {field_name: "network_logo", network_logo_id: 4}
+ ]
+ }],
+ "55" => [{
+ exception_type: "state",
+ exception_values: ["CA", "GA"],
+ field_exception_items_attributes: [
+ {field_name: "provider_section", provider_section_id: 8},
+ {field_name: "network_logo", network_logo_id: 5}
+ ]
+ }],
+ "62" => [
+ {
+ exception_type: "zipcode",
+ exception_values: ["49420", "48167"],
+ field_exception_items_attributes: [
+ {field_name: "network_logo", network_logo_id: 2}
+ ]
+ },
+ {
+ exception_type: "zipcode",
+ exception_values: ["55419", "55379"],
+ field_exception_items_attributes: [
+ {field_name: "network_logo", network_logo_id: 1}
+ ]
+ }
+ ],
+ "65" => [
+ {
+ exception_type: "zipcode",
+ exception_values: ["48430", "44842", "48649"],
+ field_exception_items_attributes: [
+ {field_name: "network_logo", network_logo_id: 2}
+ ]
+ },
+ {
+ exception_type: "zipcode",
+ exception_values: ["55372", "55021"],
+ field_exception_items_attributes: [
+ {field_name: "network_logo", network_logo_id: 1}
+ ]
+ },
+ {
+ exception_type: "zipcode",
+ exception_values: ["18042", "18080"],
+ field_exception_items_attributes: [
+ {field_name: "network_logo", network_logo_id: 10}
+ ]
+ }
+ ],
+ "66" => [{
+ exception_type: "state",
+ exception_values: ["GA"],
+ field_exception_items_attributes: [
+ {field_name: "provider_section", provider_section_id: 8},
+ {field_name: "network_logo", network_logo_id: 5}
+ ]
+ }]
+ }
+
+ if exceptions_map[pl_plan_key].present?
+ exceptions_map[pl_plan_key]
+ else
+ nil
+ end
+
+end
+
puts "[**** IMPORT ID CARD TABLES ****]"
## SET UP DEFAULT LEVEL360 PLANS FOR PLAN PICKER
@@ -160,18 +280,18 @@ Rake::Task["employer:vhcs_sync_all"].invoke
##---------------- Import Employers (Word Docs) ------------------------------------
-puts "Importing Employers From Word Docs"
-folder_path = Rails.root.join('employer_word_docs')
-file_names = Dir.children(folder_path)
+# puts "Importing Employers From Word Docs"
+# folder_path = Rails.root.join('employer_word_docs')
+# file_names = Dir.children(folder_path)
-file_names.each do |word_doc|
- puts "-- Processing #{word_doc}"
- new_employer = BenefitsWordDocService::WordDocProcessor.new("employer_word_docs/#{word_doc}").call
- if new_employer.save
- puts "Imported #{new_employer.name}"
- end
+# file_names.each do |word_doc|
+# puts "-- Processing #{word_doc}"
+# new_employer = BenefitsWordDocService::WordDocProcessor.new("employer_word_docs/#{word_doc}").call
+# if new_employer.save
+# puts "Imported #{new_employer.name}"
+# end
-end
+# end
##---------------- Update ID Card Setups------------------------------------
@@ -180,6 +300,7 @@ IdCard::Setup.all.each do |setup|
setup.card_template = determine_id_card_templates(setup.pl_plan_key)
setup.card_color = determine_card_color(setup.pl_plan_key)
setup.has_divisions = determine_divisions(setup.pl_plan_key)
+ setup.has_dental = determine_dental(setup.pl_plan_key)
network_information = determine_id_card_network(setup.pl_plan_key)
setup.network_provider = network_information[:provider]
@@ -192,7 +313,7 @@ IdCard::Setup.all.each do |setup|
rs = IdCard::RxSection.find_by(title: rx_title)
setup.rx_section_id = rs.id
- employer_name = setup.employer.employer_trim_name
+ employer_name = Employer.employer_trim_name(setup.employer.name)
name_segments = employer_name.titleize.split
name_segments.each do |segment|
logo = IdCard::EmployerLogo.where("filename LIKE ?", "%#{segment}%")
@@ -202,10 +323,18 @@ IdCard::Setup.all.each do |setup|
end
end
+ card_exceptions = determine_field_exceptions(setup.pl_plan_key)
+ if card_exceptions.present?
+ setup.field_exceptions.create(card_exceptions)
+ # card_exceptions.each do |exc|
+ # setup.field_exceptions.create(exc)
+ # end
+ end
+
if setup.pl_plan_key.present?
setup.active = true
end
-
+
setup.save
end
diff --git a/elig_csv_sanitizer.rb b/elig_csv_sanitizer.rb
new file mode 100644
index 0000000..2e7fcea
--- /dev/null
+++ b/elig_csv_sanitizer.rb
@@ -0,0 +1,36 @@
+require 'csv'
+require 'date'
+
+start_date = Date.today - (364)
+end_date = Date.today
+
+random_date = Date.jd(rand(start_date.ajd..end_date.ajd))
+formatted_date = random_date.strftime('%m%d')
+
+puts formatted_date
+
+input_file = 'tmp/BBSTPA_Med_Accum_20260218.txt'
+output_file = 'tmp/sample_elig_file.csv'
+captured_groups = []
+
+# Read input, process, and write output
+CSV.open(output_file, 'w', col_sep: '|') do |csv_out|
+ headers = CSV.foreach(input_file, col_sep: '|').first
+ csv_out << headers
+ CSV.foreach(input_file, headers: true, col_sep: '|').with_index do |row, i|
+ if row['Carrier Code'] == "CHAA" && !captured_groups.include?(row['Group Number'])
+ random_date = Date.jd(rand(start_date.ajd..end_date.ajd))
+ formatted_date = random_date.strftime('%m%d').to_s
+ dob = row['Date of Birth'].to_s.gsub(/.{4}$/, "#{formatted_date}")
+
+ row['Last Name'] = 'DOE'
+ row['First Name'] = 'JANE'
+ row['Date of Birth'] = dob
+ row['Social Security Number'] = '#########'
+ row['Subscriber Social Security Number'] = '#########'
+
+ captured_groups << row['Group Number']
+ csv_out << row
+ end
+ end
+end
diff --git a/lib/tasks/employer_automation.rake b/lib/tasks/employer_automation.rake
new file mode 100644
index 0000000..29b3c2f
--- /dev/null
+++ b/lib/tasks/employer_automation.rake
@@ -0,0 +1,18 @@
+namespace :employer_automation do
+
+ desc "Update Necessary Employer Values"
+ # rake employer:vhcs_sync_all
+ task employer_update: :environment do
+ Employer.missing_keychain_values.map(&:sync_with_vhcs)
+ Employer.missing_initial_members.map(&:sync_members_with_vhcs)
+ end
+
+
+
+ desc "Update Employer Members"
+ # rake employer:import_members_from_vhcs[67]
+ task employer_members_update: :environment do
+ Employer.active.map(&:sync_members_with_vhcs)
+ end
+
+end
diff --git a/lib/tasks/employer.rake b/lib/tasks/employer_pre_auto.rake
similarity index 51%
rename from lib/tasks/employer.rake
rename to lib/tasks/employer_pre_auto.rake
index d5b7c55..7b4b9ee 100644
--- a/lib/tasks/employer.rake
+++ b/lib/tasks/employer_pre_auto.rake
@@ -1,9 +1,9 @@
-namespace :employer do
+namespace :employer_pre_auto 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'"
+ sql_query = "SELECT PLPlanKey, PlanId, ShortDesc FROM PLPlanHeader WHERE ActiveInactive = 'Active' AND PLPlanKey NOT IN ('50','56')"
plan_headers = VhcsRecord.connection.select_all(sql_query)
plan_headers.each do |ph|
@@ -29,8 +29,8 @@ namespace :employer do
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_print_name = Vhcs::PbEntity.find_by(company_pb_entity_key: em.company_pb_entity_key).last_name
- id_card_setup.print_name = em.employer_trim_name(card_print_name)
+ card_print_name = Vhcs::PbEntity.where(company_pb_entity_key: em.company_pb_entity_key, entity_type_id: 1007).last.last_name
+ id_card_setup.print_name = card_print_name
em.active = true
@@ -70,13 +70,19 @@ namespace :employer do
vw_mb_members.each_with_index do |vwm, i|
- participation = Vhcs::PbProductParticipation.joins('INNER JOIN "PBCoveredEntities" ON "PBProductParticipation"."PBProductParticipationKey" = "PBCoveredEntities"."PBProductParticipationKey"').where('"PBCoveredEntities"."PBEntityKey" = ?', vwm.pb_entity_key).last
-
- if participation.present?
- in_effect = participation.in_effect
- out_of_effect = participation.out_of_effect
+ # participation = Vhcs::PbProductParticipation.joins('INNER JOIN "PBCoveredEntities" ON "PBProductParticipation"."PBProductParticipationKey" = "PBCoveredEntities"."PBProductParticipationKey"').where('"PBCoveredEntities"."PBEntityKey" = ?', vwm.pb_entity_key).last
- if in_effect <= (Date.today + 90.days) && (out_of_effect - 1.day) > Date.today && out_of_effect > in_effect
+ pb_products = 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" = ? AND "PBProductParticipation"."InEffect" <= ? AND "PBProductParticipation"."OutOfEffect" > ?', vwm.pb_entity_key, 1.month.from_now , 1.day.ago)
+
+ if pb_products.present?
+ # in_effect = participation.in_effect
+ # out_of_effect = participation.out_of_effect
+
+ # if in_effect <= (Date.today + 90.days) && (out_of_effect - 1.day) > Date.today && out_of_effect > in_effect
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
@@ -96,16 +102,46 @@ namespace :employer do
me.division = division
end
- pb_product = 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
- if pb_product
- plan_pb_product_key = pb_product.pb_product_key
- if plan = IdCard::Plan.find_by(pb_product_key: plan_pb_product_key)
+ # if employer.id_card_setup.has_dental
+ # coverage_class = Vhcs::GenLookupTables.joins('
+ # INNER JOIN "PBProductParticipation" ON "PBProductParticipation"."CoverageTypeCode" = "GEN_LookupTables"."RecordID"
+ # INNER JOIN "PBCoveredEntities" ON "PBProductParticipation"."PBProductParticipationKey" = "PBCoveredEntities"."PBProductParticipationKey"
+ # ').where(
+ # '"PBCoveredEntities"."PBEntityKey" = ? AND "PBProductParticipation"."InEffect" <= ? AND "PBProductParticipation"."OutOfEffect" > ?', me.pb_entity_key, 1.month.from_now , 1.day.ago
+ # ).uniq.first.short_desc
+ # end
+
+ # pb_products = 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" = ? AND "PBProductParticipation"."InEffect" <= ? AND "PBProductParticipation"."OutOfEffect" > ?', me.pb_entity_key, 1.month.from_now , 1.day.ago)
+
+ # if pb_products
+ if employer.id_card_setup.has_dental
+ medical_pb_product_key = pb_products.where(short_description: "Medical")&.first&.pb_product_key
+ dental_pb_product_key = pb_products.where(short_description: "Dental")&.first&.pb_product_key
+ if dental_pb_product_key
+ me.dental_plan_key = dental_pb_product_key
+
+ coverage_class = Vhcs::GenLookupTables.joins('
+ INNER JOIN "PBProductParticipation" ON "PBProductParticipation"."CoverageTypeCode" = "GEN_LookupTables"."RecordID"
+ INNER JOIN "PBCoveredEntities" ON "PBProductParticipation"."PBProductParticipationKey" = "PBCoveredEntities"."PBProductParticipationKey"
+ ').where(
+ '"PBCoveredEntities"."PBEntityKey" = ? AND "PBProductParticipation"."InEffect" <= ? AND "PBProductParticipation"."OutOfEffect" > ?', me.pb_entity_key, 1.month.from_now , 1.day.ago
+ ).uniq.first.short_desc
+ me.coverage_class = coverage_class
+ end
+ else
+ medical_pb_product_key = pb_products.first.pb_product_key
+ end
+ if medical_pb_product_key && plan = IdCard::Plan.find_by(pb_product_key: medical_pb_product_key)
me.id_card_plan = plan
end
- end
+ # end
end
puts "Employer #{employer.name} (#{i}/#{vw_mb_members_count}) members processed"
- end
+ # end
end
end
end
diff --git a/lib/tasks/export_fes.rake b/lib/tasks/export_fes.rake
new file mode 100644
index 0000000..d400fcf
--- /dev/null
+++ b/lib/tasks/export_fes.rake
@@ -0,0 +1,121 @@
+# namespace :export_fes do
+# desc "Export field exceptions for seed data"
+# task to_seeds: :environment do
+# IdCard::FieldExceptions.all.each do |fe|
+# # Exclude internal metadata like ID and timestamps
+# attrs = fe.attributes.except("id", "created_at", "updated_at")
+
+# puts "User.find_or_create_by!(#{attrs})"
+# end
+# end
+# end
+
+# IdCard::FieldException.includes(:field_exception_items).all.as_json(
+# except: [:id, :setup_id, :created_at, :updated_at],
+# include: {
+# field_exception_items: { except: [:id, :field_exception_id, :created_at, :updated_at] }
+# }
+# )
+
+# {"exception_type" => "state",
+# "exception_values" => "VA",
+# "field_exception_items" =>
+# [{"field_name" => "medical_eff_date", "field_value" => "12/01/2025", "provider_section_id" => nil},
+# {"field_name" => "provider_section", "field_value" => "", "provider_section_id" => 7},
+# {"field_name" => "network_logo", "field_value" => "", "network_logo_id" => 10, "provider_section_id" => nil}]}
+
+
+# {
+# "3" => [{
+# "exception_type" => "state",
+# "exception_values" => ["AZ", "MO", "IL"],
+# "field_exception_items" => [
+# {"field_name" => "provider_section", "provider_section_id" => 3},
+# {"field_name" => "network_logo", "network_logo_id" => 8}
+# ]
+# }],
+# "13" => [{
+# "exception_type" => "zipcode",
+# "exception_values" => ["14422", "14623", "14624"],
+# "field_exception_items" => [
+# {"field_name" => "network_logo", "network_logo_id" => 3}
+# ]
+# }],
+# "16" => [{
+# "exception_type" => "state",
+# "exception_values" => ["VA"],
+# "field_exception_items" => [
+# {"field_name" => "medical_eff_date", "field_value" => "12/01/2025"},
+# {"field_name" => "provider_section", "provider_section_id" => 7},
+# {"field_name" => "network_logo", "network_logo_id" => 6}
+# ]
+# }],
+# "21" => [{
+# "exception_type" => "state",
+# "exception_values" => ["VA"],
+# "field_exception_items" => [
+# {"field_name" => "network_logo", "network_logo_id" => 3}
+# ]
+# }],
+# "51" => [{
+# "exception_type" => "zipcode",
+# "exception_values" => ["41456", "41149", "41124"],
+# "field_exception_items" => [
+# {"field_name" => "network_logo", "network_logo_id" => 4}
+# ]
+# }],
+# "55" => [{
+# "exception_type" => "state",
+# "exception_values" => ["CA", "GA"],
+# "field_exception_items" => [
+# {"field_name" => "network_logo", "network_logo_id" => 5},
+# {"field_name" => "provider_section", "provider_section_id" => 8}
+# ]
+# }],
+# "62" => [
+# {
+# "exception_type" => "zipcode",
+# "exception_values" => ["49420", "48167"],
+# "field_exception_items" => [
+# {"field_name" => "network_logo", "network_logo_id" => 2}
+# ]
+# },
+# {
+# "exception_type" => "zipcode",
+# "exception_values" => ["55419", "55379"],
+# "field_exception_items" => [
+# {"field_name" => "network_logo", "network_logo_id" => 1}
+# ]
+# }
+# ],
+# "65" => [
+# {
+# "exception_type" => "zipcode",
+# "exception_values" => ["48430", "44842", "48649"],
+# "field_exception_items" => [
+# {"field_name" => "network_logo", "network_logo_id" => 2}
+# ]
+# },
+# {
+# "exception_type" => "zipcode",
+# "exception_values" => ["55372", "55021"],
+# "field_exception_items" => [
+# {"field_name" => "network_logo", "network_logo_id" => 1}
+# ]
+# },
+# {
+# "exception_type" => "zipcode",
+# "exception_values" => ["18042", "18080"],
+# "field_exception_items" => [
+# {"field_name" => "network_logo", "network_logo_id" => 10}
+# ]
+# }
+# ],
+# "66" => [{
+# "exception_type" => "state",
+# "exception_values" => ["GA"],
+# "field_exception_items" => [
+# {"field_name" => "network_logo", "network_logo_id" => 5}
+# ]
+# }]
+# }
\ No newline at end of file
diff --git a/lib/tasks/seed_tasks.rake b/lib/tasks/seed_tasks.rake
new file mode 100644
index 0000000..be0ebf0
--- /dev/null
+++ b/lib/tasks/seed_tasks.rake
@@ -0,0 +1,324 @@
+require 'json'
+
+namespace :seed_tasks do
+
+ ## Build ID Card Information Tables
+
+ desc "Build Initial Plan Templates"
+ # rake seed_tasks:build_plan_templates
+ task build_plan_templates: :environment do
+ puts "Importing Plan Templates"
+ file_path = Rails.root.join('seed_docs', 'Standard Level360 Plans.pdf')
+ reader = PDF::Reader.new(file_path)
+ pages = []
+ reader.pages.each do |page|
+ rows = []
+ text = page.text
+ lines = text.split("\n")
+
+ lines.each do |line|
+ cells = line.strip.split(/\s{2,}|\t/)
+ rows << cells if cells.size > 1
+ end
+ pages << rows
+ end
+
+ pages.each do |page_rows|
+ title_row = page_rows.first
+ title_row.each_with_index do |plan, index|
+ next if index == 0
+ plan_items = page_rows.map { |row| row[index] }
+ plan_items.shift
+
+ plan = IdCard::Plan.create!(title: plan, template: true)
+ doc_to_sequence_map = {
+ 0 => 4,
+ 1 => 5,
+ 2 => 6,
+ 3 => 7,
+ 4 => 9,
+ 5 => 10,
+ 6 => 11,
+ 7 => 12,
+ 10 => 1,
+ 11 => 2,
+ 12 => 3,
+ 13 => 13
+ }
+ # 9 => 8,
+ # 10 => 8,
+ plan_items.each_with_index do |item, i|
+ puts "-- #{item}"
+ sequence = doc_to_sequence_map[i]
+ if sequence.present?
+ benefit = plan.plan_benefits.find_by(sequence: sequence)
+ if item.start_with?("Ded.")
+ item = "Ded & Coin"
+ end
+ benefit.update(benefit: item)
+ elsif i == 8
+ carrier_coins = item.sub(/\/.*/, '')
+ member_coins = plan_items[(i+1)].sub(/\/.*/, '')
+ coins = "#{carrier_coins}/#{member_coins}"
+ benefit = plan.plan_benefits.find_by(sequence: 8)
+ benefit.update(benefit: coins)
+ end
+ end
+ end
+ end
+ end
+
+ desc "Build Initial Provider Sections"
+ # rake seed_tasks:build_provider_sections
+ task build_provider_sections: :environment do
+ puts "Importing Card Provider/Claims Information"
+ default_provider_codes = ["2", "5"]
+ needed_codes_mapping = {
+ "0": "MedCost VA Plus Network",
+ "2": "MedCost",
+ "3": "AHA Preferred",
+ "5": "Cigna",
+ "6": "Cigna (Beam/Stevens)",
+ A: "AHA",
+ M: "MedCost (smART)",
+ T: "MedCost (Tandemloc)"
+ }.stringify_keys
+ needed_codes = needed_codes_mapping.keys
+ vhcs_cp = Vhcs::HlidCardProvider.where(provider_code: needed_codes)
+ vhcs_cp.each do |vhcs|
+ attributes_hash = vhcs.attributes.except(:provider_code, :group_number)
+ attributes_hash.delete_if { |key, value| !key.to_s.include?("_") }
+
+ if default_provider_codes.include?(vhcs.provider_code)
+ attributes_hash[:default] = true
+ end
+ attributes_hash[:title] = needed_codes_mapping[vhcs.provider_code]
+
+ puts "-- #{attributes_hash[:title]}"
+ IdCard::ProviderSection.find_or_create_by(attributes_hash)
+ end
+
+ end
+
+ desc "Build Initial Rx Sections"
+ # rake seed_tasks:build_rx_sections
+ task build_rx_sections: :environment do
+ puts "Importing Card Rx Information"
+ Vhcs::HlrxCrosRef.all.each do |vhcs|
+ rx = IdCard::RxSection.find_or_create_by(help_desk: vhcs.help_desk, customer_service: vhcs.customer_service, web_url: vhcs.web_url)
+ title = rx.web_url.gsub(/^www\./, '').gsub(/\.com\Z/, '')
+ unless title.match?(/\A[A-Z]/)
+ title = title.capitalize
+ end
+
+ puts "-- #{title}"
+ rx.title = title
+ rx.save
+ end
+ end
+
+ desc "Build Initial Network Logos"
+ # rake seed_tasks:build_network_logos
+ task build_network_logos: :environment do
+ puts "Importing Network Logos"
+ folder_path = Rails.root.join('seed_docs', 'logo_files', 'network')
+ file_names = Dir.children(folder_path)
+ default_network_logos = ["CignaLogo.png", "MedCostLogo.png"]
+
+ file_names.each do |logo_upload|
+ puts "-- #{logo_upload}"
+ file_path = folder_path.join(logo_upload)
+ new_logo = ImageProcessorService.new(file_path, "Network").call
+ if default_network_logos.include?(logo_upload)
+ new_logo.default = true
+ end
+ new_logo.active = true
+ new_logo.save
+ end
+ end
+
+ desc "Build Initial Employer Logos"
+ # rake seed_tasks:build_employer_logos
+ task build_employer_logos: :environment do
+ puts "Importing Employer Logos"
+ folder_path = Rails.root.join('seed_docs', 'logo_files', 'employer')
+ file_names = Dir.children(folder_path)
+
+ file_names.each do |logo_upload|
+ puts "-- #{logo_upload}"
+ file_path = folder_path.join(logo_upload)
+ new_logo = ImageProcessorService.new(file_path, "Employer").call
+ new_logo.active = true
+ new_logo.save
+ end
+ end
+
+ ## Build Entities Tables
+
+ desc "Build Initial Carriers"
+ # rake seed_tasks:build_carriers
+ task build_carriers: :environment do
+ puts "Importing Carriers"
+ end
+
+ desc "Build Initial Brokers"
+ # rake seed_tasks:build_brokers
+ task build_brokers: :environment do
+ puts "Importing Brokers"
+ end
+
+ desc "Build Initial Employers"
+ # rake seed_tasks:build_employers
+ task build_employers: :environment do
+ puts "Importing Employers"
+ sql_query = "SELECT PLPlanKey, PlanId, ShortDesc FROM PLPlanHeader WHERE ActiveInactive = 'Active'" # AND PLPlanKey NOT IN ('50','56')"
+ plan_headers = VhcsRecord.connection.select_all(sql_query)
+
+ plan_headers.each do |plan_header|
+ employer = UpdateEmployerJob.perform_now(plan_header['PLPlanKey'], plan_header, true)
+ puts "-- #{employer.name}"
+ # employer_plans = employer.id_card_setup.plans
+ vhcs_plans = Vhcs::PbProduct.where(company_pb_entity_key: employer.company_pb_entity_key, is_active: 255)
+ vhcs_plans.each do |vp|
+ # plan = employer_plans.find_by(pb_product_key: vp.pb_product_key)
+ # if plan.present?
+ # plan_titles = employer_plans.pluck(:title)
+ # plan_title_matcher = JaroWinkler.new(vp.short_description)
+ # closest_title = plan_titles.max_by { |title| plan_title_matcher.match(title) }
+ # plan = employer_plans.find_by(title: closest_title)
+ # plan.update(pb_product_key: vp.pb_product_key)
+ # end
+ plan = employer.id_card_setup.plans.find_by(pb_product_key: vp.pb_product_key)
+ puts "---- #{plan.title}"
+ # plan.update(
+ # title: vp.short_description,
+ # pl_plan_key: employer.pl_plan_key
+ # )
+ vhcs_plan_benefits = Vhcs::HlEgglestonCardBenefit.where(plan_id: plan.pb_product_key)
+ vhcs_plan_benefits.each do |vb|
+ benefit = plan.plan_benefits.find_by(sequence: vb.sequence)
+ benefit.update(benefit: vb.benefit)
+ end
+ end
+ end
+
+ end
+
+ desc "Build Initial Members"
+ # rake seed_tasks:build_members
+ task build_members: :environment do
+ puts "Importing Members"
+ Employer.all.map(&:sync_members_with_vhcs)
+ end
+
+ ## Build Employer ID Card Setups
+
+ desc "Determine Initial Card Templates"
+ # rake seed_tasks:determine_card_templates
+ task determine_card_templates: :environment do
+ puts "Updating Card Templates"
+ IdCard::Setup.all.each do |setup|
+ setup_update_attrs = case setup.pl_plan_key
+ when "2"
+ {
+ card_template: "SmartIDCard",
+ card_color: "white",
+ rx_title: "FairosRx",
+ has_divisions: true,
+ has_dental: true
+ }
+ when "3"
+ {
+ card_template: "TandemlocIDCard",
+ card_color: "blue",
+ rx_title: "FairosRx",
+ has_dental: true
+ }
+ when "56"
+ {
+ card_template: "QRCodeIDCard",
+ card_color: "white",
+ rx_title: "TheHealthBus"
+ }
+ else
+ {
+ card_template: "FairosRxIDCard",
+ card_color: "white",
+ rx_title: "FairosRx"
+ }
+ end
+ rx_title = setup_update_attrs.delete(:rx_title)
+ rx_section_id = IdCard::RxSection.find_by(title: rx_title).id
+ setup_update_attrs.merge!(rx_section_id: rx_section_id)
+
+ setup.update(setup_update_attrs)
+ end
+
+ end
+
+ desc "Determine Initial Network Fields"
+ # rake seed_tasks:determine_network_fields
+ task determine_network_fields: :environment do
+ puts "Updating Network Fields"
+ cigna_groups = ["13","20","39","48","49","51","53","54","56","58","60","61","62","65","67","68","69"]
+ medcost_groups = ["4","5","16","23","33","55","57","59","63","66"]
+ old_cigna_groups = ["19","21"]
+ smart_medcost = ["2"]
+ tan_medcost = ["3"]
+
+ IdCard::Setup.all.each do |setup|
+ pl_plan_key = setup.pl_plan_key
+ setup_update_attrs = case
+ when cigna_groups.include?(pl_plan_key) || pl_plan_key.blank?
+ { network_provider: "Cigna", network_logo: "CignaLogo.png", provider_section: "Cigna" }
+ when medcost_groups.include?(pl_plan_key)
+ { network_provider: "MedCost", network_logo: "MedcostLogo.png", provider_section: "MedCost" }
+ when old_cigna_groups.include?(pl_plan_key)
+ { network_provider: "Cigna", network_logo: "CignaLogo.png", provider_section: "Cigna (Beam/Stevens)" }
+ when smart_medcost.include?(pl_plan_key)
+ { network_provider: "MedCost", network_logo: "MedcostLogo.png", provider_section: "MedCost (smART)" }
+ when tan_medcost.include?(pl_plan_key)
+ { network_provider: "MedCost", network_logo: "MedcostLogo.png", provider_section: "MedCost (Tandemloc)" }
+ end
+
+ provider_section_title = setup_update_attrs.delete(:provider_section)
+ provider_section_id = IdCard::ProviderSection.find_by(title: provider_section_title).id
+ setup_update_attrs.merge!(provider_section_id: provider_section_id)
+
+ network_logo_filename = setup_update_attrs.delete(:network_logo)
+ network_logo_id = IdCard::NetworkLogo.find_by(filename: network_logo_filename).id
+ setup_update_attrs.merge!(network_logo_id: network_logo_id)
+
+ setup.update(setup_update_attrs)
+ end
+ end
+
+ desc "Determine Initial Employer Fields"
+ # rake seed_tasks:determine_employer_fields
+ task determine_employer_fields: :environment do
+ puts "Updating Employer Fields"
+ IdCard::Setup.all.each do |setup|
+ setup_update_attrs = {}
+ employer_name = Employer.employer_trim_name(setup.employer.name)
+ name_segments = employer_name.titleize.split
+ name_segments.each do |segment|
+ logo = IdCard::EmployerLogo.where("filename LIKE ?", "%#{segment}%")
+ if logo&.first
+ # setup_update_attrs.merge!(employer_logo_id: logo.first.id)
+ setup.employer_logo = logo.first
+ break
+ end
+ end
+ json_file_path = Rails.root.join('seed_docs', 'json_files', 'card_exceptions.json')
+ file_content = File.read(json_file_path)
+ card_exceptions_map = JSON.parse(file_content)
+ if card_exceptions_map[pl_plan_key].present?
+ setup.field_exceptions.create(card_exceptions_map[pl_plan_key])
+ end
+
+ setup.save
+ end
+
+ end
+
+end
diff --git a/scratch.rb b/scratch.rb
index 5adb3f2..01a8924 100644
--- a/scratch.rb
+++ b/scratch.rb
@@ -37,14 +37,15 @@ data_lines.index { |s| s == 'Medical Plan'}
Zip::File.open('tmp/BRYAN PEST CONTROL ID CARD SET UP REVISION.docx') do |zip_file|
- zip_file.each do |entry|
+ zip_file.each do |entry|
if entry.name.start_with?('word/media/') && !entry.directory?
- filename = File.basename(entry.name)
- image_data = entry.get_input_stream.read
- extracted_images << { filename: filename, data: image_data }
+ puts File.basename(entry.name)
+ puts File.extname(entry.name)
+ # image_data = entry.get_input_stream.read
+ # extracted_images << { filename: filename, data: image_data }
end
- end
end
+end
Sitation
[8,9,10,15,19,40]
@@ -75,7 +76,7 @@ process:
}
-BenefitsWordDocProcessor.new('tmp/BRYAN PEST CONTROL ID CARD SET UP REVISION.docx').call
+WordDocProcessor.new('tmp/BRYAN PEST CONTROL ID CARD SET UP REVISION.docx').call
sample_id_cards
rails g model SampleIdCard family_id:string network_image:string pl_plan_key:integer primary_mb_member_key:integer employer_name:string full_name:string medical_eff_date:string provider_code:string provider_line_1:string provider_line_2:string provider_line_3:string provider_line_4:string provider_line_5:string provider_line_6:string provider_line_7:string provider_line_8:string provider_line_9:string provider_line_10:string provider_line_11:string mail_to:string claim_to_1:string claim_to_2:string claim_to_3:string claim_to_4:string claim_to_5:string claim_to_6:string claim_to_7:string claim_to_8:string claim_to_9:string claim_to_10:string claim_to_11:string group_number:string rx_group:string customer_service:string web_url:string dependent_1:string dependent_2:string dependent_3:string dependent_4:string dependent_5:string dependent_6:string dependent_7:string dependent_8:string benefit_desc_1:string benefit_1:string benefit_desc_2:string benefit_2:string benefit_desc_3:string benefit_3:string benefit_desc_4:string benefit_4:string benefit_desc_5:string benefit_5:string benefit_desc_6:string benefit_6:string benefit_desc_7:string benefit_7:string benefit_desc_8:string benefit_8:string benefit_desc_9:string benefit_9:string benefit_desc_10:string benefit_10:string benefit_desc_11:string benefit_11:string benefit_desc_12:string benefit_12:string benefit_desc_13:string benefit_13:string benefit_desc_14:string benefit_14:string
@@ -99,7 +100,7 @@ IdCardBenefitsTemplate.where(id: IdCardBenefitsTemplate.group(:user_id).select('
-BenefitsWordDocProcessor.new('').call
+WordDocProcessor.new('').call
e_names = EmployerSetupProcess.where.not(employer_name: [nil, ""]).pluck(:employer_name).uniq
@@ -120,13 +121,774 @@ trimmed_e_names.each do |e_name|
end
end
-original_string = "How to chop an onion? This is a test string."
-substrings_to_remove = ["to", "an", "a", "the"]
-# Create a regular expression from the array of substrings,
-# using the | (OR) operator to match any of them.
-# The `\b` word boundary ensures that "an" in "another" isn't removed.
-regex = Regexp.union(substrings_to_remove.map { |s| /\b#{Regexp.escape(s)}\b/ })
+case_insensitive_regex = Regexp.new(Regexp.union(substrings_to_remove).source, "i")
-# Use gsub with the regular expression to replace all occurrences with an empty string.
-cleaned_string = original_string.gsub(regex, '')
\ No newline at end of file
+Plan.all.each do |p|
+ puts p.employer_setup_process.employer_name
+ puts p.id
+ puts p.plan_benefits.map { |b| b.benefit }
+end
+
+WordDocProcessor.new('tmp/correction_2_AQUALIS HEALTH PLAN ID CARD SET UP EFF 1_1_2026 (002).docx').call
+
+
+ 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
+
+SampleIdCard.all.each do |sc|
+ sc.assign_blank_strings_to_unassigned_params
+ sc.save
+end
+
+doc = Nokogiri::XML('tmp/FairosRxSampleIDCard-Half-Print.jrxml')
+
+file_path = 'tmp/FairosRxSampleIDCard-Half-Print.jrxml'
+
+doc = File.open(file_path) do |f|
+ Nokogiri::XML(f)
+end
+
+elements_with_x = doc.xpath("//*[@x]")
+
+VhcsRecord.connection.execute("DELETE FROM HLIDCardProvider WHERE ProviderCode = '3'")
+Y = Vhcs::HlidCardProvider.where(provider_code: 'C').first.dup
+Y.provider_code = "3"
+Y.save
+# Y.provider_line_1 = "American Healthcare Alliance"
+# Y.provider_line_2 = "PO Box 26127"
+# Y.provider_line_3 = "Overland Park, KS 66225"
+# Y.provider_line_6 = "www.ahappo.com"
+# Y.provider_line_7 = ""
+# Y.provider_line_8 = ""
+# Y.claim_to_1 = "American Healthcare Alliance"
+# Y.claim_to_4 = "EDI# 01066"
+# Y.claim_to_6 = "1.800.870.6252"
+# Y.claim_to_7 = ""
+# Y.claim_to_8 = ""
+# Y.save
+
+front_url = 'http://10.41.1.115:8080/trunk/PdfServlet?reportConn=BrittonConnect&id=&reportName=FairosRxIDCard-Front-Print&family_id=CLASSIC%20.5K&employer_logo=Level360Logo.png&network_logo=AcentriaLogo.png&reportDir=secure/Documents&SUBREPORT_DIR=/&ImageDir=secure/Documents&netToken=3a4a8b03f4dfb0e6e3fc82dd369f70ef&FileType=PDF'
+back_url = 'http://10.41.1.115:8080/trunk/PdfServlet?reportConn=BrittonConnect&id=&reportName=FairosRxIDCard-Back-Print&family_id=Rebekah%201K&employer_logo=Level360Logo.png&network_logo=AcentriaLogo.png&reportDir=secure/Documents&SUBREPORT_DIR=/&ImageDir=secure/Documents&netToken=3a4a8b03f4dfb0e6e3fc82dd369f70ef&FileType=PDF'
+ 'http://10.41.1.115:8080/trunk/PdfServlet?reportConn=BrittonConnect&id=&reportName=FairosRxIDCard-Front-Print&family_id=CLASSIC%203.5K&employer_logo=Level360Logo.png&network_logo=CignaLogo.png&reportDir=secure/Documents&SUBREPORT_DIR=/&ImageDir=secure/Documents&netToken=3a4a8b03f4dfb0e6e3fc82dd369f70ef&FileType=PDF'
+
+front_url = 'http://10.41.1.115:8080/trunk/PdfServlet?reportConn=BrittonConnect&id=&reportName=FairosRxIDCard-Front-Print&family_id=CLASSIC%2035K&employer_logo=DermatologyAssociatesOfCoastalCarolina.png&network_logo=MedCostLogo.png&reportDir=secure/Documents&SUBREPORT_DIR=/&ImageDir=secure/Documents&netToken=3a4a8b03f4dfb0e6e3fc82dd369f70ef&FileType=PDF'
+back_url = 'http://10.41.1.115:8080/trunk/PdfServlet?reportConn=BrittonConnect&id=&reportName=FairosRxIDCard-Back-Print&family_id=CLASSIC%2035K&employer_logo=DermatologyAssociatesOfCoastalCarolina.png&network_logo=MedCostLogo.png&reportDir=secure/Documents&SUBREPORT_DIR=/&ImageDir=secure/Documents&netToken=3a4a8b03f4dfb0e6e3fc82dd369f70ef&FileType=PDF'
+
+group_sample_cards_pdf = CombinePDF.new
+card_front = SampleCard::JasperPdfGenerator.new(front_url).call
+card_back = SampleCard::JasperPdfGenerator.new(back_url).call
+
+group_sample_cards_pdf << card_front
+group_sample_cards_pdf << card_back
+
+todays_date = DateTime.current.strftime('%Y%m%d%H%M%S')
+group_sample_cards_pdf.save("tmp/print_cards_testing_#{todays_date}.pdf")
+
+be = BrittonWeb::Employers.last
+e = EmployerSetupProcess.find(10)
+
+
+
+Vhcs::HlidCardProvider.where("field LIKE :prefix", prefix: "#{provider_line}%")
+substring_regex = /provider_line|claim_to/
+name_attributes = b.attributes.select { |attr, val| attr =~ substring_regex }.sort_by { |key, value| key.to_s.last }
+
+def cp (start, ammount = 1)
+ substring_regex = /provider_line|claim_to/
+ b.attributes.select { |attr, val| attr =~ substring_regex }.sort_by { |key, value| key.to_s.split("_").last.to_i }
+end
+
+attributes_hash = JSON.parse(json)
+zero = Vhcs::HlidCardProvider.new(attributes_hash)
+
+CardLogoFile.all.each do |logo|
+ stringio_object = StringIO.new(logo.image_data)
+ image_type = FastImage.type(stringio_object)
+ puts "#{logo.filename} - #{image_type}"
+end
+
+rails g migration AddIdCardFieldsToEmployer id_card_display_name:string
+rails g migration AddIdCardFieldsToMember id_card_display_name:string
+
+Tables for ID Cards:
+Values:
+PBEntity div, pbe
+Employer: CompanyPBEntityKey -> EmployerName
+Member: PBEntityKey -> LastName, FirsdtName, MiddleName
+
+PBEntityClaimsData pbc
+Member: MBMemberKey, PBEntityKey
+
+PBOrgUnit ou
+Employer: CompanyNumber -> MbrType - maybe not needed
+
+PBMember pbm
+Member: FamilyId
+
+GEN_LookupTables lct (PBCoveredEntities join table with PBEntityKey and PBProductParticipationKey)
+Member: shortdesc -> MedicalCoverage
+
+PBProductParticipation pp, pp1, Part
+Member: InEffect, OutOfEffect -> Determine elig and provide EffectiveDate, no cache here
+
+PBEntityAddress pbea, oua
+State - Maybe uneeded
+
+VWMBMember M
+Employer: PLPlanKey
+Member: PLPlanKey, PBEntityKey
+
+HLPlanCode PC
+Employer: GroupNumber, MedicalNumber, DentalNumber
+
+PBProduct p, Prod
+PBProductKey
+
+Joins:
+PBCoveredEntities ce, ce1
+PBProductAvailability pa, Aval
+PBAffiliation aff
+
+select statement cepp
+
+
+
+
+CardLogoFile.all.each do |clf|
+ image_io = StringIO.new(clf.image_data)
+ width, height = FastImage.size(image_io)
+ aspect_ratio = width.to_f / height
+ clf.aspect_ratio = aspect_ratio.round(2)
+ clf.save
+end
+
+
+http://localhost:8080/trunk/PdfServlet?
+reportConn=BrittonConnect&
+reportType=Idcards&
+reportName=PrintCard&
+reportTemplate=FairosRxIDCard&
+family_id=015606258&
+employer_logo=BryanPestControlLogo.jpg&
+network_logo=CignaLogo.png&
+FileType=PDF
+
+
+private String employer_name;
+private String full_name;
+private String medical_eff_date;
+private String provider_code;
+private String provider_line_1;
+private String provider_line_2;
+private String provider_line_3;
+private String provider_line_4;
+private String provider_line_5;
+private String provider_line_6;
+private String provider_line_7;
+private String provider_line_8;
+private String provider_line_9;
+private String provider_line_10;
+private String provider_line_11;
+private String claim_to_1;
+private String claim_to_2;
+private String claim_to_3;
+private String claim_to_4;
+private String claim_to_5;
+private String claim_to_6;
+private String claim_to_7;
+private String claim_to_8;
+private String claim_to_9;
+private String claim_to_10;
+private String claim_to_11;
+private String family_id;
+private String group_number;
+private String rx_group;
+private String customer_service;
+private String web_url;
+private String dependent_1;
+private String dependent_2;
+private String dependent_3;
+private String dependent_4;
+private String dependent_5;
+private String dependent_6;
+private String benefit_desc_1;
+private String benefit_1;
+private String benefit_desc_2;
+private String benefit_2;
+private String benefit_desc_3;
+private String benefit_3;
+private String benefit_desc_4;
+private String benefit_4;
+private String benefit_desc_5;
+private String benefit_5;
+private String benefit_desc_6;
+private String benefit_6;
+private String benefit_desc_7;
+private String benefit_7;
+private String benefit_desc_8;
+private String benefit_8;
+private String benefit_desc_9;
+private String benefit_9;
+private String benefit_desc_10;
+private String benefit_10;
+private String benefit_desc_11;
+private String benefit_11;
+private String benefit_desc_12;
+private String benefit_12;
+private String benefit_desc_13;
+private String benefit_13;
+private String benefit_desc_14;
+private String benefit_14;
+private String primary_mb_member_key;
+private String dependent_7;
+private String dependent_8;
+
+
+
+
+plan = Vhcs::HlEgglestonCardBenefit.where(plan_id: 1180).each do |bene|
+ if bene.sequence == 6
+ bene.benefit = "$3,000"
+ elsif bene.sequence == 7
+ bene.benefit = "$6,000"
+ elsif bene.sequence == 9
+ bene.benefit = "$4,500"
+ elsif bene.sequence == 10
+ bene.benefit = "$9,000"
+ elsif bene.sequence == 13
+ bene.benefit = "$1,000 copay"
+ end
+ bene.save
+end
+
+mems.each do |member|
+ HLQueueIDCardByKey
+ CallStoredProc.new('HLQueueAllIDCardsByPlan', { PlPlanKey: "2" }).call
+end
+
+VhcsRecord.connection.execute("DELETE FROM HLIDCardProvider WHERE ProviderCode = 'Y'")
+Y = Vhcs::HlidCardProvider.where(provider_code: '5').first.dup
+Y.provider_code = "Y"
+Y.save
+
+CallStoredProc.new('HLGetQueuedIdCardsTPATan', { PLPlanKeys: "65", ExecuteOrDisplay: 1 }).call
+CallStoredProc.new('HLGetQueuedIdCardsTPANewCount', { PLPlanKeys: "63,65,66,67" }).call
+
+Vhcs::HlidCardEggData.where(division: "AQUALIS", ben_6: "$5,000").destroy_all
+
+
+
+def get_dependent_fields(family_id)
+ dependent_attributes = {}
+ dependents = Vhcs::HlEggIdCardDependent.where(family_id: family_id)
+ dependents.each do |dep|
+ puts "----------- DEP ------------"
+ dependent_attributes["dependent_#{dep.sequence_number}".to_sym] = dep.dependent_name
+ end
+ dependent_attributes
+end
+
+e.members.each do |mem|
+ dependents = Vhcs::HlEggIdCardDependent.where(family_id: mem.family_id)
+ if dependents.present?
+ puts mem.family_id
+ end
+end
+
+reprint.each do |gn|
+ m = Member.find_by(family_id: gn)
+ puts m.id_card_display_name
+ puts reprint.include?(m.family_id)
+end
+
+reprint.each do |gn|
+ m = Member.find_by(family_id: gn).destroy
+end
+
+
+sql_query = "SELECT PLPlanKey, ShortDesc FROM PLPlanHeader WHERE ActiveInactive = 'Active'"
+plan_headers = VhcsRecord.connection.select_all(sql_query)
+
+
+needed = %w(M T A I 2 5 8 7 1 6 3 P C V Y Z)
+unneeded = []
+IdCard::ProviderSection.all.each do |ps|
+ unless needed.include?(ps.provider_code)
+ unneeded.push(ps.provider_code)
+ end
+
+end
+
+
+
+
+
+
+
+
+
+plan = Vhcs::HlEgglestonCardBenefit.where(plan_id: 1183)
+
+a = plan[7]
+a.benefit = "100%/0%"
+a.save
+
+a = plan[5]
+a.benefit = "$10,000"
+a.save
+
+b = plan[6]
+b.benefit = "$20,000"
+b.save
+
+c = plan[8]
+c.benefit = "$5,000"
+c.save
+
+d= plan[9]
+d.benefit = "$10,000"
+d.save
+
+e= plan[10]
+e.benefit = "$10,000"
+e.save
+
+f= plan[11]
+f.benefit = "$20,000"
+f.save
+
+b = plan[7]
+b.benefit = "100%/0%"
+b.save
+
+missing_benefits = []
+IdCard::PlanBenefit.where(benefit: nil, sequence: 1).each do |bene|
+ missing_benefits.push(bene.plan.pl_plan_key)
+end
+missing_benefits.uniq
+
+Vhcs::HlEgglestonCardBenefit.where(pl_plan_key: 49)
+
+
+
+
+"http://10.41.1.115:8080/trunk/IdCardsServlet?reportConn=BrittonConnect&cardTemplate=FairosRxIDCard&printType=SampleCard&family_id=CLASSIC%202K&employer_logo=BoysAndGirlsClubOfEmeraldCoastLogo.jpg&network_logo=CignaLogo.png&FileType=PDF"
+
+
+$F{PLPlanKey}==4?"C:\\images\\PRFaulkLogo.jpg":
+$F{PLPlanKey}==5?"C:\\images\\graceChurch.jpg":
+$F{PLPlanKey}==13?"C:\\images\\ovationlogo12.jpg":
+$F{PLPlanKey}==19?"C:\\images\\BeamLogo.png":
+$F{PLPlanKey}==20?"C:\\images\\anewgo.png":
+$F{PLPlanKey}==39?"C:\\images\\HeritagePicture2.jpg":
+$F{PLPlanKey}==48?"C:\\images\\HandT.png":
+$F{PLPlanKey}==49?"C:\\images\\Panhandle.jpg":
+$F{PLPlanKey}==50?"C:\\images\\DeepSouth.png":
+$F{PLPlanKey}==51?"C:\\images\\PalmettoLogo.png":
+$F{PLPlanKey}==52?"C:\\images\\90WorksLogo.png":
+$F{PLPlanKey}==53?"C:\\images\\DublinLogo.png":
+$F{PLPlanKey}==54?"C:\\images\\SouthlandLogo.jpg":
+$F{PLPlanKey}==58?"C:\\images\\Floralawn_Logo.png":
+$F{PLPlanKey}==60?"C:\\images\\DreamCenterLogo.jpg":
+$F{PLPlanKey}==65?"C:\\images\\AqualisLogo.png":
+$F{PLPlanKey}==67?"C:\\images\\MedicalDataSystemsLogo.png":
+
+$F{PLPlanKey}==4?"C:\\images\\PRFaulkLogo.jpg":
+$F{PLPlanKey}==5?"C:\\images\\graceChurch.jpg":
+$F{PLPlanKey}==13?"C:\\images\\ovationlogo12.jpg":
+$F{PLPlanKey}==19?"C:\\images\\BeamLogo.png":
+$F{PLPlanKey}==20?"C:\\images\\anewgo.png":
+$F{PLPlanKey}==39?"C:\\images\\HeritagePicture2.jpg":
+$F{PLPlanKey}==48?"C:\\images\\HandT.png":
+$F{PLPlanKey}==49?"C:\\images\\Panhandle.jpg":
+$F{PLPlanKey}==50?"C:\\images\\DeepSouth.png":
+$F{PLPlanKey}==51?"C:\\images\\PalmettoLogo.png":
+$F{PLPlanKey}==52?"C:\\images\\90WorksLogo.png":
+$F{PLPlanKey}==53?"C:\\images\\DublinLogo.png":
+$F{PLPlanKey}==54?"C:\\images\\SouthlandLogo.jpg":
+$F{PLPlanKey}==60?"C:\\images\\DreamCenterLogo.jpg":
+$F{PLPlanKey}==61?"C:\\images\\BryanPestControlLogo.jpg":
+
+$F{PLPlanKey}==4?"C:\\images\\PRFaulkLogo.jpg":
+$F{PLPlanKey}==5?"C:\\images\\graceChurch.jpg":
+$F{PLPlanKey}==16?"C:\\images\\DeaconJonesLogo.png":
+$F{PLPlanKey}==19?"C:\\images\\BeamLogo.png":
+$F{PLPlanKey}==23?"C:\\images\\joyce-logo.jpg":
+$F{PLPlanKey}==33?"C:\\images\\swain.jpg":
+$F{PLPlanKey}==39?"C:\\images\\HeritagePicture2.jpg":
+$F{PLPlanKey}==48?"C:\\images\\HandT.png":
+$F{PLPlanKey}==49?"C:\\images\\Panhandle.jpg":
+$F{PLPlanKey}==50?"C:\\images\\DeepSouth.png":
+$F{PLPlanKey}==55?"C:\\images\\AlliedEco-GripLogo.png":
+$F{PLPlanKey}==57?"C:\\images\\CommCharter.png":
+$F{PLPlanKey}==59?"C:\\images\\UCCSchoolLogo.jpg":
+$F{PLPlanKey}==63?"C:\\images\\JECLogo.jpg":
+$F{PLPlanKey}==66?"C:\\images\\DACCLogo.jpg":
+
+
+pharmavail_groups = []
+employer_ppks = Employer.all.pluck(:pl_plan_key)
+[1, 7, 8, 14, 11, 9, 12, 10, 113, 15, 17, 18, 34].each do |pl_plan_key|
+ if employer_ppks.include?(pl_plan_key.to_s)
+ pharmavail_groups.push(pl_plan_key)
+ end
+end
+
+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
+Vhcs::PbEntity.joins('
+ INNER JOIN "PBAffiliation" ON "PBAffiliation"."ParentPBEntityKey" = "PBEntity"."PBEntityKey"
+ INNER JOIN "PBProductParticipation" ON "PBProductParticipation"."PBAffiliationKey" = "PBAffiliation"."PBAffiliationKey"
+ INNER JOIN "PBCoveredEntities" ON "PBProductParticipation"."PBProductParticipationKey" = "PBCoveredEntities"."PBProductParticipationKey"
+').where('"PBCoveredEntities"."PBEntityKey" = ?', me.pb_entity_key).uniq
+
+Inner Join PBCoveredEntities Ent On Ent.PBEntityKey = M.PBEntityKey
+INNER JOIN PBProductParticipation pp on pp.PBProductParticipationKey=Ent.PBProductParticipationKey
+# 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
+
+ # INNER JOIN "PBProduct" ON "PBProduct"."ParentPBEntityKey" = "PBEntity"."PBEntityKey"
+ # INNER JOIN "PBProductAvailability" ON "PBProductAvailability"."PBProductKey" = "PBProduct"."PBProductKey"
+
+
+
+header = file_buffer.read(4)
+ file_buffer.rewind
+
+
+
+emk = Employer.find_by(pl_plan_key: "2").employer_member_keys
+IdCardPrinterService::CardsGenerator.new( emk, "PrintCard").call
+
+IdCard::NetworkLogo.pluck(:filename, "DATALENGTH(image_data) AS length")
+IdCard::NetworkLogo.order(Arel.sql("DATALENGTH(image_data) DESC"))
+ .pluck(:filename, Arel.sql("DATALENGTH(image_data)"))
+IdCard::EmployerLogo.pluck(:filename, "DATALENGTH(image_data) AS length")
+IdCard::EmployerLogo.order(Arel.sql("DATALENGTH(image_data) DESC"))
+ .pluck(:filename, Arel.sql("DATALENGTH(image_data)"))
+
+
+IdCard::EmployerLogo.all.each do |logo|
+ image = Vips::Image.new_from_buffer(logo.image_data, "")
+
+ # 3. Resize based on height (width: nil keeps aspect ratio)
+ # Using Vips directly for efficient buffer processing
+ # resized_image = image.thumbnail_image(nil, height: 100)
+
+ processed_file = ImageProcessing::Vips
+ .source(image)
+ .resize_to_limit(nil, 50) # nil width = auto based on height 300
+ .call
+
+ new_byte_data = processed_file.read
+ logo.image_data = new_byte_data
+ logo.save
+end
+
+save_path = Rails.root.join('tmp', 'combined_result.pdf')
+pdf.save save_path
+
+
+ # 1. Identify the 3 newest records based on your criteria
+records_to_keep = IdCard::PrintData.where(jasper_batch_id: '67-1774381321').order(created_at: :desc).limit(3)
+
+# 2. Destroy all matching records NOT in that set
+IdCard::PrintData.where(jasper_batch_id: '67-1774381321').where.not(id: records_to_keep).destroy_all
+
+
+batches_by_card_template = IdCard::Setup.all.group_by(&:card_template).transform_values { |setups| setups.map(&:pl_plan_key) }.values
+
+@employer = Employer.find_by(pl_plan_key: '68')
+IdCardPrinterService::CardsGenerator.new(@employer.employer_member_keys, "FullPageCard", true).call
+
+pdf_raw_data = pdf_array.first
+io = StringIO.new(pdf_array.first)
+reader = PDF::Reader.new(io)
+page = reader.pages.first
+match_data = page.text.match(/MEMBER_LNF:([^:]*):/)
+match_data = page.text.match(/Member #:/)
+
+
+343909
+pb_product = 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" = ?', 343909)
+
+
+
+INNER JOIN GEN_LookupTables lct ON lct.RecordID = pp.CoverageTypeCode
+
+pb_products = 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" = ? AND "PBProductParticipation"."InEffect" <= ? AND "PBProductParticipation"."OutOfEffect" > ?', 343909, 1.month.from_now , 1.day.ago)
+
+Vhcs::GenLookupTables.joins('
+ INNER JOIN "PBProductParticipation" ON "PBProductParticipation"."CoverageTypeCode" = "GEN_LookupTables"."RecordID"
+ INNER JOIN "PBCoveredEntities" ON "PBProductParticipation"."PBProductParticipationKey" = "PBCoveredEntities"."PBProductParticipationKey"
+').where(
+ '"PBCoveredEntities"."PBEntityKey" = ? AND "PBProductParticipation"."InEffect" <= ? AND "PBProductParticipation"."OutOfEffect" > ?', 343909, 1.month.from_now , 1.day.ago
+).uniq.first.short_desc
+
+dental_products = [1024, 1025, 1019, 1020]
+ P.PBProductKey = 1024 OR P.PBProductKey =1025 OR P.PBProductKey =1019 OR P.PBProductKey =1020
+
+
+ PBProductKey: 1019,
+ PBProductLineKey: 60,
+ TargetEntityTypeID: 1010,
+ CompanyPBEntityKey: 259883,
+ FullDescription: "Dental",
+ ColumnDescription: "Dental",
+ ShortDescription: "Dental",
+ PresentationFormatCode: 1213,
+ IsActive: 255,
+ UsedForHRAFSA: 0,
+ NonNetworkRxCoverage: 0,
+ WebExpressProductGroup_G10: 0,
+ WebExpressDescription: "",
+ WebExpressOEProcessingOrder: 0,
+ ParticipantEnrolleeTypeBitmask: 0,
+ InvoiceGroup_G127: 0,
+ WebExpressMustParticipate: 0,
+ SuppressOptionalAmount: false,
+ SuppressCoverage: false,
+ SuppressDescription: false,
+ PBProductEnrollmentGroupingKey: 0>,
+
+
+
+
+
+ pb_products = 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" = ? AND "PBProductParticipation"."InEffect" <= ?', me.pb_entity_key, 1.month.from_now)
+
+
+
+
+MedcostVirginiaPlusLogo
+new_logo = ImageProcessorService.new("logo_files/network/MedcostVirginiaPlusLogo.jpg", "Network").call
+ if default_network_logos.include?(logo_upload)
+ new_logo.default = true
+ end
+ new_logo.active = true
+ new_logo.save
+
+
+va_members = []
+e = Employer.find_by(pl_plan_key: '16')
+e.members.each do |mem|
+ fev = mem.id_card_field_exception_values
+ if fev[:state] == "VA"
+ va_members.push(mem.pb_entity_key)
+ end
+end
+
+abc = {
+ pl_plan_key: '16',
+ member_keys: va_members
+ }
+
+ProcessIdCardDataJob.new.perform(372990, [1], true, false)
+
+66 379430
+
+ReportsService::CardComparisons.new('66').call
+
+Vhcs::HlidCardEggData.destroy_all
+hlid_ids_compared = []
+Employer.all.pluck(:pl_plan_key).each do |pl_plan_key|
+ group_hlid_ids = ReportsService::CardComparisons.new(pl_plan_key).call
+ hlid_ids_compared.concat(group_hlid_ids)
+ Vhcs::HlidCardEggData.where.not(id: hlid_ids_compared).destroy_all
+ # CallStoredProc.new('HLQueueAllIDCardsByPlan', { PLPlanKey: pl_plan_key }).call
+end
+
+:employer_name, :full_name, :group_number, :medical_eff_date, :dental_coverage, :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,:family_id, :rx_group, :customer_service, :web_url, :benefit_desc_1,
+:benefit_1, :benefit_desc_2, :benefit_2, :benefit_desc_3, :benefit_3, :benefit_desc_4, :benefit_4, :benefit_desc_5, :benefit_5,
+:benefit_desc_6, :benefit_6, :benefit_desc_7, :benefit_7, :benefit_desc_8, :benefit_8, :benefit_desc_9, :benefit_9, :benefit_desc_10,
+:benefit_10, :benefit_desc_11, :benefit_11, :benefit_desc_12, :benefit_12, :benefit_desc_13, :benefit_13, :benefit_desc_14, :benefit_14,
+:dependent_1, :dependent_2, :dependent_3, :dependent_4, :dependent_5, :dependent_6, :dependent_7, :dependent_8, :pl_plan_key, :primary_mb_member_key
+
+
+not queued - 39, 48, 49
+
+CallStoredProc.new('HLQueueAllIDCardsByPlan', { PLPlanKey: "49" }).call
+CallStoredProc.new('HLGetQueuedIdCardsTPANew', { PLPlanKeys: "39" }).call
+
+CallStoredProc.new('HLGetQueuedIdCardMemberKeysTPA', { PLPlanKeys: "49" }).call
+
+ReportsService::DuplicateOldCards.new(['39','48','49']).call
+
+366312
+
+Report::MemberCardComparison.destroy_all
+Report::EmployerCardComparison.destroy_all
+pl = Employer.all.pluck(:pl_plan_key) - ['39','48','49']
+ReportsService::EmployerCardComparisons.new(pl).call
+
+ReportsService::EmployerCardComparisons.new(['59', '69']).call
+
+Report::ComparisonError.where(card_field: 'Missing Member').map { |error| error.member_card_comparison.pl_plan_key }.uniq
+
+Report::ComparisonError.where(card_field: 'dental_coverage').map { |error| error.member_card_comparison.member_number }.uniq
+
+queue_members = IdCardQueueService::GetQueuedMembers.new('16').call
+queue_member_keys = queue_members.first[:member_keys]
+member_names = Member.where(pl_plan_key: '16', pb_entity_key: queue_member_keys).pluck(:id_card_display_name)
+
+ProcessIdCardDataJob.new.perform(366312, {}, true, true)
+
+
+"JAMELL BELL", "A. D JONES", "KAREN L MALDONADO ARELLANO", "GERALD B RICHERT", "MICHAEL W FERRELL", "EMILY D COOKE", "CHASE C BROCK", "PHILLIP G PURNELL", "THOMAS Z EVANS", "CHRISTINA B ARMSTRONG", "AUSTIN G HENRY", "AUTUMN R DANN", "KARRIE KERKELA", "DERRICK L LOFTIN", "KYLE P LOWE", "DANNY P HOLLAND", "CLINT BEDNAR", "KAYLEE CHARLES", "SARAHI BANEGAS", "CHRIS FOSTER", "RONI TRULL", "TRACY STONE", "MATTHEW MOORE", "CHADI EL-AAWAR", "DAVID ROSE", "ROGELIO JIMENEZ, JR", "JOSHUA BROWN", "JOSH WILLIAMS", "STEVEN SANDERSON", "BRANDON P BERG", "JOSHUA ROHMILER", "KENNEDY JACOBS", "NELDO A SUAREZ", "DAVID WILKERSON", "RAUL SANTIBANEZ", "JASON WILSON", "BRAYAN VEGA TORRES", "KEKOA GALAZIA", "TYLER CRUMPLER"
+
+Employer.all.each do |em|
+ id_card_setup = em.id_card_setup
+ card_print_name = Vhcs::PbEntity.where(company_pb_entity_key: em.company_pb_entity_key, entity_type_id: 1007)
+ .where.not("LastName LIKE ? OR LastName LIKE ? OR LastName LIKE ?", "%COBRA%", "Active", ".%")
+ .last.last_name[0, 41]
+ id_card_setup.print_name = card_print_name
+ id_card_setup.save
+end
+
+groups_to_fix = []
+one_name_group_comps = []
+Employer.where.not(pl_plan_key: ['39','48','49']).each do |em|
+ id_card_setup = em.id_card_setup
+ card_print_names = Vhcs::PbEntity.where(company_pb_entity_key: em.company_pb_entity_key, entity_type_id: 1007)
+ .where.not("LastName LIKE ? OR LastName LIKE ? OR LastName LIKE ?", "%COBRA%", "Active", ".%").pluck(:last_name)
+ if card_print_names.count > 2
+ # groups_to_fix << [em.pl_plan_key, card_print_names.count]
+ one_name_group_comps << [em.pl_plan_key, id_card_setup.print_name.squish]
+ else
+ if card_print_names.last.squish == id_card_setup.print_name.squish
+ one_name_group_comps << [em.pl_plan_key, card_print_names.last]
+ else
+ groups_to_fix << [em.pl_plan_key, card_print_names.last.squish, id_card_setup.print_name.squish]
+ end
+ end
+end
+groups_to_fix
+
+select * from PBEntity
+where CompanyPBEntityKey = 328241
+and EntityTypeID = 1007
+
+"Ruby on Rails"[8, 5]
+card_print_name = Vhcs::PbEntity.where(company_pb_entity_key: 328241, entity_type_id: 1007)
+.where.not("LastName LIKE ? OR LastName LIKE ?", "%COBRA%", "Active")
+.last.last_name[0, 41]
+Vhcs::PbEntity.where("LastName LIKE ?", "DEACON JONES AUTO%")
+
+
+0261611
+Report::OldCardDuplicate.where(pl_plan_key: '58').update_all(group_number: '0261611')
+
+member_number = 364149
+member = Member.find_by(pb_entity_key: member_number)
+ProcessIdCardDataJob.new.perform(member_number, {}, false, true)
+
+
+missing_members = [382559, 382592, 382570, 382544, 382545]
+extra_members = [337710, 343585, 364149]
+ex_mem_info = []
+extra_members.each do |member_number|
+ member = Member.find_by(pb_entity_key: member_number)
+ employer =
+ ex_mem_info << [member.name, member.employer.name]
+end
+
+pl.each do |plan_key|
+ AutomationService::EmployerMembersUpdate.new(plan_key).call
+end
+
+me = Member.find_by(pb_entity_key: 364149)
+vwm = me
+
+Vhcs::VwmbMember.find_by(pb_entity_key: 364149).pluck(:social_security_number)
+
+no_card_emps = []
+Employer.where(pl_plan_key: ['39','48','49']).each do |emp|
+ no_card_emps << emp.name
+end
+no_card_emps.split(', ')
+
+AutomationService::EmployerMembersUpdate.new(['39','48','49']).call
+
+
+@file_path = Rails.root.join('seed_docs', 'Standard Level360 Plans.pdf')
+def parse_table
+ pages = []
+
+ reader = PDF::Reader.new(@file_path)
+
+ reader.pages.each do |page|
+ rows = []
+ # Extract text from the page
+ text = page.text
+
+ # Split into lines
+ lines = text.split("\n")
+
+ # Detect table-like lines (example: CSV-like or space-separated)
+ lines.each do |line|
+ # Example: split by multiple spaces or tabs
+ cells = line.strip.split(/\s{2,}|\t/)
+ rows << cells if cells.size > 1 # Only keep lines with multiple columns
+ end
+ pages << rows
+ end
+
+ plan_count = rows.first.count - 1
+
+ pages.each do |page_rows|
+ title_row = page_rows.first
+ title_row.each_with_index do |plan, index|
+ next if index == 0
+ plan_items = page_rows.map { |row| row[index] }
+ plan_items.shift
+
+ plan = IdCard::Plan.create!(title: plan, template: true)
+ doc_to_sequence_map = {
+ 0 => 4,
+ 1 => 5,
+ 2 => 6,
+ 3 => 7,
+ 4 => 9,
+ 5 => 10,
+ 6 => 11,
+ 7 => 12,
+ 8 => 3,
+ 11 => 1,
+ 12 => 2,
+ 13 => 3,
+ 14 => 13
+ }
+ plan_items.each_with_index do |item, i|
+ sequence = doc_to_sequence_map[i]
+ if sequence.present?
+ benefit = plan.plan_benefits.find_by(sequence: sequence)
+ benefit.update(benefit: item)
+ elsif i == 9
+ carrier_coins = item.sub(/\/.*/, '')
+ member_coins = plan_items[(i+1)].sub(/\/.*/, '')
+
+ end
+
+ end
+
+
+ 9 => 8,
+ 10 => 8,
+ end
+
+
+ end
\ No newline at end of file
diff --git a/seed_docs/Standard Level360 Plans.pdf b/seed_docs/Standard Level360 Plans.pdf
new file mode 100644
index 0000000..59db744
Binary files /dev/null and b/seed_docs/Standard Level360 Plans.pdf differ
diff --git a/seed_docs/json_files/card_exceptions.json b/seed_docs/json_files/card_exceptions.json
new file mode 100644
index 0000000..cb98a93
--- /dev/null
+++ b/seed_docs/json_files/card_exceptions.json
@@ -0,0 +1,95 @@
+{
+ "3" : [{
+ "exception_type": "state",
+ "exception_values": ["AZ", "MO", "IL"],
+ "field_exception_items_attributes": [
+ {"field_name": "provider_section", "provider_section_id": 3},
+ {"field_name": "network_logo", "network_logo_id": 8}
+ ]
+ }],
+ "13" : [{
+ "exception_type": "zipcode",
+ "exception_values": ["14422", "14623", "14624"],
+ "field_exception_items_attributes": [
+ {"field_name": "network_logo", "network_logo_id": 3}
+ ]
+ }],
+ "16" : [{
+ "exception_type": "state",
+ "exception_values": ["VA"],
+ "field_exception_items_attributes": [
+ {"field_name": "medical_eff_date", "field_value": "12/01/2025"},
+ {"field_name": "provider_section", "provider_section_id": 7},
+ {"field_name": "network_logo", "network_logo_id": 6}
+ ]
+ }],
+ "21" : [{
+ "exception_type": "state",
+ "exception_values": ["VA"],
+ "field_exception_items_attributes": [
+ {"field_name": "network_logo", "network_logo_id": 3}
+ ]
+ }],
+ "51" : [{
+ "exception_type": "zipcode",
+ "exception_values": ["41456", "41149", "41124"],
+ "field_exception_items_attributes": [
+ {"field_name": "network_logo", "network_logo_id": 4}
+ ]
+ }],
+ "55" : [{
+ "exception_type": "state",
+ "exception_values": ["CA", "GA"],
+ "field_exception_items_attributes": [
+ {"field_name": "provider_section", "provider_section_id": 8},
+ {"field_name": "network_logo", "network_logo_id": 5}
+ ]
+ }],
+ "62" : [
+ {
+ "exception_type": "zipcode",
+ "exception_values": ["49420", "48167"],
+ "field_exception_items_attributes": [
+ {"field_name": "network_logo", "network_logo_id": 2}
+ ]
+ },
+ {
+ "exception_type": "zipcode",
+ "exception_values": ["55419", "55379"],
+ "field_exception_items_attributes": [
+ {"field_name": "network_logo", "network_logo_id": 1}
+ ]
+ }
+ ],
+ "65" : [
+ {
+ "exception_type": "zipcode",
+ "exception_values": ["48430", "44842", "48649"],
+ "field_exception_items_attributes": [
+ {"field_name": "network_logo", "network_logo_id": 2}
+ ]
+ },
+ {
+ "exception_type": "zipcode",
+ "exception_values": ["55372", "55021"],
+ "field_exception_items_attributes": [
+ {"field_name": "network_logo", "network_logo_id": 1}
+ ]
+ },
+ {
+ "exception_type": "zipcode",
+ "exception_values": ["18042", "18080"],
+ "field_exception_items_attributes": [
+ {"field_name": "network_logo", "network_logo_id": 10}
+ ]
+ }
+ ],
+ "66" : [{
+ "exception_type": "state",
+ "exception_values": ["GA"],
+ "field_exception_items_attributes": [
+ {"field_name": "provider_section", "provider_section_id": 8},
+ {"field_name": "network_logo", "network_logo_id": 5}
+ ]
+ }]
+}
\ No newline at end of file
diff --git a/seed_docs/logo_files/employer/90WorksLogo.png b/seed_docs/logo_files/employer/90WorksLogo.png
new file mode 100644
index 0000000..edff416
Binary files /dev/null and b/seed_docs/logo_files/employer/90WorksLogo.png differ
diff --git a/seed_docs/logo_files/employer/AlliedEcoGripLogo.png b/seed_docs/logo_files/employer/AlliedEcoGripLogo.png
new file mode 100644
index 0000000..e0ab09e
Binary files /dev/null and b/seed_docs/logo_files/employer/AlliedEcoGripLogo.png differ
diff --git a/seed_docs/logo_files/employer/AnewgoLogo.png b/seed_docs/logo_files/employer/AnewgoLogo.png
new file mode 100644
index 0000000..cccb85a
Binary files /dev/null and b/seed_docs/logo_files/employer/AnewgoLogo.png differ
diff --git a/logo_files/employer/AqualisLogo.png b/seed_docs/logo_files/employer/AqualisLogo.png
similarity index 100%
rename from logo_files/employer/AqualisLogo.png
rename to seed_docs/logo_files/employer/AqualisLogo.png
diff --git a/seed_docs/logo_files/employer/BeamLogo.png b/seed_docs/logo_files/employer/BeamLogo.png
new file mode 100644
index 0000000..13a3d59
Binary files /dev/null and b/seed_docs/logo_files/employer/BeamLogo.png differ
diff --git a/seed_docs/logo_files/employer/BoysAndGirlsClub.jpg b/seed_docs/logo_files/employer/BoysAndGirlsClub.jpg
new file mode 100644
index 0000000..7f81499
Binary files /dev/null and b/seed_docs/logo_files/employer/BoysAndGirlsClub.jpg differ
diff --git a/logo_files/employer/BryanPestControlLogo.jpg b/seed_docs/logo_files/employer/BryanPestControlLogo.jpg
similarity index 100%
rename from logo_files/employer/BryanPestControlLogo.jpg
rename to seed_docs/logo_files/employer/BryanPestControlLogo.jpg
diff --git a/seed_docs/logo_files/employer/CommCharterLogo.png b/seed_docs/logo_files/employer/CommCharterLogo.png
new file mode 100644
index 0000000..8f1e301
Binary files /dev/null and b/seed_docs/logo_files/employer/CommCharterLogo.png differ
diff --git a/seed_docs/logo_files/employer/DeaconJonesLogo.png b/seed_docs/logo_files/employer/DeaconJonesLogo.png
new file mode 100644
index 0000000..0df86d7
Binary files /dev/null and b/seed_docs/logo_files/employer/DeaconJonesLogo.png differ
diff --git a/seed_docs/logo_files/employer/DeepSouthLogo.png b/seed_docs/logo_files/employer/DeepSouthLogo.png
new file mode 100644
index 0000000..0035e65
Binary files /dev/null and b/seed_docs/logo_files/employer/DeepSouthLogo.png differ
diff --git a/seed_docs/logo_files/employer/DermatologyACCLogo.jpg b/seed_docs/logo_files/employer/DermatologyACCLogo.jpg
new file mode 100644
index 0000000..0b86e3c
Binary files /dev/null and b/seed_docs/logo_files/employer/DermatologyACCLogo.jpg differ
diff --git a/seed_docs/logo_files/employer/DreamCenterLogo.jpg b/seed_docs/logo_files/employer/DreamCenterLogo.jpg
new file mode 100644
index 0000000..bdf21a8
Binary files /dev/null and b/seed_docs/logo_files/employer/DreamCenterLogo.jpg differ
diff --git a/seed_docs/logo_files/employer/DublinLogo.png b/seed_docs/logo_files/employer/DublinLogo.png
new file mode 100644
index 0000000..08d40ed
Binary files /dev/null and b/seed_docs/logo_files/employer/DublinLogo.png differ
diff --git a/seed_docs/logo_files/employer/FloralawnLogo.png b/seed_docs/logo_files/employer/FloralawnLogo.png
new file mode 100644
index 0000000..17ca2f3
Binary files /dev/null and b/seed_docs/logo_files/employer/FloralawnLogo.png differ
diff --git a/seed_docs/logo_files/employer/GraceChurchLogo.jpg b/seed_docs/logo_files/employer/GraceChurchLogo.jpg
new file mode 100644
index 0000000..909d42c
Binary files /dev/null and b/seed_docs/logo_files/employer/GraceChurchLogo.jpg differ
diff --git a/seed_docs/logo_files/employer/HandTContractorsLogo.png b/seed_docs/logo_files/employer/HandTContractorsLogo.png
new file mode 100644
index 0000000..8718cb2
Binary files /dev/null and b/seed_docs/logo_files/employer/HandTContractorsLogo.png differ
diff --git a/seed_docs/logo_files/employer/HealthBusLogo.jpg b/seed_docs/logo_files/employer/HealthBusLogo.jpg
new file mode 100644
index 0000000..eb079f5
Binary files /dev/null and b/seed_docs/logo_files/employer/HealthBusLogo.jpg differ
diff --git a/seed_docs/logo_files/employer/HeritageLogo.jpg b/seed_docs/logo_files/employer/HeritageLogo.jpg
new file mode 100644
index 0000000..2efac46
Binary files /dev/null and b/seed_docs/logo_files/employer/HeritageLogo.jpg differ
diff --git a/seed_docs/logo_files/employer/JohnsonElectricLogo.jpg b/seed_docs/logo_files/employer/JohnsonElectricLogo.jpg
new file mode 100644
index 0000000..747710f
Binary files /dev/null and b/seed_docs/logo_files/employer/JohnsonElectricLogo.jpg differ
diff --git a/seed_docs/logo_files/employer/JoyceFarmLogo.jpg b/seed_docs/logo_files/employer/JoyceFarmLogo.jpg
new file mode 100644
index 0000000..20eb56d
Binary files /dev/null and b/seed_docs/logo_files/employer/JoyceFarmLogo.jpg differ
diff --git a/seed_docs/logo_files/employer/MedicalDataSystemsLogo.png b/seed_docs/logo_files/employer/MedicalDataSystemsLogo.png
new file mode 100644
index 0000000..3310534
Binary files /dev/null and b/seed_docs/logo_files/employer/MedicalDataSystemsLogo.png differ
diff --git a/seed_docs/logo_files/employer/OvationLogo.jpg b/seed_docs/logo_files/employer/OvationLogo.jpg
new file mode 100644
index 0000000..e6a7aa4
Binary files /dev/null and b/seed_docs/logo_files/employer/OvationLogo.jpg differ
diff --git a/seed_docs/logo_files/employer/PRFaulkLogo.jpg b/seed_docs/logo_files/employer/PRFaulkLogo.jpg
new file mode 100644
index 0000000..5bdec94
Binary files /dev/null and b/seed_docs/logo_files/employer/PRFaulkLogo.jpg differ
diff --git a/seed_docs/logo_files/employer/PalmettoLogo.png b/seed_docs/logo_files/employer/PalmettoLogo.png
new file mode 100644
index 0000000..528d421
Binary files /dev/null and b/seed_docs/logo_files/employer/PalmettoLogo.png differ
diff --git a/seed_docs/logo_files/employer/PanhandleLogo.jpg b/seed_docs/logo_files/employer/PanhandleLogo.jpg
new file mode 100644
index 0000000..d3c0284
Binary files /dev/null and b/seed_docs/logo_files/employer/PanhandleLogo.jpg differ
diff --git a/seed_docs/logo_files/employer/PowerSwainLogo.jpg b/seed_docs/logo_files/employer/PowerSwainLogo.jpg
new file mode 100644
index 0000000..398b157
Binary files /dev/null and b/seed_docs/logo_files/employer/PowerSwainLogo.jpg differ
diff --git a/seed_docs/logo_files/employer/SitationLogo.png b/seed_docs/logo_files/employer/SitationLogo.png
new file mode 100644
index 0000000..500c6f3
Binary files /dev/null and b/seed_docs/logo_files/employer/SitationLogo.png differ
diff --git a/seed_docs/logo_files/employer/SmartLogo.jpg b/seed_docs/logo_files/employer/SmartLogo.jpg
new file mode 100644
index 0000000..43fbcde
Binary files /dev/null and b/seed_docs/logo_files/employer/SmartLogo.jpg differ
diff --git a/seed_docs/logo_files/employer/SouthlandLogo.jpg b/seed_docs/logo_files/employer/SouthlandLogo.jpg
new file mode 100644
index 0000000..79a353b
Binary files /dev/null and b/seed_docs/logo_files/employer/SouthlandLogo.jpg differ
diff --git a/seed_docs/logo_files/employer/StevensCenterLogo.png b/seed_docs/logo_files/employer/StevensCenterLogo.png
new file mode 100644
index 0000000..b6d8d92
Binary files /dev/null and b/seed_docs/logo_files/employer/StevensCenterLogo.png differ
diff --git a/seed_docs/logo_files/employer/UnityCharterLogo.jpg b/seed_docs/logo_files/employer/UnityCharterLogo.jpg
new file mode 100644
index 0000000..dbbb7ca
Binary files /dev/null and b/seed_docs/logo_files/employer/UnityCharterLogo.jpg differ
diff --git a/logo_files/employer/ZndusLogo.jpg b/seed_docs/logo_files/employer/ZndusLogo.jpg
similarity index 100%
rename from logo_files/employer/ZndusLogo.jpg
rename to seed_docs/logo_files/employer/ZndusLogo.jpg
diff --git a/seed_docs/logo_files/employer/tandemloclogo.png b/seed_docs/logo_files/employer/tandemloclogo.png
new file mode 100644
index 0000000..549cf4d
Binary files /dev/null and b/seed_docs/logo_files/employer/tandemloclogo.png differ
diff --git a/seed_docs/logo_files/network/AHALogo.png b/seed_docs/logo_files/network/AHALogo.png
new file mode 100644
index 0000000..8ded952
Binary files /dev/null and b/seed_docs/logo_files/network/AHALogo.png differ
diff --git a/seed_docs/logo_files/network/AHAPreferredLogo.png b/seed_docs/logo_files/network/AHAPreferredLogo.png
new file mode 100644
index 0000000..c7d20d4
Binary files /dev/null and b/seed_docs/logo_files/network/AHAPreferredLogo.png differ
diff --git a/seed_docs/logo_files/network/CignaAffLogo.jpg b/seed_docs/logo_files/network/CignaAffLogo.jpg
new file mode 100644
index 0000000..f3a632b
Binary files /dev/null and b/seed_docs/logo_files/network/CignaAffLogo.jpg differ
diff --git a/seed_docs/logo_files/network/CignaHPLogo.jpg b/seed_docs/logo_files/network/CignaHPLogo.jpg
new file mode 100644
index 0000000..e0deb1a
Binary files /dev/null and b/seed_docs/logo_files/network/CignaHPLogo.jpg differ
diff --git a/logo_files/network/CignaLogo.png b/seed_docs/logo_files/network/CignaLogo.png
similarity index 100%
rename from logo_files/network/CignaLogo.png
rename to seed_docs/logo_files/network/CignaLogo.png
diff --git a/seed_docs/logo_files/network/CignaPHCSLogo.png b/seed_docs/logo_files/network/CignaPHCSLogo.png
new file mode 100644
index 0000000..57bbea5
Binary files /dev/null and b/seed_docs/logo_files/network/CignaPHCSLogo.png differ
diff --git a/seed_docs/logo_files/network/CignaPHLogo.jpg b/seed_docs/logo_files/network/CignaPHLogo.jpg
new file mode 100644
index 0000000..eeeb0cd
Binary files /dev/null and b/seed_docs/logo_files/network/CignaPHLogo.jpg differ
diff --git a/seed_docs/logo_files/network/CignaValleyPreferredLogo.jpg b/seed_docs/logo_files/network/CignaValleyPreferredLogo.jpg
new file mode 100644
index 0000000..b1b0611
Binary files /dev/null and b/seed_docs/logo_files/network/CignaValleyPreferredLogo.jpg differ
diff --git a/logo_files/network/MedCostLogo.png b/seed_docs/logo_files/network/MedCostLogo.png
similarity index 100%
rename from logo_files/network/MedCostLogo.png
rename to seed_docs/logo_files/network/MedCostLogo.png
diff --git a/seed_docs/logo_files/network/MedcostVirginiaPlusLogo.jpg b/seed_docs/logo_files/network/MedcostVirginiaPlusLogo.jpg
new file mode 100644
index 0000000..dccf755
Binary files /dev/null and b/seed_docs/logo_files/network/MedcostVirginiaPlusLogo.jpg differ