diff --git a/Gemfile b/Gemfile index 9b53888..b5ab2c1 100644 --- a/Gemfile +++ b/Gemfile @@ -85,4 +85,6 @@ gem "tailwindcss-rails" gem 'docx' gem 'rubyzip' gem 'httparty' -gem 'combine_pdf' \ No newline at end of file +gem 'combine_pdf' +gem 'rails_icons' +gem 'fastimage' \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index d440807..2e188b3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -125,6 +125,7 @@ GEM drb (2.2.3) erb (5.1.3) erubi (1.13.1) + fastimage (2.4.0) globalid (1.3.0) activesupport (>= 6.1) httparty (0.23.2) @@ -246,6 +247,9 @@ GEM rails-html-sanitizer (1.6.2) loofah (~> 2.21) nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0) + rails_icons (1.5.1) + nokogiri (~> 1.16, >= 1.16.4) + rails (>= 7.0) railties (7.2.3) actionpack (= 7.2.3) activesupport (= 7.2.3) @@ -405,6 +409,7 @@ DEPENDENCIES combine_pdf devise docx + fastimage httparty importmap-rails jbuilder @@ -413,6 +418,7 @@ DEPENDENCIES pundit rack-mini-profiler rails (~> 7.2) + rails_icons rspec-rails rubocop-rails rubocop-rails-omakase diff --git a/app/controllers/card_logo_files_controller.rb b/app/controllers/card_logo_files_controller.rb new file mode 100644 index 0000000..53b7cb8 --- /dev/null +++ b/app/controllers/card_logo_files_controller.rb @@ -0,0 +1,57 @@ +class CardLogoFilesController < ApplicationController + + def index + end + + def show + end + + def image + logo_file = CardLogoFile.find_by(filename: params[:id]) + puts params[:id] + logo_binary = logo_file.image_data + logo_filename = logo_file.filename + logo_file_type = logo_file.content_type + + send_data logo_binary, + filename: logo_filename, + # type: logo_file_type, + 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) + + CardLogoFile.create( + filename: filename, + image_data: binary_data, + content_type: meme_type, + logo_type: card_logo_file_params["logo_type"] + ) + end + end + + def edit + end + + def update + end + + def destroy + end + + private + + def card_logo_file_params + params.require(:card_logo_file).permit(:logo_file, :logo_type) + end + +end \ No newline at end of file diff --git a/app/controllers/card_providers_controller.rb b/app/controllers/card_providers_controller.rb new file mode 100644 index 0000000..922f14e --- /dev/null +++ b/app/controllers/card_providers_controller.rb @@ -0,0 +1,70 @@ +class CardProvidersController < ApplicationController + before_action :set_card_provider, only: %i[ show edit update destroy ] + + # GET /card_providers or /card_providers.json + def index + @card_providers = CardProvider.all + end + + # GET /card_providers/1 or /card_providers/1.json + def show + end + + # GET /card_providers/new + def new + @card_provider = CardProvider.new + end + + # GET /card_providers/1/edit + def edit + end + + # POST /card_providers or /card_providers.json + def create + @card_provider = CardProvider.new(card_provider_params) + + respond_to do |format| + if @card_provider.save + format.html { redirect_to @card_provider, notice: "Card provider was successfully created." } + format.json { render :show, status: :created, location: @card_provider } + else + format.html { render :new, status: :unprocessable_entity } + format.json { render json: @card_provider.errors, status: :unprocessable_entity } + end + end + end + + # PATCH/PUT /card_providers/1 or /card_providers/1.json + def update + respond_to do |format| + if @card_provider.update(card_provider_params) + format.html { redirect_to @card_provider, notice: "Card provider was successfully updated.", status: :see_other } + format.json { render :show, status: :ok, location: @card_provider } + else + format.html { render :edit, status: :unprocessable_entity } + format.json { render json: @card_provider.errors, status: :unprocessable_entity } + end + end + end + + # DELETE /card_providers/1 or /card_providers/1.json + def destroy + @card_provider.destroy! + + respond_to do |format| + format.html { redirect_to card_providers_path, notice: "Card provider was successfully destroyed.", status: :see_other } + format.json { head :no_content } + end + end + + private + # Use callbacks to share common setup or constraints between actions. + def set_card_provider + @card_provider = CardProvider.find(params[:id]) + end + + # Only allow a list of trusted parameters through. + def card_provider_params + params.require(:card_provider).permit(:provider_code, :provider_line_1, :provider_line_2, :provider_line_3, :provider_line_4, :provider_line_5, :mail_to, :mail_to_2, :contact_line_1, :contact_line_2, :contact_line_3, :group_number, :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, :provider_line_6, :provider_line_7, :provider_line_8, :provider_line_9, :provider_line_10, :provider_line_11, :rx_group_id, :rx_contact, :provider_lookup_1, :provider_lookup_2, :precert_1, :precert_2, :precert_3, :precert_4, :precert_5, :precert_6, :provider_line_12, :claim_to_12) + end +end diff --git a/app/controllers/card_rxes_controller.rb b/app/controllers/card_rxes_controller.rb new file mode 100644 index 0000000..a8a9a97 --- /dev/null +++ b/app/controllers/card_rxes_controller.rb @@ -0,0 +1,70 @@ +class CardRxesController < ApplicationController + before_action :set_card_rx, only: %i[ show edit update destroy ] + + # GET /card_rxes or /card_rxes.json + def index + @card_rxes = CardRx.all + end + + # GET /card_rxes/1 or /card_rxes/1.json + def show + end + + # GET /card_rxes/new + def new + @card_rx = CardRx.new + end + + # GET /card_rxes/1/edit + def edit + end + + # POST /card_rxes or /card_rxes.json + def create + @card_rx = CardRx.new(card_rx_params) + + respond_to do |format| + if @card_rx.save + format.html { redirect_to @card_rx, notice: "Card rx was successfully created." } + format.json { render :show, status: :created, location: @card_rx } + else + format.html { render :new, status: :unprocessable_entity } + format.json { render json: @card_rx.errors, status: :unprocessable_entity } + end + end + end + + # PATCH/PUT /card_rxes/1 or /card_rxes/1.json + def update + respond_to do |format| + if @card_rx.update(card_rx_params) + format.html { redirect_to @card_rx, notice: "Card rx was successfully updated.", status: :see_other } + format.json { render :show, status: :ok, location: @card_rx } + else + format.html { render :edit, status: :unprocessable_entity } + format.json { render json: @card_rx.errors, status: :unprocessable_entity } + end + end + end + + # DELETE /card_rxes/1 or /card_rxes/1.json + def destroy + @card_rx.destroy! + + respond_to do |format| + format.html { redirect_to card_rxes_path, notice: "Card rx was successfully destroyed.", status: :see_other } + format.json { head :no_content } + end + end + + private + # Use callbacks to share common setup or constraints between actions. + def set_card_rx + @card_rx = CardRx.find(params[:id]) + end + + # Only allow a list of trusted parameters through. + def card_rx_params + params.require(:card_rx).permit(:help_desk, :customer_service, :web_url) + end +end diff --git a/app/controllers/employer_setup_controller.rb b/app/controllers/employer_setup_controller.rb index 50ecdd6..0590d95 100644 --- a/app/controllers/employer_setup_controller.rb +++ b/app/controllers/employer_setup_controller.rb @@ -1,24 +1,54 @@ class EmployerSetupController < ApplicationController + def index + @employer_setups = EmployerSetupProcess.all + end + + def show + + end + def new @employer_setup = EmployerSetupProcess.new @employer_setup.plans.build @plan_templates = IdCardBenefitsTemplate.where.not(title: "BLANK") - render 'employer_setup/employer_information' + render :new + end + + def import + word_doc = params[:employer_setup_process][:import_from_word] + @plan_templates = IdCardBenefitsTemplate.where.not(title: "BLANK") + if word_doc.present? && word_doc.is_a?(ActionDispatch::Http::UploadedFile) + @employer_setup = BenefitsWordDocProcessor.new(word_doc.tempfile).call + render :edit + else + @employer_setup = EmployerSetupProcess.new + @employer_setup.plans.build + render :new + end end def create employer_setup_process_params = EmployerSetupProcess.permitted_params(params) puts "---Params---" puts employer_setup_process_params + # post_image_processing_params = process_logos(employer_setup_process_params) @employer_setup = EmployerSetupProcess.new(employer_setup_process_params) if @employer_setup.save + # update_logos_with_employer_setup_information() redirect_to @employer_setup, notice: 'Employer Setup Process initiated' else @plan_templates = IdCardBenefitsTemplate.where.not(title: "BLANK") - render 'employer_setup/employer_information' + render :new end end + def edit + @employer_setup = EmployerSetupProcess.find_by(slug: params[:id]) + @plan_templates = IdCardBenefitsTemplate.where.not(title: "BLANK") + render :edit + # @resource = Resource.find(params[:id]) + end + def update @form = RegistrationForm.new(registration_params) @@ -31,8 +61,69 @@ class EmployerSetupController < ApplicationController render :new 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_setup.present? + logo_file.employer_setup_process = @employer_setup + logo_file.save + end + end + + end + # def general_information_params # params.require(:employer_setup_general_information_form).permit( # :name, diff --git a/app/controllers/employers_controller.rb b/app/controllers/employers_controller.rb new file mode 100644 index 0000000..901b215 --- /dev/null +++ b/app/controllers/employers_controller.rb @@ -0,0 +1,259 @@ +class EmployersController < ApplicationController + def index + @employers = Employer.all + end + + def show + @employer = Employer.find_by(slug: params[:id]) + end + + def new + @employer = Employer.new + @employer.build_plan_with_default_benefits + @plan_templates = IdCardBenefitsTemplate.where.not(title: "BLANK") + render :new + end + + def import + word_doc = params[:employer][:import_from_word] + @plan_templates = IdCardBenefitsTemplate.where.not(title: "BLANK") + if word_doc.present? && word_doc.is_a?(ActionDispatch::Http::UploadedFile) + @employer = BenefitsWordDocProcessor.new(word_doc.tempfile).call + else + @employer = Employer.new + @employer.build_plan_with_default_benefits + end + render :new + 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 + @plan_templates = IdCardBenefitsTemplate.where.not(title: "BLANK") + render :new + end + end + + def edit + @employer = Employer.find_by(slug: params[:id]) + @plan_templates = IdCardBenefitsTemplate.where.not(title: "BLANK") + render :edit + # @resource = Resource.find(params[:id]) + end + + def update + puts "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + employer_params = Employer.permitted_params(params) + @employer = Employer.find(params[:id]) + + if @employer.update(employer_params) + puts "sucess" + redirect_to employer_path(@employer.slug), notice: 'Employer was successfully updated.' + else + puts "fail" + render :edit, status: :unprocessable_entity + end + + end + + def destroy + # @resource = Resource.find(params[:id]) + # @resource.destroy + # redirect_to resources_url, notice: 'Resource was successfully destroyed.' + end + + private + + # def process_logos(employer_setup_process_params) + # @uploaded_logos = [] + # employer_logo = employer_setup_process_params["employer_logo"] + # if employer_logo.present? && employer_logo.is_a?(ActionDispatch::Http::UploadedFile) + # filename = employer_logo.original_filename + # binary_data = employer_logo.read + # meme_type = Marcel::MimeType.for(employer_logo) + + # CardLogoFile.create( + # filename: filename, + # image_data: binary_data, + # content_type: meme_type, + # logo_type: "employer" + # ) + + # @uploaded_logos.push(filename) + # employer_setup_process_params["employer_logo"] = filename + # end + + # network_logos = employer_setup_process_params["alternate_network_logos_attributes"] + # if network_logos.present? + # network_logos.each do |alt| + + # network_logo = alt.last["network_logo"] + # if network_logo.present? && network_logo.is_a?(ActionDispatch::Http::UploadedFile) + # filename = network_logo.original_filename + # binary_data = network_logo.read + # meme_type = Marcel::MimeType.for(network_logo) + + # CardLogoFile.create( + # filename: filename, + # image_data: binary_data, + # content_type: meme_type, + # logo_type: "network" + # ) + + # @uploaded_logos.push(filename) + # end + # alt.last["network_logo"] = @uploaded_logos.last + # end + # end + # employer_setup_process_params + # end + + # def update_logos_with_employer_setup_information() + # @uploaded_logos.each do |logo| + # logo_file = CardLogoFile.find_by(filename: logo) + # if logo_file.present? && @employer.present? + # logo_file.employer_setup_process = @employer + # logo_file.save + # end + # end + + # end + + # def general_information_params + # params.require(:employer_setup_general_information_form).permit( + # :name, + # :employer_logo, + # :group_number, + # :dental, + # :pl_plan_key, + # :effect_date, + # :number_of_plans, + # :network, + # :number_of_additional_network_logos + # ) + # end + + # def plans_params + # params.require(:employer_setup_plans_form).permit( + # plans: permited_plans_keys, + # benefit_descs: benefit_sequence_keys + # ) + # end + + # def network_exceptions_params + # params.require(:employer_setup_network_exceptions_form).permit( + # network_exceptions: [:network_logo, exceptions: [:type, :value]], + # ) + # end + + # def form_for_step + # step_name = @top_form.current_step + # form_method = "EmployerSetup#{step_name.camelize}Form".constantize + # # puts "/////\\\\\\||||||" + # # puts session[:employer_setup_data] + # # puts session[:employer_setup_data]['employer_setup_process_id'] + # puts form_method + # form_method.new(session[:employer_setup_data]['employer_setup_process_id']) + # end + + # def process_step(step_name) + # @form_method = "EmployerSetup#{step_name.camelize}Form".constantize + # session_data_name = "#{step_name}_data" + # # puts "1--------------params----" + # # puts params + # # puts "8--------------session----" + # # puts session[:employer_setup_data] + # employer_setup_process_id = session[:employer_setup_data]['employer_setup_process_id'] + # # puts session[:employer_setup_data] + # puts "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + # puts params + # @form = @form_method.new(employer_setup_process_id, params) + # if @form.pl_plan_key.blank? + # @form.pl_plan_key = session[:employer_setup_data]['pl_plan_key'] + # end + # if @form.valid? && @form.save + # pl_plan_key = @top_form.pl_plan_key || @form.pl_plan_key + # # session[:employer_setup_data].merge!({current_step: step_name, pl_plan_key: pl_plan_key}) + # # form_fields = @form.attributes.merge!(global_params(step_name)) + # # session[:employer_setup_data][session_data_name] = form_fields + # # session[:employer_setup_data].merge!(global_params(step_name)) + # # puts session[:employer_setup_data][session_data_name] + # true + # else + # false + # end + # end + + # def step_params(step_name) + # form_name_sym = "employer_setup_#{step_name}_form".to_sym + # params.require(form_name_sym).permit(@form_method.permitted_params) + # end + + # def global_params(step_name) + # form_name_sym = "employer_setup_#{step_name}_form".to_sym + # params.require(form_name_sym).permit(EmployerSetupForm.permitted_params) + # end + + # def process_step(step_name) + # form_name = "employer_setup_#{step_name}_form".camelize.constantize + # form_params_name = "#{step_name}_params".to_sym + # allowed_params = [:general_information_params, :plans_params, :network_exceptions_params] + # if allowed_params.include?(form_params_name) + # form_params = send(form_params_name) + # @form = form_name.new(form_params) + # if @form.valid? + # session[:employer_setup_data]["#{step_name}_data"] = form_params + # true + # else + # false + # end + # end + # false + # end + + # def employer_setup_params + # params.require(:employer_setup_form).permit( + # :current_step, + # :name, + # :employer_logo, + # :group_number, + # :pl_plan_key, + # :effect_date, + # :number_of_plans, + # :network, + # :number_of_additional_network_logos, + # network_exceptions: [:network_logo, exceptions: [:type, :value]], + # plans: permited_plans_keys, + # benefit_descs: benefit_sequence_keys + # ) + # end + + # def benefit_sequence_keys + # (1..14).map { |i| i.to_s.to_sym } + # end + + # def permited_plans_keys + # benefit_sequence_keys.push(:plan_id) + # end + + # def plans_params + # plans_keys = params[:plans]&.keys || [] + + # plans_keys.each_with_object({}) do |key, hash| + # if key == 'benefit_descs' || key.match?(/^plan_\d$/) + # hash[key.to_sym] = permited_plan_param_list + # end + # end + # end + + # def permited_plan_param_list + # (1..14).map { |i| i.to_s.to_sym }.push(:plan_id) + # end +end diff --git a/app/controllers/sample_id_cards_controller.rb b/app/controllers/sample_id_cards_controller.rb new file mode 100644 index 0000000..4a08a7d --- /dev/null +++ b/app/controllers/sample_id_cards_controller.rb @@ -0,0 +1,25 @@ +class SampleIdCardsController < ApplicationController + + + def generate_sample + @employer = Employer.find_by(slug: params[:employer_slug]) + sample_cards_pdf = SampleCardGenerator.new(@employer).call + + send_data sample_cards_pdf.to_pdf, + filename: "#{@employer.name.parameterize(separator: "_")}_sample_cards_#{Date.today}.pdf", + type: "application/pdf", + disposition: 'attachment' + + end + + def generate_print + @employer = Employer.find_by(slug: params[:employer_slug]) + sample_cards_pdf = EmployerCardsGenerator.new(@employer).call + + send_data sample_cards_pdf.to_pdf, + filename: "#{@employer.name.parameterize(separator: "_")}_print_cards_#{Date.today}.pdf", + type: "application/pdf", + disposition: 'attachment' + + end +end \ No newline at end of file diff --git a/app/form_builders/tailwind_form_builder.rb b/app/form_builders/tailwind_form_builder.rb index 26e0b6f..d678454 100644 --- a/app/form_builders/tailwind_form_builder.rb +++ b/app/form_builders/tailwind_form_builder.rb @@ -36,6 +36,12 @@ class TailwindFormBuilder < ActionView::Helpers::FormBuilder labels + field end + def file_field(method, options = {}) + options[:class] = Array(options[:class]) << "block w-full px-1 py-[1px] text-sm text-gray-900 border border-gray-300 rounded-lg cursor-pointer bg-gray-50 dark:text-gray-400 focus:outline-none dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 file:mr-4 file:py-2 file:px-4 file:rounded-full file:border-0 file:text-sm file:font-semibold file:bg-blue-50 file:text-blue-700 hover:file:bg-blue-100" + # You can add more classes as needed for padding, margin, etc., e.g., p-2.5 + super(method, options) + end + private def text_like_field(field_method, object_method, options = {}) diff --git a/app/forms/employer_setup_plans_form.rb b/app/forms/employer_setup_plans_form.rb index 4f505bc..dbf596a 100644 --- a/app/forms/employer_setup_plans_form.rb +++ b/app/forms/employer_setup_plans_form.rb @@ -2,7 +2,7 @@ class EmployerSetupPlansForm include ActiveModel::Model include ActiveModel::Attributes - PLAN_COLORS = ['atmosphere', 'verdigris', 'cobalt', 'bluemana'] + PLAN_COLORS = ['atmosphere', 'verdigris', 'bluemana', 'cobalt'] attribute :plans, array: true, default: -> { [Plan.new] } attribute :pl_plan_key, :string diff --git a/app/javascript/controllers/add_alt_network_logo_controller.js b/app/javascript/controllers/add_alt_network_logo_controller.js index 78809f3..6edf386 100644 --- a/app/javascript/controllers/add_alt_network_logo_controller.js +++ b/app/javascript/controllers/add_alt_network_logo_controller.js @@ -16,6 +16,20 @@ export default class extends Controller { // this.containerTarget.insertAdjacentHTML("beforeend", content) } + remove(event) { + event.preventDefault(); + const wrapper = event.target.closest(".network-item"); + if (wrapper.dataset.newRecord === "true") { + wrapper.remove(); + } else { + wrapper.style.display = "none"; + const destroyInput = wrapper.querySelector("input[name*='[_destroy]']"); + if (destroyInput) { + destroyInput.value = "1"; + } + } + } + #updateTemplateNetwork() { const nextIndex = this.networkLogoTargets.length const num_of_colors = this.formColorValue.length diff --git a/app/javascript/controllers/add_plan_controller.js b/app/javascript/controllers/add_plan_controller.js index 6fbe2e6..86e94bd 100644 --- a/app/javascript/controllers/add_plan_controller.js +++ b/app/javascript/controllers/add_plan_controller.js @@ -17,6 +17,20 @@ export default class extends Controller { } + remove(event) { + event.preventDefault(); + const wrapper = event.target.closest(".plan-item"); + if (wrapper.dataset.newRecord === "true") { + wrapper.remove(); + } else { + wrapper.style.display = "none"; + const destroyInput = wrapper.querySelector("input[name*='[_destroy]']"); + if (destroyInput) { + destroyInput.value = "1"; + } + } + } + #updateTemplatePlan() { const nextIndex = this.planTargets.length const num_of_colors = this.formColorValue.length diff --git a/app/javascript/controllers/logo_upload_controller.js b/app/javascript/controllers/logo_upload_controller.js new file mode 100644 index 0000000..62d07f3 --- /dev/null +++ b/app/javascript/controllers/logo_upload_controller.js @@ -0,0 +1,119 @@ +import { Controller } from "@hotwired/stimulus"; + +export default class extends Controller { + static targets = ["preview", "previewContainer", "logoSelect", "logofield", "initialLogoFile"]; + + async connect() { + console.log(this.logofieldTarget.value) + if (this.logofieldTarget.value.includes("Logo.")) { + const response = await fetch(`/card_logo_files/${this.logofieldTarget.value}/image`); // Fetch the binary data + const blob = await response.blob(); + const objectUrl = URL.createObjectURL(blob); + this.previewTarget.src = objectUrl; + this.previewContainerTarget.classList.remove("hidden"); + } + // Remember to revoke the URL when the controller is disconnected if necessary + // this.disconnect = () => URL.revokeObjectURL(objectUrl); + } + + uploadLogo(event) { + console.log('in uploadLogo'); + event.preventDefault() + const file = event.target.files[0]; + if (!file) return; + + const logoType = event.params.type + + let newFileName = file.name + if (logoType == "network") { + console.log("n " + newFileName); + newFileName = this.determineNetworkFilename(file) + this.addOptionToSelect(newFileName) + } else if (logoType == "employer") { + newFileName = this.determineEmployerFilename(file) + this.logofieldTarget.value = newFileName; + } + + this.previewFile(file); + + // this.uploadLogoToServer(file); + + + } + + previewFile(file) { + console.log('in previewFile'); + const reader = new FileReader(); + reader.onload = (e) => { + this.previewTarget.src = e.target.result; + this.previewContainerTarget.classList.remove("hidden"); + }; + reader.readAsDataURL(file); + } + + async uploadLogoToServer(file) { + console.log('in uploadLogoToServer'); + const formData = new FormData(); + formData.append("card_logo_file[logo_file]", file); + formData.append("card_logo_file[logo_type]", "employer"); + + const csrfToken = document.querySelector("meta[name='csrf-token']").content; + + try { + const response = await fetch("/card_logo_files/", { + method: "POST", + headers: { + "X-CSRF-Token": csrfToken + }, + body: formData + }); + + if (response.ok) { + console.log('Upload successful!') + } else { + console.error("Failed to track event."); + } + } catch (error) { + console.error("Network error:", error); + } + } + + addOptionToSelect(name) { + const blankOptionIndex = 0; + const newOption = new Option(name, name, true, true) + + if (this.logoSelectTarget.options.length > blankOptionIndex + 1) { + this.logoSelectTarget.insertBefore(newOption, this.logoSelectTarget.options[blankOptionIndex + 1]); + } else { + this.logoSelectTarget.appendChild(newOption); + } + + this.logoSelectTarget.value = name; + } + + determineNetworkFilename(file) { + const fileExtension = file.name.split('.').pop(); + const primaryNetworkName = prompt("Enter the name for the primary network (Usually 'Cigna' or 'MedCost':"); + const secondaryNetworkName = prompt("Enter the name for the primary network (ex: Health Partners):"); + const logoFilename = this.titleizeText(primaryNetworkName).concat(this.titleizeText(secondaryNetworkName)).concat("Logo.").concat(fileExtension).replaceAll(' ', ''); + + return logoFilename + } + + determineEmployerFilename(file) { + const fileExtension = file.name.split('.').pop(); + const employerName = prompt("Enter the name for the new Employer (minus any 'The's, 'LLC', or 'Health Plan'):"); + const logoFilename = this.titleizeText(employerName).concat("Logo.").concat(fileExtension).replaceAll(' ', ''); + + return logoFilename + } + + titleizeText(text) { + const titleized = text.toLowerCase(); + + return titleized.replace(/(^|\s)\S/g, function(match) { + return match.toUpperCase(); + }); + } +} + diff --git a/app/models/alternative_network_logo.rb b/app/models/alternate_network_logo.rb similarity index 62% rename from app/models/alternative_network_logo.rb rename to app/models/alternate_network_logo.rb index c3d41ce..1d5097f 100644 --- a/app/models/alternative_network_logo.rb +++ b/app/models/alternate_network_logo.rb @@ -1,10 +1,10 @@ -class AlternativeNetworkLogo < ApplicationRecord - belongs_to :employer_setup_process +class AlternateNetworkLogo < ApplicationRecord + belongs_to :employer - before_save :process_network_logo + # before_save :process_network_logo def process_network_logo - unless self.network_logo.is_a?(String) + if self.network_logo.present? && !self.network_logo.is_a?(String) self.employer_setup_process.card_logo_files.new( filename: self.network_logo.filename, logo_type: 'network', diff --git a/app/models/application_record.rb b/app/models/application_record.rb index caaf180..3a835b7 100644 --- a/app/models/application_record.rb +++ b/app/models/application_record.rb @@ -3,5 +3,5 @@ class ApplicationRecord < ActiveRecord::Base primary_abstract_class - establish_connection :dev_tools + establish_connection :baclight end diff --git a/app/models/britton_web/sample_id_cards.rb b/app/models/britton_web/sample_id_cards.rb deleted file mode 100644 index 12957ec..0000000 --- a/app/models/britton_web/sample_id_cards.rb +++ /dev/null @@ -1,83 +0,0 @@ -module BrittonWeb - class SampleIdCards < BrittonWebRecord - - self.table_name = 'sample_id_cards' - - alias_attribute :id, :id - alias_attribute :full_name, :full_name - alias_attribute :family_id, :family_id - alias_attribute :primary_mb_member_key, :primary_mb_member_key - alias_attribute :employer_name, :employer_name - alias_attribute :pl_plan_key, :pl_plan_key -moved to esp/not used in template - alias_attribute :group_number, :group_number - alias_attribute :rx_group, :rx_group - alias_attribute :network_image, :network_image -moved to esp/not used in template - alias_attribute :medical_eff_date, :medical_eff_date - alias_attribute :provider_code, :provider_code - alias_attribute :provider_line_1, :provider_line_1 - alias_attribute :provider_line_2, :provider_line_2 - alias_attribute :provider_line_3, :provider_line_3 - alias_attribute :provider_line_4, :provider_line_4 - alias_attribute :provider_line_5, :provider_line_5 - alias_attribute :provider_line_6, :provider_line_6 - alias_attribute :provider_line_7, :provider_line_7 - alias_attribute :provider_line_8, :provider_line_8 - alias_attribute :provider_line_9, :provider_line_9 - alias_attribute :provider_line_10, :provider_line_10 - alias_attribute :provider_line_11, :provider_line_11 - alias_attribute :mail_to, :mail_to - dont need/not used in template - alias_attribute :claim_to_1, :claim_to_1 - alias_attribute :claim_to_2, :claim_to_2 - alias_attribute :claim_to_3, :claim_to_3 - alias_attribute :claim_to_4, :claim_to_4 - alias_attribute :claim_to_5, :claim_to_5 - alias_attribute :claim_to_6, :claim_to_6 - alias_attribute :claim_to_7, :claim_to_7 - alias_attribute :claim_to_8, :claim_to_8 - alias_attribute :claim_to_9, :claim_to_9 - alias_attribute :claim_to_10, :claim_to_10 - alias_attribute :claim_to_11, :claim_to_11 - alias_attribute :customer_service, :customer_service - alias_attribute :web_url, :web_url - alias_attribute :dependent_1, :dependent_1 - keep for now - alias_attribute :dependent_2, :dependent_2 - alias_attribute :dependent_3, :dependent_3 - alias_attribute :dependent_4, :dependent_4 - alias_attribute :dependent_5, :dependent_5 - alias_attribute :dependent_6, :dependent_6 - alias_attribute :dependent_7, :dependent_7 - alias_attribute :dependent_8, :dependent_8 - alias_attribute :benefit_desc_1, :benefit_desc_1 - alias_attribute :benefit_1, :benefit_1 - alias_attribute :benefit_desc_2, :benefit_desc_2 - alias_attribute :benefit_2, :benefit_2 - alias_attribute :benefit_desc_3, :benefit_desc_3 - alias_attribute :benefit_3, :benefit_3 - alias_attribute :benefit_desc_4, :benefit_desc_4 - alias_attribute :benefit_4, :benefit_4 - alias_attribute :benefit_desc_5, :benefit_desc_5 - alias_attribute :benefit_5, :benefit_5 - alias_attribute :benefit_desc_6, :benefit_desc_6 - alias_attribute :benefit_6, :benefit_6 - alias_attribute :benefit_desc_7, :benefit_desc_7 - alias_attribute :benefit_7, :benefit_7 - alias_attribute :benefit_desc_8, :benefit_desc_8 - alias_attribute :benefit_8, :benefit_8 - alias_attribute :benefit_desc_9, :benefit_desc_9 - alias_attribute :benefit_9, :benefit_9 - alias_attribute :benefit_desc_10, :benefit_desc_10 - alias_attribute :benefit_10, :benefit_10 - alias_attribute :benefit_desc_11, :benefit_desc_11 - alias_attribute :benefit_11, :benefit_11 - alias_attribute :benefit_desc_12, :benefit_desc_12 - alias_attribute :benefit_12, :benefit_12 - alias_attribute :benefit_desc_13, :benefit_desc_13 - alias_attribute :benefit_13, :benefit_13 - alias_attribute :benefit_desc_14, :benefit_desc_14 - alias_attribute :benefit_14, :benefit_14 - alias_attribute :created_at, :created_at - alias_attribute :updated_at, :updated_at - - - end -end \ No newline at end of file diff --git a/app/models/card_logo_file.rb b/app/models/card_logo_file.rb index e6d47d0..0f09caf 100644 --- a/app/models/card_logo_file.rb +++ b/app/models/card_logo_file.rb @@ -1,3 +1,4 @@ class CardLogoFile < ApplicationRecord - belongs_to :employer_setup_process, optional: true + has_many :employer_card_logos, dependent: :destroy + has_many :employers, through: :employer_card_logos end diff --git a/app/models/card_provider.rb b/app/models/card_provider.rb new file mode 100644 index 0000000..ff74ae6 --- /dev/null +++ b/app/models/card_provider.rb @@ -0,0 +1,3 @@ +class CardProvider < ApplicationRecord + has_many :employers +end diff --git a/app/models/card_rx.rb b/app/models/card_rx.rb new file mode 100644 index 0000000..e9bb94d --- /dev/null +++ b/app/models/card_rx.rb @@ -0,0 +1,3 @@ +class CardRx < ApplicationRecord + has_many :employers +end diff --git a/app/models/employer.rb b/app/models/employer.rb new file mode 100644 index 0000000..20a94e9 --- /dev/null +++ b/app/models/employer.rb @@ -0,0 +1,155 @@ +class Employer < ApplicationRecord + has_many :members + has_many :plans, dependent: :destroy + accepts_nested_attributes_for :plans, allow_destroy: true, reject_if: :all_blank + + has_many :alternate_network_logos, dependent: :destroy + accepts_nested_attributes_for :alternate_network_logos, allow_destroy: true, reject_if: :all_blank + + has_many :employer_card_logos, dependent: :destroy + accepts_nested_attributes_for :employer_card_logos + has_many :card_logo_files, through: :employer_card_logos + has_one :employer_brand_logo, -> { where(logo_type: 'employer') }, + class_name: 'EmployerCardLogo', + dependent: :destroy + has_one :employer_logo, through: :employer_brand_logo, source: :card_logo_file + + has_many :network_images, -> { where(logo_type: 'network') }, + class_name: 'EmployerCardLogo', + dependent: :destroy + has_many :network_logos, through: :network_images, source: :card_logo_file + + belongs_to :card_provider, optional: true + belongs_to :card_rx, optional: true + + scope :active, -> { where(active: true) } + scope :inactive, -> { where(active: false) } + + + + # before_save :process_employer_logo + # before_save :process_employer_logo, if: :employer_logo_filename_changed? + before_save :create_slug, if: :new_record? + after_save :process_employer_logo, if: :saved_change_to_employer_logo_filename? + + def process_employer_logo + # if self.employer_logo.present? && !self.employer_logo.is_a?(String) + # self.card_logo_files.new( + # filename: self.employer_logo.filename, + # logo_type: 'employer', + # image: self.employer_logo.data, + # pl_plan_key: self.pl_plan_key || "" + # ) + # end + if self.employer_logo_filename.present? && self.employer_logo_filename.is_a?(String) + image_file = CardLogoFile.find_by(filename: self.employer_logo_filename) + if image_file.present? + if self.employer_brand_logo.present? + self.employer_brand_logo.update(card_logo_file: image_file) + else + self.create_employer_brand_logo(card_logo_file: image_file, logo_type: 'employer') + end + end + + end + end + + def create_slug + self.slug = employer_trim_name(self.name).parameterize + end + + def name_to_logo_filename(extension) + self.employer_trim_name(self.name).titleize.gsub(/\s+/, '').concat('Logo').concat(extension.downcase) + end + + def employer_trim_name(name) + regex_source = Regexp.union(["health", "plan", "the", "inc", "llc"]).source + case_insensitive_regex = Regexp.new(regex_source, "i") + name.gsub(case_insensitive_regex, "").squish + end + + def self.permitted_params(params) + params.require(:employer).permit( + :name, + :group_number, + :pl_plan_key, + :effective_date, + :employer_logo_filename, + :network_provider, + :default_network_logo, + :single_card_template, + :card_provider_id, + :card_rx_id, + plans_attributes: [ + :id, + :title, + :pb_product_key, + :_destroy, + plan_benefits_attributes: [ + :id, + :benefit_desc, + :benefit, + :sequence, + :_destroy, + ] + ], + alternate_network_logos_attributes: [ + :id, + :network_logo, + :exception_type, + :exception_value, + :_destroy + ] + ) + end + + def save_to_prod + + VhcsRecord.transaction do + Vhcs::HlPlanCode.create!( + group_number: self.group_number, + medical_number: self.group_number, + dental_number: '', + plan_key: self.pl_plan_key, + effect_date: self.effective_date + ) + + # Replace fairos_info with template like for benefits + fairos_info = Vhcs::HlrxCrosRef.where(pl_plan_key: 52).first + 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, + pl_plan_key: self.pl_plan_key + ) + + self.plans.each_with_index do |plan, i| + plan.plan_benefits.each do |bene| + Vhcs::HlEgglestonCardBenefit.create!( + plan_id: plan.plan_id, + benefit_desc: bene.benefit_desc, + benefit: bene.benefit, + sequence: bene.sequence, + plan_key: self.pl_plan_key + ) + end + end + end + + end + + def build_plan_with_default_benefits(attributes = {}) + plan = plans.new(attributes) + benefits = IdCardBenefitsTemplate.find_by(title: "BLANK").id_card_benefits.sort_by(&:sequence) + benefits.each do |ben| + plan.plan_benefits.new(benefit_desc: ben.benefit_desc, sequence: ben.sequence) + end + plan + end + + private + + +end diff --git a/app/models/employer_card_logo.rb b/app/models/employer_card_logo.rb new file mode 100644 index 0000000..2aaf61e --- /dev/null +++ b/app/models/employer_card_logo.rb @@ -0,0 +1,5 @@ +class EmployerCardLogo < ApplicationRecord + belongs_to :employer + belongs_to :card_logo_file + +end diff --git a/app/models/employer_setup_process.rb b/app/models/employer_setup_process.rb index 041c706..e841088 100644 --- a/app/models/employer_setup_process.rb +++ b/app/models/employer_setup_process.rb @@ -2,15 +2,16 @@ class EmployerSetupProcess < ApplicationRecord has_many :plans, dependent: :destroy accepts_nested_attributes_for :plans, allow_destroy: true, reject_if: :all_blank - has_many :alternative_network_logos, dependent: :destroy - accepts_nested_attributes_for :alternative_network_logos, allow_destroy: true, reject_if: :all_blank + has_many :alternate_network_logos, dependent: :destroy + accepts_nested_attributes_for :alternate_network_logos, allow_destroy: true, reject_if: :all_blank has_many :card_logo_files - before_save :process_employer_logo + # before_save :process_employer_logo + before_save :create_slug, if: :new_record? def process_employer_logo - unless self.employer_logo.is_a?(String) + if self.employer_logo.present? && !self.employer_logo.is_a?(String) self.card_logo_files.new( filename: self.employer_logo.filename, logo_type: 'employer', @@ -20,6 +21,20 @@ class EmployerSetupProcess < ApplicationRecord end end + def create_slug + self.slug = employer_trimmed_name.parameterize + end + + def employer_name_to_logo_filename(extension) + self.employer_trimmed_name.titleize.gsub(/\s+/, '').concat('Logo').concat(extension.downcase) + end + + def employer_trimmed_name + regex_source = Regexp.union(["health", "plan", "the", "inc", "llc"]).source + case_insensitive_regex = Regexp.new(regex_source, "i") + self.employer_name.gsub(case_insensitive_regex, "").squish + end + def self.permitted_params(params) params.require(:employer_setup_process).permit( :employer_name, @@ -41,7 +56,7 @@ class EmployerSetupProcess < ApplicationRecord :_destroy, ] ], - alternative_network_logos_attributes: [ + alternate_network_logos_attributes: [ :id, :network_logo, :exception_type, @@ -51,4 +66,41 @@ class EmployerSetupProcess < ApplicationRecord ) end + def save_to_prod + + VhcsRecord.transaction do + Vhcs::HlPlanCode.create!( + group_number: self.group_number, + medical_number: self.group_number, + dental_number: '', + plan_key: self.pl_plan_key, + effect_date: self.effective_date + ) + + # Replace fairos_info with template like for benefits + fairos_info = Vhcs::HlrxCrosRef.where(pl_plan_key: 52).first + Vhcs::HlrxCrosRef.cdarreate!( + 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, + pl_plan_key: self.pl_plan_key + ) + + self.plans.each_with_index do |plan, i| + plan.plan_benefits.each do |bene| + Vhcs::HlEgglestonCardBenefit.create!( + plan_id: plan.plan_id, + benefit_desc: bene.benefit_desc, + benefit: bene.benefit, + sequence: bene.sequence, + plan_key: self.pl_plan_key + ) + end + end + end + + end + end diff --git a/app/models/member.rb b/app/models/member.rb new file mode 100644 index 0000000..66839bf --- /dev/null +++ b/app/models/member.rb @@ -0,0 +1,6 @@ +class Member < ApplicationRecord + belongs_to :plan + belongs_to :employer + + +end diff --git a/app/models/plan.rb b/app/models/plan.rb index 2f4dec1..d2937d7 100644 --- a/app/models/plan.rb +++ b/app/models/plan.rb @@ -1,15 +1,15 @@ class Plan < ApplicationRecord - belongs_to :employer_setup_process + belongs_to :employer has_many :plan_benefits, dependent: :destroy accepts_nested_attributes_for :plan_benefits, allow_destroy: true, reject_if: :all_blank - after_initialize :create_default_benefits, if: :new_record? + # after_initialize :create_default_benefits, if: :new_record? private - def create_default_benefits + def build_and_create_default_benefits benefits = IdCardBenefitsTemplate.find_by(title: "BLANK").id_card_benefits.sort_by(&:sequence) benefits.each do |ben| plan_benefits.new(benefit_desc: ben.benefit_desc, sequence: ben.sequence) diff --git a/app/models/sample_id_card.rb b/app/models/sample_id_card.rb new file mode 100644 index 0000000..ffa4e87 --- /dev/null +++ b/app/models/sample_id_card.rb @@ -0,0 +1,14 @@ +class SampleIdCard < 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] + + before_validation :assign_blank_strings_to_unassigned_params + + def assign_blank_strings_to_unassigned_params + STRING_ATTRIBUTES.each do |attr| + # Use the blank? method which checks for nil, false, empty, or whitespace strings + self[attr] = "" if self[attr].blank? + end + end + +end \ No newline at end of file diff --git a/app/models/vhcs/hlid_card_provider.rb b/app/models/vhcs/hlid_card_provider.rb index 7031f33..19b6ec0 100644 --- a/app/models/vhcs/hlid_card_provider.rb +++ b/app/models/vhcs/hlid_card_provider.rb @@ -1,7 +1,8 @@ module Vhcs - class HLIDCardProvider < VhcsRecord + class HlidCardProvider < VhcsRecord self.table_name = 'HLIDCardProvider' + self.primary_key = 'ProviderCode' alias_attribute :provider_code, :ProviderCode alias_attribute :provider_line_1, :ProviderLine1 @@ -36,12 +37,61 @@ module Vhcs alias_attribute :rx_contact, :RXContact alias_attribute :provider_lookup_1, :ProviderLookup1 alias_attribute :provider_lookup_2, :ProviderLookup2 - alias_attribute :precert1, :Precert1 - alias_attribute :precert2, :Precert2 - alias_attribute :precert3, :Precert3 - alias_attribute :precert4, :Precert4 - alias_attribute :precert5, :Precert5 - alias_attribute :precert6, :Precert6 + 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 :provider_line_12, :ProviderLine12 + alias_attribute :claim_to_12, :ClaimTo12 + + def attributes + rails_like = { + 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, + mail_to: self.mail_to, + mail_to_2: self.mail_to_2, + 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, + 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_10: self.claim_to_10, + claim_to_11: self.claim_to_11, + claim_to_12: self.claim_to_12, + 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_10: self.provider_line_10, + provider_line_11: self.provider_line_11, + provider_line_12: self.provider_line_12, + rx_group_id: self.rx_group_id, + rx_contact: self.rx_contact, + 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, + } + super.merge(rails_like) + end end diff --git a/app/models/vhcs/hlid_card_provider_old.rb b/app/models/vhcs/hlid_card_provider_old.rb new file mode 100644 index 0000000..99f61bc --- /dev/null +++ b/app/models/vhcs/hlid_card_provider_old.rb @@ -0,0 +1,48 @@ +module Vhcs + class HlidCardProvider < VhcsRecord + + self.table_name = 'HLIDCardProvider' + + 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 :mail_to, :MailTo + alias_attribute :mail_to_2, :MailTo2 + 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 :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_10, :ClaimTo10 + alias_attribute :claim_to_11, :ClaimTo11 + 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_10, :ProviderLine10 + alias_attribute :provider_line_11, :ProviderLine11 + alias_attribute :rx_group_id, :RXGroupId + alias_attribute :rx_contact, :RXContact + alias_attribute :provider_lookup_1, :ProviderLookup1 + alias_attribute :provider_lookup_2, :ProviderLookup2 + alias_attribute :precert1, :Precert1 + alias_attribute :precert2, :Precert2 + alias_attribute :precert3, :Precert3 + alias_attribute :precert4, :Precert4 + alias_attribute :precert5, :Precert5 + alias_attribute :precert6, :Precert6 + + + end +end \ No newline at end of file diff --git a/app/models/vhcs/hlrx_cros_ref.rb b/app/models/vhcs/hlrx_cros_ref.rb index e4c6326..0a872d1 100644 --- a/app/models/vhcs/hlrx_cros_ref.rb +++ b/app/models/vhcs/hlrx_cros_ref.rb @@ -10,6 +10,18 @@ module Vhcs alias_attribute :web_url, :WebUrl alias_attribute :pl_plan_key, :PLPlanKey + def attributes + rails_like = { + 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, + pl_plan_key: self.pl_plan_key, + } + super.merge(rails_like) + end + end end \ No newline at end of file diff --git a/app/models/vhcs/hlrx_cros_ref_old.rb b/app/models/vhcs/hlrx_cros_ref_old.rb new file mode 100644 index 0000000..e4c6326 --- /dev/null +++ b/app/models/vhcs/hlrx_cros_ref_old.rb @@ -0,0 +1,15 @@ +module Vhcs + class HlrxCrosRef < VhcsRecord + + self.table_name = 'HLRXCrosRef' + + 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 :pl_plan_key, :PLPlanKey + + + end +end \ No newline at end of file diff --git a/app/models/vhcs/pb_company_plans.rb b/app/models/vhcs/pb_company_plans.rb new file mode 100644 index 0000000..3c671fd --- /dev/null +++ b/app/models/vhcs/pb_company_plans.rb @@ -0,0 +1,23 @@ +module Vhcs + class PbCompanyPlans < VhcsRecord + + self.table_name = 'PBCompanyPlans' + + alias_attribute :pb_company_plan_key, :PBCompanyPlanKey + alias_attribute :company_pb_entity_key, :CompanyPBEntityKey + alias_attribute :pl_plan_key, :PLPlanKey + + + def attributes + rails_like = { + pb_company_plan_key: self.pb_company_plan_key, + company_pb_entity_key: self.company_pb_entity_key, + pl_plan_key: self.pl_plan_key, + } + super.merge(rails_like) + end + + + + end +end \ No newline at end of file diff --git a/app/models/vhcs/pb_entity.rb b/app/models/vhcs/pb_entity.rb new file mode 100644 index 0000000..cdf6b97 --- /dev/null +++ b/app/models/vhcs/pb_entity.rb @@ -0,0 +1,47 @@ +module Vhcs + class PbEntity < VhcsRecord + + self.table_name = 'PBEntity' + + alias_attribute :pb_entity_key, :PBEntityKey + alias_attribute :company_pb_entity_key, :CompanyPBEntityKey + alias_attribute :entity_type_id, :EntityTypeID + alias_attribute :prefix_id, :PrefixID + alias_attribute :first_name, :FirstName + alias_attribute :middle_name, :MiddleName + alias_attribute :last_name, :LastName + alias_attribute :suffix_id, :SuffixID + alias_attribute :title, :Title + alias_attribute :letter_tag_bit_flags, :LetterTagBitFlags + alias_attribute :when_last_changed, :WhenLastChanged + alias_attribute :who_last_changed, :WhoLastChanged + alias_attribute :full_name_last_name_first, :FullNameLastNameFirst + alias_attribute :alternate_key, :AlternateKey + + def attributes + rails_like = { + pb_entity_key: self.pb_entity_key, + company_pb_entity_key: self.company_pb_entity_key, + entity_type_id: self.entity_type_id, + prefix_id: self.prefix_id, + first_name: self.first_name, + middle_name: self.middle_name, + last_name: self.last_name, + suffix_id: self.suffix_id, + title: self.title, + letter_tag_bit_flags: self.letter_tag_bit_flags, + when_last_changed: self.when_last_changed, + who_last_changed: self.who_last_changed, + full_name_last_name_first: self.full_name_last_name_first, + alternate_key: self.alternate_key, + } + super.merge(rails_like) + end + + def full_name + [self.first_name, self.middle_name, self.last_name].join(" ").squish + end + + + end +end \ No newline at end of file diff --git a/app/models/vhcs/pb_product.rb b/app/models/vhcs/pb_product.rb new file mode 100644 index 0000000..5d9cc8b --- /dev/null +++ b/app/models/vhcs/pb_product.rb @@ -0,0 +1,57 @@ +module Vhcs + class PbProduct < VhcsRecord + + self.table_name = 'PBProduct' + + alias_attribute :pb_product_key, :PBProductKey + alias_attribute :pb_product_line_key, :PBProductLineKey + alias_attribute :target_entity_type_id, :TargetEntityTypeID + alias_attribute :company_pb_entity_key, :CompanyPBEntityKey + alias_attribute :full_description, :FullDescription + alias_attribute :column_description, :ColumnDescription + alias_attribute :short_description, :ShortDescription + alias_attribute :presentation_format_code, :PresentationFormatCode + alias_attribute :is_active, :IsActive + alias_attribute :used_for_hrafsa, :UsedForHRAFSA + alias_attribute :non_network_rx_coverage, :NonNetworkRxCoverage + alias_attribute :web_express_product_group_g_1_0, :WebExpressProductGroup_G10 + alias_attribute :web_express_description, :WebExpressDescription + alias_attribute :web_express_oe_processing_order, :WebExpressOEProcessingOrder + alias_attribute :participant_enrollee_type_bitmask, :ParticipantEnrolleeTypeBitmask + alias_attribute :invoice_group_g_1_2_7, :InvoiceGroup_G127 + alias_attribute :web_express_must_participate, :WebExpressMustParticipate + alias_attribute :suppress_optional_amount, :SuppressOptionalAmount + alias_attribute :suppress_coverage, :SuppressCoverage + alias_attribute :suppress_description, :SuppressDescription + alias_attribute :pb_product_enrollment_grouping_key, :PBProductEnrollmentGroupingKey + + def attributes + rails_like = { + pb_product_key: self.pb_product_key, + pb_product_line_key: self.pb_product_line_key, + target_entity_type_id: self.target_entity_type_id, + company_pb_entity_key: self.company_pb_entity_key, + full_description: self.full_description, + column_description: self.column_description, + short_description: self.short_description, + presentation_format_code: self.presentation_format_code, + is_active: self.is_active, + used_for_hrafsa: self.used_for_hrafsa, + non_network_rx_coverage: self.non_network_rx_coverage, + web_express_product_group_g_1_0: self.web_express_product_group_g_1_0, + web_express_description: self.web_express_description, + web_express_oe_processing_order: self.web_express_oe_processing_order, + participant_enrollee_type_bitmask: self.participant_enrollee_type_bitmask, + invoice_group_g_1_2_7: self.invoice_group_g_1_2_7, + web_express_must_participate: self.web_express_must_participate, + suppress_optional_amount: self.suppress_optional_amount, + suppress_coverage: self.suppress_coverage, + suppress_description: self.suppress_description, + pb_product_enrollment_grouping_key: self.pb_product_enrollment_grouping_key, + } + super.merge(rails_like) + end + + + end +end \ No newline at end of file diff --git a/app/models/vhcs/pb_product_participation.rb b/app/models/vhcs/pb_product_participation.rb new file mode 100644 index 0000000..5b35dbc --- /dev/null +++ b/app/models/vhcs/pb_product_participation.rb @@ -0,0 +1,55 @@ +module Vhcs + class PbProductParticipation < VhcsRecord + + self.table_name = 'PBProductParticipation' + + alias_attribute :pb_product_participation_key, :PBProductParticipationKey + alias_attribute :pb_affiliation_key, :PBAffiliationKey + alias_attribute :pb_product_availability_key, :PBProductAvailabilityKey + alias_attribute :coverage_type_code, :CoverageTypeCode + alias_attribute :optional_amount, :OptionalAmount + alias_attribute :in_effect, :InEffect + alias_attribute :out_of_effect, :OutOfEffect + alias_attribute :in_effect_reason_code, :InEffectReasonCode + alias_attribute :out_of_effect_reason_code, :OutOfEffectReasonCode + alias_attribute :when_last_changed, :WhenLastChanged + alias_attribute :who_last_changed, :WhoLastChanged + alias_attribute :user_defined_rate_criteria_value_1, :UserDefinedRateCriteriaValue1 + alias_attribute :user_defined_rate_criteria_value_2, :UserDefinedRateCriteriaValue2 + alias_attribute :user_defined_rate_criteria_value_3, :UserDefinedRateCriteriaValue3 + alias_attribute :user_defined_rate_criteria_record_id_1, :UserDefinedRateCriteriaRecordID1 + alias_attribute :user_defined_rate_criteria_record_id_2, :UserDefinedRateCriteriaRecordID2 + alias_attribute :user_defined_rate_criteria_record_id_3, :UserDefinedRateCriteriaRecordID3 + alias_attribute :optional_amount_record_id, :OptionalAmountRecordID + alias_attribute :primary_pb_affiliation_key, :PrimaryPBAffiliationKey + alias_attribute :payment_type_record_id_g_1_7_7, :PaymentTypeRecordID_G177 + + def attributes + rails_like = { + pb_product_participation_key: self.pb_product_participation_key, + pb_affiliation_key: self.pb_affiliation_key, + pb_product_availability_key: self.pb_product_availability_key, + coverage_type_code: self.coverage_type_code, + optional_amount: self.optional_amount, + in_effect: self.in_effect, + out_of_effect: self.out_of_effect, + in_effect_reason_code: self.in_effect_reason_code, + out_of_effect_reason_code: self.out_of_effect_reason_code, + when_last_changed: self.when_last_changed, + who_last_changed: self.who_last_changed, + user_defined_rate_criteria_value_1: self.user_defined_rate_criteria_value_1, + user_defined_rate_criteria_value_2: self.user_defined_rate_criteria_value_2, + user_defined_rate_criteria_value_3: self.user_defined_rate_criteria_value_3, + user_defined_rate_criteria_record_id_1: self.user_defined_rate_criteria_record_id_1, + user_defined_rate_criteria_record_id_2: self.user_defined_rate_criteria_record_id_2, + user_defined_rate_criteria_record_id_3: self.user_defined_rate_criteria_record_id_3, + optional_amount_record_id: self.optional_amount_record_id, + primary_pb_affiliation_key: self.primary_pb_affiliation_key, + payment_type_record_id_g_1_7_7: self.payment_type_record_id_g_1_7_7, + } + super.merge(rails_like) + end + + + end +end \ No newline at end of file diff --git a/app/models/vhcs/vwmb_member.rb b/app/models/vhcs/vwmb_member.rb new file mode 100644 index 0000000..1eb66d0 --- /dev/null +++ b/app/models/vhcs/vwmb_member.rb @@ -0,0 +1,103 @@ +module Vhcs + class VwmbMember < VhcsRecord + + self.table_name = 'VWMBMember' + + alias_attribute :mb_member_key, :MBMemberKey + alias_attribute :pb_entity_key, :PBEntityKey + alias_attribute :pl_plan_key, :PLPlanKey + alias_attribute :mbr_class, :MbrClass + alias_attribute :mbr_type, :MbrType + alias_attribute :mbr_ap_vendor_key, :MbrAPVendorKey + alias_attribute :alt_ap_vendor_key, :AltAPVendorKey + alias_attribute :use_alt_payee, :UseAltPayee + alias_attribute :send_eob_primary, :SendEOBPrimary + alias_attribute :send_eob_dependent, :SendEOBDependent + alias_attribute :send_eob_third_party, :SendEOBThirdParty + alias_attribute :student_flag, :StudentFlag + alias_attribute :disabled_dependent_flag, :DisabledDependentFlag + alias_attribute :is_restricted, :IsRestricted + alias_attribute :third_party_pb_entity_key, :ThirdPartyPBEntityKey + alias_attribute :user_def_1, :UserDef1 + alias_attribute :user_def_2, :UserDef2 + alias_attribute :family_id, :FamilyID + alias_attribute :sequence_number, :SequenceNumber + alias_attribute :enrollee_type_key, :EnrolleeTypeKey + alias_attribute :enrollee_type, :EnrolleeType + alias_attribute :enrollee_type_value_id, :EnrolleeTypeValueID + alias_attribute :sex_key, :SexKey + alias_attribute :use_primary_address, :UsePrimaryAddress + alias_attribute :birth_date, :BirthDate + alias_attribute :birth_sequence_number, :BirthSequenceNumber + alias_attribute :death_date, :DeathDate + alias_attribute :date_of_birth, :DateOfBirth + alias_attribute :date_of_death, :DateOfDeath + alias_attribute :social_security_number, :SocialSecurityNumber + alias_attribute :hipaaid, :HIPAAID + alias_attribute :company_pb_entity_key, :CompanyPBEntityKey + alias_attribute :entity_type_id, :EntityTypeID + alias_attribute :prefix_id, :PrefixID + alias_attribute :first_name, :FirstName + alias_attribute :middle_name, :MiddleName + alias_attribute :last_name, :LastName + alias_attribute :suffix_id, :SuffixID + alias_attribute :title, :Title + alias_attribute :letter_tag_bit_flags, :LetterTagBitFlags + alias_attribute :full_name_last_name_first, :FullNameLastNameFirst + alias_attribute :policy_number, :PolicyNumber + alias_attribute :send_eob_alt_payee, :SendEOBAltPayee + alias_attribute :send_eob_alt_payee_only, :SendEOBAltPayeeOnly + + def attributes + rails_like = { + mb_member_key: self.mb_member_key, + pb_entity_key: self.pb_entity_key, + pl_plan_key: self.pl_plan_key, + mbr_class: self.mbr_class, + mbr_type: self.mbr_type, + mbr_ap_vendor_key: self.mbr_ap_vendor_key, + alt_ap_vendor_key: self.alt_ap_vendor_key, + use_alt_payee: self.use_alt_payee, + send_eob_primary: self.send_eob_primary, + send_eob_dependent: self.send_eob_dependent, + send_eob_third_party: self.send_eob_third_party, + student_flag: self.student_flag, + disabled_dependent_flag: self.disabled_dependent_flag, + is_restricted: self.is_restricted, + third_party_pb_entity_key: self.third_party_pb_entity_key, + user_def_1: self.user_def_1, + user_def_2: self.user_def_2, + family_id: self.family_id, + sequence_number: self.sequence_number, + enrollee_type_key: self.enrollee_type_key, + enrollee_type: self.enrollee_type, + enrollee_type_value_id: self.enrollee_type_value_id, + sex_key: self.sex_key, + use_primary_address: self.use_primary_address, + birth_date: self.birth_date, + birth_sequence_number: self.birth_sequence_number, + death_date: self.death_date, + date_of_birth: self.date_of_birth, + date_of_death: self.date_of_death, + social_security_number: self.social_security_number, + hipaaid: self.hipaaid, + company_pb_entity_key: self.company_pb_entity_key, + entity_type_id: self.entity_type_id, + prefix_id: self.prefix_id, + first_name: self.first_name, + middle_name: self.middle_name, + last_name: self.last_name, + suffix_id: self.suffix_id, + title: self.title, + letter_tag_bit_flags: self.letter_tag_bit_flags, + full_name_last_name_first: self.full_name_last_name_first, + policy_number: self.policy_number, + send_eob_alt_payee: self.send_eob_alt_payee, + send_eob_alt_payee_only: self.send_eob_alt_payee_only, + } + super.merge(rails_like) + end + + + end +end \ No newline at end of file diff --git a/app/services/benefits_word_doc/map_employer_information.rb b/app/services/benefits_word_doc/map_employer_information.rb index 95b0e28..261897d 100644 --- a/app/services/benefits_word_doc/map_employer_information.rb +++ b/app/services/benefits_word_doc/map_employer_information.rb @@ -1,8 +1,8 @@ module BenefitsWordDoc class MapEmployerInformation - def initialize(process, word_doc_section) - @process = process + def initialize(employer, word_doc_section) + @employer = employer @word_doc_section = word_doc_section end @@ -13,21 +13,21 @@ module BenefitsWordDoc matching_field = search_fields.detect { |field| line.include?(field) } if matching_field field_mapping = mapping_hash[matching_field] - field_regex = field_mapping[:doc_to_process_regex] + field_regex = field_mapping[:doc_to_employer_regex] field_value = line.match(field_regex)[1].strip - process_field = field_mapping[:process_field] + employer_field = field_mapping[:employer_field] if field_mapping[:validation].present? validation_type = field_mapping[:validation] if send("is_#{validation_type}?".to_sym, field_value) - @process[process_field] = field_value + @employer[employer_field] = field_value end else - @process[process_field] = field_value + @employer[employer_field] = field_value end end end - @process.save + @employer end private @@ -35,25 +35,25 @@ module BenefitsWordDoc def mapping_hash { 'Employer Name' => { - process_field: :employer_name, + employer_field: :name, doc_field: 'Employer Name', doc_field_desc: 'Follows pattern - Employer Name:New Employer', - doc_to_process_regex: /.*:(.*)/, + doc_to_employer_regex: /.*:(.*)/, regex_desc: 'Grabs everything after colon' }, 'Group Number' => { - process_field: :group_number, + employer_field: :group_number, doc_field: 'Group Number', doc_field_desc: 'Follows pattern - Group Number:099999', - doc_to_process_regex: /.*:(.*)/, + doc_to_employer_regex: /.*:(.*)/, regex_desc: 'Grabs everything after colon', validation: 'number' }, 'Group Effective Date' => { - process_field: :effective_date, + employer_field: :effective_date, doc_field: 'Group Effective Date', doc_field_desc: 'Follows pattern - Group Effective Date:12/1/2025', - doc_to_process_regex: /.*:(.*)/, + doc_to_employer_regex: /.*:(.*)/, regex_desc: 'Grabs everything after colon', validation: 'date' } diff --git a/app/services/benefits_word_doc/map_employer_logo.rb b/app/services/benefits_word_doc/map_employer_logo.rb index bc8e2b3..2ed07cb 100644 --- a/app/services/benefits_word_doc/map_employer_logo.rb +++ b/app/services/benefits_word_doc/map_employer_logo.rb @@ -1,28 +1,78 @@ module BenefitsWordDoc class MapEmployerLogo - def initialize(process, word_doc) - @process = process + def initialize(employer, word_doc) + @employer = employer @word_doc = word_doc end def call - extracted_images = [] Zip::File.open(@word_doc) do |zip_file| - zip_file.each do |entry| - if entry.name.start_with?('word/media/') && !entry.directory? - filename = @process.employer_name.titleize.gsub(/\s+/, '').concat("Logo.png") - image_data = entry.get_input_stream.read - extracted_images << { filename: filename, data: image_data } + media_files = zip_file.select { |entry| entry.name.start_with?('word/media/') && !entry.directory? } + + if media_files.length > 1 + logo = media_files.last + file_extension = File.extname(logo.name) + meme_type = Marcel::MimeType.for(logo.get_input_stream) + image_binary = logo.get_input_stream.read + # image_binary = File.binread(logo.get_input_stream.read) + + filename = @employer.name_to_logo_filename(file_extension) + + logo = CardLogoFile.find_or_create_by(filename: filename) do |clf| + clf.image_data = image_binary + clf.content_type = meme_type + clf.logo_type = "employer" end + + # new_logo = CardLogoFile.create!( + # filename: filename, + # image_data: image_binary, + # content_type: meme_type, + # logo_type: "employer" + # ) + + image_io = StringIO.new(image_binary) + width, height = FastImage.size(image_io) + image_ratio = width.to_f / height + if (0.8..1.2).cover?(image_ratio) + @employer.single_card_template = "FairosRxIDCard-Half" + else + @employer.single_card_template = "FairosRxIDCard" + end + + @employer.employer_logo_filename = logo.filename end end - if extracted_images.length > 1 - employer_logo = extracted_images.last - @process.employer_logo = employer_logo[:filename] - # same file logic - end - @process.save + @employer end + + # def call + # extracted_images = [] + # Zip::File.open(@word_doc) do |zip_file| + # zip_file.each do |entry| + # if entry.name.start_with?('word/media/') && !entry.directory? + # file_extension = File.extname(entry.name) + # image_data = entry.get_input_stream.read + # extracted_images << { file_extension: file_extension, data: image_data } + # end + # end + # end + # if extracted_images.length > 1 + # logo = extracted_images.last + # filename = @employer.employer_name_to_logo_filename(logo[:file_extension]) + # employer_logo_binary = logo[:data] + + # new_logo = @employer.card_logo_files.create( + # filename: filename, + # image: employer_logo_binary, + # logo_type: "employer" + # ) + + # @employer.employer_logo = new_logo.filename + # # same file logic + # end + # @employer.save + # end end -end \ No newline at end of file +end diff --git a/app/services/benefits_word_doc/map_network_information.rb b/app/services/benefits_word_doc/map_network_information.rb new file mode 100644 index 0000000..7c49443 --- /dev/null +++ b/app/services/benefits_word_doc/map_network_information.rb @@ -0,0 +1,33 @@ +module BenefitsWordDoc + class MapNetworkInformation + + def initialize(employer, word_doc_section) + @employer = employer + @word_doc_section = word_doc_section + end + + def call + network_matches = [] + @word_doc_section.each do |line| + if network_matches.exclude?("Cigna") && line.match?(/cigna/i) + network_matches.push("Cigna") + elsif network_matches.exclude?("Medcost") && line.match?(/medcost/i) + network_matches.push("Medcost") + end + end + + if network_matches.length == 1 + network_provider = network_matches.first + @employer.network_provider = network_provider + @employer.default_network_logo = "#{network_provider}Logo.png" + provider_code = network_provider == "Cigna" ? "5" : "2" + @employer.card_provider = CardProvider.find_by(provider_code: provider_code) + @employer.card_rx = CardRx.find_by(web_url: "www.FairosRx.com") + end + + + @employer + end + + end +end \ No newline at end of file diff --git a/app/services/benefits_word_doc/map_plans_information.rb b/app/services/benefits_word_doc/map_plans_information.rb index 2c057bf..87534ea 100644 --- a/app/services/benefits_word_doc/map_plans_information.rb +++ b/app/services/benefits_word_doc/map_plans_information.rb @@ -1,8 +1,8 @@ module BenefitsWordDoc class MapPlansInformation - def initialize(process, word_doc_section) - @process = process + def initialize(employer, word_doc_section) + @employer = employer @word_doc_section = word_doc_section end @@ -11,132 +11,256 @@ module BenefitsWordDoc plans_indexes = @word_doc_section.each_index.select { |index| @word_doc_section[index].match?(/\d*\.?\d+k/i) } plans_indexes.each do |plan_index| - new_plan = @process.plans.create(title: @word_doc_section[plan_index]) + new_plan = @employer.build_plan_with_default_benefits(title: @word_doc_section[plan_index]) plan_lines = @word_doc_section.slice(plan_index + 1, 14) plan_lines.each_with_index do |line, i| - matching_field = search_fields.detect { |field| line.include?(field) } - if matching_field - puts matching_field - field_mapping = mapping_hash[matching_field] - field_regex = field_mapping[:doc_to_process_regex] - field_value = line.match(field_regex)[1].strip - process_benefit_desc_field = field_mapping[:process_benefit_desc_field] - puts process_benefit_desc_field - puts new_plan.plan_benefits.map { |b| b.benefit_desc} - new_benefit = new_plan.plan_benefits.find_by(benefit_desc: process_benefit_desc_field) - new_benefit.benefit = field_value - new_benefit.save + field_mapping = mapping_array[i] + field_regex = field_mapping[:doc_to_employer_regex] + if line.match(field_regex) + field_value = line.match(field_regex)[0].strip + elsif line.match(default_benefit_regex(field_mapping[:employer_benefit_desc_field])) + field_value = line.match(default_benefit_regex(field_mapping[:employer_benefit_desc_field]))[0].strip + else + field_value = line end + employer_benefit_desc_field = field_mapping[:employer_benefit_desc_field] + new_benefit = new_plan.plan_benefits[i] + new_benefit.benefit = field_value + + + # matching_field = search_fields.detect { |field| line.include?(field) } + # if matching_field + # field_mapping = mapping_hash[matching_field] + # 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 = "" + # end + # employer_benefit_desc_field = field_mapping[:employer_benefit_desc_field] + # new_benefit = new_plan.plan_benefits.find_by(benefit_desc: employer_benefit_desc_field) + # new_benefit.benefit = field_value + # new_benefit.save + # end end end - + @employer end private + def mapping_array + [ + { + employer_benefit_sequence: 1, + employer_benefit_desc_field: 'Primary Visit', + doc_field_desc: 'Follows pattern - Physician Visit$x,xxx', + doc_to_employer_regex: /\$.*/, + regex_desc: 'Grabs dollar sign and everything after' + }, + { + employer_benefit_sequence: 2, + employer_benefit_desc_field: 'Specialist Visit', + doc_field_desc: 'Follows pattern - Specialist Visit$x,xxx', + doc_to_employer_regex: /\$.*/, + regex_desc: 'Grabs dollar sign and everything after' + }, + { + employer_benefit_sequence: 3, + employer_benefit_desc_field: 'Urgent Care', + doc_field_desc: 'Follows pattern - Urgent Care$x,xxx', + doc_to_employer_regex: /\$.*/, + regex_desc: 'Grabs dollar sign and everything after' + }, + { + employer_benefit_sequence: 4, + employer_benefit_desc_field: 'INN–Ind Ded', + doc_field_desc: 'Follows pattern - Individual Deductible (in network )$x,xxx', + doc_to_employer_regex: /\$.*/, + regex_desc: 'Grabs dollar sign and everything after' + }, + { + employer_benefit_sequence: 5, + employer_benefit_desc_field: 'INN–Family Ded', + doc_field_desc: 'Follows pattern - Family Deductible(in network )$x,xxx', + doc_to_employer_regex: /\$.*/, + regex_desc: 'Grabs dollar sign and everything after' + }, + { + employer_benefit_sequence: 6, + employer_benefit_desc_field: 'OON–Ind Ded', + doc_field_desc: 'Follows pattern - Individual Deductible (out of network)$x,xxx', + doc_to_employer_regex: /\$.*/, + regex_desc: 'Grabs dollar sign and everything after' + }, + { + employer_benefit_sequence: 7, + employer_benefit_desc_field: 'OON–Family Ded', + doc_field_desc: 'Follows pattern - Family Deductible (out of network)$x,xxx', + doc_to_employer_regex: /\$.*/, + regex_desc: 'Grabs dollar sign and everything after' + }, + { + employer_benefit_sequence: 8, + employer_benefit_desc_field: 'Co-Insurance', + doc_field_desc: 'Follows pattern - Co-Insurance70%/30%', + doc_to_employer_regex: /(?<=Co-Insurance).*/, + regex_desc: 'Grabs everything after field name' + }, + { + employer_benefit_sequence: 9, + employer_benefit_desc_field: 'INN–Ind OOP', + doc_field_desc: 'Follows pattern - Out-of-Pocket(in network)$x,xxx', + doc_to_employer_regex: /\$.*/, + regex_desc: 'Grabs dollar sign and everything after' + }, + { + employer_benefit_sequence: 10, + employer_benefit_desc_field: 'INN–Family OOP', + doc_field_desc: 'Follows pattern - Out-of-Pocket Family(in network)$x,xxx', + doc_to_employer_regex: /\$.*/, + regex_desc: 'Grabs dollar sign and everything after' + }, + { + employer_benefit_sequence: 11, + employer_benefit_desc_field: 'OON–Ind OOP', + doc_field_desc: 'Follows pattern - Out-of-Pocket(out of network)$x,xxx', + doc_to_employer_regex: /\$.*/, + regex_desc: 'Grabs dollar sign and everything after' + }, + { + employer_benefit_sequence: 12, + employer_benefit_desc_field: 'OON–Family OOP', + doc_field_desc: 'Follows pattern - Out-of-Pocket Family (out of network)$x,xxx', + doc_to_employer_regex: /\$.*/, + regex_desc: 'Grabs dollar sign and everything after' + }, + { + employer_benefit_sequence: 13, + employer_benefit_desc_field: 'Emergency Room', + doc_field_desc: 'Follows pattern - Emergency RoomXxxxx', + doc_to_employer_regex: /(?<=Emergency Room).*/, + regex_desc: 'Grabs everything after field name' + }, + { + employer_benefit_sequence: 14, + employer_benefit_desc_field: 'Preventive Care', + doc_field_desc: 'Follows pattern - Preventive Care100%', + doc_to_employer_regex: /(?<=Preventive Care).*/, + regex_desc: 'Grabs everything after field name' + } + ] + end + def mapping_hash { 'Physician Visit' => { - process_field: :benefit, - process_benefit_desc_field: 'Primary Visit', + employer_benefit_sequence: 1, + employer_benefit_desc_field: 'Primary Visit', doc_field_desc: 'Follows pattern - Physician Visit$x,xxx', - doc_to_process_regex: /\$(.*)/, - regex_desc: 'Grabs everything after dollar sign' + doc_to_employer_regex: /\$.*/, + regex_desc: 'Grabs dollar sign and everything after' }, 'Specialist Visit' => { - process_field: :benefit, - process_benefit_desc_field: 'Specialist Visit', + employer_benefit_sequence: 2, + employer_benefit_desc_field: 'Specialist Visit', doc_field_desc: 'Follows pattern - Specialist Visit$x,xxx', - doc_to_process_regex: /\$(.*)/, - regex_desc: 'Grabs everything after dollar sign' + doc_to_employer_regex: /\$.*/, + regex_desc: 'Grabs dollar sign and everything after' }, 'Urgent Care' => { - process_field: :benefit, - process_benefit_desc_field: 'Urgent Care', + employer_benefit_sequence: 3, + employer_benefit_desc_field: 'Urgent Care', doc_field_desc: 'Follows pattern - Urgent Care$x,xxx', - doc_to_process_regex: /\$(.*)/, - regex_desc: 'Grabs everything after dollar sign' + doc_to_employer_regex: /\$.*/, + regex_desc: 'Grabs dollar sign and everything after' }, - 'Individual Deductible (in network )' => { - process_field: :benefit, - process_benefit_desc_field: 'INN–Ind Ded', + 'Individual Deductible' => { + employer_benefit_sequence: 4, + employer_benefit_desc_field: 'INN–Ind Ded', doc_field_desc: 'Follows pattern - Individual Deductible (in network )$x,xxx', - doc_to_process_regex: /\$(.*)/, - regex_desc: 'Grabs everything after dollar sign' + doc_to_employer_regex: /\$.*/, + regex_desc: 'Grabs dollar sign and everything after' }, - 'Family Deductible(in network )' => { - process_field: :benefit, - process_benefit_desc_field: 'INN–Family Ded', + 'Family Deductible' => { + employer_benefit_sequence: 5, + employer_benefit_desc_field: 'INN–Family Ded', doc_field_desc: 'Follows pattern - Family Deductible(in network )$x,xxx', - doc_to_process_regex: /\$(.*)/, - regex_desc: 'Grabs everything after dollar sign' + doc_to_employer_regex: /\$.*/, + regex_desc: 'Grabs dollar sign and everything after' }, - 'Individual Deductible (out of network)' => { - process_field: :benefit, - process_benefit_desc_field: 'OON–Ind Ded', + 'Individual Deductible' => { + employer_benefit_sequence: 6, + employer_benefit_desc_field: 'OON–Ind Ded', doc_field_desc: 'Follows pattern - Individual Deductible (out of network)$x,xxx', - doc_to_process_regex: /\$(.*)/, - regex_desc: 'Grabs everything after dollar sign' + doc_to_employer_regex: /\$.*/, + regex_desc: 'Grabs dollar sign and everything after' }, - 'Family Deductible (out of network)' => { - process_field: :benefit, - process_benefit_desc_field: 'OON–Family Ded', + 'Family Deductible' => { + employer_benefit_sequence: 7, + employer_benefit_desc_field: 'OON–Family Ded', doc_field_desc: 'Follows pattern - Family Deductible (out of network)$x,xxx', - doc_to_process_regex: /\$(.*)/, - regex_desc: 'Grabs everything after dollar sign' + doc_to_employer_regex: /\$.*/, + regex_desc: 'Grabs dollar sign and everything after' }, 'Co-Insurance' => { - process_field: :benefit, - process_benefit_desc_field: 'Co-Insurance', + employer_benefit_sequence: 8, + employer_benefit_desc_field: 'Co-Insurance', doc_field_desc: 'Follows pattern - Co-Insurance70%/30%', - doc_to_process_regex: /Co-Insurance(.*)/, + doc_to_employer_regex: /(?<=Co-Insurance).*/, regex_desc: 'Grabs everything after field name' }, - 'Out-of-Pocket(in network)' => { - process_field: :benefit, - process_benefit_desc_field: 'INN–Ind OOP', + 'Out-of-Pocket' => { + employer_benefit_sequence: 9, + employer_benefit_desc_field: 'INN–Ind OOP', doc_field_desc: 'Follows pattern - Out-of-Pocket(in network)$x,xxx', - doc_to_process_regex: /\$(.*)/, - regex_desc: 'Grabs everything after dollar sign' + doc_to_employer_regex: /\$.*/, + regex_desc: 'Grabs dollar sign and everything after' }, - 'Out-of-Pocket Family(in network)' => { - process_field: :benefit, - process_benefit_desc_field: 'INN–Family OOP', + 'Out-of-Pocket Family' => { + employer_benefit_sequence: 10, + employer_benefit_desc_field: 'INN–Family OOP', doc_field_desc: 'Follows pattern - Out-of-Pocket Family(in network)$x,xxx', - doc_to_process_regex: /\$(.*)/, - regex_desc: 'Grabs everything after dollar sign' + doc_to_employer_regex: /\$.*/, + regex_desc: 'Grabs dollar sign and everything after' }, - 'Out-of-Pocket(out of network)' => { - process_field: :benefit, - process_benefit_desc_field: 'OON–Ind OOP', + 'Out-of-Pocket' => { + employer_benefit_sequence: 11, + employer_benefit_desc_field: 'OON–Ind OOP', doc_field_desc: 'Follows pattern - Out-of-Pocket(out of network)$x,xxx', - doc_to_process_regex: /\$(.*)/, - regex_desc: 'Grabs everything after dollar sign' + doc_to_employer_regex: /\$.*/, + regex_desc: 'Grabs dollar sign and everything after' }, - 'Out-of-Pocket Family (out of network)' => { - process_field: :benefit, - process_benefit_desc_field: 'OON–Family OOP', + 'Out-of-Pocket Family' => { + employer_benefit_sequence: 12, + employer_benefit_desc_field: 'OON–Family OOP', doc_field_desc: 'Follows pattern - Out-of-Pocket Family (out of network)$x,xxx', - doc_to_process_regex: /\$(.*)/, - regex_desc: 'Grabs everything after dollar sign' + doc_to_employer_regex: /\$.*/, + regex_desc: 'Grabs dollar sign and everything after' }, 'Emergency Room' => { - process_field: :benefit, - process_benefit_desc_field: 'Emergency Room', + employer_benefit_sequence: 13, + employer_benefit_desc_field: 'Emergency Room', doc_field_desc: 'Follows pattern - Emergency RoomXxxxx', - doc_to_process_regex: /Emergency Room(.*)/, + doc_to_employer_regex: /(?<=Emergency Room).*/, regex_desc: 'Grabs everything after field name' }, 'Preventive Care' => { - process_field: :benefit, - process_benefit_desc_field: 'Preventive Care', + employer_benefit_sequence: 14, + employer_benefit_desc_field: 'Preventive Care', doc_field_desc: 'Follows pattern - Preventive Care100%', - doc_to_process_regex: /Preventive Care(.*)/, + doc_to_employer_regex: /(?<=Preventive Care).*/, regex_desc: 'Grabs everything after field name' }, } end + def default_benefit_regex(field) + /(?<=#{field}).*/ + end + def is_number?(string) true if Float(string) rescue false end diff --git a/app/services/benefits_word_doc_processor.rb b/app/services/benefits_word_doc_processor.rb index 9a32e29..895e2b2 100644 --- a/app/services/benefits_word_doc_processor.rb +++ b/app/services/benefits_word_doc_processor.rb @@ -1,11 +1,11 @@ class BenefitsWordDocProcessor - def initialize(word_doc, process=nil) + def initialize(word_doc, employer=nil) @word_doc = word_doc - if process - @process = process + if employer + @employer = employer else - @process = EmployerSetupProcess.new + @employer = Employer.new end end @@ -13,17 +13,19 @@ class BenefitsWordDocProcessor doc = Docx::Document.open(@word_doc) data_lines = doc.paragraphs.map { |p| p.to_s.squish }.reject!(&:empty?) - start_of_plans_index = data_lines.index { |s| s == 'Medical Plan'} + employer_information, plans_and_network = data_lines.split("Medical Plan") + plan_information, network_information = plans_and_network.split("Claims Submission") - employer_information = data_lines.slice(0, start_of_plans_index) - plan_information = data_lines.slice(start_of_plans_index + 1..) + # employer_information = data_lines.slice(0, start_of_plans_index) + # plan_information = data_lines.slice(start_of_plans_index + 1..) + # network_information = data_lines.slice(start_of_network_index + 1..) - BenefitsWordDoc::MapEmployerInformation.new(@process, employer_information).call - BenefitsWordDoc::MapEmployerLogo.new(@process, @word_doc).call - BenefitsWordDoc::MapPlansInformation.new(@process, plan_information).call + @employer = BenefitsWordDoc::MapEmployerInformation.new(@employer, employer_information).call + @employer = BenefitsWordDoc::MapEmployerLogo.new(@employer, @word_doc).call + @employer = BenefitsWordDoc::MapPlansInformation.new(@employer, plan_information).call + @employer = BenefitsWordDoc::MapNetworkInformation.new(@employer, network_information).call - - @process + @employer end diff --git a/app/services/benefits_word_doc_processor_old.rb b/app/services/benefits_word_doc_processor_old.rb index 7caf2c8..15c2f55 100644 --- a/app/services/benefits_word_doc_processor_old.rb +++ b/app/services/benefits_word_doc_processor_old.rb @@ -39,7 +39,7 @@ class BenefitsWordDocProcessorOld end elsif field_string.include?('Employer Name:') value = field_string.delete_prefix('Employer Name:').strip - @process.employer_name = value + @process.name = value elsif field_string.include?('Group Effective Date:') value = field_string.delete_prefix('Group Effective Date:').strip @process.effective_date = value @@ -59,7 +59,7 @@ class BenefitsWordDocProcessorOld end end if extracted_images.length > 1 - @process.employer_logo = @process.employer_name.titleize.gsub(/\s+/, '').concat("Logo.png") + @process.employer_logo = @process.name.titleize.gsub(/\s+/, '').concat("Logo.png") # same file logic end end diff --git a/app/services/employer_cards/data_formatter.rb b/app/services/employer_cards/data_formatter.rb new file mode 100644 index 0000000..52f3fa1 --- /dev/null +++ b/app/services/employer_cards/data_formatter.rb @@ -0,0 +1,121 @@ +module EmployerCards + class DataFormatter + + def initialize(employer) + @employer = employer + end + + def call + @members = @employer.members + @employer_cards = [] + + init_cards_and_set_member_fields + set_plan_fields + set_common_fields + + @employer_cards.each(&:save!) + + end + + private + + def set_common_fields + employer_attributes = { + employer_name: @employer.id_card_display_name, + group_number: @employer.group_number, + rx_group: @employer.rx_group_number + } + + rx_attributes = @employer.card_rx.attributes.with_indifferent_access.slice( + :customer_service, + :web_url + ) + + provider_attributes = @employer.card_provider.attributes.with_indifferent_access.slice( + :provider_line_1, :provider_line_2, :provider_line_3, :provider_line_4, :provider_line_5, :provider_line_6, + :provider_line_7, :provider_line_8, :provider_line_9, :provider_line_10, :provider_line_11, :provider_line_12, + :claim_to_1, :claim_to_2, :claim_to_3, :claim_to_4, :claim_to_5, :claim_to_6, + :claim_to_7, :claim_to_8, :claim_to_9, :claim_to_10, :claim_to_11, :claim_to_12 + ) + + selected_attributes = employer_attributes.merge(rx_attributes).merge(provider_attributes) + @employer_cards.each do |card| + card.assign_attributes(selected_attributes) + end + end + + def set_plan_fields + @employer.plans.each do |plan| + selected_attributes = {} + plan.plan_benefits.each do |bene| + selected_attributes["benefit_desc_#{bene.sequence}".to_sym] = bene.benefit_desc + selected_attributes["benefit_#{bene.sequence}".to_sym] = bene.benefit + end + @employer_cards.find_all { |card| card.plan_id == plan.id.to_s }.each do |card| + card.assign_attributes(selected_attributes) + end + end + end + + def init_cards_and_set_member_fields + @members.each do |me| + effect_date = determine_eff_date(me) + if effect_date + member_card = SampleIdCard.new() + selected_attributes = { + full_name: me.id_card_display_name, + primary_mb_member_key: me.mb_member_key, + family_id: me.family_id, + plan_id: me.plan_id, + medical_eff_date: effect_date.strftime("%m/%d/%Y") + + } + + member_card.assign_attributes(selected_attributes) + @employer_cards.push(member_card) + end + end + end + + # def set_network_fields + # selected_attributes = @employer.card_provider.attributes.with_indifferent_access.slice( + # :provider_line_1, :provider_line_2, :provider_line_3, :provider_line_4, :provider_line_5, :provider_line_6, + # :provider_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 + # ) + # @employer_cards.all do |card| + # card.assign_attributes(selected_attributes) + # end + # end + + # def set_rx_fields + # # fairos_information = Vhcs::HlrxCrosRef.where(pl_plan_key: 52).first + # selected_attributes = @employer.card_rx.attributes.with_indifferent_access.slice( + # :customer_service, + # :web_url + # ) + # @employer_cards.all do |card| + # card.assign_attributes(selected_attributes) + # end + # end + + def determine_eff_date(member) + + participation = Vhcs::PbProductParticipation.joins('INNER JOIN "PBCoveredEntities" ON "PBProductParticipation"."PBProductParticipationKey" = "PBCoveredEntities"."PBProductParticipationKey"').where('"PBCoveredEntities"."PBEntityKey" = ?', member.pb_entity_key).first + 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 set_dependent_fields + # Not needed for sample card + end + end +end \ No newline at end of file diff --git a/app/services/employer_cards/jasper_url_generator.rb b/app/services/employer_cards/jasper_url_generator.rb new file mode 100644 index 0000000..ae22c21 --- /dev/null +++ b/app/services/employer_cards/jasper_url_generator.rb @@ -0,0 +1,48 @@ +module EmployerCards + class JasperUrlGenerator + + def initialize(employer, family_id) + @family_id = family_id + @employer = employer + end + + def call + # @net_logo = determine_network_logo + card_front_url = URI::HTTP.build(url_components("Front")) + card_back_url = URI::HTTP.build(url_components("Back")) + + [card_front_url, card_back_url] + end + + private + + def determine_network_logo + # if @network_logos.length > 1 + # member_geographic_info = Vhcs::PbEntityAddress.joins("INNER JOIN vwMBMember ON PBEntityAddress.PBEntityKey = vwMBMember.PBEntityKey AND PBEntityAddress.AddressTypeID = 1137").where("vwMBMember.FamilyID = ?", @family_id).first + # @network_logos.where.not(default: true).each do |pnl| + # if member_geographic_info[pnl.exception_type] == pnl.exception_value + # return pnl.net_logo + # end + # end + # end + # @network_logos.find_by(default: true).net_logo + @employer.default_network_logo + end +# http://localhost:8080/trunk/PdfServlet?reportConn=BrittonConnect&id=&reportName=FairosRxSampleIDCard-Half&family_id=Classic%202K&employer_logo=BryanPestControl.jpeg&network_logo=CignaLogo.png&reportDir=secure/Documents&SUBREPORT_DIR=/&ImageDir=secure/Documents&netToken=3a4a8b03f4dfb0e6e3fc82dd369f70ef&FileType=PDF +# http://localhost:8080/trunk/PdfServlet?reportConn=BrittonConnect&id=&reportName=FairosRxSampleIDCard-Half&family_id=Classic%202K&employer_logo=BryanPestControl.jpeg&network_logo=CignaLogo.png&reportDir=secure/Documents&SUBREPORT_DIR=/&ImageDir=secure/Documents&netToken=3a4a8b03f4dfb0e6e3fc82dd369f70ef&FileType=PDF + def url_components(card_side) + if card_side == "Back" && @employer.single_card_template.include?("-Half") + template = @employer.single_card_template.gsub("-Half", "") + else + template = @employer.single_card_template + end + { + host: '10.41.1.115', + port: 8080, + path: '/trunk/PdfServlet', + query: "reportConn=BrittonConnect&id=&reportName=#{template}-#{card_side}-Print&family_id=#{@family_id}&employer_logo=#{@employer.employer_logo_filename}&network_logo=#{determine_network_logo}&reportDir=secure/Documents&SUBREPORT_DIR=/&ImageDir=secure/Documents&netToken=3a4a8b03f4dfb0e6e3fc82dd369f70ef&FileType=PDF" + } + end + + end +end \ No newline at end of file diff --git a/app/services/employer_cards_generator.rb b/app/services/employer_cards_generator.rb new file mode 100644 index 0000000..617cbc3 --- /dev/null +++ b/app/services/employer_cards_generator.rb @@ -0,0 +1,28 @@ +class EmployerCardsGenerator + + def initialize(employer) + @employer = employer + end + + def call + SampleIdCard.where(employer_name: @employer.id_card_display_name).destroy_all + EmployerCards::DataFormatter.new(@employer).call + + group_cards_pdf = CombinePDF.new + SampleIdCard.where(employer_name: @employer.id_card_display_name).each do |card| + urls = EmployerCards::JasperUrlGenerator.new(@employer, card.family_id).call + puts urls + card_front_pdf = SampleCard::JasperPdfGenerator.new(urls.first).call + card_back_pdf = SampleCard::JasperPdfGenerator.new(urls.last).call + + group_cards_pdf << card_front_pdf + group_cards_pdf << card_back_pdf + end + + # todays_date = DateTime.current.strftime('%Y%m%d%H%M%S') + # group_cards_pdf.save("tmp/#{@employer.name}_print_cards_#{todays_date}.pdf") + + group_cards_pdf + end + +end diff --git a/app/services/image_processor.rb b/app/services/image_processor.rb new file mode 100644 index 0000000..a14a61f --- /dev/null +++ b/app/services/image_processor.rb @@ -0,0 +1,27 @@ +class ImageProcessor + + def initialize(image_path, new_filename = nil) + @image_path = image_path + @new_filename = new_filename + end + + def call + + if @new_filename + filename = @new_filename + else + filename = File.basename(@image_path) + end + + binary_data = File.binread(@image_path) + # binary_data = File.open(@image_path, 'rb').read + meme_type = Marcel::MimeType.for Pathname.new(@image_path) + + CardLogoFile.create( + filename: filename, + image_data: binary_data, + content_type: meme_type, + logo_type: "network" + ) + end +end \ No newline at end of file diff --git a/app/services/sample_card/data_formatter.rb b/app/services/sample_card/data_formatter.rb index 3a63a6d..648043f 100644 --- a/app/services/sample_card/data_formatter.rb +++ b/app/services/sample_card/data_formatter.rb @@ -1,15 +1,16 @@ module SampleCard class DataFormatter - def initialize(process) - @process = process + def initialize(employer) + @employer = employer end def call - @sample_card = BrittonWeb::SampleIdCard.new() + @sample_card = SampleIdCard.new() - set_process_fields() + set_employer_fields() set_generic_fields() + set_rx_fields() set_network_fields() sample_cards = set_plan_fields() sample_cards.each(&:save!) @@ -18,13 +19,11 @@ module SampleCard private - def set_process_fields + def set_employer_fields selected_attributes = { - employer_name: @process.employer_name, - group_number: @process.group_number, - medical_eff_date: @process.effective_date, - network_image: @process.logo_filename, - status: "imported" + employer_name: @employer.name, + group_number: @employer.group_number || "999999", + medical_eff_date: @employer.effective_date } @sample_card.assign_attributes(selected_attributes) @@ -32,7 +31,7 @@ module SampleCard def set_plan_fields plans_sample_cards = [] - @process.plans.each do |plan| + @employer.plans.each do |plan| plan_sample_card = @sample_card.dup plan_sample_card.family_id = plan.title plan.plan_benefits.each do |bene| @@ -47,33 +46,34 @@ module SampleCard def set_generic_fields selected_attributes = { full_name: "JANE DOE", - primary_mb_member_key: "99999", - rx_group: "99999" + primary_mb_member_key: "888888", + rx_group: @employer.group_number || "999999" } @sample_card.assign_attributes(selected_attributes) end def set_network_fields - provider_code = @process.network_provider.includes?("Cigna") ? "5" : "2" - # if @process.network_provider.includes?("Cigna") - # provider_code = "5" - # network_image = "CignaLogo.png" - # else - # provider_code = "2" - # network_image = "Logo_MC_PMS.png" - # end - provider_information = Vhcs::HLIDCardProvider.find_by(provider_code: provider_code) - selected_attributes = provider_information.attributes.slice( + selected_attributes = @employer.card_provider.attributes.with_indifferent_access.slice( :provider_line_1, :provider_line_2, :provider_line_3, :provider_line_4, :provider_line_5, :provider_line_6, - :provider_line_7, :provider_line_8, :provider_line_9, :provider_line_10, :provider_line_11, + :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_7, :claim_to_8, :claim_to_9, :claim_to_10, :claim_to_11, :claim_to_12 ) @sample_card.assign_attributes(selected_attributes) end + def set_rx_fields + # fairos_information = Vhcs::HlrxCrosRef.where(pl_plan_key: 52).first + selected_attributes = @employer.card_rx.attributes.with_indifferent_access.slice( + :customer_service, + :web_url + ) + + @sample_card.assign_attributes(selected_attributes) + end + def set_dependent_fields # Not needed for sample card end diff --git a/app/services/sample_card/jasper_pdf_generator.rb b/app/services/sample_card/jasper_pdf_generator.rb index 214c4e1..edb0441 100644 --- a/app/services/sample_card/jasper_pdf_generator.rb +++ b/app/services/sample_card/jasper_pdf_generator.rb @@ -4,16 +4,12 @@ module SampleCard def initialize(jasper_url) @jasper_url = jasper_url end + def call response = HTTParty.get(@jasper_url) - card_pdf = CombinePDF.parse(response.body) - - # todays_date = Date.today.strftime("%m-%d-%Y") - # card_pdf.save("tmp/service_test_member_id_card_#{todays_date}.pdf") - - card_pdf + CombinePDF.parse(response.body) end diff --git a/app/services/sample_card/jasper_url_generator.rb b/app/services/sample_card/jasper_url_generator.rb index 0e23dfb..9ce88c7 100644 --- a/app/services/sample_card/jasper_url_generator.rb +++ b/app/services/sample_card/jasper_url_generator.rb @@ -1,19 +1,36 @@ module SampleCard class JasperUrlGenerator - def initialize(process, family_id) - @family_id = family_id - @process = process + def initialize(employer, plan_name) + @plan_name = plan_name + @employer = employer end def call - @net_logo = determine_network_logo + # @net_logo = determine_network_logo - URI::HTTPS.build(url_components) + URI::HTTP.build(url_components) end private + def determine_card_template + # if @network_logos.length > 1 + # member_geographic_info = Vhcs::PbEntityAddress.joins("INNER JOIN vwMBMember ON PBEntityAddress.PBEntityKey = vwMBMember.PBEntityKey AND PBEntityAddress.AddressTypeID = 1137").where("vwMBMember.FamilyID = ?", @family_id).first + # @network_logos.where.not(default: true).each do |pnl| + # if member_geographic_info[pnl.exception_type] == pnl.exception_value + # return pnl.net_logo + # end + # end + # end + # @network_logos.find_by(default: true).net_logo + if @employer.single_card_template.include?("Half") + "FairosRxSampleIDCard-Half-Display" + else + "FairosRxSampleIDCard-Display" + end + end + def determine_network_logo # if @network_logos.length > 1 # member_geographic_info = Vhcs::PbEntityAddress.joins("INNER JOIN vwMBMember ON PBEntityAddress.PBEntityKey = vwMBMember.PBEntityKey AND PBEntityAddress.AddressTypeID = 1137").where("vwMBMember.FamilyID = ?", @family_id).first @@ -24,14 +41,16 @@ module SampleCard # end # end # @network_logos.find_by(default: true).net_logo - @process.network_logo + @employer.default_network_logo end - +# http://localhost:8080/trunk/PdfServlet?reportConn=BrittonConnect&id=&reportName=FairosRxSampleIDCard-Half&family_id=Classic%202K&employer_logo=BryanPestControl.jpeg&network_logo=CignaLogo.png&reportDir=secure/Documents&SUBREPORT_DIR=/&ImageDir=secure/Documents&netToken=3a4a8b03f4dfb0e6e3fc82dd369f70ef&FileType=PDF +# http://localhost:8080/trunk/PdfServlet?reportConn=BrittonConnect&id=&reportName=FairosRxSampleIDCard-Half&family_id=Classic%202K&employer_logo=BryanPestControl.jpeg&network_logo=CignaLogo.png&reportDir=secure/Documents&SUBREPORT_DIR=/&ImageDir=secure/Documents&netToken=3a4a8b03f4dfb0e6e3fc82dd369f70ef&FileType=PDF def url_components { - host: 'www.dicins.com', - path: '/ReportServerDEV/PdfServlet', - query: "reportConn=BrittonWeb&id=&reportName=#{@process.card_template}&FamilyId=#{@family_id}&BackImage=c:/images/#{@net_logo}&reportDir=secure/Documents&SUBREPORT_DIR=/&ImageDir=secure/Documents&netToken=3a4a8b03f4dfb0e6e3fc82dd369f70ef&FileType=PDF" + host: '10.41.1.115', + port: 8080, + path: '/trunk/PdfServlet', + query: "reportConn=BrittonConnect&id=&reportName=#{determine_card_template}&family_id=#{@plan_name}&employer_logo=#{@employer.employer_logo_filename}&network_logo=#{determine_network_logo}&reportDir=secure/Documents&SUBREPORT_DIR=/&ImageDir=secure/Documents&netToken=3a4a8b03f4dfb0e6e3fc82dd369f70ef&FileType=PDF" } end diff --git a/app/services/sample_card_generator.rb b/app/services/sample_card_generator.rb new file mode 100644 index 0000000..b7cf2a8 --- /dev/null +++ b/app/services/sample_card_generator.rb @@ -0,0 +1,23 @@ +class SampleCardGenerator + + def initialize(employer) + @employer = employer + end + + def call + SampleIdCard.where(employer_name: @employer.name).destroy_all + SampleCard::DataFormatter.new(@employer).call + + group_sample_cards_pdf = CombinePDF.new + SampleIdCard.where(employer_name: @employer.name).each do |card| + url = SampleCard::JasperUrlGenerator.new(@employer, card.family_id).call + puts url + card_pdf = SampleCard::JasperPdfGenerator.new(url).call + + group_sample_cards_pdf << card_pdf + end + + group_sample_cards_pdf + end + +end diff --git a/app/services/sample_card_generator_local.rb b/app/services/sample_card_generator_local.rb new file mode 100644 index 0000000..43ab051 --- /dev/null +++ b/app/services/sample_card_generator_local.rb @@ -0,0 +1,26 @@ +class SampleCardGeneratorLocal + + def initialize(process) + @process = process + end + + def call + # SampleCard::DataFormatter.new(@process).call + + group_sample_cards_pdf = CombinePDF.new + SampleIdCard.where(employer_name: @process.employer_name).each do |card| + url = SampleCard::JasperUrlGenerator.new(@process, card.family_id).call + puts url + card_pdf = SampleCard::JasperPdfGenerator.new(url).call + + group_sample_cards_pdf << card_pdf + end + + + todays_date = DateTime.current.strftime('%Y%m%d%H%M%S') + group_sample_cards_pdf.save("tmp/#{@process.employer_name}_sample_cards_#{todays_date}.pdf") + + group_sample_cards_pdf + end + +end diff --git a/app/views/card_providers/_card_provider.html.erb b/app/views/card_providers/_card_provider.html.erb new file mode 100644 index 0000000..803fe01 --- /dev/null +++ b/app/views/card_providers/_card_provider.html.erb @@ -0,0 +1,166 @@ +
+
+ Provider code: + <%= card_provider.provider_code %> +
+
+ Provider line 1: + <%= card_provider.provider_line_1 %> +
+
+ Provider line 2: + <%= card_provider.provider_line_2 %> +
+
+ Provider line 3: + <%= card_provider.provider_line_3 %> +
+
+ Provider line 4: + <%= card_provider.provider_line_4 %> +
+
+ Provider line 5: + <%= card_provider.provider_line_5 %> +
+
+ Mail to: + <%= card_provider.mail_to %> +
+
+ Mail to 2: + <%= card_provider.mail_to_2 %> +
+
+ Contact line 1: + <%= card_provider.contact_line_1 %> +
+
+ Contact line 2: + <%= card_provider.contact_line_2 %> +
+
+ Contact line 3: + <%= card_provider.contact_line_3 %> +
+
+ Group number: + <%= card_provider.group_number %> +
+
+ Claim to 1: + <%= card_provider.claim_to_1 %> +
+
+ Claim to 2: + <%= card_provider.claim_to_2 %> +
+
+ Claim to 3: + <%= card_provider.claim_to_3 %> +
+
+ Claim to 4: + <%= card_provider.claim_to_4 %> +
+
+ Claim to 5: + <%= card_provider.claim_to_5 %> +
+
+ Claim to 6: + <%= card_provider.claim_to_6 %> +
+
+ Claim to 7: + <%= card_provider.claim_to_7 %> +
+
+ Claim to 8: + <%= card_provider.claim_to_8 %> +
+
+ Claim to 9: + <%= card_provider.claim_to_9 %> +
+
+ Claim to 10: + <%= card_provider.claim_to_10 %> +
+
+ Claim to 11: + <%= card_provider.claim_to_11 %> +
+
+ Provider line 6: + <%= card_provider.provider_line_6 %> +
+
+ Provider line 7: + <%= card_provider.provider_line_7 %> +
+
+ Provider line 8: + <%= card_provider.provider_line_8 %> +
+
+ Provider line 9: + <%= card_provider.provider_line_9 %> +
+
+ Provider line 10: + <%= card_provider.provider_line_10 %> +
+
+ Provider line 11: + <%= card_provider.provider_line_11 %> +
+
+ Rx group: + <%= card_provider.rx_group_id %> +
+
+ Rx contact: + <%= card_provider.rx_contact %> +
+
+ Provider lookup 1: + <%= card_provider.provider_lookup_1 %> +
+
+ Provider lookup 2: + <%= card_provider.provider_lookup_2 %> +
+
+ Precert 1: + <%= card_provider.precert_1 %> +
+
+ Precert 2: + <%= card_provider.precert_2 %> +
+
+ Precert 3: + <%= card_provider.precert_3 %> +
+
+ Precert 4: + <%= card_provider.precert_4 %> +
+
+ Precert 5: + <%= card_provider.precert_5 %> +
+
+ Precert 6: + <%= card_provider.precert_6 %> +
+
+ Provider line 12: + <%= card_provider.provider_line_12 %> +
+
+ Claim to 12: + <%= card_provider.claim_to_12 %> +
+
diff --git a/app/views/card_providers/_card_provider.json.jbuilder b/app/views/card_providers/_card_provider.json.jbuilder new file mode 100644 index 0000000..56ff947 --- /dev/null +++ b/app/views/card_providers/_card_provider.json.jbuilder @@ -0,0 +1,2 @@ +json.extract! card_provider, :id, :provider_code, :provider_line_1, :provider_line_2, :provider_line_3, :provider_line_4, :provider_line_5, :mail_to, :mail_to_2, :contact_line_1, :contact_line_2, :contact_line_3, :group_number, :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, :provider_line_6, :provider_line_7, :provider_line_8, :provider_line_9, :provider_line_10, :provider_line_11, :rx_group_id, :rx_contact, :provider_lookup_1, :provider_lookup_2, :precert_1, :precert_2, :precert_3, :precert_4, :precert_5, :precert_6, :provider_line_12, :claim_to_12, :created_at, :updated_at +json.url card_provider_url(card_provider, format: :json) diff --git a/app/views/card_providers/_form.html.erb b/app/views/card_providers/_form.html.erb new file mode 100644 index 0000000..2bc0e70 --- /dev/null +++ b/app/views/card_providers/_form.html.erb @@ -0,0 +1,222 @@ +<%= form_with(model: card_provider, class: "contents") do |form| %> + <% if card_provider.errors.any? %> +
+

