ElixirVault/www/system-brs-core/app/pubBuy/inc/pubBuyModule.php

808 lines
25 KiB
PHP

<?php
namespace BRSystems\Core\App\pubBuy\inc;
use BRSystems\Core\Library\cDb\cDb;
use BRSystems\Core\Library\cJSON\cJSON;
class pubBuyModule
{
public cDb $db;
CONST TABLE_ORDERS = 'mod_orders';
CONST TABLE_ORDERS_ADDRESSES = 'mod_orders_addresses';
CONST TABLE_ORDERS_DATA = 'mod_orders_data'; // Vēl ir mod_orders_data_edited, mod_orders_deleted_nr, mod_orders_edited
CONST TABLE_ORDERS_DELIVERY = 'mod_orders_delivery'; // TODO: nav, bet ir mod_products_to_delivery
CONST TABLE_ORDERS_RECEIPTS = 'mod_orders_receipts'; // TODO: nav
CONST TABLE_ACT_PROD = 'mod_products_info';
CONST TABLE_CAT_PROD = 'mod_cat_products_info'; // TODO: Nav
public function __construct()
{
$this->db = cDb::getInstance();
}
/**
* Function to check if product by id exists in db
*
* @author Mareks Keišs <keiss.mareks@gmail.com>
* @category pubBuy
* @param int $prodId
* @return array of data
* @version 1.1
*/
public function chkProdExists($prodId){
return $this->db->_querySelectOne('mod_products', array('id'), array('id' => $prodId, 'prod_deleted' => 0, 'prod_disabled' => 0));
}
/**
* Function to get delivery options for order
*
* @author Mareks Keišs <keiss.mareks@gmail.com>
* @category pubBuy
* @param int $pId - product id
* @param string $langId - language id
* @param int $d1 - first selected attribute id
* @param int $d2 - second selected attribute id
* @param bool $defLangCode - indicates if we need default lang code too.
* @return array of data
* @version 1.1
*/
public function getAddedProdData($pId, $langId, $d1 = 0, $d2 = 0, $defLangCode = false){
$pId = $this->db->prepData($pId);
$d1 = (int)$this->db->prepData($d1);
$d2 = (int)$this->db->prepData($d2);
$variantWhere = '';
if ($d1 > 0 && $d2 > 0) {
$variantWhere = "
AND (
(cc.prod_cl_id = {$d1} AND cc.prod_cl_id_2 = {$d2})
OR
(cc.prod_cl_id = {$d2} AND cc.prod_cl_id_2 = {$d1})
)
";
} elseif ($d1 > 0) {
$variantWhere = "AND ({$d1} IN (cc.prod_cl_id, cc.prod_cl_id_2))";
} elseif ($d2 > 0) {
$variantWhere = "AND ({$d2} IN (cc.prod_cl_id, cc.prod_cl_id_2))";
}
$sSql = "
SELECT
ii.prod_name as t,
CONCAT(uu.url_fname, CASE WHEN sl.default = '1' THEN " . ($defLangCode?"sl.lang_code":"''") . " ELSE sl.lang_code END) as u,
cc.prod_price as price,
pp.prod_discount,
pp.prod_discount_value,
att.t_title as c1,
att2.t_title as c2,
img.img_path as img,
cc.id as r_id,
cc.prod_cl_id as cl1,
cc.prod_cl_id_2 as cl2
FROM
mod_products pp
LEFT JOIN mod_products_to_count_and_classificators cc ON
pp.id = cc.prod_id
LEFT JOIN mod_products_info ii ON
pp.id = ii.prod_id
AND ii.lang_id = {$langId}
LEFT JOIN mod_items_attr_translations att ON
att.t_id = cc.prod_cl_id
AND att.t_lang_id = ii.lang_id
LEFT JOIN mod_items_attr_translations att2 ON
att2.t_id = cc.prod_cl_id_2
AND att2.t_lang_id = ii.lang_id
LEFT JOIN site_map_urls uu ON
uu.url_item_id = pp.id
AND uu.url_lang_id = ii.lang_id
LEFT JOIN site_languages sl ON
uu.url_lang_id = sl.id
LEFT JOIN mod_products_images img ON
pp.id = img.prod_id
AND img.img_blocked = '0'
AND img.img_order = 1
WHERE
pp.id = {$pId}
AND pp.prod_disabled = '0'
AND cc.prod_disabled = '0'
{$variantWhere}
AND uu.url_type = 0
ORDER BY
uu.id DESC, cc.id DESC
LIMIT 25
";
$this->db->query($sSql);
return $this->db->getArray();
}
/**
* Function to get delivery options for order
*
* @author Mareks Keišs <keiss.mareks@gmail.com>
* @category pubBuy
* @param array $ids
* @return array of data
* @version 1.1
*/
public function getCartDeliveryOptions($ids){
if(isset($ids['cat']) && count($ids['cat']) == 0)
$ids['cat'] = 0;
if(isset($ids['act']) && count($ids['act']) == 0)
$ids['act'] = 0;
$ids['cat'] = (is_array($ids['cat']) ? implode(',', $ids['cat']) : $ids['cat']);
$ids['act'] = (is_array($ids['act']) ? implode(',', $ids['act']) : $ids['act']);
$sSql = "
SELECT
shops.*
FROM
(
SELECT
'cat' as t, dd.prod_id, dd.shops_id as id
FROM
mod_cat_products_to_shops dd
WHERE
dd.prod_id IN ({$ids['cat']})
/*UNION ALL
SELECT
'act' as t, dd.prod_id, dd.shops_id as id
FROM
mod_products_to_shops dd
WHERE
dd.prod_id IN ({$ids['act']})*/
) shops
LEFT JOIN mod_shops ss ON ss.id = shops.id
WHERE
ss.shop_dummy = '0'
AND ss.shop_disabled = '0'
";
$this->db->query($sSql);
return $this->db->getFieldBasedArray('t', 'prod_id', false, 'id');
}
/**
* Function to get payment & delivery options for order
*
* @author Mareks Keišs <keiss.mareks@gmail.com>
* @category pubBuy
* @param array $ids - product ids
* @return array of data
* @version 1.1
*/
public function getCartPaymentAndDeliveryOptions($ids){
$ids = (!!$ids && count($ids) ? implode(',', $ids) : '0');
$sSql = "
SELECT
mp.id as prod_id,
cc.id,
cc.cl_type as `type`,
cc.cl_name as n
FROM
mod_products mp
LEFT JOIN (
SELECT pp.prod_id, pp.paym_id as cl_id FROM
mod_products_to_payments pp
UNION ALL
SELECT pd.prod_id, pd.dev_id as cl_id FROM
mod_products_to_delivery pd
) prod ON
mp.id = prod.prod_id
LEFT JOIN mod_classificators cc ON
cc.id = prod.cl_id
WHERE
mp.id IN ({$ids})
AND (cc.cl_blocked = '0' OR ISNULL(cc.id))
order by
cc.id
";
$this->db->query($sSql);
return $this->db->getFieldBasedArrayFieldsAdv(array('prod_id', 'type', 'id'), 'n');
}
/**
* Function to get payment translation data for order
*
* @author Mareks Keišs <keiss.mareks@gmail.com>
* @category pubBuy
* @param array $ids - shop ids
* @param int $langId - language id
* @return array of data
* @version 1.1
*/
public function getPaymentData($ids, $langId){
$ids = (is_array($ids) ? implode(',', $ids) : $ids);
if(!!$ids){
$sSql = "
SELECT
cc.id,
cc.cl_name as `key`,
ccl.cl_value as title
FROM
mod_classificators cc
LEFT JOIN mod_classificators_translations ccl ON
ccl.cl_id = cc.id
AND ccl.cl_lang_id = {$langId}
WHERE
cc.cl_blocked = '0'
AND cc.id IN ({$ids})
ORDER
BY cc.cl_order
";
$this->db->query($sSql);
return $this->db->getFieldBasedArray('id');
}
}
/**
* Function to check all product availability
*
* @author Mareks Keišs <keiss.mareks@gmail.com>
* @category APP pubBuy
* @param array $ids - array of cart ids or specific id
* @return array of data
* @version 1.1
*/
public function getProdCount($ids){
if(!isset($ids['cat']) || isset($ids['cat']) && count($ids['cat']) == 0)
$ids['cat'] = 0;
if(!isset($ids['act']) || isset($ids['act']) && count($ids['act']) == 0)
$ids['act'] = 0;
$ids['cat'] = (is_array($ids['cat']) ? implode(',', $ids['cat']) : $ids['cat']);
$ids['act'] = (is_array($ids['act']) ? implode(',', $ids['act']) : $ids['act']);
$sSql = "
/*SELECT
'act' as t, pp.prod_id, '0,0' as division, pp.prod_count, pp.prod_available
FROM
view_product_bought pp
WHERE
pp.prod_id IN ({$ids['act']})
UNION ALL*/
SELECT
'cat' as t, pp.prod_id, CONCAT(pp.prod_cl_id,',',pp.prod_cl_id_2) as division, pp.prod_sold, pp.prod_available
FROM
view_product_count pp
WHERE
pp.prod_id IN ({$ids['cat']})
";
$this->db->query($sSql);
return $this->db->getFieldBasedArray('t', 'prod_id', false);
}
/**
* Function to insert different data into db tables by array
*
* @author Mareks Keišs <keiss.mareks@gmail.com>
* @category pubBuy
* @param string $sTableName - table name
* @param array $oData - data to insert
* @return array of data
* @version 1.1
*/
public function insertDataIntoDbTable($sTableName, $oData = array()){
if(strlen($sTableName) && !!$oData)
return $this->db->_queryInsertArray($sTableName, $oData, false, true);
return false;
}
/**
* Function to update data
*
* @author Mareks Keišs <keiss.mareks@gmail.com>
* @category pubBuy
* @param int $order_id - order id
* @param array $vData - data to update
* @return array of data
* @version 1.1
*/
public function updateOrdersData($order_id, $vData = array()){
$this->db->_queryUpdate(self::TABLE_ORDERS, $vData, array('id' => $order_id));
return false;
}
public function getUserOrderHistory(int $userId, int $limit = 50): array
{
$limit = max(1, min(200, $limit));
if ($userId <= 0) {
return [];
}
$sSql = "
SELECT
mo.id,
mo.o_nr,
mo.o_date,
mo.o_mail,
mo.o_payment_met,
mo.o_delivery_met,
mo.o_input_data,
mo.o_modified,
COALESCE(SUM(od.p_count), 0) as items_qty,
COALESCE(SUM(od.p_price * od.p_count), 0) as subtotal,
oa.o_addr_name,
oa.o_addr_lastname,
oa.o_addr_address,
oa.o_addr_city,
oa.o_addr_country,
oa.o_addr_zip,
oa.o_addr_phone
FROM
mod_orders mo
LEFT JOIN mod_orders_data od ON
od.o_id = mo.id
LEFT JOIN mod_orders_addresses oa ON
oa.o_id = mo.id
AND oa.o_type = 0
WHERE
mo.o_user = {$userId}
AND mo.o_deleted = '0'
GROUP BY
mo.id,
mo.o_nr,
mo.o_date,
mo.o_mail,
mo.o_payment_met,
mo.o_delivery_met,
mo.o_input_data,
mo.o_modified,
oa.o_addr_name,
oa.o_addr_lastname,
oa.o_addr_address,
oa.o_addr_city,
oa.o_addr_country,
oa.o_addr_zip,
oa.o_addr_phone
ORDER BY
mo.o_date DESC,
mo.id DESC
LIMIT {$limit}
";
$this->db->query($sSql);
return $this->db->getArray() ?? [];
}
public function assignOrdersToUserByEmail(int $userId, string $email): bool
{
$email = trim($this->db->prepData($email));
if ($userId <= 0 || !strlen($email)) {
return false;
}
return (bool)$this->db->query("
UPDATE
mod_orders
SET
o_user = {$userId}
WHERE
(o_user = 0 OR o_user IS NULL)
AND o_mail = '{$email}'
AND o_deleted = 0
");
}
public function getOrdersInputDataByEmail(string $email): array
{
$email = trim($this->db->prepData($email));
if (!strlen($email)) {
return [];
}
$sSql = "
SELECT
id,
o_input_data
FROM
mod_orders
WHERE
o_mail = '{$email}'
";
$this->db->query($sSql);
return $this->db->getArray() ?? [];
}
/**
* Function to reserve product by id
*
* @author Mareks Keišs <keiss.mareks@gmail.com>
* @category pubBuy
* @param int|bool $order_id - order id to
* @param array $order - base order data
* @param array $delivery - order delivery data
* @param array $receipt - order receipt data
* @param array $products - order details
* @return array of data
* @version 1.1
*/
public function reserveProduct(&$order_id = false, $order = array(), $delivery = array(), $receipt = array(), $products = array()){
if(!!$order && !!$delivery){
if($order_id){
// Existing order - update data
$this->db->_queryUpdate(self::TABLE_ORDERS, $order, array('id' => $order_id));
$this->db->_queryUpdate(self::TABLE_ORDERS_DELIVERY, $delivery, array('order_id' => $order_id), true);
if(!!($receipt)){
$this->db->_queryUpdate(self::TABLE_ORDERS_RECEIPTS, array('rec_status' => '2'), array('order_id' => $order_id, 'rec_status' => '0'), true);
$this->db->_queryInsert(self::TABLE_ORDERS_RECEIPTS, $receipt);
}
if(!!($products)){
$this->db->_queryDelete(self::TABLE_ORDERS_DATA, array('order_id' => $order_id));
$this->db->_queryInsertArray(self::TABLE_ORDERS_DATA, $products);
}
return $order_id;
}else{
// New order
if($order_id = $this->db->_queryInsert(self::TABLE_ORDERS, $order)){
$this->db->_queryInsert(self::TABLE_ORDERS_DELIVERY, $delivery, false, true);
if(!!($receipt))
$this->db->_queryInsert(self::TABLE_ORDERS_RECEIPTS, $receipt);
if(!!($products))
$this->db->_queryInsertArray(self::TABLE_ORDERS_DATA, $products);
return $order_id;
}
}
}
return false;
}
/**
* Function to get row from custom table
*
* @author Mareks Keišs <keiss.mareks@gmail.com>
* @category pubBuy
* @param string $table - table from which to select data
* @param array $where - data for query construction
* @return array of row data
* @version 1.1
*/
public function getRowDataByTable($table, $where)
{
return $this->db->_querySelectRow($table, false, $where);
}
/**
* Function to get receipt data for bill pdf generation
*
* @author Mareks Keišs <keiss.mareks@gmail.com>
* @category pubBuy
* @param int $receipt_Id
* @param int $lang_id
* @return array of data
* @version 1.1
*/
public function getOrderDataForReceipt($receipt_Id, $lang_id){
if($receipt_Id){
$order = array();
if($order['receipt'] = $this->getRowDataByTable(self::TABLE_ORDERS_RECEIPTS, array('rec_nr' => $receipt_Id))){
$order['order'] = $this->getRowDataByTable(self::TABLE_ORDERS, array('id' => $order['receipt']['order_id']));
$order['delivery'] = $this->getRowDataByTable(self::TABLE_ORDERS_DELIVERY, array('order_id' => $order['receipt']['order_id']));
$sSql = "
SELECT
pp.*,
COALESCE(ct.cl_value) as cl_1, COALESCE(ct2.cl_value, '') as cl_2,
ci.prod_name as prod_name,
cp.prod_nr as prod_nr
/*CASE WHEN pp.prod_type = '0' THEN ai.prod_name ELSE ci.prod_name END as prod_name,
CASE WHEN pp.prod_type = '0' THEN ap.prod_nr ELSE cp.prod_nr END as prod_nr*/
FROM
mod_orders_data pp
LEFT JOIN mod_cat_products_info ci ON
ci.prod_id = pp.prod_id
AND ci.lang_id = {$lang_id}
AND pp.prod_type = '1'
LEFT JOIN mod_cat_products cp ON
cp.id = ci.prod_id
/*LEFT JOIN mod_products_info ai ON
ai.prod_id = pp.prod_id
AND ai.lang_id = {$lang_id}
AND pp.prod_type = '0'
LEFT JOIN mod_products ap ON
ap.id = ai.prod_id*/
LEFT JOIN view_classificator_translations ct ON
ct.id = pp.prod_cl_id
AND ct.lang_id = {$lang_id}
LEFT JOIN view_classificator_translations ct2 ON
ct2.id = pp.prod_cl_id_2
AND ct2.lang_id = {$lang_id}
WHERE
pp.order_id = {$order['receipt']['order_id']}
";
//$order['products'] = $this->db->_querySelect(self::TABLE_ORDERS_DATA, false, array('order_id' => $order['receipt']['order_id']));
$this->db->query($sSql);
$order['products'] = $this->db->getArray();
}
return $order;
}
return false;
}
/**
* Function to update order reservation status by receipt nr
*
* @author Mareks Keišs <keiss.mareks@gmail.com>
* @category pubBuy
* @param string $recNr
* @return array of data
* @version 1.1
*/
public function updOrderReservationById($recNr){
if($recNr){
$sSql = "
UPDATE
mod_orders oo, mod_orders_receipts rr
SET
oo.order_res = '0', oo.order_res_till = 0
where
rr.rec_nr = '{$recNr}'
AND oo.id = rr.order_id
";
return $this->db->query($sSql);
}
}
/**
* Function to get receipt row data
*
* @author Mareks Keišs <keiss.mareks@gmail.com>
* @category pubBuy
* @param string $recNr
* @return array of data
* @version 1.1
*/
public function getReceiptByNr($recNr)
{
return $this->db->_querySelectRow('mod_orders_receipts', false, ['rec_nr' => $recNr]);
}
public function updReceiptByReceiptNr($recNr, $data): bool
{
return $this->db->_queryUpdate('mod_orders_receipts', $data, ['rec_nr' => $recNr]);
}
/**
* Function to update order data by id
*
* @author Mareks Keišs <keiss.mareks@gmail.com>
* @category pubBuy
* @param int $id - order id
* @param array $data - data to store
* @return bool of data
* @version 1.1
*/
public function updOrderById($id, $data): bool
{
return $this->db->_queryUpdate('mod_orders', $data, ['id' => $id]);
}
/**
* Function to get all cart data for new payment attempt
*
* @author Mareks Keišs <keiss.mareks@gmail.com>
* @category pubBuy
* @param int $orderId - order id
* @return array of data
* @version 1.1
*/
public function reloadCartContentByRecId($orderId){
if($orderId){
$d = array();
$sSql = "
SELECT
CASE WHEN dd.prod_type = '0' THEN 'act' ELSE 'cat' END as typeK,
dd.prod_count as `count`,
dd.prod_id,
CONCAT(dd.prod_cl_id, ',', dd.prod_cl_id_2) as t
FROM
mod_orders_data dd
WHERE
dd.order_id = {$orderId}
";
$this->db->query($sSql);
$d['cart'] = $this->db->getFieldBasedArray('typeK', 'prod_id', false);
$sSql = "
SELECT
dd.prod_delivery_json
FROM
mod_orders_delivery dd
WHERE
dd.order_id = {$orderId}
";
$this->db->query($sSql);
$d['inp'] = json_decode($this->db->getOne(), true);
return $d;
}
return false;
}
/**
* Function to check if order payment has failed
*
* @author Mareks Keišs <keiss.mareks@gmail.com>
* @category pubBuy
* @param string $recNr - receipt nr
* @return array of data
* @version 1.1
*/
public function chkOrderFailed($recNr){
if($recNr){
$sSql = "
SELECT
rr.order_id
FROM
mod_orders_receipts rr
WHERE
rr.rec_nr = '{$recNr}'
AND rr.rec_status = '0'
AND rr.rec_type <> " . pubBuyController::PMET_OTHER_E . "
";
$this->db->query($sSql);
return $this->db->getOne();
}
return false;
}
/**
* Function to get order receipt info for
*
* @author Mareks Keišs <keiss.mareks@gmail.com>
* @category pubBuy
* @param string $recNr - receipt nr
* @return array of data
* @version 1.1
*/
public function getOrderDataForReceiptMail($recNr){
if($recNr){
$sSql = "
SELECT
dd.prod_delivery_json
FROM
mod_orders_receipts rr
LEFT JOIN mod_orders_delivery dd ON
dd.order_id = rr.order_id
WHERE
rr.rec_nr = '{$recNr}'
";
$this->db->query($sSql);
return cJSON::decode($this->db->getOne(), true);
}
return false;
}
/**
* Function to get order receipt info for
*
* @author Mareks Keišs <keiss.mareks@gmail.com>
* @category pubBuy
* @param string $recNr - receipt nr
* @return false|array of data
* @version 1.1
*/
public function getPageBackPaymentData(string $recNr): array
{
if ($recNr) {
$sSql = "
SELECT
rr.rec_nr as order_nr,
rr.rec_value as order_sum,
rec_type
FROM
mod_orders_receipts rr
WHERE
rr.rec_nr = '{$recNr}'
";
$this->db->query($sSql);
return $this->db->getRow();
}
return false;
}
public function getClassificatorDataById(int $id): array
{
$sSql = "
SELECT
id,
cl_name as n,
cl_data as d
FROM
mod_classificators
WHERE
cl_type = {$id}
AND cl_blocked = '0'
ORDER BY
cl_order ASC, cl_name ASC
";
$this->db->query($sSql);
return $this->db->getFieldBasedArrayFieldsAdv(['id'], ['n', 'd']) ?? [];
}
/**
* Function to get next deleted order nr and reserve it
*
* @author Aivars Zukovskis <mareks.zukovskis@gmail.com>
* @category cmsOrders Module
* @return bool|string
* @version 1.1
*/
public function getNextDeletedOrderNr()
{
$nr = $this->db->_querySelectOne('mod_orders_deleted_nr', ['order_nr'], ['reserved' => 0], ['id' => 'ASC']);
if (strlen($nr)) {
$this->db->_queryUpdate('mod_orders_deleted_nr', ['reserved' => 1], ['order_nr' => $nr]);
}
return $nr;
}
public function deleteReservedOrderNr(string $sOrderNr): bool
{
return $this->db->_queryDelete('mod_orders_deleted_nr', ['reserved' => 1, 'order_nr' => $sOrderNr]);
}
}