feat(purchase): centralize admin sale statuses
This commit is contained in:
@@ -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> */
|
||||||
|
|||||||
69
tests/Unit/Purchase/PurchaseAdminStatusTest.php
Normal file
69
tests/Unit/Purchase/PurchaseAdminStatusTest.php
Normal 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',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user