<%= pluralize(card_provider.errors.count, "error") %> prohibited this card_provider from being saved:

+ + +
+ <% end %> + +
+ <%= form.label :provider_code %> + <%= form.text_field :provider_code, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:provider_code].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:provider_code].any?}] %> +
+ +
+ <%= form.label :provider_line_1 %> + <%= form.text_field :provider_line_1, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:provider_line_1].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:provider_line_1].any?}] %> +
+ +
+ <%= form.label :provider_line_2 %> + <%= form.text_field :provider_line_2, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:provider_line_2].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:provider_line_2].any?}] %> +
+ +
+ <%= form.label :provider_line_3 %> + <%= form.text_field :provider_line_3, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:provider_line_3].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:provider_line_3].any?}] %> +
+ +
+ <%= form.label :provider_line_4 %> + <%= form.text_field :provider_line_4, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:provider_line_4].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:provider_line_4].any?}] %> +
+ +
+ <%= form.label :provider_line_5 %> + <%= form.text_field :provider_line_5, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:provider_line_5].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:provider_line_5].any?}] %> +
+ +
+ <%= form.label :mail_to %> + <%= form.text_field :mail_to, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:mail_to].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:mail_to].any?}] %> +
+ +
+ <%= form.label :mail_to_2 %> + <%= form.text_field :mail_to_2, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:mail_to_2].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:mail_to_2].any?}] %> +
+ +
+ <%= form.label :contact_line_1 %> + <%= form.text_field :contact_line_1, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:contact_line_1].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:contact_line_1].any?}] %> +
+ +
+ <%= form.label :contact_line_2 %> + <%= form.text_field :contact_line_2, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:contact_line_2].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:contact_line_2].any?}] %> +
+ +
+ <%= form.label :contact_line_3 %> + <%= form.text_field :contact_line_3, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:contact_line_3].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:contact_line_3].any?}] %> +
+ +
+ <%= form.label :group_number %> + <%= form.text_field :group_number, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:group_number].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:group_number].any?}] %> +
+ +
+ <%= form.label :claim_to_1 %> + <%= form.text_field :claim_to_1, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:claim_to_1].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:claim_to_1].any?}] %> +
+ +
+ <%= form.label :claim_to_2 %> + <%= form.text_field :claim_to_2, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:claim_to_2].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:claim_to_2].any?}] %> +
+ +
+ <%= form.label :claim_to_3 %> + <%= form.text_field :claim_to_3, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:claim_to_3].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:claim_to_3].any?}] %> +
+ +
+ <%= form.label :claim_to_4 %> + <%= form.text_field :claim_to_4, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:claim_to_4].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:claim_to_4].any?}] %> +
+ +
+ <%= form.label :claim_to_5 %> + <%= form.text_field :claim_to_5, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:claim_to_5].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:claim_to_5].any?}] %> +
+ +
+ <%= form.label :claim_to_6 %> + <%= form.text_field :claim_to_6, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:claim_to_6].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:claim_to_6].any?}] %> +
+ +
+ <%= form.label :claim_to_7 %> + <%= form.text_field :claim_to_7, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:claim_to_7].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:claim_to_7].any?}] %> +
+ +
+ <%= form.label :claim_to_8 %> + <%= form.text_field :claim_to_8, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:claim_to_8].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:claim_to_8].any?}] %> +
+ +
+ <%= form.label :claim_to_9 %> + <%= form.text_field :claim_to_9, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:claim_to_9].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:claim_to_9].any?}] %> +
+ +
+ <%= form.label :claim_to_10 %> + <%= form.text_field :claim_to_10, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:claim_to_10].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:claim_to_10].any?}] %> +
+ +
+ <%= form.label :claim_to_11 %> + <%= form.text_field :claim_to_11, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:claim_to_11].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:claim_to_11].any?}] %> +
+ +
+ <%= form.label :provider_line_6 %> + <%= form.text_field :provider_line_6, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:provider_line_6].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:provider_line_6].any?}] %> +
+ +
+ <%= form.label :provider_line_7 %> + <%= form.text_field :provider_line_7, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:provider_line_7].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:provider_line_7].any?}] %> +
+ +
+ <%= form.label :provider_line_8 %> + <%= form.text_field :provider_line_8, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:provider_line_8].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:provider_line_8].any?}] %> +
+ +
+ <%= form.label :provider_line_9 %> + <%= form.text_field :provider_line_9, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:provider_line_9].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:provider_line_9].any?}] %> +
+ +
+ <%= form.label :provider_line_10 %> + <%= form.text_field :provider_line_10, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:provider_line_10].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:provider_line_10].any?}] %> +
+ +
+ <%= form.label :provider_line_11 %> + <%= form.text_field :provider_line_11, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:provider_line_11].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:provider_line_11].any?}] %> +
+ +
+ <%= form.label :rx_group_id %> + <%= form.text_field :rx_group_id, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:rx_group_id].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:rx_group_id].any?}] %> +
+ +
+ <%= form.label :rx_contact %> + <%= form.text_field :rx_contact, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:rx_contact].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:rx_contact].any?}] %> +
+ +
+ <%= form.label :provider_lookup_1 %> + <%= form.text_field :provider_lookup_1, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:provider_lookup_1].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:provider_lookup_1].any?}] %> +
+ +
+ <%= form.label :provider_lookup_2 %> + <%= form.text_field :provider_lookup_2, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:provider_lookup_2].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:provider_lookup_2].any?}] %> +
+ +
+ <%= form.label :precert_1 %> + <%= form.text_field :precert_1, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:precert_1].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:precert_1].any?}] %> +
+ +
+ <%= form.label :precert_2 %> + <%= form.text_field :precert_2, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:precert_2].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:precert_2].any?}] %> +
+ +
+ <%= form.label :precert_3 %> + <%= form.text_field :precert_3, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:precert_3].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:precert_3].any?}] %> +
+ +
+ <%= form.label :precert_4 %> + <%= form.text_field :precert_4, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:precert_4].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:precert_4].any?}] %> +
+ +
+ <%= form.label :precert_5 %> + <%= form.text_field :precert_5, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:precert_5].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:precert_5].any?}] %> +
+ +
+ <%= form.label :precert_6 %> + <%= form.text_field :precert_6, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:precert_6].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:precert_6].any?}] %> +
+ +
+ <%= form.label :provider_line_12 %> + <%= form.text_field :provider_line_12, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:provider_line_12].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:provider_line_12].any?}] %> +
+ +
+ <%= form.label :claim_to_12 %> + <%= form.text_field :claim_to_12, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_provider.errors[:claim_to_12].none?, "border-red-400 focus:outline-red-600": card_provider.errors[:claim_to_12].any?}] %> +
+ +
+ <%= form.submit class: "w-full sm:w-auto rounded-md px-3.5 py-2.5 bg-blue-600 hover:bg-blue-500 text-white inline-block font-medium cursor-pointer" %> +
+<% end %> diff --git a/app/views/card_providers/edit.html.erb b/app/views/card_providers/edit.html.erb new file mode 100644 index 0000000..98bc866 --- /dev/null +++ b/app/views/card_providers/edit.html.erb @@ -0,0 +1,10 @@ +<% content_for :title, "Editing card provider" %> + +
+

