JEMBOT MAWOT Bypass Shell

Current Path : /home/cinepatreb/billetterie/classes/order/
Upload File :
Current File : /home/cinepatreb/billetterie/classes/order/OrderSlip.php

<?php
/**
 * Copyright since 2007 PrestaShop SA and Contributors
 * PrestaShop is an International Registered Trademark & Property of PrestaShop SA
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Open Software License (OSL 3.0)
 * that is bundled with this package in the file LICENSE.md.
 * It is also available through the world-wide-web at this URL:
 * https://opensource.org/licenses/OSL-3.0
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@prestashop.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
 * versions in the future. If you wish to customize PrestaShop for your
 * needs please refer to https://devdocs.prestashop.com/ for more information.
 *
 * @author    PrestaShop SA and Contributors <contact@prestashop.com>
 * @copyright Since 2007 PrestaShop SA and Contributors
 * @license   https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
 */
class OrderSlipCore extends ObjectModel
{
    /** @var int */
    public $id;

    /** @var int */
    public $id_customer;

    /** @var int */
    public $id_order;

    /** @var float */
    public $conversion_rate;

    /** @var float */
    public $total_products_tax_excl;

    /** @var float */
    public $total_products_tax_incl;

    /** @var float */
    public $total_shipping_tax_excl;

    /** @var float */
    public $total_shipping_tax_incl;

    /** @var float */
    public $amount;

    /** @var bool */
    public $shipping_cost;

    /** @var float */
    public $shipping_cost_amount;

    /** @var int */
    public $partial;

    /** @var string Object creation date */
    public $date_add;

    /** @var string Object last modification date */
    public $date_upd;

    /** @var int */
    public $order_slip_type = 0;

