Initial commit
This commit is contained in:
83
api-wiaas/server/components/v1/packages/CustomerPackages.php
Normal file
83
api-wiaas/server/components/v1/packages/CustomerPackages.php
Normal file
@@ -0,0 +1,83 @@
|
||||
<?php
|
||||
|
||||
class CustomerPackages{
|
||||
const PACKAGE_TYPES = [
|
||||
'ID_STANDARD_TYPE' => 1,
|
||||
'ID_OPTION_TYPE' => 2,
|
||||
'ID_ADDITONAL_TYPE' => 3
|
||||
];
|
||||
|
||||
public function getShopPackages($idCommercialLead, $idCustomer, $idPackage = 0, $search = ''){
|
||||
global $database;
|
||||
|
||||
$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.name AS packageName
|
||||
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.id = $idCustomer 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.id DESC";
|
||||
|
||||
return $database->fetchResultArray($sql);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,393 @@
|
||||
<?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;
|
||||
}
|
||||
|
||||
}
|
||||
86
api-wiaas/server/components/v1/packages/PackageDocuments.php
Normal file
86
api-wiaas/server/components/v1/packages/PackageDocuments.php
Normal file
@@ -0,0 +1,86 @@
|
||||
<?php
|
||||
|
||||
class PackageDocuments{
|
||||
private function getProductDocuments($idPackage = 0){
|
||||
global $database, $user;
|
||||
$whreSql = "";
|
||||
$maxInstWhereSql = "";
|
||||
$data = [];
|
||||
|
||||
if($user->getUserType() !== USER_TYPES['BROKER']){
|
||||
$whreSql = " AND visibleToCustomer=1";
|
||||
}
|
||||
|
||||
if($idPackage !== 0){
|
||||
$whreSql .= " AND rpp.idPackage=$idPackage";
|
||||
$maxInstWhereSql = "AND idPackage=$idPackage";
|
||||
}
|
||||
|
||||
$sql = "SELECT
|
||||
d.id AS idDocument,
|
||||
d.documentName,
|
||||
d.documentPath,
|
||||
d.extension,
|
||||
dt.type AS documentType,
|
||||
rpp.idPackage,
|
||||
rpd.idProduct
|
||||
FROM ".TABLES['rel_product_documents']." rpd
|
||||
INNER JOIN ".TABLES['documents']." d
|
||||
ON d.id=rpd.idDocument
|
||||
INNER JOIN ".TABLES['document_types']." dt
|
||||
ON dt.id=d.idDocumentType
|
||||
INNER JOIN ".TABLES['rel_package_products']." rpp
|
||||
ON rpp.idProduct=rpd.idProduct
|
||||
INNER JOIN (
|
||||
SELECT MAX(packageInstance) as maxInstance, idPackage
|
||||
FROM ".TABLES['rel_package_products']."
|
||||
WHERE 1=1 $maxInstWhereSql
|
||||
GROUP BY idPackage
|
||||
) max_inst
|
||||
ON max_inst.maxInstance=rpp.packageInstance AND max_inst.idPackage=rpp.idPackage
|
||||
WHERE 1=1 $whreSql
|
||||
";
|
||||
$query = $database->query($sql);
|
||||
while($row = $database->fetchArray($query)){
|
||||
$data[$row['idPackage']][] = $row;
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* get package documents
|
||||
* @param INT $idPackage id for the pacakge
|
||||
* @return Array list of documents
|
||||
*/
|
||||
public function getPackageDocuments($idPackage = 0){
|
||||
global $database;
|
||||
$data[$idPackage] = [];
|
||||
$whereSql = $idPackage !== 0 ? "WHERE rpd.idPackage=$idPackage" : "";
|
||||
|
||||
$sql = "SELECT
|
||||
d.id AS idDocument,
|
||||
d.documentName,
|
||||
d.extension,
|
||||
rpd.idPackage
|
||||
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
|
||||
$whereSql ";
|
||||
|
||||
$query = $database->query($sql);
|
||||
while($row = $database->fetchArray($query)){
|
||||
$data[$row['idPackage']][] = $row;
|
||||
}
|
||||
$productDocuments = $this->getProductDocuments($idPackage);
|
||||
foreach ($data as $idPackage => &$documents) {
|
||||
if(isset($productDocuments[$idPackage])){
|
||||
$documents = array_merge($documents, $productDocuments[$idPackage]);
|
||||
}
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
197
api-wiaas/server/components/v1/packages/Packages.php
Normal file
197
api-wiaas/server/components/v1/packages/Packages.php
Normal file
@@ -0,0 +1,197 @@
|
||||
<?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']);
|
||||
$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, $idCustomer = 0){
|
||||
global $database, $user;
|
||||
$data = [];
|
||||
$whereSql = "";
|
||||
$extraJoin = "";
|
||||
$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($idCustomer === 0){
|
||||
$customerSql = "c.idUser=".$user->getUserId();
|
||||
}else{
|
||||
$customerSql = "c.id=".$idCustomer;
|
||||
}
|
||||
|
||||
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']." c
|
||||
ON c.id = plcl.idCustomer
|
||||
WHERE
|
||||
($customerSql OR c.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 $customerSql";
|
||||
|
||||
$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;
|
||||
}
|
||||
}
|
||||
395
api-wiaas/server/components/v1/packages/PackagesController.php
Normal file
395
api-wiaas/server/components/v1/packages/PackagesController.php
Normal file
@@ -0,0 +1,395 @@
|
||||
<?php
|
||||
class PackagesController{
|
||||
private $model;
|
||||
|
||||
function __construct(){
|
||||
$this->model = new PackagesModel();
|
||||
}
|
||||
|
||||
/**
|
||||
* returns json array with virtual products available by categories
|
||||
* @return array with products info
|
||||
*/
|
||||
public function getVirtualProductsByCategories(){
|
||||
echo json_encode($this->model->getVirtualProductsByCategories());
|
||||
}
|
||||
|
||||
public function getProductsByCategory() {
|
||||
$country = isset($_REQUEST['idCountry']) ? $_REQUEST['idCountry'] : 0;
|
||||
echo json_encode($this->model->getProductsByCategory($country));
|
||||
}
|
||||
|
||||
/**
|
||||
* returns a failure or success message for adding the template package in the DB
|
||||
* @return a failure or success message
|
||||
*/
|
||||
public function createTemplatePackagesData(){
|
||||
$packageInfo = isset($_REQUEST['packageInfo']) ? $_REQUEST['packageInfo'] : [];
|
||||
$products = isset($_REQUEST['products']) ? $_REQUEST['products'] : [];
|
||||
echo json_encode($this->model->createTemplatePackagesData($packageInfo, $products));
|
||||
}
|
||||
|
||||
/**
|
||||
* returns a failure or success message for adding the package in the DB
|
||||
* @return a failure or success message
|
||||
*/
|
||||
public function createPackagesData(){
|
||||
$packageData = isset($_REQUEST['packageData']) ? $_REQUEST['packageData'] : [];
|
||||
$packageInfo = isset($_REQUEST['packageInfo']) ? $_REQUEST['packageInfo'] : [];
|
||||
echo json_encode($this->model->createPackagesData($packageData, $packageInfo));
|
||||
}
|
||||
|
||||
/**
|
||||
* returns json array with table headers for packages
|
||||
* @return list all columns headers
|
||||
*/
|
||||
public function getPackagesHeaders(){
|
||||
echo json_encode($this->model->getPackagesHeaders('array'));
|
||||
}
|
||||
|
||||
/**
|
||||
* returns json response for packages
|
||||
* @return list packages json
|
||||
*/
|
||||
public function getPackages(){
|
||||
$idCountry = isset($_REQUEST['idCountry']) ? $_REQUEST['idCountry'] : 0;
|
||||
$data = ['data' => $this->model->getPackages($idCountry)];
|
||||
echo json_encode($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* returns json array with table headers for my packages
|
||||
* @return list all columns headers
|
||||
*/
|
||||
public function getMyPackagesHeaders(){
|
||||
echo json_encode($this->model->getMyPackagesHeaders('array'));
|
||||
}
|
||||
|
||||
/**
|
||||
* returns json response for my packages
|
||||
* @return list my packages json
|
||||
*/
|
||||
public function getMyPackages(){
|
||||
$country = isset($_REQUEST['idCountry']) ? $_REQUEST['idCountry'] : 0;
|
||||
$data = ['data' => $this->model->getMyPackages($country)];
|
||||
echo json_encode($data);
|
||||
}
|
||||
|
||||
public function getCustomerPrices() {
|
||||
$idPackage = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
|
||||
$idCustomer = isset($_REQUEST['idCustomer']) ? $_REQUEST['idCustomer'] : 0;
|
||||
echo json_encode($this->model->getCustomerPrices($idPackage, $idCustomer));
|
||||
}
|
||||
|
||||
public function uploadNewImage() {
|
||||
$file = isset($_FILES['file']) ? $_FILES['file'] : [];
|
||||
$options = isset($_REQUEST['options']) ? $_REQUEST['options'] : [];
|
||||
echo json_encode($this->model->uploadNewImage($file, $options));
|
||||
}
|
||||
|
||||
public function getImagesFromCdn() {
|
||||
$idCountry = isset($_REQUEST['idCountry']) ? $_REQUEST['idCountry'] : 0;
|
||||
$idPackage = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
|
||||
echo json_encode($this->model->getImagesFromCdn($idCountry, $idPackage));
|
||||
}
|
||||
|
||||
public function saveCoverPhotoForPackage() {
|
||||
$idPackage = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
|
||||
$publicId = isset($_REQUEST['publicId']) ? $_REQUEST['publicId'] : '';
|
||||
echo json_encode($this->model->saveCoverPhotoForPackage($idPackage, $publicId));
|
||||
}
|
||||
|
||||
/**
|
||||
* include packages template
|
||||
*/
|
||||
public function packagesTemplate(){
|
||||
global $user;
|
||||
require_once('templates/PackagesTemplate.php');
|
||||
}
|
||||
|
||||
/**
|
||||
* include create packages tempalte
|
||||
*/
|
||||
public function createTemplatePackagesTemplate(){
|
||||
require_once('templates/CreateTemplatePackagesTemplate.php');
|
||||
}
|
||||
|
||||
/**
|
||||
* include create packages tempalte
|
||||
*/
|
||||
public function createPackagesTemplate(){
|
||||
require_once('templates/CreatePackagesTemplate.php');
|
||||
}
|
||||
|
||||
/**
|
||||
* include create packages from template template
|
||||
*/
|
||||
public function createPackagesFromTemplateTemplate(){
|
||||
require_once('templates/CreatePackagesFromTemplateTemplate.php');
|
||||
}
|
||||
|
||||
/**
|
||||
* include view package process template
|
||||
*/
|
||||
public function viewPackageProcessesTemplate() {
|
||||
require_once('templates/ViewPackageProcessesTemplate.php');
|
||||
}
|
||||
|
||||
/**
|
||||
* include edit packages template
|
||||
*/
|
||||
public function editPackagesTemplate() {
|
||||
require_once('templates/EditPackagesTemplate.php');
|
||||
}
|
||||
|
||||
/**
|
||||
* include generic package products by categoruies drag and drop lists
|
||||
*/
|
||||
public function productsByCategoriesDragDropTemplate() {
|
||||
require_once('templates/ProductsByCategoriesDragDropTemplate.php');
|
||||
}
|
||||
|
||||
/**
|
||||
* include generic package template products by categories drag and drop lists
|
||||
*/
|
||||
public function productsTemplateByCategoriesDragDropTemplate() {
|
||||
require_once('templates/ProductsTemplateByCategoriesDragDropTemplate.php');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* include custom html for editing package templates
|
||||
*/
|
||||
public function editPackageTemplatesHtml() {
|
||||
require_once('templates/EditPackageTemplatesHtml.php');
|
||||
}
|
||||
|
||||
/**
|
||||
* include add packages process template
|
||||
*/
|
||||
public function addPackageProcessTemplate() {
|
||||
require_once('templates/AddPackageProcessTemplate.php');
|
||||
}
|
||||
|
||||
/**
|
||||
* include select package template
|
||||
* @return html template for select package
|
||||
*/
|
||||
public function selectPackage() {
|
||||
require_once('templates/SelectPackage.html');
|
||||
}
|
||||
|
||||
/**
|
||||
* include my package details template
|
||||
* @return html template for my packages details
|
||||
*/
|
||||
public function myPackagesDetails() {
|
||||
require_once('templates/MyPackagesDetails.html');
|
||||
}
|
||||
|
||||
/**
|
||||
* include set price for package temmplate
|
||||
* @return html template for set package price
|
||||
*/
|
||||
public function setPackagePrice() {
|
||||
require_once('templates/SetPackagePrice.html');
|
||||
}
|
||||
|
||||
/**
|
||||
* include temmplate for adding virtual products
|
||||
* @return html template for adding virtual products
|
||||
*/
|
||||
public function addVirtualProductsTemplate() {
|
||||
require_once('templates/AddVirtualProductsTemplate.php');
|
||||
}
|
||||
|
||||
/**
|
||||
* include temmplate for package options
|
||||
* @return html template for package options
|
||||
*/
|
||||
public function packageOptionsTemplate() {
|
||||
require_once('templates/PackageOptionsTemplate.html');
|
||||
}
|
||||
|
||||
/**
|
||||
* include temmplate for uploading images with CDN
|
||||
* @return html template for image upload
|
||||
*/
|
||||
public function uploadImageCdnTemplate() {
|
||||
require_once('templates/UploadImageCdnTemplate.php');
|
||||
}
|
||||
|
||||
/**
|
||||
* include template for viewing images from CDN
|
||||
* @return html template for image viewing
|
||||
*/
|
||||
public function displayCdnImagesTemplate() {
|
||||
require_once('templates/DisplayCdnImagesTemplate.php');
|
||||
}
|
||||
|
||||
/**
|
||||
* include temmplate for package details
|
||||
* @return html template for package details
|
||||
*/
|
||||
public function packagesDetailsTemplate(){
|
||||
global $user;
|
||||
require_once('templates/PackagesDetailsTemplate.php');
|
||||
}
|
||||
|
||||
/**
|
||||
* get all commecrial lead customers linked to package
|
||||
* @return json list with commercial lead customers
|
||||
*/
|
||||
public function getComercialLeadCustomers(){
|
||||
$idPacakge = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
|
||||
echo json_encode($this->model->getComercialLeadCustomers($idPacakge));
|
||||
}
|
||||
|
||||
/**
|
||||
* get details for a pacakge
|
||||
* @return json package details
|
||||
*/
|
||||
public function getPackageInfo(){
|
||||
$idPacakge = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
|
||||
echo json_encode($this->model->getPackageInfo($idPacakge));
|
||||
}
|
||||
|
||||
/**
|
||||
* get prices for a package (for broker and if set for commercial lead)
|
||||
* @return json price list
|
||||
*/
|
||||
public function getBrokerPriceList(){
|
||||
$idPacakge = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
|
||||
$idCustomer = isset($_REQUEST['idCustomer']) ? $_REQUEST['idCustomer'] : 0;
|
||||
echo json_encode($this->model->getBrokerPriceList($idPacakge, $idCustomer));
|
||||
}
|
||||
|
||||
/**
|
||||
* update dfeault prices for a commercial lead
|
||||
* @return json update message
|
||||
*/
|
||||
public function updateDefaultPrices(){
|
||||
$idPacakge = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
|
||||
$defaultPrices = isset($_REQUEST['defaultPrices']) ? $_REQUEST['defaultPrices'] : [];
|
||||
echo json_encode($this->model->updateDefaultPrices($idPacakge, $defaultPrices));
|
||||
}
|
||||
|
||||
/**
|
||||
* update insert or update a price list for the commercial lead
|
||||
* @return json update message
|
||||
*/
|
||||
public function updateMyPackage(){
|
||||
$idPacakge = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
|
||||
$selectedCustomers = isset($_REQUEST['selectedCustomers']) ? $_REQUEST['selectedCustomers'] : [];
|
||||
echo json_encode($this->model->updateMyPackage($idPacakge, $selectedCustomers));
|
||||
}
|
||||
|
||||
/**
|
||||
* get prices by types and supplier products total price
|
||||
* @return json lit of prices
|
||||
*/
|
||||
public function getPriceTypes(){
|
||||
$idPacakge = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
|
||||
$sumBy = isset($_REQUEST['sumBy']) ? $_REQUEST['sumBy'] : 'type';
|
||||
echo json_encode($this->model->getPriceTypes($idPacakge, $sumBy), JSON_NUMERIC_CHECK);
|
||||
}
|
||||
|
||||
/**
|
||||
* update values for package prices and comission split
|
||||
* @return josn update message
|
||||
*/
|
||||
public function updateBrokerPricesAndCommission(){
|
||||
$idPacakge = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
|
||||
$prices = isset($_REQUEST['prices']) ? $_REQUEST['prices'] : [];
|
||||
$commissionSplit = isset($_REQUEST['commissionSplit']) ? $_REQUEST['commissionSplit'] : [];
|
||||
echo json_encode($this->model->updateBrokerPricesAndCommission($idPacakge, $prices, $commissionSplit));
|
||||
}
|
||||
|
||||
/**
|
||||
* returns json response for template packages
|
||||
* @return list template packages json
|
||||
*/
|
||||
public function getTemplatePackages(){
|
||||
echo json_encode($this->model->getTemplatePackages());
|
||||
}
|
||||
|
||||
/**
|
||||
* returns json response for editable template packages
|
||||
* @return list template packages json
|
||||
*/
|
||||
public function getTemplatePackagesForEdit(){
|
||||
echo json_encode($this->model->getTemplatePackagesForEdit());
|
||||
}
|
||||
|
||||
/**
|
||||
* get products for selected package
|
||||
* @return json list of products
|
||||
*/
|
||||
public function getProductsInPackage(){
|
||||
$idCountry = isset($_REQUEST['idCountry']) ? $_REQUEST['idCountry'] : 0;
|
||||
$idPackage = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
|
||||
echo json_encode($this->model->getProductsInPackage($idCountry, $idPackage));
|
||||
}
|
||||
|
||||
/**
|
||||
* update packages
|
||||
* @return status message
|
||||
*/
|
||||
public function updateInformationDataInPackage(){
|
||||
$packageData = isset($_REQUEST['packageData']) ? $_REQUEST['packageData'] : '[]';
|
||||
$packageInfo = isset($_REQUEST['packageInfo']) ? $_REQUEST['packageInfo'] : '[]';
|
||||
echo json_encode($this->model->updateInformationDataInPackage($packageData, $packageInfo));
|
||||
}
|
||||
|
||||
/**
|
||||
* update package templates
|
||||
* @return status message
|
||||
*/
|
||||
public function updateInformationDataInPackageTemplate(){
|
||||
$packageInfo = isset($_REQUEST['packageInfo']) ? $_REQUEST['packageInfo'] : '[]';
|
||||
$products = isset($_REQUEST['products']) ? $_REQUEST['products'] : '[]';
|
||||
echo json_encode($this->model->updateInformationDataInPackageTemplate($packageInfo, $products));
|
||||
}
|
||||
|
||||
/**
|
||||
* get all product categories
|
||||
*/
|
||||
public function getProductCategories() {
|
||||
echo json_encode($this->model->getProductCategories());
|
||||
}
|
||||
|
||||
/**
|
||||
* insert new virtual product
|
||||
*/
|
||||
public function addVirtualProduct() {
|
||||
$productName = isset($_REQUEST['productName']) ? $_REQUEST['productName'] : '';
|
||||
$idCategory = isset($_REQUEST['idCategory']) ? $_REQUEST['idCategory'] : 0;
|
||||
echo json_encode($this->model->addVirtualProduct($productName, $idCategory));
|
||||
}
|
||||
|
||||
/**
|
||||
* insert new virtual product
|
||||
*/
|
||||
public function getOptionsAndPackages() {
|
||||
$idCountry = isset($_REQUEST['idCountry']) ? $_REQUEST['idCountry'] : 0;
|
||||
echo json_encode($this->model->getOptionsAndPackages($idCountry));
|
||||
}
|
||||
|
||||
public function getPackageTypes(){
|
||||
echo json_encode($this->model->getPackageTypes());
|
||||
}
|
||||
|
||||
public function updatePackageOptions(){
|
||||
$idPackage = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
|
||||
$groups = isset($_REQUEST['groups']) ? $_REQUEST['groups'] : '[]';
|
||||
$additionalPackages = isset($_REQUEST['additionalPackages']) ? $_REQUEST['additionalPackages'] : '[]';
|
||||
echo json_encode($this->model->updatePackageOptions($idPackage, $groups, $additionalPackages));
|
||||
}
|
||||
|
||||
/**
|
||||
* open packages page
|
||||
*/
|
||||
public function showPage(){
|
||||
require_once('PackagesPage.php');
|
||||
}
|
||||
}
|
||||
1979
api-wiaas/server/components/v1/packages/PackagesModel.php
Normal file
1979
api-wiaas/server/components/v1/packages/PackagesModel.php
Normal file
File diff suppressed because it is too large
Load Diff
23
api-wiaas/server/components/v1/packages/PackagesPage.php
Normal file
23
api-wiaas/server/components/v1/packages/PackagesPage.php
Normal file
@@ -0,0 +1,23 @@
|
||||
<script src="<?php echo PATH_JS_COMPONENTS.'packages/packages.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
|
||||
<script src="<?php echo PATH_JS_COMPONENTS.'packages/create-packages.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
|
||||
<script src="<?php echo PATH_JS_COMPONENTS.'packages/edit-packages.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
|
||||
<script src="<?php echo PATH_JS_COMPONENTS.'packages/edit-package-templates.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
|
||||
<script src="<?php echo PATH_JS_COMPONENTS.'packages/products-by-categories-drag-drop.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
|
||||
<script src="<?php echo PATH_JS_COMPONENTS.'packages/products-template-by-categories-drag-drop.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
|
||||
<script src="<?php echo PATH_JS_COMPONENTS.'packages/create-packages-from-template.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
|
||||
<script src="<?php echo PATH_JS_COMPONENTS.'packages/create-packages-template.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
|
||||
<script src="<?php echo PATH_JS_COMPONENTS.'packages/select-package.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
|
||||
<script src="<?php echo PATH_JS_COMPONENTS.'packages/packages-details.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
|
||||
<script src="<?php echo PATH_JS_COMPONENTS.'packages/my-packages-details.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
|
||||
<script src="<?php echo PATH_JS_COMPONENTS.'packages/set-package-price.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
|
||||
<script src="<?php echo PATH_JS_COMPONENTS.'packages/add-virtual-products.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
|
||||
<script src="<?php echo PATH_JS_COMPONENTS.'packages/packages-utils.service.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
|
||||
<script src="<?php echo PATH_JS_COMPONENTS.'packages/package-options.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
|
||||
<script src="<?php echo PATH_JS_COMPONENTS.'packages/upload-image-cdn.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
|
||||
<script src="<?php echo PATH_JS_COMPONENTS.'packages/display-cdn-images.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
|
||||
<script src="<?php echo PATH_JS_COMPONENTS.'financing/financing.service.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
|
||||
|
||||
<div id="packages" class="container-fluid col-md-12">
|
||||
<h1>{{ 'packages.TITLE' | translate }}</h1>
|
||||
<packages ng-controller="packagesController"></packages>
|
||||
</div>
|
||||
@@ -0,0 +1,25 @@
|
||||
<div id="add-virtual-products-container" class="col-md-12">
|
||||
<form>
|
||||
<div class="col-md-12 label-value-pair">
|
||||
<label class="col-md-2">{{'packages.forms.VIRTUAL_PRODUCT_NAME' | translate}}</label>
|
||||
<input class="col-md-3" type="text" placeholder="{{'packages.forms.VIRTUAL_PRODUCT_NAME' | translate}}" ng-model="name" required />
|
||||
</div>
|
||||
<div class="col-md-12 label-value-pair">
|
||||
<label class="col-md-2">{{'packages.forms.VIRTUAL_PRODUCT_CATEGORY' | translate}}</label>
|
||||
<select id="virtual-product-category-name"
|
||||
class="form-control-static col-md-2"
|
||||
ng-model="category"
|
||||
ng-options="productCategory.category for productCategory in productCategories track by productCategory.id"
|
||||
required>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="col-md-12 label-value-pair">
|
||||
<input type="submit"
|
||||
id="add-virtual-product-button"
|
||||
class="btn btn-info"
|
||||
ng-click="addVirtualProduct()"
|
||||
value="{{ 'packages.forms.buttons.ADD_VIRTUAL_PRODUCT' | translate }}"/>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
@@ -0,0 +1,5 @@
|
||||
<button type="button"
|
||||
id="createPackagesBtn"
|
||||
subModule="createPackages"
|
||||
class="btn btn-default"
|
||||
ng-click="setSubModule($event)">{{ 'packages.buttons.CREATE_PACKAGES' | translate }}</button>
|
||||
@@ -0,0 +1,5 @@
|
||||
<button type="button"
|
||||
id="create-packages-from-template-btn"
|
||||
subModule="createPackagesFromTemplate"
|
||||
class="btn btn-default"
|
||||
ng-click="setSubModule($event)">{{ 'packages.buttons.CREATE_PACKAGES_FROM_TEMPLATE' | translate }}</button>
|
||||
@@ -0,0 +1,4 @@
|
||||
<div id="create-packages-layer"
|
||||
ng-if="isSubmoduleVisible('createPackagesFromTemplate')">
|
||||
<create-packages-from-template></create-packages-from-template>
|
||||
</div>
|
||||
@@ -0,0 +1,219 @@
|
||||
<div id="create-packages" class="dropzone-packages" ng-controller="createPackagesFromTemplateController" country-selected="{{countrySelected}}" ng-init="initializeCreatePackages()">
|
||||
<h3>{{ 'packages.headers.CREATE_PACKAGES' | translate }} {{ 'packages.forms.' + getCountryTranslationKey() | translate:translationData }}</h3>
|
||||
<div id="create-packages-countries" class="packages-countries form-group row justify-content-start">
|
||||
<label for="selectCountry" class="package-label col-md-2">{{ 'packages.forms.CREATE_COUNTRY' | translate }}:</label>
|
||||
<select id="selectCountry" class="form-control-static col-md-2" ng-model="selectedCountryId" ng-change="updateVirtualProducts()">
|
||||
<option ng-repeat="countryInfo in countries" value={{countryInfo.id}}>
|
||||
{{countryInfo.name}}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
<div id="create-packages-from-template-select" class="packages-countries form-group row justify-content-start">
|
||||
<label for="selectPackageTemplate" class="package-label col-md-2">{{ 'packages.forms.CREATE_FROM_TEMPLATE' | translate }}:</label>
|
||||
<select id="selectPackageTemplate" class="form-control-static col-md-2" ng-model="idSelectedPackageTemplate" ng-change="updateVirtualProducts()">
|
||||
<option ng-repeat="templateInfo in templates" value={{templateInfo.idTemplate}}>
|
||||
{{templateInfo.templateName}}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<form ng-if="areTemplateAndCountrySelected()">
|
||||
<div class="create-packages-name-description row">
|
||||
<div class="create-package-type row justify-content-start col-md-12">
|
||||
<label for="packagType" class="package-label col-md-2">{{ 'packages.forms.CREATE_TYPE' | translate }}:</label>
|
||||
<select id="selectType" class="form-control-static col-md-2" ng-model="$parent.selectedPackageTypeId">
|
||||
<option ng-repeat="type in packageTypes" value={{type.idPackageType}}>
|
||||
{{type.packageType}}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="create-package-name row justify-content-start col-md-12">
|
||||
<label for="packageName" class="package-label col-md-2">{{ 'packages.forms.CREATE_NAME' | translate }}:</label>
|
||||
<input type="text"
|
||||
placeholder="{{ 'packages.forms.CREATE_NAME_PLACEHOLDER' | translate }}"
|
||||
id="package-name"
|
||||
required
|
||||
class="create-package-name-input form-control-static col-md-5"
|
||||
ng-model="$parent.packageName" />
|
||||
</div>
|
||||
<div class="create-package-reference row justify-content-start col-md-12">
|
||||
<label for="packageReference" class="package-label col-md-2">{{ 'packages.forms.CREATE_REFERENCE' | translate }}:</label>
|
||||
<input type="text"
|
||||
placeholder="{{ 'packages.forms.CREATE_REFERENCE_PLACEHOLDER' | translate }}"
|
||||
id="packageReference"
|
||||
class="create-package-reference-input form-control-static col-md-5"
|
||||
ng-model="$parent.packageReference" />
|
||||
</div>
|
||||
<div class="create-package-description row justify-content-start col-md-12">
|
||||
<div class="col-md-8 create-package-description-text form-control-static">
|
||||
<display-cdn-images image-params={{uploadParams}}></display-cdn-images>
|
||||
</div>
|
||||
<div class="col-md-4 create-package-description-text form-control-static">
|
||||
<upload-image-cdn upload-params={{uploadParams}}></upload-image-cdn>
|
||||
</div>
|
||||
</div>
|
||||
<div class="create-package-description row justify-content-start col-md-12">
|
||||
<label for="packageDescription" class="package-label col-md-2">{{ 'packages.forms.CREATE_DESCRIPTION' | translate }}:</label>
|
||||
<div class="create-package-description-text form-control-static col-md-5">
|
||||
<textarea
|
||||
ui-tinymce="tinymceOptions"
|
||||
ng-model="$parent.packageDescription"></textarea>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="col-md-12">
|
||||
<b>Template description:</b> {{getTemplateDescription()}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="set-additional-installation-days-from-template-container" class="col-md-12">
|
||||
<label>{{'packages.tables.headers.additionalInstallationDays' | translate}}: </label>
|
||||
<input id='set-additional-installation-days-from-template'
|
||||
type="number"
|
||||
name="installationDays" required
|
||||
min="1" max="365" step="1"
|
||||
class="days-input"
|
||||
ng-model="$parent.additionalInstallationDays"/>
|
||||
<span>{{'packages.tables.extra.DAYS' | translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="create-package-from-template-container">
|
||||
<div ng-repeat="(category, products) in productsByCategories"
|
||||
id="package-{{category}}-from-template-container"
|
||||
ng-if="isCategoryInTemplate(category)"
|
||||
class="products-per-category-container">
|
||||
<div class="create-packages-titles row">
|
||||
<div class="create-package-title col-md-4">
|
||||
{{getTitle(category, 'products', true)}} {{ 'packages.forms.SELECTED_COUNTRY' | translate:translationData }}
|
||||
</div>
|
||||
<div class="create-package-title col-md-5">
|
||||
{{getTitle(category, 'packages', true)}} {{ 'packages.forms.SELECTED_COUNTRY' | translate:translationData }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="pack-{{category}}-from-template-container" class="create-packages-from-template-container row">
|
||||
<div class="create-packages col-md-4">
|
||||
<div class="list-by-category products-droppable-list package-list-{{category}}"
|
||||
id="products-list-{{category}}"
|
||||
data-drop="true"
|
||||
jqyoui-droppable="{onDrop:'productDropped(\'product\', 0, category)'}">
|
||||
<div ng-repeat="(key, product) in products" class="create-package-row product-draggable"
|
||||
data-drag="true"
|
||||
jqyoui-draggable="{animate:true, onStart:'onDragStartFromProducts(product, key)', onStop:'onDragStop(product)', scroll: false}"
|
||||
data-jqyoui-options="{revert: 'invalid', containment:'#package-{{category}}-from-template-container', scroll: false}">
|
||||
<div ng-if="!checkIfIsString(product)">
|
||||
<div class="create-package-products-display">
|
||||
<div class="create-package-header">
|
||||
{{'packages.forms.products.PRODUCT_NAME' | translate}}:
|
||||
</div>
|
||||
<div class="create-package-product">
|
||||
{{product.productName}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="create-package-products-info-display">
|
||||
<div class="create-package-product-info">
|
||||
<div class="create-package-header">
|
||||
{{'packages.forms.products.SUPPLIER_NAME' | translate}}:
|
||||
</div>
|
||||
<div class="create-package-product-info">
|
||||
{{product.supplierName}}
|
||||
</div>
|
||||
<div class="create-package-header">
|
||||
{{'packages.forms.products.PRICE' | translate}}:
|
||||
</div>
|
||||
<div class="create-package-product-info">
|
||||
{{product.price}} (VAT {{product.vatPrice}})
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="create-packages col-md-4">
|
||||
<div class="list-by-category package-list-{{category}}"
|
||||
id="packages-list-{{category}}">
|
||||
<div ng-repeat="(virtualProductKey, product) in packagesByCategories[category]" class="create-package-row">
|
||||
<div class="create-package-products-display">
|
||||
<div class="create-package-header">
|
||||
{{'packages.forms.products.VIRTUAL_PRODUCT_NAME' | translate}}:
|
||||
</div>
|
||||
<div class="create-package-product">
|
||||
{{product.virtualName}}
|
||||
</div>
|
||||
<div ng-if="product.real"
|
||||
class="real-product-in-package"
|
||||
ng-repeat="(realProductKey, realProduct) in product.real"
|
||||
data-drag="true"
|
||||
jqyoui-draggable="{animate:true, onStart:'onDragStartFromPackage(virtualProductKey, realProductKey, realProduct.category)', onStop:'onDragStop(realProduct)', scroll: false}"
|
||||
data-jqyoui-options="{revert: 'invalid', containment:'#package-{{category}}-from-template-container', scroll: false}">
|
||||
<div class="create-package-products-display">
|
||||
<div class="create-package-header">
|
||||
{{'packages.forms.products.PRODUCT_NAME' | translate}}:
|
||||
</div>
|
||||
<div class="create-package-product">
|
||||
{{realProduct.productName}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="create-package-products-info-display">
|
||||
<div class="create-package-product-info">
|
||||
<div class="create-package-header">
|
||||
{{'packages.forms.products.SUPPLIER_NAME' | translate}}:
|
||||
</div>
|
||||
<div class="create-package-product-info">
|
||||
{{realProduct.supplierName}}
|
||||
</div>
|
||||
<div class="create-package-header">
|
||||
{{'packages.forms.products.PRICE' | translate}}:
|
||||
</div>
|
||||
<div class="create-package-product-info">
|
||||
{{realProduct.price}} (VAT {{realProduct.vatPrice}})
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="real-products-container">
|
||||
<div class="add-products-by-template real-product-{{category}}"
|
||||
id="droppable-box-{{virtualProductKey}}"
|
||||
ng-if="!product.real"
|
||||
data-drop="true"
|
||||
jqyoui-droppable="{onDrop:'productDropped(\'package\', virtualProductKey, category)'}">
|
||||
</div>
|
||||
<div class="add-additional-products-by-template real-product-{{category}}"
|
||||
id="droppable-box-additional-{{virtualProductKey}}"
|
||||
ng-if="isAdditionalVirtualProductVisible(category)"
|
||||
data-drop="true"
|
||||
jqyoui-droppable="{onDrop:'productDropped(\'package\', virtualProductKey, category)'}">
|
||||
<span class="glyphicon glyphicon-plus"></span>
|
||||
{{'packages.forms.ADD_MORE_REAL_PRODUCTS' | translate}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="product-quantity-box" ng-if="!isAdditionalVirtualProductVisible(category)">
|
||||
<label for="createPackagesProductQuantity">{{ 'packages.forms.CREATE_QUANTITY' | translate }}:</label>
|
||||
<input type="number"
|
||||
name="productQuantity"
|
||||
min="1" max="100" step="1"
|
||||
class="product-quantity"
|
||||
ng-model="productUnit[product.idProduct]"
|
||||
ng-change="checkQuantityAmount(productUnit[product.idProduct])" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="arrows-icon col-md-1">
|
||||
<span class="glyphicon glyphicon-transfer"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="create-from-template-btn" ng-if="packagesByCategories">
|
||||
<input type="button"
|
||||
id="create-package-from-template"
|
||||
class="btn btn-info"
|
||||
ng-click="createPackageFromTemplate()"
|
||||
value="{{ 'packages.forms.buttons.CREATE_PACKAGE' | translate }}"/>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
@@ -0,0 +1,4 @@
|
||||
<div id="create-packages-layer"
|
||||
ng-if="isSubmoduleVisible('createPackages')">
|
||||
<create-packages></create-packages>
|
||||
</div>
|
||||
@@ -0,0 +1,14 @@
|
||||
<div id="create-packages" class="dropzone-packages" ng-controller="createPackagesCtrl" country-selected="{{countrySelected}}" ng-init="initializeCreatePackages()">
|
||||
<h3>{{ 'packages.headers.CREATE_PACKAGES' | translate }} {{ 'packages.forms.' + getCountryTranslationKey() | translate:translationData }}</h3>
|
||||
<div id="create-packages-countries" class="packages-countries form-group row justify-content-start">
|
||||
<label for="selectCountry" class="package-label col-md-2">{{ 'packages.forms.CREATE_COUNTRY' | translate }}:</label>
|
||||
<select id="selectCountry" class="form-control-static col-md-2" ng-model="selectedCountryId" ng-change="setCountrySelectedName()">
|
||||
<option ng-repeat="countryInfo in countries" value={{countryInfo.id}}>
|
||||
{{countryInfo.name}}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
<form ng-if="isCountrySelected()">
|
||||
<products-by-categories-drag-drop action-type="create"></products-by-categories-drag-drop>
|
||||
</form>
|
||||
</div>
|
||||
@@ -0,0 +1,5 @@
|
||||
<button type="button"
|
||||
id="create-template-packages-btn"
|
||||
subModule="createTemplatePackages"
|
||||
class="btn btn-default"
|
||||
ng-click="setSubModule($event)">{{ 'packages.buttons.CREATE_TEMPLATE_PACKAGES' | translate }}</button>
|
||||
@@ -0,0 +1,4 @@
|
||||
<div id="create-template-packages-layer"
|
||||
ng-if="isSubmoduleVisible('createTemplatePackages')">
|
||||
<create-packages-template></create-packages-template>
|
||||
</div>
|
||||
@@ -0,0 +1,6 @@
|
||||
<div id="create-packages-templates" class="dropzone-packages">
|
||||
<h3>{{ 'packages.headers.CREATE_TEMPLATE_PACKAGES' | translate }}</h3>
|
||||
<form>
|
||||
<products-template-by-categories-drag-drop action-type="create"></products-template-by-categories-drag-drop>
|
||||
</form>
|
||||
</div>
|
||||
@@ -0,0 +1,26 @@
|
||||
<div ng-init="getImagesFromCdn()">
|
||||
<div class="row justify-content-start col-md-12">
|
||||
<label class="image-label col-md-3">Cover image:</label>
|
||||
<div id="display-cover-image-cdn-container" class="col-md-9">
|
||||
<div class="display-small-image col-md-2" ng-if="profilePicture.secure_url">
|
||||
<img ng-src="{{profilePicture.secure_url}}" alt="Cover photo" class="cover-image-from-cdn" />
|
||||
</div>
|
||||
<input type="text" placeholder="{{ 'packages.forms.COVER_PHOTO_URL' | translate }}"
|
||||
id="cover-photo-url"
|
||||
class="cover-image-url-text form-control-static col-md-10"
|
||||
ng-model="profilePicture.secure_url" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="row justify-content-start col-md-12">
|
||||
<label class="image-label col-md-3">View images:</label>
|
||||
<div id="display-image-cdn-container" class="col-md-9 images-from-cdn-container">
|
||||
<div ng-repeat="(index, imageDetails) in images">
|
||||
<div class="display-small-image">
|
||||
<img ng-src="{{imageDetails.secure_url}}" alt="picture" class="image-from-cdn" />
|
||||
</div>
|
||||
<div class="url-from-cdn">
|
||||
<span>{{imageDetails.secure_url}}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,5 @@
|
||||
<button type="button"
|
||||
id="edit-package-templates-btn"
|
||||
subModule="editPackageTemplates"
|
||||
class="btn btn-default"
|
||||
ng-click="setSubModule($event)">{{ 'packages.buttons.EDIT_TEMPLATE_PACKAGES' | translate }}</button>
|
||||
@@ -0,0 +1,16 @@
|
||||
<div id="edit-package-templates" class="dropzone-packages">
|
||||
<h3>{{ 'packages.headers.EDIT_TEMPLATE_PACKAGES' | translate }} {{packageSelected.name}}</h3>
|
||||
<div id="edit-package-templates-list" class="packages-countries row" ng-init="showSelectPackages()">
|
||||
<label for="selectPackage" class="package-label col-md-2">{{'packages.forms.PACKAGE_SELECT' | translate}}:</label>
|
||||
<select id="edit-package-templates-select"
|
||||
ng-model="packageSelected"
|
||||
ng-change="setPackageTemplateSelected()"
|
||||
ng-init="showSelectPackages()"
|
||||
class="form-control-static col-md-3"
|
||||
ng-options="packageInfo.name for packageInfo in packageList track by packageInfo.id">
|
||||
</select>
|
||||
</div>
|
||||
<form ng-if="isPackageSelected()">
|
||||
<products-template-by-categories-drag-drop action-type="edit"></products-template-by-categories-drag-drop>
|
||||
</form>
|
||||
</div>
|
||||
@@ -0,0 +1,4 @@
|
||||
<div id="edit-packages-layer"
|
||||
ng-if="isSubmoduleVisible('editPackageTemplates')">
|
||||
<edit-package-templates ng-controller="editPackageTemplatesCtrl" ng-init="getPackageTemplates()"></edit-packages-templates>
|
||||
</div>
|
||||
@@ -0,0 +1,5 @@
|
||||
<button type="button"
|
||||
id="edit-packages-btn"
|
||||
subModule="editPackages"
|
||||
class="btn btn-default"
|
||||
ng-click="setSubModule($event)">{{ 'packages.buttons.EDIT_PACKAGES' | translate }}</button>
|
||||
@@ -0,0 +1,4 @@
|
||||
<div id="edit-packages-layer"
|
||||
ng-if="isSubmoduleVisible('editPackages')">
|
||||
<edit-packages ng-controller="editPackagesCtrl" ng-init="getCountries()"></edit-packages>
|
||||
</div>
|
||||
@@ -0,0 +1,24 @@
|
||||
<div id="edit-packages" class="dropzone-packages" country-selected="{{countrySelected}}">
|
||||
<h3>{{ 'packages.headers.EDIT_PACKAGES' | translate }} {{ getEditPackagesTitle() }}</h3>
|
||||
<div id="edit-packages-countries" class="packages-countries row justify-content-start">
|
||||
<label for="selectCountry" class="package-label col-md-2">{{ 'packages.forms.CREATE_COUNTRY' | translate }}:</label>
|
||||
<select id="selectCountry" class="form-control-static col-md-2" ng-model="selectedCountryId" ng-change="showSelectPackages()">
|
||||
<option ng-repeat="countryInfo in countries" value={{countryInfo.id}}>
|
||||
{{countryInfo.name}}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
<div id="edit-package-list" class="packages-countries row" ng-init="showSelectPackages()" ng-if="isCountrySelected(selectedCountryId)">
|
||||
<label for="selectPackage" class="package-label col-md-2">{{'packages.forms.PACKAGE_SELECT' | translate}}:</label>
|
||||
<select id="create-process-package-select"
|
||||
ng-model="$parent.packageSelected"
|
||||
ng-change="setCountryAndPackageSelected()"
|
||||
ng-init="showSelectPackages()"
|
||||
class="form-control-static col-md-3"
|
||||
ng-options="packageInfo.name for packageInfo in packageList track by packageInfo.id">
|
||||
</select>
|
||||
</div>
|
||||
<form ng-if="isPackageSelected()">
|
||||
<products-by-categories-drag-drop action-type="edit"></products-by-categories-drag-drop>
|
||||
</form>
|
||||
</div>
|
||||
@@ -0,0 +1,5 @@
|
||||
<button type="button"
|
||||
id="my-packages-btn"
|
||||
subModule="myPackages"
|
||||
class="btn btn-default"
|
||||
ng-click="setSubModule($event)">{{ 'packages.buttons.SHOW_MY_PACKAGES' | translate }}</button>
|
||||
@@ -0,0 +1,119 @@
|
||||
<div class="packages-details-layer row" ng-init="getProductsArray(data)">
|
||||
<div class="col-md-4 package-description-layer">
|
||||
<h4 class="package-header">
|
||||
<span class="flag-icon flag-icon-{{data.countryCode}}"></span> {{data.name}}
|
||||
</h4>
|
||||
<div ng-bind-html="renderHtml(data.description)" class="package-description"></div>
|
||||
</div>
|
||||
<div class="col-md-8 package-info-layer">
|
||||
<div ng-if="hasExtraPackages(data)" class="info-box col-md-4">
|
||||
<div class="big-title">
|
||||
{{'packages.headers.PACKAGE_OPTIONS_DETAILS' | translate}}:
|
||||
</div>
|
||||
<div class="info-group extra-option">
|
||||
<div class="option-group" ng-repeat="group in data.extraPackages.groups">
|
||||
<div class="small-title">
|
||||
<span class="glyphicon glyphicon-folder-open"></span>
|
||||
{{group.groupName}}
|
||||
</div>
|
||||
<div class="option-pacakge" ng-repeat="option in group.options">
|
||||
{{option.packageName}}
|
||||
<a ng-if="option.isAvailable"
|
||||
href="packages?subModule=selectPackage&idPackage={{option.idPackage}}">
|
||||
<span class="glyphicon glyphicon-pencil edit-icon"></span>
|
||||
</a>
|
||||
<span ng-if="!areAllPayTypesAvailable(data.prices.Default, option)"
|
||||
class="glyphicon glyphicon {{getAlertIcon(option)}} warning-icon"
|
||||
ng-click="showHideInfoBox(option)"></span>
|
||||
<div ng-if="option.isInfoBoxVisible" class="{{getAlertClass(option)}} warning-message">
|
||||
{{getAlertText(option)}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="big-title">
|
||||
{{'packages.headers.ADDITIONAL_PACKAGES_DETAILS' | translate}}:
|
||||
</div>
|
||||
<div ng-if="data.extraPackages.additionalPackages.length" class="info-group additional-package">
|
||||
<div class="additional" ng-repeat="additionalPackage in data.extraPackages.additionalPackages">
|
||||
<div class="additional-pacakge">
|
||||
{{additionalPackage.packageName}}
|
||||
<a ng-if="additionalPackage.isAvailable"
|
||||
href="packages?subModule=selectPackage&idPackage={{additionalPackage.idPackage}}">
|
||||
<span class="glyphicon glyphicon-pencil edit-icon"></span>
|
||||
</a>
|
||||
<span ng-if="!areAllPayTypesAvailable(data.prices.Default, additionalPackage)"
|
||||
class="glyphicon {{getAlertIcon(additionalPackage)}} warning-icon"
|
||||
ng-click="showHideInfoBox(additionalPackage)"></span>
|
||||
<div ng-if="additionalPackage.isInfoBoxVisible" class="{{getAlertClass(additionalPackage)}} warning-message">
|
||||
{{getAlertText(additionalPackage)}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="info-box col-md-4">
|
||||
<div class="big-title">
|
||||
{{'packages.headers.PRODUCTS' | translate}}:
|
||||
</div>
|
||||
<div class="info-group">
|
||||
<div class="product-in-package-{{data.id}}" ng-repeat="product in productsArray">
|
||||
{{product}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="my-packages-details-layer row">
|
||||
<div ng-repeat="(customer, price_list) in data.prices">
|
||||
<div class="comission-headers">
|
||||
<div class="price-col">
|
||||
<div class="customer-name">
|
||||
{{customer}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="price-col">{{'packages.headers.MINIMAL_SELL_PRICE' | translate}}</div>
|
||||
<div class="price-col">{{'packages.headers.MY_COMMISSION' | translate}}</div>
|
||||
<div class="price-col">{{'packages.headers.CUSTOMER_PRICE' | translate}}</div>
|
||||
<div class="price-col-small">{{'packages.headers.VISIBLE_TO_CUSTOMER' | translate}}</div>
|
||||
</div>
|
||||
<div ng-repeat="price in price_list" class="price-group">
|
||||
<div class="pay-type">
|
||||
{{'packages.headers.PAY_TYPE' | translate}}: {{price.payType}}
|
||||
</div>
|
||||
<div class="price-row">
|
||||
<div class="price-col">
|
||||
{{'packages.headers.FIXED' | translate}}:
|
||||
</div>
|
||||
<div class="price-col">
|
||||
{{price.minimalFixedPrice}}
|
||||
</div>
|
||||
<div class="price-col">
|
||||
{{price.fixedCommission}}
|
||||
</div>
|
||||
<div class="price-col">
|
||||
{{sumPrices([price.minimalFixedPrice, price.fixedCommission])}}
|
||||
</div>
|
||||
<div class="price-col-small">
|
||||
<span class="glyphicon {{isVisibleToCustomer(price.visibleToCustomer)}}"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="price-row">
|
||||
<div class="price-col">
|
||||
{{'packages.headers.MONTHLY_RECURENCE' | translate}}:
|
||||
</div>
|
||||
<div class="price-col">
|
||||
{{sumPrices([price.minimalRecurentPrice, price.minimalServicesPrice])}}
|
||||
</div>
|
||||
<div class="price-col">
|
||||
{{price.recurentCommission}}
|
||||
</div>
|
||||
<div class="price-col">
|
||||
{{sumPrices([price.minimalRecurentPrice, price.minimalServicesPrice, price.recurentCommission, price.recurentServicesCommission])}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,9 @@
|
||||
<div class="row">
|
||||
<div class="col-sm-12"
|
||||
id="my-packages-layer"
|
||||
ng-if="isSubmoduleVisible('myPackages')"
|
||||
ng-init="getMyPackages()">
|
||||
<h3>{{ 'packages.headers.SHOW_MY_PACKAGES' | translate }}</h3>
|
||||
<table class="table table-striped table-hover" id="my-packages-tabel"></table>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,142 @@
|
||||
<div class="col-md-12">
|
||||
<h3 class="col-md-12">{{ 'packages.headers.MANAGE_PACKAGE_OPTIONS' | translate }}</h3>
|
||||
<div class="all-packages-layer col-md-4">
|
||||
<div class="options-container">
|
||||
<div class="options-header">{{ 'packages.headers.SELECT_PACKAGE_FOR_OPTIONS' | translate }}</div>
|
||||
<div class="options-list">
|
||||
<div ng-click="selectPackage(package)" class="package-layer {{getPackageClass(package)}}" ng-repeat="package in standardPackages">
|
||||
<span class="flag-icon flag-icon-{{package.countryCode}}"></span> {{package.packageName}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="options-link-area col-md-8">
|
||||
<div class="options-big-container col-md-12">
|
||||
<div class="col-md-6">
|
||||
<div id="linked-package-options" class="options-container">
|
||||
<div class="options-header">{{selectedPackage.packageName}} {{ 'packages.headers.PACKGE_OPTIONS' | translate }}</div>
|
||||
<div id="linked-package-options-list" class="options-list">
|
||||
<div id="option-group-{{group.idGroup}}" class="option-group"
|
||||
data-drop="true"
|
||||
jqyoui-droppable="{onDrop:'packageOptionAdded(\'option-group\', group)'}"
|
||||
ng-repeat="(index, group) in selectedPackage.groups">
|
||||
<div class="option-group-name">
|
||||
<input type="text"
|
||||
placeholder="{{ 'packages.headers.GROUP_NAME' | translate }}"
|
||||
ng-model="group.groupName"/>
|
||||
<div ng-click="removeGroup(index)" class="btn btn-danger remove-group">
|
||||
<span class="glyphicon glyphicon-remove"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="linked-options-layer option-row linked {{getPackageWarningClass(option.hasAllPrices)}}"
|
||||
data-drag="true"
|
||||
drop-to="all-options"
|
||||
id-option-package="{{option.idPackage}}"
|
||||
id-group="{{group.idGroup}}"
|
||||
jqyoui-draggable="{animate:true, onStart:'packageDragStart(\'linked-package-options-list\')', onStop:'packageDragStop(\'linked-package-options-list\')', scroll: false}"
|
||||
data-jqyoui-options="{revert: true}"
|
||||
ng-repeat="option in group.options">
|
||||
{{option.packageName}}
|
||||
<span ng-if="!option.hasAllPrices">
|
||||
<span class="glyphicon glyphicon-warning-sign"></span>
|
||||
{{ 'packages.messages.NOT_ALL_PAY_AVAILABLE' | translate }}
|
||||
</span>
|
||||
<div ng-if="isDefault(option)" class="default-value">{{ 'packages.headers.DEFAULT' | translate }}</div>
|
||||
<div ng-if="!isDefault(option)"
|
||||
ng-click="setDefaultOption(group, option)"
|
||||
class="btn btn-primary default-btn">{{ 'packages.buttons.SET_DEFAULT' | translate }}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div ng-click="addGroup()" class="btn btn-primary add-btn">
|
||||
<span class="glyphicon glyphicon-plus"></span> {{ 'packages.buttons.ADD_GROUP' | translate }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div id="all-options"
|
||||
data-drop="true"
|
||||
jqyoui-droppable="{onDrop:'packageOptionRemoved(\'all-options\')'}"
|
||||
class="options-container">
|
||||
<div class="options-header">{{ 'packages.headers.AVAILABLE_OPTIONS' | translate }}</div>
|
||||
<div id="all-options-list" class="options-list all-options-list">
|
||||
<div ng-if="option.isAvailable"
|
||||
class="all-options-layer option-row not-linked {{getPackageWarningClass(option.hasAllPrices)}}"
|
||||
data-drag="true"
|
||||
drop-to="option-group"
|
||||
id-option-package="{{option.idPackage}}"
|
||||
jqyoui-draggable="{animate:true, onStart:'packageDragStart(\'all-options-list\')', onStop:'packageDragStop(\'all-options-list\')', scroll: false}"
|
||||
data-jqyoui-options="{revert: true}"
|
||||
ng-repeat="option in options">
|
||||
{{option.packageName}}
|
||||
<span ng-if="!option.hasAllPrices">
|
||||
<span class="glyphicon glyphicon-warning-sign"></span>
|
||||
{{ 'packages.messages.NOT_ALL_PAY_AVAILABLE' | translate }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="options-link-area col-md-8 col-md-offset-4">
|
||||
<div class="options-big-container col-md-12">
|
||||
<div class="col-md-6">
|
||||
<div class="options-container">
|
||||
<div class="options-header">{{selectedPackage.packageName}} {{ 'packages.headers.ADDITIONAL_PACKAGES' | translate }}</div>
|
||||
<div id="linked-package-additional-list"
|
||||
data-drop="true"
|
||||
jqyoui-droppable="{onDrop:'packageAdditionalAdded(\'linked-package-additional-list\')'}"
|
||||
class="options-list linked-package-additional-list">
|
||||
<div class="linked-additionals-layer option-row linked {{getPackageWarningClass(additionalPackage.hasAllPrices)}}"
|
||||
data-drag="true"
|
||||
drop-to="all-additional-list"
|
||||
id-additional-package="{{additionalPackage.idPackage}}"
|
||||
jqyoui-draggable="{animate:true, onStart:'packageDragStart(\'linked-package-additional-list\')', onStop:'packageDragStop(\'linked-package-additional-list\')', scroll: false}"
|
||||
data-jqyoui-options="{revert: true}"
|
||||
ng-repeat="additionalPackage in selectedPackage.additionalPackages">
|
||||
{{additionalPackage.packageName}}
|
||||
<span ng-if="!additionalPackage.hasAllPrices">
|
||||
<span class="glyphicon glyphicon-warning-sign"></span>
|
||||
{{ 'packages.messages.NOT_ALL_PAY_AVAILABLE' | translate }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="options-container">
|
||||
<div class="options-header">{{ 'packages.headers.AVAILABLE_ADDITIONAL' | translate }}</div>
|
||||
<div id="all-additional-list"
|
||||
data-drop="true"
|
||||
jqyoui-droppable="{onDrop:'packageAdditionalRemoved(\'all-additional-list\')'}"
|
||||
class="options-list all-additional-list">
|
||||
<div class="all-additional-layer option-row not-linked {{getPackageWarningClass(additionalPackage.hasAllPrices)}}"
|
||||
ng-if="additionalPackage.isAvailable"
|
||||
data-drag="true"
|
||||
drop-to="linked-package-additional-list"
|
||||
id-additional-package="{{additionalPackage.idPackage}}"
|
||||
jqyoui-draggable="{animate:true, onStart:'packageDragStart(\'all-additional-list\')', onStop:'packageDragStop(\'all-additional-list\')', scroll: false}"
|
||||
data-jqyoui-options="{revert: true}"
|
||||
ng-repeat="additionalPackage in additionalPackages">
|
||||
{{additionalPackage.packageName}}
|
||||
<span ng-if="!additionalPackage.hasAllPrices">
|
||||
<span class="glyphicon glyphicon-warning-sign"></span>
|
||||
{{ 'packages.messages.NOT_ALL_PAY_AVAILABLE' | translate }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="options-link-buttons col-md-12">
|
||||
<div class="btn btn-primary" ng-click="updatePackageOptions()">
|
||||
{{ 'packages.buttons.SAVE' | translate }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,5 @@
|
||||
<button type="button"
|
||||
id="package-options-btn"
|
||||
subModule="packageOptions"
|
||||
class="btn btn-default"
|
||||
ng-click="setSubModule($event)">{{ 'packages.buttons.PACKAGE_OPTIONS' | translate }}</button>
|
||||
@@ -0,0 +1,5 @@
|
||||
<div id="package-optios-layer"
|
||||
class="row"
|
||||
ng-if="isSubmoduleVisible('packageOptions')">
|
||||
<package-options ng-controller="packageOptionsCtrl" ng-init="getOptionsAndPackages()"></package-options>
|
||||
</div>
|
||||
@@ -0,0 +1,104 @@
|
||||
<div class="packages-details-layer row" ng-init="getProductsArray(data)">
|
||||
<div class="col-md-4 package-description-layer">
|
||||
<h4 class="package-header">
|
||||
<span class="flag-icon flag-icon-{{data.countryCode}}"></span> {{data.name}}
|
||||
</h4>
|
||||
<div ng-bind-html="renderHtml(data.description)" class="package-description"></div>
|
||||
</div>
|
||||
<div class="col-md-8 package-info-layer">
|
||||
<div class="info-box col-md-4">
|
||||
<div class="big-title">
|
||||
<span class="glyphicon glyphicon-list-alt"></span>
|
||||
{{'packages.headers.PAY_PLANS' | translate}}:
|
||||
<?php
|
||||
if($user->getUserType() === USER_TYPES['BROKER']){
|
||||
require('packagesDetailsBroker/PackagesDetailsBrokerSetPriceBtn.html');
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
<div class="info-group extra-option">
|
||||
<div class="price-type" ng-repeat="price in data.prices">
|
||||
{{price.payType}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div ng-if="hasExtraPackages(data)" class="info-box col-md-4">
|
||||
<div class="big-title">
|
||||
{{'packages.headers.PACKAGE_OPTIONS_DETAILS' | translate}}:
|
||||
<?php
|
||||
if($user->getUserType() === USER_TYPES['BROKER']){
|
||||
require('packagesDetailsBroker/PackagesDetailsBrokerLinkOptionsBtn.html');
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
<div class="info-group extra-option">
|
||||
<div class="option-group" ng-repeat="group in data.extraPackages.groups">
|
||||
<div class="small-title">
|
||||
<span class="glyphicon glyphicon-folder-open"></span>
|
||||
{{group.groupName}}
|
||||
</div>
|
||||
<div class="option-pacakge" ng-repeat="option in group.options">
|
||||
{{option.packageName}}
|
||||
<?php
|
||||
if($user->getUserType() === USER_TYPES['BROKER']){
|
||||
require('packagesDetailsBroker/PackagesDetailsBrokerSetOptionPriceBtn.html');
|
||||
}
|
||||
?>
|
||||
<span ng-if="!areAllPayTypesAvailable(data.prices, option.prices)"
|
||||
class="glyphicon glyphicon glyphicon-warning-sign warning-icon"
|
||||
ng-click="showHideInfoBox(option)"></span>
|
||||
<div ng-if="option.isInfoBoxVisible" class="alert-warning warning-message">
|
||||
{{'packages.messages.NOT_ALL_PAY_AVAILABLE' | translate}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="big-title">
|
||||
{{'packages.headers.ADDITIONAL_PACKAGES_DETAILS' | translate}}:
|
||||
<?php
|
||||
if($user->getUserType() === USER_TYPES['BROKER']){
|
||||
require('packagesDetailsBroker/PackagesDetailsBrokerLinkOptionsBtn.html');
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
<div ng-if="data.extraPackages.additionalPackages.length" class="info-group additional-package">
|
||||
<div class="additional" ng-repeat="additionalPackage in data.extraPackages.additionalPackages">
|
||||
<div class="additional-pacakge">
|
||||
{{additionalPackage.packageName}}
|
||||
<?php
|
||||
if($user->getUserType() === USER_TYPES['BROKER']){
|
||||
require('packagesDetailsBroker/PackagesDetailsBrokerSetAdditonalPriceBtn.html');
|
||||
}
|
||||
?>
|
||||
<span ng-if="!areAllPayTypesAvailable(data.prices, additionalPackage.prices)"
|
||||
class="glyphicon glyphicon glyphicon-warning-sign warning-icon"
|
||||
ng-click="showHideInfoBox(additionalPackage)"></span>
|
||||
<div ng-if="additionalPackage.isInfoBoxVisible" class="alert-warning warning-message">
|
||||
{{'packages.messages.NOT_ALL_PAY_AVAILABLE' | translate}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div ng-if="!data.extraPackages.additionalPackages.length">-</div>
|
||||
</div>
|
||||
<div class="info-box col-md-4">
|
||||
<div class="big-title">
|
||||
{{'packages.headers.PRODUCTS' | translate}}:
|
||||
</div>
|
||||
<div class="info-group">
|
||||
<div class="product-in-package-{{data.id}}" ng-repeat="product in productsArray">
|
||||
{{product}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div ng-if="!hasExtraPackages(data)" class="info-box col-md-4">
|
||||
<?php
|
||||
if($user->getUserType() === USER_TYPES['BROKER']){
|
||||
require('packagesDetailsBroker/PackagesDetailsBrokerLinkOptionsBigBtn.html');
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,48 @@
|
||||
<button type="button"
|
||||
id="packagesBtn"
|
||||
subModule="packages"
|
||||
class="btn btn-default"
|
||||
ng-click="setSubModule($event)">{{ 'packages.buttons.SHOW_PACKAGES' | translate }}</button>
|
||||
|
||||
|
||||
<?php
|
||||
if($user->getUserType() === USER_TYPES['COMMERCIAL_LEAD']){
|
||||
require_once('MyPackagesBtn.html');
|
||||
}
|
||||
|
||||
if($user->getUserType() === USER_TYPES['BROKER']){
|
||||
require_once('CreatePackagesButton.html');
|
||||
require_once('CreatePackagesFromTemplateButton.html');
|
||||
require_once('CreateTemplatePackagesButton.html');
|
||||
require_once('EditPackagesButton.html');
|
||||
require_once('EditPackageTemplatesButton.html');
|
||||
require_once('PackageOptionsTemplateButton.html');
|
||||
}
|
||||
?>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-sm-12"
|
||||
id="packages-layer"
|
||||
ng-if="isSubmoduleVisible('packages')"
|
||||
ng-init="getPackages()">
|
||||
<h3>{{ 'packages.headers.SHOW_PACKAGES' | translate }}</h3>
|
||||
<table class="table table-striped table-hover" id="packages-tabel"></table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php
|
||||
if($user->getUserType() === USER_TYPES['COMMERCIAL_LEAD']){
|
||||
require_once('MyPackagesLayer.html');
|
||||
require_once('SelectPackageLayer.html');
|
||||
}
|
||||
|
||||
if($user->getUserType() === USER_TYPES['BROKER']){
|
||||
require_once('CreatePackagesLayer.html');
|
||||
require_once('EditPackagesLayer.html');
|
||||
require_once('EditPackageTemplatesLayer.html');
|
||||
require_once('CreatePackagesFromTemplateLayer.html');
|
||||
require_once('CreateTemplatePackagesLayer.html');
|
||||
require_once('SetPackagePriceLayer.html');
|
||||
require_once('PackageOptionsTemplateLayer.html');
|
||||
}
|
||||
?>
|
||||
@@ -0,0 +1,180 @@
|
||||
{{selectedCountryId}}
|
||||
<div class="create-packages-name-description row">
|
||||
<div class="create-package-type row justify-content-start col-md-12">
|
||||
<label for="packagType" class="package-label col-md-2">{{ 'packages.forms.CREATE_TYPE' | translate }}:</label>
|
||||
<select id="selectType"
|
||||
class="form-control-static col-md-2"
|
||||
ng-model="selectedPackageTypeId">
|
||||
<option ng-repeat="type in packageTypes" value="{{type.idPackageType}}">
|
||||
{{type.packageType}}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="create-package-name row justify-content-start col-md-12">
|
||||
<label for="packageName" class="package-label col-md-2">{{ 'packages.forms.CREATE_NAME' | translate }}:</label>
|
||||
<input type="text" placeholder="{{ 'packages.forms.CREATE_NAME_PLACEHOLDER' | translate }}"
|
||||
id="package-name-{{actionType}}" required
|
||||
class="create-package-name-input form-control-static col-md-5"
|
||||
ng-model="packageName" />
|
||||
</div>
|
||||
<div class="create-package-reference row justify-content-start col-md-12">
|
||||
<label for="packageReference" class="package-label col-md-2">{{ 'packages.forms.CREATE_REFERENCE' | translate }}:</label>
|
||||
<input type="text" placeholder="{{ 'packages.forms.CREATE_REFERENCE_PLACEHOLDER' | translate }}"
|
||||
id="package-reference-{{actionType}}"
|
||||
class="create-package-reference-input form-control-static col-md-5"
|
||||
ng-model="packageReference" />
|
||||
</div>
|
||||
<div class="create-package-description row justify-content-start col-md-12">
|
||||
<div class="col-md-8 create-package-description-text form-control-static">
|
||||
<display-cdn-images image-params={{imageParams}}></display-cdn-images>
|
||||
</div>
|
||||
<div class="col-md-4 create-package-description-text form-control-static">
|
||||
<upload-image-cdn upload-params={{uploadParams}}></upload-image-cdn>
|
||||
</div>
|
||||
</div>
|
||||
<div id="package-description-{{actionType}}" class="create-package-description row justify-content-start col-md-12">
|
||||
<label for="packageDescription" class="package-label col-md-2">{{ 'packages.forms.CREATE_DESCRIPTION' | translate }}:</label>
|
||||
<div class="col-md-6 create-package-description-text form-control-static">
|
||||
<textarea
|
||||
ui-tinymce="tinymceOptions"
|
||||
ng-model="packageDescription"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div id="set-additional-installation-days-container" class="col-md-12" ng-if="packageHasInstallation[actionType]">
|
||||
<label>{{'packages.tables.headers.additionalInstallationDays' | translate}}: </label>
|
||||
<input id='set-additional-installation-days'
|
||||
type="number"
|
||||
name="instDay"
|
||||
min="1" max="365" step="1"
|
||||
class="days-input"
|
||||
ng-model="additionalInstallationDays"/>
|
||||
<span>{{'packages.tables.extra.DAYS' | translate}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="create-packages-container">
|
||||
<div ng-repeat="(category, products) in productsByCategories"
|
||||
id="package-{{category}}-container"
|
||||
class="products-per-category-container">
|
||||
<div class="create-packages-titles row">
|
||||
<div class="create-package-title col-md-4">
|
||||
{{getTitle(category, 'products', false)}} {{ 'packages.forms.SELECTED_COUNTRY' | translate:translationData }}
|
||||
</div>
|
||||
<div class="create-package-title col-md-5">
|
||||
{{getTitle(category, 'packages', false)}} {{ 'packages.forms.SELECTED_COUNTRY' | translate:translationData }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="pack-{{category}}-container" class="create-packages-container row">
|
||||
<div class="create-packages col-md-4">
|
||||
<div class="list-by-category products-droppable-list package-list-{{category}}"
|
||||
id="package-products-list-{{category}}"
|
||||
data-drop="true"
|
||||
jqyoui-droppable="{onDrop:'productDropped(\'product\', category)'}">
|
||||
<div ng-repeat="(key, product) in products" class="create-package-row product-draggable"
|
||||
data-drag="true"
|
||||
jqyoui-draggable="{animate:true, onStart:'onDragStartFromProducts(product, key)', onStop:'onDragStop(product)', scroll: false}"
|
||||
data-jqyoui-options="{revert: 'invalid', containment:'#pack-{{category}}-container', scroll: false}">
|
||||
<div>
|
||||
<div class="create-package-products-display">
|
||||
<div class="create-package-header">
|
||||
{{'packages.forms.products.PRODUCT_NAME' | translate}}:
|
||||
</div>
|
||||
<div class="create-package-product">
|
||||
{{product.productName}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="create-package-products-info-display">
|
||||
<div class="create-package-product-info">
|
||||
<div class="create-package-header">
|
||||
{{'packages.forms.products.SUPPLIER_NAME' | translate}}:
|
||||
</div>
|
||||
<div class="create-package-product-info">
|
||||
{{product.supplierName}}
|
||||
</div>
|
||||
<div class="create-package-header">
|
||||
{{'packages.forms.products.PRICE' | translate}}:
|
||||
</div>
|
||||
<div class="create-package-product-info">
|
||||
{{product.price}} (VAT {{product.vatPrice}})
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="create-packages col-md-4">
|
||||
<div class="list-by-category {{category}}-in-package package-list-{{category}}"
|
||||
id="packages-list-{{category}}"
|
||||
data-drop="true"
|
||||
jqyoui-droppable="{onDrop:'productDropped(\'package\', category)'}">
|
||||
<div class="create-package-row {{isAvailableClass(product.isAvailable)}}"
|
||||
ng-repeat="(packageProductKey, product) in packagesByCategories[category]"
|
||||
data-drag="true"
|
||||
jqyoui-draggable="{animate:true, onStart:'onDragStartFromPackage(product, packageProductKey)', onStop:'onDragStop(product)', scroll: false}"
|
||||
data-jqyoui-options="{revert: 'invalid', containment:'#pack-{{category}}-container', scroll: false}">
|
||||
|
||||
<div class="create-package-products-display">
|
||||
<div class="create-package-header">
|
||||
{{'packages.forms.products.PRODUCT_NAME' | translate}}:
|
||||
</div>
|
||||
<div class="create-package-product">
|
||||
{{product.productName}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="create-package-products-info-display">
|
||||
<div class="create-package-product-info">
|
||||
<div class="create-package-header">
|
||||
{{'packages.forms.products.SUPPLIER_NAME' | translate}}:
|
||||
</div>
|
||||
<div class="create-package-product-info">
|
||||
{{product.supplierName}}
|
||||
</div>
|
||||
<div class="create-package-header">
|
||||
{{'packages.forms.products.PRICE' | translate}}:
|
||||
</div>
|
||||
<div class="create-package-product-info">
|
||||
{{product.price}} (VAT {{product.vatPrice}})
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="product-quantity-box" ng-if="showQuantityField(product.category)">
|
||||
<label for="createPackagesProductQuantity">{{ 'packages.forms.CREATE_QUANTITY' | translate }}:</label>
|
||||
<input id='{{actionType}}-package-quantity-{{product.idProduct}}'
|
||||
type="number"
|
||||
name="productQuantity"
|
||||
min="1" max="100" step="1"
|
||||
class="product-quantity"
|
||||
ng-model="productUnit[product.idProduct]"
|
||||
ng-change="checkQuantityAmount(productUnit[product.idProduct])" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="arrows-icon col-md-1">
|
||||
<span class="glyphicon glyphicon-transfer"></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="packages-buttons row">
|
||||
<div class="col-md-7" ng-if="packagesByCategories">
|
||||
<input type="submit"
|
||||
id="{{actionType}}-package"
|
||||
class="btn btn-info"
|
||||
ng-click="updatePackage()"
|
||||
value="{{getButtonTitle()}}"/>
|
||||
</div>
|
||||
|
||||
<div class="reset-button col-md-4" ng-if="isResetBtnVisible()">
|
||||
<input type="submit"
|
||||
id="reset-package-btn"
|
||||
class="btn btn-primary"
|
||||
ng-click="resetProducts()"
|
||||
value="{{ 'packages.buttons.RESET' | translate }}"/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,121 @@
|
||||
<div class="create-packages-name-description row">
|
||||
<div class="create-package-name row justify-content-start col-md-12">
|
||||
<label for="packageName" class="package-label col-md-2">{{ 'packages.forms.CREATE_NAME' | translate }}:</label>
|
||||
<input type="text" placeholder="{{ 'packages.forms.CREATE_NAME_PLACEHOLDER' | translate }}"
|
||||
id="package-name-template-{{actionType}}" required
|
||||
class="create-package-name-input form-control-static col-md-5"
|
||||
ng-model="packageName" />
|
||||
</div>
|
||||
<div class="create-package-description row justify-content-start col-md-12">
|
||||
<label for="packageDescription" class="package-label col-md-2">{{ 'packages.forms.CREATE_DESCRIPTION' | translate }}:</label>
|
||||
<textarea id="package-description-template-{{actionType}}" required
|
||||
placeholder="{{ 'packages.forms.CREATE_DESCRIPTION_PLACEHOLDER' | translate }}"
|
||||
class="create-package-description-text form-control-static col-md-5"
|
||||
ng-model="packageDescription"/>
|
||||
</div>
|
||||
</div>
|
||||
<div id="add-new-virtual-product-template" ng-if="actionType === 'create'" class="row">
|
||||
<div id="headers-col-available" class="headers-col">
|
||||
<h3>{{'packages.headers.NEW_VIRTUAL_PRODUCT' | translate}}</h3>
|
||||
<div id="add-new-virtual-product" class="btn btn-primary" ng-click="enableAddNewVirtualProducts()">{{'packages.buttons.NEW_VIRTUAL_PRODUCT' | translate}}</div>
|
||||
</div>
|
||||
<add-virtual-products
|
||||
ng-if="isAddVirtualProductsFormVisible()"
|
||||
ng-controller="addVirtualProductsCtrl"
|
||||
ng-init="getProductCategories()"></add-virtual-products>
|
||||
</div>
|
||||
|
||||
<div id="update-packages-templates-container">
|
||||
<div ng-repeat="(category, products) in productsByCategories"
|
||||
id="{{actionType}}-package-template-{{category}}-container"
|
||||
class="products-per-category-container">
|
||||
<div class="create-packages-titles row">
|
||||
<div class="create-package-title col-md-4">
|
||||
{{getTitle(category, 'products', true)}}
|
||||
</div>
|
||||
<div class="create-package-title col-md-5">
|
||||
{{getTitle(category, 'packages', true)}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="{{actionType}}-pack-template-{{category}}-container" class="create-packages-container row">
|
||||
<div class="create-packages col-md-4">
|
||||
<div class="list-by-category products-droppable-list package-list-{{category}}"
|
||||
id="{{actionType}}-package-template-products-list-{{category}}"
|
||||
data-drop="true"
|
||||
jqyoui-droppable="{onDrop:'productDropped(\'product\', category)'}">
|
||||
<div ng-repeat="(key, product) in products" class="create-package-row product-draggable"
|
||||
data-drag="true"
|
||||
jqyoui-draggable="{animate:true, onStart:'onDragStartFromProducts(product, key)', onStop:'onDragStop(product)', scroll: false}"
|
||||
data-jqyoui-options="{revert: 'invalid', containment:'#{{actionType}}-pack-template-{{category}}-container', scroll: false}">
|
||||
<div>
|
||||
<div class="create-package-products-display">
|
||||
<div class="create-package-header">
|
||||
{{'packages.forms.products.PRODUCT_NAME' | translate}}:
|
||||
</div>
|
||||
<div class="create-package-product">
|
||||
{{product.productName}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="create-packages col-md-4">
|
||||
<div id="{{actionType}}-packages-template-list-{{category}}"
|
||||
class="list-by-category {{category}}-in-package package-list-{{category}}"
|
||||
data-drop="true"
|
||||
jqyoui-droppable="{onDrop:'productDropped(\'package\', category)'}">
|
||||
<div class="create-package-row"
|
||||
ng-repeat="(packageProductKey, product) in packagesByCategories[category]"
|
||||
data-drag="true"
|
||||
jqyoui-draggable="{animate:true, onStart:'onDragStartFromPackage(product, packageProductKey)', onStop:'onDragStop(product)', scroll: false}"
|
||||
data-jqyoui-options="{revert: 'invalid', containment:'#{{actionType}}-pack-template-{{category}}-container', scroll: false}">
|
||||
|
||||
<div class="create-package-products-display">
|
||||
<div class="create-package-header">
|
||||
{{'packages.forms.products.PRODUCT_NAME' | translate}}:
|
||||
</div>
|
||||
<div class="create-package-product">
|
||||
{{product.productName}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="product-quantity-box" ng-if="showQuantityField(product.category)">
|
||||
<label for="createPackagesProductQuantity">{{ 'packages.forms.CREATE_QUANTITY' | translate }}:</label>
|
||||
<input id='{{actionType}}-package-template-quantity-{{product.idProduct}}'
|
||||
type="number"
|
||||
name="productQuantity"
|
||||
min="1" max="100" step="1"
|
||||
class="product-quantity"
|
||||
ng-model="productUnit[product.idProduct]"
|
||||
ng-change="checkQuantityAmount(productUnit[product.idProduct])" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="arrows-icon col-md-1">
|
||||
<span class="glyphicon glyphicon-transfer"></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="packages-buttons row">
|
||||
<div class="col-md-7" ng-if="packagesByCategories">
|
||||
<input id="{{actionType}}-package-template"
|
||||
type="submit"
|
||||
class="btn btn-info"
|
||||
ng-click="updatePackage()"
|
||||
value="{{getButtonTitle()}}"/>
|
||||
</div>
|
||||
|
||||
<div class="reset-button col-md-4" ng-if="isResetBtnVisible()">
|
||||
<input id="{{actionType}}-template-reset-package-btn"
|
||||
type="submit"
|
||||
class="btn btn-primary"
|
||||
ng-click="resetProducts()"
|
||||
value="{{ 'packages.buttons.RESET' | translate }}"/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,259 @@
|
||||
<div id="select-packages-steps">
|
||||
<div class="set-default-prices step active-step">1. {{'packages.headers.SET_DEFAULT_PRICES' | translate}}</div>
|
||||
<div class="step-link"></div>
|
||||
<div class="select-commissions step inactive-step">2. {{'packages.headers.SET_COMMISSIONS' | translate}}</div>
|
||||
</div>
|
||||
<div id="select-packages-all" class="row">
|
||||
<div id="package-info" class="col-md-6">
|
||||
<h4>{{packageInfo.name}} ({{'packages.headers.SOLD_IN' | translate}} {{packageInfo.country}})</h4>
|
||||
<div ng-bind-html="renderHtml(packageInfo.description)" class="package_description"></div>
|
||||
</div>
|
||||
<h5>{{'packages.headers.PRODUCTS' | translate}}:</h5>
|
||||
<div class="products-list">
|
||||
<div class="package-category" ng-repeat="(productCategory, produccts) in packageProducts">
|
||||
<div class="product-category-title">{{productCategory}} ({{produccts.length}}):</div>
|
||||
<div class="package-info-product" ng-repeat="product in produccts">
|
||||
{{product.quantity}} x {{product.productName}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="set-default-prices" class="col-md-12" ng-if="isStepVisible('set-default-prices')">
|
||||
<h4>{{'packages.headers.SET_DEFAULT_PRICES' | translate}}</h4>
|
||||
<div id="comissions-default" class="comissions-row row">
|
||||
<div class="customer-name col-md-12">{{'packages.headers.DEFAULT' | translate}}</div>
|
||||
<div ng-repeat="priceObject in priceList[0]" class="pay-group col-md-12">
|
||||
<div class="row pay-comission-row">
|
||||
<div class="pay-comission-col-small col-md-2">
|
||||
<div class="comission-header">
|
||||
{{'packages.headers.PAY_TYPE' | translate}}: {{priceObject.payType}}
|
||||
</div>
|
||||
<div class="comission-text">
|
||||
{{'packages.headers.FIXED' | translate}}:
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="pay-comission-col-small col-md-2">
|
||||
<div class="comission-header">
|
||||
{{'packages.headers.MINIMAL_SELL_PRICE' | translate}}
|
||||
</div>
|
||||
<div class="comission-text">
|
||||
{{priceObject.minimalFixedPrice}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="pay-comission-col-small col-md-2">
|
||||
<div class="comission-header">
|
||||
{{'packages.headers.MY_COMMISSION' | translate}}
|
||||
</div>
|
||||
<div class="comission-text">
|
||||
+ <input ng-model="priceObject.defaultExtra"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="pay-comission-col-small col-md-2">
|
||||
<div class="comission-header">
|
||||
{{'packages.headers.DEFAULT_PRICE' | translate}}
|
||||
</div>
|
||||
<div class="comission-text">
|
||||
= {{priceSum([priceObject.minimalFixedPrice, priceObject.defaultExtra])}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="pay-comission-col-small col-md-2">
|
||||
<div class="comission-header">
|
||||
{{'packages.headers.VISIBLE_TO_CUSTOMER' | translate}}
|
||||
</div>
|
||||
<div class="comission-text">
|
||||
<span ng-click="setVisible(priceObject)" class="visible-glyph glyphicon {{isVisibleToCustomer(priceObject)}}"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row pay-comission-row">
|
||||
<div class="pay-comission-col-small col-md-2">
|
||||
{{'packages.headers.MONTHLY_RECURENCE' | translate}}:
|
||||
</div>
|
||||
|
||||
<div class="pay-comission-col-small col-md-2">
|
||||
<div class="comission-text">
|
||||
{{priceSum([priceObject.minimalRecurentPrice, priceObject.minimalServicesPrice])}}
|
||||
<span ng-if="priceObject.minimalRecurentPrice > 0">
|
||||
({{priceObject.minimalServicesPrice}} for services)
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="pay-comission-col-small col-md-2">
|
||||
<div class="recurent-box comission-text">
|
||||
<div ng-if="title[priceObject.idPayType]" class="recurent-tip alert alert-success">
|
||||
<span class="glyphicon glyphicon-info-sign"></span> {{'packages.messages.EPR' | translate}}
|
||||
<br/>
|
||||
<span class="glyphicon glyphicon-info-sign"></span> {{'packages.messages.ESR' | translate}}
|
||||
<br/>
|
||||
<span class="glyphicon glyphicon-info-sign"></span> {{'packages.messages.MY_COMMISSION_FORMULA' | translate}}
|
||||
</div>
|
||||
<div class="recurent-input-layer" ng-if="priceObject.packagePayPeriod > 0">
|
||||
+ <input ng-model="priceObject.defaultRecurent"/> (<span ng-mouseover="showTitle(priceObject.idPayType)" ng-mouseleave="hideTitle(priceObject.idPayType)" class="recurent-info glyphicon glyphicon-info-sign"></span> EPR)
|
||||
</div>
|
||||
<div>
|
||||
+ <input ng-model="priceObject.defaultServicesRecurent"/> (<span ng-mouseover="showTitle(priceObject.idPayType)" ng-mouseleave="hideTitle(priceObject.idPayType)" class="recurent-info glyphicon glyphicon-info-sign"></span> ESR)
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="pay-comission-col-small col-md-2">
|
||||
<div class="comission-text">
|
||||
= {{priceSum([priceObject.minimalRecurentPrice, priceObject.minimalServicesPrice, priceObject.defaultRecurent, priceObject.defaultServicesRecurent])}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="choose-customers" class="col-md-12" ng-if="isStepVisible('select-commissions')">
|
||||
<h4>{{'packages.headers.ADD_CUSTOMERS' | translate}}</h4>
|
||||
<div class="customer-select-layer">
|
||||
<select id="customer-selection"
|
||||
class="select-customer-for-pricing form-control-static"
|
||||
ng-model="data.selectedCustomerKey"
|
||||
ng-change="getCustomerPrices(data.selectedCustomerKey)"
|
||||
required>
|
||||
<option ng-repeat="(key, customerObject) in customers" value={{key}}>
|
||||
{{customerObject.customer}}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="select-commissions" class="col-md-12" ng-if="isStepVisible('select-commissions')">
|
||||
<h4>{{'packages.headers.SET_COMMISSIONS' | translate}}: {{packageInfo.name}}</h4>
|
||||
<div id="select-comission-warning" class="alert alert-warning" ng-if="!selectedCustomers.length">
|
||||
{{'packages.messages.NO_CUMSTOMER_SELECTED' | translate}}
|
||||
</div>
|
||||
<div class="comissions-select-layer">
|
||||
<div ng-repeat="customerObject in selectedCustomers"
|
||||
idCustomer="{{customerObject.id}}"
|
||||
id="comissions-{{customerObject.id}}"
|
||||
class="row comissions-row">
|
||||
<div class="customer-name col-md-12">
|
||||
{{customerObject.customer}}
|
||||
<span ng-if="isSameCompany(customerObject)">( same company )</span>
|
||||
</div>
|
||||
<div ng-repeat="priceObject in priceList[customerObject.id]" class="pay-group col-md-12">
|
||||
<div class="row pay-comission-row">
|
||||
<div class="pay-comission-col-small col-md-2">
|
||||
<div class="comission-header">
|
||||
{{'packages.headers.PAY_TYPE' | translate}}: {{priceObject.payType}}
|
||||
</div>
|
||||
<div class="comission-text">
|
||||
{{'packages.headers.FIXED' | translate}}:
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="pay-comission-col-small col-md-1">
|
||||
<div class="comission-header">
|
||||
{{'packages.headers.MINIMAL_SELL_PRICE' | translate}}
|
||||
</div>
|
||||
<div class="comission-text">
|
||||
{{priceObject.minimalFixedPrice}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="pay-comission-col-small col-md-2">
|
||||
<div class="comission-header">
|
||||
{{'packages.headers.MY_COMMISSION' | translate}}
|
||||
</div>
|
||||
<div class="comission-text">
|
||||
+ <input ng-disabled="isSameCompany(customerObject)" ng-model="customerObject.prices[priceObject.idPayType].fixedCommission" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="pay-comission-col-small col-md-1">
|
||||
<div class="comission-header">
|
||||
{{'packages.headers.FINAL_PRICE' | translate}}
|
||||
</div>
|
||||
<div class="comission-text">
|
||||
= {{priceSum([priceObject.minimalFixedPrice, customerObject.prices[priceObject.idPayType].fixedCommission])}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="pay-comission-col-small col-md-2">
|
||||
<div class="comission-header">
|
||||
{{'packages.headers.VISIBLE_TO_CUSTOMER' | translate}}
|
||||
</div>
|
||||
<div class="comission-text">
|
||||
<span ng-click="setVisible(customerObject.prices[priceObject.idPayType])" class="visible-glyph glyphicon {{isVisibleToCustomer(customerObject.prices[priceObject.idPayType])}}"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row pay-comission-row">
|
||||
<div class="pay-comission-col-small col-md-2">
|
||||
{{'packages.headers.MONTHLY_RECURENCE' | translate}}:
|
||||
</div>
|
||||
|
||||
<div class="pay-comission-col-small col-md-1">
|
||||
<div class="comission-text">
|
||||
{{priceSum([priceObject.minimalRecurentPrice, priceObject.minimalServicesPrice])}}
|
||||
<span ng-if="priceObject.minimalRecurentPrice > 0">
|
||||
({{priceObject.minimalServicesPrice}} for services)
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="pay-comission-col-small col-md-2">
|
||||
<div class="recurent-box comission-text">
|
||||
<div ng-if="title[priceObject.idPayType +'-' + customerObject.id]" class="recurent-tip alert alert-success">
|
||||
<span class="glyphicon glyphicon-info-sign"></span> MPR = My Package Recurent Comission
|
||||
<br/>
|
||||
<span class="glyphicon glyphicon-info-sign"></span> MSR = My Services and Support Recurent Comission
|
||||
</div>
|
||||
<div class="recurent-input-layer" ng-if="customerObject.prices[priceObject.idPayType].packagePayPeriod > 0">
|
||||
+ <input ng-disabled="isSameCompany(customerObject)" ng-model="customerObject.prices[priceObject.idPayType].recurentCommission"/> (<span ng-mouseover="showTitle(priceObject.idPayType +'-' + customerObject.id)" ng-mouseleave="hideTitle(priceObject.idPayType +'-' + customerObject.id)" class="recurent-info glyphicon glyphicon-info-sign"></span> MPR)
|
||||
</div>
|
||||
<div>
|
||||
+ <input ng-disabled="isSameCompany(customerObject)" ng-model="customerObject.prices[priceObject.idPayType].recurentServicesCommission"/> (<span ng-mouseover="showTitle(priceObject.idPayType +'-' + customerObject.id)" ng-mouseleave="hideTitle(priceObject.idPayType +'-' + customerObject.id)" class="recurent-info glyphicon glyphicon-info-sign"></span> MSR)
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="pay-comission-col-small col-md-1">
|
||||
<div class="comission-text">
|
||||
= {{priceSum([priceObject.minimalRecurentPrice, priceObject.minimalServicesPrice, customerObject.prices[priceObject.idPayType].recurentCommission, customerObject.prices[priceObject.idPayType].recurentServicesCommission])}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="btn btn-danger" ng-click="showHideRemoveDialog(customerObject.id)">
|
||||
<span class="glyphicon glyphicon-remove"></span> Remove customer specific commisions
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="action-buttons">
|
||||
<div class="next-btn btn btn-primary"
|
||||
ng-click="goToNextStep('next')">
|
||||
{{'packages.buttons.' + actionButton | translate}}
|
||||
</div>
|
||||
<div class="prev-btn btn btn-primary"
|
||||
ng-click="goToNextStep('prev')"
|
||||
ng-if="hasPrevStep()">
|
||||
{{'packages.buttons.' + prevButton | translate}}
|
||||
</div>
|
||||
</div>
|
||||
<div id="dialog-confirm-remove-customer-from-package-price"
|
||||
dialog
|
||||
ng-if="isRemoveDialogVisible"
|
||||
on-confirmation="removeCustomerSpecificCommissions"
|
||||
on-close="showHideRemoveDialog"
|
||||
is-modal="true"
|
||||
has-buttons="true"
|
||||
parameters="idCustomer"
|
||||
title="Remove customer">
|
||||
<p><span class="glyphicon glyphicon-warning-sign"></span>Are you sure you want to remove customer {{customerToRemove.customer}}?</p>
|
||||
</div>
|
||||
@@ -0,0 +1,8 @@
|
||||
<div class="row">
|
||||
<div class="col-sm-12"
|
||||
id="select-package-layer"
|
||||
ng-if="isSubmoduleVisible('selectPackage')">
|
||||
<h3>{{ 'packages.headers.SELECT_PACKAGE' | translate }}</h3>
|
||||
<select-package ng-init="startSelectPackageModule()" ng-controller="selectPackageCtrl"></select-package>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,156 @@
|
||||
<div id="package-info">
|
||||
<h4>{{packageInfo.name}} ({{'packages.headers.SOLD_IN' | translate}} {{packageInfo.country}})</h4>
|
||||
<div ng-bind-html="renderHtml(packageInfo.description)" class="package_description"></div>
|
||||
<h4>{{'packages.headers.PRODUCTS' | translate}}:</h4>
|
||||
<div class="products-list">
|
||||
<div class="package-category" ng-repeat="(productType, produccts) in packageProducts">
|
||||
<div class="product-category-title">{{productType}} ({{produccts.length}}):</div>
|
||||
<div class="package-info-product" ng-repeat="product in produccts">
|
||||
{{product.quantity}} x {{product.productName}} : {{calculateTotalPrice(product.unitCostPrice, product.payPeriod, product.isPriceRecurring, product.quantity)}} ({{calculateTotalPrice(product.unitCostPrice, product.payPeriod, product.isPriceRecurring)}} {{'packages.headers.UNIT' | translate}})
|
||||
<span ng-if="isPriceRecurring(product.isPriceRecurring)" class="product-recurring-info">({{product.unitCostPrice}} / {{'packages.extra.MONTH_FOR' | translate}} {{product.payPeriod}} {{'packages.extra.MONTHS' | translate}})</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="total-costs" class="row">
|
||||
<h3 class="col-md-12">{{'packages.headers.TOTAL_COSTS' | translate}}</h3>
|
||||
<div class="col-md-12">
|
||||
<div class="price-col col-md-2" ng-if="totalPrices.product">
|
||||
<div class="price-header">Products</div>
|
||||
<div class="price-text">{{totalPrices.product}}</div>
|
||||
</div>
|
||||
<div class="price-col col-md-2" ng-if="totalPrices.service.fixedPrice">
|
||||
<div class="price-header">One time services</div>
|
||||
<div class="price-text">{{totalPrices.service.fixedPrice}}</div>
|
||||
</div>
|
||||
<div class="price-col col-md-2" ng-if="totalPrices.installation">
|
||||
<div class="price-header">Installation</div>
|
||||
<div class="price-text">{{totalPrices.installation}}</div>
|
||||
</div>
|
||||
<div class="price-col col-md-2" ng-if="totalPrices.service.recurringPrice">
|
||||
<div class="price-header">Recurring services</div>
|
||||
<div class="price-text">{{totalPrices.service.recurringPrice}} / month</div>
|
||||
</div>
|
||||
<div class="price-col col-md-2">
|
||||
<div class="price-header">Interest Rate</div>
|
||||
<div class="price-text">{{interestRate}} %</div>
|
||||
</div>
|
||||
<div class="total-col col-md-2">
|
||||
<div class="price-header">{{'packages.headers.PAY_MARGIN' | translate}}</div>
|
||||
<div class="price-text">
|
||||
<input type="number" ng-model="commissionSplit.payMargin"/>
|
||||
</div>
|
||||
</div>
|
||||
<div ng-if="maxMarginExceded(commissionSplit.payMargin, totalPrice)" class="col-md-4">
|
||||
<div class="alert alert-danger">
|
||||
<span class="glyphicon glyphicon-ban-circle"></span>
|
||||
{{'packages.messages.PAY_MARGIN_EXCEDED' | translate}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="total-col col-md-12">
|
||||
<div class="price-header">Total cost</div>
|
||||
<div class="row">
|
||||
<div class="col-md-1">Fixed cost:</div>
|
||||
<div class="col-md-2">{{calculateTotalCost(totalPrices, 'fixed')}}</div>
|
||||
</div>
|
||||
<div class="row" ng-if="calculateTotalCost(totalPrices, 'recurring')">
|
||||
<div class="col-md-1">Recurring cost:</div>
|
||||
<div class="col-md-2">{{calculateTotalCost(totalPrices, 'recurring')}} / month</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="comission-split" class="row">
|
||||
<h3 class="col-md-12">{{'packages.headers.COMISSION_SPLIT' | translate}}</h3>
|
||||
<div class="user-layer">
|
||||
<div class="user-icon glyphicon glyphicon-user"></div>
|
||||
<div class="user-type">
|
||||
{{'packages.headers.BROKER' | translate}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="commission-range-layer">
|
||||
<input ng-model="commissionSplit.broker" ng-change="updateCommission('broker')" type="number" class="small-input"/>
|
||||
<span class="split-percent-sign">%</span>
|
||||
<input ng-model="commissionSplit.broker" ng-change="updateCommission('broker')" type="range" min="0" max="100" class="range-input"/>
|
||||
<input ng-model="commissionSplit.commercialLead" ng-change="updateCommission('commercialLead')" type="number" class="small-input"/>
|
||||
<span class="split-percent-sign">%</span>
|
||||
</div>
|
||||
|
||||
<div class="user-layer">
|
||||
<div class="user-icon glyphicon glyphicon-user"></div>
|
||||
<div class="user-type">
|
||||
{{'packages.headers.COMMERCIAL_LEAD' | translate}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="packages-per-pay-type">
|
||||
<h3>{{'packages.headers.PACKAGE_PER_PAY_TYPES' | translate}}</h3>
|
||||
<div ng-repeat="(key, price) in selectedPrices" class="price-group row">
|
||||
<div class="pay-type col-md-12">{{price.payType}}</div>
|
||||
<div class="price-small-group col-md-12">
|
||||
<div class="price-col col-md-2">
|
||||
<div class="price-header">{{'packages.headers.MINIMAL_FIXED_SELL_PRICE' | translate}}</div>
|
||||
<div class="price-text"><input ng-model="price.minimalFixedPrice"/></div>
|
||||
</div>
|
||||
<div class="price-col col-md-2">
|
||||
<div class="price-header">{{'packages.headers.MINIMAL_RECURENT_SELL_PRICE' | translate}}</div>
|
||||
<div class="price-text">{{(price.minimalRecurentPrice + price.minimalServicesPrice).toFixed(0)}}</div>
|
||||
</div>
|
||||
<div class="price-col col-md-3" ng-if="price.packagePayPeriod > 0">
|
||||
<div class="price-header">Principal Amount</div>
|
||||
<div class="price-text"><input type="number" ng-change="setRecurrentPrice(interestRate / 100, price)" ng-model="price.principalAmount"/></div>
|
||||
<div class="price-header">{{'packages.headers.MINIMAL_RECURENT_PACKAGE_PRICE' | translate}} ({{boundMessage(price.packagePayPeriod, price.periodUnit, 'packagePayPeriod')}})</div>
|
||||
<div class="price-text">{{calculateFinancing(interestRate / 100, price.packagePayPeriod, price.principalAmount).toFixed(0)}} / {{price.periodUnit}}</div>
|
||||
</div>
|
||||
<div class="price-col col-md-3">
|
||||
<div class="price-header">{{'packages.headers.MINIMAL_RECURENT_SERVICES_PRICE' | translate}} ({{boundMessage(price.servicesContractPeriod, price.periodUnit, 'servicesContractPeriod')}})</div>
|
||||
<div class="price-text"><input type="number" ng-model="price.minimalServicesPrice"/> / {{price.periodUnit}}</div>
|
||||
<div class="price-total-recurent" ng-if="price.servicesContractPeriod > 0">
|
||||
{{'packages.headers.FINAL_TOTAL' | translate}} {{(price.minimalServicesPrice * price.servicesContractPeriod).toFixed(2)}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="price-col col-md-2">
|
||||
<div class="price-header">Max contract period</div>
|
||||
<div class="price-text">{{price.maxContractPeriod}} {{price.periodUnit}}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="remove-pay-{{key}}" class="pay-type-btn btn btn-danger" ng-click="removePayType(key)">
|
||||
<span class="glyphicon glyphicon-minus"></span>
|
||||
<span class="btn-extra-text">
|
||||
{{'packages.buttons.REMOVE' | translate}}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div id="all-price-types" ng-if="payTypesVisible" class="price-group row">
|
||||
<div ng-repeat="(key, price) in prices" class="price-col pay-type-selection">
|
||||
<input type="checkbox" ng-checked="price.isChecked" ng-model="price.isChecked" class="price-checkbox"/>
|
||||
<label>{{price.payType}}
|
||||
({{'packages.headers.PAY_PERIOD' | translate}} {{price.packagePayPeriod}} {{price.periodUnit}} ,
|
||||
{{'packages.headers.SERVICES_AND_SUPPORT' | translate}} {{price.servicesContractPeriod}} {{price.periodUnit}},
|
||||
{{'packages.headers.MAX_PERIOD' | translate}} {{price.maxContractPeriod}} {{price.periodUnit}})
|
||||
</label>
|
||||
</div>
|
||||
<div id="select-pay-types" class="pay-type-btn btn btn-success" ng-click="selectPayTypes()">
|
||||
<span class="glyphicon glyphicon-ok"></span>
|
||||
<span class="btn-extra-text">
|
||||
{{'packages.buttons.SELECT' | translate}}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div id="action-buttons" class="col-md-12">
|
||||
<div id="add-pay-type" ng-if="!payTypesVisible" class="pay-type-btn btn btn-success" ng-click="addPayType()">
|
||||
<span class="glyphicon glyphicon-plus"></span>
|
||||
<span class="btn-extra-text">
|
||||
{{'packages.buttons.ADD' | translate}}
|
||||
</span>
|
||||
</div>
|
||||
<div class="save-btn btn btn-primary"
|
||||
ng-if="!payTypesVisible"
|
||||
ng-click="updateBrokerPricesAndCommission(key)">
|
||||
{{'packages.buttons.SAVE' | translate}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,8 @@
|
||||
<div class="row">
|
||||
<div class="col-sm-12"
|
||||
id="set-package-price-layer"
|
||||
ng-if="isSubmoduleVisible('setPackagePrice')">
|
||||
<h3>{{ 'packages.headers.SET_PACKAGE_PRICE' | translate }}</h3>
|
||||
<set-package-price ng-init="startSetPackagesPrices()" ng-controller="setPackagePriceCtrl"></set-package-price>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,34 @@
|
||||
<div id="upload-image-cdn-container" ng-init="parseUploadParams()">
|
||||
<h3 class="upload-image-title">Upload an image</h3>
|
||||
<div class="row image-characteristic">
|
||||
<label class="col-md-4">Name of the image</label>
|
||||
<input type="text" class="col-md-7" ng-model="options.name"/>
|
||||
</div>
|
||||
<div class="row image-characteristic">
|
||||
<label class="col-md-4">Set a specific width (px)</label>
|
||||
<input type="number" step="1" min="1" max="5000" ng-model="options.width"/>
|
||||
</div>
|
||||
<div class="row image-characteristic">
|
||||
<label class="col-md-4">Set a specific height (px)</label>
|
||||
<input type="number" step="1" min="1" max="5000" ng-model="options.height"/>
|
||||
</div>
|
||||
<div class="alert alert-info">
|
||||
<span class="glyphicon glyphicon-info-sign"></span> If no value is provided for width and height, the image will not be altered. The original size will be saved
|
||||
</div>
|
||||
<div ngf-drop="uploadImage($file)"
|
||||
ng-model="files"
|
||||
ngf-drag-over-class="'dragover'"
|
||||
ngf-select="uploadImage($file)"
|
||||
ngf-pattern="'.jpg,.jpeg,.png'"
|
||||
ngf-max-size="10MB"
|
||||
class="drop-box col-md-6">Select or drop image here</div>
|
||||
<div class="alert col-md-12" ng-if="imageUrl">
|
||||
<div class="col-md-12 image-url-label">
|
||||
Your image url:
|
||||
</div>
|
||||
{{imageUrl}}
|
||||
<button class="btn btn-info" ngclipboard data-clipboard-text={{imageUrl}}>
|
||||
<span class="glyphicon glyphicon-copy">Copy</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,3 @@
|
||||
<a href="packages?subModule=packageOptions">
|
||||
<span class="glyphicon glyphicon-plus edit-icon"></span> {{'packages.buttons.LINK_OPTIONS' | translate}}
|
||||
</a>
|
||||
@@ -0,0 +1,3 @@
|
||||
<a href="packages?subModule=packageOptions">
|
||||
<span class="glyphicon glyphicon-plus edit-icon"></span>
|
||||
</a>
|
||||
@@ -0,0 +1,3 @@
|
||||
<a href="packages?subModule=setPackagePrice&idPackage={{additionalPackage.idPackage}}">
|
||||
<span class="glyphicon glyphicon-pencil edit-icon"></span>
|
||||
</a>
|
||||
@@ -0,0 +1,3 @@
|
||||
<a href="packages?subModule=setPackagePrice&idPackage={{option.idPackage}}">
|
||||
<span class="glyphicon glyphicon-pencil edit-icon"></span>
|
||||
</a>
|
||||
@@ -0,0 +1,3 @@
|
||||
<a href="packages?subModule=setPackagePrice&idPackage={{data.id}}">
|
||||
<span class="glyphicon glyphicon-pencil edit-icon"></span>
|
||||
</a>
|
||||
Reference in New Issue
Block a user