Форма 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 со следующим содержимым:
<?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 и добавьте в него код:
<?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 со следующим содержимым:
<?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 со следующим содержимым:
<?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.
В заключении
Теперь, чтобы всё работало, необходимо подготовить ссылки с передачей некоторых параметров. Это необходимо для того, чтобы формировать данные о заказе.
В удобном для вас месте, например в файле шаблона списка заказов в административной части добавьте ссылки вида:
<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
В чем может быть причина? Готов заплатить...