1632 lines
62 KiB
PHP
1632 lines
62 KiB
PHP
<?php
|
|
/**
|
|
* Data manipulation for the model
|
|
*/
|
|
class ShopModel{
|
|
const PACKAGE_TYPES = [
|
|
'ID_STANDARD_TYPE' => 1,
|
|
'ID_OPTION_TYPE' => 2,
|
|
'ID_ADDITONAL_TYPE' => 3
|
|
];
|
|
|
|
const DOCUMENT_TYPES = [
|
|
'ID_TEMPLATE_QUESIONNAIRE' => 1,
|
|
'ID_CUSTOMER_QUESTIONNAIRE' => 2,
|
|
'ID_TEMPLATE_AGREEMENT' => 6
|
|
];
|
|
|
|
const PRODUCT_CATEGORIES = [
|
|
'ITEMS' => 1,
|
|
'INSTALLATION' => 2
|
|
];
|
|
|
|
private function getPricesForPackages($idCommercialLead, $idPackage, $type){
|
|
global $database, $user;
|
|
$data = [];
|
|
$whereSql = "";
|
|
$extraJoin = "";
|
|
|
|
if($type === self::PACKAGE_TYPES['ID_STANDARD_TYPE']){
|
|
$whereSql = "AND plcl.idPackage=$idPackage";
|
|
}
|
|
|
|
if($type === self::PACKAGE_TYPES['ID_OPTION_TYPE']){
|
|
$whereSql = "AND pog.idPackage=$idPackage";
|
|
$extraJoin = "INNER JOIN ".TABLES['rel_group_options']." rgo
|
|
ON rgo.idOptionPackage=plcl.idPackage
|
|
INNER JOIN ".TABLES['package_option_groups']." pog
|
|
ON pog.id=rgo.idGroup";
|
|
}
|
|
|
|
if($type === self::PACKAGE_TYPES['ID_ADDITONAL_TYPE']){
|
|
$whereSql = "AND rap.idPackage=$idPackage";
|
|
$extraJoin = " INNER JOIN ".TABLES['rel_additional_packages']." rap
|
|
ON rap.idAdditionalPackage=plcl.idPackage";
|
|
}
|
|
|
|
$sql = "SELECT
|
|
plcl.id as idPrice,
|
|
plb.idPackage,
|
|
plb.idPaymentType,
|
|
pt.payType,
|
|
pt.packagePayPeriod,
|
|
pt.servicesContractPeriod,
|
|
pt.periodUnit,
|
|
pt.maxContractPeriod,
|
|
(plcl.fixedExtra + plb.minimalFixedPrice) AS fixedExtra,
|
|
(plcl.recurentExtra + plb.minimalRecurentPrice) AS recurentExtra,
|
|
(plcl.servicesExtra + plb.minimalServicesPrice) AS servicesExtra,
|
|
plb.minimalServicesPrice as servicePrice
|
|
FROM ".TABLES['price_list_broker']." plb
|
|
INNER JOIN
|
|
(SELECT
|
|
plcl.idPackage,
|
|
plcl.idPaymentType,
|
|
plcl.idCommercialLead,
|
|
MAX(IFNULL(idCustomer, 0)) AS idCustomer
|
|
FROM
|
|
".TABLES['price_list_commercial_lead']." plcl
|
|
$extraJoin
|
|
LEFT OUTER JOIN ".TABLES['customers']." cust
|
|
ON cust.id = plcl.idCustomer
|
|
WHERE
|
|
(cust.idUser = ".$user->getUserId()." OR cust.idUser IS NULL)
|
|
$whereSql
|
|
AND plcl.idCommercialLead=$idCommercialLead
|
|
GROUP BY plcl.idPackage , plcl.idPaymentType
|
|
) AS custom_prices
|
|
ON plb.idPackage = custom_prices.idPackage
|
|
AND plb.idPaymentType = custom_prices.idPaymentType
|
|
INNER JOIN ".TABLES['price_list_commercial_lead']." plcl
|
|
ON plcl.idPackage = custom_prices.idPackage
|
|
AND plcl.idPaymentType = custom_prices.idPaymentType
|
|
AND plcl.idCommercialLead = custom_prices.idCommercialLead
|
|
AND IFNULL(plcl.idCustomer, 0) = custom_prices.idCustomer
|
|
AND plcl.visibleToCustomer = 1
|
|
INNER JOIN ".TABLES['payment_types']." pt
|
|
ON pt.id = plb.idPaymentType";
|
|
|
|
$query = $database->query($sql);
|
|
while($row = $database->fetchArray($query)){
|
|
$data[$row['idPackage']][] = $row;
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
|
|
private function getCommercialLeadInfo($idCommercialLead){
|
|
global $database;
|
|
|
|
$sql = "SELECT
|
|
cl.name,
|
|
cl.mail,
|
|
cl.phone
|
|
FROM ".TABLES['commercial_leads']." cl
|
|
WHERE cl.id=$idCommercialLead
|
|
";
|
|
|
|
return $database->fetchResultArray($sql);
|
|
}
|
|
|
|
public function getShopPackages($idCommercialLead, $idPackage = 0, $search = ''){
|
|
global $database, $user;
|
|
|
|
$whereSql = "WHERE p.status='available' AND p.idPackageType=".self::PACKAGE_TYPES['ID_STANDARD_TYPE']." ";
|
|
$search = $database->escapeValue($search);
|
|
|
|
if($idPackage !== 0){
|
|
$whereSql .= " AND p.id=$idPackage";
|
|
}
|
|
|
|
if($search !== ''){
|
|
$searchValues = explode(' ', $search);
|
|
$packageCondition = '';
|
|
$descriptionCondition = '';
|
|
$referenceCondition = '';
|
|
$countryCondition = '';
|
|
foreach ($searchValues as $valueToSearch) {
|
|
if($valueToSearch !== ''){
|
|
$packageCondition .= "p.name like '%".$valueToSearch."%'"." OR ";
|
|
$descriptionCondition .= " p.description like '%".$valueToSearch."%'"." OR ";
|
|
$referenceCondition .= "p.reference='".$valueToSearch."' OR ";
|
|
$countryCondition .= "c.name='".$valueToSearch."' OR ";
|
|
}
|
|
}
|
|
$countryCondition = rtrim($countryCondition, ' OR ');
|
|
$whereSql .= " AND ( $packageCondition
|
|
$descriptionCondition
|
|
$referenceCondition
|
|
$countryCondition)";
|
|
}
|
|
|
|
$sql = "SELECT
|
|
p.id AS idPackage,
|
|
p.reference,
|
|
p.name,
|
|
p.description AS shortDescription,
|
|
price_selection.idCommercialLead,
|
|
c.name AS country,
|
|
c.code AS countryCode
|
|
FROM
|
|
".TABLES['packages']." p
|
|
INNER JOIN
|
|
".TABLES['countries']." c ON c.id = p.idCountry
|
|
INNER JOIN ".TABLES['rel_package_processes']." rpp
|
|
ON rpp.idPackage=p.id
|
|
INNER JOIN
|
|
(SELECT
|
|
idPackage,
|
|
plcl.idPaymentType,
|
|
plcl.idCommercialLead,
|
|
MAX(IFNULL(idCustomer, 0)) AS idCustomer
|
|
FROM
|
|
".TABLES['price_list_commercial_lead']." plcl
|
|
LEFT OUTER JOIN ".TABLES['customers']." cust
|
|
ON cust.id = plcl.idCustomer
|
|
WHERE
|
|
(cust.idUser = ".$user->getUserId()." OR cust.idUser IS NULL)
|
|
AND plcl.idCommercialLead = $idCommercialLead
|
|
GROUP BY plcl.idPackage , plcl.idPaymentType
|
|
) AS price_selection
|
|
ON price_selection.idPackage = p.id
|
|
INNER JOIN ".TABLES['price_list_commercial_lead']." plcl
|
|
ON plcl.idPackage = price_selection.idPackage
|
|
AND plcl.idPaymentType = price_selection.idPaymentType
|
|
AND plcl.idCommercialLead = price_selection.idCommercialLead
|
|
AND IFNULL(plcl.idCustomer, 0) = price_selection.idCustomer
|
|
AND plcl.visibleToCustomer = 1
|
|
$whereSql
|
|
GROUP BY p.id
|
|
ORDER BY p.id DESC";
|
|
|
|
$data = [];
|
|
$query = $database->query($sql);
|
|
while($row = $database->fetchArray($query)){
|
|
if(strlen($row['shortDescription']) > 300 && $idPackage === 0){
|
|
$row['shortDescription'] = substr($row['shortDescription'], 0, 300) . '...';
|
|
}
|
|
$data[] = $row;
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* get package options
|
|
* @param INT $idPackage id for the pacakge
|
|
* @param INT $idCommercialLead id for the comemrcial lead
|
|
* @return HashArray list of option packages grouped by group id
|
|
*/
|
|
private function getPackageOptions($idPackage, $idCommercialLead){
|
|
global $database;
|
|
$data = [];
|
|
|
|
$packageOptionPrices = $this->getPricesForPackages($idCommercialLead, $idPackage, self::PACKAGE_TYPES['ID_OPTION_TYPE']);
|
|
|
|
$sql = "SELECT
|
|
rgo.idOptionPackage,
|
|
p.name AS optionName,
|
|
rgo.isDefault,
|
|
pog.id AS idGroup,
|
|
pog.name AS groupName
|
|
FROM ".TABLES['package_option_groups']." pog
|
|
INNER JOIN ".TABLES['rel_group_options']." rgo
|
|
ON rgo.idGroup=pog.id
|
|
INNER JOIN ".TABLES['packages']." p
|
|
ON p.id=rgo.idOptionPackage
|
|
WHERE pog.idPackage=$idPackage";
|
|
$query = $database->query($sql);
|
|
while($row = $database->fetchArray($query)){
|
|
$idGroup = $row['idGroup'];
|
|
$data[$idGroup]['idGroup'] = $row['idGroup'];
|
|
unset($row['idGroup']);
|
|
$data[$idGroup]['groupName'] = $row['groupName'];
|
|
unset($row['groupName']);
|
|
$row['prices'] = isset($packageOptionPrices[$row['idOptionPackage']]) ? $packageOptionPrices[$row['idOptionPackage']] : [];
|
|
$data[$idGroup]['options'][] = $row;
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* get package documents
|
|
* @param INT $idPackage id for the pacakge
|
|
* @return Array list of documents
|
|
*/
|
|
private function getPackageDocuments($idPackage){
|
|
global $database;
|
|
|
|
$sql = "SELECT
|
|
d.id AS idDocument,
|
|
d.documentName,
|
|
d.extension
|
|
FROM ".TABLES['documents']." d
|
|
INNER JOIN ".TABLES['document_types']." dt
|
|
ON dt.id=d.idDocumentType
|
|
INNER JOIN ".TABLES['rel_package_documents']." rpd
|
|
ON rpd.idDocument=d.id
|
|
WHERE rpd.idPackage=$idPackage ";
|
|
|
|
return $database->fetchResultArray($sql);
|
|
}
|
|
|
|
/**
|
|
* get package additional pacakges
|
|
* @param INT $idPackage id for the pacakge
|
|
* @param INT $idCommercialLead id for the comemrcial lead
|
|
* @return Array list of additonal packages
|
|
*/
|
|
private function getAdditionalPackages($idPackage, $idCommercialLead){
|
|
global $database;
|
|
$data = [];
|
|
|
|
$additionalPackagesPrices = $this->getPricesForPackages($idCommercialLead, $idPackage, self::PACKAGE_TYPES['ID_ADDITONAL_TYPE']);
|
|
$sql = "SELECT
|
|
rap.idAdditionalPackage,
|
|
p.name AS packageName
|
|
FROM ".TABLES['rel_additional_packages']." rap
|
|
INNER JOIN ".TABLES['packages']." p
|
|
ON p.id=rap.idAdditionalPackage
|
|
WHERE rap.idPackage=$idPackage";
|
|
|
|
$query = $database->query($sql);
|
|
while($row = $database->fetchArray($query)){
|
|
$row['prices'] = isset($additionalPackagesPrices[$row['idAdditionalPackage']]) ? $additionalPackagesPrices[$row['idAdditionalPackage']] : [];
|
|
$data[] = $row;
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* get info for a pacakge that can be sold in the co-market
|
|
* @param INT $idCommercialLead id for the commetcial lead
|
|
* @param INT $idPackage id for the package
|
|
* @return HashArray pacakge details(country, prices, info, documents, options, additional package)
|
|
*/
|
|
public function getShopPackageDetails($idCommercialLead, $idPackage){
|
|
global $database, $user;
|
|
$countries = new Countries();
|
|
|
|
$idPackage = $database->escapeValue($idPackage);
|
|
$data = [];
|
|
$data['country'] = $countries->getCurrencyForPackage($idPackage);
|
|
$data['prices'] = $this->getPricesForPackages($idCommercialLead, $idPackage, self::PACKAGE_TYPES['ID_STANDARD_TYPE']);
|
|
$data['prices'] = isset($data['prices'][$idPackage]) ? $data['prices'][$idPackage] : [];
|
|
|
|
if(empty( $data['prices'])){
|
|
return [];
|
|
}
|
|
$data['documents'] = $this->getPackageDocuments($idPackage);
|
|
$shopPackages = $this->getShopPackages($idCommercialLead, $idPackage);
|
|
$data['packageInfo'] = isset($shopPackages[0]) ? $shopPackages[0] : [];
|
|
$commerciaLeads = $this->getCommercialLeadInfo($idCommercialLead);
|
|
$data['commercialLead'] = isset($commerciaLeads[0]) ? $commerciaLeads[0] : [];
|
|
$data['groups'] = $this->getPackageOptions($idPackage, $idCommercialLead);
|
|
$data['additionalPackages'] = $this->getAdditionalPackages($idPackage, $idCommercialLead);
|
|
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* get all commercial leads linked to a customer
|
|
* @return Array list of commercial leads
|
|
*/
|
|
public function getAllCommercialLeads(){
|
|
global $database, $user;
|
|
|
|
$sql = "SELECT rclc.idCommercialLead,
|
|
cl.name as commercialLeadName
|
|
FROM ".TABLES['rel_commercial_lead_customers']." rclc
|
|
INNER JOIN ".TABLES['customers']." c
|
|
ON c.id=rclc.idCustomer
|
|
INNER JOIN ".TABLES['commercial_leads']." cl
|
|
ON cl.id=rclc.idCommercialLead
|
|
WHERE rclc.isLinkEnabled=1 AND c.idUser=" . $user->getUserId();
|
|
|
|
return $database->fetchResultArray($sql);
|
|
}
|
|
|
|
/**
|
|
* get options for items in the cart
|
|
* @return Array list of options grouped by cart id
|
|
*/
|
|
private function getShopCartOption(){
|
|
global $database, $user;
|
|
$data = [];
|
|
$sql = "SELECT
|
|
wscep.idCart,
|
|
p.name AS packageName,
|
|
pog.name AS groupName,
|
|
plb.minimalFixedPrice AS fixedPrice,
|
|
plb.minimalRecurentPrice AS recurrentPrice,
|
|
plb.minimalServicesPrice AS servicesPrice
|
|
FROM ".TABLES['web_shop_cart_extra_packages']." wscep
|
|
INNER JOIN ".TABLES['packages']." p
|
|
ON p.id=wscep.idExtraPackage
|
|
INNER JOIN ".TABLES['web_shop_cart']." wsc
|
|
ON wsc.id=wscep.idCart
|
|
INNER JOIN ".TABLES['rel_group_options']." rgo
|
|
ON rgo.idOptionPackage=wscep.idExtraPackage
|
|
INNER JOIN ".TABLES['package_option_groups']." pog
|
|
ON pog.id=rgo.idGroup
|
|
INNER JOIN ".TABLES['price_list_commercial_lead']." plcl
|
|
ON plcl.id=wsc.idPrice
|
|
LEFT OUTER JOIN ".TABLES['price_list_broker']." plb
|
|
ON plb.idPackage=wscep.idExtraPackage AND plb.idPaymentType=plcl.idPaymentType
|
|
WHERE wsc.idUser=".$user->getUserId();
|
|
$query = $database->query($sql);
|
|
while($row = $database->fetchArray($query)){
|
|
$row['isAvailable'] = !is_null($row['fixedPrice']);
|
|
$data[$row['idCart']]['options'][] = $row;
|
|
if(!isset($data[$row['idCart']]['areOptionsAvailable'])){
|
|
$data[$row['idCart']]['areOptionsAvailable'] = true;
|
|
}
|
|
$data[$row['idCart']]['areOptionsAvailable'] = ($data[$row['idCart']]['areOptionsAvailable'] && $row['isAvailable']);
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
private function getShopCartAdditionalPackages(){
|
|
global $database, $user;
|
|
|
|
$data = [];
|
|
$sql = "SELECT
|
|
wscep.idCart,
|
|
p.name AS packageName,
|
|
plb.minimalFixedPrice AS fixedPrice,
|
|
plb.minimalRecurentPrice AS recurrentPrice,
|
|
plb.minimalServicesPrice AS servicesPrice
|
|
FROM ".TABLES['web_shop_cart_extra_packages']." wscep
|
|
INNER JOIN ".TABLES['packages']." p
|
|
ON p.id=wscep.idExtraPackage
|
|
INNER JOIN ".TABLES['web_shop_cart']." wsc
|
|
ON wsc.id=wscep.idCart
|
|
INNER JOIN ".TABLES['price_list_commercial_lead']." plcl
|
|
ON plcl.id=wsc.idPrice
|
|
LEFT OUTER JOIN ".TABLES['price_list_broker']." plb
|
|
ON plb.idPackage=wscep.idExtraPackage AND plb.idPaymentType=plcl.idPaymentType
|
|
WHERE wsc.idUser=".$user->getUserId()." AND p.idPackageType=".self::PACKAGE_TYPES['ID_ADDITONAL_TYPE'];
|
|
$query = $database->query($sql);
|
|
while($row = $database->fetchArray($query)){
|
|
$row['isAvailable'] = !is_null($row['fixedPrice']);
|
|
$data[$row['idCart']]['additionalPackages'][] = $row;
|
|
if(!isset($data[$row['idCart']]['areAdditionalAvailable'])){
|
|
$data[$row['idCart']]['areAdditionalAvailable'] = true;
|
|
}
|
|
$data[$row['idCart']]['areAdditionalAvailable'] = ($data[$row['idCart']]['areAdditionalAvailable'] && $row['isAvailable']);
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* get cart items Details
|
|
* @return array list of items in the cart
|
|
*/
|
|
public function getShopCart(){
|
|
global $database, $user;
|
|
$data = [];
|
|
$options = $this->getShopCartOption();
|
|
$additionalPackages = $this->getShopCartAdditionalPackages();
|
|
|
|
$sql = "SELECT
|
|
cart.id as idCart,
|
|
cart.idPackage,
|
|
cart.idCustomerInstance,
|
|
cart.idPrice,
|
|
cart.packageInstance,
|
|
p.status,
|
|
rclc.isLinkEnabled,
|
|
p.name as packageName,
|
|
cl.name as commercialLead,
|
|
pt.payType,
|
|
pt.periodUnit AS periodUnit,
|
|
pt.id AS idPayType,
|
|
(plcl.fixedExtra + plb.minimalFixedPrice) AS fixedPrice,
|
|
(plcl.recurentExtra + plb.minimalRecurentPrice) AS recurentPrice,
|
|
(plcl.servicesExtra + plb.minimalServicesPrice) AS servicesPrice,
|
|
cart.quantity
|
|
FROM ".TABLES['web_shop_cart']." cart
|
|
INNER JOIN ".TABLES['packages']." p
|
|
ON p.id=cart.idPackage
|
|
INNER JOIN ".TABLES['rel_commercial_lead_customers']." rclc
|
|
ON rclc.id=cart.idCustomerInstance
|
|
INNER JOIN ".TABLES['commercial_leads']." cl
|
|
ON cl.id=rclc.idCommercialLead
|
|
INNER JOIN ".TABLES['price_list_commercial_lead']." plcl
|
|
ON plcl.id=cart.idPrice
|
|
INNER JOIN ".TABLES['payment_types']." pt
|
|
ON pt.id=plcl.idPaymentType
|
|
INNER JOIN ".TABLES['price_list_broker']." plb
|
|
ON plb.idPackage=plcl.idPackage AND plb.idPaymentType=plcl.idPaymentType
|
|
WHERE cart.idUser=".$user->getUserId()."
|
|
";
|
|
$query = $database->query($sql);
|
|
while($row = $database->fetchArray($query)){
|
|
$row['options'] = isset($options[$row['idCart']]) ? $options[$row['idCart']]['options'] : [];
|
|
$row['areOptionsAvailable'] = isset($options[$row['idCart']]) ? $options[$row['idCart']]['areOptionsAvailable'] : true;
|
|
$row['additionalPackages'] = isset($additionalPackages[$row['idCart']]) ? $additionalPackages[$row['idCart']]['additionalPackages'] : [];
|
|
$row['areAdditionalAvailable'] = isset($additionalPackages[$row['idCart']]) ? $additionalPackages[$row['idCart']]['areAdditionalAvailable'] : true;
|
|
$data[] = $row;
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* insert new option when adding item to cart
|
|
* @param INT $idCart id for the cart
|
|
* @param Object $options options to be added
|
|
* @return INT number of inserted items
|
|
*/
|
|
private function insertOptionsToCart($idCart, $options){
|
|
global $database;
|
|
|
|
if(empty((array) $options)){
|
|
return 0;
|
|
}
|
|
|
|
$sql = "INSERT INTO ".TABLES['web_shop_cart_extra_packages']."
|
|
(idCart, idExtraPackage)
|
|
VALUES ";
|
|
foreach ($options as $idOption => $idOptionValue) {
|
|
$idOptionValue = $database->escapeValue($idOptionValue);
|
|
$sql .= "($idCart, $idOptionValue),";
|
|
}
|
|
$sql = rtrim($sql, ",");
|
|
$query = $database->query($sql);
|
|
|
|
return $database->affectedRows();
|
|
}
|
|
|
|
/**
|
|
* add new items to the cart
|
|
* @param INT $idPackage id for the package
|
|
* @param INT $idPrice id for the price
|
|
* @return array action message
|
|
*/
|
|
public function addToCart($idPackage, $idPrice, $options){
|
|
global $database, $user;
|
|
$data = [];
|
|
|
|
if(!$idPackage || !$idPrice){
|
|
$err_mes = [
|
|
'code' => 'error',
|
|
'message' => 'INVALID_SELECTION'
|
|
];
|
|
$data['messages'][] = $err_mes;
|
|
|
|
return $data;
|
|
}
|
|
|
|
$idPackage = $database->escapeValue($idPackage);
|
|
$idPrice = $database->escapeValue($idPrice);
|
|
$options = json_decode($options);
|
|
|
|
$idUser = $user->getUserId();
|
|
$sql = "SELECT plcl.idCommercialLead, availableCl.idCustomerInstance
|
|
FROM ".TABLES['price_list_commercial_lead']." plcl
|
|
INNER JOIN
|
|
(
|
|
SELECT rclc.idCommercialLead, rclc.id as idCustomerInstance
|
|
FROM ".TABLES['customers']." cust
|
|
INNER JOIN ".TABLES['rel_commercial_lead_customers']." rclc
|
|
ON cust.id=rclc.idCustomer AND rclc.isLinkEnabled=1
|
|
WHERE cust.idUser=$idUser
|
|
) availableCl
|
|
ON availableCl.idCommercialLead = plcl.idCommercialLead
|
|
WHERE plcl.id=$idPrice
|
|
LIMIT 1";
|
|
$customer = $database->fetchResultArray($sql);
|
|
|
|
if(count($customer) !== 1){
|
|
$err_mes = [
|
|
'code' => 'error',
|
|
'message' => 'INVALID_USER'
|
|
];
|
|
$data['messages'][] = $err_mes;
|
|
|
|
return $data;
|
|
}
|
|
|
|
$sql = "SELECT rclc.idCommercialLead
|
|
FROM ".TABLES['rel_commercial_lead_customers']." rclc
|
|
INNER JOIN ".TABLES['web_shop_cart']." wsc
|
|
ON wsc.idCustomerInstance=rclc.id
|
|
INNER JOIN ".TABLES['customers']." c
|
|
ON c.id=rclc.idCustomer
|
|
WHERE c.idUser=$idUser
|
|
LIMIT 1
|
|
";
|
|
$alreadySelectedCL = $database->fetchResultArray($sql);
|
|
if(count($alreadySelectedCL) > 0 && $alreadySelectedCL[0]['idCommercialLead'] !== $customer[0]['idCommercialLead']){
|
|
$err_mes = [
|
|
'code' => 'error',
|
|
'message' => 'ONLY_ONE_CL'
|
|
];
|
|
$data['messages'][] = $err_mes;
|
|
|
|
return $data;
|
|
}
|
|
|
|
$sqlCheckPackage = "
|
|
SELECT idPackage
|
|
FROM ".TABLES['web_shop_cart']."
|
|
WHERE idPackage = $idPackage
|
|
AND idCustomerInstance = ".$customer[0]['idCustomerInstance']."
|
|
AND idUser = $idUser
|
|
";
|
|
$result = $database->query($sqlCheckPackage);
|
|
if($database->numRows($result) > 0){
|
|
$err_mes = [
|
|
'code' => 'error',
|
|
'message' => 'PACKAGE_ALREADY_IN_CART'
|
|
];
|
|
$data['messages'][] = $err_mes;
|
|
|
|
return $data;
|
|
}
|
|
|
|
$sqlPackageInstance = "SELECT MAX(rpp.packageInstance) as maxInstance
|
|
FROM ".TABLES['rel_package_products']." rpp
|
|
WHERE rpp.idPackage=$idPackage";
|
|
$result = $database->fetchResultArray($sqlPackageInstance);
|
|
if(count($result) === 0){
|
|
$err_mes = [
|
|
'code' => 'error',
|
|
'message' => 'PACKAGE_ERROR'
|
|
];
|
|
$data['messages'][] = $err_mes;
|
|
|
|
return $data;
|
|
}
|
|
$maxPackageInstance = $result[0]['maxInstance'];
|
|
|
|
$sqlIns = "INSERT INTO ".TABLES['web_shop_cart']."
|
|
(idPackage, idCustomerInstance, idPrice, idUser, quantity, packageInstance)
|
|
VALUES($idPackage,
|
|
".$customer[0]['idCustomerInstance'].",
|
|
$idPrice,
|
|
$idUser,
|
|
1,
|
|
$maxPackageInstance)";
|
|
|
|
$query = $database->query($sqlIns);
|
|
$idCart = $database->getInsertId();
|
|
|
|
if($database->affectedRows() !== 1){
|
|
|
|
$err_mes = [
|
|
'code' => 'error',
|
|
'message' => 'PACKAGE_ALREADY_IN_CART'
|
|
];
|
|
$data['messages'][] = $err_mes;
|
|
|
|
return $data;
|
|
}
|
|
|
|
$insertedOptions = $this->insertOptionsToCart($idCart, $options);
|
|
|
|
if($insertedOptions){
|
|
$mes = [
|
|
'code' => 'success',
|
|
'message' => 'OPTIONS_ADDED'
|
|
];
|
|
$data['messages'][] = $mes;
|
|
}
|
|
|
|
$mes = [
|
|
'code' => 'success',
|
|
'message' => 'PACKAGE_ADDED'
|
|
];
|
|
$data['messages'][] = $mes;
|
|
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* update the quantity in the car for an item
|
|
* @param INT $idPackage id for the package
|
|
* @param INT $idCustomerInstance id for the customer instance based on linking to cl
|
|
* @param INT $idPrice id for the price
|
|
* @param INT $quantity quantity value
|
|
* @return array update message
|
|
*/
|
|
public function updateQuantity($idPackage, $idCustomerInstance, $idPrice, $quantity){
|
|
global $database, $user;
|
|
$data = [];
|
|
|
|
$idPackage = $database->escapeValue($idPackage);
|
|
$idPrice = $database->escapeValue($idPrice);
|
|
$idCustomerInstance = $database->escapeValue($idCustomerInstance);
|
|
$quantity = $database->escapeValue($quantity);
|
|
|
|
if($database->invalidNumber('QUANTITY', $quantity, 1, 100)){
|
|
$err_mes = [
|
|
'code' => 'error',
|
|
'message' => 'INVALID_QUANTITY'
|
|
];
|
|
$data['messages'][] = $err_mes;
|
|
|
|
return $data;
|
|
}
|
|
|
|
$sqlUpd = "UPDATE ".TABLES['web_shop_cart']."
|
|
SET quantity=$quantity
|
|
WHERE idPackage=$idPackage
|
|
AND idPrice=$idPrice
|
|
AND idCustomerInstance=$idCustomerInstance
|
|
AND idUser=".$user->getUserId()."
|
|
";
|
|
$query = $database->query($sqlUpd);
|
|
|
|
if($database->affectedRows() !== 1){
|
|
$err_mes = [
|
|
'code' => 'error',
|
|
'message' => 'NO_CHANGE'
|
|
];
|
|
$data['messages'][] = $err_mes;
|
|
|
|
return $data;
|
|
}
|
|
|
|
$mes = [
|
|
'code' => 'success',
|
|
'message' => 'QUANTITY_UPDATED'
|
|
];
|
|
$data['messages'][] = $mes;
|
|
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* remove item from cart
|
|
* @param INT $idCart id for the cart
|
|
* @return array update message
|
|
*/
|
|
public function removeFromCart($idCart){
|
|
global $database, $user;
|
|
$data = [];
|
|
|
|
$idCart = $database->escapeValue($idCart);
|
|
|
|
$sql = "DELETE FROM ".TABLES['web_shop_cart_extra_packages']."
|
|
WHERE idCart=$idCart ";
|
|
$query = $database->query($sql);
|
|
|
|
$sql = "DELETE FROM ".TABLES['web_shop_cart']."
|
|
WHERE id=$idCart
|
|
AND idUser=".$user->getUserId();
|
|
|
|
$query = $database->query($sql);
|
|
if($database->affectedRows() !== 1){
|
|
$err_mes = [
|
|
'code' => 'error',
|
|
'message' => 'INVALID_PACKAGE_FOR_REMOVE'
|
|
];
|
|
$data['messages'][] = $err_mes;
|
|
}else{
|
|
$message = [
|
|
'code' => 'success',
|
|
'message' => 'PACKAGE_REMOVED_FROM_CART'
|
|
];
|
|
$data['messages'][] = $message;
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* get count of items in the cart
|
|
* @return Object number of items in the cart
|
|
*/
|
|
public function getShopCartCount(){
|
|
global $database, $user;
|
|
|
|
$sql = "SELECT COUNT(idPackage) as newShopCartItemsCount
|
|
FROM ".TABLES['web_shop_cart']."
|
|
WHERE idUser=".$user->getUserId();
|
|
|
|
$data = $database->fetchResultArray($sql);
|
|
|
|
return !empty($data) ? $data[0] : [];
|
|
}
|
|
|
|
/**
|
|
* get details of the customer logged in
|
|
* @return Array with neccessary details
|
|
*/
|
|
public function getCustomerDetails() {
|
|
global $database, $user;
|
|
$userId = $user->getUserId();
|
|
$data = [];
|
|
|
|
$sqlVatCode = "
|
|
SELECT c.vatCode
|
|
FROM ".TABLES['customers']." c
|
|
WHERE c.idUser = ".$userId."
|
|
LIMIT 1";
|
|
$result = $database->fetchResultArray($sqlVatCode);
|
|
$data['vat'] = $result ? $result[0]['vatCode'] : '';
|
|
|
|
if($result = $this->getDeliveryAddress()) {
|
|
$data['delivery'] = $result[0];
|
|
}
|
|
|
|
if($result = $this->getBillingAddress()) {
|
|
$data['billing'] = $result[0];
|
|
}
|
|
|
|
$data['countryNames']['delivery'] = $this->getCountryName($data, 'delivery');
|
|
$data['countryNames']['billing'] = $this->getCountryName($data, 'billing');
|
|
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* returns the delivery address information for the user logged in
|
|
* @return Array delivery address
|
|
*/
|
|
private function getDeliveryAddress() {
|
|
global $database, $user;
|
|
|
|
$sqlDelivery = "
|
|
SELECT
|
|
da.detailedAddress AS detailedAddress,
|
|
da.city AS city,
|
|
da.zip AS zipCode,
|
|
co.id AS idCountrySelected
|
|
FROM
|
|
".TABLES['customers']." c
|
|
INNER JOIN ".TABLES['delivery_addresses']." da
|
|
ON da.idUser = c.idUser
|
|
INNER JOIN ".TABLES['countries']." co
|
|
ON co.id = da.idCountry
|
|
WHERE c.idUser = ".$user->getUserId()."
|
|
LIMIT 1
|
|
";
|
|
|
|
return $database->fetchResultArray($sqlDelivery);
|
|
}
|
|
|
|
/**
|
|
* returns the billing address information for the user logged in
|
|
* @return Array billing address info
|
|
*/
|
|
private function getBillingAddress() {
|
|
global $database, $user;
|
|
|
|
$sqlBillingAddress = "
|
|
SELECT
|
|
bi.company AS companyName,
|
|
bi.firstName AS firstName,
|
|
bi.lastName AS lastName,
|
|
bi.idCountry AS idCountrySelected,
|
|
bi.detailedAddress AS detailedAddress,
|
|
bi.city AS city,
|
|
bi.zip AS zipCode
|
|
FROM
|
|
".TABLES['customers']." c
|
|
INNER JOIN ".TABLES['billing_information']." bi
|
|
ON bi.idUser = c.idUser
|
|
WHERE c.idUser = ".$user->getUserId()."
|
|
LIMIT 1
|
|
";
|
|
|
|
return $database->fetchResultArray($sqlBillingAddress);
|
|
}
|
|
|
|
/**
|
|
* gets the country name for the id provided
|
|
* @param Array $data all details
|
|
* @param String $addressType delivery or billing address
|
|
* @return String name of the country
|
|
*/
|
|
private function getCountryName($data, $addressType) {
|
|
if(array_key_exists($addressType, $data)) {
|
|
return $this->getCountryDetailsById($data[$addressType]['idCountrySelected'])[0]['countryName'];
|
|
}
|
|
|
|
return '';
|
|
}
|
|
|
|
/**
|
|
* get all the countries
|
|
* @return Array country names and ids
|
|
*/
|
|
public function getCountries() {
|
|
global $database;
|
|
|
|
$sql = "SELECT c.id, c.name
|
|
FROM ".TABLES['countries']." c";
|
|
|
|
return $database->fetchResultArray($sql);
|
|
}
|
|
|
|
/**
|
|
* genereate the order number using the id
|
|
* @param INT $idOrder id of the order
|
|
* @return INT order number containg the id value
|
|
*/
|
|
private function generateOrderNumber($idOrder){
|
|
|
|
return 1000000000 + $idOrder;
|
|
}
|
|
|
|
private function addOrderDocuments($idOrder, $idCustomerInstance){
|
|
global $database, $user;
|
|
$getDocSql = "SELECT wsc.idDocument, wsc.idAgreementDocument, wsc.idPackage
|
|
FROM ".TABLES['web_shop_cart']." wsc
|
|
WHERE idCustomerInstance=$idCustomerInstance";
|
|
$query = $database->query($getDocSql);
|
|
$vals = "";
|
|
while($row = $database->fetchArray($query)){
|
|
if($row['idDocument']){
|
|
$vals .= "(" . $idOrder . ", " . $row['idPackage'] . ", " . $row['idDocument'] . "),";
|
|
}
|
|
|
|
if($row['idAgreementDocument']){
|
|
$vals .= "(" . $idOrder . ", " . $row['idPackage'] . ", " . $row['idAgreementDocument'] . "),";
|
|
}
|
|
}
|
|
if($vals){
|
|
$vals = rtrim($vals, ',');
|
|
$sql = "INSERT INTO ".TABLES['rel_order_documents']."
|
|
(idOrder, idPackage, idDocument)
|
|
VALUES $vals";
|
|
$query = $database->query($sql);
|
|
|
|
return $database->affectedRows();
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/**
|
|
* add extra option for order packages
|
|
* @param INT $idOrder id for the ORDER
|
|
* @return INT number of inserted elements
|
|
*/
|
|
private function addOrderExtraPackages($idOrder){
|
|
global $database, $user;
|
|
|
|
$sql = "INSERT INTO ".TABLES['rel_order_extra_packages']."
|
|
(idOrder, idPackage, idExtraPackage)
|
|
SELECT $idOrder, wsc.idPackage, wscep.idExtraPackage
|
|
FROM ".TABLES['web_shop_cart']." wsc
|
|
INNER JOIN ".TABLES['web_shop_cart_extra_packages']." wscep
|
|
ON wsc.id=wscep.idCart
|
|
WHERE wsc.idUser=".$user->getUserId();
|
|
$query = $database->query($sql);
|
|
|
|
return $database->affectedRows();
|
|
}
|
|
|
|
private function calculatePackageTotalPrice($cartPackage){
|
|
$totalPrice = [
|
|
'fixedPrice' => 0,
|
|
'recurrentPrice' => 0,
|
|
'servicesPrice' => 0
|
|
];
|
|
|
|
$totalPrice['fixedPrice'] += $cartPackage['fixedPrice'];
|
|
$totalPrice['recurrentPrice'] += $cartPackage['recurentPrice'];
|
|
$totalPrice['servicesPrice'] += $cartPackage['servicesPrice'];
|
|
if(isset($cartPackage['options'])){
|
|
foreach ($cartPackage['options'] as $option) {
|
|
$totalPrice['fixedPrice'] += $option->fixedPrice;
|
|
$totalPrice['recurrentPrice'] += $option->recurrentPrice;
|
|
$totalPrice['servicesPrice'] += $option->servicesPrice;
|
|
}
|
|
}
|
|
|
|
if(isset($cartPackage['additionalPackages'])){
|
|
foreach ($cartPackage['additionalPackages'] as $additionalPackage) {
|
|
$totalPrice['fixedPrice'] += $additionalPackage->fixedPrice;
|
|
$totalPrice['recurrentPrice'] += $additionalPackage->recurrentPrice;
|
|
$totalPrice['servicesPrice'] += $additionalPackage->servicesPrice;
|
|
}
|
|
}
|
|
|
|
return $totalPrice;
|
|
}
|
|
|
|
/**
|
|
* adds the order with the whole details
|
|
* @param String $cartPackages Json string with object containing the packages to order
|
|
* @param String $deliveryInfo Json string with object containing the delivery informations
|
|
* @param String $billingInfo Json string with object containing the billing informations
|
|
* @param String $details Json string with object containing the details like refenrence or tender numbers
|
|
* @return Array confirmation message
|
|
*/
|
|
public function placeOrder($cartPackages, $deliveryInfo, $billingInfo, $details) {
|
|
global $database, $user;
|
|
$rowsAffected = 0;
|
|
$deletedFromCart = 0;
|
|
$addressInserted = 0;
|
|
$totalFixedPrice = 0;
|
|
$totalServicePrice = 0;
|
|
$userId = $user->getUserId();
|
|
$newCartPackages = [];
|
|
$packageToDisplay = '';
|
|
|
|
$cartPackages = (array) json_decode($cartPackages);
|
|
$deliveryInfo = (array) json_decode($deliveryInfo);
|
|
$billingInfo = (array) json_decode($billingInfo);
|
|
$details = (array) json_decode($details);
|
|
|
|
foreach($cartPackages as $packKey => $packageDetails) {
|
|
$packageDetails = (array) $packageDetails;
|
|
foreach($packageDetails as $packDetailKey => $packageDetail) {
|
|
if(!is_array($packageDetail)){
|
|
$newCartPackages[$packKey][$packDetailKey] = $database->escapeValue($packageDetail);
|
|
}else{
|
|
$newCartPackages[$packKey][$packDetailKey] = $packageDetail;
|
|
}
|
|
}
|
|
$commercialLeadName = $packageDetails['commercialLead'];
|
|
}
|
|
|
|
$cartPackages = $newCartPackages;
|
|
foreach ($cartPackages as $position => $cartPackage) {
|
|
$servicesPrice = $cartPackage['recurentPrice'] + $cartPackage['servicesPrice'];
|
|
$optionsToDisplay = '';
|
|
if(isset($cartPackage['options'])){
|
|
$optionsToDisplay .= '(';
|
|
foreach ($cartPackage['options'] as $key => $option) {
|
|
$optionsToDisplay .= $option->groupName . ' : ' . $option->packageName .',';
|
|
}
|
|
$optionsToDisplay = rtrim($optionsToDisplay, ',');
|
|
$optionsToDisplay .= ')';
|
|
}
|
|
|
|
if(isset($cartPackage['additionalPackages'])){
|
|
$optionsToDisplay .= '(';
|
|
foreach ($cartPackage['additionalPackages'] as $key => $option) {
|
|
$optionsToDisplay .= $option->packageName .', ';
|
|
}
|
|
$optionsToDisplay = rtrim($optionsToDisplay, ',');
|
|
$optionsToDisplay .= ')';
|
|
}
|
|
$packageToDisplay .= ($position + 1).'. <b>'.$cartPackage['packageName'].'</b>
|
|
'.$optionsToDisplay.'
|
|
<div class="mail-order-package-detail">
|
|
<div>Commercial lead: '.$cartPackage['commercialLead'].'</div>
|
|
<div>Payment type: '.$cartPackage['payType'].'</div>
|
|
<div>Quantity: '.$cartPackage['quantity'].'</div>
|
|
<label>'.$cartPackage['fixedPrice'].' ('.$servicesPrice.' / '.$cartPackage['periodUnit'].')</label>
|
|
</div> <br /><hr>
|
|
';
|
|
$packageTotalPrices = $this->calculatePackageTotalPrice($cartPackage);
|
|
|
|
$totalFixedPrice += $packageTotalPrices['fixedPrice'] * $cartPackage['quantity'];
|
|
$totalServicePrice += ($packageTotalPrices['recurrentPrice'] + $packageTotalPrices['servicesPrice']) * $cartPackage['quantity'];
|
|
$totalPeriodUnit = $cartPackage['periodUnit'];
|
|
}
|
|
$packageToDisplay .= 'Total Price: <b>'.$totalFixedPrice.' ('.$totalServicePrice.' / '.$totalPeriodUnit.')</b><br /><br />';
|
|
|
|
foreach($deliveryInfo as $deliveryKey => $deliveryDetail) {
|
|
$deliveryInfo[$deliveryKey] = $database->escapeValue($deliveryDetail);
|
|
}
|
|
|
|
foreach($billingInfo as $billingKey => $billingDetail) {
|
|
$billingInfo[$billingKey] = $database->escapeValue($billingDetail);
|
|
}
|
|
|
|
foreach($details as $detailKey => $detail) {
|
|
$details[$detailKey] = $database->escapeValue($detail);
|
|
}
|
|
|
|
if($data['messages'][] = $this->validateOrderDetails($cartPackages, $deliveryInfo, $billingInfo, $details)) {
|
|
return $data;
|
|
}
|
|
|
|
$database->beginTransaction();
|
|
|
|
$sqlCustomerInstance = "
|
|
SELECT
|
|
rclc.id AS idCustomerInstance
|
|
FROM
|
|
".TABLES['rel_commercial_lead_customers']." rclc
|
|
INNER JOIN ".TABLES['customers']." c
|
|
ON c.id = rclc.idCustomer
|
|
AND c.idUser = $userId
|
|
INNER JOIN ".TABLES['commercial_leads']." cl
|
|
ON cl.id = rclc.idCommercialLead
|
|
AND cl.name = '".$commercialLeadName."'
|
|
WHERE rclc.isLinkEnabled=1
|
|
LIMIT 1";
|
|
$result = $database->fetchResultArray($sqlCustomerInstance);
|
|
if($result && $result[0]['idCustomerInstance']) {
|
|
$idCustomerInstance = $result[0]['idCustomerInstance'];
|
|
} else {
|
|
$data['messages'][] = [
|
|
'code' => 'error',
|
|
'message' => 'LINK_CUSTOMER_CL'
|
|
];
|
|
$database->rollback();
|
|
|
|
return $data;
|
|
}
|
|
|
|
$sqlOrderNumber = "
|
|
SELECT
|
|
MAX(id) + 1 AS orderNumber
|
|
FROM
|
|
".TABLES['orders']."
|
|
LIMIT 1";
|
|
$result = $database->fetchResultArray($sqlOrderNumber);
|
|
$orderNumber = $result && $result[0]['orderNumber'] ? $this->generateOrderNumber($result[0]['orderNumber']) : '1000000000';
|
|
|
|
$today = new DateTime();
|
|
$reference = array_key_exists('reference', $details) && $details['reference'] ? $details['reference'] : '';
|
|
$tender = array_key_exists('tender', $details) && $details['tender'] ? $details['tender'] : '';
|
|
$countryDetails = $this->getCountryDetailsById($deliveryInfo['idCountrySelected'])[0];
|
|
$countryName = $countryDetails['countryName'];
|
|
$countryCode = $countryDetails['countryCode'];
|
|
$concatenatedDeliveryAddress = $deliveryInfo['detailedAddress'].", ".$deliveryInfo['city'].", $countryName, ".$deliveryInfo['zipCode'];
|
|
$billingCountryDetails = $this->getCountryDetailsById($billingInfo['idCountrySelected'])[0];
|
|
$concatenatedBillingAddress = $billingInfo['detailedAddress'].", ".$billingInfo['city'].", ".$billingCountryDetails['countryName'].", ".$billingInfo['zipCode'];
|
|
$projectNumber = $countryCode . $orderNumber;
|
|
$orderDate = $today->format('Y-m-d H:m:s');
|
|
|
|
$packageToDisplay .= '<b>Delivery address</b>: '.$concatenatedDeliveryAddress.'<br />';
|
|
$packageToDisplay .= '<b>Billing address</b>: '.$concatenatedBillingAddress.'<br />';
|
|
|
|
$sql = "SELECT MAX(t.id) as idTemrs
|
|
FROM ".TABLES['terms']." t";
|
|
$terms = $database->fetchResultArray($sql)[0];
|
|
|
|
$sql = "
|
|
INSERT INTO ".TABLES['orders']."
|
|
(idCustomerInstance, orderNumber, orderDate, reference, tender, projectNumber, deliveryAddress, billingAddress, idTerms)
|
|
VALUES (
|
|
$idCustomerInstance,
|
|
'".$orderNumber."',
|
|
'".$orderDate."',
|
|
'".$reference."',
|
|
'".$tender."',
|
|
'".$projectNumber."',
|
|
'".$concatenatedDeliveryAddress."',
|
|
'".$concatenatedBillingAddress."',
|
|
'".$terms['idTemrs']."'
|
|
)
|
|
";
|
|
|
|
$query = $database->query($sql);
|
|
|
|
if($database->affectedRows() === 1){
|
|
$rowsAffected++;
|
|
} else {
|
|
$data['messages'][] = [
|
|
'code' => 'error',
|
|
'message' => 'ERROR_ORDER_INSERT'
|
|
];
|
|
$database->rollback();
|
|
|
|
return $data;
|
|
}
|
|
|
|
$idOrder = $database->getInsertId();
|
|
|
|
if($this->addOrderPackageRelation($cartPackages, $idOrder) > 0) {
|
|
$rowsAffected++;
|
|
} else {
|
|
$data['messages'][] = [
|
|
'code' => 'error',
|
|
'message' => 'ERROR_ORDER_PACK_RELATION'
|
|
];
|
|
$database->rollback();
|
|
|
|
return $data;
|
|
}
|
|
|
|
if($this->addUpdateOrderDeliveryAddress($deliveryInfo) > 0) {
|
|
$addressInserted++;
|
|
}
|
|
|
|
if($this->addUpdateOrderBillingAddress($billingInfo) > 0) {
|
|
$addressInserted++;
|
|
}
|
|
|
|
if($this->addOrderDocuments($idOrder, $idCustomerInstance) > 0) {
|
|
$rowsAffected++;
|
|
} else {
|
|
$data['messages'][] = [
|
|
'code' => 'error',
|
|
'message' => 'ERROR_ON_ADDING_DOCUMENTS'
|
|
];
|
|
$database->rollback();
|
|
|
|
return $data;
|
|
}
|
|
|
|
$addedOptions = $this->addOrderExtraPackages($idOrder);
|
|
$deletedFromCart = $this->removePackagesFromCartAfterOrder($idCustomerInstance, $userId);
|
|
$data['messages'][] = $this->addInstallationCompanySelection($cartPackages, $idOrder);
|
|
|
|
if($rowsAffected >= 3) {
|
|
$database->commit();
|
|
$data['messages'][] = [
|
|
'code' => 'success',
|
|
'message' => 'ORDER_PLACED'
|
|
];
|
|
|
|
if($addressInserted > 0) {
|
|
$data['messages'][] = [
|
|
'code' => 'success',
|
|
'message' => 'ADDRESS_INSERTED'
|
|
];
|
|
}
|
|
|
|
if($deletedFromCart > 0) {
|
|
$data['messages'][] = [
|
|
'code' => 'success',
|
|
'message' => 'PACKAGES_DELETED'
|
|
];
|
|
}
|
|
|
|
$orderInfo['idOrder'] = $idOrder;
|
|
$orderInfo['orderNumber'] = $orderNumber;
|
|
$orderInfo['orderDate'] = $orderDate;
|
|
|
|
$data['messages'][] = UtilsModel::sendOrderConfirmationMail($packageToDisplay, 'customer', $orderInfo);
|
|
$data['messages'][] = UtilsModel::sendOrderConfirmationMail($packageToDisplay, 'broker', $orderInfo);
|
|
} else {
|
|
$data['messages'][] = [
|
|
'code' => 'error',
|
|
'message' => 'ORDER_ERROR'
|
|
];
|
|
$database->rollback();
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* checks whether the informations for the order are correct
|
|
* @param Array $cartPackages the packages to be placed in the order
|
|
* @param Array $deliveryInfo the delivery information for the order
|
|
* @param Array $billingInfo the billing information for the order
|
|
* @return Array error message ot empty
|
|
*/
|
|
private function validateOrderDetails($cartPackages, $deliveryInfo, $billingInfo, $details) {
|
|
global $database;
|
|
|
|
if(count($cartPackages) < 1) {
|
|
return [
|
|
'code' => 'error',
|
|
'message' => 'CART_EMPTY'
|
|
];
|
|
}
|
|
|
|
if(count($deliveryInfo) < 1) {
|
|
return [
|
|
'code' => 'error',
|
|
'message' => 'NO_DELIVERY_ADDRESS'
|
|
];
|
|
}
|
|
|
|
if((!array_key_exists('detailedAddress', $deliveryInfo) || $deliveryInfo['detailedAddress'] === '') ||
|
|
(!array_key_exists('idCountrySelected', $deliveryInfo) || $deliveryInfo['idCountrySelected'] === '') ||
|
|
(!array_key_exists('zipCode', $deliveryInfo) || $deliveryInfo['zipCode'] === '')) {
|
|
|
|
return [
|
|
'code' => 'error',
|
|
'message' => 'INCOMPLETE_DELIVERY_ADDRESS'
|
|
];
|
|
}
|
|
|
|
if((!array_key_exists('companyName', $billingInfo) || $billingInfo['companyName'] === '') ||
|
|
(!array_key_exists('firstName', $billingInfo) || $billingInfo['firstName'] === '') ||
|
|
(!array_key_exists('lastName', $billingInfo) || $billingInfo['lastName'] === '') ||
|
|
(!array_key_exists('detailedAddress', $billingInfo) || $billingInfo['detailedAddress'] === '') ||
|
|
(!array_key_exists('idCountrySelected', $billingInfo) || $billingInfo['idCountrySelected'] === '') ||
|
|
(!array_key_exists('zipCode', $billingInfo) || $billingInfo['zipCode'] === '')) {
|
|
|
|
return [
|
|
'code' => 'error',
|
|
'message' => 'INCOMPLETE_BILLING_ADDRESS'
|
|
];
|
|
}
|
|
|
|
$checkMessage = $database->invalidLength('INVALID_LENGTH_DELIVERY_ADDRESS', $deliveryInfo['detailedAddress'], 500);
|
|
if($checkMessage){
|
|
return $checkMessage;
|
|
}
|
|
|
|
$checkMessage = $database->invalidLength('INVALID_LENGTH_BILLING_ADDRESS', $billingInfo['detailedAddress'], 500);
|
|
if($checkMessage){
|
|
return $checkMessage;
|
|
}
|
|
|
|
$checkMessage = $database->invalidLength('INVALID_LENGTH_CITY', $deliveryInfo['city'], 100);
|
|
if($checkMessage){
|
|
return $checkMessage;
|
|
}
|
|
|
|
$checkMessage = $database->invalidLength('INVALID_LENGTH_CITY', $billingInfo['city'], 100);
|
|
if($checkMessage){
|
|
return $checkMessage;
|
|
}
|
|
|
|
$checkMessage = $database->invalidLength('INVALID_LENGTH_ZIP', $deliveryInfo['zipCode'], 20);
|
|
if($checkMessage){
|
|
return $checkMessage;
|
|
}
|
|
|
|
$checkMessage = $database->invalidLength('INVALID_LENGTH_COMPANY_NAME', $billingInfo['companyName'], 300);
|
|
if($checkMessage){
|
|
return $checkMessage;
|
|
}
|
|
|
|
$checkMessage = $database->invalidLength('INVALID_LENGTH_FIRST_NAME', $billingInfo['firstName'], 200);
|
|
if($checkMessage){
|
|
return $checkMessage;
|
|
}
|
|
|
|
$checkMessage = $database->invalidLength('INVALID_LENGTH_LAST_NAME', $billingInfo['lastName'], 200);
|
|
if($checkMessage){
|
|
return $checkMessage;
|
|
}
|
|
|
|
$checkMessage = $database->invalidLength('INVALID_LENGTH_ZIP', $billingInfo['zipCode'], 20);
|
|
if($checkMessage){
|
|
return $checkMessage;
|
|
}
|
|
|
|
return [];
|
|
}
|
|
|
|
/**
|
|
* adds the installation company in the selection relations table
|
|
* @param Array $cartPackages the packages from the cart
|
|
* @param Int $idOrder the id of the order
|
|
* @return Array with confirmation message
|
|
*/
|
|
private function addInstallationCompanySelection($cartPackages, $idOrder) {
|
|
global $database;
|
|
$message = [];
|
|
|
|
foreach($cartPackages as $position => $package) {
|
|
$sql = "
|
|
SELECT
|
|
rpp.idProduct
|
|
FROM
|
|
".TABLES['rel_package_products']." rpp
|
|
INNER JOIN ".TABLES['suppliers_countries_products']." scp
|
|
ON scp.idProduct = rpp.idProduct
|
|
INNER JOIN ".TABLES['product_categories']." pc
|
|
ON scp.idProductCategory = pc.id
|
|
WHERE pc.id = ".self::PRODUCT_CATEGORIES['INSTALLATION']."
|
|
AND rpp.idPackage = ".$package['idPackage']."
|
|
AND rpp.packageInstance = ".$package['packageInstance'];
|
|
$products = $database->fetchResultArray($sql);
|
|
if(count($products) === 1) {
|
|
$installationScheduling = new InstallationScheduling();
|
|
$message = $installationScheduling->changeInstallationCompany($idOrder, $package['idPackage'], $products[0]['idProduct']);
|
|
}
|
|
}
|
|
|
|
return $message;
|
|
}
|
|
|
|
/**
|
|
* returns the name and code of the country by it's id
|
|
* @param int $idCountry id of the country
|
|
* @return string the name of the country
|
|
*/
|
|
public function getCountryDetailsById($idCountry) {
|
|
global $database;
|
|
$countryName = '';
|
|
|
|
$sql = "
|
|
SELECT name AS countryName,
|
|
UPPER(code) AS countryCode
|
|
FROM ".TABLES['countries']."
|
|
WHERE id=$idCountry
|
|
LIMIT 1";
|
|
return $database->fetchResultArray($sql);
|
|
}
|
|
|
|
/**
|
|
* adds or updates the delivery address for the user logged in
|
|
* @param Array $deliveryInfo contaions the delivery address
|
|
* @return Int affected rows
|
|
*/
|
|
private function addUpdateOrderDeliveryAddress($deliveryInfo) {
|
|
global $database, $user;
|
|
|
|
$sql = "
|
|
SELECT
|
|
id
|
|
FROM
|
|
".TABLES['delivery_addresses']."
|
|
WHERE idUser = ".$user->getUserId()."
|
|
AND idCountry = ".$deliveryInfo['idCountrySelected']."
|
|
AND city = '".$deliveryInfo['city']."'
|
|
AND detailedAddress = '".$deliveryInfo['detailedAddress']."'
|
|
AND zip = '".$deliveryInfo['zipCode']."'
|
|
";
|
|
$query = $database->query($sql);
|
|
if($database->numRows($query) === 0) {
|
|
$sqlDeliveryAddress = "
|
|
INSERT INTO ".TABLES['delivery_addresses']."
|
|
(idUser, idCountry, city, detailedAddress, zip)
|
|
VALUES (
|
|
".$user->getUserId().",
|
|
".$deliveryInfo['idCountrySelected'].",
|
|
'".$deliveryInfo['city']."',
|
|
'".$deliveryInfo['detailedAddress']."',
|
|
'".$deliveryInfo['zipCode']."'
|
|
)
|
|
";
|
|
$query = $database->query($sqlDeliveryAddress);
|
|
|
|
return $database->affectedRows();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* adds or updates the billing information for the user
|
|
* @param Array $billingInfo array of billing info - names and address
|
|
* @return Int affected rows
|
|
*/
|
|
private function addUpdateOrderBillingAddress($billingInfo) {
|
|
global $database, $user;
|
|
|
|
$sql = "
|
|
SELECT
|
|
id
|
|
FROM
|
|
".TABLES['billing_information']."
|
|
WHERE idUser = ".$user->getUserId()."
|
|
AND idCountry = ".$billingInfo['idCountrySelected']."
|
|
AND company = '".$billingInfo['companyName']."'
|
|
AND firstName = '".$billingInfo['firstName']."'
|
|
AND lastname = '".$billingInfo['lastName']."'
|
|
AND city = '".$billingInfo['city']."'
|
|
AND detailedAddress = '".$billingInfo['detailedAddress']."'
|
|
AND zip = '".$billingInfo['zipCode']."'
|
|
";
|
|
$query = $database->query($sql);
|
|
if($database->numRows($query) === 0) {
|
|
$sqlBillingAddress = "
|
|
INSERT INTO ".TABLES['billing_information']."
|
|
(idUser, idCountry, company, firstName, lastName, city, detailedAddress, zip)
|
|
VALUES (
|
|
".$user->getUserId().",
|
|
".$billingInfo['idCountrySelected'].",
|
|
'".$billingInfo['companyName']."',
|
|
'".$billingInfo['firstName']."',
|
|
'".$billingInfo['lastName']."',
|
|
'".$billingInfo['city']."',
|
|
'".$billingInfo['detailedAddress']."',
|
|
'".$billingInfo['zipCode']."'
|
|
)
|
|
";
|
|
$query = $database->query($sqlBillingAddress);
|
|
|
|
return $database->affectedRows();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* adds the relation between order and packages
|
|
* @param Array $orderPackages all the details for packages in order
|
|
* @param Int $idOrder the order id inserted
|
|
* @return Int the number of packages inserted
|
|
*/
|
|
private function addOrderPackageRelation($orderPackages, $idOrder) {
|
|
global $database;
|
|
$insertValues = '';
|
|
|
|
$sql = "
|
|
INSERT INTO ".TABLES['rel_order_packages']."
|
|
(idOrder, idPackage, packageInstance, idPaymentTerm, units, packageFixedPrice, packageRecuringPrice, packageServicePrice)
|
|
VALUES
|
|
";
|
|
|
|
foreach($orderPackages as $packageInfo) {
|
|
$totalPackagePrice = $this->calculatePackageTotalPrice($packageInfo);
|
|
$sqlPaymentType = "
|
|
SELECT id
|
|
FROM ".TABLES['payment_types']." pt
|
|
WHERE pt.payType='".$packageInfo['payType']."'";
|
|
$result = $database->fetchResultArray($sqlPaymentType);
|
|
$idPayType = $result && $result[0]['id'] ? $result[0]['id'] : 0;
|
|
|
|
$insertValues .= "(
|
|
$idOrder,
|
|
'".$packageInfo['idPackage']."',
|
|
'".$packageInfo['packageInstance']."',
|
|
".$packageInfo['idPayType'].",
|
|
'".$packageInfo['quantity']."',
|
|
'".$totalPackagePrice['fixedPrice']."',
|
|
'".$totalPackagePrice['recurrentPrice']."',
|
|
'".$totalPackagePrice['servicesPrice']."'
|
|
),";
|
|
}
|
|
|
|
$insertValues = $insertValues ? rtrim($insertValues, ',') : '';
|
|
if($insertValues) {
|
|
$sql .= $insertValues;
|
|
$query = $database->query($sql);
|
|
|
|
return $database->affectedRows();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* remove the packages from the web shop cart after placing the order
|
|
* @param Int $idCustomerInstance id of the customer
|
|
* @return Int number of rows deleted
|
|
*/
|
|
private function removePackagesFromCartAfterOrder($idCustomerInstance) {
|
|
global $database;
|
|
|
|
$sql = "
|
|
DELETE
|
|
FROM
|
|
".TABLES['web_shop_cart']."
|
|
WHERE idCustomerInstance = $idCustomerInstance";
|
|
|
|
$result = $database->query($sql);
|
|
|
|
return $database->affectedRows();
|
|
}
|
|
|
|
/**
|
|
* upload questionaires for placing an order
|
|
* @param Array $file uploaded file
|
|
* @param String $idDocumentType type of the document
|
|
* @param String $documentName the name to be set for the file in database
|
|
* @param INT $idPackage id for the package
|
|
* @return Array upload message
|
|
*/
|
|
public function uploadOrderDocument($file, $idDocumentType, $idPackage){
|
|
global $database, $user;
|
|
$isReUpload = false;
|
|
|
|
$documentName = 'customerQuestionaire_'.$idPackage.'_'.date('Y_m_d');
|
|
|
|
$fileManager = new FileManager();
|
|
$documentField = '';
|
|
if(intval($idDocumentType) === self::DOCUMENT_TYPES['ID_CUSTOMER_QUESTIONNAIRE']){
|
|
$documentField = 'idDocument';
|
|
}else{
|
|
$documentField = 'idAgreementDocument';
|
|
}
|
|
|
|
$sql = "SELECT $documentField AS idDocument
|
|
FROM ".TABLES['web_shop_cart']."
|
|
WHERE idUser=".$user->getUserId()." AND idPackage=$idPackage AND $documentField IS NOT NULL";
|
|
|
|
$documents = $database->fetchResultArray($sql);
|
|
if(count($documents) > 0){
|
|
$document = $documents[0];
|
|
$data = $fileManager->updateDocument($document['idDocument'], $file);
|
|
$isReUpload = true;
|
|
}else{
|
|
$uploadedBy = $user->getUserId();
|
|
$data = $fileManager->uploadFile($file, $idDocumentType, $documentName, $uploadedBy);
|
|
$isReUpload = false;
|
|
}
|
|
|
|
if(isset($data['messages'])){
|
|
return $data;
|
|
}
|
|
|
|
if(!$isReUpload){
|
|
$idDocument = $data['idDocument'];
|
|
|
|
$sql = "UPDATE ".TABLES['web_shop_cart']."
|
|
SET $documentField=$idDocument
|
|
WHERE idUser=".$user->getUserId()." AND idPackage=$idPackage";
|
|
$query = $database->query($sql);
|
|
|
|
if($database->affectedRows() > 0){
|
|
$data['messages'][] = [
|
|
'code' => 'success',
|
|
'message' => 'FILE_UPLOADED'
|
|
];
|
|
}else{
|
|
$data['messages'][] = [
|
|
'code' => 'error',
|
|
'message' => 'NOT_LINKED_TO_CART'
|
|
];
|
|
}
|
|
}else{
|
|
$data['messages'][] = [
|
|
'code' => 'success',
|
|
'message' => 'FILE_UPLOADED'
|
|
];
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* get files that have been uploaded before palcing an order and are found in the cart
|
|
* @param INT $packages id of the package
|
|
* @return Array array of uploaded documetns for a package
|
|
*/
|
|
private function getUploadedFilesForOrder($packages){
|
|
global $database, $user;
|
|
$data = [
|
|
'questionnaire' => [],
|
|
'agreement' => []
|
|
];
|
|
|
|
$sql = "SELECT
|
|
wsc.idPackage,
|
|
wsc.idDocument AS idQuestionnaire,
|
|
wsc.idAgreementDocument AS idAgreement
|
|
FROM ".TABLES['documents']." doc
|
|
INNER JOIN ".TABLES['web_shop_cart']." wsc
|
|
ON doc.id=wsc.idDocument AND wsc.idUser=doc.uploadedBy
|
|
WHERE wsc.idPackage IN($packages) AND wsc.idUser=".$user->getUserId()."";
|
|
$query = $database->query($sql);
|
|
while($row = $database->fetchArray($query)){
|
|
if($row['idQuestionnaire']){
|
|
$data['questionnaire'][] = $row['idPackage'];
|
|
}
|
|
|
|
if($row['idAgreement']){
|
|
$data['agreement'][] = $row['idPackage'];
|
|
}
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* get required documents to place an order
|
|
* @param Array $packages ids for the packages in the cart
|
|
* @return Array array of documents
|
|
*/
|
|
public function getCartDocuments($packages){
|
|
global $database;
|
|
|
|
$data = [];
|
|
$packages = json_decode($packages);
|
|
$packages = implode(',', $packages);
|
|
$packages = $database->escapeValue($packages);
|
|
|
|
$uploaded = $this->getUploadedFilesForOrder($packages);
|
|
|
|
$sql = "SELECT
|
|
d.id,
|
|
d.documentName,
|
|
d.documentPath,
|
|
d.extension,
|
|
p.id AS idPackage,
|
|
p.name AS packageName,
|
|
d.idDocumentType
|
|
FROM ".TABLES['documents']." d
|
|
INNER JOIN ".TABLES['rel_package_documents']." rpd
|
|
ON rpd.idDocument=d.id
|
|
INNER JOIN ".TABLES['packages']." p
|
|
ON p.id=rpd.idPackage
|
|
WHERE rpd.idPackage IN($packages)
|
|
AND d.idDocumentType IN(".self::DOCUMENT_TYPES['ID_TEMPLATE_QUESIONNAIRE'].", ".self::DOCUMENT_TYPES['ID_TEMPLATE_AGREEMENT'].")";
|
|
|
|
$query = $database->query($sql);
|
|
while($row = $database->fetchArray($query)){
|
|
$currentTypeUploaded = intval($row['idDocumentType']) === self::DOCUMENT_TYPES['ID_TEMPLATE_QUESIONNAIRE'] ? $uploaded['questionnaire'] : $uploaded['agreement'];
|
|
$row['isUploaded'] = in_array($row['idPackage'], $currentTypeUploaded);
|
|
$data[$row['idDocumentType']][] = $row;
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
}
|