diff --git a/Gemfile b/Gemfile
index 70b345d..e691ab9 100644
--- a/Gemfile
+++ b/Gemfile
@@ -27,6 +27,8 @@ gem "stimulus-rails"
# Build JSON APIs with ease [https://github.com/rails/jbuilder]
gem "jbuilder"
+gem "rack-cors"
+
# Use Redis adapter to run Action Cable in production
# gem "redis", "~> 5.3"
diff --git a/Gemfile.lock b/Gemfile.lock
index e902b80..c24b7f3 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -239,6 +239,9 @@ GEM
activesupport (>= 3.0.0)
racc (1.8.1)
rack (3.2.6)
+ rack-cors (3.0.0)
+ logger
+ rack (>= 3.0.14)
rack-mini-profiler (4.0.1)
rack (>= 1.2.0)
rack-session (2.1.2)
@@ -437,6 +440,7 @@ DEPENDENCIES
pry-rails
puma (~> 6.5)
pundit
+ rack-cors
rack-mini-profiler
rails (~> 7.2)
rails_icons
diff --git a/app/controllers/admins_controller.rb b/app/controllers/admins_controller.rb
new file mode 100644
index 0000000..4709ae5
--- /dev/null
+++ b/app/controllers/admins_controller.rb
@@ -0,0 +1,7 @@
+class AdminsController < ApplicationController
+ def new_web_user
+ @employers = Employer.active
+ @brokers = Broker.all
+ @carrier = Carrier.all
+ end
+end
diff --git a/app/controllers/api/v1/web_id_cards_controller.rb b/app/controllers/api/v1/web_id_cards_controller.rb
new file mode 100644
index 0000000..a2efb9e
--- /dev/null
+++ b/app/controllers/api/v1/web_id_cards_controller.rb
@@ -0,0 +1,39 @@
+module Api
+ module V1
+ class WebIdCardsController < ApplicationController
+
+ def member_card
+ pb_entity_key = params[:id]
+ layout = params[:layout]
+ member = Member.find_by(pb_entity_key: pb_entity_key)
+ if member.present?
+ member_card = IdCardPrinterService::CardsGenerator.new(member.member_key, layout).call
+
+ send_data member_card.to_pdf,
+ filename: "#{member.name.gsub(", ", "_")}_digital_card_#{Date.today}.pdf",
+ type: "application/pdf",
+ disposition: 'inline'
+ else
+ render json: { error: "Member not found" }, status: :not_found
+ end
+ end
+
+ def employer_cards
+ pl_plan_key = params[:id]
+ employer = Employer.find_by(pl_plan_key: pl_plan_key)
+ if employer.present?
+ employer_cards = IdCardPrinterService::CardsGenerator.new(employer.employer_member_keys, "FullPageCard", true).call
+
+ employer_cards.rewind
+ send_data employer_cards.sysread,
+ filename: "#{employer.name.parameterize(separator: "_")}_full_page_cards_#{Date.today}.zip",
+ type: 'application/zip',
+ disposition: 'inline'
+ else
+ render json: { error: "Employer not found" }, status: :not_found
+ end
+ end
+
+ end
+ end
+end
\ No newline at end of file
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 2992107..66f21f7 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -2,7 +2,7 @@
class ApplicationController < ActionController::Base
include Pundit::Authorization
- before_action :authenticate_user!
+ # before_action :authenticate_user!
def after_sign_in_path_for(resource)
stored_location_for(resource) || dashboard_path
diff --git a/app/controllers/id_card/setup_controller.rb b/app/controllers/id_card/setup_controller.rb
index 394abf4..3fc2a5e 100644
--- a/app/controllers/id_card/setup_controller.rb
+++ b/app/controllers/id_card/setup_controller.rb
@@ -66,6 +66,7 @@ module IdCard
def update_field_exceptions
field_exceptions_params = IdCard::FieldException.permitted_params(params)
+ puts field_exceptions_params
if @setup.update(field_exceptions_params)
puts "sucess"
redirect_to employer_path(@setup.employer.slug), notice: 'ID Card Exceptions successfully updated.'
diff --git a/app/jobs/process_member_card_data_job.rb b/app/jobs/process_member_card_data_job.rb
index 5ef1bf7..e903c49 100644
--- a/app/jobs/process_member_card_data_job.rb
+++ b/app/jobs/process_member_card_data_job.rb
@@ -71,7 +71,7 @@ class ProcessMemberCardDataJob < ApplicationJob
end
if member.id_card_plan_id.present?
- member_card = IdCard::PrintData.find_by(pl_plan_key: member.pl_plan_key, plan_id: member.id_card_plan_id, primary_mb_member_key: nil).dup
+ member_card = IdCard::PrintData.find_by(pl_plan_key: member.pl_plan_key, plan_id: member.id_card_plan_id).dup
else
member_card = IdCard::PrintData.where(pl_plan_key: member.pl_plan_key, primary_mb_member_key: nil).first.dup
end
diff --git a/app/jobs/update_member_job.rb b/app/jobs/update_member_job.rb
index 72dc3ce..10c6c6e 100644
--- a/app/jobs/update_member_job.rb
+++ b/app/jobs/update_member_job.rb
@@ -1,7 +1,7 @@
class UpdateMemberJob < ApplicationJob
queue_as :default
- def perform(pb_entity_key, employer_id, has_divisions = false, has_dental = false, vw_mb_member = {})
+ def perform(pb_entity_key, employer_id, has_divisions = false, has_dental = false, add_inactive = false, vw_mb_member = {})
unless vw_mb_member.present?
vw_mb_member = Vhcs::VwmbMember.find_by(enrollee_type_value_id: 1, pb_entity_key: pb_entity_key).attributes.with_indifferent_access.slice(:mb_member_key, :pb_entity_key, :pl_plan_key, :family_id, :full_name_last_name_first, :social_security_number)
@@ -11,6 +11,8 @@ class UpdateMemberJob < ApplicationJob
INNER JOIN "PBProductAvailability" ON "PBProductAvailability"."PBProductKey" = "PBProduct"."PBProductKey"
INNER JOIN "PBProductParticipation" ON "PBProductParticipation"."PBProductAvailabilityKey" = "PBProductAvailability"."PBProductAvailabilityKey"
INNER JOIN "PBCoveredEntities" ON "PBProductParticipation"."PBProductParticipationKey" = "PBCoveredEntities"."PBProductParticipationKey"
+ ').select('
+ "PBProduct".*, "PBProductParticipation"."InEffect" AS InEffectDate, "PBProductParticipation"."OutOfEffect" AS OutOfEffectDate
').where('
"PBCoveredEntities"."PBEntityKey" = ?
AND "PBProductParticipation"."InEffect" <= ?
@@ -18,7 +20,9 @@ class UpdateMemberJob < ApplicationJob
vw_mb_member[:pb_entity_key], 3.month.from_now , 1.day.ago
)
- if pb_products.present? && vw_mb_member[:social_security_number].present?
+ pb_products, max_in_effect, max_out_effect = get_products_with_max_dates(vw_mb_member[:pb_entity_key])
+
+ if add_inactive || (pb_products.exists? && max_out_effect > 1.year.ago) # && vw_mb_member[:social_security_number].present?
member = Member.find_or_create_by(pb_entity_key: vw_mb_member[:pb_entity_key], employer_id: employer_id)
member.name = vw_mb_member[:full_name_last_name_first].titleize
member.mb_member_key = vw_mb_member[:mb_member_key]
@@ -26,60 +30,62 @@ class UpdateMemberJob < ApplicationJob
member.pl_plan_key = vw_mb_member[:pl_plan_key]
card_display_name = Vhcs::PbEntity.find_by(pb_entity_key: member.pb_entity_key).full_name
- member.id_card_display_name = card_display_name
+ member.id_card_display_name ||= card_display_name
- if has_divisions
- division = Vhcs::PbEntity.joins('
- INNER JOIN "PBAffiliation" ON "PBAffiliation"."ParentPBEntityKey" = "PBEntity"."PBEntityKey"
- INNER JOIN "PBProductParticipation" ON "PBProductParticipation"."PBAffiliationKey" = "PBAffiliation"."PBAffiliationKey"
- INNER JOIN "PBCoveredEntities" ON "PBProductParticipation"."PBProductParticipationKey" = "PBCoveredEntities"."PBProductParticipationKey"
- ').find_by('
- "PBCoveredEntities"."PBEntityKey" = ?
- AND "PBProductParticipation"."OutOfEffect" > ?',
- member.pb_entity_key, 1.day.ago
- ).last_name
- member.division = division
- end
+ if max_in_effect <= 3.months.from_now && max_out_effect > 1.day.ago
- if has_dental
- medical_pb_product_key = pb_products.where("ShortDescription LIKE ?", "%Medical%")&.first&.pb_product_key
- dental_pb_product_key = pb_products.where("ShortDescription LIKE ?", "%Dental%")&.first&.pb_product_key
- # dental_pb_product_key = pb_products.where(short_description: "Dental")&.first&.pb_product_key
- if dental_pb_product_key
- member.dental_plan_key = dental_pb_product_key
-
- coverage_class = Vhcs::GenLookupTables.joins('
- INNER JOIN "PBProductParticipation" ON "PBProductParticipation"."CoverageTypeCode" = "GEN_LookupTables"."RecordID"
- INNER JOIN "PBCoveredEntities" ON "PBProductParticipation"."PBProductParticipationKey" = "PBCoveredEntities"."PBProductParticipationKey"
- INNER JOIN "PBProductAvailability" ON "PBProductAvailability"."PBProductAvailabilityKey" = "PBProductParticipation"."PBProductAvailabilityKey"
- INNER JOIN "PBProduct" ON "PBProduct"."PBProductKey" = "PBProductAvailability"."PBProductKey"
- ').select('
- "GEN_LookupTables".*, "PBProductParticipation"."InEffect" AS EffDate
- ').where('
- "PBCoveredEntities"."PBEntityKey" = ?
- AND "PBProductParticipation"."InEffect" <= ?
- AND "PBProductParticipation"."OutOfEffect" > ?
- AND "PBProduct"."PBProductKey" = ?',
- member.pb_entity_key, 1.month.from_now, 1.day.ago, dental_pb_product_key
- ).order('EffDate DESC').first.short_desc
- member.coverage_class = coverage_class
- else
- member.coverage_class = "NONE"
+ if has_divisions
+ division = Vhcs::PbEntity.joins('
+ INNER JOIN "PBAffiliation" ON "PBAffiliation"."ParentPBEntityKey" = "PBEntity"."PBEntityKey"
+ INNER JOIN "PBProductParticipation" ON "PBProductParticipation"."PBAffiliationKey" = "PBAffiliation"."PBAffiliationKey"
+ INNER JOIN "PBCoveredEntities" ON "PBProductParticipation"."PBProductParticipationKey" = "PBCoveredEntities"."PBProductParticipationKey"
+ ').find_by('
+ "PBCoveredEntities"."PBEntityKey" = ?
+ AND "PBProductParticipation"."OutOfEffect" > ?',
+ member.pb_entity_key, 1.day.ago
+ ).last_name
+ member.division = division
end
- else
- medical_pb_product_key = pb_products.first.pb_product_key
- end
- if medical_pb_product_key && plan = IdCard::Plan.find_by(pb_product_key: medical_pb_product_key)
- member.id_card_plan = plan
- end
- member.dependents = get_dependent_names_by_sequence(member)
- # if employer_members_update
- # member
- # else
- # end
- member.save!
+ if has_dental
+ medical_pb_product_key = pb_products.where("ShortDescription LIKE ?", "%Medical%")&.first&.pb_product_key
+ dental_pb_product_key = pb_products.where("ShortDescription LIKE ?", "%Dental%")&.first&.pb_product_key
+ # dental_pb_product_key = pb_products.where(short_description: "Dental")&.first&.pb_product_key
+ if dental_pb_product_key
+ member.dental_plan_key = dental_pb_product_key
+
+ coverage_class = Vhcs::GenLookupTables.joins('
+ INNER JOIN "PBProductParticipation" ON "PBProductParticipation"."CoverageTypeCode" = "GEN_LookupTables"."RecordID"
+ INNER JOIN "PBCoveredEntities" ON "PBProductParticipation"."PBProductParticipationKey" = "PBCoveredEntities"."PBProductParticipationKey"
+ INNER JOIN "PBProductAvailability" ON "PBProductAvailability"."PBProductAvailabilityKey" = "PBProductParticipation"."PBProductAvailabilityKey"
+ INNER JOIN "PBProduct" ON "PBProduct"."PBProductKey" = "PBProductAvailability"."PBProductKey"
+ ').select('
+ "GEN_LookupTables".*, "PBProductParticipation"."InEffect" AS EffDate
+ ').where('
+ "PBCoveredEntities"."PBEntityKey" = ?
+ AND "PBProductParticipation"."InEffect" <= ?
+ AND "PBProductParticipation"."OutOfEffect" > ?
+ AND "PBProduct"."PBProductKey" = ?',
+ member.pb_entity_key, 1.month.from_now, 1.day.ago, dental_pb_product_key
+ ).order('EffDate DESC').first.short_desc
+ member.coverage_class = coverage_class
+ else
+ member.coverage_class = "NONE"
+ end
+ else
+ medical_pb_product_key = pb_products.first.pb_product_key
+ end
+ if medical_pb_product_key && plan = IdCard::Plan.find_by(pb_product_key: medical_pb_product_key)
+ member.id_card_plan = plan
+ end
+ member.dependents = get_dependent_names_by_sequence(member)
+
+ member.active = true
+ else
+ member.active = false
+ end
puts "---- #{member.name}"
+ member.save!
end
member.presence
@@ -87,6 +93,21 @@ class UpdateMemberJob < ApplicationJob
private
+ def get_products_with_max_dates(pb_entity_key)
+ pb_product_with_dates = 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"
+ ').select('
+ "PBProduct".*, "PBProductParticipation"."InEffect" AS InEffectDate, "PBProductParticipation"."OutOfEffect" AS OutOfEffectDate
+ ').where('
+ "PBCoveredEntities"."PBEntityKey" = ?',
+ pb_entity_key
+ )
+
+ [pb_product_with_dates, pb_product_with_dates.map { |products| products["InEffectDate"]}.max, pb_product_with_dates.map { |products| products["OutOfEffectDate"]}.max]
+ end
+
def get_dependent_names_by_sequence(member)
dependents = Vhcs::VwmbMember.joins('
INNER JOIN "PBCoveredEntities" ON "PBCoveredEntities"."PBEntityKey" = "vwMBMember"."PBEntityKey"
diff --git a/app/models/id_card/field_exception.rb b/app/models/id_card/field_exception.rb
index 94b26bd..9026c6b 100644
--- a/app/models/id_card/field_exception.rb
+++ b/app/models/id_card/field_exception.rb
@@ -25,10 +25,12 @@ module IdCard
def permitted_params(params)
params.require(:id_card_setup).permit(
field_exceptions_attributes: [
+ :id,
:exception_type,
:exception_values,
:_destroy,
field_exception_items_attributes: [
+ :id,
:field_name,
:field_value,
:network_logo_id,
diff --git a/app/models/member.rb b/app/models/member.rb
index 3e48f7a..fde9d19 100644
--- a/app/models/member.rb
+++ b/app/models/member.rb
@@ -11,16 +11,27 @@ class Member < ApplicationRecord
validates :division, presence: true, if: -> { employer.id_card_setup.has_divisions }
# validates :coverage_class, :dental_plan_key, presence: true, if: -> { employer.id_card_setup.has_dental }
validates :mb_member_key, :pb_entity_key, uniqueness: true
- validates :name, uniqueness: { scope: :employer_id }
+ # validates :name, uniqueness: { scope: :employer_id }
before_validation :format_dependents, if: :dependents_changed?
+ scope :active, -> {
+ where(active: true)
+ }
+
def id_card_field_exception_values
- address = Vhcs::PbEntityAddress.find_by(pb_entity_key: self.pb_entity_key)
+ address = Vhcs::PbEntityAddress.find_by(pb_entity_key: pb_entity_key)
{
zipcode: address.zip,
state: address.state,
- family_id: self.family_id
+ family_id: family_id
+ }
+ end
+
+ def member_key
+ {
+ pl_plan_key: pl_plan_key,
+ member_keys: [pb_entity_key]
}
end
diff --git a/app/services/automation_service/employer_members_update.rb b/app/services/automation_service/employer_members_update.rb
index ecbf99d..e262992 100644
--- a/app/services/automation_service/employer_members_update.rb
+++ b/app/services/automation_service/employer_members_update.rb
@@ -12,17 +12,21 @@ module AutomationService
vw_mb_members = Vhcs::VwmbMember.where(enrollee_type_value_id: 1, pl_plan_key: @pl_plan_key).select(:mb_member_key, :pb_entity_key, :pl_plan_key, :family_id, :full_name_last_name_first, :social_security_number)
+ puts "--- Total Members #{vw_mb_members.length}"
+
member_update_futures = vw_mb_members.map do |vw_mb_member|
Concurrent::Future.execute do
ActiveRecord::Base.connection_pool.with_connection do
- UpdateMemberJob.perform_now(vw_mb_member.pb_entity_key, employer.id, card_setup.has_divisions, card_setup.has_dental, vw_mb_member)
+ UpdateMemberJob.perform_now(vw_mb_member.pb_entity_key, employer.id, card_setup.has_divisions, card_setup.has_dental, false, vw_mb_member)
end
end
end
member_updates = member_update_futures.map(&:value).compact
- employer.members = member_updates
- if employer.initialized && card_setup.initialized && member_updates.empty?
+
+ puts "--- Total Web Members #{member_updates.length}"
+ # employer.members = member_updates
+ if employer.initialized && card_setup.initialized && employer.members.active.empty?
employer.active = false
end
employer.save
diff --git a/app/services/automation_service/member_update.rb b/app/services/automation_service/member_update.rb
index 5bf4de8..36855f9 100644
--- a/app/services/automation_service/member_update.rb
+++ b/app/services/automation_service/member_update.rb
@@ -9,12 +9,12 @@ module AutomationService
def call
employer = Employer.includes(:id_card_setup).find_by(pl_plan_key: @pl_plan_key)
card_setup = employer.id_card_setup
- member = UpdateMemberJob.perform_now(@pb_entity_key, employer.id, card_setup.has_divisions, card_setup.has_dental)
- if member.present?
- member.save
- else
- Member.find_by(pb_entity_key: @pb_entity_key).destroy
- end
+ member = UpdateMemberJob.perform_now(@pb_entity_key, employer.id, card_setup.has_divisions, card_setup.has_dental, true)
+ # if member.present?
+ # member.save
+ # else
+ # Member.find_by(pb_entity_key: @pb_entity_key).destroy
+ # end
end
end
diff --git a/app/services/id_card_printer_service/card_data_formatter.rb b/app/services/id_card_printer_service/card_data_formatter.rb
index 29053a1..b9f9c01 100644
--- a/app/services/id_card_printer_service/card_data_formatter.rb
+++ b/app/services/id_card_printer_service/card_data_formatter.rb
@@ -57,22 +57,24 @@ module IdCardPrinterService
)
selected_attributes = employer_attributes.merge(rx_attributes).merge(provider_attributes)
- IdCard::PrintData.new(selected_attributes)
+ IdCard::PrintData.create(selected_attributes)
end
def create_plan_base_cards(common_fields_card)
needed_plans_ids = @employer.members.where(pb_entity_key: @member_keys).distinct.pluck(:id_card_plan_id)
- needed_plans = @card_setup.plans.where(id: needed_plans_ids)
- needed_plans.each do |plan|
- selected_attributes = { plan_id: plan.id }
- 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
+ if needed_plans_ids.present?
+ needed_plans = @card_setup.plans.where(id: needed_plans_ids)
+ needed_plans.each do |plan|
+ selected_attributes = { plan_id: plan.id }
+ 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
- plan_base_card = common_fields_card.dup
- plan_base_card.assign_attributes(selected_attributes)
- plan_base_card.save
+ plan_base_card = common_fields_card.dup
+ plan_base_card.assign_attributes(selected_attributes)
+ plan_base_card.save
+ end
end
end
diff --git a/app/services/id_card_queue_service/get_queued_members.rb b/app/services/id_card_queue_service/get_queued_members.rb
index e5e11d3..3e710d9 100644
--- a/app/services/id_card_queue_service/get_queued_members.rb
+++ b/app/services/id_card_queue_service/get_queued_members.rb
@@ -3,23 +3,43 @@ module IdCardQueueService
def initialize(pl_plan_keys = nil)
if pl_plan_keys
- @employer_pl_plan_keys = pl_plan_keys
+ @employer_pl_plan_keys = Array.wrap(pl_plan_keys)
else
- @employer_pl_plan_keys = IdCard::Setup.active.pluck(:pl_plan_key).join(',')
+ @employer_pl_plan_keys = IdCard::Setup.active.pluck(:pl_plan_key)
end
end
def call
- raw_employers_member_keys = CallStoredProc.new('HLGetQueuedIdCardMemberKeysTPA', { PLPlanKeys: @employer_pl_plan_keys }).call.to_ary
- format_employers_member_keys(raw_employers_member_keys)
+ employer_member_keys = @employer_pl_plan_keys.map do |pl_plan_key|
+ queued_employer_members = Vhcs::VwmbMember.joins('
+ INNER JOIN "CLDocument" ON "CLDocument"."RecipientKey" = "VWMBMember"."MBMemberKey"
+ ').select('
+ "VWMBMember"."PBEntityKey"
+ ').where('
+ "CLDocument"."DocStatus" <> ?
+ AND "CLDocument"."PLPlanKey" = ?
+ AND "CLDocument"."PrintDate" IS NULL
+ AND "CLDocument"."CreateDate" > ?',
+ "Printed", pl_plan_key, Date.new(2026, 7, 17)
+ ).pluck(:pb_entity_key)
+
+ if queued_employer_members.present?
+ {
+ pl_plan_key: pl_plan_key,
+ member_keys: queued_employer_members
+ }
+ else
+ ""
+ end
+ end
+
+ employer_member_keys.compact_blank
end
private
def format_employers_member_keys(raw_employers_member_keys)
- key_map = { "PlanKey" => :pl_plan_key, "MemberKeys" => :member_keys }
-
raw_employers_member_keys.map do |hash|
hash["PlanKey"] = hash["PlanKey"].to_s
hash["MemberKeys"] = hash["MemberKeys"].split(", ").map(&:to_i)
diff --git a/app/services/image_processor_service.rb b/app/services/image_processor_service.rb
old mode 100755
new mode 100644
diff --git a/app/services/reports_service/duplicate_old_cards.rb b/app/services/reports_service/duplicate_old_cards.rb
index 9732d41..eabe4bf 100644
--- a/app/services/reports_service/duplicate_old_cards.rb
+++ b/app/services/reports_service/duplicate_old_cards.rb
@@ -49,6 +49,8 @@ module ReportsService
UPDATE CLDocument
SET DocStatus = 'Printed', PrintDate = GetDate()
where DocStatus <> 'Printed'
+ and DocType = 'ID'
+ and CreateDate > CAST('2026-05-01' AS date)
")
end
diff --git a/app/views/admins/new.html.erb b/app/views/admins/new.html.erb
new file mode 100644
index 0000000..77da512
--- /dev/null
+++ b/app/views/admins/new.html.erb
@@ -0,0 +1,63 @@
+
+
+
+ <%= form_with url: create_web_employer_admins_path, method: :post, local: true do |f| %>
+
+ Employers
+
+
+ <%= f.label :employer %>
+ <%= f.collection_select :employer, @employers, :id, :name, { include_blank: "Select an Employer" }, { class: "custom-select" } %>
+
+
+ <%= f.label :email %>
+ <%= f.email_field :email, id: "email-address", autofocus: true, autocomplete: "email", placeholder: "Email address", class: "appearance-none rounded-none relative block w-full px-3 py-2 border border-gray-300 placeholder-bluetang text-deepcove rounded-t-md focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 focus:z-10 sm:text-sm" %>
+
+
+
+ <%= f.submit "Create Employer Account", { class: "relative w-full flex justify-center py-2 px-4 border-4 font-bold rounded-lg text-platinum" } %>
+
+
+ <% end %>
+ <%= form_with url: create_web_broker_admins_path, method: :post, local: true do |f| %>
+
+ Brokers
+
+
+ <%= f.label :broker %>
+ <%= f.collection_select :broker, @brokers, :id, :name, { include_blank: "Select a Broker" }, { class: "custom-select" } %>
+
+
+ <%= f.label :email %>
+ <%= f.email_field :email, id: "email-address", autofocus: true, autocomplete: "email", placeholder: "Email address", class: "appearance-none rounded-none relative block w-full px-3 py-2 border border-gray-300 placeholder-bluetang text-deepcove rounded-t-md focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 focus:z-10 sm:text-sm" %>
+
+
+
+ <%= f.submit "Create Broker Account", { class: "relative w-full flex justify-center py-2 px-4 border-4 font-bold rounded-lg text-platinum" } %>
+
+
+ <% end %>
+ <%= form_with url: create_web_carrier_admins_path, method: :post, local: true do |f| %>
+
+ Carriers
+
+
+ <%= f.label :carrier %>
+ <%= f.collection_select :carrier, @carriers, :id, :name, { include_blank: "Select a Broker" }, { class: "custom-select" } %>
+
+
+ <%= f.label :email %>
+ <%= f.email_field :email, id: "email-address", autofocus: true, autocomplete: "email", placeholder: "Email address", class: "appearance-none rounded-none relative block w-full px-3 py-2 border border-gray-300 placeholder-bluetang text-deepcove rounded-t-md focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 focus:z-10 sm:text-sm" %>
+
+
+
+ <%= f.submit "Create Carrier Account", { class: "relative w-full flex justify-center py-2 px-4 border-4 font-bold rounded-lg text-platinum" } %>
+
+
+ <% end %>
+
+
\ No newline at end of file
diff --git a/app/views/brokers/_broker.html.erb b/app/views/brokers/_broker.html.erb
new file mode 100644
index 0000000..e53f282
--- /dev/null
+++ b/app/views/brokers/_broker.html.erb
@@ -0,0 +1,10 @@
+
+
+ Name:
+ <%= broker.name %>
+
+
+ Carrier:
+ <%= broker.carrier_id %>
+
+
diff --git a/app/views/brokers/_broker.json.jbuilder b/app/views/brokers/_broker.json.jbuilder
new file mode 100644
index 0000000..b3b1688
--- /dev/null
+++ b/app/views/brokers/_broker.json.jbuilder
@@ -0,0 +1,2 @@
+json.extract! broker, :id, :name, :carrier_id, :created_at, :updated_at
+json.url broker_url(broker, format: :json)
diff --git a/app/views/brokers/_form.html.erb b/app/views/brokers/_form.html.erb
new file mode 100644
index 0000000..b2caabd
--- /dev/null
+++ b/app/views/brokers/_form.html.erb
@@ -0,0 +1,27 @@
+<%= form_with(model: broker, class: "contents") do |form| %>
+ <% if broker.errors.any? %>
+
+
<%= pluralize(broker.errors.count, "error") %> prohibited this broker from being saved:
+
+
+ <% broker.errors.each do |error| %>
+ - <%= error.full_message %>
+ <% end %>
+
+
+ <% end %>
+
+
+ <%= form.label :name %>
+ <%= form.text_field :name, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": broker.errors[:name].none?, "border-red-400 focus:outline-red-600": broker.errors[:name].any?}] %>
+
+
+
+ <%= form.label :carrier_id %>
+ <%= form.text_field :carrier_id, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": broker.errors[:carrier_id].none?, "border-red-400 focus:outline-red-600": broker.errors[:carrier_id].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/brokers/edit.html.erb b/app/views/brokers/edit.html.erb
new file mode 100644
index 0000000..f7fc532
--- /dev/null
+++ b/app/views/brokers/edit.html.erb
@@ -0,0 +1,10 @@
+<% content_for :title, "Editing broker" %>
+
+
+
Editing broker
+
+ <%= render "form", broker: @broker %>
+
+ <%= link_to "Show this broker", @broker, 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 brokers", brokers_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/brokers/index.html.erb b/app/views/brokers/index.html.erb
new file mode 100644
index 0000000..e9657a0
--- /dev/null
+++ b/app/views/brokers/index.html.erb
@@ -0,0 +1,29 @@
+<% content_for :title, "Brokers" %>
+
+
+ <% if notice.present? %>
+
<%= notice %>
+ <% end %>
+
+
+
Brokers
+ <%= link_to "New broker", new_broker_path, class: "rounded-md px-3.5 py-2.5 bg-blue-600 hover:bg-blue-500 text-white block font-medium" %>
+
+
+
+ <% if @brokers.any? %>
+ <% @brokers.each do |broker| %>
+
+ <%= render broker %>
+
+ <%= link_to "Show", broker, 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_broker_path(broker), 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", broker, 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 brokers found.
+ <% end %>
+
+
diff --git a/app/views/brokers/index.json.jbuilder b/app/views/brokers/index.json.jbuilder
new file mode 100644
index 0000000..863db18
--- /dev/null
+++ b/app/views/brokers/index.json.jbuilder
@@ -0,0 +1 @@
+json.array! @brokers, partial: "brokers/broker", as: :broker
diff --git a/app/views/brokers/new.html.erb b/app/views/brokers/new.html.erb
new file mode 100644
index 0000000..1b6841a
--- /dev/null
+++ b/app/views/brokers/new.html.erb
@@ -0,0 +1,9 @@
+<% content_for :title, "New broker" %>
+
+
+
New broker
+
+ <%= render "form", broker: @broker %>
+
+ <%= link_to "Back to brokers", brokers_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/brokers/show.html.erb b/app/views/brokers/show.html.erb
new file mode 100644
index 0000000..9c1f5c2
--- /dev/null
+++ b/app/views/brokers/show.html.erb
@@ -0,0 +1,15 @@
+<% content_for :title, "Showing broker" %>
+
+
+ <% if notice.present? %>
+
<%= notice %>
+ <% end %>
+
+
Showing broker
+
+ <%= render @broker %>
+
+ <%= link_to "Edit this broker", edit_broker_path(@broker), 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 brokers", brokers_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 broker", @broker, 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/brokers/show.json.jbuilder b/app/views/brokers/show.json.jbuilder
new file mode 100644
index 0000000..68688d9
--- /dev/null
+++ b/app/views/brokers/show.json.jbuilder
@@ -0,0 +1 @@
+json.partial! "brokers/broker", broker: @broker
diff --git a/app/views/carriers/_carrier.html.erb b/app/views/carriers/_carrier.html.erb
new file mode 100644
index 0000000..9d450c7
--- /dev/null
+++ b/app/views/carriers/_carrier.html.erb
@@ -0,0 +1,6 @@
+
+
+ Name:
+ <%= carrier.name %>
+
+
diff --git a/app/views/carriers/_carrier.json.jbuilder b/app/views/carriers/_carrier.json.jbuilder
new file mode 100644
index 0000000..7e22449
--- /dev/null
+++ b/app/views/carriers/_carrier.json.jbuilder
@@ -0,0 +1,2 @@
+json.extract! carrier, :id, :name, :created_at, :updated_at
+json.url carrier_url(carrier, format: :json)
diff --git a/app/views/carriers/_form.html.erb b/app/views/carriers/_form.html.erb
new file mode 100644
index 0000000..6d91f3d
--- /dev/null
+++ b/app/views/carriers/_form.html.erb
@@ -0,0 +1,22 @@
+<%= form_with(model: carrier, class: "contents") do |form| %>
+ <% if carrier.errors.any? %>
+
+
<%= pluralize(carrier.errors.count, "error") %> prohibited this carrier from being saved:
+
+
+ <% carrier.errors.each do |error| %>
+ - <%= error.full_message %>
+ <% end %>
+
+
+ <% end %>
+
+
+ <%= form.label :name %>
+ <%= form.text_field :name, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": carrier.errors[:name].none?, "border-red-400 focus:outline-red-600": carrier.errors[:name].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/carriers/edit.html.erb b/app/views/carriers/edit.html.erb
new file mode 100644
index 0000000..09bea75
--- /dev/null
+++ b/app/views/carriers/edit.html.erb
@@ -0,0 +1,10 @@
+<% content_for :title, "Editing carrier" %>
+
+
+
Editing carrier
+
+ <%= render "form", carrier: @carrier %>
+
+ <%= link_to "Show this carrier", @carrier, 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 carriers", carriers_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/carriers/index.html.erb b/app/views/carriers/index.html.erb
new file mode 100644
index 0000000..d84368c
--- /dev/null
+++ b/app/views/carriers/index.html.erb
@@ -0,0 +1,29 @@
+<% content_for :title, "Carriers" %>
+
+
+ <% if notice.present? %>
+
<%= notice %>
+ <% end %>
+
+
+
Carriers
+ <%= link_to "New carrier", new_carrier_path, class: "rounded-md px-3.5 py-2.5 bg-blue-600 hover:bg-blue-500 text-white block font-medium" %>
+
+
+
+ <% if @carriers.any? %>
+ <% @carriers.each do |carrier| %>
+
+ <%= render carrier %>
+
+ <%= link_to "Show", carrier, 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_carrier_path(carrier), 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", carrier, 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 carriers found.
+ <% end %>
+
+
diff --git a/app/views/carriers/index.json.jbuilder b/app/views/carriers/index.json.jbuilder
new file mode 100644
index 0000000..0a8b135
--- /dev/null
+++ b/app/views/carriers/index.json.jbuilder
@@ -0,0 +1 @@
+json.array! @carriers, partial: "carriers/carrier", as: :carrier
diff --git a/app/views/carriers/new.html.erb b/app/views/carriers/new.html.erb
new file mode 100644
index 0000000..5a59062
--- /dev/null
+++ b/app/views/carriers/new.html.erb
@@ -0,0 +1,9 @@
+<% content_for :title, "New carrier" %>
+
+
+
New carrier
+
+ <%= render "form", carrier: @carrier %>
+
+ <%= link_to "Back to carriers", carriers_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/carriers/show.html.erb b/app/views/carriers/show.html.erb
new file mode 100644
index 0000000..6aee7ab
--- /dev/null
+++ b/app/views/carriers/show.html.erb
@@ -0,0 +1,15 @@
+<% content_for :title, "Showing carrier" %>
+
+
+ <% if notice.present? %>
+
<%= notice %>
+ <% end %>
+
+
Showing carrier
+
+ <%= render @carrier %>
+
+ <%= link_to "Edit this carrier", edit_carrier_path(@carrier), 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 carriers", carriers_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 carrier", @carrier, 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/carriers/show.json.jbuilder b/app/views/carriers/show.json.jbuilder
new file mode 100644
index 0000000..26694ba
--- /dev/null
+++ b/app/views/carriers/show.json.jbuilder
@@ -0,0 +1 @@
+json.partial! "carriers/carrier", carrier: @carrier
diff --git a/app/views/id_card/setup/field_exceptions.html.erb b/app/views/id_card/setup/field_exceptions.html.erb
index 95fc3f6..db15bbe 100644
--- a/app/views/id_card/setup/field_exceptions.html.erb
+++ b/app/views/id_card/setup/field_exceptions.html.erb
@@ -57,7 +57,7 @@
<% end %>
- <%= button_tag "Add Another Alternate ID Card Change Item", class: "cursor-pointer bg-#{IdCard::Setup::FORM_COLORS[index]} hover:bg-deepcove text-xl font-bold text-platinum my-3 py-1 font-semibold leading-tight rounded border-3 border-#{IdCard::Setup::FORM_COLORS[index]} w-full", data: { action: "add-exception-item#addExemptionItem", add_exception_item_target: "exceptionItemButton" } %>
+ <%= button_tag "Add Alternate ID Card Change Item", class: "cursor-pointer bg-#{IdCard::Setup::FORM_COLORS[index]} hover:bg-deepcove text-xl font-bold text-platinum my-3 py-1 font-semibold leading-tight rounded border-3 border-#{IdCard::Setup::FORM_COLORS[index]} w-full", data: { action: "add-exception-item#addExemptionItem", add_exception_item_target: "exceptionItemButton" } %>
<%= exception_fields.fields_for :field_exception_items, IdCard::FieldExceptionItem.new, child_index: 'NEW_ITEM_RECORD' do |exception_item_fields| %>
diff --git a/app/views/provider_groups/_form.html.erb b/app/views/provider_groups/_form.html.erb
new file mode 100644
index 0000000..3cb3082
--- /dev/null
+++ b/app/views/provider_groups/_form.html.erb
@@ -0,0 +1,22 @@
+<%= form_with(model: provider_group, class: "contents") do |form| %>
+ <% if provider_group.errors.any? %>
+
+
<%= pluralize(provider_group.errors.count, "error") %> prohibited this provider_group from being saved:
+
+
+ <% provider_group.errors.each do |error| %>
+ - <%= error.full_message %>
+ <% end %>
+
+
+ <% end %>
+
+
+ <%= form.label :name %>
+ <%= form.text_field :name, class: ["block shadow-sm rounded-md border px-3 py-2 mt-2 w-full", {"border-gray-400 focus:outline-blue-600": provider_group.errors[:name].none?, "border-red-400 focus:outline-red-600": provider_group.errors[:name].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/provider_groups/_provider_group.html.erb b/app/views/provider_groups/_provider_group.html.erb
new file mode 100644
index 0000000..68acd04
--- /dev/null
+++ b/app/views/provider_groups/_provider_group.html.erb
@@ -0,0 +1,6 @@
+
+
+ Name:
+ <%= provider_group.name %>
+
+
diff --git a/app/views/provider_groups/_provider_group.json.jbuilder b/app/views/provider_groups/_provider_group.json.jbuilder
new file mode 100644
index 0000000..c77a4bb
--- /dev/null
+++ b/app/views/provider_groups/_provider_group.json.jbuilder
@@ -0,0 +1,2 @@
+json.extract! provider_group, :id, :name, :created_at, :updated_at
+json.url provider_group_url(provider_group, format: :json)
diff --git a/app/views/provider_groups/edit.html.erb b/app/views/provider_groups/edit.html.erb
new file mode 100644
index 0000000..5391313
--- /dev/null
+++ b/app/views/provider_groups/edit.html.erb
@@ -0,0 +1,10 @@
+<% content_for :title, "Editing provider group" %>
+
+
+
Editing provider group
+
+ <%= render "form", provider_group: @provider_group %>
+
+ <%= link_to "Show this provider group", @provider_group, 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 provider groups", provider_groups_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/provider_groups/index.html.erb b/app/views/provider_groups/index.html.erb
new file mode 100644
index 0000000..ec7e2a4
--- /dev/null
+++ b/app/views/provider_groups/index.html.erb
@@ -0,0 +1,29 @@
+<% content_for :title, "Provider groups" %>
+
+
+ <% if notice.present? %>
+
<%= notice %>
+ <% end %>
+
+
+
Provider groups
+ <%= link_to "New provider group", new_provider_group_path, class: "rounded-md px-3.5 py-2.5 bg-blue-600 hover:bg-blue-500 text-white block font-medium" %>
+
+
+
+ <% if @provider_groups.any? %>
+ <% @provider_groups.each do |provider_group| %>
+
+ <%= render provider_group %>
+
+ <%= link_to "Show", provider_group, 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_provider_group_path(provider_group), 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", provider_group, 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 provider groups found.
+ <% end %>
+
+
diff --git a/app/views/provider_groups/index.json.jbuilder b/app/views/provider_groups/index.json.jbuilder
new file mode 100644
index 0000000..c94b79c
--- /dev/null
+++ b/app/views/provider_groups/index.json.jbuilder
@@ -0,0 +1 @@
+json.array! @provider_groups, partial: "provider_groups/provider_group", as: :provider_group
diff --git a/app/views/provider_groups/new.html.erb b/app/views/provider_groups/new.html.erb
new file mode 100644
index 0000000..03666d8
--- /dev/null
+++ b/app/views/provider_groups/new.html.erb
@@ -0,0 +1,9 @@
+<% content_for :title, "New provider group" %>
+
+
+
New provider group
+
+ <%= render "form", provider_group: @provider_group %>
+
+ <%= link_to "Back to provider groups", provider_groups_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/provider_groups/show.html.erb b/app/views/provider_groups/show.html.erb
new file mode 100644
index 0000000..ee631b1
--- /dev/null
+++ b/app/views/provider_groups/show.html.erb
@@ -0,0 +1,15 @@
+<% content_for :title, "Showing provider group" %>
+
+
+ <% if notice.present? %>
+
<%= notice %>
+ <% end %>
+
+
Showing provider group
+
+ <%= render @provider_group %>
+
+ <%= link_to "Edit this provider group", edit_provider_group_path(@provider_group), 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 provider groups", provider_groups_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 provider group", @provider_group, 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/provider_groups/show.json.jbuilder b/app/views/provider_groups/show.json.jbuilder
new file mode 100644
index 0000000..ce1517a
--- /dev/null
+++ b/app/views/provider_groups/show.json.jbuilder
@@ -0,0 +1 @@
+json.partial! "provider_groups/provider_group", provider_group: @provider_group
diff --git a/app/views/providers/_form.html.erb b/app/views/providers/_form.html.erb
new file mode 100644
index 0000000..d9f38a4
--- /dev/null
+++ b/app/views/providers/_form.html.erb
@@ -0,0 +1,17 @@
+<%= form_with(model: provider, class: "contents") do |form| %>
+ <% if provider.errors.any? %>
+
+
<%= pluralize(provider.errors.count, "error") %> prohibited this provider from being saved:
+
+
+ <% provider.errors.each do |error| %>
+ - <%= error.full_message %>
+ <% end %>
+
+
+ <% end %>
+
+
+ <%= 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/providers/_provider.html.erb b/app/views/providers/_provider.html.erb
new file mode 100644
index 0000000..aeb6165
--- /dev/null
+++ b/app/views/providers/_provider.html.erb
@@ -0,0 +1,2 @@
+
+
diff --git a/app/views/providers/_provider.json.jbuilder b/app/views/providers/_provider.json.jbuilder
new file mode 100644
index 0000000..b0ac81e
--- /dev/null
+++ b/app/views/providers/_provider.json.jbuilder
@@ -0,0 +1,2 @@
+json.extract! provider, :id, :created_at, :updated_at
+json.url provider_url(provider, format: :json)
diff --git a/app/views/providers/edit.html.erb b/app/views/providers/edit.html.erb
new file mode 100644
index 0000000..a6a1346
--- /dev/null
+++ b/app/views/providers/edit.html.erb
@@ -0,0 +1,10 @@
+<% content_for :title, "Editing provider" %>
+
+
+
Editing provider
+
+ <%= render "form", provider: @provider %>
+
+ <%= link_to "Show this provider", @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 providers", 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/providers/index.html.erb b/app/views/providers/index.html.erb
new file mode 100644
index 0000000..70b2341
--- /dev/null
+++ b/app/views/providers/index.html.erb
@@ -0,0 +1,29 @@
+<% content_for :title, "Providers" %>
+
+
+ <% if notice.present? %>
+
<%= notice %>
+ <% end %>
+
+
+
Providers
+ <%= link_to "New provider", new_provider_path, class: "rounded-md px-3.5 py-2.5 bg-blue-600 hover:bg-blue-500 text-white block font-medium" %>
+
+
+
+ <% if @providers.any? %>
+ <% @providers.each do |provider| %>
+
+ <%= render provider %>
+
+ <%= link_to "Show", 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_provider_path(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", 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 providers found.
+ <% end %>
+
+
diff --git a/app/views/providers/index.json.jbuilder b/app/views/providers/index.json.jbuilder
new file mode 100644
index 0000000..71aa081
--- /dev/null
+++ b/app/views/providers/index.json.jbuilder
@@ -0,0 +1 @@
+json.array! @providers, partial: "providers/provider", as: :provider
diff --git a/app/views/providers/new.html.erb b/app/views/providers/new.html.erb
new file mode 100644
index 0000000..7c1916b
--- /dev/null
+++ b/app/views/providers/new.html.erb
@@ -0,0 +1,9 @@
+<% content_for :title, "New provider" %>
+
+
+
New provider
+
+ <%= render "form", provider: @provider %>
+
+ <%= link_to "Back to providers", 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/providers/show.html.erb b/app/views/providers/show.html.erb
new file mode 100644
index 0000000..d830436
--- /dev/null
+++ b/app/views/providers/show.html.erb
@@ -0,0 +1,15 @@
+<% content_for :title, "Showing provider" %>
+
+
+ <% if notice.present? %>
+
<%= notice %>
+ <% end %>
+
+
Showing provider
+
+ <%= render @provider %>
+
+ <%= link_to "Edit this provider", edit_provider_path(@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 providers", 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 provider", @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/providers/show.json.jbuilder b/app/views/providers/show.json.jbuilder
new file mode 100644
index 0000000..7f12678
--- /dev/null
+++ b/app/views/providers/show.json.jbuilder
@@ -0,0 +1 @@
+json.partial! "providers/provider", provider: @provider
diff --git a/bin/cron-entrypoint b/bin/cron-entrypoint
old mode 100755
new mode 100644
diff --git a/bin/delayed_job b/bin/delayed_job
old mode 100755
new mode 100644
diff --git a/bin/dev b/bin/dev
old mode 100755
new mode 100644
diff --git a/bin/development-entrypoint b/bin/development-entrypoint
old mode 100755
new mode 100644
diff --git a/bin/docker-entrypoint b/bin/docker-entrypoint
old mode 100755
new mode 100644
diff --git a/bin/importmap b/bin/importmap
old mode 100755
new mode 100644
diff --git a/bin/jobs b/bin/jobs
old mode 100755
new mode 100644
diff --git a/bin/jobs-entrypoint b/bin/jobs-entrypoint
old mode 100755
new mode 100644
diff --git a/bin/rails b/bin/rails
old mode 100755
new mode 100644
diff --git a/config/environments/development.rb b/config/environments/development.rb
index 7ad9f5a..f5cf993 100644
--- a/config/environments/development.rb
+++ b/config/environments/development.rb
@@ -20,6 +20,8 @@ Rails.application.configure do
# Enable server timing.
config.server_timing = true
+ config.hosts << "baclight"
+
# Enable/disable caching. By default caching is disabled.
# Run rails dev:cache to toggle caching.
if Rails.root.join("tmp/caching-dev.txt").exist?
diff --git a/config/initializers/cors.rb b/config/initializers/cors.rb
new file mode 100644
index 0000000..835d425
--- /dev/null
+++ b/config/initializers/cors.rb
@@ -0,0 +1,16 @@
+# Be sure to restart your server when you modify this file.
+
+# Avoid CORS issues when API is called from the frontend app.
+# Handle Cross-Origin Resource Sharing (CORS) in order to accept cross-origin Ajax requests.
+
+# Read more: https://github.com/cyu/rack-cors
+
+Rails.application.config.middleware.insert_before 0, Rack::Cors do
+ allow do
+ origins "*"
+
+ resource "*",
+ headers: :any,
+ methods: [ :get, :post, :put, :patch, :delete, :options, :head ]
+ end
+end
diff --git a/config/routes.rb b/config/routes.rb
index 343ea7c..366a248 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -70,6 +70,26 @@ Rails.application.routes.draw do
end
end
+ resources :admins do
+ collection do
+ get 'new_web_user'
+ post 'create_web_employer'
+ post 'create_web_broker'
+ post 'create_web_carrier'
+ end
+ end
+
+ namespace :api do
+ namespace :v1 do
+ # resources :web_id_cards, controller: "web_id_cards", only: [] do
+ # get '', action: :member_card, as: :web_member_card
+ # get '', action: :employer_cards, as: :web_employer_cards
+ # end
+ get 'web_id_cards/member_card/:id/:layout', to: 'web_id_cards#member_card'
+ get 'web_id_cards/employer_cards/:id', to: 'web_id_cards#employer_cards'
+ end
+ end
+
# Reveal health status on /up that returns 200 if the app boots with no exceptions, otherwise 500.
# Can be used by load balancers and uptime monitors to verify that the app is live.
diff --git a/db/migrate/20260629133740_add_active_status_to_member.rb b/db/migrate/20260629133740_add_active_status_to_member.rb
new file mode 100644
index 0000000..49cacdd
--- /dev/null
+++ b/db/migrate/20260629133740_add_active_status_to_member.rb
@@ -0,0 +1,5 @@
+class AddActiveStatusToMember < ActiveRecord::Migration[7.2]
+ def change
+ add_column :members, :active, :boolean
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 9573842..75d0e42 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema[7.2].define(version: 2026_05_13_162029) do
+ActiveRecord::Schema[7.2].define(version: 2026_06_29_133740) do
create_table "brokers", force: :cascade do |t|
t.string "name"
t.bigint "carrier_id"
@@ -307,6 +307,7 @@ ActiveRecord::Schema[7.2].define(version: 2026_05_13_162029) do
t.bigint "id_card_plan_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
+ t.boolean "active"
t.index ["employer_id"], name: "index_members_on_employer_id"
t.index ["id_card_plan_id"], name: "index_members_on_id_card_plan_id"
end
diff --git a/dev.compose.yaml b/dev.compose.yaml
deleted file mode 100644
index 6a551f4..0000000
--- a/dev.compose.yaml
+++ /dev/null
@@ -1,63 +0,0 @@
-services:
- web:
- build:
- context: ./
- dockerfile: development.Dockerfile
- command: bash -c "rm -f tmp/pids/server.pid && bin/dev"
- volumes:
- - .:/usr/src/app
- - bundle:/usr/local/bundle
- ports:
- - "3002:3002"
- env_file:
- - .env
- environment:
- - HISTFILE=/usr/src/app/log/.bash_history
- - RAILS_ENV=development
- - TAILWIND_POLLING=true
- - PUID=1000
- - PGID=100
- tty: true
- stdin_open: true
- # healthcheck:
- # test: ["CMD", "curl", "-f", "http://localhost:3002/up"]
- # interval: 5s
- # timeout: 3s
- # retries: 10
- # start_period: 10s
- # depends_on:
- # db:
- # condition: service_healthy
- # db:
- # build:
- # context: .
- # dockerfile: Dockerfile.db
- # volumes:
- # - ./mssql-data:/var/opt/mssql
- # ports:
- # - "1434:1434"
- # healthcheck:
- # test: ["CMD", "/opt/mssql-tools/bin/sqlcmd", "-Usa", "-PBr1tt0nPassw0rd", "-Q", "select 1"]
- # interval: 10s
- # timeout: 3s
- # retries: 10
- # start_period: 10s
- # cron:
- # build:
- # context: ./
- # dockerfile: development.Dockerfile
- # command: ./bin/cron-entrypoint
- # volumes:
- # - .:/usr/src/app
- # - bundle:/usr/local/bundle
- # environment:
- # - RAILS_ENV=development
- # - PUID=1000
- # - PGID=100
- # depends_on:
- # web:
- # condition: service_healthy
- # - db
-volumes:
- # redis_data:
- bundle:
diff --git a/seed_docs/logo_files/network/FirstHealthLogo.png b/seed_docs/logo_files/network/FirstHealthLogo.png
new file mode 100644
index 0000000..e30252f
Binary files /dev/null and b/seed_docs/logo_files/network/FirstHealthLogo.png differ