@spaceinvoices/react-ui 0.4.2 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. package/cli/dist/index.js +1 -1
  2. package/package.json +1 -1
  3. package/src/common/autocomplete.tsx +18 -2
  4. package/src/components/advance-invoices/create/create-advance-invoice-form.tsx +0 -1
  5. package/src/components/advance-invoices/create/locales/de.ts +2 -0
  6. package/src/components/advance-invoices/create/locales/es.ts +2 -0
  7. package/src/components/advance-invoices/create/locales/fr.ts +2 -0
  8. package/src/components/advance-invoices/create/locales/hr.ts +1 -0
  9. package/src/components/advance-invoices/create/locales/it.ts +2 -0
  10. package/src/components/advance-invoices/create/locales/nl.ts +2 -0
  11. package/src/components/advance-invoices/create/locales/pl.ts +1 -0
  12. package/src/components/advance-invoices/create/locales/pt.ts +1 -0
  13. package/src/components/advance-invoices/create/locales/sl.ts +1 -0
  14. package/src/components/advance-invoices/create/prepare-advance-invoice-submission.ts +0 -1
  15. package/src/components/advance-invoices/list/list-table.tsx +130 -40
  16. package/src/components/advance-invoices/list/locales/de.ts +6 -0
  17. package/src/components/advance-invoices/list/locales/en.ts +5 -0
  18. package/src/components/advance-invoices/list/locales/es.ts +6 -0
  19. package/src/components/advance-invoices/list/locales/fr.ts +6 -0
  20. package/src/components/advance-invoices/list/locales/hr.ts +6 -0
  21. package/src/components/advance-invoices/list/locales/it.ts +6 -0
  22. package/src/components/advance-invoices/list/locales/nl.ts +6 -0
  23. package/src/components/advance-invoices/list/locales/pl.ts +6 -0
  24. package/src/components/advance-invoices/list/locales/pt.ts +6 -0
  25. package/src/components/advance-invoices/list/locales/sl.ts +6 -0
  26. package/src/components/credit-notes/create/create-credit-note-form.tsx +114 -3
  27. package/src/components/credit-notes/create/locales/de.ts +2 -0
  28. package/src/components/credit-notes/create/locales/es.ts +2 -0
  29. package/src/components/credit-notes/create/locales/fr.ts +2 -0
  30. package/src/components/credit-notes/create/locales/hr.ts +1 -0
  31. package/src/components/credit-notes/create/locales/it.ts +2 -0
  32. package/src/components/credit-notes/create/locales/nl.ts +2 -0
  33. package/src/components/credit-notes/create/locales/pl.ts +1 -0
  34. package/src/components/credit-notes/create/locales/pt.ts +1 -0
  35. package/src/components/credit-notes/create/locales/sl.ts +1 -0
  36. package/src/components/credit-notes/credit-notes.hooks.ts +30 -0
  37. package/src/components/credit-notes/list/list-table.tsx +111 -36
  38. package/src/components/credit-notes/list/locales/de.ts +6 -1
  39. package/src/components/credit-notes/list/locales/en.ts +6 -0
  40. package/src/components/credit-notes/list/locales/es.ts +6 -1
  41. package/src/components/credit-notes/list/locales/fr.ts +6 -1
  42. package/src/components/credit-notes/list/locales/hr.ts +6 -1
  43. package/src/components/credit-notes/list/locales/it.ts +6 -1
  44. package/src/components/credit-notes/list/locales/nl.ts +6 -1
  45. package/src/components/credit-notes/list/locales/pl.ts +6 -1
  46. package/src/components/credit-notes/list/locales/pt.ts +6 -1
  47. package/src/components/credit-notes/list/locales/sl.ts +6 -1
  48. package/src/components/customers/customer-list-table/customer-list-table.tsx +0 -3
  49. package/src/components/customers/customer-list-table/locales/de.ts +1 -0
  50. package/src/components/customers/customer-list-table/locales/es.ts +1 -0
  51. package/src/components/customers/customer-list-table/locales/fr.ts +1 -0
  52. package/src/components/customers/customer-list-table/locales/hr.ts +1 -0
  53. package/src/components/customers/customer-list-table/locales/it.ts +1 -0
  54. package/src/components/customers/customer-list-table/locales/nl.ts +1 -0
  55. package/src/components/customers/customer-list-table/locales/pl.ts +1 -0
  56. package/src/components/customers/customer-list-table/locales/pt.ts +1 -0
  57. package/src/components/customers/customer-list-table/locales/sl.ts +1 -0
  58. package/src/components/dashboard/collection-rate-card/use-collection-rate.ts +2 -2
  59. package/src/components/dashboard/invoice-status-chart/use-invoice-status.ts +3 -3
  60. package/src/components/dashboard/payment-methods-chart/use-payment-methods.ts +1 -1
  61. package/src/components/dashboard/payment-trend-chart/use-payment-trend.ts +1 -1
  62. package/src/components/dashboard/revenue-trend-chart/use-revenue-trend.ts +1 -1
  63. package/src/components/dashboard/shared/use-revenue-data.ts +4 -4
  64. package/src/components/dashboard/shared/use-stats-counts.ts +4 -4
  65. package/src/components/dashboard/shared/use-stats-query.ts +1 -1
  66. package/src/components/dashboard/tax-collected-card/use-tax-collected.ts +2 -2
  67. package/src/components/dashboard/top-customers-chart/use-top-customers.ts +1 -1
  68. package/src/components/delivery-notes/create/create-delivery-note-form.tsx +332 -0
  69. package/src/components/delivery-notes/create/locales/de.ts +50 -0
  70. package/src/components/delivery-notes/create/locales/es.ts +49 -0
  71. package/src/components/delivery-notes/create/locales/fr.ts +50 -0
  72. package/src/components/delivery-notes/create/locales/hr.ts +49 -0
  73. package/src/components/delivery-notes/create/locales/it.ts +49 -0
  74. package/src/components/delivery-notes/create/locales/nl.ts +50 -0
  75. package/src/components/delivery-notes/create/locales/pl.ts +49 -0
  76. package/src/components/delivery-notes/create/locales/pt.ts +50 -0
  77. package/src/components/delivery-notes/create/locales/sl.ts +49 -0
  78. package/src/components/delivery-notes/create/prepare-delivery-note-submission.ts +38 -0
  79. package/src/components/delivery-notes/create/use-delivery-note-customer-form.ts +1 -0
  80. package/src/components/delivery-notes/delivery-notes.hooks.ts +15 -0
  81. package/src/components/delivery-notes/list/index.ts +3 -0
  82. package/src/components/delivery-notes/list/list-row-actions.tsx +122 -0
  83. package/src/components/delivery-notes/list/list-table.tsx +247 -0
  84. package/src/components/delivery-notes/list/locales/de.ts +13 -0
  85. package/src/components/delivery-notes/list/locales/en.ts +13 -0
  86. package/src/components/delivery-notes/list/locales/es.ts +13 -0
  87. package/src/components/delivery-notes/list/locales/fr.ts +13 -0
  88. package/src/components/delivery-notes/list/locales/hr.ts +13 -0
  89. package/src/components/delivery-notes/list/locales/it.ts +13 -0
  90. package/src/components/delivery-notes/list/locales/nl.ts +13 -0
  91. package/src/components/delivery-notes/list/locales/pl.ts +13 -0
  92. package/src/components/delivery-notes/list/locales/pt.ts +13 -0
  93. package/src/components/delivery-notes/list/locales/sl.ts +13 -0
  94. package/src/components/delivery-notes/list/use-delivery-note-download.ts +63 -0
  95. package/src/components/documents/create/document-details-section.tsx +76 -58
  96. package/src/components/documents/create/linked-documents-info.tsx +82 -0
  97. package/src/components/documents/create/live-preview.tsx +38 -11
  98. package/src/components/documents/create/prepare-document-submission.ts +1 -1
  99. package/src/components/documents/documents.hooks.ts +2 -1
  100. package/src/components/documents/shared/document-preview-display.tsx +12 -5
  101. package/src/components/documents/types.ts +12 -3
  102. package/src/components/documents/view/document-activities-list.tsx +65 -47
  103. package/src/components/documents/view/document-details-card.tsx +102 -77
  104. package/src/components/documents/view/document-payments-list.tsx +102 -68
  105. package/src/components/documents/view/document-relations-list.tsx +120 -0
  106. package/src/components/documents/view/document-sidebar.tsx +151 -0
  107. package/src/components/documents/view/index.ts +2 -0
  108. package/src/components/documents/view/locales/de.ts +23 -0
  109. package/src/components/documents/view/locales/es.ts +23 -0
  110. package/src/components/documents/view/locales/fr.ts +23 -0
  111. package/src/components/documents/view/locales/hr.ts +23 -0
  112. package/src/components/documents/view/locales/it.ts +23 -0
  113. package/src/components/documents/view/locales/nl.ts +23 -0
  114. package/src/components/documents/view/locales/pl.ts +23 -0
  115. package/src/components/documents/view/locales/pt.ts +23 -0
  116. package/src/components/documents/view/locales/sl.ts +23 -0
  117. package/src/components/documents/view/use-document-download.ts +8 -5
  118. package/src/components/entities/create-entity-form.tsx +165 -13
  119. package/src/components/entities/entity-settings-form/entity-settings-form.tsx +101 -1
  120. package/src/components/entities/entity-settings-form/locales/de.ts +9 -0
  121. package/src/components/entities/entity-settings-form/locales/es.ts +9 -0
  122. package/src/components/entities/entity-settings-form/locales/fr.ts +9 -0
  123. package/src/components/entities/entity-settings-form/locales/hr.ts +9 -0
  124. package/src/components/entities/entity-settings-form/locales/it.ts +9 -0
  125. package/src/components/entities/entity-settings-form/locales/nl.ts +9 -0
  126. package/src/components/entities/entity-settings-form/locales/pl.ts +9 -0
  127. package/src/components/entities/entity-settings-form/locales/pt.ts +9 -0
  128. package/src/components/entities/entity-settings-form/locales/sl.ts +9 -0
  129. package/src/components/entities/fina-settings-form/fina-settings-form.tsx +83 -71
  130. package/src/components/entities/fina-settings-form/fina-settings.hooks.ts +7 -2
  131. package/src/components/entities/fina-settings-form/locales/de.ts +2 -2
  132. package/src/components/entities/fina-settings-form/locales/en.ts +2 -2
  133. package/src/components/entities/fina-settings-form/locales/es.ts +2 -2
  134. package/src/components/entities/fina-settings-form/locales/fr.ts +2 -2
  135. package/src/components/entities/fina-settings-form/locales/hr.ts +2 -2
  136. package/src/components/entities/fina-settings-form/locales/it.ts +2 -2
  137. package/src/components/entities/fina-settings-form/locales/nl.ts +2 -2
  138. package/src/components/entities/fina-settings-form/locales/pl.ts +2 -2
  139. package/src/components/entities/fina-settings-form/locales/pt.ts +2 -2
  140. package/src/components/entities/fina-settings-form/locales/sl.ts +2 -2
  141. package/src/components/entities/furs-settings-form/furs-settings-form.tsx +10 -1
  142. package/src/components/entities/furs-settings-form/furs-settings.hooks.ts +7 -2
  143. package/src/components/entities/furs-settings-form/locales/en.ts +0 -1
  144. package/src/components/entities/furs-settings-form/sections/general-settings-section.tsx +12 -4
  145. package/src/components/entities/settings/pdf-template-selector/locales/de.ts +3 -1
  146. package/src/components/entities/settings/pdf-template-selector/locales/es.ts +3 -1
  147. package/src/components/entities/settings/pdf-template-selector/locales/fr.ts +4 -1
  148. package/src/components/entities/settings/pdf-template-selector/locales/hr.ts +4 -1
  149. package/src/components/entities/settings/pdf-template-selector/locales/it.ts +3 -1
  150. package/src/components/entities/settings/pdf-template-selector/locales/nl.ts +3 -1
  151. package/src/components/entities/settings/pdf-template-selector/locales/pl.ts +3 -1
  152. package/src/components/entities/settings/pdf-template-selector/locales/pt.ts +3 -1
  153. package/src/components/entities/settings/pdf-template-selector/locales/sl.ts +3 -1
  154. package/src/components/entities/settings/pdf-template-selector/pdf-template-cards.tsx +1 -0
  155. package/src/components/estimates/create/create-estimate-form.tsx +29 -2
  156. package/src/components/estimates/list/list-table.tsx +3 -6
  157. package/src/components/estimates/list/locales/de.ts +1 -0
  158. package/src/components/estimates/list/locales/es.ts +1 -0
  159. package/src/components/estimates/list/locales/fr.ts +1 -0
  160. package/src/components/estimates/list/locales/hr.ts +1 -0
  161. package/src/components/estimates/list/locales/it.ts +1 -0
  162. package/src/components/estimates/list/locales/nl.ts +1 -0
  163. package/src/components/estimates/list/locales/pl.ts +1 -0
  164. package/src/components/estimates/list/locales/pt.ts +1 -0
  165. package/src/components/estimates/list/locales/sl.ts +1 -0
  166. package/src/components/export/document-export-form.tsx +9 -2
  167. package/src/components/export/index.ts +2 -0
  168. package/src/components/export/sales-per-item-export-form.tsx +223 -0
  169. package/src/components/invoices/create/create-invoice-form.tsx +48 -1
  170. package/src/components/invoices/create/locales/de.ts +11 -0
  171. package/src/components/invoices/create/locales/es.ts +11 -0
  172. package/src/components/invoices/create/locales/fr.ts +11 -0
  173. package/src/components/invoices/create/locales/hr.ts +10 -0
  174. package/src/components/invoices/create/locales/it.ts +11 -0
  175. package/src/components/invoices/create/locales/nl.ts +11 -0
  176. package/src/components/invoices/create/locales/pl.ts +10 -0
  177. package/src/components/invoices/create/locales/pt.ts +10 -0
  178. package/src/components/invoices/create/locales/sl.ts +10 -0
  179. package/src/components/invoices/invoices-furs.hooks.ts +27 -9
  180. package/src/components/invoices/list/list-row-actions.tsx +3 -3
  181. package/src/components/invoices/list/list-table.tsx +132 -21
  182. package/src/components/invoices/list/locales/de.ts +6 -0
  183. package/src/components/invoices/list/locales/en.ts +5 -0
  184. package/src/components/invoices/list/locales/es.ts +6 -0
  185. package/src/components/invoices/list/locales/fr.ts +6 -0
  186. package/src/components/invoices/list/locales/hr.ts +6 -0
  187. package/src/components/invoices/list/locales/it.ts +6 -0
  188. package/src/components/invoices/list/locales/nl.ts +6 -0
  189. package/src/components/invoices/list/locales/pl.ts +6 -0
  190. package/src/components/invoices/list/locales/pt.ts +6 -0
  191. package/src/components/invoices/list/locales/sl.ts +6 -0
  192. package/src/components/invoices/view/fiscalization-status-card.tsx +42 -24
  193. package/src/components/items/item-combobox.tsx +5 -3
  194. package/src/components/items/item-list-table/item-list-header.tsx +4 -17
  195. package/src/components/items/item-list-table/item-list-row-actions.tsx +3 -2
  196. package/src/components/items/item-list-table/item-list-row.tsx +3 -2
  197. package/src/components/items/item-list-table/item-list-table.tsx +3 -3
  198. package/src/components/items/item-list-table/locales/de.ts +1 -0
  199. package/src/components/items/item-list-table/locales/es.ts +1 -0
  200. package/src/components/items/item-list-table/locales/fr.ts +1 -0
  201. package/src/components/items/item-list-table/locales/hr.ts +1 -0
  202. package/src/components/items/item-list-table/locales/it.ts +1 -0
  203. package/src/components/items/item-list-table/locales/nl.ts +1 -0
  204. package/src/components/items/item-list-table/locales/pl.ts +1 -0
  205. package/src/components/items/item-list-table/locales/pt.ts +1 -0
  206. package/src/components/items/item-list-table/locales/sl.ts +1 -0
  207. package/src/components/payments/list/list-table.tsx +0 -4
  208. package/src/components/payments/list/locales/de.ts +1 -0
  209. package/src/components/payments/list/locales/es.ts +1 -0
  210. package/src/components/payments/list/locales/fr.ts +1 -0
  211. package/src/components/payments/list/locales/hr.ts +1 -0
  212. package/src/components/payments/list/locales/it.ts +1 -0
  213. package/src/components/payments/list/locales/nl.ts +1 -0
  214. package/src/components/payments/list/locales/pl.ts +1 -0
  215. package/src/components/payments/list/locales/pt.ts +1 -0
  216. package/src/components/payments/list/locales/sl.ts +1 -0
  217. package/src/components/recurring-invoices/list/list-table.tsx +0 -7
  218. package/src/components/recurring-invoices/list/locales/de.ts +1 -0
  219. package/src/components/recurring-invoices/list/locales/es.ts +1 -0
  220. package/src/components/recurring-invoices/list/locales/fr.ts +1 -0
  221. package/src/components/recurring-invoices/list/locales/hr.ts +1 -0
  222. package/src/components/recurring-invoices/list/locales/it.ts +1 -0
  223. package/src/components/recurring-invoices/list/locales/nl.ts +1 -0
  224. package/src/components/recurring-invoices/list/locales/pl.ts +1 -0
  225. package/src/components/recurring-invoices/list/locales/pt.ts +1 -0
  226. package/src/components/recurring-invoices/list/locales/sl.ts +1 -0
  227. package/src/components/request-logs/request-log-list-table.tsx +0 -3
  228. package/src/components/table/README.md +14 -121
  229. package/src/components/table/data-table.tsx +22 -37
  230. package/src/components/table/hooks/use-table-state.ts +3 -27
  231. package/src/components/table/index.ts +0 -2
  232. package/src/components/table/selection-toolbar.tsx +35 -1
  233. package/src/components/table/table-empty-state.tsx +6 -3
  234. package/src/components/table/table-no-results.tsx +10 -5
  235. package/src/components/table/types.ts +0 -5
  236. package/src/components/taxes/tax-list-table/locales/de.ts +1 -0
  237. package/src/components/taxes/tax-list-table/locales/es.ts +1 -0
  238. package/src/components/taxes/tax-list-table/locales/fr.ts +1 -0
  239. package/src/components/taxes/tax-list-table/locales/hr.ts +1 -0
  240. package/src/components/taxes/tax-list-table/locales/it.ts +1 -0
  241. package/src/components/taxes/tax-list-table/locales/nl.ts +1 -0
  242. package/src/components/taxes/tax-list-table/locales/pl.ts +1 -0
  243. package/src/components/taxes/tax-list-table/locales/pt.ts +1 -0
  244. package/src/components/taxes/tax-list-table/locales/sl.ts +1 -0
  245. package/src/components/taxes/tax-list-table/tax-list-header.tsx +3 -14
  246. package/src/components/taxes/tax-list-table/tax-list-table.tsx +3 -3
  247. package/src/components/ui/popover.tsx +3 -1
  248. package/src/components/ui/tooltip.tsx +3 -1
  249. package/src/generated/schemas/deliverynote.ts +134 -0
  250. package/src/generated/schemas/entity.ts +4 -0
  251. package/src/generated/schemas/index.ts +3 -0
  252. package/src/generated/schemas/order.ts +5 -3
  253. package/src/generated/schemas/payment.ts +22 -2
  254. package/src/generated/schemas/renderadvanceinvoicepreview_body.ts +1 -0
  255. package/src/generated/schemas/rendercreditnotepreview_body.ts +1 -0
  256. package/src/generated/schemas/renderdeliverynotepreview_body.ts +185 -0
  257. package/src/generated/schemas/renderestimatepreview_body.ts +1 -0
  258. package/src/generated/schemas/renderinvoicepreview_body.ts +1 -0
  259. package/src/generated/schemas/startpdfexport_body.ts +18 -2
  260. package/src/generated/schemas/userfinasettings.ts +19 -0
  261. package/src/generated/schemas/webhook.ts +12 -0
  262. package/src/hooks/use-duplicate-document.ts +49 -6
  263. package/src/hooks/use-next-document-number.ts +2 -2
  264. package/src/lib/fiscalization.ts +12 -0
  265. package/src/lib/schemas/advance-invoice.ts +0 -1
  266. package/src/providers/sdk-provider.tsx +5 -7
  267. package/src/components/table/sortable-header.tsx +0 -56
