@open-mercato/core 0.4.8-develop-d16e2f51dc → 0.4.8-develop-4b58cde65d

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 (85) hide show
  1. package/dist/generated/entities/sales_return/index.js +31 -0
  2. package/dist/generated/entities/sales_return/index.js.map +7 -0
  3. package/dist/generated/entities/sales_return_line/index.js +29 -0
  4. package/dist/generated/entities/sales_return_line/index.js.map +7 -0
  5. package/dist/generated/entities.ids.generated.js +2 -0
  6. package/dist/generated/entities.ids.generated.js.map +2 -2
  7. package/dist/generated/entity-fields-registry.js +4 -0
  8. package/dist/generated/entity-fields-registry.js.map +2 -2
  9. package/dist/modules/sales/acl.js +2 -0
  10. package/dist/modules/sales/acl.js.map +2 -2
  11. package/dist/modules/sales/api/document-history/route.js +20 -2
  12. package/dist/modules/sales/api/document-history/route.js.map +2 -2
  13. package/dist/modules/sales/api/documents/factory.js +34 -0
  14. package/dist/modules/sales/api/documents/factory.js.map +2 -2
  15. package/dist/modules/sales/api/returns/[id]/route.js +147 -0
  16. package/dist/modules/sales/api/returns/[id]/route.js.map +7 -0
  17. package/dist/modules/sales/api/returns/route.js +158 -0
  18. package/dist/modules/sales/api/returns/route.js.map +7 -0
  19. package/dist/modules/sales/backend/sales/documents/[id]/page.js +20 -1
  20. package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
  21. package/dist/modules/sales/commands/index.js +1 -0
  22. package/dist/modules/sales/commands/index.js.map +2 -2
  23. package/dist/modules/sales/commands/returns.js +467 -0
  24. package/dist/modules/sales/commands/returns.js.map +7 -0
  25. package/dist/modules/sales/components/documents/ReturnDialog.js +176 -0
  26. package/dist/modules/sales/components/documents/ReturnDialog.js.map +7 -0
  27. package/dist/modules/sales/components/documents/ReturnsSection.js +188 -0
  28. package/dist/modules/sales/components/documents/ReturnsSection.js.map +7 -0
  29. package/dist/modules/sales/data/entities.js +115 -1
  30. package/dist/modules/sales/data/entities.js.map +2 -2
  31. package/dist/modules/sales/data/validators.js +13 -0
  32. package/dist/modules/sales/data/validators.js.map +2 -2
  33. package/dist/modules/sales/events.js +4 -0
  34. package/dist/modules/sales/events.js.map +2 -2
  35. package/dist/modules/sales/lib/calculations.js +7 -0
  36. package/dist/modules/sales/lib/calculations.js.map +2 -2
  37. package/dist/modules/sales/lib/dictionaries.js +1 -0
  38. package/dist/modules/sales/lib/dictionaries.js.map +2 -2
  39. package/dist/modules/sales/lib/documentNumberTokens.js +2 -0
  40. package/dist/modules/sales/lib/documentNumberTokens.js.map +2 -2
  41. package/dist/modules/sales/lib/historyHelpers.js +15 -7
  42. package/dist/modules/sales/lib/historyHelpers.js.map +2 -2
  43. package/dist/modules/sales/lib/makeSalesLineRoute.js +42 -37
  44. package/dist/modules/sales/lib/makeSalesLineRoute.js.map +2 -2
  45. package/dist/modules/sales/migrations/Migration20260309073310.js +23 -0
  46. package/dist/modules/sales/migrations/Migration20260309073310.js.map +7 -0
  47. package/dist/modules/sales/services/salesDocumentNumberGenerator.js +8 -6
  48. package/dist/modules/sales/services/salesDocumentNumberGenerator.js.map +2 -2
  49. package/dist/modules/sales/setup.js +1 -1
  50. package/dist/modules/sales/setup.js.map +2 -2
  51. package/dist/modules/sales/widgets/injection/document-history/widget.client.js +25 -16
  52. package/dist/modules/sales/widgets/injection/document-history/widget.client.js.map +2 -2
  53. package/generated/entities/sales_return/index.ts +14 -0
  54. package/generated/entities/sales_return_line/index.ts +13 -0
  55. package/generated/entities.ids.generated.ts +2 -0
  56. package/generated/entity-fields-registry.ts +4 -0
  57. package/package.json +3 -3
  58. package/src/modules/sales/AGENTS.md +1 -0
  59. package/src/modules/sales/acl.ts +2 -0
  60. package/src/modules/sales/api/document-history/route.ts +25 -1
  61. package/src/modules/sales/api/documents/factory.ts +35 -0
  62. package/src/modules/sales/api/returns/[id]/route.ts +156 -0
  63. package/src/modules/sales/api/returns/route.ts +171 -0
  64. package/src/modules/sales/backend/sales/documents/[id]/page.tsx +18 -0
  65. package/src/modules/sales/commands/index.ts +1 -0
  66. package/src/modules/sales/commands/returns.ts +540 -0
  67. package/src/modules/sales/components/documents/ReturnDialog.tsx +216 -0
  68. package/src/modules/sales/components/documents/ReturnsSection.tsx +270 -0
  69. package/src/modules/sales/data/entities.ts +99 -3
  70. package/src/modules/sales/data/validators.ts +16 -0
  71. package/src/modules/sales/events.ts +5 -0
  72. package/src/modules/sales/i18n/de.json +32 -0
  73. package/src/modules/sales/i18n/en.json +32 -0
  74. package/src/modules/sales/i18n/es.json +32 -0
  75. package/src/modules/sales/i18n/pl.json +32 -0
  76. package/src/modules/sales/lib/calculations.ts +9 -0
  77. package/src/modules/sales/lib/dictionaries.ts +1 -0
  78. package/src/modules/sales/lib/documentNumberTokens.ts +2 -1
  79. package/src/modules/sales/lib/historyHelpers.ts +20 -9
  80. package/src/modules/sales/lib/makeSalesLineRoute.ts +42 -37
  81. package/src/modules/sales/migrations/.snapshot-open-mercato.json +398 -0
  82. package/src/modules/sales/migrations/Migration20260309073310.ts +26 -0
  83. package/src/modules/sales/services/salesDocumentNumberGenerator.ts +15 -4
  84. package/src/modules/sales/setup.ts +1 -1
  85. package/src/modules/sales/widgets/injection/document-history/widget.client.tsx +26 -17
