@spaceinvoices/react-ui 0.4.3 → 0.4.5

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 (263) 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 +61 -12
  5. package/src/components/advance-invoices/create/locales/de.ts +17 -0
  6. package/src/components/advance-invoices/create/locales/es.ts +17 -0
  7. package/src/components/advance-invoices/create/locales/fr.ts +17 -0
  8. package/src/components/advance-invoices/create/locales/hr.ts +16 -0
  9. package/src/components/advance-invoices/create/locales/it.ts +17 -0
  10. package/src/components/advance-invoices/create/locales/nl.ts +17 -0
  11. package/src/components/advance-invoices/create/locales/pl.ts +16 -0
  12. package/src/components/advance-invoices/create/locales/pt.ts +16 -0
  13. package/src/components/advance-invoices/create/locales/sl.ts +16 -0
  14. package/src/components/advance-invoices/create/prepare-advance-invoice-submission.ts +0 -1
  15. package/src/components/advance-invoices/list/list-row-actions.tsx +48 -1
  16. package/src/components/advance-invoices/list/list-table.tsx +100 -50
  17. package/src/components/advance-invoices/list/locales/de.ts +9 -0
  18. package/src/components/advance-invoices/list/locales/en.ts +7 -0
  19. package/src/components/advance-invoices/list/locales/es.ts +9 -0
  20. package/src/components/advance-invoices/list/locales/fr.ts +9 -0
  21. package/src/components/advance-invoices/list/locales/hr.ts +8 -0
  22. package/src/components/advance-invoices/list/locales/it.ts +9 -0
  23. package/src/components/advance-invoices/list/locales/nl.ts +9 -0
  24. package/src/components/advance-invoices/list/locales/pl.ts +8 -0
  25. package/src/components/advance-invoices/list/locales/pt.ts +9 -0
  26. package/src/components/advance-invoices/list/locales/sl.ts +8 -0
  27. package/src/components/credit-notes/create/create-credit-note-form.tsx +185 -11
  28. package/src/components/credit-notes/create/locales/de.ts +18 -0
  29. package/src/components/credit-notes/create/locales/es.ts +18 -0
  30. package/src/components/credit-notes/create/locales/fr.ts +18 -0
  31. package/src/components/credit-notes/create/locales/hr.ts +17 -0
  32. package/src/components/credit-notes/create/locales/it.ts +18 -0
  33. package/src/components/credit-notes/create/locales/nl.ts +18 -0
  34. package/src/components/credit-notes/create/locales/pl.ts +17 -0
  35. package/src/components/credit-notes/create/locales/pt.ts +17 -0
  36. package/src/components/credit-notes/create/locales/sl.ts +18 -1
  37. package/src/components/credit-notes/credit-notes.hooks.ts +30 -0
  38. package/src/components/credit-notes/list/list-row-actions.tsx +44 -1
  39. package/src/components/credit-notes/list/list-table.tsx +93 -32
  40. package/src/components/credit-notes/list/locales/de.ts +7 -0
  41. package/src/components/credit-notes/list/locales/en.ts +6 -0
  42. package/src/components/credit-notes/list/locales/es.ts +7 -0
  43. package/src/components/credit-notes/list/locales/fr.ts +7 -0
  44. package/src/components/credit-notes/list/locales/hr.ts +7 -0
  45. package/src/components/credit-notes/list/locales/it.ts +7 -0
  46. package/src/components/credit-notes/list/locales/nl.ts +7 -0
  47. package/src/components/credit-notes/list/locales/pl.ts +7 -0
  48. package/src/components/credit-notes/list/locales/pt.ts +7 -0
  49. package/src/components/credit-notes/list/locales/sl.ts +7 -0
  50. package/src/components/customers/customer-list-table/customer-list-table.tsx +0 -3
  51. package/src/components/customers/customer-list-table/locales/de.ts +1 -0
  52. package/src/components/customers/customer-list-table/locales/es.ts +1 -0
  53. package/src/components/customers/customer-list-table/locales/fr.ts +1 -0
  54. package/src/components/customers/customer-list-table/locales/hr.ts +1 -0
  55. package/src/components/customers/customer-list-table/locales/it.ts +1 -0
  56. package/src/components/customers/customer-list-table/locales/nl.ts +1 -0
  57. package/src/components/customers/customer-list-table/locales/pl.ts +1 -0
  58. package/src/components/customers/customer-list-table/locales/pt.ts +1 -0
  59. package/src/components/customers/customer-list-table/locales/sl.ts +1 -0
  60. package/src/components/dashboard/collection-rate-card/use-collection-rate.ts +48 -9
  61. package/src/components/dashboard/revenue-trend-chart/use-revenue-trend.ts +77 -48
  62. package/src/components/dashboard/shared/use-revenue-data.ts +77 -9
  63. package/src/components/delivery-notes/create/create-delivery-note-form.tsx +67 -7
  64. package/src/components/delivery-notes/create/locales/de.ts +16 -0
  65. package/src/components/delivery-notes/create/locales/es.ts +16 -0
  66. package/src/components/delivery-notes/create/locales/fr.ts +16 -0
  67. package/src/components/delivery-notes/create/locales/hr.ts +16 -0
  68. package/src/components/delivery-notes/create/locales/it.ts +16 -0
  69. package/src/components/delivery-notes/create/locales/nl.ts +16 -0
  70. package/src/components/delivery-notes/create/locales/pl.ts +16 -0
  71. package/src/components/delivery-notes/create/locales/pt.ts +16 -0
  72. package/src/components/delivery-notes/create/locales/sl.ts +17 -1
  73. package/src/components/delivery-notes/list/list-row-actions.tsx +20 -1
  74. package/src/components/delivery-notes/list/list-table.tsx +50 -8
  75. package/src/components/delivery-notes/list/locales/de.ts +35 -0
  76. package/src/components/delivery-notes/list/locales/en.ts +33 -0
  77. package/src/components/delivery-notes/list/locales/es.ts +35 -0
  78. package/src/components/delivery-notes/list/locales/fr.ts +35 -0
  79. package/src/components/delivery-notes/list/locales/hr.ts +35 -0
  80. package/src/components/delivery-notes/list/locales/it.ts +35 -0
  81. package/src/components/delivery-notes/list/locales/nl.ts +35 -0
  82. package/src/components/delivery-notes/list/locales/pl.ts +35 -0
  83. package/src/components/delivery-notes/list/locales/pt.ts +35 -0
  84. package/src/components/delivery-notes/list/locales/sl.ts +35 -0
  85. package/src/components/documents/create/document-add-item-form.tsx +70 -0
  86. package/src/components/documents/create/document-details-section.tsx +163 -29
  87. package/src/components/documents/create/document-items-section.tsx +21 -4
  88. package/src/components/documents/create/linked-documents-info.tsx +82 -0
  89. package/src/components/documents/create/live-preview.tsx +25 -5
  90. package/src/components/documents/create/mark-as-paid-section.tsx +29 -20
  91. package/src/components/documents/create/prepare-document-submission.ts +19 -7
  92. package/src/components/documents/shared/document-preview-display.tsx +3 -4
  93. package/src/components/documents/types.ts +2 -2
  94. package/src/components/documents/view/document-actions-bar.tsx +7 -27
  95. package/src/components/documents/view/document-activities-list.tsx +65 -47
  96. package/src/components/documents/view/document-details-card.tsx +118 -76
  97. package/src/components/documents/view/document-payments-list.tsx +99 -65
  98. package/src/components/documents/view/document-relations-list.tsx +43 -28
  99. package/src/components/documents/view/document-sidebar.tsx +151 -0
  100. package/src/components/documents/view/index.ts +2 -0
  101. package/src/components/documents/view/locales/de.ts +4 -0
  102. package/src/components/documents/view/locales/es.ts +4 -0
  103. package/src/components/documents/view/locales/fr.ts +4 -0
  104. package/src/components/documents/view/locales/hr.ts +4 -0
  105. package/src/components/documents/view/locales/it.ts +4 -0
  106. package/src/components/documents/view/locales/nl.ts +4 -0
  107. package/src/components/documents/view/locales/pl.ts +4 -0
  108. package/src/components/documents/view/locales/pt.ts +4 -0
  109. package/src/components/documents/view/locales/sl.ts +5 -1
  110. package/src/components/documents/view/use-document-download.ts +7 -3
  111. package/src/components/entities/create-entity-form.tsx +166 -13
  112. package/src/components/entities/entity-settings-form/entity-settings-form.tsx +101 -1
  113. package/src/components/entities/entity-settings-form/input-with-preview.tsx +30 -2
  114. package/src/components/entities/entity-settings-form/locales/de.ts +10 -0
  115. package/src/components/entities/entity-settings-form/locales/es.ts +10 -0
  116. package/src/components/entities/entity-settings-form/locales/fr.ts +10 -0
  117. package/src/components/entities/entity-settings-form/locales/hr.ts +10 -0
  118. package/src/components/entities/entity-settings-form/locales/it.ts +10 -0
  119. package/src/components/entities/entity-settings-form/locales/nl.ts +10 -0
  120. package/src/components/entities/entity-settings-form/locales/pl.ts +10 -0
  121. package/src/components/entities/entity-settings-form/locales/pt.ts +10 -0
  122. package/src/components/entities/entity-settings-form/locales/sl.ts +10 -0
  123. package/src/components/entities/fina-settings-form/fina-settings-form.tsx +6 -6
  124. package/src/components/entities/fina-settings-form/locales/de.ts +2 -2
  125. package/src/components/entities/fina-settings-form/locales/en.ts +2 -2
  126. package/src/components/entities/fina-settings-form/locales/es.ts +2 -2
  127. package/src/components/entities/fina-settings-form/locales/fr.ts +2 -2
  128. package/src/components/entities/fina-settings-form/locales/hr.ts +2 -2
  129. package/src/components/entities/fina-settings-form/locales/it.ts +2 -2
  130. package/src/components/entities/fina-settings-form/locales/nl.ts +2 -2
  131. package/src/components/entities/fina-settings-form/locales/pl.ts +2 -2
  132. package/src/components/entities/fina-settings-form/locales/pt.ts +2 -2
  133. package/src/components/entities/fina-settings-form/locales/sl.ts +2 -2
  134. package/src/components/entities/furs-settings-form/locales/en.ts +0 -1
  135. package/src/components/entities/settings/company-settings-form.tsx +173 -20
  136. package/src/components/entities/settings/pdf-template-selector/locales/de.ts +3 -1
  137. package/src/components/entities/settings/pdf-template-selector/locales/es.ts +3 -1
  138. package/src/components/entities/settings/pdf-template-selector/locales/fr.ts +4 -1
  139. package/src/components/entities/settings/pdf-template-selector/locales/hr.ts +4 -1
  140. package/src/components/entities/settings/pdf-template-selector/locales/it.ts +3 -1
  141. package/src/components/entities/settings/pdf-template-selector/locales/nl.ts +3 -1
  142. package/src/components/entities/settings/pdf-template-selector/locales/pl.ts +3 -1
  143. package/src/components/entities/settings/pdf-template-selector/locales/pt.ts +3 -1
  144. package/src/components/entities/settings/pdf-template-selector/locales/sl.ts +3 -1
  145. package/src/components/entities/settings/pdf-template-selector/pdf-template-cards.tsx +1 -0
  146. package/src/components/estimates/create/create-estimate-form.tsx +93 -8
  147. package/src/components/estimates/create/locales/de.ts +16 -0
  148. package/src/components/estimates/create/locales/es.ts +16 -0
  149. package/src/components/estimates/create/locales/fr.ts +16 -0
  150. package/src/components/estimates/create/locales/hr.ts +16 -0
  151. package/src/components/estimates/create/locales/it.ts +16 -0
  152. package/src/components/estimates/create/locales/nl.ts +16 -0
  153. package/src/components/estimates/create/locales/pl.ts +16 -0
  154. package/src/components/estimates/create/locales/pt.ts +16 -0
  155. package/src/components/estimates/create/locales/sl.ts +17 -1
  156. package/src/components/estimates/list/list-table.tsx +14 -8
  157. package/src/components/estimates/list/locales/de.ts +2 -0
  158. package/src/components/estimates/list/locales/en.ts +1 -0
  159. package/src/components/estimates/list/locales/es.ts +2 -0
  160. package/src/components/estimates/list/locales/fr.ts +2 -0
  161. package/src/components/estimates/list/locales/hr.ts +2 -0
  162. package/src/components/estimates/list/locales/it.ts +2 -0
  163. package/src/components/estimates/list/locales/nl.ts +2 -0
  164. package/src/components/estimates/list/locales/pl.ts +2 -0
  165. package/src/components/estimates/list/locales/pt.ts +2 -0
  166. package/src/components/estimates/list/locales/sl.ts +2 -0
  167. package/src/components/export/document-export-form.tsx +55 -14
  168. package/src/components/export/index.ts +2 -0
  169. package/src/components/export/sales-per-item-export-form.tsx +223 -0
  170. package/src/components/invoices/create/create-invoice-form.tsx +106 -11
  171. package/src/components/invoices/create/locales/de.ts +26 -0
  172. package/src/components/invoices/create/locales/es.ts +26 -0
  173. package/src/components/invoices/create/locales/fr.ts +26 -0
  174. package/src/components/invoices/create/locales/hr.ts +25 -0
  175. package/src/components/invoices/create/locales/it.ts +26 -0
  176. package/src/components/invoices/create/locales/nl.ts +26 -0
  177. package/src/components/invoices/create/locales/pl.ts +25 -0
  178. package/src/components/invoices/create/locales/pt.ts +25 -0
  179. package/src/components/invoices/create/locales/sl.ts +26 -1
  180. package/src/components/invoices/invoices-furs.hooks.ts +4 -1
  181. package/src/components/invoices/list/list-table.tsx +77 -31
  182. package/src/components/invoices/list/locales/de.ts +5 -0
  183. package/src/components/invoices/list/locales/en.ts +4 -0
  184. package/src/components/invoices/list/locales/es.ts +5 -0
  185. package/src/components/invoices/list/locales/fr.ts +5 -0
  186. package/src/components/invoices/list/locales/hr.ts +5 -0
  187. package/src/components/invoices/list/locales/it.ts +5 -0
  188. package/src/components/invoices/list/locales/nl.ts +5 -0
  189. package/src/components/invoices/list/locales/pl.ts +5 -0
  190. package/src/components/invoices/list/locales/pt.ts +5 -0
  191. package/src/components/invoices/list/locales/sl.ts +5 -0
  192. package/src/components/invoices/view/fiscalization-status-card.tsx +44 -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-table.tsx +3 -3
  196. package/src/components/items/item-list-table/locales/de.ts +1 -0
  197. package/src/components/items/item-list-table/locales/es.ts +1 -0
  198. package/src/components/items/item-list-table/locales/fr.ts +1 -0
  199. package/src/components/items/item-list-table/locales/hr.ts +1 -0
  200. package/src/components/items/item-list-table/locales/it.ts +1 -0
  201. package/src/components/items/item-list-table/locales/nl.ts +1 -0
  202. package/src/components/items/item-list-table/locales/pl.ts +1 -0
  203. package/src/components/items/item-list-table/locales/pt.ts +1 -0
  204. package/src/components/items/item-list-table/locales/sl.ts +1 -0
  205. package/src/components/payments/list/list-table.tsx +0 -4
  206. package/src/components/payments/list/locales/de.ts +1 -0
  207. package/src/components/payments/list/locales/es.ts +1 -0
  208. package/src/components/payments/list/locales/fr.ts +1 -0
  209. package/src/components/payments/list/locales/hr.ts +1 -0
  210. package/src/components/payments/list/locales/it.ts +1 -0
  211. package/src/components/payments/list/locales/nl.ts +1 -0
  212. package/src/components/payments/list/locales/pl.ts +1 -0
  213. package/src/components/payments/list/locales/pt.ts +1 -0
  214. package/src/components/payments/list/locales/sl.ts +1 -0
  215. package/src/components/recurring-invoices/list/list-table.tsx +0 -7
  216. package/src/components/recurring-invoices/list/locales/de.ts +1 -0
  217. package/src/components/recurring-invoices/list/locales/es.ts +1 -0
  218. package/src/components/recurring-invoices/list/locales/fr.ts +1 -0
  219. package/src/components/recurring-invoices/list/locales/hr.ts +1 -0
  220. package/src/components/recurring-invoices/list/locales/it.ts +1 -0
  221. package/src/components/recurring-invoices/list/locales/nl.ts +1 -0
  222. package/src/components/recurring-invoices/list/locales/pl.ts +1 -0
  223. package/src/components/recurring-invoices/list/locales/pt.ts +1 -0
  224. package/src/components/recurring-invoices/list/locales/sl.ts +1 -0
  225. package/src/components/request-logs/request-log-list-table.tsx +0 -3
  226. package/src/components/table/README.md +14 -121
  227. package/src/components/table/data-table.tsx +22 -37
  228. package/src/components/table/hooks/use-table-state.ts +3 -27
  229. package/src/components/table/index.ts +0 -2
  230. package/src/components/table/search-input.tsx +17 -0
  231. package/src/components/table/selection-toolbar.tsx +35 -1
  232. package/src/components/table/table-empty-state.tsx +6 -3
  233. package/src/components/table/table-no-results.tsx +10 -5
  234. package/src/components/table/types.ts +0 -5
  235. package/src/components/taxes/tax-list-table/locales/de.ts +1 -0
  236. package/src/components/taxes/tax-list-table/locales/es.ts +1 -0
  237. package/src/components/taxes/tax-list-table/locales/fr.ts +1 -0
  238. package/src/components/taxes/tax-list-table/locales/hr.ts +1 -0
  239. package/src/components/taxes/tax-list-table/locales/it.ts +1 -0
  240. package/src/components/taxes/tax-list-table/locales/nl.ts +1 -0
  241. package/src/components/taxes/tax-list-table/locales/pl.ts +1 -0
  242. package/src/components/taxes/tax-list-table/locales/pt.ts +1 -0
  243. package/src/components/taxes/tax-list-table/locales/sl.ts +1 -0
  244. package/src/components/taxes/tax-list-table/tax-list-header.tsx +3 -14
  245. package/src/components/taxes/tax-list-table/tax-list-table.tsx +3 -3
  246. package/src/components/ui/popover.tsx +3 -1
  247. package/src/components/ui/tooltip.tsx +3 -1
  248. package/src/generated/schemas/advanceinvoice.ts +4 -2
  249. package/src/generated/schemas/creditnote.ts +2 -1
  250. package/src/generated/schemas/deliverynote.ts +2 -1
  251. package/src/generated/schemas/estimate.ts +4 -2
  252. package/src/generated/schemas/index.ts +1 -1
  253. package/src/generated/schemas/invoice.ts +2 -1
  254. package/src/generated/schemas/renderadvanceinvoicepreview_body.ts +17 -23
  255. package/src/generated/schemas/rendercreditnotepreview_body.ts +17 -23
  256. package/src/generated/schemas/renderdeliverynotepreview_body.ts +17 -23
  257. package/src/generated/schemas/renderestimatepreview_body.ts +17 -23
  258. package/src/generated/schemas/renderinvoicepreview_body.ts +19 -23
  259. package/src/hooks/use-duplicate-document.ts +56 -14
  260. package/src/hooks/use-vies-check.ts +3 -0
  261. package/src/lib/fiscalization.ts +12 -0
  262. package/src/lib/schemas/advance-invoice.ts +0 -1
  263. package/src/components/table/sortable-header.tsx +0 -56
