AnalyticsForm.cs 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. using System;
  2. using System.Data;
  3. using System.Windows.Forms;
  4. using Npgsql;
  5. namespace ProviderApp
  6. {
  7. public partial class AnalyticsForm : UserControl
  8. {
  9. public AnalyticsForm()
  10. {
  11. InitializeComponent();
  12. this.Load += AnalyticsForm_Load;
  13. btnShow.Click += BtnShow_Click;
  14. btnExport.Click += BtnExport_Click;
  15. btnExportRevenue.Click += BtnExportRevenue_Click;
  16. btnFinancialReport.Click += BtnFinancialReport_Click;
  17. StyleDataGridView();
  18. }
  19. public void RefreshData()
  20. {
  21. ExecuteAnalytics();
  22. }
  23. private void StyleDataGridView()
  24. {
  25. dgvResult.ColumnHeadersDefaultCellStyle.BackColor = System.Drawing.Color.FromArgb(230, 92, 0);
  26. dgvResult.ColumnHeadersDefaultCellStyle.ForeColor = System.Drawing.Color.White;
  27. dgvResult.ColumnHeadersDefaultCellStyle.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Bold);
  28. dgvResult.DefaultCellStyle.BackColor = System.Drawing.Color.FromArgb(40, 40, 40);
  29. dgvResult.DefaultCellStyle.ForeColor = System.Drawing.Color.White;
  30. dgvResult.AlternatingRowsDefaultCellStyle.BackColor = System.Drawing.Color.FromArgb(45, 45, 45);
  31. dgvResult.EnableHeadersVisualStyles = false;
  32. }
  33. private void AnalyticsForm_Load(object sender, EventArgs e)
  34. {
  35. dtpFrom.Value = new DateTime(2024, 1, 1);
  36. dtpTo.Value = new DateTime(2024, 12, 31);
  37. ExecuteAnalytics();
  38. btnExport.Visible = AuthHelper.CurrentUser.IsManager;
  39. btnExportRevenue.Visible = AuthHelper.CurrentUser.IsManager;
  40. btnFinancialReport.Visible = AuthHelper.CurrentUser.IsManager;
  41. }
  42. private void BtnShow_Click(object sender, EventArgs e)
  43. {
  44. ExecuteAnalytics();
  45. }
  46. private void ExecuteAnalytics()
  47. {
  48. var conn = DBConnection.GetConnection();
  49. DateTime fromDate = dtpFrom.Value.Date;
  50. DateTime toDate = dtpTo.Value.Date;
  51. string callProc = "CALL sizov_ev.get_top_tariffs_by_period(@date_from, @date_to)";
  52. var cmd = new NpgsqlCommand(callProc, conn);
  53. cmd.Parameters.Add("@date_from", NpgsqlTypes.NpgsqlDbType.Date).Value = fromDate;
  54. cmd.Parameters.Add("@date_to", NpgsqlTypes.NpgsqlDbType.Date).Value = toDate;
  55. cmd.ExecuteNonQuery();
  56. cmd.Dispose();
  57. string selectSql = @"
  58. SELECT
  59. tariff_name as ""Тариф"",
  60. monthly_price as ""Цена, руб"",
  61. connection_count as ""Количество подключений""
  62. FROM sizov_ev.top_tariffs_result
  63. ORDER BY connection_count DESC";
  64. var cmd2 = new NpgsqlCommand(selectSql, conn);
  65. DataTable dt = new DataTable();
  66. var da = new NpgsqlDataAdapter(cmd2);
  67. da.Fill(dt);
  68. dgvResult.DataSource = dt;
  69. da.Dispose();
  70. cmd2.Dispose();
  71. conn.Dispose();
  72. }
  73. private void BtnFinancialReport_Click(object sender, EventArgs e)
  74. {
  75. if (!AuthHelper.CheckPermission("manager")) return;
  76. try
  77. {
  78. using (var conn = DBConnection.GetConnection())
  79. {
  80. string sql = @"
  81. SELECT
  82. t.tariff_id,
  83. t.name as tariff_name,
  84. t.monthly_price,
  85. COUNT(DISTINCT c.contract_id) AS contracts_count,
  86. COALESCE(SUM(p.amount), 0) AS total_revenue
  87. FROM sizov_ev.tariffs t
  88. LEFT JOIN sizov_ev.contracts c ON t.tariff_id = c.tariff_id
  89. LEFT JOIN sizov_ev.payments p ON c.contract_id = p.contract_id
  90. GROUP BY t.tariff_id, t.name, t.monthly_price
  91. ORDER BY total_revenue DESC";
  92. using (var cmd = new NpgsqlCommand(sql, conn))
  93. {
  94. DataTable dt = new DataTable();
  95. using (var da = new NpgsqlDataAdapter(cmd))
  96. {
  97. da.Fill(dt);
  98. }
  99. dgvResult.DataSource = dt;
  100. if (dgvResult.Columns["tariff_id"] != null)
  101. dgvResult.Columns["tariff_id"].HeaderText = "ID";
  102. if (dgvResult.Columns["tariff_name"] != null)
  103. dgvResult.Columns["tariff_name"].HeaderText = "Тариф";
  104. if (dgvResult.Columns["monthly_price"] != null)
  105. dgvResult.Columns["monthly_price"].HeaderText = "Цена, руб";
  106. if (dgvResult.Columns["contracts_count"] != null)
  107. dgvResult.Columns["contracts_count"].HeaderText = "Кол-во договоров";
  108. if (dgvResult.Columns["total_revenue"] != null)
  109. dgvResult.Columns["total_revenue"].HeaderText = "Выручка, руб";
  110. AuthHelper.LogAction("Просмотр финансового отчёта", "analytics");
  111. }
  112. }
  113. }
  114. catch (Exception ex)
  115. {
  116. MessageBox.Show($"Ошибка: {ex.Message}");
  117. }
  118. }
  119. private void BtnExport_Click(object sender, EventArgs e)
  120. {
  121. if (!AuthHelper.CheckPermission("manager")) return;
  122. try
  123. {
  124. using (var conn = DBConnection.GetConnection())
  125. {
  126. DateTime fromDate = dtpFrom.Value.Date;
  127. DateTime toDate = dtpTo.Value.Date;
  128. string sql = @"
  129. SELECT
  130. t.name as ""Тариф"",
  131. t.monthly_price as ""Цена, руб"",
  132. COUNT(c.contract_id) as ""Количество подключений""
  133. FROM sizov_ev.tariffs t
  134. LEFT JOIN sizov_ev.contracts c ON t.tariff_id = c.tariff_id
  135. AND c.sign_date BETWEEN @date_from AND @date_to
  136. GROUP BY t.tariff_id, t.name, t.monthly_price
  137. ORDER BY COUNT(c.contract_id) DESC";
  138. using (var cmd = new NpgsqlCommand(sql, conn))
  139. {
  140. cmd.Parameters.AddWithValue("@date_from", fromDate);
  141. cmd.Parameters.AddWithValue("@date_to", toDate);
  142. DataTable dt = new DataTable();
  143. using (var da = new NpgsqlDataAdapter(cmd))
  144. {
  145. da.Fill(dt);
  146. }
  147. AuthHelper.LogAction("Экспорт аналитики в CSV", "analytics");
  148. CsvExporter.ExportToCsv(dt, $"Аналитика_тарифов_{DateTime.Now:yyyyMMdd_HHmmss}.csv");
  149. }
  150. }
  151. }
  152. catch (Exception ex)
  153. {
  154. MessageBox.Show($"Ошибка экспорта: {ex.Message}");
  155. }
  156. }
  157. private void BtnExportRevenue_Click(object sender, EventArgs e)
  158. {
  159. if (!AuthHelper.CheckPermission("manager")) return;
  160. try
  161. {
  162. using (var conn = DBConnection.GetConnection())
  163. {
  164. string sql = @"
  165. SELECT
  166. t.name as ""Тариф"",
  167. t.monthly_price as ""Цена, руб"",
  168. COUNT(DISTINCT c.contract_id) as ""Кол-во договоров"",
  169. COALESCE(SUM(p.amount), 0) as ""Выручка, руб""
  170. FROM sizov_ev.tariffs t
  171. LEFT JOIN sizov_ev.contracts c ON t.tariff_id = c.tariff_id
  172. LEFT JOIN sizov_ev.payments p ON c.contract_id = p.contract_id
  173. GROUP BY t.tariff_id, t.name, t.monthly_price
  174. ORDER BY SUM(p.amount) DESC";
  175. using (var cmd = new NpgsqlCommand(sql, conn))
  176. {
  177. DataTable dt = new DataTable();
  178. using (var da = new NpgsqlDataAdapter(cmd))
  179. {
  180. da.Fill(dt);
  181. }
  182. decimal totalRevenue = 0;
  183. foreach (DataRow row in dt.Rows)
  184. {
  185. if (row["Выручка, руб"] != DBNull.Value)
  186. totalRevenue += Convert.ToDecimal(row["Выручка, руб"]);
  187. }
  188. AuthHelper.LogAction("Экспорт финансового отчёта", "analytics");
  189. CsvExporter.ExportToCsv(dt, $"Финансовый_отчёт_{DateTime.Now:yyyyMMdd_HHmmss}.csv");
  190. MessageBox.Show($"Общая выручка: {totalRevenue:C2}", "Итого",
  191. MessageBoxButtons.OK, MessageBoxIcon.Information);
  192. }
  193. }
  194. }
  195. catch (Exception ex)
  196. {
  197. MessageBox.Show($"Ошибка: {ex.Message}");
  198. }
  199. }
  200. }
  201. }