/** * Modify payment collection. * * @param string $action Action. * @param Payment $payment Payment. * @param null|string $name Field name. * @param null|string|int|float $oldValue Old value. * @param null|string|int|float $value New value. * @return Result * @throws Main\ArgumentOutOfRangeException * @throws Main\NotImplementedException * @throws Main\ObjectNotFoundException */ public function onPaymentCollectionModify($action, Payment $payment, $name = null, $oldValue = null, $value = null) { $result = new Result(); if ($action == EventActions::DELETE) { if ($this->getField('PAY_SYSTEM_ID') == $payment->getPaymentSystemId()) { /** @var PaymentCollection $paymentCollection */ if (!($paymentCollection = $payment->getCollection())) { throw new Main\ObjectNotFoundException('Entity "PaymentCollection" not found'); } /** @var Payment $entityPayment */ foreach ($paymentCollection as $entityPayment) { if (intval($entityPayment->getField('PAY_SYSTEM_ID')) > 0 && intval($entityPayment->getField('PAY_SYSTEM_ID')) != $payment->getPaymentSystemId()) { $this->setFieldNoDemand('PAY_SYSTEM_ID', $entityPayment->getField('PAY_SYSTEM_ID')); break; } } } } if ($action != EventActions::UPDATE) { return $result; } if ($name == "CURRENCY" && $value != $this->getField("CURRENCY")) { throw new Main\NotImplementedException(); } if ($name == "SUM" || $name == "PAID") { if ($this->isCanceled()) { $result->addError(new ResultError(Loc::getMessage('SALE_ORDER_PAID_ORDER_CANCELED'), 'SALE_ORDER_PAID_ORDER_CANCELED')); return $result; } if ($name == "SUM" && !$payment->isPaid()) { if ($value == 0 && $payment->isInner()) { $payment->delete(); } return $result; } $r = $this->syncOrderAndPayments($payment); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } elseif ($name == "IS_RETURN") { if ($this->isCanceled()) { $result->addError(new ResultError(Loc::getMessage('SALE_ORDER_RETURN_ORDER_CANCELED'), 'SALE_ORDER_RETURN_ORDER_CANCELED')); return $result; } if ($value != Payment::RETURN_NONE) { if (!$payment->isPaid()) { $result->addError(new ResultError(Loc::getMessage('SALE_ORDER_PAYMENT_RETURN_NOT_PAID'), 'SALE_ORDER_PAYMENT_RETURN_NOT_PAID')); return $result; } $oldPaid = $this->isPaid() ? "Y" : "N"; /** @var PaymentCollection $paymentCollection */ if (!($paymentCollection = $this->getPaymentCollection())) { throw new Main\ObjectNotFoundException('Entity "PaymentCollection" not found'); } $creditSum = 0; $overPaid = $paymentCollection->getPaidSum() - $this->getPrice(); if ($overPaid <= 0) { $creditSum = $payment->getSum(); $overPaid = 0; } elseif ($payment->getSum() - $overPaid > 0) { $creditSum = $payment->getSum() - $overPaid; } if ($value == Payment::RETURN_PS) { $psId = $payment->getPaymentSystemId(); } elseif ($value == Payment::RETURN_INNER) { $psId = Manager::getInnerPaySystemId(); } else { $result->addError(new Entity\EntityError('unsupported operation')); return $result; } $service = Manager::getObjectById($psId); if ($service && $service->isRefundable()) { if ($creditSum) { if ($value == Payment::RETURN_PS) { if ($overPaid > 0) { $userBudget = Internals\UserBudgetPool::getUserBudgetByOrder($this); if (PriceMaths::roundByFormatCurrency($overPaid, $this->getCurrency()) > PriceMaths::roundByFormatCurrency($userBudget, $this->getCurrency())) { $result->addError(new Entity\EntityError(Loc::getMessage('SALE_ORDER_PAYMENT_RETURN_PAID'))); return $result; } } } $refResult = $service->refund($payment); if ($refResult->isSuccess()) { if ($overPaid > 0) { Internals\UserBudgetPool::addPoolItem($this, -$overPaid, Internals\UserBudgetPool::BUDGET_TYPE_ORDER_PAY, $payment); } } else { $result->addErrors($refResult->getErrors()); return $result; } } } else { $result->addError(new Entity\EntityError(Loc::getMessage('SALE_ORDER_PAYMENT_RETURN_NO_SUPPORTED'))); return $result; } $payment->setFieldNoDemand('PAID', 'N'); $finalSumPaid = $this->getSumPaid() - $creditSum; if ($finalSumPaid != $this->getSumPaid()) { $this->setFieldNoDemand('SUM_PAID', $finalSumPaid); $this->setFieldNoDemand('PAYED', $this->getPrice() <= $finalSumPaid ? "Y" : "N"); } /** @var Result $r */ $r = $this->onAfterSyncPaid($oldPaid); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } else { if ($payment->isPaid()) { $result->addError(new ResultError(Loc::getMessage('SALE_ORDER_PAYMENT_RETURN_PAID'), 'SALE_ORDER_PAYMENT_RETURN_PAID')); return $result; } $userBudget = Internals\UserBudgetPool::getUserBudgetByOrder($this); if (PriceMaths::roundByFormatCurrency($userBudget, $this->getCurrency()) < PriceMaths::roundByFormatCurrency($payment->getSum(), $this->getCurrency())) { $result->addError(new ResultError(Loc::getMessage('SALE_ORDER_PAYMENT_NOT_ENOUGH_USER_BUDGET'), "SALE_ORDER_PAYMENT_NOT_ENOUGH_USER_BUDGET")); return $result; } Internals\UserBudgetPool::addPoolItem($this, $payment->getSum() * -1, Internals\UserBudgetPool::BUDGET_TYPE_ORDER_PAY, $payment); $r = $payment->setField('PAID', "Y"); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); return $result; } } } elseif ($name == "PAY_SYSTEM_ID") { if ($payment->getField('PAY_SYSTEM_ID') != $this->getField('PAY_SYSTEM_ID')) { $this->setFieldNoDemand('PAY_SYSTEM_ID', $payment->getField('PAY_SYSTEM_ID')); } } elseif ($name == "DATE_PAID") { if ($payment->getField('DATE_PAID') != $this->getField('DATE_PAID')) { $this->setFieldNoDemand('DATE_PAYED', $payment->getField('DATE_PAID')); } } if ($value != $oldValue) { $fields = $this->fields->getChangedValues(); if (!array_key_exists("UPDATED_1C", $fields)) { parent::setField("UPDATED_1C", "N"); } } return $result; }
function InitParamArrays($arOrder, $orderID = 0, $psParams = "", $relatedData = array(), $payment = array()) { if (!is_array($relatedData)) { $relatedData = array(); } $GLOBALS["SALE_INPUT_PARAMS"] = array(); $GLOBALS["SALE_CORRESPONDENCE"] = array(); if (!is_array($arOrder) || count($arOrder) <= 0 || !array_key_exists("ID", $arOrder)) { $arOrder = array(); $orderID = IntVal($orderID); if ($orderID > 0) { $arOrderTmp = CSaleOrder::GetByID($orderID); } if (!empty($arOrderTmp)) { foreach ($arOrderTmp as $k => $v) { $arOrder["~" . $k] = $v; $arOrder[$k] = htmlspecialcharsbx($v); } } } else { if ($orderID == 0 && $arOrder['ID'] > 0) { $orderID = $arOrder['ID']; } } if (empty($payment) && $orderID > 0) { $payment = \Bitrix\Sale\Internals\PaymentTable::getRow(array('select' => array('*'), 'filter' => array('ORDER_ID' => $orderID, '!PAY_SYSTEM_ID' => \Bitrix\Sale\PaySystem\Manager::getInnerPaySystemId()))); } if (count($arOrder) > 0) { $GLOBALS["SALE_INPUT_PARAMS"]["ORDER"] = $arOrder; } if (!empty($payment)) { $GLOBALS["SALE_INPUT_PARAMS"]["ORDER"]["PAYMENT_ID"] = $payment['ID']; $GLOBALS["SALE_INPUT_PARAMS"]["ORDER"]["~PAYMENT_ID"] = $payment['ID']; $GLOBALS["SALE_INPUT_PARAMS"]["ORDER"]["SHOULD_PAY"] = $payment['SUM']; $GLOBALS["SALE_INPUT_PARAMS"]["ORDER"]["~SHOULD_PAY"] = $payment['SUM']; $GLOBALS["SALE_INPUT_PARAMS"]["ORDER"]["PAYED"] = $payment['PAID']; $GLOBALS["SALE_INPUT_PARAMS"]["ORDER"]["~PAYED"] = $payment['PAID']; $GLOBALS["SALE_INPUT_PARAMS"]["ORDER"]["PAY_SYSTEM_ID"] = $payment['PAY_SYSTEM_ID']; $GLOBALS["SALE_INPUT_PARAMS"]["ORDER"]["~PAY_SYSTEM_ID"] = $payment['PAY_SYSTEM_ID']; $GLOBALS["SALE_INPUT_PARAMS"]["ORDER"]["ORDER_PAYMENT_ID"] = $payment['ID']; $GLOBALS["SALE_INPUT_PARAMS"]["ORDER"]["~ORDER_PAYMENT_ID"] = $payment['ID']; $GLOBALS["SALE_INPUT_PARAMS"]["PAYMENT"] = $payment; } else { $GLOBALS["SALE_INPUT_PARAMS"]["ORDER"]["SHOULD_PAY"] = DoubleVal($GLOBALS["SALE_INPUT_PARAMS"]["ORDER"]["PRICE"]) - DoubleVal($GLOBALS["SALE_INPUT_PARAMS"]["ORDER"]["SUM_PAID"]); } $arDateInsert = explode(" ", $GLOBALS["SALE_INPUT_PARAMS"]["ORDER"]["DATE_INSERT"]); if (is_array($arDateInsert) && count($arDateInsert) > 0) { $GLOBALS["SALE_INPUT_PARAMS"]["ORDER"]["DATE_INSERT_DATE"] = $arDateInsert[0]; } else { $GLOBALS["SALE_INPUT_PARAMS"]["ORDER"]["DATE_INSERT_DATE"] = $GLOBALS["SALE_INPUT_PARAMS"]["ORDER"]["DATE_INSERT"]; } if (!empty($payment)) { $GLOBALS["SALE_INPUT_PARAMS"]["ORDER"]["DATE_BILL_DATE"] = ConvertTimeStamp(MakeTimeStamp($payment["DATE_BILL"]), 'SHORT'); } $userID = IntVal($GLOBALS["SALE_INPUT_PARAMS"]["ORDER"]["USER_ID"]); if ($userID > 0) { $dbUser = CUser::GetByID($userID); if ($arUser = $dbUser->GetNext()) { $GLOBALS["SALE_INPUT_PARAMS"]["USER"] = $arUser; } } $arCurOrderProps = array(); if (isset($relatedData["PROPERTIES"]) && is_array($relatedData["PROPERTIES"])) { $properties = $relatedData["PROPERTIES"]; foreach ($properties as $key => $value) { $arCurOrderProps["~" . $key] = $value; $arCurOrderProps[$key] = htmlspecialcharsEx($value); } } else { $dbOrderPropVals = CSaleOrderPropsValue::GetList(array(), array("ORDER_ID" => $GLOBALS["SALE_INPUT_PARAMS"]["ORDER"]["ID"]), false, false, array("ID", "CODE", "VALUE", "ORDER_PROPS_ID", "PROP_TYPE")); while ($arOrderPropVals = $dbOrderPropVals->Fetch()) { $arCurOrderPropsTmp = CSaleOrderProps::GetRealValue($arOrderPropVals["ORDER_PROPS_ID"], $arOrderPropVals["CODE"], $arOrderPropVals["PROP_TYPE"], $arOrderPropVals["VALUE"], LANGUAGE_ID); foreach ($arCurOrderPropsTmp as $key => $value) { $arCurOrderProps["~" . $key] = $value; $arCurOrderProps[$key] = htmlspecialcharsEx($value); } } } if (count($arCurOrderProps) > 0) { $GLOBALS["SALE_INPUT_PARAMS"]["PROPERTY"] = $arCurOrderProps; } $shipment = \Bitrix\Sale\Internals\ShipmentTable::getRow(array('select' => array('DELIVERY_ID'), 'filter' => array('ORDER_ID' => $orderID, 'SYSTEM' => 'N'))); if ($shipment) { $GLOBALS["SALE_INPUT_PARAMS"]["ORDER"]["DELIVERY_ID"] = $shipment['DELIVERY_ID']; $GLOBALS["SALE_INPUT_PARAMS"]["ORDER"]["~DELIVERY_ID"] = $shipment['DELIVERY_ID']; } $paySystemId = ''; if ($payment && $payment['PAY_SYSTEM_ID'] > 0) { $paySystemId = $payment['PAY_SYSTEM_ID']; } elseif (isset($arOrder['PAY_SYSTEM_ID']) && $arOrder['PAY_SYSTEM_ID'] > 0) { $paySystemId = $arOrder['PAY_SYSTEM_ID']; } else { $psParams = unserialize($psParams); if (isset($psParams['BX_PAY_SYSTEM_ID'])) { $paySystemId = $psParams['BX_PAY_SYSTEM_ID']['VALUE']; } } if ($paySystemId !== '') { if (!isset($arOrder['PERSON_TYPE_ID']) || $arOrder['PERSON_TYPE_ID'] <= 0) { // for crm quote compatibility $personTypes = CSalePaySystem::getPaySystemPersonTypeIds($paySystemId); $personTypeId = array_shift($personTypes); } else { $personTypeId = $arOrder['PERSON_TYPE_ID']; } $params = CSalePaySystemAction::getParamsByConsumer('PAYSYSTEM_' . $paySystemId, $personTypeId); foreach ($params as $key => $value) { $params[$key]['~VALUE'] = htmlspecialcharsbx($value['VALUE']); } $GLOBALS["SALE_CORRESPONDENCE"] = $params; } if ($payment['COMPANY_ID'] > 0) { if (!array_key_exists('COMPANY', $GLOBALS["SALE_INPUT_PARAMS"])) { $GLOBALS["SALE_INPUT_PARAMS"]["COMPANY"] = array(); } global $USER_FIELD_MANAGER; $userFieldsList = $USER_FIELD_MANAGER->GetUserFields(\Bitrix\Sale\Internals\CompanyTable::getUfId(), null, LANGUAGE_ID); foreach ($userFieldsList as $key => $userField) { $value = $USER_FIELD_MANAGER->GetUserFieldValue(\Bitrix\Sale\Internals\CompanyTable::getUfId(), $key, $payment['COMPANY_ID']); $GLOBALS["SALE_INPUT_PARAMS"]["COMPANY"][$key] = $value; $GLOBALS["SALE_INPUT_PARAMS"]["COMPANY"]["~" . $key] = $value; } $companyFieldList = \Bitrix\Sale\Internals\CompanyTable::getRowById($payment['COMPANY_ID']); foreach ($companyFieldList as $key => $value) { $GLOBALS["SALE_INPUT_PARAMS"]["COMPANY"][$key] = $value; $GLOBALS["SALE_INPUT_PARAMS"]["COMPANY"]["~" . $key] = $value; } } // fields with no interface $GLOBALS["SALE_CORRESPONDENCE"]['PAYER_STREET']["TYPE"] = 'PROPERTY'; $GLOBALS["SALE_CORRESPONDENCE"]['PAYER_STREET']["VALUE"] = 'LOCATION_STREET'; $GLOBALS["SALE_CORRESPONDENCE"]['PAYER_STREET']["~VALUE"] = 'LOCATION_STREET'; $GLOBALS["SALE_CORRESPONDENCE"]['PAYER_VILLAGE']["TYPE"] = 'PROPERTY'; $GLOBALS["SALE_CORRESPONDENCE"]['PAYER_VILLAGE']["VALUE"] = 'LOCATION_VILLAGE'; $GLOBALS["SALE_CORRESPONDENCE"]['PAYER_VILLAGE']["~VALUE"] = 'LOCATION_VILLAGE'; $GLOBALS["SALE_CORRESPONDENCE"]['ORDER_PAYMENT_ID']["TYPE"] = 'ORDER'; $GLOBALS["SALE_CORRESPONDENCE"]['ORDER_PAYMENT_ID']["VALUE"] = 'PAYMENT_ID'; $GLOBALS["SALE_CORRESPONDENCE"]['ORDER_PAYMENT_ID']["~VALUE"] = 'PAYMENT_ID'; $GLOBALS["SALE_CORRESPONDENCE"]['PAYED']["TYPE"] = 'ORDER'; $GLOBALS["SALE_CORRESPONDENCE"]['PAYED']["VALUE"] = 'PAYED'; $GLOBALS["SALE_CORRESPONDENCE"]['PAYED']["~VALUE"] = 'PAYED'; if (isset($relatedData["BASKET_ITEMS"]) && is_array($relatedData["BASKET_ITEMS"])) { $GLOBALS["SALE_INPUT_PARAMS"]["BASKET_ITEMS"] = $relatedData["BASKET_ITEMS"]; } if (isset($relatedData["TAX_LIST"]) && is_array($relatedData["TAX_LIST"])) { $GLOBALS["SALE_INPUT_PARAMS"]["TAX_LIST"] = $relatedData["TAX_LIST"]; } if (isset($relatedData["REQUISITE"]) && is_array($relatedData["REQUISITE"])) { $GLOBALS["SALE_INPUT_PARAMS"]["REQUISITE"] = $relatedData["REQUISITE"]; self::$relatedData['REQUISITE'] = array('GET_INSTANCE_VALUE' => function ($providerInstance, $providerValue, $personTypeId) { return $GLOBALS['SALE_INPUT_PARAMS']['REQUISITE'][$providerValue]; }); } if (isset($relatedData["BANK_DETAIL"]) && is_array($relatedData["BANK_DETAIL"])) { $GLOBALS["SALE_INPUT_PARAMS"]["BANK_DETAIL"] = $relatedData["BANK_DETAIL"]; self::$relatedData['BANK_DETAIL'] = array('GET_INSTANCE_VALUE' => function ($providerInstance, $providerValue, $personTypeId) { return $GLOBALS['SALE_INPUT_PARAMS']['BANK_DETAIL'][$providerValue]; }); } if (isset($relatedData["CRM_COMPANY"]) && is_array($relatedData["CRM_COMPANY"])) { $GLOBALS["SALE_INPUT_PARAMS"]["CRM_COMPANY"] = $relatedData["CRM_COMPANY"]; self::$relatedData['CRM_COMPANY'] = array('GET_INSTANCE_VALUE' => function ($providerInstance, $providerValue, $personTypeId) { return $GLOBALS['SALE_INPUT_PARAMS']['CRM_COMPANY'][$providerValue]; }); } if (isset($relatedData["CRM_CONTACT"]) && is_array($relatedData["CRM_CONTACT"])) { $GLOBALS["SALE_INPUT_PARAMS"]["CRM_CONTACT"] = $relatedData["CRM_CONTACT"]; self::$relatedData['CRM_CONTACT'] = array('GET_INSTANCE_VALUE' => function ($providerInstance, $providerValue, $personTypeId) { return $GLOBALS['SALE_INPUT_PARAMS']['CRM_CONTACT'][$providerValue]; }); } if (isset($relatedData["MC_REQUISITE"]) && is_array($relatedData["MC_REQUISITE"])) { $GLOBALS["SALE_INPUT_PARAMS"]["MC_REQUISITE"] = $relatedData["MC_REQUISITE"]; self::$relatedData['MC_REQUISITE'] = array('GET_INSTANCE_VALUE' => function ($providerInstance, $providerValue, $personTypeId) { return $GLOBALS['SALE_INPUT_PARAMS']['MC_REQUISITE'][$providerValue]; }); } if (isset($relatedData["MC_BANK_DETAIL"]) && is_array($relatedData["MC_BANK_DETAIL"])) { $GLOBALS["SALE_INPUT_PARAMS"]["MC_BANK_DETAIL"] = $relatedData["MC_BANK_DETAIL"]; self::$relatedData['MC_BANK_DETAIL'] = array('GET_INSTANCE_VALUE' => function ($providerInstance, $providerValue, $personTypeId) { return $GLOBALS['SALE_INPUT_PARAMS']['MC_BANK_DETAIL'][$providerValue]; }); } if (isset($relatedData["CRM_MYCOMPANY"]) && is_array($relatedData["CRM_MYCOMPANY"])) { $GLOBALS["SALE_INPUT_PARAMS"]["CRM_MYCOMPANY"] = $relatedData["CRM_MYCOMPANY"]; self::$relatedData['CRM_MYCOMPANY'] = array('GET_INSTANCE_VALUE' => function ($providerInstance, $providerValue, $personTypeId) { return $GLOBALS['SALE_INPUT_PARAMS']['CRM_MYCOMPANY'][$providerValue]; }); } if ($relatedData) { $eventManager = \Bitrix\Main\EventManager::getInstance(); $eventManager->addEventHandler('sale', 'OnGetBusinessValueProviders', array('\\CSalePaySystemAction', 'getProviders')); } }
echo htmlspecialcharsbx($title); ?> </option> <?php } ?> </optgroup> <?php } ?> <optgroup label="<?php echo Loc::getMessage("SPS_ACT_SYSTEM"); ?> "> <?php $innerId = PaySystem\Manager::getInnerPaySystemId(); foreach ($handlerList['SYSTEM'] as $handler => $title) { ?> <?php if ($innerId > 0 && $handler == 'inner' && $handlerName != 'inner') { continue; } ?> <option value="<?php echo htmlspecialcharsbx($handler); ?> "<?php echo !$selected && ToLower($handlerName) == ToLower($handler) ? " selected" : ''; ?> > <?php
function getPayment($arOrder) { $result = array(); $PaymentParam['select'] = array("ID", "PAID", "DATE_BILL", "ORDER_ID", "CURRENCY", "SUM", "COMMENTS", "DATE_PAID", "PAY_SYSTEM_ID", "PAY_SYSTEM_NAME", "IS_RETURN", "PAY_RETURN_COMMENT", "PAY_VOUCHER_NUM", "PAY_VOUCHER_DATE"); $PaymentParam['filter']['ORDER_ID'] = $arOrder['ID']; $PaymentParam['filter']['!=EXTERNAL_PAYMENT'] = 'F'; $innerPS = 0; $limit = 0; $inc = 0; if (self::getVersionSchema() < self::PARTIAL_VERSION) { $innerPS = \Bitrix\Sale\PaySystem\Manager::getInnerPaySystemId(); $limit = 1; } $resPayment = \Bitrix\Sale\Internals\PaymentTable::getList($PaymentParam); while ($arPayment = $resPayment->fetch()) { foreach ($arPayment as $field => $value) { if (self::isFormattedDateFields('Payment', $field)) { $arPayment[$field] = self::getFormatDate($value); } } $result['paySystems'][$arPayment['PAY_SYSTEM_ID']] = $arPayment['PAY_SYSTEM_NAME']; if ($innerPS == 0 || $innerPS != $arPayment['PAY_SYSTEM_ID']) { if ($limit == 0 || $inc < $limit) { $result['payment'][] = $arPayment; } $inc++; } } return $result; }