fix(admin): add COMPLETED state in dashboard, orders list and detail with lowercase label

This commit is contained in:
Deploy
2026-08-26 22:38:59 +02:00
parent 1ee3f0d1b2
commit 5f6a22f1c5
7 changed files with 35 additions and 6 deletions

View File

@@ -8120,6 +8120,22 @@
}, },
"phase": "admin", "phase": "admin",
"completed_at": "2026-08-26T18:55:00Z" "completed_at": "2026-08-26T18:55:00Z"
},
{
"id": "ORDER-STATUS-COMPLETED",
"type": "fix",
"title": "Order status COMPLETED in admin dashboard and orders pages",
"description": "POS sales use COMPLETED order state. Show COMPLETED in admin dashboard ordersByState, orders list, and order detail pages with proper Spanish label and color. Include COMPLETED in revenue calculations.",
"priority": "med",
"risk": "low",
"status": "in_progress",
"created_at": "2026-08-26",
"gates": {
"reviewer": false,
"security": false,
"qa": false
},
"phase": "admin"
} }
] ]
} }

View File

@@ -1,7 +1,7 @@
/// <reference types="next" /> /// <reference types="next" />
/// <reference types="next/image-types/global" /> /// <reference types="next/image-types/global" />
import "./.next/dev/types/routes.d.ts"; import "./.next/types/routes.d.ts";
import "./.next/dev/types/root-params.d.ts"; import "./.next/types/root-params.d.ts";
// NOTE: This file should not be edited // NOTE: This file should not be edited
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. // see https://nextjs.org/docs/app/api-reference/config/typescript for more information.

View File

