%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/sale/lib/exchange/onec/ |
Current File : //home/bitrix/www/bitrix/modules/sale/lib/exchange/onec/converterdocumentorder.php |
<?php namespace Bitrix\Sale\Exchange\OneC; use Bitrix\Main\ArgumentException; use Bitrix\Main\Loader; use Bitrix\Main\Type\DateTime; use Bitrix\Sale\Exchange\EntityType; use Bitrix\Sale\Exchange\ImportBase; use Bitrix\Sale\Exchange\ImportOneCBase; use Bitrix\Sale\Exchange\ISettings; use Bitrix\Sale\Exchange\ISettingsExport; use Bitrix\Sale\Exchange\ISettingsImport; use Bitrix\Sale\Internals\StatusLangTable; use Bitrix\Sale\Order; /** * Class ConverterDocumentOrder * @package Bitrix\Sale\Exchange\OneC * @deprecated */ class ConverterDocumentOrder extends Converter { /** * @return array */ protected function getFieldsInfo() { return OrderDocument::getFieldsInfo(); } /** * @param $documentImport * @return array * @throws ArgumentException */ public function resolveParams($documentImport) { if(!($documentImport instanceof DocumentBase)) throw new ArgumentException("Document must be instanceof DocumentBase"); $result = array(); $params = $documentImport->getFieldValues(); $availableFields = Order::getAvailableFields(); foreach ($availableFields as $k) { switch($k) { case 'ID_1C': case 'VERSION_1C': if(isset($params[$k])) $fields[$k] = $params[$k]; break; case 'COMMENTS': if(isset($params['COMMENT'])) $fields[$k] = $params['COMMENT']; break; case 'CANCELED': $value=''; if(isset($params['CANCELED'])) $value = $params['CANCELED']; if($value == 'Y') { $fields[$k] = 'Y'; } else { $v=''; if(isset($params['REK_VALUES']['CANCEL'])) { $v = $params['REK_VALUES']['CANCEL']; } if($v == 'Y') { $fields[$k] = 'Y'; } else { $fields[$k] = 'N'; } } break; case 'DATE_INSERT': if(isset($params['1C_TIME']) && $params['1C_TIME'] instanceof DateTime) $fields[$k] = $params['1C_TIME']; break; case 'STATUS_ID': if(isset($params['REK_VALUES']['1C_STATUS_ID'])) { /** @var ISettingsImport $settings */ $settings = $this->getSettings(); if($settings->changeStatusFor($this->getEntityTypeId()) == 'Y') $fields[$k] = $params['REK_VALUES']['1C_STATUS_ID']; } break; case '1C_PAYED_DATE': case '1C_DELIVERY_DATE': if(isset($params['REK_VALUES'][$k])) $fields[$k] = $params['REK_VALUES'][$k]; break; } } $result['TRAITS'] = isset($fields)? $fields:array(); $result['ITEMS'] = isset($params['ITEMS'])? $params['ITEMS']:array(); $result['TAXES'] = isset($params['TAXES'])? $params['TAXES']:array(); return $result; } /** * @param null $order * @param array $fields * @throws ArgumentException */ static public function sanitizeFields($order=null, array &$fields, ISettings $settings) { if(!empty($order) && !($order instanceof Order)) throw new ArgumentException("Entity must be instanceof Order"); if(empty($order)) { $fields['DATE_STATUS'] = new DateTime() ; $fields['DATE_UPDATE'] = new DateTime(); } else { if(isset($fields['DATE_INSERT'])) unset($fields['DATE_INSERT']); } if(isset($fields['ID'])) unset($fields['ID']); if(isset($fields['1C_PAYED_DATE'])) unset($fields['1C_PAYED_DATE']); if(isset($fields['1C_DELIVERY_DATE'])) unset($fields['1C_DELIVERY_DATE']); } /** * @param array $fields * @return array */ public function externalize(array $fields) { $result = array(); $traits = $fields['TRAITS']; $items = $fields['ITEMS']; $taxes = $fields['TAXES']; $stories = isset($fields['STORIES']) ? array_unique($fields['STORIES'], SORT_NUMERIC): array(); $businessValue = $fields['BUSINESS_VALUE']; $availableFields = $this->getFieldsInfo(); /** @var ISettingsExport $settings */ $settings = $this->getSettings(); foreach ($availableFields as $k=>$v) { $value=''; switch ($k) { case 'ID': $value = $traits['ID']; break; case 'NUMBER': /** TODO: only EntityType::ORDER */ $value = $settings->prefixFor($this->getEntityTypeId()).$traits['ACCOUNT_NUMBER']; break; case 'ID_1C': $value = ($traits[$k]<>'' ? $traits[$k]:''); break; case 'DATE': $value = $traits['DATE_INSERT']; break; case 'OPERATION': $value = DocumentBase::resolveDocumentTypeName($this->getDocmentTypeId()); break; case 'ROLE': $value = DocumentBase::getLangByCodeField('SELLER'); break; case 'CURRENCY': $replaceCurrency = $settings->getReplaceCurrency(); $value = substr($replaceCurrency<>'' ? $replaceCurrency:$traits[$k], 0, 3); break; case 'CURRENCY_RATE': $value = self::CURRENCY_RATE_DEFAULT; break; case 'AMOUNT': $value = $traits['PRICE']; break; case 'VERSION': $value = $traits['VERSION']; break; case 'TIME': $value = $traits['DATE_INSERT']; break; case 'COMMENT': $value = $traits['COMMENTS']; break; case 'DISCOUNTS': $value = $this->externalizeDiscounts($traits, $v); break; case 'TAXES': if(count($taxes)>0) $value = $this->externalizeTaxes($taxes, $v); break; case 'STORIES': if(count($stories)>0) $value = $this->externalizeStories(current($stories), $v); break; case 'ITEMS': $value = $this->externalizeItems($items, $v); break; case 'REK_VALUES': $value=array(); foreach($v['FIELDS'] as $name=>$fieldInfo) { $valueRV=''; switch($name) { case 'DATE_PAID': $valueRV = $traits['DATE_PAYED']; break; case 'PAY_NUMBER': $valueRV = $traits['PAY_VOUCHER_NUM']; break; case 'DATE_ALLOW_DELIVERY_LAST': $valueRV = $traits['DATE_ALLOW_DELIVERY']; break; case 'DELIVERY_SERVICE': case 'DELIVERY_ID': case 'PAY_SYSTEM': case 'PAY_SYSTEM_ID': case 'USER_DESCRIPTION': $valueRV = $traits[$name]; break; case 'ALLOW_DELIVERY': //?????? break; case 'ORDER_PAID': $valueRV = $traits['PAYED']; break; case 'CANCEL': $valueRV = $traits['CANCELED']; break; case 'FINAL_STATUS': $valueRV = ($traits['STATUS_ID']=='F'? 'Y':'N'); break; case 'ORDER_STATUS': $valueRV = "[".$traits['STATUS_ID']."] ".static::getStatusNameById($traits['STATUS_ID']); break; case 'ORDER_STATUS_ID': $valueRV = $traits['STATUS_ID']; break; case 'DATE_CANCEL': $valueRV = $traits['DATE_CANCELED']; break; case 'CANCEL_REASON': $valueRV = $traits['REASON_CANCELED']; break; case 'DATE_STATUS': $valueRV = $traits['DATE_STATUS']; break; case 'SITE_NAME': $valueRV = '['.$traits['LID'].'] '.static::getSiteNameByLid($traits['LID']); break; case 'REKV': $value = array_merge($value, $this->externalizeRekv($businessValue[$name], $fieldInfo)); break; } if(!in_array($name, array('REKV'))) { $value[] = $this->externalizeRekvValue($name, $valueRV, $fieldInfo); } } break; } if(!in_array($k, array('DISCOUNTS', 'TAXES', 'STORES', 'ITEMS', 'REK_VALUES'))) { $this->externalizeField($value, $v); } $result[$k] = $value; } $result = $this->modifyTrim($result); return $result; } /** * @param $items * @param $info * @param array $params * @return array */ public function externalizeItems(array $items, array $info) { $result = array(); foreach ($items as $rowId=>$item) { foreach($info['FIELDS'] as $name=>$fieldInfo) { $value=''; switch ($name) { case 'ID': $value = static::normalizeExternalCode($item['PRODUCT_XML_ID']); break; case 'CATALOG_ID': $value = $item['CATALOG_XML_ID']; break; case 'NAME': $value = $item['NAME']; break; case 'PRICE_PER_UNIT': $value = $item['PRICE']; break; case 'QUANTITY': $value = $item['QUANTITY']; break; case 'SUMM': $value = $item['PRICE']*$item['QUANTITY']; break; case 'KOEF': $value = self::KOEF_DEFAULT; break; case 'ITEM_UNIT': $code = (intval($item['MEASURE_CODE'])>0 ? $item['MEASURE_CODE']:self::MEASURE_CODE_DEFAULT); foreach($fieldInfo['FIELDS'] as $unitFieldName=>$unitFieldInfo) { $unitValue = ''; switch ($unitFieldName) { case 'ITEM_UNIT_CODE': $unitValue = $code; break; case 'ITEM_UNIT_NAME': $unitValue = static::getCatalogMeasureByCode($code); break; } $this->externalizeField($unitValue, $unitFieldInfo); $value[$unitFieldName] = $unitValue; } break; case 'DISCOUNTS': $summ = doubleval($item['DISCOUNT_PRICE']); if($summ > 0) { foreach($fieldInfo['FIELDS'] as $discountFieldName=>$discountFieldInfo) { $discountValue = ''; switch ($discountFieldName) { case 'NAME': $discountValue = DocumentBase::getLangByCodeField('ITEM_DISCOUNT'); break; case 'SUMM': $discountValue = $item['DISCOUNT_PRICE']; break; case 'IN_PRICE': $discountValue = 'Y'; break; } $this->externalizeField($discountValue, $discountFieldInfo); $value[$discountFieldName] = $discountValue; } } break; case 'REK_VALUES': foreach($fieldInfo['FIELDS'] as $rekFieldName=>$rekFieldInfo) { $propertyValue = ''; switch ($rekFieldName) { case 'TYPE_NOMENKLATURA': foreach ($rekFieldInfo['FIELDS'] as $nameProp=>$infoProp) { $valueProp=''; switch ($nameProp) { case 'NAME': $valueProp = DocumentBase::getLangByCodeField('TYPE_NOMENKLATURA'); break; case 'VALUE': $valueProp = DocumentBase::getLangByCodeField($item['PRODUCT_XML_ID']==ImportOneCBase::DELIVERY_SERVICE_XMLID ? ImportBase::ITEM_SERVICE:ImportBase::ITEM_ITEM); break; } $this->externalizeField($valueProp, $infoProp); $propertyValue[$nameProp] = $valueProp; } $value[] = $propertyValue; break; case 'TYPE_OF_NOMENKLATURA': foreach ($rekFieldInfo['FIELDS'] as $nameProp=>$infoProp) { $valueProp=''; switch ($nameProp) { case 'NAME': $valueProp = DocumentBase::getLangByCodeField('TYPE_OF_NOMENKLATURA'); break; case 'VALUE': $valueProp = DocumentBase::getLangByCodeField($item['PRODUCT_XML_ID']==ImportOneCBase::DELIVERY_SERVICE_XMLID ? ImportBase::ITEM_SERVICE:ImportBase::ITEM_ITEM); break; } $this->externalizeField($valueProp, $infoProp); $propertyValue[$nameProp] = $valueProp; } $value[] = $propertyValue; break; case 'BASKET_NUMBER': foreach ($rekFieldInfo['FIELDS'] as $nameProp=>$infoProp) { $valueProp=''; switch ($nameProp) { case 'NAME': $valueProp = DocumentBase::getLangByCodeField('BASKET_NUMBER'); break; case 'VALUE': $valueProp = \CSaleExport::getNumberBasketPosition($item['ID']); break; } $this->externalizeField($valueProp, $infoProp); $propertyValue[$nameProp] = $valueProp; } $value[] = $propertyValue; break; case 'PROPERTY_VALUE_BASKET': $attributes = isset($item['ATTRIBUTES'])? $item['ATTRIBUTES']:array(); if(count($attributes)>0) { foreach ($attributes as $rowIdAttr=>$attribute) { foreach ($rekFieldInfo['FIELDS'] as $nameProp=>$infoProp) { $valueProp=''; switch ($nameProp) { case 'NAME': $valueProp = DocumentBase::getLangByCodeField('PROPERTY_VALUE_BASKET').'#'.($attribute['CODE']<>'' ? $attribute['CODE']:$attribute['NAME']); break; case 'VALUE': $valueProp = $attribute['VALUE']; break; } $this->externalizeField($valueProp, $infoProp); $value[$rowIdAttr][$nameProp] = $valueProp; } } } break; } } break; case 'TAX_RATES': $rate = doubleval($item['VAT_RATE']); if($rate > 0) { foreach($fieldInfo['FIELDS'] as $rateFieldName=>$rateFieldInfo) { $rateValue = ''; switch ($rateFieldName) { case 'NAME': $rateValue = DocumentBase::getLangByCodeField('VAT'); break; case 'RATE': $rateValue = $item['VAT_RATE']*100; break; } $this->externalizeField($rekValue, $rateFieldInfo); $value[$rateFieldName] = $rateValue; } } break; case 'TAXES': $rate = doubleval($item['VAT_RATE']); if($rate > 0) { foreach($fieldInfo['FIELDS'] as $taxFieldName=>$taxFieldInfo) { $taxValue = ''; switch ($taxFieldName) { case 'NAME': $taxValue = DocumentBase::getLangByCodeField('VAT'); break; case 'TAX_VALUE': $taxValue = (($item["PRICE"] / ($item["VAT_RATE"]+1)) * $item["VAT_RATE"]); break; case 'IN_PRICE': $taxValue = 'Y'; break; } $this->externalizeField($taxValue, $taxFieldInfo); $value[$taxFieldName] = $taxValue; } } break; } if(!is_array($value)) $this->externalizeField($value, $fieldInfo); $result[$rowId][$name] = $value; } } return $result; } /** * @param $stories * @param $info * @param array $params * @return array */ public function externalizeStories(array $stories, array $info) { $result = array(); $converterProfile = new ConverterDocumentProfile(); foreach ($stories as $store) { $store = static::getStoreById($store['ID']); $resultStores=array(); foreach($info['FIELDS'] as $name=>$fieldInfo) { $value=''; switch ($name) { case 'ID': $value = $store['XML_ID']; break; case 'NAME': $value = $store['TITLE']; break; case 'ADDRESS': if(isset($store['ADDRESS'])) $value = $converterProfile->externalizeArrayFields(array('STREET'=>$store['ADDRESS']), $fieldInfo); break; case 'CONTACTS': if(isset($store['PHONE'])) $value = $converterProfile->externalizeArrayFields(array('WORK_PHONE_NEW'=>$store['PHONE']), $fieldInfo); break; } if(!is_array($value)) $this->externalizeField($value, $fieldInfo); $resultStores[$name] = $value; } $result[] = $resultStores; } return $result; } /** * @param $taxes * @param array $info * @return array */ public function externalizeTaxes(array $taxes, array $info) { $result = array(); foreach ($taxes as $rowId=>$tax) { foreach($info['FIELDS'] as $name=>$fieldInfo) { $value=''; switch($name) { case 'NAME': $value = $tax['TAX_NAME']; break; case 'IN_PRICE': $value = $tax['IS_IN_PRICE']; break; case 'SUMM': $value = $tax['VALUE_MONEY']; break; } $this->externalizeField($value, $fieldInfo); $result[$rowId][$name] = $value; } } return $result; } /** * @param array $discounts * @param array $info * @return array */ public function externalizeDiscounts(array $discount, array $info) { $result = array(); if(doubleval($discount['DISCOUNT_VALUE'])>0) { foreach($info['FIELDS'] as $name=>$fieldInfo) { $value=''; switch($name) { case 'NAME': $value = DocumentBase::getLangByCodeField('ORDER_DISCOUNT'); break; case 'IN_PRICE': $value = 'N'; break; case 'AMOUNT': $value = $discount['DISCOUNT_VALUE']; break; } $this->externalizeField($value, $fieldInfo); $result[$name] = $value; } } return $result; } /** * @param $code * @return mixed */ static private function getCatalogMeasureByCode($code) { static $measure; if($measure[$code] === null) { if(Loader::includeModule("catalog")) { $r = \CCatalogMeasure::getList( array(), array(), false, false, array( "CODE", "MEASURE_TITLE" ) ); while($res = $r->Fetch()) { $measure[$res["CODE"]] = $res["MEASURE_TITLE"]; } } if($measure === null) $measure[self::MEASURE_CODE_DEFAULT] = \CSaleExport::getTagName("SALE_EXPORT_SHTUKA"); } return $measure[$code]; } /** * @param $id * @return array */ static private function getStoreById($id) { static $stories; if($stories[$id] === null) { if(Loader::includeModule('catalog')) { $res = \CCatalogStore::GetList( array("SORT" => "DESC", "ID" => "ASC"), array("ACTIVE" => "Y", "ISSUING_CENTER" => "Y"), false, false, array("ID", "SORT", "TITLE", "ADDRESS", "DESCRIPTION", "PHONE", "EMAIL", "XML_ID") ); while ($store = $res->Fetch()) { if(strlen($store["XML_ID"]) <= 0) $store["XML_ID"] = $store["ID"]; $stories[$store["ID"]] = $store; } if(!is_array($stories)) { $stories = array(); } } } return (isset($stories[$id]) ? $stories[$id]:array()); } /** * @param $id * @return string */ static protected function getStatusNameById($id) { static $statuses; if($statuses === null) { $res = StatusLangTable::getList(array( 'select' => array('*'), 'filter' => array('=LID' => LANGUAGE_ID) )); while($status = $res->fetch()) { $statuses[$status['STATUS_ID']] = $status['NAME']; } if(!is_array($statuses)) { $statuses = array(); } } return (isset($statuses[$id])?$statuses[$id]:''); } }