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 */ public function sales(Tenant $tenant, array $filters = []): LengthAwarePaginator { return $this->salesQuery($tenant, $filters) ->paginateFromRequest() ->withQueryString(); } /** * @param array $filters * @return Collection */ public function salesForExport(Tenant $tenant, array $filters = []): Collection { return $this->salesQuery($tenant, $filters)->get(); } /** @return LengthAwarePaginator */ public function modifications(Tenant $tenant): LengthAwarePaginator { return $this->modificationsQuery($tenant) ->paginateFromRequest() ->withQueryString(); } /** @return Collection */ public function modificationsForExport(Tenant $tenant): Collection { return $this->modificationsQuery($tenant)->get(); } /** @param array $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 */ 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'); } }