fix(admin): add COMPLETED state in dashboard, orders list and detail with lowercase label
This commit is contained in:
@@ -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"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
4
project/apps/admin/next-env.d.ts
vendored
4
project/apps/admin/next-env.d.ts
vendored
@@ -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.
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
@@ -100,6 +100,7 @@ export type OrderState =
|
|||||||
| 'PROCESSING'
|
| 'PROCESSING'
|
||||||
| 'SHIPPED'
|
| 'SHIPPED'
|
||||||
| 'DELIVERED'
|
| 'DELIVERED'
|
||||||
|
| 'COMPLETED'
|
||||||
| 'CANCELLED'
|
| 'CANCELLED'
|
||||||
| 'REFUNDED'
|
| 'REFUNDED'
|
||||||
| 'PARTIALLY_REFUNDED';
|
| 'PARTIALLY_REFUNDED';
|
||||||
|
|||||||
@@ -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)),
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user