1
bank1c.php in common – MultiMag

source: common/bank1c.php @ 1c9737e

Last change on this file since 1c9737e was 1c9737e, checked in by BlackLight <blacklight@…>, 2 years ago
  • Добавлена поддержка импорта платёжных поручений из формата банк-клиента 1.03
  • Экспорт CSV вынесен во внешние печатные формы
  • Заявка на комплектующие вынесена во внешние печатные формы
  • Рефакторинг: вынес получение списка модулей в ядро
  • Property mode set to 100644
File size: 12.4 KB
Line 
1<?php
2//      MultiMag v0.2 - Complex sales system
3//
4//      Copyright (C) 2005-2018, BlackLight, TND Team, http://tndproject.org
5//
6//      This program is free software: you can redistribute it and/or modify
7//      it under the terms of the GNU Affero General Public License as
8//      published by the Free Software Foundation, either version 3 of the
9//      License, or (at your option) any later version.
10//
11//      This program is distributed in the hope that it will be useful,
12//      but WITHOUT ANY WARRANTY; without even the implied warranty of
13//      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14//      GNU Affero General Public License for more details.
15//
16//      You should have received a copy of the GNU Affero General Public License
17//      along with this program.  If not, see <http://www.gnu.org/licenses/>.
18//
19
20/// Класс парсера и генератора банковских выписок в формате обмена 1С
21class Bank1CExchange {
22
23    var $rs = '';
24   
25    function __construct() {
26    }
27   
28    /// Анализировать строку документа
29    protected function parseDocumentLineold($name, $value, $params) {
30        switch ($name) {
31            case 'Номер':
32                $params['docnum'] = $value;
33                break;
34            case 'ДатаПроведения':
35                $params['date'] = $value;
36                break;
37            case 'БИК':
38                $params['bik'] = $value;
39                break;
40            case 'Счет':
41                $params['schet'] = $value;
42                break;
43            case 'КорреспондентБИК':
44                $params['kbik'] = $value;
45                break;
46            case 'КорреспондентСчет':
47                $params['kschet'] = $value;
48                break;
49            case 'ДебетСумма':
50                $params['debet'] = $value;
51                break;
52            case 'КредитСумма':
53                $params['kredit'] = $value;
54                break;
55            case 'НазначениеПлатежа':
56                $params['desc'] = $value;
57                break;
58            case 'РасчСчет':
59                $params['rs'] = $value;
60                break;
61        }
62        return $params;
63    }
64   
65    protected function parseDocumentLinev100($name, $value, $params) {
66        return $this->parseDocumentLinev101($name, $value, $params);
67    }
68   
69    protected function parseDocumentLinev101($name, $value, $params) {
70        switch ($name) {
71            // Шапка
72            case 'Номер':
73                $params['docnum'] = $value;
74                break;
75            case 'Дата':
76                $params['date'] = $value;
77                break;
78            case 'ДатаПоступило':
79                $params['p_date'] = $value;
80                break;
81            case 'ДатаСписано':
82                $params['s_date'] = $value;
83                break;
84            case 'Сумма':
85                $params['sum'] = $value;
86                break;
87            // Плательщик
88            case 'ПлательщикСчет':
89                $params['src']['rs'] = $value;
90                break;
91            case 'ПлательщикИНН':
92                $params['src']['inn'] = $value;
93                break;
94            case 'ПлательщикКПП':
95                $params['src']['kpp'] = $value;
96                break;
97            case 'Плательщик1':
98                $params['src']['name'] = $value;
99                break;
100            case 'ПлательщикБанк1':
101                $params['src']['bank_name'] = $value;
102                break;
103            case 'ПлательщикРасчСчет':
104                $params['src']['krs'] = $value;
105                break;
106            case 'ПлательщикБИК':
107                $params['src']['bik'] = $value;
108                break;
109            case 'ПлательщикКорсчет':
110                $params['src']['ks'] = $value;
111                break;
112            // Получатель
113            case 'ПолучательСчет':
114                $params['dst']['rs'] = $value;
115                break;
116            case 'ПолучательИНН':
117                $params['dst']['inn'] = $value;
118                break;
119            case 'ПолучательКПП':
120                $params['dst']['kpp'] = $value;
121                break;
122            case 'Получатель1':
123                $params['dst']['name'] = $value;
124                break;
125            case 'ПолучательБанк1':
126                $params['dst']['bank_name'] = $value;
127                break;
128            case 'ПолучательРасчСчет':
129                $params['dst']['rs'] = $value;
130                break;
131            case 'ПолучательБИК':
132                $params['dst']['bik'] = $value;
133                break;
134            case 'ПолучательКорсчет':
135                $params['dst']['ks'] = $value;
136                break;
137            // Хвост
138            case 'ВидОплаты':
139                $params['vid'] = $value;
140                break;
141            case 'НазначениеПлатежа':
142                $params['desc'] = $value;
143                break;
144        }
145        return $params;
146    }
147   
148    protected function parseDocumentLinev102($name, $value, $params) {
149        switch ($name) {
150            // Шапка
151            case 'Номер':
152                $params['docnum'] = $value;
153                break;
154            case 'Дата':
155                $params['date'] = $value;
156                break;
157            case 'ДатаПоступило':
158                $params['p_date'] = $value;
159                break;
160            case 'ДатаСписано':
161                $params['s_date'] = $value;
162                break;
163            case 'Сумма':
164                $params['sum'] = $value;
165                break;
166            // Плательщик
167            case 'ПлательщикСчет':
168                $params['src']['rs'] = $value;
169                break;
170            case 'ПлательщикИНН':
171                $params['src']['inn'] = $value;
172                break;
173            case 'ПлательщикКПП':
174                $params['src']['kpp'] = $value;
175                break;
176            case 'Плательщик':
177                $params['src']['name'] = $value;
178                break;
179            case 'ПлательщикРасчСчет':
180                $params['src']['krs'] = $value;
181                break;
182            case 'ПлательщикБИК':
183                $params['src']['bik'] = $value;
184                break;
185            case 'ПлательщикБанк1':
186                $params['src']['bank_name'] = $value;
187                break;
188            case 'ПлательщикКорсчет':
189                $params['src']['ks'] = $value;
190                break;
191            // Получатель
192            case 'ПолучательСчет':
193                $params['dst']['rs'] = $value;
194                break;
195            case 'ПолучательИНН':
196                $params['dst']['inn'] = $value;
197                break;
198            case 'ПолучательКПП':
199                $params['dst']['kpp'] = $value;
200                break;
201            case 'Получатель':
202                $params['dst']['name'] = $value;
203                break;
204            case 'ПолучательРасчСчет':
205                $params['dst']['rs'] = $value;
206                break;
207            case 'ПолучательБИК':
208                $params['dst']['bik'] = $value;
209                break;
210            case 'ПолучательБанк1':
211                $params['dst']['bank_name'] = $value;
212                break;
213            case 'ПолучательКорсчет':
214                $params['dst']['ks'] = $value;
215                break;
216            // Хвост
217            case 'ВидОплаты':
218                $params['vid'] = $value;
219                break;
220            case 'ВидПлатежа':
221                $params['vid_p'] = $value;
222                break;
223            case 'НазначениеПлатежа':
224                $params['desc'] = $value;
225                break;
226        }
227        return $params;
228    }
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     */
240    function Parse($raw_data) {
241        $params = array();
242        $parsed_data = array();
243        $parsing = false;
244        $first_line = 1;
245        $version = 0;
246        foreach ($raw_data as $line) {
247            // Кодировку, установленную в файле не учитываем, т.к. параметр кодировки назван кириллицей. Получается, что для чтения кодировки нужно знать кодировку.
248            $line = iconv('windows-1251', 'UTF-8', $line);
249            $line = trim($line);
250            if($first_line) {
251                if($line != '1CClientBankExchange') {
252                    throw new \Exception('Файл не является банковской выпиской в формате 1C!');
253                }
254                $first_line = 0;
255            }
256            else {
257                $pl = explode("=", $line, 2);
258                switch($pl[0]) {                   
259                    case 'ВерсияФормата':
260                        $version = trim($pl[1]);
261                        break;
262                    case 'СекцияРасчСчет':
263                            $parsing = true;
264                            $params = array();
265                            $params['type'] = 'rs';
266                        break;
267                    case 'КонецРасчСчет':
268                        if ($parsing) {
269                            if(isset($parsed_data['rs'])) {
270                                $this->rs = $parsed_data['rs'];
271                            }
272                            $parsing = false;
273                        }
274                        break;
275                    case 'СекцияДокумент':
276                        if ($pl[1] == "Платёжное поручение" || $pl[1] == "Платежное поручение" || $pl[1] == "Банковский ордер") {
277                            $parsing = true;
278                            $params = array();
279                            $params['type'] = 'pp';
280                        }   
281                        break;
282                    case 'КонецДокумента':
283                        if ($parsing) {
284                            $parsed_data[] = $params;
285                            $parsing = false;
286                        }
287                        break;
288                    default:
289                        if($parsing) {
290                            switch($version) {
291                                case '1.00':
292                                    $params = $this->parseDocumentLinev100($pl[0], $pl[1], $params);
293                                    break;
294                                case '1.01':
295                                    $params = $this->parseDocumentLinev101($pl[0], $pl[1], $params);
296                                    break;
297                                case '1.02':
298                                    $params = $this->parseDocumentLinev102($pl[0], $pl[1], $params);
299                                    break;
300                                case '1.03':
301                                    $params = $this->parseDocumentLinev103($pl[0], $pl[1], $params);
302                                    break;
303                                default:
304                                    throw new \Exception("Неподдерживаемая версия формата обмена: $version.
305                                    Поддерживаются версии 1.00 - 1.03.
306                                    Выберите при экспорте в приложении, откуда вы импортировали файл, подходящую версию");
307                            }
308                           
309                        }
310                }
311            }
312        }
313        return $parsed_data;
314    }
315
316}
Note: See TracBrowser for help on using the repository browser.