UserContact.php 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756
  1. <?php
  2. Lib::loadClass('RouteBase');
  3. Lib::loadClass('Windykacja_View');
  4. // Tool for Windykacja status table to store contacts with clients
  5. class Route_UrlAction_UserContact extends RouteBase {
  6. function defaultAction() { UI::layout([ $this, 'defaultView' ]); }
  7. function defaultView() {
  8. $idUser = V::get('id_user', 0, $_GET, 'int');
  9. if ($idUser <= 0) throw new Exception("Missing id client");
  10. echo UI::h('h3', [ 'style' => "margin-bottom: 24px; border-bottom: 1px solid #eee" ], "Dodaj notatkę ze spotkania z klientem {$idUser}");
  11. Windykacja_View::viewUserInfo($idUser);
  12. $postTask = V::get('_postTask', '', $_POST);
  13. switch ($postTask) {
  14. case 'saveConcat': $this->saveContactPostTask($idUser); break;
  15. case '': break;
  16. default: throw new Exception("Not implemented postTask '{$postTask}'");
  17. }
  18. $this->viewSaveContactForm($idUser);
  19. echo UI::h('hr');
  20. $this->viewUserPaymentContactsHistory($idUser);
  21. }
  22. function viewSaveContactForm($idUser) {
  23. $windykInfo = Windykacja_View::getWindykacjaInfo($idUser);
  24. $windykStatusInfo = ($windykInfo) ? $windykInfo['A_STATUS_INFO'] : '';
  25. $windykReminder = ($windykInfo && (
  26. !empty($windykInfo['L_APPOITMENT_USER'])
  27. || ( !empty($windykInfo['L_APPOITMENT_DATE']) && '0000-00-00' != $windykInfo['L_APPOITMENT_DATE'] )
  28. || !empty($windykInfo['L_APPOITMENT_INFO'])
  29. )) ? [
  30. 'Pracownik' => $windykInfo['L_APPOITMENT_USER'],
  31. 'Data przypomnienia' => $windykInfo['L_APPOITMENT_DATE'],
  32. 'Adnotacje' => $windykInfo['L_APPOITMENT_INFO'],
  33. ] : null;
  34. $args = [];
  35. $args['L_APPOITMENT_USER'] = V::get('L_APPOITMENT_USER', User::getLogin(), $_POST);
  36. $args['L_APPOITMENT_DATE'] = V::get('L_APPOITMENT_DATE', date("Y-m-d H:i"), $_POST);
  37. $args['L_APPOITMENT_TYPE'] = V::get('L_APPOITMENT_TYPE', '', $_POST);
  38. $args['L_APPOITMENT_INFO'] = V::get('L_APPOITMENT_INFO', '', $_POST);
  39. $args['change_windykacja_status'] = V::get('change_windykacja_status', '', $_POST);
  40. $args['A_STATUS_INFO'] = V::get('A_STATUS_INFO', $windykStatusInfo, $_POST);
  41. $args['add_reminder'] = V::get('add_reminder', '', $_POST);
  42. $args['REMINDER_USER'] = V::get('REMINDER_USER', User::getLogin(), $_POST);
  43. $args['REMINDER_DATE'] = V::get('REMINDER_DATE', '', $_POST);
  44. $args['REMINDER_INFO'] = V::get('REMINDER_INFO', '', $_POST);
  45. echo UI::h('form', [ 'method' => "POST" ], [
  46. UI::h('input', [ 'type' => "hidden", 'name' => '_postTask', 'value' => "saveConcat" ]),
  47. UI::h('input', [ 'type' => "hidden", 'name' => 'id_user', 'value' => $idUser ]),
  48. UI::h('div', [ 'class' => "row", 'style' => "padding-bottom: 12px" ], [
  49. UI::h('div', [ 'class' => "col-md-6" ], [
  50. UI::h('label', [], "Pracownik"),
  51. UI::h('input', [ 'class' => "form-control", 'type' => "text", 'name' => 'L_APPOITMENT_USER', 'value' => $args['L_APPOITMENT_USER'] ]),
  52. ]),
  53. UI::h('div', [ 'class' => "col-md-3" ], [
  54. UI::h('label', [], "Data spotkania"),
  55. UI::h('div', [ 'class' => "input-group" ], [
  56. UI::h('input', [ 'class' => "form-control se_type-datetime", 'data-format' => "yyyy-MM-dd hh:mm", 'type' => "text", 'name' => 'L_APPOITMENT_DATE', 'value' => $args['L_APPOITMENT_DATE'] ]),
  57. UI::h('span', [ 'class' => "input-group-addon" ], [
  58. UI::h('span', [ 'class' => "glyphicon glyphicon-calendar" ]),
  59. ]),
  60. ]),
  61. ]),
  62. UI::h('div', [ 'class' => "col-md-3" ], [
  63. UI::h('label', [], "Rodzaj spotkania"),
  64. UI::h('select', [ 'class' => "form-control", 'name' => 'L_APPOITMENT_TYPE', 'onChange' => "p5_addUserNote_handleChangeType(this)" ], [
  65. UI::h('option', [ 'value' => "" ]),
  66. UI::h('option', array_merge([ 'value' => 'LIVE' ], ('LIVE' === $args['L_APPOITMENT_TYPE']) ? [ 'selected' => "selected" ] : []), "LIVE"),
  67. UI::h('option', array_merge([ 'value' => 'TEL' ], ('TEL' === $args['L_APPOITMENT_TYPE']) ? [ 'selected' => "selected" ] : []), "TEL"),
  68. UI::h('option', array_merge([ 'value' => 'TEL_NIE_ODBIERA' ], ('TEL_NIE_ODBIERA' === $args['L_APPOITMENT_TYPE']) ? [ 'selected' => "selected" ] : []), "TEL_NIE_ODBIERA"),
  69. UI::h('option', array_merge([ 'value' => 'MAIL' ], ('MAIL' === $args['L_APPOITMENT_TYPE']) ? [ 'selected' => "selected" ] : []), "MAIL"),
  70. UI::h('option', array_merge([ 'value' => 'SMS' ], ('SMS' === $args['L_APPOITMENT_TYPE']) ? [ 'selected' => "selected" ] : []), "SMS"),
  71. UI::h('option', array_merge([ 'value' => 'INNE' ], ('INNE' === $args['L_APPOITMENT_TYPE']) ? [ 'selected' => "selected" ] : []), "INNE"),
  72. ]),
  73. ]),
  74. ]),
  75. UI::h('div', [ 'class' => "row", 'style' => "padding-bottom: 12px" ], [
  76. UI::h('div', [ 'class' => "col-md-12" ], [
  77. UI::h('label', [], "Notatka ze spotkania"),
  78. UI::h('textarea', array_merge(
  79. [ 'class' => "form-control", 'type' => "text", 'name' => 'L_APPOITMENT_INFO', 'rows' => 3],
  80. ('TEL_NIE_ODBIERA' === $args['L_APPOITMENT_TYPE']) ? [ 'disabled' => 'disabled' ] : []
  81. ), $args['L_APPOITMENT_INFO']),
  82. ]),
  83. ]),
  84. UI::h('div', [ 'class' => "row", 'style' => "padding-bottom: 12px" ], [
  85. UI::h('div', [ 'class' => "col-md-12", 'style' => "border:1px solid #eee" ], [
  86. UI::h('div', [ 'class' => "checkbox" ], [
  87. UI::h('label', [ 'style' => "font-size:14px; line-height:22px" ], [
  88. UI::h('input', array_merge([
  89. 'type' => "checkbox",
  90. 'name' => "change_windykacja_status",
  91. 'onClick' => "document.getElementById('fld__change_windykacja_status').style.display = event.target.checked ? 'block' : 'none'",
  92. ], ($args['change_windykacja_status']) ? [ 'checked' => "checked" ] : [])),
  93. " Zmień status windykacji (ustalenia z klientem)",
  94. ]),
  95. ]),
  96. UI::h('div', [
  97. 'id' => "fld__change_windykacja_status",
  98. 'style' => "display:" . ($args['change_windykacja_status'] ? 'block' : 'none') . "; padding-bottom:12px",
  99. ], [
  100. // UI::h('label', [], "Status windykacji:"),
  101. UI::h('p', [], [
  102. "Obecny status: ",
  103. ($windykStatusInfo) ? $windykStatusInfo : "<em>brak</em>",
  104. ]),
  105. UI::h('input', [ 'class' => "form-control", 'type' => "text", 'name' => 'A_STATUS_INFO', 'value' => $args['A_STATUS_INFO'] ]),
  106. ]),
  107. ]),
  108. ]),
  109. UI::h('div', [ 'class' => "row", 'style' => "padding-bottom: 12px" ], [
  110. UI::h('div', [ 'class' => "col-md-12", 'style' => "border:1px solid #eee" ], [
  111. UI::h('div', [ 'class' => "checkbox" ], [
  112. UI::h('label', [ 'style' => "font-size:14px; line-height:22px" ], [
  113. UI::h('input', array_merge([
  114. 'type' => "checkbox",
  115. 'name' => "add_reminder",
  116. 'onClick' => "document.getElementById('fld__add_reminder').style.display = event.target.checked ? 'block' : 'none'",
  117. ], ($args['add_reminder']) ? [ 'checked' => "checked" ] : [])),
  118. " Przypomnienie",
  119. ]),
  120. ]),
  121. UI::h('div', [
  122. 'id' => "fld__add_reminder",
  123. 'style' => "display:" . ($args['add_reminder'] ? 'block' : 'none') . "; padding-bottom:4px",
  124. ], [
  125. ($windykReminder) ? UI::h('div', [ 'style' => "border-left: 5px solid orange; padding:6px 12px; margin-bottom:12px" ], [
  126. UI::h('p', [], "Obecne przypomnienie (Uwaga: zostanie nadpisane)"),
  127. UI::hTable([ 'rows' => [ $windykReminder ], 'disable_lp' => true, 'style' => "margin-bottom:0" ]),
  128. ]) : '',
  129. UI::h('div', [ 'class' => "row", 'style' => "padding-bottom: 12px" ], [
  130. UI::h('div', [ 'class' => "col-md-6" ], [
  131. UI::h('label', [], "Pracownik"),
  132. UI::h('input', [ 'class' => "form-control", 'type' => "text", 'name' => 'REMINDER_USER', 'value' => $args['REMINDER_USER'] ]),
  133. ]),
  134. UI::h('div', [ 'class' => "col-md-3" ], [
  135. UI::h('label', [], "Data przypomnienia"),
  136. UI::h('div', [ 'class' => "input-group" ], [
  137. UI::h('input', [ 'class' => "form-control se_type-datetime", 'data-format' => "yyyy-MM-dd hh:mm", 'type' => "text", 'name' => 'REMINDER_DATE', 'value' => $args['REMINDER_DATE'] ]),
  138. UI::h('span', [ 'class' => "input-group-addon" ], [
  139. UI::h('span', [ 'class' => "glyphicon glyphicon-calendar" ]),
  140. ]),
  141. ]),
  142. ]),
  143. ]),
  144. UI::h('div', [ 'class' => "row", 'style' => "padding-bottom: 12px" ], [
  145. UI::h('div', [ 'class' => "col-md-9" ], [
  146. UI::h('label', [], "Adnotacje"),
  147. UI::h('textarea', [ 'class' => "form-control", 'type' => "text", 'name' => 'REMINDER_INFO' ], $args['REMINDER_INFO']),
  148. ]),
  149. ]),
  150. ]),
  151. ]),
  152. ]),
  153. // <div class="form-group">
  154. // <div class="col-sm-offset-2 col-sm-10">
  155. // <div class="checkbox">
  156. // <label>
  157. // <input type="checkbox"> Remember me
  158. // </label>
  159. // </div>
  160. // </div>
  161. // </div>
  162. UI::h('div', [ 'class' => "row", 'style' => "padding-bottom: 12px" ], [
  163. UI::h('div', [ 'class' => "col-md-12" ], [
  164. UI::h('button', [ 'class' => "btn btn-primary" ], "Zapisz notatkę"),
  165. ]),
  166. ]),
  167. ]);
  168. echo UI::h('script', [], "
  169. var DBG1 = true;
  170. var DBG = false;
  171. function p5_addUserNote_handleChangeType(n) {
  172. DBG && console.log('DBG:p5_addUserNote_handleChangeType', { value: n.value, desc: n.form['L_APPOITMENT_INFO'] , n, form: n.form });
  173. if ('TEL_NIE_ODBIERA' === n.value) {
  174. n.form['L_APPOITMENT_INFO'].disabled = true
  175. } else {
  176. n.form['L_APPOITMENT_INFO'].disabled = false
  177. }
  178. }
  179. ");
  180. }
  181. function saveContactPostTask($idUser) {
  182. $args = [];
  183. $args['L_APPOITMENT_USER'] = V::get('L_APPOITMENT_USER', '', $_POST);
  184. $args['L_APPOITMENT_DATE'] = V::get('L_APPOITMENT_DATE', '', $_POST);
  185. $args['L_APPOITMENT_TYPE'] = V::get('L_APPOITMENT_TYPE', '', $_POST);
  186. $args['L_APPOITMENT_INFO'] = V::get('L_APPOITMENT_INFO', '', $_POST);
  187. $args['change_windykacja_status'] = V::get('change_windykacja_status', '', $_POST);
  188. $args['A_STATUS_INFO'] = V::get('A_STATUS_INFO', '', $_POST);
  189. $args['add_reminder'] = V::get('add_reminder', '', $_POST);
  190. $args['REMINDER_USER'] = V::get('REMINDER_USER', '', $_POST);
  191. $args['REMINDER_DATE'] = V::get('REMINDER_DATE', '', $_POST);
  192. $args['REMINDER_INFO'] = V::get('REMINDER_INFO', '', $_POST);
  193. try {
  194. if (empty($args['L_APPOITMENT_USER'])) throw new Exception("Brak pracownika");
  195. if (empty($args['L_APPOITMENT_DATE'])) throw new Exception("Brak daty spotkania");
  196. if (empty($args['L_APPOITMENT_TYPE'])) throw new Exception("Brak rodzaju spotkania");
  197. if (empty($args['L_APPOITMENT_INFO']) && 'TEL_NIE_ODBIERA' !== $args['L_APPOITMENT_TYPE']) throw new Exception("Brak treści notatki");
  198. if ($args['change_windykacja_status']) {
  199. if (empty($args['A_STATUS_INFO'])) throw new Exception("Brak statusu windykacji");
  200. }
  201. if ($args['add_reminder']) {
  202. if (empty($args['REMINDER_USER'])) throw new Exception("Brak pracownika w przypomnieniu");
  203. if (empty($args['REMINDER_DATE'])) throw new Exception("Brak daty przypomnienia");
  204. if (empty($args['REMINDER_INFO'])) throw new Exception("Brak adnotacji przypomnienia");
  205. }
  206. $windykInfo = Windykacja_View::getWindykacjaInfo($idUser);
  207. // create new record with L_APPOITMENT_* in table `USERS2_CONTACT`
  208. $newContactItem = [
  209. 'ID_BILLING_USERS' => $idUser,
  210. 'L_APPOITMENT_USER' => $args['L_APPOITMENT_USER'],
  211. 'L_APPOITMENT_DATE' => $args['L_APPOITMENT_DATE'],
  212. 'L_APPOITMENT_TYPE' => $args['L_APPOITMENT_TYPE'],
  213. 'L_APPOITMENT_INFO' => $args['L_APPOITMENT_INFO'],
  214. 'SALDO' => $windykInfo['PAY_SALDO'],
  215. 'A_RECORD_CREATE_DATE' => "NOW()",
  216. 'A_RECORD_CREATE_AUTHOR' => User::getLogin(),
  217. ];
  218. $idCreated = DB::getPDO()->insert('USERS2_CONTACT', $newContactItem);
  219. DB::getPDO()->insert('USERS2_CONTACT_HIST', array_merge($newContactItem, [ 'ID_USERS2' => $idCreated ]));
  220. // update A_STATUS_INFO in `USERS2_WINDYKACJA_STATUS` if $args['change_windykacja_status']
  221. if ($args['change_windykacja_status']) {
  222. if ($windykInfo['A_STATUS_INFO'] != $args['A_STATUS_INFO']) {
  223. $toUpdateWindyk = [
  224. 'A_STATUS_INFO' => $args['A_STATUS_INFO'],
  225. 'A_RECORD_UPDATE_DATE' => "NOW()",
  226. 'A_RECORD_UPDATE_AUTHOR' => User::getLogin(),
  227. ];
  228. DB::getPDO()->update('USERS2_WINDYKACJA_STATUS', 'ID_BILLING_USERS', $idUser, $toUpdateWindyk);
  229. DB::getPDO()->insert('USERS2_WINDYKACJA_STATUS_HIST', array_merge($toUpdateWindyk, [
  230. 'ID_USERS2' => $windykInfo['ID'],
  231. ]));
  232. }
  233. }
  234. // update L_APPOITMENT_* fields using REMINDER_* in `USERS2_WINDYKACJA_STATUS` if $args['add_reminder']
  235. if ($args['add_reminder']) {
  236. DB::getPDO()->update('USERS2_WINDYKACJA_STATUS', 'ID_BILLING_USERS', $idUser, [
  237. 'L_APPOITMENT_USER' => $args['REMINDER_USER'],
  238. 'L_APPOITMENT_DATE' => $args['REMINDER_DATE'],
  239. 'L_APPOITMENT_INFO' => $args['REMINDER_INFO'],
  240. 'A_RECORD_UPDATE_DATE' => "NOW()",
  241. 'A_RECORD_UPDATE_AUTHOR' => User::getLogin(),
  242. ]);
  243. }
  244. } catch (Exception $e) {
  245. DBG::log($e);
  246. UI::alert('danger', $e->getMessage());
  247. return;
  248. }
  249. throw new AlertSuccessException("Wprowadzono notatkę ze spotkania z klientem " . UI::h('a', [ 'href' => $this->getLink('', [ 'id_user' => $idUser ]) ], "wróć"));
  250. }
  251. function viewUserPaymentContactsHistory($idUser, $params = []) {
  252. $markEventsFromSpotkanieNr = V::get('markEventsFromSpotkanieNr', 0, $params, 'int');
  253. Lib::loadClass('Windykacja_StatsModel');
  254. $billDocs = Windykacja_StatsModel::getBillDocsByDate($idUser);
  255. $lastHist = DB::getPDO()->fetchAll("
  256. select t.ID
  257. , t.ID_BILLING_USERS
  258. -- , t.CLIENT_INFO
  259. , t.A_STATUS
  260. -- , t.A_STATUS_INFO
  261. , t.L_APPOITMENT_USER
  262. , t.L_APPOITMENT_DATE
  263. , t.L_APPOITMENT_TYPE
  264. , t.L_APPOITMENT_INFO
  265. , t.A_RECORD_CREATE_DATE
  266. -- , IF('0000-00-00 00:00:00' = t.A_RECORD_UPDATE_DATE, t.A_RECORD_CREATE_DATE, t.A_RECORD_UPDATE_DATE) as A_RECORD_UPDATE_DATE
  267. from USERS2_CONTACT t
  268. where t.ID_BILLING_USERS = :id
  269. and t.A_STATUS != 'DELETED'
  270. limit 11
  271. ", [ ':id' => $idUser ]);
  272. // DBG::nicePrint($lastHist, '$lastHist');
  273. if (!empty($lastHist)) {
  274. foreach ($lastHist as $bill_doc) {
  275. $billDocs->add_event(substr($bill_doc['A_RECORD_CREATE_DATE'], 0, 10), 'HIST_CONTACT', $bill_doc);
  276. }
  277. }
  278. // TODO: add zmiania statusu: select h.* from Windyk_HIST where A_STATUS_INFO != 'N/S;'
  279. $umowy_l2 = Windykacja_StatsModel::getClientUmowy($idUser);
  280. //echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">billDocs ';print_r($billDocs);echo'</pre>';
  281. //echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">billDocs ';print_r(reset($billDocs));echo'</pre>';
  282. //echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">umowy_l2 ';print_r($umowy_l2);echo'</pre>';
  283. if (!empty($umowy_l2)) {
  284. foreach ($umowy_l2 as $h) {
  285. $billDocs->add_event($h['P_DEALDATE'], 'UMOWA', $h);
  286. if ($h['P_DEALDATE_TERM'] != '0000-00-00') {// < date('Y-m-d')) {
  287. $billDocs->add_event($h['P_DEALDATE_TERM'], 'KONIEC UMOWY', $h);
  288. }
  289. }
  290. }
  291. $user_hist_events = Windykacja_StatsHelper::getUserHistStatusEvents($idUser);
  292. if (!empty($user_hist_events)) {
  293. foreach ($user_hist_events as $bill_doc) {
  294. $billDocs->add_event($bill_doc['A_STATUS_UPDATE_DATE'], 'HIST_STATUS', $bill_doc);
  295. }
  296. }
  297. $user_hist_events = Windykacja_StatsHelper::getUserHistPhoneEvents($idUser);
  298. if (!empty($user_hist_events)) {
  299. foreach ($user_hist_events as $bill_doc) {
  300. $billDocs->add_event(substr($bill_doc['A_RECORD_UPDATE_DATE'], 0, 10), 'HIST_PHONE', $bill_doc);
  301. }
  302. }
  303. $user_hist_events = Windykacja_StatsHelper::getUserBadAddressEvents($user->ID);
  304. if (!empty($user_hist_events)) {
  305. foreach ($user_hist_events as $bill_doc) {
  306. $billDocs->add_event(substr($bill_doc['A_RECORD_UPDATE_DATE'], 0, 10), 'HIST_BAD_ADDRESS', $bill_doc);
  307. }
  308. }
  309. // add today
  310. $bill_doc = array();
  311. $bill_doc['saldo'] = $billDocs->get_saldo();
  312. $billDocs->add_event(date('Y-m-d'), 'TODAY', $bill_doc);
  313. $billDocs->sort_docs();
  314. $billDocs->set_saldo_for_all_docs();
  315. $listBillDocs = $billDocs->get_docs(); // [ day => [ Windykacja_EventDoc, ... ], ... ]
  316. // convert to: [ year => [ Windykacja_EventDoc, ... ] ]
  317. $groupedByYearBillDocs = array_reduce($listBillDocs, function ($ret, $listDayEvents) {
  318. foreach ($listDayEvents as $event) {
  319. $year = substr($event->get_date(), 0, 4);
  320. if (empty($ret[$year])) $ret[$year] = [];
  321. array_unshift($ret[$year], $event);
  322. }
  323. return $ret;
  324. }, []);
  325. $groupedByYearBillDocs = array_reverse($groupedByYearBillDocs, true);
  326. // DBG::nicePrint($listBillDocs, '$listBillDocs');
  327. // DBG::nicePrint($groupedByYearBillDocs, '$groupedByYearBillDocs');
  328. // UI::table([ 'caption' => "Historia kontaktów z klientem (TODO: w trakcie prac. Zobacz " .
  329. // UI::h('a', [ 'href' => "index.php?MENU_INIT=USERS2_WINDYKACJA_STATUS&q=&_f=&_user_id={$idUser}" ], "Panel windykacji") .
  330. // ")", 'rows' => $lastHist ]);
  331. // if (count($lastHist) > 10) UI::alert('info', "Przeglądaj wszystkie wpisy TODO: link to view table with ff_ID_BILLING_USERS");
  332. echo UI::h('div', [], array_merge(
  333. [
  334. UI::h('h3', [], "Historia klienta"),
  335. ],
  336. array_map(function ($listEventDocs, $year) use ($markEventsFromSpotkanieNr) {
  337. return UI::h('details', array_merge([ 'style' => "margin:8px 0" ],
  338. (date("Y") == $year) ? [ 'open' => "" ] : []
  339. ), [
  340. UI::h('summary', [ 'style' => "height:20px; position:relative; cursor:pointer; outline:none" ], [
  341. UI::h('div', [ 'style' => "position:absolute; top:9px; left:20px; width: 100%; border-bottom:2px solid #000" ]),
  342. UI::h('span', [ 'style' => "position:absolute; top:0; left:12px; padding:0 12px 0 0; line-height:20px; background-color:#fff; font-weight:bold" ], [
  343. "{$year}:",
  344. ]),
  345. ]),
  346. UI::h('div', [ 'style' => "padding: 8px 0px 8px 54px" ],
  347. array_merge(
  348. [
  349. UI::hTable([
  350. 'disable_lp' => true,
  351. '@class' => 'table table-hover', // table-bordered
  352. 'cols' => [
  353. 'data',
  354. 'winien',
  355. 'ma',
  356. 'saldo',
  357. '#',
  358. 'uwagi',
  359. ],
  360. '@style[data]' => "width:80px; text-align:right",
  361. '@style[winien]' => "width:90px; text-align:right",
  362. '@style[ma]' => "width:90px; text-align:right",
  363. '@style[saldo]' => "width:90px; text-align:right; background-color:#f5f5f5",
  364. '@style[#]' => "width:140px; padding-left:12px; text-align:left",
  365. 'rows' => array_map(function ($eventDoc) use ($markEventsFromSpotkanieNr) {
  366. $saldo = $eventDoc->get_saldo();
  367. $overallSaldo = $eventDoc->get_saldo_overall();
  368. $rowClass = "";
  369. // $markEventsFromSpotkanieNr
  370. if ($markEventsFromSpotkanieNr
  371. && $eventDoc->get_class() == 'EVENT' && $eventDoc->get_type() == 'HIST_CONTACT'
  372. && $eventDoc->get('ID') == $markEventsFromSpotkanieNr
  373. ) {
  374. $rowClass = "info";
  375. } else {
  376. $rowClass = ('EVENT' === $eventDoc->get_class() && 'TODAY' === $eventDoc->get_type()) ? "warning" : "";
  377. }
  378. return [
  379. 'data' => $eventDoc->get_date(),
  380. 'winien' => UI::h('span', [
  381. 'style' => "color:" . ( (-1 * $saldo > 0) ? "#000" : "#ddd" ),
  382. ], ($saldo < 0) ? UI::price(-1 * $saldo) : 0
  383. ),
  384. 'ma' => UI::h('span', [
  385. 'style' => "color:" . ( ($saldo > 0) ? "#000" : "#ddd" ),
  386. ], ($saldo > 0) ? UI::price($saldo) : 0
  387. ),
  388. 'saldo' => UI::h('span', [
  389. 'style' => "color:" . ( ($overallSaldo >= 0) ? "green" : "red" ),
  390. ], UI::price($overallSaldo)
  391. ),
  392. '#' => $this->viewUserPaymentContactsHistory_eventNr($eventDoc),
  393. 'uwagi' => $this->viewUserPaymentContactsHistory_eventLabel($eventDoc),
  394. '@class' => $rowClass,
  395. '@style[data]' => "text-align:right",
  396. '@style[winien]' => "text-align:right",
  397. '@style[ma]' => "text-align:right",
  398. '@style[saldo]' => "text-align:right; background-color:#f5f5f5",
  399. '@style[#]' => "padding-left:12px",
  400. ];
  401. }, $listEventDocs),
  402. ]),
  403. ],
  404. []
  405. )
  406. ),
  407. ]);
  408. }, $groupedByYearBillDocs, array_keys($groupedByYearBillDocs))
  409. ));
  410. }
  411. function viewUserPaymentContactsHistory_eventNr($v_doc) { // return html (string)
  412. /* links fomr l1:
  413. * FV: https://l1.webone.pl/modules/make_billing/edit.php?mod=make_billing&form=html_faktura&adm=edit&uid=4014&fpos=&dz=&close=0&doc=799413&doctype=1
  414. * KOR: https://l1.webone.pl/modules/make_billing/edit.php?mod=make_billing&form=html_faktura_korekta&adm=edit&uid=4014&fpos=&dz=&close=0&doc=809557&doctype=3
  415. * https://biuro.biall-net.pl/dev-pl/se-master/index.php?FUNCTION_INIT=bm_show_document&ARG1_VAL=809557
  416. */
  417. if ($v_doc->get_class() == 'BILLING' && 'FVAT' == $v_doc->get_type()) {
  418. $nr = $v_doc->get_type();
  419. Lib::loadClass('Windykacja_StatsModel');
  420. $type_desc = Windykacja_StatsModel::get_billing_type_desc($v_doc->get_type());
  421. if ($type_desc) {
  422. $type_desc .= "\n Wystawiona: ".$v_doc->get('BILL_DATE')."\n Termin płatności: ".$v_doc->get('PAYMENT_TERM');
  423. $nr = '<span title="'.$type_desc.'">'.$nr.'</span>';
  424. // TODO: podglad faktury
  425. //if ($h['type'] == 'FVAT') $nr .= ' <a href="'."?MENU_INIT=USERS2_WINDYKACJA_STATUS&_user_id=".$user->ID."&task=view_faktura&id=".$h['ID'].'" target="_blank">'.'<img src="'."icon/search.png".'" alt="'."U".'" title="'."Podgląd faktury".'" />'.'</a>';
  426. }
  427. $docNr = $v_doc->get('nr');
  428. $docNrLabel = $v_doc->get('NUMBER') . '/' . $v_doc->get('ID_BILLING_PREFIXES');
  429. $nr .= ' <a href="index.php?FUNCTION_INIT=bm_show_document&ARG1_VAL=' . $docNr . '" target="_blank">'."({$docNrLabel})".'</a>';
  430. return $nr;
  431. }
  432. if ($v_doc->get_class() == 'BILLING' && 'KORV' == $v_doc->get_type()) {
  433. $nr = $v_doc->get_type();
  434. Lib::loadClass('Windykacja_StatsModel');
  435. $type_desc = Windykacja_StatsModel::get_billing_type_desc($v_doc->get_type());
  436. if ($type_desc) {
  437. $nr = '<span title="'.$type_desc.'">'.$nr.'</span>';
  438. }
  439. $docNr = $v_doc->get('nr');
  440. $docNrLabel = $v_doc->get('NUMBER') . '/' . $v_doc->get('ID_BILLING_PREFIXES');
  441. $remoteFvNum = $v_doc->get('FV_NUMBER');
  442. $korNr = $v_doc->get('ID_BILLING_NUMBERS');
  443. $korTitle = "Korekta dotycząca faktury nr: {$remoteFvNum}";
  444. $nr .= ' <a href="index.php?FUNCTION_INIT=bm_show_document&ARG1_VAL=' . $korNr . '" target="_blank" title="'.$korTitle.'">'."({$docNrLabel})".'</a>';
  445. return $nr;
  446. }
  447. if ($v_doc->get_class() == 'BILLING') {
  448. $nr = $v_doc->get_type();
  449. Lib::loadClass('Windykacja_StatsModel');
  450. $type_desc = Windykacja_StatsModel::get_billing_type_desc($v_doc->get_type());
  451. if ($type_desc) {
  452. $nr = '<span title="'.$type_desc.'">'.$nr.'</span>';
  453. }
  454. $docNr = $v_doc->get('nr');
  455. $docNrLabel = $v_doc->get('NUMBER') . '/' . $v_doc->get('ID_BILLING_PREFIXES');
  456. return $nr;
  457. }
  458. if ($v_doc->get_class() == 'EVENT' && $v_doc->get_type() == 'TODAY') return "";
  459. if ($v_doc->get_class() == 'EVENT' && $v_doc->get_type() == 'HIST_STATUS') return "";
  460. if ($v_doc->get_class() == 'EVENT' && $v_doc->get_type() == 'HIST_PHONE') return "";
  461. if ($v_doc->get_class() == 'EVENT' && $v_doc->get_type() == 'HIST_BAD_ADDRESS') return "";
  462. if ($v_doc->get_class() == 'EVENT' && $v_doc->get_type() == 'HIST_CONTACT') return "Spotkanie " . UI::h('a', [
  463. 'href' => "index.php?_route=ViewTableAjax&namespace=default_db/USERS2_CONTACT#EDIT/" . $v_doc->get('ID'),
  464. 'target' => "_blank",
  465. 'title' => "Notatka ze spotkania",
  466. ], "(" . $v_doc->get('ID') . ")");
  467. if ($v_doc->get_class() == 'EVENT') return UI::h('span', [ 'title' => $v_doc->get('ID') ], $v_doc->get_type()); // TODO: dla KP,KW: ID_BILLING_NUMBERS zamiast ID
  468. return "???";
  469. }
  470. function viewUserPaymentContactsHistory_eventLabel($v_doc) { // return html (string)
  471. if ($v_doc->get_class() == 'BILLING') return '';
  472. if ($v_doc->get_class() == 'EVENT' && $v_doc->get_type() == 'TODAY') return '';
  473. if ($v_doc->get_class() == 'EVENT' && $v_doc->get_type() == 'HIST_STATUS') {
  474. $id_koresp = intval($v_doc->get('ID_KORESP'));
  475. $add = '';
  476. if ($id_koresp > 0) {
  477. $koresp_edit_link = "index.php?_route=ViewTableAjax&namespace=default_db/IN7_DZIENNIK_KORESP#EDIT/{$id_koresp}";
  478. $add = " " . '<a href="' . $koresp_edit_link . '" title="' . "Edycja KORESP. ({$id_koresp})" . '" target="_blank">' . "KOR" . '</a>';
  479. }
  480. switch ($v_doc->get('A_STATUS')) {
  481. case 'WAITING': return "powrót do oczekujących {$add}";
  482. case 'waiting-wezwanie2':return "wezwanie do zapłaty (Nr koresp.: ".$v_doc->get('ID_KORESP').") <em>(termin: ".$v_doc->get('PAY_TERM').")</em> {$add}";
  483. case 'waiting-krd': return "wezwanie do zapłaty ost. (Nr koresp.: ".$v_doc->get('ID_KORESP').") <em>(termin: ".$v_doc->get('PAY_TERM').")</em> {$add}";
  484. case 'N/S;': return "Nr koresp.: ".$v_doc->get('ID_KORESP')." <em>(" . $v_doc->get('K_ZAWARTOS') . ")</em>" .
  485. (
  486. ($v_doc->get('ID_KORESP') > 0 && substr($v_doc->get('params'), 0, strlen('rozwiazanie umowy')) == 'rozwiazanie umowy')
  487. ? " " . '<a href="'."?MENU_INIT=USERS2_WINDYKACJA_STATUS&q=".V::get('q','', $_REQUEST)."&task="."bok_rozwiazanie_umowy_print"."&user_id={$user->ID}&id_koresp=".$v_doc->get('ID_KORESP').'" target="_blank" title="' . "Generuj druk rozwiązania umowy" . '">' . "druk" . '</a>'
  488. : ""
  489. ) . " {$add}"
  490. ;
  491. // TODO: get opis from koresp
  492. //echo '('.$v_doc->get('ID_KORESP').', '.$v_doc->get('K_ZAWARTOS').'='.substr($v_doc->get('K_ZAWARTOS'), 0, strlen('rozwiazanie umowy')).')';
  493. default: return "zmiana statusu na: " . $v_doc->get('A_STATUS') . " ";
  494. }
  495. }
  496. if ($v_doc->get_class() == 'EVENT' && $v_doc->get_type() == 'HIST_PHONE') {
  497. $lastUpdateDate = $v_doc->get('A_RECORD_UPDATE_DATE');
  498. $lastPhoneStatus = ('N/S;' === $v_doc->get('LAST_PHONE_STATUS')) ? '' : $v_doc->get('LAST_PHONE_STATUS');
  499. if (!empty($lastPhoneStatus)) {
  500. $date = $v_doc->get('PAY_TERM');
  501. if ($date == 'N/S;') $date = '';
  502. switch ($lastPhoneStatus) {
  503. case 'nie_zaplaci': return "nie zapłaci";
  504. case 'zaplaci_w_terminie': return "zapłaci w terminie {$date} " . '<em style="font-size:small;">' . "(ustalono {$lastUpdateDate})" . '</em>';
  505. case 'zaplaci_za_1mc': return "zapłaci miesiąc później {$date} " . '<em style="font-size:small;">' . "(ustalono {$lastUpdateDate})" . '</em>';
  506. case 'zaplaci_za_2mc': return "zapłaci 2 miesiące później {$date} " . '<em style="font-size:small;">' . "(ustalono {$lastUpdateDate})" . '</em>';
  507. case 'zaplaci_za_3mc': return "zapłaci 3 miesiące później {$date} " . '<em style="font-size:small;">' . "(ustalono {$lastUpdateDate})" . '</em>';
  508. default: return "kontakt z klientem: {$lastPhoneStatus} " . '<em style="font-size:small;">' . "(ustalono {$lastUpdateDate})" . '</em>';
  509. }
  510. }
  511. $lastSmsStatus = $v_doc->get('LAST_SMS_STATUS');
  512. if ($lastSmsStatus == 'N/S;') $lastSmsStatus = '';
  513. if (!empty($lastSmsStatus)) {
  514. $lastSmsId = $v_doc->get('LAST_SMS_MSG_ID');
  515. return "SMS: {$lastSmsStatus} " . '<em style="font-size:small;" title="' . "(wysłano {$lastUpdateDate}, {$lastSmsId})" . '">' . "(wysłano {$lastUpdateDate})" . '</em>';
  516. }
  517. $lastMailStatus = $v_doc->get('LAST_MAIL_STATUS');
  518. if ($lastMailStatus == 'N/S;') $lastMailStatus = '';
  519. if (!empty($lastMailStatus)) {
  520. $lastMailId = $v_doc->get('LAST_MAIL_MSG_ID');
  521. return "MAIL: {$lastMailStatus} " . '<em style="font-size:small;" title="' . "(wysłano {$lastUpdateDate}, {$lastMailId})" . '">' . "(wysłano {$lastUpdateDate})" . '</em>';
  522. }
  523. }
  524. if ($v_doc->get_class() == 'EVENT' && $v_doc->get_type() == 'HIST_BAD_ADDRESS') {
  525. $koresp_edit_link = "index.php?_route=ViewTableAjax&namespace=default_db/IN7_DZIENNIK_KORESP#EDIT/";
  526. $add = ($v_doc->get('ID_KORESP') > 0)
  527. ? " - ID Koresp. (" . '<a href="' . $koresp_edit_link . $v_doc->get('ID_KORESP') . '" target="_blank">' . $v_doc->get('ID_KORESP') . '</a>' . ")"
  528. : ""
  529. ;
  530. return ($v_doc->get('BAD_ADDRESS'))
  531. ? "błędny adres zameldowania {$add}"
  532. : "poprawa adresu zameldowania {$add}"
  533. ;
  534. }
  535. if ($v_doc->get_class() == 'EVENT' && $v_doc->get_type() == 'UMOWA') {
  536. return "umowa nr <b>".$v_doc->get('P_DEALNUMBER')."</b> <em>(termin ".$v_doc->get('P_DEALDATE_TERM').")</em>";
  537. }
  538. if ($v_doc->get_class() == 'EVENT' && $v_doc->get_type() == 'KONIEC UMOWY') {
  539. return "zakończenie umowy nr <b>".$v_doc->get('P_DEALNUMBER')."</b> <em>(z dnia ".$v_doc->get('P_DEALDATE').")</em>";
  540. }
  541. if ($v_doc->get_class() == 'EVENT' && $v_doc->get_type() == 'HIST_CONTACT') {
  542. return implode(" ", [
  543. $v_doc->get('L_APPOITMENT_TYPE'),
  544. $v_doc->get('L_APPOITMENT_INFO'),
  545. UI::h('em', [], "(" . $v_doc->get('L_APPOITMENT_USER') . ")"),
  546. ]);
  547. }
  548. return "...";
  549. }
  550. function prepareTable() {
  551. DB::getPDO()->execSql("
  552. CREATE TABLE IF NOT EXISTS `USERS2_CONTACT` (
  553. `ID` int(11) NOT NULL AUTO_INCREMENT,
  554. `ID_BILLING_USERS` int(11) NOT NULL DEFAULT '0',
  555. `CLIENT_INFO` varchar(255) NOT NULL DEFAULT '',
  556. `CLIENT_TEL` varchar(255) NOT NULL DEFAULT '',
  557. `A_STATUS` enum('WAITING','NORMAL','DELETED') NOT NULL DEFAULT 'WAITING',
  558. `A_STATUS_INFO` varchar(255) NOT NULL,
  559. `L_APPOITMENT_DATE` date NOT NULL DEFAULT '0000-00-00',
  560. `L_APPOITMENT_USER` varchar(20) NOT NULL DEFAULT '',
  561. `L_APPOITMENT_PERIOD` varchar(4) NOT NULL,
  562. `L_APPOITMENT_INFO` varchar(255) NOT NULL,
  563. `L_APPOITMENT_TYPE` enum('','LIVE','TEL','TEL_NIE_ODBIERA','MAIL','SMS','INNE') DEFAULT NULL,
  564. `A_RECORD_CREATE_DATE` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  565. `A_RECORD_CREATE_AUTHOR` varchar(20) NOT NULL DEFAULT '',
  566. `A_RECORD_UPDATE_DATE` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  567. `A_RECORD_UPDATE_AUTHOR` varchar(20) NOT NULL DEFAULT '',
  568. `A_PROBLEM` enum('','WARNING','PROBLEM','SERIOUS','UNVERIFIED') DEFAULT NULL,
  569. `A_PROBLEM_DESC` varchar(255) NOT NULL DEFAULT '',
  570. `A_PROBLEM_DATE` varchar(30) NOT NULL DEFAULT '',
  571. `T_WORKPOINTS` varchar(100) NOT NULL DEFAULT '',
  572. `T_WORKPOINTS_VALUE` varchar(100) NOT NULL DEFAULT '',
  573. `T_WORKPOINTS_TYPE` varchar(100) NOT NULL DEFAULT '',
  574. `T_WORKPOINTS_USER` varchar(100) NOT NULL DEFAULT '',
  575. `T_WORKPOINTS_DATE` varchar(100) NOT NULL DEFAULT '',
  576. `A_CLASSIFIED` varchar(100) NOT NULL DEFAULT '',
  577. `A_ADM_COMPANY` varchar(100) NOT NULL DEFAULT '',
  578. `ROZLICZ_MONTH` date NOT NULL DEFAULT '0000-00-00',
  579. `ROZLICZ_CONFIRM` int(11) NOT NULL DEFAULT '0',
  580. `SALDO` decimal(10,2) NOT NULL DEFAULT '0.00',
  581. `ILE_ODZYSKANO` decimal(10,2) NOT NULL DEFAULT '0.00',
  582. PRIMARY KEY (`ID`)
  583. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  584. ");
  585. DB::getPDO()->execSql("
  586. CREATE TABLE IF NOT EXISTS `USERS2_CONTACT_HIST` (
  587. `ID` int(11) NOT NULL AUTO_INCREMENT,
  588. `ID_USERS2` int(11) NOT NULL,
  589. `ID_BILLING_USERS` varchar(11) NOT NULL DEFAULT 'N/S;',
  590. `CLIENT_INFO` varchar(255) NOT NULL DEFAULT 'N/S;',
  591. `CLIENT_TEL` varchar(255) NOT NULL DEFAULT 'N/S;',
  592. `A_STATUS` varchar(32) NOT NULL DEFAULT 'N/S;',
  593. `A_STATUS_INFO` varchar(255) NOT NULL DEFAULT 'N/S;',
  594. `L_APPOITMENT_DATE` varchar(20) NOT NULL DEFAULT 'N/S;',
  595. `L_APPOITMENT_USER` varchar(20) NOT NULL DEFAULT 'N/S;',
  596. `L_APPOITMENT_PERIOD` varchar(4) NOT NULL DEFAULT 'N/S;',
  597. `L_APPOITMENT_INFO` varchar(255) NOT NULL DEFAULT 'N/S;',
  598. `L_APPOITMENT_TYPE` varchar(16) NOT NULL DEFAULT 'N/S;',
  599. `A_RECORD_CREATE_DATE` varchar(20) NOT NULL DEFAULT 'N/S;',
  600. `A_RECORD_CREATE_AUTHOR` varchar(20) NOT NULL DEFAULT 'N/S;',
  601. `A_RECORD_UPDATE_DATE` varchar(20) NOT NULL DEFAULT 'N/S;',
  602. `A_RECORD_UPDATE_AUTHOR` varchar(20) NOT NULL DEFAULT 'N/S;',
  603. `A_PROBLEM` varchar(16) NOT NULL DEFAULT 'N/S;',
  604. `A_PROBLEM_DESC` varchar(255) NOT NULL DEFAULT 'N/S;',
  605. `A_PROBLEM_DATE` varchar(30) NOT NULL DEFAULT 'N/S;',
  606. `T_WORKPOINTS` varchar(100) NOT NULL DEFAULT 'N/S;',
  607. `T_WORKPOINTS_VALUE` varchar(100) NOT NULL DEFAULT 'N/S;',
  608. `T_WORKPOINTS_TYPE` varchar(100) NOT NULL DEFAULT 'N/S;',
  609. `T_WORKPOINTS_USER` varchar(100) NOT NULL DEFAULT 'N/S;',
  610. `T_WORKPOINTS_DATE` varchar(100) NOT NULL DEFAULT 'N/S;',
  611. `A_CLASSIFIED` varchar(100) NOT NULL DEFAULT 'N/S;',
  612. `A_ADM_COMPANY` varchar(100) NOT NULL DEFAULT 'N/S;',
  613. `ROZLICZ_MONTH` varchar(20) NOT NULL DEFAULT 'N/S;',
  614. `ROZLICZ_CONFIRM` varchar(11) NOT NULL DEFAULT 'N/S;',
  615. `SALDO` varchar(11) NOT NULL DEFAULT 'N/S;',
  616. `ILE_ODZYSKANO` varchar(11) NOT NULL DEFAULT 'N/S;',
  617. PRIMARY KEY (`ID`),
  618. KEY `ID_USERS2` (`ID_USERS2`)
  619. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  620. ");
  621. }
  622. }
  623. /*
  624. insert into USERS2_CONTACT (
  625. A_RECORD_CREATE_DATE,
  626. A_RECORD_CREATE_AUTHOR,
  627. ID_BILLING_USERS,
  628. CLIENT_INFO,
  629. L_APPOITMENT_TYPE,
  630. L_APPOITMENT_DATE,
  631. L_APPOITMENT_USER,
  632. L_APPOITMENT_INFO
  633. )
  634. select
  635. h.A_RECORD_UPDATE_DATE as A_RECORD_CREATE_DATE,
  636. h.A_RECORD_UPDATE_AUTHOR as A_RECORD_CREATE_AUTHOR,
  637. ( select w.ID_BILLING_USERS from USERS2_WINDYKACJA_STATUS w where w.ID = h.ID_USERS2 ) as ID_BILLING_USERS,
  638. '' as CLIENT_INFO,
  639. 'TEL' as L_APPOITMENT_TYPE,
  640. IF('N/S;' = h.L_APPOITMENT_DATE and h.LAST_PHONE_STATUS_DATE != 'N/S;', h.LAST_PHONE_STATUS_DATE, h.L_APPOITMENT_DATE) as L_APPOITMENT_DATE,
  641. IF('N/S;' = h.L_APPOITMENT_DATE and h.LAST_PHONE_STATUS_DATE != 'N/S;', h.A_RECORD_UPDATE_AUTHOR, h.L_APPOITMENT_USER) as L_APPOITMENT_USER,
  642. IF('N/S;' = h.L_APPOITMENT_DATE and h.LAST_PHONE_STATUS_DATE != 'N/S;', h.LAST_PHONE_STATUS, h.L_APPOITMENT_INFO) as L_APPOITMENT_INFO
  643. -- , '===' as X, h.*
  644. from USERS2_WINDYKACJA_STATUS_HIST h
  645. where
  646. h.A_RECORD_UPDATE_DATE like '2019-08-%'
  647. and h.A_RECORD_UPDATE_AUTHOR not like '%update%'
  648. and h.ID_KORESP = 'N/S;' -- params like 'rowzwiaanie umowy%'
  649. select sum(ILE_ODZYSKANO) from USERS2_CONTACT;
  650. select count(DISTINCT ID_BILLING_USERS) from USERS2_CONTACT;
  651. select ID_BILLING_USERS, count(*) as cnt from USERS2_CONTACT group by ID_BILLING_USERS;
  652. * fix rows order and HIST
  653. insert into USERS2_CONTACT_temp201909 (
  654. ID_OLD,
  655. A_RECORD_CREATE_DATE,
  656. A_RECORD_CREATE_AUTHOR,
  657. ID_BILLING_USERS,
  658. CLIENT_INFO,
  659. L_APPOITMENT_TYPE,
  660. L_APPOITMENT_DATE,
  661. L_APPOITMENT_USER,
  662. L_APPOITMENT_INFO
  663. )
  664. select t.*
  665. from
  666. (
  667. select
  668. 0 as ID_OLD,
  669. h.A_RECORD_UPDATE_DATE as A_RECORD_CREATE_DATE,
  670. h.A_RECORD_UPDATE_AUTHOR as A_RECORD_CREATE_AUTHOR,
  671. ( select w.ID_BILLING_USERS from USERS2_WINDYKACJA_STATUS w where w.ID = h.ID_USERS2 ) as ID_BILLING_USERS,
  672. '' as CLIENT_INFO,
  673. 'TEL' as L_APPOITMENT_TYPE,
  674. IF('N/S;' = h.L_APPOITMENT_DATE and h.LAST_PHONE_STATUS_DATE != 'N/S;', h.LAST_PHONE_STATUS_DATE, h.L_APPOITMENT_DATE) as L_APPOITMENT_DATE,
  675. IF('N/S;' = h.L_APPOITMENT_DATE and h.LAST_PHONE_STATUS_DATE != 'N/S;', h.A_RECORD_UPDATE_AUTHOR, h.L_APPOITMENT_USER) as L_APPOITMENT_USER,
  676. IF('N/S;' = h.L_APPOITMENT_DATE and h.LAST_PHONE_STATUS_DATE != 'N/S;', h.LAST_PHONE_STATUS, h.L_APPOITMENT_INFO) as L_APPOITMENT_INFO
  677. from USERS2_WINDYKACJA_STATUS_HIST h
  678. where
  679. h.A_RECORD_UPDATE_DATE like '2019-09-%'
  680. and h.A_RECORD_UPDATE_AUTHOR not like '%update%'
  681. and h.ID_KORESP = 'N/S;' -- params like 'rowzwiaanie umowy%'
  682. union
  683. select
  684. c.ID as ID_OLD,
  685. c.A_RECORD_CREATE_DATE,
  686. c.A_RECORD_CREATE_AUTHOR,
  687. c.ID_BILLING_USERS,
  688. c.CLIENT_INFO,
  689. c.L_APPOITMENT_TYPE,
  690. c.L_APPOITMENT_DATE,
  691. c.L_APPOITMENT_USER,
  692. c.L_APPOITMENT_INFO
  693. from USERS2_CONTACT c
  694. where c.ID >= 28
  695. ) as t
  696. order by t.A_RECORD_CREATE_DATE
  697. */