@open-mercato/core 0.6.8-develop.7057.1.61440fc3bc → 0.6.8-develop.7063.1.664341cf65

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.
Files changed (31) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/modules/auth/acl.js +30 -5
  3. package/dist/modules/auth/acl.js.map +2 -2
  4. package/dist/modules/customers/backend/customers/companies/page.js +1 -1
  5. package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
  6. package/dist/modules/customers/backend/customers/people/page.js +1 -1
  7. package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
  8. package/dist/modules/sales/components/documents/ItemsSection.js +37 -15
  9. package/dist/modules/sales/components/documents/ItemsSection.js.map +2 -2
  10. package/dist/modules/sales/components/documents/LineItemDialog.js +76 -12
  11. package/dist/modules/sales/components/documents/LineItemDialog.js.map +2 -2
  12. package/dist/modules/sales/components/documents/SalesDocumentForm.js +1 -0
  13. package/dist/modules/sales/components/documents/SalesDocumentForm.js.map +2 -2
  14. package/dist/modules/sales/components/documents/SalesOrderDraftLines.js +1 -1
  15. package/dist/modules/sales/components/documents/SalesOrderDraftLines.js.map +2 -2
  16. package/dist/modules/sales/components/documents/lineItemShipmentLock.js +54 -0
  17. package/dist/modules/sales/components/documents/lineItemShipmentLock.js.map +7 -0
  18. package/package.json +7 -7
  19. package/src/modules/auth/acl.ts +30 -6
  20. package/src/modules/customers/backend/customers/companies/page.tsx +1 -1
  21. package/src/modules/customers/backend/customers/people/page.tsx +1 -1
  22. package/src/modules/sales/components/documents/ItemsSection.tsx +48 -17
  23. package/src/modules/sales/components/documents/LineItemDialog.tsx +129 -13
  24. package/src/modules/sales/components/documents/SalesDocumentForm.tsx +1 -0
  25. package/src/modules/sales/components/documents/SalesOrderDraftLines.tsx +1 -1
  26. package/src/modules/sales/components/documents/lineItemShipmentLock.ts +74 -0
  27. package/src/modules/sales/i18n/de.json +3 -0
  28. package/src/modules/sales/i18n/en.json +3 -0
  29. package/src/modules/sales/i18n/es.json +3 -0
  30. package/src/modules/sales/i18n/ko.json +3 -0
  31. package/src/modules/sales/i18n/pl.json +3 -0
@@ -0,0 +1,74 @@
1
+ type ShippedLineSnapshot = {
2
+ quantity: number;
3
+ totalNetAmount?: number | null;
4
+ totalGrossAmount?: number | null;
5
+ };
6
+
7
+ const SHIPPED_LINE_IMMUTABLE_PAYLOAD_FIELDS = [
8
+ "kind",
9
+ "productId",
10
+ "productVariantId",
11
+ "quantityUnit",
12
+ "unitPriceNet",
13
+ "unitPriceGross",
14
+ "priceId",
15
+ "priceMode",
16
+ "taxRateId",
17
+ "taxRate",
18
+ "taxAmount",
19
+ "discountAmount",
20
+ "discountPercent",
21
+ "catalogSnapshot",
22
+ "metadata",
23
+ ] as const;
24
+
25
+ function scaleTotal(
26
+ total: number | null | undefined,
27
+ previousQuantity: number,
28
+ nextQuantity: number,
29
+ ): number | undefined {
30
+ if (
31
+ !Number.isFinite(total) ||
32
+ !Number.isFinite(previousQuantity) ||
33
+ previousQuantity <= 0
34
+ ) {
35
+ return undefined;
36
+ }
37
+ return (total as number) * (nextQuantity / previousQuantity);
38
+ }
39
+
40
+ export function prepareShippedLineUpdatePayload(
41
+ payload: Record<string, unknown>,
42
+ currentLine: ShippedLineSnapshot | null,
43
+ ): Record<string, unknown> {
44
+ if (!currentLine) return payload;
45
+
46
+ const nextPayload = { ...payload };
47
+ for (const field of SHIPPED_LINE_IMMUTABLE_PAYLOAD_FIELDS) {
48
+ delete nextPayload[field];
49
+ }
50
+
51
+ delete nextPayload.totalNetAmount;
52
+ delete nextPayload.totalGrossAmount;
53
+
54
+ const nextQuantity = Number(nextPayload.quantity);
55
+ if (!Number.isFinite(nextQuantity) || nextQuantity === currentLine.quantity) {
56
+ return nextPayload;
57
+ }
58
+
59
+ const scaledNetTotal = scaleTotal(
60
+ currentLine.totalNetAmount,
61
+ currentLine.quantity,
62
+ nextQuantity,
63
+ );
64
+ const scaledGrossTotal = scaleTotal(
65
+ currentLine.totalGrossAmount,
66
+ currentLine.quantity,
67
+ nextQuantity,
68
+ );
69
+ if (scaledNetTotal !== undefined) nextPayload.totalNetAmount = scaledNetTotal;
70
+ if (scaledGrossTotal !== undefined)
71
+ nextPayload.totalGrossAmount = scaledGrossTotal;
72
+
73
+ return nextPayload;
74
+ }
@@ -979,6 +979,7 @@
979
979
  "sales.documents.items.errorProductRequired": "Wähle ein Produkt aus, um fortzufahren.",