Editing card provider

+ + <%= render "form", card_provider: @card_provider %> + + <%= link_to "Show this card provider", @card_provider, class: "w-full sm:w-auto text-center mt-2 sm:mt-0 sm:ml-2 rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> + <%= link_to "Back to card providers", card_providers_path, class: "w-full sm:w-auto text-center mt-2 sm:mt-0 sm:ml-2 rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> +
diff --git a/app/views/card_providers/index.html.erb b/app/views/card_providers/index.html.erb new file mode 100644 index 0000000..f707e82 --- /dev/null +++ b/app/views/card_providers/index.html.erb @@ -0,0 +1,29 @@ +<% content_for :title, "Card providers" %> + +
+ <% if notice.present? %> +

<%= notice %>

+ <% end %> + +
+

Card providers

+ <%= link_to "New card provider", new_card_provider_path, class: "rounded-md px-3.5 py-2.5 bg-blue-600 hover:bg-blue-500 text-white block font-medium" %> +
+ +
+ <% if @card_providers.any? %> + <% @card_providers.each do |card_provider| %> +
+ <%= render card_provider %> +
+ <%= link_to "Show", card_provider, class: "w-full sm:w-auto text-center rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> + <%= link_to "Edit", edit_card_provider_path(card_provider), class: "w-full sm:w-auto text-center rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> + <%= button_to "Destroy", card_provider, method: :delete, class: "w-full sm:w-auto rounded-md px-3.5 py-2.5 text-white bg-red-600 hover:bg-red-500 font-medium cursor-pointer", data: { turbo_confirm: "Are you sure?" } %> +
+
+ <% end %> + <% else %> +

