ReportRepository.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. using System;
  2. using System.Data;
  3. using Npgsql;
  4. namespace RestaurantApp.DAL
  5. {
  6. public class ReportRepository
  7. {
  8. public DataTable GetDailyRevenue(DateTime dateFrom, DateTime dateTo)
  9. {
  10. var dt = new DataTable();
  11. using (var conn = Database.GetConnection())
  12. using (var cmd = new NpgsqlCommand(
  13. @"SELECT date(paid_at) as ""Дата"",
  14. COUNT(*) as ""Платежей"",
  15. SUM(amount) as ""Выручка (руб.)"",
  16. AVG(amount) as ""Средний чек (руб.)""
  17. FROM payment
  18. WHERE paid_at::date BETWEEN @df AND @dt
  19. GROUP BY date(paid_at) ORDER BY date(paid_at) DESC", conn))
  20. {
  21. cmd.Parameters.AddWithValue("df", dateFrom.Date);
  22. cmd.Parameters.AddWithValue("dt", dateTo.Date);
  23. using (var da = new NpgsqlDataAdapter(cmd)) da.Fill(dt);
  24. }
  25. return dt;
  26. }
  27. public DataTable GetDishSales(DateTime dateFrom, DateTime dateTo)
  28. {
  29. var dt = new DataTable();
  30. using (var conn = Database.GetConnection())
  31. using (var cmd = new NpgsqlCommand(
  32. @"SELECT d.name as ""Блюдо"",
  33. dc.name as ""Категория"",
  34. SUM(oi.quantity) as ""Кол-во"",
  35. SUM(oi.quantity*oi.unit_price) as ""Выручка (руб.)""
  36. FROM order_item oi
  37. JOIN dish d ON d.dish_id=oi.dish_id
  38. JOIN dish_category dc ON dc.category_id=d.category_id
  39. JOIN ""order"" o ON o.order_id=oi.order_id
  40. WHERE oi.status NOT IN ('cancelled')
  41. AND o.opened_at::date BETWEEN @df AND @dt
  42. GROUP BY d.name, dc.name
  43. ORDER BY SUM(oi.quantity) DESC", conn))
  44. {
  45. cmd.Parameters.AddWithValue("df", dateFrom.Date);
  46. cmd.Parameters.AddWithValue("dt", dateTo.Date);
  47. using (var da = new NpgsqlDataAdapter(cmd)) da.Fill(dt);
  48. }
  49. return dt;
  50. }
  51. public DataTable GetWaiterStats(DateTime dateFrom, DateTime dateTo)
  52. {
  53. var dt = new DataTable();
  54. using (var conn = Database.GetConnection())
  55. using (var cmd = new NpgsqlCommand(
  56. @"SELECT e.last_name||' '||e.first_name as ""Официант"",
  57. COUNT(DISTINCT o.order_id) as ""Заказов"",
  58. SUM(o.total_amount) as ""Сумма (руб.)"",
  59. AVG(o.total_amount) as ""Средний заказ (руб.)""
  60. FROM ""order"" o
  61. JOIN employee e ON e.employee_id=o.employee_id
  62. WHERE o.status='closed'
  63. AND o.opened_at::date BETWEEN @df AND @dt
  64. GROUP BY e.last_name, e.first_name
  65. ORDER BY SUM(o.total_amount) DESC", conn))
  66. {
  67. cmd.Parameters.AddWithValue("df", dateFrom.Date);
  68. cmd.Parameters.AddWithValue("dt", dateTo.Date);
  69. using (var da = new NpgsqlDataAdapter(cmd)) da.Fill(dt);
  70. }
  71. return dt;
  72. }
  73. public DataTable GetPaymentMethods(DateTime dateFrom, DateTime dateTo)
  74. {
  75. var dt = new DataTable();
  76. using (var conn = Database.GetConnection())
  77. using (var cmd = new NpgsqlCommand(
  78. @"SELECT method as ""Способ оплаты"",
  79. COUNT(*) as ""Кол-во"",
  80. SUM(amount) as ""Сумма (руб.)"",
  81. ROUND(100.0*COUNT(*)/SUM(COUNT(*)) OVER(),1) as ""%""
  82. FROM payment
  83. WHERE paid_at::date BETWEEN @df AND @dt
  84. GROUP BY method ORDER BY SUM(amount) DESC", conn))
  85. {
  86. cmd.Parameters.AddWithValue("df", dateFrom.Date);
  87. cmd.Parameters.AddWithValue("dt", dateTo.Date);
  88. using (var da = new NpgsqlDataAdapter(cmd)) da.Fill(dt);
  89. }
  90. return dt;
  91. }
  92. public DataTable GetLowStock()
  93. {
  94. var dt = new DataTable();
  95. using (var conn = Database.GetConnection())
  96. using (var cmd = new NpgsqlCommand(
  97. @"SELECT i.name as ""Ингредиент"",
  98. i.unit as ""Ед. изм."",
  99. i.stock_qty as ""Остаток"",
  100. i.min_stock as ""Минимум"",
  101. COALESCE(s.name,'') as ""Поставщик""
  102. FROM ingredient i
  103. LEFT JOIN supplier s ON s.supplier_id=i.supplier_id
  104. WHERE i.stock_qty < i.min_stock
  105. ORDER BY (i.stock_qty - i.min_stock)", conn))
  106. using (var da = new NpgsqlDataAdapter(cmd)) da.Fill(dt);
  107. return dt;
  108. }
  109. }
  110. }