bebeboutik/modules/product_vouchers/productvouchers.php
Srv Bebeboutik 6c0978166c add modules
2016-01-04 12:49:26 +01:00

402 lines
13 KiB
PHP
Executable File

<?php
require_once _PS_ROOT_DIR_.'/modules/privatesales/Sale.php';
class ProductVouchers {
const AVAILABLE = 1;
const ACTIVE = 2;
const REFUND = 3;
const INACTIVE = 4;
public static function getProductVoucher($id_product_voucher, $full=TRUE) {
$product_voucher = Db::getInstance()->getRow('
SELECT *
FROM `'._DB_PREFIX_.'product_voucher`
WHERE `id_product_voucher` = '.(int) $id_product_voucher.'
');
if($full) {
$languages = Language::getLanguages(FALSE);
$languages_fields = array();
foreach($languages as $lang) {
$result_lang = Db::getInstance()->getRow('
SELECT `mail`, `objet`
FROM `'._DB_PREFIX_.'product_voucher_lang`
WHERE `id_product_voucher` = '.(int) $id_product_voucher.'
AND `id_lang` = '.(int) $lang['id_lang'].'
');
$product_voucher['mail_object'][(int) $lang['id_lang']] = $result_lang['objet'];
$product_voucher['mail'][(int) $lang['id_lang']] = $result_lang['mail'];
}
}
return $product_voucher;
}
public static function createProductVoucher($name, $product_id, $active=0, $mail_object, $mail, $max_vouchers=-1) {
$already_associate = self::testProductIdExists($product_id);
if(!$already_associate) {
$data = Db::getInstance()->autoExecute(_DB_PREFIX_.'product_voucher', array(
'name' => pSQL($name),
'product_id' => (int) $product_id,
'active' => (int) $active,
'max_vouchers' => (int) $max_vouchers,
), 'INSERT');
if($data) {
$id_product_voucher = Db::getInstance()->Insert_ID();
$languages = Language::getLanguages(FALSE);
foreach($languages as $lang) {
Db::getInstance()->Execute('
INSERT INTO `'._DB_PREFIX_.'product_voucher_lang` (`id_product_voucher`,`objet`, `mail`, `id_lang`)
VALUES(
'.(int) $id_product_voucher.',
"'.pSQL($mail_object[(int) $lang['id_lang']]).'",
"'.pSQL($mail[(int) $lang['id_lang']], TRUE).'",
'.(int) $lang['id_lang'].'
)
');
}
return $id_product_voucher;
}
}
return FALSE;
}
public static function editProductVoucher($id_product_voucher, $name, $product_id, $active, $mail_object, $mail, $max_vouchers=-1) {
Db::getInstance()->autoExecute(_DB_PREFIX_.'product_voucher', array(
'name' => pSQL($name),
'active' => (int) $active,
'product_id' => (int) $product_id,
'max_vouchers' => (int) $max_vouchers,
), 'UPDATE', 'id_product_voucher = '.(int) $id_product_voucher);
$languages = Language::getLanguages(FALSE);
foreach($languages as $key => $lang) {
Db::getInstance()->Execute('
UPDATE `'._DB_PREFIX_.'product_voucher_lang`
SET `objet` = "'.pSQL($mail_object[$lang['id_lang']]).'",
`mail` = "'.pSQL($mail[$lang['id_lang']], TRUE).'"
WHERE `id_product_voucher` = '.(int) $id_product_voucher.'
AND `id_lang` = '.(int) $lang['id_lang'].'
');
}
return TRUE;
}
public static function testProductIdExists($product_id) {
return (bool) Db::getInstance()->getValue('
SELECT `id_product_voucher`
FROM `'._DB_PREFIX_.'product_voucher`
WHERE `product_id` = '.(int) $product_id.'
');
}
public static function associateVouchers($id_product_voucher, $code) {
return (bool) Db::getInstance()->autoExecute(_DB_PREFIX_.'product_voucher_item', array(
'id_product_voucher' => (int) $id_product_voucher,
'code' => pSQL($code),
'id_order' => 0,
'statut' => self::AVAILABLE,
), 'INSERT');
}
public static function getProductVoucherItems($id_product_voucher, $total=FALSE, $statut=0) {
if($total) {
return Db::getInstance()->getValue('
SELECT COUNT(`code`) as `numb`
FROM `'._DB_PREFIX_.'product_voucher_item`
WHERE `id_product_voucher` = '.(int) $id_product_voucher.'
'.($statut != 0? 'AND `statut` = '.(int) $statut: '').'
');
} else {
return Db::getInstance()->executeS('
SELECT *
FROM `'._DB_PREFIX_.'product_voucher_item`
WHERE `id_product_voucher` = '.(int) $id_product_voucher.'
'.($statut != 0? 'AND `statut` = '.(int) $statut: '').'
');
}
}
public static function getExportProduct($id_product_voucher, $statut) {
$vouchers = ProductVouchers::getProductVoucherItems($id_product_voucher, FALSE, (int) $statut);
foreach($vouchers as $key => $voucher) {
if($voucher['id_order'] != 0) {
$result = Db::getInstance()->getRow('
SELECT c.`id_customer`, c.`email`, o.`date_add`
FROM `'._DB_PREFIX_.'customer` c
LEFT JOIN `'._DB_PREFIX_.'orders` o ON c.`id_customer` = o.`id_customer`
WHERE o.`id_order` = '.(int) $voucher['id_order'].'
');
$vouchers[$key]['id_customer'] = $result['id_customer'];
$vouchers[$key]['email'] = $result['email'];
$vouchers[$key]['date_add'] = $result['date_add'];
} else {
$vouchers[$key]['id_customer'] = '';
$vouchers[$key]['email'] = '';
$vouchers[$key]['date_add'] = '';
}
}
return $vouchers;
}
public static function getVouchersCodeByOrder($id_order) {
return Db::getInstance()->executeS('
SELECT i.`code`, i.`statut`, v.`product_id`
FROM `'._DB_PREFIX_.'product_voucher_item` i
LEFT JOIN `'._DB_PREFIX_.'product_voucher` v
ON i.`id_product_voucher` = v.`id_product_voucher`
WHERE `id_order` = '.(int) $id_order.'
');
}
public static function getProductEligibleForOrder($id_order) {
return Db::getInstance()->executeS('
SELECT od.`product_id`, od.`product_quantity`, p.`id_product_voucher`
FROM `'._DB_PREFIX_.'order_detail` od
RIGHT JOIN `'._DB_PREFIX_.'product_voucher` p
ON p.`product_id` = od.`product_id`
WHERE p.`active` = 1
AND od.`id_order` ='.(int) $id_order.'
');
}
public static function associateCodeToOrder($id_product_voucher, $quantity, $id_order) {
for($i = 1; $i <= (int) $quantity; $i++) {
Db::getInstance()->Execute('
UPDATE `'._DB_PREFIX_.'product_voucher_item`
SET `id_order` = '.(int) $id_order.', `statut` = '.(int) self::ACTIVE.'
WHERE `id_order` = 0
AND `id_product_voucher` = '.(int) $id_product_voucher.'
LIMIT 1
');
$code = self::getCodeToSend($id_product_voucher, $id_order);
if (!empty($code)) {
self::sendMail($id_product_voucher, $id_order, $code);
} else {
// ALERT ! = Send mail (aucun bon dispo)
mail('thibault@antadis.com', 'bon produit indisponible', 'Aucun bon disponible pour une commande '. (int) $id_product_voucher);
return FALSE;
}
}
}
public static function getCodeToSend($id_product_voucher, $id_order) {
return Db::getInstance()->getValue('
SELECT `code`
FROM `'._DB_PREFIX_.'product_voucher_item` i
LEFT JOIN `'._DB_PREFIX_.'product_voucher` v
ON v.`id_product_voucher` = i.`id_product_voucher`
WHERE i.`id_product_voucher` = '.(int)$id_product_voucher.'
AND `id_order` = '.(int)$id_order.'
ORDER BY i.`id_product_voucher_item` DESC
');
}
public static function getCodeAvailable($id_product_voucher, $id_order=0) {
return Db::getInstance()->getRow('
SELECT i.`id_product_voucher`, `code`
FROM `'._DB_PREFIX_.'product_voucher_item` i
LEFT JOIN `'._DB_PREFIX_.'product_voucher` v
ON v.`id_product_voucher` = i.`id_product_voucher`
WHERE i.`id_product_voucher` = '.(int) $id_product_voucher.'
AND `id_order` = '.$id_order.'
');
}
public static function getQuantityRefundbyProduct($id_order) {
return Db::getInstance()->executeS('
SELECT `product_id`, `product_quantity`, `product_quantity_refunded`
FROM `'._DB_PREFIX_.'order_detail`
WHERE `id_order` ='.(int) $id_order.'
');
}
public static function refundCode($product_id, $id_order, $quantity) {
foreach(Db::getInstance()->executeS('
SELECT `id_product_voucher_item` as item
FROM `'._DB_PREFIX_.'product_voucher_item` i
LEFT JOIN `'._DB_PREFIX_.'product_voucher` v
ON i.`id_product_voucher` = v.`id_product_voucher`
WHERE i.`id_order` = '.(int) $id_order.'
AND v.`product_id` = '.(int) $product_id.'
LIMIT '.(int) $quantity.'
') as $item) {
Db::getInstance()->Execute('
UPDATE `'._DB_PREFIX_.'product_voucher_item`
SET `statut` = '.self::REFUND.'
WHERE `id_product_voucher_item` = '.(int) $item['item'].'
');
}
}
public static function refundOrder($id_order) {
Db::getInstance()->Execute('
UPDATE `'._DB_PREFIX_.'product_voucher_item`
SET `statut` = '.self::REFUND.'
WHERE `id_order` = '.(int) $id_order.'
');
}
public static function deleteProductVoucher($id_product_voucher) {
if(!Db::getInstance()->Execute('
DELETE FROM `ps_product_voucher`
WHERE `id_product_voucher` = '.(int) $id_product_voucher.'
')) {
return FALSE;
}
if(!Db::getInstance()->Execute('
DELETE FROM `ps_product_voucher_lang`
WHERE `id_product_voucher` = '.(int) $id_product_voucher.'
')) {
return FALSE;
}
if(!Db::getInstance()->Execute('
DELETE FROM `ps_product_voucher_item`
WHERE `id_product_voucher` = '.(int) $id_product_voucher.'
')) {
return FALSE;
}
return TRUE;
}
public static function getDataMailByProductVoucher($id_product_voucher, $id_lang) {
return Db::getInstance()->getRow('
SELECT `objet`, `mail`
FROM `'._DB_PREFIX_.'product_voucher_lang`
WHERE `id_product_voucher` = '.(int) $id_product_voucher.'
AND `id_lang` ='.(int) $id_lang.'
');
}
public static function sendMail($id_product_voucher, $id_order, $code) {
global $cookie;
$vouchers = self::getDataMailByProductVoucher($id_product_voucher, (int) $cookie->id_lang);
if(!empty($vouchers)) {
$order = new Order($id_order);
$customer = new Customer((int) $order->id_customer);
$contenu_mail = str_replace("%bon%", $code, $vouchers['mail']);
$contenu_mail = str_replace("%nom%", $customer->lastname, $contenu_mail);
$contenu_mail = str_replace("%prenom%", $customer->firstname, $contenu_mail);
$data = self::getProductVoucher((int) $id_product_voucher, FALSE);
$product = new Product($data['product_id'], FALSE, (int) $cookie->id_lang);
$sale = Sale::getSaleFromCategory((int) $product->id_category_default);
$send = Mail::Send(
$cookie->id_lang,
'product_voucher',
$vouchers['objet'],
array(
'{id_sale}' => (int) $sale->id,
'{message}' => $contenu_mail
),
$customer->email,
$customer->firstname.' '.$customer->lastname,
(string) Configuration::get('PS_SHOP_EMAIL'),
(string) Configuration::get('PS_SHOP_NAME'),
NULL,
NULL,
dirname(__FILE__).'/mails/'
);
}
}
/**
* Récupère le nombre de bons achetés
* @param int $id_product_voucher : id du bon produit
* @param int|Customer|null $customer : client
* @return int
*/
public static function getVouchersByMember($id_product_voucher, $customer=NULL) {
if(!$customer) {
global $cookie;
$customer = $cookie->id_customer;
}
$customer = ($customer instanceof Customer)? $customer->id: $customer;
$orders = array();
foreach(Db::getInstance()->executeS('
SELECT `id_order`
FROM `'._DB_PREFIX_.'orders`
WHERE `id_customer` = '.(int) $customer.'
') as $row) {
$orders[] = (int) $row['id_order'];
}
return (int) Db::getInstance()->getValue('
SELECT COUNT(`id_product_voucher_item`)
FROM `'._DB_PREFIX_.'product_voucher_item`
WHERE `id_product_voucher` = '.(int) $id_product_voucher.'
AND `id_order` IN ('.implode(', ', $orders).')
AND `statut` =' . self::ACTIVE
);
}
/**
* Récupère le nomdre de bons produits maximum par utilisateur
* @param int $id_product_voucher : id du bon produit
* @return int
*/
public static function getMaxAllowedVouchers($id_product_voucher) {
return (int) Db::getInstance()->getValue('
SELECT `max_vouchers`
FROM `'._DB_PREFIX_.'product_voucher`
WHERE `id_product_voucher` = '.(int) $id_product_voucher.'
');
}
/**
* Teste si l'utilisateur peut commander un bon produit en effectuant les calculs suivants :
* - Bons déjà commandés + quantité souhaitée <= Nombre de bons autorisés par client
* - Bons déjà dans le panier + quantité souhaitée <= Nombre de bons autorisés par client
* @param int $id_product_voucher : id du bon produit
* @param int $quantity : quantité souhaitée
* @param Cookie $cookie : objet cookie, permettant de récupérer panier et client
* @return bool
*/
public static function canOrderVoucher($id_product_voucher, $quantity, $cookie) {
$voucher = self::getProductVoucher($id_product_voucher);
$customerVouchers = self::getVouchersByMember($id_product_voucher, (int) $cookie->id_customer);
$maxVouchers = self::getMaxAllowedVouchers($id_product_voucher);
$currentCart = new Cart((int) $cookie->id_cart);
$cartProducts = $currentCart->containsProduct((int) $voucher['product_id'], 0, NULL);
return ($maxVouchers === 0) || (
($customerVouchers + $quantity + $cartProducts['quantity'] <= $maxVouchers)
&& ((int) $cartProducts['quantity'] + $quantity <= $maxVouchers)
);
}
/**
* Récupère un bon à partir d'un id de produit
* @param int $id_product
* @return int
*/
public static function getVoucherFromProduct($id_product) {
return (int) Db::getInstance()->getValue('
SELECT `id_product_voucher`
FROM `'._DB_PREFIX_.'product_voucher`
WHERE `product_id` = '.(int) $id_product.'
');
}
}