Compare commits

..

10 Commits

Author SHA1 Message Date
Jason Jordan 5a90ea6e14 beta build 2026-06-17 23:23:36 -04:00
Jason Jordan 5f04811c16 asset compilation 2026-05-06 17:21:06 -04:00
Jason Jordan 518522b080 updated dockerbuild for icons 5 2026-05-06 17:13:27 -04:00
Jason Jordan 826ef02322 updated dockerbuild for icons 4 2026-05-06 17:08:48 -04:00
Jason Jordan d25d5c9bba updated dockerbuild for icons 3 2026-05-06 16:38:37 -04:00
Jason Jordan 6c3649ad61 updated dockerbuild for icons 2 2026-05-06 16:29:07 -04:00
Jason Jordan f35cc99a0f updated dockerbuild for icons 2026-05-06 16:11:02 -04:00
Jason Jordan 34843e2da7 prod pruning 2 2026-05-06 15:14:51 -04:00
Jason Jordan 3bf9594842 prod pruning 2026-05-06 15:07:57 -04:00
Jason Jordan e0101be567 Prod build process 2026-05-06 13:28:16 -04:00
259 changed files with 2497 additions and 9308 deletions
+2
View File
@@ -0,0 +1,2 @@
/app/assets/builds/*
/app/assets/svg/*
-3
View File
@@ -1,3 +0,0 @@
PGHOST=db
PGUSER=postgres
PGPASSWORD=changeme
+9 -1
View File
@@ -79,4 +79,12 @@ yarn-debug.log*
/mssql-data
/logo_files
/employer_word_docs
/employer_word_docs
# Ignore application configuration
/config/application.yml
/scratch.rb
/start_rails.bat
/web.config
/db/old
+55 -44
View File
@@ -1,73 +1,84 @@
# syntax=docker/dockerfile:1
# check=error=true
# syntax = docker/dockerfile:1
# This Dockerfile is designed for production, not development.
# docker build -t my-app .
# docker run -d -p 80:80 -p 443:443 --name my-app -e RAILS_MASTER_KEY=<value from config/master.key> my-app
# 1. Base Stage: Common dependencies
ARG RUBY_VERSION=3.4.8
FROM ruby:$RUBY_VERSION-slim as base
# Make sure RUBY_VERSION matches the Ruby version in .ruby-version and Gemfile
ARG RUBY_VERSION=3.3.9
FROM docker.io/library/ruby:$RUBY_VERSION-slim AS base
# Rails app lives here
WORKDIR /rails
# Install base packages
RUN apt-get update -qq && \
apt-get install --no-install-recommends -y curl libjemalloc2 libvips postgresql-client && \
rm -rf /var/lib/apt/lists /var/cache/apt/archives
# Set production environment
ENV RAILS_ENV="production" \
BUNDLE_DEPLOYMENT="1" \
BUNDLE_PATH="/usr/local/bundle" \
BUNDLE_WITHOUT="development"
BUNDLE_WITHOUT="development:test"
# Throw-away build stage to reduce size of final image
FROM base AS build
# Install packages needed to build gems
# Install base packages (libvips for Active Storage, curl for healthchecks)
RUN apt-get update -qq && \
apt-get install --no-install-recommends -y build-essential git libpq-dev pkg-config libyaml-dev && \
apt-get install --no-install-recommends -y \
curl \
git \
libvips \
freetds-bin \
freetds-dev \
libpq-dev \
libyaml-dev \
cron \
libjemalloc2 \
dos2unix && \
rm -rf /var/lib/apt/lists /var/cache/apt/archives
# 2. Build Stage: Gems and Assets
FROM base as build
# Install packages needed to build gems and precompile assets
RUN apt-get update -qq && \
apt-get install --no-install-recommends -y build-essential pkg-config less && \
# mkdir -p /etc/apt/keyrings && \
# curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \
# echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" > /etc/apt/sources.list.d/nodesource.list && \
# apt-get update && \
# apt-get install nodejs -y && \
rm -rf /var/lib/apt/lists /var/cache/apt/archives
# RUN apt-get install -y npm
# RUN npm install -g yarn
# Install application gems
RUN bundle config set --local frozen false
COPY Gemfile Gemfile.lock ./
RUN bundle install && \
rm -rf ~/.bundle/ "${BUNDLE_PATH}"/ruby/*/cache "${BUNDLE_PATH}"/ruby/*/bundler/gems/*/.git && \
bundle exec bootsnap precompile --gemfile
rm -rf ~/.bundle/ "${BUNDLE_PATH}"/ruby/*/cache "${BUNDLE_PATH}"/ruby/*/bundler/gems/*/.git
# Copy application code
COPY . .
# Precompile bootsnap code for faster boot times
RUN bundle exec bootsnap precompile app/ lib/
RUN ./bin/rails stimulus:manifest:update
RUN ./bin/importmap pin .
# Precompiling assets for production without requiring secret RAILS_MASTER_KEY
RUN SECRET_KEY_BASE_DUMMY=1 ./bin/rails assets:precompile
# RUN bundle exec ./bin/rails rails_icons:sync
RUN ./bin/rails generate rails_icons:sync --libraries=lucide
# Precompile assets (Tailwind is triggered here via assets:precompile)
# SECRET_KEY_BASE_DUMMY allows precompilation without real secrets
# RUN bundle exec rails assets:clobber assets:precompile RAILS_ENV=production SECRET_KEY_BASE_DUMMY=1
RUN bundle exec rails assets:precompile RAILS_ENV=production SECRET_KEY_BASE_DUMMY=1
# Final stage for app image
# 3. Final Stage: Lean Runtime
FROM base
# Copy built artifacts: gems, application
COPY --from=build "${BUNDLE_PATH}" "${BUNDLE_PATH}"
# Copy built artifacts: gems and precompiled assets
# COPY --from=build /rails/public /rails/public
# COPY --from=build /rails/app/javascript /rails/app/javascript
# COPY --from=build /rails/config/importmap.rb /rails/config/importmap.rb
COPY --from=build /usr/local/bundle /usr/local/bundle
COPY --from=build /rails /rails
# Run and own only the runtime files as a non-root user for security
RUN groupadd --system --gid 1000 rails && \
useradd rails --uid 1000 --gid 1000 --create-home --shell /bin/bash && \
chown -R rails:rails db log storage tmp
USER 1000:1000
# Run as a non-privileged user for security
RUN useradd -ms /bin/bash rails
RUN chown -R rails:rails /rails
USER rails:rails
# Entrypoint prepares the database.
ENTRYPOINT ["/rails/bin/docker-entrypoint"]
HEALTHCHECK --interval=15s --timeout=3s --start-period=0s --start-interval=5s --retries=3 \
CMD curl -f http://localhost:3000/up || exit 1
# Start the server by default, this can be overwritten at runtime
EXPOSE 3000
# The default Rails Dockerfile uses `./bin/rails server`, but when using Puma,
# they recommend using bundle exec puma. ref: https://github.com/puma/puma#rails
# Start the server
EXPOSE 3002
CMD ["bundle", "exec", "puma", "-C", "config/puma.rb"]
+6 -2
View File
@@ -89,7 +89,11 @@ gem 'pdf-reader'
gem 'rails_icons'
gem 'fastimage'
gem 'rubyzip', require: 'zip'
gem "solid_queue"
# gem "solid_queue"
gem 'delayed_job_active_record'
gem 'daemons'
gem 'image_processing'
gem "ruby-vips"
gem 'whenever', require: false
gem 'amatch'
gem 'amatch'
gem 'figaro'
+37 -37
View File
@@ -78,7 +78,7 @@ GEM
minitest (>= 5.1)
securerandom (>= 0.3)
tzinfo (~> 2.0, >= 2.0.5)
addressable (2.8.9)
addressable (2.9.0)
public_suffix (>= 2.0.2, < 8.0)
afm (1.0.0)
amatch (0.6.0)
@@ -88,9 +88,9 @@ GEM
base64 (0.3.0)
bcrypt (3.1.22)
benchmark (0.5.0)
bigdecimal (4.0.1)
bigdecimal (4.1.2)
bindex (0.8.1)
bootsnap (1.23.0)
bootsnap (1.24.3)
msgpack (~> 1.2)
brakeman (8.0.4)
racc
@@ -117,7 +117,15 @@ GEM
connection_pool (3.0.2)
crass (1.0.6)
csv (3.3.5)
daemons (1.4.1)
date (3.5.1)
delayed_job (4.2.0)
activesupport (>= 3.0, < 9.0)
benchmark
logger
delayed_job_active_record (4.1.11)
activerecord (>= 3.0, < 9.0)
delayed_job (>= 3.0, < 5)
devise (5.0.3)
bcrypt (~> 3.0)
orm_adapter (~> 0.1)
@@ -129,15 +137,12 @@ GEM
nokogiri (~> 1.13, >= 1.13.0)
rubyzip (>= 2.0, < 4)
drb (2.2.3)
erb (6.0.2)
erb (6.0.4)
erubi (1.13.1)
et-orbi (1.4.0)
tzinfo
fastimage (2.4.1)
ffi (1.17.4-x86_64-linux-gnu)
fugit (1.12.1)
et-orbi (~> 1.4)
raabro (~> 1.4)
figaro (1.3.0)
thor (>= 0.14.0, < 2)
globalid (1.3.0)
activesupport (>= 6.1)
hashery (2.1.2)
@@ -157,7 +162,7 @@ GEM
activesupport (>= 6.0.0)
railties (>= 6.0.0)
io-console (0.8.2)
irb (1.17.0)
irb (1.18.0)
pp (>= 0.6.0)
prism (>= 1.3.0)
rdoc (>= 4.0.0)
@@ -165,7 +170,7 @@ GEM
jbuilder (2.14.1)
actionview (>= 7.0.0)
activesupport (>= 7.0.0)
json (2.19.2)
json (2.19.5)
language_server-protocol (3.17.0.5)
lint_roller (1.1.0)
logger (1.7.0)
@@ -184,14 +189,14 @@ GEM
mini_magick (5.3.1)
logger
mini_mime (1.1.5)
minitest (6.0.2)
minitest (6.0.6)
drb (~> 2.0)
prism (~> 1.5)
mize (0.6.1)
msgpack (1.8.0)
multi_xml (0.8.1)
multi_xml (0.9.1)
bigdecimal (>= 3.1, < 5)
net-imap (0.6.3)
net-imap (0.6.4)
date
net-protocol
net-pop (0.1.2)
@@ -201,11 +206,11 @@ GEM
net-smtp (0.5.1)
net-protocol
nio4r (2.7.5)
nokogiri (1.19.2-x86_64-linux-gnu)
nokogiri (1.19.3-x86_64-linux-gnu)
racc (~> 1.4)
orm_adapter (0.5.0)
parallel (1.27.0)
parser (3.3.10.2)
parallel (2.1.0)
parser (3.3.11.1)
ast (~> 2.4.1)
racc
pdf-reader (2.15.1)
@@ -232,12 +237,11 @@ GEM
nio4r (~> 2.0)
pundit (2.5.2)
activesupport (>= 3.0.0)
raabro (1.4.0)
racc (1.8.1)
rack (3.2.5)
rack (3.2.6)
rack-mini-profiler (4.0.1)
rack (>= 1.2.0)
rack-session (2.1.1)
rack-session (2.1.2)
base64 (>= 0.1.0)
rack (>= 3.0.0)
rack-test (2.2.0)
@@ -265,7 +269,7 @@ GEM
rails-html-sanitizer (1.7.0)
loofah (~> 2.25)
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.7.1)
rails_icons (1.8.0)
icons (~> 0.8.1)
rails (>= 7.0)
railties (7.2.3)
@@ -279,14 +283,14 @@ GEM
tsort (>= 0.2)
zeitwerk (~> 2.6)
rainbow (3.1.1)
rake (13.3.1)
rake (13.4.2)
rdoc (7.2.0)
erb
psych (>= 4.0.0)
tsort
readline (0.0.4)
reline
regexp_parser (2.11.3)
regexp_parser (2.12.0)
reline (0.6.3)
io-console (~> 0.5)
responders (3.2.0)
@@ -310,11 +314,11 @@ GEM
rspec-mocks (>= 3.13.0, < 5.0.0)
rspec-support (>= 3.13.0, < 5.0.0)
rspec-support (3.13.7)
rubocop (1.86.0)
rubocop (1.86.1)
json (~> 2.3)
language_server-protocol (~> 3.17.0.2)
lint_roller (~> 1.1.0)
parallel (~> 1.10)
parallel (>= 1.10)
parser (>= 3.3.0.2)
rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 2.9.3, < 3.0)
@@ -346,21 +350,14 @@ GEM
ruby-vips (2.3.0)
ffi (~> 1.12)
logger
rubyzip (3.2.2)
rubyzip (3.3.0)
securerandom (0.4.1)
selenium-webdriver (4.41.0)
selenium-webdriver (4.43.0)
base64 (~> 0.2)
logger (~> 1.4)
rexml (~> 3.2, >= 3.2.5)
rubyzip (>= 1.2.2, < 4.0)
websocket (~> 1.0)
solid_queue (1.4.0)
activejob (>= 7.1)
activerecord (>= 7.1)
concurrent-ruby (>= 1.3.1)
fugit (~> 1.11)
railties (>= 7.1)
thor (>= 1.3.1)
sprockets (4.2.2)
concurrent-ruby (~> 1.0)
logger
@@ -376,10 +373,10 @@ GEM
tailwindcss-rails (4.4.0)
railties (>= 7.0.0)
tailwindcss-ruby (~> 4.0)
tailwindcss-ruby (4.2.1-x86_64-linux-gnu)
tailwindcss-ruby (4.2.4-x86_64-linux-gnu)
thor (1.5.0)
timeout (0.6.1)
tins (1.52.0)
tins (1.53.0)
bigdecimal
mize (~> 0.6)
readline
@@ -426,9 +423,12 @@ DEPENDENCIES
bundler-audit
capybara
combine_pdf
daemons
delayed_job_active_record
devise
docx
fastimage
figaro
httparty
image_processing
importmap-rails
@@ -444,9 +444,9 @@ DEPENDENCIES
rubocop-rails
rubocop-rails-omakase
rubocop-rspec
ruby-vips
rubyzip
selenium-webdriver
solid_queue
sprockets-rails
stimulus-rails
tailwindcss-rails
+1
View File
@@ -21,6 +21,7 @@
--color-cobalt-tinted: #003B8F;
/* cobalt blue */
--color-cobalt-vivid: #005DE0;
/* #3388FF */
/* platinum */
--color-platinum: #E0E0E0;
/* copper */
+11
View File
@@ -1,4 +1,15 @@
# frozen_string_literal: true
class ApplicationController < ActionController::Base
include Pundit::Authorization
before_action :authenticate_user!
def after_sign_in_path_for(resource)
stored_location_for(resource) || dashboard_path
end
def after_sign_out_path_for(resource_or_scope)
root_path
end
end
-69
View File
@@ -1,69 +0,0 @@
class ArticlesController < ApplicationController
before_action :set_article, only: %i[ show edit update destroy ]
# GET /articles or /articles.json
def index
@articles = Article.all
end
# GET /articles/1 or /articles/1.json
def show
end
# GET /articles/new
def new
@article = Article.new
end
# GET /articles/1/edit
def edit
end
# POST /articles or /articles.json
def create
@article = Article.new(article_params)
respond_to do |format|
if @article.save
format.html { redirect_to @article, notice: "Article was successfully created." }
format.json { render :show, status: :created, location: @article }
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @article.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /articles/1 or /articles/1.json
def update
respond_to do |format|
if @article.update(article_params)
format.html { redirect_to @article, notice: "Article was successfully updated." }
format.json { render :show, status: :ok, location: @article }
else
format.html { render :edit, status: :unprocessable_entity }
format.json { render json: @article.errors, status: :unprocessable_entity }
end
end
end
# DELETE /articles/1 or /articles/1.json
def destroy
@article.destroy
respond_to do |format|
format.html { redirect_to articles_url, notice: "Article was successfully destroyed." }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_article
@article = Article.find(params[:id])
end
# Only allow a list of trusted parameters through.
def article_params
params.require(:article).permit(:title, :content)
end
end
+70
View File
@@ -0,0 +1,70 @@
class BrokersController < ApplicationController
before_action :set_broker, only: %i[ show edit update destroy ]
# GET /brokers or /brokers.json
def index
@brokers = Broker.all
end
# GET /brokers/1 or /brokers/1.json
def show
end
# GET /brokers/new
def new
@broker = Broker.new
end
# GET /brokers/1/edit
def edit
end
# POST /brokers or /brokers.json
def create
@broker = Broker.new(broker_params)
respond_to do |format|
if @broker.save
format.html { redirect_to @broker, notice: "Broker was successfully created." }
format.json { render :show, status: :created, location: @broker }
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @broker.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /brokers/1 or /brokers/1.json
def update
respond_to do |format|
if @broker.update(broker_params)
format.html { redirect_to @broker, notice: "Broker was successfully updated.", status: :see_other }
format.json { render :show, status: :ok, location: @broker }
else
format.html { render :edit, status: :unprocessable_entity }
format.json { render json: @broker.errors, status: :unprocessable_entity }
end
end
end
# DELETE /brokers/1 or /brokers/1.json
def destroy
@broker.destroy!
respond_to do |format|
format.html { redirect_to brokers_path, notice: "Broker 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_broker
@broker = Broker.find(params[:id])
end
# Only allow a list of trusted parameters through.
def broker_params
params.require(:broker).permit(:name, :carrier_id)
end
end
@@ -1,57 +0,0 @@
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
@@ -1,70 +0,0 @@
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
-70
View File
@@ -1,70 +0,0 @@
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
+70
View File
@@ -0,0 +1,70 @@
class CarriersController < ApplicationController
before_action :set_carrier, only: %i[ show edit update destroy ]
# GET /carriers or /carriers.json
def index
@carriers = Carrier.all
end
# GET /carriers/1 or /carriers/1.json
def show
end
# GET /carriers/new
def new
@carrier = Carrier.new
end
# GET /carriers/1/edit
def edit
end
# POST /carriers or /carriers.json
def create
@carrier = Carrier.new(carrier_params)
respond_to do |format|
if @carrier.save
format.html { redirect_to @carrier, notice: "Carrier was successfully created." }
format.json { render :show, status: :created, location: @carrier }
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @carrier.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /carriers/1 or /carriers/1.json
def update
respond_to do |format|
if @carrier.update(carrier_params)
format.html { redirect_to @carrier, notice: "Carrier was successfully updated.", status: :see_other }
format.json { render :show, status: :ok, location: @carrier }
else
format.html { render :edit, status: :unprocessable_entity }
format.json { render json: @carrier.errors, status: :unprocessable_entity }
end
end
end
# DELETE /carriers/1 or /carriers/1.json
def destroy
@carrier.destroy!
respond_to do |format|
format.html { redirect_to carriers_path, notice: "Carrier 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_carrier
@carrier = Carrier.find(params[:id])
end
# Only allow a list of trusted parameters through.
def carrier_params
params.require(:carrier).permit(:name)
end
end
-13
View File
@@ -1,13 +0,0 @@
class CommentsController < ApplicationController
before_action :set_article
def create
@article.comments.create! params.required(:comment).permit(:content)
redirect_to @article
end
private
def set_article
@article = Article.find(params[:article_id])
end
end
+4
View File
@@ -0,0 +1,4 @@
class DashboardController < ApplicationController
def index
end
end
@@ -1,257 +0,0 @@
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 :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 = WordDocProcessor.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 :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)
if params[:back_button]
@form.current_step = @form.previous_step
elsif params[:skip_newsletter]
@form.current_step = @form.next_step # Skip newsletter step
end
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,
# :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
@@ -1,244 +0,0 @@
class EmployerSetupController < ApplicationController
def new
# session.delete(:employer_setup_data)
# session.clear()
# puts "Start"
# puts session[:employer_setup_data]
if session[:employer_setup_data].blank?
@process = EmployerSetupProcess.create(status: "form")
session[:employer_setup_data] = { "employer_setup_process_id" => @process.id }
end
puts "-S--------------------------------------"
puts session[:employer_setup_data]
# session[:employer_setup_data]['current_step'] = 'plans'
@top_form = EmployerSetupForm.new(session[:employer_setup_data])
if @top_form.current_step != 'summary'
@form = form_for_step
else
@form = @top_form
end
# case @top_form.current_step
# when 'general_information'
# @form = EmployerSetupGeneralInformationForm.new(session[:employer_setup_data]&.dig('general_information_data'))
# when 'plans'
# @form = EmployerSetupPlansForm.new(session[:employer_setup_data]&.dig('plans_data'))
# when 'network_exceptions'
# @form = EmployerSetupNetworkExceptionsForm.new(session[:employer_setup_data]&.dig('network_exceptions_data'))
# when 'summary'
# @form = @top_form
# end
render @top_form.current_step_view
end
def create
# puts session[:employer_setup_data]
@top_form = EmployerSetupForm.new(session[:employer_setup_data])
if @top_form.current_step != 'summary'
if process_step(@top_form.current_step)
session[:employer_setup_data]['current_step'] = @top_form.next_step
puts "---------------------------------------"
puts "pass"
puts "next - #{@top_form.next_step}"
puts session[:employer_setup_data]
puts "---------------------------------------"
redirect_to new_employer_setup_path
else
puts "fail"
render @top_form.current_step_view
end
else
if @top_form.save
session.delete(:employer_setup_data)
redirect_to root_path, notice: "Employer setup successfully!"
else
render @top_form.current_step_view
end
end
# case @top_form.current_step
# when 'general_information'
# @form = EmployerSetupGeneralInformationForm.new(general_information_params)
# if @form.valid?
# session[:employer_setup_data]['general_information_data'] = general_information_params
# session[:employer_setup_data]['current_step'] = @top_form.next_step
# redirect_to new_employer_setup_path
# else
# render @top_form.current_step_view
# end
# when 'plans'
# @form = EmployerSetupPlansForm.new(plans_params)
# if @form.valid?
# session[:employer_setup_data]['plans_data'] = plans_params
# session[:employer_setup_data]['current_step'] = @top_form.next_step
# redirect_to new_employer_setup_path
# else
# render @top_form.current_step_view
# end
# when 'network_exceptions'
# @form = EmployerSetupNetworkExceptionsForm.new(network_exceptions_params)
# if @form.valid?
# session[:employer_setup_data]['network_exceptions_data'] = network_exceptions_params
# session[:employer_setup_data]['current_step'] = @top_form.next_step
# redirect_to new_employer_setup_path
# else
# render @top_form.current_step_view
# end
# when 'summary'
# @form = EmployerSetupForm.new(session[:employer_setup_data])
# if @form.save
# session.delete(:employer_setup_data)
# redirect_to root_path, notice: "Employer setup successfully!"
# else
# render @top_form.current_step_view
# end
# end
end
def update
@form = RegistrationForm.new(registration_params)
if params[:back_button]
@form.current_step = @form.previous_step
elsif params[:skip_newsletter]
@form.current_step = @form.next_step # Skip newsletter step
end
render :new
end
private
# 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
@@ -1,109 +0,0 @@
class EmployerSetupController < ApplicationController
def new
@employer_data = session[:employer_data] || {}
# @id_card_templates = IdCardTemplate.where.not(title: "BLANK")
# @id_card_template_benefits = IdCardTemplate.find_by(title: "BLANK").id_card_template_benefits.sort_by(&:sequence)
end
def create_employer
@employer_data = {employer: {}}
@employer_data[:employer].merge!(params.require(:employer).permit(
:name,
:group_number,
:pl_plan_key,
:effective_date
))
@employer_data[:employer].merge!(params.permit(:number_of_plans))
session[:employer_data] = @employer_data
puts session[:employer_data]
redirect_to action: :plans
end
def plans
@employer_data = session[:employer_data] || {}
@id_card_templates = IdCardBenefitsTemplate.where.not(title: "BLANK")
@id_card_template_benefits = IdCardBenefitsTemplate.find_by(title: "BLANK").id_card_benefits.sort_by(&:sequence)
end
def create_plans
@employer_data = session[:employer_data] || {}
@employer_data.merge!(params.require(:plans).permit(plans_params))
session[:employer_data] = @employer_data
redirect_to action: :networks
end
def networks
@employer_data = session[:employer_data] || {}
end
def create_provider_networks
@employer_data = session[:employer_data] || {}
@employer_data.merge!(params.require(:plans).permit(plans_params))
session[:employer_data] = @employer_data
redirect_to action: :networks
end
def process_bad_name
@final_data = session[:employer_data]
# Vhcs::HlPlanCode.create(
# group_number: @final_data['employer']['name'],
# medical_number: @final_data['employer']['group_number'],
# dental_number: ' ',
# plan_key: @final_data['employer']['pl_plan_key'],
# effective_date: @final_data['employer']['effective_date']
# )
# default = Vhcs::HLRXCrosRef.find_by(pl_plan_key: 52)
# Vhcs::HLRXCrosRef.create(
# group_no: @final_data['employer']['group_number'],
# rx_group_id: @final_data['employer']['group_number'],
# help_desk: default.help_desk,
# customer_service: default.customer_service,
# web_url: default.web_url,
# pl_plan_key: @final_data['employer']['pl_plan_key']
# )
# plans_data = @final_data['plans']
# benefit_descs = plans_data.delete('benefit_descs')
# plans_data.each do |key, value|
# plan_id = value.delete('plan_id')
# value.each do |key2, value2|
# Vhcs::HLEgglestonCardBenefit.create(
# plan_id: plan_id,
# benefit_desc: benefit_descs[key2],
# benefit: value2,
# sequence: key2,
# plan_key: @final_data['employer']['pl_plan_key']
# )
# end
# end
# Create or update your model with @final_data
# Clear the session data after successful save
session[:employer_data] = nil
# Redirect to a success page
end
private
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
@@ -1,89 +0,0 @@
class EmployerSetupController < ApplicationController
def new
# session.delete(:employer_setup_data)
@form = EmployerSetupForm.new(session[:employer_setup_data])
if @form.current_step == "plans"
@id_card_templates = IdCardBenefitsTemplate.where.not(title: "BLANK")
@id_card_template_benefits = IdCardBenefitsTemplate.find_by(title: "BLANK").id_card_benefits.sort_by(&:sequence)
end
puts session[:employer_setup_data]
render "employer_setup/#{@form.current_step}" # Renders the view for the current step
end
def create
filtered_params = employer_setup_params.except(:validation_context)
@form = EmployerSetupForm.new(filtered_params)
if @form.current_step == "general" && @form.valid?(:general_info)
# @form.current_step = "plans"
@form.current_step = "networks" # TESTING, Change Back
session[:employer_setup_data] = @form.attributes.slice("current_step", "name", "employer_logo", "group_number", "pl_plan_key", "effect_date", "number_of_plans", "network", "number_of_additional_network_logos")
redirect_to new_employer_setup_path # Redirect to the next step
elsif @form.current_step == "plans" && @form.valid?(:plan_info)
if @form.number_of_additional_network_logos == 0
next_step = "summary"
else
next_step = "networks"
end
@form.current_step = next_step
session[:employer_setup_data].merge!(@form.attributes.slice("current_step", "plans", "benefit_descs"))
redirect_to new_employer_setup_path
# @form = UserOnboardingForm.new(session[:employer_setup_data]) # Re-initialize with all data
elsif @form.current_step == "networks" && @form.valid?(:network_info)
@form.current_step = "summary"
session[:employer_setup_data].merge!(@form.attributes.slice("current_step", "network_exceptions"))
redirect_to new_employer_setup_path
elsif @form.current_step == "summary"
puts @form.attributes
if @form.save
session.delete(:employer_setup_data) # Clear session data after successful save
redirect_to root_path, notice: "Employer setup successfully!"
else
render "employer_setup/summary" # Render step two again with errors
end
else
render "employer_setup/#{@form.current_step}" # Render the current step again with errors
end
end
private
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
+13 -207
View File
@@ -3,7 +3,10 @@ class EmployersController < ApplicationController
# View Methods
def index
@uninitialized = Employer.in_automation_initilization
@with_active_id_card_setup = Employer.with_active_id_card_setup
@with_active_id_card_setup = Employer.active
current_group_numbers = @with_active_id_card_setup.pluck(:group_number)
valid_group_numbers = ["62210","61986","42018","41283","0230643","43190","0230642","0230644","0230646","0233955","600102","0249127","0257902","0257947","600112","600114","0261611","600117","0261684","0261685","0261826","600121","0265450","600123","0267470","0268540","0268599"]
@beta_unassigned_group_numbers = valid_group_numbers - current_group_numbers
@deactivated = Employer.deactivated
end
@@ -16,29 +19,13 @@ class EmployersController < ApplicationController
render :new
end
# def import_old
# 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 = WordDocProcessor.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
render :new
render :new, status: :unprocessable_entity
end
end
@@ -48,7 +35,6 @@ class EmployersController < ApplicationController
end
def update
puts "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
employer_params = Employer.permitted_params(params)
@employer = Employer.find(params[:id])
@@ -63,9 +49,9 @@ class EmployersController < ApplicationController
end
def destroy
# @resource = Resource.find(params[:id])
# @resource.destroy
# redirect_to resources_url, notice: 'Resource was successfully destroyed.'
@employer = Employer.find(params[:id])
@employer.destroy
redirect_to employers_path, notice: "#{@employer.name} was successfully deleted."
end
@@ -83,6 +69,11 @@ class EmployersController < ApplicationController
redirect_to employer_path(@employer.slug)
end
def beta_automation_simulation
BetaAutomationSimulationService.new().call
redirect_to employers_path
end
def import
word_doc = params[:employer][:import_from_word]
if word_doc.present? && word_doc.is_a?(ActionDispatch::Http::UploadedFile)
@@ -97,189 +88,4 @@ class EmployersController < ApplicationController
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
@@ -13,19 +13,19 @@ module IdCard
def create
file = logo_params["logo_file"]
if file.present? && file.is_a?(ActionDispatch::Http::UploadedFile)
employer_id = logo_params["employer_id"]
employer = Employer.find(employer_id)
setup = employer.id_card_setup
if setup.present? && file.present? && file.is_a?(ActionDispatch::Http::UploadedFile)
filename = file.original_filename
# binary_data = file.read
binary_data = File.binread(file)
meme_type = Marcel::MimeType.for(file)
employerlogo = IdCard::EmployerLogo.create(
filename: filename,
image_data: binary_data,
content_type: meme_type
)
employer_logo = IdCard::EmployerLogo.find_or_create_by(filename: filename, setup_id: setup.id)
employer_logo.update(image_data: binary_data)
render json: employerlogo, only: [:id], status: :ok
render json: employer_logo, only: [:id], status: :ok
end
end
@@ -54,7 +54,7 @@ module IdCard
private
def logo_params
params.require(:id_card_employer_logo).permit(:logo_file)
params.require(:id_card_employer_logo).permit(:logo_file, :employer_id)
end
end
+18 -8
View File
@@ -5,6 +5,7 @@ module IdCard
def index
@employer_setups = IdCard::Setup.active.to_a
@queue_members = IdCardQueueService::GetQueuedMembers.new().call
update_missing_members(@queue_members)
add_queued_count_to_employer_setup(@queue_members)
@queued = @employer_setups.select { |setup| setup.queued_card_count > 0 }.sort_by { |setup| setup.print_name }
@not_queued = @employer_setups.select { |setup| setup.queued_card_count == 0 }.sort_by { |setup| setup.print_name }
@@ -15,6 +16,9 @@ module IdCard
def print_all_queued
@queue_members = IdCardQueueService::GetQueuedMembers.new().call
# @queue_members.delete_if { |em| ["2", "19", "16", "54"].include?(em[:pl_plan_key])}
# @queue_members.push({pl_plan_key: "54", member_keys: [383840]})
cards_pdf = IdCardPrinterService::CardsGenerator.new(@queue_members, "PrintCard").call
send_data cards_pdf.to_pdf,
@@ -28,6 +32,7 @@ module IdCard
pl_plan_key = params[:id].to_s
@employer = Employer.find_by(pl_plan_key: pl_plan_key)
@queue_members = IdCardQueueService::GetQueuedMembers.new(pl_plan_key).call
# @queue_members.first[:member_keys].delete(379590) && @queue_members.first[:member_keys].push(379610)
cards_pdf = IdCardPrinterService::CardsGenerator.new(@queue_members, "PrintCard").call
send_data cards_pdf.to_pdf,
@@ -38,14 +43,9 @@ module IdCard
end
def generate_sample
if Integer(params[:id], exception: false).is_a?(Integer)
pl_plan_key = params[:id].to_s
@employer = Employer.find_by(pl_plan_key: pl_plan_key)
else
slug = params[:id]
@employer = Employer.find_by(slug: slug)
end
sample_cards_pdf = IdCardPrinterService::SampleCardsGenerator.new(@employer).call
employer_id = params[:id]
@employer = Employer.find(employer_id)
sample_cards_pdf = IdCardPrinterService::SampleCardsGenerator.new(@employer.id).call
send_data sample_cards_pdf.to_pdf,
filename: "#{@employer.name.parameterize(separator: "_")}_sample_cards_#{Date.today}.pdf",
@@ -108,6 +108,16 @@ module IdCard
end
private
def update_missing_members(queued_employer_members)
queued_employer_members.each do |queued_employer|
existing_members = Member.where(pb_entity_key: queued_employer[:member_keys]).pluck(:pb_entity_key)
missing_members = queued_employer[:member_keys] - existing_members
missing_members.each do |pb_entity_key|
AutomationService::MemberUpdate.new(queued_employer[:pl_plan_key], pb_entity_key).call
end
end
end
def add_queued_count_to_employer_setup(queued_employer_members)
@@ -1,49 +1,49 @@
module IdCard
class PrintDataController < ApplicationController
def generate_sample
@employer = Employer.find_by(slug: params[:employer_slug])
sample_cards_pdf = IdCardPrinterService::SampleCardsGenerator.new(@employer).call
# def generate_sample
# @employer = Employer.find_by(slug: params[:employer_slug])
# sample_cards_pdf = IdCardPrinterService::SampleCardsGenerator.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'
# send_data sample_cards_pdf.to_pdf,
# filename: "#{@employer.name.parameterize(separator: "_")}_sample_cards_#{Date.today}.pdf",
# type: "application/pdf",
# disposition: 'attachment'
end
# end
def generate_print
@employer = Employer.find_by(slug: params[:employer_slug])
cards_pdf = IdCardPrinterService::EmployerCardsGenerator.new(@employer, "PrintCard").call
# def generate_print
# @employer = Employer.find_by(slug: params[:employer_slug])
# cards_pdf = IdCardPrinterService::EmployerCardsGenerator.new(@employer, "PrintCard").call
send_data cards_pdf.to_pdf,
filename: "#{@employer.name.parameterize(separator: "_")}_print_cards_#{Date.today}.pdf",
type: "application/pdf",
disposition: 'attachment'
# send_data cards_pdf.to_pdf,
# filename: "#{@employer.name.parameterize(separator: "_")}_print_cards_#{Date.today}.pdf",
# type: "application/pdf",
# disposition: 'attachment'
end
# end
def generate_mobile_display
@employer = Employer.find_by(slug: params[:employer_slug])
cards_pdf = IdCardPrinterService::EmployerCardsGenerator.new(@employer, "MobileDisplayCard").call
# def generate_mobile_display
# @employer = Employer.find_by(slug: params[:employer_slug])
# cards_pdf = IdCardPrinterService::EmployerCardsGenerator.new(@employer, "MobileDisplayCard").call
send_data cards_pdf.to_pdf,
filename: "#{@employer.name.parameterize(separator: "_")}_mobile_display_cards_#{Date.today}.pdf",
type: "application/pdf",
disposition: 'attachment'
# send_data cards_pdf.to_pdf,
# filename: "#{@employer.name.parameterize(separator: "_")}_mobile_display_cards_#{Date.today}.pdf",
# type: "application/pdf",
# disposition: 'attachment'
end
# end
def generate_full_page
@employer = Employer.find_by(slug: params[:employer_slug])
cards_pdf = IdCardPrinterService::EmployerCardsGenerator.new(@employer, "FullPageCard", true).call
# def generate_full_page
# @employer = Employer.find_by(slug: params[:employer_slug])
# cards_pdf = IdCardPrinterService::EmployerCardsGenerator.new(@employer, "FullPageCard", true).call
cards_pdf.rewind
send_data cards_pdf.sysread,
filename: "#{@employer.name.parameterize(separator: "_")}_full_page_cards_#{Date.today}.zip",
type: 'application/zip',
disposition: 'attachment'
# cards_pdf.rewind
# send_data cards_pdf.sysread,
# filename: "#{@employer.name.parameterize(separator: "_")}_full_page_cards_#{Date.today}.zip",
# type: 'application/zip',
# disposition: 'attachment'
end
# end
end
end
+18 -217
View File
@@ -3,38 +3,17 @@ module IdCard
before_action :set_employer_and_setup
# View Methods
# def edit
# @employer = Employer.find_by(slug: params[:employer_id])
# if @employer.id_card_enabled?
# @setup = @employer.id_card_setup
# else
# @setup = @employer.create_id_card_setup
# end
# render :edit
# end
# def update
# setup_params = IdCard::Setup.permitted_params(params)
# @setup = IdCard::Setup.find(params[:id])
# if @setup.update(setup_params)
# puts "sucess"
# redirect_to employer_path(@setup.employer.slug), notice: 'ID Card Setup was successfully updated.'
# else
# puts "fail"
# render :edit, status: :unprocessable_entity
# end
# end
def index
provider_defaults = IdCard::ProviderSection.defaults
@provider_options = provider_defaults.map { |p| ["Default #{p.title}", p.id] }.concat(provider_defaults.map { |p| ["New #{p.title}", "new|#{p.id}"] })
if @setup.provider_section_id.present? && provider_defaults.map(&:id).exclude?(@setup.provider_section_id)
@provider_options.insert(0, ["#{@employer.name} Custom", @setup.provider_section_id])
if @setup.provider_section.present? && !@setup.provider_section.default
employer_custom_options = @setup.provider_section
else
employer_custom_options = IdCard::ProviderSection.new(title: "#{@employer.name} Custom")
end
@rx_options = IdCard::RxSection.all
@fairos_rx_id = IdCard::RxSection.find_by(title: "FairosRx").id
@provider_options = (IdCard::ProviderSection.where(default: true) + [employer_custom_options])
.compact.uniq.map { |option| [option.display_title, option.id || "99"] }
@rx_options = IdCard::RxSection.where.not(title: nil)
@rx_default = IdCard::RxSection.find_by(title: "FairosRx")
render :index
end
@@ -50,6 +29,15 @@ module IdCard
redirect_to employer_path(@employer.slug), notice: 'ID Card Setup was successfully updated.'
else
puts "fail"
if @setup.provider_section.present? && !@setup.provider_section.default
employer_custom_options = @setup.provider_section
else
employer_custom_options = IdCard::ProviderSection.new(title: "#{@employer.name} Custom")
end
@provider_options = (IdCard::ProviderSection.where(default: true) + [employer_custom_options])
.compact.uniq.map { |option| [option.display_title, option.id || "99"] }
@rx_options = IdCard::RxSection.all
@rx_default = IdCard::RxSection.find_by(title: "FairosRx")
render :index, status: :unprocessable_entity
end
end
@@ -66,6 +54,7 @@ module IdCard
redirect_to employer_path(@setup.employer.slug), notice: 'ID Card Plans successfully updated.'
else
puts "fail"
@plan_templates = IdCard::Plan.templates
render :plans, status: :unprocessable_entity
end
@@ -99,9 +88,6 @@ module IdCard
end
def destroy
# @resource = Resource.find(params[:id])
# @resource.destroy
# redirect_to resources_url, notice: 'Resource was successfully destroyed.'
end
# API Methods
@@ -117,190 +103,5 @@ module IdCard
end
end
# 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_field_exceptions_params
# params.require(:employer_setup_network_field_exceptions_form).permit(
# network_field_exceptions: [:network_logo, field_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_field_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_field_exceptions: [:network_logo, field_exceptions: [:type, :value]],
# plans: permited_plans_keys,
# benefit_descs: benefit_sequence_keys
# )
# end
# def benefit_sequence_keys
# (1..14).map { |i| i.to_s.to_sym }
# end
# def permited_plans_keys
# benefit_sequence_keys.push(:plan_id)
# end
# def plans_params
# plans_keys = params[:plans]&.keys || []
# plans_keys.each_with_object({}) do |key, hash|
# if key == 'benefit_descs' || key.match?(/^plan_\d$/)
# hash[key.to_sym] = permited_plan_param_list
# end
# end
# end
# def permited_plan_param_list
# (1..14).map { |i| i.to_s.to_sym }.push(:plan_id)
# end
end
end
@@ -1,89 +0,0 @@
class IdCardBenefitsTemplatesController < ApplicationController
skip_before_action :verify_authenticity_token
def new_id_card_template
@id_card_templates = IdCardTemplate.where.not(title: "BLANK")
@id_card_template_benefits = IdCardTemplate.find_by(title: "BLANK").id_card_template_benefits.sort_by(&:sequence)
end
def create_id_card_template
@id_card_template = IdCardTemplate.create(title: params[:title])
params[:benefits].each do |key, value|
IdCardTemplateBenefit.create(
sequence: key,
benefit_desc: value["desc"],
benefit: value["value"],
id_card_template: @id_card_template
)
end
respond_to do |format|
if @id_card_template.save && @id_card_template.id_card_template_benefits.length == 14
format.html { redirect_to '/dev_tools/new_id_card_setup', notice: "Template was successfully created." }
# format.json { render :show, status: :created, location: @employer }
else
format.html { render :new_id_card_template, status: :unprocessable_entity }
# format.json { render json: @employer.errors, status: :unprocessable_entity }
end
end
end
def new_id_card_setup
@id_card_templates = IdCardTemplate.where.not(title: "BLANK")
@id_card_template_benefits = IdCardTemplate.find_by(title: "BLANK").id_card_template_benefits
end
def get_template_benefits
@id_card_benefits = IdCardBenefitsTemplate.find(params[:id]).id_card_benefits
render json: @id_card_benefits.as_json
end
def create_id_card_setup
employer_general = params['general']
hl_plan_code = Vhcs::HlPlanCode.new(
group_number: employer_general['group_number'],
medical_number: employer_general['group_number'],
dental_number: '',
plan_key: employer_general['pl_plan_key'],
effect_date: employer_general['effect_date']
)
# Replace fairos_info with template like for benefits
fairos_info = Vhcs::HLRXCrosRef.where(pl_plan_key: 52).first
hlrx_cros_ref = Vhcs::HLRXCrosRef.new(
group_no: employer_general['group_number'],
rx_group_id: employer_general['group_number'],
help_desk: fairos_info.help_desk,
customer_service: fairos_info.customer_service,
web_url: fairos_info.web_url,
pl_plan_key: employer_general['pl_plan_key']
)
number_of_plans = params[:number_of_plans].to_i
number_of_plans.each do |i|
value['benefits'].each do |ben_key, ben_value|
Vhcs::HLEgglestonCardBenefit.create(
plan_id: value['plan_id'],
benefit_desc: ben_value["desc"],
benefit: ben_value["value"],
sequence: ben_key,
plan_key: employer_general['pl_plan_key']
)
end
end
respond_to do |format|
if hl_plan_code.save && hlrx_cros_ref.save
format.html { redirect_to '/dev_tools/new_id_card_setup', notice: "Card setup was successfully created." }
# format.json { render :show, status: :created, location: @employer }
else
format.html { render :new_id_card_setup, status: :unprocessable_entity }
# format.json { render json: @employer.errors, status: :unprocessable_entity }
end
end
end
end
@@ -1,57 +0,0 @@
class IdCardEmployerLogoController < ApplicationController
def index
end
def show
end
def image
logo_file = IdCard::EmployerLogo.find_by(filename: params[:id])
puts params[:id]
if logo_file
logo_binary = logo_file.image_data
logo_filename = logo_file.filename
send_data logo_binary,
filename: logo_filename,
disposition: 'inline'
end
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
@@ -0,0 +1,70 @@
class ProviderGroupsController < ApplicationController
before_action :set_provider_group, only: %i[ show edit update destroy ]
# GET /provider_groups or /provider_groups.json
def index
@provider_groups = ProviderGroup.all
end
# GET /provider_groups/1 or /provider_groups/1.json
def show
end
# GET /provider_groups/new
def new
@provider_group = ProviderGroup.new
end
# GET /provider_groups/1/edit
def edit
end
# POST /provider_groups or /provider_groups.json
def create
@provider_group = ProviderGroup.new(provider_group_params)
respond_to do |format|
if @provider_group.save
format.html { redirect_to @provider_group, notice: "Provider group was successfully created." }
format.json { render :show, status: :created, location: @provider_group }
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @provider_group.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /provider_groups/1 or /provider_groups/1.json
def update
respond_to do |format|
if @provider_group.update(provider_group_params)
format.html { redirect_to @provider_group, notice: "Provider group was successfully updated.", status: :see_other }
format.json { render :show, status: :ok, location: @provider_group }
else
format.html { render :edit, status: :unprocessable_entity }
format.json { render json: @provider_group.errors, status: :unprocessable_entity }
end
end
end
# DELETE /provider_groups/1 or /provider_groups/1.json
def destroy
@provider_group.destroy!
respond_to do |format|
format.html { redirect_to provider_groups_path, notice: "Provider group 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_provider_group
@provider_group = ProviderGroup.find(params[:id])
end
# Only allow a list of trusted parameters through.
def provider_group_params
params.require(:provider_group).permit(:name)
end
end
+70
View File
@@ -0,0 +1,70 @@
class ProvidersController < ApplicationController
before_action :set_provider, only: %i[ show edit update destroy ]
# GET /providers or /providers.json
def index
@providers = Provider.all
end
# GET /providers/1 or /providers/1.json
def show
end
# GET /providers/new
def new
@provider = Provider.new
end
# GET /providers/1/edit
def edit
end
# POST /providers or /providers.json
def create
@provider = Provider.new(provider_params)
respond_to do |format|
if @provider.save
format.html { redirect_to @provider, notice: "Provider was successfully created." }
format.json { render :show, status: :created, location: @provider }
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @provider.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /providers/1 or /providers/1.json
def update
respond_to do |format|
if @provider.update(provider_params)
format.html { redirect_to @provider, notice: "Provider was successfully updated.", status: :see_other }
format.json { render :show, status: :ok, location: @provider }
else
format.html { render :edit, status: :unprocessable_entity }
format.json { render json: @provider.errors, status: :unprocessable_entity }
end
end
end
# DELETE /providers/1 or /providers/1.json
def destroy
@provider.destroy!
respond_to do |format|
format.html { redirect_to providers_path, notice: "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_provider
@provider = Provider.find(params[:id])
end
# Only allow a list of trusted parameters through.
def provider_params
params.fetch(:provider, {})
end
end
-4
View File
@@ -1,4 +0,0 @@
class WelcomeController < ApplicationController
def index
end
end
+11 -9
View File
@@ -3,9 +3,9 @@ class TailwindFormBuilder < ActionView::Helpers::FormBuilder
# leans on the FormBuilder class_attribute `field_helpers`
# you'll want to add a method for each of the specific helpers listed here if you want to style them
TEXT_FIELD_STYLE = "bg-gray-200 rounded py-2 px-4 text-bluetang font-semibold leading-tight focus:outline-none focus:bg-white".freeze
SELECT_FIELD_STYLE = "block bg-gray-200 text-gray-700 py-2 px-4 rounded leading-tight focus:outline-none focus:bg-white".freeze
SUBMIT_BUTTON_STYLE = "cursor-pointer shadow bg-bronze focus:shadow-outline focus:outline-none text-white font-bold py-2 px-4 rounded hover:bg-copper".freeze
TEXT_FIELD_STYLE = "flex bg-gray-200 rounded py-2 px-4 text-bluetang font-semibold leading-tight focus:outline-none focus:bg-white border border-platinum".freeze
SELECT_FIELD_STYLE = "block bg-gray-200 text-bluetang py-2 px-4 font-semibold rounded leading-tight focus:outline-none focus:bg-white border border-platinum".freeze
SUBMIT_BUTTON_STYLE = "cursor-pointer font-bold text-lg text-platinum hover:text-bronze bg-cobalt-vivid hover:bg-deepcove border-2 border-cobalt-vivid py-2 px-4 rounded".freeze
text_field_helpers.each do |field_method|
class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
@@ -48,6 +48,7 @@ class TailwindFormBuilder < ActionView::Helpers::FormBuilder
custom_opts, opts = partition_custom_opts(options)
classes = apply_style_classes(TEXT_FIELD_STYLE, custom_opts, object_method)
puts "classes: #{classes}"
field = send(field_method, object_method, {
class: classes,
@@ -63,7 +64,7 @@ class TailwindFormBuilder < ActionView::Helpers::FormBuilder
label = tailwind_label(object_method, label_options, field_options)
error_label = error_label(object_method, field_options)
@template.content_tag("div", label + error_label, {class: "flex flex-col items-start"})
@template.content_tag("div", label + error_label, {class: "flex justify-between"})
end
def tailwind_label(object_method, label_options, field_options)
@@ -73,8 +74,8 @@ class TailwindFormBuilder < ActionView::Helpers::FormBuilder
[object_method.to_s.titleize, {}]
end
label_classes = label_opts[:class] || "block text-platinum font-bold md:text-right mb-1 md:mb-0 pr-4"
label_classes += " text-yellow-800 dark:text-yellow-400" if field_options[:disabled]
label_classes = label_opts[:class] || "block shrink-0 text-platinum font-bold md:text-right mb-1 md:mb-0 pr-4"
label_classes += " dark:text-brightlava" if field_options[:disabled]
label(object_method, text, {
class: label_classes
}.merge(label_opts.except(:class)))
@@ -83,15 +84,16 @@ class TailwindFormBuilder < ActionView::Helpers::FormBuilder
def error_label(object_method, options)
if errors_for(object_method).present?
error_message = @object.errors[object_method].collect(&:titleize).join(", ")
tailwind_label(object_method, {text: error_message, class: " font-bold text-red-500"}, options)
tailwind_label(object_method, {text: error_message, class: " font-bold text-right text-bronze"}, options)
end
end
def border_color_classes(object_method)
if errors_for(object_method).present?
" border-2 border-red-400 focus:border-rose-200"
" border-4 dark:border-bronze focus:border-atmosphere"
else
" border border-platinum focus:border-yellow-700"
""
# " border border-platinum focus:border-yellow-700"
end
end
-85
View File
@@ -1,85 +0,0 @@
class EmployerSetupForm
include ActiveModel::Model
include ActiveModel::Attributes
FIRST_STEP = "general_information"
attribute :current_step, :string, default: FIRST_STEP
attribute :pl_plan_key, :string
attribute :employer_setup_process_id, :integer
def initialize(params = {})
# if params.present?
# params = permitted_params(params)
# end
# @current_step = params["current_step"]
# @employer_setup_process_id = params["employer_setup_process_id"]
super(params)
unless self.steps.first == FIRST_STEP
raise StepMisalignmentError, "FIRST_STEP does not match first entry in steps"
end
# @general_information_data = EmployerSetupGeneralInformationForm.new(attributes[:general_information_data])
# @plans_data = EmployerSetupPlansForm.new(attributes[:plans_data])
# @network_exceptions_data = EmployerSetupNetworkExceptionsForm.new(attributes[:network_exceptions_data])
end
# def self.form_session_init
# {
# general_information_data: {},
# plans_data: {},
# network_exceptions_data: {}
# }
# end
# def steps
# %w[general_information plans network_exceptions summary]
# end
def steps
%w[general_information plans network_exceptions summary]
end
def current_step_view
"employer_setup/#{self.current_step}"
end
def next_step
index = steps.index(current_step)
if index && index < steps.length - 1
steps[index + 1]
end
end
def previous_step
index = steps.index(current_step)
steps[index - 1] if index && index > 0
end
def permitted_params(params)
params.permit(
:pl_plan_key,
:current_step
)
end
def self.permitted_params
[
:pl_plan_key,
:current_step
]
end
def save
if valid?
process = EmployerSetupProcess.find(@employer_setup_process_id)
process.update(
status: "entered"
)
true
else
false
end
end
end
@@ -1,62 +0,0 @@
class EmployerSetupForm
include ActiveModel::Model
include ActiveModel::Attributes
attribute :current_step, :string, default: "general"
attribute :name, :string
attribute :employer_logo
attribute :group_number, :string
attribute :pl_plan_key, :string
attribute :effect_date, :string
attribute :number_of_plans, :integer
attribute :network, :string
attribute :number_of_additional_network_logos, :integer
attribute :plans, array: true, default: -> { [] }
# attribute :benefit_descs, :hash, default: -> { {} }
attribute :network_exceptions, array: true, default: -> { [] }
attr_accessor :benefit_descs
# Define validations based on the current step
with_options on: :general_info do
validates :name, presence: true
validates :employer_logo, presence: true
validates :group_number, presence: true
validates :pl_plan_key, presence: true
validates :effect_date, presence: true
validates :number_of_plans, presence: true
validates :network, presence: true
# validates :number_of_additional_network_logos, presence: true if network = "cigna+"
end
with_options on: :plan_info do
validates :plans, presence: true
# validates :benefit_descs, presence: true
end
with_options on: :network_info do
# validates :network_exceptions, presence: true if number_of_additional_network_logos > 0
end
# def initialize(params = {})
# super(params)
# # Ensure the attribute is a hash after initialization
# @benefit_descs = params[:benefit_descs].to_h if params[:benefit_descs]
# end
def benefit_descs
@benefit_descs ||= {}
end
def save
# Implement logic to save data to models after all steps are complete
# For example, create a User record with the collected data
if valid? && step == total_steps
# User.create!(name: name, email: email, password: password)
true
else
false
end
end
end
@@ -1,130 +0,0 @@
class EmployerSetupGeneralInformationForm
include ActiveModel::Model
include ActiveModel::Attributes
attribute :name, :string
attribute :employer_logo
attribute :group_number, :string
attribute :dental, :boolean, default: false
attribute :pl_plan_key, :string
attribute :effective_date, :string
# attribute :number_of_plans, :integer
attribute :network, :string
# attribute :number_of_additional_network_logos, :integer
attr_accessor :employer_setup_process_id
validates :name, presence: true
validates :employer_logo, presence: true
validates :group_number, presence: true
validates :effective_date, presence: true
# validates :number_of_plans, presence: true
validates :network, presence: true
# validates :number_of_additional_network_logos, presence: true if network = "cigna+"
# def initialize(attributes = {})
# if attributes
# permitted_attributes = form_strong_params(attributes)
# super(permitted_attributes)
# end
def initialize(employer_setup_process_id, params = {})
@employer_setup_process_id = employer_setup_process_id
if params.present?
form_params = permitted_params(params)
super(form_params)
else
super(params)
load_from_process
end
end
def load_from_process
process = EmployerSetupProcess.find(@employer_setup_process_id)
self.name = process.employer_name
# self.employer_logo = process.
self.group_number = process.group_number
self.dental = false
self.pl_plan_key = process.pl_plan_key
self.effective_date = process.effective_date
self.network = process.network_provider
end
def permitted_params(params)
params.require(:employer_setup_general_information_form).permit(
:name,
:employer_logo,
:group_number,
:dental,
:pl_plan_key,
:effective_date,
:number_of_plans,
:network,
:number_of_additional_network_logos
)
end
def save
# Implement logic to save data to models after all steps are complete
# For example, create a User record with the collected data
if valid?
process = EmployerSetupProcess.find(@employer_setup_process_id)
process.update(
employer_name: name,
group_number: group_number,
pl_plan_key: pl_plan_key,
effective_date: effective_date,
network_provider: network
)
# hl_plan_code = Vhcs::HlPlanCode.create!(
# group_number: group_number,
# medical_number: group_number,
# dental_number: '',
# plan_key: pl_plan_key,
# effect_date: effective_date
# )
# # Replace fairos_info with template like for benefits
# fairos_info = Vhcs::HlrxCrosRef.where(pl_plan_key: 52).first
# hlrx_cros_ref = Vhcs::HlrxCrosRef.create!(
# group_no: group_number,
# rx_group_id: group_number,
# help_desk: fairos_info.help_desk,
# customer_service: fairos_info.customer_service,
# web_url: fairos_info.web_url,
# pl_plan_key: pl_plan_key
# )
# web_employer = BrittonWeb::Employers.create!(
# name: name,
# pl_plan_key: pl_plan_key,
# dental_plan: dental,
# single_card_template: 'FairosRxIDCard',
# logo: employer_logo.original_filename
# )
# default_network_logo =
# case
# when network.include?("cig")
# "CignaLogo.png"
# when network.include?("med")
# "Logo_MC_PMS.png"
# else
# "CignaLogo.png"
# end
# BrittonWeb::NetworkLogos.create!(
# employer_id: web_employer.id,
# net_logo: default_network_logo,
# default: true
# )
true
else
false
end
end
end
@@ -1,107 +0,0 @@
class EmployerSetupNetworkExceptionsForm
include ActiveModel::Model
include ActiveModel::Attributes
Network_exception = Struct.new(:network_logo, :exceptions)
attribute :network_exceptions, :array_of_items, default: -> { [] }
attribute :pl_plan_key, :string
attr_accessor :employer_setup_process_id
# validates :network_exceptions, presence: true if number_of_additional_network_logos > 0
def initialize(employer_setup_process_id, params = {})
@employer_setup_process_id = employer_setup_process_id
if params.present?
form_params = permitted_params(params)
super(form_params)
else
super(params)
end
end
def permitted_params(params)
params.require(:employer_setup_network_exceptions_form).permit(
network_exceptions: [
:network_logo,
exceptions: [
:type,
:value
]
]
)
end
# def self.permitted_params
# [
# network_exceptions: [
# :network_logo,
# exceptions: [
# :type,
# :value
# ]
# ]
# ]
# end
def pull_from_employer_setup_form(attributes = {})
if attributes['pl_plan_key']
self.pl_plan_key = attributes['pl_plan_key']
end
if attributes['number_of_additional_network_logos']
self.number_of_additional_network_logos = attributes['number_of_additional_network_logos']
end
end
def process_for_save(network_exceptions)
ne_array = []
network_exceptions.first.each do |ne|
processed_ne = ne.last
exceptions_array = []
processed_ne['exceptions'].each do |e|
exceptions_array.push(e.last)
end
processed_ne['exceptions'] = exceptions_array
ne_array.push(processed_ne)
end
ne_array
end
def save
# Implement logic to save data to models after all steps are complete
# For example, create a User record with the collected data
if valid?
process = EmployerSetupProcess.find(@employer_setup_process_id)
# employer = BrittonWeb::Employers.find_by(pl_plan_key: pl_plan_key)
if network_exceptions
network_exceptions_data = process_for_save(network_exceptions)
end
# network_exceptions_data.each do |ne|
# ne['exceptions'].each do |ex|
# BrittonWeb::NetworkLogos.create!(
# employer_id: employer.id,
# net_logo: ne['network_logo'].original_filename,
# exception_type: ex['type'].downcase,
# exception_value: ex['value'],
# default: false
# )
# end
# end
true
else
false
end
end
end
class NetworkException
include ActiveModel::Model
include ActiveModel::Attributes
attribute :network_logo
attribute :exceptions, array: true, default: -> { [] }
end
-186
View File
@@ -1,186 +0,0 @@
class EmployerSetupPlansForm
include ActiveModel::Model
include ActiveModel::Attributes
PLAN_COLORS = ['atmosphere', 'verdigris', 'bluemana', 'cobalt']
attribute :plans, array: true, default: -> { [Plan.new] }
attribute :pl_plan_key, :string
attribute :benefit_descs, hash: true, default: -> { Plan.new }
attr_accessor :plan_templates
attr_accessor :benefits_template
attr_accessor :employer_setup_process_id
validates :plans, presence: true
validates :benefit_descs, presence: true
def initialize(employer_setup_process_id, params = {})
@employer_setup_process_id = employer_setup_process_id
if params.present?
form_params = permitted_params(params)
super(form_params)
else
super(params)
process_plans = EmployerSetupProcess.find(@employer_setup_process_id).plans
if process_plans.present?
self.plans = process_plans
end
end
@plan_templates = IdCardBenefitsTemplate.where.not(title: "BLANK")
@benefits_template = IdCardBenefitsTemplate.find_by(title: "BLANK").id_card_benefits.sort_by(&:sequence)
# if attributes.present? && attributes[:plans].present?
# self.plans = Array(attributes[:plans])
# else
# self.plans = [new_plan]
# end
end
# def plans_attributes=(attributes)
# self.plans = attributes.values.map { |plan_attrs| Plan.new(plan_attrs) }
# end
def persisted?
false
end
# The core method to initialize the array with a single blank item.
def ensure_one_plan_exists
if plans.empty?
self.plans << PlanForm.new
self.plans << PlanForm.new
end
end
def bulild_descs_plan
self.benefit_descs = IdCardBenefitsTemplate.find_by(title: "BLANK").id_card_benefits.sort_by(&:sequence)
end
def self.new_plan
plan = {}
self.permited_plans_keys.each do |key|
plan[key] = ""
end
plan
end
def process_params(employer_setup_process_id)
process = EmployerSetupProcess.find(employer_setup_process_id)
process.plans
end
def permitted_params(params)
params.require(:employer_setup_plans_form).permit(
:pl_plan_key,
plans: self.permited_plans_keys,
benefit_descs: self.permited_plans_keys
)
end
def pull_from_employer_setup_form(attributes = {})
if attributes['pl_plan_key']
self.pl_plan_key = attributes['pl_plan_key']
end
if attributes['number_of_plans']
self.number_of_plans = attributes['number_of_plans']
end
end
# def form_strong_params(attributes)
# attributes.require(:employer_setup_plans_form).permit(
# plans: permited_plans_keys,
# benefit_descs: benefit_sequence_keys
# )
# end
def self.permited_plans_keys
(1..14).map { |i| "benefit_#{i}".to_sym }.push(:plan_id)
end
def permited_plans_keys
(1..14).map { |i| "benefit_#{i}".to_sym }.push(:plan_id, :id)
end
def save
# Implement logic to save data to models after all steps are complete
# For example, create a User record with the collected data
if valid?
process = EmployerSetupProcess.find(@employer_setup_process_id)
# process.plans.update(plans: plans)
planss = Array.wrap(plans)
plans.each_with_index do |plan, i|
plan_info = plan.last
plan_id = plan_info[:plan_id].present? ? plan_info[:plan_id].to_i : "temp #{i}"
plan_info.delete(:plan_id)
new_plan = process.plans.create(plan_id: plan_id)
plan_info.each do |key, value|
sequence = key.delete_prefix("benefit_").to_i
benefit = new_plan.plan_benefits.find_by(sequence: sequence)
benefit.update(
benefit: value
)
# Vhcs::HlEgglestonCardBenefit.create(
# plan_id: plan_id,
# benefit_desc: benefit_descs["#{key}"],
# benefit: value,
# sequence: sequence,
# plan_key: pl_plan_key
# )
end
end
# plans.each do |plan|
# plan_info = plan.last
# plan_id = plan_info.delete(:plan_id).to_i
# plan_info.each do |key, value|
# sequence = key.delete_prefix("benefit_").to_i
# Vhcs::HlEgglestonCardBenefit.create(
# plan_id: plan_id,
# benefit_desc: benefit_descs["#{key}"],
# benefit: value,
# sequence: sequence,
# plan_key: pl_plan_key
# )
# end
# end
true
else
false
end
end
end
class PlanForm
include ActiveModel::Model
include ActiveModel::Attributes
attribute :plan_id, :string
def initialize(attributes = {})
self.generate_attributes(14, "benefit_")
super(attributes)
end
def persisted?
false
end
def generate_attributes(count, prefix)
count.times do |i|
# attr_accessor :"#{prefix}#{i + 1}"
self.class.attribute "#{prefix}#{i + 1}".to_sym, :string
end
end
end
# dynamic_attribute_names.each do |attr_name|
# # Define each attribute as a String type (you can customize the type)
# self.class.attribute attr_name.to_sym, :string
# end
-2
View File
@@ -1,2 +0,0 @@
module ArticlesHelper
end
+2
View File
@@ -0,0 +1,2 @@
module BrokersHelper
end
-2
View File
@@ -1,2 +0,0 @@
module CardProvidersHelper
end
-2
View File
@@ -1,2 +0,0 @@
module CardRxesHelper
end
+2
View File
@@ -0,0 +1,2 @@
module CarriersHelper
end
-2
View File
@@ -1,2 +0,0 @@
module CommentsHelper
end
-2
View File
@@ -1,2 +0,0 @@
module IdCardEmployersHelper
end
+2
View File
@@ -0,0 +1,2 @@
module ProviderGroupsHelper
end
+2
View File
@@ -0,0 +1,2 @@
module ProvidersHelper
end
-2
View File
@@ -1,2 +0,0 @@
module WelcomeHelper
end
+11 -4
View File
@@ -2,8 +2,15 @@
import "@hotwired/turbo-rails"
import "trix"
import "@rails/actiontext"
import { Application } from "@hotwired/stimulus"
import { eagerLoadControllersFrom } from "@hotwired/stimulus-loading"
// import { Application } from "@hotwired/stimulus"
// import { eagerLoadControllersFrom } from "@hotwired/stimulus-loading"
import "controllers"
// import { createIcons, icons } from "lucide-static";
// document.addEventListener("turbo:load", () => {
// createIcons({ icons });
// });
// const application = Application.start()
// eagerLoadControllersFrom("controllers", application)
const application = Application.start()
eagerLoadControllersFrom("controllers", application)
@@ -26,7 +26,9 @@ export default class extends Controller {
async #updateFields(templatePlanData) {
const titleElement = this.titleTarget
titleElement.value = templatePlanData.title.match(/^(.*\d)k(?=\d)/i)[0].replace(/(\d)/, ' $1')
if (!titleElement.value) {
titleElement.value = templatePlanData.title.match(/^(.*\d)k(?=\d)/i)[0].replace(/(\d)/, ' $1')
}
const benefitTargetsList = this.benefitTargets
templatePlanData.plan_benefits.forEach(function(bene) {
const targetElement = benefitTargetsList.find(
@@ -0,0 +1,35 @@
// app/javascript/controllers/font_validator_controller.js
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
static targets = ["textField", "hiddenField", "countDisplayField"]
connect() {
this.measure()
}
measure() {
const text = this.textFieldTarget.value
const pixelWidth = this.getTextWidth(text, "bold 6px sans-serif")
// Do something with the pixel width (e.g., store in a hidden field for Rails to read)
if (this.hasHiddenFieldTarget) {
this.hiddenFieldTarget.value = pixelWidth
this.countDisplayFieldTarget.textContent = `${pixelWidth}`
if (pixelWidth > 100) {
this.countDisplayFieldTarget.classList.add("text-brightlava")
} else {
this.countDisplayFieldTarget.classList.remove("text-brightlava")
}
}
}
// Canvas measurement trick
getTextWidth(text, font) {
const canvas = document.createElement("canvas")
const context = canvas.getContext("2d")
context.font = font
const metrics = context.measureText(text)
return Math.ceil(metrics.width)
}
}
@@ -1,16 +0,0 @@
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
static targets = [ "name", "output" ]
connect() {
// this.element.textContent = "Hello World!"
console.log('Hello World hello_controller.js');
}
greet() {
console.log('greet');
this.outputTarget.textContent =
`Hello, ${this.nameTarget.value}!`
}
}
+3 -6
View File
@@ -1,11 +1,8 @@
// Import and register all your controllers from the importmap under controllers/*
// This file is auto-generated by ./bin/rails stimulus:manifest:update
// Run that command whenever you add a new controller or create them with
// ./bin/rails generate stimulus controllerName
import { application } from "controllers/application"
// Eager load all controllers defined in the import map under controllers/**/*_controller
import { eagerLoadControllersFrom } from "@hotwired/stimulus-loading"
eagerLoadControllersFrom("controllers", application)
// Lazy load controllers as they appear in the DOM (remember not to preload controllers in import map!)
// import { lazyLoadControllersFrom } from "@hotwired/stimulus-loading"
// lazyLoadControllersFrom("controllers", application)
@@ -3,7 +3,8 @@ import { Controller } from "@hotwired/stimulus";
export default class extends Controller {
static values = {
logoType: String,
employerName: String
employerName: String,
employerId: Number
}
static targets = ["preview", "previewContainer", "logoSelect", "logoIdField", "logoNameField", "initialLogoFile"];
@@ -89,8 +90,13 @@ export default class extends Controller {
async uploadLogoToServer(logoFile) {
console.log('in uploadLogoToServer');
const employerId = this.employerIdValue
const formData = new FormData();
formData.append(`id_card_${this.logoTypeValue}_logo[logo_file]`, logoFile);
if (employerId) {
formData.append(`id_card_${this.logoTypeValue}_logo[employer_id]`, employerId);
}
const csrfToken = document.querySelector("meta[name='csrf-token']").content;
@@ -10,11 +10,11 @@ export default class extends Controller {
syncDefaults() {
const pnValue = this.providerNetworkFieldTarget.value
if (pnValue == "Cigna") {
this.networkLogoFieldTarget.value = 1
this.providerSectionFieldTarget.value = 30
} else if (pnValue == "Medcost") {
this.networkLogoFieldTarget.value = 2
this.providerSectionFieldTarget.value = 26
this.networkLogoFieldTarget.value = 9
this.providerSectionFieldTarget.value = 5
} else if (pnValue == "MedCost") {
this.networkLogoFieldTarget.value = 7
this.providerSectionFieldTarget.value = 4
} else {
this.networkLogoFieldTarget.value = ""
this.providerSectionFieldTarget.value = ""
+6 -8
View File
@@ -56,14 +56,12 @@ class ProcessMemberCardDataJob < ApplicationJob
end
if has_dental
if member.dental_plan_key
member_attributes.merge!({dental_coverage: member.coverage_class.upcase})
unless member.id_card_plan_id
member_attributes.merge!({group_number: "", medical_eff_date: ""})
# dental_plan = IdCard::Plan.find_by(pb_product_key: 1025)
if IdCard::Plan.find_by(pb_product_key: member.dental_plan_key).blank?
member_attributes.merge!({employer_name: 'COBRA'})
end
member_attributes.merge!({dental_coverage: member.coverage_class.upcase})
if member.dental_plan_key && member.id_card_plan_id.blank?
member_attributes.merge!({group_number: "", medical_eff_date: ""})
# dental_plan = IdCard::Plan.find_by(pb_product_key: 1025)
if IdCard::Plan.find_by(pb_product_key: member.dental_plan_key).blank?
member_attributes.merge!({employer_name: 'COBRA'})
end
end
end
+18 -6
View File
@@ -24,8 +24,8 @@ class UpdateEmployerJob < ApplicationJob
plan_code = Vhcs::HlPlanCode.find_by(plan_key: pl_plan_key)
pb_company_plan = Vhcs::PbCompanyPlans.find_by(pl_plan_key: pl_plan_key)
employer = Employer.find_or_create_by!(employer_identifier)
id_card_setup = employer.id_card_setup || employer.create_id_card_setup!(pl_plan_key: employer.pl_plan_key)
employer = Employer.find_or_create_by(employer_identifier)
id_card_setup = employer.id_card_setup || employer.build_id_card_setup(pl_plan_key: employer.pl_plan_key)
full_sync = employer.previously_new_record? || full_sync
unless group_number.present?
group_number = Vhcs::PlPlanGroupCode.find_by(pl_plan_key: pl_plan_key).group_code
@@ -51,9 +51,12 @@ class UpdateEmployerJob < ApplicationJob
})
end
employer.update(employer_update_attrs)
employer.assign_attributes(employer_update_attrs)
if !employer.save && full_sync
employer.save(validate: false)
end
if [employer.pl_plan_key, employer.group_number, employer.company_pb_entity_key, employer.plan_id].all?(&:present?)
if !employer.initialized && [employer.pl_plan_key, employer.group_number, employer.company_pb_entity_key, employer.plan_id].all?(&:present?)
employer.update(active: true)
end
@@ -64,13 +67,22 @@ class UpdateEmployerJob < ApplicationJob
})
end
if full_sync
if full_sync || id_card_setup.print_name.blank?
setup_update_attrs.merge!({
print_name: determine_card_print_name(pb_company_plan.company_pb_entity_key, pl_plan_key)
})
end
id_card_setup.update(setup_update_attrs)
if id_card_setup.pl_plan_key.blank? && employer.pl_plan_key.present?
setup_update_attrs.merge!({
pl_plan_key: employer.pl_plan_key
})
end
id_card_setup.assign_attributes(setup_update_attrs)
if !id_card_setup.save && full_sync
id_card_setup.save(validate: false)
end
# plan_code = Vhcs::HlPlanCode.find_by(plan_key: employer.pl_plan_key)
# employer.group_number = plan_code.group_number
+9 -4
View File
@@ -15,11 +15,11 @@ class UpdateMemberJob < ApplicationJob
"PBCoveredEntities"."PBEntityKey" = ?
AND "PBProductParticipation"."InEffect" <= ?
AND "PBProductParticipation"."OutOfEffect" > ?',
vw_mb_member[:pb_entity_key], 2.month.from_now , 1.day.ago
vw_mb_member[:pb_entity_key], 3.month.from_now , 1.day.ago
)
if pb_products.present? && vw_mb_member[:social_security_number].present?
member = Member.find_or_create_by!(pb_entity_key: vw_mb_member[:pb_entity_key], employer_id: employer_id)
member = Member.find_or_create_by(pb_entity_key: vw_mb_member[:pb_entity_key], employer_id: employer_id)
member.name = vw_mb_member[:full_name_last_name_first].titleize
member.mb_member_key = vw_mb_member[:mb_member_key]
member.family_id = vw_mb_member[:family_id]
@@ -53,14 +53,18 @@ class UpdateMemberJob < ApplicationJob
INNER JOIN "PBCoveredEntities" ON "PBProductParticipation"."PBProductParticipationKey" = "PBCoveredEntities"."PBProductParticipationKey"
INNER JOIN "PBProductAvailability" ON "PBProductAvailability"."PBProductAvailabilityKey" = "PBProductParticipation"."PBProductAvailabilityKey"
INNER JOIN "PBProduct" ON "PBProduct"."PBProductKey" = "PBProductAvailability"."PBProductKey"
').find_by('
').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
).short_desc
).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
@@ -74,6 +78,7 @@ class UpdateMemberJob < ApplicationJob
# else
# end
member.save!
puts "---- #{member.name}"
end
member.presence
+1 -1
View File
@@ -3,5 +3,5 @@
class ApplicationRecord < ActiveRecord::Base
primary_abstract_class
establish_connection :baclight
establish_connection :primary
end
-21
View File
@@ -1,21 +0,0 @@
module BrittonWeb
class Employers < BrittonWebRecord
# self.table_name = 'employers'
alias_attribute :id, :id
alias_attribute :name, :name
alias_attribute :pl_plan_key, :pl_plan_key
alias_attribute :plan_id, :plan_id
alias_attribute :dental_plan, :dental_plan
alias_attribute :single_card_template, :single_card_template
alias_attribute :multiple_card_template, :multiple_card_template
alias_attribute :logo, :logo
alias_attribute :active, :active
alias_attribute :broker_id, :broker_id
alias_attribute :created_at, :created_at
alias_attribute :updated_at, :updated_at
end
end
-17
View File
@@ -1,17 +0,0 @@
module BrittonWeb
class NetworkLogos < BrittonWebRecord
self.table_name = 'network_logos'
alias_attribute :id, :id
alias_attribute :net_logo, :net_logo
alias_attribute :exception_type, :exception_type
alias_attribute :exception_value, :exception_value
alias_attribute :default, :default
alias_attribute :employer_id, :employer_id
alias_attribute :created_at, :created_at
alias_attribute :updated_at, :updated_at
end
end
+4
View File
@@ -0,0 +1,4 @@
class Broker < ApplicationRecord
belongs_to :carrier
has_many :employers
end
+3
View File
@@ -0,0 +1,3 @@
class Carrier < ApplicationRecord
has_many :brokers
end
+27 -77
View File
@@ -20,55 +20,56 @@ module EmployerAutomation
}
scope :in_automation_initilization, -> {
joins(:id_card_setup)
left_outer_joins(:id_card_setup)
.where(initialized: false)
.or(
where(id_card_setup: {initialized: false})
)
).distinct
}
# scope :missing_keychain_values, -> {
# where(company_pb_entity_key: [nil, ''])
# .or(where(plan_id: [nil, '']))
# .or(where(group_number: [nil, '']))
# .or(where(pl_plan_key: [nil, '']))
# }
scope :missing_keychain_initialization, -> {
uninitialized.automation_ready
}
scope :uninitialized_id_card_setup, -> {
joins(:id_card_setup)
left_outer_joins(:id_card_setup)
.where(id_card_setup: {initialized: false})
}
scope :missing_plans, -> {
where.missing(:plans)
.or(
where(
id: joins(:plans)
.where(plans: { pb_product_key: [nil, ''] })
.select(:id)
)
)
left_outer_joins(:plans)
.where(id_card_plans: { pb_product_key: [nil, ""] })
.distinct
}
scope :has_plans, -> {
where.associated(:plans)
.where.not(
id: joins(:plans)
.where(plans: { pb_product_key: [nil, ''] })
.select(:id)
).distinct
left_outer_joins(:plans)
.where("id_card_plans.pb_product_key IS NOT NULL AND id_card_plans.pb_product_key != ''")
.distinct
}
scope :missing_members, -> {
left_outer_joins(:members)
.where(members: { id: nil })
.distinct
}
scope :has_members, -> {
left_outer_joins(:members)
.where.not(members: { id: nil })
.distinct
}
scope :missing_plans_initialization, -> {
uninitialized_id_card_setup.missing_plans
initialized.uninitialized_id_card_setup.missing_plans
}
scope :missing_members_initialization, -> {
uninitialized_id_card_setup.has_plans
initialized.uninitialized_id_card_setup.has_plans.missing_members
}
scope :ready_for_id_card_activation, -> {
initialized.uninitialized_id_card_setup.has_members
}
scope :with_active_id_card_setup, -> {
@@ -76,62 +77,11 @@ module EmployerAutomation
.where(id_card_setup: {active: true})
}
# scope :with_keychain_values, -> {
# where.not(
# pl_plan_key: [nil, ''],
# group_number: [nil, ''],
# company_pb_entity_key: [nil, ''],
# plan_id: [nil, '']
# )
# }
scope :deactivated, -> {
inactive.initialized
}
# Employer.joins(:id_card_setup)
# .left_outer_joins(:plans)
# .where(plans: { pb_product_key: [nil, ''] })
# .group('users.id') # Group by user ID
# .having('COUNT(posts.id) = 0')
# Employer.left_outer_joins(:plans)
# .where(plans: { id: nil })
# .or(Employer.where(plans: { pb_product_key: [nil, ''] }))
# Employer.where.missing(:plans)
# .or(Employer.joins(:plans).where(plans: { pb_product_key: [nil, ''] }))
# Employer.joins(id_card_setup: :plans).where.not("plans.id_card_setup_id = id_card_setup.id").or
# (where(plans: { pb_product_key: [nil, ''] }))
# scope :with_survey_and_no_questions, -> {
# joins(:survey) # join has_one
# .left_joins(survey: :questions) # join has_many through has_one
# .where(questions: { id: nil }) # filter where has_many is empty
# }
# scope :missing_initial_members, -> {
# new_groups.with_plans
# }
end
# class_methods do
# # Methods in this block become class methods of the including class.
# def count_all_visible
# visible.count
# end
# end
# Any other methods defined here become instance methods automatically.
# def up_to_date?
# self.pl_plan_key.present? &&
# self.company_pb_entity_key.present? &&
# self.plan_id.present? &&
# self.group_number.present? &&
# self.effective_date.present?
# end
def sync_members_with_vhcs
AutomationService::EmployerMembersUpdate.new(pl_plan_key).call
end
-23
View File
@@ -1,29 +1,6 @@
module MemberAutomation
extend ActiveSupport::Concern
# included do
# # Code in this block becomes instance methods or class macros (like scopes, validations, associations) in the including class.
# scope :visible, -> { where(visible: true) }
# scope :invisible, -> { where(visible: false) }
# validates :status, inclusion: { in: %w(visible invisible), message: "%{value} is not a valid status" }
# end
# class_methods do
# # Methods in this block become class methods of the including class.
# def count_all_visible
# visible.count
# end
# end
# Any other methods defined here become instance methods automatically.
# def up_to_date?
# self.pl_plan_key.present? &&
# self.company_pb_entity_key.present? &&
# self.plan_id.present? &&
# self.group_number.present? &&
# self.effective_date.present?
# end
def sync_with_vhcs
AutomationService::MemberUpdate.new(self.employer.pl_plan_key, self.pb_entity_key).call
end
+16 -2
View File
@@ -1,15 +1,22 @@
class Employer < ApplicationRecord
include EmployerAutomation
belongs_to :broker, optional: true
has_many :members, dependent: :destroy
accepts_nested_attributes_for :members, allow_destroy: true, reject_if: :all_blank
has_one :id_card_setup, class_name: 'IdCard::Setup', dependent: :destroy
has_many :plans, class_name: 'IdCard::Plan', through: :id_card_setup
has_many :print_data, class_name: 'IdCard::PrintData', dependent: :destroy
validates :name, :slug, :effective_date, presence: true
validates :group_number, :pl_plan_key, :company_pb_entity_key, :plan_id, presence: true, if: -> { initialized }
validates :name, :slug, :group_number, :pl_plan_key, :company_pb_entity_key, :plan_id, uniqueness: true, allow_blank: true
scope :active, -> { where(active: true) }
scope :inactive, -> { where(active: false) }
before_save :create_slug, if: :will_save_change_to_name?
before_save :active_initialized_check, if: :will_save_change_to_active?
before_validation :create_slug, if: :will_save_change_to_name?
before_validation :active_initialized_check, if: :will_save_change_to_active?
def create_slug
@@ -40,6 +47,13 @@ class Employer < ApplicationRecord
}
end
def employer_member_keys_by_plan(pb_product_key)
{
pl_plan_key: self.pl_plan_key,
member_keys: self.plans.find_by(pb_product_key: pb_product_key).members.pluck(:pb_entity_key)
}
end
def name_to_logo_filename(extension)
Employer.employer_trim_name(self.name).titleize.gsub(/[^a-zA-Z]/, '').concat('Logo').concat(extension.downcase)
end
+14
View File
@@ -0,0 +1,14 @@
module HebWeb
class BrokerXRef < HebWebRecord
self.table_name = 'BrokerXRef'
alias_attribute :id, :Id
alias_attribute :pl_plan_key, :PLPlanKey
alias_attribute :pb_entity_key, :PBEntityKey
alias_attribute :plan_name, :PlanName
alias_attribute :employer_pl_plan_key, :EmployerPLPlanKey
end
end
+4
View File
@@ -0,0 +1,4 @@
class HebWebRecord < ActiveRecord::Base
self.abstract_class = true
connects_to database: { writing: :heb_web, reading: :heb_web }
end
+4 -21
View File
@@ -1,7 +1,9 @@
module IdCard
class EmployerLogo < ApplicationRecord
# before_validation :resize_logo, if: :image_data_changed?
# before_validation :calculate_aspect_ratio, if: :image_data_changed?
belongs_to :setup, optional: true
validates :filename, :image_data, :content_type, :aspect_ratio, presence: true
validates :filename, uniqueness: true
before_validation :process_image, if: :image_data_changed?
private
@@ -27,24 +29,5 @@ module IdCard
end
end
# def resize_logo
# image = Vips::Image.new_from_buffer(self.image_data, "")
# processed_image = ImageProcessing::Vips
# .source(image)
# .resize_to_limit(nil, 200)
# .call
# self.image_data = processed_image.read
# end
# def calculate_aspect_ratio
# image_io = StringIO.new(self.image_data)
# width, height = FastImage.size(image_io)
# image_ratio = width.to_f / height
# if image_ratio
# self.aspect_ratio = image_ratio.round(2)
# end
# end
end
end
+2
View File
@@ -6,6 +6,8 @@ module IdCard
serialize :exception_values, coder: JSON
validates :exception_type, :exception_values, presence: true
VALID_TYPES = ['family_id', 'zipcode', 'state'].freeze
before_validation :format_exception_values, if: :exception_values_changed?
@@ -5,6 +5,8 @@ module IdCard
belongs_to :provider_section, optional: true
validate :only_one_exception_field_present
validates :field_name, presence: true
validates :field_name, uniqueness: { scope: :field_exception_id }
FIELDS_TO_VALIDATE = [:field_value, :network_logo_id, :provider_section_id].freeze
+3 -22
View File
@@ -1,7 +1,8 @@
module IdCard
class NetworkLogo < ApplicationRecord
# before_validation :resize_logo, if: :image_data_changed?
# before_validation :calculate_aspect_ratio, if: :image_data_changed?
validates :filename, :image_data, :content_type, :aspect_ratio, presence: true
validates :filename, uniqueness: true
before_validation :process_image, if: :image_data_changed?
scope :defaults, -> { where(default: true) }
@@ -41,25 +42,5 @@ module IdCard
end
end
# def resize_logo
# image = Vips::Image.new_from_buffer(self.image_data, "")
# processed_image = ImageProcessing::Vips
# .source(image)
# .resize_to_limit(nil, 400)
# .call
# self.image_data = processed_image.read
# end
# def calculate_aspect_ratio
# image_io = StringIO.new(image_data)
# width, height = FastImage.size(image_io)
# image_ratio = width.to_f / height
# if image_ratio
# self.aspect_ratio = image_ratio.round(2)
# end
# end
end
end
+19 -8
View File
@@ -3,6 +3,12 @@ module IdCard
belongs_to :setup, optional: true
has_many :plan_benefits, dependent: :destroy
accepts_nested_attributes_for :plan_benefits, allow_destroy: true, reject_if: :all_blank
has_many :members, class_name: 'Member', foreign_key: :id_card_plan_id
validates :title, presence: true
validates :pb_product_key, :pl_plan_key, presence: true, if: -> { setup&.active }
validates :pb_product_key, uniqueness: true, allow_nil: true
validate :validate_plan_benefits_count, unless: -> { template }
scope :templates, -> { where(template: true) }
@@ -39,10 +45,6 @@ module IdCard
class << self
# def templates
# active_templates.map(&:format_template)
# end
def permitted_params(params)
params.require(:id_card_setup).permit(
plans_attributes: [
@@ -66,11 +68,20 @@ module IdCard
private
def build_and_create_default_benefits
benefits = IdCardBenefitsTemplate.find_by(title: "BLANK").id_card_benefits.sort_by(&:sequence)
benefits.each do |ben|
id_card_plan_benefits.new(benefit_desc: ben.benefit_desc, sequence: ben.sequence)
def validate_plan_benefits_count
plan_benefits_size = plan_benefits.size
template_benefits_size = case setup&.card_template
when "TandemlocIDCard"
TANDEMLOC_BENEFIT_FIELDS.size
when "SmartIDCard"
SMART_BENEFIT_FIELDS.size
else
FARIOS_BENEFIT_FIELDS.size
end
unless plan_benefits_size == template_benefits_size
errors.add(:base, "Plan Benefits size (#{plan_benefits_size}) does not match ID Card Template (#{template_benefits_size})")
end
end
end
end
+3
View File
@@ -1,5 +1,8 @@
module IdCard
class PlanBenefit < ApplicationRecord
belongs_to :plan
validates :benefit_desc, :sequence, presence: true
validates :benefit, presence: true, unless: :new_record?
end
end
+13 -2
View File
@@ -1,14 +1,25 @@
module IdCard
class PrintData < ApplicationRecord
belongs_to :employer, class_name: 'Employer'
STRING_ATTRIBUTES = %w[provider_line_1 provider_line_2 provider_line_3 provider_line_4 provider_line_5 provider_line_6 provider_line_7 provider_line_8 provider_line_9 provider_line_10 provider_line_11 provider_line_12 claim_to_1 claim_to_2 claim_to_3 claim_to_4 claim_to_5 claim_to_6 claim_to_7 claim_to_8 claim_to_9 claim_to_10 claim_to_11 claim_to_12 dependent_1 dependent_2 dependent_3 dependent_4 dependent_5 dependent_6 dependent_7 dependent_8 dental_coverage]
before_validation :assign_blank_strings_to_unassigned_params
private
def has_jasper_sorting_fields
missing_sample_card_fields = sample_plan_title.blank?
missing_member_card_fields = employer_name.blank? || full_name_last_name_first.blank?
if missing_sample_card_fields || missing_member_card_fields
errors.add(:base, "Required field for Jasper Server is missing")
end
end
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?
self[attr] = "" if self[attr].blank?
end
end
end
+10 -1
View File
@@ -5,6 +5,7 @@ module IdCard
def self.permitted_params(params)
params.require(:id_card_setup).require(:provider_section).permit(
:title,
:provider_line_1,
:provider_line_2,
:provider_line_3,
@@ -30,7 +31,15 @@ module IdCard
:claim_to_11,
:claim_to_12
)
end
end
def display_title
if self.default
"Default #{self.title}"
else
self.title
end
end
end
end
+40 -23
View File
@@ -1,14 +1,21 @@
module IdCard
class Setup < ApplicationRecord
belongs_to :employer, class_name: 'Employer'
belongs_to :employer_logo, optional: true
belongs_to :network_logo, optional: true
belongs_to :provider_section, optional: true
belongs_to :rx_section, optional: true
has_one :employer_logo, dependent: :destroy
has_many :plans, dependent: :destroy
has_many :field_exceptions, dependent: :destroy
validates :print_name, :network_provider, :card_template, :employer_logo, :network_logo_id,
:provider_section_id, :rx_section_id, presence: true, unless: :new_record?
validates :pl_plan_key, :rx_group_number, presence: true, if: -> { initialized }
validate :validate_print_name_fits_on_card
attr_accessor :print_name_pixel_width
accepts_nested_attributes_for :plans, allow_destroy: true, reject_if: :all_blank
accepts_nested_attributes_for :field_exceptions, allow_destroy: true, reject_if: :all_blank
@@ -16,7 +23,7 @@ module IdCard
scope :active, -> { where(active: true) }
FORM_COLORS = ['atmosphere', 'verdigris', 'bluemana', 'cobalt']
FORM_COLORS = ['atmosphere', 'verdigris-vivid', 'cobalt-vivid', 'bluemana']
MODULE_COLOR = 'atmosphere'
before_save :active_initialized_check, if: :will_save_change_to_active?
@@ -27,14 +34,6 @@ module IdCard
end
end
# def employer_logo_filename
# self.employer_logo.filename
# end
# def network_logo_filename
# self.network_logo.filename
# end
def build_plan_with_default_benefits(attributes = {})
plan = plans.new(attributes)
benefits = IdCardBenefitsTemplate.find_by(title: "BLANK").id_card_benefits.sort_by(&:sequence)
@@ -45,7 +44,28 @@ module IdCard
end
def has_field_exceptions?
self.field_exceptions.present?
field_exceptions.present?
end
def sample_card_print_ready?
print_name.present? &&
card_template.present? &&
employer_logo.present? &&
network_logo_id.present? &&
provider_section_id.present? &&
rx_section_id.present? &&
plans.present?
end
def member_cards_print_ready?
sample_card_print_ready? &&
plans.present? &&
plans.all? { |plan| plan.pb_product_key.present? } &&
employer.members.present?
end
def activation_ready?
member_cards_print_ready? && !active
end
def field_exceptions_card_attributes_by_member_id(member_array = nil)
@@ -54,17 +74,6 @@ module IdCard
end
card_fes = self.field_exceptions.includes(:field_exception_items).in_order_of(:exception_type, IdCard::FieldException::VALID_TYPES)
# fe_by_value = card_fes.in_order_of(:exception_type, IdCard::FieldException::VALID_TYPES).group_by(&:exception_type)
# .transform_values { |fes| fes.map { |fe| [fe.id, fe.exception_values] }.to_h }
# .compact_blank
# field_exception_types = card_fes.pluck(:exception_type).uniq
# if field_exception_types.include?("family_id")
# members = Member.where(pb_entity_key: member_array)
# end
# if field_exception_types.intersect?(["state", "zipcode"])
# member_addresses = Vhcs::PbEntityAddress.where(pb_entity_key: member_array)
# end
card_exceptions_map = {}
card_fes.each do |fe|
if fe.exception_type == "family_id"
@@ -90,14 +99,22 @@ module IdCard
def self.permitted_params(params)
params.require(:id_card_setup).permit(
:print_name,
:print_name_pixel_width,
:network_provider,
:card_template,
:rx_group_number,
:employer_logo_id,
:network_logo_id,
:rx_section_id,
:provider_section_id
)
end
private
def validate_print_name_fits_on_card
if print_name_pixel_width.to_i > 100
errors.add(:print_name, "Too Long For Card")
end
end
end
end
+9 -3
View File
@@ -4,6 +4,15 @@ class Member < ApplicationRecord
belongs_to :employer
serialize :dependents, coder: JSON
validates :pb_entity_key, presence: true
validates :name, :family_id, :mb_member_key, :pl_plan_key,
:id_card_display_name, presence: true, unless: :new_record?
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 }
before_validation :format_dependents, if: :dependents_changed?
def id_card_field_exception_values
@@ -23,7 +32,4 @@ class Member < ApplicationRecord
end
end
end
-16
View File
@@ -1,16 +0,0 @@
class AlternateNetworkLogo < ApplicationRecord
belongs_to :employer
# before_save :process_network_logo
def process_network_logo
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',
image: self.network_logo.data,
pl_plan_key: self.employer_setup_process.pl_plan_key || ""
)
end
end
end
-14
View File
@@ -1,14 +0,0 @@
class CardLogoFile < ApplicationRecord
has_many :employer_card_logos, dependent: :destroy
has_many :employers, through: :employer_card_logos
before_save :round_aspect_ratio
private
def round_aspect_ratio
if self.aspect_ratio.present?
self.aspect_ratio = self.aspect_ratio.round(2)
end
end
end
-5
View File
@@ -1,5 +0,0 @@
class EmployerCardLogo < ApplicationRecord
belongs_to :employer
belongs_to :card_logo_file
end
-106
View File
@@ -1,106 +0,0 @@
class EmployerSetupProcess < ApplicationRecord
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 :card_logo_files
# before_save :process_employer_logo
before_save :create_slug, if: :new_record?
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
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,
:group_number,
:pl_plan_key,
:effective_date,
:employer_logo,
:network_provider,
plans_attributes: [
:id,
:title,
:plan_id,
:_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.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
-3
View File
@@ -1,3 +0,0 @@
class IdCardBenefit < ApplicationRecord
belongs_to :id_card_benefits_template
end
@@ -1,5 +0,0 @@
class IdCardBenefitsTemplate < ApplicationRecord
has_many :id_card_benefits, dependent: :destroy
end
+2
View File
@@ -0,0 +1,2 @@
class Provider < ApplicationRecord
end
+2
View File
@@ -0,0 +1,2 @@
class ProviderGroup < ApplicationRecord
end
+9
View File
@@ -0,0 +1,9 @@
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable,
:lockable, :trackable
enum role: { user: 0, admin: 1, dev: 2 }
end
-1
View File
@@ -148,7 +148,6 @@ module Vhcs
contact_line_1: self.contact_line_1,
contact_line_2: self.contact_line_2,
contact_line_3: self.contact_line_3,
group_number: self.group_number,
family_id: self.family_id,
group_no: self.group_no,
rx_group: self.rx_group,
-48
View File
@@ -1,48 +0,0 @@
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
-15
View File
@@ -1,15 +0,0 @@
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
+53
View File
@@ -0,0 +1,53 @@
# frozen_string_literal: true
class ApplicationPolicy
attr_reader :user, :record
def initialize(user, record)
@user = user
@record = record
end
def index?
false
end
def show?
false
end
def create?
false
end
def new?
create?
end
def update?
false
end
def edit?
update?
end
def destroy?
false
end
class Scope
def initialize(user, scope)
@user = user
@scope = scope
end
def resolve
raise NoMethodError, "You must define #resolve in #{self.class}"
end
private
attr_reader :user, :scope
end
end
@@ -1,4 +1,4 @@
class GetAllIDCardDataByPlanTPAQuery
class GetAllIdCardDataByPlanTpaQuery
def initialize(pl_plan_key)
@pl_plan_key = ActiveRecord::Base.connection.quote(pl_plan_key)
View File
@@ -1,8 +1,9 @@
module AutomationService
class BatchEmployerUpdate
def initialize(pl_plan_keys = nil)
def initialize(pl_plan_keys = nil, full_sync = false)
@pl_plan_keys = pl_plan_keys
@full_sync = full_sync
end
def call
@@ -16,7 +17,7 @@ module AutomationService
employer_update_futures = employer_plan_headers.map do |employer_plan_header|
Concurrent::Future.execute do
ActiveRecord::Base.connection_pool.with_connection do
UpdateEmployerJob.perform_later(employer_plan_header: employer_plan_header)
UpdateEmployerJob.perform_later(employer_plan_header: employer_plan_header, full_sync: @full_sync)
end
end
end
@@ -10,13 +10,7 @@ module AutomationService
card_setup = employer.id_card_setup
puts "-- #{employer.name}"
# employer_members =[]
vw_mb_members = Vhcs::VwmbMember.where(enrollee_type_value_id: 1, pl_plan_key: @pl_plan_key).select(:mb_member_key, :pb_entity_key, :pl_plan_key, :family_id, :full_name_last_name_first, :social_security_number)
# vw_mb_members.each do |vw_mb_member|
# member = UpdateMemberJob.perform_now(@pb_entity_key, employer.id, card_setup.has_divisions, card_setup.has_dental, true, vw_mb_member)
# end
# employer.members = employer_members
# employer.save
member_update_futures = vw_mb_members.map do |vw_mb_member|
Concurrent::Future.execute do
@@ -28,7 +22,7 @@ module AutomationService
member_updates = member_update_futures.map(&:value).compact
employer.members = member_updates
if member_updates.empty? && employer.id_card_setup.active
if employer.initialized && card_setup.initialized && member_updates.empty?
employer.active = false
end
employer.save
@@ -6,14 +6,7 @@ module AutomationService
end
def call
# employer = Employer.includes(:id_card_setup).find_by(pl_plan_key: @pl_plan_key)
# card_setup = employer.id_card_setup
UpdateEmployerPlansJob.new.perform(@pl_plan_key)
# if employer.present?
# employer.save
# else
# Member.find_by(pb_entity_key: vw_mb_member[:pb_entity_key]).destroy
# end
end
end
@@ -7,17 +7,8 @@ module AutomationService
end
def call
# employer = Employer.includes(:id_card_setup).find_by(employer_identifier: @employer_identifier)
# card_setup = employer.id_card_setup
UpdateEmployerJob.new.perform(employer_identifier: @employer_identifier, full_sync: @full_sync)
# if employer.present?
# employer.save
# else
# Member.find_by(pb_entity_key: vw_mb_member[:pb_entity_key]).destroy
# end
end
end
end
# AutomationService::MemberUpdate('13', 337710)
end
@@ -13,11 +13,9 @@ module AutomationService
if member.present?
member.save
else
Member.find_by(pb_entity_key: vw_mb_member[:pb_entity_key]).destroy
Member.find_by(pb_entity_key: @pb_entity_key).destroy
end
end
end
end
# AutomationService::MemberUpdate('13', 337710)
@@ -1,163 +0,0 @@
class WordDocProcessorOld
def initialize(word_doc, process=nil)
@word_doc = word_doc
if process
@process = process
else
@process = EmployerSetupProcess.new
end
end
def call
doc = Docx::Document.open(@word_doc)
index = 40
general_information = doc.paragraphs.slice(0, index)
plan_information = doc.paragraphs.slice(index + 1..)
general_fields(general_information)
plans(plan_information)
employer_logo()
@process
end
private
def general_fields(general_information)
fields = ['Group Number:', 'Employer Name:', 'Group Effective Date:']
general_information.each do |gi|
field_string = gi.to_s
if field_string.include?('Group Number:')
value = field_string.delete_prefix('Group Number:').strip
if is_number?(value)
@process.group_number = value
end
elsif field_string.include?('Employer Name:')
value = field_string.delete_prefix('Employer Name:').strip
@process.name = value
elsif field_string.include?('Group Effective Date:')
value = field_string.delete_prefix('Group Effective Date:').strip
@process.effective_date = value
end
end
end
def employer_logo
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 = File.basename(entry.name)
image_data = entry.get_input_stream.read
extracted_images << { filename: filename, data: image_data }
end
end
end
if extracted_images.length > 1
@process.employer_logo = @process.name.titleize.gsub(/\s+/, '').concat("Logo.png")
# same file logic
end
end
def plans(plan_information)
plans_array = []
plan_information.each_with_index do |pin, i|
if pin.to_s.match?(/\d*\.?\d+k/i)
new_plan = {title: pin.to_s.strip, start_index: i, benefits: []}
plans_array.push(new_plan)
end
end
plans_array.each do |pl|
new_plan = Plan.create(title: pl[:title], employer_setup_process: @process)
plan_fields = plan_information.slice(pl[:start_index] + 1, 14)
plan_fields.each_with_index do |pf, i|
field_string = pf.to_s
if field_string.strip.length > 1
case field_string
when ->(string) { string.include?("Physician Visit") }
value = field_string.delete_prefix("Physician Visit")
new_benefit = new_plan.plan_benefits.find_by(benefit_desc: "Primary Visit")
new_benefit.benefit = value
new_benefit.save
when ->(string) { string.include?("Specialist Visit") }
value = field_string.delete_prefix("Specialist Visit")
new_benefit = new_plan.plan_benefits.find_by(benefit_desc: "Specialist Visit")
new_benefit.benefit = value
new_benefit.save
when ->(string) { string.include?("Urgent Care") }
value = field_string.delete_prefix("Urgent Care")
new_benefit = new_plan.plan_benefits.find_by(benefit_desc: "Urgent Care")
new_benefit.benefit = value
new_benefit.save
when ->(string) { string.include?("Individual Deductible (in network )") }
value = field_string.delete_prefix("Individual Deductible (in network )")
new_benefit = new_plan.plan_benefits.find_by(benefit_desc: "INNInd Ded")
new_benefit.benefit = value
new_benefit.save
when ->(string) { string.include?("Family Deductible(in network )") }
value = field_string.delete_prefix("Family Deductible(in network )")
new_benefit = new_plan.plan_benefits.find_by(benefit_desc: "INNFamily Ded")
new_benefit.benefit = value
new_benefit.save
when ->(string) { string.include?("Individual Deductible (out of network)") }
value = field_string.delete_prefix("Individual Deductible (out of network)")
new_benefit = new_plan.plan_benefits.find_by(benefit_desc: "OONInd Ded")
new_benefit.benefit = value
new_benefit.save
when ->(string) { string.include?("Family Deductible (out of network) ") }
value = field_string.delete_prefix("Family Deductible (out of network) ")
new_benefit = new_plan.plan_benefits.find_by(benefit_desc: "OONFamily Ded")
new_benefit.benefit = value
new_benefit.save
when ->(string) { string.include?("Co-Insurance") }
value = field_string.delete_prefix("Co-Insurance")
new_benefit = new_plan.plan_benefits.find_by(benefit_desc: "Co-Insurance")
new_benefit.benefit = value
new_benefit.save
when ->(string) { string.include?("Out-of-Pocket(in network) ") }
value = field_string.delete_prefix("Out-of-Pocket(in network) ")
new_benefit = new_plan.plan_benefits.find_by(benefit_desc: "INNInd OOP")
new_benefit.benefit = value
new_benefit.save
when ->(string) { string.include?("Out-of-Pocket Family(in network) ") }
value = field_string.delete_prefix("Out-of-Pocket Family(in network) ")
new_benefit = new_plan.plan_benefits.find_by(benefit_desc: "INNFamily OOP")
new_benefit.benefit = value
new_benefit.save
when ->(string) { string.include?("Out-of-Pocket(out of network) ") }
value = field_string.delete_prefix("Out-of-Pocket(out of network) ")
new_benefit = new_plan.plan_benefits.find_by(benefit_desc: "OONInd OOP")
new_benefit.benefit = value
new_benefit.save
when ->(string) { string.include?("Out-of-Pocket Family (out of network) ") }
value = field_string.delete_prefix("Out-of-Pocket Family (out of network) ")
new_benefit = new_plan.plan_benefits.find_by(benefit_desc: "OONFamily OOP")
new_benefit.benefit = value
new_benefit.save
when ->(string) { string.include?("Emergency Room ") }
value = field_string.delete_prefix("Emergency Room ")
new_benefit = new_plan.plan_benefits.find_by(benefit_desc: "Emergency Room")
new_benefit.benefit = value
new_benefit.save
when ->(string) { string.include?("Preventive Care") }
value = field_string.delete_prefix("Preventive Care")
new_benefit = new_plan.plan_benefits.find_by(benefit_desc: "Preventive Care")
new_benefit.benefit = value
new_benefit.save
end
end
end
end
end
def is_number?(string)
true if Float(string) rescue false
end
end
@@ -1,76 +0,0 @@
module BenefitsWordDocService
class MapEmployerInformation
def initialize(employer, word_doc_section)
@employer = employer
@card_setup = @employer.id_card_setup
@word_doc_section = word_doc_section
end
def call
search_fields = mapping_hash.keys.to_set
@word_doc_section.each do |line|
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]
field_value = line.match(field_regex)[1].strip
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)
@employer[employer_field] = field_value
end
else
@employer[employer_field] = field_value
end
end
end
@card_setup.print_name = @employer.name
@employer.name = @employer.name.titleize
@card_setup.rx_group_number = @employer.group_number
@employer
end
private
def mapping_hash
{
'Employer Name' => {
employer_field: :name,
doc_field: 'Employer Name',
doc_field_desc: 'Follows pattern - Employer Name:New Employer',
doc_to_employer_regex: /.*:(.*)/,
regex_desc: 'Grabs everything after colon'
},
'Group Number' => {
employer_field: :group_number,
doc_field: 'Group Number',
doc_field_desc: 'Follows pattern - Group Number:099999',
doc_to_employer_regex: /.*:(.*)/,
regex_desc: 'Grabs everything after colon',
validation: 'number'
},
'Group Effective Date' => {
employer_field: :effective_date,
doc_field: 'Group Effective Date',
doc_field_desc: 'Follows pattern - Group Effective Date:12/1/2025',
doc_to_employer_regex: /.*:(.*)/,
regex_desc: 'Grabs everything after colon',
validation: 'date'
}
}
end
def is_number?(string)
true if Float(string) rescue false
end
def is_date?(string)
true if Date.parse rescue false
end
end
end
@@ -1,78 +0,0 @@
module BenefitsWordDocService
class MapEmployerLogo
def initialize(employer, word_doc)
@employer = employer
@card_setup = @employer.id_card_setup
@word_doc = word_doc
end
def call
Zip::File.open(@word_doc) do |zip_file|
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 = IdCard::EmployerLogo.find_or_create_by(filename: filename) do |clf|
clf.image_data = image_binary
clf.content_type = meme_type
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
@card_setup.employer_logo = logo
end
end
@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
@@ -1,44 +0,0 @@
module BenefitsWordDocService
class MapNetworkInformation
def initialize(employer, word_doc_section)
@employer = employer
@card_setup = @employer.id_card_setup
@word_doc_section = word_doc_section
end
def call
# network = @word_doc_section.each do |line|
# if line.match?(/cigna/i)
# return "Cigna"
# elsif line.match?(/medcost/i)
# return "Medcost"
# end
# end
network = @word_doc_section.find do |line|
if line.match?(/cigna/i)
break "Cigna"
elsif line.match?(/medcost/i)
break "MedCost"
end
end
# yellow_fruit_names_filtered = @word_doc_section.filter_map do |line|
# item[:name] if item[:color] == 'yellow'
# end
if network
@card_setup.network_provider = network
logo_name = "#{network}Logo.png"
@card_setup.network_logo = IdCard::NetworkLogo.find_by(filename: logo_name)
@card_setup.provider_section = IdCard::ProviderSection.find_by(title: network)
@card_setup.rx_section = IdCard::RxSection.find_by(title: "FairosRx")
end
@employer
end
end
end

Some files were not shown because too many files have changed in this diff Show More