@@ -28,6 +28,7 @@
28
28
  "sales.audit.quotes.lines.delete": "Angebotsposition löschen",
29
29
  "sales.audit.quotes.lines.upsert": "Angebotsposition aktualisieren",
30
30
  "sales.audit.quotes.update": "Angebot aktualisieren",
31
+ "sales.audit.returns.create": "Rückgabe erstellen",
31
32
  "sales.audit.shipments.create": "Sendung erstellen",
32
33
  "sales.audit.shipments.delete": "Sendung löschen",
33
34
  "sales.audit.shipments.update": "Sendung aktualisieren",
@@ -439,6 +440,7 @@
439
440
  "sales.documents.adjustments.kindLabel": "Typ",
440
441
  "sales.documents.adjustments.kindLabels.custom": "Benutzerdefiniert",
441
442
  "sales.documents.adjustments.kindLabels.discount": "Rabatt",
443
+ "sales.documents.adjustments.kindLabels.return": "Rückgabe",
442
444
  "sales.documents.adjustments.kindLabels.shipping": "Versand",
443
445
  "sales.documents.adjustments.kindLabels.surcharge": "Zuschlag",
444
446
  "sales.documents.adjustments.kindLabels.tax": "Steuer",
@@ -506,6 +508,7 @@
506
508
  "sales.documents.detail.adjustments.kindLabel": "Typ",
507
509
  "sales.documents.detail.adjustments.kindLabels.custom": "Benutzerdefiniert",
508
510
  "sales.documents.detail.adjustments.kindLabels.discount": "Rabatt",
511
+ "sales.documents.detail.adjustments.kindLabels.return": "Rückgabe",
509
512
  "sales.documents.detail.adjustments.kindLabels.shipping": "Versand",
510
513
  "sales.documents.detail.adjustments.kindLabels.surcharge": "Zuschlag",
511
514
  "sales.documents.detail.adjustments.kindLabels.tax": "Steuer",
@@ -759,6 +762,7 @@
759
762
  "sales.documents.detail.tabs.comments": "Kommentare",
760
763
  "sales.documents.detail.tabs.items": "Positionen",
761
764
  "sales.documents.detail.tabs.payments": "Zahlungen",
765
+ "sales.documents.detail.tabs.returns": "Rückgaben",
762
766
  "sales.documents.detail.tabs.shipments": "Sendungen",
