@things-factory/biz-base 10.1.154 → 10.1.156
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/dist-server/index.d.ts +1 -0
- package/dist-server/index.js +1 -0
- package/dist-server/index.js.map +1 -1
- package/dist-server/service/counterparty/counterparty-bank-account-mutation.d.ts +9 -0
- package/dist-server/service/counterparty/counterparty-bank-account-mutation.js +70 -0
- package/dist-server/service/counterparty/counterparty-bank-account-mutation.js.map +1 -0
- package/dist-server/service/counterparty/counterparty-bank-account-query.d.ts +16 -0
- package/dist-server/service/counterparty/counterparty-bank-account-query.js +104 -0
- package/dist-server/service/counterparty/counterparty-bank-account-query.js.map +1 -0
- package/dist-server/service/counterparty/counterparty-bank-account-service.d.ts +27 -0
- package/dist-server/service/counterparty/counterparty-bank-account-service.js +87 -0
- package/dist-server/service/counterparty/counterparty-bank-account-service.js.map +1 -0
- package/dist-server/service/counterparty/counterparty-bank-account.d.ts +29 -0
- package/dist-server/service/counterparty/counterparty-bank-account.js +103 -0
- package/dist-server/service/counterparty/counterparty-bank-account.js.map +1 -0
- package/dist-server/service/counterparty/counterparty-document-readers.d.ts +7 -0
- package/dist-server/service/counterparty/counterparty-document-readers.js +18 -0
- package/dist-server/service/counterparty/counterparty-document-readers.js.map +1 -0
- package/dist-server/service/counterparty/counterparty-names.d.ts +22 -0
- package/dist-server/service/counterparty/counterparty-names.js +30 -14
- package/dist-server/service/counterparty/counterparty-names.js.map +1 -1
- package/dist-server/service/counterparty/counterparty-service.js +5 -0
- package/dist-server/service/counterparty/counterparty-service.js.map +1 -1
- package/dist-server/service/counterparty/counterparty-type.d.ts +9 -0
- package/dist-server/service/counterparty/counterparty-type.js +35 -1
- package/dist-server/service/counterparty/counterparty-type.js.map +1 -1
- package/dist-server/service/counterparty/index.d.ts +5 -2
- package/dist-server/service/counterparty/index.js +5 -2
- package/dist-server/service/counterparty/index.js.map +1 -1
- package/dist-server/service/index.d.ts +4 -2
- package/dist-server/service/index.js +2 -0
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -3
- package/tests/counterparty-bank-account.test.mjs +117 -0
- package/translations/en.json +4 -1
- package/translations/es.json +4 -1
- package/translations/ja.json +4 -1
- package/translations/ko.json +4 -1
- package/translations/ms.json +4 -1
- package/translations/zh.json +4 -1
|
@@ -13,6 +13,8 @@ exports.nameKey = nameKey;
|
|
|
13
13
|
exports.linkFor = linkFor;
|
|
14
14
|
exports.normalizeBusinessNumber = normalizeBusinessNumber;
|
|
15
15
|
exports.numberClash = numberClash;
|
|
16
|
+
exports.keyClash = keyClash;
|
|
17
|
+
exports.accountKey = accountKey;
|
|
16
18
|
exports.namesToRegister = namesToRegister;
|
|
17
19
|
exports.looksLikePersonName = looksLikePersonName;
|
|
18
20
|
exports.partiesFromNames = partiesFromNames;
|
|
@@ -80,39 +82,53 @@ function normalizeBusinessNumber(value) {
|
|
|
80
82
|
* may trade under one name.
|
|
81
83
|
*/
|
|
82
84
|
function numberClash(existing, changes, deleted = []) {
|
|
85
|
+
return keyClash(existing.map(one => ({ id: one.id, label: one.name, key: one.businessNumber })), changes.map(one => ({ id: one.id, label: one.name, key: one.businessNumber })), deleted);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Two rows holding one key that must be one row's — a business number, an account number — after a batch would apply.
|
|
89
|
+
* Only a clash the batch makes counts: a key it writes. A clash already in the rows does not stop another save.
|
|
90
|
+
*/
|
|
91
|
+
function keyClash(existing, changes, deleted = []) {
|
|
83
92
|
const before = new Map(existing.map(one => [one.id, one]));
|
|
84
93
|
const after = new Map();
|
|
85
94
|
for (const one of existing)
|
|
86
95
|
if (!deleted.includes(one.id))
|
|
87
|
-
after.set(one.id, {
|
|
88
|
-
const
|
|
96
|
+
after.set(one.id, { label: one.label, key: one.key ?? '' });
|
|
97
|
+
const keyed = new Set();
|
|
89
98
|
let fresh = 0;
|
|
90
99
|
for (const change of changes) {
|
|
91
100
|
const id = change.id ?? `new:${fresh++}`;
|
|
92
|
-
const current = after.get(id) ?? {
|
|
101
|
+
const current = after.get(id) ?? { label: '', key: '' };
|
|
93
102
|
const next = {
|
|
94
|
-
|
|
95
|
-
|
|
103
|
+
label: change.label ?? current.label,
|
|
104
|
+
key: change.key !== undefined ? change.key ?? '' : current.key
|
|
96
105
|
};
|
|
97
106
|
after.set(id, next);
|
|
98
|
-
if (next.
|
|
99
|
-
|
|
107
|
+
if (next.key && next.key !== (before.get(id)?.key ?? ''))
|
|
108
|
+
keyed.add(id);
|
|
100
109
|
}
|
|
101
110
|
const holders = new Map();
|
|
102
111
|
for (const [id, one] of after)
|
|
103
|
-
if (one.
|
|
104
|
-
holders.set(one.
|
|
105
|
-
for (const [
|
|
106
|
-
if (
|
|
112
|
+
if (one.key)
|
|
113
|
+
holders.set(one.key, [...(holders.get(one.key) ?? []), { id, label: one.label }]);
|
|
114
|
+
for (const [key, rows] of holders) {
|
|
115
|
+
if (rows.length < 2)
|
|
107
116
|
continue;
|
|
108
|
-
const made =
|
|
117
|
+
const made = rows.find(one => keyed.has(one.id));
|
|
109
118
|
if (!made)
|
|
110
119
|
continue;
|
|
111
|
-
const other =
|
|
112
|
-
return { number, existing: other.
|
|
120
|
+
const other = rows.find(one => one !== made);
|
|
121
|
+
return { number: key, existing: other.label, name: made.label };
|
|
113
122
|
}
|
|
114
123
|
return undefined;
|
|
115
124
|
}
|
|
125
|
+
/**
|
|
126
|
+
* An account number as it is compared and kept — its digits. Banks print the same account with the hyphens in
|
|
127
|
+
* different places, so `110-123-456789` and `110123456789` are one account. Empty when there are no digits.
|
|
128
|
+
*/
|
|
129
|
+
function accountKey(value) {
|
|
130
|
+
return String(value ?? '').replace(/\D/g, '');
|
|
131
|
+
}
|
|
116
132
|
/** Names to register: one spelling per party, skipping blanks and parties already known. */
|
|
117
133
|
function namesToRegister(names, known) {
|
|
118
134
|
const taken = new Set(known.map(one => nameKey(one.name)));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"counterparty-names.js","sourceRoot":"","sources":["../../../server/service/counterparty/counterparty-names.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * How names point at counterparties — one place for every module that keeps a name and a link.\n *\n * A document (a contract, a bank line, an invoice) records **the name as it was** and, when the domain knows that\n * party, a link to it. The name stays even if the party is renamed later. Names are compared the way people mean\n * them (§`nameKey`), and a counterparty's aliases count as its names.\n *\n * Pure: the caller hands over what it looked up.\n */\n\nimport { Refusal } from '@things-factory/shell'\n\nexport interface KnownCounterparty {\n id: string\n name: string\n}\n\n/**\n * Compare names the way people mean them — case, spacing and `(주)` / `주식회사` do not make another party.\n * NFKC folds the compatibility forms Hometax writes (`(주)` in fullwidth, `㈜`) into the plain ones.\n */\nexport function nameKey(name: string | null | undefined): string {\n return (\n String(name ?? '')\n .normalize('NFKC')\n .replace(/\\(\\s*주\\s*\\)|㈜|주식회사|\\(\\s*유\\s*\\)|유한회사/g, '')\n /* The same company written in Hangul or in Latin — 씨제이올리브네트웍스 is CJ올리브네트웍스. */\n .replace(/씨제이/g, 'cj')\n .replace(/에스케이/g, 'sk')\n .replace(/엘지/g, 'lg')\n .replace(/[\\s\\-_.·,()]+/g, '')\n .toLowerCase()\n )\n}\n\nexport type LinkChange = { counterparty?: { id: string } | null; customerName?: string | null }\n\n/**\n * What to write for the link, given the row's patch. Returns only what changes; an update that\n * touches neither the name nor the counterparty returns `{}`.\n */\nexport function linkFor(\n patch: { counterparty?: { id?: string | null } | null; customerName?: string | null },\n byId: (id: string) => KnownCounterparty | undefined,\n byName: (key: string) => KnownCounterparty | undefined\n): LinkChange {\n if (patch.counterparty !== undefined) {\n const id = patch.counterparty?.id\n if (!id) return { counterparty: null, ...('customerName' in patch ? { customerName: patch.customerName ?? null } : {}) }\n\n const known = byId(id)\n if (!known) throw new Refusal('counterparty-not-found', { id }, 'the counterparty was not found. reload and try again.')\n return { counterparty: { id: known.id }, customerName: known.name }\n }\n\n if (!('customerName' in patch)) return {}\n\n const name = patch.customerName?.trim() || null\n if (!name) return { counterparty: null, customerName: null }\n\n const known = byName(nameKey(name))\n return known ? { counterparty: { id: known.id }, customerName: name } : { counterparty: null, customerName: name }\n}\n\n/**\n * 사업자등록번호 — ten digits, stored as `123-45-67890`. Empty stays empty; anything else that is\n * not ten digits is refused rather than stored half-right.\n */\nexport function normalizeBusinessNumber(value: unknown): string | null {\n const text = String(value ?? '').trim()\n if (!text) return null\n\n const digits = text.replace(/[-\\s]/g, '')\n if (!/^\\d{10}$/.test(digits)) throw new Refusal('business-number-invalid', { text }, `'${text}' is not a business registration number (10 digits).`)\n\n return `${digits.slice(0, 3)}-${digits.slice(3, 5)}-${digits.slice(5)}`\n}\n\n/**\n * Two counterparties with one business registration number — after a batch would apply. Returns the clashing pair of\n * names and the number, or undefined. A number is one business: two counterparties holding it would split its\n * documents in two.\n *\n * Only a clash the batch makes counts: a number it registers or changes to. Names are not compared — two businesses\n * may trade under one name.\n */\nexport function numberClash(\n existing: readonly (KnownCounterparty & { businessNumber?: string | null })[],\n changes: readonly { id?: string; name?: string | null; businessNumber?: string | null }[],\n deleted: readonly string[] = []\n): { number: string; existing: string; name: string } | undefined {\n const before = new Map(existing.map(one => [one.id, one]))\n const after = new Map<string, { name: string; number: string }>()\n for (const one of existing) if (!deleted.includes(one.id)) after.set(one.id, { name: one.name, number: one.businessNumber ?? '' })\n\n const numbered = new Set<string>()\n let fresh = 0\n for (const change of changes) {\n const id = change.id ?? `new:${fresh++}`\n const current = after.get(id) ?? { name: '', number: '' }\n const next = {\n name: change.name ?? current.name,\n number: change.businessNumber !== undefined ? change.businessNumber ?? '' : current.number\n }\n after.set(id, next)\n if (next.number && next.number !== (before.get(id)?.businessNumber ?? '')) numbered.add(id)\n }\n\n const holders = new Map<string, { id: string; name: string }[]>()\n for (const [id, one] of after) if (one.number) holders.set(one.number, [...(holders.get(one.number) ?? []), { id, name: one.name }])\n for (const [number, parties] of holders) {\n if (parties.length < 2) continue\n const made = parties.find(one => numbered.has(one.id))\n if (!made) continue\n const other = parties.find(one => one !== made)!\n return { number, existing: other.name, name: made.name }\n }\n\n return undefined\n}\n\n/** Names to register: one spelling per party, skipping blanks and parties already known. */\nexport function namesToRegister(names: readonly (string | null | undefined)[], known: readonly KnownCounterparty[]): string[] {\n const taken = new Set(known.map(one => nameKey(one.name)))\n const out: string[] = []\n\n for (const name of names) {\n const trimmed = String(name ?? '').trim()\n const key = nameKey(trimmed)\n if (!key || taken.has(key)) continue\n taken.add(key)\n out.push(trimmed)\n }\n\n return out\n}\n\nexport interface PartyForMatch {\n id: string\n name: string\n aliases?: string | null\n}\n\nexport interface ProposedParty {\n name: string\n variants: string[]\n count: number\n maybePerson: boolean\n}\n\n/** Keys shorter than this match too much by accident. */\nconst MIN_KEY = 2\n\nconst SURNAMES = new Set('김이박최정강조윤장임한오서신권황안송류전홍고문양손배백허유남심노하곽성차주우구민진지엄채원천방공현함변염여추도소석선설마길연위표명기반왕금옥육인맹제모탁국어은편용예경봉사부가복태목형피두감음빈동온호범좌팽승간상갈단견당'.split(''))\n\nexport function looksLikePersonName(name: string): boolean {\n const trimmed = name.trim()\n return /^[가-힣]{2,4}$/.test(trimmed) && trimmed.length === 3 && SURNAMES.has(trimmed[0]) && !/(테크|솔루션|푸드|그룹|시스템|컴|넷|랩|소프트|산업|상사|물산|로지)/.test(trimmed)\n}\n\n/** The parties a list of names (contracts, documents) means, one per `nameKey`, spelled the way the ledger spells it most. */\nexport function partiesFromNames(names: readonly (string | null | undefined)[]): ProposedParty[] {\n const groups = new Map<string, Map<string, number>>()\n for (const raw of names) {\n const name = String(raw ?? '').trim()\n const key = nameKey(name)\n if (key.length < MIN_KEY) continue\n const spellings = groups.get(key) ?? new Map<string, number>()\n spellings.set(name, (spellings.get(name) ?? 0) + 1)\n groups.set(key, spellings)\n }\n\n return [...groups.values()]\n .map(spellings => {\n /* The spelling used most; on a tie the one without a corporate marker, then the shortest. */\n const variants = [...spellings.entries()].sort((a, b) => b[1] - a[1] || marker(a[0]) - marker(b[0]) || a[0].length - b[0].length).map(([one]) => one)\n const count = [...spellings.values()].reduce((sum, one) => sum + one, 0)\n return { name: variants[0], variants, count, maybePerson: looksLikePersonName(variants[0]) }\n })\n .sort((a, b) => a.name.localeCompare(b.name))\n}\n\nconst marker = (name: string) => (/\\(\\s*주\\s*\\)|㈜|주식회사/.test(name) ? 1 : 0)\n\nexport function aliasesOf(party: PartyForMatch): string[] {\n return String(party.aliases ?? '')\n .split(/[\\n,]/)\n .map(one => one.trim())\n .filter(Boolean)\n}\n\n/**\n * A function telling which party a name is — the party's name or one of its aliases, spelled any way\n * `nameKey` folds (§ a contract's 상호). An exact match, not a search.\n */\nexport function partyNamed(parties: readonly PartyForMatch[]): (name: string | null | undefined) => PartyForMatch | undefined {\n /* A name two parties go by answers neither — names are not unique. */\n const byKey = new Map<string, PartyForMatch | null>()\n for (const party of parties)\n for (const name of [party.name, ...aliasesOf(party)]) {\n const key = nameKey(name)\n byKey.set(key, byKey.has(key) && byKey.get(key) !== party ? null : party)\n }\n return name => (nameKey(name) ? byKey.get(nameKey(name)) ?? undefined : undefined)\n}\n\n/**\n * A function telling which party a text names. The longest matching name or alias wins; two\n * different parties matching equally long is ambiguous — no answer.\n */\nexport function matcherFor(parties: readonly PartyForMatch[]): (text: string | null | undefined) => PartyForMatch | undefined {\n const keys: { key: string; party: PartyForMatch }[] = []\n for (const party of parties) {\n for (const name of [party.name, ...aliasesOf(party)]) {\n const key = nameKey(name)\n if (key.length >= MIN_KEY) keys.push({ key, party })\n }\n }\n keys.sort((a, b) => b.key.length - a.key.length)\n\n return text => {\n const hay = nameKey(text)\n if (!hay) return undefined\n const hits = keys.filter(one => hay.includes(one.key))\n if (!hits.length) return undefined\n const longest = hits[0].key.length\n const top = new Set(hits.filter(one => one.key.length === longest).map(one => one.party.id))\n return top.size === 1 ? hits[0].party : undefined\n }\n}\n\n/** The texts left unmatched most often — what a person might add as aliases. */\nexport function frequentUnmatched(texts: readonly (string | null | undefined)[], limit = 30): { text: string; count: number }[] {\n const counts = new Map<string, number>()\n for (const raw of texts) {\n const text = String(raw ?? '').trim()\n if (!text) continue\n counts.set(text, (counts.get(text) ?? 0) + 1)\n }\n return [...counts.entries()]\n .map(([text, count]) => ({ text, count }))\n .sort((a, b) => b.count - a.count || a.text.localeCompare(b.text))\n .slice(0, limit)\n}\n"]}
|
|
1
|
+
{"version":3,"file":"counterparty-names.js","sourceRoot":"","sources":["../../../server/service/counterparty/counterparty-names.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * How names point at counterparties — one place for every module that keeps a name and a link.\n *\n * A document (a contract, a bank line, an invoice) records **the name as it was** and, when the domain knows that\n * party, a link to it. The name stays even if the party is renamed later. Names are compared the way people mean\n * them (§`nameKey`), and a counterparty's aliases count as its names.\n *\n * Pure: the caller hands over what it looked up.\n */\n\nimport { Refusal } from '@things-factory/shell'\n\nexport interface KnownCounterparty {\n id: string\n name: string\n}\n\n/**\n * Compare names the way people mean them — case, spacing and `(주)` / `주식회사` do not make another party.\n * NFKC folds the compatibility forms Hometax writes (`(주)` in fullwidth, `㈜`) into the plain ones.\n */\nexport function nameKey(name: string | null | undefined): string {\n return (\n String(name ?? '')\n .normalize('NFKC')\n .replace(/\\(\\s*주\\s*\\)|㈜|주식회사|\\(\\s*유\\s*\\)|유한회사/g, '')\n /* The same company written in Hangul or in Latin — 씨제이올리브네트웍스 is CJ올리브네트웍스. */\n .replace(/씨제이/g, 'cj')\n .replace(/에스케이/g, 'sk')\n .replace(/엘지/g, 'lg')\n .replace(/[\\s\\-_.·,()]+/g, '')\n .toLowerCase()\n )\n}\n\nexport type LinkChange = { counterparty?: { id: string } | null; customerName?: string | null }\n\n/**\n * What to write for the link, given the row's patch. Returns only what changes; an update that\n * touches neither the name nor the counterparty returns `{}`.\n */\nexport function linkFor(\n patch: { counterparty?: { id?: string | null } | null; customerName?: string | null },\n byId: (id: string) => KnownCounterparty | undefined,\n byName: (key: string) => KnownCounterparty | undefined\n): LinkChange {\n if (patch.counterparty !== undefined) {\n const id = patch.counterparty?.id\n if (!id) return { counterparty: null, ...('customerName' in patch ? { customerName: patch.customerName ?? null } : {}) }\n\n const known = byId(id)\n if (!known) throw new Refusal('counterparty-not-found', { id }, 'the counterparty was not found. reload and try again.')\n return { counterparty: { id: known.id }, customerName: known.name }\n }\n\n if (!('customerName' in patch)) return {}\n\n const name = patch.customerName?.trim() || null\n if (!name) return { counterparty: null, customerName: null }\n\n const known = byName(nameKey(name))\n return known ? { counterparty: { id: known.id }, customerName: name } : { counterparty: null, customerName: name }\n}\n\n/**\n * 사업자등록번호 — ten digits, stored as `123-45-67890`. Empty stays empty; anything else that is\n * not ten digits is refused rather than stored half-right.\n */\nexport function normalizeBusinessNumber(value: unknown): string | null {\n const text = String(value ?? '').trim()\n if (!text) return null\n\n const digits = text.replace(/[-\\s]/g, '')\n if (!/^\\d{10}$/.test(digits)) throw new Refusal('business-number-invalid', { text }, `'${text}' is not a business registration number (10 digits).`)\n\n return `${digits.slice(0, 3)}-${digits.slice(3, 5)}-${digits.slice(5)}`\n}\n\n/**\n * Two counterparties with one business registration number — after a batch would apply. Returns the clashing pair of\n * names and the number, or undefined. A number is one business: two counterparties holding it would split its\n * documents in two.\n *\n * Only a clash the batch makes counts: a number it registers or changes to. Names are not compared — two businesses\n * may trade under one name.\n */\nexport function numberClash(\n existing: readonly (KnownCounterparty & { businessNumber?: string | null })[],\n changes: readonly { id?: string; name?: string | null; businessNumber?: string | null }[],\n deleted: readonly string[] = []\n): { number: string; existing: string; name: string } | undefined {\n return keyClash(\n existing.map(one => ({ id: one.id, label: one.name, key: one.businessNumber })),\n changes.map(one => ({ id: one.id, label: one.name, key: one.businessNumber })),\n deleted\n )\n}\n\n/**\n * Two rows holding one key that must be one row's — a business number, an account number — after a batch would apply.\n * Only a clash the batch makes counts: a key it writes. A clash already in the rows does not stop another save.\n */\nexport function keyClash(\n existing: readonly { id: string; label: string; key?: string | null }[],\n changes: readonly { id?: string; label?: string | null; key?: string | null }[],\n deleted: readonly string[] = []\n): { number: string; existing: string; name: string } | undefined {\n const before = new Map(existing.map(one => [one.id, one]))\n const after = new Map<string, { label: string; key: string }>()\n for (const one of existing) if (!deleted.includes(one.id)) after.set(one.id, { label: one.label, key: one.key ?? '' })\n\n const keyed = new Set<string>()\n let fresh = 0\n for (const change of changes) {\n const id = change.id ?? `new:${fresh++}`\n const current = after.get(id) ?? { label: '', key: '' }\n const next = {\n label: change.label ?? current.label,\n key: change.key !== undefined ? change.key ?? '' : current.key\n }\n after.set(id, next)\n if (next.key && next.key !== (before.get(id)?.key ?? '')) keyed.add(id)\n }\n\n const holders = new Map<string, { id: string; label: string }[]>()\n for (const [id, one] of after) if (one.key) holders.set(one.key, [...(holders.get(one.key) ?? []), { id, label: one.label }])\n for (const [key, rows] of holders) {\n if (rows.length < 2) continue\n const made = rows.find(one => keyed.has(one.id))\n if (!made) continue\n const other = rows.find(one => one !== made)!\n return { number: key, existing: other.label, name: made.label }\n }\n\n return undefined\n}\n\n/**\n * An account number as it is compared and kept — its digits. Banks print the same account with the hyphens in\n * different places, so `110-123-456789` and `110123456789` are one account. Empty when there are no digits.\n */\nexport function accountKey(value: unknown): string {\n return String(value ?? '').replace(/\\D/g, '')\n}\n\n/** Names to register: one spelling per party, skipping blanks and parties already known. */\nexport function namesToRegister(names: readonly (string | null | undefined)[], known: readonly KnownCounterparty[]): string[] {\n const taken = new Set(known.map(one => nameKey(one.name)))\n const out: string[] = []\n\n for (const name of names) {\n const trimmed = String(name ?? '').trim()\n const key = nameKey(trimmed)\n if (!key || taken.has(key)) continue\n taken.add(key)\n out.push(trimmed)\n }\n\n return out\n}\n\nexport interface PartyForMatch {\n id: string\n name: string\n aliases?: string | null\n}\n\nexport interface ProposedParty {\n name: string\n variants: string[]\n count: number\n maybePerson: boolean\n}\n\n/** Keys shorter than this match too much by accident. */\nconst MIN_KEY = 2\n\nconst SURNAMES = new Set('김이박최정강조윤장임한오서신권황안송류전홍고문양손배백허유남심노하곽성차주우구민진지엄채원천방공현함변염여추도소석선설마길연위표명기반왕금옥육인맹제모탁국어은편용예경봉사부가복태목형피두감음빈동온호범좌팽승간상갈단견당'.split(''))\n\nexport function looksLikePersonName(name: string): boolean {\n const trimmed = name.trim()\n return /^[가-힣]{2,4}$/.test(trimmed) && trimmed.length === 3 && SURNAMES.has(trimmed[0]) && !/(테크|솔루션|푸드|그룹|시스템|컴|넷|랩|소프트|산업|상사|물산|로지)/.test(trimmed)\n}\n\n/** The parties a list of names (contracts, documents) means, one per `nameKey`, spelled the way the ledger spells it most. */\nexport function partiesFromNames(names: readonly (string | null | undefined)[]): ProposedParty[] {\n const groups = new Map<string, Map<string, number>>()\n for (const raw of names) {\n const name = String(raw ?? '').trim()\n const key = nameKey(name)\n if (key.length < MIN_KEY) continue\n const spellings = groups.get(key) ?? new Map<string, number>()\n spellings.set(name, (spellings.get(name) ?? 0) + 1)\n groups.set(key, spellings)\n }\n\n return [...groups.values()]\n .map(spellings => {\n /* The spelling used most; on a tie the one without a corporate marker, then the shortest. */\n const variants = [...spellings.entries()].sort((a, b) => b[1] - a[1] || marker(a[0]) - marker(b[0]) || a[0].length - b[0].length).map(([one]) => one)\n const count = [...spellings.values()].reduce((sum, one) => sum + one, 0)\n return { name: variants[0], variants, count, maybePerson: looksLikePersonName(variants[0]) }\n })\n .sort((a, b) => a.name.localeCompare(b.name))\n}\n\nconst marker = (name: string) => (/\\(\\s*주\\s*\\)|㈜|주식회사/.test(name) ? 1 : 0)\n\nexport function aliasesOf(party: PartyForMatch): string[] {\n return String(party.aliases ?? '')\n .split(/[\\n,]/)\n .map(one => one.trim())\n .filter(Boolean)\n}\n\n/**\n * A function telling which party a name is — the party's name or one of its aliases, spelled any way\n * `nameKey` folds (§ a contract's 상호). An exact match, not a search.\n */\nexport function partyNamed(parties: readonly PartyForMatch[]): (name: string | null | undefined) => PartyForMatch | undefined {\n /* A name two parties go by answers neither — names are not unique. */\n const byKey = new Map<string, PartyForMatch | null>()\n for (const party of parties)\n for (const name of [party.name, ...aliasesOf(party)]) {\n const key = nameKey(name)\n byKey.set(key, byKey.has(key) && byKey.get(key) !== party ? null : party)\n }\n return name => (nameKey(name) ? byKey.get(nameKey(name)) ?? undefined : undefined)\n}\n\n/**\n * A function telling which party a text names. The longest matching name or alias wins; two\n * different parties matching equally long is ambiguous — no answer.\n */\nexport function matcherFor(parties: readonly PartyForMatch[]): (text: string | null | undefined) => PartyForMatch | undefined {\n const keys: { key: string; party: PartyForMatch }[] = []\n for (const party of parties) {\n for (const name of [party.name, ...aliasesOf(party)]) {\n const key = nameKey(name)\n if (key.length >= MIN_KEY) keys.push({ key, party })\n }\n }\n keys.sort((a, b) => b.key.length - a.key.length)\n\n return text => {\n const hay = nameKey(text)\n if (!hay) return undefined\n const hits = keys.filter(one => hay.includes(one.key))\n if (!hits.length) return undefined\n const longest = hits[0].key.length\n const top = new Set(hits.filter(one => one.key.length === longest).map(one => one.party.id))\n return top.size === 1 ? hits[0].party : undefined\n }\n}\n\n/** The texts left unmatched most often — what a person might add as aliases. */\nexport function frequentUnmatched(texts: readonly (string | null | undefined)[], limit = 30): { text: string; count: number }[] {\n const counts = new Map<string, number>()\n for (const raw of texts) {\n const text = String(raw ?? '').trim()\n if (!text) continue\n counts.set(text, (counts.get(text) ?? 0) + 1)\n }\n return [...counts.entries()]\n .map(([text, count]) => ({ text, count }))\n .sort((a, b) => b.count - a.count || a.text.localeCompare(b.text))\n .slice(0, limit)\n}\n"]}
|
|
@@ -5,6 +5,7 @@ exports.saveCounterparties = saveCounterparties;
|
|
|
5
5
|
const typeorm_1 = require("typeorm");
|
|
6
6
|
const shell_1 = require("@things-factory/shell");
|
|
7
7
|
const counterparty_1 = require("./counterparty");
|
|
8
|
+
const counterparty_bank_account_1 = require("./counterparty-bank-account");
|
|
8
9
|
const counterparty_names_1 = require("./counterparty-names");
|
|
9
10
|
const listeners = [];
|
|
10
11
|
/** Run after every save of counterparties, in the same transaction. */
|
|
@@ -68,7 +69,11 @@ async function saveCounterparties(tx, domain, user, patches) {
|
|
|
68
69
|
const owned = await repo.find({ where: { domain: { id: domain.id }, id: (0, typeorm_1.In)(deletes) }, select: ['id'] });
|
|
69
70
|
if (owned.length !== deletes.length)
|
|
70
71
|
throw new shell_1.Refusal('counterparty-not-found', {}, 'a counterparty was not found - reload and try again');
|
|
72
|
+
/* Its accounts go with it - a number stays free for whoever holds it next. Found first: a deleted counterparty joins nothing. */
|
|
73
|
+
const accounts = await tx.getRepository(counterparty_bank_account_1.CounterpartyBankAccount).find({ where: { counterparty: { id: (0, typeorm_1.In)(deletes) } }, select: ['id'] });
|
|
71
74
|
await repo.softDelete({ id: (0, typeorm_1.In)(deletes) });
|
|
75
|
+
if (accounts.length)
|
|
76
|
+
await tx.getRepository(counterparty_bank_account_1.CounterpartyBankAccount).softDelete({ id: (0, typeorm_1.In)(accounts.map(one => one.id)) });
|
|
72
77
|
}
|
|
73
78
|
const saved = [];
|
|
74
79
|
for (const row of updates) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"counterparty-service.js","sourceRoot":"","sources":["../../../server/service/counterparty/counterparty-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { EntityManager, In } from 'typeorm'\n\nimport { Refusal } from '@things-factory/shell'\n\nimport { Counterparty, CounterpartyKind } from './counterparty'\nimport { CounterpartyPatch } from './counterparty-type'\nimport { normalizeBusinessNumber, numberClash } from './counterparty-names'\n\n/**\n * Saving the counterparty list of a domain, and what an app does once it is saved.\n *\n * A module whose documents keep a counterparty's name (a contract, a bank line) links the rows that carry a newly\n * registered name — that is its rule, not this one's — by listening here (§`onCounterpartiesSaved`).\n */\n\ntype Saved = (tx: EntityManager, domain: { id: string }, saved: Counterparty[]) => Promise<void>\nconst listeners: Saved[] = []\n\n/** Run after every save of counterparties, in the same transaction. */\nexport function onCounterpartiesSaved(listener: Saved): void {\n listeners.push(listener)\n}\n\n/** The words people write for the kind, as well as the values themselves. */\nconst KIND_WORDS: Record<CounterpartyKind, string[]> = {\n [CounterpartyKind.COMPANY]: ['COMPANY', '회사', '법인', '사업자', '기업'],\n [CounterpartyKind.PERSON]: ['PERSON', '개인']\n}\n\nfunction kindOf(value: unknown): CounterpartyKind | undefined {\n const text = String(value ?? '').trim()\n if (!text) return undefined\n const found = (Object.keys(KIND_WORDS) as CounterpartyKind[]).find(kind => KIND_WORDS[kind].some(word => word.toLowerCase() === text.toLowerCase()))\n if (!found) throw new Refusal('counterparty-kind-invalid', { text }, `'${text}' is neither a company nor a person`)\n return found\n}\n\nconst TEXT = ['aliases', 'branchNumber', 'representative', 'address', 'billingAddress', 'businessType', 'businessItem', 'notes'] as const\n\n/** A patch as the row it writes: names trimmed, the kind and the business number in their stored form. */\nfunction rowOf(patch: Partial<CounterpartyPatch>, isNew: boolean): Partial<Counterparty> {\n const row: Record<string, any> = {}\n if (patch.name !== undefined || isNew) {\n const name = String(patch.name ?? '').trim()\n if (!name) throw new Refusal('counterparty-name-required', {}, 'a counterparty needs a name')\n row.name = name\n }\n for (const field of TEXT) if (patch[field] !== undefined) row[field] = String(patch[field] ?? '').trim() || null\n if (patch.kind !== undefined) row.kind = kindOf(patch.kind) ?? CounterpartyKind.COMPANY\n else if (isNew) row.kind = CounterpartyKind.COMPANY\n if (patch.businessNumber !== undefined) row.businessNumber = normalizeBusinessNumber(patch.businessNumber)\n if (patch.zeroRated !== undefined) row.zeroRated = !!patch.zeroRated\n if (patch.active !== undefined) row.active = patch.active !== false\n return row\n}\n\n/**\n * Apply grid rows to a domain's counterparties: `+` (or no id) registers, `M` changes, `-` deletes (softly — the rows\n * that name it keep the name). Two counterparties with one business registration number are refused (§`numberClash`);\n * a name may be shared.\n */\nexport async function saveCounterparties(tx: EntityManager, domain: { id: string }, user: any, patches: CounterpartyPatch[]): Promise<Counterparty[]> {\n const repo = tx.getRepository(Counterparty)\n const deletes = patches.filter(one => one.cuFlag === '-' && one.id).map(one => one.id!)\n const updates = patches.filter(one => one.id && one.cuFlag !== '-' && one.cuFlag !== '+').map(one => ({ id: one.id!, ...rowOf(one, false) }))\n const creates = patches.filter(one => !one.id || one.cuFlag === '+').filter(one => one.cuFlag !== '-').map(one => rowOf(one, true))\n\n const existing = await repo.find({ where: { domain: { id: domain.id } }, select: ['id', 'name', 'businessNumber'] })\n const clash = numberClash(existing, [...updates, ...creates], deletes)\n if (clash)\n throw new Refusal('counterparty-number-clash', clash, `business number ${clash.number} is already '${clash.existing}' - edit that counterparty instead`)\n\n if (deletes.length) {\n const owned = await repo.find({ where: { domain: { id: domain.id }, id: In(deletes) }, select: ['id'] })\n if (owned.length !== deletes.length) throw new Refusal('counterparty-not-found', {}, 'a counterparty was not found - reload and try again')\n await repo.softDelete({ id: In(deletes) })\n }\n\n const saved: Counterparty[] = []\n for (const row of updates) {\n const current = await repo.findOne({ where: { domain: { id: domain.id }, id: row.id } })\n if (!current) throw new Refusal('counterparty-not-found', {}, 'a counterparty was not found - reload and try again')\n saved.push(await repo.save({ ...current, ...row, updater: user }))\n }\n for (const row of creates) saved.push(await repo.save({ ...row, domain, creator: user, updater: user } as Counterparty))\n\n for (const listener of listeners) await listener(tx, domain, saved)\n return saved\n}\n"]}
|
|
1
|
+
{"version":3,"file":"counterparty-service.js","sourceRoot":"","sources":["../../../server/service/counterparty/counterparty-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { EntityManager, In } from 'typeorm'\n\nimport { Refusal } from '@things-factory/shell'\n\nimport { Counterparty, CounterpartyKind } from './counterparty'\nimport { CounterpartyBankAccount } from './counterparty-bank-account'\nimport { CounterpartyPatch } from './counterparty-type'\nimport { normalizeBusinessNumber, numberClash } from './counterparty-names'\n\n/**\n * Saving the counterparty list of a domain, and what an app does once it is saved.\n *\n * A module whose documents keep a counterparty's name (a contract, a bank line) links the rows that carry a newly\n * registered name — that is its rule, not this one's — by listening here (§`onCounterpartiesSaved`).\n */\n\ntype Saved = (tx: EntityManager, domain: { id: string }, saved: Counterparty[]) => Promise<void>\nconst listeners: Saved[] = []\n\n/** Run after every save of counterparties, in the same transaction. */\nexport function onCounterpartiesSaved(listener: Saved): void {\n listeners.push(listener)\n}\n\n/** The words people write for the kind, as well as the values themselves. */\nconst KIND_WORDS: Record<CounterpartyKind, string[]> = {\n [CounterpartyKind.COMPANY]: ['COMPANY', '회사', '법인', '사업자', '기업'],\n [CounterpartyKind.PERSON]: ['PERSON', '개인']\n}\n\nfunction kindOf(value: unknown): CounterpartyKind | undefined {\n const text = String(value ?? '').trim()\n if (!text) return undefined\n const found = (Object.keys(KIND_WORDS) as CounterpartyKind[]).find(kind => KIND_WORDS[kind].some(word => word.toLowerCase() === text.toLowerCase()))\n if (!found) throw new Refusal('counterparty-kind-invalid', { text }, `'${text}' is neither a company nor a person`)\n return found\n}\n\nconst TEXT = ['aliases', 'branchNumber', 'representative', 'address', 'billingAddress', 'businessType', 'businessItem', 'notes'] as const\n\n/** A patch as the row it writes: names trimmed, the kind and the business number in their stored form. */\nfunction rowOf(patch: Partial<CounterpartyPatch>, isNew: boolean): Partial<Counterparty> {\n const row: Record<string, any> = {}\n if (patch.name !== undefined || isNew) {\n const name = String(patch.name ?? '').trim()\n if (!name) throw new Refusal('counterparty-name-required', {}, 'a counterparty needs a name')\n row.name = name\n }\n for (const field of TEXT) if (patch[field] !== undefined) row[field] = String(patch[field] ?? '').trim() || null\n if (patch.kind !== undefined) row.kind = kindOf(patch.kind) ?? CounterpartyKind.COMPANY\n else if (isNew) row.kind = CounterpartyKind.COMPANY\n if (patch.businessNumber !== undefined) row.businessNumber = normalizeBusinessNumber(patch.businessNumber)\n if (patch.zeroRated !== undefined) row.zeroRated = !!patch.zeroRated\n if (patch.active !== undefined) row.active = patch.active !== false\n return row\n}\n\n/**\n * Apply grid rows to a domain's counterparties: `+` (or no id) registers, `M` changes, `-` deletes (softly — the rows\n * that name it keep the name). Two counterparties with one business registration number are refused (§`numberClash`);\n * a name may be shared.\n */\nexport async function saveCounterparties(tx: EntityManager, domain: { id: string }, user: any, patches: CounterpartyPatch[]): Promise<Counterparty[]> {\n const repo = tx.getRepository(Counterparty)\n const deletes = patches.filter(one => one.cuFlag === '-' && one.id).map(one => one.id!)\n const updates = patches.filter(one => one.id && one.cuFlag !== '-' && one.cuFlag !== '+').map(one => ({ id: one.id!, ...rowOf(one, false) }))\n const creates = patches.filter(one => !one.id || one.cuFlag === '+').filter(one => one.cuFlag !== '-').map(one => rowOf(one, true))\n\n const existing = await repo.find({ where: { domain: { id: domain.id } }, select: ['id', 'name', 'businessNumber'] })\n const clash = numberClash(existing, [...updates, ...creates], deletes)\n if (clash)\n throw new Refusal('counterparty-number-clash', clash, `business number ${clash.number} is already '${clash.existing}' - edit that counterparty instead`)\n\n if (deletes.length) {\n const owned = await repo.find({ where: { domain: { id: domain.id }, id: In(deletes) }, select: ['id'] })\n if (owned.length !== deletes.length) throw new Refusal('counterparty-not-found', {}, 'a counterparty was not found - reload and try again')\n /* Its accounts go with it - a number stays free for whoever holds it next. Found first: a deleted counterparty joins nothing. */\n const accounts = await tx.getRepository(CounterpartyBankAccount).find({ where: { counterparty: { id: In(deletes) } }, select: ['id'] })\n await repo.softDelete({ id: In(deletes) })\n if (accounts.length) await tx.getRepository(CounterpartyBankAccount).softDelete({ id: In(accounts.map(one => one.id)) })\n }\n\n const saved: Counterparty[] = []\n for (const row of updates) {\n const current = await repo.findOne({ where: { domain: { id: domain.id }, id: row.id } })\n if (!current) throw new Refusal('counterparty-not-found', {}, 'a counterparty was not found - reload and try again')\n saved.push(await repo.save({ ...current, ...row, updater: user }))\n }\n for (const row of creates) saved.push(await repo.save({ ...row, domain, creator: user, updater: user } as Counterparty))\n\n for (const listener of listeners) await listener(tx, domain, saved)\n return saved\n}\n"]}
|
|
@@ -35,3 +35,12 @@ export declare class CounterpartyList {
|
|
|
35
35
|
items: Counterparty[];
|
|
36
36
|
total: number;
|
|
37
37
|
}
|
|
38
|
+
export declare class CounterpartyBankAccountPatch {
|
|
39
|
+
id?: string;
|
|
40
|
+
cuFlag?: string;
|
|
41
|
+
counterpartyId?: string;
|
|
42
|
+
bankName?: string;
|
|
43
|
+
accountNumber?: string;
|
|
44
|
+
holderName?: string;
|
|
45
|
+
notes?: string;
|
|
46
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CounterpartyList = exports.CounterpartyPatch = exports.NewCounterparty = void 0;
|
|
3
|
+
exports.CounterpartyBankAccountPatch = exports.CounterpartyList = exports.CounterpartyPatch = exports.NewCounterparty = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const type_graphql_1 = require("type-graphql");
|
|
6
6
|
const counterparty_1 = require("./counterparty");
|
|
@@ -142,4 +142,38 @@ tslib_1.__decorate([
|
|
|
142
142
|
exports.CounterpartyList = CounterpartyList = tslib_1.__decorate([
|
|
143
143
|
(0, type_graphql_1.ObjectType)({ description: 'A page of counterparties' })
|
|
144
144
|
], CounterpartyList);
|
|
145
|
+
let CounterpartyBankAccountPatch = class CounterpartyBankAccountPatch {
|
|
146
|
+
};
|
|
147
|
+
exports.CounterpartyBankAccountPatch = CounterpartyBankAccountPatch;
|
|
148
|
+
tslib_1.__decorate([
|
|
149
|
+
(0, type_graphql_1.Field)(type => type_graphql_1.ID, { nullable: true, description: 'The account; empty for a new one' }),
|
|
150
|
+
tslib_1.__metadata("design:type", String)
|
|
151
|
+
], CounterpartyBankAccountPatch.prototype, "id", void 0);
|
|
152
|
+
tslib_1.__decorate([
|
|
153
|
+
(0, type_graphql_1.Field)({ nullable: true, description: 'Grid flag: + new, M changed, - deleted' }),
|
|
154
|
+
tslib_1.__metadata("design:type", String)
|
|
155
|
+
], CounterpartyBankAccountPatch.prototype, "cuFlag", void 0);
|
|
156
|
+
tslib_1.__decorate([
|
|
157
|
+
(0, type_graphql_1.Field)({ nullable: true, description: 'The counterparty the account is of - needed for a new one' }),
|
|
158
|
+
tslib_1.__metadata("design:type", String)
|
|
159
|
+
], CounterpartyBankAccountPatch.prototype, "counterpartyId", void 0);
|
|
160
|
+
tslib_1.__decorate([
|
|
161
|
+
(0, type_graphql_1.Field)({ nullable: true, description: 'The bank' }),
|
|
162
|
+
tslib_1.__metadata("design:type", String)
|
|
163
|
+
], CounterpartyBankAccountPatch.prototype, "bankName", void 0);
|
|
164
|
+
tslib_1.__decorate([
|
|
165
|
+
(0, type_graphql_1.Field)({ nullable: true, description: 'The account number, as written - its digits are kept' }),
|
|
166
|
+
tslib_1.__metadata("design:type", String)
|
|
167
|
+
], CounterpartyBankAccountPatch.prototype, "accountNumber", void 0);
|
|
168
|
+
tslib_1.__decorate([
|
|
169
|
+
(0, type_graphql_1.Field)({ nullable: true, description: 'The account holder (예금주)' }),
|
|
170
|
+
tslib_1.__metadata("design:type", String)
|
|
171
|
+
], CounterpartyBankAccountPatch.prototype, "holderName", void 0);
|
|
172
|
+
tslib_1.__decorate([
|
|
173
|
+
(0, type_graphql_1.Field)({ nullable: true, description: 'Notes' }),
|
|
174
|
+
tslib_1.__metadata("design:type", String)
|
|
175
|
+
], CounterpartyBankAccountPatch.prototype, "notes", void 0);
|
|
176
|
+
exports.CounterpartyBankAccountPatch = CounterpartyBankAccountPatch = tslib_1.__decorate([
|
|
177
|
+
(0, type_graphql_1.InputType)({ description: 'A change to a counterparty account, or a row of its grid (cuFlag + for new, M for changed, - for deleted)' })
|
|
178
|
+
], CounterpartyBankAccountPatch);
|
|
145
179
|
//# sourceMappingURL=counterparty-type.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"counterparty-type.js","sourceRoot":"","sources":["../../../server/service/counterparty/counterparty-type.ts"],"names":[],"mappings":"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","sourcesContent":["import { Field, ID, InputType, Int, ObjectType } from 'type-graphql'\n\nimport { Counterparty, CounterpartyKind } from './counterparty'\n\n@InputType({ description: 'A counterparty to register' })\nexport class NewCounterparty {\n @Field({ description: 'The name the business knows it by' }) name: string\n @Field({ nullable: true, description: 'Other names it appears under' }) aliases?: string\n @Field(type => CounterpartyKind, { nullable: true, description: 'A company or a person' }) kind?: CounterpartyKind\n @Field({ nullable: true, description: 'Business registration number' }) businessNumber?: string\n @Field({ nullable: true, description: 'Sub-business place number' }) branchNumber?: string\n @Field({ nullable: true, description: 'Representative' }) representative?: string\n @Field({ nullable: true, description: 'Address' }) address?: string\n @Field({ nullable: true, description: 'Billing address' }) billingAddress?: string\n @Field({ nullable: true, description: 'Business type (업태)' }) businessType?: string\n @Field({ nullable: true, description: 'Business item (종목)' }) businessItem?: string\n @Field({ nullable: true, description: 'Whether sales to it are zero-rated' }) zeroRated?: boolean\n @Field({ nullable: true, description: 'Notes' }) notes?: string\n @Field({ nullable: true, description: 'Whether it is still offered for new rows' }) active?: boolean\n}\n\n@InputType({ description: 'A change to a counterparty, or a row of the counterparty grid (cuFlag + for new, M for changed, - for deleted)' })\nexport class CounterpartyPatch {\n @Field(type => ID, { nullable: true, description: 'The counterparty; empty for a new one' }) id?: string\n @Field({ nullable: true, description: 'Grid flag: + new, M changed, - deleted' }) cuFlag?: string\n @Field({ nullable: true, description: 'Name' }) name?: string\n @Field({ nullable: true, description: 'Other names it appears under' }) aliases?: string\n @Field({ nullable: true, description: 'COMPANY or PERSON, or the words people write for them' }) kind?: string\n @Field({ nullable: true, description: 'Business registration number' }) businessNumber?: string\n @Field({ nullable: true, description: 'Sub-business place number' }) branchNumber?: string\n @Field({ nullable: true, description: 'Representative' }) representative?: string\n @Field({ nullable: true, description: 'Address' }) address?: string\n @Field({ nullable: true, description: 'Billing address' }) billingAddress?: string\n @Field({ nullable: true, description: 'Business type (업태)' }) businessType?: string\n @Field({ nullable: true, description: 'Business item (종목)' }) businessItem?: string\n @Field({ nullable: true, description: 'Whether sales to it are zero-rated' }) zeroRated?: boolean\n @Field({ nullable: true, description: 'Notes' }) notes?: string\n @Field({ nullable: true, description: 'Whether it is still offered for new rows' }) active?: boolean\n}\n\n@ObjectType({ description: 'A page of counterparties' })\nexport class CounterpartyList {\n @Field(type => [Counterparty], { description: 'Counterparties on the page' }) items: Counterparty[]\n @Field(type => Int, { description: 'How many match' }) total: number\n}\n"]}
|
|
1
|
+
{"version":3,"file":"counterparty-type.js","sourceRoot":"","sources":["../../../server/service/counterparty/counterparty-type.ts"],"names":[],"mappings":"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","sourcesContent":["import { Field, ID, InputType, Int, ObjectType } from 'type-graphql'\n\nimport { Counterparty, CounterpartyKind } from './counterparty'\n\n@InputType({ description: 'A counterparty to register' })\nexport class NewCounterparty {\n @Field({ description: 'The name the business knows it by' }) name: string\n @Field({ nullable: true, description: 'Other names it appears under' }) aliases?: string\n @Field(type => CounterpartyKind, { nullable: true, description: 'A company or a person' }) kind?: CounterpartyKind\n @Field({ nullable: true, description: 'Business registration number' }) businessNumber?: string\n @Field({ nullable: true, description: 'Sub-business place number' }) branchNumber?: string\n @Field({ nullable: true, description: 'Representative' }) representative?: string\n @Field({ nullable: true, description: 'Address' }) address?: string\n @Field({ nullable: true, description: 'Billing address' }) billingAddress?: string\n @Field({ nullable: true, description: 'Business type (업태)' }) businessType?: string\n @Field({ nullable: true, description: 'Business item (종목)' }) businessItem?: string\n @Field({ nullable: true, description: 'Whether sales to it are zero-rated' }) zeroRated?: boolean\n @Field({ nullable: true, description: 'Notes' }) notes?: string\n @Field({ nullable: true, description: 'Whether it is still offered for new rows' }) active?: boolean\n}\n\n@InputType({ description: 'A change to a counterparty, or a row of the counterparty grid (cuFlag + for new, M for changed, - for deleted)' })\nexport class CounterpartyPatch {\n @Field(type => ID, { nullable: true, description: 'The counterparty; empty for a new one' }) id?: string\n @Field({ nullable: true, description: 'Grid flag: + new, M changed, - deleted' }) cuFlag?: string\n @Field({ nullable: true, description: 'Name' }) name?: string\n @Field({ nullable: true, description: 'Other names it appears under' }) aliases?: string\n @Field({ nullable: true, description: 'COMPANY or PERSON, or the words people write for them' }) kind?: string\n @Field({ nullable: true, description: 'Business registration number' }) businessNumber?: string\n @Field({ nullable: true, description: 'Sub-business place number' }) branchNumber?: string\n @Field({ nullable: true, description: 'Representative' }) representative?: string\n @Field({ nullable: true, description: 'Address' }) address?: string\n @Field({ nullable: true, description: 'Billing address' }) billingAddress?: string\n @Field({ nullable: true, description: 'Business type (업태)' }) businessType?: string\n @Field({ nullable: true, description: 'Business item (종목)' }) businessItem?: string\n @Field({ nullable: true, description: 'Whether sales to it are zero-rated' }) zeroRated?: boolean\n @Field({ nullable: true, description: 'Notes' }) notes?: string\n @Field({ nullable: true, description: 'Whether it is still offered for new rows' }) active?: boolean\n}\n\n@ObjectType({ description: 'A page of counterparties' })\nexport class CounterpartyList {\n @Field(type => [Counterparty], { description: 'Counterparties on the page' }) items: Counterparty[]\n @Field(type => Int, { description: 'How many match' }) total: number\n}\n\n@InputType({ description: 'A change to a counterparty account, or a row of its grid (cuFlag + for new, M for changed, - for deleted)' })\nexport class CounterpartyBankAccountPatch {\n @Field(type => ID, { nullable: true, description: 'The account; empty for a new one' }) id?: string\n @Field({ nullable: true, description: 'Grid flag: + new, M changed, - deleted' }) cuFlag?: string\n @Field({ nullable: true, description: 'The counterparty the account is of - needed for a new one' }) counterpartyId?: string\n @Field({ nullable: true, description: 'The bank' }) bankName?: string\n @Field({ nullable: true, description: 'The account number, as written - its digits are kept' }) accountNumber?: string\n @Field({ nullable: true, description: 'The account holder (예금주)' }) holderName?: string\n @Field({ nullable: true, description: 'Notes' }) notes?: string\n}\n"]}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { Counterparty } from './counterparty';
|
|
2
|
+
import { CounterpartyBankAccount } from './counterparty-bank-account';
|
|
3
|
+
import { CounterpartyBankAccountMutation } from './counterparty-bank-account-mutation';
|
|
4
|
+
import { CounterpartyBankAccountQuery, CounterpartyFilesQuery } from './counterparty-bank-account-query';
|
|
2
5
|
import { CounterpartyMutation } from './counterparty-mutation';
|
|
3
6
|
import { CounterpartyQuery } from './counterparty-query';
|
|
4
|
-
export declare const entities: (typeof Counterparty)[];
|
|
5
|
-
export declare const resolvers: (typeof CounterpartyMutation | typeof CounterpartyQuery)[];
|
|
7
|
+
export declare const entities: (typeof Counterparty | typeof CounterpartyBankAccount)[];
|
|
8
|
+
export declare const resolvers: (typeof CounterpartyBankAccountMutation | typeof CounterpartyBankAccountQuery | typeof CounterpartyFilesQuery | typeof CounterpartyMutation | typeof CounterpartyQuery)[];
|
|
@@ -2,8 +2,11 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.resolvers = exports.entities = void 0;
|
|
4
4
|
const counterparty_1 = require("./counterparty");
|
|
5
|
+
const counterparty_bank_account_1 = require("./counterparty-bank-account");
|
|
6
|
+
const counterparty_bank_account_mutation_1 = require("./counterparty-bank-account-mutation");
|
|
7
|
+
const counterparty_bank_account_query_1 = require("./counterparty-bank-account-query");
|
|
5
8
|
const counterparty_mutation_1 = require("./counterparty-mutation");
|
|
6
9
|
const counterparty_query_1 = require("./counterparty-query");
|
|
7
|
-
exports.entities = [counterparty_1.Counterparty];
|
|
8
|
-
exports.resolvers = [counterparty_query_1.CounterpartyQuery, counterparty_mutation_1.CounterpartyMutation];
|
|
10
|
+
exports.entities = [counterparty_1.Counterparty, counterparty_bank_account_1.CounterpartyBankAccount];
|
|
11
|
+
exports.resolvers = [counterparty_query_1.CounterpartyQuery, counterparty_mutation_1.CounterpartyMutation, counterparty_bank_account_query_1.CounterpartyBankAccountQuery, counterparty_bank_account_query_1.CounterpartyFilesQuery, counterparty_bank_account_mutation_1.CounterpartyBankAccountMutation];
|
|
9
12
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/counterparty/index.ts"],"names":[],"mappings":";;;AAAA,iDAA6C;AAC7C,mEAA8D;AAC9D,6DAAwD;AAE3C,QAAA,QAAQ,GAAG,CAAC,2BAAY,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/counterparty/index.ts"],"names":[],"mappings":";;;AAAA,iDAA6C;AAC7C,2EAAqE;AACrE,6FAAsF;AACtF,uFAAwG;AACxG,mEAA8D;AAC9D,6DAAwD;AAE3C,QAAA,QAAQ,GAAG,CAAC,2BAAY,EAAE,mDAAuB,CAAC,CAAA;AAClD,QAAA,SAAS,GAAG,CAAC,sCAAiB,EAAE,4CAAoB,EAAE,8DAA4B,EAAE,wDAAsB,EAAE,oEAA+B,CAAC,CAAA","sourcesContent":["import { Counterparty } from './counterparty'\nimport { CounterpartyBankAccount } from './counterparty-bank-account'\nimport { CounterpartyBankAccountMutation } from './counterparty-bank-account-mutation'\nimport { CounterpartyBankAccountQuery, CounterpartyFilesQuery } from './counterparty-bank-account-query'\nimport { CounterpartyMutation } from './counterparty-mutation'\nimport { CounterpartyQuery } from './counterparty-query'\n\nexport const entities = [Counterparty, CounterpartyBankAccount]\nexport const resolvers = [CounterpartyQuery, CounterpartyMutation, CounterpartyBankAccountQuery, CounterpartyFilesQuery, CounterpartyBankAccountMutation]\n"]}
|
|
@@ -5,6 +5,8 @@ export * from './biz-option-detail/biz-option-detail';
|
|
|
5
5
|
export * from './counterparty/counterparty';
|
|
6
6
|
export * from './counterparty/counterparty-names';
|
|
7
7
|
export * from './counterparty/counterparty-service';
|
|
8
|
+
export * from './counterparty/counterparty-bank-account';
|
|
9
|
+
export * from './counterparty/counterparty-bank-account-service';
|
|
8
10
|
export * from './worker/worker';
|
|
9
11
|
export * from './company/company-types';
|
|
10
12
|
export * from './bizplace/bizplace-types';
|
|
@@ -12,9 +14,9 @@ export * from './biz-option/biz-option-types';
|
|
|
12
14
|
export * from './biz-option-detail/biz-option-detail-types';
|
|
13
15
|
export * from './counterparty/counterparty-type';
|
|
14
16
|
export * from './worker/worker-types';
|
|
15
|
-
export declare const entities: (typeof import("./biz-option-detail/biz-option-detail").BizOptionDetail | typeof import("./biz-option/biz-option").BizOption | typeof import("./company/company").Company | typeof import("./bizplace/bizplace").Bizplace | typeof import("./counterparty/counterparty").Counterparty | typeof import("./worker/worker").Worker)[];
|
|
17
|
+
export declare const entities: (typeof import("./biz-option-detail/biz-option-detail").BizOptionDetail | typeof import("./biz-option/biz-option").BizOption | typeof import("./company/company").Company | typeof import("./bizplace/bizplace").Bizplace | typeof import("./counterparty/counterparty").Counterparty | typeof import("./counterparty/counterparty-bank-account").CounterpartyBankAccount | typeof import("./worker/worker").Worker)[];
|
|
16
18
|
export declare const schema: {
|
|
17
|
-
resolverClasses: (typeof import("./biz-option/biz-option-mutation").BizOptionMutation | typeof import("./biz-option/biz-option-query").BizOptionQuery | typeof import("./biz-option-detail/biz-option-detail-mutation").BizOptionDetailMutation | typeof import("./biz-option-detail/biz-option-detail-query").BizOptionDetailQuery | typeof import("./bizplace/bizplace-mutation").BizplaceMutation | typeof import("./bizplace/bizplace-query").BizplaceQuery | typeof import("./company/company-mutation").CompanyMutation | typeof import("./company/company-query").CompanyQuery | typeof import("./counterparty/counterparty-mutation").CounterpartyMutation | typeof import("./counterparty/counterparty-query").CounterpartyQuery | typeof import("./worker/worker-mutation").WorkerMutation | typeof import("./worker/worker-query").WorkerQuery)[];
|
|
19
|
+
resolverClasses: (typeof import("./biz-option/biz-option-mutation").BizOptionMutation | typeof import("./biz-option/biz-option-query").BizOptionQuery | typeof import("./biz-option-detail/biz-option-detail-mutation").BizOptionDetailMutation | typeof import("./biz-option-detail/biz-option-detail-query").BizOptionDetailQuery | typeof import("./bizplace/bizplace-mutation").BizplaceMutation | typeof import("./bizplace/bizplace-query").BizplaceQuery | typeof import("./company/company-mutation").CompanyMutation | typeof import("./company/company-query").CompanyQuery | typeof import("./counterparty/counterparty-bank-account-mutation").CounterpartyBankAccountMutation | typeof import("./counterparty/counterparty-bank-account-query").CounterpartyBankAccountQuery | typeof import("./counterparty/counterparty-bank-account-query").CounterpartyFilesQuery | typeof import("./counterparty/counterparty-mutation").CounterpartyMutation | typeof import("./counterparty/counterparty-query").CounterpartyQuery | typeof import("./worker/worker-mutation").WorkerMutation | typeof import("./worker/worker-query").WorkerQuery)[];
|
|
18
20
|
};
|
|
19
21
|
export { createCompany, deleteCompanies, deleteCompany, updateCompany } from './company/company-mutation';
|
|
20
22
|
export { createWorker, deleteWorker, deleteWorkers, updateWorker } from './worker/worker-mutation';
|
|
@@ -17,6 +17,8 @@ tslib_1.__exportStar(require("./biz-option-detail/biz-option-detail"), exports);
|
|
|
17
17
|
tslib_1.__exportStar(require("./counterparty/counterparty"), exports);
|
|
18
18
|
tslib_1.__exportStar(require("./counterparty/counterparty-names"), exports);
|
|
19
19
|
tslib_1.__exportStar(require("./counterparty/counterparty-service"), exports);
|
|
20
|
+
tslib_1.__exportStar(require("./counterparty/counterparty-bank-account"), exports);
|
|
21
|
+
tslib_1.__exportStar(require("./counterparty/counterparty-bank-account-service"), exports);
|
|
20
22
|
tslib_1.__exportStar(require("./worker/worker"), exports);
|
|
21
23
|
/* EXPORT TYPES */
|
|
22
24
|
tslib_1.__exportStar(require("./company/company-types"), exports);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/service/index.ts"],"names":[],"mappings":";;;;AAAA,mCAAmC;AACnC,6CAA6F;AAC7F,2DAAgH;AAChH,yCAAyF;AACzF,uCAAsF;AACtF,iDAAqG;AACrG,qCAAmF;AAEnF,yBAAyB;AACzB,4DAAiC;AACjC,8DAAmC;AACnC,kEAAuC;AACvC,gFAAqD;AACrD,sEAA2C;AAC3C,4EAAiD;AACjD,8EAAmD;AACnD,0DAA+B;AAE/B,kBAAkB;AAClB,kEAAuC;AACvC,oEAAyC;AACzC,wEAA6C;AAC7C,sFAA2D;AAC3D,2EAAgD;AAChD,gEAAqC;AAExB,QAAA,QAAQ,GAAG;IACtB,GAAG,kBAAe;IAClB,GAAG,mBAAgB;IACnB,GAAG,qBAAiB;IACpB,GAAG,4BAAuB;IAC1B,GAAG,uBAAoB;IACvB,GAAG,iBAAc;CAClB,CAAA;AAEY,QAAA,MAAM,GAAG;IACpB,eAAe,EAAE;QACf,GAAG,mBAAgB;QACnB,GAAG,oBAAiB;QACpB,GAAG,sBAAkB;QACrB,GAAG,6BAAwB;QAC3B,GAAG,wBAAqB;QACxB,GAAG,kBAAe;KACnB;CACF,CAAA;AAED,+DAAyG;AAAhG,iHAAA,aAAa,OAAA;AAAE,mHAAA,eAAe,OAAA;AAAE,iHAAA,aAAa,OAAA;AAAE,iHAAA,aAAa,OAAA;AACrE,4DAAkG;AAAzF,+GAAA,YAAY,OAAA;AAAE,+GAAA,YAAY,OAAA;AAAE,gHAAA,aAAa,OAAA;AAAE,+GAAA,YAAY,OAAA","sourcesContent":["/* IMPORT ENTITIES AND RESOLVERS */\nimport { entities as BizOptionEntities, resolvers as BizOptionResolvers } from './biz-option'\nimport { entities as BizOptionDetailEntities, resolvers as BizOptionDetailResolvers } from './biz-option-detail'\nimport { entities as BizplaceEntities, resolvers as BizplaceResolvers } from './bizplace'\nimport { entities as CompanyEntities, resolvers as CompanyResolvers } from './company'\nimport { entities as CounterpartyEntities, resolvers as CounterpartyResolvers } from './counterparty'\nimport { entities as WorkerEntities, resolvers as WorkerResolvers } from './worker'\n\n/* EXPORT ENTITY TYPES */\nexport * from './company/company'\nexport * from './bizplace/bizplace'\nexport * from './biz-option/biz-option'\nexport * from './biz-option-detail/biz-option-detail'\nexport * from './counterparty/counterparty'\nexport * from './counterparty/counterparty-names'\nexport * from './counterparty/counterparty-service'\nexport * from './worker/worker'\n\n/* EXPORT TYPES */\nexport * from './company/company-types'\nexport * from './bizplace/bizplace-types'\nexport * from './biz-option/biz-option-types'\nexport * from './biz-option-detail/biz-option-detail-types'\nexport * from './counterparty/counterparty-type'\nexport * from './worker/worker-types'\n\nexport const entities = [\n ...CompanyEntities,\n ...BizplaceEntities,\n ...BizOptionEntities,\n ...BizOptionDetailEntities,\n ...CounterpartyEntities,\n ...WorkerEntities\n]\n\nexport const schema = {\n resolverClasses: [\n ...CompanyResolvers,\n ...BizplaceResolvers,\n ...BizOptionResolvers,\n ...BizOptionDetailResolvers,\n ...CounterpartyResolvers,\n ...WorkerResolvers\n ]\n}\n\nexport { createCompany, deleteCompanies, deleteCompany, updateCompany } from './company/company-mutation'\nexport { createWorker, deleteWorker, deleteWorkers, updateWorker } from './worker/worker-mutation'\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/service/index.ts"],"names":[],"mappings":";;;;AAAA,mCAAmC;AACnC,6CAA6F;AAC7F,2DAAgH;AAChH,yCAAyF;AACzF,uCAAsF;AACtF,iDAAqG;AACrG,qCAAmF;AAEnF,yBAAyB;AACzB,4DAAiC;AACjC,8DAAmC;AACnC,kEAAuC;AACvC,gFAAqD;AACrD,sEAA2C;AAC3C,4EAAiD;AACjD,8EAAmD;AACnD,mFAAwD;AACxD,2FAAgE;AAChE,0DAA+B;AAE/B,kBAAkB;AAClB,kEAAuC;AACvC,oEAAyC;AACzC,wEAA6C;AAC7C,sFAA2D;AAC3D,2EAAgD;AAChD,gEAAqC;AAExB,QAAA,QAAQ,GAAG;IACtB,GAAG,kBAAe;IAClB,GAAG,mBAAgB;IACnB,GAAG,qBAAiB;IACpB,GAAG,4BAAuB;IAC1B,GAAG,uBAAoB;IACvB,GAAG,iBAAc;CAClB,CAAA;AAEY,QAAA,MAAM,GAAG;IACpB,eAAe,EAAE;QACf,GAAG,mBAAgB;QACnB,GAAG,oBAAiB;QACpB,GAAG,sBAAkB;QACrB,GAAG,6BAAwB;QAC3B,GAAG,wBAAqB;QACxB,GAAG,kBAAe;KACnB;CACF,CAAA;AAED,+DAAyG;AAAhG,iHAAA,aAAa,OAAA;AAAE,mHAAA,eAAe,OAAA;AAAE,iHAAA,aAAa,OAAA;AAAE,iHAAA,aAAa,OAAA;AACrE,4DAAkG;AAAzF,+GAAA,YAAY,OAAA;AAAE,+GAAA,YAAY,OAAA;AAAE,gHAAA,aAAa,OAAA;AAAE,+GAAA,YAAY,OAAA","sourcesContent":["/* IMPORT ENTITIES AND RESOLVERS */\nimport { entities as BizOptionEntities, resolvers as BizOptionResolvers } from './biz-option'\nimport { entities as BizOptionDetailEntities, resolvers as BizOptionDetailResolvers } from './biz-option-detail'\nimport { entities as BizplaceEntities, resolvers as BizplaceResolvers } from './bizplace'\nimport { entities as CompanyEntities, resolvers as CompanyResolvers } from './company'\nimport { entities as CounterpartyEntities, resolvers as CounterpartyResolvers } from './counterparty'\nimport { entities as WorkerEntities, resolvers as WorkerResolvers } from './worker'\n\n/* EXPORT ENTITY TYPES */\nexport * from './company/company'\nexport * from './bizplace/bizplace'\nexport * from './biz-option/biz-option'\nexport * from './biz-option-detail/biz-option-detail'\nexport * from './counterparty/counterparty'\nexport * from './counterparty/counterparty-names'\nexport * from './counterparty/counterparty-service'\nexport * from './counterparty/counterparty-bank-account'\nexport * from './counterparty/counterparty-bank-account-service'\nexport * from './worker/worker'\n\n/* EXPORT TYPES */\nexport * from './company/company-types'\nexport * from './bizplace/bizplace-types'\nexport * from './biz-option/biz-option-types'\nexport * from './biz-option-detail/biz-option-detail-types'\nexport * from './counterparty/counterparty-type'\nexport * from './worker/worker-types'\n\nexport const entities = [\n ...CompanyEntities,\n ...BizplaceEntities,\n ...BizOptionEntities,\n ...BizOptionDetailEntities,\n ...CounterpartyEntities,\n ...WorkerEntities\n]\n\nexport const schema = {\n resolverClasses: [\n ...CompanyResolvers,\n ...BizplaceResolvers,\n ...BizOptionResolvers,\n ...BizOptionDetailResolvers,\n ...CounterpartyResolvers,\n ...WorkerResolvers\n ]\n}\n\nexport { createCompany, deleteCompanies, deleteCompany, updateCompany } from './company/company-mutation'\nexport { createWorker, deleteWorker, deleteWorkers, updateWorker } from './worker/worker-mutation'\n"]}
|