1
Changeset 1c9737e – MultiMag

Changeset 1c9737e


Ignore:
Timestamp:
Jun 5, 2020, 2:03:22 AM (6 weeks ago)
Author:
BlackLight <blacklight@…>
Branches:
master
Children:
6b64c9e
Parents:
a32a009
git-author:
BlackLight <blacklight@…> (04/06/20 22:37:18)
git-committer:
BlackLight <blacklight@…> (05/06/20 02:03:22)
Message:
  • Добавлена поддержка импорта платёжных поручений из формата банк-клиента 1.03
  • Экспорт CSV вынесен во внешние печатные формы
  • Заявка на комплектующие вынесена во внешние печатные формы
  • Рефакторинг: вынес получение списка модулей в ядро
Files:
10 added
9 edited

Legend:

Unmodified
Added
Removed
  • common/bank1c.php

    ra32a009 r1c9737e  
    109109            case 'ПлательщикКорсчет':
    110110                $params['src']['ks'] = $value;
     111                break;
    111112            // Получатель
    112113            case 'ПолучательСчет':
     
    187188            case 'ПлательщикКорсчет':
    188189                $params['src']['ks'] = $value;
     190                break;
    189191            // Получатель
    190192            case 'ПолучательСчет':
     
    225227        return $params;
    226228    }
    227    
    228     /// @biref Парсер выписки
    229     /// Бросает исключение, если идентификатор не соответствует формату
     229
     230    protected function parseDocumentLinev103($name, $value, $params) {
     231        return $this->parseDocumentLinev102($name, $value, $params);
     232    }
     233
     234    /**
     235     * Парсер выписки
     236     * @param $raw_data
     237     * @return array
     238     * @throws Exception Бросает исключение, если идентификатор не соответствует формату
     239     */
    230240    function Parse($raw_data) {
    231241        $params = array();
     
    288298                                    $params = $this->parseDocumentLinev102($pl[0], $pl[1], $params);
    289299                                    break;
     300                                case '1.03':
     301                                    $params = $this->parseDocumentLinev103($pl[0], $pl[1], $params);
     302                                    break;
    290303                                default:
    291                                     throw new \Exception("неподдерживаемая версия формата: $version");
     304                                    throw new \Exception("Неподдерживаемая версия формата обмена: $version.
     305                                    Поддерживаются версии 1.00 - 1.03.
     306                                    Выберите при экспорте в приложении, откуда вы импортировали файл, подходящую версию");
    292307                            }
    293308                           
  • common/core.common.php

    ra32a009 r1c9737e  
    334334}
    335335
     336/**
     337 * Получить список php-модулей в заданной директории сиситемы
     338 * @param string $dirname Относительный путь к директории
     339 * @return array
     340 */
     341function getModuleListInDir($dirname, $location = 'global') {
     342    switch ($location) {
     343        case 'site':
     344            $loc = \cfg::get('site', 'location');
     345            break;
     346        case 'cli':
     347            $loc = \cfg::get('cli', 'location');
     348            break;
     349        default:
     350            $loc = \cfg::getroot('location');
     351            break;
     352    }
     353    $dir = $loc . '/' . $dirname . '/';
     354    $list = [];
     355    if (is_dir($dir)) {
     356        $dh = opendir($dir);
     357        if ($dh) {
     358            while (($file = readdir($dh)) !== false) {
     359                if (preg_match('/.php$/', $file)) {
     360                    $cn = explode('.', $file);
     361                    $list[] = $cn[0];
     362                }
     363            }
     364            closedir($dh);
     365        }
     366    }
     367    return $list;
     368}
     369
    336370/// @brief Класс расширяет функциональность mysqli
    337371/// Т.к. используется почти везде, нет смысла выносить в отдельный файл
  • common/document.php

    ra32a009 r1c9737e  
    214214    /** Сохранить запись журнала о совершённом действии
    215215     *
    216      * @param type $action  Действие
    217      * @param type $array   Массив с изменениями в формате ['param'=>['old'=>$old_data,'new'=>$new_data],....]
     216     * @param string $action  Действие
     217     * @param array $array   Массив с изменениями в формате ['param'=>['old'=>$old_data,'new'=>$new_data],....]
    218218     */
    219219    protected function writeLogArray($action, $array) {
  • web/include/acl/doc/main.php

    ra32a009 r1c9737e  
    4444                );
    4545            $subList = $this->processDir($dir.$id.'/', $id, '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;');
     46
    4647            foreach ($subList as $subId => $subItem) {
    4748                $this->list[$subId] = array(
  • web/include/api/document.php

    ra32a009 r1c9737e  
    183183            throw new \AccessException('Не достаточно привилегий для получения печатной формы');
    184184        }
    185         return ['id'=>$doc_id, 'printforms' => $document->getCSVPrintFormList()];
     185        return ['id'=>$doc_id, 'printforms' => $document->getPrintFormList()];
    186186    }
    187187
  • web/include/doc.nulltype.php

    ra32a009 r1c9737e  
    955955            $aclFlag = \acl::GET_PRINTFORM;
    956956        }
    957         $ret = array();
    958         if (isset($this->PDFForms)) {
    959             if (is_array($this->PDFForms)) {
    960                 foreach ($this->PDFForms as $form) {
    961                     $ret[] = array('name' => 'int:' . $form['name'], 'desc' => $form['desc'], 'mime' => '');
    962                 }
    963             }
    964         }
    965         $dir = $CONFIG['site']['location'] . '/include/doc/printforms/' . $this->typename . '/';
    966         if (is_dir($dir)) {
    967             $dh = opendir($dir);
    968             if ($dh) {
    969                 while (($file = readdir($dh)) !== false) {
    970                     if (preg_match('/.php$/', $file)) {
    971                         $cn = explode('.', $file);
    972                         $class_name = '\\doc\\printforms\\' . $this->typename . '\\' . $cn[0];
    973                         $class = new $class_name;
    974                         $nm = $class->getName();
    975                         $mime = $class->getMimeType();
    976                         if (\acl::testAccess("doc.{$this->typename}.{$cn[0]}", $aclFlag)) {
    977                             $ret[] = array('name' => 'ext:' . $cn[0], 'desc' => $nm, 'mime' => $mime);
    978                         }
    979                     }
    980                 }
    981                 closedir($dh);
    982             }
    983         }
     957        $ret = [];
     958        $modules = \getModuleListInDir('include/doc/printforms', 'site');
     959
     960        foreach ($modules as $module) {
     961            $class_name = '\\doc\\printforms\\' . $this->typename . '\\' . $module;
     962            $class = new $class_name;
     963            $nm = $class->getName();
     964            $mime = $class->getMimeType();
     965            if (\acl::testAccess("doc.{$this->typename}.{$module}", $aclFlag)) {
     966                $ret[] = array('name' => 'ext:' . $module, 'desc' => $nm, 'mime' => $mime);
     967            }
     968        }
     969
    984970        usort($ret, array(get_class(), 'sortDescriptionCallback'));
    985         return $ret;
    986     }
    987 
    988     /// Получить список доступных печатных форм c CSV экспортом
    989     /// @return Массив со списком печатных форм
    990     public function getCSVPrintFormList() {
    991         $ret = $this->getPrintFormList();
    992         if ($this->sklad_editor_enable) {
    993             $ret[] = array('name' => 'csv:export', 'desc' => 'Экспорт в CSV', 'mime' => 'text/csv');
    994         }
    995971        return $ret;
    996972    }
     
    999975    /// @return true, если существует, false в ином случае
    1000976    protected function isPrintFormExists($form_name) {
    1001         $forms = $this->getCSVPrintFormList();
     977        $forms = $this->getPrintFormList();
    1002978        $found = false;
    1003979        foreach ($forms as $form) {
     
    1013989    /// @return тип, если форма существует, false в ином случае
    1014990    protected function getPrintFormMime($form_name) {
    1015         $forms = $this->getCSVPrintFormList();
     991        $forms = $this->getPrintFormList();
    1016992        $found = false;
    1017993        foreach ($forms as $form) {
     
    10671043        }
    10681044        $f_param = explode(':', $form_name);
    1069         if ($f_param[0] == 'int') {
    1070             $method = '';
    1071             foreach ($this->PDFForms as $form) {
    1072                 if ($form['name'] == $f_param[1]) {
    1073                     $method = $form['method'];
    1074                 }
    1075             }
    1076             return $this->$method($to_str);
    1077         } elseif ($f_param[0] == 'ext') {
     1045        if ($f_param[0] == 'ext') {
    10781046            $class_name = '\\doc\\printforms\\' . $this->typename . '\\' . $f_param[1];
    10791047            $print_obj = new $class_name;
     
    10821050            $print_obj->make();
    10831051            return $print_obj->outData($to_str);
    1084         } elseif ($f_param[0] == 'csv') {
    1085             return $this->CSVExport($to_str);
    10861052        } else {
    10871053            throw new \NotFoundException('Неверный тип печатной формы');
     
    11301096        }
    11311097    }
    1132    
     1098
    11331099    /** Отправка документа по факсу на указанный номер
    1134      * 
     1100     *
    11351101     * @param $form_name Имя формы отправляемого документа
    11361102     * @param $faxnum Номер факса получателя
     1103     * @return bool
     1104     * @throws NotFoundException
    11371105     */
    11381106    final function sendFaxTo($form_name, $faxnum) {
     
    11851153                    'response' => 'item_list',
    11861154                    'email' => $agent->getEmail(),
    1187                     'content' => $this->getCSVPrintFormList()
     1155                    'content' => $this->getPrintFormList()
    11881156                );
    11891157                $tmpl->setContent(json_encode($ret_data, JSON_UNESCAPED_UNICODE));
     
    12091177        }
    12101178    }
    1211    
     1179
    12121180    /** Отправка документа по электронной почте
    1213      * 
     1181     *
    12141182     * @param $form_name Имя печатной формы
    12151183     * @param $email Адрес электронной почты
    12161184     * @param string $text Текст сообщения электронной почты
     1185     * @return true
     1186     * @throws Exception
    12171187     */
    12181188    final function sendEmailTo($form_name, $email, $text='') {
     
    12331203    /// Печать документа
    12341204    /// @param $form_name   Имя печатной формы
    1235     /// @param $user_print  Если истина - документ запрошен из пользовательского раздела
    12361205    function printForm($form_name = '') {
    12371206        global $tmpl;
     
    12401209            $ret_data = array(
    12411210                'response' => 'item_list',
    1242                 'content' => $this->getCSVPrintFormList()
     1211                'content' => $this->getPrintFormList()
    12431212            );
    12441213            $tmpl->setContent(json_encode($ret_data, JSON_UNESCAPED_UNICODE));
     
    19941963
    19951964    protected function drawKassaField() {
    1996         global $tmpl, $db, $CONFIG;
     1965        global $tmpl, $db;
    19971966        if ($this->doc_data['kassa']) {
    19981967            $kassa = $this->doc_data['kassa'];
     
    23092278                }
    23102279
    2311                 /*
    2312                   $line['price_wo_vat'] = round($line['price'] / (1 + ($line['vat_p'] / 100)), 2);
    2313                   $line['sum_wo_vat'] = $line['price_wo_vat'] * $line['cnt'];
    2314                   $line['vat_s'] = ($line['price'] * $line['cnt']) - $line['sum_wo_vat']; */
    23152280                $pos = $this->calcVAT($line['price'], $line['cnt'], $vat);
    23162281                $line['price_wo_vat'] = $pos['price'];
     
    25662531    }
    25672532
    2568     /// Экспорт табличной части документа в CSV
    2569     function CSVExport($to_str = 0) {
    2570         global $tmpl;
    2571         $header = "PosNum;ID;VC;Name;Vendor;Cnt;Price;Sum;Comment\r\n";
    2572         if (!$to_str) {
    2573             $tmpl->ajax = 1;
    2574             header("Content-type: 'application/octet-stream'");
    2575             header("Content-Disposition: 'attachment'; filename=predlojenie.csv;");
    2576             echo $header;
    2577         } else {
    2578             $str_out = $header;
    2579         }
    2580         $nomenclature = $this->getDocumentNomenclature('base_desc');
    2581 
    2582         $i = 0;
    2583         foreach ($nomenclature as $line) {
    2584             $i++;
    2585             $str_line = "$i;{$line['pos_id']};\"{$line['vc']}\";\"{$line['name']}\";\"{$line['vendor']}\";{$line['cnt']};{$line['price']};{$line['sum']}\r\n";
    2586             if (!$to_str) {
    2587                 echo $str_line;
    2588             } else {
    2589                 $str_out.=$str_line;
    2590             }
    2591         }
    2592         if ($to_str) {
    2593             return $str_out;
    2594         }
    2595     }
    25962533
    25972534    /// @brief Создание другого документа на основе текущего
  • web/include/doc.zayavka.php

    ra32a009 r1c9737e  
    2323    /// @param doc id документа
    2424    function __construct($doc = 0) {
    25         global $CONFIG, $db;
    26         $this->def_dop_data = array('status' => '', 'pie' => 0, 'buyer_phone' => '', 'buyer_email' => '',
    27             'delivery' => 0, 'delivery_address' => '', 'delivery_date' => '', 'delivery_region' => '', 'ishop' => 0, 'buyer_rname' => '', 'buyer_ip' => '',
    28             'pay_type' => '', 'cena' => '', 'worker_id'=>0);
     25        $this->def_dop_data = [
     26            'status' => '',
     27            'pie' => 0,
     28            'buyer_phone' => '',
     29            'buyer_email' => '',
     30            'delivery' => 0,
     31            'delivery_address' => '',
     32            'delivery_date' => '',
     33            'delivery_region' => '',
     34            'ishop' => 0,
     35            'buyer_rname' => '',
     36            'buyer_ip' => '',
     37            'pay_type' => '',
     38            'cena' => '',
     39            'worker_id' => 0
     40        ];
    2941        parent::__construct($doc);
    3042        $this->doc_type = 3;
  • web/include/doc.zsbor.php

    ra32a009 r1c9737e  
    2424        /// @param doc id документа
    2525        function __construct($doc = 0) {
    26                 global $CONFIG, $db;
    2726                $this->def_dop_data = array();
    2827                parent::__construct($doc);
     
    3332                $this->header_fields = 'sklad cena';
    3433                settype($this->id, 'int');
    35                 $this->PDFForms = array(
    36                     array('name' => 'z_kompl', 'desc' => 'Заявка на комплектующие', 'method' => 'PrintKompl')
    37                 );
    3834        }
    3935
     
    4945            foreach($morphs as $id => $line) {
    5046                if(\acl::testAccess($line['acl_object'], \acl::CREATE)) {
    51                     $tmpl->addContent("<div onclick=\"{$base_link}{$id}'\">{$line['viewname']}</div>");
     47                    $tmpl->addContent("<div onclick=\"{$base_link}{$id}\">{$line['viewname']}</div>");
    5248                }
    5349            }
     
    7975    }
    8076
    81     /// Заявка на комплектующие
    82         /// @param to_str       Вернуть в виде строки (иначе - вывести в броузер)
    83         function PrintKompl($to_str = 0) {
    84                 require('fpdf/fpdf_mc.php');
    85                 global $tmpl, $CONFIG, $db;
    86                
    87                 if (!$to_str)   $tmpl->ajax = 1;
    88 
    89                 $pdf = new PDF_MC_Table('P');
    90                 $pdf->Open();
    91                 $pdf->SetAutoPageBreak(0, 10);
    92                 $pdf->AddFont('Arial', '', 'arial.php');
    93                 $pdf->tMargin = 5;
    94                 $pdf->AddPage();
    95                 $pdf->SetFont('Arial', '', 10);
    96                 $pdf->SetFillColor(255);
    97 
    98                 $dt = date("d.m.Y", $this->doc_data['date']);
    99                
    100                 $pdf->SetFont('', '', 16);
    101                 $str="Заявка на комплектующие к заявке на сборку\nN {$this->doc_data['altnum']}{$this->doc_data['subtype']} ({$this->id}), от $dt";
    102                 $pdf->MultiCellIconv(0, 7, $str, 0, 'C');
    103                 $pdf->Ln();
    104 
    105                 $pdf->SetLineWidth(0.5);
    106                
    107                 $t_width = array(10, 110, 20, 20, 20, 10);
    108                 $t_text = array('№', 'Наименование', 'Заявка', 'Есть', 'Нужно', 'Ед.');
    109                 $aligns = array('R', 'L', 'R', 'R', 'R', 'L');
    110                 $pdf->SetFont('', '', 12);
    111                 foreach($t_width as $id=>$w) {
    112                         $pdf->CellIconv($w, 6, $t_text[$id], 1, 0, 'C', 0);
    113                 }
    114 
    115                 $pdf->Ln();
    116                 $pdf->SetWidths($t_width);
    117                 $pdf->SetAligns($aligns);
    118                 $pdf->SetHeight(3.8);
    119                 $pdf->SetLineWidth(0.2);
    120                 $pdf->SetFont('', '', 8);
    121 
    122                 $res = $db->query("SELECT `doc_base_kompl`.`kompl_id`, SUM(`doc_base_kompl`.`cnt`*`doc_list_pos`.`cnt`) AS `cnt`,
     77    function getDocumentNomenclatureForMakeOrder() {
     78            global $db;
     79        $res = $db->query("SELECT `doc_base_kompl`.`kompl_id`, SUM(`doc_base_kompl`.`cnt`*`doc_list_pos`.`cnt`) AS `cnt`,
    12380                                `doc_group`.`printname` AS `group_printname`, `doc_base`.`name`, `doc_base`.`proizv` AS `vendor`, `doc_base`.`vc`,
    12481                                `class_unit`.`rus_name1` AS `units`, `doc_base_cnt`.`cnt` AS `sklad_cnt`
     
    13289                        GROUP BY  `doc_base_kompl`.`kompl_id`
    13390                        ORDER BY `doc_list_pos`.`id`");
    134                 $i = 0;
    135                 $sum = $summass = 0;
    136                 while ($nxt = $res->fetch_assoc()) {
    137                         $i++;
    138                         $name = '';
    139                         if($nxt['vc']!=='' && @$CONFIG['poseditor']['vc'])
    140                                 $name .= $nxt['vc'].' ';
    141                         if($nxt['group_printname']!=='')
    142                                 $name .= $nxt['group_printname'].' ';
    143                         $name .= $nxt['name'];
    144                         if($nxt['vendor']!=='' && !@$CONFIG['doc']['no_print_vendor'])
    145                                 $name .= ' ('.$nxt['vendor'].')';
    146 
    147                         if ($pdf->h <= ($pdf->GetY() + 40 ))
    148                                 $pdf->AddPage();
    149                         $cnt = sprintf("%0.3f", $nxt['cnt']);
    150                         $sklad_cnt = sprintf("%0.3f", $nxt['sklad_cnt']);
    151                         if($nxt['cnt'] > $nxt['sklad_cnt'])
    152                                 $need_cnt = sprintf("%0.3f", $nxt['cnt'] - $nxt['sklad_cnt']);
    153                         else    $need_cnt = '0.000';
    154                        
    155                         $row = array($i, $name, $cnt, $sklad_cnt, $need_cnt, $nxt['units']);
    156                        
    157                         $pdf->RowIconv($row);
    158                 }
    159 
    160                
    161 
    162                 $res = $db->query("SELECT `worker_real_name`, `worker_phone`, `worker_email` FROM `users_worker_info` WHERE `user_id`='{$this->doc_data['user']}'");
    163                 if ($res->num_rows) {
    164                         $worker_info = $res->fetch_assoc();
    165                         $pdf->SetAutoPageBreak(0, 10);
    166                         $pdf->SetY($pdf->h - 18);
    167                         $pdf->Ln(1);
    168                         $pdf->SetFont('', '', 10);
    169                         $str = "Отв. оператор " . $worker_info['worker_real_name'];
    170                         $pdf->CellIconv(0, 4, $str, 0, 1, 'R', 0);
    171                         $str = "Контактный телефон: " . $worker_info['worker_phone'];
    172                         $pdf->CellIconv(0, 4, $str, 0, 1, 'R', 0);
    173                         $str = "Электронная почта: " . $worker_info['worker_email'];
    174                         $pdf->CellIconv(0, 4, $str, 0, 1, 'R', 0);
    175                 } else {
    176                         $pdf->SetAutoPageBreak(0, 10);
    177                         $pdf->SetY($pdf->h - 12);
    178                         $pdf->Ln(1);
    179                         $pdf->SetFont('', '', 10);
    180                         $str = "Login автора: " . $_SESSION['name'];
    181                         $pdf->CellIconv(0, 4, $str, 0, 1, 'R', 0);
    182                 }
    183 
    184                 if ($to_str)
    185                         return $pdf->Output('zayavka.pdf', 'S');
    186                 else
    187                         $pdf->Output('zayavka.pdf', 'I');
    188         }
     91        $list = [];
     92        while ($line = $res->fetch_assoc()) {
     93            $list[] = $line;
     94        }
     95        $res->free();
     96        return $line;
     97    }
    18998
    19099}
    191 
    192 ;
    193 ?>
  • web/include/doc/printforms/realizaciya/updcsv.php

    ra32a009 r1c9737e  
    22//      MultiMag v0.2 - Complex sales system
    33//
    4 //      Copyright (C) 2005-2018, BlackLight, TND Team, http://tndproject.org
     4//      Copyright (C) 2005-2020, BlackLight, TND Team, http://tndproject.org
    55//
    66//      This program is free software: you can redistribute it and/or modify
     
    1919namespace doc\printforms\realizaciya;
    2020
    21 class updCsv extends \doc\printforms\iPrintForm {
     21use doc\printforms\iPrintFormCSV;
     22
     23class updCsv extends iPrintFormCSV {
    2224
    2325    protected $buf = '';
    24 
    25     public function __construct() {
    26         parent::__construct();
    27         $this->mime = "text/csv";
    28     }
    2926
    3027    public function getName() {
     
    3229    }
    3330
    34     /// Инициализация модуля вывода данных
    35     public function initForm() {
    36         $this->buf = fopen('php://memory', 'r+');
    37     }
    38 
    39     protected function out($fields) {
    40         fputcsv($this->buf, $fields);
    41     }
    42 
    43     /// Вывод данных
    44     /// @param $to_str Если истина - вернёт буфер с данными. Иначе - вывод в файл.
    45     public function outData($to_str=false) {
    46         global $tmpl;
    47         rewind($this->buf);
    48         $csv_data = stream_get_contents($this->buf);
    49         fclose($this->buf);
    50 
    51         $fname = get_class($this);
    52         $matches = null;
    53         if (preg_match('@\\\\([\w]+)$@', $fname, $matches)) {
    54             $fname = $matches[1];
    55         }
    56 
    57         if ($to_str) {
    58             return $csv_data;
    59         }
    60         else {
    61             $tmpl->ajax = 1;
    62             header("Content-type: 'application/octet-stream'");
    63             header("Content-Disposition: 'attachment'; filename=$fname.csv;");
    64             echo $csv_data;
    65         }
    66     }
    67 
    6831    /// Сформировать данные печатной формы
    6932    public function make() {
    70         global $db;
    71 
    7233        $doc_data = $this->doc->getDocDataA();
    73         $dop_data = $this->doc->getDopDataA();
    74         $firm_vars = $this->doc->getFirmVarsA();
    7534
    7635        $this->out(["Счёт - фактура N", $doc_data['altnum'], "от", date("d.m.Y", $doc_data['date'])]);
Note: See TracChangeset for help on using the changeset viewer.