No card providers found.

+ <% end %> +
+
diff --git a/app/views/card_providers/index.json.jbuilder b/app/views/card_providers/index.json.jbuilder new file mode 100644 index 0000000..7f87ab3 --- /dev/null +++ b/app/views/card_providers/index.json.jbuilder @@ -0,0 +1 @@ +json.array! @card_providers, partial: "card_providers/card_provider", as: :card_provider diff --git a/app/views/card_providers/new.html.erb b/app/views/card_providers/new.html.erb new file mode 100644 index 0000000..f8fa63a --- /dev/null +++ b/app/views/card_providers/new.html.erb @@ -0,0 +1,9 @@ +<% content_for :title, "New card provider" %> + +
+

New card provider

+ + <%= render "form", card_provider: @card_provider %> + + <%= link_to "Back to card providers", card_providers_path, class: "w-full sm:w-auto text-center mt-2 sm:mt-0 sm:ml-2 rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> +
diff --git a/app/views/card_providers/show.html.erb b/app/views/card_providers/show.html.erb new file mode 100644 index 0000000..d30a151 --- /dev/null +++ b/app/views/card_providers/show.html.erb @@ -0,0 +1,15 @@ +<% content_for :title, "Showing card provider" %> + +
+ <% if notice.present? %> +

<%= notice %>

