Index.cshtml 76 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921
  1. @{
  2. ViewData["Title"] = "Index";
  3. Layout = "~/Views/Shared/_Layout.cshtml";
  4. }
  5. @using SuperCms.Controllers;
  6. @using SuperCms.Models;
  7. @using System.Globalization;
  8. @{
  9. int pageNow = 1;
  10. if (Model.page != null)
  11. {
  12. pageNow = int.Parse(Model.page);
  13. }
  14. }
  15. @model ReportViewModel
  16. <div class="app-content content">
  17. <div class="content-wrapper">
  18. <div class="content-header row">
  19. <div class="content-header-left col-md-6 col-xs-12 mb-1">
  20. @*<h2 class="content-header-title">Message configuration</h2>*@
  21. </div>
  22. <div class="content-header-right breadcrumbs-right breadcrumbs-top col-md-6 col-xs-12">
  23. <div class="breadcrumb-wrapper col-xs-12">
  24. <ol class="breadcrumb">
  25. @*<li class="breadcrumb-item">
  26. <a href="Index">Admin</a>
  27. </li>*@
  28. @*<li class="breadcrumb-item">
  29. <a href="/Config">Tables</a>
  30. </li>*@
  31. </ol>
  32. </div>
  33. </div>
  34. </div>
  35. <div class="content-body">
  36. <!-- Basic form layout section start -->
  37. <section id="basic-form-layouts">
  38. <div class="row service-height">
  39. <div class="col-md-12">
  40. <div class="card">
  41. <div class="card-header">
  42. <h4 class="card-title" id="basic-layout-form">Toolbars</h4>
  43. <a class="heading-elements-toggle"><i class="icon-ellipsis font-medium-3"></i></a>
  44. <div class="heading-elements">
  45. <ul class="list-inline mb-0">
  46. <li><a data-action="collapse"><i class="icon-minus4"></i></a></li>
  47. <li><a data-action="expand"><i class="icon-expand2"></i></a></li>
  48. </ul>
  49. </div>
  50. </div>
  51. <div class="card-content collapse show">
  52. <div class="card-body ">
  53. <div class="card-block">
  54. <div class="form-body">
  55. <div class="row">
  56. <div class="col-md-4">
  57. <div class="form-group">
  58. <label for="serviceCode">Action</label>
  59. <div>
  60. @*<button type="button" class="btn btn-primary button-style" onclick="filterData()" id="btnSearch">
  61. <i class="icon-search"></i> Filter
  62. </button>
  63. <button type="button" class="btn btn-amber button-style" onclick="searchData()" id="btnSearch">
  64. <i class="icon-search"></i> Search
  65. </button>*@
  66. <button type="button" class="btn btn-danger button-style" onclick="exportData(null, null)">
  67. <i class="icon-search"></i> Export
  68. </button>
  69. </div>
  70. </div>
  71. </div>
  72. </div>
  73. <div class="row">
  74. <div class="col-md-4">
  75. <div class="form-group">
  76. <label for="serviceCode">Money / Subscribers</label>
  77. <select id="typeGetIndex" name="typeGetIndex" class="form-control" onchange="chooseTypeClick(this.value)">
  78. <option value="@Model.typeGet">@UtilsController.convertNameTypeGet(Model.typeGet)</option>
  79. @{
  80. for (int i = 0; i < UtilsController.Constant.MAX_GET; i++)
  81. {
  82. if (Model.typeGet != i.ToString())
  83. {
  84. <option value="@i">@UtilsController.convertNameTypeGet(i.ToString())</option>
  85. }
  86. }
  87. }
  88. </select>
  89. </div>
  90. </div>
  91. <div class="col-md-2">
  92. <div class="form-group">
  93. <label for="serviceCode">Choose the date to compare</label>
  94. <select id="dateGetIndex" name="dateGetIndex" class="form-control" onchange="chooseDateClick(this.value)">
  95. <option value="@Model.date">@Model.date</option>
  96. @{
  97. DateTime now = DateTime.Now;
  98. int dates = DateTime.DaysInMonth(now.Year, now.Month);
  99. for (int i = 1; i <= dates; i++)
  100. {
  101. if (Model.date != i.ToString())
  102. {
  103. <option value="@i">@i</option>
  104. }
  105. }
  106. }
  107. </select>
  108. </div>
  109. </div>
  110. </div>
  111. <div class="row">
  112. <div class="col-md-4">
  113. <div class="form-group">
  114. <label for="serviceCode">Telcos</label>
  115. <select id="telcoIndex" name="telcoIndex" class="form-control" onchange="telcoClick(this.value)">
  116. <option value="@Model.telco.id">@Model.telco.telcoName</option>
  117. @{
  118. for (int i = 0; i < Model.telcos.data.Count; i++)
  119. {
  120. if (Model.telcos.data[i].id != Model.telco.id)
  121. {
  122. <option value="@Model.telcos.data[i].id">@Model.telcos.data[i].telcoName</option>
  123. }
  124. }
  125. }
  126. </select>
  127. </div>
  128. </div>
  129. <div class="col-md-4">
  130. <div class="form-group">
  131. <label for="serviceCode">Companies</label>
  132. <select id="companyIndex" name="companyIndex" class="form-control" onchange="companyClick(@Model.telcoID, this.value)">
  133. <option value="@Model.company.id">@Model.company.name</option>
  134. @{
  135. for (int i = 0; i < Model.companies.data.Count; i++)
  136. {
  137. if (Model.companies.data[i].id != Model.company.id)
  138. {
  139. <option value="@Model.companies.data[i].id">@Model.companies.data[i].name</option>
  140. }
  141. }
  142. }
  143. </select>
  144. </div>
  145. </div>
  146. @*<div class="col-md-4">
  147. <div class="form-group">
  148. <label for="serviceCode">Action</label>
  149. <div>
  150. <button type="button" class="btn btn-primary" onclick="searchData()" id="btnSearch">
  151. <i class="icon-search"></i> Run
  152. </button>
  153. </div>
  154. </div>
  155. </div>*@
  156. </div>
  157. </div>
  158. </div>
  159. </div>
  160. </div>
  161. </div>
  162. </div>
  163. <div class="col-12">
  164. <div class="card">
  165. <div class="row card-content" style="margin:0;">
  166. <div class="col-md-9 table-responsive" style="padding-right:0; padding-left: 0;">
  167. <table id="db-table-detail-report-month" class="table table-hover mb-0 ps-container ps-theme-default">
  168. @{
  169. List<ConnConfig> services = Model.services.data.FindAll(x => x.companyID == Model.companyID);
  170. if (Model.typeGet == UtilsController.Constant.MONEY_GET)
  171. {
  172. <thead>
  173. <tr>
  174. <th>NO</th>
  175. <th>VAS CODE</th>
  176. <th></th>
  177. <th>Acc last month</th>
  178. <th>Acc now</th>
  179. <th>+/-</th>
  180. <th>%</th>
  181. @*<th>@Model.listDate[1].ToString("dd/MM")</th>*@
  182. <th>@Model.date@Model.listDate[0].ToString("/MM")</th>
  183. </tr>
  184. </thead>
  185. }
  186. else
  187. {
  188. <thead>
  189. <tr>
  190. <th>NO</th>
  191. <th>VAS CODE</th>
  192. <th></th>
  193. <th>SUB</th>
  194. <th>SUB last month</th>
  195. <th>+/-</th>
  196. <th>%</th>
  197. @*<th>@Model.listDate[1].ToString("dd/MM")</th>*@
  198. <th>@Model.date@Model.listDate[1].ToString("/MM")</th>
  199. </tr>
  200. </thead>
  201. }
  202. <tbody>
  203. @{
  204. // get the newest data folowing by each service
  205. for (int j = 0; j < services.Count; j++)
  206. {
  207. ConnConfig service = services[j];
  208. // get all data in the last month
  209. // calculator
  210. double newSub = 0, newSubBefore = 0, newSubS = 0, newSubP = 0, newSubN = 0;
  211. double revenue = 0, revenueBefore = 0;
  212. double expense = 0, expenseBefore = 0;
  213. double totalSub = 0, totalSubBefore = 0, totalSubS = 0, totalSubP = 0, totalSubN = 0;
  214. double deactive = 0, deactiveBefore = 0, deactiveS = 0, deactiveP = 0, deactiveN = 0;
  215. //double active = 0, activeBefore = 0, activeS = 0, activeP = 0, activeN = 0;
  216. double benefit = 0, benefitBefore = 0;
  217. double benefitP = 0, revenueP = 0, expenseP = 0;
  218. double benefitD = 0, revenueD = 0, expenseD = 0;
  219. double benefitN = 0, revenueN = 0, expenseN = 0;
  220. ConnDatas dataDateNowLastMonth = new ConnDatas();
  221. dataDateNowLastMonth.data = new List<ConnData>();
  222. ConnDatas dataDateNowMonthNow = new ConnDatas();
  223. dataDateNowMonthNow.data = new List<ConnData>();
  224. DistributedDataByService distributedDataByService = Model.distributedDataByServices.Find(x => x.service.id == service.id);
  225. distributedDataByService.dataLastMonth.data.Sort(delegate (ConnData x, ConnData y)
  226. {
  227. if (x.dateGet == null && y.dateGet == null) return 0;
  228. else if (x.dateGet == null) return -1;
  229. else if (y.dateGet == null) return 1;
  230. else return DateTime.Compare(
  231. DateTime.ParseExact(y.dateGet + " 23:59:59", "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture),
  232. DateTime.ParseExact(x.dateGet + " 23:59:59", "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture));
  233. });
  234. if (int.Parse(Model.date) <= distributedDataByService.dataLastMonth.data.Count)
  235. {
  236. for (int q = 0; q < int.Parse(Model.date); q++)
  237. {
  238. dataDateNowLastMonth.data.Add(distributedDataByService.dataLastMonth.data[distributedDataByService.dataLastMonth.data.Count - 1 - q]);
  239. }
  240. totalSubBefore = double.Parse(dataDateNowLastMonth.data[0].totalSub);
  241. dataDateNowLastMonth.data.ForEach(x =>
  242. {
  243. if (x.registerNew != null)
  244. {
  245. newSubBefore += int.Parse(x.registerNew);
  246. }
  247. });
  248. dataDateNowLastMonth.data.ForEach(x =>
  249. {
  250. if (x.deactive != null)
  251. {
  252. deactiveBefore += int.Parse(x.deactive);
  253. }
  254. });
  255. dataDateNowLastMonth.data.ForEach(x =>
  256. {
  257. if (x.revenue != null)
  258. {
  259. revenueBefore += int.Parse(x.revenue);
  260. }
  261. });
  262. dataDateNowLastMonth.data.ForEach(x =>
  263. {
  264. if (x.expense != null)
  265. {
  266. expenseBefore += int.Parse(x.expense);
  267. }
  268. });
  269. }
  270. //distributedDataByService.dataLastMonth.data.ForEach(x => newSubBefore += int.Parse(x.registerNew));
  271. //distributedDataByService.dataLastMonth.data.ForEach(x => deactiveBefore += int.Parse(x.deactive));
  272. //distributedDataByService.dataLastMonth.data.ForEach(x => revenueBefore += int.Parse(x.revenue));
  273. //distributedDataByService.dataLastMonth.data.ForEach(x => expenseBefore += int.Parse(x.expense));
  274. // get max day of the last month
  275. //if (distributedDataByService.dataLastMonth.data.Count > 0)
  276. //{
  277. // totalSubBefore = double.Parse(distributedDataByService.dataLastMonth.data[0].totalSub);
  278. //}
  279. benefitBefore = revenueBefore - Math.Abs(expenseBefore);
  280. distributedDataByService.dataNow.data.Sort(delegate (ConnData x, ConnData y)
  281. {
  282. if (x.dateGet == null && y.dateGet == null) return 0;
  283. else if (x.dateGet == null) return -1;
  284. else if (y.dateGet == null) return 1;
  285. else return DateTime.Compare(
  286. DateTime.ParseExact(y.dateGet + " 23:59:59", "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture),
  287. DateTime.ParseExact(x.dateGet + " 23:59:59", "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture));
  288. });
  289. if (int.Parse(Model.date) <= distributedDataByService.dataNow.data.Count)
  290. {
  291. for (int q = 0; q < int.Parse(Model.date); q++)
  292. {
  293. dataDateNowMonthNow.data.Add(distributedDataByService.dataNow.data[distributedDataByService.dataNow.data.Count - 1 - q]);
  294. }
  295. totalSub = double.Parse(dataDateNowMonthNow.data[0].totalSub);
  296. dataDateNowMonthNow.data.ForEach(x =>
  297. {
  298. if (x.registerNew != null)
  299. {
  300. newSub += int.Parse(x.registerNew);
  301. }
  302. });
  303. dataDateNowMonthNow.data.ForEach(x =>
  304. {
  305. if (x.deactive != null)
  306. {
  307. deactive += int.Parse(x.deactive);
  308. }
  309. });
  310. dataDateNowMonthNow.data.ForEach(x =>
  311. {
  312. if (x.revenue != null)
  313. {
  314. revenue += int.Parse(x.revenue);
  315. }
  316. });
  317. dataDateNowMonthNow.data.ForEach(x =>
  318. {
  319. if (x.expense != null)
  320. {
  321. expense += int.Parse(x.expense);
  322. }
  323. });
  324. if (dataDateNowMonthNow.data[int.Parse(Model.date) - 1].revenue != null)
  325. {
  326. revenueN = double.Parse(dataDateNowMonthNow.data[int.Parse(Model.date) - 1].revenue);
  327. }
  328. if (dataDateNowMonthNow.data[int.Parse(Model.date) - 1].expense != null)
  329. {
  330. expenseN = double.Parse(dataDateNowMonthNow.data[int.Parse(Model.date) - 1].expense);
  331. }
  332. benefitN = revenueN + expenseN;
  333. if (dataDateNowMonthNow.data[int.Parse(Model.date) - 1].totalSub != null)
  334. {
  335. totalSubN = double.Parse(dataDateNowMonthNow.data[int.Parse(Model.date) - 1].totalSub);
  336. }
  337. }
  338. //distributedDataByService.dataNow.data.ForEach(x => newSub += int.Parse(x.registerNew));
  339. //distributedDataByService.dataNow.data.ForEach(x => deactive += int.Parse(x.deactive));
  340. //distributedDataByService.dataNow.data.ForEach(x => revenue += int.Parse(x.revenue));
  341. //distributedDataByService.dataNow.data.ForEach(x => expense += int.Parse(x.expense));
  342. //if (distributedDataByService.dataNow.data.Count > 0)
  343. //{
  344. // totalSub = double.Parse(distributedDataByService.dataNow.data[0].totalSub);
  345. //}
  346. benefit = revenue - Math.Abs(expense);
  347. revenueD = revenue - revenueBefore;
  348. expenseD = Math.Abs(expense) - Math.Abs(expenseBefore);
  349. benefitD = benefit - benefitBefore;
  350. revenueP = revenueBefore != 0 ? Math.Round(revenueD * 100 / revenueBefore, 2) : 100;
  351. expenseP = expenseBefore != 0 ? Math.Round(expenseD * 100 / expenseBefore, 2) : 100;
  352. benefitP = benefitBefore != 0 ? Math.Round(benefitD * 100 / benefitBefore, 2) : 100;
  353. //if (distributedDataByService.distributedByTimes.Count > 0)
  354. //{
  355. // revenueN = double.Parse(distributedDataByService.distributedByTimes[0].connDatas.data[0].revenue);
  356. // expenseN = double.Parse(distributedDataByService.distributedByTimes[0].connDatas.data[0].expense);
  357. // benefitN = revenueN + expenseN;
  358. // totalSubN = double.Parse(distributedDataByService.distributedByTimes[0].connDatas.data[0].totalSub);
  359. //}
  360. totalSubS = totalSub - totalSubBefore;
  361. totalSubP = totalSubBefore != 0 ? Math.Round(totalSubS * 100 / totalSubBefore, 2) : 100;
  362. deactiveS = deactive - deactiveBefore;
  363. deactiveP = deactiveBefore != 0 ? Math.Round(deactiveS * 100 / deactiveBefore, 2) : 100;
  364. newSubS = newSub - newSubBefore;
  365. newSubP = newSubBefore != 0 ? Math.Round(newSubS * 100 / newSubBefore, 2) : 100;
  366. if (Model.typeGet == UtilsController.Constant.MONEY_GET)
  367. {
  368. <tr class="@(j%2==0? "oven-column" : "")">
  369. @if (service.state == UtilsController.Constant.ALL_REVEUNUE)
  370. {
  371. <td rowspan="3" class="text-truncate main-column">@(j + 1)</td>
  372. <td rowspan="3" class="text-truncate main-column">@service.serviceName</td>
  373. }
  374. else
  375. {
  376. <td class="text-truncate">@(j + 1)</td>
  377. <td class="text-truncate">@service.serviceName</td>
  378. }
  379. <td class="text-truncate">Revenue</td>
  380. <td class="text-truncate">@(string.Format("{0:#,0}", revenueBefore))</td>
  381. <td class="text-truncate">@(string.Format("{0:#,0}", revenue))</td>
  382. <td class="text-truncate @(revenueD < 0 ? "red-text" : "")">@(string.Format("{0:#,0}", Math.Abs(revenueD)))</td>
  383. <td class="text-truncate">
  384. @{
  385. if (revenueD < 0)
  386. {
  387. <div class="progress process-style-right" style="margin:auto;">
  388. <div class="progress-bar bg-danger" style="width:@Math.Abs(revenueP)%">@Math.Abs(revenueP)%</div>
  389. </div>
  390. <div class="progress process-style-left" style="margin:auto;">
  391. <div class="progress-bar bg-success" style="width:0%">0%</div>
  392. </div>
  393. }
  394. else
  395. {
  396. <div class="progress process-style-right" style="margin:auto;">
  397. <div class="progress-bar bg-danger" style="width:0%">0%</div>
  398. </div>
  399. <div class="progress process-style-left" style="margin:auto;">
  400. <div class="progress-bar bg-success" style="width:@Math.Abs(revenueP)%">@Math.Abs(revenueP)%</div>
  401. </div>
  402. }
  403. }
  404. </td>
  405. <td class="text-truncate">@(string.Format("{0:#,0}", revenueN))</td>
  406. </tr>
  407. if (service.state == UtilsController.Constant.ALL_REVEUNUE)
  408. {
  409. <tr class="@(j%2==0? "oven-column" : "")">
  410. <td class="text-truncate">Expense</td>
  411. <td class="text-truncate">@(string.Format("{0:#,0}", expenseBefore >= 0 ? expenseBefore : -expenseBefore))</td>
  412. <td class="text-truncate">@(string.Format("{0:#,0}", expense >= 0 ? expense : -expense))</td>
  413. <td class="text-truncate @(expenseD < 0 ? "red-text" : "")">@(string.Format("{0:#,0}", Math.Abs(expenseD)))</td>
  414. <td class="text-truncate">
  415. @{
  416. if (expenseD < 0)
  417. {
  418. <div class="progress process-style-right" style="margin:auto;">
  419. <div class="progress-bar bg-danger" style="width:@Math.Abs(expenseP)%">@Math.Abs(expenseP)%</div>
  420. </div>
  421. <div class="progress process-style-left" style="margin:auto;">
  422. <div class="progress-bar bg-success" style="width:0%">0%</div>
  423. </div>
  424. }
  425. else
  426. {
  427. <div class="progress process-style-right" style="margin:auto;">
  428. <div class="progress-bar bg-danger" style="width:0%">0%</div>
  429. </div>
  430. <div class="progress process-style-left" style="margin:auto;">
  431. <div class="progress-bar bg-success" style="width:@Math.Abs(expenseP)%">@Math.Abs(expenseP)%</div>
  432. </div>
  433. }
  434. }
  435. </td>
  436. <td class="text-truncate">@(string.Format("{0:#,0}", expenseN >= 0 ? expenseN : -expenseN))</td>
  437. </tr>
  438. <tr class="@(j%2==0? "oven-column" : "")">
  439. <td class="text-truncate">Benefit</td>
  440. <td class="text-truncate">@(string.Format("{0:#,0}", benefitBefore))</td>
  441. <td class="text-truncate">@(string.Format("{0:#,0}", benefit))</td>
  442. <td class="text-truncate @(benefitD < 0 ? "red-text" : "")">@(string.Format("{0:#,0}", Math.Abs(benefitD)))</td>
  443. <td class="text-truncate">
  444. @{
  445. if (benefitD < 0)
  446. {
  447. <div class="progress process-style-right" style="margin:auto;">
  448. <div class="progress-bar bg-danger" style="width:@Math.Abs(benefitP)%">@Math.Abs(benefitP)%</div>
  449. </div>
  450. <div class="progress process-style-left" style="margin:auto;">
  451. <div class="progress-bar bg-success" style="width:0%">0%</div>
  452. </div>
  453. }
  454. else
  455. {
  456. <div class="progress process-style-right" style="margin:auto;">
  457. <div class="progress-bar bg-danger" style="width:0%">0%</div>
  458. </div>
  459. <div class="progress process-style-left" style="margin:auto;">
  460. <div class="progress-bar bg-success" style="width:@Math.Abs(benefitP)%">@Math.Abs(benefitP)%</div>
  461. </div>
  462. }
  463. }
  464. </td>
  465. <td class="text-truncate">@(string.Format("{0:#,0}", benefitN))</td>
  466. </tr>
  467. }
  468. }
  469. else
  470. {
  471. <tr class="sencond-column @(j%2==0? "oven-column" : "")">
  472. <td rowspan="3" class="text-truncate">@(j + 1)</td>
  473. <td rowspan="3" class="text-truncate">@service.serviceName</td>
  474. <td class="text-truncate">Total Sub</td>
  475. <td class="text-truncate">@(string.Format("{0:#,0}", totalSub))</td>
  476. <td class="text-truncate">@(string.Format("{0:#,0}", totalSubBefore))</td>
  477. <td class="text-truncate @(totalSubS < 0 ? "red-text" : "")">@(string.Format("{0:#,0}", Math.Abs(totalSubS)))</td>
  478. <td class="text-truncate">
  479. @{
  480. if (totalSubS < 0)
  481. {
  482. <div class="progress process-style-right" style="margin:auto;">
  483. <div class="progress-bar bg-danger" style="width:@Math.Abs(totalSubP)%">@Math.Abs(totalSubP)%</div>
  484. </div>
  485. <div class="progress process-style-left" style="margin:auto;">
  486. <div class="progress-bar bg-success" style="width:0%">0%</div>
  487. </div>
  488. }
  489. else
  490. {
  491. <div class="progress process-style-right" style="margin:auto;">
  492. <div class="progress-bar bg-danger" style="width:0%">0%</div>
  493. </div>
  494. <div class="progress process-style-left" style="margin:auto;">
  495. <div class="progress-bar bg-success" style="width:@Math.Abs(totalSubP)%">@Math.Abs(totalSubP)%</div>
  496. </div>
  497. }
  498. }
  499. </td>
  500. <td class="text-truncate">@(string.Format("{0:#,0}", totalSubN))</td>
  501. </tr>
  502. <tr class="sencond-column @(j%2==0? "oven-column" : "")">
  503. <td class="text-truncate">Deactive</td>
  504. <td class="text-truncate">@(string.Format("{0:#,0}", deactive))</td>
  505. <td class="text-truncate">@(string.Format("{0:#,0}", deactiveBefore))</td>
  506. <td class="text-truncate @(deactiveS < 0 ? "red-text" : "")">@(string.Format("{0:#,0}", Math.Abs(deactiveS)))</td>
  507. <td class="text-truncate">
  508. @{
  509. if (deactiveS < 0)
  510. {
  511. <div class="progress process-style-right" style="margin:auto;">
  512. <div class="progress-bar bg-danger" style="width:@Math.Abs(deactiveP)%">@Math.Abs(deactiveP)%</div>
  513. </div>
  514. <div class="progress process-style-left" style="margin:auto;">
  515. <div class="progress-bar bg-success" style="width:0%">0%</div>
  516. </div>
  517. }
  518. else
  519. {
  520. <div class="progress process-style-right" style="margin:auto;">
  521. <div class="progress-bar bg-danger" style="width:0%">0%</div>
  522. </div>
  523. <div class="progress process-style-left" style="margin:auto;">
  524. <div class="progress-bar bg-success" style="width:@Math.Abs(deactiveP)%">@Math.Abs(deactiveP)%</div>
  525. </div>
  526. }
  527. }
  528. </td>
  529. <td class="text-truncate">@(string.Format("{0:#,0}", deactiveN))</td>
  530. </tr>
  531. <tr class="sencond-column @(j%2==0? "oven-column" : "")">
  532. <td class="text-truncate">Active</td>
  533. <td class="text-truncate">@(string.Format("{0:#,0}", newSub))</td>
  534. <td class="text-truncate">@(string.Format("{0:#,0}", newSubBefore))</td>
  535. <td class="text-truncate @(newSubS < 0 ? "red-text" : "")">@(string.Format("{0:#,0}", Math.Abs(newSubS)))</td>
  536. <td class="text-truncate">
  537. @{
  538. if (newSubS < 0)
  539. {
  540. <div class="progress process-style-right" style="margin:auto;">
  541. <div class="progress-bar bg-danger" style="width:@Math.Abs(deactiveP)%">@Math.Abs(newSubP)%</div>
  542. </div>
  543. <div class="progress process-style-left" style="margin:auto;">
  544. <div class="progress-bar bg-success" style="width:0%">0%</div>
  545. </div>
  546. }
  547. else
  548. {
  549. <div class="progress process-style-right" style="margin:auto;">
  550. <div class="progress-bar bg-danger" style="width:0%">0%</div>
  551. </div>
  552. <div class="progress process-style-left" style="margin:auto;">
  553. <div class="progress-bar bg-success" style="width:@Math.Abs(newSubP)%">@Math.Abs(newSubP)%</div>
  554. </div>
  555. }
  556. }
  557. </td>
  558. <td class="text-truncate">@(string.Format("{0:#,0}", newSubN))</td>
  559. </tr>
  560. }
  561. }
  562. }
  563. </tbody>
  564. }
  565. </table>
  566. </div>
  567. <div class="col-md-3 table-responsive" style="padding-left:0">
  568. <table id="db-table-detail-report-day" class="table table-hover mb-0 ps-container ps-theme-default">
  569. @{
  570. <thead>
  571. <tr>
  572. @{
  573. for (int d = 1; d < Model.listDate.Count; d++)
  574. {
  575. <th>@Model.listDate[d].ToString("dd/MM")</th>
  576. }
  577. }
  578. </tr>
  579. </thead>
  580. <tbody>
  581. @{
  582. // get the newest data folowing by each service
  583. for (int j = 0; j < services.Count; j++)
  584. {
  585. ConnConfig service = services[j];
  586. // get all data in the last month
  587. // calculator
  588. double benefitN = 0, revenueN = 0, expenseN = 0;
  589. DistributedDataByService distributedDataByService = Model.distributedDataByServices.Find(x => x.service.id == service.id);
  590. if (Model.typeGet == UtilsController.Constant.MONEY_GET)
  591. {
  592. <tr class="sencond-column @(j%2==0? "oven-column" : "")">
  593. @{
  594. if (distributedDataByService.distributedByTimes.Count > 0)
  595. {
  596. for (int c = 0; c < distributedDataByService.distributedByTimes.Count; c++)
  597. {
  598. if (distributedDataByService.distributedByTimes[c].connDatas.data.Count > 0)
  599. {
  600. if (distributedDataByService.distributedByTimes[c].connDatas.data[0].revenue != null)
  601. {
  602. revenueN = double.Parse(distributedDataByService.distributedByTimes[c].connDatas.data[0].revenue);
  603. }
  604. if (distributedDataByService.distributedByTimes[c].connDatas.data[0].expense != null)
  605. {
  606. expenseN = double.Parse(distributedDataByService.distributedByTimes[c].connDatas.data[0].expense);
  607. }
  608. benefitN = revenueN + expenseN;
  609. }
  610. <td class="text-truncate">@(string.Format("{0:#,0}", revenueN))</td>
  611. }
  612. }
  613. else
  614. {
  615. for (int d = 1; d < Model.listDate.Count; d++)
  616. {
  617. <td class="text-truncate">0</td>
  618. }
  619. }
  620. }
  621. </tr>
  622. if (service.state == UtilsController.Constant.ALL_REVEUNUE)
  623. {
  624. <tr class="sencond-column @(j%2==0? "oven-column" : "")">
  625. @{
  626. if (distributedDataByService.distributedByTimes.Count > 0)
  627. {
  628. for (int c = 0; c < distributedDataByService.distributedByTimes.Count; c++)
  629. {
  630. if (distributedDataByService.distributedByTimes[c].connDatas.data.Count > 0)
  631. {
  632. if (distributedDataByService.distributedByTimes[c].connDatas.data[0].revenue != null)
  633. {
  634. revenueN = double.Parse(distributedDataByService.distributedByTimes[c].connDatas.data[0].revenue);
  635. }
  636. if (distributedDataByService.distributedByTimes[c].connDatas.data[0].expense != null)
  637. {
  638. expenseN = double.Parse(distributedDataByService.distributedByTimes[c].connDatas.data[0].expense);
  639. }
  640. benefitN = revenueN + expenseN;
  641. }
  642. <td class="text-truncate">@(string.Format("{0:#,0}", expenseN >= 0 ? expenseN : -expenseN))</td>
  643. }
  644. }
  645. else
  646. {
  647. for (int d = 1; d < Model.listDate.Count; d++)
  648. {
  649. <td class="text-truncate">0</td>
  650. }
  651. }
  652. }
  653. </tr>
  654. <tr class="sencond-column @(j%2==0? "oven-column" : "")">
  655. @{
  656. if (distributedDataByService.distributedByTimes.Count > 0)
  657. {
  658. for (int c = 0; c < distributedDataByService.distributedByTimes.Count; c++)
  659. {
  660. if (distributedDataByService.distributedByTimes[c].connDatas.data.Count > 0)
  661. {
  662. if (distributedDataByService.distributedByTimes[c].connDatas.data[0].revenue != null)
  663. {
  664. revenueN = double.Parse(distributedDataByService.distributedByTimes[c].connDatas.data[0].revenue);
  665. }
  666. if (distributedDataByService.distributedByTimes[c].connDatas.data[0].expense != null)
  667. {
  668. expenseN = double.Parse(distributedDataByService.distributedByTimes[c].connDatas.data[0].expense);
  669. }
  670. benefitN = revenueN + expenseN;
  671. }
  672. <td class="text-truncate">@(string.Format("{0:#,0}", benefitN))</td>
  673. }
  674. }
  675. else
  676. {
  677. for (int d = 1; d < Model.listDate.Count; d++)
  678. {
  679. <td class="text-truncate">0</td>
  680. }
  681. }
  682. }
  683. </tr>
  684. }
  685. }
  686. else
  687. {
  688. <tr class="sencond-column @(j%2==0? "oven-column" : "")">
  689. @{
  690. if(distributedDataByService.distributedByTimes.Count > 0){
  691. double totalSub = 0;
  692. for (int c = 0; c < distributedDataByService.distributedByTimes.Count; c++)
  693. {
  694. if (distributedDataByService.distributedByTimes[c].connDatas.data.Count > 0)
  695. {
  696. if (distributedDataByService.distributedByTimes[c].connDatas.data[0].totalSub != null)
  697. {
  698. totalSub = double.Parse(distributedDataByService.distributedByTimes[c].connDatas.data[0].totalSub);
  699. }
  700. }
  701. <td class="text-truncate">@(string.Format("{0:#,0}", totalSub))</td>
  702. }
  703. }else
  704. {
  705. for (int d = 1; d < Model.listDate.Count; d++)
  706. {
  707. <td class="text-truncate">0</td>
  708. }
  709. }
  710. }
  711. </tr>
  712. <tr class="sencond-column @(j%2==0? "oven-column" : "")">
  713. @{
  714. if(distributedDataByService.distributedByTimes.Count > 0){
  715. double deactive = 0;
  716. for (int c = 0; c < distributedDataByService.distributedByTimes.Count; c++)
  717. {
  718. if (distributedDataByService.distributedByTimes[c].connDatas.data.Count > 0)
  719. {
  720. if (distributedDataByService.distributedByTimes[c].connDatas.data[0].deactive != null)
  721. {
  722. deactive = double.Parse(distributedDataByService.distributedByTimes[c].connDatas.data[0].deactive);
  723. }
  724. }
  725. <td class="text-truncate">@(string.Format("{0:#,0}", deactive))</td>
  726. }
  727. }else
  728. {
  729. for (int d = 1; d < Model.listDate.Count; d++)
  730. {
  731. <td class="text-truncate">0</td>
  732. }
  733. }
  734. }
  735. </tr>
  736. <tr class="sencond-column @(j%2==0? "oven-column" : "")">
  737. @{
  738. if(distributedDataByService.distributedByTimes.Count > 0){
  739. double newSub = 0;
  740. for (int c = 0; c < distributedDataByService.distributedByTimes.Count; c++)
  741. {
  742. if (distributedDataByService.distributedByTimes[c].connDatas.data.Count > 0)
  743. {
  744. if (distributedDataByService.distributedByTimes[c].connDatas.data[0].registerNew != null)
  745. {
  746. newSub = double.Parse(distributedDataByService.distributedByTimes[c].connDatas.data[0].registerNew);
  747. }
  748. }
  749. <td class="text-truncate">@(string.Format("{0:#,0}", newSub))</td>
  750. }
  751. }else
  752. {
  753. for (int d = 1; d < Model.listDate.Count; d++)
  754. {
  755. <td class="text-truncate">0</td>
  756. }
  757. }
  758. }
  759. </tr>
  760. }
  761. }
  762. }
  763. </tbody>
  764. }
  765. </table>
  766. </div>
  767. <style>
  768. .pagination-style {
  769. max-width: 1200px;
  770. margin: auto;
  771. position: relative;
  772. padding: 0;
  773. float: none;
  774. padding-right: 0;
  775. text-align: center;
  776. }
  777. .pagination-active {
  778. background: #337ab7 !important;
  779. color: white !important;
  780. }
  781. .pagination-disable {
  782. pointer-events: none;
  783. }
  784. </style>
  785. @{
  786. int totalPage = Model.totalPage != null ? int.Parse(Model.totalPage) : 1;
  787. <div class="category-post-pagination col-xs-12 pagination-style">
  788. @{
  789. <ul class="pagination clearfix pagination-ul">
  790. <li class="pagination-prev">
  791. <a href="/Report?marketID=1&companyID=1&page=1">‹‹</a>
  792. </li>
  793. <li class="pagination-prev @(pageNow == 1 ? "disabled pagination-disable" : "")">
  794. <a href="/Report?marketID=1&companyID=1&page=@(pageNow-1)">‹</a>
  795. </li>
  796. @{
  797. if (totalPage <= 4)
  798. {
  799. for (int k = 1; k <= totalPage; k++)
  800. {
  801. <li class="@(pageNow == k ? "current" : "")">
  802. <a class="@(pageNow == k ? "pagination-active" : "")" href="/Report?marketID=1&companyID=1&page=@k">@k</a>
  803. </li>
  804. }
  805. }
  806. else if (pageNow <= totalPage - 4)
  807. {
  808. for (int k = pageNow; (k <= pageNow + 4 && k <= totalPage); k++)
  809. {
  810. <li class="@(pageNow == k ? "current" : "")">
  811. <a class="@(pageNow == k ? "pagination-active" : "")" href="/Report?marketID=1&companyID=1&page=@k">@k</a>
  812. </li>
  813. }
  814. }
  815. else
  816. {
  817. for (int k = totalPage - 4; k <= totalPage; k++)
  818. {
  819. <li class="@(pageNow == k ? "current" : "")">
  820. <a class="@(pageNow == k ? "pagination-active" : "")" href="/Report?marketID=1&companyID=1&page=@k">@k</a>
  821. </li>
  822. }
  823. }
  824. }
  825. <li class="pagination-next @(pageNow == totalPage ? "disabled pagination-disable" : "")">
  826. <a href="/Report?marketID=1&companyID=1&page=@(pageNow+1)">›</a>
  827. </li>
  828. <li class="pagination-next ">
  829. <a href="/Report?marketID=1&companyID=1&page=@totalPage">››</a>
  830. </li>
  831. </ul>
  832. }
  833. </div>
  834. }
  835. </div>
  836. </div>
  837. </div>
  838. </div>
  839. </section>
  840. <!-- // Basic form layout section end -->
  841. </div>
  842. </div>
  843. </div>
  844. <form method="post" action="/Report" id="report-index-form">
  845. <input name="__RequestVerificationToken" type="hidden" value="">
  846. <input type="hidden" id="dateGet" class="dateGet" name="dateGet" value="" />
  847. <input type="hidden" id="typeGet" class="typeGet" name="typeGet" value="" />
  848. <input type="hidden" id="telcoID" class="telcoID" name="telcoID" value="" />
  849. <input type="hidden" id="companyID" class="companyID" name="companyID" value="" />
  850. </form>
  851. <form method="post" action="/Report/ExportToExcel" id="report-excel-form">
  852. </form>
  853. @*@section scripts{
  854. <script src="/js/tables/jquery-3.5.1.js"></script>
  855. <script src="/js/tables/jquery.dataTables.min.js"></script>
  856. <script src="/js/tables/dataTables.buttons.min.js"></script>
  857. <script src="/js/tables/jszip.min.js"></script>
  858. <script src="/js/tables/pdfmake.min.js"></script>
  859. <script src="/js/tables/vfs_fonts.js"></script>
  860. <script src="/js/tables/buttons.html5.min.js"></script>
  861. }*@