Esempio n. 1
0
 /**
  * @internal
  * @param $id
  *
  * @return Sale\Result
  * @throws Exception
  * @throws \Bitrix\Main\ArgumentNullException
  */
 protected static function generateAccountNumber($id)
 {
     $result = new Sale\Result();
     $id = intval($id);
     if ($id <= 0) {
         $result->addError(new Sale\ResultError(Loc::getMessage('SALE_ORDER_GENERATE_ACCOUNT_NUMBER_ORDER_NUMBER_WRONG_ID'), 'SALE_ORDER_GENERATE_ACCOUNT_NUMBER_ORDER_NUMBER_WRONG_ID'));
         return $result;
     }
     $type = \Bitrix\Main\Config\Option::get("sale", "account_number_template", "");
     $param = \Bitrix\Main\Config\Option::get("sale", "account_number_data", "");
     $isOrderConverted = \Bitrix\Main\Config\Option::get("main", "~sale_converted_15", 'N');
     $res = false;
     $value = null;
     if ($type != "") {
         for ($i = 0; $i < 10; $i++) {
             $value = CSaleOrder::GetNextAccountNumber($id, $type, $param);
             if ($value) {
                 if ($isOrderConverted == "Y") {
                     try {
                         /** @var \Bitrix\Sale\Result $r */
                         $r = \Bitrix\Sale\Internals\OrderTable::update($id, array("ACCOUNT_NUMBER" => $value));
                         $res = $r->isSuccess();
                     } catch (\Bitrix\Main\DB\SqlQueryException $exception) {
                         $res = false;
                     }
                 } else {
                     $res = CSaleOrder::Update($id, array("ACCOUNT_NUMBER" => $value), false);
                 }
                 if ($res) {
                     break;
                 }
             }
         }
     }
     if (!$res) {
         $result->addError(new Sale\ResultError(Loc::getMessage('SALE_ORDER_GENERATE_ACCOUNT_NUMBER_ORDER_NUMBER_IS_NOT_SET'), 'SALE_ORDER_GENERATE_ACCOUNT_NUMBER_ORDER_NUMBER_IS_NOT_SET'));
         return $result;
     }
     $result->setData(array('VALUE' => strval($value) != '' ? $value : null));
     return $result;
 }
Esempio n. 2
0
	/**
	* Sets order account number
	* Use OnBeforeOrderAccountNumberSet event to generate custom account number.
	* Account number value must be unique! By default order ID is used if generated value is incorrect
	*
	* @param int $ID - order ID
	* @return bool - true if account number is set successfully
	*/
	public static function SetAccountNumber($ID)
	{
		$ID = intval($ID);
		if ($ID <= 0)
			return false;

		$type = COption::GetOptionString("sale", "account_number_template", "");
		$param = COption::GetOptionString("sale", "account_number_data", "");

		$bCustomAlgorithm = false;
		foreach(GetModuleEvents("sale", "OnBeforeOrderAccountNumberSet", true) as $arEvent)
		{
			$tmpRes = ExecuteModuleEventEx($arEvent, Array($ID, $type));
			if ($tmpRes !== false)
			{
				$bCustomAlgorithm = true;
				$value = $tmpRes;
			}
		}

		if ($bCustomAlgorithm)
		{
			$res = CSaleOrder::Update($ID, array("ACCOUNT_NUMBER" => $value), false);
		}
		else
		{
			$res = false;
			if ($type != "") // if special template is selected
			{
				for ($i = 0; $i < 10; $i++)
				{
					$value = CSaleOrder::GetNextAccountNumber($ID, $type, $param);

					if ($value)
					{
						$res = CSaleOrder::Update($ID, array("ACCOUNT_NUMBER" => $value), false);

						if ($res)
							break;
					}
				}
			}
		}

		if ($type == "" || !$res) // if no special template is used or error occured
		{
			$res = CSaleOrder::Update($ID, array("ACCOUNT_NUMBER" => $ID), false);
		}

		return $res;
	}