@swan-io/shared-business 13.2.3 → 13.2.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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@swan-io/shared-business",
|
|
3
|
-
"version": "13.2.
|
|
3
|
+
"version": "13.2.5",
|
|
4
4
|
"engines": {
|
|
5
5
|
"node": "^22.12.0"
|
|
6
6
|
},
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
],
|
|
26
26
|
"license": "MIT",
|
|
27
27
|
"peerDependencies": {
|
|
28
|
-
"@swan-io/lake": "13.2.
|
|
28
|
+
"@swan-io/lake": "13.2.5"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"@formatjs/intl": "^3.1.6",
|
|
@@ -50,6 +50,6 @@
|
|
|
50
50
|
"@types/react-dom": "^19.1.7",
|
|
51
51
|
"@types/react-native": "^0.72.8",
|
|
52
52
|
"type-fest": "^4.41.0",
|
|
53
|
-
"@swan-io/lake": "13.2.
|
|
53
|
+
"@swan-io/lake": "13.2.5"
|
|
54
54
|
}
|
|
55
55
|
}
|
|
@@ -21,7 +21,7 @@ const getTextStyle = (type, fontSize) => ({
|
|
|
21
21
|
const styles = StyleSheet.create({
|
|
22
22
|
container: {
|
|
23
23
|
width: 793,
|
|
24
|
-
padding:
|
|
24
|
+
padding: 40,
|
|
25
25
|
},
|
|
26
26
|
partnershipText: {
|
|
27
27
|
...getTextStyle("sans", 14),
|
|
@@ -52,8 +52,8 @@ const styles = StyleSheet.create({
|
|
|
52
52
|
textAlign: "right",
|
|
53
53
|
},
|
|
54
54
|
textColumn: {
|
|
55
|
-
paddingVertical: spacings[
|
|
56
|
-
...getTextStyle("sans",
|
|
55
|
+
paddingVertical: spacings[4],
|
|
56
|
+
...getTextStyle("sans", 10),
|
|
57
57
|
},
|
|
58
58
|
text: {
|
|
59
59
|
...getTextStyle("sans", 14),
|
|
@@ -108,9 +108,9 @@ const logoStyle = {
|
|
|
108
108
|
objectPosition: "left",
|
|
109
109
|
};
|
|
110
110
|
export const AccountStatementV1 = ({ partnerLogoUrl, style, accountHolderType, accountHolderName, accountHolderAddress, iban, bic, openingDate, closingDate, openingBalance, transactions, feesDebit, feesCredit, totalsCredit, totalsDebit, closingBalance, }) => {
|
|
111
|
-
return (
|
|
112
|
-
|
|
113
|
-
|
|
111
|
+
return (_jsx(Box, { style: [styles.container, style], direction: "column", justifyContent: "spaceBetween", children: _jsxs(Box, { children: [_jsx(Box, { direction: "row", justifyContent: "spaceBetween", children: _jsxs(Box, { direction: "row", alignItems: "center", children: [isNotNullishOrEmpty(partnerLogoUrl) ? (_jsx("img", { src: partnerLogoUrl, style: logoStyle })) : (_jsx(SwanLogo, { style: styles.defaultLogo })), _jsx(Separator, { horizontal: true, space: 8 }), _jsx(Text, { style: styles.partnershipText, children: t("accountStatement.partnership") }), _jsx(Space, { width: 4 }), _jsx(SwanLogo, { color: colors.gray[900], style: styles.swanLogo })] }) }), _jsx(Space, { height: 24 }), _jsx(Text, { style: styles.pageTitle, children: t("accountStatement.titleDocument") }), _jsx(Space, { height: 8 }), _jsx(Text, { style: styles.text, children: accountHolderType === "Company"
|
|
112
|
+
? t("accountStatement.titleDocument.companyDescription")
|
|
113
|
+
: t("accountStatement.titleDocument.individualDescription") }), _jsx(Space, { height: 24 }), _jsxs(Box, { direction: "row", justifyContent: "spaceBetween", children: [_jsxs(Box, { direction: "column", children: [_jsx(Text, { style: styles.sectionTitle, children: accountHolderName.toUpperCase() }), _jsx(Text, { style: styles.text, children: accountHolderAddress.street }), _jsx(Text, { style: styles.text, children: accountHolderAddress.city }), isNotNullish(accountHolderAddress.country) && (_jsx(Text, { style: styles.text, children: getCountryName(accountHolderAddress.country) }))] }), _jsxs(Box, { direction: "column", alignItems: "end", children: [_jsx(Text, { style: styles.sectionTitle, children: t("accountStatement.contactSupport") }), _jsx(Text, { style: styles.text, children: "support.swan.io" })] })] }), _jsx(Space, { height: 24 }), _jsx(Text, { style: styles.sectionTitle, children: t("accountStatement.iban") }), _jsx(Text, { style: styles.text, children: iban }), _jsx(Space, { height: 12 }), _jsx(Text, { style: styles.sectionTitle, children: t("accountStatement.bic") }), _jsx(Text, { style: styles.text, children: bic }), _jsx(Space, { height: 48 }), _jsxs(Box, { direction: "row", justifyContent: "spaceBetween", children: [_jsx(Box, { direction: "column", children: _jsx(Text, { style: styles.sectionTitle, children: t("accountStatement.date", { openingDate, closingDate }) }) }), _jsxs(Box, { direction: "column", children: [_jsx(Text, { style: styles.openingBalanceText, children: t("accountStatement.openingBalance") }), _jsx(Text, { style: styles.totalAmount, children: formatCurrencyIso(Number(openingBalance.value), openingBalance.currency) })] })] }), _jsx(Space, { height: 24 }), _jsxs(_Fragment, { children: [_jsxs(Box, { direction: "row", style: { backgroundColor: colors.gray[50] }, children: [_jsx(Text, { style: [styles.titleColumn, { width: "15%" }], children: t("accountStatement.column.date") }), _jsx(Text, { style: [styles.titleColumn, { width: "22%" }], children: t("accountStatement.column.type") }), _jsx(Text, { style: [styles.titleColumn, { width: "33%" }], children: t("accountStatement.column.description") }), _jsx(Text, { style: [styles.titleColumn, { width: "15%", textAlign: "right" }], children: t("accountStatement.column.credit") }), _jsx(Text, { style: [styles.titleColumn, { width: "15%", textAlign: "right" }], children: t("accountStatement.column.debit") })] }), _jsx(Box, { direction: "column", children: transactions.map(transaction => (_jsxs(Box, { direction: "row", children: [_jsx(Text, { style: [styles.textColumn, { width: "15%" }], children: transaction.date }), _jsx(Text, { style: [styles.textColumn, { width: "22%" }], children: translateTransaction(transaction.type) }), _jsx(Text, { style: [styles.textColumn, { width: "33%" }], children: transaction.label }), _jsx(Text, { style: [styles.textColumn, { width: "15%", textAlign: "right" }], children: transaction.credit ? transaction.credit.value : "" }), _jsx(Text, { style: [styles.textColumn, { width: "15%", textAlign: "right" }], children: transaction.debit ? transaction.debit.value : "" })] }, transaction.id))) })] }), _jsxs(Box, { direction: "column", children: [_jsxs(Box, { direction: "row", justifyContent: "end", children: [_jsx(Text, { style: styles.row, children: t("accountStatement.column.fees") }), _jsx(Text, { style: styles.row, children: feesCredit.value }), _jsx(Text, { style: styles.row, children: feesDebit.value })] }), _jsxs(Box, { direction: "row", justifyContent: "end", children: [_jsx(Text, { style: styles.row, children: t("accountStatement.column.totals") }), _jsx(Text, { style: styles.row, children: totalsCredit.value }), _jsx(Text, { style: styles.row, children: totalsDebit.value })] })] }), _jsx(Box, { direction: "row", justifyContent: "end", children: _jsxs(Box, { direction: "row", alignItems: "center", style: styles.closingBalanceRow, justifyContent: "spaceBetween", children: [_jsx(Title, { text: t("accountStatement.closingBalance") }), _jsx(Title, { text: formatCurrencyIso(Number(closingBalance.value), closingBalance.currency), style: styles.totalAmount, align: "right" })] }) })] }) }));
|
|
114
114
|
};
|
|
115
115
|
export const AccountStatement = (props) => match(props)
|
|
116
116
|
.with({ version: "v1" }, props => _jsx(AccountStatementV1, { ...props }))
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, expect, test } from "vitest";
|
|
2
|
-
import { getCompanyTaxNumberHelp, getCompanyTaxNumberPlaceholder, getIndividualTaxNumberHelp, getIndividualTaxNumberPlaceholder, getTaxNumberTooltip, isValidEmail, validateBooleanRequired, validateCompanyTaxNumber, validateIndividualTaxNumber, validateNullableRequired, validateRequired, } from "../validation";
|
|
2
|
+
import { getCompanyTaxNumberHelp, getCompanyTaxNumberPlaceholder, getIndividualTaxNumberHelp, getIndividualTaxNumberPlaceholder, getTaxNumberTooltip, isValidEmail, sanitizeDecimal, validateBooleanRequired, validateCompanyTaxNumber, validateIndividualTaxNumber, validateNullableRequired, validateRequired, } from "../validation";
|
|
3
3
|
describe("isValidEmail", () => {
|
|
4
4
|
test("validates correct email addresses", () => {
|
|
5
5
|
expect(isValidEmail("test@example.com")).toBe(true);
|
|
@@ -289,3 +289,20 @@ describe("Tax number helper functions", () => {
|
|
|
289
289
|
});
|
|
290
290
|
});
|
|
291
291
|
});
|
|
292
|
+
describe("sanitizeDecimal", () => {
|
|
293
|
+
test("removes spaces from decimal input", () => {
|
|
294
|
+
expect(sanitizeDecimal("1 000")).toBe("1000");
|
|
295
|
+
});
|
|
296
|
+
test("handles multiple spaces", () => {
|
|
297
|
+
expect(sanitizeDecimal("1 000 000")).toBe("1000000");
|
|
298
|
+
});
|
|
299
|
+
test("replaces comma with dot for decimal separator", () => {
|
|
300
|
+
expect(sanitizeDecimal("10,5")).toBe("10.5");
|
|
301
|
+
});
|
|
302
|
+
test("removes spaces and replaces comma with dot", () => {
|
|
303
|
+
expect(sanitizeDecimal("1 234,56")).toBe("1234.56");
|
|
304
|
+
});
|
|
305
|
+
test("returns unchanged string when no spaces or commas", () => {
|
|
306
|
+
expect(sanitizeDecimal("1234.56")).toBe("1234.56");
|
|
307
|
+
});
|
|
308
|
+
});
|
|
@@ -3,6 +3,7 @@ import { CompanyCountryCCA3, IndividualCountryCCA3 } from "../constants/countrie
|
|
|
3
3
|
import { ExtractedDate } from "./date";
|
|
4
4
|
export declare const isValidVatNumber: (maybeVat: string) => boolean;
|
|
5
5
|
export declare const isValidEmail: (maybeEmail: string) => boolean;
|
|
6
|
+
export declare const sanitizeDecimal: (value: string) => string;
|
|
6
7
|
export declare const validateNullableRequired: Validator<string | undefined>;
|
|
7
8
|
export declare const validateRequired: Validator<string>;
|
|
8
9
|
export declare const validateBooleanRequired: Validator<boolean | undefined>;
|
package/src/utils/validation.js
CHANGED
|
@@ -109,6 +109,9 @@ export const isValidVatNumber = (maybeVat) => {
|
|
|
109
109
|
export const isValidEmail = (maybeEmail) => {
|
|
110
110
|
return EMAIL_REGEX.test(maybeEmail);
|
|
111
111
|
};
|
|
112
|
+
export const sanitizeDecimal = (value) => {
|
|
113
|
+
return value.replace(/ /g, "").replace(/,/g, ".");
|
|
114
|
+
};
|
|
112
115
|
export const validateNullableRequired = value => {
|
|
113
116
|
if (value == null || !value) {
|
|
114
117
|
return t("error.requiredField");
|