@@ -43,6 +43,7 @@ const createWebhookSchemaDefinition = z.object({
43
43
  "estimate.restored",
44
44
  "credit_note.created",
45
45
  "credit_note.issued",
46
+ "credit_note.voided",
46
47
  "credit_note.deleted",
47
48
  "credit_note.restored",
48
49
  "advance_invoice.created",
@@ -83,6 +84,11 @@ const createWebhookSchemaDefinition = z.object({
83
84
  "order_integration.created",
84
85
  "order_integration.updated",
85
86
  "order_integration.deleted",
87
+ "delivery_note.created",
88
+ "delivery_note.sent",
89
+ "delivery_note.cancelled",
90
+ "delivery_note.deleted",
91
+ "delivery_note.restored",
86
92
  ])
87
93
  )
88
94
  .min(1),
@@ -130,6 +136,7 @@ const updateWebhookSchemaDefinition = z
130
136
  "estimate.restored",
131
137
  "credit_note.created",
132
138
  "credit_note.issued",
139
+ "credit_note.voided",
133
140
  "credit_note.deleted",
134
141
  "credit_note.restored",
135
142
  "advance_invoice.created",
@@ -170,6 +177,11 @@ const updateWebhookSchemaDefinition = z
170
177
  "order_integration.created",
171
178
  "order_integration.updated",
172
179
  "order_integration.deleted",
180
+ "delivery_note.created",
181
+ "delivery_note.sent",
182
+ "delivery_note.cancelled",
183
+ "delivery_note.deleted",
184
+ "delivery_note.restored",
173
185
  ])