763
767
  "sales.documents.detail.tags": "Tags",
764
768
  "sales.documents.detail.tags.cancelShortcut": "Abbrechen (Esc)",
@@ -1247,6 +1251,34 @@
1247
1251
  "sales.quotes.send.title": "Angebot an Kunden senden",
1248
1252
  "sales.quotes.send.validForDays": "Gültig für (Tage)",
1249
1253
  "sales.quotes.update": "Angebot aktualisieren",
1254
+ "sales.returns.available": "Verfügbar",
1255
+ "sales.returns.create": "Rückgabe erstellen",
1256
+ "sales.returns.create.lines": "Positionen",
1257
+ "sales.returns.create.submit": "Rückgabe erstellen",
1258
+ "sales.returns.create.title": "Rückgabe erstellen",
1259
+ "sales.returns.created": "Rückgabe erstellt.",
1260
+ "sales.returns.empty.available": "Keine Artikel zur Rückgabe verfügbar.",
1261
+ "sales.returns.empty.description": "Erstelle eine Rückgabe, um Gutschriften für zurückgesendete Artikel zu erzeugen.",
1262
+ "sales.returns.empty.title": "Noch keine Rückgaben.",
1263
+ "sales.returns.error": "Rückgabe konnte nicht geladen werden.",
1264
+ "sales.returns.errors.create": "Rückgabe konnte nicht erstellt werden.",
1265
+ "sales.returns.errors.linesRequired": "Wähle mindestens eine Position zur Rückgabe aus.",
1266
+ "sales.returns.errors.load": "Rückgaben konnten nicht geladen werden.",
1267
+ "sales.returns.errors.quantityExceeded": "Es kann nicht mehr als die verfügbare Menge zurückgegeben werden.",
1268
+ "sales.returns.lineMissing": "Bestellposition nicht gefunden.",
1269
+ "sales.returns.linesRequired": "Wähle mindestens eine Position zur Rückgabe aus.",
1270
+ "sales.returns.notFound": "Rückgabe nicht gefunden.",
1271
+ "sales.returns.notSet": "Nicht festgelegt",
1272
+ "sales.returns.notes": "Notizen",
1273
+ "sales.returns.notes.placeholder": "Optional",
1274
+ "sales.returns.orderMissing": "Bestellung nicht gefunden.",
1275
+ "sales.returns.quantity": "Menge",
1276
+ "sales.returns.quantityExceeded": "Es kann nicht mehr als die verbleibende Menge zurückgegeben werden.",
1277
+ "sales.returns.reason": "Grund",
1278
+ "sales.returns.reason.placeholder": "Optional",
1279
+ "sales.returns.returnNumber": "Rückgabe",
1280
+ "sales.returns.returnedAt": "Rückgabedatum",
1281
+ "sales.returns.total": "Summe",
1250
1282
  "sales.search.badge.address": "Adresse",
1251
1283
  "sales.search.badge.channel": "Kanal",
1252
1284
  "sales.search.badge.creditMemo": "Gutschrift",
@@ -28,6 +28,7 @@
28
28
  "sales.audit.quotes.lines.delete": "Delete quote line",
29
29
  "sales.audit.quotes.lines.upsert": "Update quote line",
30
30
  "sales.audit.quotes.update": "Update sales quote",
31
+ "sales.audit.returns.create": "Create return",
31
32
  "sales.audit.shipments.create": "Create shipment",
32
33
  "sales.audit.shipments.delete": "Delete shipment",
33
34
  "sales.audit.shipments.update": "Update shipment",
@@ -439,6 +440,7 @@
439
440
  "sales.documents.adjustments.kindLabel": "Kind",
440
441
  "sales.documents.adjustments.kindLabels.custom": "Custom",
441
442
  "sales.documents.adjustments.kindLabels.discount": "Discount",
443
+ "sales.documents.adjustments.kindLabels.return": "Return",
442
444
  "sales.documents.adjustments.kindLabels.shipping": "Shipping",
443
445
  "sales.documents.adjustments.kindLabels.surcharge": "Surcharge",
444
446
  "sales.documents.adjustments.kindLabels.tax": "Tax",
@@ -506,6 +508,7 @@
506
508
  "sales.documents.detail.adjustments.kindLabel": "Kind",
507
509
  "sales.documents.detail.adjustments.kindLabels.custom": "Custom",
