Changes between Initial Version and Version 1 of НапредниИзвештаи


Ignore:
Timestamp:
01/30/25 14:30:28 (3 weeks ago)
Author:
221550
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • НапредниИзвештаи

    v1 v1  
     1= Напредни извештаи од базата (SQL и складирани процедури) =
     2
     3=== Извештај за месечен приход и ДДВ наплата (последни 6 месеци) ===
     4===== Прикажува вкупен приход, трошоци за делови, труд и ДДВ наплата по месец =====
     5
     6{{{#!sql
     7SELECT
     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
     13FROM Services s
     14JOIN ServiceAssignments sa ON s.Id = sa.ServiceId
     15JOIN ServiceItems si ON sa.ServiceItemId = si.Id
     16WHERE s.DateOfService >= CURRENT_DATE - INTERVAL '6 months'
     17GROUP BY TO_CHAR(s.DateOfService, 'YYYY-MM')
     18ORDER BY Month DESC;
     19}}}
     20
     21=== Извештај за продуктивност на механичари ===
     22===== Прикажува број на сервиси, вкупно користени делови и вкупна вредност на делови по механичар =====
     23
     24{{{#!sql
     25SELECT
     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
     31FROM Mechanics m
     32JOIN ServiceAssignments sa ON m.EMBG = sa.MechanicEMBG
     33JOIN ServiceItems si ON sa.ServiceItemId = si.Id
     34GROUP BY m.EMBG, Mechanic
     35ORDER BY TotalPartsValue DESC;
     36}}}
     37
     38=== Извештај за лојални клиенти и нивни трошоци ===
     39===== Листа на клиенти со повеќе од 3 сервиси, вкупен потрошено и детали за нивните мотоцикли =====
     40
     41{{{#!sql
     42SELECT
     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
     48FROM Clients c
     49JOIN Motorcycles m ON c.Id = m.ClientId
     50JOIN Services s ON m.Id = s.MotorcycleId
     51GROUP BY c.Id, Client
     52HAVING COUNT(DISTINCT s.Id) > 3
     53ORDER BY TotalSpent DESC;
     54}}}
     55
     56=== Извештај за употреба на делови во сервиси (топ 10 делови) ===
     57===== Прикажува најчесто користени делови и просечна количина по сервис =====
     58
     59{{{#!sql
     60SELECT
     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
     66FROM ServiceItems si
     67JOIN ServiceAssignments sa ON si.Id = sa.ServiceItemId
     68GROUP BY si.Id, si.Description
     69ORDER BY TotalUnits DESC
     70LIMIT 10;
     71}}}
     72
     73=== Извештај за фискални обврски по месец ===
     74===== Вкупен ДДВ и износ на фискални сметки по месец =====
     75
     76{{{#!sql
     77SELECT
     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
     82FROM FiscalBills fb
     83JOIN ServiceInvoices si ON fb.ServiceInvoiceId = si.Id
     84JOIN Services s ON si.ServiceId = s.Id
     85GROUP BY TO_CHAR(fb.IssueDateTime, 'YYYY-MM')
     86ORDER BY Month DESC;
     87}}}
     88
     89=== Извештај за резервни делови со ниско залишно ниво ===
     90===== Делови со помалку од 10 единици во магацин и просечна месечна потрошувачка =====
     91
     92{{{#!sql
     93WITH 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)
     103SELECT
     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
     111FROM ServiceItems si
     112LEFT JOIN MonthlyUsage mu ON si.Id = mu.PartId
     113WHERE 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)
     119ORDER BY AvgMonthlyUsage DESC;
     120}}}