• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/recurring/entity/invoice.php
  • Класс: Bitrix\Crm\Recurring\Entity\Invoice
  • Вызов: Invoice::expose
public function expose(array $filter, $limit = null, $recalculate = true)
{
	$result = new Main\Result();

	$idInvoicesList = array();
	$recurringInvoiceMap = array();
	$linkEntityList = array();
	$newInvoiceIds = array();
	$emailList = array();
	$emailData = array();

	$getParams = [
		'filter' => $filter,
		'select' => ['ID', 'INVOICE_ID'],
		'runtime' => $this->getRuntimeTemplateField()
	];
	if ((int)$limit > 0)
	{
		$getParams['limit'] = (int)$limit;
	}

	$recurring = InvoiceRecurTable::getList($getParams);

	while ($recurData = $recurring->fetch())
	{
		$recurData['INVOICE_ID'] = (int)$recurData['INVOICE_ID'];
		$idInvoicesList[] = $recurData['INVOICE_ID'];
		$recurringInvoiceMap[$recurData['INVOICE_ID']] = $recurData['ID'];
	}

	if (empty($idInvoicesList))
	{
		return $result;
	}

	try
	{
		$linkData = EntityLink::getList(
			array(
				'filter' => array(
					'=ENTITY_TYPE_ID' => \CCrmOwnerType::Invoice,
					'=ENTITY_ID' => $idInvoicesList
				)
			)
		);

		while ($link = $linkData->fetch())
		{
			$linkEntityList[$link['ENTITY_ID']] = $link;
		}
		
		$idListChunks = array_chunk($idInvoicesList, 100);

		foreach ($idListChunks as $idList)
		{
			$products = array();
			$properties = array();

			$productRowData = \CCrmInvoice::GetProductRows($idList);

			foreach ($productRowData as $row)
			{
				if ($row['CUSTOM_PRICE'] === 'Y')
					$row['CUSTOMIZED'] = 'Y';

				$row['ID'] = 0;

				$products[$row['ORDER_ID']][] = $row;
			}

			$propertiesRowData = \CCrmInvoice::getPropertiesList($idList);

			foreach ($propertiesRowData as $invoiceId => $row)
			{
				$newInvoiceProperties = [];
				if(is_array($row))
				{
					foreach($row as $invoiceProperty)
					{
						$value = $invoiceProperty['VALUE'];
						$newInvoiceProperties[$value['ORDER_PROPS_ID']] = $value['VALUE'];
					}
					$properties[$invoiceId] = $newInvoiceProperties;
				}
			}

			unset($row);

			$invoicesData = \CCrmInvoice::GetList(
				array(),
				array(
					"=ID" => $idList,
					"CHECK_PERMISSIONS" => 'N'
				)
			);

			while ($invoice = $invoicesData->Fetch())
			{
				$invoice['PRODUCT_ROWS'] = $products[$invoice['ID']];
				$invoice['REQUISITES'] = $linkEntityList[$invoice['ID']];
				$invoice['INVOICE_PROPERTIES'] = $properties[$invoice['ID']];
				$recurringItem = Item\InvoiceExist::load($recurringInvoiceMap[$invoice['ID']]);
				if (!$recurringItem)
					continue;
				$recurringItem->setTemplateFields($invoice);
				$r = $recurringItem->expose($recalculate);
				if ($r->isSuccess())
				{
					$exposingData = $r->getData();
					$resultInvoiceId = $exposingData['NEW_INVOICE_ID'];
					$newInvoiceIds[] = $resultInvoiceId;
					if ($recurringItem->isSendingInvoice())
					{
						$preparedEmailData = $recurringItem->getPreparedEmailData();
						$emailList[] = $preparedEmailData['EMAIL_ID'];
						$emailData[$resultInvoiceId] = array(
							'EMAIL_ID' => (int)$preparedEmailData['EMAIL_ID'],
							'TEMPLATE_ID' => (int)$preparedEmailData['TEMPLATE_ID'] ? (int)$preparedEmailData['TEMPLATE_ID'] : null,
							'INVOICE_ID' => $resultInvoiceId
						);
					}
				}
				else
				{
					$result->addErrors($r->getErrors());
					if ($recalculate)
					{
						$recurringItem->deactivate();
						$recurringItem->save();
					}
				}
			}
		}

		unset($idListChunks, $idList);

		if (!empty($emailList))
		{
			$result = $this->sendByMail($emailList, $emailData);
		}
	}
	catch (Main\SystemException $exception)
	{
		$result->addError(new Main\Error($exception->getMessage(), $exception->getCode()));
	}

	if (!empty($newInvoiceIds))
	{
		$result->setData(array("ID" => $newInvoiceIds));
	}

	return $result;
}