41 lines
1.5 KiB
TypeScript
41 lines
1.5 KiB
TypeScript
import type { Listing, User } from '@prisma/client';
|
|
|
|
export type BillingConfig = {
|
|
accountName: string | null;
|
|
iban: string | null;
|
|
includeVatLine: boolean;
|
|
};
|
|
|
|
type BillingUser = Pick<User, 'billingAccountName' | 'billingIban' | 'billingIncludeVatLine'>;
|
|
type BillingListing = Pick<Listing, 'billingAccountName' | 'billingIban' | 'billingIncludeVatLine'>;
|
|
|
|
export function normalizeOptionalString(input: unknown): string | null | undefined {
|
|
if (input === undefined) return undefined;
|
|
if (input === null) return null;
|
|
const value = String(input).trim();
|
|
return value ? value : null;
|
|
}
|
|
|
|
export function normalizeIban(input: unknown): string | null | undefined {
|
|
if (input === undefined) return undefined;
|
|
if (input === null) return null;
|
|
const value = String(input).replace(/\s+/g, '').toUpperCase();
|
|
return value ? value : null;
|
|
}
|
|
|
|
export function normalizeNullableBoolean(input: unknown): boolean | null | undefined {
|
|
if (input === undefined) return undefined;
|
|
if (input === null) return null;
|
|
return Boolean(input);
|
|
}
|
|
|
|
export function resolveBillingDetails(user: BillingUser, listing?: BillingListing | null): BillingConfig {
|
|
const accountName = listing?.billingAccountName ?? user.billingAccountName ?? null;
|
|
const iban = listing?.billingIban ?? user.billingIban ?? null;
|
|
const includeVatLine =
|
|
listing?.billingIncludeVatLine !== null && listing?.billingIncludeVatLine !== undefined
|
|
? Boolean(listing.billingIncludeVatLine)
|
|
: Boolean(user.billingIncludeVatLine);
|
|
|
|
return { accountName, iban, includeVatLine };
|
|
}
|