Changes between Version 5 and Version 6 of AdvancedReports


Ignore:
Timestamp:
06/08/25 12:16:34 (6 days ago)
Author:
213231
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedReports

    v5 v6  
    1111
    1212* employeeSales: Листа на вработени со број на продажби и вкупна вредност на продажбите.
     13* maintenanceStats: Листа на вработени (техничари) со број на завршени одржувања.
     14* customerTotals: Листа на купувачи со број на нарачки и вкупна потрошена сума
     15* averageMaintenanceTime: Просечно време (во минути) потребно за завршување на одржување
     16* totalProcurements: Вкупен број на барања за набавка
     17* avgProcurementValue: Просечна вредност на набавка
     18* totalRevenue: Вкупен приход од сите трансакции
     19* revenueSplit: Распределба на приход по тип на трансакција
     20
     21
     22** Детали за SQL прашањата **
     23
     24* Продажби по вработен: Групира по вработен и дава број на продажби и вкупна вредност на продажбите
     25* Завршени одржувања по техничар: Групира по вработен и дава број на завршени одржувања, филтрирани само за оние со статус „Completed“
     26* Купувачи и нивните нарачки: Групира по купувач и дава број на нарачки и вкупна потрошена сума
     27* Просечно време на одржување: Го пресметува просечното време (во минути) помеѓу почетокот и крајот на завршените одржувања
     28* Вкупен број на барања за набавка: Брои колку барања за набавка има во базата
     29* Просечна вредност на набавка: Го пресметува просекот на вредноста на сите набавки
     30* Вкупен приход: Ги собира вредностите на сите трансакции
     31* Распределба на приход по тип: Групира по тип на трансакција и ги дава вредностите
     32
     33** Ракување со грешки **
     34
     35Доколку дојде до грешка при извр2шување на SQL прашањата, функцијата враќа HTTP статус 500 и порака за грешка. Исто така, во случај на празни резултати, се користат стандардни вредности (0) за да се избегнат грешки.
     36
     37Предлози за подобрување
     38
     39* Индексирање: Препорачливо е да се индексираат клучните колони како TransactionID, Status, EmployeeID и слично.
     40* Кеширање: За чести повици, може да се користи кеширање на податоците.
     41* Филтрирање по датум: Во иднина може да се додадат филтри за изве2стување по временски период.
     42
     43
     44{{{
     45const pool = require('../models/db');
     46
     47  exports.getDashboardStats = async (req, res) => {
     48    try {
     49        const [employeeSales] = await pool.query(`
     50          SELECT e.EmployeeID, e.EmployeeName AS Name, e.EmployeeSurName AS Surname, COUNT(*) AS SalesCount,
     51                 SUM(t.TotalPrice) AS TotalSales
     52          FROM procurement p
     53          JOIN t_type t ON t.TransactionID = p.TransactionID
     54          JOIN employee e ON e.EmployeeID = p.EmployeeID
     55          GROUP BY e.EmployeeID
     56        `);
     57       
     58       
     59        const [maintenanceStats] = await pool.query(`
     60          SELECT e.EmployeeID, e.EmployeeName AS Name, e.EmployeeSurName AS Surname, COUNT(*) AS MaintenanceDone
     61          FROM maintenance m
     62          JOIN employee e ON e.EmployeeID = m.EmployeeID
     63          WHERE m.Status = 'Completed'
     64          GROUP BY e.EmployeeID
     65        `);
     66 
     67      const [customerTotals] = await pool.query(`
     68        SELECT c.CustomerID, c.CustomerName, c.CustomerSurName, COUNT(*) AS Purchases,
     69               SUM(t.TotalPrice) AS TotalSpent
     70        FROM procurement p
     71        JOIN customer c ON c.CustomerID = p.CustomerID
     72        JOIN t_type t ON t.TransactionID = p.TransactionID
     73        GROUP BY c.CustomerID
     74      `);
     75 
     76      const [averageMaintenanceTime] = await pool.query(`
     77        SELECT AVG(TIMESTAMPDIFF(MINUTE, StartTime, EndTime)) AS AvgMinutes
     78        FROM maintenance
     79        WHERE Status = 'Completed' AND StartTime IS NOT NULL AND EndTime IS NOT NULL
     80      `);
     81 
     82      const [totalProcurements] = await pool.query(`
     83        SELECT COUNT(*) AS TotalProcurements FROM procurement_request
     84      `);
     85 
     86      const [avgProcurementValue] = await pool.query(`
     87        SELECT AVG(TotalPrice) AS AvgProcurementValue FROM t_type
     88      `);
     89 
     90      const [totalRevenue] = await pool.query(`
     91        SELECT SUM(TotalPrice) AS TotalRevenue FROM t_type
     92      `);
     93 
     94      const [revenueSplit] = await pool.query(`
     95        SELECT Type, SUM(TotalPrice) AS Revenue FROM t_type GROUP BY Type
     96      `);
     97 
     98      res.json({
     99        employeeSales,
     100        maintenanceStats,
     101        customerTotals,
     102        averageMaintenanceTime: averageMaintenanceTime[0]?.AvgMinutes || 0,
     103        totalProcurements: totalProcurements[0]?.TotalProcurements || 0,
     104        avgProcurementValue: avgProcurementValue[0]?.AvgProcurementValue || 0,
     105        totalRevenue: totalRevenue[0]?.TotalRevenue || 0,
     106        revenueSplit
     107      });
     108    } catch (err) {
     109      console.error("Dashboard metrics fetch error:", err);
     110      res.status(500).json({ error: "Failed to fetch admin stats" });
     111    }
     112  };
     113}}}
     114
     115
     116
     117
     118
     119
     120
     121
     122
     123
     124