174
186
  )
175
187
  .min(1),
@@ -2,9 +2,11 @@ import type {
2
2
  AdvanceInvoice,
3
3
  CreateAdvanceInvoiceRequest,
4
4
  CreateCreditNoteRequest,
5
+ CreateDeliveryNoteRequest,
5
6
  CreateEstimateRequest,
6
7
  CreateInvoiceRequest,
7
8
  CreditNote,
9
+ DeliveryNote,
8
10
  Estimate,
9
11
  Invoice,
10
12
  } from "@spaceinvoices/js-sdk";
@@ -13,13 +15,14 @@ import { useQuery } from "@tanstack/react-query";
13
15
  import { useEntities } from "@/ui/providers/entities-context";
14
16
  import { useSDK } from "@/ui/providers/sdk-provider";
15
17
 
16
- export type DocumentType = "invoice" | "estimate" | "credit_note" | "advance_invoice";
17
- type Document = Invoice | Estimate | CreditNote | AdvanceInvoice;
18
+ export type DocumentType = "invoice" | "estimate" | "credit_note" | "advance_invoice" | "delivery_note";
19
+ type Document = Invoice | Estimate | CreditNote | AdvanceInvoice | DeliveryNote;
18
20
  type CreateRequest =
19
21
  | CreateInvoiceRequest
