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

В статье пойдет речь о функции выставления счетов для оплаты через банк. Также будут рассмотрены такие полезные функции для работы с числами, как преобразование цены в текст, отделение разрядов, форматированная сумма.
<br>
<br>Итак, наша цель получить из базы данных вашего интернет магазина заказ клиента и на его основе сформировать счет на оплату покупателю.
<br>
<br>Таблица для заказов будет иметь такую структуру:
<br>
<br>CREATE TABLE `order` (
<br>ID INT(10),
<br>zakaz TEXT NOT NULL,
<br>price FLOAT(9) NOT NULL,
<br>user INT(9) NOT NULL,
<br>inn TEXT NOT NULL,
<br>kpp TEXT NOT NULL,
<br>firm TEXT NOT NULL,
<br>adress TEXT NOT NULL,
<br>)
<br>
<br>ID – номер заказа
<br>zakaz – это наименование товара или услуги
<br>price – стоимость
<br>user – идентификатор покупателя
<br>inn – ИНН зарегистрированного покупателя
<br>kpp – КПП покупателя
<br>firm – название покупателя
<br>adress – адрес покупателя
<br>
<br>Реквизиты покупателя мы для простоты размещаем в той же таблице, что и заказ. Скорее всего у вас данные покупателя будут храниться в отдельной таблице, поэтому для их извлечения из базы надо сделать соответствующий запрос. Возможно вы захотите запрашивать эти данные непосредственно на странице формирования заказа путем заполнения полей формы.
<br>На странице формирования заказа делаем запрос к базе по номеру заказа и идентификатору пользователя (номер заказа - $nomerzakaza и номер пользователя - $userID):
<br>
<br>$result = mysql_query("SELECT *FROM `order` WHERE ID = $nomerzakaza and user= $userID");
<br>while ($myrow=mysql_fetch_array($result))
<br>{
<br>$zakaz=$myrow["zakaz"];
<br>$price=$myrow["price"];
<br>$inn=$myrow["inn"];
<br>$kpp=$myrow["kpp"];
<br>$firm=$myrow["firm"];
<br>$adress=$myrow["adress"];
<br>}
<br>
<br>Почти все данные получены. Для нашего счета нам понадобится дата. Ее можно взять или из таблицы заказов, если она там есть или, как в нашем примере, мы ее сформируем текущей датой:
<br>
<br>$daynow=date("d.m.Y"); // дата вида 12.02.2016
<br>
<br>Далее мы для наглядности разделим регистры в тысячах, чтобы цена была не в таком виде 1000000, а в таком 1 000 000. Для этого воспользуемся функцией number_format:
<br>$priceshow=number_format($price, 0, ',', ' '); // функция добавляет пробелы в тысячах
<br>Еще для выставления счета нам понадобится записать числовые значения цен в строковые. То есть вместо надписи «750 руб.» нам надо получить надпись «Семьсот пятьдесят руб.».
<br>Для этого напишем такую функцию:
<br>
<br><div style="OVERFLOW: auto; HEIGHT: 400px; width: 700px;">
<br>function num_propis($num){ // $num - цело число
<br>// Все варианты написания чисел прописью от 0 до 999 скомпануем в один небольшой массив
<br> $m=array(
<br> array('ноль'),
<br> array('-','один','два','три','четыре','пять','шесть','семь','восемь','девять'),
<br> array('десять','одиннадцать','двенадцать','тринадцать','четырнадцать','пятнадцать','шестнадцать','семнадцать','восемнадцать','девятнадцать'),
<br> array('-','-','двадцать','тридцать','сорок','пятьдесят','шестьдесят','семьдесят','восемьдесят','девяносто'),
<br> array('-','сто','двести','триста','четыреста','пятьсот','шестьсот','семьсот','восемьсот','девятьсот'),
<br> array('-','одна','две')
<br> );
<br>// Все варианты написания разрядов прописью скомпануем в один небольшой массив
<br> $r=array(
<br> array('...ллион','','а','ов'), // используется для всех неизвестно больших разрядов
<br> array('тысяч','а','и',''),
<br> array('миллион','','а','ов'),
<br> array('миллиард','','а','ов'),
<br> array('триллион','','а','ов'),
<br> array('квадриллион','','а','ов'),
<br> array('квинтиллион','','а','ов')
<br> // ,array(... список можно продолжить
<br> );
<br>
<br> if($num==0)return$m[0][0]; // Если число ноль, сразу сообщить об этом и выйти
<br> $o=array(); // Сюда записываем все получаемые результаты преобразования
<br>
<br>// Разложим исходное число на несколько трехзначных чисел и каждое полученное такое число обработаем отдельно
<br> foreach(array_reverse(str_split(str_pad($num,ceil(strlen($num)/3)*3,'0',STR_PAD_LEFT),3))as$k=>$p){
<br> $o[$k]=array();
<br>
<br>// Алгоритм, преобразующий трехзначное число в строку прописью
<br> foreach($n=str_split($p)as$kk=>$pp)
<br> if(!$pp)continue;else
<br> switch($kk){
<br> case 0:$o[$k][]=$m[4][$pp];break;
<br> case 1:if($pp==1){$o[$k][]=$m[2][$n[2]];break 2;}else$o[$k][]=$m[3][$pp];break;
<br> case 2:if(($k==1)&&($pp<=2))$o[$k][]=$m[5][$pp];else$o[$k][]=$m[1][$pp];break;
<br> }$p*=1;if(!$r[$k])$r[$k]=reset($r);
<br>
<br>// Алгоритм, добавляющий разряд, учитывающий окончание руского языка
<br> if($p&&$k)switch(true){
<br> case preg_match("/^[1]$|^\\d*[0,2-9][1]$/",$p):$o[$k][]=$r[$k][0].$r[$k][1];break;
<br> case preg_match("/^[2-4]$|\\d*[0,2-9][2-4]$/",$p):$o[$k][]=$r[$k][0].$r[$k][2];break;
<br> default:$o[$k][]=$r[$k][0].$r[$k][3];break;
<br> }$o[$k]=implode(' ',$o[$k]);
<br> }
<br>
<br> return implode(' ',array_reverse($o));
<br>}
<br>
<br>if (!function_exists('mb_ucfirst') && extension_loaded('mbstring'))
<br>{
<br> /**
<br> * mb_ucfirst - преобразует первый символ в верхний регистр
<br> * @param string $str - строка
<br> * @param string $encoding - кодировка, по-умолчанию UTF-8
<br> * @return string
<br> */
<br> function mb_ucfirst($str, $encoding='windows-1251')
<br> {
<br> $str = mb_ereg_replace('^[\ ]+', '', $str);
<br> $str = mb_strtoupper(mb_substr($str, 0, 1, $encoding), $encoding).
<br> mb_substr($str, 1, mb_strlen($str), $encoding);
<br> return $str;
<br> }
<br>}
<br>
<br>
<br>if (!eregi("\.",$price))
<br>{
<br>$sumpropis=num_propis($price);
<br>$sumpropis1=mb_ucfirst($sumpropis);
<br>$pricetext=" $sumpropis1 руб. 00 копеек";
<br>}
<br>
<br>if (eregi("\.",$price))
<br>{
<br>$sumfull=split ("\.",$price);
<br>$sum1=$sumfull[0];
<br>$sum2=$sumfull[1];
<br>
<br>$sumpropis=num_propis($sum1);
<br>$sumpropis1=mb_ucfirst($sumpropis);
<br>$pricetext=" $sumpropis1 руб. $sum2 копеек";
<br>}
<br></div>
<br>
<br>После всего этого осталось сформировать сам счет:
<br>
<br><div style="OVERFLOW: auto; HEIGHT: 400px; width: 700px;">
<br> <table width="99%" border="1" align="center" cellpadding="0" cellspacing="0" bordercolor="#000000">
<br> <tr>
<br> <td colspan="2" rowspan="2" align="left" valign="top">Название и адрес банка получателя<br />
<br> <br />
<br> Банк получателя</td>
<br> <td width="7%" height="20" align="left" valign="top">БИК</td>
<br> <td width="31%" rowspan="2" align="left" valign="top"><table cellspacing="0" cellpadding="0">
<br> <col width="16" />
<br> <col width="10" />
<br> <col width="74" />
<br> <col width="93" />
<br> <tr height="17">
<br> <td colspan="4" height="17" width="193">000000000</td>
<br> </tr>
<br> <tr height="25">
<br> <td colspan="4" height="25">00000000000000000000</td>
<br> </tr>
<br> </table></td>
<br> </tr>
<br> <tr>
<br> <td height="20" align="left" valign="top">Сч. №</td>
<br> </tr>
<br> <tr>
<br> <td width="32%" align="left">ИНН 000000000000</td>
<br> <td width="30%" align="left">КПП</td>
<br> <td rowspan="2" align="left" valign="top">Сч. №</td>
<br> <td rowspan="2" align="left" valign="top">0000000000000000000</td>
<br> </tr>
<br> <tr>
<br> <td height="56" colspan="2" align="left" valign="top">Имя получателя<br />
<br> <br />
<br> Получатель</td>
<br> </tr>
<br> </table>
<br> <h2>Счет на оплату № <? echo "$nomerzakaza";?> от <? echo "$daynow";?><hr / color="#000000"></h2>
<br>
<br> <table width="90%" border="0" cellspacing="0" cellpadding="0">
<br> <tr>
<br> <td width="19%"><h4>Поставщик:</h4></td>
<br> <td width="81%">ИНН 00000000000, Имя и реквизиты поставщика</td>
<br> </tr>
<br> <tr>
<br> <td> </td>
<br> <td> </td>
<br> </tr>
<br> <tr>
<br> <td><h4>Покупатель:</h4></td>
<br> <td>ИНН <? echo "$inn";?>, <? if ($kpp != '') { echo "КПП $kpp";}?>, <? echo "$firm";?>, <? echo "$adress";?> </td>
<br> </tr>
<br> </table>
<br> <table width="100%" border="1" cellpadding="0" cellspacing="0" bordercolor="#333333">
<br> <tr>
<br> <td width="4%"><div align="center">№</div></td>
<br> <td width="58%"><div align="center">Наименование</div></td>
<br> <td width="8%"><div align="center">Кол-во</div></td>
<br> <td width="5%"><div align="center">Ед.</div></td>
<br> <td width="12%"><div align="center">Цена</div></td>
<br> <td width="13%"><div align="center">Стоимость</div></td>
<br> </tr>
<br> <tr>
<br> <td height="56"><div align="center">1</div></td>
<br> <td valign="top"> 1</td>
<br> <td align="center">1</td>
<br> <td align="center">шт.</td>
<br> <td align="center"><? echo "$priceshow";?></td>
<br> <td align="center"><? echo "$priceshow";?></td>
<br> </tr>
<br> </table>
<br> <table width="40%" border="0" align="right" cellpadding="0" cellspacing="0">
<br> <tr>
<br> <td><div align="right">Итого:</div></td>
<br> <td width="33%" align="center"><? echo "$priceshow";?></td>
<br> </tr>
<br> <tr>
<br> <td><div align="right">Без налога (НДС): </div></td>
<br> <td align="center">-</td>
<br> </tr>
<br> </table>
<br> <p> </p>
<br> Всего наименование 1, на сумму <? echo "$priceshow";?> руб.<br />
<br> <? echo "$pricetext";?>
<br> <hr / color="#000000">
<br> <table width="100%" border="0" cellspacing="0" cellpadding="0">
<br> <tr>
<br> <td width="15%" height="120"><strong>Руководитель</strong>:</td>
<br> <td width="20%"><img src="podpis.jpg" width="150" height="120" /></td>
<br> <td width="18%">/Иванов И.И./ </td>
<br> <td width="11%"><strong>Бухгалтер</strong></td>
<br> <td width="19%"><img src="podpis.jpg" width="140" height="72" /></td>
<br> <td width="17%">/Иванов И.И./ </td>
<br> </tr>
<br> </table>
<br></div>
<br>
<br>Вместо нулей ставим ваши реквизиты в соответствующе поля. Можно использовать печать и подпись (файл podpis.jpg). Имена всех переменных в данном счете приведены выше.

03.01.2018
Источник: nevius.ru

В начало