Compare commits

..

203 Commits
dev ... test

Author SHA1 Message Date
Ubuntu
d028087d23 MERGE_TEST_BUG_FIXES 2026-08-12 11:43:12 +05:30
Ubuntu
b168c93b9f MERGE_TEST_BUG_FIXES 2026-08-08 17:06:49 +05:30
Ubuntu
1e60c99c49 MERGE_TEST_BUG_FIXES 2026-08-07 18:01:43 +05:30
Ubuntu
3fe52985fc MERGE_TEST_BUG_FIXES 2026-08-07 15:50:01 +05:30
Ubuntu
8da8becb58 MERGE_TEST_BUG_FIXES 2026-08-07 12:45:21 +05:30
Ubuntu
0051a86b60 MERGE_TEST_BUG_FIXES 2026-08-07 11:31:09 +05:30
Ubuntu
f5cd3248cd MERGE_TEST_BUG_FIXES 2026-08-07 10:25:21 +05:30
Ubuntu
9599619962 MERGE_TEST_BUG_FIXES 2026-08-06 14:26:46 +05:30
Ubuntu
7c272b29f9 MERGE_TEST_BUG_FIXES 2026-08-06 11:41:24 +05:30
Ubuntu
50d17c837c MERGE_TEST_BUG_FIXES 2026-08-04 15:45:13 +05:30
Ubuntu
efe78a258c MERGE_TEST_BUG_FIXES 2026-08-04 14:49:17 +05:30
Ubuntu
31869e3d27 MERGE_TEST_BUG_FIXES 2026-08-04 12:42:54 +05:30
Ubuntu
dda2e21629 MERGE_TEST_BUG_FIXES 2026-08-04 11:40:10 +05:30
Ubuntu
abd4ccb739 MERGE_TEST_BUG_FIXES 2026-08-03 14:49:12 +05:30
Ubuntu
03ed295623 MERGE_TEST_BUG_FIXES 2026-08-03 13:05:46 +05:30
Ubuntu
fca939f2dd MERGE_TEST_BUG_FIXES 2026-08-03 11:36:24 +05:30
Ubuntu
b1a2eb94c1 MERGE_TEST_BUG_FIXES 2026-07-30 18:33:05 +05:30
Ubuntu
005cef7faa MERGE_TEST_BUG_FIXES 2026-07-30 14:21:44 +05:30
Ubuntu
cc146f5fb6 MERGE_TEST_BUG_FIXES 2026-07-29 17:01:07 +05:30
Ubuntu
3a57ccf180 MERGE_TEST_BUG_FIXES 2026-07-29 10:52:23 +05:30
Ubuntu
28aee541f0 MERGE_TEST_BUG_FIXES 2026-07-29 10:00:28 +05:30
Ubuntu
32e45e16d4 MERGE_TEST_BUG_FIXES 2026-07-28 15:54:19 +05:30
Ubuntu
6a4e65b0c3 MERGE_TEST_BUG_FIXES 2026-07-24 18:31:17 +05:30
Ubuntu
262d7616cd MERGE_TEST_BUG_FIXES 2026-07-23 14:12:33 +05:30
Ubuntu
647f7470bc MERGE_TEST_BUG_FIXES 2026-07-23 09:17:33 +05:30
Ubuntu
6a39c0e79d MERGE_TEST_BUG_FIXES 2026-07-22 11:05:06 +05:30
Ubuntu
15dff5e87b MERGE_TEST_BUG_FIXES 2026-07-21 15:46:45 +05:30
Ubuntu
e1ef840aee MERGE_TEST_BUG_FIXES 2026-07-21 12:35:29 +05:30
Ubuntu
19afd681b1 MERGE_TEST_BUG_FIXES 2026-07-21 10:53:16 +05:30
Ubuntu
d0b173396c MERGE_TEST_BUG_FIXES 2026-07-16 17:43:34 +05:30
Ubuntu
9f1adfe8cc MERGE_TEST_BUG_FIXES 2026-07-16 12:28:31 +05:30
Ubuntu
261dc5e024 MERGE_TEST_BUG_FIXES 2026-07-16 09:55:18 +05:30
Ubuntu
efa5bee9d4 MERGE_TEST_BUG_FIXES 2026-07-15 15:50:35 +05:30
Ubuntu
b07a95780f MERGE_TEST_BUG_FIXES 2026-07-15 11:33:51 +05:30
Ubuntu
19fe1bf3b1 MERGE_TEST_BUG_FIXES 2026-07-15 11:18:14 +05:30
Ubuntu
4e905437e4 MERGE_TEST_BUG_FIXES 2026-07-14 15:50:57 +05:30
Ubuntu
3e723f96e9 MERGE_TEST_BUG_FIXES 2026-07-14 12:34:36 +05:30
Ubuntu
f2572f3807 MERGE_TEST_BUG_FIXES 2026-07-13 18:34:28 +05:30
Ubuntu
389d95a10b MERGE_TEST_BUG_FIXES 2026-07-13 15:00:58 +05:30
Ubuntu
d255fca519 MERGE_TEST_BUG_FIXES 2026-07-13 10:16:21 +05:30
Ubuntu
93f41ef221 MERGE_TEST_BUG_FIXES 2026-07-10 11:41:12 +05:30
Ubuntu
da84bdf0b7 MERGE_TEST_BUG_FIXES 2026-07-09 17:39:09 +05:30
Ubuntu
25870c8f92 MERGE_TEST_BUG_FIXES 2026-07-09 12:56:10 +05:30
Ubuntu
8174ccfcfa MERGE_TEST_BUG_FIXES 2026-07-08 17:48:16 +05:30
Ubuntu
78f150ca81 MERGE_TEST_BUG_FIXES 2026-07-07 10:34:48 +05:30
Ubuntu
29cb318a5d MERGE_TEST_BUG_FIXES 2026-07-06 18:10:02 +05:30
Ubuntu
55e2d41044 MERGE_TEST_BUG_FIXES 2026-07-06 16:03:55 +05:30
Ubuntu
b122af9c5a MERGE_TEST_BUG_FIXES 2026-07-06 14:23:27 +05:30
Ubuntu
a2d89b96cf MERGE_TEST_BUG_FIXES 2026-07-04 18:37:44 +05:30
Ubuntu
a3e5e8ffad MERGE_TEST_BUG_FIXES 2026-07-04 17:28:28 +05:30
Ubuntu
8f5127e249 MERGE_TEST_BUG_FIXES 2026-07-03 15:54:51 +05:30
Ubuntu
30468b50e2 MERGE_TEST_BUG_FIXES 2026-07-03 14:36:00 +05:30
Ubuntu
1981c558eb MERGE_TEST_BUG_FIXES 2026-07-02 15:52:03 +05:30
Ubuntu
725e12fc00 MERGE_TEST_BUG_FIXES 2026-07-02 12:56:47 +05:30
Ubuntu
6bb25c5227 MERGE_TEST_BUG_FIXES 2026-07-02 12:00:32 +05:30
Ubuntu
bacc5735b3 MERGE_TEST_BUG_FIXES 2026-06-30 17:52:17 +05:30
Ubuntu
04f164d0e4 MERGE_TEST_BUG_FIXES 2026-06-30 14:07:12 +05:30
Ubuntu
fcc8a3479f MERGE_TEST_BUG_FIXES 2026-06-30 11:11:22 +05:30
Ubuntu
641c62ea6f MERGE_TEST_BUG_FIXES 2026-06-26 11:34:29 +05:30
Ubuntu
d950435408 MERGE_TEST_BUG_FIXES 2026-06-25 14:33:27 +05:30
Ubuntu
572224846e MERGE_TEST_BUG_FIXES 2026-06-25 10:42:56 +05:30
Ubuntu
b06b3a0761 MERGE_TEST_LIVE_ISSUE 2026-06-17 09:41:57 +05:30
Ubuntu
d87b74491b MERGE_TEST_INSTALL_REMINDER_MAIL&LIVE_ISSUE 2026-06-16 16:04:36 +05:30
Ubuntu
13603c3f3a MERGE_TEST_CORS 2026-06-15 16:48:02 +05:30
Ubuntu
2f4d8f3a6e MERGE_TEST_PLACEMENT_CHANGES 2026-06-12 10:51:59 +05:30
Ubuntu
005ff63f19 MERGE_TEST_LIVE_ISSUE_UI 2026-06-11 17:12:37 +05:30
Ubuntu
0fce8ee236 MERGE_TEST_RATE_LIMIT_FIX 2026-06-10 12:59:15 +05:30
Ubuntu
d3ae90cf99 MERGE_TEST_BDS_LIVE_ISSUE 2026-06-08 17:34:49 +05:30
Ubuntu
153daf8524 MERGE_TEST_DASHBOARD_KPIS 2026-06-05 11:34:03 +05:30
Ubuntu
e530d41f91 MERGE_TEST_HR_CD_MAIL_NOTIFY 2026-06-04 09:50:38 +05:30
Ubuntu
09bd3a37ea MERGE_TEST_STORE_CLAIM_TPA_RESPONSE_IN_DB 2026-06-03 11:22:10 +05:30
Ubuntu
8d16a02eb4 MERGE_TEST_MAIL_TEMPLATE 2026-06-03 09:43:59 +05:30
Ubuntu
06f5844fd6 MERGE_TEST_DASHBOARD_API 2026-06-02 14:32:55 +05:30
Ubuntu
dfe90153e9 MERGE_TEST_OPPORTUNITIES 2026-05-27 12:28:15 +05:30
Ubuntu
0253a89125 MERGE_TEST_OPPORTUNITY_CLAIM_HISTORY&VISIT_ONBOARD_RELATED 2026-05-26 11:17:10 +05:30
Ubuntu
a86bbc4613 MERGE_TEST_DOCS&LIVEISSEUS 2026-05-22 15:03:40 +05:30
Ubuntu
40fe8d8d03 MERGE_TEST_CLAIM_PUSH_BUTTON 2026-05-18 17:03:40 +05:30
Ubuntu
d619899374 MERGE_TEST_FIXES 2026-05-16 10:21:38 +05:30
Ubuntu
fbd6c31885 MERGE_TEST_TOEKN_ISSUE 2026-05-15 11:33:19 +05:30
Ubuntu
52c8096b5f MERGE_TEST_LIVE_ISSUES 2026-05-13 13:02:46 +05:30
Ubuntu
b963224404 MERGE_TEST_SALES_CR_WITH_OPPOTUNITES 2026-05-12 18:29:19 +05:30
Ubuntu
aff74592d2 MERGE_TEST_SALES_CR 2026-05-12 11:26:53 +05:30
Ubuntu
169ff8c1ca MERGE_TEST_CLAIM_PDF_MERGE&SALES_CR 2026-05-12 10:12:36 +05:30
Ubuntu
a4ba5c77c4 MERGE_TEST_SALES_TRACKER_CR 2026-05-11 18:20:02 +05:30
Ubuntu
2c0ebe8c30 MERGE_TEST_LIVE_REPORTED_ISSUES&CRS 2026-05-11 17:53:29 +05:30
Ubuntu
2cb5fa8a2d MERGE_TEST_LIVE_ISSUES2 2026-05-11 14:44:19 +05:30
Ubuntu
3ea898ab56 MERGE_TEST_LIVE_ISSEUS 2026-05-11 12:07:59 +05:30
Ubuntu
02ec112b24 MERGE_TEST_LIVE_ISSUES 2026-05-08 16:48:23 +05:30
Ubuntu
e1759263f0 MERGE_TEST_LIVE_FIXS 2026-05-07 11:02:16 +05:30
Ubuntu
7d0d1b073f MERGE_TEST_MINOR_ISSUES 2026-05-05 17:20:47 +05:30
Ubuntu
9b0dca1ee7 MERGE_TEST_MINOR_ITEMS 2026-05-05 13:05:39 +05:30
Ubuntu
836436c73d MERGE_TEST_TPI_API_DATA 2026-05-05 09:19:34 +05:30
Ubuntu
7107ecb750 MERGE_TEST_MINIOR_ISSUES 2026-05-04 12:08:50 +05:30
Ubuntu
b83d8d97c7 MERGE_TEST_CLAIMS 2026-05-04 10:38:50 +05:30
Ubuntu
8740f2ec0d MERGE_TEST_TPA_RECON&DEL 2026-05-02 16:58:45 +05:30
Ubuntu
0164fea8af MERGE_TEST_TPA_RECON&DELETION&FE_VALIDATIONS 2026-04-29 10:58:27 +05:30
Ubuntu
38564d381e MERGE_TEST_FORM_VALIDATIONS 2026-04-28 17:00:30 +05:30
Ubuntu
d6d914783a MERGE_TEST_CLAIMS_LIVE_ISSSUE 2026-04-27 18:47:00 +05:30
Ubuntu
dfbcd95a4f MERGE_TEST_CLAIMS_LIVE_ISSSUE 2026-04-24 09:56:52 +05:30
Ubuntu
72c2824975 MERGE_TEST_SAML 2026-04-21 15:35:16 +05:30
Ubuntu
a64cc2916e MERGE_TEST_MINOR_HR_CLAIMS 2026-04-20 17:44:59 +05:30
Ubuntu
06cd2c9614 MERGE_TEST_LIVE_ISSUES&RECON_NEW 2026-04-18 16:48:02 +05:30
Ubuntu
e96396ca70 MERGE_TEST_OVERALL 2026-04-17 17:17:10 +05:30
Ubuntu
cd51a8c0f1 MERGE_TEST_OPD&MINOR_ISSUES 2026-04-16 09:52:17 +05:30
Ubuntu
fe35d51a31 MERGE_TEST_VALIDATIONS 2026-04-10 12:54:19 +05:30
Ubuntu
ad761b3d27 MERGE_TEST_TPA 2026-04-08 18:21:13 +05:30
Ubuntu
5fb7f05e8c MERGE_TEST_TPA 2026-04-08 17:59:44 +05:30
Ubuntu
dc7dafeb1e MERGE_TEST_NONEB_POLICY_TYPE_VALIDATION 2026-04-08 11:12:59 +05:30
Ubuntu
c579c6f797 MERGE_TEST_FORM_VALIDATIONS 2026-04-07 09:51:55 +05:30
Ubuntu
0f4e768852 MERGE_TEST_LIVE_ISSEUS&CLIENT_FILE_VALIDATIONS 2026-04-06 15:00:29 +05:30
Ubuntu
6b20ddb354 MERGE_TEST_BDS-FIXES 2026-04-01 18:36:45 +05:30
Ubuntu
ce58510613 MERGE_TEST_BDS_ISSUE&NONEB_RFQ_FLOW 2026-04-01 15:32:11 +05:30
Ubuntu
b9c7d7cfb8 MERGE_TEST_BDS_CHANGES_LIVE 2026-04-01 13:23:18 +05:30
Ubuntu
d7f9ce89f4 MERGE_TEST_BDS_CHANGES_LIVE 2026-04-01 09:38:50 +05:30
Ubuntu
58cdfb76b8 MERGE_TEST_NONEB_CLAIMS_FIRST_CUT 2026-03-31 12:39:35 +05:30
Ubuntu
74c1970c38 MERGE_TEST_SALES-FIXES 2026-03-31 11:00:05 +05:30
Ubuntu
09f69b1fb5 MERGE_TEST_SALES-FIXES 2026-03-30 19:20:23 +05:30
Ubuntu
f6fc7c2b22 MERGE_TEST_OPPORTUNITIES_LIVE_ISSUE 2026-03-30 17:51:21 +05:30
Ubuntu
fc544c3239 MERGE_TEST_FIXES 2026-03-27 19:49:13 +05:30
Ubuntu
848bd7ce0c MERGE_TEST_FORM_VALIDATION&MEDIBUDDY&LIVE_ISSUES2 2026-03-27 15:23:32 +05:30
Ubuntu
2e8ce70712 MERGE_TEST_FORM_VALIDATION&MEDIBUDDY&LIVE_ISSUES 2026-03-27 14:29:51 +05:30
Ubuntu
5f5f8cc601 MERGE_TEST_LIVE ISSUES 2026-03-26 09:46:00 +05:30
Ubuntu
1ff48c9bee MERGE_TEST_NON_EB_RFQ 2026-03-23 18:35:49 +05:30
Ubuntu
e5726d221b MERGE_TEST_FIXES 2026-03-21 16:12:35 +05:30
Ubuntu
4f0878bade MERGE_TEST_LIVE_ISSUES 2026-03-21 15:16:13 +05:30
Ubuntu
23a61e9769 MERGE_TEST_LIVE_ISSUES 2026-03-20 11:45:38 +05:30
Ubuntu
7b25330b4c MERGE_TEST_LIVE_ISSUES 2026-03-19 09:54:44 +05:30
Ubuntu
b8804472b8 MERGE_TEST_FIXES 2026-03-18 12:14:59 +05:30
Ubuntu
6577afc1b1 MERGE_TEST_FIXES 2026-03-18 10:42:40 +05:30
Ubuntu
750a102e3c MERGE_TEST_VALIDATION 2026-03-17 13:10:36 +05:30
Ubuntu
fdc3678022 MERGE_TEST_VALIDATION 2026-03-17 12:13:53 +05:30
Ubuntu
0dd8f9fec7 MERGE_TEST_VALIDATION 2026-03-16 19:18:45 +05:30
Ubuntu
e2aac9d2bb MERGE_TEST_UI 2026-03-16 18:42:19 +05:30
Ubuntu
dda33a00ea MERGE_TEST_SECURITY 2026-03-16 16:02:28 +05:30
Ubuntu
946e616d14 MERGE_TEST_COMMIT_RELESE_MSG 2026-03-16 13:24:12 +05:30
Ubuntu
bc7c431605 MERGE_TEST_SECURITY 2026-03-13 17:37:57 +05:30
Ubuntu
51c3e1eaf7 MERGE_TEST_TPA_API_ISSUES&MINOR&SECURITY&LIVE 2026-03-12 18:22:10 +05:30
Ubuntu
24475c4e89 MERGE_TEST_VISIT&HR_INSIGHT 2026-03-10 18:41:56 +05:30
Ubuntu
2277546932 MERGE_TEST_NONEB_FLOW&OTRS 2026-03-06 11:27:50 +05:30
Ubuntu
ac0e159f5e MERGE_TEST_MINOR_CHANGES 2026-03-02 11:20:31 +05:30
Ubuntu
2a6ecc0469 MERGE_TEST_HR_BRANCH_TOKEN&MINOR_ISSUES 2026-02-26 17:37:32 +05:30
Ubuntu
ce60cb0420 MERGE_TEST_METABASE_TPA_DASHBOARD 2026-02-25 17:39:11 +05:30
Ubuntu
a0279b5985 MERGE_TEST_API_RATE_LIMIT_&OT_ISSUES 2026-02-23 18:58:19 +05:30
Ubuntu
efb3be7b8c MERGE_TEST_UI_MINOIR_ISSUES 2026-02-17 16:55:25 +05:30
Ubuntu
bc8a11aae5 MERGE_TEST_FORM_VALIDATIONS_DONE 2026-02-13 17:58:05 +05:30
Ubuntu
a8d7ee3800 MERGE_TEST_FORM_VALIDATIONS_FIX 2026-02-13 09:53:51 +05:30
Ubuntu
985f25628f MERGE_TEST_FORM_VALIDATION2 2026-02-12 17:14:00 +05:30
Ubuntu
7896477820 MERGE_TEST_FORM_VALIDATIONS_CLAIMS 2026-02-12 14:57:15 +05:30
Ubuntu
87d1b75ccb MERGE_TEST_FORM_VALIDATIONS 2026-02-12 14:34:30 +05:30
Ubuntu
accb72bfc4 MERGE_TEST_SQL_INJECTION_COMPLETED 2026-02-12 14:08:37 +05:30
Ubuntu
0e3688df22 MERGE_TEST_429_ISSUE_CHECK 2026-02-11 12:33:38 +05:30
Ubuntu
a54e15196f MERGE_TEST_SEC_MINOR_FIXES 2026-02-09 14:26:03 +05:30
Ubuntu
80e85f5a31 MERGE_TEST_MINOR_FIXES 2026-02-09 14:19:45 +05:30
Ubuntu
e5d48a7ee3 MERGE_TEST_MINOR_ISSUE&HR_DASHBOARD 2026-02-06 18:17:35 +05:30
Ubuntu
370736acae MERGE_TEST_HR_CHANGES&ISSUES 2026-02-06 11:45:29 +05:30
Ubuntu
7e49baad76 MERGE_TEST_HR_CHANGES 2026-02-05 09:21:12 +05:30
Ubuntu
361806a473 MERGE_TEST_VAPT_CONT&HEADER_FOOTER_ISSUE 2026-01-29 09:30:40 +05:30
Ubuntu
6ca9b7fe61 MERGE_TEST_VAPT&LIVE_ISSUES 2026-01-28 10:03:29 +05:30
Ubuntu
ff3ab2d4b5 MERGE_TEST_SECURITY_MPIN_ISSUE 2026-01-13 11:12:42 +05:30
Ubuntu
75f0049cf8 MERGE_TEST_TKT_ESCALATION&ECARD_BULK&BENEFTIS_ISSUES&CR 2026-01-03 16:38:50 +05:30
Ubuntu
b7c11ddaee MERGE_TEST_API_ROUTE_FOR_TPA 2026-01-02 14:21:43 +05:30
Ubuntu
7941d34310 MERGE_TEST_MINOR_ITEMS 2026-01-02 14:09:56 +05:30
Ubuntu
63c12f195f MERGE_TEST_OPD_FULL&REPORTED_ISSUES 2025-12-30 14:28:30 +05:30
Ubuntu
70159861e2 MERGE_TEST_S3_ECARD_MIG_SCRIPT_IMPROVED 2025-12-29 16:50:16 +05:30
Ubuntu
55ea88dac8 MERGE_TEST_FINAL 2025-12-26 18:59:33 +05:30
Ubuntu
4d0ca068b8 MERGE_TEST_OPD_ECARD_TO_S3_TPA_BDS 2025-12-24 22:54:44 +05:30
Ubuntu
45565d8b40 MERGE_TEST_BDS_CHANGES 2025-12-20 18:49:41 +05:30
Ubuntu
2b165749a0 MERGE_TEST_BDS_TPA_TPA_VARIATION 2025-12-20 09:37:32 +05:30
Ubuntu
51f081c9dd MERGE_TEST_PAYOUT-COMMISSION-TPA 2025-12-12 17:32:12 +05:30
Ubuntu
42f4666907 MERGE_TEST_COMMISSION_TPA_MINOR 2025-12-11 19:16:46 +05:30
Ubuntu
199b3e830e MERGE_TEST_BDS&MINOR 2025-11-26 18:24:10 +05:30
Ubuntu
ada700e1a8 MERGE_TEST_HR_ISSUES&MOB_SELF_UPDATE 2025-11-13 18:24:48 +05:30
Ubuntu
c027be2259 MERGE_TEST_MEDI_ASSIT 2025-11-07 19:12:21 +05:30
Ubuntu
fe88ed5c8d MERGE_TEST_USR&LIVE_ISSUES 2025-10-31 19:01:51 +05:30
Ubuntu
f01148df11 MERGE_TEST_BDS_CLIENTS_ECARD&LIVE_ISSUES 2025-10-24 18:15:08 +05:30
Ubuntu
48a8f4eef3 MERGE_TEST_HR_MULTI_ENTITY_SUPPORT&SMS_OTP&LIVE_ISSUES 2025-10-11 18:26:16 +05:30
Ubuntu
1a3ff04f85 MERGE_TEST_BDS&AUTO_MAIL_TEMPLATES 2025-09-29 09:58:16 +05:30
Ubuntu
6a64e6a26f MERGE_TEST_MOBILE_CHATBOT_TICKET_CLAIM_LIVE_ISSUES 2025-09-12 16:22:58 +05:30
Ubuntu
4a5a68c95d MERGE_TEST_RFQEB_INS_MAIL_NOTIDY&UI&SINGLE_FILE_ 2025-08-30 18:22:05 +05:30
Ubuntu
38124040cc MERGE_TEST_TICKET&HR_FILE_UPLOAD_&UI&ISSUES 2025-08-26 18:55:54 +05:30
Ubuntu
b00bf440e9 MERGE_TEST_UI_REWAMP 2025-08-19 14:37:17 +05:30
Ubuntu
2f5ef9a31d MERGE_TEST_CHAT_BOT&EB&UI 2025-08-16 23:00:33 +05:30
Ubuntu
139e0470e6 MERGE_TEST_ALL_MODULES_CR 2025-08-08 18:10:22 +05:30
Ubuntu
ae607e65be MERGE_TEST_HR_FEEDBACKS 2025-07-23 14:56:25 +05:30
Ubuntu
40e32b5da9 MERGE_TEST_LIVE_ISSUE&AUTHLOGS 2025-07-21 15:27:33 +05:30
Ubuntu
375ca023d2 MERGE_TEST_HR_AUDIT_LOG 2025-07-17 10:36:51 +05:30
Ubuntu
fb7bbea3ce MERGE_TEST_MERGE_NEWHR&MPIN_ISSUE 2025-07-11 17:40:11 +05:30
Ubuntu
a1cfca14e2 MERGE_TEST_RFQ_LIVE_ISSUES&FEEDBACK 2025-06-18 11:25:33 +05:30
Ubuntu
74f49f8d0a MERGE_TEST_SIGNOFF_ISSUES 2025-05-30 22:43:18 +05:30
Ubuntu
a261fed9ed MERGE_TEST_CRM_TO_BDS_SYNC&OT_ISSUES 2025-05-22 17:53:48 +05:30
Ubuntu
a687e8a3bc MERGE_TEST_ROLLOVER&BDS_INSTALLMENT 2025-05-19 11:01:56 +05:30
Ubuntu
69ff7bc194 MERGE_TEST_LIVE_ISSUES&RFQ_REQMENTS 2025-05-14 18:02:23 +05:30
Ubuntu
419afb0d55 MERGE_TEST_RFQ_CHNAGES 2025-05-08 18:08:59 +05:30
Ubuntu
d040c96e25 MERGE_TEST_DASHBOARD&REPORTS 2025-05-02 09:22:56 +05:30
Ubuntu
09fa2f47e3 MERGE_TEST_LIVE_ISSUES 2025-04-22 18:16:39 +05:30
Ubuntu
3d35fc4dfd MERGE_TEST_RFQ_ISSUE/ADD_REQ 2025-04-08 17:23:39 +05:30
Ubuntu
0f7ebb61cc MERGE_TEST_RFQ_MUL_FILE_UPOAD&DEMOGRAPHY_ISSUE 2025-04-05 10:50:20 +05:30
Ubuntu
b1255e30e8 MERGE_TEST_CLAIM_FEEDBACK_FORM&FEEBBACKS 2025-04-03 17:45:07 +05:30
velz
e412673c45 MERGE_TEST_BDS_ROLE 2025-03-25 17:33:01 +05:30
velz
fc4dda3cc6 MERGE_TEST_BDS&ROLE_ACCESS 2025-03-24 15:46:43 +05:30
velz
207bdd9aba Merge branch 'dev' into test 2025-03-24 09:45:45 +05:30
Venba
8e5a7cc285 MERGE_TEST_CLAIMS_ISSUE 2025-03-14 03:24:43 +00:00
Venba
80e03fb478 MERGE_TEST_BDS&CLAIMS_LIVE_FEEDBACK 2025-03-13 08:59:41 +00:00
6 changed files with 82 additions and 283 deletions

