- Модуль: 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;
}