From c48bb2aaa9b65286093462a3c087e7b09444eb5f Mon Sep 17 00:00:00 2001 From: dhanabalan Date: Sat, 3 Jan 2026 11:57:04 +0530 Subject: [PATCH] Added send invoice transit report command page --- .../Commands/SendInvoiceTransitReport.php | 144 ++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 app/Console/Commands/SendInvoiceTransitReport.php diff --git a/app/Console/Commands/SendInvoiceTransitReport.php b/app/Console/Commands/SendInvoiceTransitReport.php new file mode 100644 index 0000000..999462d --- /dev/null +++ b/app/Console/Commands/SendInvoiceTransitReport.php @@ -0,0 +1,144 @@ +argument('schedule_type'); + $plantId = (int) $this->argument('plant'); + + $mailRules = AlertMailRule::where('module', 'InvoiceTransit') + ->where('rule_name', 'InvoiceTransitMail') + ->where('schedule_type', $scheduleType) + ->where('plant', $plantId) + ->get(); + + $plants = ($plantId == 0) + ? Plant::all() + : Plant::where('id', $plantId)->get(); + + $plantCodes = $plants->pluck('code', 'id'); + + if ($plants->isEmpty()) { + $this->error('No valid plant(s) found.'); + return; + } + + if (strtolower($scheduleType) == 'daily') + { + $results = DB::table('invoice_in_transits as it') + ->join('invoice_masters as im', function ($join) { + $join->on('im.receiving_plant_name', '=', 'it.receiving_plant_name')->on('im.transport_name', '=', 'it.transport_name'); + }) + ->select( + 'it.invoice_number', + 'it.receiving_plant', + 'it.plant_id', + 'it.receiving_plant_name', + 'it.lr_bl_aw_date', + 'im.id as invoice_master_id', + 'im.transport_name', + DB::raw('CAST(im.transit_days AS INTEGER) as transit_days'), + DB::raw('(CURRENT_DATE - CAST(it.lr_bl_aw_date AS DATE)) as delayed_days') + ) + ->when($plantId != 0, fn($q) => $q->where('it.plant_id', $plantId)) + ->whereNotNull('it.lr_bl_aw_date') + ->whereRaw( + '(CURRENT_DATE - CAST(it.lr_bl_aw_date AS DATE)) >= CAST(im.transit_days AS INTEGER)' + ) + ->get(); + + + if ($results->isEmpty()) { + $this->info('No invoice transit records found for today.'); + return; + } + + $tableData = []; + + foreach ($mailRules as $rule) { + + $ruleInvoices = $results->where('invoice_master_id', $rule->invoice_master_id); + + $invoiceMaster = InvoiceMaster::find($rule->invoice_master_id); + + $mailSubject = $invoiceMaster + ? "Despatch Invoice In Transit ({$invoiceMaster->receiving_plant_name} - {$invoiceMaster->transport_name})" + : "Despatch Invoice In Transit"; + + if ($ruleInvoices->isEmpty()) { + $tableData = []; + $this->info("No despatch invoices in transit found for rule {$rule->id}."); + } else { + $tableData = $ruleInvoices->values()->map(function ($item, $index) use ($plantCodes) { + return [ + 'no' => $index + 1, + 'plant' => $plantCodes[$item->plant_id], + 'receiving_plant' => $item->receiving_plant, + 'receiving_plant_name' => $item->receiving_plant_name, + 'invoice_number' => $item->invoice_number, + 'transport_name' => $item->transport_name, + 'lr_bl_aw_date' => $item->lr_bl_aw_date, + 'transit_days' => $item->transit_days, + 'status' => $item->delayed_days . ' Days', + ]; + })->toArray(); + } + + $mail = new InvoiceTransitMail($scheduleType, $tableData, $mailSubject); + + $toEmails = collect(explode(',', $rule->email)) + ->map(fn ($e) => trim($e)) + ->filter() + ->unique() + ->values() + ->toArray(); + + $ccEmails = collect(explode(',', $rule->cc_emails)) + ->map(fn ($e) => trim($e)) + ->filter() + ->unique() + ->values() + ->toArray(); + + if (empty($toEmails)) { + $this->warn("Skipping rule {$rule->id} — no To emails."); + continue; + } + + \Mail::to($toEmails)->cc($ccEmails)->send($mail); + + $this->info( + "Mail sent → Rule {$rule->id} | Invoice Master ID: {$rule->invoice_master_id} | To: " . implode(', ', $toEmails) + ); + } + } + } +} -- 2.49.1