@spaceinvoices/react-ui 0.4.2 → 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 (267) 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 +130 -40
  16. package/src/components/advance-invoices/list/locales/de.ts +6 -0
  17. package/src/components/advance-invoices/list/locales/en.ts +5 -0
  18. package/src/components/advance-invoices/list/locales/es.ts +6 -0
  19. package/src/components/advance-invoices/list/locales/fr.ts +6 -0
  20. package/src/components/advance-invoices/list/locales/hr.ts +6 -0
  21. package/src/components/advance-invoices/list/locales/it.ts +6 -0
  22. package/src/components/advance-invoices/list/locales/nl.ts +6 -0
  23. package/src/components/advance-invoices/list/locales/pl.ts +6 -0
  24. package/src/components/advance-invoices/list/locales/pt.ts +6 -0
  25. package/src/components/advance-invoices/list/locales/sl.ts +6 -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 +111 -36
  38. package/src/components/credit-notes/list/locales/de.ts +6 -1
  39. package/src/components/credit-notes/list/locales/en.ts +6 -0
  40. package/src/components/credit-notes/list/locales/es.ts +6 -1
  41. package/src/components/credit-notes/list/locales/fr.ts +6 -1
  42. package/src/components/credit-notes/list/locales/hr.ts +6 -1
  43. package/src/components/credit-notes/list/locales/it.ts +6 -1
  44. package/src/components/credit-notes/list/locales/nl.ts +6 -1
  45. package/src/components/credit-notes/list/locales/pl.ts +6 -1
  46. package/src/components/credit-notes/list/locales/pt.ts +6 -1
  47. package/src/components/credit-notes/list/locales/sl.ts +6 -1
  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/dashboard/collection-rate-card/use-collection-rate.ts +2 -2
  59. package/src/components/dashboard/invoice-status-chart/use-invoice-status.ts +3 -3
  60. package/src/components/dashboard/payment-methods-chart/use-payment-methods.ts +1 -1
  61. package/src/components/dashboard/payment-trend-chart/use-payment-trend.ts +1 -1
  62. package/src/components/dashboard/revenue-trend-chart/use-revenue-trend.ts +1 -1
  63. package/src/components/dashboard/shared/use-revenue-data.ts +4 -4
  64. package/src/components/dashboard/shared/use-stats-counts.ts +4 -4
  65. package/src/components/dashboard/shared/use-stats-query.ts +1 -1
  66. package/src/components/dashboard/tax-collected-card/use-tax-collected.ts +2 -2
  67. package/src/components/dashboard/top-customers-chart/use-top-customers.ts +1 -1
  68. package/src/components/delivery-notes/create/create-delivery-note-form.tsx +332 -0
  69. package/src/components/delivery-notes/create/locales/de.ts +50 -0
  70. package/src/components/delivery-notes/create/locales/es.ts +49 -0
  71. package/src/components/delivery-notes/create/locales/fr.ts +50 -0
  72. package/src/components/delivery-notes/create/locales/hr.ts +49 -0
  73. package/src/components/delivery-notes/create/locales/it.ts +49 -0
  74. package/src/components/delivery-notes/create/locales/nl.ts +50 -0
  75. package/src/components/delivery-notes/create/locales/pl.ts +49 -0
  76. package/src/components/delivery-notes/create/locales/pt.ts +50 -0
  77. package/src/components/delivery-notes/create/locales/sl.ts +49 -0
  78. package/src/components/delivery-notes/create/prepare-delivery-note-submission.ts +38 -0
  79. package/src/components/delivery-notes/create/use-delivery-note-customer-form.ts +1 -0
  80. package/src/components/delivery-notes/delivery-notes.hooks.ts +15 -0
  81. package/src/components/delivery-notes/list/index.ts +3 -0
  82. package/src/components/delivery-notes/list/list-row-actions.tsx +122 -0
  83. package/src/components/delivery-notes/list/list-table.tsx +247 -0
  84. package/src/components/delivery-notes/list/locales/de.ts +13 -0
  85. package/src/components/delivery-notes/list/locales/en.ts +13 -0
  86. package/src/components/delivery-notes/list/locales/es.ts +13 -0
  87. package/src/components/delivery-notes/list/locales/fr.ts +13 -0
  88. package/src/components/delivery-notes/list/locales/hr.ts +13 -0
  89. package/src/components/delivery-notes/list/locales/it.ts +13 -0
  90. package/src/components/delivery-notes/list/locales/nl.ts +13 -0
  91. package/src/components/delivery-notes/list/locales/pl.ts +13 -0
  92. package/src/components/delivery-notes/list/locales/pt.ts +13 -0
  93. package/src/components/delivery-notes/list/locales/sl.ts +13 -0
  94. package/src/components/delivery-notes/list/use-delivery-note-download.ts +63 -0
  95. package/src/components/documents/create/document-details-section.tsx +76 -58
  96. package/src/components/documents/create/linked-documents-info.tsx +82 -0
  97. package/src/components/documents/create/live-preview.tsx +38 -11
  98. package/src/components/documents/create/prepare-document-submission.ts +1 -1
  99. package/src/components/documents/documents.hooks.ts +2 -1
  100. package/src/components/documents/shared/document-preview-display.tsx +12 -5
  101. package/src/components/documents/types.ts +12 -3
  102. package/src/components/documents/view/document-activities-list.tsx +65 -47
  103. package/src/components/documents/view/document-details-card.tsx +102 -77
  104. package/src/components/documents/view/document-payments-list.tsx +102 -68
  105. package/src/components/documents/view/document-relations-list.tsx +120 -0
  106. package/src/components/documents/view/document-sidebar.tsx +151 -0
  107. package/src/components/documents/view/index.ts +2 -0
  108. package/src/components/documents/view/locales/de.ts +23 -0
  109. package/src/components/documents/view/locales/es.ts +23 -0
  110. package/src/components/documents/view/locales/fr.ts +23 -0
  111. package/src/components/documents/view/locales/hr.ts +23 -0
  112. package/src/components/documents/view/locales/it.ts +23 -0
  113. package/src/components/documents/view/locales/nl.ts +23 -0
  114. package/src/components/documents/view/locales/pl.ts +23 -0
  115. package/src/components/documents/view/locales/pt.ts +23 -0
  116. package/src/components/documents/view/locales/sl.ts +23 -0
  117. package/src/components/documents/view/use-document-download.ts +8 -5
  118. package/src/components/entities/create-entity-form.tsx +165 -13
  119. package/src/components/entities/entity-settings-form/entity-settings-form.tsx +101 -1
  120. package/src/components/entities/entity-settings-form/locales/de.ts +9 -0
  121. package/src/components/entities/entity-settings-form/locales/es.ts +9 -0
  122. package/src/components/entities/entity-settings-form/locales/fr.ts +9 -0
  123. package/src/components/entities/entity-settings-form/locales/hr.ts +9 -0
  124. package/src/components/entities/entity-settings-form/locales/it.ts +9 -0
  125. package/src/components/entities/entity-settings-form/locales/nl.ts +9 -0
  126. package/src/components/entities/entity-settings-form/locales/pl.ts +9 -0
  127. package/src/components/entities/entity-settings-form/locales/pt.ts +9 -0
  128. package/src/components/entities/entity-settings-form/locales/sl.ts +9 -0
  129. package/src/components/entities/fina-settings-form/fina-settings-form.tsx +83 -71
  130. package/src/components/entities/fina-settings-form/fina-settings.hooks.ts +7 -2
  131. package/src/components/entities/fina-settings-form/locales/de.ts +2 -2
  132. package/src/components/entities/fina-settings-form/locales/en.ts +2 -2
  133. package/src/components/entities/fina-settings-form/locales/es.ts +2 -2
  134. package/src/components/entities/fina-settings-form/locales/fr.ts +2 -2
  135. package/src/components/entities/fina-settings-form/locales/hr.ts +2 -2
  136. package/src/components/entities/fina-settings-form/locales/it.ts +2 -2
  137. package/src/components/entities/fina-settings-form/locales/nl.ts +2 -2
  138. package/src/components/entities/fina-settings-form/locales/pl.ts +2 -2
  139. package/src/components/entities/fina-settings-form/locales/pt.ts +2 -2
  140. package/src/components/entities/fina-settings-form/locales/sl.ts +2 -2
  141. package/src/components/entities/furs-settings-form/furs-settings-form.tsx +10 -1
  142. package/src/components/entities/furs-settings-form/furs-settings.hooks.ts +7 -2
  143. package/src/components/entities/furs-settings-form/locales/en.ts +0 -1
  144. package/src/components/entities/furs-settings-form/sections/general-settings-section.tsx +12 -4
  145. package/src/components/entities/settings/pdf-template-selector/locales/de.ts +3 -1
  146. package/src/components/entities/settings/pdf-template-selector/locales/es.ts +3 -1
  147. package/src/components/entities/settings/pdf-template-selector/locales/fr.ts +4 -1
  148. package/src/components/entities/settings/pdf-template-selector/locales/hr.ts +4 -1
  149. package/src/components/entities/settings/pdf-template-selector/locales/it.ts +3 -1
  150. package/src/components/entities/settings/pdf-template-selector/locales/nl.ts +3 -1
  151. package/src/components/entities/settings/pdf-template-selector/locales/pl.ts +3 -1
  152. package/src/components/entities/settings/pdf-template-selector/locales/pt.ts +3 -1
  153. package/src/components/entities/settings/pdf-template-selector/locales/sl.ts +3 -1
  154. package/src/components/entities/settings/pdf-template-selector/pdf-template-cards.tsx +1 -0
  155. package/src/components/estimates/create/create-estimate-form.tsx +29 -2
  156. package/src/components/estimates/list/list-table.tsx +3 -6
  157. package/src/components/estimates/list/locales/de.ts +1 -0
  158. package/src/components/estimates/list/locales/es.ts +1 -0
  159. package/src/components/estimates/list/locales/fr.ts +1 -0
  160. package/src/components/estimates/list/locales/hr.ts +1 -0
  161. package/src/components/estimates/list/locales/it.ts +1 -0
  162. package/src/components/estimates/list/locales/nl.ts +1 -0
  163. package/src/components/estimates/list/locales/pl.ts +1 -0
  164. package/src/components/estimates/list/locales/pt.ts +1 -0
  165. package/src/components/estimates/list/locales/sl.ts +1 -0
  166. package/src/components/export/document-export-form.tsx +9 -2
  167. package/src/components/export/index.ts +2 -0
  168. package/src/components/export/sales-per-item-export-form.tsx +223 -0
  169. package/src/components/invoices/create/create-invoice-form.tsx +48 -1
  170. package/src/components/invoices/create/locales/de.ts +11 -0
  171. package/src/components/invoices/create/locales/es.ts +11 -0
  172. package/src/components/invoices/create/locales/fr.ts +11 -0
  173. package/src/components/invoices/create/locales/hr.ts +10 -0
  174. package/src/components/invoices/create/locales/it.ts +11 -0
  175. package/src/components/invoices/create/locales/nl.ts +11 -0
  176. package/src/components/invoices/create/locales/pl.ts +10 -0
  177. package/src/components/invoices/create/locales/pt.ts +10 -0
  178. package/src/components/invoices/create/locales/sl.ts +10 -0
  179. package/src/components/invoices/invoices-furs.hooks.ts +27 -9
  180. package/src/components/invoices/list/list-row-actions.tsx +3 -3
  181. package/src/components/invoices/list/list-table.tsx +132 -21
  182. package/src/components/invoices/list/locales/de.ts +6 -0
  183. package/src/components/invoices/list/locales/en.ts +5 -0
  184. package/src/components/invoices/list/locales/es.ts +6 -0
  185. package/src/components/invoices/list/locales/fr.ts +6 -0
  186. package/src/components/invoices/list/locales/hr.ts +6 -0
  187. package/src/components/invoices/list/locales/it.ts +6 -0
  188. package/src/components/invoices/list/locales/nl.ts +6 -0
  189. package/src/components/invoices/list/locales/pl.ts +6 -0
  190. package/src/components/invoices/list/locales/pt.ts +6 -0
  191. package/src/components/invoices/list/locales/sl.ts +6 -0
  192. package/src/components/invoices/view/fiscalization-status-card.tsx +42 -24
  193. package/src/components/items/item-combobox.tsx +5 -3
  194. package/src/components/items/item-list-table/item-list-header.tsx +4 -17
  195. package/src/components/items/item-list-table/item-list-row-actions.tsx +3 -2
  196. package/src/components/items/item-list-table/item-list-row.tsx +3 -2
  197. package/src/components/items/item-list-table/item-list-table.tsx +3 -3
  198. package/src/components/items/item-list-table/locales/de.ts +1 -0
  199. package/src/components/items/item-list-table/locales/es.ts +1 -0
  200. package/src/components/items/item-list-table/locales/fr.ts +1 -0
  201. package/src/components/items/item-list-table/locales/hr.ts +1 -0
  202. package/src/components/items/item-list-table/locales/it.ts +1 -0
  203. package/src/components/items/item-list-table/locales/nl.ts +1 -0
  204. package/src/components/items/item-list-table/locales/pl.ts +1 -0
  205. package/src/components/items/item-list-table/locales/pt.ts +1 -0
  206. package/src/components/items/item-list-table/locales/sl.ts +1 -0
  207. package/src/components/payments/list/list-table.tsx +0 -4
  208. package/src/components/payments/list/locales/de.ts +1 -0
  209. package/src/components/payments/list/locales/es.ts +1 -0
  210. package/src/components/payments/list/locales/fr.ts +1 -0
  211. package/src/components/payments/list/locales/hr.ts +1 -0
  212. package/src/components/payments/list/locales/it.ts +1 -0
  213. package/src/components/payments/list/locales/nl.ts +1 -0
  214. package/src/components/payments/list/locales/pl.ts +1 -0
  215. package/src/components/payments/list/locales/pt.ts +1 -0
  216. package/src/components/payments/list/locales/sl.ts +1 -0
  217. package/src/components/recurring-invoices/list/list-table.tsx +0 -7
  218. package/src/components/recurring-invoices/list/locales/de.ts +1 -0
  219. package/src/components/recurring-invoices/list/locales/es.ts +1 -0
  220. package/src/components/recurring-invoices/list/locales/fr.ts +1 -0
  221. package/src/components/recurring-invoices/list/locales/hr.ts +1 -0
  222. package/src/components/recurring-invoices/list/locales/it.ts +1 -0
  223. package/src/components/recurring-invoices/list/locales/nl.ts +1 -0
  224. package/src/components/recurring-invoices/list/locales/pl.ts +1 -0
  225. package/src/components/recurring-invoices/list/locales/pt.ts +1 -0
  226. package/src/components/recurring-invoices/list/locales/sl.ts +1 -0
  227. package/src/components/request-logs/request-log-list-table.tsx +0 -3
  228. package/src/components/table/README.md +14 -121
  229. package/src/components/table/data-table.tsx +22 -37
  230. package/src/components/table/hooks/use-table-state.ts +3 -27
  231. package/src/components/table/index.ts +0 -2
  232. package/src/components/table/selection-toolbar.tsx +35 -1
  233. package/src/components/table/table-empty-state.tsx +6 -3
  234. package/src/components/table/table-no-results.tsx +10 -5
  235. package/src/components/table/types.ts +0 -5
  236. package/src/components/taxes/tax-list-table/locales/de.ts +1 -0
  237. package/src/components/taxes/tax-list-table/locales/es.ts +1 -0
  238. package/src/components/taxes/tax-list-table/locales/fr.ts +1 -0
  239. package/src/components/taxes/tax-list-table/locales/hr.ts +1 -0
  240. package/src/components/taxes/tax-list-table/locales/it.ts +1 -0
  241. package/src/components/taxes/tax-list-table/locales/nl.ts +1 -0
  242. package/src/components/taxes/tax-list-table/locales/pl.ts +1 -0
  243. package/src/components/taxes/tax-list-table/locales/pt.ts +1 -0
  244. package/src/components/taxes/tax-list-table/locales/sl.ts +1 -0
  245. package/src/components/taxes/tax-list-table/tax-list-header.tsx +3 -14
  246. package/src/components/taxes/tax-list-table/tax-list-table.tsx +3 -3
  247. package/src/components/ui/popover.tsx +3 -1
  248. package/src/components/ui/tooltip.tsx +3 -1
  249. package/src/generated/schemas/deliverynote.ts +134 -0
  250. package/src/generated/schemas/entity.ts +4 -0
  251. package/src/generated/schemas/index.ts +3 -0
  252. package/src/generated/schemas/order.ts +5 -3
  253. package/src/generated/schemas/payment.ts +22 -2
  254. package/src/generated/schemas/renderadvanceinvoicepreview_body.ts +1 -0
  255. package/src/generated/schemas/rendercreditnotepreview_body.ts +1 -0
  256. package/src/generated/schemas/renderdeliverynotepreview_body.ts +185 -0
  257. package/src/generated/schemas/renderestimatepreview_body.ts +1 -0
  258. package/src/generated/schemas/renderinvoicepreview_body.ts +1 -0
  259. package/src/generated/schemas/startpdfexport_body.ts +18 -2
  260. package/src/generated/schemas/userfinasettings.ts +19 -0
  261. package/src/generated/schemas/webhook.ts +12 -0
  262. package/src/hooks/use-duplicate-document.ts +49 -6
  263. package/src/hooks/use-next-document-number.ts +2 -2
  264. package/src/lib/fiscalization.ts +12 -0
  265. package/src/lib/schemas/advance-invoice.ts +0 -1
  266. package/src/providers/sdk-provider.tsx +5 -7
  267. package/src/components/table/sortable-header.tsx +0 -56
