@spaceinvoices/react-ui 0.4.3 → 0.4.4

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 (218) hide show
  1. package/cli/dist/index.js +1 -1
  2. package/package.json +1 -1
  3. package/src/common/autocomplete.tsx +18 -2
  4. package/src/components/advance-invoices/create/create-advance-invoice-form.tsx +0 -1
  5. package/src/components/advance-invoices/create/locales/de.ts +2 -0
  6. package/src/components/advance-invoices/create/locales/es.ts +2 -0
  7. package/src/components/advance-invoices/create/locales/fr.ts +2 -0
  8. package/src/components/advance-invoices/create/locales/hr.ts +1 -0
  9. package/src/components/advance-invoices/create/locales/it.ts +2 -0
  10. package/src/components/advance-invoices/create/locales/nl.ts +2 -0
  11. package/src/components/advance-invoices/create/locales/pl.ts +1 -0
  12. package/src/components/advance-invoices/create/locales/pt.ts +1 -0
  13. package/src/components/advance-invoices/create/locales/sl.ts +1 -0
  14. package/src/components/advance-invoices/create/prepare-advance-invoice-submission.ts +0 -1
  15. package/src/components/advance-invoices/list/list-table.tsx +80 -50
  16. package/src/components/advance-invoices/list/locales/de.ts +5 -0
  17. package/src/components/advance-invoices/list/locales/en.ts +4 -0
  18. package/src/components/advance-invoices/list/locales/es.ts +5 -0
  19. package/src/components/advance-invoices/list/locales/fr.ts +5 -0
  20. package/src/components/advance-invoices/list/locales/hr.ts +5 -0
  21. package/src/components/advance-invoices/list/locales/it.ts +5 -0
  22. package/src/components/advance-invoices/list/locales/nl.ts +5 -0
  23. package/src/components/advance-invoices/list/locales/pl.ts +5 -0
  24. package/src/components/advance-invoices/list/locales/pt.ts +5 -0
  25. package/src/components/advance-invoices/list/locales/sl.ts +5 -0
  26. package/src/components/credit-notes/create/create-credit-note-form.tsx +114 -3
  27. package/src/components/credit-notes/create/locales/de.ts +2 -0
  28. package/src/components/credit-notes/create/locales/es.ts +2 -0
  29. package/src/components/credit-notes/create/locales/fr.ts +2 -0
  30. package/src/components/credit-notes/create/locales/hr.ts +1 -0
  31. package/src/components/credit-notes/create/locales/it.ts +2 -0
  32. package/src/components/credit-notes/create/locales/nl.ts +2 -0
  33. package/src/components/credit-notes/create/locales/pl.ts +1 -0
  34. package/src/components/credit-notes/create/locales/pt.ts +1 -0
  35. package/src/components/credit-notes/create/locales/sl.ts +1 -0
  36. package/src/components/credit-notes/credit-notes.hooks.ts +30 -0
  37. package/src/components/credit-notes/list/list-table.tsx +77 -30
  38. package/src/components/credit-notes/list/locales/de.ts +5 -0
  39. package/src/components/credit-notes/list/locales/en.ts +4 -0
  40. package/src/components/credit-notes/list/locales/es.ts +5 -0
  41. package/src/components/credit-notes/list/locales/fr.ts +5 -0
  42. package/src/components/credit-notes/list/locales/hr.ts +5 -0
  43. package/src/components/credit-notes/list/locales/it.ts +5 -0
  44. package/src/components/credit-notes/list/locales/nl.ts +5 -0
  45. package/src/components/credit-notes/list/locales/pl.ts +5 -0
  46. package/src/components/credit-notes/list/locales/pt.ts +5 -0
  47. package/src/components/credit-notes/list/locales/sl.ts +5 -0
  48. package/src/components/customers/customer-list-table/customer-list-table.tsx +0 -3
  49. package/src/components/customers/customer-list-table/locales/de.ts +1 -0
  50. package/src/components/customers/customer-list-table/locales/es.ts +1 -0
  51. package/src/components/customers/customer-list-table/locales/fr.ts +1 -0
  52. package/src/components/customers/customer-list-table/locales/hr.ts +1 -0
  53. package/src/components/customers/customer-list-table/locales/it.ts +1 -0
  54. package/src/components/customers/customer-list-table/locales/nl.ts +1 -0
  55. package/src/components/customers/customer-list-table/locales/pl.ts +1 -0
  56. package/src/components/customers/customer-list-table/locales/pt.ts +1 -0
  57. package/src/components/customers/customer-list-table/locales/sl.ts +1 -0
  58. package/src/components/delivery-notes/list/list-row-actions.tsx +20 -1
  59. package/src/components/delivery-notes/list/list-table.tsx +41 -8
  60. package/src/components/delivery-notes/list/locales/de.ts +4 -0
  61. package/src/components/delivery-notes/list/locales/en.ts +2 -0
  62. package/src/components/delivery-notes/list/locales/es.ts +4 -0
  63. package/src/components/delivery-notes/list/locales/fr.ts +4 -0
  64. package/src/components/delivery-notes/list/locales/hr.ts +4 -0
  65. package/src/components/delivery-notes/list/locales/it.ts +4 -0
  66. package/src/components/delivery-notes/list/locales/nl.ts +4 -0
  67. package/src/components/delivery-notes/list/locales/pl.ts +4 -0
  68. package/src/components/delivery-notes/list/locales/pt.ts +4 -0
  69. package/src/components/delivery-notes/list/locales/sl.ts +4 -0
  70. package/src/components/documents/create/document-details-section.tsx +41 -27
  71. package/src/components/documents/create/linked-documents-info.tsx +82 -0
  72. package/src/components/documents/create/live-preview.tsx +1 -1
  73. package/src/components/documents/types.ts +2 -2
  74. package/src/components/documents/view/document-activities-list.tsx +65 -47
  75. package/src/components/documents/view/document-details-card.tsx +99 -74
  76. package/src/components/documents/view/document-payments-list.tsx +99 -65
  77. package/src/components/documents/view/document-relations-list.tsx +43 -28
  78. package/src/components/documents/view/document-sidebar.tsx +151 -0
  79. package/src/components/documents/view/index.ts +2 -0
  80. package/src/components/documents/view/locales/de.ts +2 -0
  81. package/src/components/documents/view/locales/es.ts +2 -0
  82. package/src/components/documents/view/locales/fr.ts +2 -0
  83. package/src/components/documents/view/locales/hr.ts +2 -0
  84. package/src/components/documents/view/locales/it.ts +2 -0
  85. package/src/components/documents/view/locales/nl.ts +2 -0
  86. package/src/components/documents/view/locales/pl.ts +2 -0
  87. package/src/components/documents/view/locales/pt.ts +2 -0
  88. package/src/components/documents/view/locales/sl.ts +2 -0
  89. package/src/components/documents/view/use-document-download.ts +3 -2
  90. package/src/components/entities/create-entity-form.tsx +165 -13
  91. package/src/components/entities/entity-settings-form/entity-settings-form.tsx +101 -1
  92. package/src/components/entities/entity-settings-form/locales/de.ts +9 -0
  93. package/src/components/entities/entity-settings-form/locales/es.ts +9 -0
  94. package/src/components/entities/entity-settings-form/locales/fr.ts +9 -0
  95. package/src/components/entities/entity-settings-form/locales/hr.ts +9 -0
  96. package/src/components/entities/entity-settings-form/locales/it.ts +9 -0
  97. package/src/components/entities/entity-settings-form/locales/nl.ts +9 -0
  98. package/src/components/entities/entity-settings-form/locales/pl.ts +9 -0
  99. package/src/components/entities/entity-settings-form/locales/pt.ts +9 -0
  100. package/src/components/entities/entity-settings-form/locales/sl.ts +9 -0
  101. package/src/components/entities/fina-settings-form/fina-settings-form.tsx +6 -6
  102. package/src/components/entities/fina-settings-form/locales/de.ts +2 -2
  103. package/src/components/entities/fina-settings-form/locales/en.ts +2 -2
  104. package/src/components/entities/fina-settings-form/locales/es.ts +2 -2
  105. package/src/components/entities/fina-settings-form/locales/fr.ts +2 -2
  106. package/src/components/entities/fina-settings-form/locales/hr.ts +2 -2
  107. package/src/components/entities/fina-settings-form/locales/it.ts +2 -2
  108. package/src/components/entities/fina-settings-form/locales/nl.ts +2 -2
  109. package/src/components/entities/fina-settings-form/locales/pl.ts +2 -2
  110. package/src/components/entities/fina-settings-form/locales/pt.ts +2 -2
  111. package/src/components/entities/fina-settings-form/locales/sl.ts +2 -2
  112. package/src/components/entities/furs-settings-form/locales/en.ts +0 -1
  113. package/src/components/entities/settings/pdf-template-selector/locales/de.ts +3 -1
  114. package/src/components/entities/settings/pdf-template-selector/locales/es.ts +3 -1
  115. package/src/components/entities/settings/pdf-template-selector/locales/fr.ts +4 -1
  116. package/src/components/entities/settings/pdf-template-selector/locales/hr.ts +4 -1
  117. package/src/components/entities/settings/pdf-template-selector/locales/it.ts +3 -1
  118. package/src/components/entities/settings/pdf-template-selector/locales/nl.ts +3 -1
  119. package/src/components/entities/settings/pdf-template-selector/locales/pl.ts +3 -1
  120. package/src/components/entities/settings/pdf-template-selector/locales/pt.ts +3 -1
  121. package/src/components/entities/settings/pdf-template-selector/locales/sl.ts +3 -1
  122. package/src/components/entities/settings/pdf-template-selector/pdf-template-cards.tsx +1 -0
  123. package/src/components/estimates/create/create-estimate-form.tsx +29 -2
  124. package/src/components/estimates/list/list-table.tsx +3 -6
  125. package/src/components/estimates/list/locales/de.ts +1 -0
  126. package/src/components/estimates/list/locales/es.ts +1 -0
  127. package/src/components/estimates/list/locales/fr.ts +1 -0
  128. package/src/components/estimates/list/locales/hr.ts +1 -0
  129. package/src/components/estimates/list/locales/it.ts +1 -0
  130. package/src/components/estimates/list/locales/nl.ts +1 -0
  131. package/src/components/estimates/list/locales/pl.ts +1 -0
  132. package/src/components/estimates/list/locales/pt.ts +1 -0
  133. package/src/components/estimates/list/locales/sl.ts +1 -0
  134. package/src/components/export/document-export-form.tsx +9 -2
  135. package/src/components/export/index.ts +2 -0
  136. package/src/components/export/sales-per-item-export-form.tsx +223 -0
  137. package/src/components/invoices/create/create-invoice-form.tsx +48 -1
  138. package/src/components/invoices/create/locales/de.ts +11 -0
  139. package/src/components/invoices/create/locales/es.ts +11 -0
  140. package/src/components/invoices/create/locales/fr.ts +11 -0
  141. package/src/components/invoices/create/locales/hr.ts +10 -0
  142. package/src/components/invoices/create/locales/it.ts +11 -0
  143. package/src/components/invoices/create/locales/nl.ts +11 -0
  144. package/src/components/invoices/create/locales/pl.ts +10 -0
  145. package/src/components/invoices/create/locales/pt.ts +10 -0
  146. package/src/components/invoices/create/locales/sl.ts +10 -0
  147. package/src/components/invoices/invoices-furs.hooks.ts +4 -1
  148. package/src/components/invoices/list/list-table.tsx +77 -31
  149. package/src/components/invoices/list/locales/de.ts +5 -0
  150. package/src/components/invoices/list/locales/en.ts +4 -0
  151. package/src/components/invoices/list/locales/es.ts +5 -0
  152. package/src/components/invoices/list/locales/fr.ts +5 -0
  153. package/src/components/invoices/list/locales/hr.ts +5 -0
  154. package/src/components/invoices/list/locales/it.ts +5 -0
  155. package/src/components/invoices/list/locales/nl.ts +5 -0
  156. package/src/components/invoices/list/locales/pl.ts +5 -0
  157. package/src/components/invoices/list/locales/pt.ts +5 -0
  158. package/src/components/invoices/list/locales/sl.ts +5 -0
  159. package/src/components/invoices/view/fiscalization-status-card.tsx +42 -24
  160. package/src/components/items/item-combobox.tsx +5 -3
  161. package/src/components/items/item-list-table/item-list-header.tsx +4 -17
  162. package/src/components/items/item-list-table/item-list-table.tsx +3 -3
  163. package/src/components/items/item-list-table/locales/de.ts +1 -0
  164. package/src/components/items/item-list-table/locales/es.ts +1 -0
  165. package/src/components/items/item-list-table/locales/fr.ts +1 -0
  166. package/src/components/items/item-list-table/locales/hr.ts +1 -0
  167. package/src/components/items/item-list-table/locales/it.ts +1 -0
  168. package/src/components/items/item-list-table/locales/nl.ts +1 -0
  169. package/src/components/items/item-list-table/locales/pl.ts +1 -0
  170. package/src/components/items/item-list-table/locales/pt.ts +1 -0
  171. package/src/components/items/item-list-table/locales/sl.ts +1 -0
  172. package/src/components/payments/list/list-table.tsx +0 -4
  173. package/src/components/payments/list/locales/de.ts +1 -0
  174. package/src/components/payments/list/locales/es.ts +1 -0
  175. package/src/components/payments/list/locales/fr.ts +1 -0
  176. package/src/components/payments/list/locales/hr.ts +1 -0
  177. package/src/components/payments/list/locales/it.ts +1 -0
  178. package/src/components/payments/list/locales/nl.ts +1 -0
  179. package/src/components/payments/list/locales/pl.ts +1 -0
  180. package/src/components/payments/list/locales/pt.ts +1 -0
  181. package/src/components/payments/list/locales/sl.ts +1 -0
  182. package/src/components/recurring-invoices/list/list-table.tsx +0 -7
  183. package/src/components/recurring-invoices/list/locales/de.ts +1 -0
  184. package/src/components/recurring-invoices/list/locales/es.ts +1 -0
  185. package/src/components/recurring-invoices/list/locales/fr.ts +1 -0
  186. package/src/components/recurring-invoices/list/locales/hr.ts +1 -0
  187. package/src/components/recurring-invoices/list/locales/it.ts +1 -0
  188. package/src/components/recurring-invoices/list/locales/nl.ts +1 -0
  189. package/src/components/recurring-invoices/list/locales/pl.ts +1 -0
  190. package/src/components/recurring-invoices/list/locales/pt.ts +1 -0
  191. package/src/components/recurring-invoices/list/locales/sl.ts +1 -0
  192. package/src/components/request-logs/request-log-list-table.tsx +0 -3
  193. package/src/components/table/README.md +14 -121
  194. package/src/components/table/data-table.tsx +22 -37
  195. package/src/components/table/hooks/use-table-state.ts +3 -27
  196. package/src/components/table/index.ts +0 -2
  197. package/src/components/table/selection-toolbar.tsx +35 -1
  198. package/src/components/table/table-empty-state.tsx +6 -3
  199. package/src/components/table/table-no-results.tsx +10 -5
  200. package/src/components/table/types.ts +0 -5
  201. package/src/components/taxes/tax-list-table/locales/de.ts +1 -0
  202. package/src/components/taxes/tax-list-table/locales/es.ts +1 -0
  203. package/src/components/taxes/tax-list-table/locales/fr.ts +1 -0
  204. package/src/components/taxes/tax-list-table/locales/hr.ts +1 -0
  205. package/src/components/taxes/tax-list-table/locales/it.ts +1 -0
  206. package/src/components/taxes/tax-list-table/locales/nl.ts +1 -0
  207. package/src/components/taxes/tax-list-table/locales/pl.ts +1 -0
  208. package/src/components/taxes/tax-list-table/locales/pt.ts +1 -0
  209. package/src/components/taxes/tax-list-table/locales/sl.ts +1 -0
  210. package/src/components/taxes/tax-list-table/tax-list-header.tsx +3 -14
  211. package/src/components/taxes/tax-list-table/tax-list-table.tsx +3 -3
  212. package/src/components/ui/popover.tsx +3 -1
  213. package/src/components/ui/tooltip.tsx +3 -1
  214. package/src/generated/schemas/index.ts +1 -1
  215. package/src/hooks/use-duplicate-document.ts +40 -5
  216. package/src/lib/fiscalization.ts +12 -0
  217. package/src/lib/schemas/advance-invoice.ts +0 -1
  218. package/src/components/table/sortable-header.tsx +0 -56
