446 lines
17 KiB
PHP
446 lines
17 KiB
PHP
<?php
|
|
/**
|
|
* Data manipulation for the model
|
|
*/
|
|
class CoMarketModel{
|
|
const PACKAGE_TYPES = [
|
|
'ID_STANDARD_TYPE' => 1,
|
|
'ID_OPTION_TYPE' => 2,
|
|
'ID_ADDITONAL_TYPE' => 3
|
|
];
|
|
|
|
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.photo,
|
|
p.photoPublicId,
|
|
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
|
|
(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
|
|
INNER JOIN
|
|
(SELECT
|
|
proc.idCountry
|
|
FROM ".TABLES['processes']." proc
|
|
GROUP BY proc.idCountry
|
|
) proc_countries
|
|
ON proc_countries.idCountry=p.idCountry
|
|
$whereSql
|
|
GROUP BY p.id
|
|
ORDER BY p.name ASC";
|
|
|
|
$data = [];
|
|
$query = $database->query($sql);
|
|
while($row = $database->fetchArray($query)){
|
|
if(strlen($row['shortDescription']) > 300 && $idPackage === 0){
|
|
$row['shortDescription'] = substr($row['shortDescription'], 0, 300) . '...';
|
|
}
|
|
if($row['photoPublicId']) {
|
|
$row['photo'] = IMAGE_URL . $row['photoPublicId'];
|
|
}
|
|
$data[] = $row;
|
|
}
|
|
|
|
return ['packages' => $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,
|
|
u.mail as mail
|
|
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
|
|
INNER JOIN ".TABLES['users']." u
|
|
ON u.id = cl.idUser
|
|
WHERE rclc.isLinkEnabled=1 AND c.idUser=" . $user->getUserId();
|
|
|
|
return ['commercialLeads' => $database->fetchResultArray($sql)];
|
|
}
|
|
|
|
private function getCommercialLeadInfo($idCommercialLead){
|
|
global $database;
|
|
|
|
$sql = "SELECT
|
|
cl.name,
|
|
u.mail,
|
|
cl.phone
|
|
FROM ".TABLES['commercial_leads']." cl
|
|
INNER JOIN ".TABLES['users']." u
|
|
ON u.id = cl.idUser
|
|
WHERE cl.id=$idCommercialLead
|
|
";
|
|
|
|
return $database->fetchResultArray($sql);
|
|
}
|
|
|
|
/**
|
|
* 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 = [];
|
|
$packages = new Packages();
|
|
|
|
$packageOptionPrices = $packages->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,
|
|
p.description AS shortDescription
|
|
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 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 = [];
|
|
$packages = new Packages();
|
|
|
|
$additionalPackagesPrices = $packages->getPricesForPackages($idCommercialLead, $idPackage, self::PACKAGE_TYPES['ID_ADDITONAL_TYPE']);
|
|
$sql = "SELECT
|
|
rap.idAdditionalPackage,
|
|
p.name AS packageName,
|
|
p.description AS shortDescription
|
|
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();
|
|
$packages = new Packages();
|
|
$packageDocuments = new PackageDocuments();
|
|
|
|
$idPackage = $database->escapeValue($idPackage);
|
|
$data = [];
|
|
$data['country'] = $countries->getCurrencyForPackage($idPackage);
|
|
$data['prices'] = $packages->getPricesForPackages($idCommercialLead, $idPackage, self::PACKAGE_TYPES['ID_STANDARD_TYPE']);
|
|
$data['prices'] = isset($data['prices'][$idPackage]) ? $data['prices'][$idPackage] : [];
|
|
|
|
if(empty( $data['prices'])){
|
|
return [];
|
|
}
|
|
|
|
$documents = $packageDocuments->getPackageDocuments($idPackage);
|
|
$data['documents'] = isset($documents[$idPackage]) ? $documents[$idPackage] : [];
|
|
$shopPackages = $this->getShopPackages($idCommercialLead, $idPackage);
|
|
$data['packageInfo'] = isset($shopPackages['packages'][0]) ? $shopPackages['packages'][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;
|
|
}
|
|
|
|
/**
|
|
* 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($options === '[]' || 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);
|
|
|
|
$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' => 'warning',
|
|
'message' => 'ONLY_ONE_CL'
|
|
];
|
|
$data['messages'][] = $err_mes;
|
|
|
|
return $data;
|
|
}
|
|
|
|
$sql = "SELECT
|
|
COUNT(DISTINCT idCountry) AS differentCountries
|
|
FROM
|
|
(SELECT DISTINCT
|
|
p.idCountry
|
|
FROM
|
|
".TABLES['web_shop_cart']." wsc
|
|
INNER JOIN ".TABLES['packages']." p
|
|
ON wsc.idPackage = p.id
|
|
WHERE
|
|
idCustomerInstance = ".$customer[0]['idCustomerInstance']." AND idUser = $idUser
|
|
UNION ALL
|
|
SELECT
|
|
p.idCountry
|
|
FROM
|
|
".TABLES['packages']." p
|
|
WHERE
|
|
p.id = $idPackage) countires";
|
|
$countriesCount = $database->fetchResultArray($sql)[0];
|
|
if(intval($countriesCount['differentCountries']) > 1){
|
|
$err_mes = [
|
|
'code' => 'warning',
|
|
'message' => 'ONLY_ONE_COUNTRY'
|
|
];
|
|
$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;
|
|
}
|
|
} |