121 lines
4.2 KiB
PHP
121 lines
4.2 KiB
PHP
<?php
|
|
|
|
namespace App\Domains\Sale\Services;
|
|
|
|
use App\Domains\Logging\Models\ValueChange;
|
|
use App\Domains\Purchase\Models\Purchase;
|
|
use App\Domains\Tenant\Models\Tenant;
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
use Illuminate\Pagination\LengthAwarePaginator;
|
|
use Illuminate\Support\Collection;
|
|
|
|
class AdminAppSaleService
|
|
{
|
|
public function confirmedSalesTotal(Tenant $tenant): string
|
|
{
|
|
$total = Purchase::query()
|
|
->where('tenant_codigo', $tenant->codigo)
|
|
->where('status', Purchase::STATUS_PAID)
|
|
->sum('total');
|
|
|
|
return number_format((float) $total, 2, '.', '');
|
|
}
|
|
|
|
/**
|
|
* @param array{
|
|
* q?: string|null,
|
|
* id?: int|null,
|
|
* sale_date?: string|null,
|
|
* status?: string|null,
|
|
* sort_by?: string,
|
|
* sort_direction?: string
|
|
* } $filters
|
|
* @return LengthAwarePaginator<Purchase>
|
|
*/
|
|
public function sales(Tenant $tenant, array $filters = []): LengthAwarePaginator
|
|
{
|
|
return $this->salesQuery($tenant, $filters)
|
|
->paginateFromRequest()
|
|
->withQueryString();
|
|
}
|
|
|
|
/**
|
|
* @param array<string, mixed> $filters
|
|
* @return Collection<int, Purchase>
|
|
*/
|
|
public function salesForExport(Tenant $tenant, array $filters = []): Collection
|
|
{
|
|
return $this->salesQuery($tenant, $filters)->get();
|
|
}
|
|
|
|
/** @return LengthAwarePaginator<ValueChange> */
|
|
public function modifications(Tenant $tenant): LengthAwarePaginator
|
|
{
|
|
return $this->modificationsQuery($tenant)
|
|
->paginateFromRequest()
|
|
->withQueryString();
|
|
}
|
|
|
|
/** @return Collection<int, ValueChange> */
|
|
public function modificationsForExport(Tenant $tenant): Collection
|
|
{
|
|
return $this->modificationsQuery($tenant)->get();
|
|
}
|
|
|
|
/** @param array<string, mixed> $filters */
|
|
protected function salesQuery(Tenant $tenant, array $filters): Builder
|
|
{
|
|
$sortColumns = [
|
|
'id' => 'id',
|
|
'date' => 'created_at',
|
|
'customer_name' => 'nombre_apellido',
|
|
'quantity' => 'quantity',
|
|
'status' => 'status',
|
|
'total' => 'total',
|
|
];
|
|
$requestedSort = $filters['sort_by'] ?? 'date';
|
|
$sortBy = array_key_exists($requestedSort, $sortColumns) ? $requestedSort : 'date';
|
|
$requestedDirection = $filters['sort_direction'] ?? 'desc';
|
|
$sortDirection = in_array($requestedDirection, ['asc', 'desc'], true)
|
|
? $requestedDirection
|
|
: 'desc';
|
|
|
|
return Purchase::query()
|
|
->where('tenant_codigo', $tenant->codigo)
|
|
->when($filters['q'] ?? null, function (Builder $query, string $search): void {
|
|
$term = trim($search);
|
|
|
|
$query->where(function (Builder $query) use ($term): void {
|
|
$query
|
|
->where('id', 'like', "%{$term}%")
|
|
->orWhere('nombre_apellido', 'like', "%{$term}%")
|
|
->orWhere('created_at', 'like', "%{$term}%");
|
|
});
|
|
})
|
|
->when($filters['id'] ?? null, fn (Builder $query, int $id): Builder => $query->whereKey($id))
|
|
->when(
|
|
$filters['sale_date'] ?? null,
|
|
fn (Builder $query, string $date): Builder => $query->whereDate('created_at', $date)
|
|
)
|
|
->when(
|
|
$filters['status'] ?? null,
|
|
fn (Builder $query, string $status): Builder => $query->where('status', $status)
|
|
)
|
|
->withSum('items as quantity', 'cantidad')
|
|
->withCount('tickets')
|
|
->orderBy($sortColumns[$sortBy], $sortDirection)
|
|
->when($sortBy !== 'id', fn (Builder $query): Builder => $query->orderByDesc('id'));
|
|
}
|
|
|
|
/** @return Builder<ValueChange> */
|
|
protected function modificationsQuery(Tenant $tenant): Builder
|
|
{
|
|
return ValueChange::query()
|
|
->where('tenant_code', $tenant->codigo)
|
|
->where('trackable_type', (new Purchase)->getMorphClass())
|
|
->with(['trackable', 'user'])
|
|
->orderByDesc('changed_at')
|
|
->orderByDesc('id');
|
|
}
|
|
}
|