@@ -22,4 +22,5 @@ export default {
22
22
  "No results found": "No se encontraron clientes",
23
23
  "Try adjusting your search criteria": "Intente ajustar sus criterios de busqueda",
24
24
  "Clear search": "Limpiar busqueda",
25
+ "Clear all": "Borrar todo",
25
26
  } as const;
@@ -22,4 +22,5 @@ export default {
22
22
  "No results found": "Aucun client trouve",
23
23
  "Try adjusting your search criteria": "Essayez de modifier vos criteres de recherche",
24
24
  "Clear search": "Effacer la recherche",
25
+ "Clear all": "Tout effacer",
25
26
  } as const;
@@ -22,4 +22,5 @@ export default {
22
22
  "No results found": "Nije pronadjen nijedan kupac",
23
23
  "Try adjusting your search criteria": "Pokusajte prilagoditi kriterije pretrazivanja",
24
24
  "Clear search": "Ocisti pretragu",
25
+ "Clear all": "Očisti sve",
25
26
  } as const;
@@ -22,4 +22,5 @@ export default {
22
22
  "No results found": "Nessun cliente trovato",
23
23
  "Try adjusting your search criteria": "Prova a modificare i criteri di ricerca",
24
24
  "Clear search": "Cancella ricerca",
25
+ "Clear all": "Cancella tutto",
25
26
  } as const;