+ <% end %> + +

Showing card provider

+ + <%= render @card_provider %> + + <%= link_to "Edit this card provider", edit_card_provider_path(@card_provider), class: "w-full sm:w-auto text-center rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> + <%= link_to "Back to card providers", card_providers_path, class: "w-full sm:w-auto text-center mt-2 sm:mt-0 sm:ml-2 rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> + <%= button_to "Destroy this card provider", @card_provider, method: :delete, form_class: "sm:inline-block mt-2 sm:mt-0 sm:ml-2", class: "w-full rounded-md px-3.5 py-2.5 text-white bg-red-600 hover:bg-red-500 font-medium cursor-pointer", data: { turbo_confirm: "Are you sure?" } %> +
diff --git a/app/views/card_providers/show.json.jbuilder b/app/views/card_providers/show.json.jbuilder new file mode 100644 index 0000000..77700cb --- /dev/null +++ b/app/views/card_providers/show.json.jbuilder @@ -0,0 +1 @@ +json.partial! "card_providers/card_provider", card_provider: @card_provider diff --git a/app/views/card_rxes/_card_rx.html.erb b/app/views/card_rxes/_card_rx.html.erb new file mode 100644 index 0000000..a4095de --- /dev/null +++ b/app/views/card_rxes/_card_rx.html.erb @@ -0,0 +1,14 @@ +
+
+ Help desk: + <%= card_rx.help_desk %> +
+
+ Customer service: + <%= card_rx.customer_service %> +
+
+ Web url: + <%= card_rx.web_url %> +
+
diff --git a/app/views/card_rxes/_card_rx.json.jbuilder b/app/views/card_rxes/_card_rx.json.jbuilder new file mode 100644 index 0000000..8c3ac9c --- /dev/null +++ b/app/views/card_rxes/_card_rx.json.jbuilder @@ -0,0 +1,2 @@ +json.extract! card_rx, :id, :help_desk, :customer_service, :web_url, :created_at, :updated_at +json.url card_rx_url(card_rx, format: :json) diff --git a/app/views/card_rxes/_form.html.erb b/app/views/card_rxes/_form.html.erb new file mode 100644 index 0000000..d9c414b --- /dev/null +++ b/app/views/card_rxes/_form.html.erb @@ -0,0 +1,32 @@ +<%= form_with(model: card_rx, class: "contents") do |form| %> + <% if card_rx.errors.any? %> +
+

