@spaceinvoices/react-ui 0.4.10 → 0.4.12

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 (638) hide show
  1. package/README.md +24 -8
  2. package/cli/dist/index.js +89 -26
  3. package/package.json +6 -2
  4. package/registry.json +30 -31
  5. package/spaceinvoices.schema.json +6 -1
  6. package/src/common/autocomplete.tsx +41 -25
  7. package/src/components/activities/locales/bg.ts +21 -0
  8. package/src/components/activities/locales/cs.ts +21 -0
  9. package/src/components/activities/locales/en.ts +21 -0
  10. package/src/components/activities/locales/et.ts +21 -0
  11. package/src/components/activities/locales/fi.ts +21 -0
  12. package/src/components/activities/locales/is.ts +21 -0
  13. package/src/components/activities/locales/nb.ts +21 -0
  14. package/src/components/activities/locales/sk.ts +21 -0
  15. package/src/components/activities/locales/sv.ts +21 -0
  16. package/src/components/advance-invoices/advance-invoices.hooks.ts +2 -3
  17. package/src/components/advance-invoices/create/create-advance-invoice-form.tsx +290 -69
  18. package/src/components/advance-invoices/create/locales/bg.ts +48 -0
  19. package/src/components/advance-invoices/create/locales/cs.ts +48 -0
  20. package/src/components/advance-invoices/create/locales/en.ts +48 -0
  21. package/src/components/advance-invoices/create/locales/et.ts +48 -0
  22. package/src/components/advance-invoices/create/locales/fi.ts +48 -0
  23. package/src/components/advance-invoices/create/locales/hr.ts +17 -17
  24. package/src/components/advance-invoices/create/locales/is.ts +48 -0
  25. package/src/components/advance-invoices/create/locales/nb.ts +48 -0
  26. package/src/components/advance-invoices/create/locales/sk.ts +48 -0
  27. package/src/components/advance-invoices/create/locales/sl.ts +9 -7
  28. package/src/components/advance-invoices/create/locales/sv.ts +48 -0
  29. package/src/components/advance-invoices/create/prepare-advance-invoice-submission.ts +16 -2
  30. package/src/components/advance-invoices/list/list-row-actions.tsx +48 -16
  31. package/src/components/advance-invoices/list/list-table.tsx +33 -8
  32. package/src/components/advance-invoices/list/locales/bg.ts +51 -0
  33. package/src/components/advance-invoices/list/locales/cs.ts +51 -0
  34. package/src/components/advance-invoices/list/locales/en.ts +33 -2
  35. package/src/components/advance-invoices/list/locales/et.ts +51 -0
  36. package/src/components/advance-invoices/list/locales/fi.ts +51 -0
  37. package/src/components/advance-invoices/list/locales/hr.ts +15 -15
  38. package/src/components/advance-invoices/list/locales/is.ts +51 -0
  39. package/src/components/advance-invoices/list/locales/nb.ts +51 -0
  40. package/src/components/advance-invoices/list/locales/sk.ts +51 -0
  41. package/src/components/advance-invoices/list/locales/sv.ts +51 -0
  42. package/src/components/advance-invoices/list/use-advance-invoice-download.ts +3 -5
  43. package/src/components/common/autocomplete-locales.ts +101 -0
  44. package/src/components/company-registry/company-registry.hooks.ts +3 -7
  45. package/src/components/credit-notes/create/create-credit-note-form.tsx +211 -22
  46. package/src/components/credit-notes/create/locales/bg.ts +87 -0
  47. package/src/components/credit-notes/create/locales/cs.ts +87 -0
  48. package/src/components/credit-notes/create/locales/en.ts +87 -0
  49. package/src/components/credit-notes/create/locales/et.ts +87 -0
  50. package/src/components/credit-notes/create/locales/fi.ts +87 -0
  51. package/src/components/credit-notes/create/locales/hr.ts +24 -24
  52. package/src/components/credit-notes/create/locales/is.ts +87 -0
  53. package/src/components/credit-notes/create/locales/nb.ts +87 -0
  54. package/src/components/credit-notes/create/locales/sk.ts +87 -0
  55. package/src/components/credit-notes/create/locales/sl.ts +9 -9
  56. package/src/components/credit-notes/create/locales/sv.ts +87 -0
  57. package/src/components/credit-notes/create/prepare-credit-note-submission.ts +32 -0
  58. package/src/components/credit-notes/credit-notes.hooks.ts +15 -3
  59. package/src/components/credit-notes/list/list-row-actions.tsx +19 -7
  60. package/src/components/credit-notes/list/list-table.tsx +58 -7
  61. package/src/components/credit-notes/list/locales/bg.ts +48 -0
  62. package/src/components/credit-notes/list/locales/cs.ts +48 -0
  63. package/src/components/credit-notes/list/locales/en.ts +31 -2
  64. package/src/components/credit-notes/list/locales/et.ts +48 -0
  65. package/src/components/credit-notes/list/locales/fi.ts +48 -0
  66. package/src/components/credit-notes/list/locales/hr.ts +12 -12
  67. package/src/components/credit-notes/list/locales/is.ts +48 -0
  68. package/src/components/credit-notes/list/locales/nb.ts +48 -0
  69. package/src/components/credit-notes/list/locales/sk.ts +48 -0
  70. package/src/components/credit-notes/list/locales/sv.ts +48 -0
  71. package/src/components/credit-notes/list/use-credit-note-download.ts +3 -5
  72. package/src/components/customers/create-customer-form/locales/bg.ts +21 -0
  73. package/src/components/customers/create-customer-form/locales/cs.ts +21 -0
  74. package/src/components/customers/create-customer-form/locales/en.ts +21 -0
  75. package/src/components/customers/create-customer-form/locales/et.ts +21 -0
  76. package/src/components/customers/create-customer-form/locales/fi.ts +21 -0
  77. package/src/components/customers/create-customer-form/locales/hr.ts +11 -11
  78. package/src/components/customers/create-customer-form/locales/is.ts +21 -0
  79. package/src/components/customers/create-customer-form/locales/nb.ts +21 -0
  80. package/src/components/customers/create-customer-form/locales/sk.ts +21 -0
  81. package/src/components/customers/create-customer-form/locales/sv.ts +21 -0
  82. package/src/components/customers/customer-autocomplete.tsx +32 -4
  83. package/src/components/customers/customer-list-table/customer-list-table.tsx +8 -6
  84. package/src/components/customers/customer-list-table/locales/bg.ts +25 -0
  85. package/src/components/customers/customer-list-table/locales/cs.ts +25 -0
  86. package/src/components/customers/customer-list-table/locales/en.ts +17 -2
  87. package/src/components/customers/customer-list-table/locales/et.ts +25 -0
  88. package/src/components/customers/customer-list-table/locales/fi.ts +25 -0
  89. package/src/components/customers/customer-list-table/locales/hr.ts +11 -11
  90. package/src/components/customers/customer-list-table/locales/is.ts +25 -0
  91. package/src/components/customers/customer-list-table/locales/nb.ts +25 -0
  92. package/src/components/customers/customer-list-table/locales/sk.ts +25 -0
  93. package/src/components/customers/customer-list-table/locales/sv.ts +25 -0
  94. package/src/components/customers/customers.hooks.ts +14 -17
  95. package/src/components/customers/edit-customer-form/locales/bg.ts +13 -0
  96. package/src/components/customers/edit-customer-form/locales/cs.ts +13 -0
  97. package/src/components/customers/edit-customer-form/locales/en.ts +13 -0
  98. package/src/components/customers/edit-customer-form/locales/et.ts +13 -0
  99. package/src/components/customers/edit-customer-form/locales/fi.ts +13 -0
  100. package/src/components/customers/edit-customer-form/locales/hr.ts +5 -5
  101. package/src/components/customers/edit-customer-form/locales/is.ts +13 -0
  102. package/src/components/customers/edit-customer-form/locales/nb.ts +13 -0
  103. package/src/components/customers/edit-customer-form/locales/sk.ts +13 -0
  104. package/src/components/customers/edit-customer-form/locales/sv.ts +13 -0
  105. package/src/components/dashboard/collection-rate-card/collection-rate-card.tsx +7 -6
  106. package/src/components/dashboard/collection-rate-card/locales/en.ts +3 -0
  107. package/src/components/dashboard/collection-rate-card/use-collection-rate.ts +8 -7
  108. package/src/components/dashboard/invoice-status-chart/invoice-status-chart.tsx +7 -4
  109. package/src/components/dashboard/invoice-status-chart/locales/bg.ts +5 -5
  110. package/src/components/dashboard/invoice-status-chart/locales/cs.ts +5 -5
  111. package/src/components/dashboard/invoice-status-chart/locales/de.ts +1 -1
  112. package/src/components/dashboard/invoice-status-chart/locales/en.ts +10 -0
  113. package/src/components/dashboard/invoice-status-chart/locales/es.ts +1 -1
  114. package/src/components/dashboard/invoice-status-chart/locales/et.ts +5 -5
  115. package/src/components/dashboard/invoice-status-chart/locales/fi.ts +5 -5
  116. package/src/components/dashboard/invoice-status-chart/locales/fr.ts +1 -1
  117. package/src/components/dashboard/invoice-status-chart/locales/hr.ts +5 -5
  118. package/src/components/dashboard/invoice-status-chart/locales/is.ts +5 -5
  119. package/src/components/dashboard/invoice-status-chart/locales/it.ts +1 -1
  120. package/src/components/dashboard/invoice-status-chart/locales/nb.ts +5 -5
  121. package/src/components/dashboard/invoice-status-chart/locales/nl.ts +1 -1
  122. package/src/components/dashboard/invoice-status-chart/locales/pl.ts +1 -1
  123. package/src/components/dashboard/invoice-status-chart/locales/pt.ts +1 -1
  124. package/src/components/dashboard/invoice-status-chart/locales/sk.ts +5 -5
  125. package/src/components/dashboard/invoice-status-chart/locales/sl.ts +1 -1
  126. package/src/components/dashboard/invoice-status-chart/locales/sv.ts +5 -5
  127. package/src/components/dashboard/payment-methods-chart/locales/bg.ts +5 -5
  128. package/src/components/dashboard/payment-methods-chart/locales/cs.ts +5 -5
  129. package/src/components/dashboard/payment-methods-chart/locales/en.ts +12 -0
  130. package/src/components/dashboard/payment-methods-chart/locales/et.ts +5 -5
  131. package/src/components/dashboard/payment-methods-chart/locales/fi.ts +6 -6
  132. package/src/components/dashboard/payment-methods-chart/locales/hr.ts +3 -3
  133. package/src/components/dashboard/payment-methods-chart/locales/is.ts +5 -5
  134. package/src/components/dashboard/payment-methods-chart/locales/nb.ts +5 -5
  135. package/src/components/dashboard/payment-methods-chart/locales/sk.ts +5 -5
  136. package/src/components/dashboard/payment-methods-chart/locales/sv.ts +5 -5
  137. package/src/components/dashboard/payment-methods-chart/payment-methods-chart.tsx +4 -3
  138. package/src/components/dashboard/payment-trend-chart/locales/bg.ts +1 -1
  139. package/src/components/dashboard/payment-trend-chart/locales/cs.ts +1 -1
  140. package/src/components/dashboard/payment-trend-chart/locales/en.ts +6 -0
  141. package/src/components/dashboard/payment-trend-chart/locales/et.ts +1 -1
  142. package/src/components/dashboard/payment-trend-chart/locales/fi.ts +1 -1
  143. package/src/components/dashboard/payment-trend-chart/locales/is.ts +1 -1
  144. package/src/components/dashboard/payment-trend-chart/locales/nb.ts +1 -1
  145. package/src/components/dashboard/payment-trend-chart/locales/sk.ts +1 -1
  146. package/src/components/dashboard/payment-trend-chart/locales/sv.ts +1 -1
  147. package/src/components/dashboard/payment-trend-chart/payment-trend-chart.tsx +4 -3
  148. package/src/components/dashboard/payment-trend-chart/use-payment-trend.ts +12 -9
  149. package/src/components/dashboard/revenue-card.tsx +3 -3
  150. package/src/components/dashboard/revenue-trend-chart/locales/bg.ts +1 -1
  151. package/src/components/dashboard/revenue-trend-chart/locales/cs.ts +1 -1
  152. package/src/components/dashboard/revenue-trend-chart/locales/en.ts +6 -0
  153. package/src/components/dashboard/revenue-trend-chart/locales/et.ts +1 -1
  154. package/src/components/dashboard/revenue-trend-chart/locales/fi.ts +1 -1
  155. package/src/components/dashboard/revenue-trend-chart/locales/is.ts +1 -1
  156. package/src/components/dashboard/revenue-trend-chart/locales/nb.ts +1 -1
  157. package/src/components/dashboard/revenue-trend-chart/locales/sk.ts +1 -1
  158. package/src/components/dashboard/revenue-trend-chart/locales/sv.ts +1 -1
  159. package/src/components/dashboard/revenue-trend-chart/revenue-trend-chart.tsx +4 -3
  160. package/src/components/dashboard/revenue-trend-chart/use-revenue-trend.ts +4 -3
  161. package/src/components/dashboard/shared/local-date.ts +11 -0
  162. package/src/components/dashboard/shared/use-revenue-data.ts +6 -5
  163. package/src/components/dashboard/shared/use-stats-query.ts +7 -11
  164. package/src/components/dashboard/stat-card.tsx +3 -3
  165. package/src/components/dashboard/tax-collected-card/tax-collected-card.tsx +11 -9
  166. package/src/components/dashboard/tax-collected-card/use-tax-collected.ts +3 -2
  167. package/src/components/dashboard/top-customers-chart/locales/bg.ts +2 -2
  168. package/src/components/dashboard/top-customers-chart/locales/cs.ts +2 -2
  169. package/src/components/dashboard/top-customers-chart/locales/en.ts +7 -0
  170. package/src/components/dashboard/top-customers-chart/locales/et.ts +2 -2
  171. package/src/components/dashboard/top-customers-chart/locales/fi.ts +2 -2
  172. package/src/components/dashboard/top-customers-chart/locales/is.ts +2 -2
  173. package/src/components/dashboard/top-customers-chart/locales/nb.ts +2 -2
  174. package/src/components/dashboard/top-customers-chart/locales/sk.ts +2 -2
  175. package/src/components/dashboard/top-customers-chart/locales/sv.ts +2 -2
  176. package/src/components/dashboard/top-customers-chart/top-customers-chart.tsx +4 -3
  177. package/src/components/dashboard/top-customers-chart/use-top-customers.ts +7 -20
  178. package/src/components/delivery-notes/create/create-delivery-note-form.tsx +61 -31
  179. package/src/components/delivery-notes/create/locales/bg.ts +68 -0
  180. package/src/components/delivery-notes/create/locales/cs.ts +68 -0
  181. package/src/components/delivery-notes/create/locales/en.ts +68 -0
  182. package/src/components/delivery-notes/create/locales/et.ts +68 -0
  183. package/src/components/delivery-notes/create/locales/fi.ts +68 -0
  184. package/src/components/delivery-notes/create/locales/hr.ts +6 -6
  185. package/src/components/delivery-notes/create/locales/is.ts +68 -0
  186. package/src/components/delivery-notes/create/locales/nb.ts +68 -0
  187. package/src/components/delivery-notes/create/locales/sk.ts +68 -0
  188. package/src/components/delivery-notes/create/locales/sl.ts +5 -5
  189. package/src/components/delivery-notes/create/locales/sv.ts +68 -0
  190. package/src/components/delivery-notes/delivery-notes.hooks.ts +20 -3
  191. package/src/components/delivery-notes/list/list-row-actions.tsx +62 -16
  192. package/src/components/delivery-notes/list/list-table.tsx +42 -9
  193. package/src/components/delivery-notes/list/locales/bg.ts +40 -0
  194. package/src/components/delivery-notes/list/locales/cs.ts +40 -0
  195. package/src/components/delivery-notes/list/locales/et.ts +40 -0
  196. package/src/components/delivery-notes/list/locales/fi.ts +40 -0
  197. package/src/components/delivery-notes/list/locales/is.ts +40 -0
  198. package/src/components/delivery-notes/list/locales/nb.ts +40 -0
  199. package/src/components/delivery-notes/list/locales/sk.ts +40 -0
  200. package/src/components/delivery-notes/list/locales/sv.ts +40 -0
  201. package/src/components/delivery-notes/list/use-delivery-note-download.ts +3 -5
  202. package/src/components/documents/create/document-add-item-form.tsx +256 -147
  203. package/src/components/documents/create/document-add-item-tax-rate-field.tsx +2 -1
  204. package/src/components/documents/create/document-details-section.tsx +30 -12
  205. package/src/components/documents/create/document-item-validation.ts +50 -0
  206. package/src/components/documents/create/document-items-section.tsx +44 -6
  207. package/src/components/documents/create/document-recipient-section.tsx +10 -2
  208. package/src/components/documents/create/linked-documents-info.tsx +4 -3
  209. package/src/components/documents/create/live-preview.tsx +19 -15
  210. package/src/components/documents/create/mark-as-paid-section.tsx +77 -20
  211. package/src/components/documents/create/payment-rows.ts +291 -0
  212. package/src/components/documents/create/prepare-document-submission.ts +24 -13
  213. package/src/components/documents/create/scroll-to-first-invalid-field.ts +27 -0
  214. package/src/components/documents/create/smart-code-insert-button.tsx +5 -53
  215. package/src/components/documents/create/use-document-customer-form.ts +74 -25
  216. package/src/components/documents/documents.hooks.ts +3 -5
  217. package/src/components/documents/index.ts +1 -0
  218. package/src/components/documents/public/index.ts +1 -0
  219. package/src/components/documents/public/public-document-summary.tsx +343 -0
  220. package/src/components/documents/shared/document-preview-display.tsx +65 -39
  221. package/src/components/documents/shared/index.ts +6 -1
  222. package/src/components/documents/shared/scaled-document-preview.tsx +33 -19
  223. package/src/components/documents/types.ts +24 -0
  224. package/src/components/documents/view/document-actions-bar.tsx +241 -62
  225. package/src/components/documents/view/document-activities-list.tsx +23 -11
  226. package/src/components/documents/view/document-details-card.tsx +7 -27
  227. package/src/components/documents/view/document-payments-list.tsx +114 -57
  228. package/src/components/documents/view/document-relations-list.tsx +26 -6
  229. package/src/components/documents/view/document-sidebar.tsx +25 -3
  230. package/src/components/documents/view/document-version-history.tsx +137 -0
  231. package/src/components/documents/view/index.ts +1 -0
  232. package/src/components/documents/view/locales/bg.ts +143 -0
  233. package/src/components/documents/view/locales/cs.ts +143 -0
  234. package/src/components/documents/view/locales/de.ts +13 -0
  235. package/src/components/documents/view/locales/en.ts +143 -0
  236. package/src/components/documents/view/locales/es.ts +13 -0
  237. package/src/components/documents/view/locales/et.ts +143 -0
  238. package/src/components/documents/view/locales/fi.ts +143 -0
  239. package/src/components/documents/view/locales/fr.ts +13 -0
  240. package/src/components/documents/view/locales/hr.ts +13 -0
  241. package/src/components/documents/view/locales/is.ts +143 -0
  242. package/src/components/documents/view/locales/it.ts +13 -0
  243. package/src/components/documents/view/locales/nb.ts +143 -0
  244. package/src/components/documents/view/locales/nl.ts +13 -0
  245. package/src/components/documents/view/locales/pl.ts +13 -0
  246. package/src/components/documents/view/locales/pt.ts +13 -0
  247. package/src/components/documents/view/locales/sk.ts +143 -0
  248. package/src/components/documents/view/locales/sl.ts +13 -0
  249. package/src/components/documents/view/locales/sv.ts +143 -0
  250. package/src/components/documents/view/use-document-download.ts +18 -17
  251. package/src/components/entities/create-entity-form.tsx +200 -12
  252. package/src/components/entities/entities.hooks.ts +15 -7
  253. package/src/components/entities/entity-settings-form/entity-settings-form.tsx +131 -75
  254. package/src/components/entities/entity-settings-form/input-with-preview.tsx +28 -4
  255. package/src/components/entities/entity-settings-form/locales/bg.ts +199 -0
  256. package/src/components/entities/entity-settings-form/locales/cs.ts +199 -0
  257. package/src/components/entities/entity-settings-form/locales/de.ts +18 -3
  258. package/src/components/entities/entity-settings-form/locales/en.ts +199 -0
  259. package/src/components/entities/entity-settings-form/locales/es.ts +18 -3
  260. package/src/components/entities/entity-settings-form/locales/et.ts +198 -0
  261. package/src/components/entities/entity-settings-form/locales/fi.ts +199 -0
  262. package/src/components/entities/entity-settings-form/locales/fr.ts +18 -3
  263. package/src/components/entities/entity-settings-form/locales/hr.ts +26 -11
  264. package/src/components/entities/entity-settings-form/locales/is.ts +199 -0
  265. package/src/components/entities/entity-settings-form/locales/it.ts +18 -3
  266. package/src/components/entities/entity-settings-form/locales/nb.ts +199 -0
  267. package/src/components/entities/entity-settings-form/locales/nl.ts +18 -3
  268. package/src/components/entities/entity-settings-form/locales/pl.ts +18 -3
  269. package/src/components/entities/entity-settings-form/locales/pt.ts +18 -3
  270. package/src/components/entities/entity-settings-form/locales/sk.ts +199 -0
  271. package/src/components/entities/entity-settings-form/locales/sl.ts +30 -15
  272. package/src/components/entities/entity-settings-form/locales/sv.ts +205 -0
  273. package/src/components/entities/fina-settings-form/fina-operator-required-dialog.tsx +34 -9
  274. package/src/components/entities/fina-settings-form/fina-settings-form.tsx +2 -0
  275. package/src/components/entities/fina-settings-form/fina-settings.hooks.ts +14 -45
  276. package/src/components/entities/fina-settings-form/locales/bg.ts +163 -0
  277. package/src/components/entities/fina-settings-form/locales/cs.ts +163 -0
  278. package/src/components/entities/fina-settings-form/locales/et.ts +163 -0
  279. package/src/components/entities/fina-settings-form/locales/fi.ts +163 -0
  280. package/src/components/entities/fina-settings-form/locales/hr.ts +11 -10
  281. package/src/components/entities/fina-settings-form/locales/is.ts +164 -0
  282. package/src/components/entities/fina-settings-form/locales/nb.ts +163 -0
  283. package/src/components/entities/fina-settings-form/locales/sk.ts +163 -0
  284. package/src/components/entities/fina-settings-form/locales/sl.ts +8 -7
  285. package/src/components/entities/fina-settings-form/locales/sv.ts +165 -0
  286. package/src/components/entities/furs-settings-form/furs-operator-required-dialog.tsx +34 -9
  287. package/src/components/entities/furs-settings-form/furs-settings-form.tsx +13 -1
  288. package/src/components/entities/furs-settings-form/furs-settings.hooks.ts +141 -42
  289. package/src/components/entities/furs-settings-form/locales/bg.ts +242 -0
  290. package/src/components/entities/furs-settings-form/locales/cs.ts +241 -0
  291. package/src/components/entities/furs-settings-form/locales/de.ts +42 -15
  292. package/src/components/entities/furs-settings-form/locales/en.ts +24 -0
  293. package/src/components/entities/furs-settings-form/locales/es.ts +42 -15
  294. package/src/components/entities/furs-settings-form/locales/et.ts +242 -0
  295. package/src/components/entities/furs-settings-form/locales/fi.ts +243 -0
  296. package/src/components/entities/furs-settings-form/locales/fr.ts +43 -15
  297. package/src/components/entities/furs-settings-form/locales/hr.ts +44 -19
  298. package/src/components/entities/furs-settings-form/locales/is.ts +242 -0
  299. package/src/components/entities/furs-settings-form/locales/it.ts +42 -15
  300. package/src/components/entities/furs-settings-form/locales/nb.ts +242 -0
  301. package/src/components/entities/furs-settings-form/locales/nl.ts +42 -15
  302. package/src/components/entities/furs-settings-form/locales/pl.ts +40 -15
  303. package/src/components/entities/furs-settings-form/locales/pt.ts +42 -15
  304. package/src/components/entities/furs-settings-form/locales/sk.ts +243 -0
  305. package/src/components/entities/furs-settings-form/locales/sl.ts +34 -10
  306. package/src/components/entities/furs-settings-form/locales/sv.ts +242 -0
  307. package/src/components/entities/furs-settings-form/sections/enable-fiscalization-section.tsx +11 -0
  308. package/src/components/entities/furs-settings-form/sections/furs-internal-act-download-card.tsx +111 -0
  309. package/src/components/entities/furs-settings-form/sections/general-settings-section.tsx +27 -0
  310. package/src/components/entities/furs-settings-form/sections/premises-management-section.tsx +23 -16
  311. package/src/components/entities/furs-settings-form/sections/register-premise-dialog.tsx +89 -31
  312. package/src/components/entities/settings/branding-settings-form.tsx +11 -30
  313. package/src/components/entities/settings/company-settings-form.tsx +2 -1
  314. package/src/components/entities/settings/defaults-settings-form.tsx +112 -9
  315. package/src/components/entities/settings/email-settings-form.tsx +245 -3
  316. package/src/components/entities/settings/eslog-settings-form.tsx +2 -1
  317. package/src/components/entities/settings/number-format-settings-form.tsx +2 -1
  318. package/src/components/entities/settings/pdf-template-selector/locales/bg.ts +20 -0
  319. package/src/components/entities/settings/pdf-template-selector/locales/cs.ts +20 -0
  320. package/src/components/entities/settings/pdf-template-selector/locales/en.ts +20 -0
  321. package/src/components/entities/settings/pdf-template-selector/locales/et.ts +19 -0
  322. package/src/components/entities/settings/pdf-template-selector/locales/fi.ts +20 -0
  323. package/src/components/entities/settings/pdf-template-selector/locales/is.ts +19 -0
  324. package/src/components/entities/settings/pdf-template-selector/locales/nb.ts +19 -0
  325. package/src/components/entities/settings/pdf-template-selector/locales/sk.ts +20 -0
  326. package/src/components/entities/settings/pdf-template-selector/locales/sv.ts +19 -0
  327. package/src/components/entities/settings/tax-rules-settings-form.tsx +21 -6
  328. package/src/components/estimates/create/create-estimate-form.tsx +70 -34
  329. package/src/components/estimates/create/locales/bg.ts +76 -0
  330. package/src/components/estimates/create/locales/cs.ts +76 -0
  331. package/src/components/estimates/create/locales/en.ts +76 -0
  332. package/src/components/estimates/create/locales/et.ts +76 -0
  333. package/src/components/estimates/create/locales/fi.ts +76 -0
  334. package/src/components/estimates/create/locales/hr.ts +8 -8
  335. package/src/components/estimates/create/locales/is.ts +76 -0
  336. package/src/components/estimates/create/locales/nb.ts +76 -0
  337. package/src/components/estimates/create/locales/sk.ts +76 -0
  338. package/src/components/estimates/create/locales/sl.ts +8 -8
  339. package/src/components/estimates/create/locales/sv.ts +76 -0
  340. package/src/components/estimates/create/prepare-estimate-submission.ts +4 -1
  341. package/src/components/estimates/estimates.hooks.ts +15 -3
  342. package/src/components/estimates/list/list-row-actions.tsx +34 -7
  343. package/src/components/estimates/list/list-table.tsx +78 -10
  344. package/src/components/estimates/list/locales/bg.ts +38 -0
  345. package/src/components/estimates/list/locales/cs.ts +38 -0
  346. package/src/components/estimates/list/locales/en.ts +27 -2
  347. package/src/components/estimates/list/locales/et.ts +38 -0
  348. package/src/components/estimates/list/locales/fi.ts +38 -0
  349. package/src/components/estimates/list/locales/hr.ts +2 -2
  350. package/src/components/estimates/list/locales/is.ts +38 -0
  351. package/src/components/estimates/list/locales/nb.ts +38 -0
  352. package/src/components/estimates/list/locales/sk.ts +38 -0
  353. package/src/components/estimates/list/locales/sv.ts +38 -0
  354. package/src/components/estimates/list/use-estimate-download.ts +3 -5
  355. package/src/components/export/document-export-form.tsx +72 -15
  356. package/src/components/export/sales-per-item-export-form.tsx +3 -2
  357. package/src/components/invoices/create/create-invoice-form.tsx +294 -76
  358. package/src/components/invoices/create/eslog-validation.ts +97 -8
  359. package/src/components/invoices/create/locales/bg.ts +164 -0
  360. package/src/components/invoices/create/locales/cs.ts +164 -0
  361. package/src/components/invoices/create/locales/de.ts +24 -0
  362. package/src/components/invoices/create/locales/en.ts +164 -0
  363. package/src/components/invoices/create/locales/es.ts +24 -0
  364. package/src/components/invoices/create/locales/et.ts +164 -0
  365. package/src/components/invoices/create/locales/fi.ts +164 -0
  366. package/src/components/invoices/create/locales/fr.ts +23 -0
  367. package/src/components/invoices/create/locales/hr.ts +32 -9
  368. package/src/components/invoices/create/locales/is.ts +164 -0
  369. package/src/components/invoices/create/locales/it.ts +24 -0
  370. package/src/components/invoices/create/locales/nb.ts +164 -0
  371. package/src/components/invoices/create/locales/nl.ts +23 -0
  372. package/src/components/invoices/create/locales/pl.ts +23 -0
  373. package/src/components/invoices/create/locales/pt.ts +24 -0
  374. package/src/components/invoices/create/locales/sk.ts +164 -0
  375. package/src/components/invoices/create/locales/sl.ts +32 -9
  376. package/src/components/invoices/create/locales/sv.ts +166 -0
  377. package/src/components/invoices/create/prepare-invoice-submission.ts +19 -2
  378. package/src/components/invoices/invoices-furs.hooks.ts +11 -8
  379. package/src/components/invoices/invoices.hooks.ts +27 -10
  380. package/src/components/invoices/list/list-row-actions.tsx +54 -21
  381. package/src/components/invoices/list/list-table.tsx +92 -11
  382. package/src/components/invoices/list/locales/bg.ts +49 -0
  383. package/src/components/invoices/list/locales/cs.ts +49 -0
  384. package/src/components/invoices/list/locales/en.ts +34 -2
  385. package/src/components/invoices/list/locales/et.ts +49 -0
  386. package/src/components/invoices/list/locales/fi.ts +49 -0
  387. package/src/components/invoices/list/locales/is.ts +49 -0
  388. package/src/components/invoices/list/locales/nb.ts +49 -0
  389. package/src/components/invoices/list/locales/sk.ts +49 -0
  390. package/src/components/invoices/list/locales/sv.ts +49 -0
  391. package/src/components/invoices/list/use-invoice-download.ts +3 -5
  392. package/src/components/invoices/send-email-dialog/locales/bg.ts +58 -0
  393. package/src/components/invoices/send-email-dialog/locales/cs.ts +58 -0
  394. package/src/components/invoices/send-email-dialog/locales/de.ts +39 -0
  395. package/src/components/invoices/send-email-dialog/locales/en.ts +58 -0
  396. package/src/components/invoices/send-email-dialog/locales/es.ts +39 -0
  397. package/src/components/invoices/send-email-dialog/locales/et.ts +58 -0
  398. package/src/components/invoices/send-email-dialog/locales/fi.ts +58 -0
  399. package/src/components/invoices/send-email-dialog/locales/fr.ts +39 -0
  400. package/src/components/invoices/send-email-dialog/locales/hr.ts +39 -0
  401. package/src/components/invoices/send-email-dialog/locales/is.ts +58 -0
  402. package/src/components/invoices/send-email-dialog/locales/it.ts +39 -0
  403. package/src/components/invoices/send-email-dialog/locales/nb.ts +58 -0
  404. package/src/components/invoices/send-email-dialog/locales/nl.ts +39 -0
  405. package/src/components/invoices/send-email-dialog/locales/pl.ts +39 -0
  406. package/src/components/invoices/send-email-dialog/locales/pt.ts +39 -0
  407. package/src/components/invoices/send-email-dialog/locales/sk.ts +58 -0
  408. package/src/components/invoices/send-email-dialog/locales/sl.ts +39 -0
  409. package/src/components/invoices/send-email-dialog/locales/sv.ts +58 -0
  410. package/src/components/invoices/send-email-dialog/send-email-dialog.tsx +188 -93
  411. package/src/components/invoices/view/eslog-info-display.tsx +2 -0
  412. package/src/components/invoices/view/fiscalization-status-card.tsx +2 -0
  413. package/src/components/items/create-item-form/create-item-form.tsx +29 -0
  414. package/src/components/items/create-item-form/locales/bg.ts +13 -0
  415. package/src/components/items/create-item-form/locales/cs.ts +13 -0
  416. package/src/components/items/create-item-form/locales/et.ts +13 -0
  417. package/src/components/items/create-item-form/locales/fi.ts +13 -0
  418. package/src/components/items/create-item-form/locales/is.ts +13 -0
  419. package/src/components/items/create-item-form/locales/nb.ts +13 -0
  420. package/src/components/items/create-item-form/locales/sk.ts +13 -0
  421. package/src/components/items/create-item-form/locales/sv.ts +13 -0
  422. package/src/components/items/edit-item-form/edit-item-form.tsx +39 -1
  423. package/src/components/items/edit-item-form/locales/bg.ts +12 -0
  424. package/src/components/items/edit-item-form/locales/cs.ts +12 -0
  425. package/src/components/items/edit-item-form/locales/en.ts +12 -0
  426. package/src/components/items/edit-item-form/locales/et.ts +12 -0
  427. package/src/components/items/edit-item-form/locales/fi.ts +12 -0
  428. package/src/components/items/edit-item-form/locales/is.ts +12 -0
  429. package/src/components/items/edit-item-form/locales/nb.ts +12 -0
  430. package/src/components/items/edit-item-form/locales/sk.ts +12 -0
  431. package/src/components/items/edit-item-form/locales/sv.ts +12 -0
  432. package/src/components/items/item-combobox.tsx +51 -18
  433. package/src/components/items/item-list-table/item-list-table.tsx +47 -23
  434. package/src/components/items/item-list-table/locales/bg.ts +16 -0
  435. package/src/components/items/item-list-table/locales/cs.ts +16 -0
  436. package/src/components/items/item-list-table/locales/en.ts +4 -3
  437. package/src/components/items/item-list-table/locales/et.ts +16 -0
  438. package/src/components/items/item-list-table/locales/fi.ts +16 -0
  439. package/src/components/items/item-list-table/locales/is.ts +16 -0
  440. package/src/components/items/item-list-table/locales/nb.ts +16 -0
  441. package/src/components/items/item-list-table/locales/sk.ts +16 -0
  442. package/src/components/items/item-list-table/locales/sv.ts +16 -0
  443. package/src/components/items/items.hooks.ts +15 -15
  444. package/src/components/payments/create-payment-form/create-payment-form.tsx +11 -7
  445. package/src/components/payments/create-payment-form/index.ts +1 -0
  446. package/src/components/payments/create-payment-form/locales/bg.ts +20 -0
  447. package/src/components/payments/create-payment-form/locales/cs.ts +20 -0
  448. package/src/components/payments/create-payment-form/locales/en.ts +20 -0
  449. package/src/components/payments/create-payment-form/locales/et.ts +20 -0
  450. package/src/components/payments/create-payment-form/locales/fi.ts +20 -0
  451. package/src/components/payments/create-payment-form/locales/hr.ts +2 -2
  452. package/src/components/payments/create-payment-form/locales/is.ts +20 -0
  453. package/src/components/payments/create-payment-form/locales/nb.ts +20 -0
  454. package/src/components/payments/create-payment-form/locales/sk.ts +20 -0
  455. package/src/components/payments/create-payment-form/locales/sl.ts +4 -4
  456. package/src/components/payments/create-payment-form/locales/sv.ts +20 -0
  457. package/src/components/payments/edit-payment-form/edit-payment-form.tsx +5 -1
  458. package/src/components/payments/edit-payment-form/locales/bg.ts +20 -0
  459. package/src/components/payments/edit-payment-form/locales/cs.ts +20 -0
  460. package/src/components/payments/edit-payment-form/locales/en.ts +20 -0
  461. package/src/components/payments/edit-payment-form/locales/et.ts +20 -0
  462. package/src/components/payments/edit-payment-form/locales/fi.ts +20 -0
  463. package/src/components/payments/edit-payment-form/locales/hr.ts +2 -2
  464. package/src/components/payments/edit-payment-form/locales/is.ts +20 -0
  465. package/src/components/payments/edit-payment-form/locales/nb.ts +20 -0
  466. package/src/components/payments/edit-payment-form/locales/sk.ts +20 -0
  467. package/src/components/payments/edit-payment-form/locales/sl.ts +4 -4
  468. package/src/components/payments/edit-payment-form/locales/sv.ts +20 -0
  469. package/src/components/payments/list/list-row-actions.tsx +10 -2
  470. package/src/components/payments/list/list-table.tsx +51 -45
  471. package/src/components/payments/list/locales/bg.ts +42 -0
  472. package/src/components/payments/list/locales/cs.ts +42 -0
  473. package/src/components/payments/list/locales/de.ts +18 -0
  474. package/src/components/payments/list/locales/en.ts +37 -2
  475. package/src/components/payments/list/locales/es.ts +18 -0
  476. package/src/components/payments/list/locales/et.ts +42 -0
  477. package/src/components/payments/list/locales/fi.ts +42 -0
  478. package/src/components/payments/list/locales/fr.ts +18 -0
  479. package/src/components/payments/list/locales/hr.ts +18 -0
  480. package/src/components/payments/list/locales/is.ts +42 -0
  481. package/src/components/payments/list/locales/it.ts +18 -0
  482. package/src/components/payments/list/locales/nb.ts +42 -0
  483. package/src/components/payments/list/locales/nl.ts +18 -0
  484. package/src/components/payments/list/locales/pl.ts +18 -0
  485. package/src/components/payments/list/locales/pt.ts +18 -0
  486. package/src/components/payments/list/locales/sk.ts +42 -0
  487. package/src/components/payments/list/locales/sl.ts +18 -1
  488. package/src/components/payments/list/locales/sv.ts +42 -0
  489. package/src/components/payments/payments.hooks.ts +13 -6
  490. package/src/components/recurring-invoices/create-recurring-invoice-form/create-recurring-invoice-form.tsx +23 -17
  491. package/src/components/recurring-invoices/create-recurring-invoice-form/locales/bg.ts +44 -0
  492. package/src/components/recurring-invoices/create-recurring-invoice-form/locales/cs.ts +44 -0
  493. package/src/components/recurring-invoices/create-recurring-invoice-form/locales/en.ts +44 -0
  494. package/src/components/recurring-invoices/create-recurring-invoice-form/locales/et.ts +44 -0
  495. package/src/components/recurring-invoices/create-recurring-invoice-form/locales/fi.ts +44 -0
  496. package/src/components/recurring-invoices/create-recurring-invoice-form/locales/hr.ts +6 -6
  497. package/src/components/recurring-invoices/create-recurring-invoice-form/locales/is.ts +44 -0
  498. package/src/components/recurring-invoices/create-recurring-invoice-form/locales/nb.ts +44 -0
  499. package/src/components/recurring-invoices/create-recurring-invoice-form/locales/sk.ts +44 -0
  500. package/src/components/recurring-invoices/create-recurring-invoice-form/locales/sl.ts +4 -4
  501. package/src/components/recurring-invoices/create-recurring-invoice-form/locales/sv.ts +44 -0
  502. package/src/components/recurring-invoices/list/list-row-actions.tsx +3 -5
  503. package/src/components/recurring-invoices/list/list-table.tsx +10 -7
  504. package/src/components/recurring-invoices/list/locales/bg.ts +28 -0
  505. package/src/components/recurring-invoices/list/locales/cs.ts +28 -0
  506. package/src/components/recurring-invoices/list/locales/en.ts +23 -0
  507. package/src/components/recurring-invoices/list/locales/et.ts +28 -0
  508. package/src/components/recurring-invoices/list/locales/fi.ts +28 -0
  509. package/src/components/recurring-invoices/list/locales/is.ts +28 -0
  510. package/src/components/recurring-invoices/list/locales/nb.ts +28 -0
  511. package/src/components/recurring-invoices/list/locales/sk.ts +28 -0
  512. package/src/components/recurring-invoices/list/locales/sv.ts +28 -0
  513. package/src/components/recurring-invoices/recurring-invoices.hooks.ts +11 -8
  514. package/src/components/request-logs/request-log-detail.tsx +30 -23
  515. package/src/components/request-logs/request-log-list-table.tsx +88 -45
  516. package/src/components/table/README.md +47 -9
  517. package/src/components/table/data-table.tsx +232 -92
  518. package/src/components/table/filter-bar.tsx +1 -1
  519. package/src/components/table/filter-panel.tsx +51 -22
  520. package/src/components/table/hooks/use-table-state.ts +64 -11
  521. package/src/components/table/index.ts +3 -0
  522. package/src/components/table/locales.ts +119 -4
  523. package/src/components/table/selection-toolbar.tsx +65 -9
  524. package/src/components/table/sorting.ts +80 -0
  525. package/src/components/table/table-skeleton.tsx +15 -9
  526. package/src/components/table/types.ts +17 -0
  527. package/src/components/tax-reports/index.ts +8 -0
  528. package/src/components/tax-reports/kir-export-form.tsx +4 -5
  529. package/src/components/tax-reports/slovenia-accounting-mappings-fields.tsx +271 -0
  530. package/src/components/tax-reports/slovenia-tax-profile-step.tsx +21 -10
  531. package/src/components/tax-reports/slovenia-vod-export-form.tsx +452 -0
  532. package/src/components/tax-reports/slovenia-yearly-export-form.tsx +17 -16
  533. package/src/components/tax-reports/slovenia-yearly-review-step.tsx +40 -18
  534. package/src/components/taxes/create-tax-form/create-tax-form.tsx +48 -2
  535. package/src/components/taxes/create-tax-form/locales/bg.ts +8 -0
  536. package/src/components/taxes/create-tax-form/locales/cs.ts +8 -0
  537. package/src/components/taxes/create-tax-form/locales/et.ts +8 -0
  538. package/src/components/taxes/create-tax-form/locales/fi.ts +8 -0
  539. package/src/components/taxes/create-tax-form/locales/is.ts +8 -0
  540. package/src/components/taxes/create-tax-form/locales/nb.ts +8 -0
  541. package/src/components/taxes/create-tax-form/locales/sk.ts +8 -0
  542. package/src/components/taxes/create-tax-form/locales/sv.ts +8 -0
  543. package/src/components/taxes/edit-tax-form/edit-tax-form.tsx +80 -11
  544. package/src/components/taxes/edit-tax-form/locales/bg.ts +6 -0
  545. package/src/components/taxes/edit-tax-form/locales/cs.ts +6 -0
  546. package/src/components/taxes/edit-tax-form/locales/en.ts +6 -0
  547. package/src/components/taxes/edit-tax-form/locales/et.ts +6 -0
  548. package/src/components/taxes/edit-tax-form/locales/fi.ts +6 -0
  549. package/src/components/taxes/edit-tax-form/locales/is.ts +6 -0
  550. package/src/components/taxes/edit-tax-form/locales/nb.ts +6 -0
  551. package/src/components/taxes/edit-tax-form/locales/sk.ts +6 -0
  552. package/src/components/taxes/edit-tax-form/locales/sv.ts +6 -0
  553. package/src/components/taxes/tax-list-table/locales/bg.ts +17 -0
  554. package/src/components/taxes/tax-list-table/locales/cs.ts +17 -0
  555. package/src/components/taxes/tax-list-table/locales/en.ts +4 -3
  556. package/src/components/taxes/tax-list-table/locales/et.ts +17 -0
  557. package/src/components/taxes/tax-list-table/locales/fi.ts +17 -0
  558. package/src/components/taxes/tax-list-table/locales/is.ts +17 -0
  559. package/src/components/taxes/tax-list-table/locales/nb.ts +17 -0
  560. package/src/components/taxes/tax-list-table/locales/sk.ts +17 -0
  561. package/src/components/taxes/tax-list-table/locales/sv.ts +17 -0
  562. package/src/components/taxes/tax-list-table/tax-list-table.tsx +53 -19
  563. package/src/components/taxes/taxes.hooks.ts +53 -12
  564. package/src/components/ui/badge.tsx +1 -1
  565. package/src/components/ui/button.tsx +1 -1
  566. package/src/components/ui/drawer.tsx +2 -2
  567. package/src/components/ui/form.tsx +118 -2
  568. package/src/components/ui/progress.tsx +6 -4
  569. package/src/components/ui/select.tsx +118 -1
  570. package/src/components/ui/sidebar.tsx +3 -2
  571. package/src/components/ui/sonner.tsx +17 -36
  572. package/src/components/ui/sticky-form-footer.tsx +6 -1
  573. package/src/components/ui/tooltip.tsx +15 -2
  574. package/src/components/webhook-logs/webhook-delivery-detail.tsx +22 -22
  575. package/src/components/webhook-logs/webhook-delivery-list-table.tsx +92 -17
  576. package/src/components/wl-subscription/locked-feature.tsx +11 -10
  577. package/src/components/wl-subscription/paywall.tsx +184 -72
  578. package/src/components/wl-subscription/upgrade-modal.tsx +28 -31
  579. package/src/generate-schemas.ts +17 -7
  580. package/src/generated/schemas/account_webhook.ts +43 -0
  581. package/src/generated/schemas/accountwebhook.ts +67 -0
  582. package/src/generated/schemas/entity.ts +343 -4
  583. package/src/generated/schemas/exportsloveniavodxml_body.ts +16 -0
  584. package/src/generated/schemas/exportsloveniayearlynormiranireport_body.ts +27 -0
  585. package/src/generated/schemas/furssettings.ts +1 -0
  586. package/src/generated/schemas/incomingpurchasedocument.ts +198 -0
  587. package/src/generated/schemas/incomingpurchasedocumentpayment.ts +38 -0
  588. package/src/generated/schemas/index.ts +12 -0
  589. package/src/generated/schemas/item.ts +36 -0
  590. package/src/generated/schemas/me.ts +23 -19
  591. package/src/generated/schemas/order.ts +2 -0
  592. package/src/generated/schemas/orderintegration.ts +8 -4
  593. package/src/generated/schemas/payment.ts +5 -0
  594. package/src/generated/schemas/ptatcudseries.ts +30 -0
  595. package/src/generated/schemas/renderadvanceinvoicepreview_body.ts +35 -3
  596. package/src/generated/schemas/rendercreditnotepreview_body.ts +35 -3
  597. package/src/generated/schemas/renderdeliverynotepreview_body.ts +12 -5
  598. package/src/generated/schemas/renderestimatepreview_body.ts +38 -5
  599. package/src/generated/schemas/renderinvoicepreview_body.ts +39 -5
  600. package/src/generated/schemas/senddocument_body.ts +1 -0
  601. package/src/generated/schemas/sendemail_body.ts +67 -39
  602. package/src/generated/schemas/sloveniataxprofile.ts +118 -0
  603. package/src/generated/schemas/starteslogexport_body.ts +33 -0
  604. package/src/generated/schemas/startpdfexport_body.ts +94 -78
  605. package/src/generated/schemas/supplier.ts +59 -0
  606. package/src/generated/schemas/syncshopifyorders_body.ts +20 -0
  607. package/src/generated/schemas/tax.ts +2 -0
  608. package/src/generated/schemas/uploadfile_body.ts +1 -0
  609. package/src/generated/schemas/userptsettings.ts +26 -0
  610. package/src/generated/schemas/voidinvoice_body.ts +20 -0
  611. package/src/generated/schemas/webhook.ts +2 -0
  612. package/src/hooks/create-resource-hooks.ts +22 -19
  613. package/src/hooks/use-duplicate-document.ts +10 -8
  614. package/src/hooks/use-eslog-validation.ts +5 -1
  615. package/src/hooks/use-next-document-number.ts +13 -6
  616. package/src/hooks/use-resolved-entity-id.ts +14 -0
  617. package/src/hooks/use-resource-mutation.ts +11 -30
  618. package/src/hooks/use-transaction-type-check.ts +3 -8
  619. package/src/lib/browser-cookies.ts +1 -1
  620. package/src/lib/country-capabilities.ts +114 -0
  621. package/src/lib/date-fns-locale.ts +1 -20
  622. package/src/lib/eslog-export.ts +32 -0
  623. package/src/lib/fiscalization-options.ts +21 -1
  624. package/src/lib/formatting.ts +27 -0
  625. package/src/lib/furs-error-utils.ts +29 -0
  626. package/src/lib/locale.ts +4 -0
  627. package/src/lib/payment-display.ts +95 -0
  628. package/src/lib/pt-document-input.ts +67 -0
  629. package/src/lib/schemas/shared.ts +1 -0
  630. package/src/lib/template-variables.tsx +102 -4
  631. package/src/lib/translation.ts +51 -33
  632. package/src/lib/white-label-capabilities.ts +626 -0
  633. package/src/lib/zod-validation-message.ts +291 -0
  634. package/src/providers/entities-provider.tsx +32 -14
  635. package/src/providers/sdk-provider.tsx +112 -12
  636. package/src/providers/space-invoices-provider.tsx +129 -0
  637. package/src/providers/white-label-provider.tsx +96 -4
  638. package/src/providers/wl-subscription-provider.tsx +144 -10
