Major features finished

This commit is contained in:
Jason Jordan
2026-04-15 08:12:47 -04:00
parent 9f306d3150
commit 247a075c9c
112 changed files with 3700 additions and 379 deletions
@@ -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
@@ -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)
@@ -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)
@@ -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
@@ -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
@@ -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
@@ -9,6 +9,7 @@ module IdCardPrinterService
def call
response = HTTParty.get(@jasper_url)
# response.body
CombinePDF.parse(response.body)
end
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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