<%= pluralize(card_rx.errors.count, "error") %> prohibited this card_rx from being saved:

+ + +
+ <% end %> + +
+ <%= form.label :help_desk %> + <%= form.text_field :help_desk, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_rx.errors[:help_desk].none?, "border-red-400 focus:outline-red-600": card_rx.errors[:help_desk].any?}] %> +
+ +
+ <%= form.label :customer_service %> + <%= form.text_field :customer_service, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_rx.errors[:customer_service].none?, "border-red-400 focus:outline-red-600": card_rx.errors[:customer_service].any?}] %> +
+ +
+ <%= form.label :web_url %> + <%= form.text_field :web_url, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": card_rx.errors[:web_url].none?, "border-red-400 focus:outline-red-600": card_rx.errors[:web_url].any?}] %> +
+ +
+ <%= form.submit class: "w-full sm:w-auto rounded-md px-3.5 py-2.5 bg-blue-600 hover:bg-blue-500 text-white inline-block font-medium cursor-pointer" %> +
+<% end %> diff --git a/app/views/card_rxes/edit.html.erb b/app/views/card_rxes/edit.html.erb new file mode 100644 index 0000000..5af332e --- /dev/null +++ b/app/views/card_rxes/edit.html.erb @@ -0,0 +1,10 @@ +<% content_for :title, "Editing card rx" %> + +
+

Editing card rx

+ + <%= render "form", card_rx: @card_rx %> + + <%= link_to "Show this card rx", @card_rx, class: "w-full sm:w-auto text-center mt-2 sm:mt-0 sm:ml-2 rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> + <%= link_to "Back to card rxes", card_rxes_path, class: "w-full sm:w-auto text-center mt-2 sm:mt-0 sm:ml-2 rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> +
diff --git a/app/views/card_rxes/index.html.erb b/app/views/card_rxes/index.html.erb new file mode 100644 index 0000000..02ec42e --- /dev/null +++ b/app/views/card_rxes/index.html.erb @@ -0,0 +1,29 @@ +<% content_for :title, "Card rxes" %> + +
+ <% if notice.present? %> +

<%= notice %>

+ <% end %> + +
+

Card rxes

+ <%= link_to "New card rx", new_card_rx_path, class: "rounded-md px-3.5 py-2.5 bg-blue-600 hover:bg-blue-500 text-white block font-medium" %> +
+ +
+ <% if @card_rxes.any? %> + <% @card_rxes.each do |card_rx| %> +
+ <%= render card_rx %> +
+ <%= link_to "Show", card_rx, class: "w-full sm:w-auto text-center rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> + <%= link_to "Edit", edit_card_rx_path(card_rx), class: "w-full sm:w-auto text-center rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> + <%= button_to "Destroy", card_rx, method: :delete, class: "w-full sm:w-auto rounded-md px-3.5 py-2.5 text-white bg-red-600 hover:bg-red-500 font-medium cursor-pointer", data: { turbo_confirm: "Are you sure?" } %> +
+
+ <% end %> + <% else %> +

No card rxes found.

+ <% end %> +
+
diff --git a/app/views/card_rxes/index.json.jbuilder b/app/views/card_rxes/index.json.jbuilder new file mode 100644 index 0000000..25ff8ac --- /dev/null +++ b/app/views/card_rxes/index.json.jbuilder @@ -0,0 +1 @@ +json.array! @card_rxes, partial: "card_rxes/card_rx", as: :card_rx diff --git a/app/views/card_rxes/new.html.erb b/app/views/card_rxes/new.html.erb new file mode 100644 index 0000000..fe4fb52 --- /dev/null +++ b/app/views/card_rxes/new.html.erb @@ -0,0 +1,9 @@ +<% content_for :title, "New card rx" %> + +
+

New card rx

+ + <%= render "form", card_rx: @card_rx %> + + <%= link_to "Back to card rxes", card_rxes_path, class: "w-full sm:w-auto text-center mt-2 sm:mt-0 sm:ml-2 rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> +
diff --git a/app/views/card_rxes/show.html.erb b/app/views/card_rxes/show.html.erb new file mode 100644 index 0000000..d8fba66 --- /dev/null +++ b/app/views/card_rxes/show.html.erb @@ -0,0 +1,15 @@ +<% content_for :title, "Showing card rx" %> + +
+ <% if notice.present? %> +

<%= notice %>

+ <% end %> + +

Showing card rx

+ + <%= render @card_rx %> + + <%= link_to "Edit this card rx", edit_card_rx_path(@card_rx), class: "w-full sm:w-auto text-center rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> + <%= link_to "Back to card rxes", card_rxes_path, class: "w-full sm:w-auto text-center mt-2 sm:mt-0 sm:ml-2 rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium" %> + <%= button_to "Destroy this card rx", @card_rx, method: :delete, form_class: "sm:inline-block mt-2 sm:mt-0 sm:ml-2", class: "w-full rounded-md px-3.5 py-2.5 text-white bg-red-600 hover:bg-red-500 font-medium cursor-pointer", data: { turbo_confirm: "Are you sure?" } %> +
diff --git a/app/views/card_rxes/show.json.jbuilder b/app/views/card_rxes/show.json.jbuilder new file mode 100644 index 0000000..a3c698e --- /dev/null +++ b/app/views/card_rxes/show.json.jbuilder @@ -0,0 +1 @@ +json.partial! "card_rxes/card_rx", card_rx: @card_rx 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 7840037..3246b9c 100644 --- a/app/views/employer_setup/_alt_network_logo_fields.html.erb +++ b/app/views/employer_setup/_alt_network_logo_fields.html.erb @@ -1,9 +1,20 @@
- - No file chosen - <%= network_fields.file_field :network_logo, class: "hidden", id: "file_upload_input_NEW_RECORD", data: { add_alt_network_logo_target: "networkLogo" } %> +
+
+
+ <%= f.select :network_logo, options_for_select(CardLogoFile.where(logo_type: 'network').pluck(:filename).map { |fn| [fn, fn]}), { include_blank: "Select or Add Network Logo", class: "rounded-r-none" }, { data: { logo_upload_target: "logoSelect" }} %> +
+
+ +
+ +
+
+ <%= network_fields.file_field :network_logo_file, class: "hidden", id: "file_upload_input_NEW_RECORD", data: { add_alt_network_logo_target: "networkLogo", logo_upload_type_param: "network", action: "change->logo-upload#uploadLogo" }, direct_upload: true %>
@@ -12,26 +23,10 @@
<%= network_fields.text_field :exception_value, label: { text: "Exception Value" }, class: "w-full" %>
-
+
+
+
<%= network_fields.hidden_field :_destroy %> <%= button_tag "Remove", class: "cursor-pointer bg-deepcove hover:bg-brightlava text-xl font-bold text-NEXT_SECONDARY_COLOR hover:text-platinum py-1 px-2 font-semibold leading-tight rounded-lg border-3 border-NEXT_SECONDARY_COLOR w-full", data: { action: "add-alt-network-logo#remove" } %>
-
-
-<%= button_tag "Add an exception rule", class: "cursor-pointer bg-NEXT_COLOR hover:bg-NEXT_COLOR-tinted text-platinum text-lg font-bold py-2 px-4 rounded border border-platinum w-full", data: { action: "add-network-exception#add" } %> - \ No newline at end of file +
\ No newline at end of file diff --git a/app/views/employer_setup/_plan_benefit_only_fields.erb b/app/views/employer_setup/_plan_benefit_only_fields.erb index 095e7e7..fb17ad2 100644 --- a/app/views/employer_setup/_plan_benefit_only_fields.erb +++ b/app/views/employer_setup/_plan_benefit_only_fields.erb @@ -1,4 +1,4 @@
- <%= plan_benefits_fields.text_field :benefit, label: { text: "Benefit Value #{plan_benefits_fields.object.sequence}" }, data: { benefits_template_picker_target: "benefit", sequence: plan_benefits_fields.object.sequence}, class: "w-full" %> + <%= plan_benefits_fields.text_field :benefit, label: { text: "#{plan_benefits_fields.object.benefit_desc}" }, data: { benefits_template_picker_target: "benefit", sequence: plan_benefits_fields.object.sequence}, class: "w-full" %> <%= plan_benefits_fields.hidden_field :sequence %>
\ No newline at end of file diff --git a/app/views/employer_setup/_plan_benefits_fields.html.erb b/app/views/employer_setup/_plan_benefits_fields.html.erb index 7078c44..fcbe414 100644 --- a/app/views/employer_setup/_plan_benefits_fields.html.erb +++ b/app/views/employer_setup/_plan_benefits_fields.html.erb @@ -1,5 +1,5 @@ -
- <%= plan_benefits_fields.text_field :benefit, label: { text: "Benefit Value #{plan_benefits_fields.object.sequence}" }, data: { benefits_template_picker_target: "benefit", sequence: plan_benefits_fields.object.sequence}, class: "w-full" %> +
+ <%= plan_benefits_fields.text_field :benefit, label: { text: "#{plan_benefits_fields.object.benefit_desc}" }, data: { benefits_template_picker_target: "benefit", sequence: plan_benefits_fields.object.sequence}, class: "w-full" %> <%= plan_benefits_fields.hidden_field :benefit_desc %> <%= plan_benefits_fields.hidden_field :sequence %>
\ No newline at end of file diff --git a/app/views/employer_setup/_plan_fields.html.erb b/app/views/employer_setup/_plan_fields.html.erb index 5c07f92..4d10b03 100644 --- a/app/views/employer_setup/_plan_fields.html.erb +++ b/app/views/employer_setup/_plan_fields.html.erb @@ -1,11 +1,13 @@
<%= plan_fields.text_field :title, label: { text: "Plan Title" }, class: "w-full", data: { add_plan_target: "plan" } %>
-
- <%= plan_fields.text_field :plan_id, label: { text: "Plan Id" }, class: "w-full" %> -
-
- <%= f.select :template_id, options_from_collection_for_select(@plan_templates, :id, :title), { prompt: "Select Plan Template" }, { data: { action: "benefits-template-picker#fetchData" }} %> +<% if f.object.persisted? %> +
+ <%= plan_fields.text_field :plan_id, label: { text: "Plan Id" }, class: "w-full" %> +
+<% end %> +
+ <%= f.select :template_id, options_from_collection_for_select(@plan_templates, :id, :title), { prompt: "Select Plan Template", class: "w-full" }, { data: { action: "benefits-template-picker#fetchData" }} %>
diff --git a/app/views/employer_setup/employer_information.html.erb b/app/views/employer_setup/edit.html.erb similarity index 54% rename from app/views/employer_setup/employer_information.html.erb rename to app/views/employer_setup/edit.html.erb index 22cf2e6..be5ed88 100644 --- a/app/views/employer_setup/employer_information.html.erb +++ b/app/views/employer_setup/edit.html.erb @@ -1,38 +1,50 @@
-

New Employer Setup

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

Edit Employer

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

General Information

-
-
- <%= f.text_field :employer_name, label: { text: "Employer Name" }, class: "w-full" %> +
+
+
+
+ <%= f.text_field :employer_name, label: { text: "Employer Name" }, data: { logo_upload_target: "initialLogoFile" }, class: "w-full" %> +
+
+ <%= f.text_field :slug, label: { text: "Slug" }, class: "w-full" %> +
+
+ <%= f.text_field :group_number, label: { text: "Group/Medical Number" }, class: "w-full" %> +
+
+
+
+ <%= f.text_field :pl_plan_key, label: { text: "Pl Plan Key" }, class: "w-full" %> +
+
+ <%= f.text_field :effective_date, label: { text: "Effective Date" }, class: "w-full" %> +
+
+ <%= f.select :network_provider, options_for_select(["Cigna", "Medcost"]), label: { text: "Provider Network" }, class: "w-full" %> +
+
+
+
+ <%= f.text_field :employer_logo, data: { logo_upload_target: "logofield" }, class: "w-full rounded-r-none", readonly: true %> +
+
+ +
+ <%= f.file_field :add_or_update_logo, class: "hidden", id: "file_upload_input_employer", data: { logo_upload_target: "input", logo_upload_type_param: "employer", action: "change->logo-upload#uploadLogo" }, direct_upload: true %> +
+ +
+
-
- <%= f.text_field :group_number, label: { text: "Group/Medical Number" }, class: "w-full" %> -
-
-
-
- <%= f.text_field :pl_plan_key, label: { text: "Pl Plan Key" }, class: "w-full" %> -
-
- <%= f.text_field :effective_date, label: { text: "Effective Date" }, class: "w-full" %> -
-
-
-
- <%= f.select :network_provider, options_for_select(["Cigna", "Medcost"]), label: { text: "Provider Network" }, class: "w-full" %> -
-
-
- - No file chosen - <%= f.file_field :employer_logo, class: "hidden", id: "file_upload_input" %>
@@ -43,50 +55,24 @@
<% @employer_setup.plans.each_with_index do |plan, index| %> <%= f.fields_for :plans, plan, child_index: index do |plan_fields| %> - - <% if index == 0 %> -
-
">
-
-
-ml-[6px] z-2 w-full"> - <%= "Plan 1" %> -
- <%= render 'plan_fields', plan_fields: plan_fields, f: f, index: index %> -
-
- <%= plan_fields.fields_for :plan_benefits do |plan_benefits_fields| %> -
-
- <%= render 'plan_benefits_desc_fields', plan_benefits_fields: plan_benefits_fields %> -
-
- <%= render 'plan_benefit_only_fields', plan_benefits_fields: plan_benefits_fields %> -
- -
- <% end %> -
- <%= plan_fields.hidden_field :_destroy %> - <%= button_tag "Remove Plan 1", class: "cursor-pointer bg-deepcove hover:bg-brightlava text-xl font-bold text-copper hover:text-platinum py-2 px-4 font-semibold leading-tight rounded-lg border-3 border-copper w-full", data: { action: "add-plan#remove" } %> -
-
-
- <% else %> -
+
">
-ml-[6px] z-2 w-full"> <%= "Plan #{index + 1}" %>
<%= render 'plan_fields', plan_fields: plan_fields, f: f, index: index %> +
"> + Benefit Values +
+
ml-[3px]">
<%= plan_fields.fields_for :plan_benefits do |plan_benefits_fields| %> <%= render 'plan_benefits_fields', plan_benefits_fields: plan_benefits_fields %> <% end %>
<%= plan_fields.hidden_field :_destroy %> - <%= button_tag "Remove Plan #{index + 1}", class: "cursor-pointer bg-deepcove text-brightlava py-2 px-4 font-semibold leading-tight rounded border-3 border-#{EmployerSetupPlansForm::PLAN_COLORS[index]} w-full", data: { action: "add-plan#remove" } %> + <%= button_tag "Remove Plan #{index + 1}", class: "cursor-pointer bg-deepcove hover:bg-brightlava text-xl font-bold text-#{index % 2 == 1 ? 'bronze' : 'copper'} hover:text-platinum py-2 px-4 font-semibold leading-tight rounded-lg border-3 border-NEXT_SECONDARY_COLOR w-full", data: { action: "add-plan#remove" } %>
- <% end %> <% end %> <% end %> @@ -99,6 +85,10 @@ <%= "Plan NEW_PLAN" %>
<%= render 'plan_fields', plan_fields: plan_fields, f: f, index: "NEW_RECORD".to_i %> +
+ Benefit Values +
+
<%= plan_fields.fields_for :plan_benefits do |plan_benefits_fields| %> <%= render 'plan_benefits_fields', plan_benefits_fields: plan_benefits_fields %> <% end %> @@ -121,9 +111,9 @@ <%= button_tag "Add a Regional Logo", class: "cursor-pointer text-lg font-medium py-2 px-4 rounded w-1/7 h-75 my-8 text-[#E0E0E0] rounded-lg border border-[#C2C2C2] hover:shadow-[0_0_10px_3px_#93c5fd]", data: { action: "add-alt-network-logo#add", add_alt_network_logo_target: "button" } %>
diff --git a/app/views/employer_setup/index.html.erb b/app/views/employer_setup/index.html.erb new file mode 100644 index 0000000..5dbbcfb --- /dev/null +++ b/app/views/employer_setup/index.html.erb @@ -0,0 +1,10 @@ +
+

Employer Setups

+ <% plan_colors = EmployerSetupPlansForm::PLAN_COLORS.push('copper', 'bronze').shuffle %> + <% @employer_setups.each_with_index do |es, index| %> + <% item_color_index = index == 0 ? 0 : index % plan_colors.length %> +
"> + <%= es.employer_name %> +
+ <% end %> +
\ No newline at end of file diff --git a/app/views/employer_setup/new.html.erb b/app/views/employer_setup/new.html.erb new file mode 100644 index 0000000..7fabfb4 --- /dev/null +++ b/app/views/employer_setup/new.html.erb @@ -0,0 +1,130 @@ +
+
+

New Employer

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

General Information

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

Plans Information

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

