Форма 7 и форма 112 для Почты России
Как бы не ругали Почту России, но основная масса интернет-магазинов отправляет товары покупателям в том числе и через неё. И если у Вас достаточно большой объем заказов (а именно к этому мы все и стремимся) — возникает вопрос автоматизации оформления документов для отправки посылок Почтой России. Чаще всего в качестве документов используется форма 7 и форма 112.
К моему удивлению за 3 года работы в сфере сайтостроения впервые столкнулся с вопросом автоматизации оформления документов для отправки посылок Почтой России. Скорей всего дело в том, что многие наши клиенты просто не знают о такой возможности, а может просто попался настолько ленивый клиент, что ему не хочется вручную заполнять все эти формы и бланки.
К тому же, проблема состоит в том, что мне никогда не приходилось заниматься отправкой посылок Почтой России, разве что однажды, в 90-ые годы выписывал из журналов какие-то книги, но всё же это не то, т.к. я получал, а не отправлял.
Недолго думая я полез в интернет за решением. Поиск не увенчался успехом. В качестве решения предлагалось использовать сторонние сервисы за «символическую» плату. Под словом «символическая» я подразумеваю приличную помесячную оплату сервиса.
А если вы читаете эту статью, значит вы такие же как и я — не любители платить. А клиентам объяснить, что им придется еще куда-то платить каждый месяц, еще сложнее.
К тому же, как оказалось, использование подобного рода сервисов накладывает некоторые ограничения, например нельзя добавить свой логотип, сменить шрифты, разместить текст подругому и т.д.
Вывод, как всегда решил сделать всё по своему.
Как это работает?
Решение не идеальное, но очень простое: мы возьмем формы в виде картинок и заполним их, а потом выведем на экран.
Итак, для примера мы возьмем 4 наиболее распространенные почтовые формы:
- Форма 7 адресный ярлык. Отправление 1 класса;
- Форма 7 адресный ярлык. Бандероль;
- Форма 7 адресный ярлык. Посылка;
- Форма 112ЭП Наложенный платеж + почтовый перевод.
Слишком подробно описывать не стану, а лишь расскажу принцип работы скрипта, к тому же код вполне прокомментирован и не должен вызвать затруднений в его понимании.
Создайте каталог на сервере в удобном для вас месте и назовите его к примеру print_form. В нем создайте каталог fonts и добавьте в него удобные для вас шрифты (обязательно в формате ttf).
Важно: Обязательно возьмите шрифт post.ttf из вложения в конце статьи, т.к. он понадобится для написания почтового индекса (ZIP кода).
Также создайте каталог forms, и загрузите изображения почтовых форм, которые представлены выше.
Скрипт будет состоять из 3х файлов. Можно было сделать всё в одном, но я предпочел не комкать всё в одну кучу.
Форма 7
Создайте в каталоге print_form файл f7.php со следующим содержимым:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
<?php function getDataF7($id) { $data = array ( 'from_surname' => 'Иванов', //Фамилия отправителя 'from_name' => 'Иван', //Имя отправителя 'from_middlename' => 'Иванович', //Отчество отправителя 'from_state' => 'Московская обл.', //Район\Область отправителя 'from_city' => 'г.Москва', //Город\Населенный пункт отправителя 'from_street' => 'пр-кт Комсомольский', //Улица получателя 'from_build' => 'д.38', //Дом\Строение отправителя 'from_appartment' => 'кв.35', //Квартира отправителя 'from_zip' => '119146', //Почтовый индекс отправителя 'whom_surname' => 'Петров', //Фамилия получателя 'whom_name' => 'Петр', //Имя получателя 'whom_middlename' => 'Петрович', //Отчество получателя 'whom_state' => 'Красноярский край', //Район\Область получателя 'whom_city' => 'г.Красноярск', //Город\Населенный пункт получателя 'whom_street' => 'ул.Квартальная', //Улица получателя 'whom_build' => '13', //Дом\Строение получателя 'whom_appartment' => '3', //Квартира получателя 'whom_zip' => '660046', //Почтовый индекс получателя 'declared_value' => '19338.55', //Сумма объявленной ценности 'COD_amount' => '20551.17' //Сумма наложенного платежа ); return $data; } function printF7A($id) { $file = 'forms/f7a.png'; if (file_exists($file)) { $image = imagecreatefrompng($file); //Создаем изображение из уже имеющейся формы $textcolor = imagecolorallocate($image, 0, 0, 0); //Задаем цвет написания в формате RGB, в данном случае черным. $font = 'fonts/timesbd.ttf'; //Задаем шрифт для написания, в данном случае "Times New Roman bold" $font_post = 'fonts/post.ttf'; //Задаем шрифт для написания индекса (ZIP код) $data = getDataF7($id); imagettftext($image, 11, 0, 70, 188, $textcolor, $font, $data['from_surname']); imagettftext($image, 11, 0, 20, 213, $textcolor, $font, $data['from_name'] . ' ' . $data['from_middlename']); imagettftext($image, 11, 0, 70, 245, $textcolor, $font, $data['from_state']); imagettftext($image, 11, 0, 20, 270, $textcolor, $font, $data['from_city'] . ' ' . $data['from_street']); imagettftext($image, 11, 0, 20, 300, $textcolor, $font, $data['from_build'] . ' ' . $data['from_appartment']); $x = 156; for ($i = 0; $i < strlen($data['from_zip']); $i++) { imagettftext($image, 19, 0, $x, 328, $textcolor, $font, $data['from_zip'][$i]); $x = $x+23; } imagettftext($image, 11, 0, 369, 285, $textcolor, $font, $data['whom_surname']); imagettftext($image, 11, 0, 332, 308, $textcolor, $font, $data['whom_name'] . ' ' . $data['whom_middlename']); imagettftext($image, 11, 0, 369, 340, $textcolor, $font, $data['whom_state'] . ' ' . $data['whom_city']); imagettftext($image, 11, 0, 332, 366, $textcolor, $font, $data['whom_street'] . ' ' . $data['whom_build'] . ' ' . $data['whom_appartment']); $x = 532; for ($i = 0; $i < strlen($data['whom_zip']); $i++) { imagettftext($image, 19, 0, $x, 395, $textcolor, $font, $data['whom_zip'][$i]); $x = $x+23; } imagettftext($image, 10, 0, 306, 184, $textcolor, $font, $data['declared_value']); imagettftext($image, 10, 0, 306, 194, $textcolor, $font, SumProp($data['declared_value'], 'руб. ', 'коп.')); imagettftext($image, 10, 0, 306, 233, $textcolor, $font, $data['COD_amount']); imagettftext($image, 10, 0, 306, 243, $textcolor, $font, SumProp($data['COD_amount'], 'руб. ', 'коп.')); $x = 50; for ($i = 0; $i < strlen($data['whom_zip']); $i++) { imagettftext($image, 43, 0, $x, 467, $textcolor, $font_post, $data['whom_zip'][$i]); $x = $x+41.8; } //Выводим заполненную форму на экран header('Content-type: image/png'); imagepng($image); imagedestroy($image); } else { echo 'Файл формы "' . $file . '" не найден.'; } } function printF7B($id) { $file = 'forms/f7b.png'; if (file_exists($file)) { $image = imagecreatefrompng($file); //Создаем изображение из уже имеющейся формы $textcolor = imagecolorallocate($image, 0, 0, 0); //Задаем цвет написания в формате RGB, в данном случае черным. $font = 'fonts/timesbd.ttf'; //Задаем шрифт для написания, в данном случае "Times New Roman bold" $font_post = 'fonts/post.ttf'; //Задаем шрифт для написания индекса (ZIP код) $data = getDataF7($id); imagettftext($image, 11, 0, 70, 128, $textcolor, $font, $data['from_surname']); imagettftext($image, 11, 0, 20, 151, $textcolor, $font, $data['from_name'] . ' ' . $data['from_middlename']); imagettftext($image, 11, 0, 70, 178, $textcolor, $font, $data['from_state']); imagettftext($image, 11, 0, 20, 202, $textcolor, $font, $data['from_city'] . ' ' . $data['from_street']); imagettftext($image, 11, 0, 20, 227, $textcolor, $font, $data['from_build'] . ' ' . $data['from_appartment']); $x = 137; for ($i = 0; $i < strlen($data['from_zip']); $i++) { imagettftext($image, 19, 0, $x, 253, $textcolor, $font, $data['from_zip'][$i]); $x = $x+20; } imagettftext($image, 11, 0, 324, 223, $textcolor, $font, $data['whom_surname']); imagettftext($image, 11, 0, 290, 247, $textcolor, $font, $data['whom_name'] . ' ' . $data['whom_middlename']); imagettftext($image, 11, 0, 324, 274, $textcolor, $font, $data['whom_state'] . ' ' . $data['whom_city']); imagettftext($image, 11, 0, 290, 298, $textcolor, $font, $data['whom_street'] . ' ' . $data['whom_build'] . ' ' . $data['whom_appartment']); $x = 464; for ($i = 0; $i < strlen($data['whom_zip']); $i++) { imagettftext($image, 19, 0, $x, 325, $textcolor, $font, $data['whom_zip'][$i]); $x = $x+20; } imagettftext($image, 10, 0, 266, 142, $textcolor, $font, $data['declared_value']); imagettftext($image, 10, 0, 266, 152, $textcolor, $font, SumProp($data['declared_value'], 'руб. ', 'коп.')); imagettftext($image, 10, 0, 266, 185, $textcolor, $font, $data['COD_amount']); imagettftext($image, 10, 0, 266, 195, $textcolor, $font, SumProp($data['COD_amount'], 'руб. ', 'коп.')); $x = 45; for ($i = 0; $i < strlen($data['whom_zip']); $i++) { imagettftext($image, 36, 0, $x, 405, $textcolor, $font_post, $data['whom_zip'][$i]); $x = $x+36.5; } //Выводим заполненную форму на экран header('Content-type: image/png'); imagepng($image); imagedestroy($image); } else { echo 'Файл формы "' . $file . '" не найден.'; } } function printF7P($id) { $file = 'forms/f7p.png'; if (file_exists($file)) { $image = imagecreatefrompng($file); //Создаем изображение из уже имеющейся формы $textcolor = imagecolorallocate($image, 0, 0, 0); //Задаем цвет написания в формате RGB, в данном случае черным. $font = 'fonts/timesbd.ttf'; //Задаем шрифт для написания, в данном случае "Times New Roman bold" $font_post = 'fonts/post.ttf'; //Задаем шрифт для написания индекса (ZIP код) $data = getDataF7($id); imagettftext($image, 11, 0, 70, 155, $textcolor, $font, $data['from_surname']); imagettftext($image, 11, 0, 20, 178, $textcolor, $font, $data['from_name'] . ' ' . $data['from_middlename']); imagettftext($image, 11, 0, 70, 205, $textcolor, $font, $data['from_state']); imagettftext($image, 11, 0, 20, 229, $textcolor, $font, $data['from_city'] . ' ' . $data['from_street']); imagettftext($image, 11, 0, 20, 254, $textcolor, $font, $data['from_build'] . ' ' . $data['from_appartment']); $x = 140; for ($i = 0; $i < strlen($data['from_zip']); $i++) { imagettftext($image, 19, 0, $x, 254, $textcolor, $font, $data['from_zip'][$i]); $x = $x+20; } imagettftext($image, 11, 0, 324, 247, $textcolor, $font, $data['whom_surname']); imagettftext($image, 11, 0, 290, 271, $textcolor, $font, $data['whom_name'] . ' ' . $data['whom_middlename']); imagettftext($image, 11, 0, 324, 298, $textcolor, $font, $data['whom_state'] . ' ' . $data['whom_city']); imagettftext($image, 11, 0, 290, 322, $textcolor, $font, $data['whom_street'] . ' ' . $data['whom_build'] . ' ' . $data['whom_appartment']); $x = 467; for ($i = 0; $i < strlen($data['whom_zip']); $i++) { imagettftext($image, 19, 0, $x, 348, $textcolor, $font, $data['whom_zip'][$i]); $x = $x+20; } imagettftext($image, 10, 0, 270, 168, $textcolor, $font, $data['declared_value']); imagettftext($image, 10, 0, 270, 178, $textcolor, $font, SumProp($data['declared_value'], 'руб. ', 'коп.')); imagettftext($image, 10, 0, 270, 210, $textcolor, $font, $data['COD_amount']); imagettftext($image, 10, 0, 270, 221, $textcolor, $font, SumProp($data['COD_amount'], 'руб. ', 'коп.')); $x = 45; for ($i = 0; $i < strlen($data['whom_zip']); $i++) { imagettftext($image, 36, 0, $x, 405, $textcolor, $font_post, $data['whom_zip'][$i]); $x = $x+36.5; } //Выводим заполненную форму на экран header('Content-type: image/png'); imagepng($image); imagedestroy($image); } else { echo 'Файл формы "' . $file . '" не найден.'; } } ?> |
Файл f7.php содержит в себе 4 функции:
getDataF7() — в этой функции происходит формирование данных прежде, чем их размещать на форме. В эту функцию передается ID заказа, для которого будут формироваться данные. Именно здесь, имея ID заказа, вам необходимо сформировать запрос в базу данных, чтобы получить данные.
printF7A() — Функция оформления формы 7, отправление 1 класса
printF7B() — Функция оформления формы 7, бандероль
printF7P() — Функция оформления формы 7, посылка
3 функции оформления сделаны по причине того, что сами формы хоть и похожи, но немного отличаются друг от друга, поэтому не получится использовать одни и теже координаты для разных форм.
Остановимся, и разберем код немного подробнее. Обратите внимание на переменную $font. В нее мы передаем путь к файлу шрифтов. В данном примере я использую шрифт «Times New Roman bold». Если вы используете свой шрифт, обязательно укажите его в этой переменной.
Точно также, переменная ниже $font_post содержит путь к файлу шрифтов, который я позаимствовал в интернете и немного модифицировал, чтобы он наиболее идеально вписывался в нашу форму. Этот шрифт позволит нам написать почтовый индекс (ZIP код) точно так, как предлагается в образце на оборотной стороне конверта.
После этого начинаем рисовать надпись на нашем изображении с помощью imagettftext(ИЗОБРАЖЕНИЕ, РАЗМЕР ШРИФТА, НАКЛОН, ПОЗИЦИЯ ПО X, ПОЗИЦИЯ ПО Y, ЦВЕТ ТЕКСТА, ШРИФТ, ТЕКСТ). Абсолютно ничего сложного.
Форма 112
Теперь создайте в каталоге print_form файл f112.php и добавьте в него код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
<?php function getDataF112($id) { $data = array ( 'from_surname' => 'Петров', //Фамилия отправителя 'from_name' => 'Петр', //Имя отправителя 'from_middlename' => 'Петрович', //Отчество отправителя 'from_birthday' => '13.05.1968', //Дата рождения отправителя 'from_state' => 'Красноярский край', //Район\Область отправителя 'from_city' => 'г.Красноярск', //Город\Населенный пункт отправителя 'from_street' => 'ул.Квартальная', //Улица получателя 'from_build' => '13', //Дом\Строение отправителя 'from_appartment' => '3', //Квартира отправителя 'from_zip' => '660046', //Почтовый индекс отправителя 'whom_surname' => 'Иванов', //Фамилия получателя 'whom_name' => 'Иван', //Имя получателя 'whom_middlename' => 'Иванович', //Отчество получателя 'whom_state' => 'Московская обл.', //Район\Область получателя 'whom_city' => 'г.Москва', //Город\Населенный пункт получателя 'whom_street' => 'пр-кт Комсомольский', //Улица получателя 'whom_build' => 'д.38', //Дом\Строение получателя 'whom_appartment' => 'кв.35', //Квартира получателя 'whom_zip' => '119146', //Почтовый индекс получателя 'sum_num' => '19338.55', //Сумма почтового перевода 'inn' => '516781679184', //ИНН, до 12 символов 'kor_account' => '13500000546700065785', //Кор/счет, до 20 символов 'current_acc' => '11310320054603436484', //Рас/счет, до 20 символов 'bik' => '000544891', //БИК, до 9 символов 'bank_name' => 'ОАО "Сбербанк"', //Наименование банка 'document' => 'Паспорт', //Предъявленный документ 'document_serial' => '66 00', //Серия предъвленного документа 'document_number' => '884135', //№ предъявленного документа 'document_day' => '12 июня', //День и месяц выдачи предъявленного документа 'document_year' => '1999', //Год выдачи предъявленного документа 'document_issued_by' => 'Отделом УФМС г.Москвы', //Наименование учреждения выдавшего предъявленный документ 'unit_code' => '333', //Код подразделения 'message_part1' => 'Сообщение информационного характера', //Сообщение, до 35 символов (с учетом пробелов) 'message_part2' => 'для тестового примера', //Продолжение сообщения, до 35 символов (с учетом пробелов) 'to_phone' => '9640004455', //Телефон, SMS-уведомление о поступления перевода в отделение (без +7) 'from_phone' => '9511113377', //Телефон, SMS-уведомление о выплате почтового перевода (без +7) 'one' => 'x', //Наложенный платеж (отправляем 'x') 'two' => '', //С доставкой на дом (отправляем 'x') 'three' => 'x' //С уведомлением (отправляем 'x') ); return $data; } function printB112EP($id) { $file = 'forms/f112ep.png'; if (file_exists($file)) { $image = imagecreatefrompng($file); //Создаем изображение из уже имеющейся формы $textcolor = imagecolorallocate($image, 0, 0, 0); //Задаем цвет написания в формате RGB, в данном случае черным. $font = 'fonts/PTM75F.ttf'; //Задаем шрифт для написания, в данном случае "PT Mono bold" $data = getDataF112($id); imagettftext($image, 11, 0, 110, 331, $textcolor, $font, $data['whom_surname'] . ' ' . $data['whom_name'] . ' ' . $data['whom_middlename']); imagettftext($image, 11, 0, 110, 369, $textcolor, $font, $data['whom_state'] . ' ' . $data['whom_city']); imagettftext($image, 11, 0, 70, 398, $textcolor, $font, $data['whom_street'] . ' ' . $data['whom_build'] . ' ' . $data['whom_appartment']); $x = 741; for ($i = 0; $i < strlen($data['whom_zip']); $i++) { imagettftext($image, 18, 0, $x, 398, $textcolor, $font, $data['whom_zip'][$i]); $x = $x+16.8; } imagettftext($image, 11, 0, 140, 569, $textcolor, $font, $data['from_surname'] . ' ' . $data['from_name'] . ' ' . $data['from_middlename']); imagettftext($image, 11, 0, 220, 597, $textcolor, $font, $data['from_state'] . ' ' . $data['from_city']); imagettftext($image, 11, 0, 75, 624, $textcolor, $font, $data['from_street'] . ' ' . $data['from_build'] . ' ' . $data['from_appartment']); $x = 741; for ($i = 0; $i < strlen($data['from_zip']); $i++) { imagettftext($image, 18, 0, $x, 624, $textcolor, $font, $data['from_zip'][$i]); $x = $x+16.8; } imagettftext($image, 12, 0, 80, 254, $textcolor, $font, explode('.', $data['sum_num'])[0]); imagettftext($image, 12, 0, 175, 254, $textcolor, $font, explode('.', $data['sum_num'])[1]); imagettftext($image, 10, 0, 260, 235, $textcolor, $font, SumProp($data['sum_num'], 'руб. ', 'коп.')); $x = 677; for ($i = 0; $i < strlen($data['to_phone']); $i++) { imagettftext($image, 12, 0, $x, 270, $textcolor, $font, $data['to_phone'][$i]); $x = $x+16.8; } $x = 677; for ($i = 0; $i < strlen($data['from_phone']); $i++) { imagettftext($image, 12, 0, $x, 299, $textcolor, $font, $data['from_phone'][$i]); $x = $x+16.8; } $x = 178; for ($i = 0; $i < iconv_strlen($data['message_part1'], 'UTF-8'); $i++) { imagettftext($image, 12, 0, $x, 422, $textcolor, $font, mb_substr($data['message_part1'], $i, 1, 'UTF-8')); $x = $x+19.1; } $x = 178; for ($i = 0; $i < iconv_strlen($data['message_part2'], 'UTF-8'); $i++) { imagettftext($image, 12, 0, $x, 450, $textcolor, $font, mb_substr($data['message_part2'], $i, 1, 'UTF-8')); $x = $x+19.1; } $x = 131; for ($i = 0; $i < strlen($data['inn']); $i++) { imagettftext($image, 12, 0, $x, 490, $textcolor, $font, $data['inn'][$i]); $x = $x+19.1; } $x = 465; for ($i = 0; $i < strlen($data['kor_account']); $i++) { imagettftext($image, 12, 0, $x, 490, $textcolor, $font, $data['kor_account'][$i]); $x = $x+19.1; } $x = 204; for ($i = 0; $i < strlen($data['current_acc']); $i++) { imagettftext($image, 12, 0, $x, 548, $textcolor, $font, $data['current_acc'][$i]); $x = $x+19.1; } $x = 675; for ($i = 0; $i < strlen($data['bik']); $i++) { imagettftext($image, 12, 0, $x, 548, $textcolor, $font, $data['bik'][$i]); $x = $x+19.1; } imagettftext($image, 11, 0, 235, 512, $textcolor, $font, $data['bank_name']); imagettftext($image, 11, 0, 165, 863, $textcolor, $font, $data['document']); imagettftext($image, 11, 0, 395, 863, $textcolor, $font, $data['document_serial']); imagettftext($image, 11, 0, 475, 863, $textcolor, $font, $data['document_number']); imagettftext($image, 11, 0, 600, 863, $textcolor, $font, $data['document_day'] . ' ' . $data['document_year']); imagettftext($image, 11, 0, 65, 890, $textcolor, $font, $data['document_issued_by']); imagettftext($image, 11, 0, 730, 890, $textcolor, $font, $data['unit_code']); imagettftext($image, 25, 0, 68, 290, $textcolor, $font, $data['one']); imagettftext($image, 20, 0, 255, 272, $textcolor, $font, $data['two']); imagettftext($image, 20, 0, 255, 299, $textcolor, $font, $data['three']); //Выводим заполненную форму на экран header('Content-type: image/png'); imagepng($image); imagedestroy($image); } else { echo 'Файл формы "' . $file . '" не найден.'; } } ?> |
В данном файле 2 функции:
getDataF112() — аналогичен функции getDataF7();
printB112EP() — Функция оформления формы 112ЭП.
Важно: В функции getDataF7() и getDataF112() данные об отправителе и получателе заполняются по разному. Т.е. в форме 7 отправителем является администратор сайта, а получателем — заказчик, в то время как в форме 112 отправитель — заказчик, а получатель — администратор.
Учитывая, что я никогда не занимался отправкой посылок Почтой России, то я могу ошибаться в плане заполнения формы. Если вы обнаружили ошибку, отпишите о ней в комментарии, постараюсь исправить.
Также обратите внимание на отсутствие переменной $font_post, в данной форме нет необходимости писать ZIP-код, поэтому и подключать шрифт нет необходимости. А вот в переменной $font я подключил специальный моноширинный шрифт PT Mono bold. Дело в том, что на форме 112 во многих полях необходимо писать текст в специальных клеточках, а пропорциональные шрифты имеют разную ширину, соответственно при всём желании станет невозможным правильно вписать текст.
Печать форм
Создайте файл print_form.php со следующим содержимым:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<?php header("content-type:text/html; charset=utf-8"); include('sumprop.php'); //Подключаем функцию прописных цифр include('f7.php'); include('f112.php'); $id = $_GET['id']; //Получаем ID заказа, для которого необходимо сформировать необходимый бланк $type = $_GET['type']; //Получаем тип бланка, который необходимо сформировать switch ($type) { case 'f7a': {// Форма 7 - адресный ярлык printF7A($id); break; } case 'f7b': { printF7B($id); break; } case 'f7p': { printF7P($id); break; } case 'f112ep': {// Форма 112 - Наложенный платеж + почтовый перевод printB112EP($id); break; } default: { echo 'Некорректно указан тип бланка для печати'; break; } } ?> |
Здесь мы подключаем ранее созданные нами файлы с функциями. Получаем ID заказа и тип формы из ссылки, после чего на основании полученного типа вызываем соответствующую функцию.
Цифры прописью
Создайте файл sumprop.php со следующим содержимым:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
<?php // echo SumProp(2004.30, 'руб.', 'коп.'); // SumProp(nnnn,'USD'|'RUR'|'EUR')-полный вывод со спряжением "долларов"-"центов" function SumProp($srcsumm, $val_rub, $val_kop){ $cifir= Array('од','дв','три','четыр','пят','шест','сем','восем','девят'); $sotN = Array('сто','двести','триста','четыреста','пятьсот','шестьсот','семьсот','восемьсот','девятьсот'); $milion= Array('триллион','миллиард','миллион','тысяч'); $anDan = Array('','','','сорок','','','','','девяносто'); $scet=4; $cifR=''; $cfR=''; $oboR= Array(); $splt = explode('.',"$srcsumm"); if(count($splt) < 2) { $splt = explode(',',"$srcsumm"); } $xx = $splt[0]; $xx1 = (empty($splt[1])? '00': $splt[1]); $xx1 = str_pad("$xx1", 2, "0", STR_PAD_RIGHT); // 2345.1 -> 10 копеек if ($xx>999999999999999) { $cfR=$srcsumm; return $cfR; } while($xx/1000>0){ $yy=floor($xx/1000); $delen= round(($xx/1000-$yy)*1000); $sot= floor($delen/100)*100; $des=(floor($delen-$sot)>9? floor(($delen-$sot)/10)*10:0); $ed= floor($delen-$sot)-floor(($delen-$sot)/10)*10; $forDes=($des/10==2?'а':''); $forEd= ($ed==1 ? 'ин': ($ed==2?'е':'') ); if ( floor($yy/1000)>=1000 ) { // делаю "единицы" для тысяч, миллионов... $ffD=($ed>4?'ь': ($ed==1 || $scet<3? ($ed<2?'ин': ($scet==3?'на': ($scet<4? ($ed==2?'а':( $ed==4?'е':'')) :'на') ) ) : ($ed==2 || $ed==4?'е':'') ) ); }else{ // единицы для "единиц" $ffD=($ed>4?'ь': ($ed==1 || $scet<3? ($scet<3 && $ed<2?'ин': ($scet==3?'на': ($scet<4? ($ed==2?'а':( $ed==4?'е':'')) :'ин') ) ) : ( $ed==4?'е':($ed==2?'а':'')) ) ); } if($ed==2) $ffD = ($scet==3)?'е':'а'; // два рубля-миллиона-миллиарда, но две тысячи $forTys=($des/10==1? ($scet<3?'ов':'') : ($scet<3? ($ed==1?'': ($ed>1 && $ed<5?'а':'ов') ) : ($ed==1? 'а': ($ed>1 && $ed<5?'и':'') )) ); $nnn = floor($sot/100)-1; $oprSot=(!empty($sotN[$nnn]) ? $sotN[$nnn]:''); $nnn = floor($des/10); $oprDes=(!empty($cifir[$nnn-1])? ($nnn==1?'': ($nnn==4 || $nnn==9? $anDan[$nnn-1]:($nnn==2 || $nnn==3?$cifir[$nnn-1].$forDes.'дцать':$cifir[$nnn-1].'ьдесят') ) ) :''); $oprEd=(!empty($cifir[$ed-1])? $cifir[$ed-1].(floor($des/10)==1?$forEd.'надцать' : $ffD ) : ($des==10?'десять':'') ); $oprTys=(!empty($milion[$scet]) && $delen>0) ? $milion[$scet].$forTys : ''; $cifR= (strlen($oprSot) ? ' '.$oprSot:''). (strlen($oprDes)>1 ? ' '.$oprDes:''). (strlen($oprEd)>1 ? ' '.$oprEd:''). (strlen($oprTys)>1 ? ' '.$oprTys:''); $oboR[]=$cifR; $xx=floor($xx/1000); $scet--; if (floor($xx)<1 ) break; } $oboR = array_reverse($oboR); for ($i=0; $i<count($oboR); $i++){ $probel = strlen($cfR)>0 ? ' ':''; $cfR .= (($oboR[$i]!='' && $cfR!='') ? $probel:'') . $oboR[$i]; } if (strlen($cfR) < 3) { $cfR='ноль'; } $intsrc = $splt[0]; $kopeiki = $xx1; $kop2 =str_pad("$xx1", 2, "0", STR_PAD_RIGHT); $sum2 = str_pad("$intsrc", 2, "0", STR_PAD_LEFT); $sum2 = substr($sum2, strlen($sum2)-2); // 676571-> '71' $sum21 = substr($sum2, strlen($sum2)-2,1); // 676571-> '7' $sum22 = substr($sum2, strlen($sum2)-1,1); // 676571-> '1' $kop1 = substr($kop2,0,1); $kop2 = substr($kop2,1,1); $ar234 = array('2','3','4'); // доллар-А, рубл-Я... // делаю спряжения у слова рубл-ей|я|ь / доллар-ов... / евро if($val_rub=='RUR') { $val1 = 'рубл'; $val2 = 'копейка'; if($sum22=='1' && $sum21!='1') $val1 .= 'ь'; // 01,21...91 рубль elseif(in_array($sum22, $ar234) && ($sum21!='1')) $val1 .= 'я'; else $val1 .= 'ей'; if(in_array($kop2, $ar234) && ($kop1!='1')) $val2 = 'копейки'; elseif($kop2=='1' && $kop1!='1') $val2 = 'копейка'; // 01,21...91 копейка else $val2 = 'копеек'; $cfR .= " $val1 $kopeiki $val2"; }elseif($val_rub=='USD') { $val1 = 'доллар'; $val2 = 'цент'; if($sum22=='1' && $sum21!='1') $val1 .= ''; // 01,21...91 доллар elseif(in_array($sum22, $ar234) && ($sum21!='1')) $val1 .= 'a'; else $val1 .= 'ов'; if($kop2=='1' && $kop1!='1') $val2 .= ''; // 01,21...91 цент elseif(in_array($kop2, $ar234) && ($kop1!='1')) $val2 .= 'a'; else $val2 .= 'ов'; $val1 .= ' США'; $cfR .= " $val1 $kopeiki $val2"; }elseif($val_rub=='EUR') { $val1 = 'евро'; $val2 = 'цент'; if($kop2=='1' && $kop1!='1') $val2 .= ''; // 01,21...91 цент elseif(in_array($kop2, $ar234) && ($kop1!='1')) $val2 .= 'a'; else $val2 .= 'ов'; $cfR .= " $val1 $kopeiki $val2"; }else{ $cfR .= ' '.$val_rub; if($val_kop!='') $cfR .= "$kopeiki $val_kop"; } return trim($cfR); } ?> |
Здесь описана лишь одна функция, которая преобразует цифры в прописные. Подобная функция — это отдельная тема для статьи, поэтому, чтобы сильно не утруждать себя в решении этого вопроса, я просто позаимствовал эту функцию из аддона к Joomshopping.
В заключении
Теперь, чтобы всё работало, необходимо подготовить ссылки с передачей некоторых параметров. Это необходимо для того, чтобы формировать данные о заказе.
В удобном для вас месте, например в файле шаблона списка заказов в административной части добавьте ссылки вида:
1 2 3 4 |
<a href="/print_form.php?id=ИДЕНТИФИКАТОР&type=f7a">Форма 7А</a> <a href="/print_form.php?id=ИДЕНТИФИКАТОР&type=f7b">Форма 7Б</a> <a href="/print_form.php?id=ИДЕНТИФИКАТОР&type=f7p">Форма 7П</a> <a href="/print_form.php?id=ИДЕНТИФИКАТОР&type=f112ep">Форма 112ЭП</a> |
id — передаем ID заказа, по которому будут формироваться данные из базы данных;
type — тип формы, которую будем распечатывать
Вы можете скачать рабочий пример из вложения в конце статьи.
В принципе, это всё. Аналогичным образом вы можете добавить другие формы, принцип полагаю ясен. Также можно сделать сохранение изображения на сервере или на компьютере пользователя, или вывести изображение в PDF, но это уже дело каждого, кому как удобнее.
Вы при установке аддона
https://nevigen.com/ru/addons/auto-order-joomshopping-with-period.html
у меня вылезает ошибка :
Access to undeclared static property: Joomla\CMS\Uri\Uri::$nev_ig_en
при входе в личный кабинет и постоянная переадресация в одностраничном оформлении заказа Addon onestepcheckout 4.180.2.6
И при попытке войти в настройки расширения
тоже ошибка :
Access to undeclared static property: Joomla\CMS\Uri\Uri::$nev_ig_en
В чем может быть причина? Готов заплатить...