    /**
     * @see ObjectModel::$definition
     */
    public static $definition = [
        'table' => 'order_slip',
        'primary' => 'id_order_slip',
        'fields' => [
            'id_customer' => ['type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true],
            'id_order' => ['type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true],
            'conversion_rate' => ['type' => self::TYPE_FLOAT, 'validate' => 'isFloat', 'required' => true],
            'total_products_tax_excl' => ['type' => self::TYPE_FLOAT, 'validate' => 'isFloat', 'required' => true],
            'total_products_tax_incl' => ['type' => self::TYPE_FLOAT, 'validate' => 'isFloat', 'required' => true],
            'total_shipping_tax_excl' => ['type' => self::TYPE_FLOAT, 'validate' => 'isFloat', 'required' => true],
            'total_shipping_tax_incl' => ['type' => self::TYPE_FLOAT, 'validate' => 'isFloat', 'required' => true],
            'amount' => ['type' => self::TYPE_FLOAT, 'validate' => 'isFloat'],
            'shipping_cost' => ['type' => self::TYPE_BOOL],
            'shipping_cost_amount' => ['type' => self::TYPE_FLOAT, 'validate' => 'isFloat'],
            'partial' => ['type' => self::TYPE_INT],
            'date_add' => ['type' => self::TYPE_DATE, 'validate' => 'isDate'],
            'date_upd' => ['type' => self::TYPE_DATE, 'validate' => 'isDate'],
            'order_slip_type' => ['type' => self::TYPE_INT, 'validate' => 'isInt'],
        ],
    ];

    protected $webserviceParameters = [
        'objectNodeName' => 'order_slip',
        'objectsNodeName' => 'order_slips',
        'fields' => [
            'id_customer' => ['xlink_resource' => 'customers'],
            'id_order' => ['xlink_resource' => 'orders'],
        ],
        'associations' => [
            'order_slip_details' => ['resource' => 'order_slip_detail', 'setter' => false, 'virtual_entity' => true,
                'fields' => [
                    'id' => [],
                    'id_order_detail' => ['required' => true],
                    'product_quantity' => ['required' => true],
                    'amount_tax_excl' => ['required' => true],
                    'amount_tax_incl' => ['required' => true],
                ], ],
        ],
    ];

    public function addSlipDetail($orderDetailList, $productQtyList)
    {
        foreach ($orderDetailList as $key => $id_order_detail) {
            if ($qty = (int) ($productQtyList[$key])) {
                $order_detail = new OrderDetail((int) $id_order_detail);

                if (Validate::isLoadedObject($order_detail)) {
                    Db::getInstance()->insert('order_slip_detail', [
                        'id_order_slip' => (int) $this->id,
                        'id_order_detail' => (int) $id_order_detail,
                        'product_quantity' => $qty,
                        'amount_tax_excl' => $order_detail->unit_price_tax_excl * $qty,
                        'amount_tax_incl' => $order_detail->unit_price_tax_incl * $qty,
                    ]);
                }
            }
        }
    }

    public static function getOrdersSlip($customer_id, $order_id = false)
    {
        return Db::getInstance()->executeS('
        SELECT *
        FROM `' . _DB_PREFIX_ . 'order_slip`
        WHERE `id_customer` = ' . (int) ($customer_id) .
            ($order_id ? ' AND `id_order` = ' . (int) ($order_id) : '') . '
        ORDER BY `date_add` DESC');
    }

    public static function getOrdersSlipDetail($id_order_slip = false, $id_order_detail = false)
    {
        return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(
            ($id_order_detail ? 'SELECT SUM(`product_quantity`) AS `total`' : 'SELECT *') .
            'FROM `' . _DB_PREFIX_ . 'order_slip_detail`'
            . ($id_order_slip ? ' WHERE `id_order_slip` = ' . (int) ($id_order_slip) : '')
            . ($id_order_detail ? ' WHERE `id_order_detail` = ' . (int) ($id_order_detail) : '')
        );
    }

    /**
     * @param int $orderSlipId
     * @param Order $order
     *
     * @return array
     */
    public static function getOrdersSlipProducts($orderSlipId, $order)
    {
        $productsRet = OrderSlip::getOrdersSlipDetail($orderSlipId);
        $order_details = $order->getProductsDetail();

        $slip_quantity = [];
        foreach ($productsRet as $slip_detail) {
            $slip_quantity[$slip_detail['id_order_detail']] = $slip_detail;
        }

        $products = [];
        foreach ($order_details as $key => $product) {
            if (isset($slip_quantity[$product['id_order_detail']]) && $slip_quantity[$product['id_order_detail']]['product_quantity']) {
                $products[$key] = $product;
                $products[$key] = array_merge($products[$key], $slip_quantity[$product['id_order_detail']]);
            }
        }

        return $order->getProducts($products);
    }

    /**
     * Get resume of all refund for one product line.
     *
     * @param int $id_order_detail
     *
     * @deprecated This method should not be used any more because sometimes OrderSlip is not created, you should use the OrderDetail::total_refunded_tax_excl/incl fields instead
     */
    public static function getProductSlipResume($id_order_detail)
    {
        return Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('
            SELECT SUM(product_quantity) product_quantity, SUM(amount_tax_excl) amount_tax_excl, SUM(amount_tax_incl) amount_tax_incl
            FROM `' . _DB_PREFIX_ . 'order_slip_detail`
            WHERE `id_order_detail` = ' . (int) $id_order_detail);
    }

    /**
     * Get resume of all shipping refund for one order.
     *
     * @param int $idOrder
     */
    public static function getShippingSlipResume(int $idOrder)
    {
        return Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('
            SELECT
                SUM(total_shipping_tax_incl) total_shipping_tax_incl,
                SUM(total_shipping_tax_excl) total_shipping_tax_excl,
                SUM(shipping_cost_amount) shipping_cost_amount
            FROM `' . _DB_PREFIX_ . 'order_slip`
            WHERE `id_order` = ' . $idOrder);
    }

    /**
     * Get refund details for one product line.
     *
     * @param int $id_order_detail
     */
    public static function getProductSlipDetail($id_order_detail)
    {
        return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
            SELECT product_quantity, amount_tax_excl, amount_tax_incl, date_add
            FROM `' . _DB_PREFIX_ . 'order_slip_detail` osd
            LEFT JOIN `' . _DB_PREFIX_ . 'order_slip` os
            ON os.id_order_slip = osd.id_order_slip
            WHERE osd.`id_order_detail` = ' . (int) $id_order_detail);
    }

    public function getProducts()
    {
        $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
        SELECT *, osd.product_quantity
        FROM `' . _DB_PREFIX_ . 'order_slip_detail` osd
        INNER JOIN `' . _DB_PREFIX_ . 'order_detail` od ON osd.id_order_detail = od.id_order_detail
        WHERE osd.`id_order_slip` = ' . (int) $this->id);

        $order = new Order($this->id_order);
        $products = [];
        foreach ($result as $row) {
            $order->setProductPrices($row);
            $products[] = $row;
        }

        return $products;
    }

    public static function getSlipsIdByDate($dateFrom, $dateTo)
    {
        $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
        SELECT `id_order_slip`
        FROM `' . _DB_PREFIX_ . 'order_slip` os
        LEFT JOIN `' . _DB_PREFIX_ . 'orders` o ON (o.`id_order` = os.`id_order`)
        WHERE os.`date_add` BETWEEN \'' . pSQL($dateFrom) . ' 00:00:00\' AND \'' . pSQL($dateTo) . ' 23:59:59\'
        ' . Shop::addSqlRestriction(Shop::SHARE_ORDER, 'o') . '
        ORDER BY os.`date_add` ASC');

        $slips = [];
        foreach ($result as $slip) {
            $slips[] = (int) $slip['id_order_slip'];
        }

        return $slips;
    }

    public static function create(Order $order, $product_list, $shipping_cost = false, $amount = 0, $amount_choosen = false, $add_tax = true)
    {
        $currency = new Currency((int) $order->id_currency);
        $order_slip = new OrderSlip();
        $order_slip->id_customer = (int) $order->id_customer;
        $order_slip->id_order = (int) $order->id;
        $order_slip->conversion_rate = $currency->conversion_rate;

        if ($add_tax) {
            $taxCalculatorMethod = 'addTaxes';
            $inc_or_ex_1 = 'excl';
            $inc_or_ex_2 = 'incl';
        } else {
            $taxCalculatorMethod = 'removeTaxes';
            $inc_or_ex_1 = 'incl';
            $inc_or_ex_2 = 'excl';
        }

        $order_slip->{'total_shipping_tax_' . $inc_or_ex_1} = 0;
        $order_slip->{'total_shipping_tax_' . $inc_or_ex_2} = 0;
        $order_slip->partial = 0;

        if ($shipping_cost !== false) {
            $order_slip->shipping_cost = true;
            $carrier = new Carrier((int) $order->id_carrier);
            $address = Address::initialize($order->id_address_delivery, false);
            $tax_calculator = $carrier->getTaxCalculator($address);
            $order_slip->{'total_shipping_tax_' . $inc_or_ex_1} = ($shipping_cost === null ? $order->{'total_shipping_tax_' . $inc_or_ex_1} : (float) $shipping_cost);

            if ($tax_calculator instanceof TaxCalculator) {
                $order_slip->{'total_shipping_tax_' . $inc_or_ex_2} = Tools::ps_round($tax_calculator->{$taxCalculatorMethod}($order_slip->{'total_shipping_tax_' . $inc_or_ex_1}), Context::getContext()->getComputingPrecision());
            } else {
                $order_slip->{'total_shipping_tax_' . $inc_or_ex_2} = $order_slip->{'total_shipping_tax_' . $inc_or_ex_1};
            }
        } else {
            $order_slip->shipping_cost = false;
        }

        $order_slip->amount = 0;
        $order_slip->{'total_products_tax_' . $inc_or_ex_1} = 0;
        $order_slip->{'total_products_tax_' . $inc_or_ex_2} = 0;
        $total_products = [];
        foreach ($product_list as &$product) {
            $order_detail = new OrderDetail((int) $product['id_order_detail']);
            $price = (float) $product['unit_price'];
            $quantity = (int) $product['quantity'];
            $order_slip_resume = OrderSlip::getProductSlipResume((int) $order_detail->id);
            if ($quantity + $order_slip_resume['product_quantity'] > $order_detail->product_quantity) {
                $quantity = $order_detail->product_quantity - $order_slip_resume['product_quantity'];
            }

            if ($quantity == 0) {
                continue;
            }

            if (!Tools::isSubmit('cancelProduct') && $order->hasBeenPaid()) {
                $order_detail->product_quantity_refunded += $quantity;
            }

            $order_detail->save();

            $address = Address::initialize($order->id_address_invoice, false);
            $id_address = (int) $address->id;
            $id_tax_rules_group = (int) $order_detail->id_tax_rules_group;
            $tax_calculator = $order_detail->getTaxCalculator();

            $order_slip->{'total_products_tax_' . $inc_or_ex_1} += $price * $quantity;

            if (in_array(Configuration::get('PS_ROUND_TYPE'), [Order::ROUND_ITEM, Order::ROUND_LINE])) {
                if (!isset($total_products[$id_tax_rules_group])) {
                    $total_products[$id_tax_rules_group] = 0;
                }
            } else {
                if (!isset($total_products[$id_tax_rules_group . '_' . $id_address])) {
                    $total_products[$id_tax_rules_group . '_' . $id_address] = 0;
                }
            }

            $product_tax_incl_line = Tools::ps_round($tax_calculator->{$taxCalculatorMethod}($price) * $quantity, Context::getContext()->getComputingPrecision());

            switch (Configuration::get('PS_ROUND_TYPE')) {
                case Order::ROUND_ITEM:
                    $product_tax_incl = Tools::ps_round($tax_calculator->{$taxCalculatorMethod}($price), Context::getContext()->getComputingPrecision()) * $quantity;
                    $total_products[$id_tax_rules_group] += $product_tax_incl;

                    break;
                case Order::ROUND_LINE:
                    $product_tax_incl = $product_tax_incl_line;
                    $total_products[$id_tax_rules_group] += $product_tax_incl;

                    break;
                case Order::ROUND_TOTAL:
                    $product_tax_incl = $product_tax_incl_line;
                    $total_products[$id_tax_rules_group . '_' . $id_address] += $price * $quantity;

                    break;
            }

            $product['unit_price_tax_' . $inc_or_ex_1] = $price;
            $product['unit_price_tax_' . $inc_or_ex_2] = Tools::ps_round($tax_calculator->{$taxCalculatorMethod}($price), Context::getContext()->getComputingPrecision());
            $product['total_price_tax_' . $inc_or_ex_1] = Tools::ps_round($price * $quantity, Context::getContext()->getComputingPrecision());
            $product['total_price_tax_' . $inc_or_ex_2] = Tools::ps_round($product_tax_incl ?? 0, Context::getContext()->getComputingPrecision());
        }
        unset($product);

        foreach ($total_products as $key => $price) {
            if (Configuration::get('PS_ROUND_TYPE') == Order::ROUND_TOTAL) {
                $tmp = explode('_', $key);
                $address = Address::initialize((int) $tmp[1], true);
                $tax_calculator = TaxManagerFactory::getManager($address, (int) $tmp[0])->getTaxCalculator();
                $order_slip->{'total_products_tax_' . $inc_or_ex_2} += Tools::ps_round($tax_calculator->{$taxCalculatorMethod}($price), Context::getContext()->getComputingPrecision());
            } else {
                $order_slip->{'total_products_tax_' . $inc_or_ex_2} += $price;
            }
        }

        $order_slip->{'total_products_tax_' . $inc_or_ex_2} -= (float) $amount && !$amount_choosen ? (float) $amount : 0;
        $order_slip->amount = $amount_choosen ? (float) $amount : $order_slip->{'total_products_tax_' . $inc_or_ex_1};
        $order_slip->shipping_cost_amount = $order_slip->total_shipping_tax_incl;

        if ((float) $amount && !$amount_choosen) {
            $order_slip->order_slip_type = 1;
        }
        if (((float) $amount && $amount_choosen) || $order_slip->shipping_cost_amount > 0) {
            $order_slip->order_slip_type = 2;
        }

        if (!$order_slip->add()) {
            return false;
        }

        $res = true;

        foreach ($product_list as $product) {
            $res &= $order_slip->addProductOrderSlip($product);
        }

        return $res;
    }

    protected function addProductOrderSlip($product)
    {
        return Db::getInstance()->insert('order_slip_detail', [
            'id_order_slip' => (int) $this->id,
            'id_order_detail' => (int) $product['id_order_detail'],
            'product_quantity' => $product['quantity'],
            'unit_price_tax_excl' => $product['unit_price_tax_excl'],
            'unit_price_tax_incl' => $product['unit_price_tax_incl'],
            'total_price_tax_excl' => $product['total_price_tax_excl'],
            'total_price_tax_incl' => $product['total_price_tax_incl'],
            'amount_tax_excl' => $product['total_price_tax_excl'],
            'amount_tax_incl' => $product['total_price_tax_incl'],
        ]);
    }

    public static function createPartialOrderSlip($order, $amount, $shipping_cost_amount, $order_detail_list)
    {
        $currency = new Currency($order->id_currency);
        $orderSlip = new OrderSlip();
        $orderSlip->id_customer = (int) $order->id_customer;
        $orderSlip->id_order = (int) $order->id;
        $orderSlip->amount = (float) $amount;
        $orderSlip->shipping_cost = false;
        $orderSlip->shipping_cost_amount = (float) $shipping_cost_amount;
        $orderSlip->conversion_rate = $currency->conversion_rate;
        $orderSlip->partial = 1;
        if (!$orderSlip->add()) {
            return false;
        }

        $orderSlip->addPartialSlipDetail($order_detail_list);

        return true;
    }

    /**
     * @param array<int, array<float|int>> $order_detail_list
     *
     * @throws PrestaShopDatabaseException
     * @throws PrestaShopException
     */
    public function addPartialSlipDetail($order_detail_list)
    {
        foreach ($order_detail_list as $id_order_detail => $tab) {
            $order_detail = new OrderDetail($id_order_detail);
            $order_slip_resume = OrderSlip::getProductSlipResume($id_order_detail);

            if ($tab['amount'] + $order_slip_resume['amount_tax_incl'] > $order_detail->total_price_tax_incl) {
                $tab['amount'] = $order_detail->total_price_tax_incl - $order_slip_resume['amount_tax_incl'];
            }

            if ($tab['amount'] == 0) {
                continue;
            }

            if ($tab['quantity'] + $order_slip_resume['product_quantity'] > $order_detail->product_quantity) {
                $tab['quantity'] = $order_detail->product_quantity - $order_slip_resume['product_quantity'];
            }

            $tab['amount_tax_excl'] = $tab['amount_tax_incl'] = $tab['amount'];

            $id_tax = (int) Db::getInstance()->getValue(
                'SELECT `id_tax`
                FROM `' . _DB_PREFIX_ . 'order_detail_tax`
                WHERE `id_order_detail` = ' . (int) $id_order_detail
            );

            if ($id_tax > 0) {
                $rate = (float) Db::getInstance()->getValue(
                    'SELECT `rate`
                    FROM `' . _DB_PREFIX_ . 'tax`
                    WHERE `id_tax` = ' . (int) $id_tax
                );

                if ($rate > 0) {
                    $rate = 1 + ($rate / 100);
                    $tab['amount_tax_excl'] = $tab['amount_tax_excl'] / $rate;
                }
            }

            if ($tab['quantity'] > 0 && $tab['quantity'] > $order_detail->product_quantity_refunded) {
                $order_detail->product_quantity_refunded = $tab['quantity'];
                $order_detail->save();
            }

            $insert_order_slip = [
                'id_order_slip' => (int) $this->id,
                'id_order_detail' => (int) $id_order_detail,
                'product_quantity' => (int) $tab['quantity'],
                'amount_tax_excl' => (float) $tab['amount_tax_excl'],
                'amount_tax_incl' => (float) $tab['amount_tax_incl'],
            ];

            Db::getInstance()->insert('order_slip_detail', $insert_order_slip);
        }
    }

    public function getEcoTaxTaxesBreakdown()
    {
        $ecotax_detail = [];
        foreach ($this->getOrdersSlipDetail((int) $this->id) as $order_slip_details) {
            $row = Db::getInstance()->getRow(
                'SELECT `ecotax_tax_rate` as `rate`, `ecotax` as `ecotax_tax_excl`, `ecotax` as `ecotax_tax_incl`, `product_quantity`
                FROM `' . _DB_PREFIX_ . 'order_detail`
                WHERE `id_order_detail` = ' . (int) $order_slip_details['id_order_detail']
            );

            if (true === is_array($row)) {
                if (!isset($ecotax_detail[$row['rate']])) {
                    $ecotax_detail[$row['rate']] = ['ecotax_tax_incl' => 0, 'ecotax_tax_excl' => 0, 'rate' => $row['rate']];
                }

                $ecotax_detail[$row['rate']]['ecotax_tax_incl'] += Tools::ps_round(
                    ($row['ecotax_tax_excl'] * $order_slip_details['product_quantity']) + ($row['ecotax_tax_excl'] * $order_slip_details['product_quantity'] * $row['rate'] / 100),
                    Context::getContext()->getComputingPrecision()
                );
                $ecotax_detail[$row['rate']]['ecotax_tax_excl'] += Tools::ps_round(
                    $row['ecotax_tax_excl'] * $order_slip_details['product_quantity'],
                    Context::getContext()->getComputingPrecision()
                );
            }
        }

        return $ecotax_detail;
    }

    public function getWsOrderSlipDetails()
    {
        $query = 'SELECT id_order_slip as id, id_order_detail, product_quantity, amount_tax_excl, amount_tax_incl
        FROM `' . _DB_PREFIX_ . 'order_slip_detail`
        WHERE id_order_slip = ' . (int) $this->id;
        $result = Db::getInstance()->executeS($query);

        return $result;
    }

    public function setWsOrderSlipDetails($values)
    {
        if (Db::getInstance()->execute('DELETE from `' . _DB_PREFIX_ . 'order_slip_detail` where id_order_slip = ' . (int) $this->id)) {
            $query = 'INSERT INTO `' . _DB_PREFIX_ . 'order_slip_detail`(`id_order_slip`, `id_order_detail`, `product_quantity`, `amount_tax_excl`, `amount_tax_incl`) VALUES ';

            foreach ($values as $value) {
                $query .= '(' . (int) $this->id . ', ' . (int) $value['id_order_detail'] . ', ' . (int) $value['product_quantity'] . ', ' .
                    (isset($value['amount_tax_excl']) ? (float) $value['amount_tax_excl'] : 'NULL') . ', ' .
                    (isset($value['amount_tax_incl']) ? (float) $value['amount_tax_incl'] : 'NULL') .
                    '),';
            }
            $query = rtrim($query, ',');
            Db::getInstance()->execute($query);
        }

        return true;
    }
}

xxxxx1.0, XXX xxxx