@@ -12,6 +12,7 @@ const STATE_LABELS: Record<OrderState, string> = {
PROCESSING: 'En preparación', PROCESSING: 'En preparación',
SHIPPED: 'Enviado', SHIPPED: 'Enviado',
DELIVERED: 'Entregado', DELIVERED: 'Entregado',
COMPLETED: 'completado',
CANCELLED: 'Cancelado', CANCELLED: 'Cancelado',
REFUNDED: 'Reembolsado', REFUNDED: 'Reembolsado',
PARTIALLY_REFUNDED: 'Reembolso parcial', PARTIALLY_REFUNDED: 'Reembolso parcial',
@@ -24,6 +25,7 @@ const STATE_COLORS: Record<OrderState, string> = {
PROCESSING: 'bg-indigo-100 text-indigo-800', PROCESSING: 'bg-indigo-100 text-indigo-800',
SHIPPED: 'bg-purple-100 text-purple-800', SHIPPED: 'bg-purple-100 text-purple-800',
DELIVERED: 'bg-green-100 text-green-800', DELIVERED: 'bg-green-100 text-green-800',
COMPLETED: 'bg-emerald-100 text-emerald-800',
CANCELLED: 'bg-red-100 text-red-800', CANCELLED: 'bg-red-100 text-red-800',
REFUNDED: 'bg-purple-100 text-purple-800', REFUNDED: 'bg-purple-100 text-purple-800',
PARTIALLY_REFUNDED: 'bg-pink-100 text-pink-800', PARTIALLY_REFUNDED: 'bg-pink-100 text-pink-800',
@@ -32,10 +34,11 @@ const STATE_COLORS: Record<OrderState, string> = {
const ALLOWED_TRANSITIONS: Record<OrderState, OrderState[]> = { const ALLOWED_TRANSITIONS: Record<OrderState, OrderState[]> = {
PENDING: ['AWAITING_PAYMENT', 'CANCELLED'], PENDING: ['AWAITING_PAYMENT', 'CANCELLED'],
AWAITING_PAYMENT: ['PAID', 'CANCELLED'], AWAITING_PAYMENT: ['PAID', 'CANCELLED'],
PAID: ['PROCESSING', 'CANCELLED', 'REFUNDED'], PAID: ['PROCESSING', 'COMPLETED', 'CANCELLED', 'REFUNDED'],
PROCESSING: ['PAID', 'SHIPPED', 'CANCELLED', 'REFUNDED'], PROCESSING: ['PAID', 'SHIPPED', 'COMPLETED', 'CANCELLED', 'REFUNDED'],
SHIPPED: ['PROCESSING', 'DELIVERED', 'PARTIALLY_REFUNDED'], SHIPPED: ['PROCESSING', 'DELIVERED', 'PARTIALLY_REFUNDED'],
DELIVERED: ['SHIPPED', 'PARTIALLY_REFUNDED'], DELIVERED: ['SHIPPED', 'PARTIALLY_REFUNDED'],
COMPLETED: ['REFUNDED', 'PARTIALLY_REFUNDED'],
CANCELLED: [], CANCELLED: [],
REFUNDED: [], REFUNDED: [],
PARTIALLY_REFUNDED: [], PARTIALLY_REFUNDED: [],
@@ -49,10 +52,12 @@ const ACTION_LABELS_BY_TRANSITION: Record<string, string> = {
'AWAITING_PAYMENT>PAID': 'Marcar como Pagado', 'AWAITING_PAYMENT>PAID': 'Marcar como Pagado',
'AWAITING_PAYMENT>CANCELLED': 'Cancelar pedido', 'AWAITING_PAYMENT>CANCELLED': 'Cancelar pedido',
'PAID>PROCESSING': 'Preparar pedido', 'PAID>PROCESSING': 'Preparar pedido',
'PAID>COMPLETED': 'Marcar como completado',
'PAID>CANCELLED': 'Cancelar pedido', 'PAID>CANCELLED': 'Cancelar pedido',
'PAID>REFUNDED': 'Reembolsar', 'PAID>REFUNDED': 'Reembolsar',
'PROCESSING>PAID': 'Revertir a Pagado', 'PROCESSING>PAID': 'Revertir a Pagado',
'PROCESSING>SHIPPED': 'Marcar como Enviado', 'PROCESSING>SHIPPED': 'Marcar como Enviado',
'PROCESSING>COMPLETED': 'Marcar como completado',
'PROCESSING>CANCELLED': 'Cancelar pedido', 'PROCESSING>CANCELLED': 'Cancelar pedido',
'PROCESSING>REFUNDED': 'Reembolsar', 'PROCESSING>REFUNDED': 'Reembolsar',
'SHIPPED>PROCESSING': 'Revertir a En preparación', 'SHIPPED>PROCESSING': 'Revertir a En preparación',
@@ -60,6 +65,8 @@ const ACTION_LABELS_BY_TRANSITION: Record<string, string> = {
'SHIPPED>PARTIALLY_REFUNDED': 'Reembolso parcial', 'SHIPPED>PARTIALLY_REFUNDED': 'Reembolso parcial',
'DELIVERED>SHIPPED': 'Revertir a Enviado', 'DELIVERED>SHIPPED': 'Revertir a Enviado',
'DELIVERED>PARTIALLY_REFUNDED': 'Reembolso parcial', 'DELIVERED>PARTIALLY_REFUNDED': 'Reembolso parcial',
'COMPLETED>REFUNDED': 'Reembolsar',
'COMPLETED>PARTIALLY_REFUNDED': 'Reembolso parcial',
}; };
function actionLabel(from: OrderState, to: OrderState): string { function actionLabel(from: OrderState, to: OrderState): string {

View File

@@ -11,6 +11,7 @@ const ORDER_STATES: OrderState[] = [
'PROCESSING', 'PROCESSING',
'SHIPPED', 'SHIPPED',
'DELIVERED', 'DELIVERED',
'COMPLETED',
'CANCELLED', 'CANCELLED',
'REFUNDED', 'REFUNDED',
'PARTIALLY_REFUNDED', 'PARTIALLY_REFUNDED',
@@ -23,6 +24,7 @@ const STATE_LABELS: Record<OrderState, string> = {
PROCESSING: 'En preparación', PROCESSING: 'En preparación',
SHIPPED: 'Enviado', SHIPPED: 'Enviado',
DELIVERED: 'Entregado', DELIVERED: 'Entregado',
COMPLETED: 'completado',
CANCELLED: 'Cancelado', CANCELLED: 'Cancelado',
REFUNDED: 'Reembolsado', REFUNDED: 'Reembolsado',
PARTIALLY_REFUNDED: 'Reembolso parcial', PARTIALLY_REFUNDED: 'Reembolso parcial',
@@ -35,6 +37,7 @@ const STATE_COLORS: Record<OrderState, string> = {
PROCESSING: 'bg-indigo-100 text-indigo-800', PROCESSING: 'bg-indigo-100 text-indigo-800',
SHIPPED: 'bg-purple-100 text-purple-800', SHIPPED: 'bg-purple-100 text-purple-800',
DELIVERED: 'bg-green-100 text-green-800', DELIVERED: 'bg-green-100 text-green-800',
COMPLETED: 'bg-emerald-100 text-emerald-800',
CANCELLED: 'bg-red-100 text-red-800', CANCELLED: 'bg-red-100 text-red-800',
REFUNDED: 'bg-purple-100 text-purple-800', REFUNDED: 'bg-purple-100 text-purple-800',
PARTIALLY_REFUNDED: 'bg-pink-100 text-pink-800', PARTIALLY_REFUNDED: 'bg-pink-100 text-pink-800',

View File

@@ -25,6 +25,7 @@ const STATE_LABELS: Record<string, string> = {
PROCESSING: 'Procesando', PROCESSING: 'Procesando',
SHIPPED: 'Enviados', SHIPPED: 'Enviados',
DELIVERED: 'Entregados', DELIVERED: 'Entregados',
COMPLETED: 'completados',
CANCELLED: 'Cancelados', CANCELLED: 'Cancelados',
REFUNDED: 'Reembolsados', REFUNDED: 'Reembolsados',
PARTIALLY_REFUNDED: 'Reembolso parcial', PARTIALLY_REFUNDED: 'Reembolso parcial',
@@ -37,6 +38,7 @@ const STATE_COLORS: Record<string, string> = {
PROCESSING: 'bg-blue-100 text-blue-700', PROCESSING: 'bg-blue-100 text-blue-700',
SHIPPED: 'bg-indigo-100 text-indigo-700', SHIPPED: 'bg-indigo-100 text-indigo-700',
DELIVERED: 'bg-emerald-100 text-emerald-700', DELIVERED: 'bg-emerald-100 text-emerald-700',
COMPLETED: 'bg-emerald-100 text-emerald-700',
CANCELLED: 'bg-gray-100 text-gray-600', CANCELLED: 'bg-gray-100 text-gray-600',
REFUNDED: 'bg-red-100 text-red-700', REFUNDED: 'bg-red-100 text-red-700',
PARTIALLY_REFUNDED: 'bg-pink-100 text-pink-700', PARTIALLY_REFUNDED: 'bg-pink-100 text-pink-700',

View File

@@ -100,6 +100,7 @@ export type OrderState =
| 'PROCESSING' | 'PROCESSING'
| 'SHIPPED' | 'SHIPPED'
| 'DELIVERED' | 'DELIVERED'
| 'COMPLETED'
| 'CANCELLED' | 'CANCELLED'
| 'REFUNDED' | 'REFUNDED'
| 'PARTIALLY_REFUNDED'; | 'PARTIALLY_REFUNDED';

View File

@@ -43,12 +43,12 @@ export async function registerAdminStatsRoutes(
) )
.then((r) => parseInt(r.rows[0]?.count ?? '0', 10)), .then((r) => parseInt(r.rows[0]?.count ?? '0', 10)),
// Revenue today (sum of PAID, PROCESSING, SHIPPED, DELIVERED orders) // Revenue today (sum of PAID, PROCESSING, SHIPPED, DELIVERED, COMPLETED orders)
pool pool
.query<{ total: string }>( .query<{ total: string }>(
`SELECT COALESCE(SUM(total_cents), 0)::text AS total FROM orders_orders `SELECT COALESCE(SUM(total_cents), 0)::text AS total FROM orders_orders
WHERE created_at >= CURRENT_DATE WHERE created_at >= CURRENT_DATE
AND state IN ('PAID','PROCESSING','SHIPPED','DELIVERED')`, AND state IN ('PAID','PROCESSING','SHIPPED','DELIVERED','COMPLETED')`,
) )
.then((r) => parseInt(r.rows[0]?.total ?? '0', 10)), .then((r) => parseInt(r.rows[0]?.total ?? '0', 10)),