@@ -11,6 +11,7 @@ import { Form } from "@/ui/components/ui/form";
11
11
  import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/ui/components/ui/tooltip";
12
12
  import { createEstimateSchema } from "@/ui/generated/schemas";
13
13
  import { useNextDocumentNumber } from "@/ui/hooks/use-next-document-number";
14
+ import { useViesCheck } from "@/ui/hooks/use-vies-check";
14
15
  import type { ComponentTranslationProps } from "@/ui/lib/translation";
15
16
  import { createTranslation } from "@/ui/lib/translation";
16
17
  import { useEntities } from "@/ui/providers/entities-context";
@@ -20,6 +21,7 @@ import {
20
21
  DocumentDetailsSection,
21
22
  DocumentNoteField,
22
23
  DocumentPaymentTermsField,
24
+ DocumentTaxClauseField,
23
25
  } from "../../documents/create/document-details-section";
24
26
  import { DocumentItemsSection, type PriceModesMap } from "../../documents/create/document-items-section";
25
27
  import { DocumentRecipientSection } from "../../documents/create/document-recipient-section";
@@ -37,6 +39,12 @@ import sl from "./locales/sl";
37
39
  import { prepareEstimateSubmission } from "./prepare-estimate-submission";
38
40
  import { useEstimateCustomerForm } from "./use-estimate-customer-form";
