%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/sale/handlers/paysystem/cashondeliverycalc/ |
| Current File : //home/bitrix/www/bitrix/modules/sale/handlers/paysystem/cashondeliverycalc/handler.php |
<?php
namespace Sale\Handlers\PaySystem;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\Request;
use Bitrix\Sale\PaySystem;
use Bitrix\Sale\Payment;
Loc::loadMessages(__FILE__);
/**
* Class CashOnDeliveryCalcHandler
*/
class CashOnDeliveryCalcHandler extends PaySystem\BaseServiceHandler implements PaySystem\IPayable
{
/**
* @param Payment $payment
* @param Request|null $request
* @return PaySystem\ServiceResult
*/
public function initiatePay(Payment $payment, Request $request = null)
{
return new PaySystem\ServiceResult();
}
/**
* @return array
*/
public function getCurrencyList()
{
return array('RUB');
}
/**
* @param Payment $payment
* @return float|int
*/
public function getPrice(Payment $payment)
{
$result = 0;
/** @var \Bitrix\Sale\PaymentCollection $collection */
$collection = $payment->getCollection();
/** @var \Bitrix\Sale\Order $order */
$order = $collection->getOrder();
/** @var \Bitrix\Sale\PropertyValueCollection $shipmentCollection */
$propertyCollection = $order->getPropertyCollection();
/** @var \Bitrix\Sale\PropertyValue $delivery */
$delivery = $propertyCollection->getDeliveryLocation();
if (!$delivery)
return $result;
$location = \CSaleLocation::GetByID($delivery->getValue());
$regId = $location["REGION_ID"];
$params = $this->service->getField('TARIF');
$tarifs = self::extractFromField($params);
$tarifs = isset($tarifs[$regId]) ? $tarifs[$regId] : $tarifs[0];
$fullPrice = $payment->getSum();
if ($fullPrice <= 1000)
$tariffNum = "0";
elseif ($fullPrice <= 5000)
$tariffNum = "1";
elseif ($fullPrice <= 20000)
$tariffNum = "2";
elseif ($fullPrice <= 500000)
$tariffNum = "3";
if (isset($tariffNum))
{
$percent = 0;
if ($tarifs["TARIFS"][$tariffNum]["UPPER_SUMM"] < $payment->getSum())
$percent = floatval($tarifs["TARIFS"][$tariffNum]["PERCENT"]) * floatval($payment->getSum()) / 100;
$result = floatval($tarifs["TARIFS"][$tariffNum]["FIX"]) + $percent;
}
return roundEx($result, SALE_VALUE_PRECISION);
}
/**
* @param $params
* @return array
*/
private static function extractFromField($params)
{
$result = array();
$tarifs = unserialize($params);
if (!is_array($tarifs))
$tarifs = array();
$arRegIds = array_keys($tarifs);
$regNames = @\CSaleLocation::GetRegionsNamesByIds($arRegIds);
$result[] = array(
'TARIFS' => self::getTariffArrayCSV($tarifs[0]),
'REG_NAME' => Loc::getMessage('SALE_HPS_CASH_ON_DELIVERY_TARIF_DEFAULT')
);
foreach ($regNames as $regId => $regName)
{
if (in_array($regId, $arRegIds))
{
$result[$regId]["TARIFS"] = self::getTariffArrayCSV($tarifs[$regId]);
$result[$regId]["REG_NAME"] = $regName;
}
}
return $result;
}
/**
* @param $tarifs
* @return array
*/
private static function getTariffArrayCSV($tarifs)
{
$result = array();
if(is_array($tarifs) && count($tarifs) == 12)
{
for($i = 0; $i < 4; $i++)
{
$result[] = array(
"FIX" => $tarifs[$i*3],
"PERCENT" => $tarifs[$i*3+1],
"UPPER_SUMM" => $tarifs[$i*3+2]
);
}
}
return $result;
}
/**
* @param int $paySystemId
* @return array|mixed
*/
public static function getValues($paySystemId = 0)
{
$result = array();
if($paySystemId > 0)
{
$data = PaySystem\Manager::getById($paySystemId);
$result = self::extractFromField($data['TARIF']);
}
if (!$result)
{
$result = \CSaleHelper::getOptionOrImportValues(
'ps_payment_forward_calc_tarifs',
array(get_called_class(), 'getAllCMTarifsFromCsv')
);
}
return $result;
}
/**
* @param $tariff
* @return string
*/
public function prepareToField($tariff)
{
$arResult = array();
if(is_array($tariff))
{
foreach ($tariff as $id => $value)
{
if($id == "REG_NEW")
{
if ((int)$value > 0)
{
for ($i = 0; $i < 12; ++$i)
$arResult[$value][] = 0;
}
continue;
}
$tariffIds = explode('_', $id);
if(isset($tariffIds[2]))
$regionId = $tariffIds[2];
$arResult[$regionId][] = $value;
}
}
return serialize($arResult);
}
/**
* @param int $paySystemId
* @return array
*/
public static function getStructure($paySystemId = 0)
{
$arResult = array();
$arCmTarifs = self::getValues($paySystemId);
foreach ($arCmTarifs as $regionId => $arRegInfo)
{
$arResult[$regionId.'REG_ID'] = array(
'TYPE' => 'TEXT_CENTERED',
'TITLE' => $arRegInfo["REG_NAME"],
'BLOCK_HIDEABLE' => 'Y',
'BLOCK_LENGTH' => 4,
);
if($regionId != 0)
$arResult[$regionId.'REG_ID']['BLOCK_DELETABLE'] = 'Y';
self::setTariffConfig('TARIF_1_'.$regionId, Loc::getMessage('SALE_HPS_CASH_ON_DELIVERY_LESS_1K'), $arRegInfo["TARIFS"][0], $arResult);
self::setTariffConfig('TARIF_2_'.$regionId, Loc::getMessage('SALE_HPS_CASH_ON_DELIVERY_LESS_5K'), $arRegInfo["TARIFS"][1], $arResult);
self::setTariffConfig('TARIF_3_'.$regionId, Loc::getMessage('SALE_HPS_CASH_ON_DELIVERY_LESS_20K'), $arRegInfo["TARIFS"][2], $arResult);
self::setTariffConfig('TARIF_4_'.$regionId, Loc::getMessage('SALE_HPS_CASH_ON_DELIVERY_LESS_500K'), $arRegInfo["TARIFS"][3], $arResult);
}
$arResult['REG_NEW'] = array(
'TYPE' => 'DROPDOWN',
'TITLE' => Loc::getMessage('SALE_HPS_CASH_ON_DELIVERY_ADD_REGION'),
'VALUES' => self::getRegionsList(),
'ONCHANGE' => "document.forms['pay_sys_form'].elements['apply'].click();"
);
return $arResult;
}
/**
* @param $tariffId
* @param $tariffTitle
* @param $arTarifs
* @param $arConfig
*/
private static function setTariffConfig($tariffId, $tariffTitle, $arTarifs, &$arConfig)
{
$arConfig[$tariffId.'_NAME'] = array('TYPE' => 'MULTI_CONTROL_STRING', 'MCS_ID' => $tariffId, 'TITLE' => $tariffTitle);
$arConfig[$tariffId.'_FIX'] = array('TYPE' => 'STRING', 'MCS_ID' => $tariffId, 'POST_TEXT' => Loc::getMessage('SALE_HPS_CASH_ON_DELIVERY_RUB'), 'SIZE' => 4, 'VALUE' => $arTarifs['FIX']);
$arConfig[$tariffId.'_PERCENT'] = array('TYPE' => 'STRING', 'MCS_ID' => $tariffId, 'PRE_TEXT' => ' + ', 'POST_TEXT' => ' % ', 'SIZE' => 3, 'VALUE' => $arTarifs['PERCENT']);
$arConfig[$tariffId.'_UPPER_SUMM'] = array('TYPE' => 'STRING', 'MCS_ID' => $tariffId, 'PRE_TEXT' => Loc::getMessage('SALE_HPS_CASH_ON_DELIVERY_SUMM_MORE'), 'POST_TEXT' => Loc::getMessage('SALE_HPS_CASH_ON_DELIVERY_RUB'), 'SIZE' => 7, 'VALUE' => $arTarifs['UPPER_SUMM']);
}
private static function getRegionsList()
{
$result = array(0 => Loc::getMessage('SALE_HPS_CASH_ON_DELIVERY_CHOOSE_REGION'));
/** @var \CDBResult $dbRes */
$dbRes = \CSaleLocation::GetRegionList();
while ($region = $dbRes->Fetch())
$result[$region["ID"]] = $region["NAME"];
return $result;
}
/**
* @param $regionNameLang
* @return array|bool
*/
public function getCMTarifsByRegionFromCsv($regionNameLang)
{
if(strlen(trim($regionNameLang)) <= 0)
return false;
$csvFile = \CSaleHelper::getCsvObject(__DIR__.'/lang/ru/cm_tarif.csv');
$COL_REG_NAME = 0;
$arTarifs = array();
while ($arRes = $csvFile->Fetch())
{
if(strtoupper(trim($regionNameLang)) === $arRes[$COL_REG_NAME])
{
$arTarifs = $arRes;
break;
}
}
$arTarifsResult = self::getTariffArrayCSV($arTarifs);
return $arTarifsResult;
}
/**
* @return array
*/
public static function getAllCMTarifsFromCsv()
{
$csvFile = \CSaleHelper::getCsvObject(__DIR__.'/lang/ru/cm_tarif.csv');
$tarifs = array();
$regNames = array();
$result = array();
while ($arRes = $csvFile->Fetch())
{
$arRegName = array_shift($arRes);
$tarifs[$arRegName] = $arRes;
if($arRegName != 'default')
$regNames[] = $arRegName;
}
if(isset($tarifs['default']))
{
$result[0] = array(
"TARIFS" => self::getTariffArrayCSV($tarifs['default']),
"REG_NAME" => Loc::getMessage('SALE_HPS_CASH_ON_DELIVERY_TARIF_DEFAULT')
);
}
$regInfo = \CSaleLocation::GetRegionsIdsByNames($regNames);
foreach ($regInfo as $regName => $regId)
{
$result[$regInfo[$regName]]["TARIFS"] = self::getTariffArrayCSV($tarifs[$regName]);
$result[$regInfo[$regName]]["REG_NAME"] = $regName;
}
return $result;
}
}