@@ -97,6 +97,17 @@ export default {
97
97
  "Net price": "Prix net",
98
98
  "Gross price (tax included)": "Prix brut (taxes incluses)",
99
99
  "Net price (before tax)": "Prix net (avant taxes)",
100
+ // Linked documents
101
+ "Linked documents": "Documents liés",
102
+ Type: "Type",
103
+ Total: "Total",
104
+ "Delivery note": "Bon de livraison",
105
+ Invoice: "Facture",
106
+ Estimate: "Devis",
107
+ "Credit note": "Avoir",
108
+ "Advance invoice": "Facture d'acompte",
109
+ "FINA fiscalized invoices always use the current date":
110
+ "Les factures fiscalisées FINA utilisent toujours la date actuelle",
100
111
  "Service Date": "Date de service",
101
112
  "Single Date": "Date unique",
102
113
  "Date Range": "Plage de dates",
@@ -95,6 +95,16 @@ export default {
95
95
  "Net price": "Neto cijena",
96
96
  "Gross price (tax included)": "Bruto cijena (s porezom)",
97
97
  "Net price (before tax)": "Neto cijena (prije poreza)",
98
+ // Linked documents
99
+ "Linked documents": "Povezani dokumenti",
100
+ Type: "Vrsta",
101
+ Total: "Ukupno",
102
+ "Delivery note": "Otpremnica",
103
+ Invoice: "Račun",
104
+ Estimate: "Ponuda",
105
+ "Credit note": "Odobrenje",
106
+ "Advance invoice": "Avansni račun",
107
+ "FINA fiscalized invoices always use the current date": "FINA fiskalizirani računi uvijek koriste trenutni datum",
98
108
  "Service Date": "Datum usluge",
99
109
  "Single Date": "Datum",
100
110
  "Date Range": "Raspon datuma",
@@ -97,6 +97,17 @@ export default {
97
97
  "Net price": "Prezzo netto",
98
98
  "Gross price (tax included)": "Prezzo lordo (imposte incluse)",
99
99
  "Net price (before tax)": "Prezzo netto (prima delle imposte)",
100
+ // Linked documents
101
+ "Linked documents": "Documenti collegati",
102
+ Type: "Tipo",
103
+ Total: "Totale",
104
+ "Delivery note": "Bolla di consegna",
105
+ Invoice: "Fattura",
106
+ Estimate: "Preventivo",
107
+ "Credit note": "Nota di credito",
108
+ "Advance invoice": "Fattura di acconto",
109
+ "FINA fiscalized invoices always use the current date":
110
+ "Le fatture fiscalizzate FINA utilizzano sempre la data corrente",
100
111
  "Service Date": "Data del servizio",
101
112
  "Single Date": "Data singola",
102
113
  "Date Range": "Intervallo di date",
@@ -96,6 +96,17 @@ export default {
96
96
  "Net price": "Nettoprijs",
97
97
  "Gross price (tax included)": "Brutoprijs (inclusief belasting)",
98
98
  "Net price (before tax)": "Nettoprijs (exclusief belasting)",
99
+ // Linked documents
100
+ "Linked documents": "Gekoppelde documenten",
101
+ Type: "Type",
102
+ Total: "Totaal",
103
+ "Delivery note": "Pakbon",
104
+ Invoice: "Factuur",
105
+ Estimate: "Offerte",
106
+ "Credit note": "Creditnota",
107
+ "Advance invoice": "Voorschotfactuur",
108
+ "FINA fiscalized invoices always use the current date":
109
+ "FINA-gefiscaliseerde facturen gebruiken altijd de huidige datum",
99
110
  "Service Date": "Servicedatum",
100
111
  "Single Date": "Enkele datum",
101
112
  "Date Range": "Datumbereik",
@@ -96,6 +96,16 @@ export default {
96
96
  "Net price": "Cena netto",
97
97
  "Gross price (tax included)": "Cena brutto (z podatkiem)",
98
98
  "Net price (before tax)": "Cena netto (przed podatkiem)",
99
+ // Linked documents
100
+ "Linked documents": "Powiązane dokumenty",
101
+ Type: "Typ",
102
+ Total: "Razem",
103
+ "Delivery note": "Dowód dostawy",
104
+ Invoice: "Faktura",
105
+ Estimate: "Wycena",
106
+ "Credit note": "Nota kredytowa",
107
+ "Advance invoice": "Faktura zaliczkowa",
108
+ "FINA fiscalized invoices always use the current date": "Faktury fiskalizowane FINA zawsze używają bieżącej daty",
99
109
  "Service Date": "Data usługi",
100
110
  "Single Date": "Pojedyncza data",
101
111
  "Date Range": "Zakres dat",
@@ -97,6 +97,16 @@ export default {
97
97
  "Net price": "Preço líquido",
98
98
  "Gross price (tax included)": "Preço bruto (impostos incluídos)",
99
99
  "Net price (before tax)": "Preço líquido (antes de impostos)",
100
+ // Linked documents
101
+ "Linked documents": "Documentos associados",
102
+ Type: "Tipo",
103
+ Total: "Total",
104
+ "Delivery note": "Guia de remessa",
105
+ Invoice: "Fatura",
106
+ Estimate: "Orçamento",
107
+ "Credit note": "Nota de crédito",
108
+ "Advance invoice": "Fatura antecipada",
109
+ "FINA fiscalized invoices always use the current date": "As faturas fiscalizadas FINA usam sempre a data atual",
100
110
  "Service Date": "Data do serviço",
101
111
  "Single Date": "Data única",
102
112
  "Date Range": "Intervalo de datas",
@@ -105,6 +105,16 @@ export default {
105
105
  "Net price": "Neto cena",
106
106
  "Gross price (tax included)": "Bruto cena (z davkom)",
107
107
  "Net price (before tax)": "Neto cena (brez davka)",
108
+ // Linked documents
109
+ "Linked documents": "Povezani dokumenti",
110
+ Type: "Vrsta",
111
+ Total: "Skupaj",
112
+ "Delivery note": "Dobavnica",
113
+ Invoice: "Račun",
114
+ Estimate: "Predračun",
115
+ "Credit note": "Dobropis",
116
+ "Advance invoice": "Avansni račun",
117
+ "FINA fiscalized invoices always use the current date": "FINA fiskalizirani računi vedno uporabijo trenutni datum",
108
118
  // Service date
109
119
  "Service Date": "Datum storitve",
110
120
  "Single Date": "Datum",
@@ -1,28 +1,46 @@
1
1
  import { useMutation, useQueryClient } from "@tanstack/react-query";
2
2
  import { useSDK } from "@/ui/providers/sdk-provider";
3
3
 
4
- interface VoidInvoiceParams {
5
- invoiceId: string;
4
+ interface VoidDocumentParams {
5
+ documentId: string;
6
+ documentType: "invoice" | "credit_note" | "advance_invoice" | "delivery_note";
6
7
  entityId: string;
7
8
  reason?: string;
8
9
  }
9
10
 
10
11
  /**
11
- * Hook to void an invoice
12
- * Automatically handles FURS technical cancellation for fiscalized invoices
12
+ * Hook to void a document (invoice, credit note, or advance invoice)
13
+ * Automatically handles FURS/FINA technical cancellation for fiscalized documents
13
14
  */
14
- export function useVoidInvoice() {
15
+ export function useVoidDocument() {
15
16
  const { sdk } = useSDK();
16
17
  const queryClient = useQueryClient();
17
18
 
18
19
  return useMutation({
19
- mutationFn: async ({ invoiceId, entityId, reason }: VoidInvoiceParams) => {
20
- return sdk.invoices.void(invoiceId, { reason: reason || undefined }, { entity_id: entityId });
20
+ mutationFn: async ({ documentId, documentType, entityId, reason }: VoidDocumentParams) => {
21
+ const body = { reason: reason || undefined };
22
+ const opts = { entity_id: entityId };
23
+
24
+ switch (documentType) {
25
+ case "invoice":
26
+ return sdk.invoices.void(documentId, body, opts);
27
+ case "credit_note":
28
+ return sdk.creditNotes.void(documentId, body, opts);
29
+ case "advance_invoice":
30
+ return sdk.advanceInvoices.void(documentId, body, opts);
31
+ case "delivery_note":
32
+ return sdk.deliveryNotes.void(documentId, body, opts);
33
+ }
21
34
  },
22
35
  onSuccess: (_, variables) => {
23
- // Invalidate invoice queries to refresh the data
24
36
  queryClient.invalidateQueries({ queryKey: ["invoices"] });
25
- queryClient.invalidateQueries({ queryKey: ["documents", "invoice", variables.invoiceId] });
37
+ queryClient.invalidateQueries({ queryKey: ["credit-notes"] });
38
+ queryClient.invalidateQueries({ queryKey: ["advance-invoices"] });
39
+ queryClient.invalidateQueries({ queryKey: ["delivery-notes"] });
40
+ queryClient.invalidateQueries({ queryKey: ["documents", variables.documentType, variables.documentId] });
26
41
  },
27
42
  });
28
43
  }
44
+
45
+ /** @deprecated Use useVoidDocument instead */
46
+ export const useVoidInvoice = useVoidDocument;
@@ -1,7 +1,7 @@
1
1
  import type { Invoice } from "@spaceinvoices/js-sdk";
2
2
 
3
3
  import { Ban, Copy, Download, Eye, Link2Off, Loader2, Mail, MoreHorizontal, Plus } from "lucide-react";
4
- import { useState } from "react";
4
+ import { memo, useState } from "react";
5
5
  import { Button } from "@/ui/components/ui/button";
6
6
  import {
7
7
  DropdownMenu,
@@ -31,7 +31,7 @@ type InvoiceListRowActionsProps = {
31
31
  isVoiding?: boolean;
32
32
  } & ComponentTranslationProps;
33
33
 
34
- export default function InvoiceListRowActions({
34
+ export default memo(function InvoiceListRowActions({
35
35
  invoice,
36
36
  onView,
37
37
  onAddPayment,
@@ -144,4 +144,4 @@ export default function InvoiceListRowActions({
144
144
  />
145
145
  </>
146
146
  );
147
- }
147
+ });
@@ -1,4 +1,5 @@
1
1
  import type { Invoice } from "@spaceinvoices/js-sdk";
2
+ import { AlertTriangle } from "lucide-react";
2
3
  import { useCallback, useMemo, useState } from "react";
3
4
  import { DataTable } from "@/ui/components/table/data-table";
4
5
  import { FormattedDate } from "@/ui/components/table/date-cell";
@@ -11,7 +12,10 @@ import type {
11
12
  TableQueryParams,
12
13
  TableQueryResponse,
13
14
  } from "@/ui/components/table/types";
15
+ import { Badge } from "@/ui/components/ui/badge";
14
16
  import { Button } from "@/ui/components/ui/button";
17
+ import { Tooltip, TooltipContent, TooltipTrigger } from "@/ui/components/ui/tooltip";
18
+ import { getFiscalizationFailureType } from "@/ui/lib/fiscalization";
15
19
  import { createTranslation } from "@/ui/lib/translation";
16
20
  import { useSDK } from "@/ui/providers/sdk-provider";
17
21
 
@@ -52,8 +56,11 @@ type InvoiceListTableProps = {
52
56
  onDownloadSuccess?: (fileName: string) => void;
53
57
  onDownloadError?: (error: string) => void;
54
58
  onExportSelected?: (documentIds: string[]) => void;
59
+ onRetryFiscalization?: (documentIds: string[]) => void;
60
+ fiscalizationFeatures?: ("furs" | "fina")[];
55
61
  onVoid?: (invoice: Invoice) => void;
56
62
  isVoiding?: boolean;
63
+ onCreateNew?: () => void;
57
64
  } & ListTableProps<Invoice>;
58
65
 
59
66
  export default function InvoiceListTable({
@@ -69,8 +76,11 @@ export default function InvoiceListTable({
69
76
  onDownloadSuccess,
70
77
  onDownloadError,
71
78
  onExportSelected,
79
+ onRetryFiscalization,
80
+ fiscalizationFeatures,
72
81
  onVoid,
73
82
  isVoiding,
83
+ onCreateNew,
74
84
  ...i18nProps
75
85
  }: InvoiceListTableProps) {
76
86
  const t = createTranslation({
@@ -90,7 +100,6 @@ export default function InvoiceListTable({
90
100
  limit: params.limit,
91
101
  next_cursor: params.next_cursor,
92
102
  prev_cursor: params.prev_cursor,
93
- order_by: params.order_by,
94
103
  search: params.search,
95
104
  query: params.query,
96
105
  });
@@ -120,15 +129,42 @@ export default function InvoiceListTable({
120
129
  }, []);
121
130
 
122
131
  const selectionToolbar = useCallback(
123
- (count: number) => (
124
- <SelectionToolbar
125
- selectedCount={count}
126
- onExportPdfs={onExportSelected ? handleExportPdfs : undefined}
127
- onDeselectAll={handleDeselectAll}
128
- t={t}
129
- />
130
- ),
131
- [handleExportPdfs, handleDeselectAll, onExportSelected, t],
132
+ (count: number, data: Invoice[]) => {
133
+ const selectedDocs = data.filter((d) => selectedIds.has(d.id));
134
+ const failedDocs = selectedDocs.filter((d) => {
135
+ const failureType = getFiscalizationFailureType(d as any);
136
+ return failureType && fiscalizationFeatures?.includes(failureType);
137
+ });
138
+
139
+ const hasRetry = onRetryFiscalization && fiscalizationFeatures?.length;
140
+ const failedCount = failedDocs.length;
141
+ const allFailed = failedCount > 0 && failedCount === selectedDocs.length;
142
+ const someFailed = failedCount > 0 && failedCount < selectedDocs.length;
143
+ const showRetry = hasRetry && failedCount > 0;
144
+
145
+ return (
146
+ <SelectionToolbar
147
+ selectedCount={count}
148
+ onExportPdfs={onExportSelected ? handleExportPdfs : undefined}
149
+ onRetryFiscalization={showRetry ? () => onRetryFiscalization(failedDocs.map((d) => d.id)) : undefined}
150
+ retryFiscalizationDisabled={someFailed && !allFailed}
151
+ retryFiscalizationTooltip={
152
+ someFailed ? t("Some selected documents don't have failed fiscalization") : undefined
153
+ }
154
+ onDeselectAll={handleDeselectAll}
155
+ t={t}
156
+ />
157
+ );
158
+ },
159
+ [
160
+ handleExportPdfs,
161
+ handleDeselectAll,
162
+ onExportSelected,
163
+ onRetryFiscalization,
164
+ fiscalizationFeatures,
165
+ selectedIds,
166
+ t,
167
+ ],
132
168
  );
133
169
 
134
170
  const columns: Column<Invoice>[] = useMemo(
@@ -136,12 +172,35 @@ export default function InvoiceListTable({
136
172
  {
137
173
  id: "number",
138
174
  header: t("Number"),
139
- sortable: true,
140
- cell: (invoice) => (
141
- <Button variant="link" className="cursor-pointer py-0 underline" onClick={() => onRowClick?.(invoice)}>
142
- {(invoice as any).is_draft ? t("Draft") : invoice.number}
143
- </Button>
144
- ),
175
+ cell: (invoice) => {
176
+ const failureType = getFiscalizationFailureType(invoice as any);
177
+ const showWarning = failureType && fiscalizationFeatures?.includes(failureType);
178
+ return (
179
+ <div className="flex items-center gap-2">
180
+ <Button variant="link" className="cursor-pointer py-0 underline" onClick={() => onRowClick?.(invoice)}>
181
+ {invoice.number}
182
+ </Button>
183
+ {(invoice as any).is_draft && (
184
+ <Badge
185
+ variant="outline"
186
+ className="border-amber-500 bg-amber-50 text-amber-700 dark:bg-amber-950 dark:text-amber-400"
187
+ >
188
+ {t("Draft")}
189
+ </Badge>
190
+ )}
191
+ {showWarning && (
192
+ <Tooltip>
193
+ <TooltipTrigger>
194
+ <AlertTriangle className="size-4 text-orange-500" />
195
+ </TooltipTrigger>
196
+ <TooltipContent>
197
+ {t(failureType === "furs" ? "FURS fiscalization failed" : "FINA fiscalization failed")}
198
+ </TooltipContent>
199
+ </Tooltip>
200
+ )}
201
+ </div>
202
+ );
203
+ },
145
204
  },
146
205
  {
147
206
  id: "customer",
@@ -151,29 +210,30 @@ export default function InvoiceListTable({
151
210
  {
152
211
  id: "date",
153
212
  header: t("Date"),
154
- sortable: true,
155
213
  cell: (invoice) => <FormattedDate date={invoice.date} />,
156
214
  },
157
215
  {
158
216
  id: "date_due",
159
217
  header: t("Date Due"),
160
- sortable: true,
161
218
  cell: (invoice) => <FormattedDate date={invoice.date_due} />,
162
219
  },
163
220
  {
164
221
  id: "total",
165
222
  header: t("Total"),
166
- sortable: true,
167
223
  align: "right",
168
224
  cell: (invoice) => invoice.total,
169
225
  },
170
226
  {
171
227
  id: "total_with_tax",
172
228
  header: t("Total with Tax"),
173
- sortable: true,
174
229
  align: "right",
175
230
  cell: (invoice) => invoice.total_with_tax,
176
231
  },
232
+ {
233
+ id: "status",
234
+ header: t("Status"),
235
+ cell: (invoice) => <InvoiceStatusBadge invoice={invoice} t={t} />,
236
+ },
177
237
  {
178
238
  id: "actions",
179
239
  header: "",
@@ -207,6 +267,7 @@ export default function InvoiceListTable({
207
267
  onVoid,
208
268
  isVoiding,
209
269
  i18nProps.locale,
270
+ fiscalizationFeatures,
210
271
  ],
211
272
  );
212
273
 
@@ -217,6 +278,7 @@ export default function InvoiceListTable({
217
278
  resourceName="invoice"
218
279
  cacheKey="invoices"
219
280
  createNewLink={entityId ? `/app/${entityId}/documents/add/invoice` : undefined}
281
+ onCreateNew={onCreateNew}
220
282
  onFetch={handleFetch}
221
283
  onChangeParams={onChangeParams}
222
284
  disableUrlSync={disableUrlSync}
@@ -224,10 +286,59 @@ export default function InvoiceListTable({
224
286
  filterConfig={filterConfig}
225
287
  t={t}
226
288
  locale={i18nProps.locale}
227
- selectable={!!onExportSelected}
289
+ selectable={!!(onExportSelected || onRetryFiscalization)}
228
290
  selectedIds={selectedIds}
229
291
  onSelectionChange={setSelectedIds}
230
292
  selectionToolbar={selectionToolbar}
231
293
  />
232
294
  );
233
295
  }
296
+
297
+ /** Status badge for invoices */
298
+ function InvoiceStatusBadge({ invoice, t }: { invoice: Invoice; t: (key: string) => string }) {
299
+ if ((invoice as any).voided_at) {
300
+ return (
301
+ <Badge variant="outline" className="border-red-500 bg-red-50 text-red-700 dark:bg-red-950 dark:text-red-400">
302
+ {t("Voided")}
303
+ </Badge>
304
+ );
305
+ }
306
+ if ((invoice as any).is_draft) {
307
+ return null;
308
+ }
309
+ if (invoice.paid_in_full) {
310
+ return (
311
+ <Badge
312
+ variant="outline"
313
+ className="border-green-500 bg-green-50 text-green-700 dark:bg-green-950 dark:text-green-400"
314
+ >
315
+ {t("Paid")}
316
+ </Badge>
317
+ );
318
+ }
319
+ if (invoice.date_due && new Date(invoice.date_due) < new Date()) {
320
+ return (
321
+ <Badge
322
+ variant="outline"
323
+ className="border-orange-500 bg-orange-50 text-orange-700 dark:bg-orange-950 dark:text-orange-400"
324
+ >
325
+ {t("Overdue")}
326
+ </Badge>
327
+ );
328
+ }
329
+ if (invoice.total_paid > 0) {
330
+ return (
331
+ <Badge
332
+ variant="outline"
333
+ className="border-yellow-500 bg-yellow-50 text-yellow-700 dark:bg-yellow-950 dark:text-yellow-400"
334
+ >
335
+ {t("Partially Paid")}
336
+ </Badge>
337
+ );
338
+ }
339
+ return (
340
+ <Badge variant="outline" className="border-gray-500 bg-gray-50 text-gray-700 dark:bg-gray-800 dark:text-gray-400">
341
+ {t("Unpaid")}
342
+ </Badge>
343
+ );
344
+ }
@@ -39,8 +39,14 @@ export default {
39
39
  "No results found": "Keine Rechnungen gefunden",
40
40
  "Try adjusting your search criteria": "Versuchen Sie, Ihre Suchkriterien anzupassen",
41
41
  "Clear search": "Suche zurücksetzen",
42
+ "Clear all": "Alles zurücksetzen",
42
43
  selected: "ausgewählt",
43
44
  "Export PDFs": "PDFs exportieren",
44
45
  "Deselect all": "Auswahl aufheben",
45
46
  Void: "Stornieren",
47
+ "Partially Paid": "Teilweise bezahlt",
48
+ "FURS fiscalization failed": "FURS fiscalization failed",
49
+ "FINA fiscalization failed": "FINA fiscalization failed",
50
+ "Retry Fiscalization": "Retry Fiscalization",
51
+ "Some selected documents don't have failed fiscalization": "Some selected documents don't have failed fiscalization",
46
52
  } as const;
@@ -9,4 +9,9 @@ export default {
9
9
  "Export PDFs": "Export PDFs",
10
10
  "Deselect all": "Deselect all",
11
11
  Void: "Void",
12
+ "Partially Paid": "Partially Paid",
13
+ "FURS fiscalization failed": "FURS fiscalization failed",
14
+ "FINA fiscalization failed": "FINA fiscalization failed",
15
+ "Retry Fiscalization": "Retry Fiscalization",
16
+ "Some selected documents don't have failed fiscalization": "Some selected documents don't have failed fiscalization",
12
17
  } as const;
@@ -39,8 +39,14 @@ export default {
39
39
  "No results found": "No se encontraron facturas",
40
40
  "Try adjusting your search criteria": "Intente ajustar sus criterios de búsqueda",
41
41
  "Clear search": "Limpiar búsqueda",
42
+ "Clear all": "Borrar todo",
42
43
  selected: "seleccionados",
43
44
  "Export PDFs": "Exportar PDFs",
44
45
  "Deselect all": "Deseleccionar todo",
45
46
  Void: "Anular",
47
+ "Partially Paid": "Parcialmente pagado",
48
+ "FURS fiscalization failed": "FURS fiscalization failed",
49
+ "FINA fiscalization failed": "FINA fiscalization failed",
50
+ "Retry Fiscalization": "Retry Fiscalization",
51
+ "Some selected documents don't have failed fiscalization": "Some selected documents don't have failed fiscalization",
46
52
  } as const;
@@ -39,8 +39,14 @@ export default {
39
39
  "No results found": "Aucune facture trouvée",
40
40
  "Try adjusting your search criteria": "Essayez de modifier vos critères de recherche",
41
41
  "Clear search": "Effacer la recherche",
42
+ "Clear all": "Tout effacer",
42
43
  selected: "sélectionnés",
43
44
  "Export PDFs": "Exporter les PDF",
44
45
  "Deselect all": "Tout désélectionner",
45
46
  Void: "Annuler",
47
+ "Partially Paid": "Partiellement payé",
48
+ "FURS fiscalization failed": "FURS fiscalization failed",
49
+ "FINA fiscalization failed": "FINA fiscalization failed",
50
+ "Retry Fiscalization": "Retry Fiscalization",
51
+ "Some selected documents don't have failed fiscalization": "Some selected documents don't have failed fiscalization",
46
52
  } as const;
@@ -39,8 +39,14 @@ export default {
39
39
  "No results found": "Nisu pronađeni računi",
40
40
  "Try adjusting your search criteria": "Pokušajte prilagoditi kriterije pretrage",
41
41
  "Clear search": "Očisti pretragu",
42
+ "Clear all": "Očisti sve",
42
43
  selected: "odabranih",
43
44
  "Export PDFs": "Izvezi PDF-ove",
44
45
  "Deselect all": "Poništi odabir",
45
46
  Void: "Storniraj",
47
+ "Partially Paid": "Djelomično plaćeno",
48
+ "FURS fiscalization failed": "FURS fiskalizacija nije uspjela",
49
+ "FINA fiscalization failed": "FINA fiskalizacija nije uspjela",
50
+ "Retry Fiscalization": "Ponovi fiskalizaciju",
51
+ "Some selected documents don't have failed fiscalization": "Neki odabrani dokumenti nemaju neuspjelu fiskalizaciju",
46
52
  } as const;
@@ -39,8 +39,14 @@ export default {
39
39
  "No results found": "Nessuna fattura trovata",
40
40
  "Try adjusting your search criteria": "Prova a modificare i criteri di ricerca",
41
41
  "Clear search": "Cancella ricerca",
42
+ "Clear all": "Cancella tutto",
42
43
  selected: "selezionati",
43
44
  "Export PDFs": "Esporta PDF",
44
45
  "Deselect all": "Deseleziona tutto",
45
46
  Void: "Annulla",
47
+ "Partially Paid": "Parzialmente pagato",
48
+ "FURS fiscalization failed": "FURS fiscalization failed",
49
+ "FINA fiscalization failed": "FINA fiscalization failed",
50
+ "Retry Fiscalization": "Retry Fiscalization",
51
+ "Some selected documents don't have failed fiscalization": "Some selected documents don't have failed fiscalization",
46
52
  } as const;
@@ -39,8 +39,14 @@ export default {
39
39
  "No results found": "Geen facturen gevonden",
40
40
  "Try adjusting your search criteria": "Probeer uw zoekcriteria aan te passen",
41
41
  "Clear search": "Zoekopdracht wissen",
42
+ "Clear all": "Alles wissen",
42
43
  selected: "geselecteerd",
43
44
  "Export PDFs": "PDFs exporteren",
44
45
  "Deselect all": "Alles deselecteren",
45
46
  Void: "Nietig verklaren",
47
+ "Partially Paid": "Gedeeltelijk betaald",
48
+ "FURS fiscalization failed": "FURS fiscalization failed",
49
+ "FINA fiscalization failed": "FINA fiscalization failed",
50
+ "Retry Fiscalization": "Retry Fiscalization",
51
+ "Some selected documents don't have failed fiscalization": "Some selected documents don't have failed fiscalization",
46
52
  } as const;
@@ -39,8 +39,14 @@ export default {
39
39
  "No results found": "Nie znaleziono faktur",
40
40
  "Try adjusting your search criteria": "Spróbuj dostosować kryteria wyszukiwania",
41
41
  "Clear search": "Wyczyść wyszukiwanie",
42
+ "Clear all": "Wyczyść wszystko",
42
43
  selected: "wybranych",
43
44
  "Export PDFs": "Eksportuj PDF-y",
44
45
  "Deselect all": "Odznacz wszystko",
45
46
  Void: "Anuluj",
47
+ "Partially Paid": "Częściowo opłacona",
48
+ "FURS fiscalization failed": "FURS fiscalization failed",
49
+ "FINA fiscalization failed": "FINA fiscalization failed",
50
+ "Retry Fiscalization": "Retry Fiscalization",
51
+ "Some selected documents don't have failed fiscalization": "Some selected documents don't have failed fiscalization",
46
52
  } as const;
@@ -39,8 +39,14 @@ export default {
39
39
  "No results found": "Nenhuma fatura encontrada",
40
40
  "Try adjusting your search criteria": "Tente ajustar os seus critérios de pesquisa",
41
41
  "Clear search": "Limpar pesquisa",
42
+ "Clear all": "Limpar tudo",
42
43
  selected: "selecionados",
43
44
  "Export PDFs": "Exportar PDFs",
44
45
  "Deselect all": "Desselecionar tudo",
45
46
  Void: "Anular",
47
+ "Partially Paid": "Parcialmente pago",
48
+ "FURS fiscalization failed": "FURS fiscalization failed",
49
+ "FINA fiscalization failed": "FINA fiscalization failed",
50
+ "Retry Fiscalization": "Retry Fiscalization",
51
+ "Some selected documents don't have failed fiscalization": "Some selected documents don't have failed fiscalization",
46
52
  } as const;
@@ -39,8 +39,14 @@ export default {
39
39
  "No results found": "Ni najdenih računov",
40
40
  "Try adjusting your search criteria": "Poskusite prilagoditi iskalne kriterije",
41
41
  "Clear search": "Počisti iskanje",
42
+ "Clear all": "Počisti vse",
42
43
  selected: "izbranih",
43
44
  "Export PDFs": "Izvozi PDF-je",
44
45
  "Deselect all": "Počisti izbiro",
45
46
  Void: "Storniraj",
47
+ "Partially Paid": "Delno plačano",
48
+ "FURS fiscalization failed": "FURS davčno potrjevanje ni uspelo",
49
+ "FINA fiscalization failed": "FINA fiskalizacija ni uspela",
50
+ "Retry Fiscalization": "Ponovi fiskalizacijo",
51
+ "Some selected documents don't have failed fiscalization": "Nekateri izbrani dokumenti nimajo neuspele fiskalizacije",
46
52
  } as const;