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).'. '.$cartPackage['packageName'].' '.$optionsToDisplay.'