Employer table broken up and new idcard module setup

This commit is contained in:
Jason Jordan
2026-03-06 10:56:20 -05:00
parent 8ecabf60ff
commit 6a068243f4
31 changed files with 628 additions and 571 deletions
+14 -10
View File
@@ -1,4 +1,6 @@
class EmployersController < ApplicationController class EmployersController < ApplicationController
# View Methods
def index def index
@employers = Employer.all @employers = Employer.all
end end
@@ -12,16 +14,6 @@ class EmployersController < ApplicationController
render :new render :new
end end
def import
word_doc = params[:employer][:import_from_word]
if word_doc.present? && word_doc.is_a?(ActionDispatch::Http::UploadedFile)
@employer = BenefitsWordDocProcessor.new(word_doc.tempfile).call
else
@employer = Employer.new
end
render :new
end
# def import_old # def import_old
# word_doc = params[:employer][:import_from_word] # word_doc = params[:employer][:import_from_word]
# @plan_templates = IdCardBenefitsTemplate.where.not(title: "BLANK") # @plan_templates = IdCardBenefitsTemplate.where.not(title: "BLANK")
@@ -74,6 +66,18 @@ class EmployersController < ApplicationController
# redirect_to resources_url, notice: 'Resource was successfully destroyed.' # redirect_to resources_url, notice: 'Resource was successfully destroyed.'
end end
# API Methods
def import
word_doc = params[:employer][:import_from_word]
if word_doc.present? && word_doc.is_a?(ActionDispatch::Http::UploadedFile)
@employer = BenefitsWordDocProcessor.new(word_doc.tempfile).call
else
@employer = Employer.new
end
render :new
end
private private
# def process_logos(employer_setup_process_params) # def process_logos(employer_setup_process_params)
@@ -1,56 +1,61 @@
class IdCard::EmployerLogosController < ApplicationController module IdCard
class EmployerLogosController < ApplicationController
def index # View Methods
end def index
def show
end
def image
logo_file = IdCard::EmployerLogo.find(params[:id])
puts params[:id]
logo_binary = logo_file.image_data
logo_filename = logo_file.filename
send_data logo_binary,
filename: logo_filename,
disposition: 'inline'
end
def new
end
def create
file = card_logo_file_params["logo_file"]
if file.present? && file.is_a?(ActionDispatch::Http::UploadedFile)
filename = file.original_filename
# binary_data = file.read
binary_data = File.binread(file)
meme_type = Marcel::MimeType.for(file)
employerlogo = IdCard::EmployerLogo.create(
filename: filename,
image_data: binary_data,
content_type: meme_type
)
render json: employerlogo, only: [:id], status: :ok
end end
def show
end
def new
end
def create
file = logo_params["logo_file"]
if file.present? && file.is_a?(ActionDispatch::Http::UploadedFile)
filename = file.original_filename
# binary_data = file.read
binary_data = File.binread(file)
meme_type = Marcel::MimeType.for(file)
employerlogo = IdCard::EmployerLogo.create(
filename: filename,
image_data: binary_data,
content_type: meme_type
)
render json: employerlogo, only: [:id], status: :ok
end
end
def edit
end
def update
end
def destroy
end
# API Methods
def image
logo_file = IdCard::EmployerLogo.find(params[:id])
puts params[:id]
logo_binary = logo_file.image_data
logo_filename = logo_file.filename
send_data logo_binary,
filename: logo_filename,
disposition: 'inline'
end
private
def logo_params
params.require(:id_card_employer_logo).permit(:logo_file)
end
end end
def edit
end
def update
end
def destroy
end
private
def card_logo_file_params
params.require(:card_logo_file).permit(:logo_file, :logo_type)
end
end end
+234 -228
View File
@@ -1,236 +1,242 @@
class IdCard::SetupController < ApplicationController module IdCard
class SetupController < ApplicationController
def new # View Methods
@employer = Employer.find_by(slug: params[:employer]) def new
@setup = @employer.id_card_setup.new @employer = Employer.find_by(slug: params[:employer])
render :new @setup = @employer.create_id_card_setup
end
def create
employer_params = Employer.permitted_params(params)
puts "---Params---"
puts employer_params
# post_image_processing_params = process_logos(employer_setup_process_params)
@employer = Employer.new(employer_params)
if @employer.save
# update_logos_with_employer_setup_information()
redirect_to employer_path(@employer.slug), notice: 'Employer Saved'
else
render :new render :new
end end
end
def edit def create
@employer = Employer.find_by(slug: params[:id]) xyz
render :edit employer_params = Employer.permitted_params(params)
end puts "---Params---"
puts employer_params
def update # post_image_processing_params = process_logos(employer_setup_process_params)
puts "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" @employer = Employer.new(employer_params)
employer_params = Employer.permitted_params(params) if @employer.save
@employer = Employer.find(params[:id]) # update_logos_with_employer_setup_information()
redirect_to employer_path(@employer.slug), notice: 'Employer Saved'
if @employer.update(employer_params) else
puts "sucess" render :new
redirect_to employer_path(@employer.slug), notice: 'Employer was successfully updated.' end
else
puts "fail"
render :edit, status: :unprocessable_entity
end end
def edit
@employer = Employer.find_by(slug: params[:id])
render :edit
end
def update
puts "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
employer_params = Employer.permitted_params(params)
@employer = Employer.find(params[:id])
if @employer.update(employer_params)
puts "sucess"
redirect_to employer_path(@employer.slug), notice: 'Employer was successfully updated.'
else
puts "fail"
render :edit, status: :unprocessable_entity
end
end
def destroy
# @resource = Resource.find(params[:id])
# @resource.destroy
# redirect_to resources_url, notice: 'Resource was successfully destroyed.'
end
# API Methods
private
# def process_logos(employer_setup_process_params)
# @uploaded_logos = []
# employer_logo = employer_setup_process_params["employer_logo"]
# if employer_logo.present? && employer_logo.is_a?(ActionDispatch::Http::UploadedFile)
# filename = employer_logo.original_filename
# binary_data = employer_logo.read
# meme_type = Marcel::MimeType.for(employer_logo)
# CardLogoFile.create(
# filename: filename,
# image_data: binary_data,
# content_type: meme_type,
# logo_type: "employer"
# )
# @uploaded_logos.push(filename)
# employer_setup_process_params["employer_logo"] = filename
# end
# network_logos = employer_setup_process_params["alternate_network_logos_attributes"]
# if network_logos.present?
# network_logos.each do |alt|
# network_logo = alt.last["network_logo"]
# if network_logo.present? && network_logo.is_a?(ActionDispatch::Http::UploadedFile)
# filename = network_logo.original_filename
# binary_data = network_logo.read
# meme_type = Marcel::MimeType.for(network_logo)
# CardLogoFile.create(
# filename: filename,
# image_data: binary_data,
# content_type: meme_type,
# logo_type: "network"
# )
# @uploaded_logos.push(filename)
# end
# alt.last["network_logo"] = @uploaded_logos.last
# end
# end
# employer_setup_process_params
# end
# def update_logos_with_employer_setup_information()
# @uploaded_logos.each do |logo|
# logo_file = CardLogoFile.find_by(filename: logo)
# if logo_file.present? && @employer.present?
# logo_file.employer_setup_process = @employer
# logo_file.save
# end
# end
# end
# def general_information_params
# params.require(:employer_setup_general_information_form).permit(
# :name,
# :employer_logo,
# :group_number,
# :dental,
# :pl_plan_key,
# :effect_date,
# :number_of_plans,
# :network,
# :number_of_additional_network_logos
# )
# end
# def plans_params
# params.require(:employer_setup_plans_form).permit(
# plans: permited_plans_keys,
# benefit_descs: benefit_sequence_keys
# )
# end
# def network_exceptions_params
# params.require(:employer_setup_network_exceptions_form).permit(
# network_exceptions: [:network_logo, exceptions: [:type, :value]],
# )
# end
# def form_for_step
# step_name = @top_form.current_step
# form_method = "EmployerSetup#{step_name.camelize}Form".constantize
# # puts "/////\\\\\\||||||"
# # puts session[:employer_setup_data]
# # puts session[:employer_setup_data]['employer_setup_process_id']
# puts form_method
# form_method.new(session[:employer_setup_data]['employer_setup_process_id'])
# end
# def process_step(step_name)
# @form_method = "EmployerSetup#{step_name.camelize}Form".constantize
# session_data_name = "#{step_name}_data"
# # puts "1--------------params----"
# # puts params
# # puts "8--------------session----"
# # puts session[:employer_setup_data]
# employer_setup_process_id = session[:employer_setup_data]['employer_setup_process_id']
# # puts session[:employer_setup_data]
# puts "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
# puts params
# @form = @form_method.new(employer_setup_process_id, params)
# if @form.pl_plan_key.blank?
# @form.pl_plan_key = session[:employer_setup_data]['pl_plan_key']
# end
# if @form.valid? && @form.save
# pl_plan_key = @top_form.pl_plan_key || @form.pl_plan_key
# # session[:employer_setup_data].merge!({current_step: step_name, pl_plan_key: pl_plan_key})
# # form_fields = @form.attributes.merge!(global_params(step_name))
# # session[:employer_setup_data][session_data_name] = form_fields
# # session[:employer_setup_data].merge!(global_params(step_name))
# # puts session[:employer_setup_data][session_data_name]
# true
# else
# false
# end
# end
# def step_params(step_name)
# form_name_sym = "employer_setup_#{step_name}_form".to_sym
# params.require(form_name_sym).permit(@form_method.permitted_params)
# end
# def global_params(step_name)
# form_name_sym = "employer_setup_#{step_name}_form".to_sym
# params.require(form_name_sym).permit(EmployerSetupForm.permitted_params)
# end
# def process_step(step_name)
# form_name = "employer_setup_#{step_name}_form".camelize.constantize
# form_params_name = "#{step_name}_params".to_sym
# allowed_params = [:general_information_params, :plans_params, :network_exceptions_params]
# if allowed_params.include?(form_params_name)
# form_params = send(form_params_name)
# @form = form_name.new(form_params)
# if @form.valid?
# session[:employer_setup_data]["#{step_name}_data"] = form_params
# true
# else
# false
# end
# end
# false
# end
# def employer_setup_params
# params.require(:employer_setup_form).permit(
# :current_step,
# :name,
# :employer_logo,
# :group_number,
# :pl_plan_key,
# :effect_date,
# :number_of_plans,
# :network,
# :number_of_additional_network_logos,
# network_exceptions: [:network_logo, exceptions: [:type, :value]],
# plans: permited_plans_keys,
# benefit_descs: benefit_sequence_keys
# )
# end
# def benefit_sequence_keys
# (1..14).map { |i| i.to_s.to_sym }
# end
# def permited_plans_keys
# benefit_sequence_keys.push(:plan_id)
# end
# def plans_params
# plans_keys = params[:plans]&.keys || []
# plans_keys.each_with_object({}) do |key, hash|
# if key == 'benefit_descs' || key.match?(/^plan_\d$/)
# hash[key.to_sym] = permited_plan_param_list
# end
# end
# end
# def permited_plan_param_list
# (1..14).map { |i| i.to_s.to_sym }.push(:plan_id)
# end
end end
def destroy
# @resource = Resource.find(params[:id])
# @resource.destroy
# redirect_to resources_url, notice: 'Resource was successfully destroyed.'
end
private
# def process_logos(employer_setup_process_params)
# @uploaded_logos = []
# employer_logo = employer_setup_process_params["employer_logo"]
# if employer_logo.present? && employer_logo.is_a?(ActionDispatch::Http::UploadedFile)
# filename = employer_logo.original_filename
# binary_data = employer_logo.read
# meme_type = Marcel::MimeType.for(employer_logo)
# CardLogoFile.create(
# filename: filename,
# image_data: binary_data,
# content_type: meme_type,
# logo_type: "employer"
# )
# @uploaded_logos.push(filename)
# employer_setup_process_params["employer_logo"] = filename
# end
# network_logos = employer_setup_process_params["alternate_network_logos_attributes"]
# if network_logos.present?
# network_logos.each do |alt|
# network_logo = alt.last["network_logo"]
# if network_logo.present? && network_logo.is_a?(ActionDispatch::Http::UploadedFile)
# filename = network_logo.original_filename
# binary_data = network_logo.read
# meme_type = Marcel::MimeType.for(network_logo)
# CardLogoFile.create(
# filename: filename,
# image_data: binary_data,
# content_type: meme_type,
# logo_type: "network"
# )
# @uploaded_logos.push(filename)
# end
# alt.last["network_logo"] = @uploaded_logos.last
# end
# end
# employer_setup_process_params
# end
# def update_logos_with_employer_setup_information()
# @uploaded_logos.each do |logo|
# logo_file = CardLogoFile.find_by(filename: logo)
# if logo_file.present? && @employer.present?
# logo_file.employer_setup_process = @employer
# logo_file.save
# end
# end
# end
# def general_information_params
# params.require(:employer_setup_general_information_form).permit(
# :name,
# :employer_logo,
# :group_number,
# :dental,
# :pl_plan_key,
# :effect_date,
# :number_of_plans,
# :network,
# :number_of_additional_network_logos
# )
# end
# def plans_params
# params.require(:employer_setup_plans_form).permit(
# plans: permited_plans_keys,
# benefit_descs: benefit_sequence_keys
# )
# end
# def network_exceptions_params
# params.require(:employer_setup_network_exceptions_form).permit(
# network_exceptions: [:network_logo, exceptions: [:type, :value]],
# )
# end
# def form_for_step
# step_name = @top_form.current_step
# form_method = "EmployerSetup#{step_name.camelize}Form".constantize
# # puts "/////\\\\\\||||||"
# # puts session[:employer_setup_data]
# # puts session[:employer_setup_data]['employer_setup_process_id']
# puts form_method
# form_method.new(session[:employer_setup_data]['employer_setup_process_id'])
# end
# def process_step(step_name)
# @form_method = "EmployerSetup#{step_name.camelize}Form".constantize
# session_data_name = "#{step_name}_data"
# # puts "1--------------params----"
# # puts params
# # puts "8--------------session----"
# # puts session[:employer_setup_data]
# employer_setup_process_id = session[:employer_setup_data]['employer_setup_process_id']
# # puts session[:employer_setup_data]
# puts "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
# puts params
# @form = @form_method.new(employer_setup_process_id, params)
# if @form.pl_plan_key.blank?
# @form.pl_plan_key = session[:employer_setup_data]['pl_plan_key']
# end
# if @form.valid? && @form.save
# pl_plan_key = @top_form.pl_plan_key || @form.pl_plan_key
# # session[:employer_setup_data].merge!({current_step: step_name, pl_plan_key: pl_plan_key})
# # form_fields = @form.attributes.merge!(global_params(step_name))
# # session[:employer_setup_data][session_data_name] = form_fields
# # session[:employer_setup_data].merge!(global_params(step_name))
# # puts session[:employer_setup_data][session_data_name]
# true
# else
# false
# end
# end
# def step_params(step_name)
# form_name_sym = "employer_setup_#{step_name}_form".to_sym
# params.require(form_name_sym).permit(@form_method.permitted_params)
# end
# def global_params(step_name)
# form_name_sym = "employer_setup_#{step_name}_form".to_sym
# params.require(form_name_sym).permit(EmployerSetupForm.permitted_params)
# end
# def process_step(step_name)
# form_name = "employer_setup_#{step_name}_form".camelize.constantize
# form_params_name = "#{step_name}_params".to_sym
# allowed_params = [:general_information_params, :plans_params, :network_exceptions_params]
# if allowed_params.include?(form_params_name)
# form_params = send(form_params_name)
# @form = form_name.new(form_params)
# if @form.valid?
# session[:employer_setup_data]["#{step_name}_data"] = form_params
# true
# else
# false
# end
# end
# false
# end
# def employer_setup_params
# params.require(:employer_setup_form).permit(
# :current_step,
# :name,
# :employer_logo,
# :group_number,
# :pl_plan_key,
# :effect_date,
# :number_of_plans,
# :network,
# :number_of_additional_network_logos,
# network_exceptions: [:network_logo, exceptions: [:type, :value]],
# plans: permited_plans_keys,
# benefit_descs: benefit_sequence_keys
# )
# end
# def benefit_sequence_keys
# (1..14).map { |i| i.to_s.to_sym }
# end
# def permited_plans_keys
# benefit_sequence_keys.push(:plan_id)
# end
# def plans_params
# plans_keys = params[:plans]&.keys || []
# plans_keys.each_with_object({}) do |key, hash|
# if key == 'benefit_descs' || key.match?(/^plan_\d$/)
# hash[key.to_sym] = permited_plan_param_list
# end
# end
# end
# def permited_plan_param_list
# (1..14).map { |i| i.to_s.to_sym }.push(:plan_id)
# end
end end
@@ -1,43 +1,43 @@
import { Controller } from "@hotwired/stimulus" import { Controller } from "@hotwired/stimulus"
export default class extends Controller { export default class extends Controller {
static targets = ["dependentField"] static targets = ["dependentField"]
connect() { connect() {
} }
toggleFields() { toggleFields() {
console.log("--- in toggle --- ") console.log("--- in toggle --- ")
const selector = this.element.querySelector('[data-action*="change->general-form#toggleFields"]'); const selector = this.element.querySelector('[data-action*="change->general-form#toggleFields"]');
if (selector) { if (selector) {
const selectedValue = selector.value const selectedValue = selector.value
this.field_match = false; this.field_match = false;
this.dependentFieldTargets.forEach((field) => { this.dependentFieldTargets.forEach((field) => {
// Check a data attribute on the field to see if it matches the selected value // Check a data attribute on the field to see if it matches the selected value
if (field.dataset.parentValue === selectedValue) { if (field.dataset.parentValue === selectedValue) {
if (selectedValue == "network_logo") { if (selectedValue == "network_logo") {
field.parentElement.parentElement.classList.remove("hidden"); field.parentElement.parentElement.classList.remove("hidden");
} else { } else {
field.parentElement.classList.remove("hidden"); field.parentElement.classList.remove("hidden");
} }
this.field_match = true; this.field_match = true;
console.log("- ", selectedValue) console.log("- ", selectedValue)
console.log("-- ", this.field_match) console.log("-- ", this.field_match)
} else { } else {
if (field.dataset.parentValue == "network_logo") { if (field.dataset.parentValue == "network_logo") {
field.parentElement.parentElement.classList.add("hidden"); field.parentElement.parentElement.classList.add("hidden");
} else { } else {
field.parentElement.classList.add("hidden"); field.parentElement.classList.add("hidden");
} }
} }
}); });
if (!this.field_match) { if (!this.field_match) {
console.log("--- ", this.field_match) console.log("--- ", this.field_match)
const defaultOption = this.dependentFieldTargets.find(target => { const defaultOption = this.dependentFieldTargets.find(target => {
return target.dataset.parentValue === 'default'; return target.dataset.parentValue === 'default';
}); });
defaultOption.parentElement.classList.remove("hidden"); defaultOption.parentElement.classList.remove("hidden");
} }
} }
} }
} }
+16 -16
View File
@@ -1,16 +1,16 @@
import { Controller } from "@hotwired/stimulus" import { Controller } from "@hotwired/stimulus"
export default class extends Controller { export default class extends Controller {
static targets = [ "name", "output" ] static targets = [ "name", "output" ]
connect() { connect() {
// this.element.textContent = "Hello World!" // this.element.textContent = "Hello World!"
console.log('Hello World hello_controller.js'); console.log('Hello World hello_controller.js');
} }
greet() { greet() {
console.log('greet'); console.log('greet');
this.outputTarget.textContent = this.outputTarget.textContent =
`Hello, ${this.nameTarget.value}!` `Hello, ${this.nameTarget.value}!`
} }
} }
@@ -4,12 +4,12 @@ export default class extends Controller {
static values = { static values = {
logoType: String, logoType: String,
employerName: String employerName: String
} }
static targets = ["preview", "previewContainer", "logoSelect", "logofield", "initialLogoFile"]; static targets = ["preview", "previewContainer", "logoSelect", "logoField", "initialLogoFile"];
async connect() { async connect() {
console.log('in connect'); console.log('in connect');
const initValue = this.logofieldTarget.value const initValue = this.logoFieldTarget.value
console.log(initValue) console.log(initValue)
if (initValue) { if (initValue) {
const response = await fetch(`/id_card/${this.logoTypeValue}_logos/${initValue}/image`); // Fetch the binary data const response = await fetch(`/id_card/${this.logoTypeValue}_logos/${initValue}/image`); // Fetch the binary data
@@ -25,41 +25,49 @@ export default class extends Controller {
uploadLogo(event) { uploadLogo(event) {
console.log('in uploadLogo'); console.log('in uploadLogo');
event.preventDefault() event.preventDefault()
const file = event.target.files[0]; let logoFile = event.target.files[0];
if (!file) return; if (!logoFile) return;
const logoType = this.logoTypeValue const logoType = this.logoTypeValue
let newFileName = file.name let newFileName = logoFile.name
if (logoType == "network") { if (logoType == "network") {
console.log("n " + newFileName); console.log("n " + newFileName);
newFileName = this.determineNetworkFilename(file) newFileName = this.determineNetworkFilename(logoFile)
this.addOptionToSelect(newFileName) this.addOptionToSelect(newFileName)
logoFile = new File([logoFile], newFileName)
} else if (logoType == "employer") { } else if (logoType == "employer") {
newFileName = this.determineEmployerFilename(file) newFileName = this.determineEmployerFilename(logoFile)
file.name = newFileName logoFile = new File([logoFile], newFileName)
} }
this.previewFile(file); this.uploadLogoToServer(logoFile)
this.uploadLogoToServer(file); .then((result) => {
console.log(result);
this.logofieldTarget.value = newFileName; const logoId = result.id
this.previewFile(logoFile);
this.logoFieldTarget.value = logoId;
})
.catch((error) => {
// Handle any errors that occurred
console.error(error);
});
} }
previewFile(file) { previewFile(logoFile) {
console.log('in previewFile'); console.log('in previewFile');
const reader = new FileReader(); const reader = new FileReader();
reader.onload = (e) => { reader.onload = (e) => {
this.previewTarget.src = e.target.result; this.previewTarget.src = e.target.result;
this.previewContainerTarget.classList.remove("hidden"); this.previewContainerTarget.classList.remove("hidden");
}; };
reader.readAsDataURL(file); reader.readAsDataURL(logoFile);
} }
async uploadLogoToServer(file) { async uploadLogoToServer(logoFile) {
console.log('in uploadLogoToServer'); console.log('in uploadLogoToServer');
const formData = new FormData(); const formData = new FormData();
formData.append(`id_card_${this.logoTypeValue}_logo[logo_file]`, file); formData.append(`id_card_${this.logoTypeValue}_logo[logo_file]`, logoFile);
const csrfToken = document.querySelector("meta[name='csrf-token']").content; const csrfToken = document.querySelector("meta[name='csrf-token']").content;
@@ -74,11 +82,14 @@ export default class extends Controller {
if (response.ok) { if (response.ok) {
console.log('Upload successful!') console.log('Upload successful!')
const data = await response.json();
return data;
} else { } else {
console.error("Failed to track event."); throw new Error(`HTTP error! status: ${response.status}`);
} }
} catch (error) { } catch (error) {
console.error("Network error:", error); console.error("Network error:", error);
throw new Error("Network error:", error);
} }
} }
@@ -86,17 +97,17 @@ export default class extends Controller {
const blankOptionIndex = 0; const blankOptionIndex = 0;
const newOption = new Option(name, name, true, true) const newOption = new Option(name, name, true, true)
if (this.logofieldTarget.options.length > blankOptionIndex + 1) { if (this.logoFieldTarget.options.length > blankOptionIndex + 1) {
this.logofieldTarget.insertBefore(newOption, this.logofieldTarget.options[blankOptionIndex + 1]); this.logoFieldTarget.insertBefore(newOption, this.logoFieldTarget.options[blankOptionIndex + 1]);
} else { } else {
this.logofieldTarget.appendChild(newOption); this.logoFieldTarget.appendChild(newOption);
} }
this.logofieldTarget.value = name; this.logoFieldTarget.value = name;
} }
determineNetworkFilename(file) { determineNetworkFilename(logoFile) {
const fileExtension = file.name.split('.').pop(); const fileExtension = logoFile.name.split('.').pop();
const primaryNetworkName = prompt("Enter the name for the primary network (Usually 'Cigna' or 'MedCost':"); const primaryNetworkName = prompt("Enter the name for the primary network (Usually 'Cigna' or 'MedCost':");
const secondaryNetworkName = prompt("Enter the name for the primary network (ex: Health Partners):"); const secondaryNetworkName = prompt("Enter the name for the primary network (ex: Health Partners):");
const logoFilename = this.titleizeText(primaryNetworkName).concat(this.titleizeText(secondaryNetworkName)).concat("Logo.").concat(fileExtension).replaceAll(' ', ''); const logoFilename = this.titleizeText(primaryNetworkName).concat(this.titleizeText(secondaryNetworkName)).concat("Logo.").concat(fileExtension).replaceAll(' ', '');
@@ -104,8 +115,8 @@ export default class extends Controller {
return logoFilename return logoFilename
} }
determineEmployerFilename(file) { determineEmployerFilename(logoFile) {
const fileExtension = file.name.split('.').pop(); const fileExtension = logoFile.name.split('.').pop();
const employerName = this.employerNameValue const employerName = this.employerNameValue
const logoFilename = this.titleizeText(employerName).concat("Logo.").concat(fileExtension).replaceAll(' ', ''); const logoFilename = this.titleizeText(employerName).concat("Logo.").concat(fileExtension).replaceAll(' ', '');
@@ -120,3 +131,4 @@ export default class extends Controller {
}); });
} }
} }
+1 -1
View File
@@ -1,6 +1,6 @@
class Employer < ApplicationRecord class Employer < ApplicationRecord
has_many :members has_many :members
has_one :id_card_setup, class_name: 'IdCard::Setup' has_one :id_card_setup, class_name: 'IdCard::Setup', dependent: :destroy
scope :active, -> { where(active: true) } scope :active, -> { where(active: true) }
scope :inactive, -> { where(active: false) } scope :inactive, -> { where(active: false) }
+11 -9
View File
@@ -1,14 +1,16 @@
class IdCard::EmployerLogo < ApplicationRecord module IdCard
before_save :calculate_aspect_ratio, if: :image_data_changed? class EmployerLogo < ApplicationRecord
before_save :calculate_aspect_ratio, if: :image_data_changed?
private private
def calculate_aspect_ratio def calculate_aspect_ratio
image_io = StringIO.new(self.image_data) image_io = StringIO.new(self.image_data)
width, height = FastImage.size(image_io) width, height = FastImage.size(image_io)
image_ratio = width.to_f / height image_ratio = width.to_f / height
if image_ratio if image_ratio
self.aspect_ratio = image_ratio.round(2) self.aspect_ratio = image_ratio.round(2)
end
end end
end end
end end
+9 -7
View File
@@ -1,10 +1,12 @@
class IdCard::Exception < ApplicationRecord module IdCard
belongs_to :id_card_setup class Exception < ApplicationRecord
has_many :id_card_exception_items belongs_to :setup
accepts_nested_attributes_for :id_card_exception_items, allow_destroy: true, reject_if: :all_blank has_many :exception_items
accepts_nested_attributes_for :exception_items, allow_destroy: true, reject_if: :all_blank
VALID_TYPES = ['zipcode', 'state', 'family_id'] VALID_TYPES = ['zipcode', 'state', 'family_id']
validates :type, inclusion: { in: VALID_TYPES, validates :type, inclusion: { in: VALID_TYPES,
message: "%{value} is not a valid exception type" } message: "%{value} is not a valid exception type" }
end
end end
+16 -14
View File
@@ -1,25 +1,27 @@
class IdCard::ExceptionItem < ApplicationRecord module IdCard
belongs_to :id_card_exception class ExceptionItem < ApplicationRecord
belongs_to :id_card_network_logo, optional: true belongs_to :exception
belongs_to :id_card_provider_section, optional: true belongs_to :network_logo, optional: true
belongs_to :provider_section, optional: true
validate :only_one_exception_field_present validate :only_one_exception_field_present
FIELDS_TO_VALIDATE = [:field_value, :card_logo_file_id, :card_provider_id].freeze FIELDS_TO_VALIDATE = [:field_value, :card_logo_file_id, :card_provider_id].freeze
VALID_FIELD_NAMES = ['network_logo', 'provider_section', 'effective_date'] VALID_FIELD_NAMES = ['network_logo', 'provider_section', 'effective_date']
validates :field_name, inclusion: { in: VALID_FIELD_NAMES, validates :field_name, inclusion: { in: VALID_FIELD_NAMES,
message: "%{value} is not a valid Id Card Field Name" } message: "%{value} is not a valid Id Card Field Name" }
private private
def only_one_exception_field_present def only_one_exception_field_present
present_fields = FIELDS_TO_VALIDATE.count { |field| self[field].present? } present_fields = FIELDS_TO_VALIDATE.count { |field| self[field].present? }
if present_fields != 1 if present_fields != 1
errors.add(:base, "Only one exception field can be present at a time") errors.add(:base, "Only one exception field can be present at a time")
end
end end
end end
end end
+8 -6
View File
@@ -1,11 +1,13 @@
class IdCard::NetworkLogo < ApplicationRecord module IdCard
before_save :round_aspect_ratio class NetworkLogo < ApplicationRecord
before_save :round_aspect_ratio
private private
def round_aspect_ratio def round_aspect_ratio
if self.aspect_ratio.present? if self.aspect_ratio.present?
self.aspect_ratio = self.aspect_ratio.round(2) self.aspect_ratio = self.aspect_ratio.round(2)
end
end end
end end
end end
+26 -24
View File
@@ -1,33 +1,35 @@
class IdCard::Plan < ApplicationRecord module IdCard
belongs_to :id_card_setup class Plan < ApplicationRecord
has_many :id_card_plan_benefits, dependent: :destroy belongs_to :setup
accepts_nested_attributes_for :id_card_plan_benefits, allow_destroy: true, reject_if: :all_blank has_many :plan_benefits, dependent: :destroy
accepts_nested_attributes_for :plan_benefits, allow_destroy: true, reject_if: :all_blank
# after_initialize :create_default_benefits, if: :new_record? # after_initialize :create_default_benefits, if: :new_record?
def self.permitted_params(params) def self.permitted_params(params)
params.require(:id_card_plan).permit( params.require(:id_card_plan).permit(
:title, :title,
:pb_product_key, :pb_product_key,
:pl_plan_key, :pl_plan_key,
:_destroy,
id_card_plan_benefits_attributes: [
:id,
:benefit_desc,
:benefit,
:sequence,
:_destroy, :_destroy,
] id_card_plan_benefits_attributes: [
) :id,
end :benefit_desc,
:benefit,
:sequence,
:_destroy,
]
)
end
private private
def build_and_create_default_benefits def build_and_create_default_benefits
benefits = IdCardBenefitsTemplate.find_by(title: "BLANK").id_card_benefits.sort_by(&:sequence) benefits = IdCardBenefitsTemplate.find_by(title: "BLANK").id_card_benefits.sort_by(&:sequence)
benefits.each do |ben| benefits.each do |ben|
id_card_plan_benefits.new(benefit_desc: ben.benefit_desc, sequence: ben.sequence) id_card_plan_benefits.new(benefit_desc: ben.benefit_desc, sequence: ben.sequence)
end
end end
end end
end end
+5 -3
View File
@@ -1,3 +1,5 @@
class IdCard::PlanBenefit < ApplicationRecord module IdCard
belongs_to :id_card_plan class PlanBenefit < ApplicationRecord
end belongs_to :plan
end
end
+9 -8
View File
@@ -1,14 +1,15 @@
class IdCard::PrintData < ApplicationRecord module IdCard
class PrintData < ApplicationRecord
STRING_ATTRIBUTES = %w[provider_line_1 provider_line_2 provider_line_3 provider_line_4 provider_line_5 provider_line_6 provider_line_7 provider_line_8 provider_line_9 provider_line_10 provider_line_11 claim_to_1 claim_to_2 claim_to_3 claim_to_4 claim_to_5 claim_to_6 claim_to_7 claim_to_8 claim_to_9 claim_to_10 claim_to_11 dependent_1 dependent_2 dependent_3 dependent_4 dependent_5 dependent_6 dependent_7 dependent_8] STRING_ATTRIBUTES = %w[provider_line_1 provider_line_2 provider_line_3 provider_line_4 provider_line_5 provider_line_6 provider_line_7 provider_line_8 provider_line_9 provider_line_10 provider_line_11 claim_to_1 claim_to_2 claim_to_3 claim_to_4 claim_to_5 claim_to_6 claim_to_7 claim_to_8 claim_to_9 claim_to_10 claim_to_11 dependent_1 dependent_2 dependent_3 dependent_4 dependent_5 dependent_6 dependent_7 dependent_8]
before_validation :assign_blank_strings_to_unassigned_params before_validation :assign_blank_strings_to_unassigned_params
def assign_blank_strings_to_unassigned_params def assign_blank_strings_to_unassigned_params
STRING_ATTRIBUTES.each do |attr| STRING_ATTRIBUTES.each do |attr|
# Use the blank? method which checks for nil, false, empty, or whitespace strings # Use the blank? method which checks for nil, false, empty, or whitespace strings
self[attr] = "" if self[attr].blank? self[attr] = "" if self[attr].blank?
end
end end
end end
end end
+4 -2
View File
@@ -1,3 +1,5 @@
class IdCard::ProviderSection < ApplicationRecord module IdCard
class ProviderSection < ApplicationRecord
end end
end
+4 -2
View File
@@ -1,3 +1,5 @@
class IdCard::RxSection < ApplicationRecord module IdCard
class RxSection < ApplicationRecord
end end
end
+25 -21
View File
@@ -1,27 +1,31 @@
class IdCard::Setup < ApplicationRecord module IdCard
belongs_to :employer class Setup < ApplicationRecord
belongs_to :id_card_employer_logo belongs_to :employer, class_name: 'Employer'
belongs_to :id_card_network_logo belongs_to :employer_logo, optional: true
belongs_to :id_card_provider_section belongs_to :network_logo, optional: true
belongs_to :id_card_rx_section belongs_to :provider_section, optional: true
belongs_to :rx_section, optional: true
has_many :card_exceptions, dependent: :destroy has_many :plans, dependent: :destroy
# def employer_logo_filename has_many :exceptions, dependent: :destroy
# self.id_card_employer_logo.filename
# end
# def network_logo_filename # def employer_logo_filename
# self.id_card_network_logo.filename # self.employer_logo.filename
# end # end
def self.permitted_params(params) # def network_logo_filename
params.require(:id_card_setup).permit( # self.network_logo.filename
:print_name, # end
:network_provider,
:card_template, def self.permitted_params(params)
:rx_group_number, params.require(:id_card_setup).permit(
:id_card_employer_logo_id :print_name,
) :network_provider,
:card_template,
:rx_group_number,
:id_card_employer_logo_id
)
end
end end
end end
+14 -14
View File
@@ -1,14 +1,14 @@
class CallStoredProc class CallStoredProc
def initialize(procedure_name, args = {}) def initialize(procedure_name, args = {})
@procedure_name = procedure_name @procedure_name = procedure_name
@args = args @args = args
end end
def call def call
params_sql = @args.map { |key, value| "@#{key} = :#{key}" }.join(', ') params_sql = @args.map { |key, value| "@#{key} = :#{key}" }.join(', ')
sql_template = "EXEC #{@procedure_name} #{params_sql}" sql_template = "EXEC #{@procedure_name} #{params_sql}"
sanitized_sql = VhcsRecord.send(:sanitize_sql_array, [sql_template, @args]) sanitized_sql = VhcsRecord.send(:sanitize_sql_array, [sql_template, @args])
VhcsRecord.connection.exec_query(sanitized_sql) VhcsRecord.connection.exec_query(sanitized_sql)
end end
end end
@@ -15,13 +15,17 @@ module BenefitsWordDoc
plan_lines = @word_doc_section.slice(plan_index + 1, 14) plan_lines = @word_doc_section.slice(plan_index + 1, 14)
plan_lines.each_with_index do |line, i| plan_lines.each_with_index do |line, i|
field_mapping = mapping_array[i] field_mapping = mapping_array[i]
field_regex = field_mapping[:doc_to_employer_regex] if line.match(/:.*/)
if line.match(field_regex) field_value = line.match(/:.*/)[0].strip
field_value = line.match(field_regex)[0].strip
elsif line.match(default_benefit_regex(field_mapping[:employer_benefit_desc_field]))
field_value = line.match(default_benefit_regex(field_mapping[:employer_benefit_desc_field]))[0].strip
else else
field_value = line field_regex = field_mapping[:doc_to_employer_regex]
if line.match(field_regex)
field_value = line.match(field_regex)[0].strip
elsif line.match(default_benefit_regex(field_mapping[:employer_benefit_desc_field]))
field_value = line.match(default_benefit_regex(field_mapping[:employer_benefit_desc_field]))[0].strip
else
field_value = line
end
end end
employer_benefit_desc_field = field_mapping[:employer_benefit_desc_field] employer_benefit_desc_field = field_mapping[:employer_benefit_desc_field]
new_benefit = new_plan.plan_benefits[i] new_benefit = new_plan.plan_benefits[i]
+1 -1
View File
@@ -21,7 +21,7 @@ class ImageProcessor
filename: filename, filename: filename,
image_data: binary_data, image_data: binary_data,
content_type: meme_type, content_type: meme_type,
logo_type: "network" logo_type: "employer"
) )
end end
end end
+2 -2
View File
@@ -23,7 +23,7 @@ module SampleCard
def set_employer_fields def set_employer_fields
selected_attributes = { selected_attributes = {
employer_name: @employer.name, employer_name: @employer.name,
group_number: @employer.group_number || "999999", group_number: @employer.group_number.present? ? @employer.group_number : "999999",
medical_eff_date: @employer.effective_date medical_eff_date: @employer.effective_date
} }
@@ -49,7 +49,7 @@ module SampleCard
selected_attributes = { selected_attributes = {
full_name: "JANE DOE", full_name: "JANE DOE",
primary_mb_member_key: "888888", primary_mb_member_key: "888888",
rx_group: @employer.group_number || "999999" rx_group: @employer.group_number.present? ? @employer.group_number : "999999"
} }
@sample_card.assign_attributes(selected_attributes) @sample_card.assign_attributes(selected_attributes)
@@ -1,32 +1,32 @@
<div class="flex space-x-5 items-center mt-4"> <div class="flex space-x-5 items-center mt-4">
<div class="flex flex-col items-start w-full"> <div class="flex flex-col items-start w-full">
<div class="flex items-end w-full"> <div class="flex items-end w-full">
<div class="flex flex-col"> <div class="flex flex-col">
<%= f.select :network_logo, options_for_select(CardLogoFile.where(logo_type: 'network').pluck(:filename).map { |fn| [fn, fn]}), { include_blank: "Select or Add Network Logo", class: "rounded-r-none" }, { data: { logo_upload_target: "logoSelect" }} %> <%= f.select :network_logo, options_for_select(CardLogoFile.where(logo_type: 'network').pluck(:filename).map { |fn| [fn, fn]}), { include_blank: "Select or Add Network Logo", class: "rounded-r-none" }, { data: { logo_upload_target: "logoSelect" }} %>
</div> </div>
<div class="flex items-center justify-center cursor-pointer bg-NEXT_COLOR hover:bg-deepcove border-2 border-NEXT_COLOR text-platinum font-bold px-3 rounded-r h-10 transition duration-100"> <div class="flex items-center justify-center cursor-pointer bg-NEXT_COLOR hover:bg-deepcove border-2 border-NEXT_COLOR text-platinum font-bold px-3 rounded-r h-10 transition duration-100">
<label for="file_upload_input_NEW_RECORD" class="text-center cursor-pointer"> <label for="file_upload_input_NEW_RECORD" class="text-center cursor-pointer">
<%= icon "image-plus", library: "lucide" %> <%= icon "image-plus", library: "lucide" %>
</label> </label>
</div> </div>
<div class="hidden flex justify-center ml-4 rounded-lg border-4 border-NEXT_COLOR" data-logo-upload-target="previewContainer"> <div class="hidden flex justify-center ml-4 rounded-lg border-4 border-NEXT_COLOR" data-logo-upload-target="previewContainer">
<img data-logo-upload-target="preview" src="#" alt="Network Logo preview" class="max-h-[100px] max-w-[133px] m-1 bg-platinum"/> <img data-logo-upload-target="preview" src="#" alt="Network Logo preview" class="max-h-[100px] max-w-[133px] m-1 bg-platinum"/>
</div> </div>
</div> </div>
</div> </div>
<%= network_fields.file_field :network_logo_file, class: "hidden", id: "file_upload_input_NEW_RECORD", data: { add_alt_network_logo_target: "networkLogo", logo_upload_type_param: "network", action: "change->logo-upload#uploadLogo" }, direct_upload: true %> <%= network_fields.file_field :network_logo_file, class: "hidden", id: "file_upload_input_NEW_RECORD", data: { add_alt_network_logo_target: "networkLogo", logo_upload_type_param: "network", action: "change->logo-upload#uploadLogo" }, direct_upload: true %>
</div> </div>
<div class="flex items-end space-x-6 w-full"> <div class="flex items-end space-x-6 w-full">
<div class="w-full"> <div class="w-full">
<%= network_fields.select :exception_type, options_for_select(["Zip","State"]), label: { text: "Exception Type" }, prompt: "Select Type", class: "w-full" %> <%= network_fields.select :exception_type, options_for_select(["Zip","State"]), label: { text: "Exception Type" }, prompt: "Select Type", class: "w-full" %>
</div> </div>
<div class="w-full"> <div class="w-full">
<%= network_fields.text_field :exception_value, label: { text: "Exception Value" }, class: "w-full" %> <%= network_fields.text_field :exception_value, label: { text: "Exception Value" }, class: "w-full" %>
</div> </div>
</div> </div>
<div class="flex justify-center items-end w-full"> <div class="flex justify-center items-end w-full">
<div class="w-1/2"> <div class="w-1/2">
<%= network_fields.hidden_field :_destroy %> <%= network_fields.hidden_field :_destroy %>
<%= button_tag "Remove", class: "cursor-pointer bg-deepcove hover:bg-brightlava text-xl font-bold text-NEXT_SECONDARY_COLOR hover:text-platinum py-1 px-2 font-semibold leading-tight rounded-lg border-3 border-NEXT_SECONDARY_COLOR w-full", data: { action: "add-alt-network-logo#remove" } %> <%= button_tag "Remove", class: "cursor-pointer bg-deepcove hover:bg-brightlava text-xl font-bold text-NEXT_SECONDARY_COLOR hover:text-platinum py-1 px-2 font-semibold leading-tight rounded-lg border-3 border-NEXT_SECONDARY_COLOR w-full", data: { action: "add-alt-network-logo#remove" } %>
</div> </div>
</div> </div>
@@ -1,9 +1,10 @@
<div class="bg-deepcove h-full w-full flex flex-col"> <div class="bg-deepcove h-full w-full flex flex-col">
<div class="flex justify-between my-5 font-bold text-4xl"> <div class="flex space-x-6 my-5 font-bold text-4xl">
<h1 class="text-platinum">New ID Card Setup:</h1> <h1 class="text-platinum">New ID Card Setup:</h1>
<h1 class="text-verdigris">(<%= @employer.name %>)</h1> <h1 class="text-verdigris">(<%= @employer.name %>)</h1>
</div> </div>
<%= form_with model: @setup, local: true, multipart: true do |f| %> <%= form_with model: @setup, local: true, multipart: true do |f| %>
<%= form_with model: @employer, url: import_employers_path, data: { turbo: false }, local: true, multipart: true do |form| %>
<div class="flex flex-col space-y-6 pb-10"> <div class="flex flex-col space-y-6 pb-10">
<div class="flex w-full items-end" data-controller="logo-upload" data-logo-upload-logo-type-value="employer" data-logo-upload-employer-name-value=<%= @employer.name %>> <div class="flex w-full items-end" data-controller="logo-upload" data-logo-upload-logo-type-value="employer" data-logo-upload-employer-name-value=<%= @employer.name %>>
<div class="flex flex-col space-y-6 w-2/5"> <div class="flex flex-col space-y-6 w-2/5">
@@ -25,7 +26,7 @@
</div> </div>
<div class="flex items-end"> <div class="flex items-end">
<div class="flex"> <div class="flex">
<div class="text-platinum">Employer Logo</div> <div class="text-platinum text-lg">Employer Logo</div>
<div class="flex items-center justify-center self-end cursor-pointer bg-atmosphere hover:bg-deepcove border-2 border-atmosphere text-platinum font-bold px-3 rounded-r h-10 transition duration-100"> <div class="flex items-center justify-center self-end cursor-pointer bg-atmosphere hover:bg-deepcove border-2 border-atmosphere text-platinum font-bold px-3 rounded-r h-10 transition duration-100">
<label for="employer_logo_file" class="text-center cursor-pointer"> <label for="employer_logo_file" class="text-center cursor-pointer">
<%= icon "image-plus", library: "lucide" %> <%= icon "image-plus", library: "lucide" %>
@@ -35,13 +36,13 @@
<div class="hidden flex justify-center ml-15 rounded-lg border-4 border-atmosphere" data-logo-upload-target="previewContainer"> <div class="hidden flex justify-center ml-15 rounded-lg border-4 border-atmosphere" data-logo-upload-target="previewContainer">
<img data-logo-upload-target="preview" src="#" alt="Employer Logo preview" class="max-h-[100px] max-w-[133px] bg-platinum m-1"/> <img data-logo-upload-target="preview" src="#" alt="Employer Logo preview" class="max-h-[100px] max-w-[133px] bg-platinum m-1"/>
</div> </div>
<%= f.hidden_field :id_card_employer_logo_id, data: { logo_upload_target: "logofield", logo_upload_target: "employer" } %> <%= f.hidden_field :employer_logo_id, label: { text: "Employer Logo" }, data: { logo_upload_target: "logoField" } %>
<%= f.file_field :add_or_update_logo, class: "hidden", id: "employer_logo_file", data: { logo_upload_target: "previewContainer", parent_value: "network_logo", action: "change->logo-upload#uploadLogo" }, direct_upload: true %> <%= f.file_field :logo_file, class: "hidden", id: "employer_logo_file", data: { logo_upload_target: "previewContainer", parent_value: "network_logo", action: "change->logo-upload#uploadLogo" }, direct_upload: true %>
</div> </div>
</div> </div>
</div> </div>
<div class="py-8"> <div class="py-8">
<%= f.submit "Create New Employer" %> <%= f.submit "Create ID Card Setup" %>
</div> </div>
</div> </div>
<% end %> <% end %>
+2
View File
@@ -15,6 +15,8 @@ services:
- HISTFILE=/usr/src/app/log/.bash_history - HISTFILE=/usr/src/app/log/.bash_history
- RAILS_ENV=development - RAILS_ENV=development
- TAILWIND_POLLING=true - TAILWIND_POLLING=true
- PUID=1000
- PGID=100
tty: true tty: true
stdin_open: true stdin_open: true
depends_on: depends_on:
@@ -7,10 +7,10 @@ class CreateIdCardSetups < ActiveRecord::Migration[7.2]
t.string :rx_group_number t.string :rx_group_number
t.boolean :active, default: false t.boolean :active, default: false
t.belongs_to :employer, null: false, foreign_key: true t.belongs_to :employer, null: false, foreign_key: true
t.belongs_to :id_card_employer_logo, null: true, foreign_key: true t.belongs_to :employer_logo, null: true, foreign_key: { to_table: :id_card_employer_logos }
t.belongs_to :id_card_network_logo, null: true, foreign_key: true t.belongs_to :network_logo, null: true, foreign_key: { to_table: :id_card_network_logos }
t.belongs_to :id_card_provider_section, null: false, foreign_key: true t.belongs_to :provider_section, null: true, foreign_key: { to_table: :id_card_provider_sections }
t.belongs_to :id_card_rx_section, null: false, foreign_key: true t.belongs_to :rx_section, null: true, foreign_key: { to_table: :id_card_rx_sections }
t.timestamps t.timestamps
end end
@@ -4,7 +4,8 @@ class CreateIdCardPlans < ActiveRecord::Migration[7.2]
t.string :title t.string :title
t.integer :pb_product_key t.integer :pb_product_key
t.string :pl_plan_key t.string :pl_plan_key
t.belongs_to :id_card_setup, null: true, foreign_key: true t.boolean :template
t.belongs_to :setup, null: true, foreign_key: { to_table: :id_card_setups }
t.timestamps t.timestamps
end end
@@ -4,7 +4,7 @@ class CreateIdCardPlanBenefits < ActiveRecord::Migration[7.2]
t.string :benefit_desc t.string :benefit_desc
t.string :benefit t.string :benefit
t.integer :sequence t.integer :sequence
t.belongs_to :id_card_plan, null: false, foreign_key: true t.belongs_to :plan, null: false, foreign_key: { to_table: :id_card_plans }
t.timestamps t.timestamps
end end
@@ -3,7 +3,7 @@ class CreateIdCardExceptions < ActiveRecord::Migration[7.2]
create_table :id_card_exceptions do |t| create_table :id_card_exceptions do |t|
t.string :type t.string :type
t.string :value t.string :value
t.belongs_to :id_card_setup, null: false, foreign_key: true t.belongs_to :setup, null: false, foreign_key: { to_table: :id_card_setups }
t.timestamps t.timestamps
end end
@@ -3,9 +3,9 @@ class CreateIdCardExceptionItems < ActiveRecord::Migration[7.2]
create_table :id_card_exception_items do |t| create_table :id_card_exception_items do |t|
t.string :field_name t.string :field_name
t.string :field_value t.string :field_value
t.belongs_to :id_card_exception, null: false, foreign_key: true t.belongs_to :exception, null: false, foreign_key: { to_table: :id_card_exceptions }
t.belongs_to :id_card_network_logo, null: true, foreign_key: true t.belongs_to :network_logo, null: true, foreign_key: { to_table: :id_card_network_logos }
t.belongs_to :id_card_provider_section, null: true, foreign_key: true t.belongs_to :provider_section, null: true, foreign_key: { to_table: :id_card_provider_sections }
t.timestamps t.timestamps
end end
+31 -30
View File
@@ -37,23 +37,23 @@ ActiveRecord::Schema[7.2].define(version: 2026_01_16_182836) do
create_table "id_card_exception_items", force: :cascade do |t| create_table "id_card_exception_items", force: :cascade do |t|
t.string "field_name" t.string "field_name"
t.string "field_value" t.string "field_value"
t.bigint "id_card_exception_id", null: false t.bigint "exception_id", null: false
t.bigint "id_card_network_logo_id" t.bigint "network_logo_id"
t.bigint "id_card_provider_section_id" t.bigint "provider_section_id"
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.datetime "updated_at", null: false t.datetime "updated_at", null: false
t.index ["id_card_exception_id"], name: "index_id_card_exception_items_on_id_card_exception_id" t.index ["exception_id"], name: "index_id_card_exception_items_on_exception_id"
t.index ["id_card_network_logo_id"], name: "index_id_card_exception_items_on_id_card_network_logo_id" t.index ["network_logo_id"], name: "index_id_card_exception_items_on_network_logo_id"
t.index ["id_card_provider_section_id"], name: "index_id_card_exception_items_on_id_card_provider_section_id" t.index ["provider_section_id"], name: "index_id_card_exception_items_on_provider_section_id"
end end
create_table "id_card_exceptions", force: :cascade do |t| create_table "id_card_exceptions", force: :cascade do |t|
t.string "type" t.string "type"
t.string "value" t.string "value"
t.bigint "id_card_setup_id", null: false t.bigint "setup_id", null: false
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.datetime "updated_at", null: false t.datetime "updated_at", null: false
t.index ["id_card_setup_id"], name: "index_id_card_exceptions_on_id_card_setup_id" t.index ["setup_id"], name: "index_id_card_exceptions_on_setup_id"
end end
create_table "id_card_network_logos", force: :cascade do |t| create_table "id_card_network_logos", force: :cascade do |t|
@@ -70,20 +70,21 @@ ActiveRecord::Schema[7.2].define(version: 2026_01_16_182836) do
t.string "benefit_desc" t.string "benefit_desc"
t.string "benefit" t.string "benefit"
t.integer "sequence" t.integer "sequence"
t.bigint "id_card_plan_id", null: false t.bigint "plan_id", null: false
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.datetime "updated_at", null: false t.datetime "updated_at", null: false
t.index ["id_card_plan_id"], name: "index_id_card_plan_benefits_on_id_card_plan_id" t.index ["plan_id"], name: "index_id_card_plan_benefits_on_plan_id"
end end
create_table "id_card_plans", force: :cascade do |t| create_table "id_card_plans", force: :cascade do |t|
t.string "title" t.string "title"
t.integer "pb_product_key" t.integer "pb_product_key"
t.string "pl_plan_key" t.string "pl_plan_key"
t.bigint "id_card_setup_id" t.boolean "template"
t.bigint "setup_id"
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.datetime "updated_at", null: false t.datetime "updated_at", null: false
t.index ["id_card_setup_id"], name: "index_id_card_plans_on_id_card_setup_id" t.index ["setup_id"], name: "index_id_card_plans_on_setup_id"
end end
create_table "id_card_print_data", force: :cascade do |t| create_table "id_card_print_data", force: :cascade do |t|
@@ -226,17 +227,17 @@ ActiveRecord::Schema[7.2].define(version: 2026_01_16_182836) do
t.string "rx_group_number" t.string "rx_group_number"
t.boolean "active", default: false t.boolean "active", default: false
t.bigint "employer_id", null: false t.bigint "employer_id", null: false
t.bigint "id_card_employer_logo_id" t.bigint "employer_logo_id"
t.bigint "id_card_network_logo_id" t.bigint "network_logo_id"
t.bigint "id_card_provider_section_id", null: false t.bigint "provider_section_id"
t.bigint "id_card_rx_section_id", null: false t.bigint "rx_section_id"
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.datetime "updated_at", null: false t.datetime "updated_at", null: false
t.index ["employer_id"], name: "index_id_card_setups_on_employer_id" t.index ["employer_id"], name: "index_id_card_setups_on_employer_id"
t.index ["id_card_employer_logo_id"], name: "index_id_card_setups_on_id_card_employer_logo_id" t.index ["employer_logo_id"], name: "index_id_card_setups_on_employer_logo_id"
t.index ["id_card_network_logo_id"], name: "index_id_card_setups_on_id_card_network_logo_id" t.index ["network_logo_id"], name: "index_id_card_setups_on_network_logo_id"
t.index ["id_card_provider_section_id"], name: "index_id_card_setups_on_id_card_provider_section_id" t.index ["provider_section_id"], name: "index_id_card_setups_on_provider_section_id"
t.index ["id_card_rx_section_id"], name: "index_id_card_setups_on_id_card_rx_section_id" t.index ["rx_section_id"], name: "index_id_card_setups_on_rx_section_id"
end end
create_table "members", force: :cascade do |t| create_table "members", force: :cascade do |t|
@@ -254,17 +255,17 @@ ActiveRecord::Schema[7.2].define(version: 2026_01_16_182836) do
t.index ["id_card_plan_id"], name: "index_members_on_id_card_plan_id" t.index ["id_card_plan_id"], name: "index_members_on_id_card_plan_id"
end end
add_foreign_key "id_card_exception_items", "id_card_exceptions" add_foreign_key "id_card_exception_items", "id_card_exceptions", column: "exception_id"
add_foreign_key "id_card_exception_items", "id_card_network_logos" add_foreign_key "id_card_exception_items", "id_card_network_logos", column: "network_logo_id"
add_foreign_key "id_card_exception_items", "id_card_provider_sections" add_foreign_key "id_card_exception_items", "id_card_provider_sections", column: "provider_section_id"
add_foreign_key "id_card_exceptions", "id_card_setups" add_foreign_key "id_card_exceptions", "id_card_setups", column: "setup_id"
add_foreign_key "id_card_plan_benefits", "id_card_plans" add_foreign_key "id_card_plan_benefits", "id_card_plans", column: "plan_id"
add_foreign_key "id_card_plans", "id_card_setups" add_foreign_key "id_card_plans", "id_card_setups", column: "setup_id"
add_foreign_key "id_card_setups", "employers" add_foreign_key "id_card_setups", "employers"
add_foreign_key "id_card_setups", "id_card_employer_logos" add_foreign_key "id_card_setups", "id_card_employer_logos", column: "employer_logo_id"
add_foreign_key "id_card_setups", "id_card_network_logos" add_foreign_key "id_card_setups", "id_card_network_logos", column: "network_logo_id"
add_foreign_key "id_card_setups", "id_card_provider_sections" add_foreign_key "id_card_setups", "id_card_provider_sections", column: "provider_section_id"
add_foreign_key "id_card_setups", "id_card_rx_sections" add_foreign_key "id_card_setups", "id_card_rx_sections", column: "rx_section_id"
add_foreign_key "members", "employers" add_foreign_key "members", "employers"
add_foreign_key "members", "id_card_plans" add_foreign_key "members", "id_card_plans"
end end