508
510
  "sales.documents.detail.adjustments.kindLabels.discount": "Discount",
511
+ "sales.documents.detail.adjustments.kindLabels.return": "Return",
509
512
  "sales.documents.detail.adjustments.kindLabels.shipping": "Shipping",
510
513
  "sales.documents.detail.adjustments.kindLabels.surcharge": "Surcharge",
511
514
  "sales.documents.detail.adjustments.kindLabels.tax": "Tax",
@@ -759,6 +762,7 @@
759
762
  "sales.documents.detail.tabs.comments": "Comments",
760
763
  "sales.documents.detail.tabs.items": "Items",
761
764
  "sales.documents.detail.tabs.payments": "Payments",
765
+ "sales.documents.detail.tabs.returns": "Returns",
762
766
  "sales.documents.detail.tabs.shipments": "Shipments",
763
767
  "sales.documents.detail.tags": "Tags",
764
768
  "sales.documents.detail.tags.cancelShortcut": "Cancel (Esc)",
@@ -1247,6 +1251,34 @@
1247
1251
  "sales.quotes.send.title": "Send quote to customer",
1248
1252
  "sales.quotes.send.validForDays": "Valid for (days)",
1249
1253
  "sales.quotes.update": "Update sales quote",
1254
+ "sales.returns.available": "Available",
1255
+ "sales.returns.create": "Create return",
1256
+ "sales.returns.create.lines": "Lines",
1257
+ "sales.returns.create.submit": "Create return",
1258
+ "sales.returns.create.title": "Create return",
1259
+ "sales.returns.created": "Return created.",
1260
+ "sales.returns.empty.available": "No items available to return.",
1261
+ "sales.returns.empty.description": "Create a return to generate credit adjustments for returned items.",
1262
+ "sales.returns.empty.title": "No returns yet.",
1263
+ "sales.returns.error": "Failed to load return.",
1264
+ "sales.returns.errors.create": "Failed to create return.",
1265
+ "sales.returns.errors.linesRequired": "Select at least one line to return.",
1266
+ "sales.returns.errors.load": "Failed to load returns.",
1267
+ "sales.returns.errors.quantityExceeded": "Cannot return more than available quantity.",
1268
+ "sales.returns.lineMissing": "Order line not found.",
1269
+ "sales.returns.linesRequired": "Select at least one line to return.",
1270
+ "sales.returns.notFound": "Return not found.",
1271
+ "sales.returns.notSet": "Not set",
1272
+ "sales.returns.notes": "Notes",
1273
+ "sales.returns.notes.placeholder": "Optional",
1274
+ "sales.returns.orderMissing": "Order not found.",
1275
+ "sales.returns.quantity": "Quantity",
1276
+ "sales.returns.quantityExceeded": "Cannot return more than the remaining quantity.",
1277
+ "sales.returns.reason": "Reason",
1278
+ "sales.returns.reason.placeholder": "Optional",
1279
+ "sales.returns.returnNumber": "Return",
1280
+ "sales.returns.returnedAt": "Returned at",
1281
+ "sales.returns.total": "Total",
1250
1282
  "sales.search.badge.address": "Address",
1251
1283
  "sales.search.badge.channel": "Channel",
1252
1284
  "sales.search.badge.creditMemo": "Credit memo",
@@ -28,6 +28,7 @@
28
28
  "sales.audit.quotes.lines.delete": "Eliminar línea de cotización",
29
29
  "sales.audit.quotes.lines.upsert": "Actualizar línea de cotización",
30
30
  "sales.audit.quotes.update": "Actualizar cotización",
31
+ "sales.audit.returns.create": "Crear devolución",
31
32
  "sales.audit.shipments.create": "Crear envío",
32
33
  "sales.audit.shipments.delete": "Eliminar envío",
33
34
  "sales.audit.shipments.update": "Actualizar envío",
@@ -439,6 +440,7 @@
439
440
  "sales.documents.adjustments.kindLabel": "Tipo",
440
441
  "sales.documents.adjustments.kindLabels.custom": "Personalizado",
441
442
  "sales.documents.adjustments.kindLabels.discount": "Descuento",
443
+ "sales.documents.adjustments.kindLabels.return": "Devolución",
442
444
  "sales.documents.adjustments.kindLabels.shipping": "Envío",
443
445
  "sales.documents.adjustments.kindLabels.surcharge": "Recargo",
