[spoiler]
Идея
Будем формировать файл счета после создания заказа и перед отправкой письма-подтверждения, на основе xls-шаблона используя PHPExcel. При отправке письма-подтверждения о заказе — будем прикреплять файл счета к письму.
Реализация
1. Создадим шаблоны необходимых документов (счетов, актов, накладных и т.п.) в формате Excel — внесем в них все нужные параметры в виде "заглушек", в них будут выводиться данные конкретного заказа — номер заказа, секция магазина, дата, менеджер заказа, список товаров, сумма и т.п.:

2. В файле /bitrix/php_interface/init.php создадим обработчик события OnBeforeEventAddHandler - для того, чтобы отправить письмо с аттачами (за идею, как в "Битриксе" реализовать отправку письма с аттачем, спасибо ):
function OnBeforeEventAddHandler($event, $lid, $arFields) {
if ($event == "SALE_NEW_ORDER") {
include("make_xls.php");
$arXLSfiles = scandir(dirname(__FILE__).'/orders/'.$arOrder['ID']);
include("mail_attach.php");
SendAttache($event, $lid, $arFields, $arXLSfiles);
return false;
}
} |
return false - необходимо для блокировки отправки письма "Битриксом", т.к. иначе будут проходить два письма - одно отправленное функцией SendAttache (с аттачами), второе - отправленное "Битриксом" (без аттачей)
3. Файл make_xls.php - создание Excel-файлов. Полный код приводить здесь не буду, основные моменты:
Собираем данные о заказе, пользователе, скидке заказа, корзине и т.п.:
if($arFields['ORDER_ID']) {
//Заказ:
$arOrder = CSaleOrder::GetByID($arFields['ORDER_ID']);
//Пользователь:
global $USER;
$rsUser = CUser::GetList(($by), ($order), array("ID"=>$USER->GetID()), array("SELECT" => array("ADMIN_NOTES","UF_*")));
$arUser = $rsUser->GetNext();
//Менеджер пользователя:
$rsManager = CUserFieldEnum::GetList(array(), array("ID" => $arUser["UF_MANAGER"]));
$arManager = $rsManager->GetNext();
//Скидки пользователя:
foreach($arUser as $key=>$value) {
...
}
//Корзина:
$dbBasketItems = CSaleBasket::GetList(array("NAME" => "ASC"), array("ORDER_ID" => $arFields["ORDER_ID"]), false, false, array("ID", "PRODUCT_ID", "QUANTITY", "PRICE", "NAME"));
while ($arBasketItem = $dbBasketItems->GetNext()) {
...
}
} |
include_once dirname(__FILE__) . '/PHPExcel.php'; include_once dirname(__FILE__) . '/PHPExcel.addon.php'; mkdir(dirname(__FILE__).'/orders/'.$arOrder['ID'], 0755, true); PHPExcelAddon::convert(dirname(__FILE__).'/order_template.xls',array ( 'order' => "Заказ №".$arOrder['ID'], 'section' => $arSectionGroupsNames[$sgid], 'datetime' => $arOrder['DATE_INSERT'], 'client_name' => $arUser['NAME'].' '.$arUser['LAST_NAME'], 'manager_name' => $arManager['VALUE'], 'client_email' => $arUser['EMAIL'], 'manager_email' => $arManager['XML_ID'], 'basket.articles_ADDROWS' => $arBasketArticles, 'basket.names' => $arBasketNames, 'basket.quantities' => $arBasketQuantities, 'basket.summs' => $arBasketPrices, 'basket.discounts' => $arBasketDiscounts, 'total_summ' => $total_summ, ),'orders/'.$arOrder['ID'].'/Заказ_'.$arOrder['ID'].'_'.$arSectionGroupsNames[$sgid]); |
class PHPExcelAddon {
public function __construct () {}
public static function convert ($file, $data=array (), $filename='file') {
$objPHPExcel = PHPExcel_IOFactory::load( $file );
$objPHPExcel->setActiveSheetIndex(0);
$aSheet = $objPHPExcel->getActiveSheet();
foreach($aSheet->getRowIterator() as $row){
...
}
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
$objWriter->save(dirname($file).'/'.$filename.'.xlsx');
$objPHPExcel->disconnectWorksheets();
unset($objPHPExcel);
}
}
|
PS: Как вариант, можно формировать документы для клиентов в pdf, используя html-формы документов, доступные в интерфейсе управления заказами (или создавая свои):

Но это уже другая история.