1<?
if (!defined(
"B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !==
true)
die();?><?
4Loc::loadMessages(__FILE__);
16if (
$params[
'BILLBY_BACKGROUND'])
20 $params[
'BILLBY_BACKGROUND_STYLE']
27$pdf->AddFont(
'Font',
'',
'pt_sans-regular.ttf',
true);
28$pdf->AddFont(
'Font',
'B',
'pt_sans-bold.ttf',
true);
36 'top' => intval(
$params[
'BILLBY_MARGIN_TOP'] ?: 15) * 72/25.4,
37 'right' => intval(
$params[
'BILLBY_MARGIN_RIGHT'] ?: 15) * 72/25.4,
38 'bottom' => intval(
$params[
'BILLBY_MARGIN_BOTTOM'] ?: 15) * 72/25.4,
39 'left' => intval(
$params[
'BILLBY_MARGIN_LEFT'] ?: 20) * 72/25.4
44$pdf->SetDisplayMode(100,
'continuous');
57if (
$params[
'BILLBY_HEADER_SHOW'] ==
'Y')
59 if (
$params[
'BILLBY_PATH_TO_LOGO'])
61 list($imageHeight, $imageWidth) =
$pdf->GetImageSize(
$params[
'BILLBY_PATH_TO_LOGO']);
64 $imgDpi = intval(
$params[
'BILLBY_LOGO_DPI']) ?: 96;
65 $imgZoom = 96 / $imgDpi;
68 $logoWidth = $imageWidth * $imgZoom + $imgMargin;
71 $imgDpi = 96 * $imageWidth/(
$width*0.6 + 5);
72 $imgZoom = 96 / $imgDpi;
75 $logoWidth = $imageWidth * $imgZoom + $imgMargin;
90 if (
$params[
"SELLER_COMPANY_NAME"])
98 if (
$params[
'SELLER_COMPANY_INN'])
108 if (
$params[
"SELLER_COMPANY_BANK_NAME"])
110 $sellerBankCity =
'';
111 if (
$params[
"SELLER_COMPANY_BANK_CITY"])
113 $sellerBankCity =
$params[
"SELLER_COMPANY_BANK_CITY"];
114 if (is_array($sellerBankCity))
115 $sellerBankCity = implode(
', ', $sellerBankCity);
117 $sellerBankCity = str_replace(
array(
"\r\n",
"\n",
"\r"),
', ', strval($sellerBankCity));
121 $params[
"SELLER_COMPANY_BANK_NAME"],
128 $rsPattern =
'/\s*\d{10,100}\s*/';
130 $sellerBank = trim(preg_replace($rsPattern,
' ',
$params[
"SELLER_COMPANY_BANK_ACCOUNT"]));
132 preg_match($rsPattern,
$params[
"SELLER_COMPANY_BANK_ACCOUNT"],
$matches);
137 $sellerRsPrefix = Loc::getMessage(
'SALE_HPS_BILLBY_SELLER_ACC_ABBR');
138 if (!empty($sellerRsPrefix))
140 unset($sellerRsPrefix);
151 if (!empty(
$params[
'SELLER_COMPANY_BANK_BIC']))
156 Loc::getMessage(
'SALE_HPS_BILLBY_SELLER_BANK_BIK').
' '.
$params[
'SELLER_COMPANY_BANK_BIC'];
162 if (
$params[
'SELLER_COMPANY_ADDRESS'])
172 if (
$params[
"SELLER_COMPANY_PHONE"])
176 $phoneTitle = Loc::getMessage(
'SALE_HPS_BILLBY_PHONE_TITLE');
177 if (!empty($phoneTitle))
207 $dateValue =
$params[
"PAYMENT_DATE_INSERT"];
208 if ($dateValue instanceof \
Bitrix\Main\Type\Date || $dateValue instanceof \
Bitrix\Main\Type\DateTime)
210 $dateValue = mb_strtolower(
FormatDate(
'd F Y', $dateValue->getTimestamp()));
211 $yearPostfix = Loc::getMessage(
'SALE_HPS_BILLBY_YEAR_POSTFIX');
212 if (!empty($yearPostfix))
213 $dateValue .= $yearPostfix;
216 else if (is_string($dateValue))
219 if ($timeStampValue !==
false)
220 $dateValue = mb_strtolower(
FormatDate(
'd F Y', $timeStampValue));
221 unset($timeStampValue);
225 $params[
'BILLBY_HEADER'].
' '.Loc::getMessage(
'SALE_HPS_BILLBY_SELLER_TITLE',
array(
'#PAYMENT_NUM#' =>
$params[
"ACCOUNT_NUMBER"],
'#PAYMENT_DATE#' => $dateValue))
234if (
$params[
"BILLBY_ORDER_SUBJECT"])
240if (
$params[
"PAYMENT_DATE_PAY_BEFORE"])
248if (
$params[
'BILLBY_PAYER_SHOW'] ==
'Y')
251 $buyerInfoRows =
array();
252 if (
$params[
'BUYER_PERSON_COMPANY_DOGOVOR'])
255 Loc::getMessage(
'SALE_HPS_BILLBY_BUYER_DOGOVOR').
': '.
$params[
'BUYER_PERSON_COMPANY_DOGOVOR'];
256 $buyerInfoRows[] =
'';
258 $buyerInfoName = Loc::getMessage(
'SALE_HPS_BILLBY_BUYER_TITLE').
':';
259 if (
$params[
"BUYER_PERSON_COMPANY_NAME"])
261 if (!empty($buyerInfoName))
262 $buyerInfoName .=
' ';
263 $buyerInfoName .=
$params[
"BUYER_PERSON_COMPANY_NAME"];
265 if (!empty($buyerInfoName))
266 $buyerInfoRows[] = $buyerInfoName;
267 unset($buyerInfoName);
268 $buyerInfoTaxId =
'';
269 if (
$params[
'BUYER_PERSON_COMPANY_INN'])
271 $buyerInfoTaxId .= Loc::getMessage(
'SALE_HPS_BILLBY_INN').
': '.
$params[
'BUYER_PERSON_COMPANY_INN'];
272 if (!empty($buyerInfoTaxId))
273 $buyerInfoRows[] = $buyerInfoTaxId;
275 unset($buyerInfoTaxId);
279 if (
$params[
"BUYER_PERSON_COMPANY_BANK_NAME"])
282 if (
$params[
"BUYER_PERSON_COMPANY_BANK_CITY"])
284 $buyerBankCity =
$params[
"BUYER_PERSON_COMPANY_BANK_CITY"];
285 if (is_array($buyerBankCity))
286 $buyerBankCity = implode(
', ', $buyerBankCity);
288 $buyerBankCity = str_replace(
array(
"\r\n",
"\n",
"\r"),
', ', strval($buyerBankCity));
290 $buyerBank = sprintf(
292 $params[
"BUYER_PERSON_COMPANY_BANK_NAME"],
295 $buyerRs =
$params[
"BUYER_PERSON_COMPANY_BANK_ACCOUNT"];
299 $rsPattern =
'/\s*\d{10,100}\s*/';
301 $buyerBank = trim(preg_replace($rsPattern,
' ',
$params[
"BUYER_PERSON_COMPANY_BANK_ACCOUNT"]));
303 preg_match($rsPattern,
$params[
"BUYER_PERSON_COMPANY_BANK_ACCOUNT"],
$matches);
306 if (!empty($buyerRs))
308 $buyerRsPrefix = Loc::getMessage(
'SALE_HPS_BILLBY_SELLER_ACC_ABBR');
309 if (!empty($buyerRsPrefix))
310 $buyerRs = $buyerRsPrefix.
' '.$buyerRs;
311 unset($buyerRsPrefix);
312 $buyerInfoBank .= $buyerRs;
315 if (!empty($buyerBank))
317 if (!empty($buyerInfoBank))
318 $buyerInfoBank .=
', ';
319 $buyerInfoBank .= $buyerBank;
322 if (!empty(
$params[
'BUYER_PERSON_COMPANY_BANK_BIC']))
324 if (!empty($buyerInfoBank))
325 $buyerInfoBank .=
', ';
326 $buyerInfoBank .= Loc::getMessage(
'SALE_HPS_BILLBY_SELLER_BANK_BIK').
' '.
$params[
'BUYER_PERSON_COMPANY_BANK_BIC'];
328 if (!empty($buyerInfoBank))
329 $buyerInfoRows[] = $buyerInfoBank;
330 unset($buyerInfoBank);
332 if (
$params[
'BUYER_PERSON_COMPANY_ADDRESS'])
334 $buyerAddr =
$params[
'BUYER_PERSON_COMPANY_ADDRESS'];
335 if (is_array($buyerAddr))
336 $buyerAddr = implode(
', ', $buyerAddr);
338 $buyerAddr = str_replace(
array(
"\r\n",
"\n",
"\r"),
', ', strval($buyerAddr));
339 if (!empty($buyerAddr))
340 $buyerInfoAddr .= Loc::getMessage(
'SALE_HPS_BILLBY_ADDR_TITLE').
': '.$buyerAddr;
342 if (
$params[
"BUYER_PERSON_COMPANY_PHONE"])
344 if (!empty($buyerInfoAddr))
345 $buyerInfoAddr .=
', ';
346 $phoneTitle = Loc::getMessage(
'SALE_HPS_BILLBY_PHONE_TITLE');
347 if (!empty($phoneTitle))
348 $buyerInfoAddr .= $phoneTitle.
' ';
349 $buyerInfoAddr .=
$params[
"BUYER_PERSON_COMPANY_PHONE"];
351 if (
$params[
"BUYER_PERSON_COMPANY_FAX"])
353 if (!empty($buyerInfoAddr))
354 $buyerInfoAddr .=
', ';
355 $phoneTitle = Loc::getMessage(
'SALE_HPS_BILLBY_FAX_TITLE');
356 if (!empty($phoneTitle))
357 $buyerInfoAddr .= $phoneTitle.
' ';
358 $buyerInfoAddr .=
$params[
"BUYER_PERSON_COMPANY_FAX"];
360 if (
$params[
"BUYER_PERSON_COMPANY_NAME_CONTACT"])
362 if (!empty($buyerInfoAddr))
363 $buyerInfoAddr .=
', ';
364 $buyerInfoAddr .=
$params[
"BUYER_PERSON_COMPANY_NAME_CONTACT"];
366 if (!empty($buyerInfoAddr))
367 $buyerInfoRows[] = $buyerInfoAddr;
368 unset($buyerInfoAddr);
373 if (!empty($buyerInfoRows))
375 foreach ($buyerInfoRows as
$text)
393 unset($buyerInfoRows);
413$columnList =
array(
'NUMBER',
'NAME',
'QUANTITY',
'MEASURE',
'PRICE',
'SUM',
'VAT_RATE',
'VAT_SUM',
'TOTAL');
418 if (
$params[
'BILLBY_COLUMN_'.$column.
'_SHOW'] ==
'Y')
420 $caption =
$params[
'BILLBY_COLUMN_'.$column.
'_TITLE'];
424 'SORT' =>
$params[
'BILLBY_COLUMN_'.$column.
'_SORT']
435 'SORT' =>
$val[
'SORT']
440uasort(
$arCols,
function (
$a, $b) {
return (
$a[
'SORT'] < $b[
'SORT']) ? -1 : 1;});
462 foreach (
$params[
'BASKET_ITEMS'] as $basketItem)
464 $productName = $basketItem[
"NAME"];
465 if ($productName ==
"OrderDelivery")
466 $productName = Loc::getMessage(
'SALE_HPS_BILLBY_DELIVERY');
467 else if ($productName ==
"OrderDiscount")
468 $productName = Loc::getMessage(
'SALE_HPS_BILLBY_DISCOUNT');
470 if ($basketItem[
'IS_VAT_IN_PRICE'])
472 $basketItemTotal = doubleval($basketItem[
'PRICE'] * $basketItem[
'QUANTITY']);
474 if (($basketItem[
'VAT_RATE'] != 0.0))
476 $basketItemSum = $basketItemTotal / (1 + doubleval($basketItem[
'VAT_RATE']));
477 $basketItemVatSum = doubleval($basketItemSum * $basketItem[
'VAT_RATE']);
481 $basketItemSum = $basketItemTotal;
482 $basketItemVatSum = 0.0;
487 $basketItemSum = doubleval($basketItem[
'PRICE'] * $basketItem[
'QUANTITY']);
489 if (($basketItem[
'VAT_RATE'] != 0.0))
491 $basketItemTotal = doubleval($basketItemSum * (1 + doubleval($basketItem[
'VAT_RATE'])));
492 $basketItemVatSum = doubleval($basketItemSum * doubleval($basketItem[
'VAT_RATE']));
496 $basketItemTotal = $basketItemSum;
497 $basketItemVatSum = 0.0;
502 foreach (
$arCols as $columnId => $col)
510 $arCols[$columnId][
'IS_DIGIT'] =
true;
517 $arCols[$columnId][
'IS_DIGIT'] =
true;
520 $data =
CSalePdf::prepareToPdf($basketItem[
"MEASURE_NAME"] ? $basketItem[
"MEASURE_NAME"] : Loc::getMessage(
'SALE_HPS_BILLBY_BASKET_MEASURE_DEFAULT'));
521 $arCols[$columnId][
'IS_DIGIT'] =
true;
525 $arCols[$columnId][
'IS_DIGIT'] =
true;
529 $arCols[$columnId][
'IS_DIGIT'] =
true;
532 if ($basketItem[
'VAT_RATE'] == 0.0)
536 $arCols[$columnId][
'IS_DIGIT'] =
true;
539 if ($basketItem[
'VAT_RATE'] == 0.0)
543 $arCols[$columnId][
'IS_DIGIT'] =
true;
547 $arCols[$columnId][
'IS_DIGIT'] =
true;
550 if (preg_match(
'/[^0-9 ,\.]/', $basketItem[$columnId]) === 0)
552 if (!array_key_exists(
'IS_DIGIT',
$arCols[$columnId]))
553 $arCols[$columnId][
'IS_DIGIT'] =
true;
557 $arCols[$columnId][
'IS_DIGIT'] =
false;
566 foreach ($basketItem[
'PROPS'] as $basketPropertyItem)
568 if ($basketPropertyItem[
'CODE'] ==
'CATALOG.XML_ID' || $basketPropertyItem[
'CODE'] ==
'PRODUCT.XML_ID')
571 $arProps[
$n][] = $pdf::prepareToPdf(sprintf(
"%s: %s", $basketPropertyItem[
"NAME"], $basketPropertyItem[
"VALUE"]));
575 $vat = max(
$vat, $basketItem[
'VAT_RATE']);
581 if (
$params[
'DELIVERY_PRICE'] > 0)
583 $sDeliveryItem = Loc::getMessage(
'SALE_HPS_BILLBY_DELIVERY');
585 $sDeliveryItem .= sprintf(
" (%s)",
$params[
'DELIVERY_NAME']);
587 $basketItemTotal =
$params[
'DELIVERY_PRICE'];
591 $basketItemSum = $basketItemTotal / (1 + doubleval(
$vat));
592 $basketItemVatSum = doubleval($basketItemSum *
$vat);
596 $basketItemSum = $basketItemTotal;
597 $basketItemVatSum = 0.0;
601 foreach (
$arCols as $columnId => $col)
609 $arCols[$columnId][
'IS_DIGIT'] =
true;
616 $arCols[$columnId][
'IS_DIGIT'] =
true;
620 $arCols[$columnId][
'IS_DIGIT'] =
true;
624 $arCols[$columnId][
'IS_DIGIT'] =
true;
628 $arCols[$columnId][
'IS_DIGIT'] =
true;
635 $arCols[$columnId][
'IS_DIGIT'] =
true;
642 $arCols[$columnId][
'IS_DIGIT'] =
true;
646 $arCols[$columnId][
'IS_DIGIT'] =
true;
664 if (
$params[
'BILLBY_TOTAL_SHOW'] ==
'Y')
666 $totalRowValues =
array();
697 $totalRowValues[$colNum] =
array(
'value' => $value,
'isDigit' => $isDigit);
699 unset($skip, $value, $isDigit);
700 $totalTitleColIndex = (empty($totalRowValues) ? 0 : (int)min(array_keys($totalRowValues))) - 1;
703 if (!empty($totalRowValues))
709 if (isset($totalRowValues[
$i]))
712 if (isset($totalRowValues[
$i][
'isDigit']))
722 unset($totalRowValues);
727 foreach (
$params[
'TAXES'] as $tax)
729 if (isset($tax[
'CODE']) && $tax[
'CODE'] !==
'VAT')
738 ($tax[
"IS_IN_PRICE"] ==
"Y") ? Loc::getMessage(
'SALE_HPS_BILLBY_INCLUDING') :
"",
740 (
$vat <= 0 && $tax[
"IS_PERCENT"] ==
"Y") ? sprintf(
' (%s%%)',
roundEx($tax[
"VALUE"],
$precision)) :
""
758 if (
$params[
'DISCOUNT_PRICE'] > 0)
796 foreach (
$arCols as $columnId => $column)
801 if (
$arCols[$columnId][
'NAME'])
805 ${
"x".($i+1)} =
$pdf->GetX();
827 $accumulatedContent = 0;
828 foreach (
$arCols as $columnId => $column)
832 $accumulated += $arRowsWidth_tmp[$columnId];
833 $arRowsWidth_tmp[$columnId] =
null;
834 $accumulatedContent += $arRowsContentWidth_tmp[$columnId];
835 $arRowsContentWidth_tmp[$columnId] =
null;
839 $arRowsWidth_tmp[$columnId] += $accumulated;
840 $arRowsContentWidth_tmp[$columnId] += $accumulatedContent;
842 $accumulatedContent = 0;
855 foreach (
$arCols as $columnId => $column)
859 list($string,
$arCells[
$n][$columnId]) =
$pdf->splitString(
$arCells[
$n][$columnId], $arRowsContentWidth_tmp[$columnId]);
861 $rowWidth = $arRowsWidth_tmp[$columnId];
863 if (in_array($columnId,
array(
'QUANTITY',
'MEASURE',
'PRICE',
'SUM',
'VAT_RATE',
'VAT_SUM',
'TOTAL'),
true))
870 elseif ($columnId ==
'NUMBER')
875 elseif ($columnId ==
'NAME')
891 ${
'x'.($pos+1)} =
$pdf->GetX();
903 if (
$params[
'BILLBY_COLUMN_NAME_SHOW'] ==
'Y')
905 if (isset($arProps[
$n]) && is_array($arProps[
$n]))
908 foreach ($arProps[
$n] as $property)
912 foreach (
$arCols as $columnId => $caption)
917 if ($columnId ==
'NAME')
918 $pdf->Cell($arRowsWidth_tmp[$columnId], 12, $property, 0, $line);
920 $pdf->Cell($arRowsWidth_tmp[$columnId], 12,
'', 0, $line);
937 $pdf->Line(${
"x$startIndex"},
$y5, ${
'x'.$columnCount},
$y5);
940if (
$params[
'BILLBY_TOTAL_SHOW'] ==
'Y')
944 $inWords = in_array(
$params[
'CURRENCY'],
array(
"RUR",
"RUB",
"UAH",
"KZT",
"BYR",
"BYN"));
948 $text = Loc::getMessage(
'SALE_HPS_BILLBY_TOTAL_VAT').
': ';
966 $text = Loc::getMessage(
'SALE_HPS_BILLBY_TOTAL_SUM_WITH_VAT').
': ';
992 if (
$params[
"BILLBY_COMMENT1"])
995 array(
'#</div>\s*<div[^>]*>#i',
'#</?div>#i'),
array(
'<br>',
'<br>'),
1002 if (
$params[
"BILLBY_COMMENT2"])
1005 array(
'#</div>\s*<div[^>]*>#i',
'#</?div>#i'),
array(
'<br>',
'<br>'),
1007 ),
'',
array(), 0));
1016if (
$params[
'BILLBY_SIGN_SHOW'] ==
'Y')
1018 if (
$params[
'BILLBY_PATH_TO_STAMP'])
1020 $filePath =
$pdf->GetImagePath(
$params[
'BILLBY_PATH_TO_STAMP']);
1022 if ($filePath !=
'' && !
$blank && \
Bitrix\Main\IO\File::isFileExists($filePath))
1024 list($stampHeight, $stampWidth) =
$pdf->GetImageSize(
$params[
'BILLBY_PATH_TO_STAMP']);
1025 if ($stampHeight && $stampWidth)
1027 if ($stampHeight > 120 || $stampWidth > 120)
1029 $ratio = 120 / max($stampHeight, $stampWidth);
1030 $stampHeight = $ratio * $stampHeight;
1031 $stampWidth = $ratio * $stampWidth;
1038 $params[
'BILLBY_PATH_TO_STAMP'],
1040 $stampWidth, $stampHeight
1049 if (
$params[
"SELLER_COMPANY_DIRECTOR_POSITION"])
1054 list($signHeight, $signWidth) =
$pdf->GetImageSize(
$params[
'SELLER_COMPANY_DIR_SIGN']);
1056 if ($signHeight && $signWidth)
1058 $ratio = min(37.5/$signHeight, 150/$signWidth);
1059 $signHeight = $ratio * $signHeight;
1060 $signWidth = $ratio * $signWidth;
1067 if ($isDirSign &&
$pdf->GetStringWidth($sellerDirPos) <= 160)
1078 $params[
'SELLER_COMPANY_DIR_SIGN'],
1080 $signWidth, $signHeight
1088 if (
$params[
"SELLER_COMPANY_DIRECTOR_NAME"])
1098 if (
$params[
"SELLER_COMPANY_ACCOUNTANT_POSITION"])
1103 list($signHeight, $signWidth) =
$pdf->GetImageSize(
$params[
'SELLER_COMPANY_ACC_SIGN']);
1105 if ($signHeight && $signWidth)
1107 $ratio = min(37.5/$signHeight, 150/$signWidth);
1108 $signHeight = $ratio * $signHeight;
1109 $signWidth = $ratio * $signWidth;
1126 $params[
'SELLER_COMPANY_ACC_SIGN'],
1128 $signWidth, $signHeight
1136 if (
$params[
"SELLER_COMPANY_ACCOUNTANT_NAME"])
1152 'Schet No %s ot %s.pdf',
1155 chr(0), chr(1), chr(2), chr(3), chr(4), chr(5), chr(6), chr(7), chr(8), chr(9), chr(10), chr(11),
1156 chr(12), chr(13), chr(14), chr(15), chr(16), chr(17), chr(18), chr(19), chr(20), chr(21), chr(22),
1157 chr(23), chr(24), chr(25), chr(26), chr(27), chr(28), chr(29), chr(30), chr(31),
1158 '"',
'*',
'/',
':',
'<',
'>',
'?',
'\\',
'|'
1161 strval(
$params[
"ACCOUNT_NUMBER"])
static prepareToPdf($string)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
ConvertDateTime($datetime, $to_format=false, $from_site=false, $bSearchInSitesOnly=false)
FormatDate($format="", $timestamp=false, $now=false, ?string $languageId=null)
HTMLToTxt($str, $strSiteUrl="", $aDelete=[], $maxlen=70)
MakeTimeStamp($datetime, $format=false)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
if( $arBasket=$dbBasket->Fetch()) if($vat > 0) $rowsCnt
if(CSalePaySystemAction::GetParamValue('BACKGROUND', false)) $margin
if(!empty($sellerData)) $dest
$arPaySysAction["ENCODING"]
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
foreach( $params[ 'BASKET_ITEMS'] as $basketItem) if($params['DELIVERY_PRICE'] > 0) $totalRowIsLast
if($params['BILLBY_HEADER_SHOW']=='Y') $sellerInfoRows
if($params["BILLBY_ORDER_SUBJECT"]) if( $params["PAYMENT_DATE_PAY_BEFORE"]) if($params['BILLBY_PAYER_SHOW']=='Y') $currencyFormat
SaleFormatCurrency($fSum, $strCurrency, $OnlyValue=false, $withoutFormat=false)
const SALE_VALUE_PRECISION
Number2Word_Rus($source, $IS_MONEY="Y", $currency="")