56 lines
1.6 KiB
TypeScript
56 lines
1.6 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 };
|
|
}
|