444
446
  "sales.documents.adjustments.kindLabels.tax": "Impuesto",
@@ -506,6 +508,7 @@
506
508
  "sales.documents.detail.adjustments.kindLabel": "Tipo",
507
509
  "sales.documents.detail.adjustments.kindLabels.custom": "Personalizado",
508
510
  "sales.documents.detail.adjustments.kindLabels.discount": "Descuento",
511
+ "sales.documents.detail.adjustments.kindLabels.return": "Devolución",
509
512
  "sales.documents.detail.adjustments.kindLabels.shipping": "Envío",
510
513
  "sales.documents.detail.adjustments.kindLabels.surcharge": "Recargo",
511
514
  "sales.documents.detail.adjustments.kindLabels.tax": "Impuesto",
@@ -759,6 +762,7 @@
759
762
  "sales.documents.detail.tabs.comments": "Comentarios",
760
763
  "sales.documents.detail.tabs.items": "Artículos",
761
764
  "sales.documents.detail.tabs.payments": "Pagos",
765
+ "sales.documents.detail.tabs.returns": "Devoluciones",
762
766
  "sales.documents.detail.tabs.shipments": "Envíos",
763
767
  "sales.documents.detail.tags": "Etiquetas",
764
768
  "sales.documents.detail.tags.cancelShortcut": "Cancelar (Esc)",
@@ -1247,6 +1251,34 @@
1247
1251
  "sales.quotes.send.title": "Enviar cotización al cliente",
1248
1252
  "sales.quotes.send.validForDays": "Válida por (días)",
1249
1253
  "sales.quotes.update": "Actualizar cotización",
1254
+ "sales.returns.available": "Disponible",
1255
+ "sales.returns.create": "Crear devolución",
1256
+ "sales.returns.create.lines": "Líneas",
1257
+ "sales.returns.create.submit": "Crear devolución",
1258
+ "sales.returns.create.title": "Crear devolución",
1259
+ "sales.returns.created": "Devolución creada.",
1260
+ "sales.returns.empty.available": "No hay artículos disponibles para devolver.",
1261
+ "sales.returns.empty.description": "Crea una devolución para generar ajustes de crédito por artículos devueltos.",
1262
+ "sales.returns.empty.title": "Aún no hay devoluciones.",
1263
+ "sales.returns.error": "No se pudo cargar la devolución.",
1264
+ "sales.returns.errors.create": "No se pudo crear la devolución.",
1265
+ "sales.returns.errors.linesRequired": "Selecciona al menos una línea para devolver.",
1266
+ "sales.returns.errors.load": "No se pudieron cargar las devoluciones.",
1267
+ "sales.returns.errors.quantityExceeded": "No se puede devolver más que la cantidad disponible.",
1268
+ "sales.returns.lineMissing": "No se encontró la línea del pedido.",
1269
+ "sales.returns.linesRequired": "Selecciona al menos una línea para devolver.",
1270
+ "sales.returns.notFound": "Devolución no encontrada.",
1271
+ "sales.returns.notSet": "No establecido",
1272
+ "sales.returns.notes": "Notas",
1273
+ "sales.returns.notes.placeholder": "Opcional",
1274
+ "sales.returns.orderMissing": "Pedido no encontrado.",
1275
+ "sales.returns.quantity": "Cantidad",
1276
+ "sales.returns.quantityExceeded": "No se puede devolver más que la cantidad restante.",
1277
+ "sales.returns.reason": "Motivo",
1278
+ "sales.returns.reason.placeholder": "Opcional",
1279
+ "sales.returns.returnNumber": "Devolución",
1280
+ "sales.returns.returnedAt": "Devuelto el",
1281
+ "sales.returns.total": "Total",
1250
1282
  "sales.search.badge.address": "Dirección",
1251
1283
  "sales.search.badge.channel": "Canal",
1252
1284
  "sales.search.badge.creditMemo": "Nota de crédito",
@@ -28,6 +28,7 @@
28
28
  "sales.audit.quotes.lines.delete": "Usuń pozycję oferty",
29
29
  "sales.audit.quotes.lines.upsert": "Zaktualizuj pozycję oferty",
30
30
  "sales.audit.quotes.update": "Aktualizuj ofertę",
31
+ "sales.audit.returns.create": "Utwórz zwrot",
31
32
  "sales.audit.shipments.create": "Utwórz wysyłkę",
