ReservationRepository.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. using System;
  2. using System.Collections.Generic;
  3. using Npgsql;
  4. using RestaurantApp.Models;
  5. namespace RestaurantApp.DAL
  6. {
  7. public class ReservationRepository
  8. {
  9. public List<Reservation> GetAll(string statusFilter = "", DateTime? dateFrom = null, DateTime? dateTo = null)
  10. {
  11. var list = new List<Reservation>();
  12. using (var conn = Database.GetConnection())
  13. {
  14. var sql = @"SELECT r.reservation_id, r.table_id,
  15. h.name||' стол №'||dt.table_number as table_info,
  16. r.client_id, COALESCE(c.last_name||' '||c.first_name,'') as client_name,
  17. r.employee_id, COALESCE(e.last_name||' '||e.first_name,'') as emp_name,
  18. r.reserved_at, r.duration_min, r.guests_count,
  19. r.status, r.notes, r.created_at
  20. FROM reservation r
  21. JOIN dining_table dt ON dt.table_id = r.table_id
  22. JOIN hall h ON h.hall_id = dt.hall_id
  23. LEFT JOIN client c ON c.client_id = r.client_id
  24. LEFT JOIN employee e ON e.employee_id = r.employee_id
  25. WHERE 1=1 ";
  26. if (!string.IsNullOrWhiteSpace(statusFilter) && statusFilter != "Все")
  27. sql += " AND r.status = @st";
  28. if (dateFrom.HasValue)
  29. sql += " AND r.reserved_at >= @df";
  30. if (dateTo.HasValue)
  31. sql += " AND r.reserved_at <= @dt";
  32. sql += " ORDER BY r.reserved_at DESC LIMIT 500";
  33. using (var cmd = new NpgsqlCommand(sql, conn))
  34. {
  35. if (!string.IsNullOrWhiteSpace(statusFilter) && statusFilter != "Все")
  36. cmd.Parameters.AddWithValue("st", statusFilter);
  37. if (dateFrom.HasValue)
  38. cmd.Parameters.AddWithValue("df", dateFrom.Value);
  39. if (dateTo.HasValue)
  40. cmd.Parameters.AddWithValue("dt", dateTo.Value);
  41. using (var r = cmd.ExecuteReader())
  42. while (r.Read()) list.Add(MapRes(r));
  43. }
  44. }
  45. return list;
  46. }
  47. public void Insert(Reservation res)
  48. {
  49. using (var conn = Database.GetConnection())
  50. using (var cmd = new NpgsqlCommand(
  51. @"INSERT INTO reservation(table_id, client_id, employee_id, reserved_at, duration_min, guests_count, status, notes)
  52. VALUES(@t, @c, @e, @ra, @dur, @g, @st, @n)", conn))
  53. {
  54. cmd.Parameters.AddWithValue("t", res.TableId);
  55. cmd.Parameters.AddWithValue("c", res.ClientId.HasValue ? (object)res.ClientId.Value : DBNull.Value);
  56. cmd.Parameters.AddWithValue("e", res.EmployeeId.HasValue ? (object)res.EmployeeId.Value : DBNull.Value);
  57. cmd.Parameters.AddWithValue("ra", res.ReservedAt);
  58. cmd.Parameters.AddWithValue("dur", res.DurationMin);
  59. cmd.Parameters.AddWithValue("g", res.GuestsCount);
  60. cmd.Parameters.AddWithValue("st", res.Status);
  61. cmd.Parameters.AddWithValue("n", string.IsNullOrEmpty(res.Notes) ? (object)DBNull.Value : res.Notes);
  62. cmd.ExecuteNonQuery();
  63. }
  64. }
  65. public void Update(Reservation res)
  66. {
  67. using (var conn = Database.GetConnection())
  68. using (var cmd = new NpgsqlCommand(
  69. @"UPDATE reservation SET table_id=@t, client_id=@c, employee_id=@e,
  70. reserved_at=@ra, duration_min=@dur, guests_count=@g,
  71. status=@st, notes=@n
  72. WHERE reservation_id=@id", conn))
  73. {
  74. cmd.Parameters.AddWithValue("id", res.ReservationId);
  75. cmd.Parameters.AddWithValue("t", res.TableId);
  76. cmd.Parameters.AddWithValue("c", res.ClientId.HasValue ? (object)res.ClientId.Value : DBNull.Value);
  77. cmd.Parameters.AddWithValue("e", res.EmployeeId.HasValue ? (object)res.EmployeeId.Value : DBNull.Value);
  78. cmd.Parameters.AddWithValue("ra", res.ReservedAt);
  79. cmd.Parameters.AddWithValue("dur", res.DurationMin);
  80. cmd.Parameters.AddWithValue("g", res.GuestsCount);
  81. cmd.Parameters.AddWithValue("st", res.Status);
  82. cmd.Parameters.AddWithValue("n", string.IsNullOrEmpty(res.Notes) ? (object)DBNull.Value : res.Notes);
  83. cmd.ExecuteNonQuery();
  84. }
  85. }
  86. public void Delete(int id)
  87. {
  88. using (var conn = Database.GetConnection())
  89. using (var cmd = new NpgsqlCommand(
  90. "UPDATE reservation SET status = 'cancelled' WHERE reservation_id = @id", conn))
  91. {
  92. cmd.Parameters.AddWithValue("id", id);
  93. cmd.ExecuteNonQuery();
  94. }
  95. }
  96. private void SetParams(NpgsqlCommand cmd, Reservation res)
  97. {
  98. cmd.Parameters.AddWithValue("t", res.TableId);
  99. cmd.Parameters.AddWithValue("c", res.ClientId.HasValue ? (object)res.ClientId.Value : DBNull.Value);
  100. cmd.Parameters.AddWithValue("e", res.EmployeeId.HasValue ? (object)res.EmployeeId.Value : DBNull.Value);
  101. cmd.Parameters.AddWithValue("ra", res.ReservedAt);
  102. cmd.Parameters.AddWithValue("dur", res.DurationMin);
  103. cmd.Parameters.AddWithValue("g", res.GuestsCount);
  104. cmd.Parameters.AddWithValue("st", res.Status);
  105. cmd.Parameters.AddWithValue("n", string.IsNullOrEmpty(res.Notes) ? (object)DBNull.Value : res.Notes);
  106. }
  107. private Reservation MapRes(NpgsqlDataReader r) => new Reservation
  108. {
  109. ReservationId = r.GetInt32(0),
  110. TableId = r.GetInt32(1),
  111. TableInfo = r.GetString(2),
  112. ClientId = r.IsDBNull(3) ? (int?)null : r.GetInt32(3),
  113. ClientName = r.GetString(4),
  114. EmployeeId = r.IsDBNull(5) ? (int?)null : r.GetInt32(5),
  115. EmployeeName = r.GetString(6),
  116. ReservedAt = r.GetDateTime(7),
  117. DurationMin = r.GetInt32(8),
  118. GuestsCount = r.GetInt32(9),
  119. Status = r.GetString(10),
  120. Notes = r.IsDBNull(11) ? "" : r.GetString(11),
  121. CreatedAt = r.GetDateTime(12)
  122. };
  123. }
  124. }