Alternative Network Information

+
+
+
+
+ <%= button_tag "Add a Regional Logo", class: "cursor-pointer text-lg font-medium py-2 px-4 rounded w-1/7 h-55 my-8 text-[#E0E0E0] rounded-lg border border-[#C2C2C2] hover:shadow-[0_0_10px_3px_#93c5fd]", data: { action: "add-alt-network-logo#add", add_alt_network_logo_target: "button" } %> +
+ +
+
+ <%= f.submit "Submit" %> +
+
+ <% end %> +
diff --git a/app/views/employer_setup/show.html.erb b/app/views/employer_setup/show.html.erb new file mode 100644 index 0000000..e69de29 diff --git a/app/views/employers/_alt_network_logo_fields.html.erb b/app/views/employers/_alt_network_logo_fields.html.erb new file mode 100644 index 0000000..3246b9c --- /dev/null +++ b/app/views/employers/_alt_network_logo_fields.html.erb @@ -0,0 +1,32 @@ +
+
+
+
+ <%= f.select :network_logo, options_for_select(CardLogoFile.where(logo_type: 'network').pluck(:filename).map { |fn| [fn, fn]}), { include_blank: "Select or Add Network Logo", class: "rounded-r-none" }, { data: { logo_upload_target: "logoSelect" }} %> +
+
+ +
+ +
+
+ <%= network_fields.file_field :network_logo_file, class: "hidden", id: "file_upload_input_NEW_RECORD", data: { add_alt_network_logo_target: "networkLogo", logo_upload_type_param: "network", action: "change->logo-upload#uploadLogo" }, direct_upload: true %> +
+
+
+ <%= network_fields.select :exception_type, options_for_select(["Zip","State"]), label: { text: "Exception Type" }, prompt: "Select Type", class: "w-full" %> +
+
+ <%= network_fields.text_field :exception_value, label: { text: "Exception Value" }, class: "w-full" %> +
+
+
+
+ <%= network_fields.hidden_field :_destroy %> + <%= button_tag "Remove", class: "cursor-pointer bg-deepcove hover:bg-brightlava text-xl font-bold text-NEXT_SECONDARY_COLOR hover:text-platinum py-1 px-2 font-semibold leading-tight rounded-lg border-3 border-NEXT_SECONDARY_COLOR w-full", data: { action: "add-alt-network-logo#remove" } %> +
+
\ No newline at end of file diff --git a/app/views/employers/_first_plan_fields.html.erb b/app/views/employers/_first_plan_fields.html.erb new file mode 100644 index 0000000..5c36417 --- /dev/null +++ b/app/views/employers/_first_plan_fields.html.erb @@ -0,0 +1,23 @@ +
+ <%= plan_fields.fields_for :plan_benefits do |plan_benefits_fields| %> + <%= render 'plan_benefits_desc_fields', plan_benefits_fields: plan_benefits_fields %> + <% end %> +
+
+
rounded-bl-lg">
+
-ml-[6px] z-2 w-full"> + <%= "Plan #{i + 1}" %> +
+
+ <%= plan_fields.text_field :title, label: { text: "Plan Title" }, class: "w-full", data: { add_plan_target: "plan" } %> +
+
+ <%= plan_fields.text_field :plan_id, label: { text: "Plan Id" }, class: "w-full" %> +
+
+ <%= f.select :template_id, options_from_collection_for_select(@form.plan_templates, :id, :title), { prompt: "Select Plan Template" }, { data: { action: "benefits-template-picker#fetchData" }} %> +
+ <%= plan_fields.fields_for :plan_benefits do |plan_benefits_fields| %> + <%= render 'plan_benefits_fields', plan_benefits_fields: plan_benefits_fields %> + <% end %> +
\ No newline at end of file diff --git a/app/views/employers/_plan_benefit_only_fields.erb b/app/views/employers/_plan_benefit_only_fields.erb new file mode 100644 index 0000000..fb17ad2 --- /dev/null +++ b/app/views/employers/_plan_benefit_only_fields.erb @@ -0,0 +1,4 @@ +
+ <%= plan_benefits_fields.text_field :benefit, label: { text: "#{plan_benefits_fields.object.benefit_desc}" }, data: { benefits_template_picker_target: "benefit", sequence: plan_benefits_fields.object.sequence}, class: "w-full" %> + <%= plan_benefits_fields.hidden_field :sequence %> +
\ No newline at end of file diff --git a/app/views/employers/_plan_benefits_desc_fields.html.erb b/app/views/employers/_plan_benefits_desc_fields.html.erb new file mode 100644 index 0000000..65cbdca --- /dev/null +++ b/app/views/employers/_plan_benefits_desc_fields.html.erb @@ -0,0 +1,3 @@ +
+ <%= plan_benefits_fields.text_field :benefit_desc, label: { text: "Benefit Description #{plan_benefits_fields.object.sequence}" }, class: "w-full" %> +
\ No newline at end of file diff --git a/app/views/employers/_plan_benefits_fields.html.erb b/app/views/employers/_plan_benefits_fields.html.erb new file mode 100644 index 0000000..fcbe414 --- /dev/null +++ b/app/views/employers/_plan_benefits_fields.html.erb @@ -0,0 +1,5 @@ +
+ <%= plan_benefits_fields.text_field :benefit, label: { text: "#{plan_benefits_fields.object.benefit_desc}" }, data: { benefits_template_picker_target: "benefit", sequence: plan_benefits_fields.object.sequence}, class: "w-full" %> + <%= plan_benefits_fields.hidden_field :benefit_desc %> + <%= plan_benefits_fields.hidden_field :sequence %> +
\ No newline at end of file diff --git a/app/views/employers/_plan_fields.html.erb b/app/views/employers/_plan_fields.html.erb new file mode 100644 index 0000000..d7a5a35 --- /dev/null +++ b/app/views/employers/_plan_fields.html.erb @@ -0,0 +1,13 @@ +
+ <%= plan_fields.text_field :title, label: { text: "Plan Title" }, class: "w-full", data: { add_plan_target: "plan" } %> +
+<% if f.object.persisted? %> +
+ <%= plan_fields.text_field :pb_product_key, label: { text: "Plan Product Key" }, class: "w-full" %> +
+<% end %> +
+ <%= f.select :template_id, options_from_collection_for_select(@plan_templates, :id, :title), { prompt: "Select Plan Template", class: "w-full" }, { data: { action: "benefits-template-picker#fetchData" }} %> +
+ + diff --git a/app/views/employers/edit.html.erb b/app/views/employers/edit.html.erb new file mode 100644 index 0000000..9249e23 --- /dev/null +++ b/app/views/employers/edit.html.erb @@ -0,0 +1,126 @@ +
+

Edit Employer

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

General Information

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

Plans Information

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

Alternative Network Information

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

New Employer Setup

+

General Information

+ <%= form_with model: @form, url: employer_setup_index_path, local: true do |f| %> +
+
+
+ <%= f.text_field :name, label: { text: "Employer Name" }, class: "w-full" %> +
+
+ <%= f.text_field :group_number, label: { text: "Group/Medical Number" }, class: "w-full" %> +
+
+
+
+ <%= f.text_field :pl_plan_key, label: { text: "Pl Plan Key" }, class: "w-full" %> +
+
+ <%= f.text_field :effective_date, label: { text: "Effective Date" }, class: "w-full" %> +
+
+
+
+ <%= f.select :network, options_for_select(["Cigna", "Cigna+Regional", "Medcost"]), label: { text: "Provider Network" }, data: { controller: "form-toggle", action: "change->form-toggle#toggleDivs" }, class: "w-full" %> +
+
+
+ + No file chosen + <%= f.file_field :employer_logo, class: "hidden", id: "file_upload_input" %> +
+
+ <%= f.submit "Continue to Plans" %> +
+
+ <% end %> +
+ + + \ No newline at end of file diff --git a/app/views/employers/index.html.erb b/app/views/employers/index.html.erb new file mode 100644 index 0000000..0171c62 --- /dev/null +++ b/app/views/employers/index.html.erb @@ -0,0 +1,21 @@ +
+

Employers

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

In Process:

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

Live:

+ <% @employers.active.each_with_index do |es, index| %> + <% item_color_index = index == 0 ? 0 : index % plan_colors.length %> +
"> + <%= link_to es.name, employer_path(es.slug), class: "hover:text-atmosphere" %> +
+ <% end %> +
\ No newline at end of file diff --git a/app/views/employers/network_exceptions.html.erb b/app/views/employers/network_exceptions.html.erb new file mode 100644 index 0000000..f577c56 --- /dev/null +++ b/app/views/employers/network_exceptions.html.erb @@ -0,0 +1,68 @@ +
+

New Employer Setup

+

Provider Network

+ <%= form_with model: @form, url: employer_setup_index_path, local: true do |f| %> + +
+
+ <%= button_tag "Add a Regional Logo", class: "cursor-pointer text-lg font-medium py-2 px-4 rounded w-1/7 h-75 my-8 text-[#E0E0E0] rounded-lg border border-[#C2C2C2] hover:shadow-[0_0_10px_3px_#93c5fd]", data: { action: "add-alt-network-logo#add", add_alt_network_logo_target: "button" } %> +
+
+
+ <%= f.hidden_field :pl_plan_key, value: "fake" %> + <%= f.submit "Continue to Summary" %> +
+ + + + <% end %> +
+ + + + \ No newline at end of file diff --git a/app/views/employers/new.html.erb b/app/views/employers/new.html.erb new file mode 100644 index 0000000..3412b07 --- /dev/null +++ b/app/views/employers/new.html.erb @@ -0,0 +1,136 @@ +
+
+

New Employer

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

General Information

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

Plans Information

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

Alternative Network Information

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

New Employer Setup

+

Medical Plans

+
+ <%= form_with model: @form, url: employer_setup_index_path, local: true do |f| %> +
+
+
+ <%= f.fields_for :benefit_descs do |plan_benefit_fields| %> + <%= plan_benefit_fields.hidden_field :plan_id, value: "descriptions" %> + <% @form.benefits_template.each do |bene| %> +
+ <%= plan_benefit_fields.text_field "benefit_#{bene.sequence}", label: { text: "Benefit Description #{bene.sequence}" }, value: "#{bene.benefit_desc}", class: "w-full" %> +
+ <% end %> + <% end %> +
+ <% @form.plans.each_with_index do |plan, i| %> +
+
rounded-bl-lg">
+
-ml-[6px] z-2 w-full"> + <%= "Plan #{i + 1}" %> +
+ <%= f.fields_for :plans, index: i do |plan_fields| %> +
+ <%= plan_fields.text_field :plan_id, label: { text: "Plan Id" }, class: "w-full", data: { add_plan_target: "plan" } %> +
+
+ <%= f.select :template_id, options_from_collection_for_select(@form.plan_templates, :id, :title), { prompt: "Select Plan Template" }, { data: { action: "benefits-template-picker#fetchData" }} %> +
+ <% @form.benefits_template.each do |bene| %> +
+
+ <%= plan_fields.text_field "benefit_#{bene.sequence}", label: { text: "Benefit Value #{bene.sequence}" }, data: { benefits_template_picker_target: "benefit", sequence: "#{bene.sequence}"}, class: "w-full" %> +
+
+ <% end %> + <% end %> +
+ <% end %> + <%= button_tag "Add a Plan", class: "cursor-pointer text-2xl font-bold py-2 pr-6 mt-10 w-[calc(24%-1rem)] w-1/4 min-h-[940px] text-[#E0E0E0] rounded-lg font-medium border border-[#E0E0E0] bg-[#173057] hover:bg-transparent hover:shadow-[0_0_10px_3px_#93c5fd] transition-colors duration-150", data: { action: "add-plan#add", add_plan_target: "button" } %> + +
+
+
+ <%= f.submit "Continue to Provider Network" %> +
+ <% end %> +
+
diff --git a/app/views/employers/show.html.erb b/app/views/employers/show.html.erb new file mode 100644 index 0000000..dbc99f4 --- /dev/null +++ b/app/views/employers/show.html.erb @@ -0,0 +1,58 @@ +
+
+

<%= @employer.name %>

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

Employer Information

+
+
+
+

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

+

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

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

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

+ <% end %> +
+ └── Plans +
+ <% @employer.plans.pluck(:title).each do |plan_title| %> +
+ ├── <%= plan_title %> +
+ <% end %> +
+
+ <%= link_to 'Edit', edit_employer_path(@employer.slug), class: "hover:text-atmosphere" %> +

|

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

Actions

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

New Employer Setup

+

Summary

