Files
orderPRO/src/Modules/Settings/OrderStatusRepository.php
Jacek Pyziak c489891d15 Add Orders and Order Status repositories with pagination and management features
- Implemented OrdersRepository for handling order data with pagination, filtering, and sorting capabilities.
- Added methods for retrieving order status options, quick stats, and detailed order information.
- Created OrderStatusRepository for managing order status groups and statuses, including CRUD operations and sorting.
- Introduced a bootstrap file for test environment setup and autoloading.
2026-03-03 01:32:28 +01:00

298 lines
9.3 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Modules\Settings;
use PDO;
final class OrderStatusRepository
{
public function __construct(private readonly PDO $pdo)
{
}
/**
* @return array<int, array<string, mixed>>
*/
public function listGroups(): array
{
$stmt = $this->pdo->query(
'SELECT id, name, code, color_hex, sort_order, is_active, created_at, updated_at
FROM order_status_groups
ORDER BY sort_order ASC, id ASC'
);
$rows = $stmt !== false ? $stmt->fetchAll() : [];
return is_array($rows) ? array_values(array_filter($rows, static fn (mixed $row): bool => is_array($row))) : [];
}
/**
* @return array<int, array<string, mixed>>
*/
public function listStatuses(): array
{
$stmt = $this->pdo->query(
'SELECT s.id, s.group_id, g.name AS group_name, g.code AS group_code, g.color_hex AS group_color_hex,
s.name, s.code, s.sort_order, s.is_active, s.created_at, s.updated_at
FROM order_statuses s
INNER JOIN order_status_groups g ON g.id = s.group_id
ORDER BY g.sort_order ASC, g.id ASC, s.sort_order ASC, s.id ASC'
);
$rows = $stmt !== false ? $stmt->fetchAll() : [];
return is_array($rows) ? array_values(array_filter($rows, static fn (mixed $row): bool => is_array($row))) : [];
}
public function groupExists(int $groupId): bool
{
$stmt = $this->pdo->prepare('SELECT id FROM order_status_groups WHERE id = :id LIMIT 1');
$stmt->execute(['id' => $groupId]);
return (bool) $stmt->fetchColumn();
}
/**
* @return array<string, mixed>|null
*/
public function findGroupById(int $groupId): ?array
{
$stmt = $this->pdo->prepare(
'SELECT id, name, code, color_hex, sort_order, is_active, created_at, updated_at
FROM order_status_groups
WHERE id = :id
LIMIT 1'
);
$stmt->execute(['id' => $groupId]);
$row = $stmt->fetch();
return is_array($row) ? $row : null;
}
public function existsGroupCode(string $code, int $excludeId = 0): bool
{
$stmt = $this->pdo->prepare(
'SELECT id FROM order_status_groups WHERE code = :code AND id <> :exclude_id LIMIT 1'
);
$stmt->execute([
'code' => $code,
'exclude_id' => $excludeId,
]);
return (bool) $stmt->fetchColumn();
}
public function existsStatusCode(string $code, int $excludeId = 0): bool
{
$stmt = $this->pdo->prepare(
'SELECT id FROM order_statuses WHERE code = :code AND id <> :exclude_id LIMIT 1'
);
$stmt->execute([
'code' => $code,
'exclude_id' => $excludeId,
]);
return (bool) $stmt->fetchColumn();
}
public function statusExists(int $statusId): bool
{
$stmt = $this->pdo->prepare('SELECT id FROM order_statuses WHERE id = :id LIMIT 1');
$stmt->execute(['id' => $statusId]);
return (bool) $stmt->fetchColumn();
}
/**
* @return array<string, mixed>|null
*/
public function findStatusById(int $statusId): ?array
{
$stmt = $this->pdo->prepare(
'SELECT id, group_id, name, code, sort_order, is_active, created_at, updated_at
FROM order_statuses
WHERE id = :id
LIMIT 1'
);
$stmt->execute(['id' => $statusId]);
$row = $stmt->fetch();
return is_array($row) ? $row : null;
}
public function createGroup(string $name, string $code, string $colorHex, int $sortOrder, bool $isActive): void
{
$stmt = $this->pdo->prepare(
'INSERT INTO order_status_groups (name, code, color_hex, sort_order, is_active, created_at, updated_at)
VALUES (:name, :code, :color_hex, :sort_order, :is_active, :created_at, :updated_at)'
);
$now = date('Y-m-d H:i:s');
$stmt->execute([
'name' => $name,
'code' => $code,
'color_hex' => $colorHex,
'sort_order' => $sortOrder,
'is_active' => $isActive ? 1 : 0,
'created_at' => $now,
'updated_at' => $now,
]);
}
public function updateGroup(int $id, string $name, string $code, string $colorHex, bool $isActive): void
{
$stmt = $this->pdo->prepare(
'UPDATE order_status_groups
SET name = :name, code = :code, color_hex = :color_hex, is_active = :is_active, updated_at = :updated_at
WHERE id = :id'
);
$stmt->execute([
'id' => $id,
'name' => $name,
'code' => $code,
'color_hex' => $colorHex,
'is_active' => $isActive ? 1 : 0,
'updated_at' => date('Y-m-d H:i:s'),
]);
}
public function deleteGroup(int $id): void
{
$stmt = $this->pdo->prepare('DELETE FROM order_status_groups WHERE id = :id');
$stmt->execute(['id' => $id]);
}
public function createStatus(int $groupId, string $name, string $code, int $sortOrder, bool $isActive): void
{
$stmt = $this->pdo->prepare(
'INSERT INTO order_statuses (group_id, name, code, sort_order, is_active, created_at, updated_at)
VALUES (:group_id, :name, :code, :sort_order, :is_active, :created_at, :updated_at)'
);
$now = date('Y-m-d H:i:s');
$stmt->execute([
'group_id' => $groupId,
'name' => $name,
'code' => $code,
'sort_order' => $sortOrder,
'is_active' => $isActive ? 1 : 0,
'created_at' => $now,
'updated_at' => $now,
]);
}
public function updateStatus(int $id, int $groupId, string $name, string $code, bool $isActive): void
{
$stmt = $this->pdo->prepare(
'UPDATE order_statuses
SET group_id = :group_id, name = :name, code = :code, is_active = :is_active, updated_at = :updated_at
WHERE id = :id'
);
$stmt->execute([
'id' => $id,
'group_id' => $groupId,
'name' => $name,
'code' => $code,
'is_active' => $isActive ? 1 : 0,
'updated_at' => date('Y-m-d H:i:s'),
]);
}
public function deleteStatus(int $id): void
{
$stmt = $this->pdo->prepare('DELETE FROM order_statuses WHERE id = :id');
$stmt->execute(['id' => $id]);
}
public function nextGroupSortOrder(): int
{
$stmt = $this->pdo->query('SELECT COALESCE(MAX(sort_order), -1) + 1 FROM order_status_groups');
$value = $stmt !== false ? $stmt->fetchColumn() : 0;
return max(0, (int) $value);
}
public function nextStatusSortOrder(int $groupId): int
{
$stmt = $this->pdo->prepare('SELECT COALESCE(MAX(sort_order), -1) + 1 FROM order_statuses WHERE group_id = :group_id');
$stmt->execute(['group_id' => $groupId]);
$value = $stmt->fetchColumn();
return max(0, (int) $value);
}
/**
* @param array<int, int> $orderedIds
*/
public function reorderGroups(array $orderedIds): void
{
if ($orderedIds === []) {
return;
}
$updateStmt = $this->pdo->prepare(
'UPDATE order_status_groups SET sort_order = :sort_order, updated_at = :updated_at WHERE id = :id'
);
$this->pdo->beginTransaction();
try {
$now = date('Y-m-d H:i:s');
foreach (array_values($orderedIds) as $sortOrder => $groupId) {
$id = max(0, (int) $groupId);
if ($id <= 0) {
continue;
}
$updateStmt->execute([
'sort_order' => $sortOrder,
'updated_at' => $now,
'id' => $id,
]);
}
$this->pdo->commit();
} catch (\Throwable $exception) {
if ($this->pdo->inTransaction()) {
$this->pdo->rollBack();
}
throw $exception;
}
}
/**
* @param array<int, int> $orderedIds
*/
public function reorderStatusesByGroup(int $groupId, array $orderedIds): void
{
if ($orderedIds === []) {
return;
}
$updateStmt = $this->pdo->prepare(
'UPDATE order_statuses
SET sort_order = :sort_order, updated_at = :updated_at
WHERE id = :id AND group_id = :group_id'
);
$this->pdo->beginTransaction();
try {
$now = date('Y-m-d H:i:s');
foreach (array_values($orderedIds) as $sortOrder => $statusId) {
$id = max(0, (int) $statusId);
if ($id <= 0) {
continue;
}
$updateStmt->execute([
'sort_order' => $sortOrder,
'updated_at' => $now,
'id' => $id,
'group_id' => $groupId,
]);
}
$this->pdo->commit();
} catch (\Throwable $exception) {
if ($this->pdo->inTransaction()) {
$this->pdo->rollBack();
}
throw $exception;
}
}
}