@spaceinvoices/react-ui 0.4.1 → 0.4.2
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/registry.json +25 -0
- package/src/components/advance-invoices/advance-invoices.hooks.ts +32 -2
- package/src/components/advance-invoices/create/create-advance-invoice-form.tsx +109 -4
- 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 +2 -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 +2 -0
- package/src/components/advance-invoices/create/locales/pt.ts +2 -0
- package/src/components/advance-invoices/create/locales/sl.ts +2 -0
- package/src/components/advance-invoices/create/prepare-advance-invoice-submission.ts +17 -0
- package/src/components/advance-invoices/list/list-row-actions.tsx +3 -6
- package/src/components/advance-invoices/list/list-table.tsx +45 -2
- package/src/components/advance-invoices/list/locales/de.ts +3 -0
- package/src/components/advance-invoices/list/locales/en.ts +3 -0
- package/src/components/advance-invoices/list/locales/es.ts +3 -0
- package/src/components/advance-invoices/list/locales/fr.ts +3 -0
- package/src/components/advance-invoices/list/locales/hr.ts +3 -0
- package/src/components/advance-invoices/list/locales/it.ts +3 -0
- package/src/components/advance-invoices/list/locales/nl.ts +3 -0
- package/src/components/advance-invoices/list/locales/pl.ts +3 -0
- package/src/components/advance-invoices/list/locales/pt.ts +3 -0
- package/src/components/advance-invoices/list/locales/sl.ts +3 -0
- package/src/components/credit-notes/create/create-credit-note-form.tsx +177 -6
- package/src/components/credit-notes/create/locales/de.ts +8 -0
- package/src/components/credit-notes/create/locales/es.ts +8 -0
- package/src/components/credit-notes/create/locales/fr.ts +7 -0
- package/src/components/credit-notes/create/locales/hr.ts +7 -0
- package/src/components/credit-notes/create/locales/it.ts +9 -0
- package/src/components/credit-notes/create/locales/nl.ts +7 -0
- package/src/components/credit-notes/create/locales/pl.ts +7 -0
- package/src/components/credit-notes/create/locales/pt.ts +7 -0
- package/src/components/credit-notes/create/locales/sl.ts +7 -0
- package/src/components/credit-notes/credit-notes.hooks.ts +30 -0
- package/src/components/credit-notes/list/list-row-actions.tsx +3 -6
- package/src/components/credit-notes/list/list-table.tsx +45 -2
- package/src/components/credit-notes/list/locales/de.ts +3 -0
- package/src/components/credit-notes/list/locales/en.ts +3 -0
- package/src/components/credit-notes/list/locales/es.ts +3 -0
- package/src/components/credit-notes/list/locales/fr.ts +3 -0
- package/src/components/credit-notes/list/locales/hr.ts +3 -0
- package/src/components/credit-notes/list/locales/it.ts +3 -0
- package/src/components/credit-notes/list/locales/nl.ts +3 -0
- package/src/components/credit-notes/list/locales/pl.ts +3 -0
- package/src/components/credit-notes/list/locales/pt.ts +3 -0
- package/src/components/credit-notes/list/locales/sl.ts +3 -0
- package/src/components/customers/create-customer-form/create-customer-form.tsx +0 -1
- package/src/components/documents/create/document-details-section.tsx +67 -1
- package/src/components/documents/create/mark-as-paid-section.tsx +11 -2
- package/src/components/documents/view/document-actions-bar.tsx +30 -0
- package/src/components/documents/view/locales/de.ts +5 -0
- package/src/components/documents/view/locales/es.ts +5 -0
- package/src/components/documents/view/locales/fr.ts +5 -0
- package/src/components/documents/view/locales/hr.ts +5 -0
- package/src/components/documents/view/locales/it.ts +5 -0
- package/src/components/documents/view/locales/nl.ts +5 -0
- package/src/components/documents/view/locales/pl.ts +5 -0
- package/src/components/documents/view/locales/pt.ts +5 -0
- package/src/components/documents/view/locales/sl.ts +5 -0
- package/src/components/entities/create-entity-form.tsx +1 -1
- package/src/components/entities/entity-settings-form/entity-settings-form.tsx +2 -3
- package/src/components/entities/entity-settings-form/locales/es.ts +2 -0
- package/src/components/entities/entity-settings-form/locales/fr.ts +2 -0
- package/src/components/entities/entity-settings-form/locales/hr.ts +2 -0
- package/src/components/entities/entity-settings-form/locales/it.ts +2 -0
- package/src/components/entities/entity-settings-form/locales/nl.ts +2 -0
- package/src/components/entities/entity-settings-form/locales/pl.ts +2 -0
- package/src/components/entities/entity-settings-form/locales/pt.ts +2 -0
- package/src/components/entities/fina-settings-form/fina-operator-required-dialog.tsx +109 -0
- package/src/components/entities/fina-settings-form/fina-settings-form.tsx +365 -35
- package/src/components/entities/fina-settings-form/fina-settings.hooks.ts +101 -20
- package/src/components/entities/fina-settings-form/index.ts +1 -0
- package/src/components/entities/fina-settings-form/locales/de.ts +54 -34
- package/src/components/entities/fina-settings-form/locales/en.ts +51 -34
- package/src/components/entities/fina-settings-form/locales/es.ts +50 -34
- package/src/components/entities/fina-settings-form/locales/fr.ts +50 -34
- package/src/components/entities/fina-settings-form/locales/hr.ts +50 -34
- package/src/components/entities/fina-settings-form/locales/it.ts +50 -34
- package/src/components/entities/fina-settings-form/locales/nl.ts +50 -34
- package/src/components/entities/fina-settings-form/locales/pl.ts +50 -34
- package/src/components/entities/fina-settings-form/locales/pt.ts +50 -34
- package/src/components/entities/fina-settings-form/locales/sl.ts +50 -34
- package/src/components/entities/fina-settings-form/sections/certificate-settings-section.tsx +18 -0
- package/src/components/entities/fina-settings-form/sections/premises-management-section.tsx +64 -89
- package/src/components/entities/fina-settings-form/sections/register-premise-dialog.tsx +51 -323
- package/src/components/entities/furs-settings-form/furs-operator-required-dialog.tsx +106 -0
- package/src/components/entities/furs-settings-form/furs-settings-form.tsx +24 -10
- package/src/components/entities/furs-settings-form/furs-settings.hooks.ts +5 -9
- package/src/components/entities/furs-settings-form/index.ts +1 -0
- package/src/components/entities/furs-settings-form/locales/de.ts +27 -3
- package/src/components/entities/furs-settings-form/locales/en.ts +17 -3
- package/src/components/entities/furs-settings-form/locales/es.ts +26 -3
- package/src/components/entities/furs-settings-form/locales/fr.ts +26 -3
- package/src/components/entities/furs-settings-form/locales/hr.ts +26 -3
- package/src/components/entities/furs-settings-form/locales/it.ts +26 -3
- package/src/components/entities/furs-settings-form/locales/nl.ts +26 -3
- package/src/components/entities/furs-settings-form/locales/pl.ts +26 -3
- package/src/components/entities/furs-settings-form/locales/pt.ts +26 -3
- package/src/components/entities/furs-settings-form/locales/sl.ts +16 -3
- package/src/components/entities/furs-settings-form/sections/certificate-settings-section.tsx +22 -0
- package/src/components/entities/furs-settings-form/sections/general-settings-section.tsx +15 -2
- package/src/components/entities/furs-settings-form/sections/register-premise-dialog.tsx +14 -2
- package/src/components/entities/settings/tax-rules-settings-form.tsx +4 -4
- package/src/components/estimates/list/list-row-actions.tsx +3 -7
- package/src/components/estimates/list/list-table.tsx +35 -2
- package/src/components/estimates/list/locales/de.ts +3 -0
- package/src/components/estimates/list/locales/en.ts +3 -0
- package/src/components/estimates/list/locales/es.ts +3 -0
- package/src/components/estimates/list/locales/fr.ts +3 -0
- package/src/components/estimates/list/locales/hr.ts +3 -0
- package/src/components/estimates/list/locales/it.ts +3 -0
- package/src/components/estimates/list/locales/nl.ts +3 -0
- package/src/components/estimates/list/locales/pl.ts +3 -0
- package/src/components/estimates/list/locales/pt.ts +3 -0
- package/src/components/estimates/list/locales/sl.ts +3 -0
- package/src/components/export/document-export-form.tsx +34 -34
- package/src/components/invoices/create/create-invoice-form.tsx +107 -5
- package/src/components/invoices/create/prepare-invoice-submission.ts +17 -0
- package/src/components/invoices/invoices.hooks.ts +32 -2
- package/src/components/invoices/list/list-row-actions.tsx +23 -8
- package/src/components/invoices/list/list-table.tsx +53 -2
- package/src/components/invoices/list/locales/de.ts +4 -0
- package/src/components/invoices/list/locales/en.ts +4 -0
- package/src/components/invoices/list/locales/es.ts +4 -0
- package/src/components/invoices/list/locales/fr.ts +4 -0
- package/src/components/invoices/list/locales/hr.ts +4 -0
- package/src/components/invoices/list/locales/it.ts +4 -0
- package/src/components/invoices/list/locales/nl.ts +4 -0
- package/src/components/invoices/list/locales/pl.ts +4 -0
- package/src/components/invoices/list/locales/pt.ts +4 -0
- package/src/components/invoices/list/locales/sl.ts +4 -0
- package/src/components/invoices/view/fiscalization-status-card.tsx +4 -1
- package/src/components/items/item-list-table/item-list-row-actions.tsx +3 -7
- package/src/components/items/item-list-table/item-list-row.tsx +3 -2
- package/src/components/items/item-list-table/item-list-table.tsx +5 -1
- package/src/components/recurring-invoices/create-recurring-invoice-form/create-recurring-invoice-form.tsx +418 -0
- package/src/components/recurring-invoices/create-recurring-invoice-form/locales/de.ts +45 -0
- package/src/components/recurring-invoices/create-recurring-invoice-form/locales/es.ts +44 -0
- package/src/components/recurring-invoices/create-recurring-invoice-form/locales/fr.ts +44 -0
- package/src/components/recurring-invoices/create-recurring-invoice-form/locales/hr.ts +44 -0
- package/src/components/recurring-invoices/create-recurring-invoice-form/locales/it.ts +44 -0
- package/src/components/recurring-invoices/create-recurring-invoice-form/locales/nl.ts +44 -0
- package/src/components/recurring-invoices/create-recurring-invoice-form/locales/pl.ts +44 -0
- package/src/components/recurring-invoices/create-recurring-invoice-form/locales/pt.ts +44 -0
- package/src/components/recurring-invoices/create-recurring-invoice-form/locales/sl.ts +44 -0
- package/src/components/recurring-invoices/index.ts +3 -0
- package/src/components/recurring-invoices/list/index.ts +2 -0
- package/src/components/recurring-invoices/list/list-row-actions.tsx +139 -0
- package/src/components/recurring-invoices/list/list-table.tsx +179 -0
- package/src/components/recurring-invoices/list/locales/de.ts +27 -0
- package/src/components/recurring-invoices/list/locales/en.ts +5 -0
- package/src/components/recurring-invoices/list/locales/es.ts +27 -0
- package/src/components/recurring-invoices/list/locales/fr.ts +27 -0
- package/src/components/recurring-invoices/list/locales/hr.ts +27 -0
- package/src/components/recurring-invoices/list/locales/it.ts +27 -0
- package/src/components/recurring-invoices/list/locales/nl.ts +27 -0
- package/src/components/recurring-invoices/list/locales/pl.ts +27 -0
- package/src/components/recurring-invoices/list/locales/pt.ts +27 -0
- package/src/components/recurring-invoices/list/locales/sl.ts +27 -0
- package/src/components/recurring-invoices/recurring-invoices.hooks.ts +28 -0
- package/src/components/table/data-table.tsx +122 -5
- package/src/components/table/selection-toolbar.tsx +36 -0
- package/src/components/tax-reports/kir-export-form.tsx +75 -55
- package/src/components/taxes/tax-list-table/tax-list-row-actions.tsx +3 -6
- package/src/components/taxes/tax-list-table/tax-list-row.tsx +3 -2
- package/src/components/taxes/tax-list-table/tax-list-table.tsx +5 -1
- package/src/components/ui/checkbox.tsx +5 -5
- package/src/generate-schemas.ts +45 -18
- package/src/generated/schemas/authorizeshopify_body.ts +22 -0
- package/src/generated/schemas/creditnote.ts +0 -2
- package/src/generated/schemas/entity.ts +1 -1
- package/src/generated/schemas/index.ts +39 -28
- package/src/generated/schemas/order.ts +127 -0
- package/src/generated/schemas/orderintegration.ts +51 -0
- package/src/generated/schemas/payment.ts +2 -0
- package/src/generated/schemas/recurringinvoice.ts +61 -0
- package/src/generated/schemas/renderadvanceinvoicepreview_body.ts +107 -140
- package/src/generated/schemas/rendercreditnotepreview_body.ts +108 -141
- package/src/generated/schemas/renderestimatepreview_body.ts +78 -82
- package/src/generated/schemas/renderinvoicepreview_body.ts +108 -141
- package/src/generated/schemas/webhook.ts +42 -0
- package/src/lib/furs-error-utils.ts +36 -0
- package/src/lib/schemas/advance-invoice.ts +3 -3
- package/src/lib/schemas/credit-note.ts +3 -3
- package/src/lib/schemas/estimate.ts +3 -3
- package/src/lib/schemas/invoice.ts +3 -3
- package/src/providers/white-label-provider.tsx +3 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
Name: "Naam",
|
|
3
|
+
"Enter schedule name": "Voer schemanaam in",
|
|
4
|
+
Frequency: "Frequentie",
|
|
5
|
+
"Select frequency": "Selecteer frequentie",
|
|
6
|
+
Daily: "Dagelijks",
|
|
7
|
+
Weekly: "Wekelijks",
|
|
8
|
+
Monthly: "Maandelijks",
|
|
9
|
+
Yearly: "Jaarlijks",
|
|
10
|
+
Interval: "Interval",
|
|
11
|
+
"Day of Week": "Dag van de week",
|
|
12
|
+
"Select day": "Selecteer dag",
|
|
13
|
+
Sunday: "Zondag",
|
|
14
|
+
Monday: "Maandag",
|
|
15
|
+
Tuesday: "Dinsdag",
|
|
16
|
+
Wednesday: "Woensdag",
|
|
17
|
+
Thursday: "Donderdag",
|
|
18
|
+
Friday: "Vrijdag",
|
|
19
|
+
Saturday: "Zaterdag",
|
|
20
|
+
"Day of Month": "Dag van de maand",
|
|
21
|
+
Month: "Maand",
|
|
22
|
+
"Select month": "Selecteer maand",
|
|
23
|
+
January: "Januari",
|
|
24
|
+
February: "Februari",
|
|
25
|
+
March: "Maart",
|
|
26
|
+
April: "April",
|
|
27
|
+
May: "Mei",
|
|
28
|
+
June: "Juni",
|
|
29
|
+
July: "Juli",
|
|
30
|
+
August: "Augustus",
|
|
31
|
+
September: "September",
|
|
32
|
+
October: "Oktober",
|
|
33
|
+
November: "November",
|
|
34
|
+
December: "December",
|
|
35
|
+
"Start Date": "Startdatum",
|
|
36
|
+
"End Date": "Einddatum",
|
|
37
|
+
"Pick a date": "Kies een datum",
|
|
38
|
+
"No end date": "Geen einddatum",
|
|
39
|
+
"Auto-send": "Automatisch verzenden",
|
|
40
|
+
"Automatically email generated invoices": "Automatisch gegenereerde facturen per e-mail verzenden",
|
|
41
|
+
"Create as draft": "Aanmaken als concept",
|
|
42
|
+
"Generated invoices will be drafts for review": "Gegenereerde facturen worden concepten ter beoordeling",
|
|
43
|
+
"There was an error creating the schedule": "Er is een fout opgetreden bij het aanmaken van het schema",
|
|
44
|
+
} as const;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
Name: "Nazwa",
|
|
3
|
+
"Enter schedule name": "Wprowadź nazwę harmonogramu",
|
|
4
|
+
Frequency: "Częstotliwość",
|
|
5
|
+
"Select frequency": "Wybierz częstotliwość",
|
|
6
|
+
Daily: "Codziennie",
|
|
7
|
+
Weekly: "Tygodniowo",
|
|
8
|
+
Monthly: "Miesięcznie",
|
|
9
|
+
Yearly: "Rocznie",
|
|
10
|
+
Interval: "Interwał",
|
|
11
|
+
"Day of Week": "Dzień tygodnia",
|
|
12
|
+
"Select day": "Wybierz dzień",
|
|
13
|
+
Sunday: "Niedziela",
|
|
14
|
+
Monday: "Poniedziałek",
|
|
15
|
+
Tuesday: "Wtorek",
|
|
16
|
+
Wednesday: "Środa",
|
|
17
|
+
Thursday: "Czwartek",
|
|
18
|
+
Friday: "Piątek",
|
|
19
|
+
Saturday: "Sobota",
|
|
20
|
+
"Day of Month": "Dzień miesiąca",
|
|
21
|
+
Month: "Miesiąc",
|
|
22
|
+
"Select month": "Wybierz miesiąc",
|
|
23
|
+
January: "Styczeń",
|
|
24
|
+
February: "Luty",
|
|
25
|
+
March: "Marzec",
|
|
26
|
+
April: "Kwiecień",
|
|
27
|
+
May: "Maj",
|
|
28
|
+
June: "Czerwiec",
|
|
29
|
+
July: "Lipiec",
|
|
30
|
+
August: "Sierpień",
|
|
31
|
+
September: "Wrzesień",
|
|
32
|
+
October: "Październik",
|
|
33
|
+
November: "Listopad",
|
|
34
|
+
December: "Grudzień",
|
|
35
|
+
"Start Date": "Data rozpoczęcia",
|
|
36
|
+
"End Date": "Data zakończenia",
|
|
37
|
+
"Pick a date": "Wybierz datę",
|
|
38
|
+
"No end date": "Bez daty zakończenia",
|
|
39
|
+
"Auto-send": "Automatyczne wysyłanie",
|
|
40
|
+
"Automatically email generated invoices": "Automatycznie wysyłaj wygenerowane faktury e-mailem",
|
|
41
|
+
"Create as draft": "Utwórz jako wersję roboczą",
|
|
42
|
+
"Generated invoices will be drafts for review": "Wygenerowane faktury będą wersjami roboczymi do przeglądu",
|
|
43
|
+
"There was an error creating the schedule": "Wystąpił błąd podczas tworzenia harmonogramu",
|
|
44
|
+
} as const;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
Name: "Nome",
|
|
3
|
+
"Enter schedule name": "Insira o nome do agendamento",
|
|
4
|
+
Frequency: "Frequência",
|
|
5
|
+
"Select frequency": "Selecionar frequência",
|
|
6
|
+
Daily: "Diário",
|
|
7
|
+
Weekly: "Semanal",
|
|
8
|
+
Monthly: "Mensal",
|
|
9
|
+
Yearly: "Anual",
|
|
10
|
+
Interval: "Intervalo",
|
|
11
|
+
"Day of Week": "Dia da semana",
|
|
12
|
+
"Select day": "Selecionar dia",
|
|
13
|
+
Sunday: "Domingo",
|
|
14
|
+
Monday: "Segunda-feira",
|
|
15
|
+
Tuesday: "Terça-feira",
|
|
16
|
+
Wednesday: "Quarta-feira",
|
|
17
|
+
Thursday: "Quinta-feira",
|
|
18
|
+
Friday: "Sexta-feira",
|
|
19
|
+
Saturday: "Sábado",
|
|
20
|
+
"Day of Month": "Dia do mês",
|
|
21
|
+
Month: "Mês",
|
|
22
|
+
"Select month": "Selecionar mês",
|
|
23
|
+
January: "Janeiro",
|
|
24
|
+
February: "Fevereiro",
|
|
25
|
+
March: "Março",
|
|
26
|
+
April: "Abril",
|
|
27
|
+
May: "Maio",
|
|
28
|
+
June: "Junho",
|
|
29
|
+
July: "Julho",
|
|
30
|
+
August: "Agosto",
|
|
31
|
+
September: "Setembro",
|
|
32
|
+
October: "Outubro",
|
|
33
|
+
November: "Novembro",
|
|
34
|
+
December: "Dezembro",
|
|
35
|
+
"Start Date": "Data de início",
|
|
36
|
+
"End Date": "Data de fim",
|
|
37
|
+
"Pick a date": "Escolher data",
|
|
38
|
+
"No end date": "Sem data de fim",
|
|
39
|
+
"Auto-send": "Envio automático",
|
|
40
|
+
"Automatically email generated invoices": "Enviar automaticamente faturas geradas por e-mail",
|
|
41
|
+
"Create as draft": "Criar como rascunho",
|
|
42
|
+
"Generated invoices will be drafts for review": "As faturas geradas serão rascunhos para revisão",
|
|
43
|
+
"There was an error creating the schedule": "Ocorreu um erro ao criar o agendamento",
|
|
44
|
+
} as const;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
Name: "Ime",
|
|
3
|
+
"Enter schedule name": "Vnesite ime urnika",
|
|
4
|
+
Frequency: "Pogostost",
|
|
5
|
+
"Select frequency": "Izberite pogostost",
|
|
6
|
+
Daily: "Dnevno",
|
|
7
|
+
Weekly: "Tedensko",
|
|
8
|
+
Monthly: "Mesečno",
|
|
9
|
+
Yearly: "Letno",
|
|
10
|
+
Interval: "Interval",
|
|
11
|
+
"Day of Week": "Dan v tednu",
|
|
12
|
+
"Select day": "Izberite dan",
|
|
13
|
+
Sunday: "Nedelja",
|
|
14
|
+
Monday: "Ponedeljek",
|
|
15
|
+
Tuesday: "Torek",
|
|
16
|
+
Wednesday: "Sreda",
|
|
17
|
+
Thursday: "Četrtek",
|
|
18
|
+
Friday: "Petek",
|
|
19
|
+
Saturday: "Sobota",
|
|
20
|
+
"Day of Month": "Dan v mesecu",
|
|
21
|
+
Month: "Mesec",
|
|
22
|
+
"Select month": "Izberite mesec",
|
|
23
|
+
January: "Januar",
|
|
24
|
+
February: "Februar",
|
|
25
|
+
March: "Marec",
|
|
26
|
+
April: "April",
|
|
27
|
+
May: "Maj",
|
|
28
|
+
June: "Junij",
|
|
29
|
+
July: "Julij",
|
|
30
|
+
August: "Avgust",
|
|
31
|
+
September: "September",
|
|
32
|
+
October: "Oktober",
|
|
33
|
+
November: "November",
|
|
34
|
+
December: "December",
|
|
35
|
+
"Start Date": "Datum začetka",
|
|
36
|
+
"End Date": "Datum konca",
|
|
37
|
+
"Pick a date": "Izberite datum",
|
|
38
|
+
"No end date": "Brez datuma konca",
|
|
39
|
+
"Auto-send": "Samodejno pošlji",
|
|
40
|
+
"Automatically email generated invoices": "Samodejno pošlji ustvarjene račune po e-pošti",
|
|
41
|
+
"Create as draft": "Ustvari kot osnutek",
|
|
42
|
+
"Generated invoices will be drafts for review": "Ustvarjeni računi bodo osnutki za pregled",
|
|
43
|
+
"There was an error creating the schedule": "Prišlo je do napake pri ustvarjanju urnika",
|
|
44
|
+
} as const;
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import type { RecurringInvoice } from "@spaceinvoices/js-sdk";
|
|
2
|
+
import { useQueryClient } from "@tanstack/react-query";
|
|
3
|
+
import { Eye, MoreHorizontal, Pause, Play, Trash2 } from "lucide-react";
|
|
4
|
+
import { useState } from "react";
|
|
5
|
+
import { Button } from "@/ui/components/ui/button";
|
|
6
|
+
import {
|
|
7
|
+
DropdownMenu,
|
|
8
|
+
DropdownMenuContent,
|
|
9
|
+
DropdownMenuGroup,
|
|
10
|
+
DropdownMenuItem,
|
|
11
|
+
DropdownMenuLabel,
|
|
12
|
+
DropdownMenuSeparator,
|
|
13
|
+
DropdownMenuTrigger,
|
|
14
|
+
} from "@/ui/components/ui/dropdown-menu";
|
|
15
|
+
import type { ComponentTranslationProps } from "@/ui/lib/translation";
|
|
16
|
+
import { createTranslation } from "@/ui/lib/translation";
|
|
17
|
+
import { useSDK } from "@/ui/providers/sdk-provider";
|
|
18
|
+
|
|
19
|
+
import { RECURRING_INVOICES_CACHE_KEY, useDeleteRecurringInvoice } from "../recurring-invoices.hooks";
|
|
20
|
+
import de from "./locales/de";
|
|
21
|
+
import es from "./locales/es";
|
|
22
|
+
import fr from "./locales/fr";
|
|
23
|
+
import hr from "./locales/hr";
|
|
24
|
+
import it from "./locales/it";
|
|
25
|
+
import nl from "./locales/nl";
|
|
26
|
+
import pl from "./locales/pl";
|
|
27
|
+
import pt from "./locales/pt";
|
|
28
|
+
import sl from "./locales/sl";
|
|
29
|
+
|
|
30
|
+
const translations = {
|
|
31
|
+
sl,
|
|
32
|
+
de,
|
|
33
|
+
it,
|
|
34
|
+
fr,
|
|
35
|
+
es,
|
|
36
|
+
pt,
|
|
37
|
+
nl,
|
|
38
|
+
pl,
|
|
39
|
+
hr,
|
|
40
|
+
} as const;
|
|
41
|
+
|
|
42
|
+
type RecurringInvoiceListRowActionsProps = {
|
|
43
|
+
recurringInvoice: RecurringInvoice;
|
|
44
|
+
entityId?: string;
|
|
45
|
+
onViewSourceInvoice?: (documentId: string) => void;
|
|
46
|
+
onDeleteSuccess?: () => void;
|
|
47
|
+
onDeleteError?: (error: string) => void;
|
|
48
|
+
} & ComponentTranslationProps;
|
|
49
|
+
|
|
50
|
+
export default function RecurringInvoiceListRowActions({
|
|
51
|
+
recurringInvoice,
|
|
52
|
+
entityId,
|
|
53
|
+
onViewSourceInvoice,
|
|
54
|
+
onDeleteSuccess,
|
|
55
|
+
onDeleteError,
|
|
56
|
+
...i18nProps
|
|
57
|
+
}: RecurringInvoiceListRowActionsProps) {
|
|
58
|
+
const t = createTranslation({
|
|
59
|
+
translations,
|
|
60
|
+
...i18nProps,
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
const { sdk } = useSDK();
|
|
64
|
+
const queryClient = useQueryClient();
|
|
65
|
+
const [isToggling, setIsToggling] = useState(false);
|
|
66
|
+
|
|
67
|
+
const { mutate: deleteRecurringInvoice, isPending: isDeleting } = useDeleteRecurringInvoice({
|
|
68
|
+
entityId,
|
|
69
|
+
onSuccess: () => {
|
|
70
|
+
onDeleteSuccess?.();
|
|
71
|
+
},
|
|
72
|
+
onError: (error: Error) => {
|
|
73
|
+
onDeleteError?.(error.message);
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
const handleDelete = () => {
|
|
78
|
+
deleteRecurringInvoice({ id: recurringInvoice.id });
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
const handleTogglePause = async () => {
|
|
82
|
+
if (!sdk) return;
|
|
83
|
+
setIsToggling(true);
|
|
84
|
+
try {
|
|
85
|
+
if (recurringInvoice.status === "active") {
|
|
86
|
+
await sdk.recurringInvoices.pauseRecurringInvoice(recurringInvoice.id);
|
|
87
|
+
} else {
|
|
88
|
+
await sdk.recurringInvoices.resumeRecurringInvoice(recurringInvoice.id);
|
|
89
|
+
}
|
|
90
|
+
queryClient.invalidateQueries({ queryKey: [RECURRING_INVOICES_CACHE_KEY] });
|
|
91
|
+
} catch (error) {
|
|
92
|
+
onDeleteError?.(error instanceof Error ? error.message : "Unknown error");
|
|
93
|
+
} finally {
|
|
94
|
+
setIsToggling(false);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
const isPaused = recurringInvoice.status === "paused";
|
|
99
|
+
|
|
100
|
+
return (
|
|
101
|
+
<DropdownMenu>
|
|
102
|
+
<DropdownMenuTrigger asChild>
|
|
103
|
+
<Button variant="ghost" className="h-8 w-8 cursor-pointer p-0" id="action-menu-trigger">
|
|
104
|
+
<span className="sr-only">{t("Open menu")}</span>
|
|
105
|
+
<MoreHorizontal className="h-4 w-4" />
|
|
106
|
+
</Button>
|
|
107
|
+
</DropdownMenuTrigger>
|
|
108
|
+
<DropdownMenuContent align="end">
|
|
109
|
+
<DropdownMenuLabel>{t("Actions")}</DropdownMenuLabel>
|
|
110
|
+
<DropdownMenuGroup>
|
|
111
|
+
{recurringInvoice.document_id && (
|
|
112
|
+
<DropdownMenuItem
|
|
113
|
+
className="cursor-pointer"
|
|
114
|
+
onClick={() => onViewSourceInvoice?.(recurringInvoice.document_id)}
|
|
115
|
+
>
|
|
116
|
+
<Eye className="h-4 w-4" />
|
|
117
|
+
{t("View source invoice")}
|
|
118
|
+
</DropdownMenuItem>
|
|
119
|
+
)}
|
|
120
|
+
<DropdownMenuItem className="cursor-pointer" onClick={handleTogglePause} disabled={isToggling}>
|
|
121
|
+
{isPaused ? <Play className="h-4 w-4" /> : <Pause className="h-4 w-4" />}
|
|
122
|
+
{isToggling ? t("Processing...") : isPaused ? t("Resume") : t("Pause")}
|
|
123
|
+
</DropdownMenuItem>
|
|
124
|
+
</DropdownMenuGroup>
|
|
125
|
+
<DropdownMenuSeparator />
|
|
126
|
+
<DropdownMenuGroup>
|
|
127
|
+
<DropdownMenuItem
|
|
128
|
+
className="cursor-pointer text-destructive focus:text-destructive"
|
|
129
|
+
onClick={handleDelete}
|
|
130
|
+
disabled={isDeleting}
|
|
131
|
+
>
|
|
132
|
+
<Trash2 className="h-4 w-4" />
|
|
133
|
+
{isDeleting ? t("Deleting...") : t("Delete schedule")}
|
|
134
|
+
</DropdownMenuItem>
|
|
135
|
+
</DropdownMenuGroup>
|
|
136
|
+
</DropdownMenuContent>
|
|
137
|
+
</DropdownMenu>
|
|
138
|
+
);
|
|
139
|
+
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import type { RecurringInvoice } from "@spaceinvoices/js-sdk";
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
import { DataTable } from "@/ui/components/table/data-table";
|
|
4
|
+
import { FormattedDate } from "@/ui/components/table/date-cell";
|
|
5
|
+
import { useTableFetch } from "@/ui/components/table/hooks/use-table-fetch";
|
|
6
|
+
import type { Column, ListTableProps, TableQueryParams, TableQueryResponse } from "@/ui/components/table/types";
|
|
7
|
+
import { Badge } from "@/ui/components/ui/badge";
|
|
8
|
+
import { createTranslation } from "@/ui/lib/translation";
|
|
9
|
+
import { useSDK } from "@/ui/providers/sdk-provider";
|
|
10
|
+
|
|
11
|
+
import RecurringInvoiceListRowActions from "./list-row-actions";
|
|
12
|
+
import de from "./locales/de";
|
|
13
|
+
import en from "./locales/en";
|
|
14
|
+
import es from "./locales/es";
|
|
15
|
+
import fr from "./locales/fr";
|
|
16
|
+
import hr from "./locales/hr";
|
|
17
|
+
import it from "./locales/it";
|
|
18
|
+
import nl from "./locales/nl";
|
|
19
|
+
import pl from "./locales/pl";
|
|
20
|
+
import pt from "./locales/pt";
|
|
21
|
+
import sl from "./locales/sl";
|
|
22
|
+
|
|
23
|
+
const translations = {
|
|
24
|
+
en,
|
|
25
|
+
sl,
|
|
26
|
+
de,
|
|
27
|
+
it,
|
|
28
|
+
fr,
|
|
29
|
+
es,
|
|
30
|
+
pt,
|
|
31
|
+
nl,
|
|
32
|
+
pl,
|
|
33
|
+
hr,
|
|
34
|
+
} as const;
|
|
35
|
+
|
|
36
|
+
function statusVariant(status: string): "default" | "secondary" | "outline" {
|
|
37
|
+
switch (status) {
|
|
38
|
+
case "active":
|
|
39
|
+
return "default";
|
|
40
|
+
case "paused":
|
|
41
|
+
return "secondary";
|
|
42
|
+
default:
|
|
43
|
+
return "outline";
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
type RecurringInvoiceListTableProps = {
|
|
48
|
+
t?: (key: string) => string;
|
|
49
|
+
namespace?: string;
|
|
50
|
+
locale?: string;
|
|
51
|
+
entityId?: string;
|
|
52
|
+
onViewSourceInvoice?: (documentId: string) => void;
|
|
53
|
+
onDeleteSuccess?: () => void;
|
|
54
|
+
onDeleteError?: (error: string) => void;
|
|
55
|
+
} & ListTableProps<RecurringInvoice>;
|
|
56
|
+
|
|
57
|
+
export default function RecurringInvoiceListTable({
|
|
58
|
+
queryParams,
|
|
59
|
+
onChangeParams,
|
|
60
|
+
entityId,
|
|
61
|
+
onViewSourceInvoice,
|
|
62
|
+
onDeleteSuccess,
|
|
63
|
+
onDeleteError,
|
|
64
|
+
...i18nProps
|
|
65
|
+
}: RecurringInvoiceListTableProps) {
|
|
66
|
+
const t = createTranslation({
|
|
67
|
+
translations,
|
|
68
|
+
...i18nProps,
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
const { sdk } = useSDK();
|
|
72
|
+
|
|
73
|
+
const handleFetch = useTableFetch(async (params: TableQueryParams) => {
|
|
74
|
+
if (!sdk) throw new Error("SDK not initialized");
|
|
75
|
+
if (!params.entity_id) throw new Error("Entity ID required");
|
|
76
|
+
|
|
77
|
+
const response = await sdk.recurringInvoices.list({
|
|
78
|
+
entity_id: params.entity_id,
|
|
79
|
+
limit: params.limit,
|
|
80
|
+
next_cursor: params.next_cursor,
|
|
81
|
+
prev_cursor: params.prev_cursor,
|
|
82
|
+
order_by: params.order_by,
|
|
83
|
+
search: params.search,
|
|
84
|
+
query: params.query,
|
|
85
|
+
});
|
|
86
|
+
return response as unknown as TableQueryResponse<RecurringInvoice>;
|
|
87
|
+
}, entityId);
|
|
88
|
+
|
|
89
|
+
const frequencyLabels: Record<string, string> = useMemo(
|
|
90
|
+
() => ({
|
|
91
|
+
daily: t("frequency.daily"),
|
|
92
|
+
weekly: t("frequency.weekly"),
|
|
93
|
+
monthly: t("frequency.monthly"),
|
|
94
|
+
yearly: t("frequency.yearly"),
|
|
95
|
+
}),
|
|
96
|
+
[t],
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
const columns: Column<RecurringInvoice>[] = useMemo(
|
|
100
|
+
() => [
|
|
101
|
+
{
|
|
102
|
+
id: "name",
|
|
103
|
+
header: t("Name"),
|
|
104
|
+
sortable: true,
|
|
105
|
+
cell: (ri) => <span className="font-medium">{ri.name}</span>,
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
id: "frequency",
|
|
109
|
+
header: t("Frequency"),
|
|
110
|
+
sortable: true,
|
|
111
|
+
cell: (ri) => {
|
|
112
|
+
const label = frequencyLabels[ri.frequency] ?? ri.frequency;
|
|
113
|
+
return ri.interval > 1 ? `${t("Every")} ${ri.interval} ${label.toLowerCase()}` : label;
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
id: "status",
|
|
118
|
+
header: t("Status"),
|
|
119
|
+
sortable: true,
|
|
120
|
+
cell: (ri) => <Badge variant={statusVariant(ri.status)}>{t(`status.${ri.status}`)}</Badge>,
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
id: "next_run_date",
|
|
124
|
+
header: t("Next Run"),
|
|
125
|
+
sortable: true,
|
|
126
|
+
cell: (ri) =>
|
|
127
|
+
ri.next_run_date ? (
|
|
128
|
+
<FormattedDate date={ri.next_run_date} />
|
|
129
|
+
) : (
|
|
130
|
+
<span className="text-muted-foreground">-</span>
|
|
131
|
+
),
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
id: "invoices_generated",
|
|
135
|
+
header: t("Generated"),
|
|
136
|
+
sortable: true,
|
|
137
|
+
align: "right",
|
|
138
|
+
cell: (ri) => ri.invoices_generated,
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
id: "created_at",
|
|
142
|
+
header: t("Created"),
|
|
143
|
+
sortable: true,
|
|
144
|
+
cell: (ri) => <FormattedDate date={ri.created_at} />,
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
id: "actions",
|
|
148
|
+
header: "",
|
|
149
|
+
align: "right",
|
|
150
|
+
cell: (ri) => (
|
|
151
|
+
<RecurringInvoiceListRowActions
|
|
152
|
+
recurringInvoice={ri}
|
|
153
|
+
entityId={entityId}
|
|
154
|
+
onViewSourceInvoice={onViewSourceInvoice}
|
|
155
|
+
onDeleteSuccess={onDeleteSuccess}
|
|
156
|
+
onDeleteError={onDeleteError}
|
|
157
|
+
t={t}
|
|
158
|
+
locale={i18nProps.locale}
|
|
159
|
+
/>
|
|
160
|
+
),
|
|
161
|
+
},
|
|
162
|
+
],
|
|
163
|
+
[t, frequencyLabels, entityId, onViewSourceInvoice, onDeleteSuccess, onDeleteError, i18nProps.locale],
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
return (
|
|
167
|
+
<DataTable
|
|
168
|
+
columns={columns}
|
|
169
|
+
queryParams={queryParams}
|
|
170
|
+
resourceName="recurring-invoice"
|
|
171
|
+
cacheKey="recurring-invoices"
|
|
172
|
+
onFetch={handleFetch}
|
|
173
|
+
onChangeParams={onChangeParams}
|
|
174
|
+
entityId={entityId}
|
|
175
|
+
t={t}
|
|
176
|
+
locale={i18nProps.locale}
|
|
177
|
+
/>
|
|
178
|
+
);
|
|
179
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
Name: "Name",
|
|
3
|
+
Frequency: "Häufigkeit",
|
|
4
|
+
Status: "Status",
|
|
5
|
+
"Next Run": "Nächste Ausführung",
|
|
6
|
+
Generated: "Erstellt",
|
|
7
|
+
Created: "Erstellt",
|
|
8
|
+
Every: "Alle",
|
|
9
|
+
Actions: "Aktionen",
|
|
10
|
+
"Open menu": "Menü öffnen",
|
|
11
|
+
"View source invoice": "Quellrechnung anzeigen",
|
|
12
|
+
Pause: "Pausieren",
|
|
13
|
+
Resume: "Fortsetzen",
|
|
14
|
+
"Processing...": "Verarbeitung...",
|
|
15
|
+
"Delete schedule": "Plan löschen",
|
|
16
|
+
"Deleting...": "Lösche...",
|
|
17
|
+
"frequency.daily": "Täglich",
|
|
18
|
+
"frequency.weekly": "Wöchentlich",
|
|
19
|
+
"frequency.monthly": "Monatlich",
|
|
20
|
+
"frequency.yearly": "Jährlich",
|
|
21
|
+
"status.active": "Aktiv",
|
|
22
|
+
"status.paused": "Pausiert",
|
|
23
|
+
"status.completed": "Abgeschlossen",
|
|
24
|
+
"Your list is empty": "Ihre Liste der wiederkehrenden Rechnungen ist leer",
|
|
25
|
+
"Get started by creating your first entry": "Erstellen Sie Ihren ersten wiederkehrenden Plan",
|
|
26
|
+
"No results found": "Keine wiederkehrenden Rechnungen gefunden",
|
|
27
|
+
} as const;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
Name: "Nombre",
|
|
3
|
+
Frequency: "Frecuencia",
|
|
4
|
+
Status: "Estado",
|
|
5
|
+
"Next Run": "Próxima ejecución",
|
|
6
|
+
Generated: "Generadas",
|
|
7
|
+
Created: "Creado",
|
|
8
|
+
Every: "Cada",
|
|
9
|
+
Actions: "Acciones",
|
|
10
|
+
"Open menu": "Abrir menú",
|
|
11
|
+
"View source invoice": "Ver factura de origen",
|
|
12
|
+
Pause: "Pausar",
|
|
13
|
+
Resume: "Reanudar",
|
|
14
|
+
"Processing...": "Procesando...",
|
|
15
|
+
"Delete schedule": "Eliminar programa",
|
|
16
|
+
"Deleting...": "Eliminando...",
|
|
17
|
+
"frequency.daily": "Diario",
|
|
18
|
+
"frequency.weekly": "Semanal",
|
|
19
|
+
"frequency.monthly": "Mensual",
|
|
20
|
+
"frequency.yearly": "Anual",
|
|
21
|
+
"status.active": "Activo",
|
|
22
|
+
"status.paused": "Pausado",
|
|
23
|
+
"status.completed": "Completado",
|
|
24
|
+
"Your list is empty": "Su lista de facturas recurrentes está vacía",
|
|
25
|
+
"Get started by creating your first entry": "Comience creando su primer programa recurrente",
|
|
26
|
+
"No results found": "No se encontraron facturas recurrentes",
|
|
27
|
+
} as const;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
Name: "Nom",
|
|
3
|
+
Frequency: "Fréquence",
|
|
4
|
+
Status: "Statut",
|
|
5
|
+
"Next Run": "Prochaine exécution",
|
|
6
|
+
Generated: "Générées",
|
|
7
|
+
Created: "Créé",
|
|
8
|
+
Every: "Tous les",
|
|
9
|
+
Actions: "Actions",
|
|
10
|
+
"Open menu": "Ouvrir le menu",
|
|
11
|
+
"View source invoice": "Voir la facture source",
|
|
12
|
+
Pause: "Mettre en pause",
|
|
13
|
+
Resume: "Reprendre",
|
|
14
|
+
"Processing...": "Traitement...",
|
|
15
|
+
"Delete schedule": "Supprimer le programme",
|
|
16
|
+
"Deleting...": "Suppression...",
|
|
17
|
+
"frequency.daily": "Quotidien",
|
|
18
|
+
"frequency.weekly": "Hebdomadaire",
|
|
19
|
+
"frequency.monthly": "Mensuel",
|
|
20
|
+
"frequency.yearly": "Annuel",
|
|
21
|
+
"status.active": "Actif",
|
|
22
|
+
"status.paused": "En pause",
|
|
23
|
+
"status.completed": "Terminé",
|
|
24
|
+
"Your list is empty": "Votre liste de factures récurrentes est vide",
|
|
25
|
+
"Get started by creating your first entry": "Commencez par créer votre premier programme récurrent",
|
|
26
|
+
"No results found": "Aucune facture récurrente trouvée",
|
|
27
|
+
} as const;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
Name: "Naziv",
|
|
3
|
+
Frequency: "Učestalost",
|
|
4
|
+
Status: "Status",
|
|
5
|
+
"Next Run": "Sljedeće pokretanje",
|
|
6
|
+
Generated: "Generirano",
|
|
7
|
+
Created: "Kreirano",
|
|
8
|
+
Every: "Svaki",
|
|
9
|
+
Actions: "Akcije",
|
|
10
|
+
"Open menu": "Otvori izbornik",
|
|
11
|
+
"View source invoice": "Prikaži izvorni račun",
|
|
12
|
+
Pause: "Pauziraj",
|
|
13
|
+
Resume: "Nastavi",
|
|
14
|
+
"Processing...": "Obrađujem...",
|
|
15
|
+
"Delete schedule": "Obriši raspored",
|
|
16
|
+
"Deleting...": "Brišem...",
|
|
17
|
+
"frequency.daily": "Dnevno",
|
|
18
|
+
"frequency.weekly": "Tjedno",
|
|
19
|
+
"frequency.monthly": "Mjesečno",
|
|
20
|
+
"frequency.yearly": "Godišnje",
|
|
21
|
+
"status.active": "Aktivan",
|
|
22
|
+
"status.paused": "Pauziran",
|
|
23
|
+
"status.completed": "Završen",
|
|
24
|
+
"Your list is empty": "Vaš popis ponavljajućih računa je prazan",
|
|
25
|
+
"Get started by creating your first entry": "Počnite kreiranjem prvog ponavljajućeg rasporeda",
|
|
26
|
+
"No results found": "Nisu pronađeni ponavljajući računi",
|
|
27
|
+
} as const;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
Name: "Nome",
|
|
3
|
+
Frequency: "Frequenza",
|
|
4
|
+
Status: "Stato",
|
|
5
|
+
"Next Run": "Prossima esecuzione",
|
|
6
|
+
Generated: "Generate",
|
|
7
|
+
Created: "Creato",
|
|
8
|
+
Every: "Ogni",
|
|
9
|
+
Actions: "Azioni",
|
|
10
|
+
"Open menu": "Apri menu",
|
|
11
|
+
"View source invoice": "Visualizza fattura originale",
|
|
12
|
+
Pause: "Pausa",
|
|
13
|
+
Resume: "Riprendi",
|
|
14
|
+
"Processing...": "Elaborazione...",
|
|
15
|
+
"Delete schedule": "Elimina programma",
|
|
16
|
+
"Deleting...": "Eliminazione...",
|
|
17
|
+
"frequency.daily": "Giornaliero",
|
|
18
|
+
"frequency.weekly": "Settimanale",
|
|
19
|
+
"frequency.monthly": "Mensile",
|
|
20
|
+
"frequency.yearly": "Annuale",
|
|
21
|
+
"status.active": "Attivo",
|
|
22
|
+
"status.paused": "In pausa",
|
|
23
|
+
"status.completed": "Completato",
|
|
24
|
+
"Your list is empty": "La lista delle fatture ricorrenti è vuota",
|
|
25
|
+
"Get started by creating your first entry": "Inizia creando il tuo primo programma ricorrente",
|
|
26
|
+
"No results found": "Nessuna fattura ricorrente trovata",
|
|
27
|
+
} as const;
|