@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.
- package/cli/dist/index.js +1 -1
- package/package.json +1 -1
- package/src/common/autocomplete.tsx +18 -2
- package/src/components/advance-invoices/create/create-advance-invoice-form.tsx +0 -1
- package/src/components/advance-invoices/create/locales/de.ts +2 -0
- package/src/components/advance-invoices/create/locales/es.ts +2 -0
- package/src/components/advance-invoices/create/locales/fr.ts +2 -0
- package/src/components/advance-invoices/create/locales/hr.ts +1 -0
- package/src/components/advance-invoices/create/locales/it.ts +2 -0
- package/src/components/advance-invoices/create/locales/nl.ts +2 -0
- package/src/components/advance-invoices/create/locales/pl.ts +1 -0
- package/src/components/advance-invoices/create/locales/pt.ts +1 -0
- package/src/components/advance-invoices/create/locales/sl.ts +1 -0
- package/src/components/advance-invoices/create/prepare-advance-invoice-submission.ts +0 -1
- package/src/components/advance-invoices/list/list-table.tsx +130 -40
- package/src/components/advance-invoices/list/locales/de.ts +6 -0
- package/src/components/advance-invoices/list/locales/en.ts +5 -0
- package/src/components/advance-invoices/list/locales/es.ts +6 -0
- package/src/components/advance-invoices/list/locales/fr.ts +6 -0
- package/src/components/advance-invoices/list/locales/hr.ts +6 -0
- package/src/components/advance-invoices/list/locales/it.ts +6 -0
- package/src/components/advance-invoices/list/locales/nl.ts +6 -0
- package/src/components/advance-invoices/list/locales/pl.ts +6 -0
- package/src/components/advance-invoices/list/locales/pt.ts +6 -0
- package/src/components/advance-invoices/list/locales/sl.ts +6 -0
- package/src/components/credit-notes/create/create-credit-note-form.tsx +114 -3
- package/src/components/credit-notes/create/locales/de.ts +2 -0
- package/src/components/credit-notes/create/locales/es.ts +2 -0
- package/src/components/credit-notes/create/locales/fr.ts +2 -0
- package/src/components/credit-notes/create/locales/hr.ts +1 -0
- package/src/components/credit-notes/create/locales/it.ts +2 -0
- package/src/components/credit-notes/create/locales/nl.ts +2 -0
- package/src/components/credit-notes/create/locales/pl.ts +1 -0
- package/src/components/credit-notes/create/locales/pt.ts +1 -0
- package/src/components/credit-notes/create/locales/sl.ts +1 -0
- package/src/components/credit-notes/credit-notes.hooks.ts +30 -0
- package/src/components/credit-notes/list/list-table.tsx +111 -36
- package/src/components/credit-notes/list/locales/de.ts +6 -1
- package/src/components/credit-notes/list/locales/en.ts +6 -0
- package/src/components/credit-notes/list/locales/es.ts +6 -1
- package/src/components/credit-notes/list/locales/fr.ts +6 -1
- package/src/components/credit-notes/list/locales/hr.ts +6 -1
- package/src/components/credit-notes/list/locales/it.ts +6 -1
- package/src/components/credit-notes/list/locales/nl.ts +6 -1
- package/src/components/credit-notes/list/locales/pl.ts +6 -1
- package/src/components/credit-notes/list/locales/pt.ts +6 -1
- package/src/components/credit-notes/list/locales/sl.ts +6 -1
- package/src/components/customers/customer-list-table/customer-list-table.tsx +0 -3
- package/src/components/customers/customer-list-table/locales/de.ts +1 -0
- package/src/components/customers/customer-list-table/locales/es.ts +1 -0
- package/src/components/customers/customer-list-table/locales/fr.ts +1 -0
- package/src/components/customers/customer-list-table/locales/hr.ts +1 -0
- package/src/components/customers/customer-list-table/locales/it.ts +1 -0
- package/src/components/customers/customer-list-table/locales/nl.ts +1 -0
- package/src/components/customers/customer-list-table/locales/pl.ts +1 -0
- package/src/components/customers/customer-list-table/locales/pt.ts +1 -0
- package/src/components/customers/customer-list-table/locales/sl.ts +1 -0
- package/src/components/dashboard/collection-rate-card/use-collection-rate.ts +2 -2
- package/src/components/dashboard/invoice-status-chart/use-invoice-status.ts +3 -3
- package/src/components/dashboard/payment-methods-chart/use-payment-methods.ts +1 -1
- package/src/components/dashboard/payment-trend-chart/use-payment-trend.ts +1 -1
- package/src/components/dashboard/revenue-trend-chart/use-revenue-trend.ts +1 -1
- package/src/components/dashboard/shared/use-revenue-data.ts +4 -4
- package/src/components/dashboard/shared/use-stats-counts.ts +4 -4
- package/src/components/dashboard/shared/use-stats-query.ts +1 -1
- package/src/components/dashboard/tax-collected-card/use-tax-collected.ts +2 -2
- package/src/components/dashboard/top-customers-chart/use-top-customers.ts +1 -1
- package/src/components/delivery-notes/create/create-delivery-note-form.tsx +332 -0
- package/src/components/delivery-notes/create/locales/de.ts +50 -0
- package/src/components/delivery-notes/create/locales/es.ts +49 -0
- package/src/components/delivery-notes/create/locales/fr.ts +50 -0
- package/src/components/delivery-notes/create/locales/hr.ts +49 -0
- package/src/components/delivery-notes/create/locales/it.ts +49 -0
- package/src/components/delivery-notes/create/locales/nl.ts +50 -0
- package/src/components/delivery-notes/create/locales/pl.ts +49 -0
- package/src/components/delivery-notes/create/locales/pt.ts +50 -0
- package/src/components/delivery-notes/create/locales/sl.ts +49 -0
- package/src/components/delivery-notes/create/prepare-delivery-note-submission.ts +38 -0
- package/src/components/delivery-notes/create/use-delivery-note-customer-form.ts +1 -0
- package/src/components/delivery-notes/delivery-notes.hooks.ts +15 -0
- package/src/components/delivery-notes/list/index.ts +3 -0
- package/src/components/delivery-notes/list/list-row-actions.tsx +122 -0
- package/src/components/delivery-notes/list/list-table.tsx +247 -0
- package/src/components/delivery-notes/list/locales/de.ts +13 -0
- package/src/components/delivery-notes/list/locales/en.ts +13 -0
- package/src/components/delivery-notes/list/locales/es.ts +13 -0
- package/src/components/delivery-notes/list/locales/fr.ts +13 -0
- package/src/components/delivery-notes/list/locales/hr.ts +13 -0
- package/src/components/delivery-notes/list/locales/it.ts +13 -0
- package/src/components/delivery-notes/list/locales/nl.ts +13 -0
- package/src/components/delivery-notes/list/locales/pl.ts +13 -0
- package/src/components/delivery-notes/list/locales/pt.ts +13 -0
- package/src/components/delivery-notes/list/locales/sl.ts +13 -0
- package/src/components/delivery-notes/list/use-delivery-note-download.ts +63 -0
- package/src/components/documents/create/document-details-section.tsx +76 -58
- package/src/components/documents/create/linked-documents-info.tsx +82 -0
- package/src/components/documents/create/live-preview.tsx +38 -11
- package/src/components/documents/create/prepare-document-submission.ts +1 -1
- package/src/components/documents/documents.hooks.ts +2 -1
- package/src/components/documents/shared/document-preview-display.tsx +12 -5
- package/src/components/documents/types.ts +12 -3
- package/src/components/documents/view/document-activities-list.tsx +65 -47
- package/src/components/documents/view/document-details-card.tsx +102 -77
- package/src/components/documents/view/document-payments-list.tsx +102 -68
- package/src/components/documents/view/document-relations-list.tsx +120 -0
- package/src/components/documents/view/document-sidebar.tsx +151 -0
- package/src/components/documents/view/index.ts +2 -0
- package/src/components/documents/view/locales/de.ts +23 -0
- package/src/components/documents/view/locales/es.ts +23 -0
- package/src/components/documents/view/locales/fr.ts +23 -0
- package/src/components/documents/view/locales/hr.ts +23 -0
- package/src/components/documents/view/locales/it.ts +23 -0
- package/src/components/documents/view/locales/nl.ts +23 -0
- package/src/components/documents/view/locales/pl.ts +23 -0
- package/src/components/documents/view/locales/pt.ts +23 -0
- package/src/components/documents/view/locales/sl.ts +23 -0
- package/src/components/documents/view/use-document-download.ts +8 -5
- package/src/components/entities/create-entity-form.tsx +165 -13
- package/src/components/entities/entity-settings-form/entity-settings-form.tsx +101 -1
- package/src/components/entities/entity-settings-form/locales/de.ts +9 -0
- package/src/components/entities/entity-settings-form/locales/es.ts +9 -0
- package/src/components/entities/entity-settings-form/locales/fr.ts +9 -0
- package/src/components/entities/entity-settings-form/locales/hr.ts +9 -0
- package/src/components/entities/entity-settings-form/locales/it.ts +9 -0
- package/src/components/entities/entity-settings-form/locales/nl.ts +9 -0
- package/src/components/entities/entity-settings-form/locales/pl.ts +9 -0
- package/src/components/entities/entity-settings-form/locales/pt.ts +9 -0
- package/src/components/entities/entity-settings-form/locales/sl.ts +9 -0
- package/src/components/entities/fina-settings-form/fina-settings-form.tsx +83 -71
- package/src/components/entities/fina-settings-form/fina-settings.hooks.ts +7 -2
- package/src/components/entities/fina-settings-form/locales/de.ts +2 -2
- package/src/components/entities/fina-settings-form/locales/en.ts +2 -2
- package/src/components/entities/fina-settings-form/locales/es.ts +2 -2
- package/src/components/entities/fina-settings-form/locales/fr.ts +2 -2
- package/src/components/entities/fina-settings-form/locales/hr.ts +2 -2
- package/src/components/entities/fina-settings-form/locales/it.ts +2 -2
- package/src/components/entities/fina-settings-form/locales/nl.ts +2 -2
- package/src/components/entities/fina-settings-form/locales/pl.ts +2 -2
- package/src/components/entities/fina-settings-form/locales/pt.ts +2 -2
- package/src/components/entities/fina-settings-form/locales/sl.ts +2 -2
- package/src/components/entities/furs-settings-form/furs-settings-form.tsx +10 -1
- package/src/components/entities/furs-settings-form/furs-settings.hooks.ts +7 -2
- package/src/components/entities/furs-settings-form/locales/en.ts +0 -1
- package/src/components/entities/furs-settings-form/sections/general-settings-section.tsx +12 -4
- package/src/components/entities/settings/pdf-template-selector/locales/de.ts +3 -1
- package/src/components/entities/settings/pdf-template-selector/locales/es.ts +3 -1
- package/src/components/entities/settings/pdf-template-selector/locales/fr.ts +4 -1
- package/src/components/entities/settings/pdf-template-selector/locales/hr.ts +4 -1
- package/src/components/entities/settings/pdf-template-selector/locales/it.ts +3 -1
- package/src/components/entities/settings/pdf-template-selector/locales/nl.ts +3 -1
- package/src/components/entities/settings/pdf-template-selector/locales/pl.ts +3 -1
- package/src/components/entities/settings/pdf-template-selector/locales/pt.ts +3 -1
- package/src/components/entities/settings/pdf-template-selector/locales/sl.ts +3 -1
- package/src/components/entities/settings/pdf-template-selector/pdf-template-cards.tsx +1 -0
- package/src/components/estimates/create/create-estimate-form.tsx +29 -2
- package/src/components/estimates/list/list-table.tsx +3 -6
- package/src/components/estimates/list/locales/de.ts +1 -0
- package/src/components/estimates/list/locales/es.ts +1 -0
- package/src/components/estimates/list/locales/fr.ts +1 -0
- package/src/components/estimates/list/locales/hr.ts +1 -0
- package/src/components/estimates/list/locales/it.ts +1 -0
- package/src/components/estimates/list/locales/nl.ts +1 -0
- package/src/components/estimates/list/locales/pl.ts +1 -0
- package/src/components/estimates/list/locales/pt.ts +1 -0
- package/src/components/estimates/list/locales/sl.ts +1 -0
- package/src/components/export/document-export-form.tsx +9 -2
- package/src/components/export/index.ts +2 -0
- package/src/components/export/sales-per-item-export-form.tsx +223 -0
- package/src/components/invoices/create/create-invoice-form.tsx +48 -1
- package/src/components/invoices/create/locales/de.ts +11 -0
- package/src/components/invoices/create/locales/es.ts +11 -0
- package/src/components/invoices/create/locales/fr.ts +11 -0
- package/src/components/invoices/create/locales/hr.ts +10 -0
- package/src/components/invoices/create/locales/it.ts +11 -0
- package/src/components/invoices/create/locales/nl.ts +11 -0
- package/src/components/invoices/create/locales/pl.ts +10 -0
- package/src/components/invoices/create/locales/pt.ts +10 -0
- package/src/components/invoices/create/locales/sl.ts +10 -0
- package/src/components/invoices/invoices-furs.hooks.ts +27 -9
- package/src/components/invoices/list/list-row-actions.tsx +3 -3
- package/src/components/invoices/list/list-table.tsx +132 -21
- package/src/components/invoices/list/locales/de.ts +6 -0
- package/src/components/invoices/list/locales/en.ts +5 -0
- package/src/components/invoices/list/locales/es.ts +6 -0
- package/src/components/invoices/list/locales/fr.ts +6 -0
- package/src/components/invoices/list/locales/hr.ts +6 -0
- package/src/components/invoices/list/locales/it.ts +6 -0
- package/src/components/invoices/list/locales/nl.ts +6 -0
- package/src/components/invoices/list/locales/pl.ts +6 -0
- package/src/components/invoices/list/locales/pt.ts +6 -0
- package/src/components/invoices/list/locales/sl.ts +6 -0
- package/src/components/invoices/view/fiscalization-status-card.tsx +42 -24
- package/src/components/items/item-combobox.tsx +5 -3
- package/src/components/items/item-list-table/item-list-header.tsx +4 -17
- package/src/components/items/item-list-table/item-list-row-actions.tsx +3 -2
- package/src/components/items/item-list-table/item-list-row.tsx +3 -2
- package/src/components/items/item-list-table/item-list-table.tsx +3 -3
- package/src/components/items/item-list-table/locales/de.ts +1 -0
- package/src/components/items/item-list-table/locales/es.ts +1 -0
- package/src/components/items/item-list-table/locales/fr.ts +1 -0
- package/src/components/items/item-list-table/locales/hr.ts +1 -0
- package/src/components/items/item-list-table/locales/it.ts +1 -0
- package/src/components/items/item-list-table/locales/nl.ts +1 -0
- package/src/components/items/item-list-table/locales/pl.ts +1 -0
- package/src/components/items/item-list-table/locales/pt.ts +1 -0
- package/src/components/items/item-list-table/locales/sl.ts +1 -0
- package/src/components/payments/list/list-table.tsx +0 -4
- package/src/components/payments/list/locales/de.ts +1 -0
- package/src/components/payments/list/locales/es.ts +1 -0
- package/src/components/payments/list/locales/fr.ts +1 -0
- package/src/components/payments/list/locales/hr.ts +1 -0
- package/src/components/payments/list/locales/it.ts +1 -0
- package/src/components/payments/list/locales/nl.ts +1 -0
- package/src/components/payments/list/locales/pl.ts +1 -0
- package/src/components/payments/list/locales/pt.ts +1 -0
- package/src/components/payments/list/locales/sl.ts +1 -0
- package/src/components/recurring-invoices/list/list-table.tsx +0 -7
- package/src/components/recurring-invoices/list/locales/de.ts +1 -0
- package/src/components/recurring-invoices/list/locales/es.ts +1 -0
- package/src/components/recurring-invoices/list/locales/fr.ts +1 -0
- package/src/components/recurring-invoices/list/locales/hr.ts +1 -0
- package/src/components/recurring-invoices/list/locales/it.ts +1 -0
- package/src/components/recurring-invoices/list/locales/nl.ts +1 -0
- package/src/components/recurring-invoices/list/locales/pl.ts +1 -0
- package/src/components/recurring-invoices/list/locales/pt.ts +1 -0
- package/src/components/recurring-invoices/list/locales/sl.ts +1 -0
- package/src/components/request-logs/request-log-list-table.tsx +0 -3
- package/src/components/table/README.md +14 -121
- package/src/components/table/data-table.tsx +22 -37
- package/src/components/table/hooks/use-table-state.ts +3 -27
- package/src/components/table/index.ts +0 -2
- package/src/components/table/selection-toolbar.tsx +35 -1
- package/src/components/table/table-empty-state.tsx +6 -3
- package/src/components/table/table-no-results.tsx +10 -5
- package/src/components/table/types.ts +0 -5
- package/src/components/taxes/tax-list-table/locales/de.ts +1 -0
- package/src/components/taxes/tax-list-table/locales/es.ts +1 -0
- package/src/components/taxes/tax-list-table/locales/fr.ts +1 -0
- package/src/components/taxes/tax-list-table/locales/hr.ts +1 -0
- package/src/components/taxes/tax-list-table/locales/it.ts +1 -0
- package/src/components/taxes/tax-list-table/locales/nl.ts +1 -0
- package/src/components/taxes/tax-list-table/locales/pl.ts +1 -0
- package/src/components/taxes/tax-list-table/locales/pt.ts +1 -0
- package/src/components/taxes/tax-list-table/locales/sl.ts +1 -0
- package/src/components/taxes/tax-list-table/tax-list-header.tsx +3 -14
- package/src/components/taxes/tax-list-table/tax-list-table.tsx +3 -3
- package/src/components/ui/popover.tsx +3 -1
- package/src/components/ui/tooltip.tsx +3 -1
- package/src/generated/schemas/deliverynote.ts +134 -0
- package/src/generated/schemas/entity.ts +4 -0
- package/src/generated/schemas/index.ts +3 -0
- package/src/generated/schemas/order.ts +5 -3
- package/src/generated/schemas/payment.ts +22 -2
- package/src/generated/schemas/renderadvanceinvoicepreview_body.ts +1 -0
- package/src/generated/schemas/rendercreditnotepreview_body.ts +1 -0
- package/src/generated/schemas/renderdeliverynotepreview_body.ts +185 -0
- package/src/generated/schemas/renderestimatepreview_body.ts +1 -0
- package/src/generated/schemas/renderinvoicepreview_body.ts +1 -0
- package/src/generated/schemas/startpdfexport_body.ts +18 -2
- package/src/generated/schemas/userfinasettings.ts +19 -0
- package/src/generated/schemas/webhook.ts +12 -0
- package/src/hooks/use-duplicate-document.ts +49 -6
- package/src/hooks/use-next-document-number.ts +2 -2
- package/src/lib/fiscalization.ts +12 -0
- package/src/lib/schemas/advance-invoice.ts +0 -1
- package/src/providers/sdk-provider.tsx +5 -7
- 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,
|
|
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
|
-
|
|
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
|
-
}, []);
|
|
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
|
|
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
|
-
}
|