+ <%= form_with model: @form, url: employer_setup_index_path, local: true do |f| %> +
+ <%= f.submit "Submit" %> +
+ <% end %> +
\ No newline at end of file diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index c6c3cae..e2dd86b 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -9,13 +9,14 @@ <%= stylesheet_link_tag "application", "data-turbo-track": "reload" %> <%= javascript_importmap_tags %> +
-
-
+
+
<%= yield %>
diff --git a/app/views/welcome/tailwind_colors.html.erb b/app/views/welcome/tailwind_colors.html.erb index d0b01f8..37e5d80 100644 --- a/app/views/welcome/tailwind_colors.html.erb +++ b/app/views/welcome/tailwind_colors.html.erb @@ -14,4 +14,5 @@
co
co
co
+
co
diff --git a/config/database.yml b/config/database.yml index 2c403f9..ab607a7 100644 --- a/config/database.yml +++ b/config/database.yml @@ -19,14 +19,19 @@ default: &default # https://guides.rubyonrails.org/configuring.html#database-pooling pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> - development: - dev_tools: + baclight: <<: *default - host: db - database: dev_tools_dev - username: sa - password: Br1tt0nPassw0rd + # host: db + # database: dev_tools_dev + # username: sa + # password: Br1tt0nPassw0rd + host: 10.41.82.73 #Dev + port: 1433 + database: BrittonConnect + username: BSTI + password: BSTIBOY + tds_version: 7.3 vhcs: <<: *default # host: 10.41.82.72 #Prod diff --git a/config/initializers/rails_icons.rb b/config/initializers/rails_icons.rb new file mode 100644 index 0000000..260fa87 --- /dev/null +++ b/config/initializers/rails_icons.rb @@ -0,0 +1,25 @@ +RailsIcons.configure do |config| + config.default_library = "boxicons" + # config.default_variant = "" # Set a default variant for all libraries + + # Override Boxicons defaults + # config.libraries.boxicons.default_variant = "" # Set a default variant for Boxicons + # config.libraries.boxicons.exclude_variants = [] # Exclude specific variants + + # config.libraries.boxicons.solid.css = "size-6" + # config.libraries.boxicons.solid.data = {} + + # config.libraries.boxicons.regular.css = "size-6" + # config.libraries.boxicons.regular.data = {} + + # config.libraries.boxicons.logos.css = "size-6" + # config.libraries.boxicons.logos.data = {} + + # Override Lucide defaults + # config.libraries.lucide.default_variant = "" # Set a default variant for Lucide + # config.libraries.lucide.exclude_variants = [] # Exclude specific variants + + # config.libraries.lucide.outline.default.css = "size-6" + # config.libraries.lucide.outline.default.stroke_width = "1.5" + # config.libraries.lucide.outline.default.data = {} +end diff --git a/config/routes.rb b/config/routes.rb index 13cc9be..2e5e28e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,7 +1,25 @@ # frozen_string_literal: true Rails.application.routes.draw do - resources :employer_setup, only: [:new, :create, :edit, :update] + resources :card_rxes + resources :card_providers + resources :card_logo_files do + get 'image', on: :member, constraints: { id: /.*/ } + end + # resources :employer_setup + resources :employers do + collection do + post 'import' + end + end + + resources :sample_id_cards do + collection do + get 'generate_sample' + get 'generate_print' + end + end + get 'id_card_benefits_templates/get_template_benefits/:id', to: 'id_card_benefits_templates#get_template_benefits' # Reveal health status on /up that returns 200 if the app boots with no exceptions, otherwise 500. diff --git a/db/migrate/20251202140122_create_employer_setup_processes.rb b/db/migrate/20251202140122_create_employer_setup_processes.rb deleted file mode 100644 index 4949c3a..0000000 --- a/db/migrate/20251202140122_create_employer_setup_processes.rb +++ /dev/null @@ -1,16 +0,0 @@ -class CreateEmployerSetupProcesses < ActiveRecord::Migration[7.2] - def change - create_table :employer_setup_processes do |t| - t.string :employer_name - t.string :group_number - t.string :effect_date - t.string :logo_filename - t.string :form_method - t.string :status - t.string :current_step - - - t.timestamps - end - end -end diff --git a/db/migrate/20251202140122_create_employers.rb b/db/migrate/20251202140122_create_employers.rb new file mode 100644 index 0000000..052aa7d --- /dev/null +++ b/db/migrate/20251202140122_create_employers.rb @@ -0,0 +1,26 @@ +class CreateEmployers < ActiveRecord::Migration[7.2] + def change + create_table :employers do |t| + t.string :name + t.string :id_card_display_name + t.string :slug + t.string :pl_plan_key + t.integer :company_pb_entity_key + t.integer :plan_id + t.string :group_number + t.string :rx_group_number + t.string :effective_date + t.string :employer_logo_filename + t.string :network_provider + t.string :default_network_logo + t.string :single_card_template + t.string :multiple_card_template + t.boolean :active, default: false + + + + + t.timestamps + end + end +end diff --git a/db/migrate/20251202142443_create_plans.rb b/db/migrate/20251202142443_create_plans.rb index e333d80..5b19fd7 100644 --- a/db/migrate/20251202142443_create_plans.rb +++ b/db/migrate/20251202142443_create_plans.rb @@ -2,8 +2,8 @@ class CreatePlans < ActiveRecord::Migration[7.2] def change create_table :plans do |t| t.string :title - - t.references :employer_setup_process, null: false, foreign_key: true + t.integer :pb_product_key + t.references :employer, null: false, foreign_key: true t.timestamps end diff --git a/db/migrate/20251205091559_create_network_logos.rb b/db/migrate/20251205091559_create_network_logos.rb index 60695d7..9fa3a67 100644 --- a/db/migrate/20251205091559_create_network_logos.rb +++ b/db/migrate/20251205091559_create_network_logos.rb @@ -1,10 +1,10 @@ class CreateNetworkLogos < ActiveRecord::Migration[7.0] def change create_table :alternate_network_logos do |t| - t.string :network_logo + t.string :network_logo_filename t.string :exception_type t.string :exception_value - t.belongs_to :employer_setup_process, null: false, foreign_key: true + t.belongs_to :employer, null: false, foreign_key: true t.timestamps end diff --git a/db/migrate/20251205145750_create_card_logo_files.rb b/db/migrate/20251205145750_create_card_logo_files.rb index fc2bcb6..8278732 100644 --- a/db/migrate/20251205145750_create_card_logo_files.rb +++ b/db/migrate/20251205145750_create_card_logo_files.rb @@ -2,9 +2,10 @@ class CreateCardLogoFiles < ActiveRecord::Migration[7.2] def change create_table :card_logo_files do |t| t.string :filename + t.binary :image_data + t.string :content_type t.string :logo_type - t.binary :image - t.integer :pl_plan_key + t.boolean :active, default: false t.timestamps end diff --git a/db/migrate/20251206190810_create_sample_id_cards.rb b/db/migrate/20251206190810_create_sample_id_cards.rb new file mode 100644 index 0000000..47cc635 --- /dev/null +++ b/db/migrate/20251206190810_create_sample_id_cards.rb @@ -0,0 +1,79 @@ +class CreateSampleIdCards < ActiveRecord::Migration[7.0] + def change + create_table :sample_id_cards do |t| + t.string :full_name + t.string :family_id + t.string :primary_mb_member_key + t.string :employer_name + t.string :group_number + t.string :rx_group + t.string :medical_eff_date + t.string :provider_code + t.string :provider_line_1 + t.string :provider_line_2 + t.string :provider_line_3 + t.string :provider_line_4 + t.string :provider_line_5 + t.string :provider_line_6 + t.string :provider_line_7 + t.string :provider_line_8 + t.string :provider_line_9 + t.string :provider_line_10 + t.string :provider_line_11 + t.string :provider_line_12 + t.string :claim_to_1 + t.string :claim_to_2 + t.string :claim_to_3 + t.string :claim_to_4 + t.string :claim_to_5 + t.string :claim_to_6 + t.string :claim_to_7 + t.string :claim_to_8 + t.string :claim_to_9 + t.string :claim_to_10 + t.string :claim_to_11 + t.string :claim_to_12 + t.string :customer_service + t.string :web_url + 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 :plan_id + 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.timestamps + end + end +end diff --git a/db/migrate/20260107180344_create_employer_card_logos.rb b/db/migrate/20260107180344_create_employer_card_logos.rb new file mode 100644 index 0000000..c7bd394 --- /dev/null +++ b/db/migrate/20260107180344_create_employer_card_logos.rb @@ -0,0 +1,11 @@ +class CreateEmployerCardLogos < ActiveRecord::Migration[7.2] + def change + create_table :employer_card_logos do |t| + t.references :employer, null: false, foreign_key: true + t.references :card_logo_file, null: false, foreign_key: true + t.string :logo_type + + t.timestamps + end + end +end diff --git a/db/migrate/20260113144134_create_card_providers.rb b/db/migrate/20260113144134_create_card_providers.rb new file mode 100644 index 0000000..d72bd1d --- /dev/null +++ b/db/migrate/20260113144134_create_card_providers.rb @@ -0,0 +1,49 @@ +class CreateCardProviders < ActiveRecord::Migration[7.2] + def change + create_table :card_providers do |t| + t.string :provider_code + t.string :provider_line_1 + t.string :provider_line_2 + t.string :provider_line_3 + t.string :provider_line_4 + t.string :provider_line_5 + t.string :provider_line_6 + t.string :provider_line_7 + t.string :provider_line_8 + t.string :provider_line_9 + t.string :provider_line_10 + t.string :provider_line_11 + t.string :provider_line_12 + t.string :claim_to_1 + t.string :claim_to_2 + t.string :claim_to_3 + t.string :claim_to_4 + t.string :claim_to_5 + t.string :claim_to_6 + t.string :claim_to_7 + t.string :claim_to_8 + t.string :claim_to_9 + t.string :claim_to_10 + t.string :claim_to_11 + t.string :claim_to_12 + t.string :mail_to + t.string :mail_to_2 + t.string :contact_line_1 + t.string :contact_line_2 + t.string :contact_line_3 + t.string :group_number + t.string :rx_group_id + t.string :rx_contact + t.string :provider_lookup_1 + t.string :provider_lookup_2 + t.string :precert_1 + t.string :precert_2 + t.string :precert_3 + t.string :precert_4 + t.string :precert_5 + t.string :precert_6 + + t.timestamps + end + end +end diff --git a/db/migrate/20260113152220_create_card_rxes.rb b/db/migrate/20260113152220_create_card_rxes.rb new file mode 100644 index 0000000..6f83b1f --- /dev/null +++ b/db/migrate/20260113152220_create_card_rxes.rb @@ -0,0 +1,11 @@ +class CreateCardRxes < ActiveRecord::Migration[7.2] + def change + create_table :card_rxes do |t| + t.string :help_desk + t.string :customer_service + t.string :web_url + + t.timestamps + end + end +end diff --git a/db/migrate/20260113152431_add_card_rx_to_employers.rb b/db/migrate/20260113152431_add_card_rx_to_employers.rb new file mode 100644 index 0000000..f74259d --- /dev/null +++ b/db/migrate/20260113152431_add_card_rx_to_employers.rb @@ -0,0 +1,6 @@ +class AddCardRxToEmployers < ActiveRecord::Migration[7.2] + def change + add_reference :employers, :card_provider, null: true, foreign_key: true + add_reference :employers, :card_rx, null: true, foreign_key: true + end +end diff --git a/db/migrate/20260114183848_create_members.rb b/db/migrate/20260114183848_create_members.rb new file mode 100644 index 0000000..414baac --- /dev/null +++ b/db/migrate/20260114183848_create_members.rb @@ -0,0 +1,16 @@ +class CreateMembers < ActiveRecord::Migration[7.2] + def change + create_table :members do |t| + t.string :name + t.string :id_card_display_name + t.string :family_id + t.integer :mb_member_key + t.integer :pb_entity_key + t.integer :pl_plan_key + t.belongs_to :employer, foreign_key: true + t.belongs_to :plan, null: true, foreign_key: true + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index acc2055..e6f7ba1 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: 2025_12_09_182135) do +ActiveRecord::Schema[7.2].define(version: 2026_01_14_183848) do create_table "action_text_rich_texts", force: :cascade do |t| t.string "name", null: false t.text "body" @@ -49,41 +49,112 @@ ActiveRecord::Schema[7.2].define(version: 2025_12_09_182135) do t.index ["blob_id", "variation_digest"], name: "index_active_storage_variant_records_uniqueness", unique: true end - create_table "alternative_network_logos", force: :cascade do |t| - t.string "network_logo" + create_table "alternate_network_logos", force: :cascade do |t| + t.string "network_logo_filename" t.string "exception_type" t.string "exception_value" - t.bigint "employer_setup_process_id", null: false + t.bigint "employer_id", null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.index ["employer_setup_process_id"], name: "index_alternative_network_logos_on_employer_setup_process_id" + t.index ["employer_id"], name: "index_alternate_network_logos_on_employer_id" end create_table "card_logo_files", force: :cascade do |t| t.string "filename" + t.binary "image_data" + t.string "content_type" t.string "logo_type" - t.binary "image" - t.integer "pl_plan_key" + t.boolean "active", default: false t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.bigint "employer_setup_process_id", null: false - t.index ["employer_setup_process_id"], name: "index_card_logo_files_on_employer_setup_process_id" end - create_table "employer_setup_processes", force: :cascade do |t| - t.string "employer_name" + create_table "card_providers", force: :cascade do |t| + t.string "provider_code" + t.string "provider_line_1" + t.string "provider_line_2" + t.string "provider_line_3" + t.string "provider_line_4" + t.string "provider_line_5" + t.string "provider_line_6" + t.string "provider_line_7" + t.string "provider_line_8" + t.string "provider_line_9" + t.string "provider_line_10" + t.string "provider_line_11" + t.string "provider_line_12" + t.string "claim_to_1" + t.string "claim_to_2" + t.string "claim_to_3" + t.string "claim_to_4" + t.string "claim_to_5" + t.string "claim_to_6" + t.string "claim_to_7" + t.string "claim_to_8" + t.string "claim_to_9" + t.string "claim_to_10" + t.string "claim_to_11" + t.string "claim_to_12" + t.string "mail_to" + t.string "mail_to_2" + t.string "contact_line_1" + t.string "contact_line_2" + t.string "contact_line_3" t.string "group_number" - t.string "effective_date" - t.string "employer_logo" - t.string "form_method" - t.string "status" - t.string "current_step" + t.string "rx_group_id" + t.string "rx_contact" + t.string "provider_lookup_1" + t.string "provider_lookup_2" + t.string "precert_1" + t.string "precert_2" + t.string "precert_3" + t.string "precert_4" + t.string "precert_5" + t.string "precert_6" t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.string "network_provider" - t.string "network_logo" - t.string "card_template" + end + + create_table "card_rxes", force: :cascade do |t| + t.string "help_desk" + t.string "customer_service" + t.string "web_url" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "employer_card_logos", force: :cascade do |t| + t.bigint "employer_id", null: false + t.bigint "card_logo_file_id", null: false + t.string "logo_type" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["card_logo_file_id"], name: "index_employer_card_logos_on_card_logo_file_id" + t.index ["employer_id"], name: "index_employer_card_logos_on_employer_id" + end + + create_table "employers", force: :cascade do |t| + t.string "name" + t.string "id_card_display_name" + t.string "slug" t.string "pl_plan_key" + t.integer "company_pb_entity_key" + t.integer "plan_id" + t.string "group_number" + t.string "rx_group_number" + t.string "effective_date" + t.string "employer_logo_filename" + t.string "network_provider" + t.string "default_network_logo" + t.string "single_card_template" + t.string "multiple_card_template" + t.boolean "active", default: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.bigint "card_provider_id" + t.bigint "card_rx_id" + t.index ["card_provider_id"], name: "index_employers_on_card_provider_id" + t.index ["card_rx_id"], name: "index_employers_on_card_rx_id" end create_table "id_card_benefits", force: :cascade do |t| @@ -102,6 +173,21 @@ ActiveRecord::Schema[7.2].define(version: 2025_12_09_182135) do t.datetime "updated_at", null: false end + create_table "members", force: :cascade do |t| + t.string "name" + t.string "id_card_display_name" + t.string "family_id" + t.integer "mb_member_key" + t.integer "pb_entity_key" + t.integer "pl_plan_key" + t.bigint "employer_id" + t.bigint "plan_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["employer_id"], name: "index_members_on_employer_id" + t.index ["plan_id"], name: "index_members_on_plan_id" + end + create_table "plan_benefits", force: :cascade do |t| t.string "benefit_desc" t.string "benefit" @@ -114,22 +200,20 @@ ActiveRecord::Schema[7.2].define(version: 2025_12_09_182135) do create_table "plans", force: :cascade do |t| t.string "title" - t.bigint "employer_setup_process_id", null: false + t.integer "pb_product_key" + t.bigint "employer_id", null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.integer "plan_id" - t.index ["employer_setup_process_id"], name: "index_plans_on_employer_setup_process_id" + t.index ["employer_id"], name: "index_plans_on_employer_id" end create_table "sample_id_cards", force: :cascade do |t| + t.string "full_name" t.string "family_id" - t.string "network_image" - t.integer "pl_plan_key" - t.integer "primary_mb_member_key" + t.string "primary_mb_member_key" + t.string "employer_name" t.string "group_number" t.string "rx_group" - t.string "employer_name" - t.string "full_name" t.string "medical_eff_date" t.string "provider_code" t.string "provider_line_1" @@ -143,7 +227,7 @@ ActiveRecord::Schema[7.2].define(version: 2025_12_09_182135) do t.string "provider_line_9" t.string "provider_line_10" t.string "provider_line_11" - t.string "mail_to" + t.string "provider_line_12" t.string "claim_to_1" t.string "claim_to_2" t.string "claim_to_3" @@ -155,6 +239,7 @@ ActiveRecord::Schema[7.2].define(version: 2025_12_09_182135) do t.string "claim_to_9" t.string "claim_to_10" t.string "claim_to_11" + t.string "claim_to_12" t.string "customer_service" t.string "web_url" t.string "dependent_1" @@ -165,6 +250,7 @@ ActiveRecord::Schema[7.2].define(version: 2025_12_09_182135) do t.string "dependent_6" t.string "dependent_7" t.string "dependent_8" + t.string "plan_id" t.string "benefit_desc_1" t.string "benefit_1" t.string "benefit_desc_2" @@ -199,9 +285,14 @@ ActiveRecord::Schema[7.2].define(version: 2025_12_09_182135) do add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id" add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id" - add_foreign_key "alternative_network_logos", "employer_setup_processes" - add_foreign_key "card_logo_files", "employer_setup_processes" + add_foreign_key "alternate_network_logos", "employers" + add_foreign_key "employer_card_logos", "card_logo_files" + add_foreign_key "employer_card_logos", "employers" + add_foreign_key "employers", "card_providers" + add_foreign_key "employers", "card_rxes" add_foreign_key "id_card_benefits", "id_card_benefits_templates" + add_foreign_key "members", "employers" + add_foreign_key "members", "plans" add_foreign_key "plan_benefits", "plans" - add_foreign_key "plans", "employer_setup_processes" + add_foreign_key "plans", "employers" end diff --git a/db/seeds.rb b/db/seeds.rb index 2135f6a..5130bef 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -1,3 +1,88 @@ +def determine_id_card_templates(pl_plan_key) + pl_plan_key = pl_plan_key.to_i + if [13, 19, 20, 48, 49, 50, 51, 52, 53, 54, 58, 59, 61].include?(pl_plan_key) + single_card_template = 'CignaFairosIDCard' + elsif [39].include?(pl_plan_key) + single_card_template = 'CignaFairosIDCard-HALF' + elsif [4, 5, 16, 23, 33, 55, 57, 63].include?(pl_plan_key) + single_card_template = 'MedCostFairosIDCard' + elsif [1, 2].include?(pl_plan_key) + single_card_template = 'SmartIDCard' + elsif [10, 17].include?(pl_plan_key) + single_card_template = 'FirstCallTPAIDCard' + elsif [15, 18].include?(pl_plan_key) + single_card_template = 'SRIIDCARD' + elsif [21].include?(pl_plan_key) + single_card_template = 'SRIIDCARDFairosRx' + elsif [3].include?(pl_plan_key) + single_card_template = 'TPAIDCardTan' + elsif [56].include?(pl_plan_key) + single_card_template = 'CignaHealthBusIDCard' + else + single_card_template = 'TPAIDCard' + end + + if [4, 5, 16, 21, 33, 55, 57, 58, 59, 61].include?(pl_plan_key) + multiple_card_template = 'AllTPAIDCardFairosRx' + elsif [13, 19, 20, 39, 48, 49, 50, 52, 53, 54].include?(pl_plan_key) + multiple_card_template = 'AllHerritageIdCards' + elsif [15, 18].include?(pl_plan_key) + multiple_card_template = 'ALLSRIIDCARD' + elsif [10, 17].include?(pl_plan_key) + multiple_card_template = 'AllFirstCallTPAIDCard' + elsif [3].include?(pl_plan_key) + multiple_card_template = 'AllTPAIDCardTan' + elsif [56].include?(pl_plan_key) + multiple_card_template = 'AllCignaHealthBusIDCard' + else + multiple_card_template = 'AllTPAIDCard' + end + + { + single_card_template: single_card_template, + multiple_card_template: multiple_card_template + } +end + +def determine_network_logos(pl_plan_key) + pl_plan_key = pl_plan_key.to_i + exception_logos = [] + if [4, 5, 16, 23, 33, 55, 57, 63].include?(pl_plan_key) + default_net_logo_image = 'Logo_MC_PMS.png' + elsif [15, 18, 19, 20, 13, 21].include?(pl_plan_key) + default_net_logo_image = 'CignaLogo.png' + elsif [62].include?(pl_plan_key) + default_net_logo_image = 'CignaLogo.png' + else + default_net_logo_image = 'CignaLogo.png' + + + # exception_logos << ProviderNetworkLogo.new( + # exception_type: 'zip', + # exception_value: '49420', + # net_logo: 'CignaPHLogo.jpg' + # ) + + # exception_logos << ProviderNetworkLogo.new( + # exception_type: 'zip', + # exception_value: '48167', + # net_logo: 'CignaPHLogo.jpg' + # ) + + # exception_logos << ProviderNetworkLogo.new( + # exception_type: 'zip', + # exception_value: '55419', + # net_logo: 'CignaHPLogo.jpg' + # ) + + # exception_logos << ProviderNetworkLogo.new( + # exception_type: 'zip', + # exception_value: '55379', + # net_logo: 'CignaHPLogo.jpg' + # ) + end +end + benefit_descriptions = ["Primary Visit", "Specialist Visit", "Urgent Care", @@ -18,15 +103,169 @@ benefit_descriptions.each_with_index do |bene, i| IdCardBenefit.create(sequence: i + 1, benefit_desc: bene, id_card_benefits_template: default) end -temp_1 = IdCardBenefitsTemplate.create(title: "Rebekah's Template") -(1..14).each do |seq| - IdCardBenefit.create(sequence: seq, benefit: "greatest hits vol #{seq}", id_card_benefits_template: temp_1) -end - temp_2 = IdCardBenefitsTemplate.create(title: "Jason's Template") (1..14).each do |seq| IdCardBenefit.create(sequence: seq, benefit: "#{seq} hit wonder", id_card_benefits_template: temp_2) end +# temp_1 = IdCardBenefitsTemplate.create(title: "Rebekah's Template") +# (1..14).each do |seq| +# IdCardBenefit.create(sequence: seq, benefit: "greatest hits vol #{seq}", id_card_benefits_template: temp_1) +# end + + +# historical_id_card_docs = Dir['tmp/*.docx'] +# historical_id_card_docs.each do |card_doc| +# puts card_doc +# BenefitsWordDocProcessor.new(card_doc).call +# end + +# acentria = Carrier.find_or_create_by!(name: 'Acentria') + +# mcswain_broker = Broker.find_or_create_by!(name: 'Tom McSwain') do |mc| +# mc.carrier = acentria +# end + +# mcswain_employers = HebWeb::BrokerXRef.where(pl_plan_key: 99).pluck(:employer_pl_plan_key) + + +# Imports employers and members from VHCS +sql_query = "SELECT PLPlanKey, PlanId, ShortDesc FROM PLPlanHeader WHERE ActiveInactive = 'Active' AND PLPlanKey = 61" +plan_headers = VhcsRecord.connection.select_all(sql_query) + +plan_headers.each do |ph| + import_employer = Employer.find_or_create_by!(pl_plan_key: ph['PLPlanKey']) do |em| + puts "Importing #{ph['ShortDesc'].strip}" + em.name = ph['ShortDesc'].strip + em.plan_id = ph['PlanId'].strip.to_i + + + id_card_templates = determine_id_card_templates(em.pl_plan_key) + em.single_card_template = id_card_templates[:single_card_template] + em.multiple_card_template = id_card_templates[:multiple_card_template] + + plan_code = Vhcs::HlPlanCode.find_by(plan_key: em.pl_plan_key) + em.group_number = plan_code.group_number + em.rx_group_number = plan_code.medical_number + em.effective_date = plan_code.effect_date.strftime("%m/%d/%Y") + + pb_company_plan = Vhcs::PbCompanyPlans.find_by(pl_plan_key: em.pl_plan_key) + em.company_pb_entity_key = pb_company_plan.company_pb_entity_key + + card_display_name = Vhcs::PbEntity.find_by(company_pb_entity_key: em.company_pb_entity_key).last_name + em.id_card_display_name = em.employer_trim_name(card_display_name) + + em.default_network_logo = determine_network_logos(em.pl_plan_key) + end + + vhcs_plans = Vhcs::PbProduct.where(company_pb_entity_key: import_employer.company_pb_entity_key) + vhcs_plans.each do |vp| + puts "~~ Importing #{vp.short_description}" + import_plan = import_employer.plans.find_or_create_by!(pb_product_key: vp.pb_product_key) do |pl| + pl.title = vp.short_description + end + vhcs_plan_benefits = Vhcs::HlEgglestonCardBenefit.where(plan_id: import_plan.pb_product_key) + vhcs_plan_benefits.each do |vb| + import_plan.plan_benefits.find_or_create_by!(benefit_desc: vb.benefit_desc) do |pb| + pb.sequence = vb.sequence + pb.benefit = vb.benefit + end + end + end + + + + # if mcswain_employers.include?(ph['PLPlanKey']) + # em.broker = mcswain_broker + # end + + vw_mb_members = Vhcs::VwmbMember.where(enrollee_type_value_id: 1, pl_plan_key: ph['PLPlanKey']).select(:mb_member_key, :pb_entity_key, :pl_plan_key, :family_id, :full_name_last_name_first) + vw_mb_members_count = vw_mb_members.length + + vw_mb_members.each_with_index do |vwm, i| + import_member = Member.find_or_create_by!(mb_member_key: vwm.mb_member_key) do |me| + me.name = vwm.full_name_last_name_first.titleize + me.pb_entity_key = vwm.pb_entity_key + me.family_id = vwm.family_id + me.pl_plan_key = vwm.pl_plan_key + me.employer = import_employer + + card_display_name = Vhcs::PbEntity.find_by(pb_entity_key: me.pb_entity_key).full_name + me.id_card_display_name = card_display_name + + plan_pb_product_key = Vhcs::PbProduct.joins('INNER JOIN "PBProductAvailability" ON "PBProductAvailability"."PBProductKey" = "PBProduct"."PBProductKey" INNER JOIN "PBProductParticipation" ON "PBProductParticipation"."PBProductAvailabilityKey" = "PBProductAvailability"."PBProductAvailabilityKey" INNER JOIN "PBCoveredEntities" ON "PBProductParticipation"."PBProductParticipationKey" = "PBCoveredEntities"."PBProductParticipationKey"').where('"PBCoveredEntities"."PBEntityKey" = ?', me.pb_entity_key).first.pb_product_key + if plan = Plan.find_by(pb_product_key: plan_pb_product_key) + me.plan = plan + end + end + puts "Employer #{import_employer.name} (#{i}/#{vw_mb_members_count}) members imported" + end +end + +Vhcs::HlidCardProvider.all.each do |vhcs| + CardProvider.find_or_create_by(provider_code: vhcs.provider_code) do |cp| + cp.provider_line_1 = vhcs.provider_line_1 + cp.provider_line_2 = vhcs.provider_line_2 + cp.provider_line_3 = vhcs.provider_line_3 + cp.provider_line_4 = vhcs.provider_line_4 + cp.provider_line_5 = vhcs.provider_line_5 + cp.provider_line_6 = vhcs.provider_line_6 + cp.provider_line_7 = vhcs.provider_line_7 + cp.provider_line_8 = vhcs.provider_line_8 + cp.provider_line_9 = vhcs.provider_line_9 + cp.provider_line_10 = vhcs.provider_line_10 + cp.provider_line_11 = vhcs.provider_line_11 + cp.provider_line_12 = vhcs.provider_line_12 + + cp.claim_to_1 = vhcs.claim_to_1 + cp.claim_to_2 = vhcs.claim_to_2 + cp.claim_to_3 = vhcs.claim_to_3 + cp.claim_to_4 = vhcs.claim_to_4 + cp.claim_to_5 = vhcs.claim_to_5 + cp.claim_to_6 = vhcs.claim_to_6 + cp.claim_to_7 = vhcs.claim_to_7 + cp.claim_to_8 = vhcs.claim_to_8 + cp.claim_to_9 = vhcs.claim_to_9 + cp.claim_to_10 = vhcs.claim_to_10 + cp.claim_to_11 = vhcs.claim_to_11 + cp.claim_to_12 = vhcs.claim_to_12 + + cp.mail_to = vhcs.mail_to + cp.mail_to_2 = vhcs.mail_to_2 + + cp.contact_line_1 = vhcs.contact_line_1 + cp.contact_line_2 = vhcs.contact_line_2 + cp.contact_line_3 = vhcs.contact_line_3 + + cp.group_number = vhcs.group_number + cp.rx_group_id = vhcs.rx_group_id + cp.rx_contact = vhcs.rx_contact + + cp.provider_lookup_1 = vhcs.provider_lookup_1 + cp.provider_lookup_2 = vhcs.provider_lookup_2 + + cp.precert_1 = vhcs.precert_1 + cp.precert_2 = vhcs.precert_2 + cp.precert_3 = vhcs.precert_3 + cp.precert_4 = vhcs.precert_4 + cp.precert_5 = vhcs.precert_5 + cp.precert_6 = vhcs.precert_6 + + end +end + +Vhcs::HlrxCrosRef.all.each do |vhcs| + rx = CardRx.find_or_create_by(help_desk: vhcs.help_desk, customer_service: vhcs.customer_service, web_url: vhcs.web_url) + emp = Employer.find_by(pl_plan_key: vhcs.pl_plan_key) + if emp.present? + emp.card_rx = rx + emp.save + end +end + + +# 15, 18, 19, 20, 13, 21 + + diff --git a/lib/generators/legacy_db_model/templates/legacy_model.rb.erb.tt b/lib/generators/legacy_db_model/templates/legacy_model.rb.erb.tt index 2e51266..90e569a 100644 --- a/lib/generators/legacy_db_model/templates/legacy_model.rb.erb.tt +++ b/lib/generators/legacy_db_model/templates/legacy_model.rb.erb.tt @@ -4,7 +4,18 @@ module <%= @module %> self.table_name = '<%= table_name %>' <%- @fields.each do |fi| -%> - alias_attribute :<%= fi.underscore %>, :<%= fi %> + alias_attribute :<%= fi.underscore.gsub(/(?=\d)/, "_") %>, :<%= fi %> + <%- end -%> + + <%- unless db_name == 'BrittonWeb' -%> + def attributes + rails_like = { + <%- @fields.each do |fi| -%> + <%= fi.underscore.gsub(/(?=\d)/, "_") %>: self.<%= fi.underscore.gsub(/(?=\d)/, "_") %>, + <%- end -%> + } + super.merge(rails_like) + end <%- end -%>