<?php namespace App\Repositories\CashFlowIndex; use App\Domain\Payment\Enums\PaymentStatusEnum; use App\Domain\Payment\Enums\PaymentTypeEnum; use App\Models\Payment; use App\Models\PaymentDistribution; use App\Repositories\CashFlowIndex\Interfaces\TotalAmountRepositoryInterface; use Carbon\Carbon; use Illuminate\Support\Facades\Log; class TotalAmountRepository implements TotalAmountRepositoryInterface { public function getTotalAmountPayment(int $modelID, $filters, $type): float { $query = Payment::query(); $query->where('model_id', $modelID); if ($type) { $query->where('payment_type', PaymentTypeEnum::PAYMENT_TYPE_RECEPTION_FROM_1C->value); } else { $query->whereIn('payment_type', [ PaymentTypeEnum::PAYMENT_TYPE_PAYMENT->value, PaymentTypeEnum::PAYMENT_TYPE_ISSUEANCE->value ]); } $filters = array_filter($filters, function ($value) { return $value !== null; }); if (!empty($filters)) { if (isset($filters['date_from']) && $filters['date_from'] != null) { $query->whereBetween('payment_date', [$filters['date_from'], $filters['date_to']]); } if (isset($filters['projects'])) { $query->whereHas('distributions', function ($query) use ($filters) { $query->whereIn('project_id', $filters['projects']); }); } if (isset($filters['accounts'])) { $query->whereIn('account_id', $filters['accounts']); } if (!empty($filters['payments_made'])) { $query->whereIn('status', $filters['payments_made']); } if (!empty($filters['cash'])) { $query->whereIn('payment_type', $filters['cash']); } } $query->whereHas('distributions', function ($subQuery) { $subQuery->whereNull('article_id'); }); return $query->sum('amount'); } public function getTotalAmountCashPayment(int $modelID, $filters, $type, $debitType): float { $query = Payment::query(); $totalAmount = 0; $query->where('model_id', $modelID); if ($type) { $query->whereHas('distributions.payment', function ($query) { $query->where('payment_type', PaymentTypeEnum::PAYMENT_TYPE_RECEPTION->value); })->with(['distributions' => function ($query) use ($filters) { $query->whereHas('payment', function ($query) { $query->where('payment_type', PaymentTypeEnum::PAYMENT_TYPE_RECEPTION->value); })->with(['payment' => function ($query) { $query->where('payment_type', PaymentTypeEnum::PAYMENT_TYPE_RECEPTION->value); }]); }]); } else { if ($debitType == 'cash') { $query->whereHas('distributions.payment', function ($query) { $query->where('payment_type', PaymentTypeEnum::PAYMENT_TYPE_MOVING->value); })->with(['distributions' => function ($query) use ($filters) { $query->whereHas('payment', function ($query) { $query->where('payment_type', PaymentTypeEnum::PAYMENT_TYPE_MOVING->value); })->with(['payment' => function ($query) { $query->where('payment_type', PaymentTypeEnum::PAYMENT_TYPE_MOVING->value); }]); }]); } if ($debitType == 'moving') { $query->whereHas('distributions.payment', function ($query) { $query->where('payment_type', PaymentTypeEnum::PAYMENT_TYPE_MOVING->value); })->with(['distributions' => function ($query) use ($filters) { $query->whereHas('payment', function ($query) { $query->where('payment_type', PaymentTypeEnum::PAYMENT_TYPE_MOVING->value); }); }]); } } $filters = array_filter($filters, function ($value) { return $value !== null; }); if (!empty($filters)) { if (isset($filters['date_from']) && $filters['date_from'] != null) { $query->whereBetween('payment_date', [$filters['date_from'], $filters['date_to']]); } if (!empty($filters['projects'])) { $query->whereHas('distributions', function ($query) use ($filters) { $query->whereIn('project_id', $filters['projects']); })->with(['distributions' => function ($query) use ($filters) { $query->whereIn('project_id', $filters['projects']); }]); } if (!empty($filters['accounts'])) { $query->whereIn('account_id', $filters['accounts']); } if (!empty($filters['payments_made'])) { $query->whereIn('status', $filters['payments_made']); } if (!empty($filters['cash'])) { $query->whereIn('payment_type', $filters['cash']); } } $query->has('distributions'); $data = $query->get(); if ($debitType == 'moving') { return $data->sum(fn($item) => abs($item->distributions->first()->cashbox)); } if ($debitType == 'cash') { return $data->sum(fn($item) => abs($item->distributions->first()->amount)); } if ($debitType == 'commission') { return $data->sum(fn($item) => abs($item->distributions->first()->commission)); } $amount = $data->sum(fn($item) => $item->amount); return $amount; } public function getTotalCommissionPaymentDistribution(int $modelID, $filters, $debitType): float { $query = PaymentDistribution::query(); $query->whereHas('payment', function ($query) use ($modelID) { $query->where('model_id', $modelID); }); if (isset($filters['date_from'])) { $dateFrom = $filters['date_from']; $dateTo = isset($filters['date_to']) ? $filters['date_to'] : Carbon::now(); $query->whereHas('payment', function ($query) use ($dateFrom, $dateTo) { $query->whereBetween('payment_date', [$dateFrom, $dateTo]); }); } if (!empty($filters['projects'])) { $query->whereIn('project_id', $filters['projects']); } if (!empty($filters['accounts'])) { $query->whereHas('payment', function ($query) use ($filters) { $query->whereIn('account_id', $filters['accounts']); }); } if (!empty($filters['payments_made'])) { $query->whereHas('payment', function ($query) use ($filters) { $query->whereIn('status', $filters['payments_made']); }); } if (!empty($filters['cash'])) { $query->whereHas('payment', function ($query) use ($filters) { $query->whereIn('payment_type', $filters['cash']); }); } return $query->sum('comission'); } }