- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/cashbox/prepaymentcheck.php
- Класс: BitrixSaleCashboxPrepaymentCheck
- Вызов: PrepaymentCheck::correlatePrices
private function correlatePrices($result)
{
$paymentSum = 0;
foreach ($result['PAYMENTS'] as $payment)
{
$paymentSum += $payment['SUM'];
}
/** @var Order $order */
$order = $result['ORDER'];
$rate = $paymentSum / $order->getPrice();
$countProductPositions = count($result['PRODUCTS']);
$countDeliveryPositions = $result['DELIVERY'] ? count($result['DELIVERY']) : 0;
if ($countDeliveryPositions === 0)
{
$totalSum = 0;
for ($i = 0; $i < $countProductPositions - 1; $i++)
{
$sum = PriceMaths::roundPrecision($result['PRODUCTS'][$i]['SUM'] * $rate);
$totalSum += $sum;
$result['PRODUCTS'][$i]['SUM'] = $sum;
$price = PriceMaths::roundPrecision($sum / $result['PRODUCTS'][$i]['QUANTITY']);
$result['PRODUCTS'][$i]['BASE_PRICE'] = $result['PRODUCTS'][$i]['PRICE'] = $price;
if (isset($result['PRODUCTS'][$i]['DISCOUNT']))
{
unset($result['PRODUCTS'][$i]['DISCOUNT']);
}
}
if (isset($result['PRODUCTS']))
{
$lastElement = $countProductPositions - 1;
$result['PRODUCTS'][$lastElement]['SUM'] = PriceMaths::roundPrecision($paymentSum - $totalSum);
$price = PriceMaths::roundPrecision($result['PRODUCTS'][$lastElement]['SUM'] / $result['PRODUCTS'][$lastElement]['QUANTITY']);
$result['PRODUCTS'][$lastElement]['BASE_PRICE'] = $result['PRODUCTS'][$lastElement]['PRICE'] = $price;
if (isset($result['PRODUCTS'][$lastElement]['DISCOUNT']))
{
unset($result['PRODUCTS'][$lastElement]['DISCOUNT']);
}
}
}
else
{
$totalSum = 0;
for ($i = 0; $i < $countProductPositions; $i++)
{
$sum = PriceMaths::roundPrecision($result['PRODUCTS'][$i]['SUM'] * $rate);
$totalSum += $sum;
$result['PRODUCTS'][$i]['SUM'] = $sum;
$price = PriceMaths::roundPrecision($sum / $result['PRODUCTS'][$i]['QUANTITY']);
$result['PRODUCTS'][$i]['BASE_PRICE'] = $result['PRODUCTS'][$i]['PRICE'] = $price;
if (isset($result['PRODUCTS'][$i]['DISCOUNT']))
{
unset($result['PRODUCTS'][$i]['DISCOUNT']);
}
}
if ($countDeliveryPositions === 1)
{
$result['DELIVERY'][0]['SUM'] = PriceMaths::roundPrecision($paymentSum - $totalSum);
$price = PriceMaths::roundPrecision($result['DELIVERY'][0]['SUM'] / $result['DELIVERY'][0]['QUANTITY']);
$result['DELIVERY'][0]['BASE_PRICE'] = $result['DELIVERY'][0]['PRICE'] = $price;
if (isset($result['DELIVERY'][0]['DISCOUNT']))
{
unset($result['DELIVERY'][0]['DISCOUNT']);
}
}
else
{
for ($i = 0; $i < $countDeliveryPositions - 1; $i++)
{
$sum = PriceMaths::roundPrecision($result['DELIVERY'][$i]['SUM'] * $rate);
$totalSum += $sum;
$result['DELIVERY'][$i]['SUM'] = $sum;
$price = PriceMaths::roundPrecision($sum / $result['DELIVERY'][$i]['QUANTITY']);
$result['DELIVERY'][$i]['BASE_PRICE'] = $result['DELIVERY'][$i]['PRICE'] = $price;
if (isset($result['DELIVERY'][$i]['DISCOUNT']))
{
unset($result['DELIVERY'][$i]['DISCOUNT']);
}
}
if (isset($result['DELIVERY']))
{
$lastElement = $countDeliveryPositions - 1;
$result['DELIVERY'][$lastElement]['SUM'] = PriceMaths::roundPrecision($paymentSum - $totalSum);
$price = PriceMaths::roundPrecision($result['DELIVERY'][$lastElement]['SUM'] / $result['DELIVERY'][$lastElement]['QUANTITY']);
$result['DELIVERY'][$lastElement]['BASE_PRICE'] = $result['DELIVERY'][$lastElement]['PRICE'] = $price;
if (isset($result['DELIVERY'][$lastElement]['DISCOUNT']))
{
unset($result['DELIVERY'][$lastElement]['DISCOUNT']);
}
}
}
}
return $result;
}