@voyant-travel/finance-react 0.119.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.
- package/LICENSE +201 -0
- package/README.md +75 -0
- package/dist/admin/booking-invoices-widget.d.ts +19 -0
- package/dist/admin/booking-invoices-widget.d.ts.map +1 -0
- package/dist/admin/booking-invoices-widget.js +204 -0
- package/dist/admin/booking-payment-policy-widget.d.ts +21 -0
- package/dist/admin/booking-payment-policy-widget.d.ts.map +1 -0
- package/dist/admin/booking-payment-policy-widget.js +128 -0
- package/dist/admin/booking-pending-payment-sessions-widget.d.ts +24 -0
- package/dist/admin/booking-pending-payment-sessions-widget.d.ts.map +1 -0
- package/dist/admin/booking-pending-payment-sessions-widget.js +139 -0
- package/dist/admin/credit-note-dialog.d.ts +9 -0
- package/dist/admin/credit-note-dialog.d.ts.map +1 -0
- package/dist/admin/credit-note-dialog.js +70 -0
- package/dist/admin/finance-shared.d.ts +7 -0
- package/dist/admin/finance-shared.d.ts.map +1 -0
- package/dist/admin/finance-shared.js +30 -0
- package/dist/admin/index.d.ts +99 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +286 -0
- package/dist/admin/invoice-detail-host.d.ts +19 -0
- package/dist/admin/invoice-detail-host.d.ts.map +1 -0
- package/dist/admin/invoice-detail-host.js +147 -0
- package/dist/admin/invoice-detail-sections.d.ts +31 -0
- package/dist/admin/invoice-detail-sections.d.ts.map +1 -0
- package/dist/admin/invoice-detail-sections.js +109 -0
- package/dist/admin/invoice-detail-skeleton.d.ts +11 -0
- package/dist/admin/invoice-detail-skeleton.d.ts.map +1 -0
- package/dist/admin/invoice-detail-skeleton.js +33 -0
- package/dist/admin/line-item-dialog.d.ts +10 -0
- package/dist/admin/line-item-dialog.d.ts.map +1 -0
- package/dist/admin/line-item-dialog.js +91 -0
- package/dist/admin/pages/invoice-detail.d.ts +8 -0
- package/dist/admin/pages/invoice-detail.d.ts.map +1 -0
- package/dist/admin/pages/invoice-detail.js +11 -0
- package/dist/admin/pages/invoices-index.d.ts +8 -0
- package/dist/admin/pages/invoices-index.d.ts.map +1 -0
- package/dist/admin/pages/invoices-index.js +14 -0
- package/dist/admin/pages/payment-detail.d.ts +8 -0
- package/dist/admin/pages/payment-detail.d.ts.map +1 -0
- package/dist/admin/pages/payment-detail.js +11 -0
- package/dist/admin/pages/payments-index.d.ts +9 -0
- package/dist/admin/pages/payments-index.d.ts.map +1 -0
- package/dist/admin/pages/payments-index.js +21 -0
- package/dist/admin/pages/profitability.d.ts +10 -0
- package/dist/admin/pages/profitability.d.ts.map +1 -0
- package/dist/admin/pages/profitability.js +32 -0
- package/dist/admin/pages/supplier-invoice-detail.d.ts +20 -0
- package/dist/admin/pages/supplier-invoice-detail.d.ts.map +1 -0
- package/dist/admin/pages/supplier-invoice-detail.js +102 -0
- package/dist/admin/pages/supplier-invoices-index.d.ts +9 -0
- package/dist/admin/pages/supplier-invoices-index.d.ts.map +1 -0
- package/dist/admin/pages/supplier-invoices-index.js +16 -0
- package/dist/admin/payment-detail-host.d.ts +12 -0
- package/dist/admin/payment-detail-host.d.ts.map +1 -0
- package/dist/admin/payment-detail-host.js +108 -0
- package/dist/admin/payment-detail-skeleton.d.ts +8 -0
- package/dist/admin/payment-detail-skeleton.d.ts.map +1 -0
- package/dist/admin/payment-detail-skeleton.js +15 -0
- package/dist/admin/payment-dialog.d.ts +9 -0
- package/dist/admin/payment-dialog.d.ts.map +1 -0
- package/dist/admin/payment-dialog.js +99 -0
- package/dist/admin/record-payment-dialog.d.ts +16 -0
- package/dist/admin/record-payment-dialog.d.ts.map +1 -0
- package/dist/admin/record-payment-dialog.js +219 -0
- package/dist/admin/supplier-payment-policy-widget.d.ts +18 -0
- package/dist/admin/supplier-payment-policy-widget.d.ts.map +1 -0
- package/dist/admin/supplier-payment-policy-widget.js +31 -0
- package/dist/admin/use-supplier-picker.d.ts +19 -0
- package/dist/admin/use-supplier-picker.d.ts.map +1 -0
- package/dist/admin/use-supplier-picker.js +30 -0
- package/dist/checkout-components/collect-payment-dialog.d.ts +45 -0
- package/dist/checkout-components/collect-payment-dialog.d.ts.map +1 -0
- package/dist/checkout-components/collect-payment-dialog.js +121 -0
- package/dist/checkout-components/payment-link-landing-page.d.ts +76 -0
- package/dist/checkout-components/payment-link-landing-page.d.ts.map +1 -0
- package/dist/checkout-components/payment-link-landing-page.js +173 -0
- package/dist/checkout-components/payment-step.d.ts +42 -0
- package/dist/checkout-components/payment-step.d.ts.map +1 -0
- package/dist/checkout-components/payment-step.js +113 -0
- package/dist/checkout-hooks/index.d.ts +5 -0
- package/dist/checkout-hooks/index.d.ts.map +1 -0
- package/dist/checkout-hooks/index.js +4 -0
- package/dist/checkout-hooks/use-checkout-payment-link-config.d.ts +20 -0
- package/dist/checkout-hooks/use-checkout-payment-link-config.d.ts.map +1 -0
- package/dist/checkout-hooks/use-checkout-payment-link-config.js +26 -0
- package/dist/checkout-hooks/use-collect-payment.d.ts +227 -0
- package/dist/checkout-hooks/use-collect-payment.d.ts.map +1 -0
- package/dist/checkout-hooks/use-collect-payment.js +80 -0
- package/dist/checkout-hooks/use-initiate-checkout-collection.d.ts +308 -0
- package/dist/checkout-hooks/use-initiate-checkout-collection.d.ts.map +1 -0
- package/dist/checkout-hooks/use-initiate-checkout-collection.js +35 -0
- package/dist/checkout-hooks/use-preview-checkout-collection.d.ts +65 -0
- package/dist/checkout-hooks/use-preview-checkout-collection.d.ts.map +1 -0
- package/dist/checkout-hooks/use-preview-checkout-collection.js +27 -0
- package/dist/checkout-i18n/en.d.ts +3 -0
- package/dist/checkout-i18n/en.d.ts.map +1 -0
- package/dist/checkout-i18n/en.js +127 -0
- package/dist/checkout-i18n/index.d.ts +5 -0
- package/dist/checkout-i18n/index.d.ts.map +1 -0
- package/dist/checkout-i18n/index.js +3 -0
- package/dist/checkout-i18n/messages.d.ts +121 -0
- package/dist/checkout-i18n/messages.d.ts.map +1 -0
- package/dist/checkout-i18n/messages.js +1 -0
- package/dist/checkout-i18n/provider.d.ts +26 -0
- package/dist/checkout-i18n/provider.d.ts.map +1 -0
- package/dist/checkout-i18n/provider.js +41 -0
- package/dist/checkout-i18n/ro.d.ts +3 -0
- package/dist/checkout-i18n/ro.d.ts.map +1 -0
- package/dist/checkout-i18n/ro.js +127 -0
- package/dist/checkout-types.d.ts +53 -0
- package/dist/checkout-types.d.ts.map +1 -0
- package/dist/checkout-types.js +1 -0
- package/dist/checkout-ui.d.ts +7 -0
- package/dist/checkout-ui.d.ts.map +1 -0
- package/dist/checkout-ui.js +4 -0
- package/dist/checkout.d.ts +5 -0
- package/dist/checkout.d.ts.map +1 -0
- package/dist/checkout.js +3 -0
- package/dist/client.d.ts +16 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +79 -0
- package/dist/components/accountant-portal/body.d.ts +8 -0
- package/dist/components/accountant-portal/body.d.ts.map +1 -0
- package/dist/components/accountant-portal/body.js +114 -0
- package/dist/components/accountant-portal/widgets.d.ts +13 -0
- package/dist/components/accountant-portal/widgets.d.ts.map +1 -0
- package/dist/components/accountant-portal/widgets.js +27 -0
- package/dist/components/accountant-portal.d.ts +10 -0
- package/dist/components/accountant-portal.d.ts.map +1 -0
- package/dist/components/accountant-portal.js +22 -0
- package/dist/components/accountant-share-dialog.d.ts +6 -0
- package/dist/components/accountant-share-dialog.d.ts.map +1 -0
- package/dist/components/accountant-share-dialog.js +53 -0
- package/dist/components/async-combobox.d.ts +33 -0
- package/dist/components/async-combobox.d.ts.map +1 -0
- package/dist/components/async-combobox.js +100 -0
- package/dist/components/booking-invoice-dialog.d.ts +63 -0
- package/dist/components/booking-invoice-dialog.d.ts.map +1 -0
- package/dist/components/booking-invoice-dialog.js +383 -0
- package/dist/components/cost-categories-page.d.ts +5 -0
- package/dist/components/cost-categories-page.d.ts.map +1 -0
- package/dist/components/cost-categories-page.js +30 -0
- package/dist/components/invoice-action-ledger-card.d.ts +15 -0
- package/dist/components/invoice-action-ledger-card.d.ts.map +1 -0
- package/dist/components/invoice-action-ledger-card.js +76 -0
- package/dist/components/invoice-bulk-actions.d.ts +10 -0
- package/dist/components/invoice-bulk-actions.d.ts.map +1 -0
- package/dist/components/invoice-bulk-actions.js +19 -0
- package/dist/components/invoice-detail-page/cards.d.ts +44 -0
- package/dist/components/invoice-detail-page/cards.d.ts.map +1 -0
- package/dist/components/invoice-detail-page/cards.js +43 -0
- package/dist/components/invoice-detail-page/header.d.ts +15 -0
- package/dist/components/invoice-detail-page/header.d.ts.map +1 -0
- package/dist/components/invoice-detail-page/header.js +30 -0
- package/dist/components/invoice-detail-page/notes-dialogs.d.ts +28 -0
- package/dist/components/invoice-detail-page/notes-dialogs.d.ts.map +1 -0
- package/dist/components/invoice-detail-page/notes-dialogs.js +104 -0
- package/dist/components/invoice-detail-page/primitives.d.ts +47 -0
- package/dist/components/invoice-detail-page/primitives.d.ts.map +1 -0
- package/dist/components/invoice-detail-page/primitives.js +76 -0
- package/dist/components/invoice-detail-page-with-action-ledger.d.ts +7 -0
- package/dist/components/invoice-detail-page-with-action-ledger.d.ts.map +1 -0
- package/dist/components/invoice-detail-page-with-action-ledger.js +11 -0
- package/dist/components/invoice-detail-page.d.ts +46 -0
- package/dist/components/invoice-detail-page.d.ts.map +1 -0
- package/dist/components/invoice-detail-page.js +134 -0
- package/dist/components/invoice-dialog.d.ts +9 -0
- package/dist/components/invoice-dialog.d.ts.map +1 -0
- package/dist/components/invoice-dialog.js +145 -0
- package/dist/components/invoice-number-series-dialog.d.ts +9 -0
- package/dist/components/invoice-number-series-dialog.d.ts.map +1 -0
- package/dist/components/invoice-number-series-dialog.js +134 -0
- package/dist/components/invoice-number-series-format.d.ts +3 -0
- package/dist/components/invoice-number-series-format.d.ts.map +1 -0
- package/dist/components/invoice-number-series-format.js +4 -0
- package/dist/components/invoice-number-series-page.d.ts +5 -0
- package/dist/components/invoice-number-series-page.d.ts.map +1 -0
- package/dist/components/invoice-number-series-page.js +55 -0
- package/dist/components/invoice-table-parts.d.ts +25 -0
- package/dist/components/invoice-table-parts.d.ts.map +1 -0
- package/dist/components/invoice-table-parts.js +32 -0
- package/dist/components/invoices-page-skeleton.d.ts +5 -0
- package/dist/components/invoices-page-skeleton.d.ts.map +1 -0
- package/dist/components/invoices-page-skeleton.js +13 -0
- package/dist/components/invoices-page.d.ts +6 -0
- package/dist/components/invoices-page.d.ts.map +1 -0
- package/dist/components/invoices-page.js +145 -0
- package/dist/components/payment-detail-page.d.ts +47 -0
- package/dist/components/payment-detail-page.d.ts.map +1 -0
- package/dist/components/payment-detail-page.js +90 -0
- package/dist/components/payment-policy-form.d.ts +49 -0
- package/dist/components/payment-policy-form.d.ts.map +1 -0
- package/dist/components/payment-policy-form.js +82 -0
- package/dist/components/payments-page/controls.d.ts +23 -0
- package/dist/components/payments-page/controls.d.ts.map +1 -0
- package/dist/components/payments-page/controls.js +20 -0
- package/dist/components/payments-page-skeleton.d.ts +5 -0
- package/dist/components/payments-page-skeleton.d.ts.map +1 -0
- package/dist/components/payments-page-skeleton.js +13 -0
- package/dist/components/payments-page.d.ts +20 -0
- package/dist/components/payments-page.d.ts.map +1 -0
- package/dist/components/payments-page.js +143 -0
- package/dist/components/profitability-page/sections.d.ts +24 -0
- package/dist/components/profitability-page/sections.d.ts.map +1 -0
- package/dist/components/profitability-page/sections.js +43 -0
- package/dist/components/profitability-page.d.ts +13 -0
- package/dist/components/profitability-page.d.ts.map +1 -0
- package/dist/components/profitability-page.js +175 -0
- package/dist/components/record-booking-payment-dialog/shared.d.ts +54 -0
- package/dist/components/record-booking-payment-dialog/shared.d.ts.map +1 -0
- package/dist/components/record-booking-payment-dialog/shared.js +47 -0
- package/dist/components/record-booking-payment-dialog.d.ts +4 -0
- package/dist/components/record-booking-payment-dialog.d.ts.map +1 -0
- package/dist/components/record-booking-payment-dialog.js +256 -0
- package/dist/components/supplier-invoice-detail-page/dialogs.d.ts +34 -0
- package/dist/components/supplier-invoice-detail-page/dialogs.d.ts.map +1 -0
- package/dist/components/supplier-invoice-detail-page/dialogs.js +119 -0
- package/dist/components/supplier-invoice-detail-page/shared.d.ts +64 -0
- package/dist/components/supplier-invoice-detail-page/shared.d.ts.map +1 -0
- package/dist/components/supplier-invoice-detail-page/shared.js +70 -0
- package/dist/components/supplier-invoice-detail-page.d.ts +4 -0
- package/dist/components/supplier-invoice-detail-page.d.ts.map +1 -0
- package/dist/components/supplier-invoice-detail-page.js +101 -0
- package/dist/components/supplier-invoice-form-dialog.d.ts +45 -0
- package/dist/components/supplier-invoice-form-dialog.d.ts.map +1 -0
- package/dist/components/supplier-invoice-form-dialog.js +102 -0
- package/dist/components/supplier-invoices-page.d.ts +14 -0
- package/dist/components/supplier-invoices-page.d.ts.map +1 -0
- package/dist/components/supplier-invoices-page.js +69 -0
- package/dist/components/supplier-payment-dialog.d.ts +7 -0
- package/dist/components/supplier-payment-dialog.d.ts.map +1 -0
- package/dist/components/supplier-payment-dialog.js +103 -0
- package/dist/components/taxes-page/policy-profile-sheet.d.ts +8 -0
- package/dist/components/taxes-page/policy-profile-sheet.d.ts.map +1 -0
- package/dist/components/taxes-page/policy-profile-sheet.js +52 -0
- package/dist/components/taxes-page/policy-rule-sheet.d.ts +10 -0
- package/dist/components/taxes-page/policy-rule-sheet.d.ts.map +1 -0
- package/dist/components/taxes-page/policy-rule-sheet.js +137 -0
- package/dist/components/taxes-page/shared.d.ts +128 -0
- package/dist/components/taxes-page/shared.d.ts.map +1 -0
- package/dist/components/taxes-page/shared.js +288 -0
- package/dist/components/taxes-page/sheets.d.ts +4 -0
- package/dist/components/taxes-page/sheets.d.ts.map +1 -0
- package/dist/components/taxes-page/sheets.js +3 -0
- package/dist/components/taxes-page/tax-sheet.d.ts +9 -0
- package/dist/components/taxes-page/tax-sheet.d.ts.map +1 -0
- package/dist/components/taxes-page/tax-sheet.js +108 -0
- package/dist/components/taxes-page.d.ts +4 -0
- package/dist/components/taxes-page.d.ts.map +1 -0
- package/dist/components/taxes-page.js +165 -0
- package/dist/hooks/index.d.ts +53 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +52 -0
- package/dist/hooks/use-accountant-share-mutation.d.ts +20 -0
- package/dist/hooks/use-accountant-share-mutation.d.ts.map +1 -0
- package/dist/hooks/use-accountant-share-mutation.js +27 -0
- package/dist/hooks/use-accountant-shares.d.ts +13 -0
- package/dist/hooks/use-accountant-shares.d.ts.map +1 -0
- package/dist/hooks/use-accountant-shares.js +8 -0
- package/dist/hooks/use-admin-booking-payments.d.ts +30 -0
- package/dist/hooks/use-admin-booking-payments.d.ts.map +1 -0
- package/dist/hooks/use-admin-booking-payments.js +18 -0
- package/dist/hooks/use-all-payments.d.ts +35 -0
- package/dist/hooks/use-all-payments.d.ts.map +1 -0
- package/dist/hooks/use-all-payments.js +12 -0
- package/dist/hooks/use-booking-guarantees.d.ts +82 -0
- package/dist/hooks/use-booking-guarantees.d.ts.map +1 -0
- package/dist/hooks/use-booking-guarantees.js +46 -0
- package/dist/hooks/use-booking-payment-schedule-regenerate-mutation.d.ts +44 -0
- package/dist/hooks/use-booking-payment-schedule-regenerate-mutation.d.ts.map +1 -0
- package/dist/hooks/use-booking-payment-schedule-regenerate-mutation.js +27 -0
- package/dist/hooks/use-booking-payment-schedules.d.ts +63 -0
- package/dist/hooks/use-booking-payment-schedules.d.ts.map +1 -0
- package/dist/hooks/use-booking-payment-schedules.js +47 -0
- package/dist/hooks/use-cost-categories.d.ts +14 -0
- package/dist/hooks/use-cost-categories.d.ts.map +1 -0
- package/dist/hooks/use-cost-categories.js +9 -0
- package/dist/hooks/use-cost-category-mutation.d.ts +31 -0
- package/dist/hooks/use-cost-category-mutation.d.ts.map +1 -0
- package/dist/hooks/use-cost-category-mutation.js +27 -0
- package/dist/hooks/use-departure-profitability.d.ts +56 -0
- package/dist/hooks/use-departure-profitability.d.ts.map +1 -0
- package/dist/hooks/use-departure-profitability.js +12 -0
- package/dist/hooks/use-finance-action-ledger.d.ts +94 -0
- package/dist/hooks/use-finance-action-ledger.d.ts.map +1 -0
- package/dist/hooks/use-finance-action-ledger.js +20 -0
- package/dist/hooks/use-invoice-attachment-mutation.d.ts +43 -0
- package/dist/hooks/use-invoice-attachment-mutation.d.ts.map +1 -0
- package/dist/hooks/use-invoice-attachment-mutation.js +39 -0
- package/dist/hooks/use-invoice-attachments.d.ts +18 -0
- package/dist/hooks/use-invoice-attachments.d.ts.map +1 -0
- package/dist/hooks/use-invoice-attachments.js +12 -0
- package/dist/hooks/use-invoice-bulk-status-mutation.d.ts +51 -0
- package/dist/hooks/use-invoice-bulk-status-mutation.d.ts.map +1 -0
- package/dist/hooks/use-invoice-bulk-status-mutation.js +66 -0
- package/dist/hooks/use-invoice-credit-note-mutation.d.ts +38 -0
- package/dist/hooks/use-invoice-credit-note-mutation.d.ts.map +1 -0
- package/dist/hooks/use-invoice-credit-note-mutation.js +35 -0
- package/dist/hooks/use-invoice-credit-notes.d.ts +17 -0
- package/dist/hooks/use-invoice-credit-notes.d.ts.map +1 -0
- package/dist/hooks/use-invoice-credit-notes.js +12 -0
- package/dist/hooks/use-invoice-fx-rate.d.ts +19 -0
- package/dist/hooks/use-invoice-fx-rate.d.ts.map +1 -0
- package/dist/hooks/use-invoice-fx-rate.js +13 -0
- package/dist/hooks/use-invoice-line-item-mutation.d.ts +40 -0
- package/dist/hooks/use-invoice-line-item-mutation.d.ts.map +1 -0
- package/dist/hooks/use-invoice-line-item-mutation.js +42 -0
- package/dist/hooks/use-invoice-line-items.d.ts +17 -0
- package/dist/hooks/use-invoice-line-items.d.ts.map +1 -0
- package/dist/hooks/use-invoice-line-items.js +12 -0
- package/dist/hooks/use-invoice-mutation.d.ts +225 -0
- package/dist/hooks/use-invoice-mutation.d.ts.map +1 -0
- package/dist/hooks/use-invoice-mutation.js +121 -0
- package/dist/hooks/use-invoice-note-mutation.d.ts +11 -0
- package/dist/hooks/use-invoice-note-mutation.d.ts.map +1 -0
- package/dist/hooks/use-invoice-note-mutation.js +23 -0
- package/dist/hooks/use-invoice-notes.d.ts +13 -0
- package/dist/hooks/use-invoice-notes.d.ts.map +1 -0
- package/dist/hooks/use-invoice-notes.js +12 -0
- package/dist/hooks/use-invoice-number-series-mutation.d.ts +62 -0
- package/dist/hooks/use-invoice-number-series-mutation.d.ts.map +1 -0
- package/dist/hooks/use-invoice-number-series-mutation.js +39 -0
- package/dist/hooks/use-invoice-number-series.d.ts +28 -0
- package/dist/hooks/use-invoice-number-series.d.ts.map +1 -0
- package/dist/hooks/use-invoice-number-series.js +12 -0
- package/dist/hooks/use-invoice-payment-mutation.d.ts +29 -0
- package/dist/hooks/use-invoice-payment-mutation.d.ts.map +1 -0
- package/dist/hooks/use-invoice-payment-mutation.js +35 -0
- package/dist/hooks/use-invoice-payments.d.ts +21 -0
- package/dist/hooks/use-invoice-payments.d.ts.map +1 -0
- package/dist/hooks/use-invoice-payments.js +12 -0
- package/dist/hooks/use-invoice.d.ts +32 -0
- package/dist/hooks/use-invoice.d.ts.map +1 -0
- package/dist/hooks/use-invoice.js +12 -0
- package/dist/hooks/use-invoices.d.ts +36 -0
- package/dist/hooks/use-invoices.d.ts.map +1 -0
- package/dist/hooks/use-invoices.js +12 -0
- package/dist/hooks/use-payment-mutation.d.ts +57 -0
- package/dist/hooks/use-payment-mutation.d.ts.map +1 -0
- package/dist/hooks/use-payment-mutation.js +59 -0
- package/dist/hooks/use-payment-session-mutation.d.ts +205 -0
- package/dist/hooks/use-payment-session-mutation.d.ts.map +1 -0
- package/dist/hooks/use-payment-session-mutation.js +38 -0
- package/dist/hooks/use-payment-sessions.d.ts +97 -0
- package/dist/hooks/use-payment-sessions.d.ts.map +1 -0
- package/dist/hooks/use-payment-sessions.js +17 -0
- package/dist/hooks/use-payment.d.ts +31 -0
- package/dist/hooks/use-payment.d.ts.map +1 -0
- package/dist/hooks/use-payment.js +12 -0
- package/dist/hooks/use-product-profitability.d.ts +52 -0
- package/dist/hooks/use-product-profitability.d.ts.map +1 -0
- package/dist/hooks/use-product-profitability.js +12 -0
- package/dist/hooks/use-public-booking-documents.d.ts +29 -0
- package/dist/hooks/use-public-booking-documents.d.ts.map +1 -0
- package/dist/hooks/use-public-booking-documents.js +12 -0
- package/dist/hooks/use-public-booking-payment-options.d.ts +47 -0
- package/dist/hooks/use-public-booking-payment-options.d.ts.map +1 -0
- package/dist/hooks/use-public-booking-payment-options.js +12 -0
- package/dist/hooks/use-public-booking-payments.d.ts +24 -0
- package/dist/hooks/use-public-booking-payments.d.ts.map +1 -0
- package/dist/hooks/use-public-booking-payments.js +12 -0
- package/dist/hooks/use-public-finance-document-by-reference.d.ts +27 -0
- package/dist/hooks/use-public-finance-document-by-reference.d.ts.map +1 -0
- package/dist/hooks/use-public-finance-document-by-reference.js +12 -0
- package/dist/hooks/use-public-payment-session-mutation.d.ts +82 -0
- package/dist/hooks/use-public-payment-session-mutation.d.ts.map +1 -0
- package/dist/hooks/use-public-payment-session-mutation.js +33 -0
- package/dist/hooks/use-public-payment-session.d.ts +73 -0
- package/dist/hooks/use-public-payment-session.d.ts.map +1 -0
- package/dist/hooks/use-public-payment-session.js +12 -0
- package/dist/hooks/use-public-voucher-validation-mutation.d.ts +23 -0
- package/dist/hooks/use-public-voucher-validation-mutation.d.ts.map +1 -0
- package/dist/hooks/use-public-voucher-validation-mutation.js +17 -0
- package/dist/hooks/use-supplier-invoice-attachments.d.ts +17 -0
- package/dist/hooks/use-supplier-invoice-attachments.d.ts.map +1 -0
- package/dist/hooks/use-supplier-invoice-attachments.js +12 -0
- package/dist/hooks/use-supplier-invoice-mutation.d.ts +353 -0
- package/dist/hooks/use-supplier-invoice-mutation.d.ts.map +1 -0
- package/dist/hooks/use-supplier-invoice-mutation.js +81 -0
- package/dist/hooks/use-supplier-invoice-payments.d.ts +26 -0
- package/dist/hooks/use-supplier-invoice-payments.d.ts.map +1 -0
- package/dist/hooks/use-supplier-invoice-payments.js +12 -0
- package/dist/hooks/use-supplier-invoice.d.ts +65 -0
- package/dist/hooks/use-supplier-invoice.d.ts.map +1 -0
- package/dist/hooks/use-supplier-invoice.js +12 -0
- package/dist/hooks/use-supplier-invoices.d.ts +36 -0
- package/dist/hooks/use-supplier-invoices.d.ts.map +1 -0
- package/dist/hooks/use-supplier-invoices.js +12 -0
- package/dist/hooks/use-supplier-payment-mutation.d.ts +55 -0
- package/dist/hooks/use-supplier-payment-mutation.d.ts.map +1 -0
- package/dist/hooks/use-supplier-payment-mutation.js +35 -0
- package/dist/hooks/use-supplier-payments.d.ts +27 -0
- package/dist/hooks/use-supplier-payments.d.ts.map +1 -0
- package/dist/hooks/use-supplier-payments.js +12 -0
- package/dist/hooks/use-traveler-profitability.d.ts +24 -0
- package/dist/hooks/use-traveler-profitability.d.ts.map +1 -0
- package/dist/hooks/use-traveler-profitability.js +11 -0
- package/dist/hooks/use-voucher-mutation.d.ts +105 -0
- package/dist/hooks/use-voucher-mutation.d.ts.map +1 -0
- package/dist/hooks/use-voucher-mutation.js +50 -0
- package/dist/hooks/use-voucher.d.ts +38 -0
- package/dist/hooks/use-voucher.d.ts.map +1 -0
- package/dist/hooks/use-voucher.js +17 -0
- package/dist/hooks/use-vouchers.d.ts +34 -0
- package/dist/hooks/use-vouchers.d.ts.map +1 -0
- package/dist/hooks/use-vouchers.js +18 -0
- package/dist/i18n/en/invoices.d.ts +278 -0
- package/dist/i18n/en/invoices.d.ts.map +1 -0
- package/dist/i18n/en/invoices.js +277 -0
- package/dist/i18n/en/numberingAndPayments.d.ts +387 -0
- package/dist/i18n/en/numberingAndPayments.d.ts.map +1 -0
- package/dist/i18n/en/numberingAndPayments.js +386 -0
- package/dist/i18n/en/profitability.d.ts +147 -0
- package/dist/i18n/en/profitability.d.ts.map +1 -0
- package/dist/i18n/en/profitability.js +146 -0
- package/dist/i18n/en/suppliers.d.ts +187 -0
- package/dist/i18n/en/suppliers.d.ts.map +1 -0
- package/dist/i18n/en/suppliers.js +186 -0
- package/dist/i18n/en.d.ts +998 -0
- package/dist/i18n/en.d.ts.map +1 -0
- package/dist/i18n/en.js +22 -0
- package/dist/i18n/index.d.ts +5 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +3 -0
- package/dist/i18n/messages/core.d.ts +18 -0
- package/dist/i18n/messages/core.d.ts.map +1 -0
- package/dist/i18n/messages/core.js +30 -0
- package/dist/i18n/messages/invoices.d.ts +252 -0
- package/dist/i18n/messages/invoices.d.ts.map +1 -0
- package/dist/i18n/messages/invoices.js +1 -0
- package/dist/i18n/messages/numberingAndPayments.d.ts +277 -0
- package/dist/i18n/messages/numberingAndPayments.d.ts.map +1 -0
- package/dist/i18n/messages/numberingAndPayments.js +1 -0
- package/dist/i18n/messages/profitability.d.ts +151 -0
- package/dist/i18n/messages/profitability.d.ts.map +1 -0
- package/dist/i18n/messages/profitability.js +1 -0
- package/dist/i18n/messages/suppliers.d.ts +167 -0
- package/dist/i18n/messages/suppliers.d.ts.map +1 -0
- package/dist/i18n/messages/suppliers.js +1 -0
- package/dist/i18n/messages.d.ts +29 -0
- package/dist/i18n/messages.d.ts.map +1 -0
- package/dist/i18n/messages.js +1 -0
- package/dist/i18n/provider.d.ts +2018 -0
- package/dist/i18n/provider.d.ts.map +1 -0
- package/dist/i18n/provider.js +44 -0
- package/dist/i18n/ro/invoices.d.ts +278 -0
- package/dist/i18n/ro/invoices.d.ts.map +1 -0
- package/dist/i18n/ro/invoices.js +277 -0
- package/dist/i18n/ro/numberingAndPayments.d.ts +387 -0
- package/dist/i18n/ro/numberingAndPayments.d.ts.map +1 -0
- package/dist/i18n/ro/numberingAndPayments.js +386 -0
- package/dist/i18n/ro/profitability.d.ts +147 -0
- package/dist/i18n/ro/profitability.d.ts.map +1 -0
- package/dist/i18n/ro/profitability.js +146 -0
- package/dist/i18n/ro/suppliers.d.ts +187 -0
- package/dist/i18n/ro/suppliers.d.ts.map +1 -0
- package/dist/i18n/ro/suppliers.js +186 -0
- package/dist/i18n/ro.d.ts +998 -0
- package/dist/i18n/ro.d.ts.map +1 -0
- package/dist/i18n/ro.js +22 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/operations.d.ts +484 -0
- package/dist/operations.d.ts.map +1 -0
- package/dist/operations.js +52 -0
- package/dist/provider.d.ts +2 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +1 -0
- package/dist/query-keys.d.ts +195 -0
- package/dist/query-keys.d.ts.map +1 -0
- package/dist/query-keys.js +49 -0
- package/dist/query-options/public-reporting.d.ts +2129 -0
- package/dist/query-options/public-reporting.d.ts.map +1 -0
- package/dist/query-options/public-reporting.js +193 -0
- package/dist/query-options-action-ledger.d.ts +382 -0
- package/dist/query-options-action-ledger.d.ts.map +1 -0
- package/dist/query-options-action-ledger.js +36 -0
- package/dist/query-options.d.ts +2057 -0
- package/dist/query-options.d.ts.map +1 -0
- package/dist/query-options.js +328 -0
- package/dist/schemas/accountant.d.ts +168 -0
- package/dist/schemas/accountant.d.ts.map +1 -0
- package/dist/schemas/accountant.js +53 -0
- package/dist/schemas/action-ledger.d.ts +206 -0
- package/dist/schemas/action-ledger.d.ts.map +1 -0
- package/dist/schemas/action-ledger.js +83 -0
- package/dist/schemas/common.d.ts +17 -0
- package/dist/schemas/common.d.ts.map +1 -0
- package/dist/schemas/common.js +10 -0
- package/dist/schemas/invoice.d.ts +1451 -0
- package/dist/schemas/invoice.d.ts.map +1 -0
- package/dist/schemas/invoice.js +438 -0
- package/dist/schemas/profitability.d.ts +333 -0
- package/dist/schemas/profitability.d.ts.map +1 -0
- package/dist/schemas/profitability.js +84 -0
- package/dist/schemas/public.d.ts +481 -0
- package/dist/schemas/public.d.ts.map +1 -0
- package/dist/schemas/public.js +9 -0
- package/dist/schemas/responses.d.ts +632 -0
- package/dist/schemas/responses.d.ts.map +1 -0
- package/dist/schemas/responses.js +27 -0
- package/dist/schemas/supplier.d.ts +226 -0
- package/dist/schemas/supplier.d.ts.map +1 -0
- package/dist/schemas/supplier.js +103 -0
- package/dist/schemas/vouchers.d.ts +283 -0
- package/dist/schemas/vouchers.d.ts.map +1 -0
- package/dist/schemas/vouchers.js +49 -0
- package/dist/schemas.d.ts +10 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +9 -0
- package/dist/ui.d.ts +27 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +26 -0
- package/package.json +181 -0
- package/src/styles.css +12 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useMutation } from "@tanstack/react-query";
|
|
4
|
+
import { Button, Input, Label, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Sheet, SheetBody, SheetContent, SheetFooter, SheetHeader, SheetTitle, Switch, } from "@voyant-travel/ui/components";
|
|
5
|
+
import { Loader2, Plus, Trash2 } from "lucide-react";
|
|
6
|
+
import { useEffect, useState } from "react";
|
|
7
|
+
import { useFinanceUiMessagesOrDefault } from "../../i18n/index.js";
|
|
8
|
+
import { appliesToLabel, buildPolicyCondition, formatRate, initialPolicyRuleForm, nextTaxPolicyConditionKey, normalizeCondition, TAX_CLASS_APPLIES_TO_OPTIONS, TAX_POLICY_CONDITION_FACT_OPTIONS, useTaxesPageApi, } from "./shared.js";
|
|
9
|
+
export function PolicyRuleSheet({ open, onOpenChange, rule, profileId, taxRegimes, onSuccess, }) {
|
|
10
|
+
const messages = useFinanceUiMessagesOrDefault();
|
|
11
|
+
const taxMessages = messages.taxesPage;
|
|
12
|
+
const api = useTaxesPageApi();
|
|
13
|
+
const defaultTaxRegimeId = taxRegimes[0]?.id ?? "";
|
|
14
|
+
const [form, setForm] = useState(() => initialPolicyRuleForm(rule, profileId, defaultTaxRegimeId));
|
|
15
|
+
const [error, setError] = useState(null);
|
|
16
|
+
const isEditing = !!rule;
|
|
17
|
+
useEffect(() => {
|
|
18
|
+
setForm(initialPolicyRuleForm(rule, profileId, defaultTaxRegimeId));
|
|
19
|
+
setError(null);
|
|
20
|
+
}, [defaultTaxRegimeId, profileId, rule]);
|
|
21
|
+
const mutation = useMutation({
|
|
22
|
+
mutationFn: async () => {
|
|
23
|
+
if (!form.profileId)
|
|
24
|
+
throw new Error(taxMessages.validationPolicyProfileRequired);
|
|
25
|
+
if (!form.name.trim())
|
|
26
|
+
throw new Error(taxMessages.validationPolicyRuleNameRequired);
|
|
27
|
+
if (!form.taxRegimeId)
|
|
28
|
+
throw new Error(taxMessages.validationPolicyRuleRegimeRequired);
|
|
29
|
+
const priority = Number(form.priority);
|
|
30
|
+
if (!Number.isInteger(priority) || priority < 0) {
|
|
31
|
+
throw new Error(taxMessages.validationPolicyRulePriorityInvalid);
|
|
32
|
+
}
|
|
33
|
+
const condition = buildPolicyCondition(form, taxMessages);
|
|
34
|
+
const input = {
|
|
35
|
+
profileId: form.profileId,
|
|
36
|
+
side: form.side,
|
|
37
|
+
priority,
|
|
38
|
+
name: form.name.trim(),
|
|
39
|
+
appliesTo: form.appliesTo,
|
|
40
|
+
condition,
|
|
41
|
+
taxRegimeId: form.taxRegimeId,
|
|
42
|
+
active: form.active,
|
|
43
|
+
};
|
|
44
|
+
if (rule) {
|
|
45
|
+
await api.patch(`/v1/admin/finance/tax-policy-rules/${rule.id}`, input);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
await api.post("/v1/admin/finance/tax-policy-rules", input);
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
onSuccess,
|
|
52
|
+
onError: (err) => setError(err instanceof Error ? err.message : taxMessages.savePolicyRuleFailed),
|
|
53
|
+
});
|
|
54
|
+
const setField = (key) => (value) => setForm((current) => ({ ...current, [key]: value }));
|
|
55
|
+
const updateCondition = (index, patch) => {
|
|
56
|
+
setForm((current) => ({
|
|
57
|
+
...current,
|
|
58
|
+
conditions: current.conditions.map((condition, conditionIndex) => conditionIndex === index ? normalizeCondition({ ...condition, ...patch }) : condition),
|
|
59
|
+
}));
|
|
60
|
+
};
|
|
61
|
+
const addCondition = () => {
|
|
62
|
+
setForm((current) => ({
|
|
63
|
+
...current,
|
|
64
|
+
conditionMode: current.conditionMode === "always" ? "all" : current.conditionMode,
|
|
65
|
+
conditions: [
|
|
66
|
+
...current.conditions,
|
|
67
|
+
{
|
|
68
|
+
key: nextTaxPolicyConditionKey(),
|
|
69
|
+
fact: "hasAccommodation",
|
|
70
|
+
operator: "eq",
|
|
71
|
+
value: "true",
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
}));
|
|
75
|
+
};
|
|
76
|
+
const removeCondition = (index) => {
|
|
77
|
+
setForm((current) => {
|
|
78
|
+
const conditions = current.conditions.filter((_, conditionIndex) => conditionIndex !== index);
|
|
79
|
+
return {
|
|
80
|
+
...current,
|
|
81
|
+
conditions,
|
|
82
|
+
conditionMode: conditions.length ? current.conditionMode : "always",
|
|
83
|
+
};
|
|
84
|
+
});
|
|
85
|
+
};
|
|
86
|
+
return (_jsx(Sheet, { open: open, onOpenChange: onOpenChange, children: _jsxs(SheetContent, { side: "right", size: "lg", children: [_jsx(SheetHeader, { children: _jsx(SheetTitle, { children: isEditing ? taxMessages.editPolicyRuleSheetTitle : taxMessages.newPolicyRuleSheetTitle }) }), _jsx(SheetBody, { children: _jsxs("form", { className: "flex flex-col gap-4", children: [_jsxs("div", { className: "grid grid-cols-2 gap-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: taxMessages.policyRuleNameLabel }), _jsx(Input, { value: form.name, onChange: (event) => setField("name")(event.target.value), placeholder: taxMessages.policyRuleNamePlaceholder })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: taxMessages.policyPriorityLabel }), _jsx(Input, { type: "number", min: "0", step: "1", value: form.priority, onChange: (event) => setField("priority")(event.target.value) })] })] }), _jsxs("div", { className: "grid grid-cols-3 gap-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: taxMessages.policySideLabel }), _jsxs(Select, { value: form.side, onValueChange: (value) => setField("side")(value), items: [
|
|
87
|
+
{ value: "sell", label: taxMessages.policySideSell },
|
|
88
|
+
{ value: "buy", label: taxMessages.policySideBuy },
|
|
89
|
+
], children: [_jsx(SelectTrigger, { className: "w-full", children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "sell", children: taxMessages.policySideSell }), _jsx(SelectItem, { value: "buy", children: taxMessages.policySideBuy })] })] })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: taxMessages.appliesToLabel }), _jsxs(Select, { value: form.appliesTo, onValueChange: (value) => setField("appliesTo")(value), items: TAX_CLASS_APPLIES_TO_OPTIONS.map((appliesTo) => ({
|
|
90
|
+
value: appliesTo,
|
|
91
|
+
label: appliesToLabel(messages, appliesTo),
|
|
92
|
+
})), children: [_jsx(SelectTrigger, { className: "w-full", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: TAX_CLASS_APPLIES_TO_OPTIONS.map((appliesTo) => (_jsx(SelectItem, { value: appliesTo, children: appliesToLabel(messages, appliesTo) }, appliesTo))) })] })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: taxMessages.taxRegimeLabel }), _jsxs(Select, { value: form.taxRegimeId, onValueChange: (value) => setField("taxRegimeId")(value ?? ""), items: taxRegimes.map((regime) => ({
|
|
93
|
+
value: regime.id,
|
|
94
|
+
label: `${regime.name} (${formatRate(regime.ratePercent)})`,
|
|
95
|
+
})), children: [_jsx(SelectTrigger, { className: "w-full", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: taxRegimes.map((regime) => (_jsxs(SelectItem, { value: regime.id, children: [regime.name, " (", formatRate(regime.ratePercent), ")"] }, regime.id))) })] })] })] }), _jsxs("div", { className: "flex flex-col gap-3 rounded-lg border p-4", children: [_jsxs("div", { className: "flex items-start justify-between gap-4", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-sm font-medium", children: taxMessages.policyConditionSectionTitle }), _jsx("p", { className: "text-xs text-muted-foreground", children: taxMessages.policyConditionSectionDescription })] }), _jsxs(Button, { type: "button", variant: "outline", size: "sm", onClick: addCondition, disabled: form.conditionMode === "always", children: [_jsx(Plus, { className: "mr-1.5 h-3.5 w-3.5" }), taxMessages.addPolicyCondition] })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: taxMessages.policyConditionModeLabel }), _jsxs(Select, { value: form.conditionMode, onValueChange: (value) => {
|
|
96
|
+
const conditionMode = value;
|
|
97
|
+
setForm((current) => ({
|
|
98
|
+
...current,
|
|
99
|
+
conditionMode,
|
|
100
|
+
conditions: conditionMode === "always"
|
|
101
|
+
? []
|
|
102
|
+
: current.conditions.length
|
|
103
|
+
? current.conditions
|
|
104
|
+
: [
|
|
105
|
+
{
|
|
106
|
+
key: nextTaxPolicyConditionKey(),
|
|
107
|
+
fact: "hasAccommodation",
|
|
108
|
+
operator: "eq",
|
|
109
|
+
value: "true",
|
|
110
|
+
},
|
|
111
|
+
],
|
|
112
|
+
}));
|
|
113
|
+
}, items: [
|
|
114
|
+
{ value: "always", label: taxMessages.policyConditionAlways },
|
|
115
|
+
{ value: "all", label: taxMessages.policyConditionModeAll },
|
|
116
|
+
{ value: "any", label: taxMessages.policyConditionModeAny },
|
|
117
|
+
], children: [_jsx(SelectTrigger, { className: "w-full", children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "always", children: taxMessages.policyConditionAlways }), _jsx(SelectItem, { value: "all", children: taxMessages.policyConditionModeAll }), _jsx(SelectItem, { value: "any", children: taxMessages.policyConditionModeAny })] })] })] }), form.conditionMode === "always" ? (_jsx("p", { className: "rounded-md border border-dashed px-3 py-4 text-sm text-muted-foreground", children: taxMessages.policyConditionAlwaysDescription })) : (_jsx("div", { className: "flex flex-col gap-3", children: form.conditions.map((condition, index) => (_jsxs("div", { className: "grid grid-cols-[minmax(0,1fr)_minmax(0,1fr)_minmax(0,1fr)_auto] items-end gap-2", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: taxMessages.policyFactLabel }), _jsxs(Select, { value: condition.fact, onValueChange: (value) => updateCondition(index, {
|
|
118
|
+
fact: value,
|
|
119
|
+
}), items: TAX_POLICY_CONDITION_FACT_OPTIONS.map((fact) => ({
|
|
120
|
+
value: fact,
|
|
121
|
+
label: fact === "hasAccommodation"
|
|
122
|
+
? taxMessages.policyFactHasAccommodation
|
|
123
|
+
: taxMessages.policyFactAccommodationCountries,
|
|
124
|
+
})), children: [_jsx(SelectTrigger, { className: "w-full", children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "hasAccommodation", children: taxMessages.policyFactHasAccommodation }), _jsx(SelectItem, { value: "accommodationCountries", children: taxMessages.policyFactAccommodationCountries })] })] })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: taxMessages.policyOperatorLabel }), _jsxs(Select, { value: condition.operator, onValueChange: (value) => updateCondition(index, {
|
|
125
|
+
operator: value,
|
|
126
|
+
}), items: [
|
|
127
|
+
{
|
|
128
|
+
value: condition.fact === "hasAccommodation" ? "eq" : "contains",
|
|
129
|
+
label: condition.fact === "hasAccommodation"
|
|
130
|
+
? taxMessages.policyOperatorEquals
|
|
131
|
+
: taxMessages.policyOperatorContains,
|
|
132
|
+
},
|
|
133
|
+
], children: [_jsx(SelectTrigger, { className: "w-full", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: condition.fact === "hasAccommodation" ? (_jsx(SelectItem, { value: "eq", children: taxMessages.policyOperatorEquals })) : (_jsx(SelectItem, { value: "contains", children: taxMessages.policyOperatorContains })) })] })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: taxMessages.policyValueLabel }), condition.fact === "hasAccommodation" ? (_jsxs(Select, { value: condition.value, onValueChange: (value) => updateCondition(index, { value: value ?? "true" }), items: [
|
|
134
|
+
{ value: "true", label: taxMessages.policyValueYes },
|
|
135
|
+
{ value: "false", label: taxMessages.policyValueNo },
|
|
136
|
+
], children: [_jsx(SelectTrigger, { className: "w-full", children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "true", children: taxMessages.policyValueYes }), _jsx(SelectItem, { value: "false", children: taxMessages.policyValueNo })] })] })) : (_jsx(Input, { value: condition.value, maxLength: 2, onChange: (event) => updateCondition(index, { value: event.target.value.toUpperCase() }), placeholder: "RO" }))] }), _jsx(Button, { type: "button", variant: "ghost", size: "icon", onClick: () => removeCondition(index), "aria-label": taxMessages.removePolicyCondition, children: _jsx(Trash2, { className: "h-4 w-4" }) })] }, condition.key))) }))] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Switch, { checked: form.active, onCheckedChange: setField("active") }), _jsx(Label, { children: taxMessages.activeLabel })] }), error ? _jsx("p", { className: "text-sm text-destructive", children: error }) : null] }) }), _jsxs(SheetFooter, { children: [_jsx(Button, { type: "button", variant: "ghost", onClick: () => onOpenChange(false), children: taxMessages.cancel }), _jsxs(Button, { onClick: () => mutation.mutate(), disabled: mutation.isPending, children: [mutation.isPending ? _jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }) : null, isEditing ? taxMessages.saveChanges : taxMessages.createPolicyRule] })] })] }) }));
|
|
137
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import type { FinanceUiMessages } from "../../i18n/index.js";
|
|
2
|
+
export declare const TAX_CODE_OPTIONS: readonly ["standard", "reduced", "exempt", "reverse_charge", "margin_scheme_art311", "zero_rated", "out_of_scope", "other"];
|
|
3
|
+
export type TaxRegimeCode = (typeof TAX_CODE_OPTIONS)[number];
|
|
4
|
+
export type TaxClassAppliesTo = "base" | "addon" | "accommodation" | "all";
|
|
5
|
+
export type TaxPolicySide = "sell" | "buy";
|
|
6
|
+
export type TaxPolicyConditionMode = "always" | "all" | "any";
|
|
7
|
+
export type TaxPolicyConditionFact = "hasAccommodation" | "accommodationCountries";
|
|
8
|
+
export type TaxPolicyConditionOperator = "eq" | "contains";
|
|
9
|
+
export interface TaxesPageApi {
|
|
10
|
+
get: <T = unknown>(path: string) => Promise<T>;
|
|
11
|
+
post: <T = unknown>(path: string, body?: unknown) => Promise<T>;
|
|
12
|
+
patch: <T = unknown>(path: string, body?: unknown) => Promise<T>;
|
|
13
|
+
delete: <T = unknown>(path: string) => Promise<T>;
|
|
14
|
+
}
|
|
15
|
+
export interface TaxesPageProps {
|
|
16
|
+
api?: TaxesPageApi;
|
|
17
|
+
}
|
|
18
|
+
export declare const TaxesPageApiContext: import("react").Context<TaxesPageApi | null>;
|
|
19
|
+
export declare function joinUrl(baseUrl: string, path: string): string;
|
|
20
|
+
export declare function readJson<T>(response: Response): Promise<T>;
|
|
21
|
+
export declare function createTaxesPageApi(baseUrl: string, fetcher: (url: string, init?: RequestInit) => Promise<Response>): TaxesPageApi;
|
|
22
|
+
export declare function useTaxesPageApi(): TaxesPageApi;
|
|
23
|
+
export declare const TAX_CLASS_APPLIES_TO_OPTIONS: TaxClassAppliesTo[];
|
|
24
|
+
export declare const TAX_POLICY_CONDITION_FACT_OPTIONS: TaxPolicyConditionFact[];
|
|
25
|
+
export type TaxRegimeRecord = {
|
|
26
|
+
id: string;
|
|
27
|
+
code: TaxRegimeCode;
|
|
28
|
+
name: string;
|
|
29
|
+
jurisdiction: string | null;
|
|
30
|
+
ratePercent: number | null;
|
|
31
|
+
description: string | null;
|
|
32
|
+
legalReference: string | null;
|
|
33
|
+
active: boolean;
|
|
34
|
+
};
|
|
35
|
+
export type TaxClassRecord = {
|
|
36
|
+
id: string;
|
|
37
|
+
code: string;
|
|
38
|
+
label: string;
|
|
39
|
+
description: string | null;
|
|
40
|
+
defaultRegimeId: string | null;
|
|
41
|
+
lines: TaxClassLineRecord[] | null;
|
|
42
|
+
active: boolean;
|
|
43
|
+
};
|
|
44
|
+
export type TaxClassLineRecord = {
|
|
45
|
+
regime_id: string;
|
|
46
|
+
applies_to: TaxClassAppliesTo;
|
|
47
|
+
};
|
|
48
|
+
export type TaxRow = {
|
|
49
|
+
taxClass: TaxClassRecord;
|
|
50
|
+
regime: TaxRegimeRecord | null;
|
|
51
|
+
};
|
|
52
|
+
export type TaxPolicyProfileRecord = {
|
|
53
|
+
id: string;
|
|
54
|
+
code: string;
|
|
55
|
+
name: string;
|
|
56
|
+
jurisdiction: string | null;
|
|
57
|
+
description: string | null;
|
|
58
|
+
active: boolean;
|
|
59
|
+
};
|
|
60
|
+
export type TaxPolicyRuleRecord = {
|
|
61
|
+
id: string;
|
|
62
|
+
profileId: string;
|
|
63
|
+
side: TaxPolicySide;
|
|
64
|
+
priority: number;
|
|
65
|
+
name: string;
|
|
66
|
+
appliesTo: TaxClassAppliesTo;
|
|
67
|
+
condition: Record<string, unknown> | null;
|
|
68
|
+
taxRegimeId: string;
|
|
69
|
+
active: boolean;
|
|
70
|
+
};
|
|
71
|
+
export type TaxFormState = {
|
|
72
|
+
taxClassLabel: string;
|
|
73
|
+
taxClassCode: string;
|
|
74
|
+
taxClassDescription: string;
|
|
75
|
+
regimeName: string;
|
|
76
|
+
regimeCode: TaxRegimeCode;
|
|
77
|
+
jurisdiction: string;
|
|
78
|
+
ratePercent: string;
|
|
79
|
+
regimeDescription: string;
|
|
80
|
+
legalReference: string;
|
|
81
|
+
lines: Array<{
|
|
82
|
+
key: string;
|
|
83
|
+
appliesTo: TaxClassAppliesTo;
|
|
84
|
+
regimeId: string;
|
|
85
|
+
}>;
|
|
86
|
+
active: boolean;
|
|
87
|
+
};
|
|
88
|
+
export type PolicyProfileFormState = {
|
|
89
|
+
name: string;
|
|
90
|
+
code: string;
|
|
91
|
+
jurisdiction: string;
|
|
92
|
+
description: string;
|
|
93
|
+
active: boolean;
|
|
94
|
+
};
|
|
95
|
+
export type PolicyRuleFormState = {
|
|
96
|
+
profileId: string;
|
|
97
|
+
side: TaxPolicySide;
|
|
98
|
+
priority: string;
|
|
99
|
+
name: string;
|
|
100
|
+
appliesTo: TaxClassAppliesTo;
|
|
101
|
+
conditionMode: TaxPolicyConditionMode;
|
|
102
|
+
conditions: Array<{
|
|
103
|
+
key: string;
|
|
104
|
+
fact: TaxPolicyConditionFact;
|
|
105
|
+
operator: TaxPolicyConditionOperator;
|
|
106
|
+
value: string;
|
|
107
|
+
}>;
|
|
108
|
+
taxRegimeId: string;
|
|
109
|
+
active: boolean;
|
|
110
|
+
};
|
|
111
|
+
export declare const EMPTY_FORM: TaxFormState;
|
|
112
|
+
export declare const EMPTY_POLICY_PROFILE_FORM: PolicyProfileFormState;
|
|
113
|
+
export declare const EMPTY_POLICY_RULE_FORM: PolicyRuleFormState;
|
|
114
|
+
export declare function nextTaxClassLineKey(seed?: string): string;
|
|
115
|
+
export declare function nextTaxPolicyConditionKey(seed?: string): string;
|
|
116
|
+
export declare function initialForm(row: TaxRow | undefined): TaxFormState;
|
|
117
|
+
export declare function initialPolicyProfileForm(profile: TaxPolicyProfileRecord | undefined): PolicyProfileFormState;
|
|
118
|
+
export declare function initialPolicyRuleForm(rule: TaxPolicyRuleRecord | undefined, profileId: string, taxRegimeId: string): PolicyRuleFormState;
|
|
119
|
+
export declare function parsePolicyCondition(condition: Record<string, unknown> | null): Pick<PolicyRuleFormState, "conditionMode" | "conditions">;
|
|
120
|
+
export declare function parsePolicyConditionExpression(expression: unknown): PolicyRuleFormState["conditions"][number] | null;
|
|
121
|
+
export declare function toSlug(value: string): string;
|
|
122
|
+
export declare function formatRate(value: number | null): string;
|
|
123
|
+
export declare function appliesToLabel(messages: FinanceUiMessages, appliesTo: TaxClassAppliesTo): string;
|
|
124
|
+
export declare function summarizeCondition(messages: FinanceUiMessages, condition: Record<string, unknown> | null): string;
|
|
125
|
+
export declare function summarizeConditionRow(messages: FinanceUiMessages, condition: PolicyRuleFormState["conditions"][number]): string;
|
|
126
|
+
export declare function normalizeCondition(condition: PolicyRuleFormState["conditions"][number]): PolicyRuleFormState["conditions"][number];
|
|
127
|
+
export declare function buildPolicyCondition(form: PolicyRuleFormState, taxMessages: FinanceUiMessages["taxesPage"]): Record<string, unknown>;
|
|
128
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/components/taxes-page/shared.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
import { createContext, useContext } from "react";
|
|
2
|
+
export const TAX_CODE_OPTIONS = [
|
|
3
|
+
"standard",
|
|
4
|
+
"reduced",
|
|
5
|
+
"exempt",
|
|
6
|
+
"reverse_charge",
|
|
7
|
+
"margin_scheme_art311",
|
|
8
|
+
"zero_rated",
|
|
9
|
+
"out_of_scope",
|
|
10
|
+
"other",
|
|
11
|
+
];
|
|
12
|
+
export const TaxesPageApiContext = createContext(null);
|
|
13
|
+
export function joinUrl(baseUrl, path) {
|
|
14
|
+
const trimmedBase = baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl;
|
|
15
|
+
const trimmedPath = path.startsWith("/") ? path : `/${path}`;
|
|
16
|
+
return `${trimmedBase}${trimmedPath}`;
|
|
17
|
+
}
|
|
18
|
+
export async function readJson(response) {
|
|
19
|
+
if (!response.ok) {
|
|
20
|
+
let body;
|
|
21
|
+
try {
|
|
22
|
+
body = await response.json();
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
body = await response.text().catch(() => undefined);
|
|
26
|
+
}
|
|
27
|
+
const message = typeof body === "object" && body !== null && "error" in body
|
|
28
|
+
? String(body.error)
|
|
29
|
+
: `API error: ${response.status} ${response.statusText}`;
|
|
30
|
+
throw new Error(message);
|
|
31
|
+
}
|
|
32
|
+
if (response.status === 204)
|
|
33
|
+
return undefined;
|
|
34
|
+
return response.json();
|
|
35
|
+
}
|
|
36
|
+
export function createTaxesPageApi(baseUrl, fetcher) {
|
|
37
|
+
const request = async (path, init = {}) => {
|
|
38
|
+
const headers = new Headers(init.headers);
|
|
39
|
+
if (init.body !== undefined && !headers.has("Content-Type")) {
|
|
40
|
+
headers.set("Content-Type", "application/json");
|
|
41
|
+
}
|
|
42
|
+
return readJson(await fetcher(joinUrl(baseUrl, path), { ...init, headers }));
|
|
43
|
+
};
|
|
44
|
+
const api = {
|
|
45
|
+
get: (path) => request(path, { method: "GET" }),
|
|
46
|
+
post: (path, body) => request(path, {
|
|
47
|
+
method: "POST",
|
|
48
|
+
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
49
|
+
}),
|
|
50
|
+
patch: (path, body) => request(path, {
|
|
51
|
+
method: "PATCH", // i18n-literal-ok HTTP method
|
|
52
|
+
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
53
|
+
}),
|
|
54
|
+
delete: (path) => request(path, { method: "DELETE" }), // i18n-literal-ok HTTP method
|
|
55
|
+
};
|
|
56
|
+
return api;
|
|
57
|
+
}
|
|
58
|
+
export function useTaxesPageApi() {
|
|
59
|
+
const api = useContext(TaxesPageApiContext);
|
|
60
|
+
if (!api)
|
|
61
|
+
throw new Error("TaxesPage requires a TaxesPageApiContext provider");
|
|
62
|
+
return api;
|
|
63
|
+
}
|
|
64
|
+
export const TAX_CLASS_APPLIES_TO_OPTIONS = [
|
|
65
|
+
"base",
|
|
66
|
+
"addon",
|
|
67
|
+
"accommodation",
|
|
68
|
+
"all",
|
|
69
|
+
];
|
|
70
|
+
export const TAX_POLICY_CONDITION_FACT_OPTIONS = [
|
|
71
|
+
"hasAccommodation",
|
|
72
|
+
"accommodationCountries",
|
|
73
|
+
];
|
|
74
|
+
export const EMPTY_FORM = {
|
|
75
|
+
taxClassLabel: "",
|
|
76
|
+
taxClassCode: "",
|
|
77
|
+
taxClassDescription: "",
|
|
78
|
+
regimeName: "",
|
|
79
|
+
regimeCode: "standard",
|
|
80
|
+
jurisdiction: "RO",
|
|
81
|
+
ratePercent: "0",
|
|
82
|
+
regimeDescription: "",
|
|
83
|
+
legalReference: "",
|
|
84
|
+
lines: [],
|
|
85
|
+
active: true,
|
|
86
|
+
};
|
|
87
|
+
export const EMPTY_POLICY_PROFILE_FORM = {
|
|
88
|
+
name: "",
|
|
89
|
+
code: "",
|
|
90
|
+
jurisdiction: "RO",
|
|
91
|
+
description: "",
|
|
92
|
+
active: true,
|
|
93
|
+
};
|
|
94
|
+
export const EMPTY_POLICY_RULE_FORM = {
|
|
95
|
+
profileId: "",
|
|
96
|
+
side: "sell",
|
|
97
|
+
priority: "100",
|
|
98
|
+
name: "",
|
|
99
|
+
appliesTo: "all",
|
|
100
|
+
conditionMode: "always",
|
|
101
|
+
conditions: [],
|
|
102
|
+
taxRegimeId: "",
|
|
103
|
+
active: true,
|
|
104
|
+
};
|
|
105
|
+
let taxClassLineKey = 0;
|
|
106
|
+
let taxPolicyConditionKey = 0;
|
|
107
|
+
export function nextTaxClassLineKey(seed = "line") {
|
|
108
|
+
taxClassLineKey += 1;
|
|
109
|
+
return `${seed}-${taxClassLineKey}`;
|
|
110
|
+
}
|
|
111
|
+
export function nextTaxPolicyConditionKey(seed = "condition") {
|
|
112
|
+
taxPolicyConditionKey += 1;
|
|
113
|
+
return `${seed}-${taxPolicyConditionKey}`;
|
|
114
|
+
}
|
|
115
|
+
export function initialForm(row) {
|
|
116
|
+
if (!row)
|
|
117
|
+
return EMPTY_FORM;
|
|
118
|
+
return {
|
|
119
|
+
taxClassLabel: row.taxClass.label,
|
|
120
|
+
taxClassCode: row.taxClass.code,
|
|
121
|
+
taxClassDescription: row.taxClass.description ?? "",
|
|
122
|
+
regimeName: row.regime?.name ?? row.taxClass.label,
|
|
123
|
+
regimeCode: row.regime?.code ?? "other",
|
|
124
|
+
jurisdiction: row.regime?.jurisdiction ?? "RO",
|
|
125
|
+
ratePercent: row.regime?.ratePercent != null ? String(row.regime.ratePercent) : "0",
|
|
126
|
+
regimeDescription: row.regime?.description ?? "",
|
|
127
|
+
legalReference: row.regime?.legalReference ?? "",
|
|
128
|
+
lines: (row.taxClass.lines ?? []).map((line) => ({
|
|
129
|
+
key: nextTaxClassLineKey(`${line.applies_to}-${line.regime_id}`),
|
|
130
|
+
appliesTo: line.applies_to,
|
|
131
|
+
regimeId: line.regime_id,
|
|
132
|
+
})),
|
|
133
|
+
active: row.taxClass.active,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
export function initialPolicyProfileForm(profile) {
|
|
137
|
+
if (!profile)
|
|
138
|
+
return EMPTY_POLICY_PROFILE_FORM;
|
|
139
|
+
return {
|
|
140
|
+
name: profile.name,
|
|
141
|
+
code: profile.code,
|
|
142
|
+
jurisdiction: profile.jurisdiction ?? "",
|
|
143
|
+
description: profile.description ?? "",
|
|
144
|
+
active: profile.active,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
export function initialPolicyRuleForm(rule, profileId, taxRegimeId) {
|
|
148
|
+
if (!rule) {
|
|
149
|
+
return {
|
|
150
|
+
...EMPTY_POLICY_RULE_FORM,
|
|
151
|
+
profileId,
|
|
152
|
+
taxRegimeId,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
return {
|
|
156
|
+
profileId: rule.profileId,
|
|
157
|
+
side: rule.side,
|
|
158
|
+
priority: String(rule.priority),
|
|
159
|
+
name: rule.name,
|
|
160
|
+
appliesTo: rule.appliesTo,
|
|
161
|
+
...parsePolicyCondition(rule.condition),
|
|
162
|
+
taxRegimeId: rule.taxRegimeId,
|
|
163
|
+
active: rule.active,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
export function parsePolicyCondition(condition) {
|
|
167
|
+
if (!condition || condition.always === true) {
|
|
168
|
+
return { conditionMode: "always", conditions: [] };
|
|
169
|
+
}
|
|
170
|
+
const group = Array.isArray(condition.all)
|
|
171
|
+
? { mode: "all", expressions: condition.all }
|
|
172
|
+
: Array.isArray(condition.any)
|
|
173
|
+
? { mode: "any", expressions: condition.any }
|
|
174
|
+
: { mode: "all", expressions: [condition] };
|
|
175
|
+
const conditions = group.expressions
|
|
176
|
+
.map(parsePolicyConditionExpression)
|
|
177
|
+
.filter((row) => Boolean(row));
|
|
178
|
+
return {
|
|
179
|
+
conditionMode: conditions.length ? group.mode : "always",
|
|
180
|
+
conditions,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
export function parsePolicyConditionExpression(expression) {
|
|
184
|
+
if (typeof expression !== "object" || expression === null || Array.isArray(expression)) {
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
const record = expression;
|
|
188
|
+
if (record.fact === "hasAccommodation") {
|
|
189
|
+
return {
|
|
190
|
+
key: nextTaxPolicyConditionKey("has-accommodation"),
|
|
191
|
+
fact: "hasAccommodation",
|
|
192
|
+
operator: "eq",
|
|
193
|
+
value: record.eq === false ? "false" : "true",
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
if (record.fact === "accommodationCountries") {
|
|
197
|
+
return {
|
|
198
|
+
key: nextTaxPolicyConditionKey("accommodation-countries"),
|
|
199
|
+
fact: "accommodationCountries",
|
|
200
|
+
operator: "contains",
|
|
201
|
+
value: typeof record.contains === "string" ? record.contains : "RO", // i18n-literal-ok ISO country default
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
return null;
|
|
205
|
+
}
|
|
206
|
+
export function toSlug(value) {
|
|
207
|
+
return value
|
|
208
|
+
.trim()
|
|
209
|
+
.toLowerCase()
|
|
210
|
+
.normalize("NFKD")
|
|
211
|
+
.replace(/[\u0300-\u036f]/g, "")
|
|
212
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
213
|
+
.replace(/^-+|-+$/g, "");
|
|
214
|
+
}
|
|
215
|
+
export function formatRate(value) {
|
|
216
|
+
return value == null ? "-" : `${value}%`;
|
|
217
|
+
}
|
|
218
|
+
export function appliesToLabel(messages, appliesTo) {
|
|
219
|
+
const taxMessages = messages.taxesPage;
|
|
220
|
+
switch (appliesTo) {
|
|
221
|
+
case "base":
|
|
222
|
+
return taxMessages.appliesToBase;
|
|
223
|
+
case "addon":
|
|
224
|
+
return taxMessages.appliesToAddon;
|
|
225
|
+
case "accommodation":
|
|
226
|
+
return taxMessages.appliesToAccommodation;
|
|
227
|
+
case "all":
|
|
228
|
+
return taxMessages.appliesToAll;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
export function summarizeCondition(messages, condition) {
|
|
232
|
+
const taxMessages = messages.taxesPage;
|
|
233
|
+
if (!condition)
|
|
234
|
+
return "-";
|
|
235
|
+
if (condition.always === true)
|
|
236
|
+
return taxMessages.policyConditionAlways;
|
|
237
|
+
const parsed = parsePolicyCondition(condition);
|
|
238
|
+
if (parsed.conditionMode === "always")
|
|
239
|
+
return taxMessages.policyConditionAlways;
|
|
240
|
+
const prefix = parsed.conditionMode === "all"
|
|
241
|
+
? taxMessages.policyConditionModeAll
|
|
242
|
+
: taxMessages.policyConditionModeAny;
|
|
243
|
+
const labels = parsed.conditions.map((row) => summarizeConditionRow(messages, row));
|
|
244
|
+
return `${prefix}: ${labels.join("; ")}`;
|
|
245
|
+
}
|
|
246
|
+
export function summarizeConditionRow(messages, condition) {
|
|
247
|
+
const taxMessages = messages.taxesPage;
|
|
248
|
+
if (condition.fact === "hasAccommodation") {
|
|
249
|
+
return `${taxMessages.policyFactHasAccommodation} ${condition.value === "false" ? taxMessages.policyValueNo : taxMessages.policyValueYes}`;
|
|
250
|
+
}
|
|
251
|
+
if (condition.fact === "accommodationCountries") {
|
|
252
|
+
return `${taxMessages.policyFactAccommodationCountries} ${taxMessages.policyOperatorContains} ${condition.value}`;
|
|
253
|
+
}
|
|
254
|
+
return "custom";
|
|
255
|
+
}
|
|
256
|
+
export function normalizeCondition(condition) {
|
|
257
|
+
if (condition.fact === "hasAccommodation") {
|
|
258
|
+
return {
|
|
259
|
+
...condition,
|
|
260
|
+
operator: "eq",
|
|
261
|
+
value: condition.value === "false" ? "false" : "true",
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
return {
|
|
265
|
+
...condition,
|
|
266
|
+
operator: "contains",
|
|
267
|
+
value: condition.value.trim().toUpperCase() || "RO",
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
export function buildPolicyCondition(form, taxMessages) {
|
|
271
|
+
if (form.conditionMode === "always") {
|
|
272
|
+
return { always: true };
|
|
273
|
+
}
|
|
274
|
+
const expressions = form.conditions.map((row) => {
|
|
275
|
+
const condition = normalizeCondition(row);
|
|
276
|
+
if (condition.fact === "hasAccommodation") {
|
|
277
|
+
return { fact: "hasAccommodation", eq: condition.value === "true" };
|
|
278
|
+
}
|
|
279
|
+
if (!/^[A-Z]{2}$/.test(condition.value)) {
|
|
280
|
+
throw new Error(taxMessages.validationPolicyRuleConditionInvalid);
|
|
281
|
+
}
|
|
282
|
+
return { fact: "accommodationCountries", contains: condition.value };
|
|
283
|
+
});
|
|
284
|
+
if (!expressions.length) {
|
|
285
|
+
throw new Error(taxMessages.validationPolicyRuleConditionInvalid);
|
|
286
|
+
}
|
|
287
|
+
return form.conditionMode === "all" ? { all: expressions } : { any: expressions };
|
|
288
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sheets.d.ts","sourceRoot":"","sources":["../../../src/components/taxes-page/sheets.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { TaxRegimeRecord, TaxRow } from "./shared.js";
|
|
2
|
+
export declare function TaxSheet({ open, onOpenChange, row, onSuccess, taxRegimes, }: {
|
|
3
|
+
open: boolean;
|
|
4
|
+
onOpenChange: (open: boolean) => void;
|
|
5
|
+
row?: TaxRow;
|
|
6
|
+
onSuccess: () => void;
|
|
7
|
+
taxRegimes: TaxRegimeRecord[];
|
|
8
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
//# sourceMappingURL=tax-sheet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tax-sheet.d.ts","sourceRoot":"","sources":["../../../src/components/taxes-page/tax-sheet.tsx"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAIV,eAAe,EACf,MAAM,EACP,MAAM,aAAa,CAAA;AAYpB,wBAAgB,QAAQ,CAAC,EACvB,IAAI,EACJ,YAAY,EACZ,GAAG,EACH,SAAS,EACT,UAAU,GACX,EAAE;IACD,IAAI,EAAE,OAAO,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,UAAU,EAAE,eAAe,EAAE,CAAA;CAC9B,2CAwVA"}
|