20
22
  | CreateEstimateRequest
21
23
  | CreateCreditNoteRequest
22
- | CreateAdvanceInvoiceRequest;
24
+ | CreateAdvanceInvoiceRequest
25
+ | CreateDeliveryNoteRequest;
23
26
 
24
27
  /**
25
28
  * Get document type from ID prefix
@@ -29,6 +32,7 @@ export function getDocumentTypeFromId(id: string): DocumentType | null {
29
32
  if (id.startsWith("est_")) return "estimate";
30
33
  if (id.startsWith("cn_")) return "credit_note";
31
34
  if (id.startsWith("adv_")) return "advance_invoice";
35
+ if (id.startsWith("del_")) return "delivery_note";
32
36
  return null;
33
37
  }
34
38
 
@@ -45,6 +49,8 @@ export function getAllowedDuplicateTargets(sourceType: DocumentType): DocumentTy
45
49
  return ["credit_note"];
46
50
  case "advance_invoice":
47
51
  return ["advance_invoice", "invoice"];
52
+ case "delivery_note":
53
+ return ["delivery_note", "invoice"];
48
54
  default:
49
55
  return [];
50
56
  }
@@ -54,7 +60,7 @@ export function getAllowedDuplicateTargets(sourceType: DocumentType): DocumentTy
54
60
  * Transform a source document into form-compatible initial values
55
61
  * Copies relevant fields and resets computed/generated ones
56
62
  */
