Как расчитать цену по купону?
Нужен хелп, куда копать.
Есть на входе ID клиента, ID доставки, список товаров.
Нужно расчитать стоимость товаров со скидкой.
Я так понял что просто через CCatalogProduct::GetOptimalPrice не выйдет, хотя вроде работало.
CCatalogProduct::GetOptimalPrice($product['id'], $product['quantity'], 8, 'N', '', SITE_ID, $promocode); |
CCatalogProduct::GetOptimalPrice($product['id'], $product['quantity'], 8, 'N', '', SITE_ID, $promocode);
начинаю создвать корзину и наполнять товарами
$order = Order::create($siteId, $userID); $order->setPersonTypeId(4); //$order->setField('PRICE_DELIVERY', 770); $order->setField('CURRENCY', $currencyCode); // содаем корзину $basket = BitrixSaleBasket::create($siteId); foreach ($products as $k => $product) { $optimalPrice = CCatalogProduct::GetOptimalPrice($product['id'], $product['quantity'], 8, 'N', '', SITE_ID, $promocode); $item = $basket->createItem('catalog', $product['id']); $item->setFields([ 'QUANTITY' => $product['quantity'], 'CURRENCY' => BitrixCurrencyCurrencyManager::getBaseCurrency(), 'LID' => BitrixMainContext::getCurrent()->getSite(), 'PRICE' => $optimalPrice['PRICE']['PRICE'], // цена 'CUSTOM_PRICE' => 'Y', 'PRODUCT_PROVIDER_CLASS' => 'CCatalogProductProvider', ]); // получаем цены доступные для группы 8 $return_products[$k] = [ "name" => $product['name'], "id" => $product['id'], "privateId" => $product['privateId'], "price" => $optimalPrice['PRICE']['PRICE'], "quantity" => $product['quantity'], "discount" => 0, "subtotal" => $optimalPrice['PRICE']['PRICE'] * $product['quantity'] ]; } $order->setBasket($basket); // Создаём одну отгрузку и устанавливаем способ доставки $shipmentCollection = $order->getShipmentCollection(); $shipment = $shipmentCollection->createItem( BitrixSaleDeliveryServicesManager::getObjectById($deliveryID) ); $shipmentItemCollection = $shipment->getShipmentItemCollection(); // инициирую и добавляю промокод /* BitrixSaleDiscountCouponsManager::init(); BitrixSaleDiscountCouponsManager::add($promocode);*/ // наполняем корзину foreach ($order->getBasket() as $item) { $shipmentItem = $shipmentItemCollection->createItem($item); $shipmentItem->setQuantity($item->getQuantity()); } // Создаём оплату $paymentCollection = $order->getPaymentCollection(); $payment = $paymentCollection->createItem(); $paySystemService = PaySystemManager::getObjectById($paymentID); $payment->setFields(array( 'PAY_SYSTEM_ID' => $paySystemService->getField("PAY_SYSTEM_ID"), 'PAY_SYSTEM_NAME' => $paySystemService->getField("NAME"), )); // применяем купон // BitrixSaleDiscountCouponsManager::add('cupon'); // получаем объект скидок для корзины $oDiscounts = BitrixSaleDiscount::loadByBasket($basket); // обновляем поля в корзине $basket->refreshData(['PRICE','COUPONS']); // пересчёт скидок для корзины $oDiscounts->calculate(); // получаем результаты расчёта скидок для корзины $result = $oDiscounts->getApplyResult(); // хочу посмотреть товары со скидкой foreach ($basket as $basketItem) { echo $basketItem->getField('NAME') . ' - ' . $basketItem->getQuantity() . ' цена ' . $basketItem->getPrice() . " итого " . $basketItem->getFinalPrice() . ' <br />'; } /* BitrixSaleDiscountCouponsManager::init( BitrixSaleDiscountCouponsManager::MODE_ORDER, [ "userId" => $order->getUserId(), "orderId" => $order->getId() ] ); BitrixSaleDiscountCouponsManager::add('CUPON'); $discounts = $order->getDiscount(); $discounts->calculate();*/ $order->doFinalAction(true); |
$order = Order::create($siteId, $userID); $order->setPersonTypeId(4); //$order->setField('PRICE_DELIVERY', 770); $order->setField('CURRENCY', $currencyCode); // содаем корзину $basket = BitrixSaleBasket::create($siteId); foreach ($products as $k => $product) { $optimalPrice = CCatalogProduct::GetOptimalPrice($product['id'], $product['quantity'], 8, 'N', '', SITE_ID, $promocode); $item = $basket->createItem('catalog', $product['id']); $item->setFields([ 'QUANTITY' => $product['quantity'], 'CURRENCY' => BitrixCurrencyCurrencyManager::getBaseCurrency(), 'LID' => BitrixMainContext::getCurrent()->getSite(), 'PRICE' => $optimalPrice['PRICE']['PRICE'], // цена 'CUSTOM_PRICE' => 'Y', 'PRODUCT_PROVIDER_CLASS' => 'CCatalogProductProvider', ]); // получаем цены доступные для группы 8 $return_products[$k] = [ "name" => $product['name'], "id" => $product['id'], "privateId" => $product['privateId'], "price" => $optimalPrice['PRICE']['PRICE'], "quantity" => $product['quantity'], "discount" => 0, "subtotal" => $optimalPrice['PRICE']['PRICE'] * $product['quantity'] ]; } $order->setBasket($basket); // Создаём одну отгрузку и устанавливаем способ доставки $shipmentCollection = $order->getShipmentCollection(); $shipment = $shipmentCollection->createItem( BitrixSaleDeliveryServicesManager::getObjectById($deliveryID) ); $shipmentItemCollection = $shipment->getShipmentItemCollection(); // инициирую и добавляю промокод /* BitrixSaleDiscountCouponsManager::init(); BitrixSaleDiscountCouponsManager::add($promocode);*/ // наполняем корзину foreach ($order->getBasket() as $item) { $shipmentItem = $shipmentItemCollection->createItem($item); $shipmentItem->setQuantity($item->getQuantity()); } // Создаём оплату $paymentCollection = $order->getPaymentCollection(); $payment = $paymentCollection->createItem(); $paySystemService = PaySystemManager::getObjectById($paymentID); $payment->setFields(array( 'PAY_SYSTEM_ID' => $paySystemService->getField("PAY_SYSTEM_ID"), 'PAY_SYSTEM_NAME' => $paySystemService->getField("NAME"), )); // применяем купон // BitrixSaleDiscountCouponsManager::add('cupon'); // получаем объект скидок для корзины $oDiscounts = BitrixSaleDiscount::loadByBasket($basket); // обновляем поля в корзине $basket->refreshData(['PRICE','COUPONS']); // пересчёт скидок для корзины $oDiscounts->calculate(); // получаем результаты расчёта скидок для корзины $result = $oDiscounts->getApplyResult(); // хочу посмотреть товары со скидкой foreach ($basket as $basketItem) { echo $basketItem->getField('NAME') . ' - ' . $basketItem->getQuantity() . ' цена ' . $basketItem->getPrice() . " итого " . $basketItem->getFinalPrice() . ' <br />'; } /* BitrixSaleDiscountCouponsManager::init( BitrixSaleDiscountCouponsManager::MODE_ORDER, [ "userId" => $order->getUserId(), "orderId" => $order->getId() ] ); BitrixSaleDiscountCouponsManager::add('CUPON'); $discounts = $order->getDiscount(); $discounts->calculate();*/ $order->doFinalAction(true);
Но скидка не встает, при чем если на этот же товар через сайт добавить купон, то скидка всатет
Дополнительно:
Насколько помню, 'CUSTOM_PRICE' => 'Y', отключает расчёт цены. То что попадёт в поле PRICE при добавлении товара в корзину, то там и останется.
Убрал вообще цену из наполнения корзины.
Проубю применить купон в раных местах, не выходит
$order = Order::create($siteId, $userID); $order->setPersonTypeId(4); $order->setField('CURRENCY', $currencyCode); // содаем корзину $basket = BitrixSaleBasket::create($siteId); // проубю тут применянить купон BitrixSaleDiscountCouponsManager::add('CUPON'); foreach ($products as $k => $product) { $optimalPrice = CCatalogProduct::GetOptimalPrice($product['id'], $product['quantity'], 8, 'N', '', SITE_ID, $promocode); $item = $basket->createItem('catalog', $product['id']); $item->setFields([ 'QUANTITY' => $product['quantity'], 'CURRENCY' => BitrixCurrencyCurrencyManager::getBaseCurrency(), 'LID' => BitrixMainContext::getCurrent()->getSite(), // тут убрал цену 'PRODUCT_PROVIDER_CLASS' => 'CCatalogProductProvider', ]); } $order->setBasket($basket); // Создаём одну отгрузку и устанавливаем способ доставки $shipmentCollection = $order->getShipmentCollection(); $shipment = $shipmentCollection->createItem( BitrixSaleDeliveryServicesManager::getObjectById($deliveryID) ); $shipmentItemCollection = $shipment->getShipmentItemCollection(); // проубю тут применянить купон // инициирую и добавляю промокод BitrixSaleDiscountCouponsManager::init(); BitrixSaleDiscountCouponsManager::add($promocode); // наполняем корзину foreach ($order->getBasket() as $item) { $shipmentItem = $shipmentItemCollection->createItem($item); $shipmentItem->setQuantity($item->getQuantity()); } // Создаём оплату $paymentCollection = $order->getPaymentCollection(); $payment = $paymentCollection->createItem(); $paySystemService = PaySystemManager::getObjectById($paymentID); $payment->setFields(array( 'PAY_SYSTEM_ID' => $paySystemService->getField("PAY_SYSTEM_ID"), 'PAY_SYSTEM_NAME' => $paySystemService->getField("NAME"), )); /* // получаем объект скидок для корзины $oDiscounts = BitrixSaleDiscount::loadByBasket($basket); // обновляем поля в корзине $basket->refreshData(['PRICE','COUPONS']); // пересчёт скидок для корзины $oDiscounts->calculate(); // получаем результаты расчёта скидок для корзины $result = $oDiscounts->getApplyResult();*/ // хочу посмотреть товары со скидкой // проубю тут применянить купон BitrixSaleDiscountCouponsManager::init( BitrixSaleDiscountCouponsManager::MODE_ORDER, [ "userId" => "78215" ] ); BitrixSaleDiscountCouponsManager::add('CUPON'); $discounts = $order->getDiscount(); $discounts->calculate(); foreach ($basket as $basketItem) { echo $basketItem->getField('NAME') . ' - ' . $basketItem->getQuantity() . ' цена ' . $basketItem->getPrice() . " итого " . $basketItem->getFinalPrice() . ' <br />'; } $order->doFinalAction(true); |
$order = Order::create($siteId, $userID); $order->setPersonTypeId(4); $order->setField('CURRENCY', $currencyCode); // содаем корзину $basket = BitrixSaleBasket::create($siteId); // проубю тут применянить купон BitrixSaleDiscountCouponsManager::add('CUPON'); foreach ($products as $k => $product) { $optimalPrice = CCatalogProduct::GetOptimalPrice($product['id'], $product['quantity'], 8, 'N', '', SITE_ID, $promocode); $item = $basket->createItem('catalog', $product['id']); $item->setFields([ 'QUANTITY' => $product['quantity'], 'CURRENCY' => BitrixCurrencyCurrencyManager::getBaseCurrency(), 'LID' => BitrixMainContext::getCurrent()->getSite(), // тут убрал цену 'PRODUCT_PROVIDER_CLASS' => 'CCatalogProductProvider', ]); } $order->setBasket($basket); // Создаём одну отгрузку и устанавливаем способ доставки $shipmentCollection = $order->getShipmentCollection(); $shipment = $shipmentCollection->createItem( BitrixSaleDeliveryServicesManager::getObjectById($deliveryID) ); $shipmentItemCollection = $shipment->getShipmentItemCollection(); // проубю тут применянить купон // инициирую и добавляю промокод BitrixSaleDiscountCouponsManager::init(); BitrixSaleDiscountCouponsManager::add($promocode); // наполняем корзину foreach ($order->getBasket() as $item) { $shipmentItem = $shipmentItemCollection->createItem($item); $shipmentItem->setQuantity($item->getQuantity()); } // Создаём оплату $paymentCollection = $order->getPaymentCollection(); $payment = $paymentCollection->createItem(); $paySystemService = PaySystemManager::getObjectById($paymentID); $payment->setFields(array( 'PAY_SYSTEM_ID' => $paySystemService->getField("PAY_SYSTEM_ID"), 'PAY_SYSTEM_NAME' => $paySystemService->getField("NAME"), )); /* // получаем объект скидок для корзины $oDiscounts = BitrixSaleDiscount::loadByBasket($basket); // обновляем поля в корзине $basket->refreshData(['PRICE','COUPONS']); // пересчёт скидок для корзины $oDiscounts->calculate(); // получаем результаты расчёта скидок для корзины $result = $oDiscounts->getApplyResult();*/ // хочу посмотреть товары со скидкой // проубю тут применянить купон BitrixSaleDiscountCouponsManager::init( BitrixSaleDiscountCouponsManager::MODE_ORDER, [ "userId" => "78215" ] ); BitrixSaleDiscountCouponsManager::add('CUPON'); $discounts = $order->getDiscount(); $discounts->calculate(); foreach ($basket as $basketItem) { echo $basketItem->getField('NAME') . ' - ' . $basketItem->getQuantity() . ' цена ' . $basketItem->getPrice() . " итого " . $basketItem->getFinalPrice() . ' <br />'; } $order->doFinalAction(true);
но на выходе все так же
$saveOrderResult = $basket->refresh( BitrixSaleBasketRefreshFactory::create( BitrixSaleBasketRefreshFactory::TYPE_FULL ) ); |
$saveOrderResult = $basket->refresh( BitrixSaleBasketRefreshFactory::create( BitrixSaleBasketRefreshFactory::TYPE_FULL ) );
Ну и посмотреть в вардамп ошибок
$discount = $order->getDiscount(); BitrixSaleDiscountCouponsManager::clearApply(true); BitrixSaleDiscountCouponsManager::useSavedCouponsForApply(true); $discount->setOrderRefresh(true); $discount->setApplyResult(array()); /** @var BitrixSaleBasket $basket */ $basket = $order->getBasket()) $saveOrderResult = $basket->refresh( BitrixSaleBasketRefreshFactory::create( BitrixSaleBasketRefreshFactory::TYPE_FULL ) ); if (!$saveOrderResult->isSuccess()) { var_dump($saveOrderResult->getErrors()); } $saveOrderResult = $discount->calculate(); if (!$saveOrderResult->isSuccess()) { var_dump($saveOrderResult->getErrors()); } |
$discount = $order->getDiscount(); BitrixSaleDiscountCouponsManager::clearApply(true); BitrixSaleDiscountCouponsManager::useSavedCouponsForApply(true); $discount->setOrderRefresh(true); $discount->setApplyResult(array()); /** @var BitrixSaleBasket $basket */ $basket = $order->getBasket()) $saveOrderResult = $basket->refresh( BitrixSaleBasketRefreshFactory::create( BitrixSaleBasketRefreshFactory::TYPE_FULL ) ); if (!$saveOrderResult->isSuccess()) { var_dump($saveOrderResult->getErrors()); } $saveOrderResult = $discount->calculate(); if (!$saveOrderResult->isSuccess()) { var_dump($saveOrderResult->getErrors()); }
дописал ваш код в конец, убрал добавления купонов, оставил в одном месте
$order = Order::create($siteId, $userID); $order->setPersonTypeId(4); //$order->setField('PRICE_DELIVERY', 770); $order->setField('CURRENCY', $currencyCode); // содаем корзину $basket = BitrixSaleBasket::create($siteId); // применяем купон // BitrixSaleDiscountCouponsManager::add('CUPON'); foreach ($products as $k => $product) { $item = $basket->createItem('catalog', $product['id']); $item->setFields([ 'QUANTITY' => $product['quantity'], 'CURRENCY' => BitrixCurrencyCurrencyManager::getBaseCurrency(), 'LID' => BitrixMainContext::getCurrent()->getSite(), 'PRODUCT_PROVIDER_CLASS' => 'CCatalogProductProvider', ]); } $order->setBasket($basket); // Создаём одну отгрузку и устанавливаем способ доставки $shipmentCollection = $order->getShipmentCollection(); $shipment = $shipmentCollection->createItem( BitrixSaleDeliveryServicesManager::getObjectById($deliveryID) ); $shipmentItemCollection = $shipment->getShipmentItemCollection(); // наполняем корзину foreach ($order->getBasket() as $item) { $shipmentItem = $shipmentItemCollection->createItem($item); $shipmentItem->setQuantity($item->getQuantity()); } // Создаём оплату $paymentCollection = $order->getPaymentCollection(); $payment = $paymentCollection->createItem(); $paySystemService = PaySystemManager::getObjectById($paymentID); $payment->setFields(array( 'PAY_SYSTEM_ID' => $paySystemService->getField("PAY_SYSTEM_ID"), 'PAY_SYSTEM_NAME' => $paySystemService->getField("NAME"), )); BitrixSaleDiscountCouponsManager::add('CUPON'); $discount = $order->getDiscount(); BitrixSaleDiscountCouponsManager::clearApply(true); BitrixSaleDiscountCouponsManager::useSavedCouponsForApply(true); $discount->setOrderRefresh(true); $discount->setApplyResult(array()); /** @var BitrixSaleBasket $basket */ $basket = $order->getBasket(); $saveOrderResult = $basket->refresh( BitrixSaleBasketRefreshFactory::create( BitrixSaleBasketRefreshFactory::TYPE_FULL ) ); if (!$saveOrderResult->isSuccess()) { var_dump($saveOrderResult->getErrors()); } $saveOrderResult = $discount->calculate(); if (!$saveOrderResult->isSuccess()) { var_dump($saveOrderResult->getErrors()); } $order->doFinalAction(true); foreach ($basket as $basketItem) { echo $basketItem->getField('NAME') . ' - ' . $basketItem->getQuantity() . ' цена ' . $basketItem->getPrice() . " итого " . $basketItem->getFinalPrice() . ' <br />'; } } |
$order = Order::create($siteId, $userID); $order->setPersonTypeId(4); //$order->setField('PRICE_DELIVERY', 770); $order->setField('CURRENCY', $currencyCode); // содаем корзину $basket = BitrixSaleBasket::create($siteId); // применяем купон // BitrixSaleDiscountCouponsManager::add('CUPON'); foreach ($products as $k => $product) { $item = $basket->createItem('catalog', $product['id']); $item->setFields([ 'QUANTITY' => $product['quantity'], 'CURRENCY' => BitrixCurrencyCurrencyManager::getBaseCurrency(), 'LID' => BitrixMainContext::getCurrent()->getSite(), 'PRODUCT_PROVIDER_CLASS' => 'CCatalogProductProvider', ]); } $order->setBasket($basket); // Создаём одну отгрузку и устанавливаем способ доставки $shipmentCollection = $order->getShipmentCollection(); $shipment = $shipmentCollection->createItem( BitrixSaleDeliveryServicesManager::getObjectById($deliveryID) ); $shipmentItemCollection = $shipment->getShipmentItemCollection(); // наполняем корзину foreach ($order->getBasket() as $item) { $shipmentItem = $shipmentItemCollection->createItem($item); $shipmentItem->setQuantity($item->getQuantity()); } // Создаём оплату $paymentCollection = $order->getPaymentCollection(); $payment = $paymentCollection->createItem(); $paySystemService = PaySystemManager::getObjectById($paymentID); $payment->setFields(array( 'PAY_SYSTEM_ID' => $paySystemService->getField("PAY_SYSTEM_ID"), 'PAY_SYSTEM_NAME' => $paySystemService->getField("NAME"), )); BitrixSaleDiscountCouponsManager::add('CUPON'); $discount = $order->getDiscount(); BitrixSaleDiscountCouponsManager::clearApply(true); BitrixSaleDiscountCouponsManager::useSavedCouponsForApply(true); $discount->setOrderRefresh(true); $discount->setApplyResult(array()); /** @var BitrixSaleBasket $basket */ $basket = $order->getBasket(); $saveOrderResult = $basket->refresh( BitrixSaleBasketRefreshFactory::create( BitrixSaleBasketRefreshFactory::TYPE_FULL ) ); if (!$saveOrderResult->isSuccess()) { var_dump($saveOrderResult->getErrors()); } $saveOrderResult = $discount->calculate(); if (!$saveOrderResult->isSuccess()) { var_dump($saveOrderResult->getErrors()); } $order->doFinalAction(true); foreach ($basket as $basketItem) { echo $basketItem->getField('NAME') . ' - ' . $basketItem->getQuantity() . ' цена ' . $basketItem->getPrice() . " итого " . $basketItem->getFinalPrice() . ' <br />'; } }
В вардампе ничего нет, ошибок нет : /
история проще чем я думаю, но пока не могу понять.
Есть код, где я в тупую ставлю все ID.
$coupon = array("CUPON"); $externalUserIdArray = ['3','4','8','2']; $prices = CCatalogProduct::GetOptimalPrice(1099647, 1, $externalUserIdArray, 'N', '', SITE_ID, $coupon); echo "<h3> СО СКИДКОЙ ".$prices['DISCOUNT_PRICE']."</h3>"; |
$coupon = array("CUPON"); $externalUserIdArray = ['3','4','8','2']; $prices = CCatalogProduct::GetOptimalPrice(1099647, 1, $externalUserIdArray, 'N', '', SITE_ID, $coupon); echo "<h3> СО СКИДКОЙ ".$prices['DISCOUNT_PRICE']."</h3>";
Код дает разный результат для авторизованных и не для авторизованных.
К базовой цене есть доступ у всех, доступ к правилу и промокоду тоже у всех.
не пойму в чем дело блин :/
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для расчета цены по купону вам необходимо учитывать несколько факторов. Во-первых, нужно определить скидку, которую предоставляет купон. Это может быть фиксированная сумма или процент от общей стоимости товаров или услуг.
Для начала создадим функцию на PHP, которая будет принимать общую стоимость и скидку от купона и возвращать итоговую цену:
function calculatePriceWithCoupon($totalPrice, $couponDiscount) { $discountedPrice = 0; if (is_numeric($couponDiscount)) { // Если скидка указана в процентах if ($couponDiscount > 0 && $couponDiscount 0) { $discountedPrice = $totalPrice - $couponDiscount; } else { echo "Ошибка: Неверно указана фиксированная сумма скидки"; } } return $discountedPrice; } $totalPrice = 100; // общая стоимость $couponDiscount = 10; // скидка от купона (в процентах или фиксированная сумма) $finalPrice = calculatePriceWithCoupon($totalPrice, $couponDiscount); echo "Итоговая цена после применения купона: $finalPrice";
Этот код позволит вам легко рассчитать итоговую цену, учитывая скидку от купона. Просто укажите общую стоимость и значение скидки, и функция вернет вам итоговую цену после применения купона.