980
980
  "sales.documents.items.errorQuantity": "Die Menge muss größer als 0 sein.",
981
981
  "sales.documents.items.errorQuantityBelowShipped": "Die Menge kann nicht unter die bereits versandten {{shipped}} gesenkt werden.",
982
+ "sales.documents.items.errorQuantityShipmentsUnknown": "Die Menge kann erst gesenkt werden, wenn die Sendungen dieses Auftrags geladen wurden. Öffnen Sie den Auftrag erneut, um es noch einmal zu versuchen.",
982
983
  "sales.documents.items.errorSave": "Position konnte nicht gespeichert werden.",
983
984
  "sales.documents.items.errorScope": "Organisation und Mandant sind erforderlich.",
984
985
  "sales.documents.items.errorUnitPrice": "Der Stückpreis muss größer als 0 sein.",
@@ -1022,6 +1023,8 @@
1022
1023
  "sales.documents.items.save": "Änderungen speichern",
1023
1024
  "sales.documents.items.selectedProduct": "Ausgewählt {{id}}",
1024
1025
  "sales.documents.items.selectedVariant": "Ausgewählt {{id}}",
1026
+ "sales.documents.items.shippedLineLockPending": "Die Preisangaben sind gesperrt, bis die Sendungen dieses Auftrags geladen wurden. Öffnen Sie den Auftrag erneut, um es noch einmal zu versuchen — Name und eine Erhöhung der Menge können weiterhin bearbeitet werden.",
1027
+ "sales.documents.items.shippedLineLocked": "Die Preisangaben dieser Position sind gesperrt, da bereits Artikel versandt wurden. Name und Menge können weiterhin bearbeitet werden.",
1025
1028
  "sales.documents.items.status": "Status",
1026
1029
  "sales.documents.items.statusEmpty": "Kein Status",
1027
1030
  "sales.documents.items.statusLoading": "Status werden geladen…",
@@ -979,6 +979,7 @@
979
979
  "sales.documents.items.errorProductRequired": "Select a product to continue.",
980
980
  "sales.documents.items.errorQuantity": "Quantity must be greater than 0.",
981
981
  "sales.documents.items.errorQuantityBelowShipped": "You cannot lower the quantity below the {{shipped}} already shipped.",
982
+ "sales.documents.items.errorQuantityShipmentsUnknown": "The quantity cannot be lowered until this order's shipments have been read. Reopen the order to try again.",
982
983
  "sales.documents.items.errorSave": "Failed to save line.",
983
984
  "sales.documents.items.errorScope": "Organization and tenant are required.",
984
985
  "sales.documents.items.errorUnitPrice": "Unit price must be greater than 0.",
@@ -1022,6 +1023,8 @@
1022
1023
  "sales.documents.items.save": "Save changes",
1023
1024
  "sales.documents.items.selectedProduct": "Selected {{id}}",
1024
1025
  "sales.documents.items.selectedVariant": "Selected {{id}}",
1026
+ "sales.documents.items.shippedLineLockPending": "Pricing is locked until this order's shipments have been read. Reopen the order to try again — you can still edit the name and raise the quantity.",
1027
+ "sales.documents.items.shippedLineLocked": "Pricing is locked on this line because it already has shipped items. You can still edit the name and quantity.",
1025
1028
  "sales.documents.items.status": "Status",
1026
1029
  "sales.documents.items.statusEmpty": "No status",
1027
1030
  "sales.documents.items.statusLoading": "Loading statuses…",
@@ -979,6 +979,7 @@
979
979
  "sales.documents.items.errorProductRequired": "Selecciona un producto para continuar.",
980
980
  "sales.documents.items.errorQuantity": "La cantidad debe ser mayor que 0.",
981
981
  "sales.documents.items.errorQuantityBelowShipped": "No puedes reducir la cantidad por debajo de las {{shipped}} ya enviadas.",
982
+ "sales.documents.items.errorQuantityShipmentsUnknown": "La cantidad no se puede reducir hasta que se carguen los envíos de este pedido. Vuelve a abrir el pedido para intentarlo de nuevo.",
982
983
  "sales.documents.items.errorSave": "No se pudo guardar la línea.",
983
984
  "sales.documents.items.errorScope": "Se requieren organización e inquilino.",
984
985
  "sales.documents.items.errorUnitPrice": "El precio unitario debe ser mayor que 0.",
