Скрипт выставления счетов для интернет магазина


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

Итак, наша цель получить из базы данных вашего интернет магазина заказ клиента и на его основе сформировать счет на оплату покупателю.

Таблица для заказов будет иметь такую структуру:

CREATE TABLE `order` (
ID INT(10),
zakaz TEXT NOT NULL,
price FLOAT(9) NOT NULL,
user INT(9) NOT NULL,
inn TEXT NOT NULL,
kpp TEXT NOT NULL,
firm TEXT NOT NULL,
adress TEXT NOT NULL,
)

ID – номер заказа
zakaz – это наименование товара или услуги
price – стоимость
user – идентификатор покупателя
inn – ИНН зарегистрированного покупателя
kpp – КПП покупателя
firm – название покупателя
adress – адрес покупателя

Реквизиты покупателя мы для простоты размещаем в той же таблице, что и заказ. Скорее всего у вас данные покупателя будут храниться в отдельной таблице, поэтому для их извлечения из базы надо сделать соответствующий запрос. Возможно вы захотите запрашивать эти данные непосредственно на странице формирования заказа путем заполнения полей формы.
На странице формирования заказа делаем запрос к базе по номеру заказа и идентификатору пользователя (номер заказа - $nomerzakaza и номер пользователя - $userID):

$result = mysql_query("SELECT *FROM `order` WHERE ID = $nomerzakaza and user= $userID");
while ($myrow=mysql_fetch_array($result))
{
$zakaz=$myrow["zakaz"];
$price=$myrow["price"];
$inn=$myrow["inn"];
$kpp=$myrow["kpp"];
$firm=$myrow["firm"];
$adress=$myrow["adress"];
}

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

$daynow=date("d.m.Y"); // дата вида 12.02.2016

Далее мы для наглядности разделим регистры в тысячах, чтобы цена была не в таком виде 1000000, а в таком 1 000 000. Для этого воспользуемся функцией number_format:
$priceshow=number_format($price, 0, ',', ' '); // функция добавляет пробелы в тысячах
Еще для выставления счета нам понадобится записать числовые значения цен в строковые. То есть вместо надписи «750 руб.» нам надо получить надпись «Семьсот пятьдесят руб.».
Для этого напишем такую функцию:


function num_propis($num){ // $num - цело число
// Все варианты написания чисел прописью от 0 до 999 скомпануем в один небольшой массив
$m=array(
array('ноль'),
array('-','один','два','три','четыре','пять','шесть','семь','восемь','девять'),
array('десять','одиннадцать','двенадцать','тринадцать','четырнадцать','пятнадцать','шестнадцать','семнадцать','восемнадцать','девятнадцать'),
array('-','-','двадцать','тридцать','сорок','пятьдесят','шестьдесят','семьдесят','восемьдесят','девяносто'),
array('-','сто','двести','триста','четыреста','пятьсот','шестьсот','семьсот','восемьсот','девятьсот'),
array('-','одна','две')
);
// Все варианты написания разрядов прописью скомпануем в один небольшой массив
$r=array(
array('...ллион','','а','ов'), // используется для всех неизвестно больших разрядов
array('тысяч','а','и',''),
array('миллион','','а','ов'),
array('миллиард','','а','ов'),
array('триллион','','а','ов'),
array('квадриллион','','а','ов'),
array('квинтиллион','','а','ов')
// ,array(... список можно продолжить
);

if($num==0)return$m[0][0]; // Если число ноль, сразу сообщить об этом и выйти
$o=array(); // Сюда записываем все получаемые результаты преобразования

// Разложим исходное число на несколько трехзначных чисел и каждое полученное такое число обработаем отдельно
foreach(array_reverse(str_split(str_pad($num,ceil(strlen($num)/3)*3,'0',STR_PAD_LEFT),3))as$k=>$p){
$o[$k]=array();

// Алгоритм, преобразующий трехзначное число в строку прописью
foreach($n=str_split($p)as$kk=>$pp)
if(!$pp)continue;else
switch($kk){
case 0:$o[$k][]=$m[4][$pp];break;
case 1:if($pp==1){$o[$k][]=$m[2][$n[2]];break 2;}else$o[$k][]=$m[3][$pp];break;
case 2:if(($k==1)&&($pp<=2))$o[$k][]=$m[5][$pp];else$o[$k][]=$m[1][$pp];break;
}$p*=1;if(!$r[$k])$r[$k]=reset($r);

// Алгоритм, добавляющий разряд, учитывающий окончание руского языка
if($p&&$k)switch(true){
case preg_match("/^[1]$|^\\d*[0,2-9][1]$/",$p):$o[$k][]=$r[$k][0].$r[$k][1];break;
case preg_match("/^[2-4]$|\\d*[0,2-9][2-4]$/",$p):$o[$k][]=$r[$k][0].$r[$k][2];break;
default:$o[$k][]=$r[$k][0].$r[$k][3];break;
}$o[$k]=implode(' ',$o[$k]);
}

return implode(' ',array_reverse($o));
}

