| 1 | = Напредни извештаи од базата (SQL и складирани процедури) = |
| 2 | |
| 3 | === Извештај за месечен приход и ДДВ наплата (последни 6 месеци) === |
| 4 | ===== Прикажува вкупен приход, трошоци за делови, труд и ДДВ наплата по месец ===== |
| 5 | |
| 6 | {{{#!sql |
| 7 | SELECT |
| 8 | TO_CHAR(s.DateOfService, 'YYYY-MM') AS Month, |
| 9 | SUM(s.TotalPrice) AS TotalRevenue, |
| 10 | SUM(si.PricePerUnit * sa.UnitsUsed) AS PartsCost, |
| 11 | SUM(s.LaborCost) AS LaborCost, |
| 12 | SUM(si.PricePerUnit * sa.UnitsUsed * si.Tax / 100) AS TaxCollected |
| 13 | FROM Services s |
| 14 | JOIN ServiceAssignments sa ON s.Id = sa.ServiceId |
| 15 | JOIN ServiceItems si ON sa.ServiceItemId = si.Id |
| 16 | WHERE s.DateOfService >= CURRENT_DATE - INTERVAL '6 months' |
| 17 | GROUP BY TO_CHAR(s.DateOfService, 'YYYY-MM') |
| 18 | ORDER BY Month DESC; |
| 19 | }}} |
| 20 | |
| 21 | === Извештај за продуктивност на механичари === |
| 22 | ===== Прикажува број на сервиси, вкупно користени делови и вкупна вредност на делови по механичар ===== |
| 23 | |
| 24 | {{{#!sql |
| 25 | SELECT |
| 26 | m.EMBG, |
| 27 | m.FirstName || ' ' || m.LastName AS Mechanic, |
| 28 | COUNT(DISTINCT sa.ServiceId) AS TotalServices, |
| 29 | SUM(sa.UnitsUsed) AS TotalUnitsUsed, |
| 30 | SUM(si.PricePerUnit * sa.UnitsUsed) AS TotalPartsValue |
| 31 | FROM Mechanics m |
| 32 | JOIN ServiceAssignments sa ON m.EMBG = sa.MechanicEMBG |
| 33 | JOIN ServiceItems si ON sa.ServiceItemId = si.Id |
| 34 | GROUP BY m.EMBG, Mechanic |
| 35 | ORDER BY TotalPartsValue DESC; |
| 36 | }}} |
| 37 | |
| 38 | === Извештај за лојални клиенти и нивни трошоци === |
| 39 | ===== Листа на клиенти со повеќе од 3 сервиси, вкупен потрошено и детали за нивните мотоцикли ===== |
| 40 | |
| 41 | {{{#!sql |
| 42 | SELECT |
| 43 | c.Id AS ClientId, |
| 44 | c.FirstName || ' ' || c.LastName AS Client, |
| 45 | COUNT(DISTINCT s.Id) AS TotalServices, |
| 46 | SUM(s.TotalPrice) AS TotalSpent, |
| 47 | STRING_AGG(m.Model || ' (' || m.Registration || ')', ', ') AS Motorcycles |
| 48 | FROM Clients c |
| 49 | JOIN Motorcycles m ON c.Id = m.ClientId |
| 50 | JOIN Services s ON m.Id = s.MotorcycleId |
| 51 | GROUP BY c.Id, Client |
| 52 | HAVING COUNT(DISTINCT s.Id) > 3 |
| 53 | ORDER BY TotalSpent DESC; |
| 54 | }}} |
| 55 | |
| 56 | === Извештај за употреба на делови во сервиси (топ 10 делови) === |
| 57 | ===== Прикажува најчесто користени делови и просечна количина по сервис ===== |
| 58 | |
| 59 | {{{#!sql |
| 60 | SELECT |
| 61 | si.Id AS PartId, |
| 62 | si.Description, |
| 63 | COUNT(sa.ServiceId) AS TimesUsed, |
| 64 | SUM(sa.UnitsUsed) AS TotalUnits, |
| 65 | ROUND(AVG(sa.UnitsUsed), 2) AS AvgPerService |
| 66 | FROM ServiceItems si |
| 67 | JOIN ServiceAssignments sa ON si.Id = sa.ServiceItemId |
| 68 | GROUP BY si.Id, si.Description |
| 69 | ORDER BY TotalUnits DESC |
| 70 | LIMIT 10; |
| 71 | }}} |
| 72 | |
| 73 | === Извештај за фискални обврски по месец === |
| 74 | ===== Вкупен ДДВ и износ на фискални сметки по месец ===== |
| 75 | |
| 76 | {{{#!sql |
| 77 | SELECT |
| 78 | TO_CHAR(fb.IssueDateTime, 'YYYY-MM') AS Month, |
| 79 | COUNT(fb.Id) AS FiscalBillsCount, |
| 80 | SUM(fb.DDV) AS TotalTax, |
| 81 | SUM(s.TotalPrice) AS TotalInvoiced |
| 82 | FROM FiscalBills fb |
| 83 | JOIN ServiceInvoices si ON fb.ServiceInvoiceId = si.Id |
| 84 | JOIN Services s ON si.ServiceId = s.Id |
| 85 | GROUP BY TO_CHAR(fb.IssueDateTime, 'YYYY-MM') |
| 86 | ORDER BY Month DESC; |
| 87 | }}} |
| 88 | |
| 89 | === Извештај за резервни делови со ниско залишно ниво === |
| 90 | ===== Делови со помалку од 10 единици во магацин и просечна месечна потрошувачка ===== |
| 91 | |
| 92 | {{{#!sql |
| 93 | WITH MonthlyUsage AS ( |
| 94 | SELECT |
| 95 | si.Id AS PartId, |
| 96 | AVG(sa.UnitsUsed) AS AvgMonthlyUsage |
| 97 | FROM ServiceItems si |
| 98 | JOIN ServiceAssignments sa ON si.Id = sa.ServiceItemId |
| 99 | JOIN Services s ON sa.ServiceId = s.Id |
| 100 | WHERE s.DateOfService >= CURRENT_DATE - INTERVAL '6 months' |
| 101 | GROUP BY si.Id |
| 102 | ) |
| 103 | SELECT |
| 104 | si.Id, |
| 105 | si.Description, |
| 106 | COALESCE(mu.AvgMonthlyUsage, 0) AS AvgMonthlyUsage, |
| 107 | CASE |
| 108 | WHEN COALESCE(mu.AvgMonthlyUsage, 0) > 0 THEN 'Order ' || CEIL(mu.AvgMonthlyUsage * 2) || ' units' |
| 109 | ELSE 'No usage data' |
| 110 | END AS Recommendation |
| 111 | FROM ServiceItems si |
| 112 | LEFT JOIN MonthlyUsage mu ON si.Id = mu.PartId |
| 113 | WHERE si.Id NOT IN ( |
| 114 | SELECT DISTINCT ServiceItemId |
| 115 | FROM ServiceAssignments |
| 116 | JOIN Services ON ServiceAssignments.ServiceId = Services.Id |
| 117 | WHERE Services.DateOfService >= CURRENT_DATE - INTERVAL '30 days' |
| 118 | ) |
| 119 | ORDER BY AvgMonthlyUsage DESC; |
| 120 | }}} |