@@ -86,6 +86,7 @@ type DocumentDetailsSectionProps = {
86
86
  control: AnyControl;
87
87
  documentType: DocumentTypes;
88
88
  t: (key: string) => string;
89
+ locale?: string;
89
90
  children?: React.ReactNode; // For document-specific additions (e.g., mark as paid for invoices)
90
91
  fursInline?: FursInlineProps; // FURS premise/device inline with number
91
92
  finaInline?: FinaInlineProps; // FINA premise/device inline with number
@@ -97,6 +98,7 @@ export function DocumentDetailsSection({
97
98
  control,
98
99
  documentType,
99
100
  t,
101
+ locale = "en-US",
100
102
  children,
101
103
  fursInline,
102
104
  finaInline,
@@ -114,7 +116,7 @@ export function DocumentDetailsSection({
114
116
  const showFinaSelects = !!finaInline;
115
117
 
116
118
  return (
117
- <div className="flex-1 space-y-3">
119
+ <div className="mt-6 flex-1 space-y-3 md:mt-0">
118
120
  <h2 className="font-bold text-xl">{t("Details")}</h2>
119
121
 
120
122
  {/* Number field - inline with optional FURS/FINA premise/device + sequence number */}
@@ -262,7 +264,7 @@ export function DocumentDetailsSection({
262
264
  <TooltipTrigger asChild>
263
265
  <FormControl>
264
266
  <Button variant="outline" disabled className="flex-1 pl-3 text-left font-normal">
265
- {new Date().toLocaleDateString()}
267
+ {new Date().toLocaleDateString(locale)}
266
268
  <CalendarIcon className="ml-auto h-4 w-4 opacity-50" />
267
269
  </Button>
268
270
  </FormControl>
@@ -279,7 +281,11 @@ export function DocumentDetailsSection({
279
281
  variant="outline"
280
282
  className={cn("flex-1 pl-3 text-left font-normal", !field.value && "text-muted-foreground")}
281
283
  >
282
- {field.value ? new Date(field.value).toLocaleDateString() : <span>{t("Pick a date")}</span>}
284
+ {field.value ? (
285
+ new Date(field.value).toLocaleDateString(locale)
286
+ ) : (
287
+ <span>{t("Pick a date")}</span>
288
+ )}
283
289
  <CalendarIcon className="ml-auto h-4 w-4 opacity-50" />
284
290
  </Button>
285
291
  </FormControl>
@@ -334,7 +340,11 @@ export function DocumentDetailsSection({
334
340
  variant="outline"
335
341
  className={cn("flex-1 pl-3 text-left font-normal", !field.value && "text-muted-foreground")}
336
342
  >
337
- {field.value ? new Date(field.value).toLocaleDateString() : <span>{t("Pick a date")}</span>}
343
+ {field.value ? (
344
+ new Date(field.value).toLocaleDateString(locale)
345
+ ) : (
346
+ <span>{t("Pick a date")}</span>
347
+ )}
338
348
  <CalendarIcon className="ml-auto h-4 w-4 opacity-50" />
339
349
  </Button>
340
350
  </FormControl>
@@ -357,7 +367,7 @@ export function DocumentDetailsSection({
357
367
  variant="outline"
358
368
  className={cn("w-full pl-3 text-left font-normal", !field.value && "text-muted-foreground")}
359
369
  >
360
- {field.value ? new Date(field.value).toLocaleDateString() : <span>{t("From")}</span>}
370
+ {field.value ? new Date(field.value).toLocaleDateString(locale) : <span>{t("From")}</span>}
361
371
  <CalendarIcon className="ml-auto h-4 w-4 opacity-50" />
362
372
  </Button>
363
373
  </FormControl>
@@ -385,7 +395,11 @@ export function DocumentDetailsSection({
385
395
  !toField.value && "text-muted-foreground",
386
396
  )}
387
397
  >
388
- {toField.value ? new Date(toField.value).toLocaleDateString() : <span>{t("To")}</span>}
398
+ {toField.value ? (
399
+ new Date(toField.value).toLocaleDateString(locale)
400
+ ) : (
401
+ <span>{t("To")}</span>
402
+ )}
389
403
  <CalendarIcon className="ml-auto h-4 w-4 opacity-50" />
390
404
  </Button>
391
405
  </PopoverTrigger>
@@ -448,7 +462,11 @@ export function DocumentDetailsSection({
448
462
  variant="outline"
449
463
  className={cn("flex-1 pl-3 text-left font-normal", !field.value && "text-muted-foreground")}
450
464
  >
451
- {field.value ? new Date(field.value).toLocaleDateString() : <span>{t("Pick a date")}</span>}
465
+ {field.value ? (
466
+ new Date(field.value).toLocaleDateString(locale)
467
+ ) : (
468
+ <span>{t("Pick a date")}</span>
469
+ )}
452
470
  <CalendarIcon className="ml-auto h-4 w-4 opacity-50" />
453
471
  </Button>
454
472
  </FormControl>
@@ -549,7 +567,7 @@ export function DocumentNoteField({
549
567
  render={({ field }) => {
550
568
  const hasContent = field.value;
551
569
  const showPreview = !isFocused && hasContent && entity;
552
- const preview = showPreview ? replaceTemplateVariablesForPreview(field.value || "", entity, document) : null;
570
+ const preview = showPreview ? replaceTemplateVariablesForPreview(field.value || "", entity, document, t) : null;
553
571
 
554
572
  return (
555
573
  <FormItem>
@@ -644,7 +662,7 @@ export function DocumentTaxClauseField({
644
662
  render={({ field }) => {
645
663
  const hasContent = field.value;
646
664
  const showPreview = !isFocused && hasContent && entity;
647
- const preview = showPreview ? replaceTemplateVariablesForPreview(field.value || "", entity, document) : null;
665
+ const preview = showPreview ? replaceTemplateVariablesForPreview(field.value || "", entity, document, t) : null;
648
666
 
649
667
  return (
650
668
  <FormItem>
@@ -738,7 +756,7 @@ export function DocumentSignatureField({
738
756
  render={({ field }) => {
739
757
  const hasContent = field.value;
740
758
  const showPreview = !isFocused && hasContent && entity;
741
- const preview = showPreview ? replaceTemplateVariablesForPreview(field.value || "", entity, document) : null;
759
+ const preview = showPreview ? replaceTemplateVariablesForPreview(field.value || "", entity, document, t) : null;
742
760
 
743
761
  return (
744
762
  <FormItem>
@@ -806,7 +824,7 @@ export function DocumentPaymentTermsField({
806
824
  render={({ field }) => {
807
825
  const hasContent = field.value;
808
826
  const showPreview = !isFocused && hasContent && entity;
809
- const preview = showPreview ? replaceTemplateVariablesForPreview(field.value || "", entity, document) : null;
827
+ const preview = showPreview ? replaceTemplateVariablesForPreview(field.value || "", entity, document, t) : null;
810
828
 
811
829
  return (
812
830
  <FormItem>
@@ -874,7 +892,7 @@ export function DocumentFooterField({
874
892
  render={({ field }) => {
875
893
  const hasContent = field.value;
876
894
  const showPreview = !isFocused && hasContent && entity;
877
- const preview = showPreview ? replaceTemplateVariablesForPreview(field.value || "", entity, document) : null;
895
+ const preview = showPreview ? replaceTemplateVariablesForPreview(field.value || "", entity, document, t) : null;
878
896
 
879
897
  return (
880
898
  <FormItem>
@@ -0,0 +1,50 @@
1
+ import { z } from "zod";
2
+
3
+ const ITEM_NAME_REQUIRED_MESSAGE = "Item name is required";
4
+ const ITEM_QUANTITY_REQUIRED_MESSAGE = "Quantity is required";
5
+ const ITEM_PRICE_REQUIRED_MESSAGE = "Price is required";
6
+
7
+ export function withRequiredDocumentItemFields<T extends z.ZodTypeAny>(schema: T) {
8
+ return schema.superRefine((value, ctx) => {
9
+ const items = (value as { items?: Array<Record<string, unknown>> } | undefined)?.items;
10
+ if (!Array.isArray(items)) return;
11
+
12
+ items.forEach((item, index) => {
13
+ if (item?.type === "separator") return;
14
+
15
+ const name = typeof item?.name === "string" ? item.name.trim() : "";
16
+ const quantity = item?.quantity;
17
+ const price = item?.price;
18
+
19
+ if (!name) {
20
+ ctx.addIssue({
21
+ code: z.ZodIssueCode.custom,
22
+ path: ["items", index, "name"],
23
+ message: ITEM_NAME_REQUIRED_MESSAGE,
24
+ });
25
+ }
26
+
27
+ if (quantity == null || Number.isNaN(quantity)) {
28
+ ctx.addIssue({
29
+ code: z.ZodIssueCode.custom,
30
+ path: ["items", index, "quantity"],
31
+ message: ITEM_QUANTITY_REQUIRED_MESSAGE,
32
+ });
33
+ }
34
+
35
+ if (price == null || Number.isNaN(price)) {
36
+ ctx.addIssue({
37
+ code: z.ZodIssueCode.custom,
38
+ path: ["items", index, "price"],
39
+ message: ITEM_PRICE_REQUIRED_MESSAGE,
40
+ });
41
+ }
42
+ });
43
+ });
44
+ }
45
+
46
+ export const documentItemValidationMessages = {
47
+ name: ITEM_NAME_REQUIRED_MESSAGE,
48
+ quantity: ITEM_QUANTITY_REQUIRED_MESSAGE,
49
+ price: ITEM_PRICE_REQUIRED_MESSAGE,
50
+ } as const;
@@ -4,9 +4,17 @@
4
4
  */
5
5
  import { PlusIcon, SeparatorHorizontal } from "lucide-react";
6
6
  import type { MutableRefObject } from "react";
7
- import type { UseFormGetValues, UseFormSetValue, UseFormWatch } from "react-hook-form";
8
- import { useFieldArray } from "react-hook-form";
7
+ import type {
8
+ UseFormClearErrors,
9
+ UseFormGetValues,
10
+ UseFormSetValue,
11
+ UseFormTrigger,
12
+ UseFormWatch,
13
+ } from "react-hook-form";
14
+ import { useController, useFieldArray } from "react-hook-form";
15
+ import type { DocumentTypes } from "@/ui/components/documents/types";
9
16
  import { Button } from "@/ui/components/ui/button";
17
+ import { cn } from "@/ui/lib/utils";
10
18
  import DocumentAddItemForm from "./document-add-item-form";
11
19
  import type { AnyControl } from "./form-types";
12
20
 
@@ -23,12 +31,15 @@ function reindexPriceModes(priceModes: PriceModesMap, nextLength: number): Price
23
31
 
24
32
  type DocumentItemsSectionProps = {
25
33
  control: AnyControl;
26
-
27
34
  watch: UseFormWatch<any>;
28
35
 
29
36
  setValue: UseFormSetValue<any>;
37
+ clearErrors: UseFormClearErrors<any>;
38
+ trigger: UseFormTrigger<any>;
39
+ isSubmitted: boolean;
30
40
 
31
41
  getValues: UseFormGetValues<any>;
42
+ documentType?: DocumentTypes;
32
43
  entityId: string;
33
44
  currencyCode?: string;
34
45
  onAddNewTax?: () => void;
@@ -45,12 +56,17 @@ type DocumentItemsSectionProps = {
45
56
  initialPriceModes?: PriceModesMap;
46
57
  /** Called when item ordering or price mode changes outside normal field edits. */
47
58
  onItemsStateChange?: () => void;
59
+ locale?: string;
48
60
  };
49
61
 
50
62
  export function DocumentItemsSection({
51
63
  control,
64
+ documentType,
52
65
  watch,
53
66
  setValue,
67
+ clearErrors,
68
+ trigger,
69
+ isSubmitted,
54
70
  getValues,
55
71
  entityId,
56
72
  currencyCode,
@@ -62,11 +78,17 @@ export function DocumentItemsSection({
62
78
  priceModesRef,
63
79
  initialPriceModes = {},
64
80
  onItemsStateChange,
81
+ locale = "en",
65
82
  }: DocumentItemsSectionProps) {
66
83
  const { fields, append, remove, move } = useFieldArray({
67
84
  control: control as any,
68
85
  name: "items",
69
86
  });
87
+ const itemsController = useController({
88
+ control: control as any,
89
+ name: "items" as any,
90
+ });
91
+ const itemsError = itemsController.fieldState.error?.message;
70
92
 
71
93
  const syncPriceModes = (updater: (current: PriceModesMap) => PriceModesMap) => {
72
94
  if (!priceModesRef) return;
@@ -77,6 +99,7 @@ export function DocumentItemsSection({
77
99
  append({
78
100
  name: "",
79
101
  description: "",
102
+ classification: undefined,
80
103
  quantity: 1,
81
104
  price: undefined,
82
105
  taxes: [],
@@ -139,10 +162,16 @@ export function DocumentItemsSection({
139
162
  <h2 className="font-bold text-xl">{t("Items")}</h2>
140
163
 
141
164
  {fields.map((field, index: number) => (
142
- <div key={field.id}>
165
+ <div
166
+ key={field.id}
167
+ className={cn(
168
+ index === 0 && itemsError && "rounded-lg border border-destructive/70 ring-1 ring-destructive/20",
169
+ )}
170
+ >
143
171
  <DocumentAddItemForm
144
- form={{ control, watch, setValue, getValues } as any}
172
+ form={{ control, watch, setValue, clearErrors, trigger, getValues, formState: { isSubmitted } } as any}
145
173
  index={index}
174
+ documentType={documentType}
146
175
  control={control}
147
176
  entityId={entityId}
148
177
  currencyCode={currencyCode}
@@ -164,12 +193,21 @@ export function DocumentItemsSection({
164
193
  }
165
194
  onItemsStateChange?.();
166
195
  }}
196
+ locale={locale}
167
197
  />
168
198
  </div>
169
199
  ))}
170
200
 
201
+ {itemsError && <p className="font-normal text-destructive text-xs">{itemsError}</p>}
202
+
171
203
  <div className="flex gap-2">
172
- <Button type="button" variant="outline" onClick={addItem} className="flex-1 cursor-pointer border-dashed">
204
+ <Button
205
+ type="button"
206
+ variant="outline"
207
+ onClick={addItem}
208
+ className="flex-1 cursor-pointer border-dashed"
209
+ data-demo="marketing-demo-add-item"
210
+ >
173
211
  <PlusIcon className="mr-2 h-4 w-4" /> {t("Add item")}
174
212
  </Button>
175
213
  <Button type="button" variant="ghost" onClick={addSeparator} className="cursor-pointer text-muted-foreground">
@@ -27,6 +27,7 @@ type DocumentRecipientSectionProps = {
27
27
  /** Show end consumer (B2C) toggle next to tax number (Croatian entity + domestic transaction) */
28
28
  showEndConsumerToggle?: boolean;
29
29
  t: (key: string) => string;
30
+ locale?: string;
30
31
  };
31
32
 
32
33
  export function DocumentRecipientSection({
@@ -40,6 +41,7 @@ export function DocumentRecipientSection({
40
41
  initialCustomerName,
41
42
  showEndConsumerToggle,
42
43
  t,
44
+ locale = "en",
43
45
  }: DocumentRecipientSectionProps) {
44
46
  const nameInputRef = useRef<HTMLInputElement>(null);
45
47
 
@@ -51,6 +53,7 @@ export function DocumentRecipientSection({
51
53
  control: control as any,
52
54
  name: "customer.name" as any,
53
55
  });
56
+ const customerNameError = customerNameController.fieldState.error?.message;
54
57
 
55
58
  useEffect(() => {
56
59
  if (showCustomerForm && shouldFocusName) {
@@ -80,7 +83,7 @@ export function DocumentRecipientSection({
80
83
  </div>
81
84
 
82
85
  <div className="space-y-2">
83
- <Label>{t("Name")}</Label>
86
+ <Label className={cn(customerNameError && "text-destructive")}>{t("Name")}</Label>
84
87
  <CustomerAutocomplete
85
88
  entityId={entityId}
86
89
  value={selectedCustomerId}
@@ -88,12 +91,17 @@ export function DocumentRecipientSection({
88
91
  onValueChange={onCustomerSelect}
89
92
  onCommitInlineName={(nextName) => customerNameController.field.onChange(nextName)}
90
93
  onClear={onCustomerClear}
91
- placeholder={t("Search or create customer...")}
94
+ placeholder="Search or create customer..."
92
95
  initialDisplayName={initialCustomerName}
93
96
  inputTestId="document-customer-input"
97
+ inputDataDemo="marketing-demo-customer-input"
94
98
  inputRef={nameInputRef}
95
99
  commitOnBlurMode={showCustomerForm ? "update-inline" : "create"}
100
+ t={t}
101
+ locale={locale}
102
+ ariaInvalid={!!customerNameError}
96
103
  />
104
+ {customerNameError && <p className="font-normal text-destructive text-xs">{customerNameError}</p>}
97
105
  </div>
98
106
 
99
107
  {showCustomerForm && (
@@ -16,9 +16,10 @@ type LinkedDocumentsInfoProps = {
16
16
  };
17
17
 
18
18
  export function LinkedDocumentsInfo({ documents, locale, t }: LinkedDocumentsInfoProps) {
19
- if (documents.length === 0) return null;
19
+ const validDocuments = documents.filter((document): document is LinkedDocumentSummary => !!document && !!document.id);
20
+ if (validDocuments.length === 0) return null;
20
21
 
21
- const currencyCode = documents[0].currency_code || "EUR";
22
+ const currencyCode = validDocuments[0].currency_code || "EUR";
22
23
 
23
24
  const formatDate = (dateStr: string) => {
24
25
  try {
@@ -67,7 +68,7 @@ export function LinkedDocumentsInfo({ documents, locale, t }: LinkedDocumentsInf
67
68
  </TableRow>
68
69
  </TableHeader>
69
70
  <TableBody>
70
- {documents.map((doc) => (
71
+ {validDocuments.map((doc) => (
71
72
  <TableRow key={doc.id}>
72
73
  <TableCell className="py-1.5 text-sm">{typeLabel(doc.type)}</TableCell>
73
74
  <TableCell className="py-1.5 text-sm">{doc.number}</TableCell>
@@ -1,11 +1,11 @@
1
1
  "use client";
2
2
 
3
3
  import type { CreateInvoiceRequest } from "@spaceinvoices/js-sdk";
4
+ import { advanceInvoices, creditNotes, deliveryNotes, estimates, invoices } from "@spaceinvoices/js-sdk";
4
5
  import { Loader2 } from "lucide-react";
5
6
  import { useCallback, useEffect, useRef, useState } from "react";
6
7
  import { cn } from "@/ui/lib/utils";
7
8
  import { useEntities } from "@/ui/providers/entities-context";
8
- import { useSDK } from "@/ui/providers/sdk-provider";
9
9
  import { DocumentPreviewSkeleton } from "../shared/document-preview-skeleton";
10
10
  import { ScaledDocumentPreview } from "../shared/scaled-document-preview";
11
11
  import { useA4Scaling } from "../shared/use-a4-scaling";
@@ -29,8 +29,6 @@ type LiveInvoicePreviewProps = {
29
29
  className?: string;
30
30
  apiBaseUrl?: string;
31
31
  getAuthToken?: () => string | undefined;
32
- /** Locale for document rendering (e.g., "en-US", "sl-SI"). Uses user's UI language. */
33
- locale?: string;
34
32
  /** Fixed scale to use instead of dynamic scaling. Useful to prevent layout shifts. */
35
33
  fixedScale?: number;
36
34
  /** Translation function for UI strings */
@@ -66,7 +64,6 @@ export function LiveInvoicePreview({
66
64
  currency: _currency = "EUR",
67
65
  template,
68
66
  className,
69
- locale: _locale,
70
67
  fixedScale,
71
68
  t: tProp,
72
69
  documentTypeLabel: _documentTypeLabel,
@@ -80,7 +77,6 @@ export function LiveInvoicePreview({
80
77
  const [isRefreshPending, setIsRefreshPending] = useState(false);
81
78
  const [error, setError] = useState<string | null>(null);
82
79
  const { activeEntity } = useEntities();
83
- const { sdk } = useSDK();
84
80
  const abortControllerRef = useRef<AbortController | null>(null);
85
81
  const debounceTimeoutRef = useRef<NodeJS.Timeout | null>(null);
86
82
  const lastRequestKeyRef = useRef<string | null>(null);
@@ -122,7 +118,7 @@ export function LiveInvoicePreview({
122
118
  setError(null);
123
119
 
124
120
  try {
125
- if (!sdk || !activeEntity?.id) {
121
+ if (!activeEntity?.id) {
126
122
  throw new Error("Authentication required");
127
123
  }
128
124
  const startedAt = performance.now();
@@ -173,7 +169,8 @@ export function LiveInvoicePreview({
173
169
  });
174
170
 
175
171
  // Call the render API using the appropriate SDK method for the document type
176
- // Don't send locale let entity locale drive formatting (decimal separators, date format)
172
+ // Frontend preview requests intentionally avoid locale/language overrides.
173
+ // Backend/entity defaults drive document formatting and default output language.
177
174
  const renderParams: Record<string, any> = { partial: "true" as const, template };
178
175
  if (qrOverrides?.upn_qr_enabled !== undefined) {
179
176
  renderParams.upn_qr_enabled = qrOverrides.upn_qr_enabled ? "true" : "false";
@@ -188,19 +185,19 @@ export function LiveInvoicePreview({
188
185
  let html: string;
189
186
  switch (documentType) {
190
187
  case "estimate":
191
- html = await sdk.estimates.renderEstimatePreview(previewData as any, renderParams, requestOpts);
188
+ html = await estimates.renderEstimatePreview(previewData as any, renderParams, requestOpts);
192
189
  break;
193
190
  case "credit_note":
194
- html = await sdk.creditNotes.renderCreditNotePreview(previewData as any, renderParams, requestOpts);
191
+ html = await creditNotes.renderCreditNotePreview(previewData as any, renderParams, requestOpts);
195
192
  break;
196
193
  case "advance_invoice":
197
- html = await sdk.advanceInvoices.renderAdvanceInvoicePreview(previewData as any, renderParams, requestOpts);
194
+ html = await advanceInvoices.renderAdvanceInvoicePreview(previewData as any, renderParams, requestOpts);
198
195
  break;
199
196
  case "delivery_note":
200
- html = await sdk.deliveryNotes.renderDeliveryNotePreview(previewData as any, renderParams, requestOpts);
197
+ html = await deliveryNotes.renderDeliveryNotePreview(previewData as any, renderParams, requestOpts);
201
198
  break;
202
199
  default:
203
- html = await sdk.invoices.renderInvoicePreview(previewData as any, renderParams, requestOpts);
200
+ html = await invoices.renderInvoicePreview(previewData as any, renderParams, requestOpts);
204
201
  break;
205
202
  }
206
203
 
@@ -258,7 +255,6 @@ export function LiveInvoicePreview({
258
255
  activeEntity?.city,
259
256
  activeEntity?.name,
260
257
  template,
261
- sdk,
262
258
  documentType,
263
259
  qrOverrides,
264
260
  qrOverrides?.upn_qr_enabled,
@@ -325,7 +321,12 @@ export function LiveInvoicePreview({
325
321
  const showRefreshBadge = !!previewHtml && (isRefreshPending || isLoading);
326
322
 
327
323
  return (
328
- <div ref={containerRef} className={cn("relative", className)}>
324
+ <div
325
+ ref={containerRef}
326
+ className={cn("relative", className)}
327
+ data-testid="live-preview"
328
+ data-demo="marketing-demo-live-preview"
329
+ >
329
330
  {/* Error state */}
330
331
  {error && !isLoading && (
331
332
  <div className="flex min-h-[200px] items-center justify-center rounded-lg border border-destructive/50 bg-destructive/10 p-8">
@@ -351,7 +352,10 @@ export function LiveInvoicePreview({
351
352
  </div>
352
353
  )}
353
354
  {isLoading && <div className="absolute inset-0 z-10 rounded-lg bg-background/35 backdrop-blur-[1.5px]" />}
354
- <div className={cn(isLoading && "opacity-75 transition-opacity duration-200")}>
355
+ <div
356
+ className={cn(isLoading && "opacity-75 transition-opacity duration-200")}
357
+ data-demo="marketing-demo-totals-root"
358
+ >
355
359
  <ScaledDocumentPreview
356
360
  htmlContent={previewHtml}
357
361
  scale={scale}
@@ -1,10 +1,18 @@
1
1
  import { HelpCircle, Plus, Trash2 } from "lucide-react";
2
2
  import { Button } from "@/ui/components/ui/button";
3
3
  import { Checkbox } from "@/ui/components/ui/checkbox";
4
+ import { Input } from "@/ui/components/ui/input";
4
5
  import { Label } from "@/ui/components/ui/label";
5
6
  import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/ui/components/ui/select";
6
7
  import { Tooltip, TooltipContent, TooltipTrigger } from "@/ui/components/ui/tooltip";
7
8
  import { cn } from "@/ui/lib/utils";
9
+ import {
10
+ createEmptyPaymentRow,
11
+ type DraftPaymentRow,
12
+ derivePaymentRowAmounts,
13
+ getDisplayPaymentAmount,
14
+ getRecordedPaymentTotal,
15
+ } from "./payment-rows";
8
16
 
9
17
  // Regular payment types (excluding special types like credit_note and advance)
10
18
  const regularPaymentTypes = ["cash", "bank_transfer", "card", "check", "other"] as const;
@@ -24,27 +32,38 @@ type MarkAsPaidSectionProps = {
24
32
  /** Called when the checkbox changes */
25
33
  onCheckedChange: (checked: boolean) => void;
26
34
  /** Selected payment types */
27
- paymentTypes: string[];
28
- /** Called when payment types change */
29
- onPaymentTypesChange: (values: string[]) => void;
35
+ paymentRows: DraftPaymentRow[];
36
+ /** Called when payment rows change */
37
+ onPaymentRowsChange: (values: DraftPaymentRow[]) => void;
38
+ /** Current document total used for derived payment suggestions */
39
+ documentTotal: number;
30
40
  /** Translation function */
31
41
  t: (key: string) => string;
32
42
  /** Always show payment type selector (e.g. for FINA fiscalization) */
33
43
  alwaysShowPaymentType?: boolean;
34
44
  /** Force paid state — hides the checkbox and always shows payment selectors */
35
45
  forced?: boolean;
46
+ validationMessage?: string;
47
+ requireFullPayment?: boolean;
36
48
  };
37
49
 
38
50
  export function MarkAsPaidSection({
39
51
  checked,
40
52
  onCheckedChange,
41
- paymentTypes,
42
- onPaymentTypesChange,
53
+ paymentRows,
54
+ onPaymentRowsChange,
55
+ documentTotal,
43
56
  t,
44
57
  alwaysShowPaymentType,
45
58
  forced,
59
+ validationMessage,
60
+ requireFullPayment,
46
61
  }: MarkAsPaidSectionProps) {
47
62
  const showPaymentTypes = forced || checked || alwaysShowPaymentType;
63
+ const showPaymentAmounts = paymentRows.length > 1;
64
+ const derivedAmounts = derivePaymentRowAmounts(paymentRows, documentTotal);
65
+ const recordedTotal = getRecordedPaymentTotal(paymentRows, documentTotal);
66
+ const remainingTotal = Math.max(0, Math.round((documentTotal - recordedTotal) * 100) / 100);
48
67
 
49
68
  return (
50
69
  <div className={cn("flex flex-col gap-4 rounded-md border p-4", showPaymentTypes && "gap-3")}>
@@ -68,7 +87,11 @@ export function MarkAsPaidSection({
68
87
  <HelpCircle className="size-4 text-muted-foreground" />
69
88
  </button>
70
89
  </TooltipTrigger>
71
- <TooltipContent side="top">{t("Invoice will be marked as fully paid upon creation")}</TooltipContent>
90
+ <TooltipContent side="top">
91
+ {requireFullPayment
92
+ ? t("This document must be fully paid on creation")
93
+ : t("Record one or more payments on creation")}
94
+ </TooltipContent>
72
95
  </Tooltip>
73
96
  )}
74
97
  </div>
@@ -80,21 +103,26 @@ export function MarkAsPaidSection({
80
103
  {alwaysShowPaymentType && !checked && (
81
104
  <Label className="text-muted-foreground text-xs">{t("Payment Type")}</Label>
82
105
  )}
83
- {paymentTypes.map((type, index) => (
84
- // biome-ignore lint/suspicious/noArrayIndexKey: payment types list uses index key
85
- <div key={index} className="flex items-center gap-2">
106
+ {paymentRows.map((row, index) => (
107
+ <div
108
+ key={row.id ?? `${row.type ?? "payment"}-${row.amount || "empty"}`}
109
+ className={cn(
110
+ "grid gap-2 md:items-center",
111
+ showPaymentAmounts ? "md:grid-cols-[minmax(0,1fr)_140px_auto]" : "md:grid-cols-[minmax(0,1fr)_auto]",
112
+ )}
113
+ >
86
114
  <Select
87
- value={type}
115
+ value={row.type ?? undefined}
88
116
  onValueChange={(v) => {
89
- if (v) {
90
- const updated = [...paymentTypes];
91
- updated[index] = v;
92
- onPaymentTypesChange(updated);
93
- }
117
+ const updated = [...paymentRows];
118
+ updated[index] = { ...updated[index], type: (v as any) ?? null };
119
+ onPaymentRowsChange(updated);
94
120
  }}
95
121
  >
96
122
  <SelectTrigger className="w-full md:w-fit">
97
- <SelectValue placeholder={t("Select payment type")}>{t(PAYMENT_TYPE_LABELS[type])}</SelectValue>
123
+ <SelectValue placeholder={t("Please select")}>
124
+ {row.type ? t(PAYMENT_TYPE_LABELS[row.type]) : undefined}
125
+ </SelectValue>
98
126
  </SelectTrigger>
99
127
  <SelectContent>
100
128
  {regularPaymentTypes.map((pt) => (
@@ -104,15 +132,33 @@ export function MarkAsPaidSection({
104
132
  ))}
105
133
  </SelectContent>
106
134
  </Select>
107
- {paymentTypes.length > 1 && (
135
+ {showPaymentAmounts && (
136
+ <Input
137
+ type="number"
138
+ step="0.01"
139
+ inputMode="decimal"
140
+ value={getDisplayPaymentAmount(row, derivedAmounts[index])}
141
+ onChange={(event) => {
142
+ const updated = [...paymentRows];
143
+ updated[index] = {
144
+ ...updated[index],
145
+ amount: event.target.value,
146
+ amountTouched: true,
147
+ };
148
+ onPaymentRowsChange(updated);
149
+ }}
150
+ placeholder={t("Amount")}
151
+ />
152
+ )}
153
+ {paymentRows.length > 1 && (
108
154
  <Button
109
155
  type="button"
110
156
  variant="ghost"
111
157
  size="icon"
112
158
  className="size-8 shrink-0"
113
159
  onClick={() => {
114
- const updated = paymentTypes.filter((_, i) => i !== index);
115
- onPaymentTypesChange(updated);
160
+ const updated = paymentRows.filter((_, i) => i !== index);
161
+ onPaymentRowsChange(updated);
116
162
  }}
117
163
  >
118
164
  <Trash2 className="size-4 text-muted-foreground" />
@@ -125,11 +171,22 @@ export function MarkAsPaidSection({
125
171
  variant="ghost"
126
172
  size="sm"
127
173
  className="w-fit gap-1 text-muted-foreground"
128
- onClick={() => onPaymentTypesChange([...paymentTypes, "bank_transfer"])}
174
+ onClick={() => onPaymentRowsChange([...paymentRows, createEmptyPaymentRow()])}
129
175
  >
130
176
  <Plus className="size-4" />
131
177
  {t("Add payment")}
132
178
  </Button>
179
+ {validationMessage && <p className="text-destructive text-sm">{validationMessage}</p>}
180
+ <div className="grid gap-1 text-muted-foreground text-sm">
181
+ <div className="flex items-center justify-between">
182
+ <span>{t("Recorded now")}</span>
183
+ <span>{recordedTotal.toFixed(2)}</span>
184
+ </div>
185
+ <div className="flex items-center justify-between">
186
+ <span>{requireFullPayment ? t("Remaining to allocate") : t("Remaining due")}</span>
187
+ <span>{remainingTotal.toFixed(2)}</span>
188
+ </div>
189
+ </div>
133
190
  </div>
134
191
  )}
135
192
  </div>