Files
interblue.pl/modules/przelewy24/classes/Przelewy24ServiceValidateOrder.php
2024-10-25 14:16:28 +02:00

140 lines
4.8 KiB
PHP

<?php
/**
* Class Przelewy24ServiceValidateOrder
*/
class Przelewy24ServiceValidateOrder extends Przelewy24Service
{
public function execute()
{
global $cart;
$order_id = Order::getOrderByCartId($cart->id);
$order = new Order($order_id);
$result = $this->processZenCard($order);
return [$result, $order];
}
public function processZenCard($order)
{
try {
$zenCardApi = new ZenCardApi(
Configuration::get("P24_MERCHANT_ID"), Configuration::get("P24_API_KEY")
);
if (!$zenCardApi->isEnabled()) {
return false;
}
$customer = Context::getContext()->customer;
$amount = $order->total_products_wt * 100 - $order->total_discounts * 100; // total products price tax included
$zenCardOrderId = $zenCardApi->buildZenCardOrderId($order->id_cart, $_SERVER['SERVER_NAME']);
$customerEmail = $customer->email;
if ($customerEmail === null) {
$milliseconds = round(microtime(true) * 1000);
$customerEmail = 'przelewy_' . $milliseconds . '@zencard.pl';
}
$transaction = $zenCardApi->verify($customerEmail, $amount, $zenCardOrderId);
Logger::addLog('[zencard verify] ' . print_r($transaction, true), 1);
if ($transaction->isVerified()) {
$transactionConfirm = $zenCardApi->confirm($zenCardOrderId, $amount);
Logger::addLog('[zencard confirm]' . print_r($transactionConfirm, true), 1);
if (!$transactionConfirm->isConfirmed()) {
return false;
}
if ($transactionConfirm->hasDiscount() || $transactionConfirm->withZencard()) {
return $this->zenCardOrderProcessing($order, $transactionConfirm);
}
}
} catch (Exception $e) {
Logger::addLog($e->getMessage(), 1);
}
return false;
}
public function zenCardOrderProcessing($order, Transaction $transactionConfirm)
{
try {
if ($transactionConfirm->withZencard() || (!$transactionConfirm->withZencard() && $transactionConfirm->getInfo() != '')) {
$info = $transactionConfirm->getInfo();
$amount = $transactionConfirm->getAmountWithDiscount();
$without = $transactionConfirm->getAmount();
$discountAmount = round($without - $amount);
$this->addOrderDiscount($order, $discountAmount / 100, $info);
}
} catch (Exception $e) {
Logger::addLog(__METHOD__ . ' ' . $e->getMessage(), 1);
}
return true;
}
public function addOrderDiscount($order, $amount, $name, $description = '')
{
if ($order) {
$cart_rule = new CartRule();
$names = array();
$languages = Language::getLanguages();
foreach ($languages as $key => $language) {
$names[$language['id_lang']] = $name ? "Rabat Zencard - " . $name : "Rabat Zencard";
}
$prefix = $this->p24_zencard_coupon_prefix();
$couponCode = uniqid($prefix);
$cart_rule->name = $names;
$cart_rule->id_customer = $order->id_customer;
$cart_rule->date_from = date('Y-m-d H:i:s');
$cart_rule->date_to = date('2036-01-01 13:00:00');
$cart_rule->description = $description;
$cart_rule->quantity = 1;
$cart_rule->quantity_per_user = 1;
$cart_rule->priority = 1;
$cart_rule->partial_use = 0;
$cart_rule->code = $couponCode;
$cart_rule->minimum_amount = 0.01;
$cart_rule->minimum_amount_currency = 1;
$cart_rule->product_restriction = 1;
$cart_rule->reduction_amount = $amount;
$cart_rule->reduction_tax = 1;
$cart_rule->reduction_currency = (int) Configuration::get('PS_CURRENCY_DEFAULT');
$cart_rule->reduction_product = 0;
$cart_rule->active = 1;
$cart_rule->date_add = date('Y-m-d H:i:s');
$cart_rule->date_upd = date('Y-m-d H:i:s');
$cart_rule->add();
$cart = new Cart($order->id_cart);
$cart->addCartRule($cart_rule->id);
$values = array(
'tax_incl' => (float)$amount,
'tax_excl' => (float)$amount
);
$cart->update();
$order->addCartRule($cart_rule->id, $cart_rule->name[Configuration::get('PS_LANG_DEFAULT')], $values);
$order->update();
return true;
}
return false;
}
public function p24_zencard_coupon_prefix()
{
return 'zencard';
}
}