194 lines
8.3 KiB
PHP
194 lines
8.3 KiB
PHP
<?php
|
|
/**
|
|
* Packages manages required data for packages (prices especially)
|
|
*/
|
|
class Packages {
|
|
const PACKAGE_TYPES = [
|
|
'ID_STANDARD_TYPE' => 1,
|
|
'ID_OPTION_TYPE' => 2,
|
|
'ID_ADDITONAL_TYPE' => 3
|
|
];
|
|
|
|
public function generatePackagePayRow($row, $orderType, $customerInfo, $commissionSplit, $totalCost, $interestRateValue){
|
|
$prices = new Prices();
|
|
|
|
$row['idOrderType'] = $orderType;
|
|
$margins = $prices->getPriceMargins($commissionSplit, $row, $totalCost);
|
|
if($customerInfo['isSameCompanyAsCl'] == 1){
|
|
if($row['packagePayPeriod'] > 0){
|
|
$row['fixedExtra'] = $row['minimalFixedPrice'];
|
|
$row['recurentExtra'] = $prices->getRecurrentPriceMortage($row, $margins['clMargin'], $interestRateValue);
|
|
}else{
|
|
$row['fixedExtra'] = $row['minimalFixedPrice'] - $margins['clMargin'];
|
|
$row['recurentExtra'] = 0;
|
|
}
|
|
$row['servicesExtra'] = $row['minimalServicesPrice'];
|
|
}else{
|
|
$row['fixedExtra'] = $row['fixedExtra'] + $row['minimalFixedPrice'];
|
|
$row['recurentExtra'] = $row['packagePayPeriod'] > 0
|
|
? $row['recurentExtra'] + $prices->getRecurrentPriceMortage($row, 0, $interestRateValue)
|
|
: 0;
|
|
$row['servicesExtra'] = $row['servicesExtra'] + $row['minimalServicesPrice'];
|
|
}
|
|
unset($row['minimalFixedPrice']);
|
|
unset($row['minimalServicesPrice']);
|
|
unset($row['principalAmount']);
|
|
$row['isSameCompanyAsCl'] = $customerInfo['isSameCompanyAsCl'];
|
|
|
|
return $row;
|
|
}
|
|
|
|
/**
|
|
* get all prices types for a package by commercial lead
|
|
* @param INT $idCommercialLead id for commercial lead
|
|
* @param INT $idPackage id for package(in case of additional or optional it represents the parent package)
|
|
* @param INT $type id for package type => see self::PACKAGE_TYPES
|
|
* @return Array prices array
|
|
*/
|
|
public function getPricesForPackages($idCommercialLead, $idPackage, $type, $idPaymentType = 0){
|
|
global $database, $user;
|
|
$data = [];
|
|
$whereSql = "";
|
|
$extraJoin = "";
|
|
$idUser = $user->getUserId();
|
|
$prices = new Prices();
|
|
$clCustomersInst = new ClCustomers();
|
|
$orderTypeInst = new OrderType();
|
|
$interestRate = new InterestRate();
|
|
$customerInfo = $clCustomersInst->getClCustomerInfo($idCommercialLead);
|
|
$orderType = $customerInfo['idOrderType'] ? $customerInfo['idOrderType'] : $orderTypeInst->getCLDefaultOrderType($idCommercialLead);
|
|
|
|
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";
|
|
}
|
|
|
|
$productPrices = $prices->getPackageProductPrices($idPackage);
|
|
$totalCost = $prices->calculatePackageTotalCost($productPrices);
|
|
$commissionSplit = $prices->getCommissionSplit($idPackage);
|
|
$interestRateValue = $interestRate->getInterestRate();
|
|
$interestRateCustomers = $interestRate->getInterestRateForCustomers();
|
|
|
|
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";
|
|
}
|
|
|
|
if($idPaymentType){
|
|
$whereSql .= " AND plcl.idPaymentType=$idPaymentType";
|
|
}
|
|
|
|
$sql = "SELECT
|
|
IF(custom_prices.idCustomer != 0, custom_prices.idCustomer, c.id) AS idCustomer,
|
|
plcl.id as idPrice,
|
|
plb.idPackage,
|
|
plb.idPaymentType,
|
|
pt.payType,
|
|
pt.packagePayPeriod,
|
|
pt.servicesContractPeriod,
|
|
pt.periodUnit,
|
|
pt.maxContractPeriod,
|
|
plcl.fixedExtra,
|
|
plcl.recurentExtra,
|
|
plcl.servicesExtra,
|
|
plb.minimalFixedPrice,
|
|
plb.minimalServicesPrice,
|
|
plb.principalAmount
|
|
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 = $idUser 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
|
|
INNER JOIN ".TABLES['customers']." c
|
|
ON c.idUser = ".$idUser;
|
|
|
|
$query = $database->query($sql);
|
|
while($row = $database->fetchArray($query)){
|
|
$interestRateCust = array_key_exists($row['idCustomer'], $interestRateCustomers) ? $interestRateCustomers[$row['idCustomer']] : $interestRateValue['interestRate'];
|
|
$row = $this->generatePackagePayRow($row, $orderType, $customerInfo, $commissionSplit, $totalCost, $interestRateCust);
|
|
$data[$row['idPackage']][] = $row;
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* checks if the customer is from the same company as the commercial lead
|
|
* @param Int $idUser id of the user
|
|
* @param Int $idCommercialLead id of the commercial lead
|
|
* @return Int 1 if they are from the same company
|
|
*/
|
|
public function checkIfCustomerIsFromCommercialLeadCompany($idCommercialLead, $isForCart = false) {
|
|
global $database, $user;
|
|
$extraJoin = "";
|
|
$joinClause = "";
|
|
$whereClause = "";
|
|
$idUser = $user->getUserId();
|
|
|
|
if($user->getUserType() !== USER_TYPES['CUSTOMER']) {
|
|
return;
|
|
}
|
|
|
|
if($isForCart) {
|
|
$extraJoin = "INNER JOIN ".TABLES['web_shop_cart']." cart
|
|
ON cart.idUser = $idUser
|
|
INNER JOIN ".TABLES['rel_commercial_lead_customers']." rclc
|
|
ON rclc.id = cart.idCustomerInstance";
|
|
$joinClause = "AND cl.id = rclc.idCommercialLead";
|
|
} else {
|
|
$whereClause = "WHERE cl.id = $idCommercialLead";
|
|
}
|
|
|
|
$sql = "SELECT
|
|
u.idCompany
|
|
FROM
|
|
".TABLES['users']." u
|
|
$extraJoin
|
|
INNER JOIN ".TABLES['commercial_leads']." cl
|
|
ON u.id = cl.idUser
|
|
$joinClause
|
|
INNER JOIN
|
|
(SELECT
|
|
us.idCompany
|
|
FROM
|
|
".TABLES['users']." us
|
|
WHERE us.id = $idUser) userCompany
|
|
ON userCompany.idCompany = u.idCompany
|
|
$whereClause";
|
|
$result = $database->query($sql);
|
|
|
|
return $database->numRows($result) > 0;
|
|
}
|
|
}
|