opacum

Bitrix. Generate XML from order and send it via mail\ftp

Apr 22nd, 2020
1,063
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 11.23 KB | None | 0 0
  1. <?
  2. use Bitrix\Main;
  3. use Bitrix\Main\Entity;
  4. use Bitrix\Main\Mail\Event;
  5. use Bitrix\Main\Diag\Debug;
  6.  
  7. $eventManager = Main\EventManager::getInstance();
  8. $eventManager->addEventHandler("sale", "OnSaleStatusOrderChange", "changeDelivery");
  9.  
  10. function changeDelivery(Bitrix\Main\Event $event)
  11. {
  12.     $parameters = $event->getParameters();
  13.     $order = $parameters['ENTITY'];
  14.  
  15.     if (! $order instanceof \Bitrix\Sale\Order) {
  16.         return new \Bitrix\Main\EventResult(
  17.             \Bitrix\Main\EventResult::ERROR,
  18.             new \Bitrix\Sale\ResultError('Неверный объект заказа', 'SALE_EVENT_WRONG_ORDER'),
  19.             'sale'
  20.         );
  21.     }
  22.  
  23.     $xmlFilepath = 'upload/mailXML/logsisDelivery.xml';
  24.     $absFilePath = $_SERVER["DOCUMENT_ROOT"].'/'.$xmlFilepath;
  25.     $PRODUCT_IBLOCK_ID = 26;
  26.     $SITE_ID = 's1';
  27.     $mailEventName = 'SALE_ORDER_XML_LOGSIS';
  28.     $xmlFields = [];
  29.     $xmlFields['ORDER_ID'] = '00ОУ-'.$order->getId();
  30.     $xmlFields['ORDER_ID_CROP'] = $order->getId();
  31.     $xmlFields['STATUS_ID'] = $order->getField('STATUS_ID');
  32.     $xmlFields['DATE_INSERT'] = $order->getField('DATE_INSERT');
  33.     $collection = $order->getPropertyCollection();
  34.     $locationID = $collection->getDeliveryLocation()->getField('VALUE');
  35.     $arLocation = CSaleLocation::GetByID($locationID);
  36.     $arLocation['ADDRESS'] = $collection->getAddress()->getField('VALUE');
  37.     $xmlFields['LOCATION'] = $arLocation['COUNTRY_NAME'].','.$arLocation['CITY_NAME'].','.$arLocation['ADDRESS'];
  38.  
  39.     $ftp_server = FTP_SERVER;
  40.     $ftp_user = FTP_USER;
  41.     $ftp_pass = FTP_PASS;
  42.     $ftp_file_name = FTP_FILE_PATH;
  43.  
  44.  
  45.     $dbBasketItems = CSaleBasket::GetList(array(), array("ORDER_ID" => $order->getId()), false, false, array());
  46.  
  47.     while ($arItems = $dbBasketItems->Fetch()) {
  48.         $xmlFields['ITEMS'][] = $arItems;
  49.     }
  50.  
  51.     if ($xmlFields['STATUS_ID'] && $xmlFields['STATUS_ID'] == 'dd') {
  52.         $dom = new DOMDocument('1.0', 'utf-8');
  53.         $dom->preserveWhiteSpace = false;
  54.         $dom->formatOutput = true;
  55.  
  56.         $root = $dom->createElement("ЗаказНаОтгрузку");
  57.         $dom->appendChild($root);
  58.         $man = $dom->createElement("Справочники");
  59.         $doc = $dom->createElement("Документы");
  60.  
  61.  
  62.         foreach ($xmlFields['ITEMS'] as $key => $arItem) {
  63.             $db_props_art = CIBlockElement::GetProperty(
  64.                 $PRODUCT_IBLOCK_ID,
  65.                 $arItem['PRODUCT_ID'],
  66.                 ["sort" => "asc"],
  67.                 ["CODE" => 'CML2_ARTICLE']
  68.             );
  69.  
  70.             $db_props_code = CIBlockElement::GetProperty(
  71.                 $PRODUCT_IBLOCK_ID,
  72.                 $arItem['PRODUCT_ID'],
  73.                 ["sort" => "asc"],
  74.                 ["CODE" => 'SHTRIKH_KOD']
  75.             );
  76.  
  77.             $ar_res = CCatalogProduct::GetByID($arItem['PRODUCT_ID']);
  78.  
  79.             $itemArt = '';
  80.             $itemCode = '';
  81.  
  82.             if ($ar_props = $db_props_code->Fetch()) {
  83.                 $itemCode = $ar_props["VALUE"];
  84.             }
  85.  
  86.             if ($ar_props = $db_props_art->Fetch()) {
  87.                 $itemArt = $ar_props["VALUE"];
  88.             }
  89.  
  90.             $xmlFields['ITEMS'][$key]['ARTNUMBER'] = $itemArt;
  91.             $xmlFields['ITEMS'][$key]['CCODE'] = $itemCode;
  92.             $xmlFields['ITEMS'][$key]['CAT_WEIGHT'] = $ar_res['WEIGHT'];
  93.  
  94.             $manNom = $dom->createElement("Номенклатура");
  95.             $manNomGroup = $dom->createElement("ПризнакГруппы", '0');
  96.             $manNomID = $dom->createElement("КодТовара", $itemArt);
  97.             $manNomName = $dom->createElement("Наименование", $arItem['NAME']);
  98.             $manNomNameStr = $dom->createElement("КраткоеНаименование", $arItem['NAME']);
  99.             $manNomHolder = $dom->createElement("Поклажедатель", '000000280');
  100.             $manNomArt = $dom->createElement("Артикул", $itemArt);
  101.             $manNomVal = $dom->createElement("ЕдиницаИзмерения");
  102.             $manNomValCode = $dom->createElement("Код", '796');
  103.             $manNomValBase = $dom->createElement("Базовая", '1');
  104.             $manNomValCof = $dom->createElement("КоэффициентПересчета", '1');
  105.             $manNomValStore = $dom->createElement("ЕдиницаХранения", 'шт.');
  106.             $manNomValW = $dom->createElement("Вес", $xmlFields['ITEMS'][$key]['CAT_WEIGHT']);
  107.             $manNomValVol = $dom->createElement("Объем", '0');
  108.             $manNomValCodeProp = $dom->createElement("ШтрихКод", $itemCode);
  109.  
  110.             unset($itemArt);
  111.             unset($itemCode);
  112.  
  113.             /*ЕдиницаИзмерения*/
  114.             $manNomVal->appendChild($manNomValCode);
  115.             $manNomVal->appendChild($manNomValBase);
  116.             $manNomVal->appendChild($manNomValCof);
  117.             $manNomVal->appendChild($manNomValStore);
  118.             $manNomVal->appendChild($manNomValW);
  119.             $manNomVal->appendChild($manNomValVol);
  120.             $manNomVal->appendChild($manNomValCodeProp);
  121.             /*ЕдиницаИзмерения.END*/
  122.  
  123.             /*Номенклатура*/
  124.             $manNom->appendChild($manNomGroup);
  125.             $manNom->appendChild($manNomID);
  126.             $manNom->appendChild($manNomName);
  127.             $manNom->appendChild($manNomNameStr);
  128.             $manNom->appendChild($manNomHolder);
  129.             $manNom->appendChild($manNomArt);
  130.             $manNom->appendChild($manNomVal);
  131.             /*Номенклатура.END*/
  132.  
  133.             $man->appendChild($manNom);
  134.         }
  135.  
  136.         $manAgent = $dom->createElement("Контрагенты");
  137.         $manAgentGroup = $dom->createElement("ПризнакГруппы", '0');
  138.         $manAgentCode = $dom->createElement("КодКонтрагента", '*******');
  139.         $manAgentName = $dom->createElement("Наименование", 'ООО "ЛОГСИС ГРУПП"');
  140.         $manAgentNameShort = $dom->createElement("ПолноеНаименование", 'ООО "ЛОГСИС ГРУПП"');
  141.         $manAgentINN = $dom->createElement("ИНН", '********');
  142.         $manAgentOKPO = $dom->createElement("ОКПО", '*******');
  143.         $manAgentBill = $dom->createElement("НомерСчета", '**********');
  144.         $manAgentBIK = $dom->createElement("БИК", '********');
  145.  
  146.         /*Контрагенты*/
  147.         $manAgent->appendChild($manAgentGroup);
  148.         $manAgent->appendChild($manAgentCode);
  149.         $manAgent->appendChild($manAgentName);
  150.         $manAgent->appendChild($manAgentNameShort);
  151.         $manAgent->appendChild($manAgentINN);
  152.         $manAgent->appendChild($manAgentOKPO);
  153.         $manAgent->appendChild($manAgentBill);
  154.         $manAgent->appendChild($manAgentBIK);
  155.         $man->appendChild($manAgent);
  156.         /*Контрагенты.END*/
  157.  
  158.         $docPlan = $dom->createElement("ПланированиеОтгрузки");
  159.         $docPlanOrgCode = $dom->createElement("КодОрганизации", '000000003');
  160.         $docPlanOrderID = $dom->createElement("НомерЗаявки", $xmlFields['ORDER_ID']);
  161.         $docPlanOrderDate = $dom->createElement("ДатаЗаявки", $xmlFields['DATE_INSERT']);
  162.         $docPlanOrderDocView = $dom->createElement("ВидДокумента", '6');
  163.         $docPlanOrderDDate = $dom->createElement("ДатаОтгрузкиПлан", $xmlFields['DATE_INSERT']);
  164.         $docPlanOrderKis = $dom->createElement("КодПоклажедателя_КИС", '000000280');
  165.         $docPlanOrderKisFwd = $dom->createElement("КодПолучателя_КИС", 'С00000051');
  166.         $docPlanOrderManager= $dom->createElement("Менеджер", 'Гржибовская Е.Ю.');
  167.         $docPlanOrderAddress= $dom->createElement("АдресДоставки", $xmlFields['LOCATION']);
  168.  
  169.         /*ПланированиеОтгрузки*/
  170.         $docPlan->appendChild($docPlanOrgCode);
  171.         $docPlan->appendChild($docPlanOrderID);
  172.         $docPlan->appendChild($docPlanOrderDate);
  173.         $docPlan->appendChild($docPlanOrderDocView);
  174.         $docPlan->appendChild($docPlanOrderDDate);
  175.         $docPlan->appendChild($docPlanOrderKis);
  176.         $docPlan->appendChild($docPlanOrderKisFwd);
  177.         $docPlan->appendChild($docPlanOrderManager);
  178.         $docPlan->appendChild($docPlanOrderAddress);
  179.         /*ПланированиеОтгрузки.END*/
  180.  
  181.         foreach ($xmlFields['ITEMS'] as $arItem) {
  182.             $docPlanItem = $dom->createElement("Строка");
  183.             $docPlanItemPropID = $dom->createElement("КодТовара", $arItem['ARTNUMBER']);
  184.             $docPlanItemPropCNT = $dom->createElement("Количество", $arItem['QUANTITY']);
  185.             $docPlanItemPropPriceTotal = $arItem['PRICE']; //Show single val
  186.             /*$docPlanItemPropPriceTotal = intval($arItem['PRICE'])*intval($arItem['QUANTITY']);*/ //Show total val
  187.             $docPlanItemPropPrice = $dom->createElement("Цена", $docPlanItemPropPriceTotal);
  188.  
  189.             /*Строка*/
  190.             $docPlanItem->appendChild($docPlanItemPropID);
  191.             $docPlanItem->appendChild($docPlanItemPropCNT);
  192.             $docPlanItem->appendChild($docPlanItemPropPrice);
  193.             $docPlan->appendChild($docPlanItem);
  194.             /*Строка.END*/
  195.         }
  196.  
  197.         /*Build final XML DOM*/
  198.         $doc->appendChild($docPlan);
  199.         $root->appendChild($man);
  200.         $root->appendChild($doc);
  201.  
  202.         $resultXML = $dom->saveXML();
  203.  
  204.         if (file_exists($_SERVER["DOCUMENT_ROOT"].'/'.$xmlFilepath)) {
  205.             unlink($_SERVER["DOCUMENT_ROOT"].'/'.$xmlFilepath);
  206.         }
  207.  
  208.         /*Save result XML to file*/
  209.         Debug::writeToFile($resultXML, "", $xmlFilepath);
  210.  
  211.         /*Upload file via FTP*/
  212.         $conn_id = ftp_connect($ftp_server);
  213.  
  214.         $login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
  215.  
  216.         ftp_pasv($conn_id, true); //passive mode
  217.  
  218.         /*FTP_debug*/
  219.  
  220.        /*
  221.  
  222.         if (file_exists($_SERVER["DOCUMENT_ROOT"].'/upload/mailXML/logsis_log.txt')) {
  223.             unlink($_SERVER["DOCUMENT_ROOT"].'/upload/mailXML/logsis_log.txt');
  224.         }
  225.  
  226.         if (! $conn_id) {
  227.             Debug::writeToFile('Ошибка соединения', "", 'upload/mailXML/logsis_log.txt');
  228.         }
  229.  
  230.         if (! $login_result) {
  231.             Debug::writeToFile('Ошибка авторизации', "", 'upload/mailXML/logsis_log.txt');
  232.         }
  233.         */
  234.  
  235.         /*FTP_debug.END*/
  236.  
  237.         if (ftp_put($conn_id, $ftp_file_name, $absFilePath, FTP_ASCII)) {
  238.             Debug::writeToFile(ConvertTimeStamp().' - успешно загружен на сервер '. FTP_SERVER, "", 'upload/mailXML/logsis_log.txt');
  239.         } else {
  240.             Debug::writeToFile(ConvertTimeStamp().'Ошбика загрузки', "", 'upload/mailXML/logsis_log.txt');
  241.         }
  242.  
  243.         ftp_close($conn_id);
  244.  
  245.         $arEventFields = [
  246.             "ORDER_ID_PROP" => $xmlFields['ORDER_ID'],
  247.             "ORDER_ID" => $xmlFields['ORDER_ID_CROP']
  248.         ];
  249.  
  250.  
  251.         /*Send file via email*/
  252.         CEvent::Send($mailEventName, $SITE_ID,
  253.             $arEventFields,
  254.             'Y',
  255.             '',
  256.             array($_SERVER["DOCUMENT_ROOT"].'/'.$xmlFilepath)
  257.         );
  258.  
  259.     }
  260. }
Advertisement
Add Comment
Please, Sign In to add comment