if (!function_exists('mb_ucfirst') && extension_loaded('mbstring'))
{
/**
* mb_ucfirst - преобразует первый символ в верхний регистр
* @param string $str - строка
* @param string $encoding - кодировка, по-умолчанию UTF-8
* @return string
*/
function mb_ucfirst($str, $encoding='windows-1251')
{
$str = mb_ereg_replace('^[\ ]+', '', $str);
$str = mb_strtoupper(mb_substr($str, 0, 1, $encoding), $encoding).
mb_substr($str, 1, mb_strlen($str), $encoding);
return $str;
}
}


if (!eregi("\.",$price))
{
$sumpropis=num_propis($price);
$sumpropis1=mb_ucfirst($sumpropis);
$pricetext=" $sumpropis1 руб. 00 копеек";
}

if (eregi("\.",$price))
{
$sumfull=split ("\.",$price);
$sum1=$sumfull[0];
$sum2=$sumfull[1];

$sumpropis=num_propis($sum1);
$sumpropis1=mb_ucfirst($sumpropis);
$pricetext=" $sumpropis1 руб. $sum2 копеек";
}


После всего этого осталось сформировать сам счет:


<table width="99%" border="1" align="center" cellpadding="0" cellspacing="0" bordercolor="#000000">
<tr>
<td colspan="2" rowspan="2" align="left" valign="top">Название и адрес банка получателя<br />
<br />
Банк получателя</td>
<td width="7%" height="20" align="left" valign="top">БИК</td>
<td width="31%" rowspan="2" align="left" valign="top"><table cellspacing="0" cellpadding="0">
<col width="16" />
<col width="10" />
<col width="74" />
<col width="93" />
<tr height="17">
<td colspan="4" height="17" width="193">000000000</td>
</tr>
<tr height="25">
<td colspan="4" height="25">00000000000000000000</td>
</tr>
</table></td>
</tr>
<tr>
<td height="20" align="left" valign="top">Сч. №</td>
</tr>
<tr>
<td width="32%" align="left">ИНН 000000000000</td>
<td width="30%" align="left">КПП</td>
<td rowspan="2" align="left" valign="top">Сч. №</td>
<td rowspan="2" align="left" valign="top">0000000000000000000</td>
</tr>
<tr>
<td height="56" colspan="2" align="left" valign="top">Имя получателя<br />
<br />
Получатель</td>
</tr>
</table>
<h2>Счет на оплату № <? echo "$nomerzakaza";?> от <? echo "$daynow";?><hr / color="#000000"></h2>

<table width="90%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="19%"><h4>Поставщик:</h4></td>
<td width="81%">ИНН 00000000000, Имя и реквизиты поставщика</td>
</tr>
<tr>
<td> </td>
<td> </td>
</tr>
<tr>
<td><h4>Покупатель:</h4></td>
<td>ИНН <? echo "$inn";?>, <? if ($kpp != '') { echo "КПП $kpp";}?>, <? echo "$firm";?>, <? echo "$adress";?> </td>
</tr>
</table>
<table width="100%" border="1" cellpadding="0" cellspacing="0" bordercolor="#333333">
<tr>
<td width="4%"><div align="center">№</div></td>
<td width="58%"><div align="center">Наименование</div></td>
<td width="8%"><div align="center">Кол-во</div></td>
<td width="5%"><div align="center">Ед.</div></td>
<td width="12%"><div align="center">Цена</div></td>
<td width="13%"><div align="center">Стоимость</div></td>
</tr>
<tr>
<td height="56"><div align="center">1</div></td>
<td valign="top"> 1</td>
<td align="center">1</td>
<td align="center">шт.</td>
<td align="center"><? echo "$priceshow";?></td>
<td align="center"><? echo "$priceshow";?></td>
</tr>
</table>
<table width="40%" border="0" align="right" cellpadding="0" cellspacing="0">
<tr>
<td><div align="right">Итого:</div></td>
<td width="33%" align="center"><? echo "$priceshow";?></td>
</tr>
<tr>
<td><div align="right">Без налога (НДС): </div></td>
<td align="center">-</td>
</tr>
</table>
<p> </p>
Всего наименование 1, на сумму <? echo "$priceshow";?> руб.<br />
<? echo "$pricetext";?>
<hr / color="#000000">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="15%" height="120"><strong>Руководитель</strong>:</td>
<td width="20%"><img src="podpis.jpg" width="150" height="120" /></td>
<td width="18%">/Иванов И.И./ </td>
<td width="11%"><strong>Бухгалтер</strong></td>
<td width="19%"><img src="podpis.jpg" width="140" height="72" /></td>
<td width="17%">/Иванов И.И./ </td>
</tr>
</table>


Вместо нулей ставим ваши реквизиты в соответствующе поля. Можно использовать печать и подпись (файл podpis.jpg). Имена всех переменных в данном счете приведены выше.

©Невежин Евгений
http://nevius.ru
29.02.2016

При перепечатке информации ссылка на сайт http://nevius.ru обязательна.