|
|
@@ -29,10 +29,6 @@ class FranchisorDashboardService
|
|
|
ReceivableStatus::CANCELLED->value,
|
|
|
];
|
|
|
|
|
|
- public function __construct(
|
|
|
- private readonly TbrCalculationService $tbrCalculationService,
|
|
|
- ) {}
|
|
|
-
|
|
|
public function overview(array $unitIds = [], ?Carbon $startDate = null, ?Carbon $endDate = null): array
|
|
|
{
|
|
|
$startDate ??= Carbon::now()->startOfMonth();
|
|
|
@@ -79,18 +75,61 @@ private function unitsSummary(array $unitIds, Carbon $startDate, Carbon $endDate
|
|
|
->distinct()
|
|
|
->count('unit_id');
|
|
|
|
|
|
- $revenue = $total === 0
|
|
|
- ? 0.0
|
|
|
- : $this->tbrCalculationService->resolveRevenueBetween($filteredUnitIds, $startDate, $endDate);
|
|
|
+ $receivables = $total === 0
|
|
|
+ ? ['received' => 0.0, 'missing' => 0.0]
|
|
|
+ : $this->unitReceivables($filteredUnitIds, $startDate, $endDate);
|
|
|
|
|
|
return [
|
|
|
'total' => $total,
|
|
|
- 'revenue' => round($revenue, 2),
|
|
|
+ 'revenue' => round($receivables['received'], 2),
|
|
|
+ 'missing_receivables' => round($receivables['missing'], 2),
|
|
|
'active_contracts' => $activeContracts,
|
|
|
'without_active_contract' => max(0, $total - $activeContracts),
|
|
|
];
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Separa os recebíveis das unidades entre valores efetivamente recebidos no
|
|
|
+ * período e valores com vencimento no período que ainda não foram recebidos.
|
|
|
+ * Mantém a mesma composição usada pelo faturamento-base do TBR.
|
|
|
+ */
|
|
|
+ private function unitReceivables(array $unitIds, Carbon $startDate, Carbon $endDate): array
|
|
|
+ {
|
|
|
+ $start = $startDate->toDateString();
|
|
|
+ $end = $endDate->toDateString();
|
|
|
+
|
|
|
+ $sources = [
|
|
|
+ DB::table('student_contract_installments')
|
|
|
+ ->whereNull('deleted_at')
|
|
|
+ ->whereIn('unit_id', $unitIds),
|
|
|
+ DB::table('unit_account_receivables')
|
|
|
+ ->whereNull('deleted_at')
|
|
|
+ ->whereIn('unit_id', $unitIds),
|
|
|
+ DB::table('franchisee_account_receives')
|
|
|
+ ->whereNull('deleted_at')
|
|
|
+ ->where('origin', 'manual_unit')
|
|
|
+ ->whereNotNull('unit_id')
|
|
|
+ ->whereIn('unit_id', $unitIds),
|
|
|
+ ];
|
|
|
+
|
|
|
+ $received = 0.0;
|
|
|
+ $missing = 0.0;
|
|
|
+
|
|
|
+ foreach ($sources as $source) {
|
|
|
+ $received += (float) (clone $source)
|
|
|
+ ->where('status', ReceivableStatus::PAID->value)
|
|
|
+ ->whereBetween('payment_date', [$start, $end])
|
|
|
+ ->sum('paid_value');
|
|
|
+
|
|
|
+ $missing += (float) (clone $source)
|
|
|
+ ->whereNotIn('status', self::SETTLED)
|
|
|
+ ->whereBetween('due_date', [$start, $end])
|
|
|
+ ->sum('value');
|
|
|
+ }
|
|
|
+
|
|
|
+ return ['received' => $received, 'missing' => $missing];
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* Matrículas (alunos cadastrados) por mês nos últimos 6 meses.
|
|
|
*/
|