CCrmExternalSaleImport::SyncOrderData

  1. Bitrix24 API (v. 23.675.0)
  2. crm
  3. CCrmExternalSaleImport
  4. SyncOrderData
  • Модуль: 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;
	}
}

Добавить комментарий