<?php
/**
* Pimcore
*
* This source file is available under two different licenses:
* - GNU General Public License version 3 (GPLv3)
* - Pimcore Enterprise License (PEL)
* Full copyright and license information is available in
* LICENSE.md which is distributed with this source code.
*
* @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.org)
* @license http://www.pimcore.org/license GPLv3 and PEL
*/
namespace App\Model\Product;
use Pimcore\Model\DataObject\AccessoryPart\Listing;
use Pimcore\Model\DataObject\Data\Hotspotimage;
use Pimcore\Db;
use Symfony\Component\Security\Core\User\UserInterface;
use Pimcore\Model\DataObject;
class Product extends \Pimcore\Model\DataObject\Product
{
const OBJECT_TYPE_ACTUAL_PRODUCT = 'product';
/**
* @return string
*/
public function getOSName($language=null): ?string
{
return $this->getItem();
}
public function getProductName($language = null) {
return $this->getItem($language);
}
/**
* @return string
*/
public function getSubText()
{
$textParts = [];
$textParts[] = $this->getDescription() ? $this->getDescription() : '';
return $this->getDescription();
}
/**
* @return int|string
*/
public function getOSProductNumber(): ?string
{
return $this->getId();
}
/**
* @return int|string
*/
public function getEuropeanPrice(): ?string
{
$floatPrice = (float) $this->getPrice();
$formatter = new \NumberFormatter("it-IT", \NumberFormatter::CURRENCY);
$formatter->setAttribute( $formatter::FRACTION_DIGITS, 2 );
return $formatter->formatCurrency($floatPrice, "EUR");
}
public function getEuropeanPriceWithCheck(): ?string
{
$floatPrice = (float) $this->getPrice('vendita');
$formatter = new \NumberFormatter("it-IT", \NumberFormatter::CURRENCY);
$formatter->setAttribute( $formatter::FRACTION_DIGITS, 2 );
return $formatter->formatCurrency($floatPrice, "EUR");
}
// /**
// * @return int|string
// */
public function getCustomSuggestedPrice(): ?string
{
// $service = \Pimcore::getContainer()->get(\Pimcore\Localization\IntlFormatter::class);
// $service->setLocale("it_IT");
return parent::getSuggestedPrice(); //$service->formatCurrency(parent::getSuggestedPrice(), "EUR");
}
/**
* @return int
*/
public function getOSParentId()
{
return parent::getOSParentId();
}
/**
* @return Image|null
*/
public function getMainImage(): ?\Pimcore\Model\Asset\Image
{
return (parent::getMainImage())?parent::getMainImage():$this->getDefaultImage();
}
public function getDefaultImage(){
return \Pimcore\Model\Asset::getByPath('/thumbnail.jpg');
}
/**
* @return Category|null
*/
public function getMainCategory(): ?Category
{
$categories = $this->getCategories();
$category = reset($categories);
return $category ?: null;
}
public function isInWishList(){
$result = false;
$user = \Pimcore::getContainer()->get('security.token_storage')->getToken()->getUser();
if($user instanceof \Pimcore\Model\DataObject){
$stmt = Db::get()->fetchAll("SELECT * FROM `object_query_wishlist` WHERE `user__id` = ".$user->getId()." AND `item__id` = '".$this->getId()."'");
if(!empty($stmt)){
$result = true;
}
}
return $result;
}
public function getPrice($type = false): ?string{
$price = parent::getCONSORZ();
$productId = $this->getId();
if(\Pimcore::getContainer()->get('security.token_storage')->getToken()){
$user = \Pimcore::getContainer()->get('security.token_storage')->getToken()->getUser();
if($productId && $user instanceof \Pimcore\Model\DataObject\Customer){
if($user->getUserRoles() != "Customer" && $type != 'vendita'){
$partner = $user->getPartner();
$priceList = ($partner->getPriceList())?$partner->getPriceList():"CONSORZ.";
$priceColumn = 'CONSORZ';
switch($priceList){
case 'CONSORZ.':
$priceColumn = 'CONSORZ';
break;
case 'ESTERO':
$priceColumn = 'ESTERO';
break;
case 'EST.20':
$priceColumn = 'EST20';
break;
case 'FERRAM.':
$priceColumn = 'FERRAM';
break;
case 'RIVENDIT':
$priceColumn = 'RIVENDIT';
break;
case 'PRI/IMP':
$priceColumn = 'PRIIMP';
break;
case 'RIVEDILE':
$priceColumn = 'RIVEDILE';
break;
case 'FERR 10%':
$priceColumn = 'FERR10';
break;
case 'PUNTO3':
$priceColumn = 'PUNTO3';
break;
case 'EDILBITT':
$priceColumn = 'EDILBITT';
break;
case 'LSKOSOVO':
$priceColumn = 'LSKOSOVO';
break;
case 'LSLOVENI':
$priceColumn = 'LSLOVENI';
break;
default:
$priceColumn = 'CONSORZ';
break;
}
}else if($user->getUserRoles() == "Customer" || $type=='vendita'){
$percentageMargin = DEFAULT_B2C_MARGIN;
$b2cPriceList = \Pimcore\Model\WebsiteSetting::getByName('b2cPriceList');
$b2cPriceList = $b2cPriceList->getData();
$region = Db::get()->fetchAll("SELECT region from province where code = '".$user->getProvince()."'");
if($region){
$stmt = Db::get()->fetchAll("SELECT PercentageMargin FROM `object_collection_PricingRuleCustomer_b2c_pricing` WHERE `Region` LIKE '%".$region[0]['region']."%'");
if(!empty($stmt)){
$percentageMargin = isset($stmt[0]['PercentageMargin'])?$stmt[0]['PercentageMargin']:1;
}
}
$price = (float) $this->getSuggestedPrice();
$price = $price + (($price*$percentageMargin)/100);
// Adding extra tax
if($user->getPrivato() == 'privato'){
$price = $price + (( (float) $price* (float) $b2cPriceList->getCustomerTax())/100);
}
}
}
}
return (string) $price;
}
public function isActive(bool $inProductList = false): bool{
return (parent::getCONSORZ() > 0)?true:false;
}
public function getResiduoCount(){
$totalResiduo = 0;
$productId = $this->getId();
// echo "SELECT SUM(Residuo) as totalResiduo FROM object_dt WHERE Item__id = $productId";
$stmt = Db::get()->fetchAll("SELECT SUM(Residuo) as totalResiduo FROM object_dt WHERE Item__id = $productId");
if(!empty($stmt)){
$totalResiduo = ($stmt[0]['totalResiduo'])?$stmt[0]['totalResiduo']:0;
}
return $totalResiduo;
}
public function getPendingOrders(){
$result = [];
$productId = $this->getId();
$orders = Db::get()->fetchAll("SELECT ExpectedDeliveryDate,Residuo, OrderDate FROM object_query_dt WHERE Item__id = $productId");
if($orders){
$count = 0;
foreach($orders as $order){
$result[$count]['ExpectedDeliveryDate'] = date('d\/m\/Y',$order['ExpectedDeliveryDate']);
$result[$count]['Residuo'] = $order['Residuo'];
$result[$count]['OrderDate'] = date('d\/m\/Y',$order['OrderDate']);
$count++;
}
}
return $result;
}
public function getSalesRepresentatives(){
$representatives = [];
$manufacturer = $this->getManufacturer();
if($manufacturer)
{
$salesRepresentatives = $manufacturer->getSalesRepesentative();
if($salesRepresentatives){
foreach($salesRepresentatives as $salesRepresentative){
$representatives[$salesRepresentative['Name']->getData()]['Name'] = $salesRepresentative['Name']->getData();
$representatives[$salesRepresentative['Name']->getData()]['Email'] = $salesRepresentative['PhoneNo']->getData();
}
}
if($representatives){
//$representatives = array_unique($representatives);
}
}
return $representatives;
}
public function getBranches(UserInterface $user){
$branches = [];
if($user){
$partner = $user->getPartner();
if($partner){
$taxIdNumber = $partner->getTaxIdNumber();
if($user->getUserRoles() == "Executive" || $user->getUserRoles() == "Customer"){
$branches[] = $partner->getId();
}
else if($user->getUserRoles() == 'Manager'){
$partnerBranches = new DataObject\Partners\Listing();
$partnerBranches->setCondition("TaxIdNumber = ?",[$partner->getTaxIdNumber()]);
$partnerBranches = $partnerBranches->load();
if($partnerBranches)
{
foreach($partnerBranches as $branch){
$branches[] = $branch->getId();
}
}
}
}
}
return $branches;
}
public function getPendingBookingsAndOrders(){
$bookings = 0;
$orders = 0;
$orderQty = 0;
$bookedQty = 0;
if(\Pimcore::getContainer()->get('security.token_storage')->getToken()){
$user = \Pimcore::getContainer()->get('security.token_storage')->getToken()->getUser();
$partner = $user->getPartner();
$productId = $this->getId();
if($partner && $productId){
$partnerId = $partner->getId();
$this->db = \Pimcore::getContainer()->get('doctrine.dbal.default_connection');
$pendingBooking = $this->db->fetchAll("SELECT count(poi.POItem) as totalpendingbooking, COUNT(poi.Qty) as totalpendingqty FROM `object_po` po LEFT JOIN object_poi poi ON po.oo_id = poi.o_parentId WHERE po.Branch__id = $partnerId AND poi.product__id = $productId AND po.isCancelled IS NULL AND po.isExpired = 0 AND po.WorkflowState = 'Booked'");
if($pendingBooking){
$bookings =$pendingBooking[0]['totalpendingbooking'];
$bookedQty =$pendingBooking[0]['totalpendingqty'];
}
$pendingOrder = $this->db->fetchAll("SELECT count(po.`oo_id`) as totalpendingorder, SUM(poi.amount) as totalpendingqty FROM `object_EF_OSO` po LEFT JOIN object_EF_OSOI poi ON po.oo_id = poi.o_parentId WHERE po.Branch__id = $partnerId AND poi.product__id = $productId AND po.WorkflowState != 'delivered'; ");
if($pendingOrder){
$orders =$pendingOrder[0]['totalpendingorder'];
$orderQty = $pendingOrder[0]['totalpendingqty'];
}
}
}
return ['booking'=>$bookings,'order'=>$orders,'orderQty'=>$orderQty,'bookedQty'=>$bookedQty];
}
public function getLastDelivery(){
$this->db = \Pimcore::getContainer()->get('doctrine.dbal.default_connection');
$result = $this->db->fetchAll('SELECT op.Item, dd.Qty, dd.UOM, dd.DocumentDate FROM `object_dd` dd LEFT JOIN object_prod op ON dd.Item__id = op.oo_id WHERE dd.Item__id = '.$this->getId().' AND itemDelivered = 1 ORDER BY DocumentDate DESC LIMIT 1');
return $result;
}
public function getPrezzoVendita($qty = 1)
{
return $this->getPrice('vendita')*$qty;
}
}