39
41
 
42
+ function calculateDueDate(dateIso: string, days: number): string {
43
+ const date = new Date(dateIso);
44
+ date.setDate(date.getDate() + days);
45
+ return date.toISOString();
46
+ }
47
+
40
48
  const translations = {
41
49
  sl,
42
50
  de,
@@ -101,6 +109,7 @@ export default function CreateEstimateForm({
101
109
 
102
110
  // Get default estimate note from entity settings
103
111
  const defaultEstimateNote = (activeEntity?.settings as any)?.default_estimate_note || "";
112
+ const defaultEstimateValidDays = (activeEntity?.settings as any)?.default_estimate_valid_days ?? 30;
104
113
 
105
114
  // Fetch next estimate number
106
115
  const { data: nextNumberData } = useNextDocumentNumber(entityId, "estimate", {
@@ -119,13 +128,18 @@ export default function CreateEstimateForm({
119
128
  // Cast customer to form schema type (API type may have additional fields)
120
129
  customer: (initialValues?.customer as CreateEstimateFormValues["customer"]) ?? undefined,
121
130
  items: initialValues?.items?.length
122
- ? initialValues.items.map((item) => ({
131
+ ? initialValues.items.map((item: any) => ({
132
+ type: item.type,
123
133
  name: item.name || "",
124
134
  description: item.description || "",
125
- quantity: item.quantity ?? 1,
126
- // Use gross_price if set, otherwise use price
127
- price: item.gross_price ?? item.price,
128
- taxes: item.taxes || [],
135
+ ...(item.type !== "separator"
136
+ ? {
137
+ quantity: item.quantity ?? 1,
138
+ // Use gross_price if set, otherwise use price
139
+ price: item.gross_price ?? item.price,
140
+ taxes: item.taxes || [],
141
+ }
142
+ : {}),
129
143
  }))
130
144
  : [
131
145
  {
@@ -138,7 +152,11 @@ export default function CreateEstimateForm({
138
152
  ],
139
153
  currency_code: initialValues?.currency_code || activeEntity?.currency_code || "EUR",
140
154
  note: initialValues?.note ?? defaultEstimateNote,
155
+ tax_clause: (initialValues as any)?.tax_clause ?? "",
141
156
  payment_terms: initialValues?.payment_terms ?? defaultPaymentTerms,
157
+ date_valid_till:
158
+ initialValues?.date_valid_till ||
159
+ calculateDueDate(initialValues?.date || new Date().toISOString(), defaultEstimateValidDays),
142
160
  },
143
161
  });
144
162
 
@@ -165,13 +183,20 @@ export default function CreateEstimateForm({
165
183
  }
166
184
  }, [nextNumberData?.number, form]);
167
185
 
168
- // Update default note when entity loads
186
+ // Update default note and valid-till date when entity loads
169
187
  useEffect(() => {
170
188
  const entityDefaultNote = (activeEntity?.settings as any)?.default_estimate_note;
171
189
  if (entityDefaultNote && !form.getValues("note")) {
172
190
  form.setValue("note", entityDefaultNote);
173
191
  }
174
- }, [activeEntity, form]);
192
+ if (!initialValues?.date_valid_till) {
193
+ const validDays = (activeEntity?.settings as any)?.default_estimate_valid_days ?? 30;
194
+ const currentDate = form.getValues("date");
195
+ if (currentDate) {
196
+ form.setValue("date_valid_till", calculateDueDate(currentDate, validDays));
197
+ }
198
+ }
199
+ }, [activeEntity, form, initialValues?.date_valid_till]);
175
200
 
176
201
  // Auto-add tax field for tax subject entities
177
202
  useEffect(() => {
@@ -217,6 +242,37 @@ export default function CreateEstimateForm({
217
242
  control: form.control,
218
243
  });
219
244
 
245
+ // ============================================================================
246
+ // VIES Check - determine if reverse charge applies
247
+ // ============================================================================
248
+ const {
249
+ reverseChargeApplies,
250
+ transactionType,
251
+ isFetching: isViesFetching,
252
+ warning: viesWarning,
253
+ } = useViesCheck({
254
+ issuerCountryCode: activeEntity?.country_code,
255
+ isTaxSubject: activeEntity?.is_tax_subject ?? true,
256
+ customerCountry: formValues.customer?.country,
257
+ customerCountryCode: formValues.customer?.country_code,
258
+ customerTaxNumber: formValues.customer?.tax_number,
259
+ enabled: !!activeEntity,
260
+ });
261
+
262
+ // Auto-populate tax_clause from entity settings when transaction type changes
263
+ const effectiveTransactionType = transactionType ?? "domestic";
264
+ const prevTransactionTypeRef = useRef<string | undefined>(undefined);
265
+ useEffect(() => {
266
+ if (effectiveTransactionType === prevTransactionTypeRef.current) return;
267
+ prevTransactionTypeRef.current = effectiveTransactionType;
268
+
269
+ const taxClauseDefaults = (activeEntity?.settings as any)?.tax_clause_defaults;
270
+ if (!taxClauseDefaults) return;
271
+
272
+ const clause = taxClauseDefaults[effectiveTransactionType] ?? "";
273
+ form.setValue("tax_clause", clause);
274
+ }, [effectiveTransactionType, activeEntity, form]);
275
+
220
276
  // Extract customer management logic into a custom hook
221
277
  const {
222
278
  originalCustomer,
@@ -287,7 +343,7 @@ export default function CreateEstimateForm({
287
343
  useFormFooterRegistration({
288
344
  formId: "create-estimate-form",
289
345
  isPending,
290
- isDirty: form.formState.isDirty,
346
+ isDirty: form.formState.isDirty || !!initialValues,
291
347
  label: titleType === "estimate" ? t("Create Estimate") : t("Create Quote"),
292
348
  secondaryAction,
293
349
  });
@@ -300,6 +356,16 @@ export default function CreateEstimateForm({
300
356
  }
301
357
  }, [activeEntity, form]);
302
358
 
359
+ // Recalculate valid-till date when document date changes
360
+ const prevDateRef = useRef(form.getValues("date"));
361
+ useEffect(() => {
362
+ const currentDate = formValues.date;
363
+ if (!currentDate || currentDate === prevDateRef.current) return;
364
+ prevDateRef.current = currentDate;
365
+ const validDays = (activeEntity?.settings as any)?.default_estimate_valid_days ?? 30;
366
+ form.setValue("date_valid_till", calculateDueDate(currentDate, validDays));
367
+ }, [formValues.date, activeEntity, form]);
368
+
303
369
  useEffect(() => {
304
370
  const callback = onChangeRef.current;
305
371
  if (!callback) return;
@@ -365,6 +431,10 @@ export default function CreateEstimateForm({
365
431
  maxTaxesPerItem={activeEntity?.country_rules?.max_taxes_per_item}
366
432
  priceModesRef={priceModesRef}
367
433
  initialPriceModes={initialPriceModes}
434
+ taxesDisabled={reverseChargeApplies}
435
+ taxesDisabledMessage={
436
+ reverseChargeApplies ? t("Reverse charge - tax exempt EU B2B sale") : viesWarning ? viesWarning : undefined
437
+ }
368
438
  />
369
439
 
370
440
  <DocumentNoteField
@@ -380,6 +450,21 @@ export default function CreateEstimateForm({
380
450
  }}
381
451
  />
382
452
 
453
+ <DocumentTaxClauseField
454
+ control={form.control}
455
+ t={t}
456
+ entity={activeEntity}
457
+ document={{
458
+ number: formValues.number,
459
+ date: formValues.date,
460
+ date_valid_till: formValues.date_valid_till,
461
+ currency_code: formValues.currency_code,
462
+ customer: formValues.customer as any,
463
+ }}
464
+ transactionType={transactionType}
465
+ isTransactionTypeFetching={isViesFetching}
466
+ />
467
+
383
468
  <DocumentPaymentTermsField
384
469
  control={form.control}
385
470
  t={t}
@@ -61,4 +61,20 @@ export default {
61
61
  "Net price": "Nettopreis",
62
62
  "Gross price (tax included)": "Bruttopreis (inkl. MwSt.)",
63
63
  "Net price (before tax)": "Nettopreis (exkl. MwSt.)",
64
+ // Separator items
65
+ "Add separator": "Trennzeile hinzufügen",
66
+ "Section header": "Abschnittsüberschrift",
67
+ "Section title...": "Abschnittstitel...",
68
+ // Transaction type
69
+ "Transaction type": "Transaktionstyp",
70
+ Domestic: "Inland",
71
+ "EU B2B": "EU B2B",
72
+ "EU B2C": "EU B2C",
73
+ Export: "Export",
74
+ "Determining transaction type...": "Transaktionstyp wird ermittelt...",
75
+ "This invoice will not be fiscalized (non-domestic transaction)":
76
+ "Diese Rechnung wird nicht fiskalisiert (nicht-inländische Transaktion)",
77
+ "Tax Clause": "Steuerklausel",
78
+ "Add tax clause...": "Steuerklausel hinzufügen...",
79
+ "Reverse charge - tax exempt EU B2B sale": "Umkehrung der Steuerschuldnerschaft - steuerbefreiter EU B2B Verkauf",
64
80
  } as const;
@@ -54,4 +54,20 @@ export default {
54
54
  "Net price": "Precio neto",
55
55
  "Gross price (tax included)": "Precio bruto (impuestos incluidos)",
56
56
  "Net price (before tax)": "Precio neto (antes de impuestos)",
57
+ // Separator items
58
+ "Add separator": "Añadir separador",
59
+ "Section header": "Encabezado de sección",
60
+ "Section title...": "Título de sección...",
61
+ // Transaction type
62
+ "Transaction type": "Tipo de transacción",
63
+ Domestic: "Nacional",
64
+ "EU B2B": "EU B2B",
65
+ "EU B2C": "EU B2C",
66
+ Export: "Exportación",
67
+ "Determining transaction type...": "Determinando tipo de transacción...",
68
+ "This invoice will not be fiscalized (non-domestic transaction)":
69
+ "Esta factura no será fiscalizada (transacción no nacional)",
70
+ "Tax Clause": "Cláusula fiscal",
71
+ "Add tax clause...": "Agregar cláusula fiscal...",
72
+ "Reverse charge - tax exempt EU B2B sale": "Inversión del sujeto pasivo - venta EU B2B exenta de impuestos",
57
73
  } as const;
@@ -55,4 +55,20 @@ export default {
55
55
  "Net price": "Prix net",
56
56
  "Gross price (tax included)": "Prix brut (taxes incluses)",
57
57
  "Net price (before tax)": "Prix net (avant taxes)",
58
+ // Separator items
59
+ "Add separator": "Ajouter un séparateur",
60
+ "Section header": "En-tête de section",
61
+ "Section title...": "Titre de section...",
62
+ // Transaction type
63
+ "Transaction type": "Type de transaction",
64
+ Domestic: "Nationale",
65
+ "EU B2B": "EU B2B",
66
+ "EU B2C": "EU B2C",
67
+ Export: "Exportation",
68
+ "Determining transaction type...": "Détermination du type de transaction...",
69
+ "This invoice will not be fiscalized (non-domestic transaction)":
70
+ "Cette facture ne sera pas fiscalisée (transaction non nationale)",
71
+ "Tax Clause": "Clause fiscale",
72
+ "Add tax clause...": "Ajouter une clause fiscale...",
73
+ "Reverse charge - tax exempt EU B2B sale": "Autoliquidation - vente B2B UE exonérée de taxe",
58
74
  } as const;
@@ -54,4 +54,20 @@ export default {
54
54
  "Net price": "Neto cijena",
55
55
  "Gross price (tax included)": "Bruto cijena (s porezom)",
56
56
  "Net price (before tax)": "Neto cijena (prije poreza)",
57
+ // Separator items
58
+ "Add separator": "Dodaj separator",
59
+ "Section header": "Naslov odjeljka",
60
+ "Section title...": "Naslov odjeljka...",
61
+ // Transaction type
62
+ "Transaction type": "Vrsta transakcije",
63
+ Domestic: "Domaća",
64
+ "EU B2B": "EU B2B",
65
+ "EU B2C": "EU B2C",
66
+ Export: "Izvoz",
67
+ "Determining transaction type...": "Određivanje vrste transakcije...",
68
+ "This invoice will not be fiscalized (non-domestic transaction)":
69
+ "Ovaj račun neće biti fiskaliziran (nedomaća transakcija)",
70
+ "Tax Clause": "Porezna klauzula",
71
+ "Add tax clause...": "Dodajte poreznu klauzulu...",
72
+ "Reverse charge - tax exempt EU B2B sale": "Prijenos porezne obveze - porezno oslobođena EU B2B prodaja",
57
73
  } as const;
@@ -54,4 +54,20 @@ export default {
54
54
  "Net price": "Prezzo netto",
55
55
  "Gross price (tax included)": "Prezzo lordo (imposte incluse)",
56
56
  "Net price (before tax)": "Prezzo netto (prima delle imposte)",
57
+ // Separator items
58
+ "Add separator": "Aggiungi separatore",
59
+ "Section header": "Intestazione sezione",
60
+ "Section title...": "Titolo sezione...",
61
+ // Transaction type
62
+ "Transaction type": "Tipo di transazione",
63
+ Domestic: "Nazionale",
64
+ "EU B2B": "EU B2B",
65
+ "EU B2C": "EU B2C",
66
+ Export: "Esportazione",
67
+ "Determining transaction type...": "Determinazione tipo di transazione...",
68
+ "This invoice will not be fiscalized (non-domestic transaction)":
69
+ "Questa fattura non sarà fiscalizzata (transazione non nazionale)",
70
+ "Tax Clause": "Clausola fiscale",
71
+ "Add tax clause...": "Aggiungi clausola fiscale...",
72
+ "Reverse charge - tax exempt EU B2B sale": "Inversione contabile - vendita B2B UE esente da imposta",
57
73
  } as const;
@@ -55,4 +55,20 @@ export default {
55
55
  "Net price": "Nettoprijs",
56
56
  "Gross price (tax included)": "Brutoprijs (inclusief belasting)",
57
57
  "Net price (before tax)": "Nettoprijs (exclusief belasting)",
58
+ // Separator items
59
+ "Add separator": "Scheidingslijn toevoegen",
60
+ "Section header": "Sectiekop",
61
+ "Section title...": "Sectietitel...",
62
+ // Transaction type
63
+ "Transaction type": "Transactietype",
64
+ Domestic: "Binnenland",
65
+ "EU B2B": "EU B2B",
66
+ "EU B2C": "EU B2C",
67
+ Export: "Export",
68
+ "Determining transaction type...": "Transactietype bepalen...",
69
+ "This invoice will not be fiscalized (non-domestic transaction)":
70
+ "Deze factuur wordt niet gefiscaliseerd (niet-binnenlandse transactie)",
71
+ "Tax Clause": "Belastingclausule",
72
+ "Add tax clause...": "Belastingclausule toevoegen...",
73
+ "Reverse charge - tax exempt EU B2B sale": "Verlegging - belastingvrijgestelde EU B2B verkoop",
58
74
  } as const;
@@ -54,4 +54,20 @@ export default {
54
54
  "Net price": "Cena netto",
55
55
  "Gross price (tax included)": "Cena brutto (z podatkiem)",
56
56
  "Net price (before tax)": "Cena netto (przed podatkiem)",
57
+ // Separator items
58
+ "Add separator": "Dodaj separator",
59
+ "Section header": "Nagłówek sekcji",
60
+ "Section title...": "Tytuł sekcji...",
61
+ // Transaction type
62
+ "Transaction type": "Typ transakcji",
63
+ Domestic: "Krajowa",
64
+ "EU B2B": "EU B2B",
65
+ "EU B2C": "EU B2C",
66
+ Export: "Eksport",
67
+ "Determining transaction type...": "Określanie typu transakcji...",
68
+ "This invoice will not be fiscalized (non-domestic transaction)":
69
+ "Ta faktura nie będzie fiskalizowana (transakcja niekrajowa)",
70
+ "Tax Clause": "Klauzula podatkowa",
71
+ "Add tax clause...": "Dodaj klauzulę podatkową...",
72
+ "Reverse charge - tax exempt EU B2B sale": "Odwrotne obciążenie - zwolniona z podatku sprzedaż EU B2B",
57
73
  } as const;
@@ -55,4 +55,20 @@ export default {
55
55
  "Net price": "Preço líquido",
56
56
  "Gross price (tax included)": "Preço bruto (impostos incluídos)",
57
57
  "Net price (before tax)": "Preço líquido (antes de impostos)",
58
+ // Separator items
59
+ "Add separator": "Adicionar separador",
60
+ "Section header": "Cabeçalho da secção",
61
+ "Section title...": "Título da secção...",
62
+ // Transaction type
63
+ "Transaction type": "Tipo de transação",
64
+ Domestic: "Nacional",
65
+ "EU B2B": "EU B2B",
66
+ "EU B2C": "EU B2C",
67
+ Export: "Exportação",
68
+ "Determining transaction type...": "Determinando tipo de transação...",
69
+ "This invoice will not be fiscalized (non-domestic transaction)":
70
+ "Esta fatura não será fiscalizada (transação não nacional)",
71
+ "Tax Clause": "Cláusula fiscal",
72
+ "Add tax clause...": "Adicionar cláusula fiscal...",
73
+ "Reverse charge - tax exempt EU B2B sale": "Autoliquidação - venda B2B UE isenta de imposto",
58
74
  } as const;
@@ -23,7 +23,7 @@ export default {
23
23
  "Tax Number": "Davčna številka",
24
24
  Items: "Postavke",
25
25
  "Add item": "Dodaj postavko",
26
- Tax: "Davek",
26
+ Tax: "DDV",
27
27
  "Tax rate": "Davčna stopnja",
28
28
  "Add tax": "Dodaj davek",
29
29
  "Select tax...": "Izberi davek...",
@@ -60,4 +60,20 @@ export default {
60
60
  "Net price": "Neto cena",
61
61
  "Gross price (tax included)": "Bruto cena (z davkom)",
62
62
  "Net price (before tax)": "Neto cena (brez davka)",
63
+ // Separator items
64
+ "Add separator": "Dodaj ločilnik",
65
+ "Section header": "Naslov razdelka",
66
+ "Section title...": "Naslov razdelka...",
67
+ // Transaction type
68
+ "Transaction type": "Vrsta transakcije",
69
+ Domestic: "Domača",
70
+ "EU B2B": "EU B2B",
71
+ "EU B2C": "EU B2C",
72
+ Export: "Izvoz",
73
+ "Determining transaction type...": "Določanje vrste transakcije...",
74
+ "This invoice will not be fiscalized (non-domestic transaction)":
75
+ "Ta račun ne bo fiskaliziran (nedomača transakcija)",
76
+ "Tax Clause": "Davčna klavzula",
77
+ "Add tax clause...": "Dodajte davčno klavzulo...",
78
+ "Reverse charge - tax exempt EU B2B sale": "Obrnjena davčna obveznost - davka oproščena EU B2B prodaja",
63
79
  } as const;
@@ -52,6 +52,8 @@ type EstimateListTableProps = {
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;
55
57
  } & ListTableProps<Estimate>;
56
58
 
57
59
  export default function EstimateListTable({
@@ -65,6 +67,8 @@ export default function EstimateListTable({
65
67
  onDownloadSuccess,
66
68
  onDownloadError,
67
69
  onExportSelected,
70
+ onCopyToInvoice,
71
+ onCreateNew,
68
72
  ...i18nProps
69
73
  }: EstimateListTableProps) {
70
74
  const t = createTranslation({
@@ -84,7 +88,6 @@ export default function EstimateListTable({
84
88
  limit: params.limit,
85
89
  next_cursor: params.next_cursor,
86
90
  prev_cursor: params.prev_cursor,
87
- order_by: params.order_by,
88
91
  search: params.search,
89
92
  query: params.query,
90
93
  });
@@ -109,6 +112,12 @@ export default function EstimateListTable({
109
112
  }
110
113
  }, [selectedIds, onExportSelected]);
111
114
 
115
+ const handleCopyToInvoice = useCallback(() => {
116
+ if (selectedIds.size > 0 && onCopyToInvoice) {
117
+ onCopyToInvoice(Array.from(selectedIds));
118
+ }
119
+ }, [selectedIds, onCopyToInvoice]);
120
+
112
121
  const handleDeselectAll = useCallback(() => {
113
122
  setSelectedIds(new Set());
114
123
  }, []);
@@ -118,11 +127,12 @@ export default function EstimateListTable({
118
127
  <SelectionToolbar
119
128
  selectedCount={count}
120
129
  onExportPdfs={onExportSelected ? handleExportPdfs : undefined}
130
+ onCopyToInvoice={onCopyToInvoice ? handleCopyToInvoice : undefined}
121
131
  onDeselectAll={handleDeselectAll}
122
132
  t={t}
123
133
  />
124
134
  ),
125
- [handleExportPdfs, handleDeselectAll, onExportSelected, t],
135
+ [handleExportPdfs, handleCopyToInvoice, handleDeselectAll, onExportSelected, onCopyToInvoice, t],
126
136
  );
127
137
 
128
138
  const columns: Column<Estimate>[] = useMemo(
@@ -130,7 +140,6 @@ export default function EstimateListTable({
130
140
  {
131
141
  id: "number",
132
142
  header: t("Number"),
133
- sortable: true,
134
143
  cell: (estimate) => (
135
144
  <div className="flex items-center gap-2">
136
145
  <Button variant="link" className="cursor-pointer py-0 underline" onClick={() => onRowClick?.(estimate)}>
@@ -155,26 +164,22 @@ export default function EstimateListTable({
155
164
  {
156
165
  id: "date",
157
166
  header: t("Date"),
158
- sortable: true,
159
167
  cell: (estimate) => <FormattedDate date={estimate.date} />,
160
168
  },
161
169
  {
162
170
  id: "date_valid_till",
163
171
  header: t("Valid Until"),
164
- sortable: true,
165
172
  cell: (estimate) => <FormattedDate date={estimate.date_valid_till} />,
166
173
  },
167
174
  {
168
175
  id: "total",
169
176
  header: t("Total"),
170
- sortable: true,
171
177
  align: "right",
172
178
  cell: (estimate) => estimate.total,
173
179
  },
174
180
  {
175
181
  id: "total_with_tax",
176
182
  header: t("Total with Tax"),
177
- sortable: true,
178
183
  align: "right",
179
184
  cell: (estimate) => estimate.total_with_tax,
180
185
  },
@@ -208,11 +213,12 @@ export default function EstimateListTable({
208
213
  cacheKey="estimates"
209
214
  resourceName="estimate"
210
215
  createNewLink={entityId ? `/app/${entityId}/documents/add/estimate` : undefined}
216
+ onCreateNew={onCreateNew}
211
217
  entityId={entityId}
212
218
  filterConfig={filterConfig}
213
219
  t={t}
214
220
  locale={i18nProps.locale}
215
- selectable={!!onExportSelected}
221
+ selectable={!!(onExportSelected || onCopyToInvoice)}
216
222
  selectedIds={selectedIds}
217
223
  onSelectionChange={setSelectedIds}
218
224
  selectionToolbar={selectionToolbar}
@@ -32,7 +32,9 @@ export default {
32
32
  "No results found": "Keine Angebote gefunden",
33
33
  "Try adjusting your search criteria": "Versuchen Sie, Ihre Suchkriterien anzupassen",
34
34
  "Clear search": "Suche zurücksetzen",
35
+ "Clear all": "Alles zurücksetzen",
35
36
  selected: "ausgewählt",
36
37
  "Export PDFs": "PDFs exportieren",
37
38
  "Deselect all": "Auswahl aufheben",
39
+ "Copy to Invoice": "In Rechnung kopieren",
38
40
  } as const;
@@ -8,4 +8,5 @@ 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",
11
12
  } as const;
@@ -29,7 +29,9 @@ export default {
29
29
  "No results found": "No se encontraron presupuestos",
30
30
  "Try adjusting your search criteria": "Intente ajustar sus criterios de búsqueda",
31
31
  "Clear search": "Limpiar búsqueda",
32
+ "Clear all": "Borrar todo",
32
33
  selected: "seleccionados",
33
34
  "Export PDFs": "Exportar PDFs",
34
35
  "Deselect all": "Deseleccionar todo",
36
+ "Copy to Invoice": "Copiar a factura",
35
37
  } as const;
@@ -29,7 +29,9 @@ export default {
29
29
  "No results found": "Aucun devis trouvé",
30
30
  "Try adjusting your search criteria": "Essayez d'ajuster vos critères de recherche",
31
31
  "Clear search": "Effacer la recherche",
32
+ "Clear all": "Tout effacer",
32
33
  selected: "sélectionnés",
33
34
  "Export PDFs": "Exporter les PDF",
34
35
  "Deselect all": "Tout désélectionner",
36
+ "Copy to Invoice": "Copier vers facture",
35
37
  } as const;
@@ -29,7 +29,9 @@ export default {
29
29
  "No results found": "Nisu pronađeni predračuni",
30
30
  "Try adjusting your search criteria": "Pokušajte prilagoditi kriterije pretraživanja",
31
31
  "Clear search": "Očisti pretraživanje",
32
+ "Clear all": "Očisti sve",
32
33
  selected: "odabranih",
33
34
  "Export PDFs": "Izvezi PDF-ove",
34
35
  "Deselect all": "Poništi odabir",
36
+ "Copy to Invoice": "Kopiraj u račun",
35
37
  } as const;
@@ -29,7 +29,9 @@ export default {
29
29
  "No results found": "Nessun preventivo trovato",
30
30
  "Try adjusting your search criteria": "Prova a modificare i criteri di ricerca",
31
31
  "Clear search": "Cancella ricerca",
32
+ "Clear all": "Cancella tutto",
32
33
  selected: "selezionati",
33
34
  "Export PDFs": "Esporta PDF",
34
35
  "Deselect all": "Deseleziona tutto",
36
+ "Copy to Invoice": "Copia in fattura",
35
37
  } as const;
@@ -29,7 +29,9 @@ export default {
29
29
  "No results found": "Geen offertes gevonden",
30
30
  "Try adjusting your search criteria": "Probeer uw zoekcriteria aan te passen",
31
31
  "Clear search": "Zoekopdracht wissen",
32
+ "Clear all": "Alles wissen",
32
33
  selected: "geselecteerd",
33
34
  "Export PDFs": "PDFs exporteren",
34
35
  "Deselect all": "Alles deselecteren",
36
+ "Copy to Invoice": "Kopieer naar factuur",
35
37
  } as const;
@@ -29,7 +29,9 @@ export default {
29
29
  "No results found": "Nie znaleziono kosztorysów",
30
30
  "Try adjusting your search criteria": "Spróbuj dostosować kryteria wyszukiwania",
31
31
  "Clear search": "Wyczyść wyszukiwanie",
32
+ "Clear all": "Wyczyść wszystko",
32
33
  selected: "wybranych",
33
34
  "Export PDFs": "Eksportuj PDF-y",
34
35
  "Deselect all": "Odznacz wszystko",
36
+ "Copy to Invoice": "Kopiuj do faktury",
35
37
  } as const;
@@ -29,7 +29,9 @@ export default {
29
29
  "No results found": "Nenhum orçamento encontrado",
30
30
  "Try adjusting your search criteria": "Tente ajustar os seus critérios de pesquisa",
31
31
  "Clear search": "Limpar pesquisa",
32
+ "Clear all": "Limpar tudo",
32
33
  selected: "selecionados",
33
34
  "Export PDFs": "Exportar PDFs",
34
35
  "Deselect all": "Desselecionar tudo",
36
+ "Copy to Invoice": "Copiar para fatura",
35
37
  } as const;
@@ -32,7 +32,9 @@ export default {
32
32
  "No results found": "Ni najdenih predračunov",
33
33
  "Try adjusting your search criteria": "Poskusite prilagoditi iskalne kriterije",
34
34
  "Clear search": "Počisti iskanje",
35
+ "Clear all": "Počisti vse",
35
36
  selected: "izbranih",
36
37
  "Export PDFs": "Izvozi PDF-je",
37
38
  "Deselect all": "Počisti izbiro",
39
+ "Copy to Invoice": "Kopiraj v račun",
38
40
  } as const;