@spaceinvoices/react-ui 0.1.1

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 (352) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +340 -0
  3. package/cli/dist/index.js +922 -0
  4. package/package.json +87 -0
  5. package/registry.json +600 -0
  6. package/spaceinvoices.schema.json +47 -0
  7. package/src/app.tsx +25 -0
  8. package/src/common/autocomplete.tsx +135 -0
  9. package/src/components/activities/activity-timeline.tsx +160 -0
  10. package/src/components/activities/index.ts +1 -0
  11. package/src/components/activities/locales/de.ts +30 -0
  12. package/src/components/activities/locales/sl.ts +30 -0
  13. package/src/components/advance-invoices/advance-invoices.hooks.ts +75 -0
  14. package/src/components/advance-invoices/create/create-advance-invoice-form.tsx +702 -0
  15. package/src/components/advance-invoices/create/locales/de.ts +29 -0
  16. package/src/components/advance-invoices/create/locales/sl.ts +25 -0
  17. package/src/components/advance-invoices/create/prepare-advance-invoice-submission.ts +74 -0
  18. package/src/components/advance-invoices/index.ts +5 -0
  19. package/src/components/advance-invoices/list/index.ts +3 -0
  20. package/src/components/advance-invoices/list/list-row-actions.tsx +119 -0
  21. package/src/components/advance-invoices/list/list-table.tsx +178 -0
  22. package/src/components/advance-invoices/list/locales/de.ts +32 -0
  23. package/src/components/advance-invoices/list/locales/sl.ts +32 -0
  24. package/src/components/advance-invoices/list/use-advance-invoice-download.ts +63 -0
  25. package/src/components/button-loader.tsx +11 -0
  26. package/src/components/combobox.tsx +96 -0
  27. package/src/components/company-registry/company-registry-autocomplete.tsx +151 -0
  28. package/src/components/company-registry/company-registry.hooks.ts +67 -0
  29. package/src/components/company-registry/index.ts +7 -0
  30. package/src/components/credit-notes/create/create-credit-note-form.tsx +332 -0
  31. package/src/components/credit-notes/create/index.ts +1 -0
  32. package/src/components/credit-notes/create/locales/de.ts +69 -0
  33. package/src/components/credit-notes/create/locales/sl.ts +67 -0
  34. package/src/components/credit-notes/credit-notes.hooks.ts +22 -0
  35. package/src/components/credit-notes/index.ts +10 -0
  36. package/src/components/credit-notes/list/index.ts +3 -0
  37. package/src/components/credit-notes/list/list-row-actions.tsx +116 -0
  38. package/src/components/credit-notes/list/list-table.tsx +183 -0
  39. package/src/components/credit-notes/list/locales/de.ts +33 -0
  40. package/src/components/credit-notes/list/locales/sl.ts +33 -0
  41. package/src/components/credit-notes/list/use-credit-note-download.ts +65 -0
  42. package/src/components/customers/create-customer-form/create-customer-form.tsx +134 -0
  43. package/src/components/customers/create-customer-form/locales/de.ts +20 -0
  44. package/src/components/customers/create-customer-form/locales/sl.ts +20 -0
  45. package/src/components/customers/customer-autocomplete.tsx +173 -0
  46. package/src/components/customers/customer-combobox.tsx +130 -0
  47. package/src/components/customers/customer-list-table/customer-list-row-actions.tsx +48 -0
  48. package/src/components/customers/customer-list-table/customer-list-table.tsx +124 -0
  49. package/src/components/customers/customer-list-table/index.ts +2 -0
  50. package/src/components/customers/customer-list-table/locales/de.ts +16 -0
  51. package/src/components/customers/customer-list-table/locales/sl.ts +16 -0
  52. package/src/components/customers/customers.hooks.test.ts +348 -0
  53. package/src/components/customers/customers.hooks.ts +57 -0
  54. package/src/components/customers/index.ts +5 -0
  55. package/src/components/dashboard/chart-empty-state.tsx +29 -0
  56. package/src/components/dashboard/collection-rate-card/collection-rate-card.tsx +80 -0
  57. package/src/components/dashboard/collection-rate-card/index.ts +4 -0
  58. package/src/components/dashboard/collection-rate-card/locales/sl.ts +3 -0
  59. package/src/components/dashboard/collection-rate-card/use-collection-rate.ts +74 -0
  60. package/src/components/dashboard/index.ts +54 -0
  61. package/src/components/dashboard/invoice-status-chart/index.ts +4 -0
  62. package/src/components/dashboard/invoice-status-chart/invoice-status-chart.tsx +130 -0
  63. package/src/components/dashboard/invoice-status-chart/locales/sl.ts +9 -0
  64. package/src/components/dashboard/invoice-status-chart/use-invoice-status.ts +105 -0
  65. package/src/components/dashboard/loading-card.tsx +19 -0
  66. package/src/components/dashboard/payment-methods-chart/index.ts +4 -0
  67. package/src/components/dashboard/payment-methods-chart/locales/sl.ts +12 -0
  68. package/src/components/dashboard/payment-methods-chart/payment-methods-chart.tsx +152 -0
  69. package/src/components/dashboard/payment-methods-chart/use-payment-methods.ts +50 -0
  70. package/src/components/dashboard/payment-trend-chart/index.ts +4 -0
  71. package/src/components/dashboard/payment-trend-chart/locales/sl.ts +5 -0
  72. package/src/components/dashboard/payment-trend-chart/payment-trend-chart.tsx +137 -0
  73. package/src/components/dashboard/payment-trend-chart/use-payment-trend.ts +92 -0
  74. package/src/components/dashboard/revenue-card.tsx +49 -0
  75. package/src/components/dashboard/revenue-trend-chart/index.ts +4 -0
  76. package/src/components/dashboard/revenue-trend-chart/locales/sl.ts +5 -0
  77. package/src/components/dashboard/revenue-trend-chart/revenue-trend-chart.tsx +137 -0
  78. package/src/components/dashboard/revenue-trend-chart/use-revenue-trend.ts +93 -0
  79. package/src/components/dashboard/shared/index.ts +5 -0
  80. package/src/components/dashboard/shared/use-revenue-data.ts +160 -0
  81. package/src/components/dashboard/shared/use-stats-counts.ts +89 -0
  82. package/src/components/dashboard/shared/use-stats-query.ts +38 -0
  83. package/src/components/dashboard/stat-card.tsx +41 -0
  84. package/src/components/dashboard/tax-collected-card/index.ts +2 -0
  85. package/src/components/dashboard/tax-collected-card/tax-collected-card.tsx +77 -0
  86. package/src/components/dashboard/tax-collected-card/use-tax-collected.ts +145 -0
  87. package/src/components/dashboard/top-customers-chart/index.ts +4 -0
  88. package/src/components/dashboard/top-customers-chart/locales/sl.ts +5 -0
  89. package/src/components/dashboard/top-customers-chart/top-customers-chart.tsx +130 -0
  90. package/src/components/dashboard/top-customers-chart/use-top-customers.ts +72 -0
  91. package/src/components/documents/create/document-add-item-form.tsx +379 -0
  92. package/src/components/documents/create/document-add-item-tax-rate-field.tsx +120 -0
  93. package/src/components/documents/create/document-details-section.tsx +597 -0
  94. package/src/components/documents/create/document-items-section.tsx +133 -0
  95. package/src/components/documents/create/document-recipient-section.tsx +101 -0
  96. package/src/components/documents/create/form-types.ts +36 -0
  97. package/src/components/documents/create/index.ts +9 -0
  98. package/src/components/documents/create/live-preview.tsx +235 -0
  99. package/src/components/documents/create/mark-as-paid-section.tsx +82 -0
  100. package/src/components/documents/create/prepare-document-submission.test.ts +132 -0
  101. package/src/components/documents/create/prepare-document-submission.ts +187 -0
  102. package/src/components/documents/create/prepare-preview-data.test.ts +155 -0
  103. package/src/components/documents/create/prepare-preview-data.ts +16 -0
  104. package/src/components/documents/create/smart-code-insert-button.tsx +139 -0
  105. package/src/components/documents/create/use-document-customer-form.ts +161 -0
  106. package/src/components/documents/document-preview.tsx +13 -0
  107. package/src/components/documents/documents.hooks.ts +146 -0
  108. package/src/components/documents/index.ts +23 -0
  109. package/src/components/documents/shared/document-preview-display.tsx +172 -0
  110. package/src/components/documents/shared/index.ts +3 -0
  111. package/src/components/documents/shared/scaled-document-preview.tsx +70 -0
  112. package/src/components/documents/shared/use-a4-scaling.ts +62 -0
  113. package/src/components/documents/types.ts +61 -0
  114. package/src/components/documents/view/document-actions-bar.tsx +328 -0
  115. package/src/components/documents/view/document-details-card.tsx +179 -0
  116. package/src/components/documents/view/document-payments-list.tsx +256 -0
  117. package/src/components/documents/view/index.ts +4 -0
  118. package/src/components/documents/view/locales/de.ts +85 -0
  119. package/src/components/documents/view/locales/sl.ts +84 -0
  120. package/src/components/documents/view/use-document-download.ts +125 -0
  121. package/src/components/entities/create-entity-form.tsx +105 -0
  122. package/src/components/entities/entities.hooks.ts +50 -0
  123. package/src/components/entities/entity-settings-form/email-template-variables-info.tsx +103 -0
  124. package/src/components/entities/entity-settings-form/entity-settings-form.tsx +1326 -0
  125. package/src/components/entities/entity-settings-form/image-upload-with-crop.tsx +222 -0
  126. package/src/components/entities/entity-settings-form/index.ts +2 -0
  127. package/src/components/entities/entity-settings-form/input-with-preview.tsx +190 -0
  128. package/src/components/entities/entity-settings-form/locales/de.ts +192 -0
  129. package/src/components/entities/entity-settings-form/locales/sl.ts +188 -0
  130. package/src/components/entities/furs-settings-form/furs-settings-form.tsx +410 -0
  131. package/src/components/entities/furs-settings-form/furs-settings.hooks.ts +320 -0
  132. package/src/components/entities/furs-settings-form/index.ts +3 -0
  133. package/src/components/entities/furs-settings-form/locales/de.ts +233 -0
  134. package/src/components/entities/furs-settings-form/locales/en.ts +194 -0
  135. package/src/components/entities/furs-settings-form/locales/sl.ts +196 -0
  136. package/src/components/entities/furs-settings-form/sections/certificate-settings-section.tsx +242 -0
  137. package/src/components/entities/furs-settings-form/sections/enable-fiscalization-section.tsx +139 -0
  138. package/src/components/entities/furs-settings-form/sections/general-settings-section.tsx +252 -0
  139. package/src/components/entities/furs-settings-form/sections/premises-management-section.tsx +370 -0
  140. package/src/components/entities/furs-settings-form/sections/register-premise-dialog.tsx +420 -0
  141. package/src/components/entities/keys.ts +2 -0
  142. package/src/components/entities/settings/branding-settings-form.tsx +274 -0
  143. package/src/components/entities/settings/company-settings-form.tsx +256 -0
  144. package/src/components/entities/settings/defaults-settings-form.tsx +501 -0
  145. package/src/components/entities/settings/email-settings-form.tsx +288 -0
  146. package/src/components/entities/settings/eslog-settings-form.tsx +113 -0
  147. package/src/components/entities/settings/index.ts +8 -0
  148. package/src/components/entities/settings/number-format-settings-form.tsx +244 -0
  149. package/src/components/entities/settings/pdf-template-selector/demo-invoice-data.ts +164 -0
  150. package/src/components/entities/settings/pdf-template-selector/index.ts +2 -0
  151. package/src/components/entities/settings/pdf-template-selector/locales/de.ts +18 -0
  152. package/src/components/entities/settings/pdf-template-selector/locales/sl.ts +18 -0
  153. package/src/components/entities/settings/pdf-template-selector/pdf-template-cards.tsx +49 -0
  154. package/src/components/entities/settings/settings-footer.tsx +16 -0
  155. package/src/components/entities/settings/tax-rules-settings-form.tsx +346 -0
  156. package/src/components/estimates/create/create-estimate-form.tsx +384 -0
  157. package/src/components/estimates/create/locales/de.ts +64 -0
  158. package/src/components/estimates/create/locales/sl.ts +63 -0
  159. package/src/components/estimates/create/prepare-estimate-submission.ts +39 -0
  160. package/src/components/estimates/create/use-estimate-customer-form.ts +5 -0
  161. package/src/components/estimates/estimates.hooks.ts +15 -0
  162. package/src/components/estimates/index.ts +6 -0
  163. package/src/components/estimates/list/index.ts +3 -0
  164. package/src/components/estimates/list/list-row-actions.tsx +103 -0
  165. package/src/components/estimates/list/list-table.tsx +171 -0
  166. package/src/components/estimates/list/locales/de.ts +26 -0
  167. package/src/components/estimates/list/locales/sl.ts +26 -0
  168. package/src/components/estimates/list/use-estimate-download.ts +63 -0
  169. package/src/components/export/document-export-form.tsx +288 -0
  170. package/src/components/export/index.ts +2 -0
  171. package/src/components/form/form-input.tsx +89 -0
  172. package/src/components/form/index.ts +1 -0
  173. package/src/components/invoices/create/create-invoice-form.tsx +852 -0
  174. package/src/components/invoices/create/eslog-validation.test.ts +242 -0
  175. package/src/components/invoices/create/eslog-validation.ts +208 -0
  176. package/src/components/invoices/create/locales/de.ts +118 -0
  177. package/src/components/invoices/create/locales/sl.ts +114 -0
  178. package/src/components/invoices/create/prepare-invoice-submission.test.ts +777 -0
  179. package/src/components/invoices/create/prepare-invoice-submission.ts +79 -0
  180. package/src/components/invoices/create/use-invoice-customer-form.ts +5 -0
  181. package/src/components/invoices/index.ts +9 -0
  182. package/src/components/invoices/invoices-furs.hooks.ts +28 -0
  183. package/src/components/invoices/invoices.hooks.ts +110 -0
  184. package/src/components/invoices/list/index.ts +3 -0
  185. package/src/components/invoices/list/list-row-actions.tsx +132 -0
  186. package/src/components/invoices/list/list-table.tsx +165 -0
  187. package/src/components/invoices/list/locales/de.ts +33 -0
  188. package/src/components/invoices/list/locales/sl.ts +33 -0
  189. package/src/components/invoices/list/use-invoice-download.ts +62 -0
  190. package/src/components/invoices/send-email-dialog/index.ts +1 -0
  191. package/src/components/invoices/send-email-dialog/locales/de.ts +18 -0
  192. package/src/components/invoices/send-email-dialog/locales/sl.ts +17 -0
  193. package/src/components/invoices/send-email-dialog/send-email-dialog.tsx +289 -0
  194. package/src/components/invoices/send-email-dialog.tsx +2 -0
  195. package/src/components/invoices/shared/index.ts +2 -0
  196. package/src/components/invoices/shared/scaled-document-preview.tsx +32 -0
  197. package/src/components/invoices/shared/use-a4-scaling.tsx +39 -0
  198. package/src/components/invoices/view/eslog-info-display.tsx +160 -0
  199. package/src/components/invoices/view/furs-info-display.tsx +213 -0
  200. package/src/components/items/create-item-form/create-item-form.tsx +155 -0
  201. package/src/components/items/create-item-form/locales/de.ts +14 -0
  202. package/src/components/items/create-item-form/locales/en.ts +9 -0
  203. package/src/components/items/create-item-form/locales/sl.ts +14 -0
  204. package/src/components/items/item-combobox.tsx +147 -0
  205. package/src/components/items/item-list-table/item-list-header.tsx +33 -0
  206. package/src/components/items/item-list-table/item-list-row-actions.tsx +48 -0
  207. package/src/components/items/item-list-table/item-list-row.tsx +32 -0
  208. package/src/components/items/item-list-table/item-list-table.tsx +76 -0
  209. package/src/components/items/item-list-table/locales/de.ts +10 -0
  210. package/src/components/items/item-list-table/locales/en.ts +10 -0
  211. package/src/components/items/item-list-table/locales/sl.ts +10 -0
  212. package/src/components/items/items.hooks.ts +63 -0
  213. package/src/components/loading-spinner.tsx +24 -0
  214. package/src/components/payments/create-payment-form/create-payment-form.tsx +222 -0
  215. package/src/components/payments/create-payment-form/locales/de.ts +20 -0
  216. package/src/components/payments/create-payment-form/locales/sl.ts +20 -0
  217. package/src/components/payments/edit-payment-form/edit-payment-form.tsx +230 -0
  218. package/src/components/payments/edit-payment-form/index.ts +1 -0
  219. package/src/components/payments/edit-payment-form/locales/de.ts +20 -0
  220. package/src/components/payments/edit-payment-form/locales/sl.ts +20 -0
  221. package/src/components/payments/index.ts +4 -0
  222. package/src/components/payments/list/index.ts +2 -0
  223. package/src/components/payments/list/list-row-actions.tsx +98 -0
  224. package/src/components/payments/list/list-table.tsx +186 -0
  225. package/src/components/payments/list/locales/de.ts +19 -0
  226. package/src/components/payments/list/locales/sl.ts +19 -0
  227. package/src/components/payments/payments.hooks.ts +15 -0
  228. package/src/components/request-logs/index.ts +3 -0
  229. package/src/components/request-logs/request-log-detail.tsx +242 -0
  230. package/src/components/request-logs/request-log-list-table.tsx +266 -0
  231. package/src/components/request-logs/request-logs-page.tsx +10 -0
  232. package/src/components/table/README.md +410 -0
  233. package/src/components/table/data-table.tsx +251 -0
  234. package/src/components/table/date-cell.tsx +35 -0
  235. package/src/components/table/filter-bar.tsx +114 -0
  236. package/src/components/table/filter-panel.tsx +407 -0
  237. package/src/components/table/hooks/use-table-fetch.ts +17 -0
  238. package/src/components/table/hooks/use-table-query.ts +36 -0
  239. package/src/components/table/hooks/use-table-state.ts +293 -0
  240. package/src/components/table/index.ts +35 -0
  241. package/src/components/table/search-input.tsx +85 -0
  242. package/src/components/table/sortable-header.tsx +56 -0
  243. package/src/components/table/table-empty-state.tsx +40 -0
  244. package/src/components/table/table-no-results.tsx +41 -0
  245. package/src/components/table/table-pagination.tsx +42 -0
  246. package/src/components/table/table-skeleton.tsx +54 -0
  247. package/src/components/table/types.ts +136 -0
  248. package/src/components/tax-reports/index.ts +1 -0
  249. package/src/components/tax-reports/kir-export-form.tsx +172 -0
  250. package/src/components/taxes/create-tax-form/create-tax-form.tsx +112 -0
  251. package/src/components/taxes/create-tax-form/locales/de.ts +8 -0
  252. package/src/components/taxes/create-tax-form/locales/en.ts +7 -0
  253. package/src/components/taxes/create-tax-form/locales/sl.ts +8 -0
  254. package/src/components/taxes/tax-list-table/locales/de.ts +11 -0
  255. package/src/components/taxes/tax-list-table/locales/en.ts +10 -0
  256. package/src/components/taxes/tax-list-table/locales/sl.ts +11 -0
  257. package/src/components/taxes/tax-list-table/tax-list-header.tsx +29 -0
  258. package/src/components/taxes/tax-list-table/tax-list-row-actions.tsx +43 -0
  259. package/src/components/taxes/tax-list-table/tax-list-row.tsx +46 -0
  260. package/src/components/taxes/tax-list-table/tax-list-table.tsx +59 -0
  261. package/src/components/taxes/taxes.hooks.ts +35 -0
  262. package/src/components/ui/alert-dialog.tsx +61 -0
  263. package/src/components/ui/alert.tsx +72 -0
  264. package/src/components/ui/badge.tsx +48 -0
  265. package/src/components/ui/breadcrumb.tsx +132 -0
  266. package/src/components/ui/button.tsx +61 -0
  267. package/src/components/ui/calendar.tsx +213 -0
  268. package/src/components/ui/card.tsx +94 -0
  269. package/src/components/ui/chart.tsx +380 -0
  270. package/src/components/ui/checkbox.tsx +27 -0
  271. package/src/components/ui/collapsible.tsx +56 -0
  272. package/src/components/ui/command.tsx +187 -0
  273. package/src/components/ui/dialog.tsx +187 -0
  274. package/src/components/ui/drawer.tsx +123 -0
  275. package/src/components/ui/dropdown-menu.tsx +291 -0
  276. package/src/components/ui/form.tsx +166 -0
  277. package/src/components/ui/input-group.tsx +149 -0
  278. package/src/components/ui/input.tsx +20 -0
  279. package/src/components/ui/label.tsx +18 -0
  280. package/src/components/ui/loading-spinner.tsx +16 -0
  281. package/src/components/ui/popover.tsx +108 -0
  282. package/src/components/ui/radio-group.tsx +37 -0
  283. package/src/components/ui/select.tsx +200 -0
  284. package/src/components/ui/separator.tsx +23 -0
  285. package/src/components/ui/sheet.tsx +145 -0
  286. package/src/components/ui/sidebar.tsx +771 -0
  287. package/src/components/ui/skeleton.tsx +13 -0
  288. package/src/components/ui/sonner.tsx +60 -0
  289. package/src/components/ui/spinner.tsx +10 -0
  290. package/src/components/ui/sticky-form-footer.tsx +55 -0
  291. package/src/components/ui/switch.tsx +30 -0
  292. package/src/components/ui/table.tsx +101 -0
  293. package/src/components/ui/tabs.tsx +80 -0
  294. package/src/components/ui/textarea.tsx +18 -0
  295. package/src/components/ui/tooltip.tsx +89 -0
  296. package/src/components/wl-subscription/index.ts +2 -0
  297. package/src/components/wl-subscription/locked-feature.tsx +173 -0
  298. package/src/components/wl-subscription/upgrade-modal.tsx +209 -0
  299. package/src/frontend.tsx +28 -0
  300. package/src/generate-schemas.ts +265 -0
  301. package/src/generated/schemas/advanceinvoice.ts +177 -0
  302. package/src/generated/schemas/creditnote.ts +187 -0
  303. package/src/generated/schemas/customer.ts +29 -0
  304. package/src/generated/schemas/entity.ts +252 -0
  305. package/src/generated/schemas/estimate.ts +159 -0
  306. package/src/generated/schemas/furssettings.ts +25 -0
  307. package/src/generated/schemas/index.ts +24 -0
  308. package/src/generated/schemas/invoice.ts +167 -0
  309. package/src/generated/schemas/item.ts +38 -0
  310. package/src/generated/schemas/payment.ts +44 -0
  311. package/src/generated/schemas/previewadvanceinvoice_body.ts +354 -0
  312. package/src/generated/schemas/previewestimate_body.ts +309 -0
  313. package/src/generated/schemas/registerfursmovablepremise_body.ts +22 -0
  314. package/src/generated/schemas/registerfursrealestatepremise_body.ts +32 -0
  315. package/src/generated/schemas/renderdocument_body.ts +594 -0
  316. package/src/generated/schemas/sendemail_body.ts +26 -0
  317. package/src/generated/schemas/startpdfexport_body.ts +20 -0
  318. package/src/generated/schemas/tax.ts +48 -0
  319. package/src/generated/schemas/uploadfile_body.ts +23 -0
  320. package/src/generated/schemas/uploadfurscertificate_body.ts +20 -0
  321. package/src/generated/schemas/userfurssettings.ts +19 -0
  322. package/src/hooks/create-resource-hooks.test.ts +483 -0
  323. package/src/hooks/create-resource-hooks.ts +300 -0
  324. package/src/hooks/use-debounce.ts +12 -0
  325. package/src/hooks/use-duplicate-document.ts +185 -0
  326. package/src/hooks/use-media-query.tsx +19 -0
  327. package/src/hooks/use-mobile.ts +39 -0
  328. package/src/hooks/use-next-document-number.ts +57 -0
  329. package/src/hooks/use-resource-mutation.ts +118 -0
  330. package/src/hooks/use-vies-check.ts +130 -0
  331. package/src/index.css +11 -0
  332. package/src/index.html +13 -0
  333. package/src/index.tsx +12 -0
  334. package/src/lib/auth.ts +4 -0
  335. package/src/lib/browser-cookies.ts +70 -0
  336. package/src/lib/constants.ts +287 -0
  337. package/src/lib/cookies.ts +36 -0
  338. package/src/lib/schemas/advance-invoice.ts +43 -0
  339. package/src/lib/schemas/credit-note.ts +32 -0
  340. package/src/lib/schemas/estimate.ts +31 -0
  341. package/src/lib/schemas/index.ts +18 -0
  342. package/src/lib/schemas/invoice.ts +43 -0
  343. package/src/lib/schemas/shared.ts +79 -0
  344. package/src/lib/translation.ts +38 -0
  345. package/src/lib/utils.ts +6 -0
  346. package/src/providers/entities-context.tsx +41 -0
  347. package/src/providers/entities-provider.tsx +201 -0
  348. package/src/providers/form-footer-context.tsx +72 -0
  349. package/src/providers/sdk-provider.tsx +164 -0
  350. package/src/providers/white-label-provider.tsx +91 -0
  351. package/src/providers/wl-subscription-provider.tsx +277 -0
  352. package/src/utils/string-helpers.ts +111 -0