57
- function transformDocumentForDuplication(source: Document, _targetType: DocumentType): Partial<CreateRequest> {
63
+ function transformDocumentForDuplication(source: Document, targetType: DocumentType): Partial<CreateRequest> {
58
64
  // Transform items - copy only the fields needed for creation
59
65
  // Use type assertion for items since all document item types share the same shape
60
66
  const sourceItems = source.items as Array<{
@@ -92,6 +98,10 @@ function transformDocumentForDuplication(source: Document, _targetType: Document
92
98
  }
93
99
  : undefined;
94
100
 
101
+ // When converting to a different type, link back to the source document
102
+ const sourceType = getDocumentTypeFromId(source.id);
103
+ const isConversion = sourceType && sourceType !== targetType;
104
+
95
105
  // Build base duplicate data
96
106
  const baseData: Partial<CreateRequest> = {
97
107
  // Customer - always pass both customer_id AND customer data when available
@@ -109,6 +119,8 @@ function transformDocumentForDuplication(source: Document, _targetType: Document
109
119
  date: new Date().toISOString(),
110
120
  // Number - leave empty for auto-generation
111
121
  // Do NOT copy: number, totals, taxes, payments, furs, eslog, vies, shareable_id
122
+ // Link back to source document when converting (e.g., delivery note → invoice)
123
+ ...(isConversion ? { linked_documents: [source.id] } : {}),
112
124
  };
113
125
 
114
126
  return baseData;
@@ -123,9 +135,20 @@ export type UseDuplicateDocumentOptions = {
123
135
  enabled?: boolean;
124
136
  };
125
137
 
138
+ export type LinkedDocumentSummary = {
139
+ id: string;
140
+ type: string;
141
+ number: string;
142
+ date: string;
143
+ total_with_tax: number;
144
+ currency_code: string;
145
+ };
146
+
126
147
  export type UseDuplicateDocumentResult = {
127
148
  /** Transformed initial values for the form */
128
149
  initialValues: Partial<CreateRequest> | undefined;
150
+ /** Source documents linked to this document (populated for conversions) */
151
+ sourceDocuments: LinkedDocumentSummary[];
129
152
  /** Loading state */
130
153
  isLoading: boolean;
131
154
  /** Error if fetch failed */
@@ -170,6 +193,8 @@ export function useDuplicateDocument({
170
193
  source = await sdk.estimates.get(sourceId, undefined, { entity_id: activeEntity.id });
171
194
  } else if (sourceType === "advance_invoice") {
172
195
  source = await sdk.advanceInvoices.get(sourceId, undefined, { entity_id: activeEntity.id });
196
+ } else if (sourceType === "delivery_note") {
197
+ source = await sdk.deliveryNotes.get(sourceId, undefined, { entity_id: activeEntity.id });
173
198
  } else {
174
199
  // Credit note
175
200
  source = await sdk.creditNotes.get(sourceId, undefined, { entity_id: activeEntity.id });
@@ -179,13 +204,31 @@ export function useDuplicateDocument({
179
204
  throw new Error("Source document not found");
180
205
  }
181
206
 
182
- return transformDocumentForDuplication(source, targetType);
207
+ const initialValues = transformDocumentForDuplication(source, targetType);
208
+
209
+ // Build source document summaries for conversions (different source → target type)
210
+ const isConversion = sourceType !== targetType;
211
+ const sourceDocuments: LinkedDocumentSummary[] = isConversion
212
+ ? [
213
+ {
214
+ id: source.id,
215
+ type: sourceType,
216
+ number: (source as any).number || "",
217
+ date: (source as any).date || "",
218
+ total_with_tax: (source as any).total_with_tax ?? 0,
219
+ currency_code: (source as any).currency_code || "",
220
+ },
221
+ ]
222
+ : [];
223
+
224
+ return { initialValues, sourceDocuments };
183
225
  },
184
226
  enabled: enabled && !!sourceId && !!activeEntity?.id && !!sourceType,
185
227
  });
186
228
 
187
229
  return {
188
- initialValues: query.data,
230
+ initialValues: query.data?.initialValues,
231
+ sourceDocuments: query.data?.sourceDocuments ?? [],
189
232
  isLoading: query.isLoading,
190
233
  error: query.error,
191
234
  sourceType,
@@ -4,7 +4,7 @@ import { useSDK } from "@/ui/providers/sdk-provider";
4
4
 
5
5
  export const NEXT_DOCUMENT_NUMBER_CACHE_KEY = "next-document-number";
6
6
 
7
- export type DocumentType = "invoice" | "estimate" | "credit_note" | "advance_invoice";
7
+ export type DocumentType = "invoice" | "estimate" | "credit_note" | "advance_invoice" | "delivery_note";
8
8
 
9
9
  /** Response type for next document number preview */
10
10
  export type NextDocumentNumberResponse = {
@@ -43,7 +43,7 @@ export function useNextDocumentNumber(
43
43
  queryFn: async () => {
44
44
  const response = await sdk.documents.getNextNumber(
45
45
  {
46
- type,
46
+ type: type as "invoice",
47
47
  business_premise_name: options?.businessPremiseName,
48
48
  electronic_device_name: options?.electronicDeviceName,
49
49
  },
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Checks if a document has a failed fiscalization status.
3
+ * Returns the provider type that failed, or null if no failure.
4
+ */
5
+ export function getFiscalizationFailureType(doc: {
6
+ furs?: { status?: string } | null;
7
+ fina?: { status?: string } | null;
8
+ }): "furs" | "fina" | null {
9
+ if (doc.furs?.status === "failed") return "furs";
10
+ if (doc.fina?.status === "failed") return "fina";
11
+ return null;
12
+ }
@@ -11,7 +11,6 @@ import { customerSchema, lineItemSchema, transformItemsForApi } from "./shared";
11
11
  export const advanceInvoiceFormSchema = z.object({
12
12
  number: z.string().max(100).optional(),
13
13
  date: z.string().optional(),
14
- date_due: z.string().optional(),
15
14
  customer_id: z.string().nullish(),
16
15
  customer: customerSchema,
17
16
  items: z.array(lineItemSchema).min(1),
@@ -1,6 +1,6 @@
1
1
  import SDK from "@spaceinvoices/js-sdk";
2
2
  import type { ReactNode } from "react";
3
- import { createContext, useContext, useEffect, useMemo, useState } from "react";
3
+ import { createContext, useCallback, useContext, useEffect, useMemo, useState } from "react";
4
4
 
5
5
  import { AUTH_COOKIES } from "@/ui/lib/auth";
6
6
  import { flushCookies, getCookie } from "@/ui/lib/browser-cookies";
@@ -59,7 +59,7 @@ export function SDKProvider({
59
59
  /**
60
60
  * Initialize the SDK with the current auth token
61
61
  */
62
- const initializeSDK = async () => {
62
+ const initializeSDK = useCallback(async () => {
63
63
  setIsLoading(true);
64
64
  setError(null);
65
65
 
@@ -92,17 +92,15 @@ export function SDKProvider({
92
92
  } finally {
93
93
  setIsLoading(false);
94
94
  }
95
- };
95
+ }, [onUnauthorized]);
96
96
 
97
97
  // Initialize SDK on component mount
98
- // biome-ignore lint/correctness/useExhaustiveDependencies: initializeSDK is intentionally omitted - should only run once on mount
99
98
  useEffect(() => {
100
99
  initializeSDK();
101
- }, []); // Empty dependency array - only run on mount
100
+ }, [initializeSDK]);
102
101
 
103
102
  // IMPORTANT: useMemo must be called BEFORE any conditional returns
104
103
  // to satisfy React's Rules of Hooks
105
- // biome-ignore lint/correctness/useExhaustiveDependencies: initializeSDK is stable (doesn't change) and including it would cause unnecessary re-renders
106
104
  const value = useMemo(
107
105
  () => ({
108
106
  sdk: sdk as SDK, // Will be non-null when children render (checked below)
@@ -111,7 +109,7 @@ export function SDKProvider({
111
109
  error,
112
110
  reinitialize: initializeSDK,
113
111
  }),
114
- [sdk, isInitialized, isLoading, error], // Don't include initializeSDK - it's stable but causes re-renders
112
+ [sdk, isInitialized, isLoading, error, initializeSDK],
115
113
  );
116
114
 
117
115
  // Render appropriate UI based on SDK state
@@ -1,56 +0,0 @@
1
- import { ArrowDown, ArrowUp, ArrowUpDown } from "lucide-react";
2
-
3
- import { Button } from "@/ui/components/ui/button";
4
- import { cn } from "@/ui/lib/utils";
5
-
6
- type SortableHeaderProps = {
7
- children: React.ReactNode;
8
- field: string;
9
- currentOrder?: string;
10
- align?: "left" | "center" | "right";
11
- onSort?: (order: string | null) => void;
12
- };
13
-
14
- /**
15
- * Sortable column header with visual indicators
16
- * Cycles through: none -> asc -> desc -> none
17
- */
18
- export function SortableHeader({ children, field, currentOrder, align = "left", onSort }: SortableHeaderProps) {
19
- const isActive = currentOrder?.replace(/^-/, "") === field;
20
- const isDesc = currentOrder?.startsWith("-");
21
-
22
- // Determine next sort state
23
- const getNextOrder = () => {
24
- if (!isActive) return field; // Not active -> ascending
25
- if (!isDesc) return `-${field}`; // Ascending -> descending
26
- return null; // Descending -> none
27
- };
28
-
29
- const nextOrder = getNextOrder();
30
-
31
- return (
32
- <Button
33
- variant="ghost"
34
- size="sm"
35
- onClick={() => onSort?.(nextOrder)}
36
- className={cn(
37
- "h-8 gap-1",
38
- isActive && "font-semibold",
39
- align === "left" && "-ml-3",
40
- align === "right" && "-mr-3",
41
- )}
42
- aria-label={`Sort by ${field}${isActive ? (isDesc ? " descending" : " ascending") : ""}`}
43
- >
44
- {children}
45
- {isActive ? (
46
- isDesc ? (
47
- <ArrowDown className="h-4 w-4" aria-hidden="true" />
48
- ) : (
49
- <ArrowUp className="h-4 w-4" aria-hidden="true" />
50
- )
51
- ) : (
52
- <ArrowUpDown className="h-4 w-4 opacity-50" aria-hidden="true" />
53
- )}
54
- </Button>
55
- );
56
- }