4.5 KiB
4.5 KiB
Dev Log — 2026-03-24
Feature: Non EB Terms & Non EB Rack Rate in Client Policy List
Objective
Introduce "Non EB Terms" and "Non EB Rack Rate" menu items in the client policy table hamburger dropdown. These menus replace the existing "Terms" and "Rack Rate" menus when the policy type's allocg field is Non-EB or Marine.
Files Changed
1. app/Models/ClientPolicyModel.php
getClientPolicyByClientId()— Added two new selects:policy_type.allocg as allocg(policy_type table was already joined)leads.misc as lead_misc(leads table was already joined viaclient_policy.is_from_lead = leads.id)
$allowedFields— Addednon_eb_rack_rate_filesto allow updating the new JSON column.
2. app/Controllers/ClientController.php
editClientOnboarding()— Addedallocgandlead_miscto the policy data mapping array passed to the view.- Added 3 new methods:
getNonEbRackRateFiles()— GET endpoint, readsnon_eb_rack_rate_filesJSON fromclient_policytable and returns parsed file list.uploadNonEbRackRateFile()— POST endpoint, uploads file towritable/uploads/non_eb_rack_rate/, appends file entry tonon_eb_rack_rate_filesJSON column.removeNonEbRackRateFile()— POST endpoint, removes file entry from JSON column and deletes physical file from disk.
3. app/Config/Routes.php
- Added 3 new routes under
client/policygroup:GET getNonEbRackRateFilesPOST uploadNonEbRackRateFilePOST removeNonEbRackRateFile
4. app/Config/Constants.php
- Added
UPLOAD_EXT_NON_EB_RACK_RATEconstant:['pdf', 'xls', 'xlsx']
5. app/Views/client_policy.php
- Dropdown menus (4 locations: ~lines 530, 808, 2596, 2642):
- Added
allocgcheck:item.allocg === 'Non-EB' || item.allocg === 'Marine' - If true → shows "Non EB Terms" + "Non EB Rack Rate", hides "Terms" + "Rack Rate"
- If false → shows "Terms" + "Rack Rate" (original behavior)
- Added
- Non EB Terms click handler (
btnNonEbTerms):- Parses
lead_miscJSON from data attribute - If
placement_sheet_idkey exists → opens Google Sheet (https://docs.google.com/spreadsheets/d/{id}) in new tab - Otherwise →
alert('No terms found')
- Parses
- Non EB Rack Rate click handler (
btnNonEbRackRateModal):- Opens
#nonEbRackRateModalusingnew bootstrap.Modal()(BS5 API, stored onwindow._nonEbModal) - Loads existing files via AJAX
getNonEbRackRateFiles
- Opens
- Upload handler (
#btnUploadNonEbFile):- Validates file extension (pdf/xlsx/xls) client-side
- Uploads via AJAX
uploadNonEbRackRateFilewith FormData - Appends uploaded file to list on success
- Delete handler (
btnRemoveNonEbFile):- SweetAlert confirmation
- Calls
removeNonEbRackRateFilevia AJAX - Removes file row from DOM on success
6. app/Views/client_onboarding.php
- Added modal HTML (
#nonEbRackRateModal) at line ~457, placed outside tab-pane containers (same level asautoFetchBranchModal) to avoid Bootstrap stacking issues. - Scoped CSS for compact modal: forced
max-width: 420px,min-height: autoon modal-body, reduced padding on header/body/footer. - Close buttons use
onclick="if(window._nonEbModal) window._nonEbModal.hide();"— inline JS referencing the global BS5 Modal instance to avoid jQuery binding/timing issues.
7. app/Controllers/EmployeeRestController.php
- Line ~2257 query — Added
LEFT JOINwithpolicy_typetable and aCASE WHENselect:CASE WHEN policy_type.allocg IN ('Non-EB', 'Marine') THEN 'Non-EB' ELSE 'EB' END as allocg
DDL Required (Manual)
ALTER TABLE `client_policy` ADD COLUMN `non_eb_rack_rate_files` JSON NULL DEFAULT NULL AFTER `wellness_vendor_id`;
Key Technical Decisions
- Bootstrap version conflict: Project loads BS5 via
vendor.min.jsand BS3.4.1 via footer CDN.$.fn.modal()uses BS3 (broken), so all modal operations usenew bootstrap.Modal()(BS5 native API). Modal instance stored onwindow._nonEbModalfor close button access. - Modal placement: Modal HTML must be outside tab-pane containers in
client_onboarding.phpto avoid visibility/stacking issues. - File storage: Rack rate files stored physically in
writable/uploads/non_eb_rack_rate/and tracked as JSON array inclient_policy.non_eb_rack_rate_filescolumn. Each entry:{name, original_name, type, uploaded_at}. - Menu visibility: Driven by
policy_type.allocgfield —Non-EB/Marineshows Non EB menus, everything else shows standard Terms/Rack Rate menus.