@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
package/cli/dist/index.js CHANGED
@@ -870,7 +870,7 @@ async function list(options = {}) {
870
870
 
871
871
  // cli/src/index.ts
872
872
  var program = new Command();
873
- program.name("spaceinvoices-ui").description("CLI for adding Space Invoices React UI components to your project").version("0.4.2");
873
+ program.name("spaceinvoices-ui").description("CLI for adding Space Invoices React UI components to your project").version("0.4.4");
874
874
  program.option("--local <path>", "Use local registry from specified path (for development)");
875
875
  program.command("init").description("Initialize Space Invoices UI in your project").option("-y, --yes", "Skip prompts and use defaults").option("-f, --force", "Overwrite existing configuration").option("--cwd <path>", "Working directory (defaults to current directory)").action(async (options) => {
876
876
  const globalOpts = program.opts();
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@spaceinvoices/react-ui",
3
3
  "type": "module",
4
- "version": "0.4.2",
4
+ "version": "0.4.4",
5
5
  "private": false,
6
6
  "license": "MIT",
7
7
  "description": "Space Invoices UI components - copy-paste distribution with CLI support",
@@ -51,12 +51,21 @@ export function Autocomplete({
51
51
  setInternalSearchValue(value);
52
52
  onSearch?.(value);
53
53
 
54
- // Open popover when user starts typing
55
- if (!open) {
54
+ // Open popover when user starts typing (only if there are options)
55
+ if (!open && options.length > 0) {
56
56
  setOpen(true);
57
57
  }
58
58
  };
59
59
 
60
+ // Close popover when options become empty, open when they appear
61
+ React.useEffect(() => {
62
+ if (options.length === 0) {
63
+ setOpen(false);
64
+ } else if (document.activeElement === inputRef.current && searchValue) {
65
+ setOpen(true);
66
+ }
67
+ }, [options.length, searchValue]);
68
+
60
69
  const handleSelect = (selectedValue: string) => {
61
70
  onValueChange?.(selectedValue);
62
71
  setOpen(false);
@@ -81,6 +90,12 @@ export function Autocomplete({
81
90
  onBlurProp?.(e); // Call the passed onBlur prop after internal logic
82
91
  };
83
92
 
93
+ const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {
94
+ if (e.key === "Enter" && open) {
95
+ e.preventDefault();
96
+ }
97
+ };
98
+
84
99
  // Handle popover open/close - prevent closing when input is focused
85
100
  const handleOpenChange = (newOpen: boolean) => {
86
101
  if (!newOpen && document.activeElement === inputRef.current) {
@@ -98,6 +113,7 @@ export function Autocomplete({
98
113
  onChange={handleInputChange}
99
114
  onFocus={handleInputFocus}
100
115
  onBlur={handleInputBlur}
116
+ onKeyDown={handleKeyDown}
101
117
  placeholder={placeholder}
102
118
  className={className}
103
119
  disabled={disabled}
@@ -810,7 +810,6 @@ export default function CreateAdvanceInvoiceForm({
810
810
  document={{
811
811
  number: formValues.number,
812
812
  date: formValues.date,
813
- date_due: formValues.date_due,
814
813
  currency_code: formValues.currency_code,
815
814
  customer: formValues.customer as any,
816
815
  }}
@@ -28,4 +28,6 @@ export default {
28
28
  Other: "Andere",
29
29
  Premise: "Geschäftsräume",
30
30
  Device: "Gerät",
31
+ "FINA fiscalized invoices always use the current date":
32
+ "FINA-fiskalisierte Dokumente verwenden immer das aktuelle Datum",
31
33
  } as const;
@@ -28,4 +28,6 @@ export default {
28
28
  Other: "Otro",
29
29
  Premise: "Local",
30
30
  Device: "Dispositivo",
31
+ "FINA fiscalized invoices always use the current date":
32
+ "Los documentos fiscalizados con FINA siempre usan la fecha actual",
31
33
  } as const;
@@ -27,4 +27,6 @@ export default {
27
27
  Other: "Autre",
28
28
  Premise: "Local",
29
29
  Device: "Appareil",
30
+ "FINA fiscalized invoices always use the current date":
31
+ "Les documents fiscalisés FINA utilisent toujours la date actuelle",
30
32
  } as const;
@@ -26,4 +26,5 @@ export default {
26
26
  Other: "Ostalo",
27
27
  Premise: "Prostor",
28
28
  Device: "Uredaj",
29
+ "FINA fiscalized invoices always use the current date": "FINA fiskalizirani dokumenti uvijek koriste trenutni datum",
29
30
  } as const;
@@ -28,4 +28,6 @@ export default {
28
28
  Other: "Altro",
29
29
  Premise: "Locale",
30
30
  Device: "Dispositivo",
31
+ "FINA fiscalized invoices always use the current date":
32
+ "I documenti fiscalizzati FINA utilizzano sempre la data corrente",
31
33
  } as const;
@@ -27,4 +27,6 @@ export default {
27
27
  Other: "Overig",
28
28
  Premise: "Bedrijfsruimte",
29
29
  Device: "Apparaat",
30
+ "FINA fiscalized invoices always use the current date":
31
+ "FINA-gefiscaliseerde documenten gebruiken altijd de huidige datum",
30
32
  } as const;
@@ -27,4 +27,5 @@ export default {
27
27
  Other: "Inne",
28
28
  Premise: "Lokal",
29
29
  Device: "Urządzenie",
30
+ "FINA fiscalized invoices always use the current date": "Dokumenty fiskalizowane FINA zawsze używają bieżącej daty",
30
31
  } as const;
@@ -28,4 +28,5 @@ export default {
28
28
  Other: "Outro",
29
29
  Premise: "Estabelecimento",
30
30
  Device: "Dispositivo",
31
+ "FINA fiscalized invoices always use the current date": "Os documentos fiscalizados FINA usam sempre a data atual",
31
32
  } as const;
@@ -24,4 +24,5 @@ export default {
24
24
  Other: "Drugo",
25
25
  Premise: "Poslovni prostor",
26
26
  Device: "Naprava",
27
+ "FINA fiscalized invoices always use the current date": "FINA fiskalizirani dokumenti vedno uporabijo trenutni datum",
27
28
  } as const;
@@ -52,7 +52,6 @@ export function prepareAdvanceInvoiceSubmission(
52
52
  markAsPaid: options.markAsPaid,
53
53
  paymentTypes: options.paymentTypes,
54
54
  documentType: "advance_invoice",
55
- secondaryDate: values.date_due ?? undefined,
56
55
  priceModes: options.priceModes,
57
56
  isDraft: options.isDraft,
58
57
  }) as CreateAdvanceInvoiceRequest;
@@ -1,4 +1,5 @@
1
1
  import type { AdvanceInvoice } 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";
@@ -13,6 +14,8 @@ import type {
13
14
  } from "@/ui/components/table/types";
14
15
  import { Badge } from "@/ui/components/ui/badge";
15
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";
16
19
  import { createTranslation } from "@/ui/lib/translation";
17
20
  import { useSDK } from "@/ui/providers/sdk-provider";
18
21
 
@@ -53,6 +56,9 @@ type AdvanceInvoiceListTableProps = {
53
56
  onDownloadSuccess?: (fileName: string) => void;
54
57
  onDownloadError?: (error: string) => void;
55
58
  onExportSelected?: (documentIds: string[]) => void;
59
+ onRetryFiscalization?: (documentIds: string[]) => void;
60
+ fiscalizationFeatures?: ("furs" | "fina")[];
61
+ onCreateNew?: () => void;
56
62
  } & ListTableProps<AdvanceInvoice>;
57
63
 
58
64
  export default function AdvanceInvoiceListTable({
@@ -67,6 +73,9 @@ export default function AdvanceInvoiceListTable({
67
73
  onDownloadSuccess,
68
74
  onDownloadError,
69
75
  onExportSelected,
76
+ onRetryFiscalization,
77
+ fiscalizationFeatures,
78
+ onCreateNew,
70
79
  ...i18nProps
71
80
  }: AdvanceInvoiceListTableProps) {
72
81
  const t = createTranslation({
@@ -86,7 +95,6 @@ export default function AdvanceInvoiceListTable({
86
95
  limit: params.limit,
87
96
  next_cursor: params.next_cursor,
88
97
  prev_cursor: params.prev_cursor,
89
- order_by: params.order_by,
90
98
  search: params.search,
91
99
  query: params.query,
92
100
  });
@@ -97,7 +105,6 @@ export default function AdvanceInvoiceListTable({
97
105
  () => ({
98
106
  dateFields: [
99
107
  { id: "date", label: t("Date") },
100
- { id: "date_due", label: t("Date Due") },
101
108
  { id: "created_at", label: t("Created At") },
102
109
  ],
103
110
  statusFilter: true,
@@ -116,15 +123,42 @@ export default function AdvanceInvoiceListTable({
116
123
  }, []);
117
124
 
118
125
  const selectionToolbar = useCallback(
119
- (count: number) => (
120
- <SelectionToolbar
121
- selectedCount={count}
122
- onExportPdfs={onExportSelected ? handleExportPdfs : undefined}
123
- onDeselectAll={handleDeselectAll}
124
- t={t}
125
- />
126
- ),
127
- [handleExportPdfs, handleDeselectAll, onExportSelected, t],
126
+ (count: number, data: AdvanceInvoice[]) => {
127
+ const selectedDocs = data.filter((d) => selectedIds.has(d.id));
128
+ const failedDocs = selectedDocs.filter((d) => {
129
+ const failureType = getFiscalizationFailureType(d as any);
130
+ return failureType && fiscalizationFeatures?.includes(failureType);
131
+ });
132
+
133
+ const hasRetry = onRetryFiscalization && fiscalizationFeatures?.length;
134
+ const failedCount = failedDocs.length;
135
+ const allFailed = failedCount > 0 && failedCount === selectedDocs.length;
136
+ const someFailed = failedCount > 0 && failedCount < selectedDocs.length;
137
+ const showRetry = hasRetry && failedCount > 0;
138
+
139
+ return (
140
+ <SelectionToolbar
141
+ selectedCount={count}
142
+ onExportPdfs={onExportSelected ? handleExportPdfs : undefined}
143
+ onRetryFiscalization={showRetry ? () => onRetryFiscalization(failedDocs.map((d) => d.id)) : undefined}
144
+ retryFiscalizationDisabled={someFailed && !allFailed}
145
+ retryFiscalizationTooltip={
146
+ someFailed ? t("Some selected documents don't have failed fiscalization") : undefined
147
+ }
148
+ onDeselectAll={handleDeselectAll}
149
+ t={t}
150
+ />
151
+ );
152
+ },
153
+ [
154
+ handleExportPdfs,
155
+ handleDeselectAll,
156
+ onExportSelected,
157
+ onRetryFiscalization,
158
+ fiscalizationFeatures,
159
+ selectedIds,
160
+ t,
161
+ ],
128
162
  );
129
163
 
130
164
  const columns: Column<AdvanceInvoice>[] = useMemo(
@@ -132,26 +166,39 @@ export default function AdvanceInvoiceListTable({
132
166
  {
133
167
  id: "number",
134
168
  header: t("Number"),
135
- sortable: true,
136
- cell: (advanceInvoice) => (
137
- <div className="flex items-center gap-2">
138
- <Button
139
- variant="link"
140
- className="cursor-pointer py-0 underline"
141
- onClick={() => onRowClick?.(advanceInvoice)}
142
- >
143
- {advanceInvoice.number}
144
- </Button>
145
- {(advanceInvoice as any).is_draft && (
146
- <Badge
147
- variant="outline"
148
- className="border-amber-500 bg-amber-50 text-amber-700 dark:bg-amber-950 dark:text-amber-400"
169
+ cell: (advanceInvoice) => {
170
+ const failureType = getFiscalizationFailureType(advanceInvoice as any);
171
+ const showWarning = failureType && fiscalizationFeatures?.includes(failureType);
172
+ return (
173
+ <div className="flex items-center gap-2">
174
+ <Button
175
+ variant="link"
176
+ className="cursor-pointer py-0 underline"
177
+ onClick={() => onRowClick?.(advanceInvoice)}
149
178
  >
150
- {t("Draft")}
151
- </Badge>
152
- )}
153
- </div>
154
- ),
179
+ {advanceInvoice.number}
180
+ </Button>
181
+ {(advanceInvoice as any).is_draft && (
182
+ <Badge
183
+ variant="outline"
184
+ className="border-amber-500 bg-amber-50 text-amber-700 dark:bg-amber-950 dark:text-amber-400"
185
+ >
186
+ {t("Draft")}
187
+ </Badge>
188
+ )}
189
+ {showWarning && (
190
+ <Tooltip>
191
+ <TooltipTrigger>
192
+ <AlertTriangle className="size-4 text-orange-500" />
193
+ </TooltipTrigger>
194
+ <TooltipContent>
195
+ {t(failureType === "furs" ? "FURS fiscalization failed" : "FINA fiscalization failed")}
196
+ </TooltipContent>
197
+ </Tooltip>
198
+ )}
199
+ </div>
200
+ );
201
+ },
155
202
  },
156
203
  {
157
204
  id: "customer",
@@ -161,29 +208,25 @@ export default function AdvanceInvoiceListTable({
161
208
  {
162
209
  id: "date",
163
210
  header: t("Date"),
164
- sortable: true,
165
211
  cell: (advanceInvoice) => <FormattedDate date={advanceInvoice.date} />,
166
212
  },
167
- {
168
- id: "date_due",
169
- header: t("Date Due"),
170
- sortable: true,
171
- cell: (advanceInvoice) => <FormattedDate date={advanceInvoice.date_due} />,
172
- },
173
213
  {
174
214
  id: "total",
175
215
  header: t("Total"),
176
- sortable: true,
177
216
  align: "right",
178
217
  cell: (advanceInvoice) => advanceInvoice.total,
179
218
  },
180
219
  {
181
220
  id: "total_with_tax",
182
221
  header: t("Total with Tax"),
183
- sortable: true,
184
222
  align: "right",
185
223
  cell: (advanceInvoice) => advanceInvoice.total_with_tax,
186
224
  },
225
+ {
226
+ id: "status",
227
+ header: t("Status"),
228
+ cell: (advanceInvoice) => <AdvanceInvoiceStatusBadge advanceInvoice={advanceInvoice} t={t} />,
229
+ },
187
230
  {
188
231
  id: "actions",
189
232
  header: "",
@@ -213,6 +256,7 @@ export default function AdvanceInvoiceListTable({
213
256
  onDownloadSuccess,
214
257
  onDownloadError,
215
258
  i18nProps.locale,
259
+ fiscalizationFeatures,
216
260
  ],
217
261
  );
218
262
 
@@ -223,16 +267,62 @@ export default function AdvanceInvoiceListTable({
223
267
  resourceName="advance_invoice"
224
268
  cacheKey="advance-invoices"
225
269
  createNewLink={entityId ? `/app/${entityId}/documents/add/advance_invoice` : undefined}
270
+ onCreateNew={onCreateNew}
226
271
  onFetch={handleFetch}
227
272
  onChangeParams={onChangeParams}
228
273
  entityId={entityId}
229
274
  filterConfig={filterConfig}
230
275
  t={t}
231
276
  locale={i18nProps.locale}
232
- selectable={!!onExportSelected}
277
+ selectable={!!(onExportSelected || onRetryFiscalization)}
233
278
  selectedIds={selectedIds}
234
279
  onSelectionChange={setSelectedIds}
235
280
  selectionToolbar={selectionToolbar}
236
281
  />
237
282
  );
238
283
  }
284
+
285
+ /** Status badge for advance invoices */
286
+ function AdvanceInvoiceStatusBadge({
287
+ advanceInvoice,
288
+ t,
289
+ }: {
290
+ advanceInvoice: AdvanceInvoice;
291
+ t: (key: string) => string;
292
+ }) {
293
+ if ((advanceInvoice as any).voided_at) {
294
+ return (
295
+ <Badge variant="outline" className="border-red-500 bg-red-50 text-red-700 dark:bg-red-950 dark:text-red-400">
296
+ {t("Voided")}
297
+ </Badge>
298
+ );
299
+ }
300
+ if ((advanceInvoice as any).is_draft) {
301
+ return null;
302
+ }
303
+ if (advanceInvoice.paid_in_full) {
304
+ return (
305
+ <Badge
306
+ variant="outline"
307
+ className="border-green-500 bg-green-50 text-green-700 dark:bg-green-950 dark:text-green-400"
308
+ >
309
+ {t("Paid")}
310
+ </Badge>
311
+ );
312
+ }
313
+ if (advanceInvoice.total_paid > 0) {
314
+ return (
315
+ <Badge
316
+ variant="outline"
317
+ className="border-yellow-500 bg-yellow-50 text-yellow-700 dark:bg-yellow-950 dark:text-yellow-400"
318
+ >
319
+ {t("Partially Paid")}
320
+ </Badge>
321
+ );
322
+ }
323
+ return (
324
+ <Badge variant="outline" className="border-gray-500 bg-gray-50 text-gray-700 dark:bg-gray-800 dark:text-gray-400">
325
+ {t("Unpaid")}
326
+ </Badge>
327
+ );
328
+ }
@@ -38,7 +38,13 @@ export default {
38
38
  "No results found": "Keine Vorauszahlungsrechnungen gefunden",
39
39
  "Try adjusting your search criteria": "Versuchen Sie, Ihre Suchkriterien anzupassen",
40
40
  "Clear search": "Suche zurücksetzen",
41
+ "Clear all": "Alles zurücksetzen",
41
42
  selected: "ausgewählt",
42
43
  "Export PDFs": "PDFs exportieren",
43
44
  "Deselect all": "Auswahl aufheben",
45
+ "Partially Paid": "Teilweise bezahlt",
46
+ "FURS fiscalization failed": "FURS fiscalization failed",
47
+ "FINA fiscalization failed": "FINA fiscalization failed",
48
+ "Retry Fiscalization": "Retry Fiscalization",
49
+ "Some selected documents don't have failed fiscalization": "Some selected documents don't have failed fiscalization",
44
50
  } as const;
@@ -8,4 +8,9 @@ export default {
8
8
  selected: "selected",
9
9
  "Export PDFs": "Export PDFs",
10
10
  "Deselect all": "Deselect all",
11
+ "Partially Paid": "Partially Paid",
12
+ "FURS fiscalization failed": "FURS fiscalization failed",
13
+ "FINA fiscalization failed": "FINA fiscalization failed",
14
+ "Retry Fiscalization": "Retry Fiscalization",
15
+ "Some selected documents don't have failed fiscalization": "Some selected documents don't have failed fiscalization",
11
16
  } as const;
@@ -38,7 +38,13 @@ export default {
38
38
  "No results found": "No se encontraron facturas anticipadas",
39
39
  "Try adjusting your search criteria": "Intente ajustar sus criterios de busqueda",
40
40
  "Clear search": "Limpiar busqueda",
41
+ "Clear all": "Borrar todo",
41
42
  selected: "seleccionados",
42
43
  "Export PDFs": "Exportar PDFs",
43
44
  "Deselect all": "Deseleccionar todo",
45
+ "Partially Paid": "Parcialmente pagado",
46
+ "FURS fiscalization failed": "FURS fiscalization failed",
47
+ "FINA fiscalization failed": "FINA fiscalization failed",
48
+ "Retry Fiscalization": "Retry Fiscalization",
49
+ "Some selected documents don't have failed fiscalization": "Some selected documents don't have failed fiscalization",
44
50
  } as const;
@@ -38,7 +38,13 @@ export default {
38
38
  "No results found": "Aucune facture d'acompte trouvee",
39
39
  "Try adjusting your search criteria": "Essayez de modifier vos criteres de recherche",
40
40
  "Clear search": "Effacer la recherche",
41
+ "Clear all": "Tout effacer",
41
42
  selected: "sélectionnés",
42
43
  "Export PDFs": "Exporter les PDF",
43
44
  "Deselect all": "Tout désélectionner",
45
+ "Partially Paid": "Partiellement payé",
46
+ "FURS fiscalization failed": "FURS fiscalization failed",
47
+ "FINA fiscalization failed": "FINA fiscalization failed",
48
+ "Retry Fiscalization": "Retry Fiscalization",
49
+ "Some selected documents don't have failed fiscalization": "Some selected documents don't have failed fiscalization",
44
50
  } as const;
@@ -38,7 +38,13 @@ export default {
38
38
  "No results found": "Nije pronadjen nijedan avansni racun",
39
39
  "Try adjusting your search criteria": "Pokusajte prilagoditi kriterije pretrazivanja",
40
40
  "Clear search": "Ocisti pretragu",
41
+ "Clear all": "Očisti sve",
41
42
  selected: "odabranih",
42
43
  "Export PDFs": "Izvezi PDF-ove",
43
44
  "Deselect all": "Poništi odabir",
45
+ "Partially Paid": "Djelomično plaćeno",
46
+ "FURS fiscalization failed": "FURS fiskalizacija nije uspjela",
47
+ "FINA fiscalization failed": "FINA fiskalizacija nije uspjela",
48
+ "Retry Fiscalization": "Ponovi fiskalizaciju",
49
+ "Some selected documents don't have failed fiscalization": "Neki odabrani dokumenti nemaju neuspjelu fiskalizaciju",
44
50
  } as const;
@@ -38,7 +38,13 @@ export default {
38
38
  "No results found": "Nessuna fattura anticipata trovata",
39
39
  "Try adjusting your search criteria": "Prova a modificare i criteri di ricerca",
40
40
  "Clear search": "Cancella ricerca",
41
+ "Clear all": "Cancella tutto",
41
42
  selected: "selezionati",
42
43
  "Export PDFs": "Esporta PDF",
43
44
  "Deselect all": "Deseleziona tutto",
45
+ "Partially Paid": "Parzialmente pagato",
46
+ "FURS fiscalization failed": "FURS fiscalization failed",
47
+ "FINA fiscalization failed": "FINA fiscalization failed",
48
+ "Retry Fiscalization": "Retry Fiscalization",
49
+ "Some selected documents don't have failed fiscalization": "Some selected documents don't have failed fiscalization",
44
50
  } as const;
@@ -38,7 +38,13 @@ export default {
38
38
  "No results found": "Geen voorschotfacturen gevonden",
39
39
  "Try adjusting your search criteria": "Probeer uw zoekcriteria aan te passen",
40
40
  "Clear search": "Zoekopdracht wissen",
41
+ "Clear all": "Alles wissen",
41
42
  selected: "geselecteerd",
42
43
  "Export PDFs": "PDFs exporteren",
43
44
  "Deselect all": "Alles deselecteren",
45
+ "Partially Paid": "Gedeeltelijk betaald",
46
+ "FURS fiscalization failed": "FURS fiscalization failed",
47
+ "FINA fiscalization failed": "FINA fiscalization failed",
48
+ "Retry Fiscalization": "Retry Fiscalization",
49
+ "Some selected documents don't have failed fiscalization": "Some selected documents don't have failed fiscalization",
44
50
  } as const;
@@ -38,7 +38,13 @@ export default {
38
38
  "No results found": "Nie znaleziono faktur zaliczkowych",
39
39
  "Try adjusting your search criteria": "Sprobuj dostosowac kryteria wyszukiwania",
40
40
  "Clear search": "Wyczysc wyszukiwanie",
41
+ "Clear all": "Wyczyść wszystko",
41
42
  selected: "wybranych",
42
43
  "Export PDFs": "Eksportuj PDF-y",
43
44
  "Deselect all": "Odznacz wszystko",
45
+ "Partially Paid": "Częściowo opłacona",
46
+ "FURS fiscalization failed": "FURS fiscalization failed",
47
+ "FINA fiscalization failed": "FINA fiscalization failed",
48
+ "Retry Fiscalization": "Retry Fiscalization",
49
+ "Some selected documents don't have failed fiscalization": "Some selected documents don't have failed fiscalization",
44
50
  } as const;
@@ -38,7 +38,13 @@ export default {
38
38
  "No results found": "Nenhuma fatura antecipada encontrada",
39
39
  "Try adjusting your search criteria": "Tente ajustar os seus criterios de pesquisa",
40
40
  "Clear search": "Limpar pesquisa",
41
+ "Clear all": "Limpar tudo",
41
42
  selected: "selecionados",
42
43
  "Export PDFs": "Exportar PDFs",
43
44
  "Deselect all": "Desselecionar tudo",
45
+ "Partially Paid": "Parcialmente pago",
46
+ "FURS fiscalization failed": "FURS fiscalization failed",
47
+ "FINA fiscalization failed": "FINA fiscalization failed",
48
+ "Retry Fiscalization": "Retry Fiscalization",
49
+ "Some selected documents don't have failed fiscalization": "Some selected documents don't have failed fiscalization",
44
50
  } as const;
@@ -38,7 +38,13 @@ export default {
38
38
  "No results found": "Ni najdenih avansnih računov",
39
39
  "Try adjusting your search criteria": "Poskusite prilagoditi iskalne kriterije",
40
40
  "Clear search": "Počisti iskanje",
41
+ "Clear all": "Počisti vse",
41
42
  selected: "izbranih",
42
43
  "Export PDFs": "Izvozi PDF-je",
43
44
  "Deselect all": "Počisti izbiro",
45
+ "Partially Paid": "Delno plačano",
46
+ "FURS fiscalization failed": "FURS davčno potrjevanje ni uspelo",
47
+ "FINA fiscalization failed": "FINA fiskalizacija ni uspela",
48
+ "Retry Fiscalization": "Ponovi fiskalizacijo",
49
+ "Some selected documents don't have failed fiscalization": "Nekateri izbrani dokumenti nimajo neuspele fiskalizacije",
44
50
  } as const;