<?php
namespace App\Repository;
use App\Entity\Sales;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
use App\Entity\User;
use App\Entity\Customer;
class UserCartRepository extends ServiceEntityRepository {
public function __construct(ManagerRegistry $registry) {
parent::__construct($registry, \App\Entity\Usercart::class);
}
/**
* Add a new line to the cart and returns the Id of that line (in case we need to set it as father id's on related products or similar.
* @param type $userId
* @param type $pbwId
* @param type $quantity
* @param type $volume
* @param type $domain
* @param type $relatedCartId
* @return object
*/
public function addItem($userCart, $userId, $pbwId, $volume, $quantity, $customer, $domain = null, $relatedCartId = null, $productPromotion=null, $bo=null, $productBoCustomer=null, $stock, $overage) {
$entityManager = $this->getEntityManager();
$userCart->setUser($userId);
$userCart->setPbw($pbwId);
$userCart->setVolume($volume);
$userCart->setQuantity($quantity);
$userCart->setDomain($domain);
$userCart->setProductPromotion($productPromotion);
$userCart->setCustomer($customer);
$userCart->setProductBusinessOportunities($bo);
$userCart->setStock($stock);
$userCart->setOverage($overage);
$userCart->setProductBusinessOpportunityCustomer($productBoCustomer);
if (!is_null($relatedCartId)) {
$relatedId = $userCart->getRelatedCartId();
if (!is_null($relatedId)) {
$relatedId[] = $relatedCartId;
$userCart->setRelatedCartId($relatedId);
} else {
$userCart->setRelatedCartId(array($relatedCartId));
}
}
$userRepository = $this->getEntityManager()->getRepository(User::class);
$user = $userRepository->find($userId);
if($user->getPartner()){
$partnerId=$user->getPartner()->getId();
}
elseif($user->getCustomer()){
$partnerId=$user->getCustomer()->getPartner()->getId();
}
$lastItemFromActualCart=$this->createQueryBuilder('uc')
->where('uc.unregistrationdate is NULL and uc.sale is NULL')
->andWhere('pbw.unregistrationdate is NULL')
->andWhere('uc.cartReference is not NULL')
->leftJoin('uc.pbw', 'pbw')
->leftJoin('uc.customer', 'c')
->leftJoin('c.partner', 'p')
->andWhere('p.id = :partner')
->setParameter('partner', $partnerId)
->orderBy('uc.createdAt', 'DESC')
->setMaxResults(1)
->getQuery()
->getOneOrNullResult();
if($lastItemFromActualCart) {
$userCart->setCartReference($lastItemFromActualCart->getCartReference());
}
else
{
$cartReference = time() . '-' . rand(0, 999999);
$userCart->setCartReference($cartReference);
}
$entityManager->persist($userCart);
$entityManager->flush();
return $userCart;
}
/**
* Add a related cart Id to the specific cart item.
* @param type $relatedCartId
* @return object
*/
public function addRelatedId($cartItem, $relatedCartId) {
$entityManager = $this->getEntityManager();
$relatedId = $cartItem->getRelatedCartId();
if (!is_null($relatedId)) {
$relatedId[] = $relatedCartId;
$cartItem->setRelatedCartId($relatedId);
} else {
$cartItem->setRelatedCartId(array($relatedCartId));
}
$entityManager->persist($cartItem);
$entityManager->flush();
return $this;
}
public function MyUserCartQuery($user) {
$qb = $this->createQueryBuilder('uc')
->where('uc.user = :userId and uc.unregistrationdate is NULL and uc.sale is NULL')
->andWhere('pbw.unregistrationdate is NULL')
->leftJoin('uc.pbw', 'pbw')
->setParameter('userId', $user->getId());
return $qb;
}
public function MyCustomerCartQuery($user) {
if($user->getPartner()){
$qb = $this->createQueryBuilder('uc')
->where('uc.unregistrationdate is NULL and uc.sale is NULL')
->leftJoin('uc.pbw', 'pbw')
->leftJoin('uc.customer', 'c')
->leftJoin('c.partner', 'p')
->andWhere('pbw.unregistrationdate is NULL')
->andWhere('p.id = :partner')
->setParameter('partner', $user->getPartner()->getId());
}
elseif($user->getCustomer()){
$qb = $this->createQueryBuilder('uc')
->where('uc.unregistrationdate is NULL and uc.sale is NULL')
->leftJoin('uc.pbw', 'pbw')
->andWhere('pbw.unregistrationdate is NULL')
->andWhere('uc.customer = :customer')
->setParameter('customer', $user->getCustomer()->getId());
}
return $qb;
}
public function getNumberCustomerCarts($user) {
if(!is_null($user->getPartner())){
$qb = $this->createQueryBuilder('uc')
->select('DISTINCT IDENTITY(uc.customer)')
->where('uc.user = :userId and uc.unregistrationdate is NULL and uc.sale is NULL')
->join('uc.pbw', 'pbw')
->join('uc.customer', 'cus')
->andWhere('pbw.unregistrationdate is NULL ')
->andWhere('cus.partner = :userPartner')
->setParameter('userId', $user->getId())
->setParameter('userPartner', $user->getPartner()->getId())
->getQuery()
->getResult();
return sizeof($qb);
}
elseif(!is_null($user->getCustomer())){
$qb = $this->createQueryBuilder('uc')
->where('uc.unregistrationdate is NULL and uc.sale is NULL')
->join('uc.pbw', 'pbw')
->andWhere('pbw.unregistrationdate is NULL ')
->andWhere('uc.customer = :customer')
->setParameter('customer', $user->getCustomer())
->getQuery()
->getResult();
return sizeof($qb);
}
else{
return 0;
}
}
public function MyCustomersCartsQuery($user) {
$customerRepository = $this->getEntityManager()->getRepository(Customer::class);
if(!is_null($user->getPartner())){
$qb = $this->createQueryBuilder('uc')
->select('DISTINCT cus.id')
->join('uc.pbw', 'pbw')
->join('uc.customer', 'cus')
->where('uc.unregistrationdate IS NULL')
->andWhere('uc.sale IS NULL')
->andWhere('pbw.unregistrationdate IS NULL')
->andWhere('cus.partner = :userPartner')
->setParameter('userPartner', $user->getPartner()->getId())
->getQuery()
->getResult();
$customers=array();
foreach($qb as $customerId)
{
array_push($customers, $customerRepository->find($customerId));
}
return $customers;
}
}
public function MyCustomersCartQuery() {
$qb = $this->createQueryBuilder('uc')
->where('uc.unregistrationdate is NULL and uc.sale is NULL');
return $qb;
}
/**
* Method that checks if any related Id is unregistered on the PBW
*
* @return boolean
*/
public function checkRelatedId($cartItem) {
if ($cartItem->getRelatedCartId()) {
foreach ($cartItem->getRelatedCartId() as $relatedId) {
$relatedIdCart = $this->find($relatedId);
if ($relatedIdCart->getPbw()->getUnregistrationdate()) {
return false;
}
}
}
return true;
}
}