Files
old-wiaas-legacy/api-wiaas/server/components/v1/packages/PacakgeOptionsManager.php
2018-06-11 11:09:35 +02:00

394 lines
14 KiB
PHP

<?php
class PacakgeOptionsManager{
const PACKAGE_TYPES = [
'ID_STANDARD_TYPE' => 1,
'ID_OPTION_TYPE' => 2,
'ID_ADDITIONAL_TYPE' => 3
];
/**
* get options bu group
* @return ARRAY list of options
*/
private function getGroupOptions($packagePrices){
global $database;
$data = [];
$sql = "SELECT
rgo.idGroup,
rgo.idOptionPackage AS idPackage,
rgo.isDefault,
p.name AS packageName
FROM ".TABLES['rel_group_options']." rgo
INNER JOIN ".TABLES['packages']." p
ON p.id=rgo.idOptionPackage
ORDER BY p.name ASC";
$query = $database->query($sql);
while($row = $database->fetchArray($query)){
$row['prices'] = isset($packagePrices[$row['idPackage']]['broker']) ? $packagePrices[$row['idPackage']]['broker'] : [];
$row['commercialLeadPrices'] = isset($packagePrices[$row['idPackage']]['commercial_lead']) ? $packagePrices[$row['idPackage']]['commercial_lead'] : [];
$data[$row['idGroup']][] = $row;
}
return $data;
}
/**
* get groups for packages
* @return ARRAY list of option groups
*/
private function getPackagesOptionGroups($packagePrices) {
global $database;
$data = [];
$groupOptions = $this->getGroupOptions($packagePrices);
$sql = "SELECT
pog.id AS idGroup,
pog.idPackage,
pog.name AS groupName
FROM ".TABLES['package_option_groups']." pog";
$query = $database->query($sql);
while($row = $database->fetchArray($query)){
$idPackage = $row['idPackage'];
$row['options'] = isset($groupOptions[$row['idGroup']]) ? $groupOptions[$row['idGroup']] : [];
$data[$idPackage][] = $row;
}
return $data;
}
/**
* get additional packages
* @return ARRAY list of additional packages
*/
private function getAdditionalPackages($packagePrices) {
global $database;
$data = [];
$sql = "SELECT
rap.idAdditionalPackage AS idPackage,
rap.idPackage AS idParentPackage,
p.name AS packageName
FROM ".TABLES['rel_additional_packages']." rap
INNER JOIN ".TABLES['packages']." p
ON p.id=rap.idAdditionalPackage
ORDER BY p.name ASC";
$query = $database->query($sql);
while($row = $database->fetchArray($query)){
$row['prices'] = isset($packagePrices[$row['idPackage']]['broker']) ? $packagePrices[$row['idPackage']]['broker'] : [];
$row['commercialLeadPrices'] = isset($packagePrices[$row['idPackage']]['commercial_lead']) ? $packagePrices[$row['idPackage']]['commercial_lead'] : [];
$data[$row['idParentPackage']][] = $row;
}
return $data;
}
private function getPackagePrices($onlyLinked) {
global $database, $user;
$extraJoin = "";
$extraFields = "";
$whereSql = "WHERE 1=1 ";
$data = [];
if($onlyLinked){
$extraJoin = "INNER JOIN ".TABLES['packages']." p
ON plb.idPackage=p.id";
$whereSql = " AND p.idPackageType IN(".self::PACKAGE_TYPES['ID_OPTION_TYPE'].", ".self::PACKAGE_TYPES['ID_ADDITIONAL_TYPE'].")";
}
if($user->getUserType() === USER_TYPES['COMMERCIAL_LEAD']){
$extraJoin .= " LEFT OUTER JOIN
(
SELECT plcl.idPackage, plcl.idPaymentType
FROM ".TABLES['price_list_commercial_lead']." plcl
INNER JOIN ".TABLES['commercial_leads']." cl
ON cl.id=plcl.idCommercialLead
WHERE plcl.idCustomer IS NULL AND cl.idUser=".$user->getUserId()."
) plcl
ON plcl.idPackage=plb.idPackage AND plcl.idPaymentType=plb.idPaymentType
";
$extraFields = 'plcl.idPaymentType AS clPaymentType,';
}
$sql = "SELECT
$extraFields
plb.idPackage,
plb.idPaymentType
FROM ".TABLES['price_list_broker']." plb
INNER JOIN ".TABLES['payment_types']." pt
ON pt.id=plb.idPaymentType
$extraJoin
$whereSql";
$query = $database->query($sql);
while($row = $database->fetchArray($query)){
$data[$row['idPackage']]['broker'][] = $row['idPaymentType'];
if(isset($row['clPaymentType'])){
$data[$row['idPackage']]['commercial_lead'][] = $row['clPaymentType'];
}
}
return $data;
}
/**
* get all packages by package type
* @return ARRAY list of packages
*/
public function getOptionsAndPackages() {
global $database;
$data = [
'standard' => [],
'option' => [],
'additional' => []
];
$packageTypesIds = [
'STANDARD' => 1,
'OPTIONS' => 2,
'ADDITIONALS' => 3
];
$packagePrices = $this->getPackagePrices(false);
$packageOptionGroups = $this->getPackagesOptionGroups($packagePrices);
$additionalPackages = $this->getAdditionalPackages($packagePrices);
$sql = "SELECT p.id AS idPackage,
p.name AS packageName,
pt.id AS idPackageType,
pt.packageType,
c.code AS countryCode
FROM ".TABLES['packages']." p
INNER JOIN ".TABLES['package_types']." pt
ON pt.id=p.idPackageType
INNER JOIN ".TABLES['countries']." c
ON c.id=p.idCountry
INNER JOIN (
SELECT
DISTINCT idPackage
FROM ".TABLES['price_list_broker']."
) plb
ON plb.idPackage=p.id
ORDER BY p.name ASC";
$query = $database->query($sql);
while($row = $database->fetchArray($query)){
if(intval($row['idPackageType']) === $packageTypesIds['STANDARD']){
$row['groups'] = isset($packageOptionGroups[$row['idPackage']]) ? $packageOptionGroups[$row['idPackage']] : [];
$row['additionalPackages'] = isset($additionalPackages[$row['idPackage']]) ? $additionalPackages[$row['idPackage']] : [];
}
$row['prices'] = isset($packagePrices[$row['idPackage']]) ? $packagePrices[$row['idPackage']]['broker'] : [];
$data[$row['packageType']][] = $row;
}
return $data;
}
/**
* add new option group
* @param INT $idPackage id for package
* @param String $name id for the option group
* @return INT inserted group id
*/
private function addOptionGroup($idPackage, $name){
global $database;
$sql = "INSERT INTO ".TABLES['package_option_groups']."
(idPackage, name)
VALUES($idPackage, '$name')";
$query = $database->query($sql);
return $database->getInsertId();
}
/**
* update options in a group
* @param INT $idPackage id for the pacakge
* @param ARRAY $group list of options for a group
* @return ARRAY update message
*/
private function addGroupOptions($idPackage, $group){
global $database;
$data = ['updated' => 0];
$group->idGroup = $database->escapeValue($group->idGroup);
$group->groupName = $database->escapeValue($group->groupName);
if(!$group->groupName){
$data['messages'][] = [
'code' => 'error',
'message' => 'INVALID_GROUP_NAME',
'key' => $group->groupName
];
return $data;
}
if(strpos($group->idGroup, 'new') !== false){
$group->idGroup = $this->addOptionGroup($idPackage, $group->groupName);
}
if(empty($group->options)){
$data['messages'][] = [
'code' => 'error',
'message' => 'INVALID_OPTIONS'
];
return $data;
}
$optionsToNotDelete = [];
$optionValues = "";
foreach ($group->options as $option) {
$optionValues .= "(".$group->idGroup.",".$option->idPackage.", ".$option->isDefault."),";
$optionsToNotDelete[] = $option->idPackage;
}
$optionValues= rtrim($optionValues, ',');
$sqlInsertOption = "INSERT INTO ".TABLES['rel_group_options']."
(idGroup, idOptionPackage, isDefault)
VALUES $optionValues
ON DUPLICATE KEY UPDATE
isDefault=VALUES(isDefault)";
$query = $database->query($sqlInsertOption);
$updated = $database->affectedRows();
$optionsToNotDelete = implode(',', $optionsToNotDelete);
$sqlDelete = "DELETE FROM ".TABLES['rel_group_options']."
WHERE idGroup=".$group->idGroup." AND idOptionPackage NOT IN(".$optionsToNotDelete.")";
$query = $database->query($sqlDelete);
$updated += $database->affectedRows();
$data['updated'] = $updated;
$data['updatedGroupId'] = $group->idGroup;
return $data;
}
/**
* update additional packages link
* @param INT $idPackage id for package
* @param ARRAY $additionalPackages list of additional packages
* @return ARRAY update message
*/
public function updateAdditionalForPackage($idPackage, $additionalPackages){
global $database;
$data = ['updated' => 0];
$additionalsToNotDelete = [];
$additonalValues = "";
if(!empty($additionalPackages)){
foreach ($additionalPackages as $additionaPackage) {
$additionaPackage->idPackage = $database->escapeValue($additionaPackage->idPackage);
$additonalValues .= "(".$idPackage.", ".$additionaPackage->idPackage."),";
$additionalsToNotDelete[] = $additionaPackage->idPackage;
}
$additonalValues= rtrim($additonalValues, ',');
$sqlInsertAdditional = "INSERT IGNORE INTO ".TABLES['rel_additional_packages']."
(idPackage, idAdditionalPackage)
VALUES $additonalValues";
$query = $database->query($sqlInsertAdditional);
$data['updated'] += $database->affectedRows();
$additionalsToNotDelete = implode(',', $additionalsToNotDelete);
$sqlDelete = "DELETE FROM ".TABLES['rel_additional_packages']."
WHERE idPackage=".$idPackage." AND idAdditionalPackage NOT IN(".$additionalsToNotDelete.")";
$query = $database->query($sqlDelete);
$data['updated'] += $database->affectedRows();
}else{
$sqlDelete = "DELETE FROM ".TABLES['rel_additional_packages']."
WHERE idPackage=".$idPackage."";
$query = $database->query($sqlDelete);
$data['updated'] += $database->affectedRows();
}
return $data;
}
/**
* update package options and addiitonal packages
* @param INT $idPackage id for the package for witch we do the link
* @param String $groups list of groups to be linked
* @param String $additionalPackages list of additional packages to be linked
* @return ARRAY update message
*/
public function updatePackageOptions($idPackage, $groups, $additionalPackages){
global $database;
$data = ['messages' => []];
$idPackage = $database->escapeValue($idPackage);
$groups = json_decode($groups);
$additionalPackages = json_decode($additionalPackages);
$database->beginTransaction();
$updated = 0;
$updateMessage = $this->updateAdditionalForPackage($idPackage, $additionalPackages);
$updated += $updateMessage['updated'];
if(isset($updateMessage['messages'])){
$data['messages'] = array_merge($data['messages'], $updateMessage['messages']);
}
$groupsToNotDelete = [];
foreach ($groups as $group) {
$updateMessage = $this->addGroupOptions($idPackage, $group);
$updated += $updateMessage['updated'];
if(isset($updateMessage['updatedGroupId'])){
$groupsToNotDelete[] = $updateMessage['updatedGroupId'];
}
if(isset($updateMessage['messages'])){
$data['messages'] = array_merge($data['messages'], $updateMessage['messages']);
}
}
if(!empty($data['messages'])){
$database->rollback();
return $data;
}
if(!empty($groupsToNotDelete)){
$groupsToNotDelete = implode(',', $groupsToNotDelete);
$sqlDelete = "DELETE FROM ".TABLES['package_option_groups']."
WHERE idPackage=$idPackage AND id NOT IN($groupsToNotDelete)";
$query = $database->query($sqlDelete);
$updated += $database->affectedRows();
}else{
$sqlDelete = "DELETE FROM ".TABLES['package_option_groups']."
WHERE idPackage=$idPackage";
$query = $database->query($sqlDelete);
$updated += $database->affectedRows();
}
$database->commit();
if($updated === 0){
$data['messages'][] = [
'code' => 'warning',
'message' => 'NO_CHANGES'
];
}else{
$data['messages'][] = [
'code' => 'success',
'message' => 'OPTIONS_UPDATED'
];
}
return $data;
}
/**
* get extra packages that are linked to standard pacakges
* @return HashArray list of additional packages and option groups
*/
public function getExtraLinkedPackages(){
global $database;
$data = [];
$packagePrices = $this->getPackagePrices(true);
$data['groups'] = $this->getPackagesOptionGroups($packagePrices);
$data['additionalPackages'] = $this->getAdditionalPackages($packagePrices);
return $data;
}
}