forked from icd/mt940-mbank-ts
style: apply wider print width for all files
This commit is contained in:
parent
9591e500f7
commit
43183ef9b9
17
.arcconfig
17
.arcconfig
@ -1,12 +1,7 @@
|
|||||||
{
|
{
|
||||||
"phabricator.uri": "https://hub.sealcode.org/",
|
"phabricator.uri": "https://hub.sealcode.org/",
|
||||||
"arc.land.onto.default": "hotwire",
|
"arc.land.onto.default": "hotwire",
|
||||||
"load": [
|
"load": ["arcanist-linters", "arc-unit-mocha/src"],
|
||||||
"arcanist-linters",
|
"unit.engine": "MochaEngine",
|
||||||
"arc-unit-mocha/src"
|
"unit.mocha.include": [".test/**/*.ts"]
|
||||||
],
|
}
|
||||||
"unit.engine": "MochaEngine",
|
|
||||||
"unit.mocha.include": [
|
|
||||||
".test/**/*.ts"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
27
.prettierrc
27
.prettierrc
@ -1,22 +1,7 @@
|
|||||||
{
|
{
|
||||||
"useTabs": true,
|
"useTabs": true,
|
||||||
"tabWidth": 4,
|
"tabWidth": 4,
|
||||||
"trailingComma": "es5",
|
"trailingComma": "es5",
|
||||||
"printWidth": 100,
|
"printWidth": 120,
|
||||||
"overrides": [
|
"htmlWhitespaceSensitivity": "ignore"
|
||||||
{
|
}
|
||||||
"files": "*.yml",
|
|
||||||
"options": {
|
|
||||||
"tabWidth": 2,
|
|
||||||
"useTabs": false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"files": "*.html",
|
|
||||||
"options": {
|
|
||||||
"printWidth": 120,
|
|
||||||
"htmlWhitespaceSensitivity": "ignore"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
@ -30,9 +30,7 @@ async function handle() {
|
|||||||
const result = convert(string);
|
const result = convert(string);
|
||||||
download(
|
download(
|
||||||
result.output,
|
result.output,
|
||||||
`raport-${result.range.date_start.getFullYear()}-${(
|
`raport-${result.range.date_start.getFullYear()}-${(result.range.date_start.getMonth() + 1)
|
||||||
result.range.date_start.getMonth() + 1
|
|
||||||
)
|
|
||||||
.toString()
|
.toString()
|
||||||
.padStart(2, "0")}.mt940`,
|
.padStart(2, "0")}.mt940`,
|
||||||
"text"
|
"text"
|
||||||
|
@ -7,47 +7,31 @@ import * as Diff from "diff";
|
|||||||
|
|
||||||
describe("mt940 converter", () => {
|
describe("mt940 converter", () => {
|
||||||
it("converts properly", async () => {
|
it("converts properly", async () => {
|
||||||
const content = await fs.readFile(
|
const content = await fs.readFile(path.resolve(__dirname, "../tests/real_csv.csv"), {
|
||||||
path.resolve(__dirname, "../tests/real_csv.csv"),
|
encoding: null,
|
||||||
{
|
});
|
||||||
encoding: null,
|
|
||||||
}
|
|
||||||
);
|
|
||||||
const result = convert(iconv.decode(content, "cp1250"));
|
const result = convert(iconv.decode(content, "cp1250"));
|
||||||
const expected_result = await fs.readFile(
|
const expected_result = await fs.readFile(path.resolve(__dirname, "../tests/real_mt940.txt"), "utf-8");
|
||||||
path.resolve(__dirname, "../tests/real_mt940.txt"),
|
|
||||||
"utf-8"
|
|
||||||
);
|
|
||||||
try {
|
try {
|
||||||
assert.strictEqual(result.output, expected_result);
|
assert.strictEqual(result.output, expected_result);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error("There was a difference. Fixes to apply:");
|
console.error("There was a difference. Fixes to apply:");
|
||||||
console.log(
|
console.log(Diff.createPatch("mt940", result.output, expected_result));
|
||||||
Diff.createPatch("mt940", result.output, expected_result)
|
|
||||||
);
|
|
||||||
throw new Error("Texts differ");
|
throw new Error("Texts differ");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
it.only("converts properly", async () => {
|
it.only("converts properly", async () => {
|
||||||
const content = await fs.readFile(
|
const content = await fs.readFile(path.resolve(__dirname, "../tests/real_csv_2.csv"), {
|
||||||
path.resolve(__dirname, "../tests/real_csv_2.csv"),
|
encoding: null,
|
||||||
{
|
});
|
||||||
encoding: null,
|
|
||||||
}
|
|
||||||
);
|
|
||||||
const result = convert(iconv.decode(content, "cp1250"));
|
const result = convert(iconv.decode(content, "cp1250"));
|
||||||
const expected_result = await fs.readFile(
|
const expected_result = await fs.readFile(path.resolve(__dirname, "../tests/real_mt940_2.txt"), "utf-8");
|
||||||
path.resolve(__dirname, "../tests/real_mt940_2.txt"),
|
|
||||||
"utf-8"
|
|
||||||
);
|
|
||||||
try {
|
try {
|
||||||
assert.strictEqual(result.output, expected_result);
|
assert.strictEqual(result.output, expected_result);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error("There was a difference. Fixes to apply:");
|
console.error("There was a difference. Fixes to apply:");
|
||||||
console.log(
|
console.log(Diff.createPatch("mt940", result.output, expected_result));
|
||||||
Diff.createPatch("mt940", result.output, expected_result)
|
|
||||||
);
|
|
||||||
throw new Error("Texts differ");
|
throw new Error("Texts differ");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
91
src/index.ts
91
src/index.ts
@ -1,9 +1,4 @@
|
|||||||
import {
|
import { addLineNumbers, chunks, fillWithEmpty, removeRepeatingSpace } from "./utils";
|
||||||
addLineNumbers,
|
|
||||||
chunks,
|
|
||||||
fillWithEmpty,
|
|
||||||
removeRepeatingSpace,
|
|
||||||
} from "./utils";
|
|
||||||
|
|
||||||
class Account {
|
class Account {
|
||||||
constructor(
|
constructor(
|
||||||
@ -35,18 +30,12 @@ class Transaction {
|
|||||||
})();
|
})();
|
||||||
|
|
||||||
formatTitle() {
|
formatTitle() {
|
||||||
return addLineNumbers(
|
return addLineNumbers(fillWithEmpty(chunks(this.title.trim(), 27), 9), 20).join("\n");
|
||||||
fillWithEmpty(chunks(this.title.trim(), 27), 9),
|
|
||||||
20
|
|
||||||
).join("\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
formatPerson() {
|
formatPerson() {
|
||||||
const ret = addLineNumbers(
|
const ret = addLineNumbers(
|
||||||
fillWithEmpty(
|
fillWithEmpty(chunks(removeRepeatingSpace(this.person).trim(), 27), 2).slice(0, 2),
|
||||||
chunks(removeRepeatingSpace(this.person).trim(), 27),
|
|
||||||
2
|
|
||||||
).slice(0, 2),
|
|
||||||
32
|
32
|
||||||
).join("\n");
|
).join("\n");
|
||||||
return ret;
|
return ret;
|
||||||
@ -55,26 +44,11 @@ class Transaction {
|
|||||||
toMT940() {
|
toMT940() {
|
||||||
// just a bunch of heuristics
|
// just a bunch of heuristics
|
||||||
const prefix_fns = [
|
const prefix_fns = [
|
||||||
() =>
|
() => (this.description.includes("OPŁATA-PRZELEW WEWN.") ? "169" : false),
|
||||||
this.description.includes("OPŁATA-PRZELEW WEWN.")
|
() => (this.description.includes("PRZELEW WEWNĘTRZNY PRZY") ? "160" : false),
|
||||||
? "169"
|
() => (this.description.includes("OPŁATA-PRZELEW WEWN. DO") ? "755" : false),
|
||||||
: false,
|
() => (this.description.includes("PRZELEW ZEWNĘTRZNY WYCH") ? "152" : false),
|
||||||
() =>
|
() => (this.description.includes("OPŁATA PRZELEW ZEW.DOWO") ? "771" : false),
|
||||||
this.description.includes("PRZELEW WEWNĘTRZNY PRZY")
|
|
||||||
? "160"
|
|
||||||
: false,
|
|
||||||
() =>
|
|
||||||
this.description.includes("OPŁATA-PRZELEW WEWN. DO")
|
|
||||||
? "755"
|
|
||||||
: false,
|
|
||||||
() =>
|
|
||||||
this.description.includes("PRZELEW ZEWNĘTRZNY WYCH")
|
|
||||||
? "152"
|
|
||||||
: false,
|
|
||||||
() =>
|
|
||||||
this.description.includes("OPŁATA PRZELEW ZEW.DOWO")
|
|
||||||
? "771"
|
|
||||||
: false,
|
|
||||||
() => (this.amount > 0 ? "150" : false),
|
() => (this.amount > 0 ? "150" : false),
|
||||||
() => "169",
|
() => "169",
|
||||||
];
|
];
|
||||||
@ -86,11 +60,9 @@ class Transaction {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const result = `:61:${mtDate(this.acc_date)}${mtDate(
|
const result = `:61:${mtDate(this.acc_date)}${mtDate(this.op_date).slice(2)}${
|
||||||
this.op_date
|
this.amount > 0 ? "C" : "D"
|
||||||
).slice(2)}${this.amount > 0 ? "C" : "D"}${mtAmount(
|
}${mtAmount(this.amount)}S${prefix}${Transaction.counter.next().value}
|
||||||
this.amount
|
|
||||||
)}S${prefix}${Transaction.counter.next().value}
|
|
||||||
:86:${prefix}
|
:86:${prefix}
|
||||||
:86:${prefix}~00B${prefix}${this.description.slice(0, 23)}
|
:86:${prefix}~00B${prefix}${this.description.slice(0, 23)}
|
||||||
${this.formatTitle()}
|
${this.formatTitle()}
|
||||||
@ -135,10 +107,7 @@ class mBankParser extends CSVParser {
|
|||||||
this.parseAmount(lines[last - 2][7]),
|
this.parseAmount(lines[last - 2][7]),
|
||||||
lines[18][0]
|
lines[18][0]
|
||||||
);
|
);
|
||||||
const range = new Range(
|
const range = new Range(this.parseDate(lines[14][0]), this.parseDate(lines[14][1]));
|
||||||
this.parseDate(lines[14][0]),
|
|
||||||
this.parseDate(lines[14][1])
|
|
||||||
);
|
|
||||||
const transactions = [];
|
const transactions = [];
|
||||||
for (let i = 38; i <= last - 5; i++) {
|
for (let i = 38; i <= last - 5; i++) {
|
||||||
const line = lines[i];
|
const line = lines[i];
|
||||||
@ -148,29 +117,14 @@ class mBankParser extends CSVParser {
|
|||||||
}
|
}
|
||||||
if (line.length != 9) {
|
if (line.length != 9) {
|
||||||
console.log({ line });
|
console.log({ line });
|
||||||
throw new Error(
|
throw new Error("Wrong amount of columns! maybe a semicolon got stuck in a transaction description?");
|
||||||
"Wrong amount of columns! maybe a semicolon got stuck in a transaction description?"
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
const date_acc = new Date(line[0]);
|
const date_acc = new Date(line[0]);
|
||||||
const date_op = new Date(line[1]);
|
const date_op = new Date(line[1]);
|
||||||
const [description, title, person, account_number] = line
|
const [description, title, person, account_number] = line.slice(2).map(this.trimString);
|
||||||
.slice(2)
|
const [amount, balance_after] = line.slice(6).map((s) => this.parseAmount(s));
|
||||||
.map(this.trimString);
|
|
||||||
const [amount, balance_after] = line
|
|
||||||
.slice(6)
|
|
||||||
.map((s) => this.parseAmount(s));
|
|
||||||
transactions.push(
|
transactions.push(
|
||||||
new Transaction(
|
new Transaction(date_acc, date_op, description, title, person, account_number, amount, balance_after)
|
||||||
date_acc,
|
|
||||||
date_op,
|
|
||||||
description,
|
|
||||||
title,
|
|
||||||
person,
|
|
||||||
account_number,
|
|
||||||
amount,
|
|
||||||
balance_after
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return { account, range, transactions };
|
return { account, range, transactions };
|
||||||
@ -200,9 +154,10 @@ class mBankParser extends CSVParser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function mtDate(d: Date) {
|
function mtDate(d: Date) {
|
||||||
return `${d.getFullYear() - 2000}${(d.getMonth() + 1)
|
return `${d.getFullYear() - 2000}${(d.getMonth() + 1).toString().padStart(2, "0")}${d
|
||||||
|
.getDate()
|
||||||
.toString()
|
.toString()
|
||||||
.padStart(2, "0")}${d.getDate().toString().padStart(2, "0")}`;
|
.padStart(2, "0")}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
function mtAmount(n: number) {
|
function mtAmount(n: number) {
|
||||||
@ -215,12 +170,8 @@ export function convert(csv_utf8: string): { output: string; range: Range } {
|
|||||||
const string = `:20:MT940
|
const string = `:20:MT940
|
||||||
:25:/PL${account.number.replaceAll(/[^0-9]/g, "")}
|
:25:/PL${account.number.replaceAll(/[^0-9]/g, "")}
|
||||||
:28C:${mtDate(range.date_start)}
|
:28C:${mtDate(range.date_start)}
|
||||||
:60F:D${mtDate(range.date_start)}${account.currency}${mtAmount(
|
:60F:D${mtDate(range.date_start)}${account.currency}${mtAmount(account.initial_balance)}
|
||||||
account.initial_balance
|
|
||||||
)}
|
|
||||||
${transactions.map((t) => t.toMT940()).join("\n")}
|
${transactions.map((t) => t.toMT940()).join("\n")}
|
||||||
:62F:D${mtDate(range.date_end)}${account.currency}${mtAmount(
|
:62F:D${mtDate(range.date_end)}${account.currency}${mtAmount(account.closing_balance)}`;
|
||||||
account.closing_balance
|
|
||||||
)}`;
|
|
||||||
return { output: string, range };
|
return { output: string, range };
|
||||||
}
|
}
|
||||||
|
@ -15,11 +15,7 @@ export function fillWithEmpty(array: string[], target_length: number) {
|
|||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function addLineNumbers(
|
export function addLineNumbers(s: string[], start_num: number, prefix = "~"): string[] {
|
||||||
s: string[],
|
|
||||||
start_num: number,
|
|
||||||
prefix = "~"
|
|
||||||
): string[] {
|
|
||||||
return s.map((l, i) => `${prefix}${start_num + i}${l}`);
|
return s.map((l, i) => `${prefix}${start_num + i}${l}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user