From 38bc61860fcecb1969150742a532fa5a5c317bf4 Mon Sep 17 00:00:00 2001 From: Venkatesh Date: Thu, 9 Jul 2026 11:34:51 +0530 Subject: [PATCH] FIX_INSTALLMENT_REMINDER_MAIL --- app/Controllers/LeadsController.php | 135 ++++++++++-------- .../PolicyTransactionController.php | 90 ++++++++++-- app/Views/view_rfq.php | 28 +++- 3 files changed, 172 insertions(+), 81 deletions(-) diff --git a/app/Controllers/LeadsController.php b/app/Controllers/LeadsController.php index bd343eee..231ce0e1 100644 --- a/app/Controllers/LeadsController.php +++ b/app/Controllers/LeadsController.php @@ -2147,6 +2147,59 @@ class LeadsController extends BaseController return $result; } + private function saveLeadInstallmentDetails(int $lead_id, $installments): array + { + if (is_string($installments)) { + $installments = json_decode($installments, true) ?? []; + } + + if (! is_array($installments) || empty($installments)) { + return []; + } + + $existingInstallments = $this->leadInstallmentPaymentDetails + ->where('lead_id', $lead_id) + ->where('is_active', 1) + ->orderBy('id', 'ASC') + ->findAll(); + + $savedInstallments = []; + + foreach ($installments as $index => $installment) { + if (! is_array($installment)) { + continue; + } + + $data = [ + 'lead_id' => $lead_id, + 'installment_amount' => $installment['installment_amount'] ?? null, + 'payment_date' => ! empty($installment['payment_date']) + ? change_date_format($installment['payment_date']) + : null, + 'utr_no' => $installment['utr_no'] ?? null, + ]; + + $installmentId = ! empty($installment['id']) ? (int) $installment['id'] : null; + + if (! $installmentId && isset($existingInstallments[$index]['id'])) { + $installmentId = (int) $existingInstallments[$index]['id']; + } + + if ($installmentId) { + $this->leadInstallmentPaymentDetails->update($installmentId, $data); + $data['id'] = $installmentId; + } else { + $data['is_active'] = 1; + $newId = $this->leadInstallmentPaymentDetails->insert($data); + $data['id'] = $newId; + } + + $savedInstallments[] = $data; + } + + return $savedInstallments; + } + public function removeInstallments() { $id = $this->request->getGet('id'); @@ -3811,21 +3864,7 @@ class LeadsController extends BaseController $this->leadsModel->where('id', $lead_id)->set($data)->update(); if (isset($params['installments']) && ! empty($params['installments'])) { - - $installment_data = json_decode($params['installments'], true); - if (! empty($installment_data)) { - foreach ($installment_data as $key => $value) { - // print_r($value);die - $value['payment_date'] = ! empty($value['payment_date']) - ? change_date_format($value['payment_date']) - : null; - if (isset($value['id']) && ! empty($value['id'])) { - $this->leadInstallmentPaymentDetails->where('id', $value['id'])->set($value)->update(); - } else { - $this->leadInstallmentPaymentDetails->insert($value); - } - } - } + $this->saveLeadInstallmentDetails((int) $lead_id, $params['installments']); } } @@ -8491,29 +8530,12 @@ class LeadsController extends BaseController $this->myLogger->logme('error', "Lead updated successfully for ID: $lead_id"); // Save installment details + $savedInstallments = []; if (! empty($params['installments'])) { - $installments = json_decode($params['installments'], true); - $this->myLogger->logme('error', "Installments data received: " . json_encode($installments)); - - if (is_array($installments) && ! empty($installments)) { - foreach ($installments as $installment) { - $installment['payment_date'] = ! empty($installment['payment_date']) - ? change_date_format($installment['payment_date']) - : null; - - $installment['lead_id'] = $lead_id; - - if (! empty($installment['id'])) { - $this->leadInstallmentPaymentDetails->update($installment['id'], $installment); - $this->myLogger->logme('error', "Installment updated: " . json_encode($installment)); - } else { - $this->leadInstallmentPaymentDetails->insert($installment); - $this->myLogger->logme('error', "Installment inserted: " . json_encode($installment)); - } - } - } + $savedInstallments = $this->saveLeadInstallmentDetails((int) $lead_id, $params['installments']); + $this->myLogger->logme('error', 'Installments saved: ' . json_encode($savedInstallments)); } else { - $this->myLogger->logme('error', "No installments provided"); + $this->myLogger->logme('error', 'No installments provided'); } // Update lead file status to pending @@ -8526,12 +8548,13 @@ class LeadsController extends BaseController $this->myLogger->logme('error', "--- savePlacementDataAndValidateMemberDataFile END (SUCCESS) ---"); return $this->respond([ - 'status' => true, - 'code' => 200, - 'message' => 'Placement data saved successfully. File being validated', - 'lead_id' => $lead_id, - 'data' => $data, - 'params' => $params, + 'status' => true, + 'code' => 200, + 'message' => 'Placement data saved successfully. File being validated', + 'lead_id' => $lead_id, + 'installments' => $savedInstallments, + 'data' => $data, + 'params' => $params, ], 200); } catch (\Exception $e) { @@ -8614,31 +8637,17 @@ class LeadsController extends BaseController $this->leadsModel->update($lead_id, $data); + $savedInstallments = []; if (! empty($params['installments'])) { - $installments = json_decode($params['installments'], true); - - if (is_array($installments) && ! empty($installments)) { - foreach ($installments as $installment) { - $installment['payment_date'] = ! empty($installment['payment_date']) - ? change_date_format($installment['payment_date']) - : null; - - $installment['lead_id'] = $lead_id; - - if (! empty($installment['id'])) { - $this->leadInstallmentPaymentDetails->update($installment['id'], $installment); - } else { - $this->leadInstallmentPaymentDetails->insert($installment); - } - } - } + $savedInstallments = $this->saveLeadInstallmentDetails((int) $lead_id, $params['installments']); } return $this->respond([ - 'status' => true, - 'code' => 200, - 'message' => 'Placement data saved successfully', - 'lead_id' => $lead_id, + 'status' => true, + 'code' => 200, + 'message' => 'Placement data saved successfully', + 'lead_id' => $lead_id, + 'installments' => $savedInstallments, ], 200); } catch (\Exception $e) { return $this->respond([ diff --git a/app/Controllers/PolicyTransactionController.php b/app/Controllers/PolicyTransactionController.php index 7d144862..f793af2a 100644 --- a/app/Controllers/PolicyTransactionController.php +++ b/app/Controllers/PolicyTransactionController.php @@ -5439,31 +5439,91 @@ class PolicyTransactionController extends BaseController return ['status' => false, 'message' => 'No data found', 'response' => []]; } + $results = []; + $successCount = 0; + $failedCount = 0; + $skippedCount = 0; + foreach ($bdsInstallmentData as $installmentData) { + $installmentId = $installmentData['id'] ?? 'unknown'; + $leadId = $installmentData['lead_id'] ?? 'unknown'; - $mailData = $this->PrepareBDSMailData($installmentData); - $to_mail = $mailData['to_mail']; - $message = $mailData['message']; - $subject = $mailData['subject']; + try { + $mailData = $this->PrepareBDSMailData($installmentData); - $this->myLogger->logme("error", "Installment Pending for" . $subject); + if (empty($mailData) || empty($mailData['to_mail'])) { + $this->myLogger->logme( + 'error', + "Installment {$installmentId} (lead {$leadId}): skipped — no valid recipient emails" + ); + $skippedCount++; + $results[] = [ + 'installment_id' => $installmentId, + 'lead_id' => $leadId, + 'status' => 'skipped', + 'message' => 'No valid recipient emails', + ]; + continue; + } - $common = ['mail_type' => 'installment_amount_due_remainder_mail']; + $to_mail = $mailData['to_mail']; + $message = $mailData['message']; + $subject = $mailData['subject']; - $res = MailHelper::send_email(['mail' => $to_mail, 'subject' => $subject, 'message' => $message, 'common' => $common]); + $this->myLogger->logme("error", "Installment Pending for " . $subject); - $res = json_decode($res); - $this->myLogger->logme('error', 'res: ' . json_encode($res)); + $common = ['mail_type' => 'installment_amount_due_remainder_mail']; - if ($res->status == 'success') { - CLI::write("Mail sent successfully to " . count($to_mail) . " recipients"); - return ['status' => true, 'message' => 'Mail sent successfully', 'response' => $res]; - } else { - CLI::write("Mail sent failed to " . count($to_mail) . " recipients"); - return ['status' => false, 'message' => 'Mail sent failed', 'response' => $res]; + $res = MailHelper::send_email(['mail' => $to_mail, 'subject' => $subject, 'message' => $message, 'common' => $common]); + + $res = json_decode($res); + $this->myLogger->logme( + 'error', + "Installment {$installmentId} (lead {$leadId}) mail result: " . json_encode($res) + ); + + if ($res->status == 'success') { + $successCount++; + CLI::write("Mail sent successfully for installment {$installmentId} to " . count($to_mail) . " recipients"); + $results[] = [ + 'installment_id' => $installmentId, + 'lead_id' => $leadId, + 'status' => 'success', + ]; + } else { + $failedCount++; + CLI::write("Mail failed for installment {$installmentId}"); + $results[] = [ + 'installment_id' => $installmentId, + 'lead_id' => $leadId, + 'status' => 'failed', + 'response' => $res, + ]; + } + } catch (Exception $e) { + $failedCount++; + $this->myLogger->logme( + 'error', + "Installment {$installmentId} (lead {$leadId}) exception: " . $e->getMessage() + ); + $results[] = [ + 'installment_id' => $installmentId, + 'lead_id' => $leadId, + 'status' => 'failed', + 'message' => $e->getMessage(), + ]; } } + $totalProcessed = count($bdsInstallmentData); + $summaryMessage = "Processed {$totalProcessed} installment(s): {$successCount} sent, {$failedCount} failed, {$skippedCount} skipped"; + + return [ + 'status' => $successCount > 0, + 'message' => $summaryMessage, + 'response' => $results, + ]; + } catch (Exception $e) { $this->myLogger->logme('error', 'Exception: ' . $e->getMessage() . 'Page: ' . $e->getFile() . ' Line: ' . $e->getLine()); } diff --git a/app/Views/view_rfq.php b/app/Views/view_rfq.php index 32fe85e3..5a7c564c 100644 --- a/app/Views/view_rfq.php +++ b/app/Views/view_rfq.php @@ -7160,6 +7160,8 @@ function appendMultiFileData(data) { function addInstallmentHTML() { let html = `
+ +
@@ -7259,9 +7261,8 @@ function appendMultiFileData(data) { console.log("Form row count:", row_count); - if (row_count === 1) { - // $installmentContainer.empty(); - for (let index = 0; index < no_of_installments - 1; index++) { + if (row_count === 1 && no_of_installments > row_count) { + for (let index = 0; index < no_of_installments - row_count; index++) { addInstallmentHTML(); } } else if (no_of_installments === row_count) { @@ -7589,6 +7590,25 @@ function appendMultiFileData(data) { } } + function updateInstallmentPrimaryKeys(installments) { + if (!installments || !installments.length) { + return; + } + + $('#installment_form_row .form-row').each(function(index) { + if (!installments[index] || !installments[index].id) { + return; + } + + let $hidden = $(this).find('input[name="installment_primary_key[]"]'); + if ($hidden.length === 0) { + $(this).prepend(''); + } else { + $hidden.val(installments[index].id); + } + }); + } + function constructPlacementDataPayload() { var lead_id = $('#lead_id').val(); let placement_date = $('#placement_date').val(); @@ -7677,6 +7697,7 @@ function appendMultiFileData(data) { if (res.status == true) { toastr.success(res.message, 'Success'); + updateInstallmentPrimaryKeys(res.installments); $('.close').click(); } else { toastr.warning(res.message || 'Failed to save placement data', 'Warning'); @@ -7711,6 +7732,7 @@ function appendMultiFileData(data) { if (res.status == true) { toastr.success(res.message, 'Success'); + updateInstallmentPrimaryKeys(res.installments); checkMemberDataValidationStatus(res.lead_id) } else { toastr.warning(res.message, 'Warning');