VM暫存
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Admins_model.php 31KB

8 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896
  1. <?php
  2. /*
  3. file: Admins_model.php
  4. */
  5. class Admins_model extends CI_Model
  6. {
  7. var $vars = array();
  8. function __construct()
  9. {
  10. parent::__construct();
  11. $this->load->database();
  12. $this->now_str = date('Y-m-d H:i:s');
  13. $this->default_valid_time = date('Y-m-d H:i:s', strtotime("{$this->now_str} + 2 days")); // 2016/12/15 新增有效期限 (預設為兩天)
  14. }
  15. public function init($vars)
  16. {
  17. $this->vars = $vars;
  18. }
  19. // 付款
  20. public function login_verify($login_name, $login_pswd)
  21. {
  22. $rows = $this->db->select('count(*) as ok')
  23. ->from('staffs')
  24. ->where(array('login_name' => $login_name, 'pswd' => md5($login_pswd)))
  25. ->get()
  26. ->row_array();
  27. return $rows['ok'];
  28. }
  29. // 讀出各初始值至web
  30. public function get_init_vars()
  31. {
  32. $st_info = $this->vars['mcache']->get('st_info');
  33. // 路徑初始值
  34. $str = "var APP_URL = '". APP_URL . "';\n".
  35. "var WEB_LIB = '" . WEB_LIB . "';\n".
  36. "var BOOTSTRAPS = '" . BOOTSTRAPS . "';\n".
  37. "var WEB_SERVICE = '" . WEB_SERVICE . "';\n".
  38. "var station_no ={$st_info['station_no']};\n".
  39. "var company_no = {$st_info['company_no']};\n".
  40. "var xvars = new Array();\n".
  41. "xvars['ck'] = 'NOLOGIN';\n";
  42. // 讀出場站資訊
  43. $str .= "var st = new Array();\n";
  44. $str .= "st[" . STATION_NO . "]=\"" . STATION_NAME . "\";\n";
  45. /*
  46. $results = $this->db->select('station_no, short_name')
  47. ->from('stations')
  48. ->order_by('station_no', 'asc')
  49. ->get()
  50. ->result_array();
  51. $str .= "var st = new Array();\n";
  52. foreach($results as $rows)
  53. {
  54. $str .= "st[{$rows['station_no']}]=\"{$rows['short_name']}\";\n";
  55. }
  56. */
  57. // 讀出時段表資訊
  58. $str .= "var pt = new Array();\n"; // park_time
  59. foreach($this->vars['mcache']->get('pt') as $key => $rows)
  60. {
  61. $str .= "pt['{$key}']={'seqno':{$rows['seqno']},'remarks':'{$rows['remarks']}'};\n";
  62. }
  63. /*
  64. // 讀取繳期名稱
  65. $rows = $this->db->select('period_name')
  66. ->from('info')
  67. ->where('seqno', 1)
  68. ->get()
  69. ->row_array();
  70. $str .= "var period_name=Array();\nperiod_name={$rows['period_name']};\n";
  71. */
  72. // 篩選會員身份及繳期資訊
  73. $info = $this->vars['mcache']->get('info');
  74. $str .= "var period_name=Array();\n";
  75. foreach($info['period_name'] as $idx => $rows)
  76. {
  77. $str .= "period_name[{$idx}]=\"{$rows}\";\n";
  78. }
  79. $str .= "var mem_attr = new Array();\n";
  80. foreach($info['member_attr'] as $idx => $rows)
  81. {
  82. $str .= "mem_attr[{$idx}]=\"{$rows}\";\n";
  83. }
  84. return $str;
  85. }
  86. /*
  87. // 停車時段資訊
  88. public function park_time()
  89. {
  90. $data = array();
  91. $idx = 0;
  92. // $results = $this->db->select('time_id, seqno, park_type, week_start, week_end, daytime_start, daytime_end, remarks')
  93. $results = $this->db->select('time_id, seqno, timex, remarks')
  94. ->from('park_time')
  95. ->order_by('seqno', 'asc')
  96. ->get()
  97. ->result_array();
  98. foreach($results as $rows)
  99. {
  100. $data[$idx] = array
  101. (
  102. 'time_id' => $rows['time_id'],
  103. 'seqno' => $rows['time_id'],
  104. 'remarks' => $rows['remarks']
  105. );
  106. ++$idx;
  107. }
  108. return $results;
  109. }
  110. // 停車時段資訊單筆刪除
  111. public function park_time_delete($time_id)
  112. {
  113. $this->db->delete('park_time', array('time_id' => $time_id));
  114. return true;
  115. }
  116. */
  117. // 會員清單
  118. public function member_query_all()
  119. {
  120. $sql = "
  121. SELECT
  122. MIN(CONCAT(member_tx.tx_no, member_tx.verify_state)) as tx_order,
  123. members.member_no,
  124. members.lpr,
  125. members.etag,
  126. members.member_name,
  127. members.mobile_no,
  128. members.start_date,
  129. members.end_date,
  130. members.fee_period,
  131. members.member_attr,
  132. members.suspended,
  133. members.contract_no,
  134. members.amt,
  135. member_tx.tx_no,
  136. member_tx.verify_state,
  137. member_tx.valid_time,
  138. member_tx.remarks
  139. FROM member_tx
  140. LEFT JOIN members ON member_tx.member_no = members.member_no
  141. WHERE
  142. members.member_no IS NOT NULL
  143. GROUP BY member_tx.member_no
  144. ORDER BY members.lpr ASC
  145. ";
  146. $results = $this->db->query($sql)->result_array();
  147. return $results;
  148. }
  149. // 待審核清單
  150. public function member_tx_check()
  151. {
  152. $sql = "
  153. SELECT
  154. members.lpr as current_lpr,
  155. member_tx.lpr,
  156. member_tx.tx_no,
  157. member_tx.station_no,
  158. member_tx.member_no,
  159. member_tx.fee_period,
  160. member_tx.fee_period_last,
  161. member_tx.amt1,
  162. member_tx.amt,
  163. member_tx.amt_last,
  164. member_tx.deposit,
  165. date_format(member_tx.start_date,'%Y-%m-%d') as start_date,
  166. date_format(member_tx.end_date,'%Y-%m-%d') as end_date,
  167. date_format(member_tx.start_date_last,'%Y-%m-%d') as start_date_last,
  168. date_format(member_tx.end_date_last,'%Y-%m-%d') as end_date_last,
  169. member_tx.member_company_no,
  170. member_tx.company_no,
  171. member_tx.acc_date,
  172. member_tx.invoice_no,
  173. member_tx.invoice_amt,
  174. member_tx.invoice_track,
  175. member_tx.invoice_time,
  176. member_tx.invoice_type,
  177. member_tx.verify_state,
  178. member_tx.valid_time,
  179. member_tx.remarks
  180. FROM member_tx
  181. LEFT JOIN members ON (member_tx.member_no = members.member_no AND members.station_no = member_tx.station_no)
  182. WHERE member_tx.verify_state != 1
  183. ORDER BY member_tx.valid_time ASC
  184. ";
  185. $results = $this->db->query($sql)->result_array();
  186. return $results;
  187. }
  188. // 會員查詢
  189. public function member_query($station_no, $q_item, $q_str)
  190. {
  191. $where_station = $station_no == 0 ? '' : " station_no = {$station_no} and "; // 如為0, 則全部塲站讀取
  192. switch($q_item)
  193. {
  194. case 'end_date':
  195. $items = "{$q_item} <=";
  196. $q_str .= ' 23:59:59';
  197. break;
  198. case 'lpr':
  199. $items = "{$q_item} like ";
  200. $q_str = strtoupper($q_str).'%';
  201. break;
  202. default:
  203. $items = "{$q_item} like ";
  204. $q_str .= '%';
  205. break;
  206. }
  207. $sql = "select
  208. station_no,
  209. member_no,
  210. lpr,
  211. member_name,
  212. mobile_no,
  213. date_format(demonth_start_date,'%Y-%m-%d') as demonth_start_date,
  214. date_format(demonth_end_date,'%Y-%m-%d') as demonth_end_date,
  215. date_format(start_date,'%Y-%m-%d') as start_date,
  216. date_format(end_date,'%Y-%m-%d') as end_date,
  217. date_format(rent_start_date,'%Y-%m-%d') as rent_start_date,
  218. contract_no,
  219. coalesce(etag, '') as etag,
  220. fee_period1,
  221. fee_period,
  222. amt1,
  223. amt,
  224. if(member_company_no > 0, member_company_no, '') as member_company_no,
  225. if(company_no > 0, company_no, '') as company_no,
  226. coalesce(member_attr, 1) as member_attr,
  227. deposit,
  228. park_time,
  229. coalesce(member_id, '') as member_id,
  230. coalesce(tel_o, '') as tel_o,
  231. coalesce(tel_h, '') as tel_h,
  232. coalesce(addr, '') as addr,
  233. suspended
  234. from members
  235. where {$where_station} {$items} '{$q_str}'";
  236. $results = $this->db->query($sql)->result_array();
  237. return $results;
  238. }
  239. // 交易查詢
  240. public function member_tx_query($station_no, $member_no)
  241. {
  242. $sql = "select
  243. tx_no, station_no,
  244. member_no,
  245. lpr,
  246. fee_period,
  247. fee_period_last,
  248. amt1,
  249. amt,
  250. amt_last,
  251. deposit,
  252. date_format(start_date,'%Y-%m-%d') as start_date,
  253. date_format(end_date,'%Y-%m-%d') as end_date,
  254. date_format(start_date_last,'%Y-%m-%d') as start_date_last,
  255. date_format(end_date_last,'%Y-%m-%d') as end_date_last,
  256. member_company_no,
  257. company_no,
  258. acc_date,
  259. invoice_no,
  260. invoice_amt,
  261. invoice_track,
  262. invoice_time,
  263. invoice_type,
  264. verify_state,
  265. valid_time,
  266. remarks
  267. from member_tx
  268. where station_no = {$station_no} and member_no = {$member_no}
  269. order by tx_no desc";
  270. $results = $this->db->query($sql)->result_array();
  271. return $results;
  272. }
  273. // 審核完成
  274. public function member_tx_confirmed($parms)
  275. {
  276. $this->try_sync_batch($parms['station_no']); // 同步未同步記錄
  277. $altob_admin_submit = $this->input->post('altob_admin_submit', true); // 取得 admin 參數
  278. if($altob_admin_submit !== $this->gen_admin_ck($parms['station_no']))
  279. {
  280. trigger_error(__FUNCTION__ . '..altob_admin_submit error..' . print_r($parms, true));
  281. return 'admin_error'; // 中斷
  282. }
  283. $data_tx = array('verify_state' => $parms['verify_state'], 'valid_time' => $parms['valid_time'], 'remarks' => $parms['remarks']);
  284. // [A.開始]
  285. $this->db->trans_start();
  286. $this->db->update('member_tx', $data_tx, array('station_no' => $parms['station_no'], 'tx_no' => $parms['tx_no'])); // t1. 更新 member_tx.verify_state, member_tx.valid_time, member_tx.remarks
  287. // [B.建立同步檔]
  288. $sync_seqnos = $this->prepare_sync2hq('U', $parms['station_no'], 'member_tx', $parms['tx_no'], $data_tx); // t2. 準備同步檔 (member_tx)
  289. // [C.完成]
  290. $this->db->trans_complete();
  291. if ($this->db->trans_status() === FALSE)
  292. {
  293. trigger_error(__FUNCTION__ . '|'.print_r($data_tx, true) . '..trans_error..');
  294. return 'fail'; // 中斷
  295. }
  296. $this->worker_tx('sync_batch', array('sync_seqnos' => $sync_seqnos));
  297. return 'ok';
  298. }
  299. // 刪除月租會員
  300. public function member_delete($station_no, $member_no)
  301. {
  302. $this->try_sync_batch($station_no); // 同步未同步記錄
  303. // [A.開始]
  304. $this->db->trans_start();
  305. $this->db->delete('members', array('station_no' => $station_no, 'member_no' => $member_no, 'suspended' => 0)); // t1. 刪除 members
  306. $this->db->delete('member_car', array('station_no' => $station_no, 'member_no' => $member_no)); // t2. 刪除 member_car
  307. // [B.建立同步檔]
  308. $sync_seqnos = $this->prepare_sync2hq('D', $station_no, 'members', $member_no, array()); // t3. 準備同步檔 (members)
  309. // [C.完成]
  310. $this->db->trans_complete();
  311. if ($this->db->trans_status() === FALSE)
  312. {
  313. trigger_error(__FUNCTION__ . ": {$station_no}, {$member_no}, trans_error..");
  314. return 'trans_error';
  315. }
  316. // 同步至總管理處
  317. $this->worker_tx('sync_batch', array('sync_seqnos' => $sync_seqnos));
  318. return 'ok';
  319. }
  320. // 月租會員加入
  321. public function member_add($data)
  322. {
  323. $data['lpr'] = preg_replace('/\s+/', '', $data['lpr']); // 移除空白
  324. $check_member_no = $data['member_no'];
  325. $station_no = $data['station_no'];
  326. $tx_no = 0;
  327. $this->try_sync_batch($station_no); // 同步未同步記錄
  328. // 會員車輛基本資料檔
  329. $start_date = (empty($data['demonth_start_date']) ? $data['start_date'] : $data['demonth_start_date']);
  330. $data['rent_start_date'] = $data['start_date'];
  331. $data['rent_end_date'] = $data['end_date'];
  332. $data['start_date'] = "{$start_date} 00:00:00";
  333. $data['end_date'] = "{$data['end_date']} 23:59:59";
  334. $old_lpr = $data['old_lpr'];
  335. unset($data['old_lpr']);
  336. $data_car = array
  337. (
  338. 'lpr' => $data['lpr'],
  339. 'lpr_correct' => $data['lpr'],
  340. 'etag' => $data['etag'],
  341. 'station_no' => $station_no,
  342. 'start_time' => $data['start_date'],
  343. 'end_time' => $data['end_date']
  344. );
  345. if ($check_member_no == 0) // 新增一筆會員資料
  346. {
  347. unset($data['member_no']);
  348. $data['payed_date'] = substr($this->now_str, 0, 10);
  349. $data['login_id'] = $data['lpr'];
  350. $data['passwd'] = $data['lpr'];
  351. $action_code = 'A';
  352. // [A.開始]
  353. $this->db->trans_start();
  354. $this->db->insert('members', $data); // t1 新增 members
  355. $members_insert_id = $this->db->insert_id();
  356. $data_car['member_no'] = $members_insert_id; // t2. 新增 member_car
  357. $this->db->insert('member_car', $data_car);
  358. $data['member_no'] = $members_insert_id;
  359. $data_bill = array(
  360. 'member_no' => $members_insert_id, // 會員編號
  361. 'station_no' => $station_no, // 場站編號
  362. 'lpr' => $data['lpr'], // 車牌號碼
  363. 'amt_accrued' => $data['amt_accrued'], // 應收租金
  364. 'amt_tot' => $data['amt_tot'], // 實收租金
  365. 'deposit' => $data['deposit'], // 押金
  366. 'amt' => $data['amt'], // 本期租金
  367. 'fee_period' => $data['fee_period'], // 本期繳期
  368. 'start_date' => $data['rent_start_date'], // 本期開始日
  369. 'end_date' => $data['rent_end_date'], // 本期結束日
  370. 'amt1' => $data['amt1'], // 首期租金
  371. 'amt_last' => $data['amt1'], // 上期租金
  372. 'fee_period_last' => $data['fee_period1'], // 上期繳期
  373. 'start_date_last' => $data['demonth_start_date'], // 上期開始日
  374. 'end_date_last' => $data['demonth_end_date'] // 上期結束日
  375. );
  376. $this->db->insert('member_bill', $data_bill); // t3 新增 member_bill
  377. $bill_no = $this->db->insert_id(); // 帳單序號
  378. $data_tx = array(
  379. 'bill_no' => $bill_no, // 帳單序號
  380. 'member_no' => $members_insert_id, // 會員編號
  381. 'station_no' => $station_no, // 場站編號
  382. 'sync_no' => 0, // 預設同步編號
  383. 'lpr' => $data['lpr'], // 車牌號碼
  384. 'amt_accrued' => $data['amt_accrued'], // 應收租金
  385. 'amt_tot' => $data['amt_tot'], // 實收租金
  386. 'deposit' => $data['deposit'], // 押金
  387. 'amt' => $data['amt'], // 本期租金
  388. // todo: 2016/12/23 只要超過季繳金額就拆開, 後續再由待開發票開立
  389. 'fee_period' => $data['fee_period'], // 本期繳期
  390. 'start_date' => $data['rent_start_date'], // 本期開始日
  391. 'end_date' => $data['rent_end_date'], // 本期結束日
  392. 'amt1' => $data['amt1'], // 首期租金
  393. 'amt_last' => $data['amt1'], // 上期租金
  394. 'fee_period_last' => $data['fee_period1'], // 上期繳期
  395. 'start_date_last' => $data['demonth_start_date'], // 上期開始日
  396. 'end_date_last' => $data['demonth_end_date'], // 上期結束日
  397. 'member_company_no' => $data['member_company_no'], // 買方統編
  398. 'company_no' => $data['company_no'], // 賣方統編
  399. 'acc_date' => $data['payed_date'], // 入帳日(暫定)
  400. 'valid_time' => $this->default_valid_time // 有效期限
  401. );
  402. $this->db->insert('member_tx', $data_tx); // t4 新增 member_tx
  403. $tx_no = $this->db->insert_id(); // 交易序號
  404. $data_tx['tx_no'] = $tx_no;
  405. // [B.建立同步檔]
  406. $sync_seqnos = $this->prepare_sync2hq($action_code, $station_no, 'members', $members_insert_id, $data); // t5 準備同步檔 (members)
  407. $sync_seqnos .= ',' . $this->prepare_sync2hq($action_code, $station_no, 'member_bill', $bill_no, $data_bill); // t6 準備同步檔 (member_bill)
  408. $sync_seqnos .= ',' . $this->prepare_sync2hq($action_code, $station_no, 'member_tx', $tx_no, $data_tx); // t7 準備同步檔 (member_tx)
  409. // [C.完成]
  410. $this->db->trans_complete();
  411. if ($this->db->trans_status() === FALSE)
  412. {
  413. trigger_error(__FUNCTION__ . '..trans_error..' . print_r($data, true));
  414. return 'trans_error';
  415. }
  416. // 同步至總管理處
  417. $this->worker_tx('sync_batch', array('sync_seqnos' => $sync_seqnos));
  418. }
  419. else
  420. {
  421. $altob_admin_submit = $this->input->post('altob_admin_submit', true); // 取得 admin 參數
  422. if($altob_admin_submit == $this->gen_admin_ck($station_no))
  423. {
  424. trigger_error("admin: " + $altob_admin_submit);
  425. //unset($data['contract_no']); // 合約號
  426. //unset($data['park_time']); // 停車時段
  427. unset($data['rent_start_date']);
  428. unset($data['rent_end_date']);
  429. unset($data['start_date']);
  430. unset($data['end_date']);
  431. unset($data['demonth_start_date']);
  432. unset($data['demonth_end_date']);
  433. unset($data['member_attr']);
  434. unset($data['deposit']);
  435. unset($data['amt_tot']);
  436. unset($data['amt_accrued']);
  437. unset($data['fee_period1']);
  438. unset($data['amt1']);
  439. //unset($data['fee_period']); // 例行繳期
  440. //unset($data['amt']); // 例行租金
  441. }
  442. else
  443. {
  444. // 一般情況下, 時段與費率都不能在這個流程修改
  445. //unset($data['contract_no']); // 合約號
  446. unset($data['park_time']);
  447. unset($data['rent_start_date']);
  448. unset($data['rent_end_date']);
  449. unset($data['start_date']);
  450. unset($data['end_date']);
  451. unset($data['demonth_start_date']);
  452. unset($data['demonth_end_date']);
  453. unset($data['member_attr']);
  454. unset($data['deposit']);
  455. unset($data['amt_tot']);
  456. unset($data['amt_accrued']);
  457. unset($data['fee_period1']);
  458. unset($data['amt1']);
  459. unset($data['fee_period']);
  460. unset($data['amt']);
  461. }
  462. $action_code = 'U';
  463. // [A.開始]
  464. $this->db->trans_start();
  465. $this->db->update('members', $data, array('station_no' => $station_no, 'member_no' => $check_member_no)); // t1. 更新 members
  466. // 沒有異動到車牌, 使用update, 否則重建一筆
  467. if ($old_lpr == $data['lpr']) // t2. 更新 member_car
  468. {
  469. unset($data_car['lpr']);
  470. unset($data_car['lpr_correct']);
  471. $this->db->update('member_car', $data_car, array('station_no' => $station_no, 'member_no' => $check_member_no));
  472. }
  473. else
  474. {
  475. $this->db->delete('member_car', array('station_no' => $station_no, 'member_no' => $check_member_no));
  476. $data_car['member_no'] = $check_member_no;
  477. $this->db->insert('member_car', $data_car);
  478. }
  479. // [B.建立同步檔]
  480. $sync_seqnos = $this->prepare_sync2hq($action_code, $station_no, 'members', $check_member_no, $data); // t3. 準備同步檔 (members)
  481. // [C.完成]
  482. $this->db->trans_complete();
  483. if ($this->db->trans_status() === FALSE)
  484. {
  485. trigger_error(__FUNCTION__ . '..trans_error..' . print_r($data, true));
  486. return 'trans_error';
  487. }
  488. // 同步至總管理處
  489. $this->worker_tx('sync_batch', array('sync_seqnos' => $sync_seqnos));
  490. }
  491. return array(
  492. 'station_no' => $station_no,
  493. 'company_no' => $data['company_no'],
  494. 'member_no' => $data['member_no'],
  495. 'start_date' => $start_date,
  496. 'msg' => 'ok',
  497. 'action_code' => $action_code,
  498. 'tx_no' => $tx_no);
  499. }
  500. // 查詢車牌是否重複
  501. public function check_lpr($lpr)
  502. {
  503. $rows = $this->db->select('count(*) as counts')
  504. ->from('members')
  505. ->where(array('lpr' => $lpr))
  506. ->get()
  507. ->row_array();
  508. return $rows['counts'];
  509. }
  510. // 取得交易發票
  511. public function get_tx_invoice_no($tx_no)
  512. {
  513. $rows = $this->db->select('invoice_no')
  514. ->from('member_tx')
  515. ->where(array('tx_no' => $tx_no))
  516. ->get()
  517. ->row_array();
  518. return $rows['invoice_no'];
  519. }
  520. // 更新月租發票記錄
  521. public function set_tx_invoice_no($parms)
  522. {
  523. $data = array
  524. (
  525. 'member_company_no' => $parms['member_company_no'],
  526. 'company_no' => $parms['company_no'],
  527. 'invoice_track' => $parms['invoice_track'],
  528. 'invoice_no' => $parms['invoice_no'],
  529. 'invoice_amt' => $parms['invoice_amt'],
  530. 'invoice_time' => $parms['invoice_time']
  531. );
  532. if(array_key_exists('invoice_type', $parms))
  533. {
  534. $data['invoice_type'] = $parms['invoice_type']; // 發票種類
  535. }
  536. // [A.開始]
  537. $this->db->trans_start();
  538. $this->db->update('member_tx', $data, array('station_no' => $parms['station_no'], 'tx_no' => $parms['tx_no'])); // t1. 更新 member_tx
  539. // [B.建立同步檔]
  540. $sync_seqnos = $this->prepare_sync2hq('U', $parms['station_no'], 'member_tx', $parms['tx_no'], $data); // t2. 準備同步檔
  541. // [C.完成]
  542. $this->db->trans_complete();
  543. if ($this->db->trans_status() === FALSE)
  544. {
  545. trigger_error(__FUNCTION__ . '|'.print_r($data, true) . '..trans_error..');
  546. return 'fail'; // 中斷
  547. }
  548. // 同步至總管理處
  549. $this->worker_tx('sync_batch', array('sync_seqnos' => $sync_seqnos));
  550. return 'ok';
  551. }
  552. // 首期月租付款交易
  553. public function first_rents_payment($parms)
  554. {
  555. $this->try_sync_batch($parms['station_no']); // 同步未同步記錄
  556. // 確認交易記錄
  557. $rows = $this->db->select('count(*) as counts')
  558. ->from('member_tx')
  559. ->where(array('tx_no' => $parms['tx_no'],
  560. 'station_no' => $parms['station_no'], 'member_no' => $parms['member_no'],
  561. 'amt' => $parms['amt'], 'amt1' => $parms['amt1']))
  562. ->get()
  563. ->row_array();
  564. if(empty($rows) || $rows['counts'] != 1)
  565. {
  566. trigger_error(__FUNCTION__ . '..tx gg..' . print_r($parms, true));
  567. return 'tx_error'; // 中斷
  568. }
  569. // 印發票
  570. $parms['invoice_amt'] = $parms['amt'] + $parms['amt1']; // 例行租金 + 首期租金
  571. if(array_key_exists('invoice_track', $parms) && array_key_exists('invoice_no', $parms))
  572. {
  573. $parms['invoice_time'] = date('Y-m-d H:i:s'); // 目前時間
  574. }
  575. else
  576. {
  577. $invoice_result = $this->print_invoice($parms);
  578. if(!empty($invoice_result) && array_key_exists('einvoice_no', $invoice_result))
  579. {
  580. $parms['invoice_track'] = $invoice_result['einvoice_track']; // 發票字軌
  581. $parms['invoice_no'] = $invoice_result['einvoice_no']; // 發票號碼
  582. $parms['invoice_time'] = date('Y-m-d H:i:s'); // 目前時間
  583. }
  584. }
  585. if(empty($parms['invoice_no']) || empty($parms['invoice_track']))
  586. {
  587. trigger_error(__FUNCTION__ . '..invoice gg..' . print_r($parms, true));
  588. return 'invoice_fail'; // 中斷
  589. }
  590. // 更新月租發票記錄
  591. echo $this->set_tx_invoice_no($parms);
  592. }
  593. // 新增月租付款交易
  594. public function rents_payment($parms)
  595. {
  596. $this->try_sync_batch($parms['station_no']); // 同步未同步記錄
  597. //$parms['start_date'] = $parms['start_date_last'];
  598. // 印發票
  599. $parms['invoice_amt'] = $parms['amt']; // 例行租金
  600. if(array_key_exists('invoice_track', $parms) && array_key_exists('invoice_no', $parms))
  601. {
  602. $parms['invoice_time'] = date('Y-m-d H:i:s'); // 目前時間
  603. }
  604. else
  605. {
  606. $invoice_result = $this->print_invoice($parms);
  607. if(!empty($invoice_result) && array_key_exists('einvoice_no', $invoice_result))
  608. {
  609. $parms['invoice_track'] = $invoice_result['einvoice_track']; // 發票字軌
  610. $parms['invoice_no'] = $invoice_result['einvoice_no']; // 發票號碼
  611. $parms['invoice_time'] = date('Y-m-d H:i:s'); // 目前時間
  612. }
  613. if(empty($parms['invoice_no']) || empty($parms['invoice_track']))
  614. {
  615. trigger_error(__FUNCTION__ . '..invoice gg..' . print_r($parms, true));
  616. //return 'invoice_fail';
  617. }
  618. }
  619. $parms['sync_no'] = 0; // 預設同步編號
  620. $parms['fee_period_last'] = $parms['fee_period']; // 上期繳期
  621. $parms['start_date'] = date('Y-m-d', strtotime("{$parms['end_date_last']} first day of next month")); // 本期開始日:上期結束日之次月首日
  622. $parms['acc_date'] = date('Y-m-d'); // 入帳日(暫定)
  623. $parms['valid_time'] = $this->default_valid_time; // 有效期限
  624. // [A.開始]
  625. $this->db->trans_start();
  626. $this->db->insert('member_tx', $parms); // t1. 新增 member_tx
  627. $tx_no = $this->db->insert_id(); // 交易序號
  628. $data = $parms;
  629. $data['tx_no'] = $tx_no;
  630. $data_member = array(
  631. 'fee_period' => $parms['fee_period'],
  632. 'payed_date' => substr($parms['invoice_time'], 0, 10),
  633. 'start_date' => "{$parms['start_date_last']} 00:00:00", // 開始日:由上期繼續延續下去
  634. 'end_date' => "{$parms['end_date']} 23:59:59" // 結束日
  635. );
  636. $this->db->update('members', $data_member, array('station_no' => $parms['station_no'], 'member_no' => $parms['member_no'])); // t2. 更新 members
  637. $this->db->update('member_car', // t5. 更新 member_car
  638. array('start_time' => "{$data_member['start_date']} 00:00:00", 'end_time' => "{$data_member['end_date']} 23:59:59"),
  639. array('station_no' => $parms['station_no'], 'member_no' => $parms['member_no']));
  640. // [B.準備同步檔]
  641. $sync_seqnos = $this->prepare_sync2hq('A', $parms['station_no'], 'member_tx', $tx_no, $data); // t2. 準備同步檔
  642. $sync_seqnos .= ',' . $this->prepare_sync2hq('U', $parms['station_no'], 'members', $parms['member_no'], $data_member); // t4. 準備同步檔
  643. // [c.完成]
  644. $this->db->trans_complete();
  645. if ($this->db->trans_status() === FALSE)
  646. {
  647. trigger_error(__FUNCTION__ . '|'.print_r($data, true) . '..trans_error..');
  648. return 'fail'; // 中斷
  649. }
  650. // 同步至總管理處
  651. $this->worker_tx('sync_batch', array('sync_seqnos' => $sync_seqnos));
  652. return 'ok';
  653. }
  654. // 停權或啟動
  655. public function suspended($parms)
  656. {
  657. $this->try_sync_batch($parms['station_no']); // 同步未同步記錄
  658. $altob_admin_submit = $this->input->post('altob_admin_submit', true); // 取得 admin 參數
  659. if($altob_admin_submit !== $this->gen_admin_ck($parms['station_no']))
  660. {
  661. trigger_error(__FUNCTION__ . '..altob_admin_submit error..' . print_r($parms, true));
  662. return 'admin_error'; // 中斷
  663. }
  664. $data = array('suspended' => $parms['suspended']);
  665. // [A.開始]
  666. $this->db->trans_start();
  667. $this->db->update('members', $data, array('station_no' => $parms['station_no'], 'member_no' => $parms['member_no'])); // t1. 更新 member.suspended
  668. // [B.準備同步檔]
  669. $sync_seqnos = $this->prepare_sync2hq('U', $parms['station_no'], 'members', $parms['member_no'], $data); // t2. 準備同步檔
  670. // [C.完成]
  671. $this->db->trans_complete();
  672. if ($this->db->trans_status() === FALSE)
  673. {
  674. trigger_error(__FUNCTION__ . '|'.print_r($data, true) . '..trans_error..');
  675. return 'fail'; // 中斷
  676. }
  677. // 同步至總管理處
  678. $this->worker_tx('sync_batch', array('sync_seqnos' => $sync_seqnos));
  679. return 'ok';
  680. }
  681. // 同步未同步記錄
  682. public function try_sync_batch($station_no, $limit=5)
  683. {
  684. $sql = "select st_sync_no
  685. from syncs
  686. where synced = 0 and erred = 0 and station_no = {$station_no}
  687. order by st_sync_no ASC
  688. limit {$limit}";
  689. $results = $this->db->query($sql)->result_array();
  690. if(empty($results)) return false; // do nothing
  691. $sync_seqnos = '';
  692. foreach($results as $rows)
  693. {
  694. $sync_seqnos .= ',' . $rows['st_sync_no'];
  695. }
  696. $sync_seqnos = ltrim($sync_seqnos, ',');
  697. trigger_error(__FUNCTION__ . '|' . $sync_seqnos);
  698. // 同步至總管理處
  699. $this->worker_tx('sync_batch', array('sync_seqnos' => $sync_seqnos));
  700. }
  701. // 同步至總公司
  702. function prepare_sync2hq($act, $station_no, $st_tname, $st_seqno, $data)
  703. {
  704. $data_syncs = array
  705. (
  706. 'station_no' => $station_no,
  707. 'synced' => 0, // 尚未同步
  708. 'erred' => 0,
  709. 'act' => $act, // A:新增, U:修改, D:刪除
  710. 'hq_tname' => 'hq_'.$st_tname,
  711. 'st_tname' => $st_tname, // 場站資料表
  712. 'st_seqno' => $st_seqno, // 場站交易序號
  713. 'sync_data' => json_encode($data, JSON_UNESCAPED_UNICODE)
  714. );
  715. $this->db->insert('syncs', $data_syncs);
  716. return $this->db->insert_id();
  717. }
  718. // curl送收資料
  719. function worker_tx($cmd, $data)
  720. {
  721. try
  722. {
  723. $ch = curl_init();
  724. $curl_options = array
  725. (
  726. CURLOPT_URL => "http://localhost:60133/?cmd={$cmd}",
  727. CURLOPT_HEADER => 0,
  728. CURLOPT_RETURNTRANSFER => 1, // 返回值不顯示, 只做變數用
  729. CURLOPT_POST => 1,
  730. CURLOPT_POSTFIELDS => $data
  731. );
  732. curl_setopt_array($ch, $curl_options);
  733. curl_exec($ch);
  734. curl_close($ch);
  735. }
  736. catch (Exception $e)
  737. {
  738. trigger_error("{$cmd} error: ".$e->getMessage());
  739. }
  740. }
  741. // 管理員參數
  742. function gen_admin_ck($station_no)
  743. {
  744. return md5(date("m \a\l\t\o\b d").$station_no.date("i \z\z\z H"));
  745. }
  746. // 印發票
  747. public function print_invoice($parms)
  748. {
  749. $result = array();
  750. try
  751. {
  752. // 印發票
  753. $ch = curl_init();
  754. $curl_options = array
  755. (
  756. CURLOPT_URL => "http://localhost:60134/",
  757. CURLOPT_HEADER => 0,
  758. CURLOPT_RETURNTRANSFER => 1,
  759. CURLOPT_CONNECTTIMEOUT => 2,
  760. CURLOPT_TIMEOUT => 2,
  761. CURLOPT_POST => 1,
  762. CURLOPT_POSTFIELDS => array(
  763. 'cmd' => 'printInvoice',
  764. 'company_no' => $parms['company_no'],
  765. 'vCUS_COMP_CODE'=> $parms['member_company_no'],
  766. 'vAmount' => $parms['invoice_amt'],
  767. 'vPLU_MEMO' => 'parking:50:3',
  768. 'vTAIL_MESSAGE' => 'Rental'
  769. )
  770. );
  771. curl_setopt_array($ch, $curl_options);
  772. $ch_response = curl_exec($ch);
  773. trigger_error(__FUNCTION__ . '|' . print_r($ch_response, true));
  774. curl_close($ch);
  775. $result = json_decode($ch_response, true);
  776. }
  777. catch (Exception $e)
  778. {
  779. trigger_error(__FUNCTION__ .$e->getMessage());
  780. }
  781. //測試用
  782. //$result['einvoice_track'] = 'AB'; // 發票字軌
  783. //$result['einvoice_no'] = '12345678'; // 發票號碼
  784. return $result;
  785. }
  786. }