@spaceinvoices/react-ui 0.4.3 → 0.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/cli/dist/index.js +1 -1
  2. package/package.json +1 -1
  3. package/src/common/autocomplete.tsx +18 -2
  4. package/src/components/advance-invoices/create/create-advance-invoice-form.tsx +61 -12
  5. package/src/components/advance-invoices/create/locales/de.ts +17 -0
  6. package/src/components/advance-invoices/create/locales/es.ts +17 -0
  7. package/src/components/advance-invoices/create/locales/fr.ts +17 -0
  8. package/src/components/advance-invoices/create/locales/hr.ts +16 -0
  9. package/src/components/advance-invoices/create/locales/it.ts +17 -0
  10. package/src/components/advance-invoices/create/locales/nl.ts +17 -0
  11. package/src/components/advance-invoices/create/locales/pl.ts +16 -0
  12. package/src/components/advance-invoices/create/locales/pt.ts +16 -0
  13. package/src/components/advance-invoices/create/locales/sl.ts +16 -0
  14. package/src/components/advance-invoices/create/prepare-advance-invoice-submission.ts +0 -1
  15. package/src/components/advance-invoices/list/list-row-actions.tsx +48 -1
  16. package/src/components/advance-invoices/list/list-table.tsx +100 -50
  17. package/src/components/advance-invoices/list/locales/de.ts +9 -0
  18. package/src/components/advance-invoices/list/locales/en.ts +7 -0
  19. package/src/components/advance-invoices/list/locales/es.ts +9 -0
  20. package/src/components/advance-invoices/list/locales/fr.ts +9 -0
  21. package/src/components/advance-invoices/list/locales/hr.ts +8 -0
  22. package/src/components/advance-invoices/list/locales/it.ts +9 -0
  23. package/src/components/advance-invoices/list/locales/nl.ts +9 -0
  24. package/src/components/advance-invoices/list/locales/pl.ts +8 -0
  25. package/src/components/advance-invoices/list/locales/pt.ts +9 -0
  26. package/src/components/advance-invoices/list/locales/sl.ts +8 -0
  27. package/src/components/credit-notes/create/create-credit-note-form.tsx +185 -11
  28. package/src/components/credit-notes/create/locales/de.ts +18 -0
  29. package/src/components/credit-notes/create/locales/es.ts +18 -0
  30. package/src/components/credit-notes/create/locales/fr.ts +18 -0
  31. package/src/components/credit-notes/create/locales/hr.ts +17 -0
  32. package/src/components/credit-notes/create/locales/it.ts +18 -0
  33. package/src/components/credit-notes/create/locales/nl.ts +18 -0
  34. package/src/components/credit-notes/create/locales/pl.ts +17 -0
  35. package/src/components/credit-notes/create/locales/pt.ts +17 -0
  36. package/src/components/credit-notes/create/locales/sl.ts +18 -1
  37. package/src/components/credit-notes/credit-notes.hooks.ts +30 -0
  38. package/src/components/credit-notes/list/list-row-actions.tsx +44 -1
  39. package/src/components/credit-notes/list/list-table.tsx +93 -32
  40. package/src/components/credit-notes/list/locales/de.ts +7 -0
  41. package/src/components/credit-notes/list/locales/en.ts +6 -0
  42. package/src/components/credit-notes/list/locales/es.ts +7 -0
  43. package/src/components/credit-notes/list/locales/fr.ts +7 -0
  44. package/src/components/credit-notes/list/locales/hr.ts +7 -0
  45. package/src/components/credit-notes/list/locales/it.ts +7 -0
  46. package/src/components/credit-notes/list/locales/nl.ts +7 -0
  47. package/src/components/credit-notes/list/locales/pl.ts +7 -0
  48. package/src/components/credit-notes/list/locales/pt.ts +7 -0
  49. package/src/components/credit-notes/list/locales/sl.ts +7 -0
  50. package/src/components/customers/customer-list-table/customer-list-table.tsx +0 -3
  51. package/src/components/customers/customer-list-table/locales/de.ts +1 -0
  52. package/src/components/customers/customer-list-table/locales/es.ts +1 -0
  53. package/src/components/customers/customer-list-table/locales/fr.ts +1 -0
  54. package/src/components/customers/customer-list-table/locales/hr.ts +1 -0
  55. package/src/components/customers/customer-list-table/locales/it.ts +1 -0
  56. package/src/components/customers/customer-list-table/locales/nl.ts +1 -0
  57. package/src/components/customers/customer-list-table/locales/pl.ts +1 -0
  58. package/src/components/customers/customer-list-table/locales/pt.ts +1 -0
  59. package/src/components/customers/customer-list-table/locales/sl.ts +1 -0
  60. package/src/components/dashboard/collection-rate-card/use-collection-rate.ts +48 -9
  61. package/src/components/dashboard/revenue-trend-chart/use-revenue-trend.ts +77 -48
  62. package/src/components/dashboard/shared/use-revenue-data.ts +77 -9
  63. package/src/components/delivery-notes/create/create-delivery-note-form.tsx +67 -7
  64. package/src/components/delivery-notes/create/locales/de.ts +16 -0
  65. package/src/components/delivery-notes/create/locales/es.ts +16 -0
  66. package/src/components/delivery-notes/create/locales/fr.ts +16 -0
  67. package/src/components/delivery-notes/create/locales/hr.ts +16 -0
  68. package/src/components/delivery-notes/create/locales/it.ts +16 -0
  69. package/src/components/delivery-notes/create/locales/nl.ts +16 -0
  70. package/src/components/delivery-notes/create/locales/pl.ts +16 -0
  71. package/src/components/delivery-notes/create/locales/pt.ts +16 -0
  72. package/src/components/delivery-notes/create/locales/sl.ts +17 -1
  73. package/src/components/delivery-notes/list/list-row-actions.tsx +20 -1
  74. package/src/components/delivery-notes/list/list-table.tsx +50 -8
  75. package/src/components/delivery-notes/list/locales/de.ts +35 -0
  76. package/src/components/delivery-notes/list/locales/en.ts +33 -0
  77. package/src/components/delivery-notes/list/locales/es.ts +35 -0
  78. package/src/components/delivery-notes/list/locales/fr.ts +35 -0
  79. package/src/components/delivery-notes/list/locales/hr.ts +35 -0
  80. package/src/components/delivery-notes/list/locales/it.ts +35 -0
  81. package/src/components/delivery-notes/list/locales/nl.ts +35 -0
  82. package/src/components/delivery-notes/list/locales/pl.ts +35 -0
  83. package/src/components/delivery-notes/list/locales/pt.ts +35 -0
  84. package/src/components/delivery-notes/list/locales/sl.ts +35 -0
  85. package/src/components/documents/create/document-add-item-form.tsx +70 -0
  86. package/src/components/documents/create/document-details-section.tsx +163 -29
  87. package/src/components/documents/create/document-items-section.tsx +21 -4
  88. package/src/components/documents/create/linked-documents-info.tsx +82 -0
  89. package/src/components/documents/create/live-preview.tsx +25 -5
  90. package/src/components/documents/create/mark-as-paid-section.tsx +29 -20
  91. package/src/components/documents/create/prepare-document-submission.ts +19 -7
  92. package/src/components/documents/shared/document-preview-display.tsx +3 -4
  93. package/src/components/documents/types.ts +2 -2
  94. package/src/components/documents/view/document-actions-bar.tsx +7 -27
  95. package/src/components/documents/view/document-activities-list.tsx +65 -47
  96. package/src/components/documents/view/document-details-card.tsx +118 -76
  97. package/src/components/documents/view/document-payments-list.tsx +99 -65
  98. package/src/components/documents/view/document-relations-list.tsx +43 -28
  99. package/src/components/documents/view/document-sidebar.tsx +151 -0
  100. package/src/components/documents/view/index.ts +2 -0
  101. package/src/components/documents/view/locales/de.ts +4 -0
  102. package/src/components/documents/view/locales/es.ts +4 -0
  103. package/src/components/documents/view/locales/fr.ts +4 -0
  104. package/src/components/documents/view/locales/hr.ts +4 -0
  105. package/src/components/documents/view/locales/it.ts +4 -0
  106. package/src/components/documents/view/locales/nl.ts +4 -0
  107. package/src/components/documents/view/locales/pl.ts +4 -0
  108. package/src/components/documents/view/locales/pt.ts +4 -0
  109. package/src/components/documents/view/locales/sl.ts +5 -1
  110. package/src/components/documents/view/use-document-download.ts +7 -3
  111. package/src/components/entities/create-entity-form.tsx +166 -13
  112. package/src/components/entities/entity-settings-form/entity-settings-form.tsx +101 -1
  113. package/src/components/entities/entity-settings-form/input-with-preview.tsx +30 -2
  114. package/src/components/entities/entity-settings-form/locales/de.ts +10 -0
  115. package/src/components/entities/entity-settings-form/locales/es.ts +10 -0
  116. package/src/components/entities/entity-settings-form/locales/fr.ts +10 -0
  117. package/src/components/entities/entity-settings-form/locales/hr.ts +10 -0
  118. package/src/components/entities/entity-settings-form/locales/it.ts +10 -0
  119. package/src/components/entities/entity-settings-form/locales/nl.ts +10 -0
  120. package/src/components/entities/entity-settings-form/locales/pl.ts +10 -0
  121. package/src/components/entities/entity-settings-form/locales/pt.ts +10 -0
  122. package/src/components/entities/entity-settings-form/locales/sl.ts +10 -0
  123. package/src/components/entities/fina-settings-form/fina-settings-form.tsx +6 -6
  124. package/src/components/entities/fina-settings-form/locales/de.ts +2 -2
  125. package/src/components/entities/fina-settings-form/locales/en.ts +2 -2
  126. package/src/components/entities/fina-settings-form/locales/es.ts +2 -2
  127. package/src/components/entities/fina-settings-form/locales/fr.ts +2 -2
  128. package/src/components/entities/fina-settings-form/locales/hr.ts +2 -2
  129. package/src/components/entities/fina-settings-form/locales/it.ts +2 -2
  130. package/src/components/entities/fina-settings-form/locales/nl.ts +2 -2
  131. package/src/components/entities/fina-settings-form/locales/pl.ts +2 -2
  132. package/src/components/entities/fina-settings-form/locales/pt.ts +2 -2
  133. package/src/components/entities/fina-settings-form/locales/sl.ts +2 -2
  134. package/src/components/entities/furs-settings-form/locales/en.ts +0 -1
  135. package/src/components/entities/settings/company-settings-form.tsx +173 -20
  136. package/src/components/entities/settings/pdf-template-selector/locales/de.ts +3 -1
  137. package/src/components/entities/settings/pdf-template-selector/locales/es.ts +3 -1
  138. package/src/components/entities/settings/pdf-template-selector/locales/fr.ts +4 -1
  139. package/src/components/entities/settings/pdf-template-selector/locales/hr.ts +4 -1
  140. package/src/components/entities/settings/pdf-template-selector/locales/it.ts +3 -1
  141. package/src/components/entities/settings/pdf-template-selector/locales/nl.ts +3 -1
  142. package/src/components/entities/settings/pdf-template-selector/locales/pl.ts +3 -1
  143. package/src/components/entities/settings/pdf-template-selector/locales/pt.ts +3 -1
  144. package/src/components/entities/settings/pdf-template-selector/locales/sl.ts +3 -1
  145. package/src/components/entities/settings/pdf-template-selector/pdf-template-cards.tsx +1 -0
  146. package/src/components/estimates/create/create-estimate-form.tsx +93 -8
  147. package/src/components/estimates/create/locales/de.ts +16 -0
  148. package/src/components/estimates/create/locales/es.ts +16 -0
  149. package/src/components/estimates/create/locales/fr.ts +16 -0
  150. package/src/components/estimates/create/locales/hr.ts +16 -0
  151. package/src/components/estimates/create/locales/it.ts +16 -0
  152. package/src/components/estimates/create/locales/nl.ts +16 -0
  153. package/src/components/estimates/create/locales/pl.ts +16 -0
  154. package/src/components/estimates/create/locales/pt.ts +16 -0
  155. package/src/components/estimates/create/locales/sl.ts +17 -1
  156. package/src/components/estimates/list/list-table.tsx +14 -8
  157. package/src/components/estimates/list/locales/de.ts +2 -0
  158. package/src/components/estimates/list/locales/en.ts +1 -0
  159. package/src/components/estimates/list/locales/es.ts +2 -0
  160. package/src/components/estimates/list/locales/fr.ts +2 -0
  161. package/src/components/estimates/list/locales/hr.ts +2 -0
  162. package/src/components/estimates/list/locales/it.ts +2 -0
  163. package/src/components/estimates/list/locales/nl.ts +2 -0
  164. package/src/components/estimates/list/locales/pl.ts +2 -0
  165. package/src/components/estimates/list/locales/pt.ts +2 -0
  166. package/src/components/estimates/list/locales/sl.ts +2 -0
  167. package/src/components/export/document-export-form.tsx +55 -14
  168. package/src/components/export/index.ts +2 -0
  169. package/src/components/export/sales-per-item-export-form.tsx +223 -0
  170. package/src/components/invoices/create/create-invoice-form.tsx +106 -11
  171. package/src/components/invoices/create/locales/de.ts +26 -0
  172. package/src/components/invoices/create/locales/es.ts +26 -0
  173. package/src/components/invoices/create/locales/fr.ts +26 -0
  174. package/src/components/invoices/create/locales/hr.ts +25 -0
  175. package/src/components/invoices/create/locales/it.ts +26 -0
  176. package/src/components/invoices/create/locales/nl.ts +26 -0
  177. package/src/components/invoices/create/locales/pl.ts +25 -0
  178. package/src/components/invoices/create/locales/pt.ts +25 -0
  179. package/src/components/invoices/create/locales/sl.ts +26 -1
  180. package/src/components/invoices/invoices-furs.hooks.ts +4 -1
  181. package/src/components/invoices/list/list-table.tsx +77 -31
  182. package/src/components/invoices/list/locales/de.ts +5 -0
  183. package/src/components/invoices/list/locales/en.ts +4 -0
  184. package/src/components/invoices/list/locales/es.ts +5 -0
  185. package/src/components/invoices/list/locales/fr.ts +5 -0
  186. package/src/components/invoices/list/locales/hr.ts +5 -0
  187. package/src/components/invoices/list/locales/it.ts +5 -0
  188. package/src/components/invoices/list/locales/nl.ts +5 -0
  189. package/src/components/invoices/list/locales/pl.ts +5 -0
  190. package/src/components/invoices/list/locales/pt.ts +5 -0
  191. package/src/components/invoices/list/locales/sl.ts +5 -0
  192. package/src/components/invoices/view/fiscalization-status-card.tsx +44 -24
  193. package/src/components/items/item-combobox.tsx +5 -3
  194. package/src/components/items/item-list-table/item-list-header.tsx +4 -17
  195. package/src/components/items/item-list-table/item-list-table.tsx +3 -3
  196. package/src/components/items/item-list-table/locales/de.ts +1 -0
  197. package/src/components/items/item-list-table/locales/es.ts +1 -0
  198. package/src/components/items/item-list-table/locales/fr.ts +1 -0
  199. package/src/components/items/item-list-table/locales/hr.ts +1 -0
  200. package/src/components/items/item-list-table/locales/it.ts +1 -0
  201. package/src/components/items/item-list-table/locales/nl.ts +1 -0
  202. package/src/components/items/item-list-table/locales/pl.ts +1 -0
  203. package/src/components/items/item-list-table/locales/pt.ts +1 -0
  204. package/src/components/items/item-list-table/locales/sl.ts +1 -0
  205. package/src/components/payments/list/list-table.tsx +0 -4
  206. package/src/components/payments/list/locales/de.ts +1 -0
  207. package/src/components/payments/list/locales/es.ts +1 -0
  208. package/src/components/payments/list/locales/fr.ts +1 -0
  209. package/src/components/payments/list/locales/hr.ts +1 -0
  210. package/src/components/payments/list/locales/it.ts +1 -0
  211. package/src/components/payments/list/locales/nl.ts +1 -0
  212. package/src/components/payments/list/locales/pl.ts +1 -0
  213. package/src/components/payments/list/locales/pt.ts +1 -0
  214. package/src/components/payments/list/locales/sl.ts +1 -0
  215. package/src/components/recurring-invoices/list/list-table.tsx +0 -7
  216. package/src/components/recurring-invoices/list/locales/de.ts +1 -0
  217. package/src/components/recurring-invoices/list/locales/es.ts +1 -0
  218. package/src/components/recurring-invoices/list/locales/fr.ts +1 -0
  219. package/src/components/recurring-invoices/list/locales/hr.ts +1 -0
  220. package/src/components/recurring-invoices/list/locales/it.ts +1 -0
  221. package/src/components/recurring-invoices/list/locales/nl.ts +1 -0
  222. package/src/components/recurring-invoices/list/locales/pl.ts +1 -0
  223. package/src/components/recurring-invoices/list/locales/pt.ts +1 -0
  224. package/src/components/recurring-invoices/list/locales/sl.ts +1 -0
  225. package/src/components/request-logs/request-log-list-table.tsx +0 -3
  226. package/src/components/table/README.md +14 -121
  227. package/src/components/table/data-table.tsx +22 -37
  228. package/src/components/table/hooks/use-table-state.ts +3 -27
  229. package/src/components/table/index.ts +0 -2
  230. package/src/components/table/search-input.tsx +17 -0
  231. package/src/components/table/selection-toolbar.tsx +35 -1
  232. package/src/components/table/table-empty-state.tsx +6 -3
  233. package/src/components/table/table-no-results.tsx +10 -5
  234. package/src/components/table/types.ts +0 -5
  235. package/src/components/taxes/tax-list-table/locales/de.ts +1 -0
  236. package/src/components/taxes/tax-list-table/locales/es.ts +1 -0
  237. package/src/components/taxes/tax-list-table/locales/fr.ts +1 -0
  238. package/src/components/taxes/tax-list-table/locales/hr.ts +1 -0
  239. package/src/components/taxes/tax-list-table/locales/it.ts +1 -0
  240. package/src/components/taxes/tax-list-table/locales/nl.ts +1 -0
  241. package/src/components/taxes/tax-list-table/locales/pl.ts +1 -0
  242. package/src/components/taxes/tax-list-table/locales/pt.ts +1 -0
  243. package/src/components/taxes/tax-list-table/locales/sl.ts +1 -0
  244. package/src/components/taxes/tax-list-table/tax-list-header.tsx +3 -14
  245. package/src/components/taxes/tax-list-table/tax-list-table.tsx +3 -3
  246. package/src/components/ui/popover.tsx +3 -1
  247. package/src/components/ui/tooltip.tsx +3 -1
  248. package/src/generated/schemas/advanceinvoice.ts +4 -2
  249. package/src/generated/schemas/creditnote.ts +2 -1
  250. package/src/generated/schemas/deliverynote.ts +2 -1
  251. package/src/generated/schemas/estimate.ts +4 -2
  252. package/src/generated/schemas/index.ts +1 -1
  253. package/src/generated/schemas/invoice.ts +2 -1
  254. package/src/generated/schemas/renderadvanceinvoicepreview_body.ts +17 -23
  255. package/src/generated/schemas/rendercreditnotepreview_body.ts +17 -23
  256. package/src/generated/schemas/renderdeliverynotepreview_body.ts +17 -23
  257. package/src/generated/schemas/renderestimatepreview_body.ts +17 -23
  258. package/src/generated/schemas/renderinvoicepreview_body.ts +19 -23
  259. package/src/hooks/use-duplicate-document.ts +56 -14
  260. package/src/hooks/use-vies-check.ts +3 -0
  261. package/src/lib/fiscalization.ts +12 -0
  262. package/src/lib/schemas/advance-invoice.ts +0 -1
  263. package/src/components/table/sortable-header.tsx +0 -56
