60 lines
1.3 KiB
JavaScript
60 lines
1.3 KiB
JavaScript
const db = require("../db");
|
|
|
|
exports.statusReport = async (req, res) => {
|
|
try {
|
|
// Filter aus URL
|
|
const year = parseInt(req.query.year) || new Date().getFullYear();
|
|
|
|
const quarter = parseInt(req.query.quarter) || 0; // 0 = alle
|
|
|
|
// WHERE-Teil dynamisch bauen
|
|
let where = "WHERE 1=1";
|
|
const params = [];
|
|
|
|
if (year) {
|
|
where += " AND YEAR(invoice_date) = ?";
|
|
params.push(year);
|
|
}
|
|
|
|
if (quarter) {
|
|
where += " AND QUARTER(invoice_date) = ?";
|
|
params.push(quarter);
|
|
}
|
|
|
|
// Report-Daten
|
|
const [stats] = await db.promise().query(`
|
|
SELECT
|
|
CONCAT(type, '_', status) AS status,
|
|
SUM(total_amount) AS total
|
|
|
|
FROM invoices
|
|
|
|
GROUP BY type, status
|
|
`);
|
|
|
|
// Verfügbare Jahre
|
|
const [years] = await db.promise().query(`
|
|
SELECT DISTINCT YEAR(invoice_date) AS year
|
|
FROM invoices
|
|
ORDER BY year DESC
|
|
`);
|
|
|
|
res.render("reportview", {
|
|
title: "Abrechnungsreport",
|
|
|
|
user: req.session.user,
|
|
stats,
|
|
|
|
years: years.map((y) => y.year),
|
|
selectedYear: year,
|
|
selectedQuarter: quarter,
|
|
|
|
sidebarPartial: "partials/sidebar-invoices",
|
|
active: "reports",
|
|
});
|
|
} catch (err) {
|
|
console.error("❌ Report:", err);
|
|
res.status(500).send("Fehler beim Report");
|
|
}
|
|
};
|