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

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

Last change on this file since 986 was 986, checked in by blacklight, 8 months ago
  • Добвлен вывод печати организации в печатную форму коммерческого предложения
  • Проведён рефакторинг печатных форм документов
File size: 6.7 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/**
24 * Трейт *печать кассового чека*
25 * @package doc
26 */
27trait PrintCheck {
28
29    /**
30     * @var \CRI\Atol\Atol Объект ККМ
31     */
32    private $crId;
33
34    /**
35     * Получить объект взаимодействия с ККМ по id
36     * @param $cr_id int ID регистратора
37     * @throws \NotFoundException
38     */
39    private function useCashRegister($cr_id) {
40        global $db;
41        $kkm_line = $db->selectRow('cash_register', $cr_id);
42        if(!$kkm_line) {
43            throw new \NotFoundException("ID кассового аппарата $cr_id не найден в базе данных");
44        }
45        $this->crId = new \CRI\Atol\Atol();
46        $this->crId->connect($kkm_line['connect_line']);
47        $this->crId->setPassword($kkm_line['password']);
48        $this->crId->setSection($kkm_line['section']);
49    }
50
51    /**
52     * Проверить, и при необходимости, установить нужный режим ККМ
53     * @throws \Exception
54     */
55    private function touchRegMode() {
56        global $db;
57        $stateCode = $this->crId->requestGetStateCode();
58        if($stateCode['state']>0) {
59            $this->crId->requestExitFromMode();
60            $stateCode = $this->crId->requestGetStateCode();
61            if($stateCode['state']>0) {
62                $this->crId->requestExitFromMode();
63                $stateCode = $this->crId->requestGetStateCode();
64            }
65        }   
66        $res = $db->query("SELECT `cr_password` FROM `users_worker_info` WHERE `user_id`='{$_SESSION['uid']}'");
67        $ui = $res->fetch_assoc();
68        if($ui==null) {
69            throw new \Exception("Вы - не сотрудник, и не можете распечатать чек!");
70        }
71        if($ui['cr_password']==0) {
72            throw new \Exception("Ваш пароль кассира не задан, и вы не можете распечатать чек!");
73        }
74        if($stateCode['state']==0) {
75            $this->crId->requestEnterToMode(1, $ui['cr_password']);
76        }
77        else {
78            throw new \Exception("Режим: {$stateCode['state']} - в нём печать не возможна, и сменить не получается!");
79        }
80        $state = $this->crId->requestGetState();
81        if($state['flags']['session']==false) {
82            throw new \Exception("Смена не открыта, печать чека не возможна!");
83        }
84    }
85
86    /**
87     * Напечатать чек
88     * @param $cr_id
89     * @throws \CRI\Atol\AtolException
90     * @throws \CRI\Atol\AtolHLError
91     * @throws \CRI\Atol\AtolHLException
92     * @throws \NotFoundException
93     * @throws \Exception
94     */
95    protected function printCheck($cr_id) {
96        if($this->doc_data['p_doc']==0) {
97            throw new \Exception("Невозможна печать чека для документа, не являющегося потомком накладной");
98        }
99        $doc = \document::getInstanceFromDb($this->doc_data['p_doc']);
100        if($doc->typename == 'realizaciya') {
101            if($this->typename == 'pko' || $this->typename == 'payinfo') {
102                $ret = $doc->getDopData('return');
103                $check_type = $ret ? \CRI\Atol\atol::CT_OUT_RETURN : \CRI\Atol\atol::CT_IN;
104                $pay_type = $this->typename == 'payinfo' ? 2 : 1;
105                $pay_sum = $ret ? 0:1;
106            }
107            else {
108                throw new \Exception("Невозможна печать чека - данный документ не допустим для расхода товара");
109            }
110        }
111        else if($doc->typename == 'postuplenie') {
112            if($this->typename == 'rko' || $this->typename == 'payinfo') {
113                $ret = $doc->getDopData('return');
114                $check_type = $ret ? \CRI\Atol\atol::CT_IN_RETURN : \CRI\Atol\atol::CT_OUT;
115                $pay_type = $this->typename == 'payinfo' ? 2 : 1;
116                $pay_sum = $ret ? 0:1;
117            }
118            else {
119                throw new \Exception("Невозможна печать чека - данный документ не допустим для прихода товара");
120            }
121        }
122        else {
123            throw new \Exception("Печать чека возможна лишь на основании поступления или реализации");
124        }
125        if(!$doc->getDocData('ok')) {
126            throw new \Exception("Накладная-основание не проведена");
127        }
128        if($this->getDocData('sum')!=$doc->getDocData('sum')) {
129            throw new \Exception("Частичные поступления и возвраты не реализованы");
130        }       
131
132        try {
133            $this->useCashRegister($cr_id);
134            $this->touchRegMode();
135            $this->crId->requestOpenCheck($check_type);
136            $nom = $doc->getDocumentNomenclature('base_price,bulkcnt');
137            $sum = 0;
138            foreach ($nom as $line) {
139                $tax = $section = 0;
140                $this->crId->requestRegisterNomenclature($line['name'], $line['price'], $line['cnt']);
141                //$cr->cmdRegisterNomenclature($line['name'], $line['price'], $line['cnt']);
142                $sum += $line['price'] * $line['cnt'];
143            }
144            $sum *= $pay_sum;
145            $this->crId->requestCloseCheck($pay_type, $sum);
146            /// TODO: услуги, коды товаров
147        }
148        catch(\CRI\Atol\AtolHLError $e) {
149            try {
150                $this->crId->abortBuffer();
151                $this->crId->requestBreakCheck();
152            } catch (\Exception $ex) {}
153            throw $e;
154        }
155        catch(\CRI\Atol\AtolException $e) {
156            try {
157                $this->crId->abortBuffer();
158                $this->crId->requestBreakCheck();
159            } catch (\Exception $ex) {}   
160            throw $e;
161        }
162    }
163   
164}
Note: See TracBrowser for help on using the repository browser.