diff --git a/app/Domains/Purchase/Models/Purchase.php b/app/Domains/Purchase/Models/Purchase.php index e3af89f..9e64608 100644 --- a/app/Domains/Purchase/Models/Purchase.php +++ b/app/Domains/Purchase/Models/Purchase.php @@ -52,6 +52,14 @@ class Purchase extends Model 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 */ public static function statuses(): array { @@ -67,6 +75,68 @@ class Purchase extends Model ]; } + /** + * @return array}> + */ + 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 */ + public static function adminStatusCodes(): array + { + return array_keys(self::adminStatuses()); + } + + /** @return list */ + 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'; /** @var array */ diff --git a/tests/Unit/Purchase/PurchaseAdminStatusTest.php b/tests/Unit/Purchase/PurchaseAdminStatusTest.php new file mode 100644 index 0000000..f1fa7f5 --- /dev/null +++ b/tests/Unit/Purchase/PurchaseAdminStatusTest.php @@ -0,0 +1,69 @@ +assertSame($adminStatus, Purchase::adminStatusFor($realStatus)); + $this->assertSame($adminStatusName, Purchase::adminStatusNameFor($realStatus)); + $this->assertContains( + $realStatus, + Purchase::realStatusesForAdminStatus($adminStatus), + ); + } + + /** @return iterable */ + 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', + ]; + } +}