superedit-RECOUNT_STATS_BILLS_FVAT_POS.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  1. <?php
  2. function RECOUNT_STATS_BILLS_FVAT_POS() {
  3. $db = DB::getDB();
  4. if (!$db) {
  5. echo '<div class="alert alert-danger">' . "Database Error" . '</div>';
  6. return;
  7. }
  8. $sqlList = array();
  9. ?>
  10. <div class="jumbotron">
  11. <div class="container">
  12. <form class="form-inline" method="POST">
  13. <input type="hidden" name="task" value="update_year" />
  14. <label for="update_year">Aktualizuj dane dla roku:</label>
  15. <div class="input-group date" id="fldUpdateYear">
  16. <input type="text" name="update_year" class="form-control" value="" />
  17. <span class="input-group-addon"><span class="glyphicon glyphicon-time"></span></span>
  18. </div>
  19. <button type="submit" id="fldUpdateYearBtn" class="btn btn-primary" autocomplete="off">
  20. Aktualizuj
  21. </button>
  22. </form>
  23. <!--
  24. <div class="pull-right">
  25. <form class="form-inline" method="POST">
  26. <input type="hidden" name="task" value="rebuild_table" />
  27. <input type="hidden" name="rebuild_table" value="1" />
  28. <input type="submit" class="btn btn-default" value="Odbuduj tabelę" />
  29. </form>
  30. </div>
  31. -->
  32. </div>
  33. </div>
  34. <script type="text/javascript">
  35. jQuery(document).ready(function () {
  36. jQuery('#fldUpdateYearBtn').on('click', function () {
  37. jQuery(this).text(jQuery(this).text() + '...').attr('disabled', 'disabled');
  38. jQuery(this).parent().submit();
  39. })
  40. jQuery("#fldUpdateYear").datetimepicker({
  41. format: "YYYY",
  42. defaultDate: new Date(<?php echo date("Y"); ?>, 0, 1),
  43. minDate: new Date(2014, 0, 1),
  44. // maxDate: "<?php echo date("Y"); ?>"
  45. });
  46. });
  47. </script>
  48. <?php
  49. $task = V::get('task', '', $_REQUEST);
  50. if ('update_year' == $task || 'rebuild_table' == $task) {
  51. $args = array();
  52. $args['rebuild_table'] = ('1' != V::get('rebuild_table', '', $_REQUEST));
  53. $args['update_year'] = V::get('update_year', '', $_REQUEST, 'int');
  54. $sql_date_filter = date('Y');
  55. if (!$args['rebuild_table']) {
  56. $sqlList[] = "DROP TABLE `stats_BILLS_FVAT_POS`; ";
  57. $sqlList[] = "CREATE TABLE IF NOT EXISTS `stats_BILLS_FVAT_POS` (
  58. `ID` int(11) NOT NULL,
  59. `ID_BILLING_USERS` int(11) NOT NULL,
  60. `A_ADM_COMPANY` varchar(64) NOT NULL DEFAULT '',
  61. `id_owner` int(11) NOT NULL,
  62. `MONTH` date NOT NULL,
  63. `ID_SERVICES` int(11) NOT NULL DEFAULT '0',
  64. `ID_DEALS_TABLE` int(11) NOT NULL DEFAULT '0',
  65. `INCOME` decimal(10,2) NOT NULL DEFAULT '0.00',
  66. `P_OFFER_COSTS` decimal(10,2) NOT NULL DEFAULT '0.00',
  67. `P_OFFER_ZYSK` decimal(10,2) NOT NULL DEFAULT '0.00',
  68. `ID_OFFERS` int(11) NOT NULL DEFAULT '0',
  69. `S_ADDRESS_STREET` varchar(32) NOT NULL DEFAULT '',
  70. `T_TELBOX_BUILDING_IN` varchar(16) NOT NULL DEFAULT '',
  71. `P_OSIEDLE` varchar(64) NOT NULL DEFAULT '',
  72. `M_REWIR` varchar(255) NOT NULL DEFAULT '',
  73. `NAME_LIST_SERVICES` varchar(16) NOT NULL DEFAULT '',
  74. `P_SERVICE` varchar(16) NOT NULL DEFAULT '',
  75. `P_NET_SPEED` varchar(16) NOT NULL DEFAULT '',
  76. `P_NET_GROUP` varchar(32) NOT NULL DEFAULT '',
  77. `P_TV_NAME` varchar(64) NOT NULL DEFAULT '',
  78. `P_TEL_NAME` varchar(64) NOT NULL DEFAULT '',
  79. `FVAT_POS_DESCR` varchar(64) NOT NULL DEFAULT '',
  80. KEY `MONTH` (`MONTH`)
  81. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  82. ";
  83. $sqlList[] = "TRUNCATE TABLE `stats_BILLS_FVAT_POS`; ";
  84. }
  85. if ($args['update_year']) {
  86. $sql_date_filter = $args['update_year'];
  87. $sqlList[] = "delete from `stats_BILLS_FVAT_POS` where `MONTH` like '{$sql_date_filter}-%' ; ";
  88. }
  89. // -- DATE_FORMAT(f.`DATE_FROM`,'%Y-%m-00')
  90. // -- (f.`DATE_FROM` like '{$sql_date_filter}-%')
  91. $sqlList[] = "insert into `SES_USERS2`.`stats_BILLS_FVAT_POS`
  92. (`ID`, `ID_SERVICES`, `MONTH`, `INCOME`, `ID_OFFERS`
  93. , `ID_BILLING_USERS`, `id_owner`
  94. , `FVAT_POS_DESCR`
  95. )
  96. select f.`ID`, f.`ID_SERVICES`, DATE_FORMAT(fv.`BILL_DATE`,'%Y-%m-00'), f.`PRICE` * f.`AMMOUNT`, f.`ID_OFFERS`
  97. , fv.`ID_BILLING_USERS`, fv.`id_owner`
  98. , f.`DESCR`
  99. from `billing2013`.`BILLS_FVAT_POS` as f, `billing2013`.`BILLS_FVAT` as fv
  100. where
  101. (fv.`BILL_DATE` like '{$sql_date_filter}-%')
  102. and f.`ID_BILLS_FVAT`=fv.`ID`
  103. ";
  104. $sqlList[] = "update `stats_BILLS_FVAT_POS` as f
  105. join `SERVICES` as s on(s.`ID`=f.`ID_SERVICES` and f.`ID_SERVICES`>0)
  106. set
  107. f.`S_ADDRESS_STREET`=s.`S_ADDRESS_STREET`
  108. , f.`NAME_LIST_SERVICES`=s.`NAME_LIST_SERVICES`
  109. , f.`ID_DEALS_TABLE`=s.`ID_DEALS_TABLE`
  110. , f.`ID_OFFERS`=s.`ID_OFFERS`
  111. ";
  112. $sqlList[] = "update `stats_BILLS_FVAT_POS` as f
  113. join `DEALS_TABLE` as d on(d.`ID`=f.`ID_DEALS_TABLE` and f.`S_ADDRESS_STREET`='')
  114. set
  115. f.`S_ADDRESS_STREET`=d.`S_ADDRESS_STREET`
  116. ";
  117. $sqlList[] = "update `stats_BILLS_FVAT_POS` f
  118. join `USERS2_MARKETING` m on(m.`S_ADDRESS_STREET`=f.`S_ADDRESS_STREET`)
  119. join `BUILDINGS` b on(b.`S_ADDRESS_STREET`=m.`T_TELBOX_BUILDING_IN`)
  120. set
  121. f.`T_TELBOX_BUILDING_IN`=m.`T_TELBOX_BUILDING_IN`
  122. , f.`M_REWIR`=b.`M_REWIR`
  123. , f.`P_OSIEDLE`=IF(b.`P_OSIEDLE`!=''
  124. , CONCAT(b.`S_ADDRESS_CITY`, ' - ', b.`P_OSIEDLE`)
  125. , b.`S_ADDRESS_CITY`
  126. )
  127. where f.`S_ADDRESS_STREET`!=''
  128. ";
  129. $sqlList[] = "update `stats_BILLS_FVAT_POS` f
  130. join `USERS2_OFFERS` o on(o.`ID`=f.`ID_OFFERS`)
  131. left join `USERS2_OFFERS_COSTS_GROUPS` c on(c.`ID`=o.`ID_COSTS_GROUPS`)
  132. set
  133. f.`P_SERVICE`=IF(o.`P_SERVICE`='OPCJE'
  134. , concat(o.`P_SERVICE`, '_', o.`P_SERVICE_PARENT`)
  135. , o.`P_SERVICE`
  136. )
  137. , f.`P_NET_SPEED`=IF(o.`P_SERVICE` in('NET')
  138. , o.`P_S_PARAM1`
  139. , '')
  140. , f.`P_TV_NAME`=IF(o.`P_SERVICE` in('TV','TVC','TVCP','OPCJA_TVC') or (o.`P_SERVICE`='OPCJE' and o.`P_SERVICE_PARENT` in('TVC','TVCP','TV'))
  141. , o.`P_SERVICE_NAME`
  142. , '')
  143. , f.`P_TEL_NAME`=IF(o.`P_SERVICE` in('TEL','OPCJA_TEL')
  144. , o.`P_SERVICE_NAME`
  145. , '')
  146. , f.`P_OFFER_COSTS`=c.`P_OFFER_COSTS`
  147. where f.`ID_OFFERS`>0
  148. ";
  149. $sqlList[] = "update `stats_BILLS_FVAT_POS` f
  150. join `USERS2_OFFERS` o on(o.`ID`=f.`ID_OFFERS`)
  151. join `USERS2_PRODUKT` p on(p.`ID`=o.`ID_PRODUKT`)
  152. set
  153. f.`P_NET_GROUP`=p.`P_NAME`
  154. where f.`ID_OFFERS`>0
  155. and o.`ID_PRODUKT`>0
  156. and o.`P_SERVICE`='NET'
  157. ";
  158. $sqlList[] = "update `stats_BILLS_FVAT_POS` as f
  159. set
  160. f.`P_OFFER_ZYSK`=(f.`INCOME` - f.`P_OFFER_COSTS`)
  161. ";
  162. $sqlList[] = "update `stats_BILLS_FVAT_POS` as f
  163. join `COMPANIES` as c on(c.`ID`=f.`ID_BILLING_USERS`)
  164. set
  165. f.`A_ADM_COMPANY`=c.`A_ADM_COMPANY`
  166. ";
  167. }
  168. else if ('FVAT_POS_CHARTS' == $task) {
  169. $DBG = V::get('DBG', '', $_REQUEST);
  170. $args = array();
  171. $args['MONTH'] = V::get('MONTH', '', $_REQUEST);
  172. $args['id_owner'] = V::get('id_owner', '', $_REQUEST);
  173. $args['P_SERVICE'] = V::get('P_SERVICE', '', $_REQUEST);
  174. $db = DB::getDB();
  175. $chart = new stdClass();
  176. $chart->select = array();
  177. $chart->groupBy = array();
  178. $chart->osY = '';
  179. $chart->osY_values = array();
  180. $chart->osX = 'MONTH';
  181. $chart->osX_values = array();
  182. $chart->osX_range_min = '2013-01-00';
  183. $chart->osX_range_max = '2014-05-00';
  184. $chart->groupBy[] = 'MONTH';
  185. $chart->groupBy[] = 'id_owner';
  186. $chart->groupBy[] = 'P_SERVICE';
  187. $chart->select['cnt'] = 'count(1)';
  188. $chart->select['sum_INCOME'] = 'sum(`INCOME`)';
  189. $sql_select = array();
  190. foreach ($chart->select as $kLabel => $vField) {
  191. $sql_select[] = "{$vField} as {$kLabel}";
  192. }
  193. foreach ($chart->groupBy as $vField) {
  194. if (!array_key_exists($vField, $chart->select)) {
  195. $sql_select[] = "{$vField} as {$vField}";
  196. }
  197. }
  198. $sql_select = implode(',', $sql_select);
  199. $sql_group_by = implode(',', $chart->groupBy);
  200. $chart->data = array();
  201. $sql = "select {$sql_select}
  202. from `stats_BILLS_FVAT_POS`
  203. where `{$chart->osX}` between '{$chart->osX_range_min}' and '{$chart->osX_range_max}'
  204. group by {$sql_group_by}
  205. ";
  206. 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>';}
  207. $res = $db->query($sql);
  208. while ($r = $db->fetch($res)) {
  209. if (empty($r->P_SERVICE)) {
  210. $r->P_SERVICE = 'Unknown';
  211. }
  212. if (isset($r->MONTH) && substr($r->MONTH, -3) == '-00') {
  213. $r->MONTH = substr($r->MONTH, 0, -3);
  214. }
  215. $r->cnt = (int)$r->cnt;
  216. $r->sum_INCOME = (double)$r->sum_INCOME;
  217. $chart->data[] = $r;
  218. foreach ($chart->groupBy as $vField) {
  219. if ($vField == $chart->osX) {
  220. $chart->osX_values[$r->{$chart->osX}] = true;
  221. }
  222. else if (!array_key_exists($vField, $chart->select)) {
  223. $chart->osY_values[$vField][$r->{$vField}] = true;
  224. }
  225. }
  226. }
  227. foreach ($chart->osY_values as $k => $v) {
  228. $chart->osY_values[$k] = array_keys($v);
  229. sort($chart->osY_values[$k]);
  230. }
  231. $chart->osX_values = array_keys($chart->osX_values);
  232. sort($chart->osX_values);
  233. 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>';}
  234. 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>';}
  235. ?>
  236. <script src="stuff/RGraph/libraries/RGraph.common.core.js"></script>
  237. <script src="stuff/RGraph/libraries/RGraph.common.dynamic.js"></script>
  238. <script src="stuff/RGraph/libraries/RGraph.common.key.js"></script>
  239. <script src="stuff/RGraph/libraries/RGraph.drawing.rect.js"></script>
  240. <script src="stuff/RGraph/libraries/RGraph.bar.js"></script>
  241. <script src="stuff/RGraph/libraries/RGraph.line.js"></script>
  242. <canvas id="chart-canvas" width="800" height="500" style="float:left; margin:0 20px; border:1px solid #666;">[No canvas support]</canvas>
  243. <form action="" method="post" id="chart-frm">
  244. <div class="chart-frm-cnt">
  245. </div>
  246. <button id="chart-frm-btn" class="btn btn-primary">Rysuj wykres</button>
  247. </form>
  248. <script>
  249. var frm = jQuery('#chart-frm')
  250. , frmCnt = frm.find('.chart-frm-cnt')
  251. , chart_data = <?php echo json_encode($chart->data); ?>
  252. , chart_select = <?php echo json_encode($chart->select); ?>
  253. , chart_groupBy = <?php echo json_encode($chart->groupBy); ?>
  254. , chart_osX = <?php echo json_encode($chart->osX); ?>
  255. , chart_osX_values = <?php echo json_encode($chart->osX_values); ?>
  256. , chart_values = <?php echo json_encode($chart->osY_values); ?>;
  257. for (var i in chart_values) {
  258. var selWrap = jQuery('<div></div>');
  259. jQuery('<label for="' + chart_values[i][j] + '">' + i + ': </label>').appendTo(selWrap);
  260. var sel = jQuery('<select name="' + i + '"></select>').appendTo(selWrap);
  261. sel.append('<option value="' + "all" + '">' + "dowolne" + '</select>');
  262. for (var j in chart_values[i]) {
  263. sel.append('<option value="' + chart_values[i][j] + '">' + chart_values[i][j] + '</select>');
  264. }
  265. selWrap.appendTo(frmCnt);
  266. }
  267. var selWrap = jQuery('<div></div>');
  268. jQuery('<label for="chart_select">Wartość: </label>').appendTo(selWrap);
  269. var sel = jQuery('<select name="chart_select"></select>').appendTo(selWrap);
  270. for (var i in chart_select) {
  271. sel.append('<option value="' + i + '">' + i + ': ' + chart_select[i] + '</select>');
  272. }
  273. selWrap.appendTo(frmCnt);
  274. jQuery('#chart-frm-btn').on('click', function(evt){
  275. var data = []
  276. , canvas = document.getElementById('chart-canvas')
  277. , frmNode = document.getElementById('chart-frm')
  278. , fld_name = jQuery(frmNode['chart_select']).val();
  279. console.log('chart_data', chart_data);
  280. var chart_data_filtered = chart_data.filter(function (item) {
  281. for (var i in chart_groupBy) {
  282. if (chart_groupBy[i] == chart_osX) continue;
  283. var frmVal = jQuery(frmNode[chart_groupBy[i]]).val();
  284. if (frmVal == 'all') continue;
  285. if (item[chart_groupBy[i]] != frmVal) {
  286. return false;
  287. }
  288. }
  289. return true;
  290. });
  291. console.log('chart_data_filtered', chart_data_filtered);
  292. chart_data_filtered.sort(function(a, b) {
  293. if (a[chart_osX] > b[chart_osX]) {
  294. return 1;
  295. }
  296. else if (a[chart_osX] < b[chart_osX]) {
  297. return -1;
  298. }
  299. return 0;
  300. });
  301. var d = chart_data_filtered.shift();
  302. console.log('chart_data_filtered.shift', d);
  303. for (var v in chart_osX_values) {
  304. if (!d || d[chart_osX] != chart_osX_values[v]) {
  305. data.push(0);
  306. continue;
  307. }
  308. data.push(d[fld_name]);
  309. d = chart_data_filtered.shift();
  310. }
  311. RGraph.Clear(canvas);
  312. var bar = new RGraph.Bar('chart-canvas', data)
  313. .Set('labels', chart_osX_values)
  314. .Set('gutter.left', 50)
  315. .Set('hmargin', 15)
  316. .Set('strokestyle', 'white')
  317. .Set('linewidth', 1)
  318. .Set('shadow', true)
  319. .Set('shadow.color', '#ccc')
  320. .Set('shadow.offsetx', 0)
  321. .Set('shadow.offsety', 0)
  322. .Set('shadow.blur', 10)
  323. .Draw();
  324. // .Set('colors', ['Gradient(#99f:#27afe9:#058DC7:#058DC7)', 'Gradient(#94f776:#50B332:#B1E59F)', 'Gradient(#fe783e:#EC561B:#F59F7D)'])
  325. return false;
  326. });
  327. </script>
  328. <?php
  329. return;
  330. }
  331. else {
  332. }
  333. if (empty($sqlList)) {
  334. return;
  335. }
  336. $errors = false;
  337. foreach ($sqlList as $sql) {
  338. if(V::get('DBG','',$_GET)){echo'<pre style="max-height:200px;overflow:auto;border:1px solid green;text-align:left;">sql (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($sql);echo'</pre>';}
  339. $res = $db->query($sql);
  340. if ($db->has_errors()) {
  341. $errors = true;
  342. if(V::get('DBG','',$_GET)){echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;"> (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($db->get_errors());echo'</pre>';}
  343. }
  344. }
  345. if ($errors) {
  346. echo '<div class="alert alert-danger">' . "Uwaga wystąpiły błędy - w czerwonej ramce" . '</div>';
  347. } else {
  348. echo '<div class="alert alert-success">' . "Operacje zakończone pomyślnie" . '</div>';
  349. }
  350. }