const express = require("express"); const router = express.Router(); const db = require("../dependencies"); const { update } = require("./reset"); // Fix if balance is null function fix_balance_is_null(acc) { if (acc["localBalance"] == null) { acc["localBalance"] = 0; } if (acc["balance"] == null) { acc["balance"] = 0; } } // Get subaccounts from database, recursivly calls return_account // Fuck IO we ball function get_subaccounts(acc) { var base_query = `SELECT number, name, qualifiedName, description, type, tf.balance, te.localBalance, parentAccount FROM accounts LEFT JOIN (SELECT SUM(amount) as localBalance, account_name FROM transaction_entries GROUP BY account_name) te ON te.account_name = qualifiedName LEFT JOIN (SELECT SUM(amount) as balance, account_name FROM transaction_entries GROUP BY account_name) tf ON tf.account_name = qualifiedName WHERE parentAccount = ?`; var subs = []; const accs = db.prepare(base_query).all(acc["qualifiedName"]); for (let i = 0; i < accs.length; i++) { var one_sub = return_account(accs[i]); fix_balance_is_null(one_sub); acc["balance"] = acc["balance"] + one_sub["balance"]; subs.push(one_sub); } return subs; } // Get important account info out of account, recursivly calls get_subaccounts function return_account(acc) { test = { number: acc["number"], name: acc["name"], qualifiedName: acc["qualifiedName"], description: acc["description"], type: acc["type"], localBalance: acc["localBalance"], subaccounts: get_subaccounts(acc), balance: acc["balance"], }; return test; } router.get("/", (req, res) => { var base_query = `SELECT number, name, qualifiedName, description, type, tf.balance, te.localBalance, parentAccount FROM accounts LEFT JOIN (SELECT SUM(amount) as localBalance, account_name FROM transaction_entries GROUP BY account_name) te ON te.account_name = qualifiedName LEFT JOIN (SELECT SUM(amount) as balance, account_name FROM transaction_entries GROUP BY account_name) tf ON tf.account_name = qualifiedName`; const accs = db.prepare(base_query).all(); var real_accs = []; for (let i = 0; i < accs.length; i++) { fix_balance_is_null(accs[i]); if (accs[i]["parentAccount"] == null) { real_accs.push(return_account(accs[i])); } } res.send(real_accs); }); router.post("/", (req, res) => { const number = req.body.number; const name = req.body.name; const des = req.body.description; const type = req.body.type; var qualifiedName; if (req.body.parentAccount =="--- Wurzel Konto ---") { qualifiedName = name; } else { qualifiedName = req.body.parentAccount + ":" + name; } const new_acc = db .prepare( `INSERT INTO accounts (number, name, qualifiedName, description, type, parentAccount) VALUES (?, ?, ? ,?, ?, ?)`, ) .run(number, name, qualifiedName, des, type, req.body.parentAccount); res.status(204).send(); for (res of update.values()) { // res.write("data: update\n\n") res.write("event: update\n"); res.write("data: {}\n\n"); } }); router.get("/:account", (req, res) => { var base_query = `SELECT number, name, qualifiedName, description, type, tf.balance, te.localBalance FROM accounts LEFT JOIN (SELECT SUM(amount) as localBalance, account_name FROM transaction_entries GROUP BY account_name) te ON te.account_name = qualifiedName LEFT JOIN (SELECT SUM(amount) as balance, account_name FROM transaction_entries GROUP BY account_name) tf ON tf.account_name = qualifiedName WHERE qualifiedName = ?`; const acc = db.prepare(base_query).get(req.params.account); console.log(acc) if (acc == undefined) { res.status(404).send({ code: 404, message: "Account not found", additionalPropl: {}, }); } else { fix_balance_is_null(acc); var real_acc; fix_balance_is_null(acc); if (acc["parentAccount"] == null) { real_acc = return_account(acc); } acc["balance"] = real_acc["balance"] entries = db .prepare( ` SELECT transaction_entries.transaction_id as id, offsetAccounts, transaction_entries.amount, transaction_entries.label, postingDate, valueDate, title from transaction_entries JOIN transactions ON transaction_entries.transaction_id = transactions.transaction_id JOIN (SELECT account_name as offsetAccounts, transaction_id FROM transaction_entries) te ON te.transaction_id = id AND offsetAccounts IS NOT transaction_entries.account_name WHERE transaction_entries.account_name = ?`, ) .all(req.params.account); acc["entries"] = entries; res.send(acc); } }); router.put("/:account", (req, res) => { const oldname = req.params.account; const name = req.body.name; const description = req.body.description; const type = req.body.type; const qualifiedName = req.body.parentAccount + ":" + name; const acc = db .prepare( `UPDATE accounts SET description = ?, name = ?, qualifiedName = ?, type = ? WHERE name=?`, ) .run(description, name, qualifiedName, type, oldname); if (acc == undefined) { res.status(404).send({ code: 404, message: "Account not found", additionalPropl: {}, }); } else { res.status(204).send(); for (res of update.values()) { // res.write("data: update\n\n") res.write("event: update\n"); res.write("data: {}\n\n"); } } }); router.delete("/:account", (req, res) => { const acc = db .prepare("DELETE FROM accounts WHERE name = ? RETURNING *") .run(req.params.account); res.status(200).send(); for (res of update.values()) { // res.write("data: update\n\n") res.write("event: update\n"); res.write("data: {}\n\n"); } }); module.exports = router;