AddEditContractForm.cs 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. using System;
  2. using System.Data;
  3. using System.Windows.Forms;
  4. using Npgsql;
  5. namespace ProviderApp
  6. {
  7. public partial class AddEditContractForm : Form
  8. {
  9. private int? contractId = null;
  10. public AddEditContractForm(int? id = null)
  11. {
  12. contractId = id;
  13. InitializeComponent();
  14. if (contractId.HasValue)
  15. {
  16. Text = "Редактирование договора";
  17. LoadContractData();
  18. }
  19. else
  20. {
  21. Text = "Добавление договора";
  22. dtpSignDate.Value = DateTime.Now;
  23. cmbStatus.SelectedItem = "active";
  24. }
  25. LoadComboBoxes();
  26. }
  27. private void LoadComboBoxes()
  28. {
  29. try
  30. {
  31. using (var conn = DBConnection.GetConnection())
  32. {
  33. // Загрузка клиентов
  34. string sqlClients = "SELECT client_id, last_name || ' ' || first_name AS name FROM clients ORDER BY last_name";
  35. using (var cmd = new NpgsqlCommand(sqlClients, conn))
  36. using (var da = new NpgsqlDataAdapter(cmd))
  37. {
  38. DataTable dt = new DataTable();
  39. da.Fill(dt);
  40. cmbClient.DisplayMember = "name";
  41. cmbClient.ValueMember = "client_id";
  42. cmbClient.DataSource = dt;
  43. }
  44. // Загрузка тарифов
  45. string sqlTariffs = "SELECT tariff_id, name FROM tariffs ORDER BY name";
  46. using (var cmd = new NpgsqlCommand(sqlTariffs, conn))
  47. using (var da = new NpgsqlDataAdapter(cmd))
  48. {
  49. DataTable dt = new DataTable();
  50. da.Fill(dt);
  51. cmbTariff.DisplayMember = "name";
  52. cmbTariff.ValueMember = "tariff_id";
  53. cmbTariff.DataSource = dt;
  54. }
  55. // Загрузка сотрудников
  56. string sqlEmployees = "SELECT employee_id, last_name || ' ' || first_name AS name FROM employees ORDER BY last_name";
  57. using (var cmd = new NpgsqlCommand(sqlEmployees, conn))
  58. using (var da = new NpgsqlDataAdapter(cmd))
  59. {
  60. DataTable dt = new DataTable();
  61. da.Fill(dt);
  62. cmbEmployee.DisplayMember = "name";
  63. cmbEmployee.ValueMember = "employee_id";
  64. cmbEmployee.DataSource = dt;
  65. }
  66. }
  67. }
  68. catch (Exception ex)
  69. {
  70. MessageBox.Show($"Ошибка загрузки данных: {ex.Message}");
  71. }
  72. }
  73. private void LoadContractData()
  74. {
  75. try
  76. {
  77. using (var conn = DBConnection.GetConnection())
  78. {
  79. string sql = "SELECT client_id, tariff_id, employee_id, sign_date, status FROM contracts WHERE contract_id = @id";
  80. using (var cmd = new NpgsqlCommand(sql, conn))
  81. {
  82. cmd.Parameters.AddWithValue("@id", contractId.Value);
  83. using (var reader = cmd.ExecuteReader())
  84. {
  85. if (reader.Read())
  86. {
  87. cmbClient.SelectedValue = reader["client_id"];
  88. cmbTariff.SelectedValue = reader["tariff_id"];
  89. cmbEmployee.SelectedValue = reader["employee_id"];
  90. // ИСПРАВЛЕНО: работаем с DateOnly напрямую
  91. object signDateObj = reader["sign_date"];
  92. if (signDateObj is DateOnly dateOnly)
  93. {
  94. dtpSignDate.Value = dateOnly.ToDateTime(TimeOnly.MinValue);
  95. }
  96. else if (signDateObj is DateTime dateTime)
  97. {
  98. dtpSignDate.Value = dateTime;
  99. }
  100. else
  101. {
  102. dtpSignDate.Value = Convert.ToDateTime(signDateObj);
  103. }
  104. cmbStatus.SelectedItem = reader["status"].ToString();
  105. }
  106. }
  107. }
  108. }
  109. }
  110. catch (Exception ex)
  111. {
  112. MessageBox.Show($"Ошибка загрузки договора: {ex.Message}");
  113. }
  114. }
  115. private void BtnSave_Click(object sender, EventArgs e)
  116. {
  117. if (cmbClient.SelectedValue == null || cmbTariff.SelectedValue == null || cmbEmployee.SelectedValue == null)
  118. {
  119. MessageBox.Show("Заполните все поля.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning);
  120. return;
  121. }
  122. try
  123. {
  124. using (var conn = DBConnection.GetConnection())
  125. {
  126. if (contractId.HasValue)
  127. {
  128. // Редактирование
  129. string sql = @"UPDATE contracts SET client_id=@client, tariff_id=@tariff, employee_id=@employee,
  130. sign_date=@date, status=@status WHERE contract_id=@id";
  131. using (var cmd = new NpgsqlCommand(sql, conn))
  132. {
  133. cmd.Parameters.AddWithValue("@id", contractId.Value);
  134. cmd.Parameters.AddWithValue("@client", cmbClient.SelectedValue);
  135. cmd.Parameters.AddWithValue("@tariff", cmbTariff.SelectedValue);
  136. cmd.Parameters.AddWithValue("@employee", cmbEmployee.SelectedValue);
  137. cmd.Parameters.AddWithValue("@date", DateOnly.FromDateTime(dtpSignDate.Value));
  138. cmd.Parameters.AddWithValue("@status", cmbStatus.SelectedItem.ToString());
  139. cmd.ExecuteNonQuery();
  140. }
  141. MessageBox.Show("Договор успешно обновлён!", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
  142. }
  143. else
  144. {
  145. // Добавление
  146. string sql = @"INSERT INTO contracts (client_id, tariff_id, employee_id, sign_date, status)
  147. VALUES (@client, @tariff, @employee, @date, @status)
  148. RETURNING contract_id";
  149. using (var cmd = new NpgsqlCommand(sql, conn))
  150. {
  151. cmd.Parameters.AddWithValue("@client", cmbClient.SelectedValue);
  152. cmd.Parameters.AddWithValue("@tariff", cmbTariff.SelectedValue);
  153. cmd.Parameters.AddWithValue("@employee", cmbEmployee.SelectedValue);
  154. cmd.Parameters.AddWithValue("@date", DateOnly.FromDateTime(dtpSignDate.Value));
  155. cmd.Parameters.AddWithValue("@status", cmbStatus.SelectedItem.ToString());
  156. int newId = Convert.ToInt32(cmd.ExecuteScalar());
  157. MessageBox.Show($"Договор №{newId} успешно добавлен!", "Успех",
  158. MessageBoxButtons.OK, MessageBoxIcon.Information);
  159. }
  160. }
  161. }
  162. DialogResult = DialogResult.OK;
  163. Close();
  164. }
  165. catch (PostgresException ex) when (ex.SqlState == "23505")
  166. {
  167. MessageBox.Show("Ошибка: такой договор уже существует. Попробуйте снова.",
  168. "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
  169. }
  170. catch (Exception ex)
  171. {
  172. MessageBox.Show($"Ошибка сохранения: {ex.Message}",
  173. "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
  174. }
  175. }
  176. private void BtnCancel_Click(object sender, EventArgs e)
  177. {
  178. DialogResult = DialogResult.Cancel;
  179. Close();
  180. }
  181. }
  182. }