@@ -22,4 +22,5 @@ export default {
22
22
  "No results found": "Geen klanten gevonden",
23
23
  "Try adjusting your search criteria": "Probeer uw zoekcriteria aan te passen",
24
24
  "Clear search": "Zoekopdracht wissen",
25
+ "Clear all": "Alles wissen",
25
26
  } as const;
@@ -22,4 +22,5 @@ export default {
22
22
  "No results found": "Nie znaleziono klientow",
23
23
  "Try adjusting your search criteria": "Sprobuj dostosowac kryteria wyszukiwania",
24
24
  "Clear search": "Wyczysc wyszukiwanie",
25
+ "Clear all": "Wyczyść wszystko",
25
26
  } as const;
@@ -22,4 +22,5 @@ export default {
22
22
  "No results found": "Nenhum cliente encontrado",
23
23
  "Try adjusting your search criteria": "Tente ajustar os seus criterios de pesquisa",
24
24
  "Clear search": "Limpar pesquisa",
25
+ "Clear all": "Limpar tudo",
25
26
  } as const;
@@ -22,4 +22,5 @@ export default {
22
22
  "No results found": "Ni najdenih strank",
23
23
  "Try adjusting your search criteria": "Poskusite prilagoditi iskalne kriterije",
24
24
  "Clear search": "Počisti iskanje",
25
+ "Clear all": "Počisti vse",
25
26
  } as const;
