/
itp_practice
/
itp_backend
Обзор
Документация
Войти
/
itp_practice
/
itp_backend
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
app/Repositories/Admin/DatabasePurchaseRepository.php
144 строки
5 KB
vivanenko
fix purchase status ui
28 май 2025, 16:01
28 май 2025, 16:01
946dc6d
Код
Авторство
О чём код?
<?php namespace App\Repositories\Admin; use App\Contracts\Admin\PurchaseRepositoryInterface; use App\DTOs\Admin\PurchaseData; use App\Models\Order; use Illuminate\Support\Facades\DB; class DatabasePurchaseRepository implements PurchaseRepositoryInterface { public function paginate(int $perPage): array { $result = Order::query() ->with(['user', 'cartItems.itemable', 'cartItems.itemable.parent', 'transactions']) ->orderBy('created_at', 'desc') ->paginate($perPage); return [ 'data' => $result->items() ? array_map(function ($order) { return $this->toDTO($order)->toArray(); }, $result->items()) : [], 'meta' => [ 'current_page' => $result->currentPage(), 'per_page' => $result->perPage(), 'last_page' => $result->lastPage(), 'total' => $result->total() ] ]; } public function find(int $id): ?PurchaseData { $order = Order::query() ->with(['user', 'cartItems.itemable', 'cartItems.itemable.parent', 'transactions']) ->find($id); return $order ? $this->toDTO($order) : null; } public function create(array $data): PurchaseData { $order = DB::transaction(function () use ($data) { return Order::create($data); }); return $this->toDTO($order->fresh(['user', 'cartItems.itemable', 'cartItems.itemable.parent', 'transactions'])); } public function update(int $id, array $data): PurchaseData { $order = DB::transaction(function () use ($id, $data) { $order = Order::findOrFail($id); $order->update($data); return $order; }); return $this->toDTO($order->fresh(['user', 'cartItems.itemable', 'cartItems.itemable.parent', 'transactions'])); } public function delete(int $id): bool { return (bool) Order::query()->where('id', $id)->delete(); } public function findByUserId(int $userId): array { $orders = Order::query() ->with(['user', 'cartItems.itemable', 'cartItems.itemable.parent', 'transactions']) ->where('user_id', $userId) ->orderBy('created_at', 'desc') ->get(); return array_map(fn($order) => $this->toDTO($order)->toArray(), $orders->all()); } public function findByStatus(string $status): array { $orders = Order::query() ->with(['user', 'cartItems.itemable', 'cartItems.itemable.parent', 'transactions']) ->where('status_code', $status) ->orderBy('created_at', 'desc') ->get(); return array_map(fn($order) => $this->toDTO($order)->toArray(), $orders->all()); } public function findByTariffLevel(string $tariffLevel): array { $orders = Order::query() ->with(['user', 'cartItems.itemable', 'cartItems.itemable.parent', 'transactions']) ->whereHas('cartItems.itemable', function ($query) use ($tariffLevel) { $query->where('level', $tariffLevel); }) ->orderBy('created_at', 'desc') ->get(); return array_map(fn($order) => $this->toDTO($order)->toArray(), $orders->all()); } public function updateStatus(int $id, string $status): bool { return (bool) Order::query() ->where('id', $id) ->update(['status_code' => $status]); } public function updatePaymentDetails(int $id, array $paymentDetails): bool { return (bool) Order::query() ->where('id', $id) ->update(['payment_details' => $paymentDetails]); } private function toDTO(Order $order): PurchaseData { $cartItem = $order->cartItems->first(); $tariff = $cartItem?->itemable; $transaction = $order->transactions->first(); $tariffLevel = 'unknown'; if ($tariff) { $parentName = $tariff->parent ? $tariff->parent->name : ''; $tariffName = $tariff->name; $tariffLevel = trim($parentName . ' ' . $tariffName); } return new PurchaseData( id: $order->id, user_id: $order->user_id, tariff_level: $tariffLevel, amount: (float) $order->total_amount, currency: $order->currency ?? 'RUB', status: $order->status_code ?? 'unknown', payment_method: $order->payment_gateway, transaction_id: $transaction?->transaction_id, payment_details: $order->payment_details ?? [], created_at: $order->created_at->format('Y-m-d H:i:s'), updated_at: $order->updated_at->format('Y-m-d H:i:s') ); } }