32
33
  "sales.audit.shipments.delete": "Usuń wysyłkę",
33
34
  "sales.audit.shipments.update": "Aktualizuj wysyłkę",
@@ -439,6 +440,7 @@
439
440
  "sales.documents.adjustments.kindLabel": "Typ",
440
441
  "sales.documents.adjustments.kindLabels.custom": "Niestandardowe",
441
442
  "sales.documents.adjustments.kindLabels.discount": "Rabat",
443
+ "sales.documents.adjustments.kindLabels.return": "Zwrot",
442
444
  "sales.documents.adjustments.kindLabels.shipping": "Wysyłka",
443
445
  "sales.documents.adjustments.kindLabels.surcharge": "Dopłata",
444
446
  "sales.documents.adjustments.kindLabels.tax": "Podatek",
@@ -506,6 +508,7 @@
506
508
  "sales.documents.detail.adjustments.kindLabel": "Typ",
507
509
  "sales.documents.detail.adjustments.kindLabels.custom": "Niestandardowe",
508
510
  "sales.documents.detail.adjustments.kindLabels.discount": "Rabat",
511
+ "sales.documents.detail.adjustments.kindLabels.return": "Zwrot",
509
512
  "sales.documents.detail.adjustments.kindLabels.shipping": "Wysyłka",
510
513
  "sales.documents.detail.adjustments.kindLabels.surcharge": "Dopłata",
511
514
  "sales.documents.detail.adjustments.kindLabels.tax": "Podatek",
@@ -759,6 +762,7 @@
759
762
  "sales.documents.detail.tabs.comments": "Komentarze",
760
763
  "sales.documents.detail.tabs.items": "Pozycje",
761
764
  "sales.documents.detail.tabs.payments": "Płatności",
765
+ "sales.documents.detail.tabs.returns": "Zwroty",
762
766
  "sales.documents.detail.tabs.shipments": "Wysyłki",
763
767
  "sales.documents.detail.tags": "Tagi",
764
768
  "sales.documents.detail.tags.cancelShortcut": "Anuluj (Esc)",
@@ -1247,6 +1251,34 @@
1247
1251
  "sales.quotes.send.title": "Wyślij ofertę do klienta",
1248
1252
  "sales.quotes.send.validForDays": "Ważne przez (dni)",
1249
1253
  "sales.quotes.update": "Aktualizuj ofertę",
1254
+ "sales.returns.available": "Dostępne",
1255
+ "sales.returns.create": "Utwórz zwrot",
1256
+ "sales.returns.create.lines": "Pozycje",
1257
+ "sales.returns.create.submit": "Utwórz zwrot",
1258
+ "sales.returns.create.title": "Utwórz zwrot",
1259
+ "sales.returns.created": "Zwrot utworzony.",
1260
+ "sales.returns.empty.available": "Brak pozycji dostępnych do zwrotu.",
1261
+ "sales.returns.empty.description": "Utwórz zwrot, aby wygenerować korekty kredytowe dla zwróconych pozycji.",
1262
+ "sales.returns.empty.title": "Brak zwrotów.",
1263
+ "sales.returns.error": "Nie udało się załadować zwrotu.",
1264
+ "sales.returns.errors.create": "Nie udało się utworzyć zwrotu.",
1265
+ "sales.returns.errors.linesRequired": "Wybierz co najmniej jedną pozycję do zwrotu.",
1266
+ "sales.returns.errors.load": "Nie udało się załadować zwrotów.",
1267
+ "sales.returns.errors.quantityExceeded": "Nie można zwrócić więcej niż dostępna ilość.",
1268
+ "sales.returns.lineMissing": "Nie znaleziono pozycji zamówienia.",
1269
+ "sales.returns.linesRequired": "Wybierz co najmniej jedną pozycję do zwrotu.",
1270
+ "sales.returns.notFound": "Nie znaleziono zwrotu.",
1271
+ "sales.returns.notSet": "Nie ustawiono",
1272
+ "sales.returns.notes": "Notatki",
1273
+ "sales.returns.notes.placeholder": "Opcjonalne",
1274
+ "sales.returns.orderMissing": "Nie znaleziono zamówienia.",
1275
+ "sales.returns.quantity": "Ilość",
1276
+ "sales.returns.quantityExceeded": "Nie można zwrócić więcej niż pozostała ilość.",
1277
+ "sales.returns.reason": "Powód",
1278
+ "sales.returns.reason.placeholder": "Opcjonalny",
1279
+ "sales.returns.returnNumber": "Zwrot",
1280
+ "sales.returns.returnedAt": "Data zwrotu",
1281
+ "sales.returns.total": "Suma",
1250
1282
  "sales.search.badge.address": "Adres",
