brf/bin/add_fisken_invoices.ts
2025-12-13 21:12:08 +01:00

67 lines
1.9 KiB
TypeScript

import fs from 'node:fs/promises'
import { existsSync } from 'node:fs'
import path from 'node:path'
import knex from '../server/lib/knex.ts'
const dirs = process.argv.slice(2)
// 172-972, 2020-01-08, Great Security Sverige AB.pdf'
const rFileName = /^172-(\d+),\s(\d{4,4}-\d{2,2}-\d{2,2}), (.*)\.pdf$/
for await (const dir of dirs) {
await readdir(dir)
}
knex.destroy()
async function readdir(dir: string) {
const files = (await fs.readdir(dir)).toSorted((a: string, b: string) => {
const [, aNum] = a.match(rFileName) as string[]
const [, bNum] = b.match(rFileName) as string[]
if (parseInt(aNum) > parseInt(bNum)) {
return 1
} else {
return -1
}
})
const trx = await knex.transaction()
for await (const originalFilename of files) {
const result = originalFilename.match(rFileName)
if (!result) {
throw new Error(originalFilename)
}
const [, fiskenNumber, invoiceDate, supplierName] = result
let supplier = await trx('supplier').first('*').where('name', supplierName)
if (!supplier) {
supplier = (await trx('supplier').insert({ name: supplierName, supplierTypeId: 1 }).returning('*'))[0]
}
const invoice = (
await trx('invoice').insert({ fiskenNumber, invoiceDate, supplierId: supplier.id }).returning('*')
)[0]
const ext = path.extname(originalFilename)
const filename = `${invoiceDate}_fisken_${fiskenNumber}_${supplierName.split(/[\s/]/).join('_').split(/[']/).join('')}${ext}`
const pathname = path.join('uploads', 'invoices', filename)
if (!existsSync(pathname)) {
console.info('COPYING: ' + filename)
await fs.copyFile(path.join(dir, originalFilename), pathname)
} else {
console.info('ALREADY EXISTS: ' + filename)
}
const file = (await trx('file').insert({ filename }).returning('id'))[0]
await trx('filesToInvoice').insert({ fileId: file.id, invoiceId: invoice.id })
}
await trx.commit()
}