1
Changeset 972 – MultiMag

Changeset 972


Ignore:
Timestamp:
Jun 28, 2018, 3:36:45 AM (8 weeks ago)
Author:
blacklight
Message:
  • Добавлена поддержка онлайн-касс АТОЛ (экспериментальная возможность)
Location:
trunk
Files:
11 added
11 edited
4 copied

Legend:

Unmodified
Added
Removed
  • trunk/common/core.common.php

    r963 r972  
    1818//
    1919
    20 define("MULTIMAG_REV", "958");
     20define("MULTIMAG_REV", "972");
    2121define("MULTIMAG_VERSION", "0.2.".MULTIMAG_REV);
    2222
  • trunk/web/doc_service.php

    r963 r972  
    4747        <li><a href='?mode=banks'>Банки</a></li>
    4848        <li><a href='?mode=kass'>Кассы</a></li>
     49        <li><a href='?mode=kkm'>Кассовые аппараты</a></li>
    4950        <li><a href='?mode=stores'>Склады</a></li>
    5051        <li>Номенклатура</li><ul>
     
    6162        <li><a href='?mode=ctemplates'>Шаблоны договоров</a></li>
    6263        </ul>
    63         <li>Обработки</li>
     64        <li>Автоматизация</li>
    6465        <ul>
    6566        <li><a href='?mode=cimage'>Замена изображений</a></li>
    6667        <li><a href='?mode=merge_agent'>Группировка агентов</a></li>
    6768        <li><a href='?mode=merge_tovar'>Группировка складской номенклатуры</a></li>
     69        <li><a href='?mode=cashservice'>Обслуживание кассового аппарата</a></li>
    6870        </ul>
    6971        <li>Отчёты</li>
     
    645647        $editor->acl_object_name = 'directory.cash';
    646648        $editor->run();
     649    }  elseif ($mode == 'kkm') {
     650        $editor = new \ListEditors\CashRegisters($db);
     651        $editor->line_var_name = 'id';
     652        $editor->link_prefix = '/doc_service.php?mode=kkm';
     653        $editor->acl_object_name = 'directory.cashregister';
     654        $editor->run();
    647655    } elseif ($mode == 'firms') {
    648656        $editor = new \ListEditors\FirmListEditor($db);
     
    757765        $editor->acl_object_name = 'directory.contract_templates';
    758766        $editor->run();
     767    }   elseif ($mode == 'cashservice') {
     768        $sm = new \modules\docservice\CashRegister();
     769        $sm->line_var_name = 'id';
     770        $sm->link_prefix = '/doc_service.php?mode='.$mode;
     771        $sm->run();
    759772    } else {
    760773        throw new NotFoundException("Несуществующая опция");
  • trunk/web/include/acl/directory/main.php

    r963 r972  
    8787                "mask" => \acl::VIEW | \acl::CREATE  | \acl::UPDATE
    8888            ),
     89            'cashregister' => array(
     90                "name" => "Кассовые аппараты",
     91                "mask" => \acl::VIEW | \acl::CREATE  | \acl::UPDATE
     92            ),
    8993            'contract_templates' => array(
    9094                "name" => "Шаблоны договоров",
  • trunk/web/include/acl/service/main.php

    r969 r972  
    8989                "mask" => \acl::VIEW
    9090            ),
     91            'cashservice' => array(
     92                "name" => "Обслуживание кассового аппарата",
     93                "mask" => \acl::VIEW | \acl::UPDATE | \acl::APPLY
     94            ),
    9195        );
    9296    }
  • trunk/web/include/doc.payinfo.php

    r965 r972  
    2020/// Документ *информация о платеже*
    2121class doc_PayInfo extends doc_credit {
    22 
     22    use \doc\PrintCheck;
     23   
    2324    function __construct($doc = 0) {
    2425        parent::__construct($doc);
     
    4546    // Провести
    4647    function docApply($silent = 0) {
     48        global $db;
     49        if (!$this->isAltNumUnique() && !$silent) {
     50            throw new Exception("Номер документа не уникален!");
     51        }
     52        $res = $db->query("SELECT `doc_list`.`id`, `doc_list`.`date`, `doc_list`.`bank`, `doc_list`.`ok`, `doc_list`.`firm_id`, `doc_list`.`sum`,
     53                `doc_kassa`.`firm_id` AS `kassa_firm_id`, `doc_vars`.`firm_till_lock`, `doc_kassa`.`cash_register_id` AS `cr_id`
     54            FROM `doc_list`
     55            INNER JOIN `doc_kassa` ON `doc_kassa`.`num`=`doc_list`.`bank` AND `ids`='bank'
     56            INNER JOIN `doc_vars` ON `doc_list`.`firm_id` = `doc_vars`.`id`
     57            WHERE `doc_list`.`id`='{$this->id}'");
     58        $doc_params = $res->fetch_assoc();
     59        $res->free();
     60        if($doc_params['bank']==0) {
     61            throw new Exception("Банк не задан");
     62        }
    4763        parent::docApply($silent);
    4864        if (!$silent) {
     65            //  Напечатать чек при необходимости
     66            if($doc_params['cr_id']>0) {
     67                $this->printCheck($doc_params['cr_id']);
     68            }
    4969            $this->paymentNotify();
    5070        }
  • trunk/web/include/doc.pko.php

    r965 r972  
    2020/// Документ *приходный кассовый ордер*
    2121class doc_Pko extends doc_credit {
    22 
     22    use \doc\PrintCheck;
     23   
    2324    function __construct($doc = 0) {
    2425        parent::__construct($doc);
     
    8687        }
    8788        $res = $db->query("SELECT `doc_list`.`id`, `doc_list`.`date`, `doc_list`.`kassa`, `doc_list`.`ok`, `doc_list`.`firm_id`, `doc_list`.`sum`,
    88                 `doc_kassa`.`firm_id` AS `kassa_firm_id`, `doc_vars`.`firm_till_lock`
     89                `doc_kassa`.`firm_id` AS `kassa_firm_id`, `doc_kassa`.`cash_register_id` AS `cr_id`, `doc_vars`.`firm_till_lock`
    8990            FROM `doc_list`
    9091            INNER JOIN `doc_kassa` ON `doc_kassa`.`num`=`doc_list`.`kassa` AND `ids`='kassa'
     
    114115            throw new Exception("Выбранная организация может работать только со своими кассами!");
    115116        }
    116 
     117       
    117118        $res = $db->query("UPDATE `doc_kassa` SET `ballance`=`ballance`+'{$doc_params['sum']}' WHERE `ids`='kassa' AND `num`='{$doc_params['kassa']}'");
    118119        if (!$db->affected_rows) {
     
    121122        parent::docApply($silent);
    122123        if (!$silent) {
     124            //  Напечатать чек при необходимости
     125            if($doc_params['cr_id']>0) {
     126                $this->printCheck($doc_params['cr_id']);
     127            }
    123128            $this->paymentNotify();
    124129        }
    125130    }
    126 
     131   
    127132    // Отменить проведение
    128133    function DocCancel() {
  • trunk/web/include/doc.postuplenie.php

    r965 r972  
    299299            'rbank' =>          ['name'=>'rbank',           'document' => 'rbank',          'viewname' => 'Расходный банковский ордер', ],
    300300            'rko' =>            ['name'=>'rko',             'document' => 'rko',            'viewname' => 'Расходный кассовый ордер', ],
     301            'payinfo' =>        ['name'=>'payinfo',     'document' => 'payinfo',    'viewname' => 'Информация о безналичном платеже', ],
    301302        );
    302303        return $morphs;
     
    320321    }
    321322   
     323    /** Создать подчинённый информация о платеже
     324     *
     325     * @return \doc_Pko Подчинённый информация о платеже
     326     */
     327    protected function morphTo_payinfo() {
     328   
     329        $this->recalcSum();
     330        $new_doc = new \doc_PayInfo();
     331        $new_doc->createFrom($this);
     332        $pref = \pref::getInstance();
     333        $new_doc->setDocData('bank', $this->getDocData('bank'));
     334        return $new_doc;
     335    }
     336   
    322337    /** Сформировать Расходный банковский ордер на основе этого документа
    323338     *
  • trunk/web/include/doc.realizaciya.php

    r969 r972  
    455455            'pbank' =>          ['name'=>'pbank',       'document' => 'pbank',      'viewname' => 'Приходный банковский ордер', ],
    456456            'pko' =>            ['name'=>'pko',         'document' => 'pko',        'viewname' => 'Приходный кассовый ордер', ],
     457            'payinfo' =>        ['name'=>'payinfo',     'document' => 'payinfo',    'viewname' => 'Информация о безналичном платеже', ],
    457458            'kordolga' =>       ['name'=>'kordolga',    'document' => 'kordolga',   'viewname' => 'Корректировка долга', ],
    458459        );
     
    492493        $codename = $this->getDopData('return')?'goods_return':'goods_sell';
    493494        $new_doc->setCreditTypeFromCodename($codename);
     495        return $new_doc;
     496    }
     497   
     498    /** Создать подчинённый информация о платеже
     499     *
     500     * @return \doc_Pko Подчинённый информация о платеже
     501     */
     502    protected function morphTo_payinfo() {
     503   
     504        $this->recalcSum();
     505        $new_doc = new \doc_PayInfo();
     506        $new_doc->createFrom($this);
     507        $pref = \pref::getInstance();
     508        $new_doc->setDocData('bank', $this->getDocData('bank'));
    494509        return $new_doc;
    495510    }
  • trunk/web/include/doc.rko.php

    r965 r972  
    2121/// Документ *Расходный кассовый ордер*
    2222class doc_Rko extends \doc_debit {
    23 
     23    use \doc\PrintCheck;
     24   
    2425    function __construct($doc = 0) {
    2526        parent::__construct($doc);
     
    7980        }
    8081        $res = $db->query("SELECT `doc_list`.`id`, `doc_list`.`date`, `doc_list`.`kassa`, `doc_list`.`ok`, `doc_list`.`firm_id`, `doc_list`.`sum`,
    81                 `doc_kassa`.`firm_id` AS `kassa_firm_id`, `doc_vars`.`firm_till_lock`
     82                `doc_kassa`.`firm_id` AS `kassa_firm_id`, `doc_vars`.`firm_till_lock`, `doc_kassa`.`cash_register_id` AS `cr_id`
    8283            FROM `doc_list`
    8384            INNER JOIN `doc_kassa` ON `doc_kassa`.`num`=`doc_list`.`kassa` AND `ids`='kassa'
     
    126127        }
    127128        parent::docApply($silent);
     129        if (!$silent) {
     130            //  Напечатать чек при необходимости
     131            if($doc_params['cr_id']>0) {
     132                $this->printCheck($doc_params['cr_id']);
     133            }
     134        }
    128135    }
    129136
  • trunk/web/include/doc/printcheck.php

    r965 r972  
    1818//      along with this program.  If not, see <http://www.gnu.org/licenses/>.
    1919//
    20 /// Документ *приходный кассовый ордер*
    21 class doc_Pko extends doc_credit {
    2220
    23     function __construct($doc = 0) {
    24         parent::__construct($doc);
    25         $this->doc_type = 6;
    26         $this->typename = 'pko';
    27         $this->viewname = 'Приходный кассовый ордер';
    28         $this->kassa_modify = 1;
    29         $this->header_fields = 'kassa sum separator agent';
     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;
    3038    }
    31 
    32     function initDefDopdata() {
     39   
     40    protected function touchRegMode($cr) {
    3341        global $db;
    34         $def_acc = $db->selectRowK('doc_accounts', 'usedby', 'kassa');
    35         $acc = '';
    36         if (is_array($def_acc)) {
    37             $acc = $def_acc['account'];
     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("Вы - не сотрудник, и не можете распечатать чек!");
    3855        }
    39         $this->def_dop_data = array('credit_type' => 0, 'account' => $acc);
    40     }
    41 
    42     function DopHead() {
    43         global $tmpl, $db;
    44         $tmpl->addContent("Вид дохода:<br><select name='credit_type'>");
    45         if (!$this->dop_data['credit_type']) {
    46             $tmpl->addContent("<option value='0' selected disabled>--не задан--</option>");
     56        if($ui['cr_password']==0) {
     57            throw new \Exception("Ваш пароль кассира не задан, и вы не можете распечатать чек!");
    4758        }
    48         $res = $db->query("SELECT `id`, `account`, `name` FROM `doc_ctypes` WHERE `id`>'0'");
    49         while ($nxt = $res->fetch_assoc()) {
    50             if ($nxt['id'] == $this->dop_data['credit_type']) {
    51                 $tmpl->addContent("<option value='{$nxt['id']}' selected>" . html_out($nxt['name']) . " (" . html_out($nxt['account']) . ")</option>");
    52             } else {
    53                 $tmpl->addContent("<option value='{$nxt['id']}'>" . html_out($nxt['name']) . " (" . html_out($nxt['account']) . ")</option>");
    54             }
     59        if($statecode['state']==0) {
     60            $cr->requestEnterToMode(1, $ui['cr_password']);
    5561        }
    56         $tmpl->addContent("</select><br>");
    57 
    58         $tmpl->addContent("Номер бухгалтерского счёта:<br><input type='text' name='account' value='{$this->dop_data['account']}'><br>");
    59     }
    60 
    61     function DopSave() {
    62         $new_data = array(
    63             'credit_type' => rcvint('credit_type'),
    64             'account' => request('account')
    65         );
    66         $old_data = array_intersect_key($new_data, $this->dop_data);
    67 
    68         $log_data = '';
    69         if ($this->id) {
    70             $log_data = getCompareStr($old_data, $new_data);
     62        else {
     63            throw new \Exception("Режим: {$statecode['state']} - в нём печать не возможна, и сменить не получается!");
    7164        }
    72         $this->setDopDataA($new_data);
    73         if ($log_data) {
    74             doc_log("UPDATE {$this->typename}", $log_data, 'doc', $this->id);
    75         }
    76     }
    77 
    78     // Провести
    79     function docApply($silent = 0) {
    80         global $db;
    81         if (!$this->isAltNumUnique() && !$silent) {
    82             throw new Exception("Номер документа не уникален!");
    83         }
    84         if($this->doc_data['kassa']<=0) {
    85             throw new Exception("Касса не выбрана");
    86         }
    87         $res = $db->query("SELECT `doc_list`.`id`, `doc_list`.`date`, `doc_list`.`kassa`, `doc_list`.`ok`, `doc_list`.`firm_id`, `doc_list`.`sum`,
    88                 `doc_kassa`.`firm_id` AS `kassa_firm_id`, `doc_vars`.`firm_till_lock`
    89             FROM `doc_list`
    90             INNER JOIN `doc_kassa` ON `doc_kassa`.`num`=`doc_list`.`kassa` AND `ids`='kassa'
    91             INNER JOIN `doc_vars` ON `doc_list`.`firm_id` = `doc_vars`.`id`
    92             WHERE `doc_list`.`id`='{$this->id}'");
    93         $doc_params = $res->fetch_assoc();
    94         $res->free();
    95 
    96         if (!$doc_params) {
    97             throw new Exception('Документ ' . $this->id . ' не найден');
    98         }
    99 
    100         if ($doc_params['ok'] && (!$silent)) {
    101             throw new Exception('Документ уже проведён!');
    102         }
    103         if ($doc_params['sum']<=0) {
    104             throw new Exception('Нельзя провести документ с нулевой или отрицательной суммой!');
    105         }
    106         $this->checkIfTypeForDocumentExists();
    107 
    108         // Запрет для другой фирмы
    109         if ($doc_params['kassa_firm_id'] != null && $doc_params['kassa_firm_id'] != $doc_params['firm_id']) {
    110             throw new Exception("Выбранная касса относится другой организации!");
    111         }
    112         // Ограничение фирмы списком своих банков
    113         if ($doc_params['firm_till_lock'] && $doc_params['kassa_firm_id'] != $doc_params['firm_id']) {
    114             throw new Exception("Выбранная организация может работать только со своими кассами!");
    115         }
    116 
    117         $res = $db->query("UPDATE `doc_kassa` SET `ballance`=`ballance`+'{$doc_params['sum']}' WHERE `ids`='kassa' AND `num`='{$doc_params['kassa']}'");
    118         if (!$db->affected_rows) {
    119             throw new Exception('Ошибка обновления кассы!');
    120         }
    121         parent::docApply($silent);
    122         if (!$silent) {
    123             $this->paymentNotify();
    124         }
    125     }
    126 
    127     // Отменить проведение
    128     function DocCancel() {
    129         global $db;
    130         parent::docCancel();
    131         $db->query("UPDATE `doc_kassa` SET `ballance`=`ballance`-'{$this->doc_data['sum']}'     WHERE `ids`='kassa' AND `num`='{$this->doc_data['kassa']}'");
    132         if (!$db->affected_rows) {
    133             throw new Exception('Ошибка обновления кассы!');
    134         }
    135        
    136         $budet = $this->checkKassMinus();
    137         if ($budet < 0) {
    138             throw new Exception("Невозможно, т.к. будет недостаточно ($budet) денег в кассе!");
    139         }
    140        
    141     }
    142 
    143     protected function extendedAclCheck($acl, $today_acl, $action) {
    144         $acl_obj = ['cash.global', 'cash.'.$this->doc_data['kassa']];     
    145         if (!\acl::testAccess($acl_obj, $acl)) {
    146            $d_start = date_day(time());
    147             $d_end = $d_start + 60 * 60 * 24 - 1;
    148             if (!\acl::testAccess($acl_obj, $today_acl)) {
    149                 throw new \AccessException('Не достаточно привилегий для '.$action.' документа с выбранной кассой '.$this->doc_data['kassa']);
    150             } elseif ($this->doc_data['date'] < $d_start || $this->doc_data['date'] > $d_end) {
    151                 throw new \AccessException('Не достаточно привилегий для '.$action.' документа с выбранной кассой '.$this->doc_data['kassa'].' произвольной датой');
    152             }
     65        $state = $cr->requestGetState();
     66        if($state['flags']['session']==false) {
     67            throw new \Exception("Смена не открыта, печать чека не возможна!");
    15368        }
    15469    }
    15570   
    156     public function extendedViewAclCheck() {
    157         $acl_obj = ['cash.global', 'cash.'.$this->doc_data['kassa']];     
    158         if (!\acl::testAccess($acl_obj, \acl::VIEW)) {
    159             throw new \AccessException('Не достаточно привилегий для просмотра документа с выбранной кассой '.$this->doc_data['kassa']);
     71    // Напечатать чек
     72    protected function printCheck($cr_id) {
     73        if($this->doc_data['p_doc']==0) {
     74            throw new Exception("Невозможна печать чека для документа, не являющегося потомком накладной");
    16075        }
    161         return parent::extendedViewAclCheck();
     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        $cr = $this->getCashRegister($cr_id);
     106        try {
     107            $nom = $doc->getDocumentNomenclature('base_price,bulkcnt'); 
     108            $this->touchRegMode($cr);
     109            $cr->requestOpenCheck($check_type);
     110            $sum = 0;
     111            foreach ($nom as $line) {
     112                $tax = $section = 0;
     113                $cr->requestRegisterNomenclature($line['name'], $line['price'], $line['cnt']);
     114                //$cr->cmdRegisterNomenclature($line['name'], $line['price'], $line['cnt']);
     115                $sum += $line['price'] * $line['cnt'];
     116            }
     117            $sum *= $pay_sum;
     118            $cr->requestCloseCheck($pay_type, $sum);
     119            /// TODO: услуги, коды товаров
     120        }
     121        catch(\CRI\Atol\AtolHLError $e) {
     122            try {
     123                $cr->abortBuffer();
     124                $cr->requestBreakCheck();               
     125            } catch (\Exception $ex) {}
     126            throw $e;
     127        }
     128        catch(\CRI\Atol\AtolException $e) {
     129            try {
     130                $cr->abortBuffer();
     131                $cr->requestBreakCheck();
     132            } catch (\Exception $ex) {}   
     133            throw $e;
     134        }
    162135    }
    163136   
    164     /// Выполнение дополнительных проверок доступа для проведения документа
    165     public function extendedApplyAclCheck() {
    166         $this->extendedAclCheck(\acl::APPLY, \acl::TODAY_APPLY, 'проведения');
    167         return parent::extendedApplyAclCheck();
    168     }
    169    
    170     /// Выполнение дополнительных проверок доступа для отмены документа
    171     public function extendedCancelAclCheck() {
    172         $this->extendedAclCheck(\acl::CANCEL, \acl::TODAY_CANCEL, 'отмены проведения');
    173         return parent::extendedCancelAclCheck();
    174     }
    175137}
  • trunk/web/include/doc/printforms/postuplenie/komplekt.php

    r963 r972  
    1717//      along with this program.  If not, see <http://www.gnu.org/licenses/>.
    1818//
    19 namespace doc\printforms\realizaciya;
     19namespace doc\printforms\postuplenie;
    2020
    2121class komplekt extends \doc\printforms\iPrintFormInvoicePdf {
     
    2323   
    2424    public function getName() {
    25         return "Накладная на комплектацию";
     25        return "Накладная на склад";
    2626    }
    2727   
     
    4646        $doc_id = $this->doc->getId();
    4747        $doc_data = $this->doc->getDocDataA();
    48         $text = "Накладная на комплектацию N  {$doc_data['altnum']}{$doc_data['subtype']} ($doc_id) от " . date("d.m.Y", $doc_data['date']);
     48        $text = "Накладная на склад N  {$doc_data['altnum']}{$doc_data['subtype']} ($doc_id) от " . date("d.m.Y", $doc_data['date']);
    4949        $this->addHeader($text); 
    50         $text = "К расходной накладной N {$doc_data['altnum']}{$doc_data['subtype']} ({$doc_id})";
    51         $this->addInfoLine($text);           
     50       
    5251    }
    5352   
     
    170169        $text = "Документ выписал: _____________________________________ ( $vip_name )";
    171170        $this->addSignLine($text);
    172         $text = "Комплектацию выполнил: ___________________________________ ( $klad_name )";
     171        $text = "На склад положил: ___________________________________ ( $klad_name )";
    173172        $this->addSignLine($text);
    174173    }
  • trunk/web/include/listeditors/banklisteditor.php

    r963 r972  
    11<?php
     2
    23//      MultiMag v0.2 - Complex sales system
    34//
     
    1617//      You should have received a copy of the GNU Affero General Public License
    1718//      along with this program.  If not, see <http://www.gnu.org/licenses/>.
     19
    1820namespace ListEditors;
    1921
    2022class BankListEditor extends \ListEditor {
    21        
    22         public function __construct($db_link) {
    23             parent::__construct($db_link);
    24             $this->print_name = 'Справочник собственных банков';
    25             $this->initFirmList();
    26         }
    27        
    28         /// Получить массив с именами колонок списка
    29         public function getColumnNames() {
    30             return array(
    31                 'id'=>'id',
    32                 'name'=>'Наименование',
    33                 'bik'=>'Бик',
    34                 'rs'=>'Р.счет',
    35                 'ks'=>'К.счет',
    36                 'comment' => 'Комментраий',
    37                 'firm_id'=>'Организация',
    38             );
    39         }
    40        
    41         /// Загрузить список всех элементов справочника
    42         public function loadList() {
    43                 global $db;
    44                 $res = $db->query("SELECT `num` AS `id`, `name`, `bik`, `rs`, `ks`, `comment`, `firm_id`
     23
     24    public function __construct($db_link) {
     25        parent::__construct($db_link);
     26        $this->print_name = 'Справочник собственных банков';
     27        $this->initFirmList();
     28        $this->initCashRegisterList();
     29    }
     30
     31    /// Получить массив с именами колонок списка
     32    public function getColumnNames() {
     33        return array(
     34            'id' => 'id',
     35            'name' => 'Наименование',
     36            'bik' => 'Бик',
     37            'rs' => 'Р.счет',
     38            'ks' => 'К.счет',
     39            'comment' => 'Комментраий',
     40            'firm_id' => 'Организация',
     41            'cash_register_id' => 'Кассовый аппарат'
     42        );
     43    }
     44
     45    /// Загрузить список всех элементов справочника
     46    public function loadList() {
     47        global $db;
     48        $res = $db->query("SELECT `num` AS `id`, `name`, `bik`, `rs`, `ks`, `comment`, `firm_id`, `cash_register_id`
    4549                        FROM `doc_kassa`
    4650                        WHERE `ids`='bank'
    4751                        ORDER BY `num`");
    48                 $this->list = array();
    49                 while ($line = $res->fetch_assoc()) {
    50                         $this->list[$line['id']] = $line;
    51                 }
    52         }
     52        $this->list = array();
     53        while ($line = $res->fetch_assoc()) {
     54            $this->list[$line['id']] = $line;
     55        }
     56    }
    5357
    54         public function getItem($id) {
    55                 global $db;
    56                 settype($id, 'int');
    57                 $res = $db->query("SELECT `num` AS `id`, `name`, `bik`, `rs`, `ks`, `comment`, `firm_id`
     58    public function getItem($id) {
     59        global $db;
     60        settype($id, 'int');
     61        $res = $db->query("SELECT `num` AS `id`, `name`, `bik`, `rs`, `ks`, `comment`, `firm_id`, `cash_register_id`
    5862                        FROM `doc_kassa`
    5963                        WHERE `ids`='bank' AND `num`=$id");
    60                 if ($res->num_rows) {
    61                         return $res->fetch_assoc();
    62                 } else {
    63                         return null;
    64                 }
    65         }
    66        
    67         public function getInputFirm_id($name, $value) {
    68                 $ret = "<select name='$name'>";
    69                 $ret .="<option value='0'>-- не задано --</option>";
    70                 foreach($this->firm_list as $id => $firm_name) {
    71                         $sel = $value==$id?' selected':'';
    72                         $ret .="<option value='$id'{$sel}>$id: ".html_out($firm_name)."</option>";
    73                 }
    74                 $ret .="</select>";
    75                 return $ret;
    76         }
    77        
    78         public function getInputComment($name, $value) {
    79                 $ret = "<textarea name='$name'>";
    80                 $ret .= html_out($value);
    81                 $ret .="</textarea>";
    82                 return $ret;
    83         }
    84        
    85         public function getFieldFirm_id($data) {
    86             if($data['firm_id']>0) {
    87                 return html_out($this->firm_list[$data['firm_id']]);
     64        if ($res->num_rows) {
     65            return $res->fetch_assoc();
     66        } else {
     67            return null;
     68        }
     69    }
     70
     71    public function getFieldcash_register_id($data) {
     72        if ($data['cash_register_id'] > 0) {
     73            return html_out($this->cr_list[$data['cash_register_id']]);
     74        } else {
     75            return '-- не задано --';
     76        }
     77    }
     78
     79    public function getInputcash_register_id($name, $value) {
     80        $ret = "<select name='$name'>";
     81        $ret .= "<option value='null'>-- не задано --</option>";
     82        foreach ($this->cr_list as $id => $cr_name) {
     83            $sel = $value == $id ? ' selected' : '';
     84            $ret .= "<option value='$id'{$sel}>$id: " . html_out($cr_name) . "</option>";
     85        }
     86        $ret .= "</select>";
     87        return $ret;
     88    }
     89
     90    public function getInputFirm_id($name, $value) {
     91        $ret = "<select name='$name'>";
     92        $ret .= "<option value='0'>-- не задано --</option>";
     93        foreach ($this->firm_list as $id => $firm_name) {
     94            $sel = $value == $id ? ' selected' : '';
     95            $ret .= "<option value='$id'{$sel}>$id: " . html_out($firm_name) . "</option>";
     96        }
     97        $ret .= "</select>";
     98        return $ret;
     99    }
     100
     101    public function getInputComment($name, $value) {
     102        $ret = "<textarea name='$name'>";
     103        $ret .= html_out($value);
     104        $ret .= "</textarea>";
     105        return $ret;
     106    }
     107
     108    public function getFieldFirm_id($data) {
     109        if ($data['firm_id'] > 0) {
     110            return html_out($this->firm_list[$data['firm_id']]);
     111        } else {
     112            return '-- не задано --';
     113        }
     114    }
     115
     116    public function saveItem($id, $data) {
     117        global $db;
     118        settype($id, 'int');
     119        $name_sql = $db->real_escape_string($data['name']);
     120        $bik_sql = $db->real_escape_string($data['bik']);
     121        $rs_sql = $db->real_escape_string($data['rs']);
     122        $ks_sql = $db->real_escape_string($data['ks']);
     123        $comment_sql = $db->real_escape_string($data['comment']);
     124        $firm_id = intval($data['firm_id']);
     125        if ($data['cash_register_id'] == 'null') {
     126            $cash_register_id = 'NULL';
     127        } else {
     128            $cash_register_id = intval($data['cash_register_id']);
     129        }
     130        if ($id) {
     131            $res = $db->query("SELECT `num` FROM `doc_kassa` WHERE `ids`='bank' AND `num`='$id'");
     132            if ($res->num_rows) {
     133                $db->query("UPDATE `doc_kassa` SET `name`='$name_sql', `bik`='$bik_sql', `ks`='$ks_sql', `rs`='$rs_sql', `comment`='$comment_sql'"
     134                        . ", `firm_id`='$firm_id', `cash_register_id`=$cash_register_id
     135                                WHERE `ids`='bank' AND `num`=$id");
     136                return $id;
    88137            }
    89             else {
    90                 return '-- не задано --';
    91             }
    92         }
     138        }
     139        $res = $db->query("SELECT `num` FROM `doc_kassa` WHERE `ids`='bank' ORDER BY `num` DESC LIMIT 1");
     140        if ($res->num_rows) {
     141            $line = $res->fetch_row();
     142            $id = $line[0] + 1;
     143        } else {
     144            $id = 1;
     145        }
     146        $db->query("INSERT INTO `doc_kassa` (`ids`, `num`, `name`, `bik`, `ks`, `rs`, `comment`, `firm_id`, `cash_register_id`)
     147                        VALUES ('bank', $id, '$name_sql', '$bik_sql', '$ks_sql', '$rs_sql', '$comment_sql', '$firm_id', '$cash_register_id')");
     148        return $id;
     149    }
    93150
    94         public function saveItem($id, $data) {
    95                 global $db;
    96                 settype($id, 'int');
    97                 $name_sql       = $db->real_escape_string($data['name']);
    98                 $bik_sql        = $db->real_escape_string($data['bik']);
    99                 $rs_sql         = $db->real_escape_string($data['rs']);
    100                 $ks_sql         = $db->real_escape_string($data['ks']);
    101                 $comment_sql            = $db->real_escape_string($data['comment']);
    102                 $firm_id        = intval($data['firm_id']);
    103                 if($id) {
    104                     $res =  $db->query("SELECT `num` FROM `doc_kassa` WHERE `ids`='bank' AND `num`='$id'");
    105                     if($res->num_rows) {
    106                         $db->query("UPDATE `doc_kassa` SET `name`='$name_sql', `bik`='$bik_sql', `ks`='$ks_sql', `rs`='$rs_sql', `comment`='$comment_sql', `firm_id`='$firm_id'
    107                                 WHERE `ids`='bank' AND `num`=$id");
    108                         return $id;
    109                     }
    110                 }
    111                 $res = $db->query("SELECT `num` FROM `doc_kassa` WHERE `ids`='bank' ORDER BY `num` DESC LIMIT 1");
    112                 if ($res->num_rows) {
    113                         $line = $res->fetch_row();
    114                         $id = $line[0] + 1;
    115                 } else {
    116                         $id = 1;
    117                 }
    118                 $db->query("INSERT INTO `doc_kassa` (`ids`, `num`, `name`, `bik`, `ks`, `rs`, `comment`, `firm_id`)
    119                         VALUES ('bank', $id, '$name_sql', '$bik_sql', '$ks_sql', '$rs_sql', '$comment_sql', '$firm_id')");
    120                 return $id;
    121         }
    122        
    123151    protected function initFirmList() {
    124         if(isset($this->firm_list)) {
     152        if (isset($this->firm_list)) {
    125153            return;
    126154        }
     
    131159        }
    132160    }
     161
     162    protected function initCashRegisterList() {
     163        if (isset($this->cr_list)) {
     164            return;
     165        }
     166        $ldo = new \Models\LDO\CashRegisterNames();
     167        $this->cr_list = $ldo->getData();
     168    }
     169
    133170}
  • trunk/web/include/listeditors/cashregisters.php

    r968 r972  
    1818namespace ListEditors;
    1919
    20 class KassListEditor extends \ListEditor {
     20class CashRegisters extends \ListEditor {
    2121       
    2222        public function __construct($db_link) {
    2323                parent::__construct($db_link);
    24                 $this->print_name = 'Справочник касс';
    25                 $this->initFirmList();
     24                $this->print_name = 'Справочник кассовых аппаратов';
     25                $this->table_name = 'cash_register';
    2626        }
    2727       
     
    3131                    'id'=>'id',
    3232                    'name'=>'Наименование',
    33                     'firm_id'=>'Организация'
     33                    'connect_line'=>'Строка подключения',
     34                    'password'=>'Пароль',
     35                    'section'=>'Секция'
    3436                );
    35         }
    36        
    37         /// Загрузить список всех элементов справочника
    38         public function loadList() {
    39                 $res = $this->db_link->query("SELECT `num` AS `id`, `name`, `firm_id`
    40                         FROM `doc_kassa`
    41                         WHERE `ids`='kassa'
    42                         ORDER BY `num`");
    43                 $this->list = array();
    44                 while ($line = $res->fetch_assoc()) {
    45                         $this->list[$line['id']] = $line;
    46                 }
    47         }
    48        
    49         public function getItem($id) {
    50                 global $db;
    51                 settype($id, 'int');
    52                 $res = $db->query("SELECT `num` AS `id`, `name`, `bik`, `rs`, `ks`, `firm_id`
    53                         FROM `doc_kassa`
    54                         WHERE `ids`='kassa' AND `num`=$id");
    55                 if ($res->num_rows) {
    56                         return $res->fetch_assoc();
    57                 } else {
    58                         return null;
    59                 }
    60         }
    61 
    62         public function getInputFirm_id($name, $value) {
    63                 $ret = "<select name='$name'>";
    64                 $ret .="<option value='null'>-- не задано --</option>";
    65                 foreach($this->firm_list as $id => $firm_name) {
    66                         $sel = $value==$id?' selected':'';
    67                         $ret .="<option value='$id'{$sel}>$id: ".html_out($firm_name)."</option>";
    68                 }
    69                 $ret .="</select>";
    70                 return $ret;
    71         }
    72        
    73         public function getFieldFirm_id($data) {
    74             if($data['firm_id']>0) {
    75                 return html_out($this->firm_list[$data['firm_id']]);
    76             }
    77             else {
    78                 return '-- не задано --';
    79             }
    80         }
    81 
    82         public function saveItem($id, $data) {
    83                 settype($id, 'int');
    84                 $name_sql = $this->db_link->real_escape_string($data['name']);
    85                 if($data['firm_id']=='null') {
    86                     $firm_id = 'NULL';
    87                 }
    88                 else {
    89                     $firm_id = intval($data['firm_id']);
    90                 }
    91                 if($id) {
    92                     $res =  $this->db_link->query("SELECT `num` FROM `doc_kassa` WHERE `ids`='kassa' AND `num`='$id'");
    93                     if($res->num_rows) {
    94                         $this->db_link->query("UPDATE `doc_kassa` SET `name`='$name_sql', `firm_id`=$firm_id
    95                                 WHERE `ids`='kassa' AND `num`=$id");
    96                         return $id;
    97                     }
    98                 }
    99                 $res = $this->db_link->query("SELECT `num` FROM `doc_kassa` WHERE `ids`='kassa' ORDER BY `num` DESC LIMIT 1");
    100                 if ($res->num_rows) {
    101                         $line = $res->fetch_row();
    102                         $id = $line[0] + 1;
    103                 } else {
    104                         $id = 1;
    105                 }
    106                 $this->db_link->query("INSERT INTO `doc_kassa` (`ids`, `num`, `name`, `firm_id`) ".
    107                         "VALUES ('kassa', $id, '$name_sql', '$firm_id')");
    108                 return $id;
    109         }
    110        
    111     protected function initFirmList() {
    112         if(isset($this->firm_list)) {
    113             return;
    114         }
    115         $this->firm_list = array();
    116         $res = $this->db_link->query("SELECT `id`, `firm_name` FROM `doc_vars` ORDER BY `id`");
    117         while ($line = $res->fetch_assoc()) {
    118             $this->firm_list[$line['id']] = $line['firm_name'];
    119         }
    120     }
     37        }       
     38       
    12139}
  • trunk/web/include/listeditors/kasslisteditor.php

    r968 r972  
    11<?php
     2
    23//      MultiMag v0.2 - Complex sales system
    34//
     
    1617//      You should have received a copy of the GNU Affero General Public License
    1718//      along with this program.  If not, see <http://www.gnu.org/licenses/>.
     19
    1820namespace ListEditors;
    1921
    2022class KassListEditor extends \ListEditor {
    21        
    22         public function __construct($db_link) {
    23                 parent::__construct($db_link);
    24                 $this->print_name = 'Справочник касс';
    25                 $this->initFirmList();
    26         }
    27        
    28         /// Получить массив с именами колонок списка
    29         public function getColumnNames() {
    30                 return array(
    31                     'id'=>'id',
    32                     'name'=>'Наименование',
    33                     'firm_id'=>'Организация'
    34                 );
    35         }
    36        
    37         /// Загрузить список всех элементов справочника
    38         public function loadList() {
    39                 $res = $this->db_link->query("SELECT `num` AS `id`, `name`, `firm_id`
    40                         FROM `doc_kassa`
    41                         WHERE `ids`='kassa'
    42                         ORDER BY `num`");
    43                 $this->list = array();
    44                 while ($line = $res->fetch_assoc()) {
    45                         $this->list[$line['id']] = $line;
    46                 }
    47         }
    48        
    49         public function getItem($id) {
    50                 global $db;
    51                 settype($id, 'int');
    52                 $res = $db->query("SELECT `num` AS `id`, `name`, `bik`, `rs`, `ks`, `firm_id`
    53                         FROM `doc_kassa`
    54                         WHERE `ids`='kassa' AND `num`=$id");
    55                 if ($res->num_rows) {
    56                         return $res->fetch_assoc();
    57                 } else {
    58                         return null;
    59                 }
    60         }
    6123
    62         public function getInputFirm_id($name, $value) {
    63                 $ret = "<select name='$name'>";
    64                 $ret .="<option value='null'>-- не задано --</option>";
    65                 foreach($this->firm_list as $id => $firm_name) {
    66                         $sel = $value==$id?' selected':'';
    67                         $ret .="<option value='$id'{$sel}>$id: ".html_out($firm_name)."</option>";
    68                 }
    69                 $ret .="</select>";
    70                 return $ret;
    71         }
    72        
    73         public function getFieldFirm_id($data) {
    74             if($data['firm_id']>0) {
    75                 return html_out($this->firm_list[$data['firm_id']]);
     24    protected $firm_list;
     25    protected $cr_list;
     26
     27    public function __construct($db_link) {
     28        parent::__construct($db_link);
     29        $this->print_name = 'Справочник касс';
     30        $this->initFirmList();
     31        $this->initCashRegisterList();
     32    }
     33
     34    /// Получить массив с именами колонок списка
     35    public function getColumnNames() {
     36        return array(
     37            'id' => 'id',
     38            'name' => 'Наименование',
     39            'firm_id' => 'Организация',
     40            'cash_register_id' => 'Кассовый аппарат'
     41        );
     42    }
     43
     44    /// Загрузить список всех элементов справочника
     45    public function loadList() {
     46        $res = $this->db_link->query("SELECT `num` AS `id`, `name`, `firm_id`, `cash_register_id`
     47            FROM `doc_kassa`
     48            WHERE `ids`='kassa'
     49            ORDER BY `num`");
     50        $this->list = array();
     51        while ($line = $res->fetch_assoc()) {
     52            $this->list[$line['id']] = $line;
     53        }
     54    }
     55
     56    public function getItem($id) {
     57        global $db;
     58        settype($id, 'int');
     59        $res = $db->query("SELECT `num` AS `id`, `name`, `bik`, `rs`, `ks`, `firm_id`, `cash_register_id`
     60            FROM `doc_kassa`
     61            WHERE `ids`='kassa' AND `num`=$id");
     62        if ($res->num_rows) {
     63            return $res->fetch_assoc();
     64        } else {
     65            return null;
     66        }
     67    }
     68
     69    public function getInputFirm_id($name, $value) {
     70        $ret = "<select name='$name'>";
     71        $ret .= "<option value='null'>-- не задано --</option>";
     72        foreach ($this->firm_list as $id => $firm_name) {
     73            $sel = $value == $id ? ' selected' : '';
     74            $ret .= "<option value='$id'{$sel}>$id: " . html_out($firm_name) . "</option>";
     75        }
     76        $ret .= "</select>";
     77        return $ret;
     78    }
     79
     80    public function getFieldFirm_id($data) {
     81        if ($data['firm_id'] > 0) {
     82            return html_out($this->firm_list[$data['firm_id']]);
     83        } else {
     84            return '-- не задано --';
     85        }
     86    }
     87   
     88    public function getFieldcash_register_id($data) {
     89        if ($data['cash_register_id'] > 0) {
     90            return html_out($this->cr_list[$data['cash_register_id']]);
     91        } else {
     92            return '-- не задано --';
     93        }
     94    }
     95   
     96    public function getInputcash_register_id($name, $value) {
     97        $ret = "<select name='$name'>";
     98        $ret .= "<option value='null'>-- не задано --</option>";
     99        foreach ($this->cr_list as $id => $cr_name) {
     100            $sel = $value == $id ? ' selected' : '';
     101            $ret .= "<option value='$id'{$sel}>$id: " . html_out($cr_name) . "</option>";
     102        }
     103        $ret .= "</select>";
     104        return $ret;
     105    }
     106
     107    public function saveItem($id, $data) {
     108        settype($id, 'int');
     109        $name_sql = $this->db_link->real_escape_string($data['name']);
     110        if ($data['firm_id'] == 'null') {
     111            $firm_id = 'NULL';
     112        } else {
     113            $firm_id = intval($data['firm_id']);
     114        }
     115        if ($data['cash_register_id'] == 'null') {
     116            $cash_register_id = 'NULL';
     117        } else {
     118            $cash_register_id = intval($data['cash_register_id']);
     119        }
     120        if ($id) {
     121            $res = $this->db_link->query("SELECT `num` FROM `doc_kassa` WHERE `ids`='kassa' AND `num`='$id'");
     122            if ($res->num_rows) {
     123                $this->db_link->query("UPDATE `doc_kassa` SET `name`='$name_sql', `firm_id`=$firm_id, `cash_register_id`=$cash_register_id
     124                                WHERE `ids`='kassa' AND `num`=$id");
     125                return $id;
    76126            }
    77             else {
    78                 return '-- не задано --';
    79             }
    80         }
     127        }
     128        $res = $this->db_link->query("SELECT `num` FROM `doc_kassa` WHERE `ids`='kassa' ORDER BY `num` DESC LIMIT 1");
     129        if ($res->num_rows) {
     130            $line = $res->fetch_row();
     131            $id = $line[0] + 1;
     132        } else {
     133            $id = 1;
     134        }
     135        $this->db_link->query("INSERT INTO `doc_kassa` (`ids`, `num`, `name`, `firm_id`, `cash_register_id`) " .
     136                "VALUES ('kassa', $id, '$name_sql', '$firm_id', '$cash_register_id')");
     137        return $id;
     138    }
    81139
    82         public function saveItem($id, $data) {
    83                 settype($id, 'int');
    84                 $name_sql = $this->db_link->real_escape_string($data['name']);
    85                 if($data['firm_id']=='null') {
    86                     $firm_id = 'NULL';
    87                 }
    88                 else {
    89                     $firm_id = intval($data['firm_id']);
    90                 }
    91                 if($id) {
    92                     $res =  $this->db_link->query("SELECT `num` FROM `doc_kassa` WHERE `ids`='kassa' AND `num`='$id'");
    93                     if($res->num_rows) {
    94                         $this->db_link->query("UPDATE `doc_kassa` SET `name`='$name_sql', `firm_id`=$firm_id
    95                                 WHERE `ids`='kassa' AND `num`=$id");
    96                         return $id;
    97                     }
    98                 }
    99                 $res = $this->db_link->query("SELECT `num` FROM `doc_kassa` WHERE `ids`='kassa' ORDER BY `num` DESC LIMIT 1");
    100                 if ($res->num_rows) {
    101                         $line = $res->fetch_row();
    102                         $id = $line[0] + 1;
    103                 } else {
    104                         $id = 1;
    105                 }
    106                 $this->db_link->query("INSERT INTO `doc_kassa` (`ids`, `num`, `name`, `firm_id`) ".
    107                         "VALUES ('kassa', $id, '$name_sql', '$firm_id')");
    108                 return $id;
    109         }
    110        
    111140    protected function initFirmList() {
    112         if(isset($this->firm_list)) {
     141        if (isset($this->firm_list)) {
    113142            return;
    114143        }
    115         $this->firm_list = array();
    116         $res = $this->db_link->query("SELECT `id`, `firm_name` FROM `doc_vars` ORDER BY `id`");
    117         while ($line = $res->fetch_assoc()) {
    118             $this->firm_list[$line['id']] = $line['firm_name'];
     144        $ldo = new \Models\LDO\firmnames();
     145        $this->firm_list = $ldo->getData();
     146    }
     147
     148    protected function initCashRegisterList() {
     149        if (isset($this->cr_list)) {
     150            return;
    119151        }
     152        $ldo = new \Models\LDO\CashRegisterNames();
     153        $this->cr_list = $ldo->getData();
    120154    }
     155
    121156}
  • trunk/web/include/models/ldo/cashregisternames.php

    r963 r972  
    2020
    2121/// Класс списка наименований касс
    22 class kassnames extends \Models\ListDataObject {
     22class CashRegisterNames extends \Models\ListDataObject {
    2323       
    2424        /// @brief Получить данные
    2525        public function getData() {
    2626                global $db;
    27                 $sql = "SELECT `num`, `name` FROM `doc_kassa` WHERE `ids`='kassa' ORDER by `num` ASC";
     27                $sql = "SELECT `id`, `name` FROM `cash_register` ORDER by `id` ASC";
    2828                $result = '';
    2929                $a = array();
    3030                $res = $db->query($sql);
    3131                while ($line = $res->fetch_assoc()) {
    32                         $a[$line['num']] = $line['name'];
     32                        $a[$line['id']] = $line['name'];
    3333                }
    3434                return $a;
Note: See TracChangeset for help on using the changeset viewer.