1251
1283
  "sales.search.badge.channel": "Kanał",
1252
1284
  "sales.search.badge.creditMemo": "Nota kredytowa",
@@ -190,6 +190,15 @@ function buildBaseDocumentResult(params: {
190
190
  }
191
191
  }
192
192
 
193
+ // Line-scoped and any other return (credit) adjustments reduce grand total
194
+ for (const adj of resolvedAdjustments) {
195
+ if (adj.kind !== 'return') continue
196
+ const net = toNumber(adj.amountNet, toNumber(adj.amountGross))
197
+ const gross = toNumber(adj.amountGross, net)
198
+ subtotalNet = Math.max(subtotalNet + net, 0)
199
+ subtotalGross = Math.max(subtotalGross + gross, 0)
200
+ }
201
+
193
202
  const grandTotalNet = round(subtotalNet)
194
203
  const grandTotalGross = round(subtotalGross)
195
204
  const paidTotalAmount = Math.max(toNumber(params.existingTotals?.paidTotalAmount, 0), 0)
@@ -173,6 +173,7 @@ const ADJUSTMENT_KIND_DEFAULTS: SalesDictionarySeed[] = [
173
173
  { value: 'tax', label: 'Tax' },
174
174
  { value: 'shipping', label: 'Shipping' },
175
175
  { value: 'surcharge', label: 'Surcharge' },
176
+ { value: 'return', label: 'Return' },
176
177
  { value: 'custom', label: 'Custom' },
177
178
  ]
178
179
 
@@ -1,7 +1,8 @@
1
- export type SalesDocumentNumberKind = 'quote' | 'order'
1
+ export type SalesDocumentNumberKind = 'quote' | 'order' | 'return'
2
2
 
3
3
  export const DEFAULT_ORDER_NUMBER_FORMAT = 'ORDER-{yyyy}{mm}{dd}-{seq:5}'
4
4
  export const DEFAULT_QUOTE_NUMBER_FORMAT = 'QUOTE-{yyyy}{mm}{dd}-{seq:5}'
5
+ export const DEFAULT_RETURN_NUMBER_FORMAT = 'RET-{yyyy}{mm}{dd}-{seq:5}'
5
6
 
