UserContact.php 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563
  1. <?php
  2. Lib::loadClass('RouteBase');
  3. // Tool for Windykacja status table to store contacts with clients
  4. class Route_UrlAction_UserContact extends RouteBase {
  5. function defaultAction() { UI::layout([ $this, 'defaultView' ]); }
  6. function defaultView() {
  7. $idUser = V::get('id_user', 0, $_GET, 'int');
  8. if ($idUser <= 0) throw new Exception("Missing id client");
  9. echo UI::h('h3', [ 'style' => "margin-bottom: 24px; border-bottom: 1px solid #eee" ], "Dodaj notatkę ze spotkania z klientem {$idUser}");
  10. $this->viewUserInfo($idUser);
  11. $postTask = V::get('_postTask', '', $_POST);
  12. switch ($postTask) {
  13. case 'saveConcat': $this->saveContactPostTask($idUser); break;
  14. case '': break;
  15. default: throw new Exception("Not implemented postTask '{$postTask}'");
  16. }
  17. $this->viewSaveContactForm($idUser);
  18. echo UI::h('hr');
  19. $this->viewHistContacts($idUser);
  20. }
  21. function viewSaveContactForm($idUser) {
  22. $windykInfo = $this->getWindykacjaInfo($idUser);
  23. $windykStatusInfo = ($windykInfo) ? $windykInfo['A_STATUS_INFO'] : '';
  24. $windykReminder = ($windykInfo && (
  25. !empty($windykInfo['L_APPOITMENT_USER'])
  26. || ( !empty($windykInfo['L_APPOITMENT_DATE']) && '0000-00-00' != $windykInfo['L_APPOITMENT_DATE'] )
  27. || !empty($windykInfo['L_APPOITMENT_INFO'])
  28. )) ? [
  29. 'Pracownik' => $windykInfo['L_APPOITMENT_USER'],
  30. 'Data przypomnienia' => $windykInfo['L_APPOITMENT_DATE'],
  31. 'Adnotacje' => $windykInfo['L_APPOITMENT_INFO'],
  32. ] : null;
  33. $args = [];
  34. $args['L_APPOITMENT_USER'] = V::get('L_APPOITMENT_USER', User::getLogin(), $_POST);
  35. $args['L_APPOITMENT_DATE'] = V::get('L_APPOITMENT_DATE', date("Y-m-d H:i"), $_POST);
  36. $args['L_APPOITMENT_TYPE'] = V::get('L_APPOITMENT_TYPE', '', $_POST);
  37. $args['L_APPOITMENT_INFO'] = V::get('L_APPOITMENT_INFO', '', $_POST);
  38. $args['change_windykacja_status'] = V::get('change_windykacja_status', '', $_POST);
  39. $args['A_STATUS_INFO'] = V::get('A_STATUS_INFO', $windykStatusInfo, $_POST);
  40. $args['add_reminder'] = V::get('add_reminder', '', $_POST);
  41. $args['REMINDER_USER'] = V::get('REMINDER_USER', User::getLogin(), $_POST);
  42. $args['REMINDER_DATE'] = V::get('REMINDER_DATE', '', $_POST);
  43. $args['REMINDER_INFO'] = V::get('REMINDER_INFO', '', $_POST);
  44. echo UI::h('form', [ 'method' => "POST" ], [
  45. UI::h('input', [ 'type' => "hidden", 'name' => '_postTask', 'value' => "saveConcat" ]),
  46. UI::h('input', [ 'type' => "hidden", 'name' => 'id_user', 'value' => $idUser ]),
  47. UI::h('div', [ 'class' => "row", 'style' => "padding-bottom: 12px" ], [
  48. UI::h('div', [ 'class' => "col-md-6" ], [
  49. UI::h('label', [], "Pracownik"),
  50. UI::h('input', [ 'class' => "form-control", 'type' => "text", 'name' => 'L_APPOITMENT_USER', 'value' => $args['L_APPOITMENT_USER'] ]),
  51. ]),
  52. UI::h('div', [ 'class' => "col-md-3" ], [
  53. UI::h('label', [], "Data spotkania"),
  54. UI::h('div', [ 'class' => "input-group" ], [
  55. 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'] ]),
  56. UI::h('span', [ 'class' => "input-group-addon" ], [
  57. UI::h('span', [ 'class' => "glyphicon glyphicon-calendar" ]),
  58. ]),
  59. ]),
  60. ]),
  61. UI::h('div', [ 'class' => "col-md-3" ], [
  62. UI::h('label', [], "Rodzaj spotkania"),
  63. UI::h('select', [ 'class' => "form-control", 'name' => 'L_APPOITMENT_TYPE' ], [
  64. UI::h('option', [ 'value' => "" ]),
  65. UI::h('option', array_merge([ 'value' => 'LIVE' ], ('LIVE' === $args['L_APPOITMENT_TYPE']) ? [ 'selected' => "selected" ] : []), "LIVE"),
  66. UI::h('option', array_merge([ 'value' => 'TEL' ], ('TEL' === $args['L_APPOITMENT_TYPE']) ? [ 'selected' => "selected" ] : []), "TEL"),
  67. UI::h('option', array_merge([ 'value' => 'MAIL' ], ('MAIL' === $args['L_APPOITMENT_TYPE']) ? [ 'selected' => "selected" ] : []), "MAIL"),
  68. UI::h('option', array_merge([ 'value' => 'SMS' ], ('SMS' === $args['L_APPOITMENT_TYPE']) ? [ 'selected' => "selected" ] : []), "SMS"),
  69. UI::h('option', array_merge([ 'value' => 'INNE' ], ('INNE' === $args['L_APPOITMENT_TYPE']) ? [ 'selected' => "selected" ] : []), "INNE"),
  70. ]),
  71. ]),
  72. ]),
  73. UI::h('div', [ 'class' => "row", 'style' => "padding-bottom: 12px" ], [
  74. UI::h('div', [ 'class' => "col-md-12" ], [
  75. UI::h('label', [], "Notatka"),
  76. UI::h('textarea', [ 'class' => "form-control", 'type' => "text", 'name' => 'L_APPOITMENT_INFO' ], $args['L_APPOITMENT_INFO']),
  77. ]),
  78. ]),
  79. UI::h('div', [ 'class' => "row", 'style' => "padding-bottom: 12px" ], [
  80. UI::h('div', [ 'class' => "col-md-12", 'style' => "border:1px solid #eee" ], [
  81. UI::h('div', [ 'class' => "checkbox" ], [
  82. UI::h('label', [ 'style' => "font-size:14px; line-height:22px" ], [
  83. UI::h('input', array_merge([
  84. 'type' => "checkbox",
  85. 'name' => "change_windykacja_status",
  86. 'onClick' => "document.getElementById('fld__change_windykacja_status').style.display = event.target.checked ? 'block' : 'none'",
  87. ], ($args['change_windykacja_status']) ? [ 'checked' => "checked" ] : [])),
  88. " Zmień status windykacji (ustalenia z klientem)",
  89. ]),
  90. ]),
  91. UI::h('div', [
  92. 'id' => "fld__change_windykacja_status",
  93. 'style' => "display:" . ($args['change_windykacja_status'] ? 'block' : 'none') . "; padding-bottom:12px",
  94. ], [
  95. // UI::h('label', [], "Status windykacji:"),
  96. UI::h('p', [], [
  97. "Obecny status: ",
  98. ($windykStatusInfo) ? $windykStatusInfo : "<em>brak</em>",
  99. ]),
  100. UI::h('input', [ 'class' => "form-control", 'type' => "text", 'name' => 'A_STATUS_INFO', 'value' => $args['A_STATUS_INFO'] ]),
  101. ]),
  102. ]),
  103. ]),
  104. UI::h('div', [ 'class' => "row", 'style' => "padding-bottom: 12px" ], [
  105. UI::h('div', [ 'class' => "col-md-12", 'style' => "border:1px solid #eee" ], [
  106. UI::h('div', [ 'class' => "checkbox" ], [
  107. UI::h('label', [ 'style' => "font-size:14px; line-height:22px" ], [
  108. UI::h('input', array_merge([
  109. 'type' => "checkbox",
  110. 'name' => "add_reminder",
  111. 'onClick' => "document.getElementById('fld__add_reminder').style.display = event.target.checked ? 'block' : 'none'",
  112. ], ($args['add_reminder']) ? [ 'checked' => "checked" ] : [])),
  113. " Przypomnienie",
  114. ]),
  115. ]),
  116. UI::h('div', [
  117. 'id' => "fld__add_reminder",
  118. 'style' => "display:" . ($args['add_reminder'] ? 'block' : 'none') . "; padding-bottom:4px",
  119. ], [
  120. ($windykReminder) ? UI::h('div', [ 'style' => "border-left: 5px solid orange; padding:6px 12px; margin-bottom:12px" ], [
  121. UI::h('p', [], "Obecne przypomnienie (Uwaga: zostanie nadpisane)"),
  122. UI::hTable([ 'rows' => [ $windykReminder ], 'disable_lp' => true, 'style' => "margin-bottom:0" ]),
  123. ]) : '',
  124. UI::h('div', [ 'class' => "row", 'style' => "padding-bottom: 12px" ], [
  125. UI::h('div', [ 'class' => "col-md-6" ], [
  126. UI::h('label', [], "Pracownik"),
  127. UI::h('input', [ 'class' => "form-control", 'type' => "text", 'name' => 'REMINDER_USER', 'value' => $args['REMINDER_USER'] ]),
  128. ]),
  129. UI::h('div', [ 'class' => "col-md-3" ], [
  130. UI::h('label', [], "Data przypomnienia"),
  131. UI::h('div', [ 'class' => "input-group" ], [
  132. 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'] ]),
  133. UI::h('span', [ 'class' => "input-group-addon" ], [
  134. UI::h('span', [ 'class' => "glyphicon glyphicon-calendar" ]),
  135. ]),
  136. ]),
  137. ]),
  138. ]),
  139. UI::h('div', [ 'class' => "row", 'style' => "padding-bottom: 12px" ], [
  140. UI::h('div', [ 'class' => "col-md-9" ], [
  141. UI::h('label', [], "Adnotacje"),
  142. UI::h('textarea', [ 'class' => "form-control", 'type' => "text", 'name' => 'REMINDER_INFO' ], $args['REMINDER_INFO']),
  143. ]),
  144. ]),
  145. ]),
  146. ]),
  147. ]),
  148. // <div class="form-group">
  149. // <div class="col-sm-offset-2 col-sm-10">
  150. // <div class="checkbox">
  151. // <label>
  152. // <input type="checkbox"> Remember me
  153. // </label>
  154. // </div>
  155. // </div>
  156. // </div>
  157. UI::h('div', [ 'class' => "row", 'style' => "padding-bottom: 12px" ], [
  158. UI::h('div', [ 'class' => "col-md-12" ], [
  159. UI::h('button', [ 'class' => "btn btn-primary" ], "Zapisz notatkę"),
  160. ]),
  161. ]),
  162. ]);
  163. }
  164. function saveContactPostTask($idUser) {
  165. $args = [];
  166. $args['L_APPOITMENT_USER'] = V::get('L_APPOITMENT_USER', '', $_POST);
  167. $args['L_APPOITMENT_DATE'] = V::get('L_APPOITMENT_DATE', '', $_POST);
  168. $args['L_APPOITMENT_TYPE'] = V::get('L_APPOITMENT_TYPE', '', $_POST);
  169. $args['L_APPOITMENT_INFO'] = V::get('L_APPOITMENT_INFO', '', $_POST);
  170. $args['change_windykacja_status'] = V::get('change_windykacja_status', '', $_POST);
  171. $args['A_STATUS_INFO'] = V::get('A_STATUS_INFO', '', $_POST);
  172. $args['add_reminder'] = V::get('add_reminder', '', $_POST);
  173. $args['REMINDER_USER'] = V::get('REMINDER_USER', '', $_POST);
  174. $args['REMINDER_DATE'] = V::get('REMINDER_DATE', '', $_POST);
  175. $args['REMINDER_INFO'] = V::get('REMINDER_INFO', '', $_POST);
  176. try {
  177. if (empty($args['L_APPOITMENT_USER'])) throw new Exception("Brak pracownika");
  178. if (empty($args['L_APPOITMENT_DATE'])) throw new Exception("Brak daty spotkania");
  179. if (empty($args['L_APPOITMENT_TYPE'])) throw new Exception("Brak rodzaju spotkania");
  180. if (empty($args['L_APPOITMENT_INFO'])) throw new Exception("Brak treści notatki");
  181. if ($args['change_windykacja_status']) {
  182. if (empty($args['A_STATUS_INFO'])) throw new Exception("Brak statusu windykacji");
  183. }
  184. if ($args['add_reminder']) {
  185. if (empty($args['REMINDER_USER'])) throw new Exception("Brak pracownika w przypomnieniu");
  186. if (empty($args['REMINDER_DATE'])) throw new Exception("Brak daty przypomnienia");
  187. if (empty($args['REMINDER_INFO'])) throw new Exception("Brak adnotacji przypomnienia");
  188. }
  189. $windykInfo = $this->getWindykacjaInfo($idUser);
  190. // create new record with L_APPOITMENT_* in table `USERS2_CONTACT`
  191. DB::getPDO()->insert('USERS2_CONTACT', [
  192. 'ID_BILLING_USERS' => $idUser,
  193. 'L_APPOITMENT_USER' => $args['L_APPOITMENT_USER'],
  194. 'L_APPOITMENT_DATE' => $args['L_APPOITMENT_DATE'],
  195. 'L_APPOITMENT_TYPE' => $args['L_APPOITMENT_TYPE'],
  196. 'L_APPOITMENT_INFO' => $args['L_APPOITMENT_INFO'],
  197. 'SALDO' => $windykInfo['SALDO'],
  198. 'A_RECORD_CREATE_DATE' => "NOW()",
  199. 'A_RECORD_CREATE_AUTHOR' => User::getLogin(),
  200. ]);
  201. // update A_STATUS_INFO in `USERS2_WINDYKACJA_STATUS` if $args['change_windykacja_status']
  202. if ($args['change_windykacja_status']) {
  203. DB::getPDO()->update('USERS2_WINDYKACJA_STATUS', 'ID_BILLING_USERS', $idUser, [
  204. 'A_STATUS_INFO' => $args['A_STATUS_INFO'],
  205. 'A_RECORD_UPDATE_DATE' => "NOW()",
  206. 'A_RECORD_UPDATE_AUTHOR' => User::getLogin(),
  207. ]);
  208. }
  209. // update L_APPOITMENT_* fields using REMINDER_* in `USERS2_WINDYKACJA_STATUS` if $args['add_reminder']
  210. if ($args['add_reminder']) {
  211. DB::getPDO()->update('USERS2_WINDYKACJA_STATUS', 'ID_BILLING_USERS', $idUser, [
  212. 'L_APPOITMENT_USER' => $args['REMINDER_USER'],
  213. 'L_APPOITMENT_DATE' => $args['REMINDER_DATE'],
  214. 'L_APPOITMENT_INFO' => $args['REMINDER_INFO'],
  215. 'A_RECORD_UPDATE_DATE' => "NOW()",
  216. 'A_RECORD_UPDATE_AUTHOR' => User::getLogin(),
  217. ]);
  218. }
  219. } catch (Exception $e) {
  220. DBG::log($e);
  221. UI::alert('danger', $e->getMessage());
  222. return;
  223. }
  224. throw new AlertSuccessException("Wprowadzono notatkę ze spotkania z klientem " . UI::h('a', [ 'href' => $this->getLink('', [ 'id_user' => $idUser ]) ], "wróć"));
  225. }
  226. function viewUserInfo($idUser) {
  227. $userInfo = $this->getUserInfo($idUser);
  228. $windykInfo = $this->getWindykacjaInfo($idUser);
  229. echo UI::h('details', [ 'style' => "margin-bottom: 24px" ], [
  230. UI::h('summary', [ 'style' => "padding: 12px; background: #eee; cursor: pointer; outline: none" ], [
  231. ($userInfo['is_firma']) ? "Firma" : "Klient",
  232. " ",
  233. UI::h('b', [], "{$userInfo['P_NAME']} {$userInfo['P_NAME_SECOND']}"),
  234. $windykInfo ? UI::h('span', [ 'style' => "padding-left: 24px" ], [
  235. "Zapis/Odczyt dla: {$windykInfo['A_ADM_COMPANY']}", // $windykInfo['A_CLASSIFIED'];
  236. ]) : "",
  237. UI::h('span', [ 'style' => "padding-left: 24px" ], [
  238. "Status windykacji: ",
  239. (!$windykInfo) ? "brak danych" : UI::h('span', [], "{$windykInfo['A_STATUS']} <em>{$windykInfo['A_STATUS_INFO']}</em>"),
  240. ]),
  241. " ...",
  242. UI::h('span', [ 'style' => "float:right" ], [
  243. UI::h('a', [ 'href' => "index.php?MENU_INIT=USERS2_WINDYKACJA_STATUS&q=&_f=&_user_id={$idUser}" ], "Panel windykacji"),
  244. ]),
  245. ]),
  246. UI::h('div', [ 'style' => "padding: 12px; background: #eee;" ], [
  247. UI::h('table', [], [
  248. UI::h('tr', [], [
  249. UI::h('td', [ 'style' => "vertical-align:top; padding-right:8px" ], [
  250. $this->viewWidgetUserInfo($idUser, $userInfo),
  251. ]),
  252. UI::h('td', [ 'style' => "vertical-align:top; padding-right:8px" ], [
  253. $this->viewWidgetUserWindykInfo($idUser, $windykInfo),
  254. ]),
  255. ]),
  256. ]),
  257. ]),
  258. ]);
  259. }
  260. function viewWidgetUserInfo($idUser, $userInfo = []) {
  261. if (empty($userInfo)) $userInfo = $this->getUserInfo($idUser);
  262. $outUserInfo = [
  263. 'Nr klienta' => $userInfo['ID_BILLING_USERS'],
  264. 'Firma' => ($userInfo['is_firma']) ? "Tak" : "Nie",
  265. 'Nip' => $userInfo['P_NIP'],
  266. 'Pesel' => $userInfo['P_PESEL'],
  267. 'Tel' => $userInfo['P_PHONE'],
  268. 'email' => $userInfo['user_mail_contact'],
  269. 'Adres' => "{$userInfo['P_ADDRESS_POST_CODE']} {$userInfo['P_ADDRESS_CITY']} {$userInfo['P_ADDRESS_STREET']} {$userInfo['P_ADDRESS_HOME']}/{$userInfo['P_ADDRESS_HOUSE']}",
  270. 'Operator' => "[{$userInfo['BILLING_OWNER']}] {$userInfo['BILLING_OWNER_NAME']}",
  271. ];
  272. return UI::h('div', [], [
  273. UI::h('p', [ 'style' => "border-left:3px solid #ddd; padding-left:6px; font-weight:bold" ], "Dane klienta"),
  274. UI::h('table', [ 'class' => "table table-bordered", 'style' => "width:auto; background:#fff" ],
  275. array_map(function ($fieldName) use ($outUserInfo) {
  276. return UI::h('tr', [], [
  277. UI::h('th', [], $fieldName),
  278. UI::h('td', [], $outUserInfo[$fieldName]),
  279. ]);
  280. }, array_keys($outUserInfo))
  281. ),
  282. ]);
  283. }
  284. function viewWidgetUserWindykInfo($idUser, $windykInfo = []) {
  285. if (empty($windykInfo)) $windykInfo = $this->getUserInfo($idUser);
  286. $outWindykInfo = [
  287. 'Status' => $windykInfo['A_STATUS'],
  288. // $filter_arr['stan_zero'] = array("stan zerowy");
  289. // $filter_arr['10-ego'] = array("termin płatności faktur, saldo na -", 'desc'=>array("10-ego", "10-ego każdego miesiąca - termin płatnosci faktur oraz saldo na minusie"));
  290. // $filter_arr['WAITING'] = array("termin płatności faktur", 'desc'=>array("10-ego", "10-ego każdego miesiąca - termin płatnosci faktur"));// z regulaminu
  291. // $filter_arr['15'] = array("mail ponaglenie", 'desc'=>array("10-ego + 5", "10-ego + 5 dni roboczych"));
  292. // $filter_arr['blokada'] = array("blokada", 'desc'=>array("pn, wt, śr około 25", "najbliższy pn, wt, śr do 25"));// najbliższy pn, wt, śr do 25-ego danego miesiąca
  293. // $filter_arr['tel1'] = array("kontakt tel.", 'desc'=>array("", "Ostatni kontakt tel. ponad 3 m-ce temu"));
  294. // $filter_arr['bad_address'] = array("błędny adres");
  295. // $filter_arr['wezwanie1'] = array("wezwanie do zapłaty", 'desc'=>array("2 x FVat", "2 faktury"));
  296. // $filter_arr['waiting-wezwanie2'] = array("oczekiwanie 7 dni od terminu płatności");
  297. // $filter_arr['wezwanie2'] = array("ostateczne wezwanie do zapłaty, rozwiązanie umowy", 'desc'=>array("wezwanie + 14", "wezwanie + 14 dni"));
  298. // $filter_arr['waiting-krd'] = array("min. 30 dni od ostatecznego wezwania");
  299. // $filter_arr['krd'] = array("do przekazania do KRD", 'desc'=>array("wezwanie ost. + 60", "wezwanie ost. + 60 dni"));
  300. // $filter_arr['waiting-sad'] = array("przekazano do KRD");
  301. // $filter_arr['docs-in-sad'] = array("przekazać sprawę do sądu");// waiting-sad = 30 dni
  302. // $filter_arr['sad'] = array("przekazano sprawę do sądu");
  303. // $filter_arr['3 m-ce przed'] = array("3 m-ce przed przedawnieniem");// 3 m-ce przed przedawnieniem
  304. // $filter_arr['po-terminie'] = array("po terminie");// 3 lata po dacie platnosci faktur
  305. // $filter_arr['has_nr_sad'] = array("nr sprawy sąd");
  306. // $filter_arr['has_nr_komornik'] = array("nr sprawy komornik");
  307. // $filter_arr['has_ustalenia'] = array("ustalenia z klientem");
  308. // $filter_arr['sad_and_komornik'] = array("sąd z komornik");
  309. // $filter_arr['sad_bez_komornik'] = array("sąd bez komornik");
  310. // $filter_arr['isMovedToVectra'] = array("przeniesieni do Vectra");
  311. // if ($filter_selected == 'po-terminie') {
  312. // $sql_where_and_arr[] = "w.`PAY_SALDO`<=-0.05";
  313. // $sql_where_and_arr[] = "w.`PAY_DATE`!='0000-00-00'";
  314. // $sql_where_and_arr[] = "w.`PAY_DATE`<DATE_SUB(NOW(), INTERVAL 36 MONTH)";
  315. // }
  316. // else if ($filter_selected == '3 m-ce przed') {
  317. // $sql_where_and_arr[] = "w.`PAY_SALDO`<=-0.05";
  318. // $sql_where_and_arr[] = "w.`PAY_DATE`!='0000-00-00'";
  319. // $sql_where_and_arr[] = "w.`PAY_DATE`<DATE_SUB(NOW(), INTERVAL 33 MONTH)";
  320. // $sql_where_and_arr[] = "w.`PAY_DATE`>DATE_SUB(NOW(), INTERVAL 36 MONTH)";
  321. // }
  322. // else if ($filter_selected == 'tel1') {
  323. // $sql_where_and_arr[] = "w.`PAY_SALDO`<=-0.05";
  324. // $sql_where_and_arr[] = "w.`A_STATUS` in('wezwanie1', 'waiting-wezwanie2', 'wezwanie2', 'waiting-krd')";
  325. // $sql_where_and_arr[] = "( w.`LAST_PHONE_STATUS_DATE`='0000-00-00'
  326. // or w.`LAST_PHONE_STATUS_DATE`<DATE_SUB(NOW(), INTERVAL 3 MONTH) )";
  327. // }
  328. // else if ($filter_selected == 'bad_address') {
  329. // $sql_where_and_arr[] = "w.`BAD_ADDRESS`>0";
  330. // $sql_where_and_arr[] = "w.`PAY_SALDO`<=-0.05";
  331. // }
  332. // else if ($filter_selected == 'stan_zero') {
  333. // $sql_where_and_arr[] = "w.`A_STATUS`='WAITING'";
  334. // $sql_where_and_arr[] = "w.`PAY_SALDO`>-0.05";
  335. // }
  336. // else if ($filter_selected == '10-ego') {
  337. // $sql_where_and_arr[] = "w.`A_STATUS`='WAITING'";
  338. // $sql_where_and_arr[] = "w.`PAY_SALDO`<=-0.05";
  339. // }
  340. // else if ($filter_selected == 'has_nr_sad') {
  341. // $sql_where_and_arr[] = "w.`NR_SPRAWY_SAD`!=''";
  342. // }
  343. // else if ($filter_selected == 'has_nr_komornik') {
  344. // $sql_where_and_arr[] = "w.`NR_SPRAWY_KOMORNIK`!=''";
  345. // }
  346. // else if ($filter_selected == 'has_ustalenia') {
  347. // $sql_where_and_arr[] = "w.`L_APPOITMENT_INFO`!=''";
  348. // }
  349. // else if ($filter_selected == 'sad_and_komornik') {
  350. // $sql_where_and_arr[] = "w.`A_STATUS`='sad' and w.`NR_SPRAWY_KOMORNIK`!=''";
  351. // }
  352. // else if ($filter_selected == 'sad_bez_komornik') {
  353. // $sql_where_and_arr[] = "w.`A_STATUS`='sad' and w.`NR_SPRAWY_KOMORNIK`=''";
  354. // }
  355. // else if ($filter_selected == 'isMovedToVectra') {
  356. // $sql_where_and_arr[] = "w.`IS_MOVED_TO_VECTRA`=1";
  357. // }
  358. // else {
  359. // $sql_where_and_arr[] = "w.`A_STATUS`='{$filter_selected}'";
  360. // }
  361. 'Saldo' => $windykInfo['PAY_SALDO'],
  362. 'Termin ost. fv' => $windykInfo['PAY_DATE'], // Data wymagalności ostatniej faktury
  363. 'Zaległe faktury' => $windykInfo['PAY_FVAT'],
  364. 'Adresy usług' => $windykInfo['SERVICES_STREETS'],
  365. ];
  366. return UI::h('div', [], [
  367. UI::h('p', [ 'style' => "border-left:3px solid #ddd; padding-left:6px; font-weight:bold" ], [
  368. "Informacje o płatnościach",
  369. ($windykInfo['A_STATUS_UPDATE_DATE'] < date("Y-m-d"))
  370. ? UI::h('div', [ 'class' => "text-danger" ], [
  371. "Uwaga: Wymagają aktualizacji",
  372. " ",
  373. UI::h('em', [ 'class' => "text-muted" ], "(dane z {$windykInfo['A_STATUS_UPDATE_DATE']})"),
  374. // TODO: btn aktualizuj lub auto aktualizuj przed pokazaniem danych
  375. ])
  376. : "",
  377. ]),
  378. UI::h('table', [ 'class' => "table table-bordered", 'style' => "width:auto; background:#fff" ],
  379. array_map(function ($fieldName) use ($outWindykInfo) {
  380. return UI::h('tr', [], [
  381. UI::h('th', [], $fieldName),
  382. UI::h('td', [], $outWindykInfo[$fieldName]),
  383. ]);
  384. }, array_keys($outWindykInfo))
  385. ),
  386. UI::h('table', [ 'class' => "table table-bordered", 'style' => "width:auto; display:none; background:yellow" ],
  387. array_map(function ($fieldName) use ($windykInfo) {
  388. return UI::h('tr', [], [
  389. UI::h('th', [], $fieldName),
  390. UI::h('td', [], $windykInfo[$fieldName]),
  391. ]);
  392. }, array_keys($windykInfo))
  393. ),
  394. ]);
  395. }
  396. function viewHistContacts($idUser) {
  397. $lastHist = DB::getPDO()->fetchAll("
  398. select t.ID
  399. , t.ID_BILLING_USERS
  400. -- , t.CLIENT_INFO
  401. , t.A_STATUS
  402. -- , t.A_STATUS_INFO
  403. , t.L_APPOITMENT_USER
  404. , t.L_APPOITMENT_DATE
  405. , t.L_APPOITMENT_TYPE
  406. , t.L_APPOITMENT_INFO
  407. from USERS2_CONTACT t
  408. where t.ID_BILLING_USERS = :id
  409. limit 11
  410. ", [ ':id' => $idUser ]);
  411. UI::table([ 'caption' => "Historia kontaktów z klientem (TODO: w trakcie prac. Zobacz " .
  412. UI::h('a', [ 'href' => "index.php?MENU_INIT=USERS2_WINDYKACJA_STATUS&q=&_f=&_user_id={$idUser}" ], "Panel windykacji") .
  413. ")", 'rows' => $lastHist ]);
  414. // if (count($lastHist) > 10) UI::alert('info', "Przeglądaj wszystkie wpisy TODO: link to view table with ff_ID_BILLING_USERS");
  415. }
  416. function getUserInfo($idUser) {
  417. return DB::getPDO()->fetchFirst("
  418. select bua.`id_users`
  419. , bua.`id_users` as ID_BILLING_USERS
  420. , bua.`is_firma`
  421. , bua.`P_NAME`
  422. , bua.`P_NAME_SECOND`
  423. , bua.`P_NIP`
  424. , bua.`P_PESEL`
  425. , bua.`P_PHONE`
  426. , bua.`P_ADDRESS_REGION`
  427. , bua.`P_ADDRESS_CITY`
  428. , bua.`P_ADDRESS_POST_CODE`
  429. , bua.`P_ADDRESS_STREET`
  430. , bua.`P_ADDRESS_HOME`
  431. , bua.`P_ADDRESS_HOUSE`
  432. , bua.`user_mail_contact`
  433. , bu.`BILLING_OWNER`
  434. , ( select bo.name1 from BILLING_OWNER bo where bo.ID = bu.BILLING_OWNER ) as BILLING_OWNER_NAME
  435. from `BILLING_USERS_ADD` as bua
  436. left join `BILLING_USERS` as bu on ( bu.`ID` = bua.`id_users` )
  437. where bua.`id_users` = :id_user
  438. ", [ ':id_user' => $idUser ]);
  439. }
  440. function getWindykacjaInfo($idUser) {
  441. if ($this->_windykInfo) return $this->_windykInfo;
  442. $this->_windykInfo = $this->fetchWindykacjaInfo($idUser);
  443. if ($this->_windykInfo['A_STATUS_UPDATE_DATE'] < date("Y-m-d")) {
  444. Lib::loadClass('Windykacja_StatsModel');
  445. Lib::loadClass('Windykacja_StatsHelper');
  446. $user = Windykacja_StatsModel::get_user_by_id($idUser);
  447. if ($user) {
  448. $billing_docs = Windykacja_StatsModel::get_bill_dosc_by_date($user);
  449. Windykacja_StatsHelper::update_stats($user, $billing_docs);
  450. }
  451. $this->_windykInfo = $this->fetchWindykacjaInfo($idUser);
  452. }
  453. return $this->_windykInfo;
  454. }
  455. function fetchWindykacjaInfo($idUser) {
  456. return DB::getPDO()->fetchFirst("
  457. select t.`ID`
  458. , t.A_STATUS
  459. , t.A_STATUS_INFO
  460. , t.*
  461. from `USERS2_WINDYKACJA_STATUS` as t
  462. where t.`ID_BILLING_USERS` = :id_user
  463. ", [ ':id_user' => $idUser ]);
  464. }
  465. function prepareTable() {
  466. DB::getPDO()->execSql("
  467. CREATE TABLE IF NOT EXISTS `USERS2_CONTACT` (
  468. `ID` int(11) NOT NULL AUTO_INCREMENT,
  469. `ID_BILLING_USERS` int(11) NOT NULL DEFAULT '0',
  470. `CLIENT_INFO` varchar(255) NOT NULL DEFAULT '',
  471. `A_STATUS` enum('WAITING','NORMAL','DELETED') NOT NULL DEFAULT 'WAITING',
  472. `A_STATUS_INFO` varchar(255) NOT NULL,
  473. `L_APPOITMENT_DATE` date NOT NULL DEFAULT '0000-00-00',
  474. `L_APPOITMENT_USER` varchar(20) NOT NULL DEFAULT '',
  475. `L_APPOITMENT_PERIOD` varchar(4) NOT NULL,
  476. `L_APPOITMENT_INFO` varchar(255) NOT NULL,
  477. `L_APPOITMENT_TYPE` enum('','LIVE','TEL','MAIL','SMS','INNE') DEFAULT NULL,
  478. `A_RECORD_CREATE_DATE` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  479. `A_RECORD_CREATE_AUTHOR` varchar(20) NOT NULL DEFAULT '',
  480. `A_RECORD_UPDATE_DATE` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  481. `A_RECORD_UPDATE_AUTHOR` varchar(20) NOT NULL DEFAULT '',
  482. `A_PROBLEM` enum('','WARNING','PROBLEM','SERIOUS','UNVERIFIED') DEFAULT NULL,
  483. `A_PROBLEM_DESC` varchar(255) NOT NULL DEFAULT '',
  484. `A_PROBLEM_DATE` varchar(30) NOT NULL DEFAULT '',
  485. `T_WORKPOINTS` varchar(100) NOT NULL DEFAULT '',
  486. `T_WORKPOINTS_VALUE` varchar(100) NOT NULL DEFAULT '',
  487. `T_WORKPOINTS_TYPE` varchar(100) NOT NULL DEFAULT '',
  488. `T_WORKPOINTS_USER` varchar(100) NOT NULL DEFAULT '',
  489. `T_WORKPOINTS_DATE` varchar(100) NOT NULL DEFAULT '',
  490. `A_CLASSIFIED` varchar(100) NOT NULL DEFAULT '',
  491. `A_ADM_COMPANY` varchar(100) NOT NULL DEFAULT '',
  492. `ROZLICZ_MONTH` date NOT NULL DEFAULT '0000-00-00',
  493. `ROZLICZ_CONFIRM` int(11) NOT NULL DEFAULT '0',
  494. `SALDO` decimal(10,2) NOT NULL DEFAULT '0.00',
  495. `ILE_ODZYSKANO` decimal(10,2) NOT NULL DEFAULT '0.00',
  496. PRIMARY KEY (`ID`)
  497. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  498. ");
  499. DB::getPDO()->execSql("
  500. CREATE TABLE IF NOT EXISTS `USERS2_CONTACT_HIST` (
  501. `ID` int(11) NOT NULL AUTO_INCREMENT,
  502. `ID_USERS2` int(11) NOT NULL,
  503. `ID_BILLING_USERS` varchar(11) NOT NULL DEFAULT 'N/S;',
  504. `CLIENT_INFO` varchar(255) NOT NULL DEFAULT 'N/S;',
  505. `A_STATUS` varchar(32) NOT NULL DEFAULT 'N/S;',
  506. `A_STATUS_INFO` varchar(255) NOT NULL DEFAULT 'N/S;',
  507. `L_APPOITMENT_DATE` varchar(20) NOT NULL DEFAULT 'N/S;',
  508. `L_APPOITMENT_USER` varchar(20) NOT NULL DEFAULT 'N/S;',
  509. `L_APPOITMENT_PERIOD` varchar(4) NOT NULL DEFAULT 'N/S;',
  510. `L_APPOITMENT_INFO` varchar(255) NOT NULL DEFAULT 'N/S;',
  511. `L_APPOITMENT_TYPE` varchar(16) NOT NULL DEFAULT 'N/S;',
  512. `A_RECORD_CREATE_DATE` varchar(20) NOT NULL DEFAULT 'N/S;',
  513. `A_RECORD_CREATE_AUTHOR` varchar(20) NOT NULL DEFAULT 'N/S;',
  514. `A_RECORD_UPDATE_DATE` varchar(20) NOT NULL DEFAULT 'N/S;',
  515. `A_RECORD_UPDATE_AUTHOR` varchar(20) NOT NULL DEFAULT 'N/S;',
  516. `A_PROBLEM` varchar(16) NOT NULL DEFAULT 'N/S;',
  517. `A_PROBLEM_DESC` varchar(255) NOT NULL DEFAULT 'N/S;',
  518. `A_PROBLEM_DATE` varchar(30) NOT NULL DEFAULT 'N/S;',
  519. `T_WORKPOINTS` varchar(100) NOT NULL DEFAULT 'N/S;',
  520. `T_WORKPOINTS_VALUE` varchar(100) NOT NULL DEFAULT 'N/S;',
  521. `T_WORKPOINTS_TYPE` varchar(100) NOT NULL DEFAULT 'N/S;',
  522. `T_WORKPOINTS_USER` varchar(100) NOT NULL DEFAULT 'N/S;',
  523. `T_WORKPOINTS_DATE` varchar(100) NOT NULL DEFAULT 'N/S;',
  524. `A_CLASSIFIED` varchar(100) NOT NULL DEFAULT 'N/S;',
  525. `A_ADM_COMPANY` varchar(100) NOT NULL DEFAULT 'N/S;',
  526. `ROZLICZ_MONTH` varchar(20) NOT NULL DEFAULT 'N/S;',
  527. `ROZLICZ_CONFIRM` varchar(11) NOT NULL DEFAULT 'N/S;',
  528. `SALDO` varchar(11) NOT NULL DEFAULT 'N/S;',
  529. `ILE_ODZYSKANO` varchar(11) NOT NULL DEFAULT 'N/S;',
  530. PRIMARY KEY (`ID`),
  531. KEY `ID_USERS2` (`ID_USERS2`)
  532. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  533. ");
  534. }
  535. }