View File

@ -188,7 +188,7 @@ pt.renewalReminder.days = mon,tue,wed,thu,fri
pt.renewalReminder.clientTypes = 1,2
# renewal_date | policy_end_date
pt.renewalReminder.dateField = renewal_date
pt.renewalReminder.daysBefore = 30, 15, 7, 1, -2, -5, -10
pt.renewalReminder.daysBefore = 30
pt.renewalReminder.includeClientEmail = true
# When true, also send for policies whose dateField is already past (overdue)
pt.renewalReminder.includeOverdue = false

View File

@ -20,8 +20,7 @@ class PtRenewalReminderConfig extends BaseConfig
/** Whitelisted: renewal_date | policy_end_date */
public string $dateField = 'renewal_date';
/** @var int[] Reminder offsets: positive = days before due, negative = days after due */
public array $daysBeforeList = [30];
public int $daysBefore = 30;
public bool $includeClientEmail = false;
@ -62,7 +61,7 @@ class PtRenewalReminderConfig extends BaseConfig
'days' => env('pt.renewalReminder.days', 'mon,tue,wed,thu,fri'),
'clientTypes' => env('pt.renewalReminder.clientTypes', '2'),
'dateField' => env('pt.renewalReminder.dateField', 'renewal_date'),
'daysBefore' => env('pt.renewalReminder.daysBefore', '30'),
'daysBefore' => env('pt.renewalReminder.daysBefore', 30),
'includeClientEmail' => env('pt.renewalReminder.includeClientEmail', 'true'),
'includeOverdue' => env('pt.renewalReminder.includeOverdue', 'false'),
'toEmails' => env('pt.renewalReminder.toEmails', ''),
@ -166,7 +165,7 @@ class PtRenewalReminderConfig extends BaseConfig
}
$this->dateField = $dateField;
$this->daysBeforeList = self::parseDaysBeforeList($merged['daysBefore'] ?? 30);
$this->daysBefore = max(0, (int) ($merged['daysBefore'] ?? 30));
$this->includeClientEmail = $this->toBool($merged['includeClientEmail'] ?? true);
$this->includeOverdue = $this->toBool($merged['includeOverdue'] ?? false);
@ -197,74 +196,9 @@ class PtRenewalReminderConfig extends BaseConfig
return $this->dateField;
}
/**
* First / primary offset (legacy callers).
*/
public function getDaysBefore(): int
{
return $this->daysBeforeList[0] ?? 30;
}
/**
* @return int[]
*/
public function getDaysBeforeList(): array
{
return $this->daysBeforeList;
}
public function getDaysBeforeDisplay(): string
{
return implode(', ', $this->daysBeforeList);
}
/**
* Map each offset to the calendar date it matches (today + offset).
*
* @return array<int, string> offset => Y-m-d
*/
public function getTargetDates(?string $today = null): array
{
$today = $today ?: date('Y-m-d');
$map = [];
foreach ($this->daysBeforeList as $offset) {
$map[(int) $offset] = date('Y-m-d', strtotime($today . ' ' . sprintf('%+d days', (int) $offset)));
}
return $map;
}
/**
* Parse "30, 15, 7, 1, -2, -5, -10" (or a single int / array) into unique offsets.
*
* @return int[]
*/
public static function parseDaysBeforeList(mixed $value): array
{
if (is_int($value) || is_float($value)) {
$raw = [(int) $value];
} elseif (is_array($value)) {
$raw = $value;
} else {
$raw = preg_split('/[,\s]+/', trim((string) $value), -1, PREG_SPLIT_NO_EMPTY) ?: [];
}
$out = [];
$seen = [];
foreach ($raw as $item) {
$item = trim((string) $item);
if ($item === '' || ! is_numeric($item)) {
continue;
}
$n = (int) $item;
if ($n > 365 || $n < -365 || isset($seen[$n])) {
continue;
}
$seen[$n] = true;
$out[] = $n;
}
return $out !== [] ? $out : [30];
return $this->daysBefore;
}
/**
@ -337,7 +271,7 @@ class PtRenewalReminderConfig extends BaseConfig
'days' => implode(',', $this->days),
'clientTypes' => $this->clientTypes,
'dateField' => $this->dateField,
'daysBefore' => $this->getDaysBeforeDisplay(),
'daysBefore' => $this->daysBefore,
'includeClientEmail' => $this->includeClientEmail,
'includeOverdue' => $this->includeOverdue,
'toEmails' => implode(',', $this->toEmails),

View File

@ -6014,7 +6014,7 @@ class PolicyTransactionController extends BaseController
$this->logRenewalReminderStep(
$logPrefix . ' Fetching candidates for dateField='
. $config->getDateField()
. ', daysBefore=' . $config->getDaysBeforeDisplay()
. ', daysBefore=' . $config->getDaysBefore()
. ', includeOverdue=' . ($config->includeOverdue() ? 'true' : 'false')
. ', clientTypes=' . json_encode($config->getClientTypes())
);
@ -6023,7 +6023,7 @@ class PolicyTransactionController extends BaseController
try {
$candidates = $this->policyTransactionModel->getRenewalReminderCandidates(
$config->getDateField(),
$config->getDaysBeforeList(),
$config->getDaysBefore(),
$config->getClientTypes(),
$config->includeOverdue()
);
@ -6066,7 +6066,7 @@ class PolicyTransactionController extends BaseController
$this->logRenewalReminderStep(
$logPrefix . ' ' . $message
. ' | dateField=' . $config->getDateField()
. ' | daysBefore=' . $config->getDaysBeforeDisplay()
. ' | daysBefore=' . $config->getDaysBefore()
. ' | includeOverdue=' . ($config->includeOverdue() ? 'true' : 'false')
);
if ($isCli) {
@ -6081,7 +6081,7 @@ class PolicyTransactionController extends BaseController
try {
$diagnostics = $this->policyTransactionModel->diagnoseRenewalReminderCandidates(
$config->getDateField(),
$config->getDaysBeforeList(),
$config->getDaysBefore(),
$config->getClientTypes(),
$config->includeOverdue()
);
@ -6119,9 +6119,6 @@ class PolicyTransactionController extends BaseController
$emptyPayload['config'] = $configSnapshot;
$emptyPayload['detailed_summary'] = $detailedSummary;
$emptyPayload['why_empty'] = $diagnostics;
if (! empty($detailedSummary['client_mail'])) {
$emptyPayload['summary']['client_mail'] = $detailedSummary['client_mail'];
}
}
return $this->renewalReminderResponse($emptyPayload, $isCli);
@ -6228,8 +6225,6 @@ class PolicyTransactionController extends BaseController
'policy_start_date' => $row['policy_start_date'] ?? null,
'policy_end_date' => $row['policy_end_date'] ?? null,
'reminder_date' => ! empty($reminderRaw) ? date('Y-m-d', strtotime((string) $reminderRaw)) : null,
'days_before' => isset($row['reminder_offset']) ? (int) $row['reminder_offset'] : null,
'reminder_offset' => isset($row['reminder_offset']) ? (int) $row['reminder_offset'] : null,
'is_overdue' => $isOverdue,
'status' => 'dry_run',
'message' => 'Dry run — mail not sent, status not updated',
@ -6290,10 +6285,9 @@ class PolicyTransactionController extends BaseController
if (isset($res->status) && $res->status === 'success') {
$successCount++;
try {
$this->policyTransactionModel->markRenewalReminderSent(
(int) $ptId,
isset($row['reminder_offset']) ? (int) $row['reminder_offset'] : null
);
$this->policyTransactionModel->update((int) $ptId, [
'renewal_status' => 'renewal_mail_send',
]);
$this->logRenewalReminderStep(
$logPrefix . " PT {$ptId}: renewal_status set to renewal_mail_send"
);
@ -6413,9 +6407,6 @@ class PolicyTransactionController extends BaseController
$responsePayload['config'] = $configSnapshot;
$responsePayload['detailed_summary'] = $detailedSummary;
$responsePayload['message'] = $detailedSummary['headline'] ?? $summaryMessage;
if (! empty($detailedSummary['client_mail'])) {
$responsePayload['summary']['client_mail'] = $detailedSummary['client_mail'];
}
}
return $this->renewalReminderResponse($responsePayload, $isCli);
@ -6504,8 +6495,6 @@ class PolicyTransactionController extends BaseController
$policiesWithoutPolicyNo = 0;
$policiesWithClientEmailInTo = 0;
$policiesMissingClientEmail = 0;
$policiesWithClientEmailOnRecord = 0;
$policiesConfiguredToOnly = 0;
$clientEmailsInTo = [];
foreach ($results as $item) {
@ -6537,11 +6526,6 @@ class PolicyTransactionController extends BaseController
$policiesWithoutPolicyNo++;
}
$clientEmailRaw = trim((string) ($item['client_email'] ?? ''));
if ($clientEmailRaw !== '') {
$policiesWithClientEmailOnRecord++;
}
$clientEmailIncluded = ! empty($item['client_email_included']);
if ($clientEmailIncluded) {
$policiesWithClientEmailInTo++;
@ -6555,20 +6539,15 @@ class PolicyTransactionController extends BaseController
$policiesMissingClientEmail++;
}
if ($status === 'dry_run' && ! $clientEmailIncluded && (int) ($item['to_count'] ?? count($item['to'] ?? [])) > 0) {
$policiesConfiguredToOnly++;
}
$compact = [
'pt_id' => $item['pt_id'] ?? null,
'policy_no' => $policyNo !== '' ? $policyNo : 'Not Assigned',
'client_name' => $item['client_name'] ?? null,
'client_email' => $clientEmailRaw !== '' ? $clientEmailRaw : null,
'client_email' => $item['client_email'] ?? null,
'client_email_included' => $clientEmailIncluded,
'include_client_email_enabled' => ! empty($item['include_client_email_enabled']),
'policy_type' => $item['policy_type'] ?? null,
'reminder_date' => $item['reminder_date'] ?? ($item['renewal_date'] ?? $item['policy_end_date'] ?? null),
'days_before' => $item['days_before'] ?? ($item['reminder_offset'] ?? null),
'is_overdue' => $isOverdue,
'to' => $item['to'] ?? [],
'to_count' => (int) ($item['to_count'] ?? count($item['to'] ?? [])),
@ -6611,8 +6590,7 @@ class PolicyTransactionController extends BaseController
}
}
$targetDates = $config->getTargetDates();
$targetDate = implode(', ', array_values($targetDates));
$targetDate = date('Y-m-d', strtotime('+' . max(0, (int) $config->getDaysBefore()) . ' days'));
$headline = sprintf(
'DRY RUN — %d policy(ies) pending for renewal reminder: %d ready to mail, %d skipped (no email), %d failed | client email in TO: %d, missing client email: %d',
@ -6633,7 +6611,7 @@ class PolicyTransactionController extends BaseController
'Policies with client email in TO: ' . $policiesWithClientEmailInTo,
'Policies missing/invalid client email: ' . $policiesMissingClientEmail,
'Unique client emails in TO: ' . count($clientEmailsInTo),
'Due on target date(s) (' . $targetDate . '): ' . $dueCount,
'Due on target date (' . $targetDate . '): ' . $dueCount,
'Overdue policies included: ' . $overdueCount,
'Unique TO recipients: ' . count($uniqueTo),
'Unique CC recipients: ' . count($uniqueCc),
@ -6641,24 +6619,13 @@ class PolicyTransactionController extends BaseController
'Total TO deliveries (per mail): ' . $totalToHits,
'Policies without policy no: ' . $policiesWithoutPolicyNo,
'Date field: ' . $config->getDateField(),
'Days before: ' . $config->getDaysBeforeDisplay(),
'Days before: ' . $config->getDaysBefore(),
'Include overdue: ' . ($config->includeOverdue() ? 'yes' : 'no'),
];
$clientMailSummary = [
'enabled' => $config->includeClientEmail(),
'policies_with_email_on_record' => $policiesWithClientEmailOnRecord,
'policies_included_in_to' => $policiesWithClientEmailInTo,
'policies_missing_or_invalid' => $policiesMissingClientEmail,
'policies_configured_to_only' => $policiesConfiguredToOnly,
'unique_client_emails_in_to' => count($clientEmailsInTo),
'client_emails_in_to' => array_keys($clientEmailsInTo),
];
return [
'headline' => $headline,
'lines' => $lines,
'client_mail' => $clientMailSummary,
'counts' => [
'policies_pending_renewal' => $candidateCount,
'policies_ready_to_mail' => $wouldSendCount,
@ -6669,10 +6636,8 @@ class PolicyTransactionController extends BaseController
'policies_without_policy_no' => $policiesWithoutPolicyNo,
'policies_without_email' => $policiesWithoutEmail,
'include_client_email_enabled' => $config->includeClientEmail(),
'policies_with_client_email_on_record' => $policiesWithClientEmailOnRecord,
'policies_with_client_email_in_to' => $policiesWithClientEmailInTo,
'policies_missing_client_email' => $policiesMissingClientEmail,
'policies_configured_to_only' => $policiesConfiguredToOnly,
'unique_client_emails_in_to' => count($clientEmailsInTo),
'unique_to_recipients' => count($uniqueTo),
'unique_cc_recipients' => count($uniqueCc),
@ -6684,9 +6649,8 @@ class PolicyTransactionController extends BaseController
],
'filters' => [
'date_field' => $config->getDateField(),
'days_before' => $config->getDaysBeforeList(),
'target_date' => $targetDates[$config->getDaysBefore()] ?? reset($targetDates),
'target_dates' => $targetDates,
'days_before' => $config->getDaysBefore(),
'target_date' => $targetDate,
'include_overdue' => $config->includeOverdue(),
'include_client_email' => $config->includeClientEmail(),
'client_types' => $config->getClientTypes(),
@ -6758,9 +6722,7 @@ class PolicyTransactionController extends BaseController
$dateField = $config->getDateField();
$reminderRaw = $data[$dateField] ?? ($data['renewal_date'] ?? $data['policy_end_date'] ?? null);
$reminderDate = ! empty($reminderRaw) ? date('d-m-Y', strtotime((string) $reminderRaw)) : '';
$daysBefore = isset($data['reminder_offset']) && $data['reminder_offset'] !== '' && $data['reminder_offset'] !== null
? (int) $data['reminder_offset']
: $config->getDaysBefore();
$daysBefore = $config->getDaysBefore();
$isOverdue = ! empty($data['is_overdue'])
|| (! empty($reminderRaw) && strtotime((string) $reminderRaw) < strtotime(date('Y-m-d')));
$policyLabel = $policyNo !== '' ? "Policy #{$policyNo}" : 'Policy Pending';
@ -7115,7 +7077,7 @@ class PolicyTransactionController extends BaseController
'days' => trim((string) $this->request->getPost('days')),
'clientTypes' => [2],
'dateField' => trim((string) $this->request->getPost('dateField')),
'daysBefore' => PtRenewalReminderConfig::parseDaysBeforeList($this->request->getPost('daysBefore')),
'daysBefore' => (int) $this->request->getPost('daysBefore'),
'includeClientEmail' => $this->request->getPost('includeClientEmail'),
'includeOverdue' => $this->request->getPost('includeOverdue'),
'toEmails' => trim((string) $this->request->getPost('toEmails')),
@ -7132,7 +7094,7 @@ class PolicyTransactionController extends BaseController
if (! in_array($payload['dateField'], ['renewal_date', 'policy_end_date'], true)) {
$payload['dateField'] = 'renewal_date';
}
$payload['daysBefore'] = implode(', ', $payload['daysBefore']);
$payload['daysBefore'] = max(0, $payload['daysBefore']);
$updated = $this->notificationModel->update((int) $row['id'], [
'config_json' => json_encode($payload),
@ -7164,12 +7126,6 @@ class PolicyTransactionController extends BaseController
$config['days'] = implode(',', $config['days']);
}
if (is_array($config['daysBefore'] ?? null)) {
$config['daysBefore'] = implode(', ', $config['daysBefore']);
} elseif (isset($config['daysBefore'])) {
$config['daysBefore'] = implode(', ', PtRenewalReminderConfig::parseDaysBeforeList($config['daysBefore']));
}
foreach (['toEmails', 'ccEmails', 'bccEmails'] as $field) {
if (is_array($config[$field] ?? null)) {
$config[$field] = implode(',', $config[$field]);
@ -7401,7 +7357,7 @@ class PolicyTransactionController extends BaseController
'days' => 'mon,tue,wed,thu,fri',
'clientTypes' => [2],
'dateField' => 'renewal_date',
'daysBefore' => '30',
'daysBefore' => 30,
'includeClientEmail' => true,
'includeOverdue' => false,
'toEmails' => '',

View File

@ -63,7 +63,6 @@
'edate',
'renewal_date',
'renewal_status',
'renewal_last_reminder_offset',
'rollover_date',
'policy_holder_name',
'same_as_proposer',
@ -2132,15 +2131,15 @@
/**
* Candidates for policy_transaction renewal reminder cron.
*
* @param string $dateField Whitelisted column: renewal_date | policy_end_date
* @param int|string|int[] $daysBefore Comma-separated or list of offsets (negative = days after due)
* @param int[] $clientTypes Client type ids (1=Group, 2=Individual)
* @param bool $includeOverdue When true, also include rows where dateField < today
* @param string $dateField Whitelisted column: renewal_date | policy_end_date
* @param int $daysBefore Days ahead of today to match
* @param int[] $clientTypes Client type ids (1=Group, 2=Individual)
* @param bool $includeOverdue When true, also include rows where dateField < today
* @return array
*/
public function getRenewalReminderCandidates(
string $dateField,
$daysBefore,
int $daysBefore,
array $clientTypes,
bool $includeOverdue = false
): array {
@ -2157,10 +2156,10 @@
return [];
}
$offsets = $this->normalizeReminderOffsets($daysBefore);
$today = date('Y-m-d');
$targetDates = $this->reminderTargetDates($offsets, $today);
$column = 'pt.' . $dateField;
$daysBefore = max(0, (int) $daysBefore);
$targetDate = date('Y-m-d', strtotime('+' . $daysBefore . ' days'));
$today = date('Y-m-d');
$column = 'pt.' . $dateField;
$query = $this->db->table('policy_transaction pt')
->select("
@ -2178,7 +2177,6 @@
c.common_mails,
policy_type.policy_type,
i.name AS insurer_name,
DATEDIFF({$column}, CURDATE()) AS reminder_offset,
CASE WHEN {$column} < '{$today}' THEN 1 ELSE 0 END AS is_overdue
")
->join('clients c', 'pt.client_id = c.id', 'left')
@ -2187,9 +2185,18 @@
->join('policy_type', 'pt.policy_type_id = policy_type.id', 'left')
->where('pt.is_active', 1)
->where('pt.action_type', 'inception')
->whereIn('c.client_type', $clientTypes);
->whereIn('c.client_type', $clientTypes)
->where("IFNULL(pt.renewal_status, '') NOT IN ('renewal_mail_send', 'renewed', 'reminded')", null, false)
->where("NOT EXISTS (SELECT 1 FROM policy_transaction p2 WHERE p2.source_client_policy_id = pt.client_policy_id AND p2.is_active = 1)");
$this->applyRenewalReminderCandidateFilters($query, $column, $targetDates, $today, $includeOverdue);
if ($includeOverdue) {
$query->groupStart()
->where($column, $targetDate)
->orWhere("{$column} <", $today)
->groupEnd();
} else {
$query->where($column, $targetDate);
}
$query->groupBy('pt.id')
->orderBy('pt.id', 'DESC');
@ -2200,13 +2207,12 @@
/**
* Explain why renewal reminder candidates may be empty (for dry-run diagnostics).
*
* @param int|string|int[] $daysBefore
* @param int[] $clientTypes
* @return array<string, mixed>
*/
public function diagnoseRenewalReminderCandidates(
string $dateField,
$daysBefore,
int $daysBefore,
array $clientTypes,
bool $includeOverdue = false
): array {
@ -2219,11 +2225,10 @@
return $type > 0;
})));
$offsets = $this->normalizeReminderOffsets($daysBefore);
$today = date('Y-m-d');
$targetDates = $this->reminderTargetDates($offsets, $today);
$column = 'pt.' . $dateField;
$targetLabel = implode(', ', $targetDates);
$daysBefore = max(0, (int) $daysBefore);
$targetDate = date('Y-m-d', strtotime('+' . $daysBefore . ' days'));
$today = date('Y-m-d');
$column = 'pt.' . $dateField;
$base = function () {
return $this->db->table('policy_transaction pt')
@ -2250,25 +2255,25 @@
$countAfterStatus = (int) $base()
->whereIn('c.client_type', $clientTypes)
->where("IFNULL(pt.renewal_status, '') !=", 'renewed')
->where("IFNULL(pt.renewal_status, '') NOT IN ('renewal_mail_send', 'renewed', 'reminded')", null, false)
->countAllResults();
$countAfterNotRenewedExists = (int) $base()
->whereIn('c.client_type', $clientTypes)
->where("IFNULL(pt.renewal_status, '') !=", 'renewed')
->where("IFNULL(pt.renewal_status, '') NOT IN ('renewal_mail_send', 'renewed', 'reminded')", null, false)
->where("NOT EXISTS (SELECT 1 FROM policy_transaction p2 WHERE p2.source_client_policy_id = pt.client_policy_id AND p2.is_active = 1)")
->countAllResults();
$countExactTargetDate = (int) $base()
->whereIn('c.client_type', $clientTypes)
->where("IFNULL(pt.renewal_status, '') !=", 'renewed')
->where("IFNULL(pt.renewal_status, '') NOT IN ('renewal_mail_send', 'renewed', 'reminded')", null, false)
->where("NOT EXISTS (SELECT 1 FROM policy_transaction p2 WHERE p2.source_client_policy_id = pt.client_policy_id AND p2.is_active = 1)")
->whereIn($column, $targetDates)
->where($column, $targetDate)
->countAllResults();
$countOverdue = (int) $base()
->whereIn('c.client_type', $clientTypes)
->where("IFNULL(pt.renewal_status, '') !=", 'renewed')
->where("IFNULL(pt.renewal_status, '') NOT IN ('renewal_mail_send', 'renewed', 'reminded')", null, false)
->where("NOT EXISTS (SELECT 1 FROM policy_transaction p2 WHERE p2.source_client_policy_id = pt.client_policy_id AND p2.is_active = 1)")
->where("{$column} <", $today)
->where("{$column} IS NOT NULL", null, false)
@ -2276,16 +2281,27 @@
->countAllResults();
$finalBuilder = $base()
->whereIn('c.client_type', $clientTypes);
$this->applyRenewalReminderCandidateFilters($finalBuilder, $column, $targetDates, $today, $includeOverdue);
->whereIn('c.client_type', $clientTypes)
->where("IFNULL(pt.renewal_status, '') NOT IN ('renewal_mail_send', 'renewed', 'reminded')", null, false)
->where("NOT EXISTS (SELECT 1 FROM policy_transaction p2 WHERE p2.source_client_policy_id = pt.client_policy_id AND p2.is_active = 1)");
if ($includeOverdue) {
$finalBuilder->groupStart()
->where($column, $targetDate)
->orWhere("{$column} <", $today)
->groupEnd();
} else {
$finalBuilder->where($column, $targetDate);
}
$countFinal = (int) $finalBuilder->countAllResults();
// Sample nearest upcoming renewals (next 60 days) for debugging
$from = $today;
$to = date('Y-m-d', strtotime('+60 days'));
$nearestSample = $base()
->select("pt.id, pt.policy_no, c.client_name, c.email AS client_email, pt.renewal_date, pt.policy_end_date, pt.renewal_status, {$column} AS match_date, DATEDIFF({$column}, CURDATE()) AS reminder_offset")
->select("pt.id, pt.policy_no, c.client_name, c.email AS client_email, pt.renewal_date, pt.policy_end_date, pt.renewal_status, {$column} AS match_date")
->whereIn('c.client_type', $clientTypes)
->where("IFNULL(pt.renewal_status, '') !=", 'renewed')
->where("IFNULL(pt.renewal_status, '') NOT IN ('renewal_mail_send', 'renewed', 'reminded')", null, false)
->where("NOT EXISTS (SELECT 1 FROM policy_transaction p2 WHERE p2.source_client_policy_id = pt.client_policy_id AND p2.is_active = 1)")
->where("{$column} >=", $from)
->where("{$column} <=", $to)
@ -2302,16 +2318,16 @@
if ($countAfterClientType === 0) {
$reasons[] = 'No active inception policies found for configured client type(s).';
} elseif ($countAfterStatus === 0) {
$reasons[] = 'All matching policies already have renewal_status of renewed.';
$reasons[] = 'All matching policies already have renewal_status of renewal_mail_send/renewed/reminded.';
} elseif ($countAfterNotRenewedExists === 0) {
$reasons[] = 'All remaining policies already have an active renewed policy linked via source_client_policy_id.';
} elseif (! $includeOverdue && $countExactTargetDate === 0) {
$reasons[] = "No policies have {$dateField} equal to any target date ({$targetLabel}) for offsets [" . implode(', ', $offsets) . '].';
$reasons[] = "No policies have {$dateField} exactly equal to target date {$targetDate} (today + {$daysBefore} days). includeOverdue is false, so only exact date matches are selected.";
if ($countOverdue > 0) {
$reasons[] = "There are {$countOverdue} overdue policies that would be included if includeOverdue=true, or if a negative offset matches today.";
$reasons[] = "There are {$countOverdue} overdue policies that would be included if includeOverdue=true.";
}
} elseif ($includeOverdue && $countFinal === 0) {
$reasons[] = "No policies match target dates ({$targetLabel}) or overdue (< {$today}) on {$dateField}.";
$reasons[] = "No policies match target date {$targetDate} or overdue (< {$today}) on {$dateField}.";
}
if (empty($reasons) && $countFinal === 0) {
@ -2320,15 +2336,14 @@
return [
'today' => $today,
'target_date' => $targetDates[0] ?? null,
'target_dates' => $targetDates,
'target_date' => $targetDate,
'date_field' => $dateField,
'days_before' => $offsets,
'days_before' => $daysBefore,
'include_overdue' => $includeOverdue,
'client_types' => $clientTypes,
'counts' => [
'active_inception_for_client_types' => $countAfterClientType,
'after_excluding_renewed' => $countAfterStatus,
'after_excluding_sent_or_renewed' => $countAfterStatus,
'after_excluding_already_renewed_policy' => $countAfterNotRenewedExists,
'exact_target_date_matches' => $countExactTargetDate,
'overdue_matches' => $countOverdue,
@ -2337,106 +2352,11 @@
'reasons' => $reasons,
'nearest_upcoming_sample_60_days' => $nearestSample,
'hint' => $includeOverdue
? 'Candidates = any configured offset date OR overdue on selected date field.'
: "Candidates require {$dateField} IN ({$targetLabel}). Negative offsets send after the due date. Change daysBefore in Mail Config.",
? 'Candidates = exact target date OR overdue on selected date field.'
: "Candidates require {$dateField} = {$targetDate} exactly. Enable includeOverdue to also include past dates, or change daysBefore / dateField in Mail Config.",
];
}
/**
* Mark a policy as mailed for the current reminder offset.
*/
public function markRenewalReminderSent(int $ptId, ?int $offset = null): bool
{
$data = ['renewal_status' => 'renewal_mail_send'];
if ($offset !== null && $this->hasRenewalLastReminderOffsetColumn()) {
$data['renewal_last_reminder_offset'] = $offset;
}
return (bool) $this->update($ptId, $data);
}
/**
* @param int|string|int[] $daysBefore
* @return int[]
*/
private function normalizeReminderOffsets($daysBefore): array
{
return \Config\PtRenewalReminderConfig::parseDaysBeforeList($daysBefore);
}
/**
* @param int[] $offsets
* @return string[]
*/
private function reminderTargetDates(array $offsets, string $today): array
{
$dates = [];
foreach ($offsets as $offset) {
$dates[] = date('Y-m-d', strtotime($today . ' ' . sprintf('%+d days', (int) $offset)));
}
return array_values(array_unique($dates));
}
private function hasRenewalLastReminderOffsetColumn(): bool
{
static $exists = null;
if ($exists === null) {
$exists = $this->db->fieldExists('renewal_last_reminder_offset', $this->table);
}
return $exists;
}
/**
* @param object $query Query builder
* @param string[] $targetDates
*/
private function applyRenewalReminderCandidateFilters(
$query,
string $column,
array $targetDates,
string $today,
bool $includeOverdue
): void {
$query->where("NOT EXISTS (SELECT 1 FROM policy_transaction p2 WHERE p2.source_client_policy_id = pt.client_policy_id AND p2.is_active = 1)");
if ($this->hasRenewalLastReminderOffsetColumn()) {
$query->where("IFNULL(pt.renewal_status, '') !=", 'renewed');
$offsetSkip = "(pt.renewal_last_reminder_offset IS NULL OR pt.renewal_last_reminder_offset != DATEDIFF({$column}, CURDATE()))";
if ($includeOverdue) {
$query->groupStart()
->groupStart()
->whereIn($column, $targetDates)
->where($offsetSkip, null, false)
->groupEnd()
->orGroupStart()
->where("{$column} <", $today)
->where("IFNULL(pt.renewal_status, '') NOT IN ('renewal_mail_send', 'reminded')", null, false)
->where('pt.renewal_last_reminder_offset', null)
->groupEnd()
->groupEnd();
} else {
$query->whereIn($column, $targetDates)
->where($offsetSkip, null, false);
}
return;
}
$query->where("IFNULL(pt.renewal_status, '') NOT IN ('renewal_mail_send', 'renewed', 'reminded')", null, false);
if ($includeOverdue) {
$query->groupStart()
->whereIn($column, $targetDates)
->orWhere("{$column} <", $today)
->groupEnd();
} else {
$query->whereIn($column, $targetDates);
}
}
/**
* Server-side DataTables list for Retail Policy (individual clients only).
*

View File

@ -261,14 +261,12 @@
<label class="custom-control-label" for="cfg_includeClientEmail">Include Client Email</label>
</div>
</div>
<!--
<div class="form-group col-md-3 col-sm-6">
<div class="custom-control custom-switch">
<input type="checkbox" class="custom-control-input" id="cfg_includeOverdue" name="includeOverdue" value="1">
<label class="custom-control-label" for="cfg_includeOverdue">Include Overdue</label>
</div>
</div>
-->
</div>
<div class="form-row">
@ -285,14 +283,11 @@
</div>
</div>
</div>
<div class="form-group col-md-8">
<div class="form-group col-md-3">
<label for="cfg_daysBefore">Days Before</label>
<input type="text" class="form-control" id="cfg_daysBefore" name="daysBefore" value="30" placeholder="30, 15, 7, 1, -2, -5, -10">
<small class="form-text text-muted">Comma-separated offsets. Positive = days before due, negative = days after due.</small>
<input type="number" min="0" class="form-control" id="cfg_daysBefore" name="daysBefore" value="30">
</div>
</div>
<div class="form-row">
<div class="form-group col-md-12">
<div class="form-group col-md-5">
<label for="cfg_days">Weekdays (used when daily is off)</label>
<input type="text" class="form-control" id="cfg_days" name="days" placeholder="mon,tue,wed,thu,fri">
</div>
@ -483,7 +478,7 @@
$('#cfg_daily').prop('checked', boolVal(data.daily));
$('#cfg_includeClientEmail').prop('checked', boolVal(data.includeClientEmail));
$('#cfg_includeOverdue').prop('checked', boolVal(data.includeOverdue));
$('#cfg_daysBefore').val(listVal(data.daysBefore) || '30');
$('#cfg_daysBefore').val(data.daysBefore != null ? data.daysBefore : 30);
setRetailDateField(data.dateField || 'renewal_date');
$('#cfg_days').val(listVal(data.days) || 'mon,tue,wed,thu,fri');
$('#cfg_toEmails').val(listVal(data.toEmails));

View File

@ -2,16 +2,10 @@
-- Run manually against the application database.
-- 1) policy_transaction.renewal_status
-- Skip this ALTER if the column already exists.
ALTER TABLE `policy_transaction`
ADD COLUMN `renewal_status` VARCHAR(50) NULL DEFAULT NULL
AFTER `renewal_date`;
-- Required for multi-offset reminders (30, 15, 7, ...). Skip if the column already exists.
ALTER TABLE `policy_transaction`
ADD COLUMN `renewal_last_reminder_offset` INT NULL DEFAULT NULL
AFTER `renewal_status`;
-- 2) notifications.config_json
ALTER TABLE `notifications`
ADD COLUMN `config_json` LONGTEXT NULL
@ -32,7 +26,7 @@ SELECT
'Policy Renewal Reminder',
'',
1,
'{"enabled":true,"daily":true,"days":"mon,tue,wed,thu,fri","clientTypes":[2],"dateField":"renewal_date","daysBefore":"30, 15, 7, 1, -2, -5, -10","includeClientEmail":true,"includeOverdue":false,"toEmails":"","ccEmails":"","bccEmails":"","fromMail":""}'
'{"enabled":true,"daily":true,"days":"mon,tue,wed,thu,fri","clientTypes":[2],"dateField":"renewal_date","daysBefore":30,"includeClientEmail":true,"includeOverdue":false,"toEmails":"","ccEmails":"","bccEmails":"","fromMail":""}'
FROM DUAL
WHERE NOT EXISTS (
SELECT 1