@spaceinvoices/react-ui 0.4.3 → 0.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli/dist/index.js +1 -1
- package/package.json +1 -1
- package/src/common/autocomplete.tsx +18 -2
- package/src/components/advance-invoices/create/create-advance-invoice-form.tsx +61 -12
- package/src/components/advance-invoices/create/locales/de.ts +17 -0
- package/src/components/advance-invoices/create/locales/es.ts +17 -0
- package/src/components/advance-invoices/create/locales/fr.ts +17 -0
- package/src/components/advance-invoices/create/locales/hr.ts +16 -0
- package/src/components/advance-invoices/create/locales/it.ts +17 -0
- package/src/components/advance-invoices/create/locales/nl.ts +17 -0
- package/src/components/advance-invoices/create/locales/pl.ts +16 -0
- package/src/components/advance-invoices/create/locales/pt.ts +16 -0
- package/src/components/advance-invoices/create/locales/sl.ts +16 -0
- package/src/components/advance-invoices/create/prepare-advance-invoice-submission.ts +0 -1
- package/src/components/advance-invoices/list/list-row-actions.tsx +48 -1
- package/src/components/advance-invoices/list/list-table.tsx +100 -50
- package/src/components/advance-invoices/list/locales/de.ts +9 -0
- package/src/components/advance-invoices/list/locales/en.ts +7 -0
- package/src/components/advance-invoices/list/locales/es.ts +9 -0
- package/src/components/advance-invoices/list/locales/fr.ts +9 -0
- package/src/components/advance-invoices/list/locales/hr.ts +8 -0
- package/src/components/advance-invoices/list/locales/it.ts +9 -0
- package/src/components/advance-invoices/list/locales/nl.ts +9 -0
- package/src/components/advance-invoices/list/locales/pl.ts +8 -0
- package/src/components/advance-invoices/list/locales/pt.ts +9 -0
- package/src/components/advance-invoices/list/locales/sl.ts +8 -0
- package/src/components/credit-notes/create/create-credit-note-form.tsx +185 -11
- package/src/components/credit-notes/create/locales/de.ts +18 -0
- package/src/components/credit-notes/create/locales/es.ts +18 -0
- package/src/components/credit-notes/create/locales/fr.ts +18 -0
- package/src/components/credit-notes/create/locales/hr.ts +17 -0
- package/src/components/credit-notes/create/locales/it.ts +18 -0
- package/src/components/credit-notes/create/locales/nl.ts +18 -0
- package/src/components/credit-notes/create/locales/pl.ts +17 -0
- package/src/components/credit-notes/create/locales/pt.ts +17 -0
- package/src/components/credit-notes/create/locales/sl.ts +18 -1
- package/src/components/credit-notes/credit-notes.hooks.ts +30 -0
- package/src/components/credit-notes/list/list-row-actions.tsx +44 -1
- package/src/components/credit-notes/list/list-table.tsx +93 -32
- package/src/components/credit-notes/list/locales/de.ts +7 -0
- package/src/components/credit-notes/list/locales/en.ts +6 -0
- package/src/components/credit-notes/list/locales/es.ts +7 -0
- package/src/components/credit-notes/list/locales/fr.ts +7 -0
- package/src/components/credit-notes/list/locales/hr.ts +7 -0
- package/src/components/credit-notes/list/locales/it.ts +7 -0
- package/src/components/credit-notes/list/locales/nl.ts +7 -0
- package/src/components/credit-notes/list/locales/pl.ts +7 -0
- package/src/components/credit-notes/list/locales/pt.ts +7 -0
- package/src/components/credit-notes/list/locales/sl.ts +7 -0
- package/src/components/customers/customer-list-table/customer-list-table.tsx +0 -3
- package/src/components/customers/customer-list-table/locales/de.ts +1 -0
- package/src/components/customers/customer-list-table/locales/es.ts +1 -0
- package/src/components/customers/customer-list-table/locales/fr.ts +1 -0
- package/src/components/customers/customer-list-table/locales/hr.ts +1 -0
- package/src/components/customers/customer-list-table/locales/it.ts +1 -0
- package/src/components/customers/customer-list-table/locales/nl.ts +1 -0
- package/src/components/customers/customer-list-table/locales/pl.ts +1 -0
- package/src/components/customers/customer-list-table/locales/pt.ts +1 -0
- package/src/components/customers/customer-list-table/locales/sl.ts +1 -0
- package/src/components/dashboard/collection-rate-card/use-collection-rate.ts +48 -9
- package/src/components/dashboard/revenue-trend-chart/use-revenue-trend.ts +77 -48
- package/src/components/dashboard/shared/use-revenue-data.ts +77 -9
- package/src/components/delivery-notes/create/create-delivery-note-form.tsx +67 -7
- package/src/components/delivery-notes/create/locales/de.ts +16 -0
- package/src/components/delivery-notes/create/locales/es.ts +16 -0
- package/src/components/delivery-notes/create/locales/fr.ts +16 -0
- package/src/components/delivery-notes/create/locales/hr.ts +16 -0
- package/src/components/delivery-notes/create/locales/it.ts +16 -0
- package/src/components/delivery-notes/create/locales/nl.ts +16 -0
- package/src/components/delivery-notes/create/locales/pl.ts +16 -0
- package/src/components/delivery-notes/create/locales/pt.ts +16 -0
- package/src/components/delivery-notes/create/locales/sl.ts +17 -1
- package/src/components/delivery-notes/list/list-row-actions.tsx +20 -1
- package/src/components/delivery-notes/list/list-table.tsx +50 -8
- package/src/components/delivery-notes/list/locales/de.ts +35 -0
- package/src/components/delivery-notes/list/locales/en.ts +33 -0
- package/src/components/delivery-notes/list/locales/es.ts +35 -0
- package/src/components/delivery-notes/list/locales/fr.ts +35 -0
- package/src/components/delivery-notes/list/locales/hr.ts +35 -0
- package/src/components/delivery-notes/list/locales/it.ts +35 -0
- package/src/components/delivery-notes/list/locales/nl.ts +35 -0
- package/src/components/delivery-notes/list/locales/pl.ts +35 -0
- package/src/components/delivery-notes/list/locales/pt.ts +35 -0
- package/src/components/delivery-notes/list/locales/sl.ts +35 -0
- package/src/components/documents/create/document-add-item-form.tsx +70 -0
- package/src/components/documents/create/document-details-section.tsx +163 -29
- package/src/components/documents/create/document-items-section.tsx +21 -4
- package/src/components/documents/create/linked-documents-info.tsx +82 -0
- package/src/components/documents/create/live-preview.tsx +25 -5
- package/src/components/documents/create/mark-as-paid-section.tsx +29 -20
- package/src/components/documents/create/prepare-document-submission.ts +19 -7
- package/src/components/documents/shared/document-preview-display.tsx +3 -4
- package/src/components/documents/types.ts +2 -2
- package/src/components/documents/view/document-actions-bar.tsx +7 -27
- package/src/components/documents/view/document-activities-list.tsx +65 -47
- package/src/components/documents/view/document-details-card.tsx +118 -76
- package/src/components/documents/view/document-payments-list.tsx +99 -65
- package/src/components/documents/view/document-relations-list.tsx +43 -28
- package/src/components/documents/view/document-sidebar.tsx +151 -0
- package/src/components/documents/view/index.ts +2 -0
- package/src/components/documents/view/locales/de.ts +4 -0
- package/src/components/documents/view/locales/es.ts +4 -0
- package/src/components/documents/view/locales/fr.ts +4 -0
- package/src/components/documents/view/locales/hr.ts +4 -0
- package/src/components/documents/view/locales/it.ts +4 -0
- package/src/components/documents/view/locales/nl.ts +4 -0
- package/src/components/documents/view/locales/pl.ts +4 -0
- package/src/components/documents/view/locales/pt.ts +4 -0
- package/src/components/documents/view/locales/sl.ts +5 -1
- package/src/components/documents/view/use-document-download.ts +7 -3
- package/src/components/entities/create-entity-form.tsx +166 -13
- package/src/components/entities/entity-settings-form/entity-settings-form.tsx +101 -1
- package/src/components/entities/entity-settings-form/input-with-preview.tsx +30 -2
- package/src/components/entities/entity-settings-form/locales/de.ts +10 -0
- package/src/components/entities/entity-settings-form/locales/es.ts +10 -0
- package/src/components/entities/entity-settings-form/locales/fr.ts +10 -0
- package/src/components/entities/entity-settings-form/locales/hr.ts +10 -0
- package/src/components/entities/entity-settings-form/locales/it.ts +10 -0
- package/src/components/entities/entity-settings-form/locales/nl.ts +10 -0
- package/src/components/entities/entity-settings-form/locales/pl.ts +10 -0
- package/src/components/entities/entity-settings-form/locales/pt.ts +10 -0
- package/src/components/entities/entity-settings-form/locales/sl.ts +10 -0
- package/src/components/entities/fina-settings-form/fina-settings-form.tsx +6 -6
- package/src/components/entities/fina-settings-form/locales/de.ts +2 -2
- package/src/components/entities/fina-settings-form/locales/en.ts +2 -2
- package/src/components/entities/fina-settings-form/locales/es.ts +2 -2
- package/src/components/entities/fina-settings-form/locales/fr.ts +2 -2
- package/src/components/entities/fina-settings-form/locales/hr.ts +2 -2
- package/src/components/entities/fina-settings-form/locales/it.ts +2 -2
- package/src/components/entities/fina-settings-form/locales/nl.ts +2 -2
- package/src/components/entities/fina-settings-form/locales/pl.ts +2 -2
- package/src/components/entities/fina-settings-form/locales/pt.ts +2 -2
- package/src/components/entities/fina-settings-form/locales/sl.ts +2 -2
- package/src/components/entities/furs-settings-form/locales/en.ts +0 -1
- package/src/components/entities/settings/company-settings-form.tsx +173 -20
- package/src/components/entities/settings/pdf-template-selector/locales/de.ts +3 -1
- package/src/components/entities/settings/pdf-template-selector/locales/es.ts +3 -1
- package/src/components/entities/settings/pdf-template-selector/locales/fr.ts +4 -1
- package/src/components/entities/settings/pdf-template-selector/locales/hr.ts +4 -1
- package/src/components/entities/settings/pdf-template-selector/locales/it.ts +3 -1
- package/src/components/entities/settings/pdf-template-selector/locales/nl.ts +3 -1
- package/src/components/entities/settings/pdf-template-selector/locales/pl.ts +3 -1
- package/src/components/entities/settings/pdf-template-selector/locales/pt.ts +3 -1
- package/src/components/entities/settings/pdf-template-selector/locales/sl.ts +3 -1
- package/src/components/entities/settings/pdf-template-selector/pdf-template-cards.tsx +1 -0
- package/src/components/estimates/create/create-estimate-form.tsx +93 -8
- package/src/components/estimates/create/locales/de.ts +16 -0
- package/src/components/estimates/create/locales/es.ts +16 -0
- package/src/components/estimates/create/locales/fr.ts +16 -0
- package/src/components/estimates/create/locales/hr.ts +16 -0
- package/src/components/estimates/create/locales/it.ts +16 -0
- package/src/components/estimates/create/locales/nl.ts +16 -0
- package/src/components/estimates/create/locales/pl.ts +16 -0
- package/src/components/estimates/create/locales/pt.ts +16 -0
- package/src/components/estimates/create/locales/sl.ts +17 -1
- package/src/components/estimates/list/list-table.tsx +14 -8
- package/src/components/estimates/list/locales/de.ts +2 -0
- package/src/components/estimates/list/locales/en.ts +1 -0
- package/src/components/estimates/list/locales/es.ts +2 -0
- package/src/components/estimates/list/locales/fr.ts +2 -0
- package/src/components/estimates/list/locales/hr.ts +2 -0
- package/src/components/estimates/list/locales/it.ts +2 -0
- package/src/components/estimates/list/locales/nl.ts +2 -0
- package/src/components/estimates/list/locales/pl.ts +2 -0
- package/src/components/estimates/list/locales/pt.ts +2 -0
- package/src/components/estimates/list/locales/sl.ts +2 -0
- package/src/components/export/document-export-form.tsx +55 -14
- package/src/components/export/index.ts +2 -0
- package/src/components/export/sales-per-item-export-form.tsx +223 -0
- package/src/components/invoices/create/create-invoice-form.tsx +106 -11
- package/src/components/invoices/create/locales/de.ts +26 -0
- package/src/components/invoices/create/locales/es.ts +26 -0
- package/src/components/invoices/create/locales/fr.ts +26 -0
- package/src/components/invoices/create/locales/hr.ts +25 -0
- package/src/components/invoices/create/locales/it.ts +26 -0
- package/src/components/invoices/create/locales/nl.ts +26 -0
- package/src/components/invoices/create/locales/pl.ts +25 -0
- package/src/components/invoices/create/locales/pt.ts +25 -0
- package/src/components/invoices/create/locales/sl.ts +26 -1
- package/src/components/invoices/invoices-furs.hooks.ts +4 -1
- package/src/components/invoices/list/list-table.tsx +77 -31
- package/src/components/invoices/list/locales/de.ts +5 -0
- package/src/components/invoices/list/locales/en.ts +4 -0
- package/src/components/invoices/list/locales/es.ts +5 -0
- package/src/components/invoices/list/locales/fr.ts +5 -0
- package/src/components/invoices/list/locales/hr.ts +5 -0
- package/src/components/invoices/list/locales/it.ts +5 -0
- package/src/components/invoices/list/locales/nl.ts +5 -0
- package/src/components/invoices/list/locales/pl.ts +5 -0
- package/src/components/invoices/list/locales/pt.ts +5 -0
- package/src/components/invoices/list/locales/sl.ts +5 -0
- package/src/components/invoices/view/fiscalization-status-card.tsx +44 -24
- package/src/components/items/item-combobox.tsx +5 -3
- package/src/components/items/item-list-table/item-list-header.tsx +4 -17
- package/src/components/items/item-list-table/item-list-table.tsx +3 -3
- package/src/components/items/item-list-table/locales/de.ts +1 -0
- package/src/components/items/item-list-table/locales/es.ts +1 -0
- package/src/components/items/item-list-table/locales/fr.ts +1 -0
- package/src/components/items/item-list-table/locales/hr.ts +1 -0
- package/src/components/items/item-list-table/locales/it.ts +1 -0
- package/src/components/items/item-list-table/locales/nl.ts +1 -0
- package/src/components/items/item-list-table/locales/pl.ts +1 -0
- package/src/components/items/item-list-table/locales/pt.ts +1 -0
- package/src/components/items/item-list-table/locales/sl.ts +1 -0
- package/src/components/payments/list/list-table.tsx +0 -4
- package/src/components/payments/list/locales/de.ts +1 -0
- package/src/components/payments/list/locales/es.ts +1 -0
- package/src/components/payments/list/locales/fr.ts +1 -0
- package/src/components/payments/list/locales/hr.ts +1 -0
- package/src/components/payments/list/locales/it.ts +1 -0
- package/src/components/payments/list/locales/nl.ts +1 -0
- package/src/components/payments/list/locales/pl.ts +1 -0
- package/src/components/payments/list/locales/pt.ts +1 -0
- package/src/components/payments/list/locales/sl.ts +1 -0
- package/src/components/recurring-invoices/list/list-table.tsx +0 -7
- package/src/components/recurring-invoices/list/locales/de.ts +1 -0
- package/src/components/recurring-invoices/list/locales/es.ts +1 -0
- package/src/components/recurring-invoices/list/locales/fr.ts +1 -0
- package/src/components/recurring-invoices/list/locales/hr.ts +1 -0
- package/src/components/recurring-invoices/list/locales/it.ts +1 -0
- package/src/components/recurring-invoices/list/locales/nl.ts +1 -0
- package/src/components/recurring-invoices/list/locales/pl.ts +1 -0
- package/src/components/recurring-invoices/list/locales/pt.ts +1 -0
- package/src/components/recurring-invoices/list/locales/sl.ts +1 -0
- package/src/components/request-logs/request-log-list-table.tsx +0 -3
- package/src/components/table/README.md +14 -121
- package/src/components/table/data-table.tsx +22 -37
- package/src/components/table/hooks/use-table-state.ts +3 -27
- package/src/components/table/index.ts +0 -2
- package/src/components/table/search-input.tsx +17 -0
- package/src/components/table/selection-toolbar.tsx +35 -1
- package/src/components/table/table-empty-state.tsx +6 -3
- package/src/components/table/table-no-results.tsx +10 -5
- package/src/components/table/types.ts +0 -5
- package/src/components/taxes/tax-list-table/locales/de.ts +1 -0
- package/src/components/taxes/tax-list-table/locales/es.ts +1 -0
- package/src/components/taxes/tax-list-table/locales/fr.ts +1 -0
- package/src/components/taxes/tax-list-table/locales/hr.ts +1 -0
- package/src/components/taxes/tax-list-table/locales/it.ts +1 -0
- package/src/components/taxes/tax-list-table/locales/nl.ts +1 -0
- package/src/components/taxes/tax-list-table/locales/pl.ts +1 -0
- package/src/components/taxes/tax-list-table/locales/pt.ts +1 -0
- package/src/components/taxes/tax-list-table/locales/sl.ts +1 -0
- package/src/components/taxes/tax-list-table/tax-list-header.tsx +3 -14
- package/src/components/taxes/tax-list-table/tax-list-table.tsx +3 -3
- package/src/components/ui/popover.tsx +3 -1
- package/src/components/ui/tooltip.tsx +3 -1
- package/src/generated/schemas/advanceinvoice.ts +4 -2
- package/src/generated/schemas/creditnote.ts +2 -1
- package/src/generated/schemas/deliverynote.ts +2 -1
- package/src/generated/schemas/estimate.ts +4 -2
- package/src/generated/schemas/index.ts +1 -1
- package/src/generated/schemas/invoice.ts +2 -1
- package/src/generated/schemas/renderadvanceinvoicepreview_body.ts +17 -23
- package/src/generated/schemas/rendercreditnotepreview_body.ts +17 -23
- package/src/generated/schemas/renderdeliverynotepreview_body.ts +17 -23
- package/src/generated/schemas/renderestimatepreview_body.ts +17 -23
- package/src/generated/schemas/renderinvoicepreview_body.ts +19 -23
- package/src/hooks/use-duplicate-document.ts +56 -14
- package/src/hooks/use-vies-check.ts +3 -0
- package/src/lib/fiscalization.ts +12 -0
- package/src/lib/schemas/advance-invoice.ts +0 -1
- package/src/components/table/sortable-header.tsx +0 -56
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
import { zodResolver } from "@hookform/resolvers/zod";
|
|
2
|
-
import type { CreateEntityRequest, Entity } from "@spaceinvoices/js-sdk";
|
|
2
|
+
import type { CompanyRegistryResult, CreateEntityRequest, Entity } from "@spaceinvoices/js-sdk";
|
|
3
|
+
import { useEffect, useRef, useState } from "react";
|
|
3
4
|
import type { Resolver } from "react-hook-form";
|
|
4
5
|
import { useForm } from "react-hook-form";
|
|
6
|
+
import { Autocomplete } from "@/ui/common/autocomplete";
|
|
7
|
+
import { useCompanyRegistrySearch, useIsCountrySupported } from "@/ui/components/company-registry";
|
|
5
8
|
import { FormInput } from "@/ui/components/form";
|
|
6
9
|
import { Button } from "@/ui/components/ui/button";
|
|
7
|
-
import {
|
|
10
|
+
import { Checkbox } from "@/ui/components/ui/checkbox";
|
|
11
|
+
import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/ui/components/ui/form";
|
|
8
12
|
import { type CreateEntitySchema, createEntitySchema } from "@/ui/generated/schemas";
|
|
9
13
|
|
|
10
14
|
import ButtonLoader from "../button-loader";
|
|
@@ -16,6 +20,8 @@ export type CreateEntityFormProps = {
|
|
|
16
20
|
accountId?: string;
|
|
17
21
|
environment?: string;
|
|
18
22
|
defaultName?: string;
|
|
23
|
+
countryCode?: string;
|
|
24
|
+
locale?: string;
|
|
19
25
|
defaultValues?: Partial<CreateEntitySchema>;
|
|
20
26
|
onSuccess?: (data: Entity) => void;
|
|
21
27
|
onError?: (error: unknown) => void;
|
|
@@ -29,12 +35,44 @@ export function CreateEntityForm({
|
|
|
29
35
|
accountId,
|
|
30
36
|
environment,
|
|
31
37
|
defaultName,
|
|
38
|
+
countryCode,
|
|
39
|
+
locale = "en",
|
|
32
40
|
defaultValues: extraDefaults,
|
|
33
41
|
onSuccess,
|
|
34
42
|
onError,
|
|
35
43
|
}: CreateEntityFormProps) {
|
|
36
44
|
const translate = (key: string) => t(namespace ? `${namespace}.${key}` : key);
|
|
37
45
|
|
|
46
|
+
const countryName = countryCode ? new Intl.DisplayNames([locale], { type: "region" }).of(countryCode) : undefined;
|
|
47
|
+
|
|
48
|
+
// Track whether the country code is still valid (cleared when user edits country name)
|
|
49
|
+
const [activeCountryCode, setActiveCountryCode] = useState<string | undefined>(countryCode);
|
|
50
|
+
const autoFilledCountryRef = useRef(countryName);
|
|
51
|
+
|
|
52
|
+
// Company registry autocomplete state
|
|
53
|
+
const [nameSearch, setNameSearch] = useState("");
|
|
54
|
+
const { isSupported: isRegistrySupported } = useIsCountrySupported(activeCountryCode || "");
|
|
55
|
+
const { data: searchData, isLoading: isSearching } = useCompanyRegistrySearch(activeCountryCode || "", nameSearch);
|
|
56
|
+
const companies = searchData?.data || [];
|
|
57
|
+
|
|
58
|
+
const showAutocomplete = !!activeCountryCode && isRegistrySupported;
|
|
59
|
+
|
|
60
|
+
const nameOptions = companies.map((company) => {
|
|
61
|
+
const addressParts = [company.address, company.city].filter(Boolean);
|
|
62
|
+
const address = addressParts.join(", ");
|
|
63
|
+
return {
|
|
64
|
+
value: company.id,
|
|
65
|
+
label: (
|
|
66
|
+
<div className="flex flex-col overflow-hidden py-1">
|
|
67
|
+
<span className="truncate font-medium">{company.name}</span>
|
|
68
|
+
{address && <span className="truncate text-muted-foreground text-xs">{address}</span>}
|
|
69
|
+
{company.tax_number && <span className="truncate text-muted-foreground text-xs">{company.tax_number}</span>}
|
|
70
|
+
</div>
|
|
71
|
+
),
|
|
72
|
+
company,
|
|
73
|
+
};
|
|
74
|
+
});
|
|
75
|
+
|
|
38
76
|
const form = useForm<CreateEntitySchema>({
|
|
39
77
|
resolver: zodResolver(createEntitySchema) as Resolver<CreateEntitySchema>,
|
|
40
78
|
defaultValues: {
|
|
@@ -44,9 +82,11 @@ export function CreateEntityForm({
|
|
|
44
82
|
post_code: "",
|
|
45
83
|
city: "",
|
|
46
84
|
state: "",
|
|
47
|
-
country: "",
|
|
85
|
+
country: countryName || "",
|
|
86
|
+
country_code: countryCode || "",
|
|
48
87
|
tax_number: "",
|
|
49
88
|
company_number: "",
|
|
89
|
+
is_tax_subject: true,
|
|
50
90
|
environment: environment as "live" | "sandbox" | undefined,
|
|
51
91
|
...extraDefaults,
|
|
52
92
|
// defaultName takes priority over extraDefaults.name if provided
|
|
@@ -54,6 +94,27 @@ export function CreateEntityForm({
|
|
|
54
94
|
},
|
|
55
95
|
});
|
|
56
96
|
|
|
97
|
+
// Watch country field — clear activeCountryCode when user edits away from auto-filled value
|
|
98
|
+
const countryValue = form.watch("country");
|
|
99
|
+
useEffect(() => {
|
|
100
|
+
if (countryValue !== autoFilledCountryRef.current) {
|
|
101
|
+
setActiveCountryCode(undefined);
|
|
102
|
+
form.setValue("country_code", "");
|
|
103
|
+
} else {
|
|
104
|
+
setActiveCountryCode(countryCode);
|
|
105
|
+
}
|
|
106
|
+
}, [countryValue, countryCode, form]);
|
|
107
|
+
|
|
108
|
+
const handleCompanySelect = (company: CompanyRegistryResult) => {
|
|
109
|
+
form.setValue("name", company.name);
|
|
110
|
+
if (company.address) form.setValue("address", company.address);
|
|
111
|
+
if (company.post_code) form.setValue("post_code", company.post_code);
|
|
112
|
+
if (company.city) form.setValue("city", company.city);
|
|
113
|
+
if (company.tax_number) form.setValue("tax_number", company.tax_number);
|
|
114
|
+
if (company.registration_number) form.setValue("company_number", company.registration_number);
|
|
115
|
+
setNameSearch("");
|
|
116
|
+
};
|
|
117
|
+
|
|
57
118
|
// Wrap onSuccess to reset form only after successful mutation
|
|
58
119
|
const handleSuccess = (data: Entity) => {
|
|
59
120
|
form.reset();
|
|
@@ -84,30 +145,122 @@ export function CreateEntityForm({
|
|
|
84
145
|
}
|
|
85
146
|
};
|
|
86
147
|
|
|
148
|
+
const nameValue = form.watch("name");
|
|
149
|
+
|
|
87
150
|
return (
|
|
88
151
|
<Form {...form}>
|
|
89
152
|
<form onSubmit={form.handleSubmit(onSubmit as any)} className="space-y-4">
|
|
90
|
-
|
|
153
|
+
{showAutocomplete ? (
|
|
154
|
+
<FormField
|
|
155
|
+
control={form.control}
|
|
156
|
+
name="name"
|
|
157
|
+
render={({ field }) => (
|
|
158
|
+
<FormItem>
|
|
159
|
+
<FormLabel>
|
|
160
|
+
{translate("name")}
|
|
161
|
+
<span className="ml-1 text-red-500">*</span>
|
|
162
|
+
</FormLabel>
|
|
163
|
+
<FormControl>
|
|
164
|
+
<Autocomplete
|
|
165
|
+
searchValue={nameSearch}
|
|
166
|
+
onSearch={(v) => {
|
|
167
|
+
setNameSearch(v);
|
|
168
|
+
field.onChange(v || undefined);
|
|
169
|
+
}}
|
|
170
|
+
displayValue={nameValue || ""}
|
|
171
|
+
options={nameOptions}
|
|
172
|
+
onValueChange={(selectedId) => {
|
|
173
|
+
const option = nameOptions.find((o) => o.value === selectedId);
|
|
174
|
+
if (option?.company) {
|
|
175
|
+
handleCompanySelect(option.company);
|
|
176
|
+
}
|
|
177
|
+
}}
|
|
178
|
+
onBlur={() => {
|
|
179
|
+
setNameSearch("");
|
|
180
|
+
}}
|
|
181
|
+
placeholder={translate("name")}
|
|
182
|
+
loading={isSearching}
|
|
183
|
+
emptyText={nameSearch.length < 2 ? translate("search-hint") : translate("no-results")}
|
|
184
|
+
/>
|
|
185
|
+
</FormControl>
|
|
186
|
+
<FormMessage />
|
|
187
|
+
</FormItem>
|
|
188
|
+
)}
|
|
189
|
+
/>
|
|
190
|
+
) : (
|
|
191
|
+
<FormInput
|
|
192
|
+
control={form.control}
|
|
193
|
+
name="name"
|
|
194
|
+
label={translate("name")}
|
|
195
|
+
placeholder={translate("name")}
|
|
196
|
+
required
|
|
197
|
+
/>
|
|
198
|
+
)}
|
|
91
199
|
|
|
92
|
-
<FormInput
|
|
200
|
+
<FormInput
|
|
201
|
+
control={form.control}
|
|
202
|
+
name="country"
|
|
203
|
+
label={translate("country")}
|
|
204
|
+
placeholder={translate("country")}
|
|
205
|
+
required
|
|
206
|
+
/>
|
|
93
207
|
|
|
94
|
-
<FormInput
|
|
208
|
+
<FormInput
|
|
209
|
+
control={form.control}
|
|
210
|
+
name="address"
|
|
211
|
+
label={translate("address")}
|
|
212
|
+
placeholder={translate("address")}
|
|
213
|
+
/>
|
|
95
214
|
|
|
96
|
-
<FormInput
|
|
215
|
+
<FormInput
|
|
216
|
+
control={form.control}
|
|
217
|
+
name="address_2"
|
|
218
|
+
label={translate("address-2")}
|
|
219
|
+
placeholder={translate("address-2")}
|
|
220
|
+
/>
|
|
97
221
|
|
|
98
222
|
<div className="grid grid-cols-2 gap-4">
|
|
99
|
-
<FormInput
|
|
100
|
-
|
|
223
|
+
<FormInput
|
|
224
|
+
control={form.control}
|
|
225
|
+
name="post_code"
|
|
226
|
+
label={translate("post-code")}
|
|
227
|
+
placeholder={translate("post-code")}
|
|
228
|
+
/>
|
|
229
|
+
<FormInput control={form.control} name="city" label={translate("city")} placeholder={translate("city")} />
|
|
101
230
|
</div>
|
|
102
231
|
|
|
103
|
-
<FormInput control={form.control} name="state" label="
|
|
232
|
+
<FormInput control={form.control} name="state" label={translate("state")} placeholder={translate("state")} />
|
|
104
233
|
|
|
105
|
-
<
|
|
234
|
+
<div className="grid grid-cols-[1fr_auto] items-end gap-4">
|
|
235
|
+
<FormInput
|
|
236
|
+
control={form.control}
|
|
237
|
+
name="tax_number"
|
|
238
|
+
label={translate("tax-number")}
|
|
239
|
+
placeholder={translate("tax-number")}
|
|
240
|
+
/>
|
|
241
|
+
<FormField
|
|
242
|
+
control={form.control}
|
|
243
|
+
name="is_tax_subject"
|
|
244
|
+
render={({ field }) => (
|
|
245
|
+
<FormItem className="flex flex-row items-center space-x-2 space-y-0 pb-2">
|
|
246
|
+
<FormControl>
|
|
247
|
+
<Checkbox checked={field.value} onCheckedChange={field.onChange} />
|
|
248
|
+
</FormControl>
|
|
249
|
+
<FormLabel className="font-normal">{translate("is-tax-subject")}</FormLabel>
|
|
250
|
+
</FormItem>
|
|
251
|
+
)}
|
|
252
|
+
/>
|
|
253
|
+
</div>
|
|
106
254
|
|
|
107
|
-
<FormInput
|
|
255
|
+
<FormInput
|
|
256
|
+
control={form.control}
|
|
257
|
+
name="company_number"
|
|
258
|
+
label={translate("company-number")}
|
|
259
|
+
placeholder={translate("company-number")}
|
|
260
|
+
/>
|
|
108
261
|
|
|
109
262
|
<Button type="submit" className="w-full cursor-pointer" disabled={isPending} aria-busy={isPending}>
|
|
110
|
-
{isPending ? <ButtonLoader /> : "
|
|
263
|
+
{isPending ? <ButtonLoader /> : translate("submit")}
|
|
111
264
|
</Button>
|
|
112
265
|
</form>
|
|
113
266
|
</Form>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { zodResolver } from "@hookform/resolvers/zod";
|
|
2
2
|
import type { Entity } from "@spaceinvoices/js-sdk";
|
|
3
|
-
import { CreditCard, FileText, Globe, Mail, Palette, Sparkles } from "lucide-react";
|
|
3
|
+
import { CreditCard, FileText, Globe, Mail, Palette, QrCode, Sparkles } from "lucide-react";
|
|
4
4
|
import { useEffect, useRef, useState } from "react";
|
|
5
5
|
import { useForm } from "react-hook-form";
|
|
6
6
|
import { z } from "zod";
|
|
@@ -67,6 +67,38 @@ const SUPPORTED_LOCALES = [
|
|
|
67
67
|
{ value: "sl-SI", label: "Slovenščina (SI)" },
|
|
68
68
|
] as const;
|
|
69
69
|
|
|
70
|
+
// Countries with EPC QR feature (EU 27 + Switzerland)
|
|
71
|
+
const EPC_QR_COUNTRIES = new Set([
|
|
72
|
+
"AT",
|
|
73
|
+
"BE",
|
|
74
|
+
"BG",
|
|
75
|
+
"HR",
|
|
76
|
+
"CY",
|
|
77
|
+
"CZ",
|
|
78
|
+
"DK",
|
|
79
|
+
"EE",
|
|
80
|
+
"FI",
|
|
81
|
+
"FR",
|
|
82
|
+
"DE",
|
|
83
|
+
"GR",
|
|
84
|
+
"HU",
|
|
85
|
+
"IE",
|
|
86
|
+
"IT",
|
|
87
|
+
"LV",
|
|
88
|
+
"LT",
|
|
89
|
+
"LU",
|
|
90
|
+
"MT",
|
|
91
|
+
"NL",
|
|
92
|
+
"PL",
|
|
93
|
+
"PT",
|
|
94
|
+
"RO",
|
|
95
|
+
"SK",
|
|
96
|
+
"SI",
|
|
97
|
+
"ES",
|
|
98
|
+
"SE",
|
|
99
|
+
"CH",
|
|
100
|
+
]);
|
|
101
|
+
|
|
70
102
|
// Form schema extends the generated patchEntitySchema but flattens nested settings for better UX
|
|
71
103
|
// Uses .omit() to remove nested fields, then .extend() to add flattened versions
|
|
72
104
|
// This approach keeps the base validation from the API schema while allowing a better form structure
|
|
@@ -116,6 +148,8 @@ const entitySettingsFormSchema = patchEntitySchema
|
|
|
116
148
|
message: "Must be a 4-letter uppercase code (e.g., OTHR)",
|
|
117
149
|
})
|
|
118
150
|
.optional(),
|
|
151
|
+
// EPC QR settings (EU + CH)
|
|
152
|
+
epc_qr_enabled: z.union([z.boolean(), z.null()]).optional(),
|
|
119
153
|
});
|
|
120
154
|
|
|
121
155
|
export type EntitySettingsFormSchema = z.infer<typeof entitySettingsFormSchema>;
|
|
@@ -186,6 +220,7 @@ export function EntitySettingsForm({
|
|
|
186
220
|
upn_qr_enabled: currentSettings.upn_qr?.enabled || false,
|
|
187
221
|
upn_qr_display_mode: currentSettings.upn_qr?.display_mode || "qr_only",
|
|
188
222
|
upn_qr_purpose_code: currentSettings.upn_qr?.purpose_code || "OTHR",
|
|
223
|
+
epc_qr_enabled: currentSettings.epc_qr?.enabled || false,
|
|
189
224
|
},
|
|
190
225
|
});
|
|
191
226
|
|
|
@@ -346,6 +381,9 @@ export function EntitySettingsForm({
|
|
|
346
381
|
purpose_code: values.upn_qr_purpose_code || "OTHR",
|
|
347
382
|
}
|
|
348
383
|
: undefined,
|
|
384
|
+
// EPC QR settings - only include if enabled or was previously enabled
|
|
385
|
+
epc_qr:
|
|
386
|
+
values.epc_qr_enabled || currentSettings.epc_qr ? { enabled: values.epc_qr_enabled || false } : undefined,
|
|
349
387
|
// Bank accounts - store in array format (preserving other accounts if any)
|
|
350
388
|
bank_accounts: values.bank_account_iban
|
|
351
389
|
? [
|
|
@@ -1015,6 +1053,68 @@ export function EntitySettingsForm({
|
|
|
1015
1053
|
</div>
|
|
1016
1054
|
)}
|
|
1017
1055
|
|
|
1056
|
+
{/* EPC QR Section - For EU + CH entities */}
|
|
1057
|
+
{EPC_QR_COUNTRIES.has((entity as any).country_code) && (
|
|
1058
|
+
<div className="grid gap-8 border-t pt-8 lg:grid-cols-2">
|
|
1059
|
+
<div className="space-y-4">
|
|
1060
|
+
<div className="flex items-center gap-3">
|
|
1061
|
+
<div className="flex h-10 w-10 items-center justify-center rounded-lg bg-sky-500/10">
|
|
1062
|
+
<QrCode className="h-5 w-5 text-sky-600 dark:text-sky-400" />
|
|
1063
|
+
</div>
|
|
1064
|
+
<div>
|
|
1065
|
+
<h3 className="font-semibold text-lg">{translate("EPC QR Payment")}</h3>
|
|
1066
|
+
<p className="text-muted-foreground text-sm">
|
|
1067
|
+
{translate("SEPA credit transfer QR code for invoices")}
|
|
1068
|
+
</p>
|
|
1069
|
+
</div>
|
|
1070
|
+
</div>
|
|
1071
|
+
|
|
1072
|
+
<div className="space-y-6 pl-[52px]">
|
|
1073
|
+
<FormField
|
|
1074
|
+
control={form.control}
|
|
1075
|
+
name="epc_qr_enabled"
|
|
1076
|
+
render={({ field }) => (
|
|
1077
|
+
<FormItem className="flex flex-row items-center justify-between rounded-lg border p-4">
|
|
1078
|
+
<div className="space-y-0.5">
|
|
1079
|
+
<FormLabel className="font-medium text-base">
|
|
1080
|
+
{translate("Enable EPC QR on invoices")}
|
|
1081
|
+
</FormLabel>
|
|
1082
|
+
<FormDescription className="text-xs">
|
|
1083
|
+
{translate("Show SEPA QR code on EUR invoices for easy bank payments")}
|
|
1084
|
+
</FormDescription>
|
|
1085
|
+
</div>
|
|
1086
|
+
<FormControl>
|
|
1087
|
+
<Switch
|
|
1088
|
+
checked={field.value || false}
|
|
1089
|
+
onCheckedChange={field.onChange}
|
|
1090
|
+
disabled={!form.watch("bank_account_iban")}
|
|
1091
|
+
/>
|
|
1092
|
+
</FormControl>
|
|
1093
|
+
</FormItem>
|
|
1094
|
+
)}
|
|
1095
|
+
/>
|
|
1096
|
+
</div>
|
|
1097
|
+
</div>
|
|
1098
|
+
|
|
1099
|
+
{/* Help Content */}
|
|
1100
|
+
<div className="hidden lg:block">
|
|
1101
|
+
<div className="sticky top-6 space-y-3 border-muted border-l-2 pl-4">
|
|
1102
|
+
<div className="flex items-start gap-2">
|
|
1103
|
+
<QrCode className="mt-0.5 h-4 w-4 shrink-0 text-muted-foreground/70" />
|
|
1104
|
+
<div className="space-y-2">
|
|
1105
|
+
<p className="font-medium text-muted-foreground text-sm">{translate("EPC QR Payments")}</p>
|
|
1106
|
+
<p className="text-muted-foreground/80 text-xs leading-relaxed">
|
|
1107
|
+
{translate(
|
|
1108
|
+
"EPC QR is a European standard for SEPA credit transfers. When enabled, EUR invoices include a QR code that customers can scan with their banking app to pay instantly.",
|
|
1109
|
+
)}
|
|
1110
|
+
</p>
|
|
1111
|
+
</div>
|
|
1112
|
+
</div>
|
|
1113
|
+
</div>
|
|
1114
|
+
</div>
|
|
1115
|
+
</div>
|
|
1116
|
+
)}
|
|
1117
|
+
|
|
1018
1118
|
{/* Document Defaults Section */}
|
|
1019
1119
|
<div className="grid gap-8 border-t pt-8 lg:grid-cols-2">
|
|
1020
1120
|
<div className="space-y-4">
|
|
@@ -17,9 +17,10 @@ interface InputWithPreviewProps {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
function formatVariableName(varName: string): string {
|
|
20
|
-
// Convert snake_case to Title Case with spaces
|
|
21
|
-
// e.g., "document_number" -> "Document Number"
|
|
20
|
+
// Convert snake_case (with optional dot notation) to Title Case with spaces
|
|
21
|
+
// e.g., "document_number" -> "Document Number", "bank_account.iban" -> "Bank Account Iban"
|
|
22
22
|
return varName
|
|
23
|
+
.replace(/\./g, "_")
|
|
23
24
|
.split("_")
|
|
24
25
|
.map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
|
|
25
26
|
.join(" ");
|
|
@@ -78,6 +79,33 @@ function getVariableValue(varName: string, entity: Entity, document?: Invoice |
|
|
|
78
79
|
}
|
|
79
80
|
}
|
|
80
81
|
|
|
82
|
+
// Bank account variables (from entity settings)
|
|
83
|
+
const bankAccounts = (entity.settings as any)?.bank_accounts as
|
|
84
|
+
| Array<{
|
|
85
|
+
iban?: string;
|
|
86
|
+
bank_name?: string;
|
|
87
|
+
bic?: string;
|
|
88
|
+
account_number?: string;
|
|
89
|
+
routing_number?: string;
|
|
90
|
+
sort_code?: string;
|
|
91
|
+
is_default?: boolean;
|
|
92
|
+
}>
|
|
93
|
+
| undefined;
|
|
94
|
+
const bankAccount = bankAccounts?.find((acc) => acc.is_default) ?? bankAccounts?.[0];
|
|
95
|
+
|
|
96
|
+
if (varName === "bank_account" && bankAccount) {
|
|
97
|
+
const lines: string[] = [];
|
|
98
|
+
if (bankAccount.bank_name) lines.push(bankAccount.bank_name);
|
|
99
|
+
if (bankAccount.iban) lines.push(`IBAN: ${bankAccount.iban}`);
|
|
100
|
+
else if (bankAccount.account_number) lines.push(`Account: ${bankAccount.account_number}`);
|
|
101
|
+
if (bankAccount.bic) lines.push(`BIC: ${bankAccount.bic}`);
|
|
102
|
+
return lines.join(", ") || null;
|
|
103
|
+
}
|
|
104
|
+
if (varName === "bank_account.iban") return bankAccount?.iban || null;
|
|
105
|
+
if (varName === "bank_account.bank_name") return bankAccount?.bank_name || null;
|
|
106
|
+
if (varName === "bank_account.bic") return bankAccount?.bic || null;
|
|
107
|
+
if (varName === "bank_account.account_number") return bankAccount?.account_number || null;
|
|
108
|
+
|
|
81
109
|
// Return null for unavailable variables - they will show as placeholders
|
|
82
110
|
return null;
|
|
83
111
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export default {
|
|
2
2
|
// Company settings
|
|
3
|
+
"Tax subject": "Steuerpflichtig",
|
|
3
4
|
"Tax ID 2": "Steuernummer",
|
|
4
5
|
"Secondary tax identification number (optional)": "Sekundäre Steueridentifikationsnummer (optional)",
|
|
5
6
|
"Company Information": "Unternehmensinformationen",
|
|
@@ -191,4 +192,13 @@ export default {
|
|
|
191
192
|
"Enter EU consumer sales clause...": "EU-Verbraucherklausel eingeben...",
|
|
192
193
|
"tax-clauses.other.description":
|
|
193
194
|
"Diese Transaktionstypen erfordern normalerweise keine speziellen Steuerklauseln, können aber bei Bedarf konfiguriert werden.",
|
|
195
|
+
// EPC QR Payment section
|
|
196
|
+
"EPC QR Payment": "EPC QR Zahlung",
|
|
197
|
+
"SEPA credit transfer QR code for invoices": "SEPA-Überweisungs-QR-Code für Rechnungen",
|
|
198
|
+
"Enable EPC QR on invoices": "EPC QR auf Rechnungen aktivieren",
|
|
199
|
+
"Show SEPA QR code on EUR invoices for easy bank payments":
|
|
200
|
+
"SEPA-QR-Code auf EUR-Rechnungen für einfache Bankzahlungen anzeigen",
|
|
201
|
+
"EPC QR Payments": "EPC QR Zahlungen",
|
|
202
|
+
"EPC QR is a European standard for SEPA credit transfers. When enabled, EUR invoices include a QR code that customers can scan with their banking app to pay instantly.":
|
|
203
|
+
"EPC QR ist ein europäischer Standard für SEPA-Überweisungen. Wenn aktiviert, enthalten EUR-Rechnungen einen QR-Code, den Kunden mit ihrer Banking-App scannen können, um sofort zu bezahlen.",
|
|
194
204
|
} as const;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export default {
|
|
2
2
|
// Company settings
|
|
3
|
+
"Tax subject": "Sujeto fiscal",
|
|
3
4
|
"Tax ID 2": "Tax ID 2",
|
|
4
5
|
"Secondary tax identification number (optional)": "Secondary tax identification number (optional)",
|
|
5
6
|
"Company Information": "Información de la empresa",
|
|
@@ -196,4 +197,13 @@ export default {
|
|
|
196
197
|
"Enter EU consumer sales clause...": "Introduzca la cláusula de venta a consumidores de la UE...",
|
|
197
198
|
"tax-clauses.other.description":
|
|
198
199
|
"Estos tipos de transacciones normalmente no requieren cláusulas fiscales específicas, pero puede configurarlas según sea necesario.",
|
|
200
|
+
// EPC QR Payment section
|
|
201
|
+
"EPC QR Payment": "Pago EPC QR",
|
|
202
|
+
"SEPA credit transfer QR code for invoices": "Código QR de transferencia SEPA para facturas",
|
|
203
|
+
"Enable EPC QR on invoices": "Activar EPC QR en facturas",
|
|
204
|
+
"Show SEPA QR code on EUR invoices for easy bank payments":
|
|
205
|
+
"Mostrar código QR SEPA en facturas en EUR para pagos bancarios fáciles",
|
|
206
|
+
"EPC QR Payments": "Pagos EPC QR",
|
|
207
|
+
"EPC QR is a European standard for SEPA credit transfers. When enabled, EUR invoices include a QR code that customers can scan with their banking app to pay instantly.":
|
|
208
|
+
"EPC QR es un estándar europeo para transferencias SEPA. Cuando está activado, las facturas en EUR incluyen un código QR que los clientes pueden escanear con su app bancaria para pagar al instante.",
|
|
199
209
|
} as const;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export default {
|
|
2
2
|
// Company settings
|
|
3
|
+
"Tax subject": "Assujetti à la TVA",
|
|
3
4
|
"Tax ID 2": "Tax ID 2",
|
|
4
5
|
"Secondary tax identification number (optional)": "Secondary tax identification number (optional)",
|
|
5
6
|
"Company Information": "Informations sur l'entreprise",
|
|
@@ -195,4 +196,13 @@ export default {
|
|
|
195
196
|
"Enter EU consumer sales clause...": "Entrez la clause de vente aux consommateurs UE...",
|
|
196
197
|
"tax-clauses.other.description":
|
|
197
198
|
"Ces types de transactions ne nécessitent généralement pas de clauses fiscales spécifiques, mais vous pouvez les configurer selon vos besoins.",
|
|
199
|
+
// EPC QR Payment section
|
|
200
|
+
"EPC QR Payment": "Paiement EPC QR",
|
|
201
|
+
"SEPA credit transfer QR code for invoices": "Code QR de virement SEPA pour les factures",
|
|
202
|
+
"Enable EPC QR on invoices": "Activer EPC QR sur les factures",
|
|
203
|
+
"Show SEPA QR code on EUR invoices for easy bank payments":
|
|
204
|
+
"Afficher le code QR SEPA sur les factures en EUR pour des paiements bancaires faciles",
|
|
205
|
+
"EPC QR Payments": "Paiements EPC QR",
|
|
206
|
+
"EPC QR is a European standard for SEPA credit transfers. When enabled, EUR invoices include a QR code that customers can scan with their banking app to pay instantly.":
|
|
207
|
+
"EPC QR est un standard européen pour les virements SEPA. Lorsqu'il est activé, les factures en EUR incluent un code QR que les clients peuvent scanner avec leur application bancaire pour payer instantanément.",
|
|
198
208
|
} as const;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export default {
|
|
2
2
|
// Company settings
|
|
3
|
+
"Tax subject": "Porezni obveznik",
|
|
3
4
|
"Tax ID 2": "Tax ID 2",
|
|
4
5
|
"Secondary tax identification number (optional)": "Secondary tax identification number (optional)",
|
|
5
6
|
"Company Information": "Podaci o tvrtki",
|
|
@@ -188,4 +189,13 @@ export default {
|
|
|
188
189
|
"Enter EU consumer sales clause...": "Unesite klauzulu za prodaju EU potrošačima...",
|
|
189
190
|
"tax-clauses.other.description":
|
|
190
191
|
"Ove vrste transakcija obično ne zahtijevaju posebne porezne klauzule, ali ih možete konfigurirati prema potrebi.",
|
|
192
|
+
// EPC QR Payment section
|
|
193
|
+
"EPC QR Payment": "EPC QR plaćanje",
|
|
194
|
+
"SEPA credit transfer QR code for invoices": "SEPA QR kod za kreditne transfere na fakturama",
|
|
195
|
+
"Enable EPC QR on invoices": "Omogući EPC QR na fakturama",
|
|
196
|
+
"Show SEPA QR code on EUR invoices for easy bank payments":
|
|
197
|
+
"Prikaži SEPA QR kod na EUR fakturama za jednostavno bankovne uplate",
|
|
198
|
+
"EPC QR Payments": "EPC QR plaćanja",
|
|
199
|
+
"EPC QR is a European standard for SEPA credit transfers. When enabled, EUR invoices include a QR code that customers can scan with their banking app to pay instantly.":
|
|
200
|
+
"EPC QR je europski standard za SEPA kreditne transfere. Kada je omogućen, EUR fakture uključuju QR kod koji kupci mogu skenirati bankovnom aplikacijom za trenutačno plaćanje.",
|
|
191
201
|
} as const;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export default {
|
|
2
2
|
// Company settings
|
|
3
|
+
"Tax subject": "Soggetto fiscale",
|
|
3
4
|
"Tax ID 2": "Tax ID 2",
|
|
4
5
|
"Secondary tax identification number (optional)": "Secondary tax identification number (optional)",
|
|
5
6
|
"Company Information": "Informazioni aziendali",
|
|
@@ -194,4 +195,13 @@ export default {
|
|
|
194
195
|
"Enter EU consumer sales clause...": "Inserisci la clausola per vendite ai consumatori UE...",
|
|
195
196
|
"tax-clauses.other.description":
|
|
196
197
|
"Questi tipi di transazioni di solito non richiedono clausole fiscali specifiche, ma puoi configurarle secondo necessità.",
|
|
198
|
+
// EPC QR Payment section
|
|
199
|
+
"EPC QR Payment": "Pagamento EPC QR",
|
|
200
|
+
"SEPA credit transfer QR code for invoices": "Codice QR per bonifico SEPA sulle fatture",
|
|
201
|
+
"Enable EPC QR on invoices": "Attiva EPC QR sulle fatture",
|
|
202
|
+
"Show SEPA QR code on EUR invoices for easy bank payments":
|
|
203
|
+
"Mostra il codice QR SEPA sulle fatture in EUR per pagamenti bancari facili",
|
|
204
|
+
"EPC QR Payments": "Pagamenti EPC QR",
|
|
205
|
+
"EPC QR is a European standard for SEPA credit transfers. When enabled, EUR invoices include a QR code that customers can scan with their banking app to pay instantly.":
|
|
206
|
+
"EPC QR è uno standard europeo per i bonifici SEPA. Quando attivato, le fatture in EUR includono un codice QR che i clienti possono scansionare con la loro app bancaria per pagare istantaneamente.",
|
|
197
207
|
} as const;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export default {
|
|
2
2
|
// Company settings
|
|
3
|
+
"Tax subject": "Belastingplichtige",
|
|
3
4
|
"Tax ID 2": "Tax ID 2",
|
|
4
5
|
"Secondary tax identification number (optional)": "Secondary tax identification number (optional)",
|
|
5
6
|
"Company Information": "Bedrijfsinformatie",
|
|
@@ -191,4 +192,13 @@ export default {
|
|
|
191
192
|
"Enter EU consumer sales clause...": "Voer de EU-consumentenverkoopclausule in...",
|
|
192
193
|
"tax-clauses.other.description":
|
|
193
194
|
"Deze soorten transacties vereisen doorgaans geen specifieke belastingclausules, maar u kunt ze naar behoefte configureren.",
|
|
195
|
+
// EPC QR Payment section
|
|
196
|
+
"EPC QR Payment": "EPC QR Betaling",
|
|
197
|
+
"SEPA credit transfer QR code for invoices": "SEPA-overboeking QR-code voor facturen",
|
|
198
|
+
"Enable EPC QR on invoices": "EPC QR op facturen inschakelen",
|
|
199
|
+
"Show SEPA QR code on EUR invoices for easy bank payments":
|
|
200
|
+
"Toon SEPA QR-code op EUR-facturen voor eenvoudige bankbetalingen",
|
|
201
|
+
"EPC QR Payments": "EPC QR Betalingen",
|
|
202
|
+
"EPC QR is a European standard for SEPA credit transfers. When enabled, EUR invoices include a QR code that customers can scan with their banking app to pay instantly.":
|
|
203
|
+
"EPC QR is een Europese standaard voor SEPA-overboekingen. Wanneer ingeschakeld, bevatten EUR-facturen een QR-code die klanten kunnen scannen met hun bankapp om direct te betalen.",
|
|
194
204
|
} as const;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export default {
|
|
2
2
|
// Company settings
|
|
3
|
+
"Tax subject": "Podatnik",
|
|
3
4
|
"Tax ID 2": "Tax ID 2",
|
|
4
5
|
"Secondary tax identification number (optional)": "Secondary tax identification number (optional)",
|
|
5
6
|
"Company Information": "Informacje o firmie",
|
|
@@ -192,4 +193,13 @@ export default {
|
|
|
192
193
|
"Enter EU consumer sales clause...": "Wprowadź klauzulę sprzedaży konsumenckiej UE...",
|
|
193
194
|
"tax-clauses.other.description":
|
|
194
195
|
"Te rodzaje transakcji zwykle nie wymagają specyficznych klauzul podatkowych, ale możesz je skonfigurować w razie potrzeby.",
|
|
196
|
+
// EPC QR Payment section
|
|
197
|
+
"EPC QR Payment": "Płatność EPC QR",
|
|
198
|
+
"SEPA credit transfer QR code for invoices": "Kod QR przelewu SEPA na fakturach",
|
|
199
|
+
"Enable EPC QR on invoices": "Włącz EPC QR na fakturach",
|
|
200
|
+
"Show SEPA QR code on EUR invoices for easy bank payments":
|
|
201
|
+
"Pokaż kod QR SEPA na fakturach EUR dla łatwych płatności bankowych",
|
|
202
|
+
"EPC QR Payments": "Płatności EPC QR",
|
|
203
|
+
"EPC QR is a European standard for SEPA credit transfers. When enabled, EUR invoices include a QR code that customers can scan with their banking app to pay instantly.":
|
|
204
|
+
"EPC QR to europejski standard dla przelewów SEPA. Po włączeniu faktury EUR zawierają kod QR, który klienci mogą zeskanować aplikacją bankową, aby natychmiast zapłacić.",
|
|
195
205
|
} as const;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export default {
|
|
2
2
|
// Company settings
|
|
3
|
+
"Tax subject": "Sujeito fiscal",
|
|
3
4
|
"Tax ID 2": "Tax ID 2",
|
|
4
5
|
"Secondary tax identification number (optional)": "Secondary tax identification number (optional)",
|
|
5
6
|
"Company Information": "Informações da empresa",
|
|
@@ -193,4 +194,13 @@ export default {
|
|
|
193
194
|
"Enter EU consumer sales clause...": "Introduza a cláusula de venda ao consumidor UE...",
|
|
194
195
|
"tax-clauses.other.description":
|
|
195
196
|
"Estes tipos de transações normalmente não requerem cláusulas fiscais específicas, mas pode configurá-las conforme necessário.",
|
|
197
|
+
// EPC QR Payment section
|
|
198
|
+
"EPC QR Payment": "Pagamento EPC QR",
|
|
199
|
+
"SEPA credit transfer QR code for invoices": "Código QR de transferência SEPA para faturas",
|
|
200
|
+
"Enable EPC QR on invoices": "Ativar EPC QR nas faturas",
|
|
201
|
+
"Show SEPA QR code on EUR invoices for easy bank payments":
|
|
202
|
+
"Mostrar código QR SEPA em faturas EUR para pagamentos bancários fáceis",
|
|
203
|
+
"EPC QR Payments": "Pagamentos EPC QR",
|
|
204
|
+
"EPC QR is a European standard for SEPA credit transfers. When enabled, EUR invoices include a QR code that customers can scan with their banking app to pay instantly.":
|
|
205
|
+
"EPC QR é um padrão europeu para transferências SEPA. Quando ativado, as faturas em EUR incluem um código QR que os clientes podem digitalizar com a sua app bancária para pagar instantaneamente.",
|
|
196
206
|
} as const;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export default {
|
|
2
2
|
// Company settings
|
|
3
|
+
"Tax subject": "Davčni zavezanec",
|
|
3
4
|
"Tax ID 2": "Davčna številka 2",
|
|
4
5
|
"Secondary tax identification number (optional)": "Sekundarna davčna identifikacijska številka (neobvezno)",
|
|
5
6
|
"Company Information": "Podatki o podjetju",
|
|
@@ -187,4 +188,13 @@ export default {
|
|
|
187
188
|
"Enter EU consumer sales clause...": "Vnesite klavzulo za EU potrošniško prodajo...",
|
|
188
189
|
"tax-clauses.other.description":
|
|
189
190
|
"Te vrste transakcij običajno ne zahtevajo posebnih davčnih klavzul, vendar jih lahko konfigurirate po potrebi.",
|
|
191
|
+
// EPC QR Payment section
|
|
192
|
+
"EPC QR Payment": "EPC QR plačilo",
|
|
193
|
+
"SEPA credit transfer QR code for invoices": "SEPA QR koda za kreditne prenose na računih",
|
|
194
|
+
"Enable EPC QR on invoices": "Omogoči EPC QR na računih",
|
|
195
|
+
"Show SEPA QR code on EUR invoices for easy bank payments":
|
|
196
|
+
"Prikaži SEPA QR kodo na EUR računih za enostavna bančna plačila",
|
|
197
|
+
"EPC QR Payments": "EPC QR plačila",
|
|
198
|
+
"EPC QR is a European standard for SEPA credit transfers. When enabled, EUR invoices include a QR code that customers can scan with their banking app to pay instantly.":
|
|
199
|
+
"EPC QR je evropski standard za SEPA kreditne prenose. Ko je omogočen, EUR računi vključujejo QR kodo, ki jo stranke lahko skenirajo z bančno aplikacijo za takojšnje plačilo.",
|
|
190
200
|
} as const;
|