@@ -32,7 +32,7 @@ export function getDocumentTypeFromId(id: string): DocumentType | null {
32
32
  if (id.startsWith("est_")) return "estimate";
33
33
  if (id.startsWith("cn_")) return "credit_note";
34
34
  if (id.startsWith("adv_")) return "advance_invoice";
35
- if (id.startsWith("dn_")) return "delivery_note";
35
+ if (id.startsWith("del_")) return "delivery_note";
36
36
  return null;
37
37
  }
38
38
 
@@ -50,7 +50,7 @@ export function getAllowedDuplicateTargets(sourceType: DocumentType): DocumentTy
50
50
  case "advance_invoice":
51
51
  return ["advance_invoice", "invoice"];
52
52
  case "delivery_note":
53
- return ["delivery_note"];
53
+ return ["delivery_note", "invoice"];
54
54
  default:
55
55
  return [];
56
56
  }
@@ -60,10 +60,11 @@ export function getAllowedDuplicateTargets(sourceType: DocumentType): DocumentTy
60
60
  * Transform a source document into form-compatible initial values
61
61
  * Copies relevant fields and resets computed/generated ones
62
62
  */
63
- function transformDocumentForDuplication(source: Document, _targetType: DocumentType): Partial<CreateRequest> {
63
+ function transformDocumentForDuplication(source: Document, targetType: DocumentType): Partial<CreateRequest> {
64
64
  // Transform items - copy only the fields needed for creation
65
65
  // Use type assertion for items since all document item types share the same shape
66
66
  const sourceItems = source.items as Array<{
67
+ type?: string | null;
67
68
  name: string;
68
69
  description: string | null;
69
70
  quantity: number;
@@ -72,15 +73,21 @@ function transformDocumentForDuplication(source: Document, _targetType: Document
72
73
  taxes: Array<{ tax_id?: string }>;
73
74
  }>;
74
75
  const items = sourceItems?.map((item) => ({
76
+ type: item.type ?? undefined,
75
77
  name: item.name,
76
78
  description: item.description,
77
- quantity: item.quantity,
78
- // Use gross_price if set, otherwise use price. The form uses is_gross_price as a UI toggle.
79
- price: item.gross_price ?? item.price,
80
- // Copy tax references (tax_id), not computed tax data
81
- taxes: item.taxes?.map((tax) => ({ tax_id: tax.tax_id })),
82
- // Derive is_gross_price from whether gross_price is set
83
- gross_price: item.gross_price ?? undefined,
79
+ // Separator items skip financial fields
80
+ ...(item.type !== "separator"
81
+ ? {
82
+ quantity: item.quantity,
83
+ // Use gross_price if set, otherwise use price. The form uses is_gross_price as a UI toggle.
84
+ price: item.gross_price ?? item.price,
85
+ // Copy tax references (tax_id), not computed tax data
86
+ taxes: item.taxes?.map((tax) => ({ tax_id: tax.tax_id })),
87
+ // Derive is_gross_price from whether gross_price is set
88
+ gross_price: item.gross_price ?? undefined,
89
+ }
90
+ : {}),
84
91
  }));
85
92
 
86
93
  // Build customer data - always copy if available (form needs this for display)
@@ -98,14 +105,18 @@ function transformDocumentForDuplication(source: Document, _targetType: Document
98
105
  }
99
106
  : undefined;
100
107
 
108
+ // When converting to a different type, link back to the source document
109
+ const sourceType = getDocumentTypeFromId(source.id);
110
+ const isConversion = sourceType && sourceType !== targetType;
111
+
101
112
  // Build base duplicate data
102
113
  const baseData: Partial<CreateRequest> = {
103
114
  // Customer - always pass both customer_id AND customer data when available
104
115
  // The form needs customer data for display, even when customer_id is set
105
116
  ...(source.customer_id ? { customer_id: source.customer_id } : {}),
106
117
  ...(customerData ? { customer: customerData } : {}),
107
- // Items
108
- items,
118
+ // Items (cast needed: separator items omit financial fields like quantity)
119
+ items: items as any,
109
120
  // Currency
110
121
  currency_code: source.currency_code,
111
122
  // Notes
@@ -115,6 +126,8 @@ function transformDocumentForDuplication(source: Document, _targetType: Document
115
126
  date: new Date().toISOString(),
116
127
  // Number - leave empty for auto-generation
117
128
  // Do NOT copy: number, totals, taxes, payments, furs, eslog, vies, shareable_id
129
+ // Link back to source document when converting (e.g., delivery note → invoice)
130
+ ...(isConversion ? { linked_documents: [source.id] } : {}),
118
131
  };
119
132
 
120
133
  return baseData;
@@ -129,9 +142,20 @@ export type UseDuplicateDocumentOptions = {
129
142
  enabled?: boolean;
130
143
  };
131
144
 
145
+ export type LinkedDocumentSummary = {
146
+ id: string;
147
+ type: string;
148
+ number: string;
149
+ date: string;
150
+ total_with_tax: number;
151
+ currency_code: string;
152
+ };
153
+
132
154
  export type UseDuplicateDocumentResult = {
133
155
  /** Transformed initial values for the form */
134
156
  initialValues: Partial<CreateRequest> | undefined;
157
+ /** Source documents linked to this document (populated for conversions) */
158
+ sourceDocuments: LinkedDocumentSummary[];
135
159
  /** Loading state */
136
160
  isLoading: boolean;
137
161
  /** Error if fetch failed */
@@ -187,13 +211,31 @@ export function useDuplicateDocument({
187
211
  throw new Error("Source document not found");
188
212
  }
189
213
 
190
- return transformDocumentForDuplication(source, targetType);
214
+ const initialValues = transformDocumentForDuplication(source, targetType);
215
+
216
+ // Build source document summaries for conversions (different source → target type)
217
+ const isConversion = sourceType !== targetType;
218
+ const sourceDocuments: LinkedDocumentSummary[] = isConversion
219
+ ? [
220
+ {
221
+ id: source.id,
222
+ type: sourceType,
223
+ number: (source as any).number || "",
224
+ date: (source as any).date || "",
225
+ total_with_tax: (source as any).total_with_tax ?? 0,
226
+ currency_code: (source as any).currency_code || "",
227
+ },
228
+ ]
229
+ : [];
230
+
231
+ return { initialValues, sourceDocuments };
191
232
  },
192
233
  enabled: enabled && !!sourceId && !!activeEntity?.id && !!sourceType,
193
234
  });
194
235
 
195
236
  return {
196
- initialValues: query.data,
237
+ initialValues: query.data?.initialValues,
238
+ sourceDocuments: query.data?.sourceDocuments ?? [],
197
239
  isLoading: query.isLoading,
198
240
  error: query.error,
199
241
  sourceType,
@@ -42,6 +42,8 @@ export interface UseViesCheckResult {
42
42
  reverseChargeApplies: boolean;
43
43
  /** Transaction type determined by VIES check */
44
44
  transactionType: ViesCheckResponse["transaction_type"] | undefined;
45
+ /** Customer country code returned by VIES check */
46
+ customerCountryCode: string | null;
45
47
  /** Warning message from VIES validation */
46
48
  warning: string | null;
47
49
  /** Whether VIES validation was successful */
@@ -124,6 +126,7 @@ export function useViesCheck({
124
126
  error: query.error,
125
127
  reverseChargeApplies: query.data?.reverse_charge_applies ?? false,
126
128
  transactionType: query.data?.transaction_type,
129
+ customerCountryCode: query.data?.customer_country_code ?? null,
127
130
  warning: query.data?.warning ?? null,
128
131
  viesValid: query.data?.vies_valid ?? null,
129
132
  };
@@ -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,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
- }