@@ -1022,6 +1023,8 @@
1022
1023
  "sales.documents.items.save": "Guardar cambios",
1023
1024
  "sales.documents.items.selectedProduct": "Seleccionado {{id}}",
1024
1025
  "sales.documents.items.selectedVariant": "Seleccionado {{id}}",
1026
+ "sales.documents.items.shippedLineLockPending": "Los precios están bloqueados hasta que se carguen los envíos de este pedido. Vuelve a abrir el pedido para intentarlo de nuevo — todavía puedes editar el nombre y aumentar la cantidad.",
1027
+ "sales.documents.items.shippedLineLocked": "Los precios de esta línea están bloqueados porque ya tiene envíos. Todavía puedes editar el nombre y la cantidad.",
1025
1028
  "sales.documents.items.status": "Estado",
1026
1029
  "sales.documents.items.statusEmpty": "Sin estado",
1027
1030
  "sales.documents.items.statusLoading": "Cargando estados…",
@@ -979,6 +979,7 @@
979
979
  "sales.documents.items.errorProductRequired": "계속하려면 상품을 선택하세요.",
980
980
  "sales.documents.items.errorQuantity": "수량은 0보다 커야 합니다.",
981
981
  "sales.documents.items.errorQuantityBelowShipped": "이미 배송된 {{shipped}} 이하로 수량을 줄일 수 없습니다.",
982
+ "sales.documents.items.errorQuantityShipmentsUnknown": "이 주문의 배송 정보를 불러올 때까지 수량을 줄일 수 없습니다. 주문을 다시 열어 재시도하세요.",
982
983
  "sales.documents.items.errorSave": "품목을 저장하지 못했습니다.",
983
984
  "sales.documents.items.errorScope": "조직 및 테넌트 정보가 필요합니다.",
984
985
  "sales.documents.items.errorUnitPrice": "단가는 0보다 커야 합니다.",
@@ -1022,6 +1023,8 @@
1022
1023
  "sales.documents.items.save": "변경사항 저장",
1023
1024
  "sales.documents.items.selectedProduct": "선택됨 {{id}}",
1024
1025
  "sales.documents.items.selectedVariant": "선택됨 {{id}}",
1026
+ "sales.documents.items.shippedLineLockPending": "이 주문의 선적 정보를 불러올 때까지 가격 정보가 잠깁니다. 주문을 다시 열어 재시도하세요 — 이름 수정과 수량 증가는 계속 가능합니다.",
1027
+ "sales.documents.items.shippedLineLocked": "이 라인은 이미 선적된 품목이 있어 가격 정보가 잠겨 있습니다. 이름과 수량은 계속 수정할 수 있습니다.",
1025
1028
  "sales.documents.items.status": "상태",
1026
1029
  "sales.documents.items.statusEmpty": "상태 없음",
1027
1030
  "sales.documents.items.statusLoading": "상태 목록을 불러오는 중…",
@@ -979,6 +979,7 @@
979
979
  "sales.documents.items.errorProductRequired": "Wybierz produkt, aby kontynuować.",
980
980
  "sales.documents.items.errorQuantity": "Ilość musi być większa niż 0.",
981
981
  "sales.documents.items.errorQuantityBelowShipped": "Nie można obniżyć ilości poniżej {{shipped}} już wysłanych.",
982
+ "sales.documents.items.errorQuantityShipmentsUnknown": "Nie można obniżyć ilości, dopóki wysyłki tego zamówienia nie zostaną wczytane. Otwórz zamówienie ponownie, aby spróbować jeszcze raz.",
982
983
  "sales.documents.items.errorSave": "Nie udało się zapisać pozycji.",
983
984
  "sales.documents.items.errorScope": "Wymagane są organizacja i najemca.",
984
985
  "sales.documents.items.errorUnitPrice": "Cena jednostkowa musi być większa niż 0.",
@@ -1022,6 +1023,8 @@
1022
1023
  "sales.documents.items.save": "Zapisz zmiany",
1023
1024
  "sales.documents.items.selectedProduct": "Wybrano {{id}}",
1024
1025
  "sales.documents.items.selectedVariant": "Wybrano {{id}}",
1026
+ "sales.documents.items.shippedLineLockPending": "Ceny są zablokowane, dopóki wysyłki tego zamówienia nie zostaną wczytane. Otwórz zamówienie ponownie, aby spróbować jeszcze raz — nadal możesz edytować nazwę i zwiększyć ilość.",
1027
+ "sales.documents.items.shippedLineLocked": "Ceny tej pozycji są zablokowane, ponieważ ma już wysłane sztuki. Nazwę i ilość nadal możesz edytować.",
1025
1028
  "sales.documents.items.status": "Status",
1026
1029
  "sales.documents.items.statusEmpty": "Brak statusu",
1027
1030
  "sales.documents.items.statusLoading": "Ładowanie statusów…",