@@ -0,0 +1,242 @@
1
+ import { describe, expect, it } from "bun:test";
2
+ import type { Entity } from "@/ui/providers/entities-context";
3
+ import { getEntityErrors, getFormFieldErrors, hasEntityErrors, validateEslogForm } from "./eslog-validation";
4
+
5
+ // Mock entity for testing
6
+ const validEntity: Entity = {
7
+ id: "ent_test",
8
+ name: "Test Company d.o.o.",
9
+ address: "Slovenska cesta 1",
10
+ address_2: null,
11
+ post_code: "1000",
12
+ city: "Ljubljana",
13
+ state: null,
14
+ country: "Slovenia",
15
+ country_code: "SI",
16
+ currency_code: "EUR",
17
+ tax_number: "12345678",
18
+ email: null,
19
+ is_tax_subject: true,
20
+ locale: "sl-SI",
21
+ account_id: "acc_test",
22
+ environment: "live",
23
+ settings: {},
24
+ metadata: {},
25
+ country_rules: {
26
+ max_taxes_per_item: 2,
27
+ features: ["eslog", "furs"],
28
+ },
29
+ created_at: new Date().toISOString(),
30
+ updated_at: new Date().toISOString(),
31
+ };
32
+
33
+ const validFormValues = {
34
+ number: "2024-001",
35
+ date: "2024-01-15",
36
+ currency_code: "EUR",
37
+ customer: {
38
+ name: "Customer Name",
39
+ address: "Customer Address",
40
+ post_code: "1000",
41
+ city: "Ljubljana",
42
+ country: "Slovenia",
43
+ country_code: "SI",
44
+ },
45
+ items: [
46
+ {
47
+ name: "Product 1",
48
+ quantity: 1,
49
+ price: 100,
50
+ taxes: [{ rate: 22 }],
51
+ },
52
+ ],
53
+ };
54
+
55
+ describe("e-SLOG Validation", () => {
56
+ describe("validateEslogForm", () => {
57
+ it("should return no errors for valid entity and form values", () => {
58
+ const errors = validateEslogForm(validFormValues, validEntity);
59
+ expect(errors).toEqual([]);
60
+ });
61
+
62
+ it("should return empty errors when entity is null", () => {
63
+ const errors = validateEslogForm(validFormValues, null);
64
+ expect(errors).toEqual([]);
65
+ });
66
+
67
+ describe("Entity validation", () => {
68
+ it("should require entity name", () => {
69
+ const entity = { ...validEntity, name: "" };
70
+ const errors = validateEslogForm(validFormValues, entity);
71
+ expect(errors.some((e) => e.field === "entity.name")).toBe(true);
72
+ });
73
+
74
+ it("should require entity address", () => {
75
+ const entity = { ...validEntity, address: null };
76
+ const errors = validateEslogForm(validFormValues, entity as Entity);
77
+ expect(errors.some((e) => e.field === "entity.address")).toBe(true);
78
+ });
79
+
80
+ it("should require entity postal code", () => {
81
+ const entity = { ...validEntity, post_code: null };
82
+ const errors = validateEslogForm(validFormValues, entity as Entity);
83
+ expect(errors.some((e) => e.field === "entity.post_code")).toBe(true);
84
+ });
85
+
86
+ it("should require entity city", () => {
87
+ const entity = { ...validEntity, city: null };
88
+ const errors = validateEslogForm(validFormValues, entity as Entity);
89
+ expect(errors.some((e) => e.field === "entity.city")).toBe(true);
90
+ });
91
+
92
+ it("should require entity country code to be SI", () => {
93
+ const entity = { ...validEntity, country_code: "AT" };
94
+ const errors = validateEslogForm(validFormValues, entity);
95
+ expect(errors.some((e) => e.field === "entity.country_code")).toBe(true);
96
+ });
97
+
98
+ it("should require entity tax number", () => {
99
+ const entity = { ...validEntity, tax_number: null };
100
+ const errors = validateEslogForm(validFormValues, entity as Entity);
101
+ expect(errors.some((e) => e.field === "entity.tax_number")).toBe(true);
102
+ });
103
+
104
+ it("should require 8-digit tax number", () => {
105
+ const entity = { ...validEntity, tax_number: "123" };
106
+ const errors = validateEslogForm(validFormValues, entity);
107
+ expect(errors.some((e) => e.field === "entity.tax_number" && e.message.includes("8 digits"))).toBe(true);
108
+ });
109
+ });
110
+
111
+ describe("Document validation", () => {
112
+ it("should require invoice number", () => {
113
+ const values = { ...validFormValues, number: "" };
114
+ const errors = validateEslogForm(values, validEntity);
115
+ expect(errors.some((e) => e.field === "number")).toBe(true);
116
+ });
117
+
118
+ it("should require invoice date", () => {
119
+ const values = { ...validFormValues, date: undefined };
120
+ const errors = validateEslogForm(values, validEntity);
121
+ expect(errors.some((e) => e.field === "date")).toBe(true);
122
+ });
123
+
124
+ it("should require currency code", () => {
125
+ const values = { ...validFormValues, currency_code: undefined };
126
+ const errors = validateEslogForm(values, validEntity);
127
+ expect(errors.some((e) => e.field === "currency_code")).toBe(true);
128
+ });
129
+ });
130
+
131
+ describe("Customer validation", () => {
132
+ it("should require customer name when customer data is provided", () => {
133
+ const values = {
134
+ ...validFormValues,
135
+ customer: { address: "Some address", name: "" },
136
+ };
137
+ const errors = validateEslogForm(values, validEntity);
138
+ expect(errors.some((e) => e.field === "customer.name")).toBe(true);
139
+ });
140
+
141
+ it("should not require customer at all", () => {
142
+ const values = { ...validFormValues, customer: null };
143
+ const errors = validateEslogForm(values, validEntity);
144
+ expect(errors.some((e) => e.field.startsWith("customer"))).toBe(false);
145
+ });
146
+ });
147
+
148
+ describe("Line items validation", () => {
149
+ it("should require at least one line item", () => {
150
+ const values = { ...validFormValues, items: [] };
151
+ const errors = validateEslogForm(values, validEntity);
152
+ expect(errors.some((e) => e.field === "items")).toBe(true);
153
+ });
154
+
155
+ it("should require item name", () => {
156
+ const values = {
157
+ ...validFormValues,
158
+ items: [{ name: "", quantity: 1, price: 100 }],
159
+ };
160
+ const errors = validateEslogForm(values, validEntity);
161
+ expect(errors.some((e) => e.field === "items.0.name")).toBe(true);
162
+ });
163
+
164
+ it("should require quantity > 0", () => {
165
+ const values = {
166
+ ...validFormValues,
167
+ items: [{ name: "Product", quantity: 0, price: 100 }],
168
+ };
169
+ const errors = validateEslogForm(values, validEntity);
170
+ expect(errors.some((e) => e.field === "items.0.quantity")).toBe(true);
171
+ });
172
+
173
+ it("should require price", () => {
174
+ const values = {
175
+ ...validFormValues,
176
+ items: [{ name: "Product", quantity: 1, price: undefined as any }],
177
+ };
178
+ const errors = validateEslogForm(values, validEntity);
179
+ expect(errors.some((e) => e.field === "items.0.price")).toBe(true);
180
+ });
181
+
182
+ it("should validate Slovenian tax rates", () => {
183
+ const values = {
184
+ ...validFormValues,
185
+ items: [{ name: "Product", quantity: 1, price: 100, taxes: [{ rate: 20 }] }],
186
+ };
187
+ const errors = validateEslogForm(values, validEntity);
188
+ expect(errors.some((e) => e.field === "items.0.taxes")).toBe(true);
189
+ });
190
+
191
+ it("should accept valid Slovenian tax rates (22%, 9.5%, 5%, 0%)", () => {
192
+ const validRates = [22, 9.5, 5, 0];
193
+ for (const rate of validRates) {
194
+ const values = {
195
+ ...validFormValues,
196
+ items: [{ name: "Product", quantity: 1, price: 100, taxes: [{ rate }] }],
197
+ };
198
+ const errors = validateEslogForm(values, validEntity);
199
+ expect(errors.some((e) => e.field === "items.0.taxes")).toBe(false);
200
+ }
201
+ });
202
+ });
203
+ });
204
+
205
+ describe("hasEntityErrors", () => {
206
+ it("should return true when entity errors exist", () => {
207
+ const errors = [{ field: "entity.name", message: "Required" }];
208
+ expect(hasEntityErrors(errors)).toBe(true);
209
+ });
210
+
211
+ it("should return false when no entity errors", () => {
212
+ const errors = [{ field: "number", message: "Required" }];
213
+ expect(hasEntityErrors(errors)).toBe(false);
214
+ });
215
+ });
216
+
217
+ describe("getEntityErrors", () => {
218
+ it("should filter entity errors", () => {
219
+ const errors = [
220
+ { field: "entity.name", message: "Required" },
221
+ { field: "number", message: "Required" },
222
+ { field: "entity.address", message: "Required" },
223
+ ];
224
+ const entityErrors = getEntityErrors(errors);
225
+ expect(entityErrors).toHaveLength(2);
226
+ expect(entityErrors.every((e) => e.field.startsWith("entity."))).toBe(true);
227
+ });
228
+ });
229
+
230
+ describe("getFormFieldErrors", () => {
231
+ it("should filter non-entity errors", () => {
232
+ const errors = [
233
+ { field: "entity.name", message: "Required" },
234
+ { field: "number", message: "Required" },
235
+ { field: "items.0.name", message: "Required" },
236
+ ];
237
+ const formErrors = getFormFieldErrors(errors);
238
+ expect(formErrors).toHaveLength(2);
239
+ expect(formErrors.every((e) => !e.field.startsWith("entity."))).toBe(true);
240
+ });
241
+ });
242
+ });
@@ -0,0 +1,208 @@
1
+ /**
2
+ * Client-side e-SLOG 2.0 validation for invoice creation form
3
+ *
4
+ * Validates form data against e-SLOG requirements before submission.
5
+ * Returns field-specific errors that can be displayed on form elements.
6
+ */
7
+
8
+ import type { Entity } from "@/ui/providers/entities-context";
9
+
10
+ // Valid Slovenian tax rates (%)
11
+ const VALID_SI_TAX_RATES = [22, 9.5, 5, 0];
12
+
13
+ interface FormValues {
14
+ number?: string;
15
+ date?: string;
16
+ currency_code?: string;
17
+ customer?: {
18
+ name?: string;
19
+ address?: string;
20
+ post_code?: string;
21
+ city?: string;
22
+ country?: string;
23
+ country_code?: string;
24
+ tax_number?: string;
25
+ } | null;
26
+ items?: Array<{
27
+ name?: string;
28
+ quantity?: number;
29
+ price?: number;
30
+ taxes?: Array<{ rate?: number }>;
31
+ }>;
32
+ }
33
+
34
+ interface ValidationError {
35
+ field: string;
36
+ message: string;
37
+ }
38
+
39
+ /**
40
+ * Validate form values against e-SLOG 2.0 requirements
41
+ * Returns array of validation errors with field paths
42
+ */
43
+ export function validateEslogForm(values: FormValues, entity: Entity | null | undefined): ValidationError[] {
44
+ const errors: ValidationError[] = [];
45
+
46
+ if (!entity) {
47
+ return errors;
48
+ }
49
+
50
+ // === ISSUER (Entity) VALIDATION ===
51
+ if (!entity.name?.trim()) {
52
+ errors.push({
53
+ field: "entity.name",
54
+ message: "Entity name is required for e-SLOG. Update in Settings > Company.",
55
+ });
56
+ }
57
+
58
+ if (!entity.address?.trim()) {
59
+ errors.push({
60
+ field: "entity.address",
61
+ message: "Entity address is required for e-SLOG. Update in Settings > Company.",
62
+ });
63
+ }
64
+
65
+ if (!entity.post_code?.trim()) {
66
+ errors.push({
67
+ field: "entity.post_code",
68
+ message: "Entity postal code is required for e-SLOG. Update in Settings > Company.",
69
+ });
70
+ }
71
+
72
+ if (!entity.city?.trim()) {
73
+ errors.push({
74
+ field: "entity.city",
75
+ message: "Entity city is required for e-SLOG. Update in Settings > Company.",
76
+ });
77
+ }
78
+
79
+ if (entity.country_code !== "SI") {
80
+ errors.push({
81
+ field: "entity.country_code",
82
+ message: "Entity must be from Slovenia (SI) for e-SLOG.",
83
+ });
84
+ }
85
+
86
+ if (!entity.tax_number?.trim()) {
87
+ errors.push({
88
+ field: "entity.tax_number",
89
+ message: "Entity tax number is required for e-SLOG. Update in Settings > Company.",
90
+ });
91
+ } else {
92
+ const taxNumber = entity.tax_number.replace(/\D/g, "");
93
+ if (taxNumber.length !== 8) {
94
+ errors.push({
95
+ field: "entity.tax_number",
96
+ message: "Slovenian tax number must be 8 digits.",
97
+ });
98
+ }
99
+ }
100
+
101
+ // === DOCUMENT VALIDATION ===
102
+ if (!values.number?.trim()) {
103
+ errors.push({
104
+ field: "number",
105
+ message: "Invoice number is required for e-SLOG.",
106
+ });
107
+ }
108
+
109
+ if (!values.date) {
110
+ errors.push({
111
+ field: "date",
112
+ message: "Invoice date is required for e-SLOG.",
113
+ });
114
+ }
115
+
116
+ if (!values.currency_code) {
117
+ errors.push({
118
+ field: "currency_code",
119
+ message: "Currency is required for e-SLOG.",
120
+ });
121
+ } else if (values.currency_code !== "EUR" && entity.currency_code !== "EUR") {
122
+ // If invoice is not EUR, entity must be EUR so API can convert to _converted fields
123
+ errors.push({
124
+ field: "currency_code",
125
+ message: "Entity currency must be EUR for e-SLOG when invoice uses a different currency.",
126
+ });
127
+ }
128
+
129
+ // === CUSTOMER VALIDATION ===
130
+ // Customer is optional, but if provided, name is required
131
+ if (values.customer && Object.keys(values.customer).length > 0) {
132
+ const hasAnyCustomerData =
133
+ values.customer.name || values.customer.address || values.customer.tax_number || values.customer.city;
134
+
135
+ if (hasAnyCustomerData && !values.customer.name?.trim()) {
136
+ errors.push({
137
+ field: "customer.name",
138
+ message: "Customer name is required when customer is provided.",
139
+ });
140
+ }
141
+ }
142
+
143
+ // === LINE ITEMS VALIDATION ===
144
+ if (!values.items || values.items.length === 0) {
145
+ errors.push({
146
+ field: "items",
147
+ message: "At least one line item is required for e-SLOG.",
148
+ });
149
+ } else {
150
+ values.items.forEach((item, index) => {
151
+ if (!item.name?.trim()) {
152
+ errors.push({
153
+ field: `items.${index}.name`,
154
+ message: "Item name is required for e-SLOG.",
155
+ });
156
+ }
157
+
158
+ if (typeof item.quantity !== "number" || item.quantity <= 0) {
159
+ errors.push({
160
+ field: `items.${index}.quantity`,
161
+ message: "Quantity must be greater than 0.",
162
+ });
163
+ }
164
+
165
+ if (typeof item.price !== "number") {
166
+ errors.push({
167
+ field: `items.${index}.price`,
168
+ message: "Price is required for e-SLOG.",
169
+ });
170
+ }
171
+
172
+ // Validate tax rates
173
+ if (item.taxes && item.taxes.length > 0) {
174
+ for (const tax of item.taxes) {
175
+ if (tax.rate !== undefined && !VALID_SI_TAX_RATES.includes(tax.rate)) {
176
+ errors.push({
177
+ field: `items.${index}.taxes`,
178
+ message: `Invalid Slovenian tax rate ${tax.rate}%. Valid: ${VALID_SI_TAX_RATES.join(", ")}%`,
179
+ });
180
+ }
181
+ }
182
+ }
183
+ });
184
+ }
185
+
186
+ return errors;
187
+ }
188
+
189
+ /**
190
+ * Check if there are any entity-level errors that require settings update
191
+ */
192
+ export function hasEntityErrors(errors: ValidationError[]): boolean {
193
+ return errors.some((e) => e.field.startsWith("entity."));
194
+ }
195
+
196
+ /**
197
+ * Get entity-level errors for display in a summary
198
+ */
199
+ export function getEntityErrors(errors: ValidationError[]): ValidationError[] {
200
+ return errors.filter((e) => e.field.startsWith("entity."));
201
+ }
202
+
203
+ /**
204
+ * Get form field errors (non-entity errors)
205
+ */
206
+ export function getFormFieldErrors(errors: ValidationError[]): ValidationError[] {
207
+ return errors.filter((e) => !e.field.startsWith("entity."));
208
+ }
@@ -0,0 +1,118 @@
1
+ export default {
2
+ Recipient: "Empfänger",
3
+ Name: "Name",
4
+ Details: "Details",
5
+ Number: "Nummer",
6
+ "Number format can be changed in settings": "Nummernformat kann in den Einstellungen geändert werden",
7
+ Date: "Datum",
8
+ "Pick a date": "Datum auswählen",
9
+ "Due Date": "Fälligkeitsdatum",
10
+ "Valid Until": "Gültig bis",
11
+ Items: "Artikel",
12
+ "Add item": "Artikel hinzufügen",
13
+ Save: "Speichern",
14
+ Update: "Aktualisieren",
15
+ "Save as Draft": "Als Entwurf speichern",
16
+ Quantity: "Menge",
17
+ Price: "Preis",
18
+ Unit: "Einheit",
19
+ Discount: "Rabatt",
20
+ Tax: "Steuer",
21
+ "Tax rate": "Steuersatz",
22
+ "Add tax": "Steuer hinzufügen",
23
+ "Select tax...": "Steuer auswählen...",
24
+ "Loading...": "Laden...",
25
+ "No taxes found": "Keine Steuern gefunden",
26
+ "Add new tax...": "Neue Steuer hinzufügen...",
27
+ Description: "Beschreibung",
28
+ "Mark as Paid": "Als bezahlt markieren",
29
+ Paid: "Bezahlt",
30
+ "Invoice will be marked as fully paid upon creation": "Rechnung wird bei Erstellung als vollständig bezahlt markiert",
31
+ "Payment Type": "Zahlungsart",
32
+ "Select payment type": "Zahlungsart auswählen",
33
+ Cash: "Bargeld",
34
+ "Bank Transfer": "Banküberweisung",
35
+ Card: "Karte",
36
+ Check: "Scheck",
37
+ Other: "Andere",
38
+ // Note field
39
+ Note: "Notiz",
40
+ "Insert variable": "Variable einfügen",
41
+ "Add payment instructions, terms, or other notes...":
42
+ "Zahlungsanweisungen, Bedingungen oder andere Notizen hinzufügen...",
43
+ // Payment terms field
44
+ "Payment Terms": "Zahlungsbedingungen",
45
+ "Add payment terms...": "Zahlungsbedingungen hinzufügen...",
46
+ // Smart code categories
47
+ Entity: "Unternehmen",
48
+ Document: "Dokument",
49
+ Customer: "Kunde",
50
+ // Smart code variable labels
51
+ "Company name": "Firmenname",
52
+ "Email address": "E-Mail-Adresse",
53
+ "Invoice number": "Rechnungsnummer",
54
+ "Invoice date": "Rechnungsdatum",
55
+ "Due date": "Fälligkeitsdatum",
56
+ "Total amount": "Gesamtbetrag",
57
+ Currency: "Währung",
58
+ "Select currency": "Währung auswählen",
59
+ "Customer name": "Kundenname",
60
+ "Customer email": "Kunden-E-Mail",
61
+ "Today's date": "Heutiges Datum",
62
+ "Current year": "Aktuelles Jahr",
63
+ // Recipient fields
64
+ "Search or create customer...": "Kunde suchen oder erstellen...",
65
+ Clear: "Löschen",
66
+ Address: "Adresse",
67
+ "Address 2": "Adresse 2",
68
+ "Post Code": "Postleitzahl",
69
+ City: "Stadt",
70
+ State: "Bundesland",
71
+ Country: "Land",
72
+ "Tax Number": "Steuernummer",
73
+ // Discount types
74
+ "Percentage discount": "Prozentualer Rabatt",
75
+ "Fixed amount discount": "Fester Rabatt",
76
+ Percentage: "Prozent",
77
+ "Fixed amount": "Fester Betrag",
78
+ // FURS fields
79
+ "FURS Fiscalization": "FURS Fiskalisierung",
80
+ "Business Premise": "Geschäftsräume",
81
+ "Electronic Device": "Elektronisches Gerät",
82
+ Premise: "Räume",
83
+ Device: "Gerät",
84
+ "Select premise": "Räume auswählen",
85
+ "Select device": "Gerät auswählen",
86
+ "Skip Fiscalization": "Fiskalisierung überspringen",
87
+ "Skip fiscalization for this invoice (e.g., bank transfers or unpaid invoices)":
88
+ "Fiskalisierung für diese Rechnung überspringen (z.B. Banküberweisungen oder unbezahlte Rechnungen)",
89
+ "Cannot skip fiscalization for cash payments": "Fiskalisierung kann für Barzahlungen nicht übersprungen werden",
90
+ Skipped: "Übersprungen",
91
+ Enabled: "Aktiviert",
92
+ "Click to enable fiscalization": "Klicken Sie, um die Fiskalisierung zu aktivieren",
93
+ "Fiscally verify": "Steuerlich prüfen",
94
+ "Click to skip fiscalization for this invoice":
95
+ "Klicken Sie, um die Fiskalisierung für diese Rechnung zu überspringen",
96
+ // e-SLOG validation
97
+ "e-SLOG": "e-SLOG",
98
+ "Click to skip e-SLOG validation for this invoice":
99
+ "Klicken Sie, um die e-SLOG-Validierung für diese Rechnung zu überspringen",
100
+ "Click to enable e-SLOG validation": "Klicken Sie, um die e-SLOG-Validierung zu aktivieren",
101
+ "e-SLOG Validation Failed": "e-SLOG-Validierung fehlgeschlagen",
102
+ "The following entity settings need to be updated:":
103
+ "Die folgenden Unternehmenseinstellungen müssen aktualisiert werden:",
104
+ // VIES / Reverse Charge
105
+ "Reverse charge - tax exempt EU B2B sale": "Reverse-Charge - steuerfreier EU B2B-Verkauf",
106
+ "Taxes disabled": "Steuern deaktiviert",
107
+ // Gross price support
108
+ "Gross price": "Bruttopreis",
109
+ "Net price": "Nettopreis",
110
+ "Gross price (tax included)": "Bruttopreis (inkl. MwSt.)",
111
+ "Net price (before tax)": "Nettopreis (exkl. MwSt.)",
112
+ // Service date
113
+ "Service Date": "Leistungsdatum",
114
+ "Single Date": "Datum",
115
+ "Date Range": "Zeitraum",
116
+ From: "Von",
117
+ To: "Bis",
118
+ } as const;
@@ -0,0 +1,114 @@
1
+ export default {
2
+ Recipient: "Prejemnik",
3
+ Name: "Ime",
4
+ Details: "Podrobnosti",
5
+ Number: "Številka",
6
+ "Number format can be changed in settings": "Format številke lahko spremenite v nastavitvah",
7
+ Date: "Datum",
8
+ "Pick a date": "Izberi datum",
9
+ "Due Date": "Rok plačila",
10
+ "Valid Until": "Veljavno do",
11
+ Items: "Postavke",
12
+ "Add item": "Dodaj postavko",
13
+ Save: "Shrani",
14
+ Update: "Posodobi",
15
+ "Save as Draft": "Shrani kot osnutek",
16
+ Quantity: "Količina",
17
+ Price: "Cena",
18
+ Unit: "Enota",
19
+ Discount: "Popust",
20
+ Tax: "Davek",
21
+ "Tax rate": "Davčna stopnja",
22
+ "Add tax": "Dodaj davek",
23
+ "Select tax...": "Izberi davek...",
24
+ "Loading...": "Nalaganje...",
25
+ "No taxes found": "Ni najdenih davkov",
26
+ "Add new tax...": "Dodaj nov davek...",
27
+ Description: "Opis",
28
+ "Mark as Paid": "Označi kot plačano",
29
+ Paid: "Plačano",
30
+ "Invoice will be marked as fully paid upon creation": "Račun bo označen kot plačan ob ustvarjanju",
31
+ "Payment Type": "Vrsta plačila",
32
+ "Select payment type": "Izberite vrsto plačila",
33
+ Cash: "Gotovina",
34
+ "Bank Transfer": "Bančno nakazilo",
35
+ Card: "Kartica",
36
+ Check: "Ček",
37
+ Other: "Drugo",
38
+ // Note field
39
+ Note: "Opomba",
40
+ "Insert variable": "Vstavi spremenljivko",
41
+ "Add payment instructions, terms, or other notes...": "Dodajte navodila za plačilo, pogoje ali druge opombe...",
42
+ // Payment terms field
43
+ "Payment Terms": "Plačilni pogoji",
44
+ "Add payment terms...": "Dodajte plačilne pogoje...",
45
+ // Smart code categories
46
+ Entity: "Podjetje",
47
+ Document: "Dokument",
48
+ Customer: "Stranka",
49
+ // Smart code variable labels
50
+ "Company name": "Ime podjetja",
51
+ "Email address": "E-poštni naslov",
52
+ "Invoice number": "Številka računa",
53
+ "Invoice date": "Datum računa",
54
+ "Due date": "Rok plačila",
55
+ "Total amount": "Skupni znesek",
56
+ Currency: "Valuta",
57
+ "Select currency": "Izberi valuto",
58
+ "Customer name": "Ime stranke",
59
+ "Customer email": "E-pošta stranke",
60
+ "Today's date": "Današnji datum",
61
+ "Current year": "Tekoče leto",
62
+ // Recipient fields
63
+ "Search or create customer...": "Išči ali ustvari stranko...",
64
+ Clear: "Počisti",
65
+ Address: "Naslov",
66
+ "Address 2": "Naslov 2",
67
+ "Post Code": "Poštna številka",
68
+ City: "Mesto",
69
+ State: "Regija",
70
+ Country: "Država",
71
+ "Tax Number": "Davčna številka",
72
+ // Discount types
73
+ "Percentage discount": "Odstotni popust",
74
+ "Fixed amount discount": "Fiksni popust",
75
+ Percentage: "Odstotek",
76
+ "Fixed amount": "Fiksni znesek",
77
+ // FURS fields
78
+ "FURS Fiscalization": "FURS davčno potrjevanje",
79
+ "Business Premise": "Poslovni prostor",
80
+ "Electronic Device": "Elektronska naprava",
81
+ Premise: "Prostor",
82
+ Device: "Naprava",
83
+ "Select premise": "Izberite prostor",
84
+ "Select device": "Izberite napravo",
85
+ "Skip Fiscalization": "Preskoči davčno potrjevanje",
86
+ "Skip fiscalization for this invoice (e.g., bank transfers or unpaid invoices)":
87
+ "Preskoči davčno potrjevanje za ta račun (npr. bančna nakazila ali neplačani računi)",
88
+ "Cannot skip fiscalization for cash payments": "Davčnega potrjevanja ni mogoče preskočiti za gotovinska plačila",
89
+ Skipped: "Preskočeno",
90
+ Enabled: "Omogočeno",
91
+ "Click to enable fiscalization": "Kliknite za omogočanje davčnega potrjevanja",
92
+ "Fiscally verify": "Davčno potrdi",
93
+ "Click to skip fiscalization for this invoice": "Kliknite za preskočitev davčnega potrjevanja za ta račun",
94
+ // e-SLOG validation
95
+ "e-SLOG": "e-SLOG",
96
+ "Click to skip e-SLOG validation for this invoice": "Kliknite za preskočitev e-SLOG preverjanja za ta račun",
97
+ "Click to enable e-SLOG validation": "Kliknite za omogočanje e-SLOG preverjanja",
98
+ "e-SLOG Validation Failed": "e-SLOG preverjanje ni uspelo",
99
+ "The following entity settings need to be updated:": "Naslednje nastavitve podjetja je potrebno posodobiti:",
100
+ // VIES / Reverse Charge
101
+ "Reverse charge - tax exempt EU B2B sale": "Obrnjena davčna obveznost - davka oproščena EU B2B prodaja",
102
+ "Taxes disabled": "Davki onemogočeni",
103
+ // Gross price support
104
+ "Gross price": "Bruto cena",
105
+ "Net price": "Neto cena",
106
+ "Gross price (tax included)": "Bruto cena (z davkom)",
107
+ "Net price (before tax)": "Neto cena (brez davka)",
108
+ // Service date
109
+ "Service Date": "Datum storitve",
110
+ "Single Date": "Datum",
111
+ "Date Range": "Obdobje",
112
+ From: "Od",
113
+ To: "Do",
114
+ } as const;