@@ -1,6 +1,6 @@
1
1
  import type { DeliveryNote } from "@spaceinvoices/js-sdk";
2
2
 
3
- import { Copy, Download, Eye, Link2Off, Loader2, MoreHorizontal } from "lucide-react";
3
+ import { Ban, Copy, Download, Eye, Link2Off, Loader2, MoreHorizontal } from "lucide-react";
4
4
  import { Button } from "@/ui/components/ui/button";
5
5
  import {
6
6
  DropdownMenu,
@@ -24,6 +24,8 @@ type DeliveryNoteListRowActionsProps = {
24
24
  onDownloadError?: (error: string) => void;
25
25
  onUnshare?: (deliveryNote: DeliveryNote) => Promise<void>;
26
26
  isUnsharing?: boolean;
27
+ onVoid?: (deliveryNote: DeliveryNote) => void;
28
+ isVoiding?: boolean;
27
29
  } & ComponentTranslationProps;
28
30
 
29
31
  export default function DeliveryNoteListRowActions({
@@ -35,6 +37,8 @@ export default function DeliveryNoteListRowActions({
35
37
  onDownloadError,
36
38
  onUnshare,
37
39
  isUnsharing,
40
+ onVoid,
41
+ isVoiding,
38
42
  ...i18nProps
39
43
  }: DeliveryNoteListRowActionsProps) {
40
44
  const t = createTranslation(i18nProps);
@@ -82,6 +86,21 @@ export default function DeliveryNoteListRowActions({
82
86
  </DropdownMenuItem>
83
87
  )}
84
88
  </DropdownMenuGroup>
89
+ {onVoid && !deliveryNote.voided_at && !(deliveryNote as any).is_draft && (
90
+ <>
91
+ <DropdownMenuSeparator />
92
+ <DropdownMenuGroup>
93
+ <DropdownMenuItem
94
+ className="cursor-pointer text-destructive focus:text-destructive"
95
+ onClick={() => onVoid(deliveryNote)}
96
+ disabled={isVoiding}
97
+ >
98
+ {isVoiding ? <Loader2 className="h-4 w-4 animate-spin" /> : <Ban className="h-4 w-4" />}
99
+ {t("Void")}
100
+ </DropdownMenuItem>
101
+ </DropdownMenuGroup>
102
+ </>
103
+ )}
85
104
  {deliveryNote.shareable_id && onUnshare && (
86
105
  <>
87
106
  <DropdownMenuSeparator />
@@ -52,6 +52,10 @@ type DeliveryNoteListTableProps = {
52
52
  onDownloadSuccess?: (fileName: string) => void;
53
53
  onDownloadError?: (error: string) => void;
54
54
  onExportSelected?: (documentIds: string[]) => void;
55
+ onCopyToInvoice?: (documentIds: string[]) => void;
56
+ onCreateNew?: () => void;
57
+ onVoid?: (deliveryNote: DeliveryNote) => void;
58
+ isVoiding?: boolean;
55
59
  } & ListTableProps<DeliveryNote>;
56
60
 
57
61
  export default function DeliveryNoteListTable({
@@ -65,6 +69,10 @@ export default function DeliveryNoteListTable({
65
69
  onDownloadSuccess,
66
70
  onDownloadError,
67
71
  onExportSelected,
72
+ onCopyToInvoice,
73
+ onCreateNew,
74
+ onVoid,
75
+ isVoiding,
68
76
  ...i18nProps
69
77
  }: DeliveryNoteListTableProps) {
70
78
  const t = createTranslation({
@@ -84,9 +92,9 @@ export default function DeliveryNoteListTable({
84
92
  limit: params.limit,
85
93
  next_cursor: params.next_cursor,
86
94
  prev_cursor: params.prev_cursor,
87
- order_by: params.order_by,
88
95
  search: params.search,
89
96
  query: params.query,
97
+ include: "document_relations",
90
98
  });
91
99
  return response as unknown as TableQueryResponse<DeliveryNote>;
92
100
  }, entityId);
@@ -108,6 +116,12 @@ export default function DeliveryNoteListTable({
108
116
  }
109
117
  }, [selectedIds, onExportSelected]);
110
118
 
119
+ const handleCopyToInvoice = useCallback(() => {
120
+ if (selectedIds.size > 0 && onCopyToInvoice) {
121
+ onCopyToInvoice(Array.from(selectedIds));
122
+ }
123
+ }, [selectedIds, onCopyToInvoice]);
124
+
111
125
  const handleDeselectAll = useCallback(() => {
112
126
  setSelectedIds(new Set());
113
127
  }, []);
@@ -117,11 +131,12 @@ export default function DeliveryNoteListTable({
117
131
  <SelectionToolbar
118
132
  selectedCount={count}
119
133
  onExportPdfs={onExportSelected ? handleExportPdfs : undefined}
134
+ onCopyToInvoice={onCopyToInvoice ? handleCopyToInvoice : undefined}
120
135
  onDeselectAll={handleDeselectAll}
121
136
  t={t}
122
137
  />
123
138
  ),
124
- [handleExportPdfs, handleDeselectAll, onExportSelected, t],
139
+ [handleExportPdfs, handleCopyToInvoice, handleDeselectAll, onExportSelected, onCopyToInvoice, t],
125
140
  );
126
141
 
127
142
  const columns: Column<DeliveryNote>[] = useMemo(
@@ -129,7 +144,6 @@ export default function DeliveryNoteListTable({
129
144
  {
130
145
  id: "number",
131
146
  header: t("Number"),
132
- sortable: true,
133
147
  cell: (deliveryNote) => (
134
148
  <div className="flex items-center gap-2">
135
149
  <Button variant="link" className="cursor-pointer py-0 underline" onClick={() => onRowClick?.(deliveryNote)}>
@@ -143,6 +157,14 @@ export default function DeliveryNoteListTable({
143
157
  {t("Draft")}
144
158
  </Badge>
145
159
  )}
160
+ {deliveryNote.voided_at && (
161
+ <Badge
162
+ variant="outline"
163
+ className="border-red-500 bg-red-50 text-red-700 dark:bg-red-950 dark:text-red-400"
164
+ >
165
+ {t("Voided")}
166
+ </Badge>
167
+ )}
146
168
  </div>
147
169
  ),
148
170
  },
@@ -154,20 +176,17 @@ export default function DeliveryNoteListTable({
154
176
  {
155
177
  id: "date",
156
178
  header: t("Date"),
157
- sortable: true,
158
179
  cell: (deliveryNote) => <FormattedDate date={deliveryNote.date} />,
159
180
  },
160
181
  {
161
182
  id: "total",
162
183
  header: t("Total"),
163
- sortable: true,
164
184
  align: "right",
165
185
  cell: (deliveryNote) => deliveryNote.total,
166
186
  },
167
187
  {
168
188
  id: "total_with_tax",
169
189
  header: t("Total with Tax"),
170
- sortable: true,
171
190
  align: "right",
172
191
  cell: (deliveryNote) => deliveryNote.total_with_tax,
173
192
  },
@@ -183,13 +202,26 @@ export default function DeliveryNoteListTable({
183
202
  onDownloadStart={onDownloadStart}
184
203
  onDownloadSuccess={onDownloadSuccess}
185
204
  onDownloadError={onDownloadError}
205
+ onVoid={onVoid}
206
+ isVoiding={isVoiding}
186
207
  t={t}
187
208
  locale={i18nProps.locale}
188
209
  />
189
210
  ),
190
211
  },
191
212
  ],
192
- [t, onRowClick, onView, onDuplicate, onDownloadStart, onDownloadSuccess, onDownloadError, i18nProps.locale],
213
+ [
214
+ t,
215
+ onRowClick,
216
+ onView,
217
+ onDuplicate,
218
+ onDownloadStart,
219
+ onDownloadSuccess,
220
+ onDownloadError,
221
+ onVoid,
222
+ isVoiding,
223
+ i18nProps.locale,
224
+ ],
193
225
  );
194
226
 
195
227
  return (
@@ -201,11 +233,12 @@ export default function DeliveryNoteListTable({
201
233
  cacheKey="delivery-notes"
202
234
  resourceName="delivery note"
203
235
  createNewLink={entityId ? `/app/${entityId}/documents/add/delivery_note` : undefined}
236
+ onCreateNew={onCreateNew}
204
237
  entityId={entityId}
205
238
  filterConfig={filterConfig}
206
239
  t={t}
207
240
  locale={i18nProps.locale}
208
- selectable={!!onExportSelected}
241
+ selectable={!!(onExportSelected || onCopyToInvoice)}
209
242
  selectedIds={selectedIds}
210
243
  onSelectionChange={setSelectedIds}
211
244
  selectionToolbar={selectionToolbar}
@@ -6,4 +6,8 @@ export default {
6
6
  selected: "ausgewählt",
7
7
  "Export PDFs": "PDFs exportieren",
8
8
  "Deselect all": "Alle abwählen",
9
+ "Copy to Invoice": "In Rechnung kopieren",
10
+ "Clear all": "Alles zurücksetzen",
11
+ Void: "Stornieren",
12
+ Voided: "Storniert",
9
13
  } as const;
@@ -8,4 +8,6 @@ export default {
8
8
  selected: "selected",
9
9
  "Export PDFs": "Export PDFs",
10
10
  "Deselect all": "Deselect all",
11
+ "Copy to Invoice": "Copy to Invoice",
12
+ Void: "Void",
11
13
  } as const;
@@ -6,4 +6,8 @@ export default {
6
6
  selected: "seleccionados",
7
7
  "Export PDFs": "Exportar PDFs",
8
8
  "Deselect all": "Deseleccionar todo",
9
+ "Copy to Invoice": "Copiar a factura",
10
+ "Clear all": "Borrar todo",
11
+ Void: "Anular",
12
+ Voided: "Anulado",
9
13
  } as const;
@@ -6,4 +6,8 @@ export default {
6
6
  selected: "sélectionnés",
7
7
  "Export PDFs": "Exporter les PDFs",
8
8
  "Deselect all": "Tout désélectionner",
9
+ "Copy to Invoice": "Copier vers facture",
10
+ "Clear all": "Tout effacer",
11
+ Void: "Annuler",
12
+ Voided: "Annulé",
9
13
  } as const;
@@ -6,4 +6,8 @@ export default {
6
6
  selected: "odabranih",
7
7
  "Export PDFs": "Izvezi PDF-ove",
8
8
  "Deselect all": "Poništi odabir",
9
+ "Copy to Invoice": "Kopiraj u račun",
10
+ "Clear all": "Očisti sve",
11
+ Void: "Storniraj",
12
+ Voided: "Poništeno",
9
13
  } as const;
@@ -6,4 +6,8 @@ export default {
6
6
  selected: "selezionati",
7
7
  "Export PDFs": "Esporta PDF",
8
8
  "Deselect all": "Deseleziona tutto",
9
+ "Copy to Invoice": "Copia in fattura",
10
+ "Clear all": "Cancella tutto",
11
+ Void: "Annulla",
12
+ Voided: "Annullato",
9
13
  } as const;
@@ -6,4 +6,8 @@ export default {
6
6
  selected: "geselecteerd",
7
7
  "Export PDFs": "PDFs exporteren",
8
8
  "Deselect all": "Alles deselecteren",
9
+ "Copy to Invoice": "Kopieer naar factuur",
10
+ "Clear all": "Alles wissen",
11
+ Void: "Nietig verklaren",
12
+ Voided: "Ongeldig verklaard",
9
13
  } as const;
@@ -6,4 +6,8 @@ export default {
6
6
  selected: "wybranych",
7
7
  "Export PDFs": "Eksportuj PDF-y",
8
8
  "Deselect all": "Odznacz wszystko",
9
+ "Copy to Invoice": "Kopiuj do faktury",
10
+ "Clear all": "Wyczyść wszystko",
11
+ Void: "Anuluj",
12
+ Voided: "Anulowana",
9
13
  } as const;
@@ -6,4 +6,8 @@ export default {
6
6
  selected: "selecionados",
7
7
  "Export PDFs": "Exportar PDFs",
8
8
  "Deselect all": "Desmarcar tudo",
9
+ "Copy to Invoice": "Copiar para fatura",
10
+ "Clear all": "Limpar tudo",
11
+ Void: "Anular",
12
+ Voided: "Anulado",
9
13
  } as const;
@@ -6,4 +6,8 @@ export default {
6
6
  selected: "izbranih",
7
7
  "Export PDFs": "Izvozi PDF-je",
8
8
  "Deselect all": "Počisti izbor",
9
+ "Copy to Invoice": "Kopiraj v račun",
10
+ "Clear all": "Počisti vse",
11
+ Void: "Storniraj",
12
+ Voided: "Stornirano",
9
13
  } as const;
@@ -84,11 +84,9 @@ export function DocumentDetailsSection({
84
84
  }: DocumentDetailsSectionProps) {
85
85
  // Determine the date field name based on document type
86
86
  // Delivery notes don't have a secondary date field
87
- const hasSecondaryDate = documentType !== "delivery_note";
88
- const dateFieldName =
89
- documentType === "invoice" || documentType === "advance_invoice" ? "date_due" : "date_valid_till";
90
- const dateFieldLabel =
91
- documentType === "invoice" || documentType === "advance_invoice" ? t("Due Date") : t("Valid Until");
87
+ const hasSecondaryDate = documentType !== "delivery_note" && documentType !== "advance_invoice";
88
+ const dateFieldName = documentType === "invoice" ? "date_due" : "date_valid_till";
89
+ const dateFieldLabel = documentType === "invoice" ? t("Due Date") : t("Valid Until");
92
90
 
93
91
  // Check if FURS/FINA inline should show premise/device selects
94
92
  const showFursSelects = fursInline && !fursInline.isSkipped;
@@ -216,28 +214,44 @@ export function DocumentDetailsSection({
216
214
  render={({ field }) => (
217
215
  <FormItem>
218
216
  <FormLabel className="">{t("Date")} *</FormLabel>
219
- <Popover>
220
- <PopoverTrigger asChild>
221
- <FormControl>
222
- <Button
223
- variant="outline"
224
- className={cn("w-full pl-3 text-left font-normal", !field.value && "text-muted-foreground")}
225
- >
226
- {field.value ? new Date(field.value).toLocaleDateString() : <span>{t("Pick a date")}</span>}
227
- <CalendarIcon className="ml-auto h-4 w-4 opacity-50" />
228
- </Button>
229
- </FormControl>
230
- </PopoverTrigger>
231
- <PopoverContent className="w-auto p-0" align="start">
232
- <Calendar
233
- mode="single"
234
- selected={field.value ? new Date(field.value) : undefined}
235
- onSelect={(date) => field.onChange(date?.toISOString())}
236
- disabled={(date) => date > new Date() || date < new Date("1900-01-01")}
237
- initialFocus
238
- />
239
- </PopoverContent>
240
- </Popover>
217
+ {showFinaSelects ? (
218
+ <Tooltip>
219
+ <TooltipTrigger asChild>
220
+ <FormControl>
221
+ <Button variant="outline" disabled className="w-full pl-3 text-left font-normal">
222
+ {new Date().toLocaleDateString()}
223
+ <CalendarIcon className="ml-auto h-4 w-4 opacity-50" />
224
+ </Button>
225
+ </FormControl>
226
+ </TooltipTrigger>
227
+ <TooltipContent>
228
+ <p>{t("FINA fiscalized invoices always use the current date")}</p>
229
+ </TooltipContent>
230
+ </Tooltip>
231
+ ) : (
232
+ <Popover>
233
+ <PopoverTrigger asChild>
234
+ <FormControl>
235
+ <Button
236
+ variant="outline"
237
+ className={cn("w-full pl-3 text-left font-normal", !field.value && "text-muted-foreground")}
238
+ >
239
+ {field.value ? new Date(field.value).toLocaleDateString() : <span>{t("Pick a date")}</span>}
240
+ <CalendarIcon className="ml-auto h-4 w-4 opacity-50" />
241
+ </Button>
242
+ </FormControl>
243
+ </PopoverTrigger>
244
+ <PopoverContent className="w-auto p-0" align="start">
245
+ <Calendar
246
+ mode="single"
247
+ selected={field.value ? new Date(field.value) : undefined}
248
+ onSelect={(date) => field.onChange(date?.toISOString())}
249
+ disabled={(date) => date > new Date() || date < new Date("1900-01-01")}
250
+ initialFocus
251
+ />
252
+ </PopoverContent>
253
+ </Popover>
254
+ )}
241
255
  <FormMessage />
242
256
  </FormItem>
243
257
  )}
@@ -0,0 +1,82 @@
1
+ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/ui/components/ui/table";
2
+
3
+ export type LinkedDocumentSummary = {
4
+ id: string;
5
+ type: string;
6
+ number: string;
7
+ date: string;
8
+ total_with_tax: number;
9
+ currency_code: string;
10
+ };
11
+
12
+ type LinkedDocumentsInfoProps = {
13
+ documents: LinkedDocumentSummary[];
14
+ locale: string;
15
+ t: (key: string) => string;
16
+ };
17
+
18
+ export function LinkedDocumentsInfo({ documents, locale, t }: LinkedDocumentsInfoProps) {
19
+ if (documents.length === 0) return null;
20
+
21
+ const currencyCode = documents[0].currency_code || "EUR";
22
+
23
+ const formatDate = (dateStr: string) => {
24
+ try {
25
+ return new Date(dateStr).toLocaleDateString(locale, {
26
+ year: "numeric",
27
+ month: "short",
28
+ day: "numeric",
29
+ });
30
+ } catch {
31
+ return dateStr;
32
+ }
33
+ };
34
+
35
+ const formatCurrency = (amount: number) => {
36
+ try {
37
+ return new Intl.NumberFormat(locale, {
38
+ style: "currency",
39
+ currency: currencyCode,
40
+ }).format(amount);
41
+ } catch {
42
+ return `${amount.toFixed(2)} ${currencyCode}`;
43
+ }
44
+ };
45
+
46
+ const typeLabel = (type: string) => {
47
+ const key = {
48
+ delivery_note: "Delivery note",
49
+ invoice: "Invoice",
50
+ estimate: "Estimate",
51
+ credit_note: "Credit note",
52
+ advance_invoice: "Advance invoice",
53
+ }[type];
54
+ return key ? t(key) : type;
55
+ };
56
+
57
+ return (
58
+ <div className="space-y-2">
59
+ <h3 className="font-medium text-muted-foreground text-sm">{t("Linked documents")}</h3>
60
+ <Table>
61
+ <TableHeader>
62
+ <TableRow>
63
+ <TableHead className="h-8 text-xs">{t("Type")}</TableHead>
64
+ <TableHead className="h-8 text-xs">{t("Number")}</TableHead>
65
+ <TableHead className="h-8 text-xs">{t("Date")}</TableHead>
66
+ <TableHead className="h-8 text-right text-xs">{t("Total")}</TableHead>
67
+ </TableRow>
68
+ </TableHeader>
69
+ <TableBody>
70
+ {documents.map((doc) => (
71
+ <TableRow key={doc.id}>
72
+ <TableCell className="py-1.5 text-sm">{typeLabel(doc.type)}</TableCell>
73
+ <TableCell className="py-1.5 text-sm">{doc.number}</TableCell>
74
+ <TableCell className="py-1.5 text-sm">{formatDate(doc.date)}</TableCell>
75
+ <TableCell className="py-1.5 text-right text-sm">{formatCurrency(doc.total_with_tax)}</TableCell>
76
+ </TableRow>
77
+ ))}
78
+ </TableBody>
79
+ </Table>
80
+ </div>
81
+ );
82
+ }
@@ -11,7 +11,7 @@ import { useA4Scaling } from "../shared/use-a4-scaling";
11
11
  import type { DocumentTypes } from "../types";
12
12
  import { filterUnresolvedTaxes } from "./prepare-preview-data";
13
13
 
14
- export type PdfTemplateId = "modern" | "classic" | "minimal" | "fashion";
14
+ export type PdfTemplateId = "modern" | "classic" | "condensed" | "minimal" | "fashion";
15
15
 
16
16
  type LiveInvoicePreviewProps = {
17
17
  data: Partial<CreateInvoiceRequest>;
@@ -46,8 +46,8 @@ export const DOCUMENT_CONFIGS: Record<DocumentTypes, DocumentConfig> = {
46
46
  type: "advance_invoice",
47
47
  apiEndpoint: "advance-invoices",
48
48
  cacheKey: "advance-invoices",
49
- dateFieldName: "date_due",
50
- dateFieldLabel: "Due Date",
49
+ dateFieldName: null,
50
+ dateFieldLabel: null,
51
51
  singularName: "Advance Invoice",
52
52
  pluralName: "Advance Invoices",
53
53
  },