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;
}
}