Форма 7 и форма 112 для Почты России

Как бы не ругали Почту России, но основная масса интернет-магазинов отправляет товары покупателям в том числе и через неё. И если у Вас достаточно большой объем заказов (а именно к этому мы все и стремимся) — возникает вопрос автоматизации оформления документов для отправки посылок Почтой России. Чаще всего в качестве документов используется форма 7 и форма 112.

К моему удивлению за 3 года работы в сфере сайтостроения впервые столкнулся с вопросом автоматизации оформления документов для отправки посылок Почтой России. Скорей всего дело в том, что многие наши клиенты просто не знают о такой возможности, а может просто попался настолько ленивый клиент, что ему не хочется вручную заполнять все эти формы и бланки.

К тому же, проблема состоит в том, что мне никогда не приходилось заниматься отправкой посылок Почтой России, разве что однажды, в 90-ые годы выписывал из журналов какие-то книги, но всё же это не то, т.к. я получал, а не отправлял.

Недолго думая я полез в интернет за решением. Поиск не увенчался успехом. В качестве решения предлагалось использовать сторонние сервисы за «символическую» плату. Под словом «символическая» я подразумеваю приличную помесячную оплату сервиса.

А если вы читаете эту статью, значит вы такие же как и я — не любители платить. А клиентам объяснить, что им придется еще куда-то платить каждый месяц, еще сложнее.

К тому же, как оказалось, использование подобного рода сервисов накладывает некоторые ограничения, например нельзя добавить свой логотип, сменить шрифты, разместить текст подругому и т.д.

Вывод, как всегда решил сделать всё по своему.

Как это работает?

Решение не идеальное, но очень простое: мы возьмем формы в виде картинок и заполним их, а потом выведем на экран.

Итак, для примера мы возьмем 4 наиболее распространенные почтовые формы:

  • Форма 7 адресный ярлык. Отправление 1 класса;
  • Форма 7 адресный ярлык. Бандероль;
  • Форма 7 адресный ярлык. Посылка;
  • Форма 112ЭП Наложенный платеж + почтовый перевод.
Форма 7 и форма 112 для Почты России. Форма 7А
Форма 7 и форма 112 для Почты России. Форма 7А
Форма 7 и форма 112 для Почты России. Форма 7Б
Форма 7 и форма 112 для Почты России. Форма 7Б
Форма 7 и форма 112 для Почты России. Форма 7П
Форма 7 и форма 112 для Почты России. Форма 7П
Форма 7 и форма 112 для Почты России. Форма 112ЭФ
Форма 7 и форма 112 для Почты России. Форма 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 — тип формы, которую будем распечатывать

Форма 7 и форма 112 для Почты России. Примерный результат
Форма 7 и форма 112 для Почты России. Примерный результат

Вы можете скачать рабочий пример из вложения в конце статьи.

В принципе, это всё. Аналогичным образом вы можете добавить другие формы, принцип полагаю ясен. Также можно сделать сохранение изображения на сервере или на компьютере пользователя, или вывести изображение в 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
    В чем может быть причина? Готов заплатить...
    • Blog About
      Добрый день. Вы явно не по адресу. Вам нужно обратиться в тех.поддержку nevigen. Я таким аддоном никогда не пользовался и подсказать ничего не могу, извините.

Добавить комментарий