|
|
@@ -0,0 +1,56 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace App\Services;
|
|
|
+
|
|
|
+use App\Models\StudentContractInstallment;
|
|
|
+use App\Models\UnitAccountPayable;
|
|
|
+use Carbon\Carbon;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Visão geral financeira da unidade: agrega Contas a Receber (parcelas de aluno)
|
|
|
+ * e Contas a Pagar (unit_account_payables) do mês corrente.
|
|
|
+ */
|
|
|
+class UnitFinancialDashboardService
|
|
|
+{
|
|
|
+ public function overview(int $unitId): array
|
|
|
+ {
|
|
|
+ $start = Carbon::now()->startOfMonth()->toDateString();
|
|
|
+ $end = Carbon::now()->endOfMonth()->toDateString();
|
|
|
+ $today = Carbon::today()->toDateString();
|
|
|
+
|
|
|
+ // Recebíveis = parcelas de aluno
|
|
|
+ $recPendingQ = StudentContractInstallment::where('unit_id', $unitId)->where('status', 'pending');
|
|
|
+ $recReceivedQ = StudentContractInstallment::where('unit_id', $unitId)
|
|
|
+ ->where('status', 'paid')->whereBetween('payment_date', [$start, $end]);
|
|
|
+ $recOverdueQ = StudentContractInstallment::where('unit_id', $unitId)
|
|
|
+ ->where('status', 'pending')->where('due_date', '<', $today);
|
|
|
+
|
|
|
+ // Pagáveis
|
|
|
+ $payPendingQ = UnitAccountPayable::where('unit_id', $unitId)->where('status', 'pending');
|
|
|
+ $payPaidQ = UnitAccountPayable::where('unit_id', $unitId)
|
|
|
+ ->where('status', 'paid')->whereBetween('payment_date', [$start, $end]);
|
|
|
+ $payOverdueQ = UnitAccountPayable::where('unit_id', $unitId)
|
|
|
+ ->where('status', 'pending')->where('due_date', '<', $today);
|
|
|
+
|
|
|
+ $receivedMonth = (float) (clone $recReceivedQ)->sum('paid_value');
|
|
|
+ $paidMonth = (float) (clone $payPaidQ)->sum('paid_value');
|
|
|
+
|
|
|
+ return [
|
|
|
+ 'received_month' => round($receivedMonth, 2),
|
|
|
+ 'received_month_count' => (clone $recReceivedQ)->count(),
|
|
|
+ 'paid_month' => round($paidMonth, 2),
|
|
|
+ 'paid_month_count' => (clone $payPaidQ)->count(),
|
|
|
+ 'result_month' => round($receivedMonth - $paidMonth, 2),
|
|
|
+
|
|
|
+ 'receivable_pending' => round((float) (clone $recPendingQ)->sum('value'), 2),
|
|
|
+ 'receivable_pending_count' => (clone $recPendingQ)->count(),
|
|
|
+ 'payable_pending' => round((float) (clone $payPendingQ)->sum('value'), 2),
|
|
|
+ 'payable_pending_count' => (clone $payPendingQ)->count(),
|
|
|
+
|
|
|
+ 'overdue_receivable' => round((float) (clone $recOverdueQ)->sum('value'), 2),
|
|
|
+ 'overdue_receivable_count' => (clone $recOverdueQ)->count(),
|
|
|
+ 'overdue_payable' => round((float) (clone $payOverdueQ)->sum('value'), 2),
|
|
|
+ 'overdue_payable_count' => (clone $payOverdueQ)->count(),
|
|
|
+ ];
|
|
|
+ }
|
|
|
+}
|