UserSaldoAfterContact.php 21 KB

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