@open-mercato/core 0.4.7-develop-7c7b3f9d84 → 0.4.7-develop-d6331ed114

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/modules/sales/api/payments/route.ts"],
4
- "sourcesContent": ["import { z } from 'zod'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { DictionaryEntry } from '@open-mercato/core/modules/dictionaries/data/entities'\nimport { makeCrudRoute } from '@open-mercato/shared/lib/crud/factory'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { splitCustomFieldPayload } from '@open-mercato/shared/lib/crud/custom-fields'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { SalesPayment, SalesPaymentMethod } from '../../data/entities'\nimport { paymentCreateSchema, paymentUpdateSchema } from '../../data/validators'\nimport { withScopedPayload } from '../utils'\nimport {\n createPagedListResponseSchema,\n createSalesCrudOpenApi,\n} from '../openapi'\nimport { E } from '#generated/entities.ids.generated'\nimport * as F from '#generated/entities/sales_payment'\n\nconst rawBodySchema = z.object({}).passthrough()\n\nconst listSchema = z\n .object({\n page: z.coerce.number().min(1).default(1),\n pageSize: z.coerce.number().min(1).max(100).default(50),\n orderId: z.string().uuid().optional(),\n paymentMethodId: z.string().uuid().optional(),\n sortField: z.string().optional(),\n sortDir: z.enum(['asc', 'desc']).optional(),\n })\n .passthrough()\n\nconst routeMetadata = {\n GET: { requireAuth: true, requireFeatures: ['sales.orders.view'] },\n POST: { requireAuth: true, requireFeatures: ['sales.payments.manage'] },\n PUT: { requireAuth: true, requireFeatures: ['sales.payments.manage'] },\n DELETE: { requireAuth: true, requireFeatures: ['sales.payments.manage'] },\n}\n\nconst deleteSchema = paymentUpdateSchema.pick({\n id: true,\n organizationId: true,\n tenantId: true,\n orderId: true,\n})\n\nconst crud = makeCrudRoute({\n metadata: routeMetadata,\n orm: {\n entity: SalesPayment,\n idField: 'id',\n orgField: 'organizationId',\n tenantField: 'tenantId',\n softDeleteField: 'deletedAt',\n },\n indexer: {\n entityType: E.sales.sales_payment,\n },\n list: {\n schema: listSchema,\n entityId: E.sales.sales_payment,\n fields: [\n F.id,\n 'order_id',\n 'payment_method_id',\n F.payment_reference,\n F.status_entry_id,\n F.status,\n F.amount,\n F.currency_code,\n F.captured_amount,\n F.refunded_amount,\n F.received_at,\n F.captured_at,\n F.metadata,\n F.custom_field_set_id,\n F.created_at,\n F.updated_at,\n ],\n decorateCustomFields: { entityIds: [E.sales.sales_payment] },\n sortFieldMap: {\n createdAt: F.created_at,\n updatedAt: F.updated_at,\n receivedAt: F.received_at,\n amount: F.amount,\n },\n buildFilters: async (query: any) => {\n const filters: Record<string, any> = {}\n if (query.orderId) filters.order_id = { $eq: query.orderId }\n if (query.paymentMethodId) filters.payment_method_id = { $eq: query.paymentMethodId }\n return filters\n },\n },\n actions: {\n create: {\n commandId: 'sales.payments.create',\n schema: rawBodySchema,\n mapInput: async ({ raw, ctx }) => {\n const { translate } = await resolveTranslations()\n const scoped = withScopedPayload(raw ?? {}, ctx, translate)\n const { base, custom } = splitCustomFieldPayload(scoped)\n return paymentCreateSchema.parse({\n ...base,\n ...(Object.keys(custom).length ? { customFields: custom } : {}),\n })\n },\n response: ({ result }) => ({\n id: result?.paymentId ?? null,\n orderTotals: result?.orderTotals ?? null,\n }),\n status: 201,\n },\n update: {\n commandId: 'sales.payments.update',\n schema: rawBodySchema,\n mapInput: async ({ raw, ctx }) => {\n const { translate } = await resolveTranslations()\n const scoped = withScopedPayload(raw ?? {}, ctx, translate)\n const { base, custom } = splitCustomFieldPayload(scoped)\n return paymentUpdateSchema.parse({\n ...base,\n ...(Object.keys(custom).length ? { customFields: custom } : {}),\n })\n },\n response: ({ result }) => ({\n id: result?.paymentId ?? null,\n orderTotals: result?.orderTotals ?? null,\n }),\n },\n delete: {\n commandId: 'sales.payments.delete',\n schema: rawBodySchema,\n mapInput: async ({ raw, ctx }) => {\n const { translate } = await resolveTranslations()\n const body = raw && typeof raw === 'object' && raw.body && typeof (raw as Record<string, unknown>).body === 'object'\n ? ((raw as { body: Record<string, unknown> }).body ?? {})\n : {}\n const query = raw && typeof raw === 'object' && raw.query && typeof (raw as Record<string, unknown>).query === 'object'\n ? ((raw as { query: Record<string, unknown> }).query ?? {})\n : {}\n const merged = raw && typeof raw === 'object' ? { ...body, ...query } : raw ?? {}\n const payload = deleteSchema.parse(withScopedPayload(merged, ctx, translate))\n if (!payload.id) {\n throw new CrudHttpError(400, {\n error: translate('sales.payments.not_found', 'Payment not found.'),\n })\n }\n return payload\n },\n response: ({ result }) => ({\n id: result?.paymentId ?? null,\n orderTotals: result?.orderTotals ?? null,\n }),\n },\n },\n hooks: {\n afterList: async (payload, ctx) => {\n const items = Array.isArray(payload.items) ? payload.items : []\n if (!items.length) return\n const em = ctx.container.resolve('em') as EntityManager\n const methodIds: string[] = Array.from(\n new Set(\n items\n .map((item: unknown) =>\n item && typeof item === 'object' && typeof (item as any).payment_method_id === 'string'\n ? ((item as any).payment_method_id as string)\n : null\n )\n .filter((value: string | null): value is string => typeof value === 'string' && value.length > 0)\n )\n )\n const statusIds: string[] = Array.from(\n new Set(\n items\n .map((item: unknown) =>\n item && typeof item === 'object' && typeof (item as any).status_entry_id === 'string'\n ? ((item as any).status_entry_id as string)\n : null\n )\n .filter((value: string | null): value is string => typeof value === 'string' && value.length > 0)\n )\n )\n const [methods, statusEntries] = await Promise.all([\n methodIds.length ? em.find(SalesPaymentMethod, { id: { $in: methodIds } }) : [],\n statusIds.length ? em.find(DictionaryEntry, { id: { $in: statusIds } }) : [],\n ])\n const methodMap = new Map(methods.map((method) => [method.id, method]))\n const statusMap = new Map(\n statusEntries.map((entry) => [\n entry.id,\n {\n value: entry.value ?? null,\n label: entry.label ?? entry.value ?? null,\n },\n ])\n )\n items.forEach((item: unknown) => {\n if (!item || typeof item !== 'object') return\n const id = (item as Record<string, unknown>).payment_method_id\n const method = typeof id === 'string' ? methodMap.get(id) : null\n if (method) {\n ;(item as Record<string, unknown>).payment_method_name = method.name ?? method.code ?? method.id\n ;(item as Record<string, unknown>).payment_method_code = method.code ?? null\n }\n const statusId = (item as Record<string, unknown>).status_entry_id\n const status = typeof statusId === 'string' ? statusMap.get(statusId) : null\n if (status) {\n if (!(item as Record<string, unknown>).status) {\n ;(item as Record<string, unknown>).status = status.value\n }\n ;(item as Record<string, unknown>).status_label = status.label ?? status.value ?? null\n }\n })\n },\n },\n})\n\nconst { GET, POST, PUT, DELETE } = crud\n\nexport { GET, POST, PUT, DELETE }\n\nconst paymentSchema = z.object({\n id: z.string().uuid(),\n order_id: z.string().uuid().nullable().optional(),\n payment_method_id: z.string().uuid().nullable().optional(),\n payment_method_name: z.string().nullable().optional(),\n payment_method_code: z.string().nullable().optional(),\n payment_reference: z.string().nullable().optional(),\n status_entry_id: z.string().uuid().nullable().optional(),\n status: z.string().nullable().optional(),\n status_label: z.string().nullable().optional(),\n amount: z.number(),\n currency_code: z.string(),\n captured_amount: z.number().nullable().optional(),\n refunded_amount: z.number().nullable().optional(),\n received_at: z.string().nullable().optional(),\n captured_at: z.string().nullable().optional(),\n custom_field_set_id: z.string().uuid().nullable().optional(),\n customFieldSetId: z.string().uuid().nullable().optional(),\n custom_values: z.record(z.string(), z.unknown()).nullable().optional(),\n customValues: z.record(z.string(), z.unknown()).nullable().optional(),\n custom_fields: z.array(z.record(z.string(), z.unknown())).nullable().optional(),\n customFields: z.array(z.record(z.string(), z.unknown())).nullable().optional(),\n metadata: z.record(z.string(), z.unknown()).nullable().optional(),\n created_at: z.string(),\n updated_at: z.string().nullable().optional(),\n})\n\nconst orderTotalsSchema = z.object({\n paidTotalAmount: z.number().nullable().optional(),\n refundedTotalAmount: z.number().nullable().optional(),\n outstandingAmount: z.number().nullable().optional(),\n})\n\nconst paymentActionResponseSchema = z.object({\n id: z.string().uuid().nullable(),\n orderTotals: orderTotalsSchema.nullable().optional(),\n})\n\nexport const openApi = createSalesCrudOpenApi({\n resourceName: 'Payment',\n querySchema: listSchema,\n listResponseSchema: createPagedListResponseSchema(paymentSchema),\n create: {\n schema: paymentCreateSchema,\n responseSchema: paymentActionResponseSchema,\n description: 'Creates a payment for a sales order.',\n },\n update: {\n schema: paymentUpdateSchema,\n responseSchema: paymentActionResponseSchema,\n description: 'Updates a payment.',\n },\n del: {\n schema: deleteSchema.pick({ id: true }),\n responseSchema: paymentActionResponseSchema,\n description: 'Deletes a payment.',\n },\n})\n\nexport const metadata = routeMetadata\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { z } from 'zod'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { DictionaryEntry } from '@open-mercato/core/modules/dictionaries/data/entities'\nimport { makeCrudRoute } from '@open-mercato/shared/lib/crud/factory'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { splitCustomFieldPayload } from '@open-mercato/shared/lib/crud/custom-fields'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { SalesPayment, SalesPaymentMethod } from '../../data/entities'\nimport { paymentCreateSchema, paymentUpdateSchema } from '../../data/validators'\nimport { withScopedPayload } from '../utils'\nimport {\n createPagedListResponseSchema,\n createSalesCrudOpenApi,\n} from '../openapi'\nimport { E } from '#generated/entities.ids.generated'\nimport * as F from '#generated/entities/sales_payment'\n\nconst rawBodySchema = z.object({}).passthrough()\n\nconst listSchema = z\n .object({\n page: z.coerce.number().min(1).default(1),\n pageSize: z.coerce.number().min(1).max(100).default(50),\n orderId: z.string().uuid().optional(),\n paymentMethodId: z.string().uuid().optional(),\n sortField: z.string().optional(),\n sortDir: z.enum(['asc', 'desc']).optional(),\n })\n .passthrough()\n\nconst routeMetadata = {\n GET: { requireAuth: true, requireFeatures: ['sales.orders.view'] },\n POST: { requireAuth: true, requireFeatures: ['sales.payments.manage'] },\n PUT: { requireAuth: true, requireFeatures: ['sales.payments.manage'] },\n DELETE: { requireAuth: true, requireFeatures: ['sales.payments.manage'] },\n}\n\nconst deleteSchema = paymentUpdateSchema.pick({\n id: true,\n organizationId: true,\n tenantId: true,\n orderId: true,\n})\n\nconst crud = makeCrudRoute({\n metadata: routeMetadata,\n orm: {\n entity: SalesPayment,\n idField: 'id',\n orgField: 'organizationId',\n tenantField: 'tenantId',\n softDeleteField: 'deletedAt',\n },\n indexer: {\n entityType: E.sales.sales_payment,\n },\n list: {\n schema: listSchema,\n entityId: E.sales.sales_payment,\n fields: [\n F.id,\n 'order_id',\n 'payment_method_id',\n F.payment_reference,\n F.status_entry_id,\n F.status,\n F.amount,\n F.currency_code,\n F.captured_amount,\n F.refunded_amount,\n F.received_at,\n F.captured_at,\n F.metadata,\n F.custom_field_set_id,\n F.created_at,\n F.updated_at,\n ],\n decorateCustomFields: { entityIds: [E.sales.sales_payment] },\n sortFieldMap: {\n createdAt: F.created_at,\n updatedAt: F.updated_at,\n receivedAt: F.received_at,\n amount: F.amount,\n },\n buildFilters: async (query: z.infer<typeof listSchema>) => {\n const filters: Record<string, { $eq: string }> = {}\n if (query.orderId) filters.order_id = { $eq: query.orderId }\n if (query.paymentMethodId) filters.payment_method_id = { $eq: query.paymentMethodId }\n return filters\n },\n },\n actions: {\n create: {\n commandId: 'sales.payments.create',\n schema: rawBodySchema,\n mapInput: async ({ raw, ctx }) => {\n const { translate } = await resolveTranslations()\n const scoped = withScopedPayload(raw ?? {}, ctx, translate)\n const { base, custom } = splitCustomFieldPayload(scoped)\n return paymentCreateSchema.parse({\n ...base,\n ...(Object.keys(custom).length ? { customFields: custom } : {}),\n })\n },\n response: ({ result }) => ({\n id: result?.paymentId ?? null,\n orderTotals: result?.orderTotals ?? null,\n }),\n status: 201,\n },\n update: {\n commandId: 'sales.payments.update',\n schema: rawBodySchema,\n mapInput: async ({ raw, ctx }) => {\n const { translate } = await resolveTranslations()\n const scoped = withScopedPayload(raw ?? {}, ctx, translate)\n const { base, custom } = splitCustomFieldPayload(scoped)\n return paymentUpdateSchema.parse({\n ...base,\n ...(Object.keys(custom).length ? { customFields: custom } : {}),\n })\n },\n response: ({ result }) => ({\n id: result?.paymentId ?? null,\n orderTotals: result?.orderTotals ?? null,\n }),\n },\n delete: {\n commandId: 'sales.payments.delete',\n schema: rawBodySchema,\n mapInput: async ({ raw, ctx }) => {\n const { translate } = await resolveTranslations()\n const body = raw && typeof raw === 'object' && raw.body && typeof (raw as Record<string, unknown>).body === 'object'\n ? ((raw as { body: Record<string, unknown> }).body ?? {})\n : {}\n const query = raw && typeof raw === 'object' && raw.query && typeof (raw as Record<string, unknown>).query === 'object'\n ? ((raw as { query: Record<string, unknown> }).query ?? {})\n : {}\n const merged = raw && typeof raw === 'object' ? { ...body, ...query } : raw ?? {}\n const payload = deleteSchema.parse(withScopedPayload(merged, ctx, translate))\n if (!payload.id) {\n throw new CrudHttpError(400, {\n error: translate('sales.payments.not_found', 'Payment not found.'),\n })\n }\n return payload\n },\n response: ({ result }) => ({\n id: result?.paymentId ?? null,\n orderTotals: result?.orderTotals ?? null,\n }),\n },\n },\n hooks: {\n afterList: async (payload, ctx) => {\n const items = Array.isArray(payload.items) ? payload.items : []\n if (!items.length) return\n const em = ctx.container.resolve('em') as EntityManager\n const methodIds: string[] = Array.from(\n new Set(\n items\n .map((item: unknown) =>\n item && typeof item === 'object' && typeof (item as any).payment_method_id === 'string'\n ? ((item as any).payment_method_id as string)\n : null\n )\n .filter((value: string | null): value is string => typeof value === 'string' && value.length > 0)\n )\n )\n const statusIds: string[] = Array.from(\n new Set(\n items\n .map((item: unknown) =>\n item && typeof item === 'object' && typeof (item as any).status_entry_id === 'string'\n ? ((item as any).status_entry_id as string)\n : null\n )\n .filter((value: string | null): value is string => typeof value === 'string' && value.length > 0)\n )\n )\n const [methods, statusEntries] = await Promise.all([\n methodIds.length ? em.find(SalesPaymentMethod, { id: { $in: methodIds } }) : [],\n statusIds.length ? em.find(DictionaryEntry, { id: { $in: statusIds } }) : [],\n ])\n const methodMap = new Map(methods.map((method) => [method.id, method]))\n const statusMap = new Map(\n statusEntries.map((entry) => [\n entry.id,\n {\n value: entry.value ?? null,\n label: entry.label ?? entry.value ?? null,\n },\n ])\n )\n items.forEach((item: unknown) => {\n if (!item || typeof item !== 'object') return\n const id = (item as Record<string, unknown>).payment_method_id\n const method = typeof id === 'string' ? methodMap.get(id) : null\n if (method) {\n ;(item as Record<string, unknown>).payment_method_name = method.name ?? method.code ?? method.id\n ;(item as Record<string, unknown>).payment_method_code = method.code ?? null\n }\n const statusId = (item as Record<string, unknown>).status_entry_id\n const status = typeof statusId === 'string' ? statusMap.get(statusId) : null\n if (status) {\n if (!(item as Record<string, unknown>).status) {\n ;(item as Record<string, unknown>).status = status.value\n }\n ;(item as Record<string, unknown>).status_label = status.label ?? status.value ?? null\n }\n })\n },\n },\n})\n\nconst { GET, POST, PUT, DELETE } = crud\n\nexport { GET, POST, PUT, DELETE }\n\nconst paymentSchema = z.object({\n id: z.string().uuid(),\n order_id: z.string().uuid().nullable().optional(),\n payment_method_id: z.string().uuid().nullable().optional(),\n payment_method_name: z.string().nullable().optional(),\n payment_method_code: z.string().nullable().optional(),\n payment_reference: z.string().nullable().optional(),\n status_entry_id: z.string().uuid().nullable().optional(),\n status: z.string().nullable().optional(),\n status_label: z.string().nullable().optional(),\n amount: z.number(),\n currency_code: z.string(),\n captured_amount: z.number().nullable().optional(),\n refunded_amount: z.number().nullable().optional(),\n received_at: z.string().nullable().optional(),\n captured_at: z.string().nullable().optional(),\n custom_field_set_id: z.string().uuid().nullable().optional(),\n customFieldSetId: z.string().uuid().nullable().optional(),\n custom_values: z.record(z.string(), z.unknown()).nullable().optional(),\n customValues: z.record(z.string(), z.unknown()).nullable().optional(),\n custom_fields: z.array(z.record(z.string(), z.unknown())).nullable().optional(),\n customFields: z.array(z.record(z.string(), z.unknown())).nullable().optional(),\n metadata: z.record(z.string(), z.unknown()).nullable().optional(),\n created_at: z.string(),\n updated_at: z.string().nullable().optional(),\n})\n\nconst orderTotalsSchema = z.object({\n paidTotalAmount: z.number().nullable().optional(),\n refundedTotalAmount: z.number().nullable().optional(),\n outstandingAmount: z.number().nullable().optional(),\n})\n\nconst paymentActionResponseSchema = z.object({\n id: z.string().uuid().nullable(),\n orderTotals: orderTotalsSchema.nullable().optional(),\n})\n\nexport const openApi = createSalesCrudOpenApi({\n resourceName: 'Payment',\n querySchema: listSchema,\n listResponseSchema: createPagedListResponseSchema(paymentSchema),\n create: {\n schema: paymentCreateSchema,\n responseSchema: paymentActionResponseSchema,\n description: 'Creates a payment for a sales order.',\n },\n update: {\n schema: paymentUpdateSchema,\n responseSchema: paymentActionResponseSchema,\n description: 'Updates a payment.',\n },\n del: {\n schema: deleteSchema.pick({ id: true }),\n responseSchema: paymentActionResponseSchema,\n description: 'Deletes a payment.',\n },\n})\n\nexport const metadata = routeMetadata\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -2094,11 +2094,13 @@ function SalesDocumentDetailPage({
2094
2094
  React.useEffect(() => {
2095
2095
  if (kind !== "order") return;
2096
2096
  ensureShippingMethodOption(record?.shippingMethodId ?? null, record?.shippingMethodSnapshot ?? null);
2097
- ensurePaymentMethodOption(record?.paymentMethodId ?? null, record?.paymentMethodSnapshot ?? null);
2097
+ const paymentMethodSnapshotOrCode = record?.paymentMethodSnapshot ?? (record?.paymentMethodCode ? { code: record.paymentMethodCode } : null);
2098
+ ensurePaymentMethodOption(record?.paymentMethodId ?? null, paymentMethodSnapshotOrCode);
2098
2099
  }, [
2099
2100
  ensurePaymentMethodOption,
2100
2101
  ensureShippingMethodOption,
2101
2102
  kind,
2103
+ record?.paymentMethodCode,
2102
2104
  record?.paymentMethodId,
2103
2105
  record?.paymentMethodSnapshot,
2104
2106
  record?.shippingMethodId,
@@ -3487,14 +3489,9 @@ function SalesDocumentDetailPage({
3487
3489
  tenantId: record?.tenantId ?? record?.tenant_id ?? null,
3488
3490
  onActionChange: handleSectionActionChange,
3489
3491
  onPaymentsChange: (payments) => setHasPayments(payments.length > 0),
3490
- onTotalsChange: (totals) => setRecord(
3491
- (prev) => prev ? {
3492
- ...prev,
3493
- paidTotalAmount: totals?.paidTotalAmount ?? prev.paidTotalAmount ?? null,
3494
- refundedTotalAmount: totals?.refundedTotalAmount ?? prev.refundedTotalAmount ?? null,
3495
- outstandingAmount: totals?.outstandingAmount ?? prev.outstandingAmount ?? null
3496
- } : prev
3497
- )
3492
+ onTotalsChange: () => {
3493
+ void refreshDocumentTotals();
3494
+ }
3498
3495
  }
3499
3496
  );
3500
3497
  }