48 lines
1.5 KiB
TypeScript
48 lines
1.5 KiB
TypeScript
export type CounterpartyRoleHint = "ordinary_counterparty" | "bank_or_financial_institution";
|
||
|
||
const FINANCIAL_INSTITUTION_PATTERNS: RegExp[] = [
|
||
/(?:^|[\s"«(,-])банк(?:$|[\s"»),.-])/u,
|
||
/сбербанк/u,
|
||
/(?:^|[\s"«(,-])сбер(?:$|[\s"»),.-])/u,
|
||
/(?:^|[\s"«(,-])втб(?:$|[\s"»),.-])/u,
|
||
/альфа[\s-]*банк/u,
|
||
/тинькофф/u,
|
||
/(?:^|[\s"«(,-])т[\s-]*банк(?:$|[\s"»),.-])/u,
|
||
/газпромбанк/u,
|
||
/росбанк/u,
|
||
/райффайзен/u,
|
||
/совкомбанк/u,
|
||
/промсвязьбанк/u,
|
||
/(?:^|[\s"«(,-])псб(?:$|[\s"»),.-])/u,
|
||
/(?:^|[\s"«(,-])мкб(?:$|[\s"»),.-])/u,
|
||
/ак[\s-]*барс/u,
|
||
/уралсиб/u,
|
||
/юникредит/u,
|
||
/почта[\s-]*банк/u,
|
||
/(?:^|[\s"«(,-])открытие(?:$|[\s"»),.-])/u,
|
||
/кредитн(?:ая|ый|ое|ые)\s+организац/u
|
||
];
|
||
|
||
function normalizeCounterpartyRoleText(value: unknown): string {
|
||
return String(value ?? "")
|
||
.toLowerCase()
|
||
.replace(/ё/g, "е")
|
||
.replace(/[._]+/g, " ")
|
||
.replace(/\s+/g, " ")
|
||
.trim();
|
||
}
|
||
|
||
export function isLikelyFinancialInstitutionCounterparty(value: unknown): boolean {
|
||
const normalized = normalizeCounterpartyRoleText(value);
|
||
if (!normalized) {
|
||
return false;
|
||
}
|
||
return FINANCIAL_INSTITUTION_PATTERNS.some((pattern) => pattern.test(normalized));
|
||
}
|
||
|
||
export function counterpartyRoleHintForName(value: unknown): CounterpartyRoleHint {
|
||
return isLikelyFinancialInstitutionCounterparty(value)
|
||
? "bank_or_financial_institution"
|
||
: "ordinary_counterparty";
|
||
}
|