superedit-FVAT_POS_CHARTS.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. <?php
  2. /**
  3. * Aktualizacja tabel statystycznych.
  4. *
  5. * Dotyczy tabel:
  6. * [12582] stats_BILLS_FVAT_POS
  7. *
  8. */
  9. function FVAT_POS_CHARTS() {
  10. $db = DB::getDB();
  11. if (!$db) die('<div class="alert alert-danger">' . "Database Error" . '</div>');
  12. $DBG = V::get('DBG', '', $_GET);
  13. $fvat = new FvatPosCharts();
  14. $fltr = new stdClass();
  15. $fltr->osX_range_min = '2014-01-00';
  16. $fltr->osX_range_max = date('Y-m') . '-00';
  17. $fltr->service = V::get('fltr_service', '', $_GET);
  18. $fltr->sumType = V::get('sum_type', '', $_GET);
  19. $chart = new stdClass();
  20. $chart->labels = array();
  21. $chart->data = array();
  22. $chart->colors = array();// ['red', 'green', 'yellow']
  23. if (in_array($fltr->service, array('NET', 'TEL', 'TV'))) {
  24. $chart->colors = array('silver', 'red');
  25. } else {
  26. $chart->colors = array('red', 'green', 'yellow');
  27. }
  28. $yStart = (int)substr($fltr->osX_range_min, 0, 4);
  29. $yEnd = (int)substr($fltr->osX_range_max, 0, 4);
  30. $mStart = (int)substr($fltr->osX_range_min, 5, 2);
  31. $mEnd = (int)substr($fltr->osX_range_max, 5, 2);
  32. for ($y = $yStart; $y <= $yEnd; $y++) {
  33. $lmStart = ($y == $yStart)? $mStart : 1;
  34. $lmEnd = ($y == $yEnd)? $mEnd : 12;
  35. for ($m = $lmStart; $m <= $lmEnd; $m++) {
  36. $chart->labels[] = sprintf("%04d-%02d-%02d", $y, $m, 0);
  37. }
  38. }
  39. foreach ($chart->labels as $vMonth) {
  40. if ($fltr->sumType == 'ZYSK') {
  41. $sumData = $fvat->getSumZysk($vMonth, $fltr->service, array());
  42. } else {
  43. $sumData = $fvat->getSumIncome($vMonth, $fltr->service, array());
  44. }
  45. $chart->data[] = array_values($sumData);
  46. }
  47. ?>
  48. <script src="stuff/RGraph/libraries/RGraph.common.core.js"></script>
  49. <script src="stuff/RGraph/libraries/RGraph.common.dynamic.js"></script>
  50. <script src="stuff/RGraph/libraries/RGraph.common.key.js"></script>
  51. <script src="stuff/RGraph/libraries/RGraph.drawing.rect.js"></script>
  52. <script src="stuff/RGraph/libraries/RGraph.bar.js"></script>
  53. <script src="stuff/RGraph/libraries/RGraph.line.js"></script>
  54. <canvas id="fvat_pos_chart_main" width="800" height="500" style="float:left; margin:0 20px; border:1px solid #666;">[No canvas support]</canvas>
  55. <script>
  56. jQuery(document).ready(function(){
  57. var data = <?php echo json_encode($chart->data); ?>;
  58. var bar = new RGraph.Bar('fvat_pos_chart_main', data)
  59. .Set('labels', <?php echo json_encode($chart->labels); ?>)
  60. .Set('labels.above', true)
  61. .Set('gutter.left', 50)
  62. .Set('colors', <?php echo json_encode($chart->colors); ?>)
  63. .Set('bevel', true)
  64. <?php if ($fltr->service == 'ALL') echo " .Set('grouping', 'stacked') "; ?>
  65. .Draw();
  66. //.Set('grouping', 'stacked')
  67. });
  68. </script>
  69. <?php
  70. $args = array();
  71. $args['MONTH'] = V::get('MONTH', '', $_GET);
  72. $args['id_owner'] = V::get('id_owner', '', $_GET);
  73. $args['P_SERVICE'] = V::get('P_SERVICE', '', $_GET);
  74. $db = DB::getDB();
  75. $chart = new stdClass();
  76. $chart->select = array();
  77. $chart->groupBy = array();
  78. $chart->osY = '';
  79. $chart->osY_values = array();
  80. $chart->osX = 'MONTH';
  81. $chart->osX_values = array();
  82. $chart->osX_range_min = '2013-01-00';
  83. $chart->osX_range_max = '2014-05-00';
  84. $chart->groupBy[] = 'MONTH';
  85. $chart->groupBy[] = 'id_owner';
  86. $chart->groupBy[] = 'P_SERVICE';
  87. $chart->select['cnt'] = 'count(1)';
  88. $chart->select['sum_INCOME'] = 'sum(`INCOME`)';
  89. $sql_select = array();
  90. foreach ($chart->select as $kLabel => $vField) {
  91. $sql_select[] = "{$vField} as {$kLabel}";
  92. }
  93. foreach ($chart->groupBy as $vField) {
  94. if (!array_key_exists($vField, $chart->select)) {
  95. $sql_select[] = "{$vField} as {$vField}";
  96. }
  97. }
  98. $sql_select = implode(',', $sql_select);
  99. $sql_group_by = implode(',', $chart->groupBy);
  100. $chart->data = array();
  101. $sql = "select {$sql_select}
  102. from `stats_BILLS_FVAT_POS`
  103. where `{$chart->osX}` between '{$chart->osX_range_min}' and '{$chart->osX_range_max}'
  104. group by {$sql_group_by}
  105. ";
  106. if($DBG){echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">sql (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($sql);echo'</pre>';}
  107. $res = $db->query($sql);
  108. while ($r = $db->fetch($res)) {
  109. if (empty($r->P_SERVICE)) {
  110. $r->P_SERVICE = 'Unknown';
  111. }
  112. if (isset($r->MONTH) && substr($r->MONTH, -3) == '-00') {
  113. $r->MONTH = substr($r->MONTH, 0, -3);
  114. }
  115. $r->cnt = (int)$r->cnt;
  116. $r->sum_INCOME = (double)$r->sum_INCOME;
  117. $chart->data[] = $r;
  118. foreach ($chart->groupBy as $vField) {
  119. if ($vField == $chart->osX) {
  120. $chart->osX_values[$r->{$chart->osX}] = true;
  121. }
  122. else if (!array_key_exists($vField, $chart->select)) {
  123. $chart->osY_values[$vField][$r->{$vField}] = true;
  124. }
  125. }
  126. }
  127. foreach ($chart->osY_values as $k => $v) {
  128. $chart->osY_values[$k] = array_keys($v);
  129. sort($chart->osY_values[$k]);
  130. }
  131. $chart->osX_values = array_keys($chart->osX_values);
  132. sort($chart->osX_values);
  133. if($DBG){echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">$chart->data (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($chart->data);echo'</pre>';}
  134. if($DBG){echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">$chart->osY_values (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($chart->osY_values);echo'</pre>';}
  135. ?>
  136. <canvas id="chart-canvas" width="800" height="500" style="float:left; margin:0 20px; border:1px solid #666;">[No canvas support]</canvas>
  137. <form action="" method="post" id="chart-frm">
  138. <div class="chart-frm-cnt">
  139. </div>
  140. <button id="chart-frm-btn" class="btn btn-primary">Rysuj wykres</button>
  141. </form>
  142. <script>
  143. var frm = jQuery('#chart-frm')
  144. , frmCnt = frm.find('.chart-frm-cnt')
  145. , chart_data = <?php echo json_encode($chart->data); ?>
  146. , chart_select = <?php echo json_encode($chart->select); ?>
  147. , chart_groupBy = <?php echo json_encode($chart->groupBy); ?>
  148. , chart_osX = <?php echo json_encode($chart->osX); ?>
  149. , chart_osX_values = <?php echo json_encode($chart->osX_values); ?>
  150. , chart_values = <?php echo json_encode($chart->osY_values); ?>;
  151. for (var i in chart_values) {
  152. var selWrap = jQuery('<div></div>');
  153. jQuery('<label for="' + chart_values[i][j] + '">' + i + ': </label>').appendTo(selWrap);
  154. var sel = jQuery('<select name="' + i + '"></select>').appendTo(selWrap);
  155. sel.append('<option value="' + "all" + '">' + "dowolne" + '</select>');
  156. for (var j in chart_values[i]) {
  157. sel.append('<option value="' + chart_values[i][j] + '">' + chart_values[i][j] + '</select>');
  158. }
  159. selWrap.appendTo(frmCnt);
  160. }
  161. var selWrap = jQuery('<div></div>');
  162. jQuery('<label for="chart_select">Wartość: </label>').appendTo(selWrap);
  163. var sel = jQuery('<select name="chart_select"></select>').appendTo(selWrap);
  164. for (var i in chart_select) {
  165. sel.append('<option value="' + i + '">' + i + ': ' + chart_select[i] + '</select>');
  166. }
  167. selWrap.appendTo(frmCnt);
  168. jQuery('#chart-frm-btn').on('click', function(evt){
  169. var data = []
  170. , canvas = document.getElementById('chart-canvas')
  171. , frmNode = document.getElementById('chart-frm')
  172. , fld_name = jQuery(frmNode['chart_select']).val();
  173. console.log('chart_data', chart_data);
  174. var chart_data_filtered = chart_data.filter(function (item) {
  175. for (var i in chart_groupBy) {
  176. if (chart_groupBy[i] == chart_osX) continue;
  177. var frmVal = jQuery(frmNode[chart_groupBy[i]]).val();
  178. if (frmVal == 'all') continue;
  179. if (item[chart_groupBy[i]] != frmVal) {
  180. return false;
  181. }
  182. }
  183. return true;
  184. });
  185. console.log('chart_data_filtered', chart_data_filtered);
  186. chart_data_filtered.sort(function(a, b) {
  187. if (a[chart_osX] > b[chart_osX]) {
  188. return 1;
  189. }
  190. else if (a[chart_osX] < b[chart_osX]) {
  191. return -1;
  192. }
  193. return 0;
  194. });
  195. var d = chart_data_filtered.shift();
  196. console.log('chart_data_filtered.shift', d);
  197. for (var v in chart_osX_values) {
  198. if (!d || d[chart_osX] != chart_osX_values[v]) {
  199. data.push(0);
  200. continue;
  201. }
  202. data.push(d[fld_name]);
  203. d = chart_data_filtered.shift();
  204. }
  205. RGraph.Clear(canvas);
  206. var bar = new RGraph.Bar('chart-canvas', data)
  207. .Set('labels', chart_osX_values)
  208. .Set('gutter.left', 50)
  209. .Set('hmargin', 15)
  210. .Set('strokestyle', 'white')
  211. .Set('linewidth', 1)
  212. .Set('shadow', true)
  213. .Set('shadow.color', '#ccc')
  214. .Set('shadow.offsetx', 0)
  215. .Set('shadow.offsety', 0)
  216. .Set('shadow.blur', 10)
  217. .Draw();
  218. // .Set('colors', ['Gradient(#99f:#27afe9:#058DC7:#058DC7)', 'Gradient(#94f776:#50B332:#B1E59F)', 'Gradient(#fe783e:#EC561B:#F59F7D)'])
  219. return false;
  220. });
  221. </script>
  222. <?php
  223. return;
  224. }
  225. class FvatPosCharts {
  226. function getSumIncome($month, $service = '', $params = array()) {
  227. $sumIncome = array();
  228. if (in_array($service, array('NET', 'TEL', 'TV'))) {
  229. $sumIncome['inne'] = 0;
  230. $sumIncome['abonament'] = 0;
  231. } else {
  232. $sumIncome['abonament_NET'] = 0;
  233. $sumIncome['abonament_TV'] = 0;
  234. $sumIncome['abonament_TEL'] = 0;
  235. }
  236. $db = DB::getDB();
  237. $sqlPosKey = "IF(f.`ID_OFFERS` > 0, 'abonament', 'inne')";
  238. $sqlSrv = '';
  239. if ($service == 'NET') {
  240. $sqlSrv = "and f.`NAME_LIST_SERVICES` in('USERS2','EMAIL')";
  241. } else if ($service == 'TEL') {
  242. $sqlSrv = "and f.`NAME_LIST_SERVICES`='VOIP'";
  243. } else if ($service == 'TV') {
  244. $sqlSrv = "and f.`NAME_LIST_SERVICES`='TV'";
  245. } else {
  246. $sqlPosKey = "IF(f.`ID_OFFERS` > 0
  247. , IF(f.`NAME_LIST_SERVICES` in('USERS2','EMAIL')
  248. , 'abonament_NET'
  249. , IF (f.`NAME_LIST_SERVICES`='VOIP'
  250. , 'abonament_TEL'
  251. , IF (f.`NAME_LIST_SERVICES`='TV'
  252. , 'abonament_TV'
  253. , 'abonament'
  254. )
  255. )
  256. )
  257. , 'inne')
  258. ";
  259. $sqlPosKey = "IF(f.`NAME_LIST_SERVICES` in('USERS2','EMAIL')
  260. , 'abonament_NET'
  261. , IF (f.`NAME_LIST_SERVICES`='VOIP'
  262. , 'abonament_TEL'
  263. , IF (f.`NAME_LIST_SERVICES`='TV'
  264. , 'abonament_TV'
  265. , 'abonament'
  266. )
  267. )
  268. )
  269. ";
  270. }
  271. $sql = "select sum(f.`INCOME`) as sum_INCOME
  272. , {$sqlPosKey} as posKey
  273. from `stats_BILLS_FVAT_POS` as f
  274. where f.`ID_DEALS_TABLE`>0
  275. and f.`MONTH`='{$month}'
  276. {$sqlSrv}
  277. group by posKey
  278. ";
  279. if(V::get('DBG', '', $_GET)){echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">sql (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($sql);echo'</pre>';}
  280. $res = $db->query($sql);
  281. while ($r = $db->fetch($res)) {
  282. $sumIncome[$r->posKey] = (double)$r->sum_INCOME;
  283. }
  284. if(V::get('DBG', '', $_GET)){echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">sumIncome (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($sumIncome);echo'</pre>';}
  285. return $sumIncome;
  286. }
  287. function getSumZysk($month, $service = '', $params = array()) {
  288. $sumZysk = array();
  289. if (in_array($service, array('NET', 'TEL', 'TV'))) {
  290. $sumZysk['inne'] = 0;
  291. $sumZysk['abonament'] = 0;
  292. } else {
  293. $sumZysk['abonament_NET'] = 0;
  294. $sumZysk['abonament_TV'] = 0;
  295. $sumZysk['abonament_TEL'] = 0;
  296. }
  297. $db = DB::getDB();
  298. $sqlPosKey = "IF(f.`ID_OFFERS` > 0, 'abonament', 'inne')";
  299. $sqlSrv = '';
  300. if ($service == 'NET') {
  301. $sqlSrv = "and f.`NAME_LIST_SERVICES` in('USERS2','EMAIL')";
  302. } else if ($service == 'TEL') {
  303. $sqlSrv = "and f.`NAME_LIST_SERVICES`='VOIP'";
  304. } else if ($service == 'TV') {
  305. $sqlSrv = "and f.`NAME_LIST_SERVICES`='TV'";
  306. } else {
  307. $sqlPosKey = "IF(f.`ID_OFFERS` > 0
  308. , IF(f.`NAME_LIST_SERVICES` in('USERS2','EMAIL')
  309. , 'abonament_NET'
  310. , IF (f.`NAME_LIST_SERVICES`='VOIP'
  311. , 'abonament_TEL'
  312. , IF (f.`NAME_LIST_SERVICES`='TV'
  313. , 'abonament_TV'
  314. , 'abonament'
  315. )
  316. )
  317. )
  318. , 'inne')
  319. ";
  320. $sqlPosKey = "IF(f.`NAME_LIST_SERVICES` in('USERS2','EMAIL')
  321. , 'abonament_NET'
  322. , IF (f.`NAME_LIST_SERVICES`='VOIP'
  323. , 'abonament_TEL'
  324. , IF (f.`NAME_LIST_SERVICES`='TV'
  325. , 'abonament_TV'
  326. , 'abonament'
  327. )
  328. )
  329. )
  330. ";
  331. }
  332. $sql = "select sum(f.`P_OFFER_ZYSK`) as sum_ZYSK
  333. , {$sqlPosKey} as posKey
  334. from `stats_BILLS_FVAT_POS` as f
  335. where f.`ID_DEALS_TABLE`>0
  336. and f.`MONTH`='{$month}'
  337. {$sqlSrv}
  338. group by posKey
  339. ";
  340. if(V::get('DBG', '', $_GET)){echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">sql (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($sql);echo'</pre>';}
  341. $res = $db->query($sql);
  342. while ($r = $db->fetch($res)) {
  343. $sumZysk[$r->posKey] = (double)$r->sum_ZYSK;
  344. }
  345. if(V::get('DBG', '', $_GET)){echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">sumZysk (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($sumZysk);echo'</pre>';}
  346. return $sumZysk;
  347. }
  348. }