Initial commit
This commit is contained in:
193
api-wiaas/server/components/v2/packages/Packages.php
Normal file
193
api-wiaas/server/components/v2/packages/Packages.php
Normal file
@@ -0,0 +1,193 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user