6
7
  export const DOCUMENT_NUMBER_TOKENS: Array<{ token: string; description: string }> = [
7
8
  { token: '{yyyy}', description: '4-digit year, e.g. 2025' },
@@ -21,10 +21,13 @@ function extractStatusFromSnapshot(snapshot: unknown): string | null {
21
21
  const s = snapshot as Record<string, unknown>
22
22
  // Dedicated logStatusChange entries: { status: "value" }
23
23
  if (typeof s.status === 'string') return s.status
24
- // Regular update snapshots: { order: { status: "value", ... } }
24
+ // Regular update snapshots: { order: { status, fulfillment_status, payment_status, ... } }
25
25
  if (s.order && typeof s.order === 'object') {
26
26
  const order = s.order as Record<string, unknown>
27
- if (typeof order.status === 'string') return order.status
27
+ const orderStatus = typeof order.status === 'string' ? order.status : null
28
+ const fulfillmentStatus = typeof order.fulfillment_status === 'string' ? order.fulfillment_status : null
29
+ const paymentStatus = typeof order.payment_status === 'string' ? order.payment_status : null
30
+ return orderStatus ?? fulfillmentStatus ?? paymentStatus ?? null
28
31
  }
29
32
  // Regular update snapshots: { quote: { status: "value", ... } }
30
33
  if (s.quote && typeof s.quote === 'object') {
@@ -38,12 +41,16 @@ export function detectStatusChange(log: ActionLog): {
38
41
  statusFrom: string | null
39
42
  statusTo: string | null
40
43
  } | null {
41
- // Skip creations — no previous state means no transition
42
- if (!log.snapshotBefore) return null
43
- const before = extractStatusFromSnapshot(log.snapshotBefore)
44
44
  const after = extractStatusFromSnapshot(log.snapshotAfter)
45
+ const before = log.snapshotBefore
46
+ ? extractStatusFromSnapshot(log.snapshotBefore)
47
+ : null
48
+ // Creation (no snapshotBefore): always one status entry (initial value or "created")
49
+ if (!log.snapshotBefore) {
50
+ return { statusFrom: null, statusTo: after ?? null }
51
+ }
45
52
  if (before !== after && (before !== null || after !== null)) {
46
- return { statusFrom: before, statusTo: after }
53
+ return { statusFrom: before, statusTo: after ?? null }
47
54
  }
48
55
  return null
49
56
  }
@@ -61,9 +68,13 @@ export function normalizeActionLogToHistoryEntry(
61
68
  let action = log.actionLabel || log.commandId
62
69
  let metadata: HistoryEntry['metadata'] = { documentKind: kind, commandId: log.commandId }
63
70
  if (statusChange) {
64
- entryKind = 'status'
65
- action = statusChange.statusTo ?? 'unknown'
66
- metadata = { ...metadata, statusFrom: statusChange.statusFrom, statusTo: statusChange.statusTo }
71
+ const hasStatusValues = statusChange.statusFrom != null || statusChange.statusTo != null
72
+ if (hasStatusValues) {
73
+ entryKind = 'status'
74
+ action = statusChange.statusTo ?? 'unknown'
75
+ metadata = { ...metadata, statusFrom: statusChange.statusFrom, statusTo: statusChange.statusTo }
76
+ }
77
+ // When both are null (e.g. Create return/shipment/payment with non-document snapshot), keep as action and use actionLabel
67
78
  }
68
79
  const actorLabel = log.actorUserId
69
80
  ? (displayUsers?.[log.actorUserId] ?? log.actorUserId)
@@ -158,43 +158,48 @@ export function makeSalesLineRoute(config: SalesLineRouteConfig) {
158
158
  list: {
159
159
  schema: listSchema,
160
160
  entityId,
161
- fields: [
162
- F.id,
163
- parentFkColumn,
164
- F.line_number,
165
- F.kind,
166
- F.status_entry_id,
167
- F.status,
168
- F.product_id,
169
- F.product_variant_id,
170
- F.catalog_snapshot,
171
- F.name,
172
- F.description,
173
- F.comment,
174
- F.organization_id,
175
- F.tenant_id,
176
- F.quantity,
177
- F.quantity_unit,
178
- F.normalized_quantity,
179
- F.normalized_unit,
180
- F.uom_snapshot,
181
- F.currency_code,
182
- F.unit_price_net,
183
- F.unit_price_gross,
184
- F.discount_amount,
185
- F.discount_percent,
186
- F.tax_rate,
187
- F.tax_amount,
188
- F.total_net_amount,
189
- F.total_gross_amount,
190
- F.configuration,
191
- F.promotion_code,
192
- F.promotion_snapshot,
193
- F.metadata,
194
- F.custom_field_set_id,
195
- F.created_at,
196
- F.updated_at,
197
- ],
161
+ fields: (() => {
162
+ const fields: string[] = [
163
+ F.id,
164
+ parentFkColumn,
165
+ F.line_number,
166
+ F.kind,
167
+ F.status_entry_id,
168
+ F.status,
169
+ F.product_id,
170
+ F.product_variant_id,
171
+ F.catalog_snapshot,
172
+ F.name,
173
+ F.description,
174
+ F.comment,
175
+ F.organization_id,
176
+ F.tenant_id,
177
+ F.quantity,
178
+ F.quantity_unit,
179
+ F.normalized_quantity,
180
+ F.normalized_unit,
181
+ F.uom_snapshot,
182
+ F.currency_code,
183
+ F.unit_price_net,
184
+ F.unit_price_gross,
185
+ F.discount_amount,
186
+ F.discount_percent,
187
+ F.tax_rate,
188
+ F.tax_amount,
189
+ F.total_net_amount,
190
+ F.total_gross_amount,
191
+ F.configuration,
192
+ F.promotion_code,
193
+ F.promotion_snapshot,
194
+ F.metadata,
195
+ F.custom_field_set_id,
196
+ F.created_at,
197
+ F.updated_at,
198
+ ]
199
+ const returnedQuantity = F['returned_quantity']
200
+ if (typeof returnedQuantity === 'string') fields.push(returnedQuantity)
201
+ return fields
202
+ })(),
198
203
  sortFieldMap: {
199
204
  createdAt: F.created_at,
200
205
  updatedAt: F.updated_at,