1
printcheck.php in trunk/web/include/doc – MultiMag

source: trunk/web/include/doc/printcheck.php @ 975

Last change on this file since 975 was 975, checked in by blacklight, 11 months ago
  • Добавлена возможность прихода/расхода средств без печати кассового чека
  • В документе *информация о платеже* для эквайринга добавлен выбор кассового аппарата, на котором будет распечатан чек
  • При печати кассовых чеков добавлена проверка соответствий сумм накладной и кассового документа, а так же факта проведения накладной
File size: 6.2 KB
Line 
1<?php
2
3//      MultiMag v0.2 - Complex sales system
4//
5//      Copyright (C) 2005-2018, BlackLight, TND Team, http://tndproject.org
6//
7//      This program is free software: you can redistribute it and/or modify
8//      it under the terms of the GNU Affero General Public License as
9//      published by the Free Software Foundation, either version 3 of the
10//      License, or (at your option) any later version.
11//
12//      This program is distributed in the hope that it will be useful,
13//      but WITHOUT ANY WARRANTY; without even the implied warranty of
14//      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15//      GNU Affero General Public License for more details.
16//
17//      You should have received a copy of the GNU Affero General Public License
18//      along with this program.  If not, see <http://www.gnu.org/licenses/>.
19//
20
21namespace doc;
22
23/// Трейт *печать кассового чека*
24trait PrintCheck {
25   
26    protected function getCashRegister($cr_id) {
27        global $db;
28        $res = $db->query("SELECT `name`, `connect_line`, `password`, `section` FROM `cash_register` WHERE `id`='$cr_id'");
29        $kkm_line = $res->fetch_assoc();
30        if(!$kkm_line) {
31            throw new \NotFoundException("ID кассового аппарата $cr_id не найден в базе данных");
32        }
33        $cr = new \CRI\Atol\Atol();
34        $cr->connect($kkm_line['connect_line']); 
35        $cr->setPassword($kkm_line['password']);
36        $cr->setSection($kkm_line['section']);
37        return $cr;
38    }
39   
40    protected function touchRegMode($cr) {
41        global $db;
42        $statecode = $cr->requestGetStateCode();
43        if($statecode['state']>0) {
44            $cr->requestExitFromMode();
45            $statecode = $cr->requestGetStateCode();
46            if($statecode['state']>0) {
47                $cr->requestExitFromMode();
48                $statecode = $cr->requestGetStateCode();
49            }
50        }   
51        $res = $db->query("SELECT `cr_password` FROM `users_worker_info` WHERE `user_id`='{$_SESSION['uid']}'");
52        $ui = $res->fetch_assoc();
53        if($ui==null) {
54            throw new \Exception("Вы - не сотрудник, и не можете распечатать чек!");
55        }
56        if($ui['cr_password']==0) {
57            throw new \Exception("Ваш пароль кассира не задан, и вы не можете распечатать чек!");
58        }
59        if($statecode['state']==0) {
60            $cr->requestEnterToMode(1, $ui['cr_password']);
61        }
62        else {
63            throw new \Exception("Режим: {$statecode['state']} - в нём печать не возможна, и сменить не получается!");
64        }
65        $state = $cr->requestGetState();
66        if($state['flags']['session']==false) {
67            throw new \Exception("Смена не открыта, печать чека не возможна!");
68        }
69    }
70   
71    // Напечатать чек
72    protected function printCheck($cr_id) {
73        if($this->doc_data['p_doc']==0) {
74            throw new \Exception("Невозможна печать чека для документа, не являющегося потомком накладной");
75        }
76        $doc = \document::getInstanceFromDb($this->doc_data['p_doc']);
77        $check_type = 0;
78        $pay_type = 0;
79        $pay_sum = 1;
80        if($doc->typename == 'realizaciya') {
81            if($this->typename == 'pko' || $this->typename == 'payinfo') {
82                $ret = $doc->getDopData('return');
83                $check_type = $ret ? \CRI\Atol\atol::CT_OUT_RETURN : \CRI\Atol\atol::CT_IN;
84                $pay_type = $this->typename == 'payinfo' ? 2 : 1;
85                $pay_sum = $ret ? 0:1;
86            }
87            else {
88                throw new \Exception("Невозможна печать чека - данный документ не допустим для расхода товара");
89            }
90        }
91        else if($doc->typename == 'postuplenie') {
92            if($this->typename == 'rko' || $this->typename == 'payinfo') {
93                $ret = $doc->getDopData('return');
94                $check_type = $ret ? \CRI\Atol\atol::CT_IN_RETURN : \CRI\Atol\atol::CT_OUT;
95                $pay_type = $this->typename == 'payinfo' ? 2 : 1;
96                $pay_sum = $ret ? 0:1;
97            }
98            else {
99                throw new \Exception("Невозможна печать чека - данный документ не допустим для прихода товара");
100            }
101        }
102        else {
103            throw new \Exception("Печать чека возможна лишь на основании поступления или реализации");
104        }
105        if(!$doc->getDocData('ok')) {
106            throw new \Exception("Накладная-основание не проведена");
107        }
108        if($this->getDocData('sum')!=$doc->getDocData('sum')) {
109            throw new \Exception("Частичные поступления и возвраты не реализованы");
110        }       
111        $cr = $this->getCashRegister($cr_id);
112        try {
113            $nom = $doc->getDocumentNomenclature('base_price,bulkcnt'); 
114            $this->touchRegMode($cr);
115            $cr->requestOpenCheck($check_type);
116            $sum = 0;
117            foreach ($nom as $line) {
118                $tax = $section = 0;
119                $cr->requestRegisterNomenclature($line['name'], $line['price'], $line['cnt']);
120                //$cr->cmdRegisterNomenclature($line['name'], $line['price'], $line['cnt']);
121                $sum += $line['price'] * $line['cnt'];
122            }
123            $sum *= $pay_sum;
124            $cr->requestCloseCheck($pay_type, $sum);
125            /// TODO: услуги, коды товаров
126        }
127        catch(\CRI\Atol\AtolHLError $e) {
128            try {
129                $cr->abortBuffer();
130                $cr->requestBreakCheck();               
131            } catch (\Exception $ex) {}
132            throw $e;
133        }
134        catch(\CRI\Atol\AtolException $e) {
135            try {
136                $cr->abortBuffer();
137                $cr->requestBreakCheck();
138            } catch (\Exception $ex) {}   
139            throw $e;
140        }
141    }
142   
143}
Note: See TracBrowser for help on using the repository browser.