feat(purchase): centralize admin sale statuses

This commit is contained in:
2026-09-02 12:41:49 -03:00
parent ee906d2d2e
commit 34217be630
2 changed files with 139 additions and 0 deletions

View File

@@ -52,6 +52,14 @@ class Purchase extends Model
public const STATUS_SUPERSEDED = 'superseded'; public const STATUS_SUPERSEDED = 'superseded';
public const ADMIN_STATUS_INCOMPLETE = 'incomplete';
public const ADMIN_STATUS_AWAITING_PAYMENT = 'awaiting_payment';
public const ADMIN_STATUS_CONFIRMED = 'confirmed';
public const ADMIN_STATUS_CANCELLED = 'cancelled';
/** @return list<string> */ /** @return list<string> */
public static function statuses(): array public static function statuses(): array
{ {
@@ -67,6 +75,68 @@ class Purchase extends Model
]; ];
} }
/**
* @return array<string, array{name: string, statuses: list<string>}>
*/
public static function adminStatuses(): array
{
return [
self::ADMIN_STATUS_INCOMPLETE => [
'name' => 'Por completar datos',
'statuses' => [self::STATUS_CREATED],
],
self::ADMIN_STATUS_AWAITING_PAYMENT => [
'name' => 'Esperando pago',
'statuses' => [self::STATUS_PENDING_PAYMENT, self::STATUS_IN_REVIEW],
],
self::ADMIN_STATUS_CONFIRMED => [
'name' => 'Confirmado',
'statuses' => [self::STATUS_PAID],
],
self::ADMIN_STATUS_CANCELLED => [
'name' => 'Anulado',
'statuses' => [
self::STATUS_CANCELLED,
self::STATUS_REJECTED,
self::STATUS_EXPIRED,
self::STATUS_SUPERSEDED,
],
],
];
}
/** @return list<string> */
public static function adminStatusCodes(): array
{
return array_keys(self::adminStatuses());
}
/** @return list<string> */
public static function realStatusesForAdminStatus(string $adminStatus): array
{
return self::adminStatuses()[$adminStatus]['statuses'] ?? [];
}
public static function adminStatusFor(string $realStatus): ?string
{
foreach (self::adminStatuses() as $adminStatus => $definition) {
if (in_array($realStatus, $definition['statuses'], true)) {
return $adminStatus;
}
}
return null;
}
public static function adminStatusNameFor(string $realStatus): ?string
{
$adminStatus = self::adminStatusFor($realStatus);
return $adminStatus === null
? null
: self::adminStatuses()[$adminStatus]['name'];
}
protected $table = 'compras'; protected $table = 'compras';
/** @var array<int, string> */ /** @var array<int, string> */

View File

@@ -0,0 +1,69 @@
<?php
namespace Tests\Unit\Purchase;
use App\Domains\Purchase\Models\Purchase;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\TestCase;
class PurchaseAdminStatusTest extends TestCase
{
#[DataProvider('statusMappings')]
public function test_it_maps_real_statuses_to_admin_statuses(
string $realStatus,
string $adminStatus,
string $adminStatusName,
): void {
$this->assertSame($adminStatus, Purchase::adminStatusFor($realStatus));
$this->assertSame($adminStatusName, Purchase::adminStatusNameFor($realStatus));
$this->assertContains(
$realStatus,
Purchase::realStatusesForAdminStatus($adminStatus),
);
}
/** @return iterable<string, array{string, string, string}> */
public static function statusMappings(): iterable
{
yield 'created' => [
Purchase::STATUS_CREATED,
Purchase::ADMIN_STATUS_INCOMPLETE,
'Por completar datos',
];
yield 'pending payment' => [
Purchase::STATUS_PENDING_PAYMENT,
Purchase::ADMIN_STATUS_AWAITING_PAYMENT,
'Esperando pago',
];
yield 'in review' => [
Purchase::STATUS_IN_REVIEW,
Purchase::ADMIN_STATUS_AWAITING_PAYMENT,
'Esperando pago',
];
yield 'paid' => [
Purchase::STATUS_PAID,
Purchase::ADMIN_STATUS_CONFIRMED,
'Confirmado',
];
yield 'cancelled' => [
Purchase::STATUS_CANCELLED,
Purchase::ADMIN_STATUS_CANCELLED,
'Anulado',
];
yield 'rejected' => [
Purchase::STATUS_REJECTED,
Purchase::ADMIN_STATUS_CANCELLED,
'Anulado',
];
yield 'expired' => [
Purchase::STATUS_EXPIRED,
Purchase::ADMIN_STATUS_CANCELLED,
'Anulado',
];
yield 'superseded' => [
Purchase::STATUS_SUPERSEDED,
Purchase::ADMIN_STATUS_CANCELLED,
'Anulado',
];
}
}