Initial commit

This commit is contained in:
Senad Uka
2018-06-11 11:09:35 +02:00
commit ed7df7b11f
1954 changed files with 483354 additions and 0 deletions

View 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);
}
}

View File

@@ -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;
}
}

View 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;
}
}

View 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;
}
}

View 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');
}
}

File diff suppressed because it is too large Load Diff

View 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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -0,0 +1,4 @@
<div id="create-packages-layer"
ng-if="isSubmoduleVisible('createPackagesFromTemplate')">
<create-packages-from-template></create-packages-from-template>
</div>

View File

@@ -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>

View File

@@ -0,0 +1,4 @@
<div id="create-packages-layer"
ng-if="isSubmoduleVisible('createPackages')">
<create-packages></create-packages>
</div>

View File

@@ -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>

View File

@@ -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>

View File

@@ -0,0 +1,4 @@
<div id="create-template-packages-layer"
ng-if="isSubmoduleVisible('createTemplatePackages')">
<create-packages-template></create-packages-template>
</div>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -0,0 +1,4 @@
<div id="edit-packages-layer"
ng-if="isSubmoduleVisible('editPackages')">
<edit-packages ng-controller="editPackagesCtrl" ng-init="getCountries()"></edit-packages>
</div>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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');
}
?>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -0,0 +1,3 @@
<a href="packages?subModule=packageOptions">
<span class="glyphicon glyphicon-plus edit-icon"></span> {{'packages.buttons.LINK_OPTIONS' | translate}}
</a>

View File

@@ -0,0 +1,3 @@
<a href="packages?subModule=packageOptions">
<span class="glyphicon glyphicon-plus edit-icon"></span>
</a>

View File

@@ -0,0 +1,3 @@
<a href="packages?subModule=setPackagePrice&idPackage={{additionalPackage.idPackage}}">
<span class="glyphicon glyphicon-pencil edit-icon"></span>
</a>

View File

@@ -0,0 +1,3 @@
<a href="packages?subModule=setPackagePrice&idPackage={{option.idPackage}}">
<span class="glyphicon glyphicon-pencil edit-icon"></span>
</a>

View File

@@ -0,0 +1,3 @@
<a href="packages?subModule=setPackagePrice&idPackage={{data.id}}">
<span class="glyphicon glyphicon-pencil edit-icon"></span>
</a>