...Человеческий поиск в разработке...
- Модуль: crm
- Путь к файлу: ~/bitrix/modules/crm/classes/general/crm_external_sale_import.php
- Класс: \CCrmExternalSaleImport
- Вызов: CCrmExternalSaleImport::SyncOrderData
public function SyncOrderData($bSkipBP = false, $bSkipNotify = false) { $this->ClearErrors(); $this->arImportResult = new CCrmExternalSaleImportResult(); self::AddTrace("START: {$this->externalSaleId}"); @set_time_limit(0); @ini_set("track_errors", "1"); @ignore_user_abort(true); if ($this->arExternalSale == null) $this->arExternalSale = CCrmExternalSale::GetDefaultSettings($this->externalSaleId); $importSize = intval($this->arExternalSale["SIZE"]); if ($importSize <= 0) $importSize = 100; $importPeriod = intval($this->arExternalSale["PERIOD"]); $modificationLabel = intval($this->arExternalSale["LABEL"]); $sessid = $this->GetServerSessionID(); $serverVersion = $this->GetServerVersion(); self::AddTrace("VERSION: {$serverVersion}"); if($sessid !== "" && $serverVersion >= 2.09) { //Stepwise $data = $this->arExternalSale["SYNC_DATA"]; if(!is_array($data) || empty($data)) { $data = array( "DEAL_CREATED" => 0, "DEAL_UPDATED" => 0, "CONTACT_CREATED" => 0, "CONTACT_UPDATED" => 0, "COMPANY_CREATED" => 0, "COMPANY_UPDATED" => 0, "TOTAL"=> 0 ); } $modificationLabelTmp = $modificationLabel; if ($modificationLabelTmp <= 0) { $modificationLabelTmp = time() - $importPeriod * 86400; } $request = array( "LID" => LANGUAGE_ID, "MODIFICATION_LABEL" => $modificationLabelTmp, "ZZZ" => date("Z"), "IMPORT_SIZE" => $importSize, "GZ_COMPRESSION_SUPPORTED" => function_exists("gzcompress") ? 1 : 0, "type" => "crm", "mode" => "query", "sessid" => $sessid ); self::AddTrace(array('QUERY_ORDER_DATA' => $request)); $orderData = $this->QueryOrderData($request, array("REQUEST_METHOD" => "GET")); if ($orderData == null) { self::AddTrace('FINISH: NO SOURCE DATA'); $this->AddError("SD2", "Communication error"); CCrmExternalSale::Update($this->externalSaleId, array("SYNC_DATA" => array())); return self::SyncStatusError; } $arErrors = array(); $arOrders = $this->ParseOrderData($orderData, $modificationLabelTmp, $arErrors); if(is_array($arOrders)) { self::AddTrace('DATA PARSING SUCCESSFUL'); } else { self::AddTrace('DATA PARSING FAILED'); } foreach ($arErrors as $error) { $this->AddError($error[0], $error[1]); } if (is_array($arOrders)) { if (count($arOrders) <= 0) { CCrmExternalSale::Update( $this->externalSaleId, array( "MODIFICATION_LABEL" => $modificationLabelTmp, "LAST_STATUS" => $data["TOTAL"] > 0 ? sprintf("Success: %d item(s)", $data["TOTAL"]) : "Success: 0 items", "~LAST_STATUS_DATE" => $GLOBALS["DB"]->CurrentTimeFunction(), "SYNC_DATA" => array() ) ); if (!$bSkipNotify) { $this->arImportResult->numberOfCreatedDeals = $data["DEAL_CREATED"]; $this->arImportResult->numberOfUpdatedDeals = $data["DEAL_UPDATED"]; $this->arImportResult->numberOfCreatedContacts = $data["CONTACT_CREATED"]; $this->arImportResult->numberOfUpdatedContacts = $data["CONTACT_UPDATED"]; $this->arImportResult->numberOfCreatedCompanies = $data["COMPANY_CREATED"]; $this->arImportResult->numberOfUpdatedCompanies = $data["COMPANY_UPDATED"]; if($this->arImportResult->numberOfCreatedDeals > 0 || $this->arImportResult->numberOfUpdatedDeals > 0 || $this->arImportResult->numberOfCreatedContacts > 0 || $this->arImportResult->numberOfUpdatedContacts > 0 || $this->arImportResult->numberOfCreatedCompanies > 0 || $this->arImportResult->numberOfUpdatedCompanies) { $this->Notify(); } // Reset totals for keep actual iteration totals $this->arImportResult->numberOfCreatedDeals = 0; $this->arImportResult->numberOfUpdatedDeals = 0; $this->arImportResult->numberOfCreatedContacts = 0; $this->arImportResult->numberOfUpdatedContacts = 0; $this->arImportResult->numberOfCreatedCompanies = 0; $this->arImportResult->numberOfUpdatedCompanies = 0; } self::AddTrace('FINISH: NO DATA TO SAVE'); return self::SyncStatusFinished; } foreach ($arOrders as $order) { $this->SaveOrderData($order, $bSkipBP); } if(empty($this->arError)) { $data["DEAL_CREATED"] += $this->arImportResult->numberOfCreatedDeals; $data["DEAL_UPDATED"] += $this->arImportResult->numberOfUpdatedDeals; $data["CONTACT_CREATED"] += $this->arImportResult->numberOfCreatedContacts; $data["CONTACT_UPDATED"] += $this->arImportResult->numberOfUpdatedContacts; $data["COMPANY_CREATED"] += $this->arImportResult->numberOfCreatedCompanies; $data["COMPANY_UPDATED"] += $this->arImportResult->numberOfUpdatedCompanies; $data["TOTAL"] += count($arOrders); $arFieldsTmp = array( "MODIFICATION_LABEL" => $modificationLabelTmp, "~LAST_STATUS_DATE" => $GLOBALS["DB"]->CurrentTimeFunction() ); if (count($arOrders) > 0) { $arFieldsTmp["LAST_STATUS"] = sprintf("Success: %d item(s)", count($arOrders)); } $arFieldsTmp["SYNC_DATA"] = $data; CCrmExternalSale::Update($this->externalSaleId, $arFieldsTmp); self::AddTrace('FINISH: CONTINUE'); if (!$bSkipNotify) { $this->Notify(); } return self::SyncStatusContinue; } } $ar = array(); foreach ($this->arError as $err) $ar[] = sprintf("[%s] %s", $err[0], $err[1]); $this->arExternalSale["ERRORS"] = $this->arExternalSale["ERRORS"] + 1; CCrmExternalSale::Update( $this->externalSaleId, array( "LAST_STATUS" => implode(" ", $ar), "IMPORT_ERRORS" => $this->arExternalSale["ERRORS"], "~LAST_STATUS_DATE" => $GLOBALS["DB"]->CurrentTimeFunction(), "SYNC_DATA" => array() ) ); self::AddTrace('FINISH: ERROR'); return self::SyncStatusError; } else { $modificationLabelTmp = $modificationLabel; if ($modificationLabelTmp <= 0 && $importPeriod > 0) { $modificationLabelTmp = time() - $importPeriod * 86400; } //Simple $request = array( "LID" => LANGUAGE_ID, "MODIFICATION_LABEL" => $modificationLabelTmp, "ZZZ" => date("Z"), "IMPORT_SIZE" => $importSize, "GZ_COMPRESSION_SUPPORTED" => function_exists("gzcompress") ? 1 : 0, "type" => "crm", "mode" => "query" ); if($sessid !== "") { $request["sessid"] = $sessid; } self::AddTrace(array('QUERY_ORDER_DATA' => $request)); $orderData = $this->QueryOrderData($request, array("REQUEST_METHOD" => "POST")); if ($orderData == null) { self::AddTrace('FINISH: NO SOURCE DATA'); $this->AddError("SD2", "Communication error"); return self::SyncStatusError; } $arErrors = array(); $arOrders = $this->ParseOrderData($orderData, $modificationLabel, $arErrors); if(is_array($arOrders)) { self::AddTrace('DATA PARSING SUCCESSFUL'); } else { self::AddTrace('DATA PARSING FAILED'); } foreach ($arErrors as $error) $this->AddError($error[0], $error[1]); if (is_array($arOrders)) { if (count($arOrders) <= 0) { $arFieldsTmp = array( "~LAST_STATUS_DATE" => $GLOBALS["DB"]->CurrentTimeFunction(), "LAST_STATUS" => "Success: 0 items", "SYNC_DATA" => array() ); if (empty($modificationLabel)) $arFieldsTmp["MODIFICATION_LABEL"] = time(); CCrmExternalSale::Update($this->externalSaleId, $arFieldsTmp); self::AddTrace('FINISH: NO DATA TO SAVE'); return self::SyncStatusFinished; } foreach ($arOrders as $order) $this->SaveOrderData($order, $bSkipBP); if(empty($this->arError)) { $arFieldsTmp = array("MODIFICATION_LABEL" => $modificationLabel, "~LAST_STATUS_DATE" => $GLOBALS["DB"]->CurrentTimeFunction()); if (count($arOrders) > 0) $arFieldsTmp["LAST_STATUS"] = sprintf("Success: %d item(s)", count($arOrders)); CCrmExternalSale::Update($this->externalSaleId, $arFieldsTmp); if (!$bSkipNotify) { $this->Notify(); } self::AddTrace('FINISH: CONTINUE'); return self::SyncStatusContinue; } } $ar = array(); foreach ($this->arError as $err) $ar[] = sprintf("[%s] %s", $err[0], $err[1]); $this->arExternalSale["ERRORS"] = $this->arExternalSale["ERRORS"] + 1; CCrmExternalSale::Update($this->externalSaleId, array("LAST_STATUS" => implode(" ", $ar), "IMPORT_ERRORS" => $this->arExternalSale["ERRORS"], "~LAST_STATUS_DATE" => $GLOBALS["DB"]->CurrentTimeFunction())); self::AddTrace('FINISH: ERROR'); return self::SyncStatusError; } }