@@ -3,7 +3,6 @@ | |||
namespace Lc\CaracoleBundle\Builder\File; | |||
use Lc\CaracoleBundle\Model\File\DocumentInterface; | |||
use Lc\CaracoleBundle\Model\File\DocumentModel; | |||
use Lc\CaracoleBundle\Model\Order\OrderShopInterface; | |||
use Lc\CaracoleBundle\Generator\DocumentReferenceGenerator; | |||
use Lc\CaracoleBundle\Solver\Address\AddressSolver; | |||
@@ -23,8 +22,9 @@ class DocumentBuilder | |||
{ | |||
$merchantAddress = $orderShop->getSection()->getMerchant()->getAddress(); | |||
$buyerAddress = $orderShop->getInvoiceAddress(); | |||
//TODO a discuter, doit on garder le lien avec merchant pr la référence ou le mettre par section ? Est-ce que le nom de cette fonction est approprié. on fait une invoice et ça s'appele initFromOrderShop | |||
$document->setReference($this->documentReferenceGenerator->buildReference($orderShop->getSection()->getMerchant(), $document->getType())) ; | |||
// @TODO a discuter, doit on garder le lien avec merchant pr la référence ou le mettre par section ? Est-ce que le nom de cette fonction est approprié. on fait une invoice et ça s'appele initFromOrderShop | |||
$document->setReference($this->documentReferenceGenerator->buildReference($orderShop->getSection()->getMerchant(), $document->getType(), $orderShop)) ; | |||
$document->setMerchantAddress($merchantAddress); | |||
$document->setBuyerAddress($buyerAddress); |
@@ -3,6 +3,7 @@ | |||
namespace Lc\CaracoleBundle\Builder\User; | |||
use Lc\CaracoleBundle\Factory\User\UserPointSaleFactory; | |||
use Lc\CaracoleBundle\Model\Merchant\MerchantInterface; | |||
use Lc\CaracoleBundle\Model\PointSale\PointSaleInterface; | |||
use Lc\SovBundle\Model\User\UserInterface; | |||
use Lc\SovBundle\Builder\User\UserBuilder as SovUserBuilder; | |||
@@ -11,7 +12,7 @@ class UserBuilder extends SovUserBuilder | |||
{ | |||
// linkUserToPointSale | |||
public function linkToPointSale(UserInterface $user, PointSaleInterface $pointSale):bool | |||
public function linkToPointSale(UserInterface $user, PointSaleInterface $pointSale): bool | |||
{ | |||
if (!$this->userSolver->isLinkedToPointSale($user, $pointSale)) { | |||
$userPointSaleFactory = new UserPointSaleFactory(); | |||
@@ -25,5 +26,13 @@ class UserBuilder extends SovUserBuilder | |||
return false; | |||
} | |||
public function setFavoriteMerchant(UserInterface $user, MerchantInterface $merchant) | |||
{ | |||
$user->setFavoriteMerchant($merchant); | |||
$this->entityManager->update($user); | |||
$this->entityManager->flush(); | |||
return true; | |||
} | |||
} | |||
@@ -3,6 +3,7 @@ | |||
namespace Lc\CaracoleBundle\Container\File; | |||
use Lc\CaracoleBundle\Factory\File\DocumentFactory; | |||
use Lc\CaracoleBundle\Generator\DocumentReferenceGenerator; | |||
use Lc\CaracoleBundle\Repository\File\DocumentRepositoryQuery; | |||
use Lc\CaracoleBundle\Repository\File\DocumentStore; | |||
@@ -11,15 +12,18 @@ class DocumentContainer | |||
protected DocumentFactory $factory; | |||
protected DocumentRepositoryQuery $repositoryQuery; | |||
protected DocumentStore $store; | |||
protected DocumentReferenceGenerator $referenceGenerator; | |||
public function __construct( | |||
DocumentFactory $factory, | |||
DocumentRepositoryQuery $repositoryQuery, | |||
DocumentStore $store | |||
DocumentStore $store, | |||
DocumentReferenceGenerator $referenceGenerator | |||
) { | |||
$this->factory = $factory; | |||
$this->repositoryQuery = $repositoryQuery; | |||
$this->store = $store; | |||
$this->referenceGenerator = $referenceGenerator; | |||
} | |||
public function getFactory(): DocumentFactory | |||
@@ -38,4 +42,9 @@ class DocumentContainer | |||
return $this->store; | |||
} | |||
public function getReferenceGenerator(): DocumentReferenceGenerator | |||
{ | |||
return $this->referenceGenerator; | |||
} | |||
} |
@@ -51,7 +51,7 @@ use Symfony\Component\Security\Core\Security; | |||
trait ControllerTrait | |||
{ | |||
public static function getSubscribedServices() | |||
public static function getSubscribedServices() :array | |||
{ | |||
return array_merge( | |||
parent::getSubscribedServices(), |
@@ -5,6 +5,7 @@ namespace Lc\CaracoleBundle\Controller\Merchant; | |||
use Doctrine\ORM\EntityManagerInterface; | |||
use Lc\CaracoleBundle\Container\Merchant\MerchantContainer; | |||
use Lc\CaracoleBundle\Controller\AbstractController; | |||
use Lc\CaracoleBundle\Definition\ActionDefinition; | |||
use Lc\CaracoleBundle\Definition\MerchantSettingDefinition; | |||
use Lc\CaracoleBundle\Form\Merchant\SwitchMerchantFormType; | |||
use Symfony\Component\HttpFoundation\Request; | |||
@@ -27,22 +28,19 @@ class FavoriteMerchantAdminController extends AbstractController | |||
if ($merchant) { | |||
$user = $security->getUser(); | |||
if($user) { | |||
if ($user) { | |||
$user->setFavoriteMerchant($merchant); | |||
$entityManager->update($user); | |||
$entityManager->flush(); | |||
} | |||
// @TODO : à fignoler, hein gamin ? | |||
$url = $this->getSettingSolver()->getSettingValue( | |||
$merchant, | |||
MerchantSettingDefinition::SETTING_URL | |||
) . 'admin'; | |||
if ($url) { | |||
return $this->redirect($url); | |||
} | |||
$this->addFlashTranslator('success', ActionDefinition::SWITCH_FAVORITE_MERCHANT, 'Merchant', ['%merchant%' => $merchant->getTitle()]); | |||
} | |||
} else { | |||
$this->addFlashTranslator('error', ActionDefinition::SWITCH_FAVORITE_MERCHANT, 'Merchant'); | |||
} | |||
return $this->redirect($request->headers->get('referer')); | |||
} | |||
} |
@@ -5,6 +5,7 @@ namespace Lc\CaracoleBundle\Controller\Merchant; | |||
use Doctrine\ORM\EntityManagerInterface; | |||
use Lc\CaracoleBundle\Container\Merchant\MerchantContainer; | |||
use Lc\CaracoleBundle\Controller\AbstractController; | |||
use Lc\CaracoleBundle\Definition\ActionDefinition; | |||
use Lc\CaracoleBundle\Definition\MerchantSettingDefinition; | |||
use Lc\CaracoleBundle\Form\Merchant\SwitchMerchantFormType; | |||
use Symfony\Component\HttpFoundation\Request; | |||
@@ -33,16 +34,14 @@ class FavoriteMerchantController extends AbstractController | |||
$entityManager->flush(); | |||
} | |||
// @TODO : à fignoler, hein gamin ? | |||
$url = $this->getSettingSolver()->getSettingValue( | |||
$merchant, | |||
MerchantSettingDefinition::SETTING_URL | |||
) . 'admin'; | |||
if ($url) { | |||
return $this->redirect($url); | |||
} | |||
$this->addFlashTranslator('success', ActionDefinition::SWITCH_FAVORITE_MERCHANT, 'Merchant', ['%merchant%' => $merchant->getTitle()]); | |||
} | |||
} else { | |||
$this->addFlashTranslator('error', ActionDefinition::SWITCH_FAVORITE_MERCHANT, 'Merchant'); | |||
} | |||
return $this->redirect($request->headers->get('referer')); | |||
} | |||
} |
@@ -4,6 +4,7 @@ namespace Lc\CaracoleBundle\Controller\Merchant; | |||
use Lc\CaracoleBundle\Container\Merchant\MerchantContainer; | |||
use Lc\CaracoleBundle\Controller\AbstractController; | |||
use Lc\CaracoleBundle\Definition\ActionDefinition; | |||
use Lc\CaracoleBundle\Definition\MerchantSettingDefinition; | |||
use Lc\CaracoleBundle\Form\Merchant\SwitchMerchantFormType; | |||
use Symfony\Component\HttpFoundation\Request; | |||
@@ -16,7 +17,11 @@ class SwitchMerchantController extends AbstractController | |||
*/ | |||
public function switchMerchant(Request $request) | |||
{ | |||
$form = $this->createForm(SwitchMerchantFormType::class); | |||
$form = $this->createForm( | |||
SwitchMerchantFormType::class, | |||
null, | |||
array('csrf_protection' => false) | |||
); | |||
$form->handleRequest($request); | |||
if ($form->isSubmitted() && $form->isValid()) { | |||
@@ -25,19 +30,26 @@ class SwitchMerchantController extends AbstractController | |||
if ($merchant) { | |||
$url = $this->getSettingValue( | |||
$merchant, | |||
MerchantSettingDefinition::SETTING_URL | |||
$merchant, | |||
MerchantSettingDefinition::SETTING_URL | |||
); | |||
if ($context == 'admin') { | |||
$url .= 'admin'; | |||
} | |||
if ($url) { | |||
return $this->redirect($url); | |||
} | |||
} | |||
} | |||
if ($url) { | |||
return $this->redirect($url); | |||
} else { | |||
$this->addFlashTranslator('error', ActionDefinition::SWITCH_MERCHANT, 'Merchant'); | |||
return $this->redirect($request->headers->get('referer')); | |||
} | |||
} | |||
} |
@@ -30,7 +30,7 @@ class SwitchSectionAdminController extends AbstractController | |||
// valeur par défaut de $section : Tout afficher | |||
$section = null; | |||
$idSection = $form->get('id_section')->getData(); | |||
$idSection = $form->getClickedButton()->getConfig()->getOptions()['attr']['value']; | |||
$userMerchant = $merchantResolver->getUserMerchant(); | |||
if($userMerchant) { |
@@ -8,6 +8,8 @@ class ActionDefinition extends SovActionDefinition{ | |||
public const DUPLICATE_TO_OTHER_MERCHANT = 'duplicateToOtherMerchant'; | |||
public const DUPLICATE_TO_OTHER_SECTION = 'duplicateToOtherSection'; | |||
public const EDIT_ADDRESS_USER = 'editAddressUser'; | |||
public const SWITCH_MERCHANT = 'switchMerchant'; | |||
public const SWITCH_FAVORITE_MERCHANT = 'switchFavoriteMerchant'; | |||
} |
@@ -2,6 +2,7 @@ | |||
namespace Lc\CaracoleBundle\Form\Section; | |||
use App\Repository\Section\SectionStore; | |||
use Lc\CaracoleBundle\Model\Merchant\MerchantInterface; | |||
use Lc\CaracoleBundle\Repository\Section\SectionRepository; | |||
use Lc\CaracoleBundle\Resolver\MerchantResolver; | |||
@@ -20,53 +21,86 @@ use Symfony\Component\OptionsResolver\OptionsResolver; | |||
class SwitchSectionFormType extends AbstractType | |||
{ | |||
protected EntityManager $em; | |||
protected TranslatorAdmin $translatorAdmin; | |||
protected SectionStore $sectionStore; | |||
protected SectionResolver $sectionResolver; | |||
protected MerchantResolver $merchantResolver; | |||
protected SectionSolver $sectionSolver; | |||
public function __construct( | |||
EntityManager $em, | |||
TranslatorAdmin $translatorAdmin, | |||
SectionResolver $sectionResolver, | |||
SectionSolver $sectionSolver | |||
) { | |||
$this->em = $em; | |||
TranslatorAdmin $translatorAdmin, | |||
SectionStore $sectionStore, | |||
SectionResolver $sectionResolver, | |||
MerchantResolver $merchantResolver, | |||
SectionSolver $sectionSolver | |||
) | |||
{ | |||
$this->translatorAdmin = $translatorAdmin; | |||
$this->sectionResolver = $sectionResolver; | |||
$this->sectionStore = $sectionStore; | |||
$this->merchantResolver = $merchantResolver; | |||
$this->sectionSolver = $sectionSolver; | |||
} | |||
public function buildForm(FormBuilderInterface $builder, array $options) | |||
{ | |||
$section = $options['section']; | |||
// $builder->add( | |||
// 'id_section', | |||
// HiddenType::class, | |||
// [ | |||
// 'data' => $section ? $section->getId() : null | |||
// ] | |||
// ); | |||
$currentSection = $this->sectionResolver->getCurrent(); | |||
$sections = $this->sectionStore->setMerchant($this->merchantResolver->getCurrent())->getOnline(); | |||
$styleButton = ''; | |||
$classButton = 'btn-section'; | |||
if (null == $currentSection) { | |||
$classButton .= ' btn-section-current ' . $this->sectionSolver->getHtmlClass($currentSection); | |||
} | |||
//TOUT afficher | |||
$builder->add( | |||
'id_section', | |||
HiddenType::class, | |||
[ | |||
'data' => $section ? $section->getId() : null | |||
'switch_all', | |||
SubmitType::class, | |||
[ | |||
'label' => 'Tout afficher', | |||
'attr' => [ | |||
'class' => $classButton, | |||
'style' => $styleButton, | |||
'value' => null, | |||
] | |||
] | |||
); | |||
$styleButton = ''; | |||
$classButton = 'btn-section'; | |||
if ($section == $currentSection) { | |||
$classButton .= ' btn-section-current '.$this->sectionSolver->getHtmlClass($currentSection); | |||
} | |||
$builder->add( | |||
'submit', | |||
foreach ($sections as $section) { | |||
$styleButton = ''; | |||
$classButton = 'btn-section'; | |||
if ($section == $currentSection) { | |||
$classButton .= ' btn-section-current ' . $this->sectionSolver->getHtmlClass($currentSection); | |||
} | |||
$builder->add( | |||
'switch_'.$section->getSlug(), | |||
SubmitType::class, | |||
[ | |||
'label' => $section ? $section->getTitle() : 'Tout afficher', | |||
'attr' => [ | |||
'class' => $classButton, | |||
'style' => $styleButton, | |||
] | |||
'label' => $section->getTitle(), | |||
'attr' => [ | |||
'class' => $classButton, | |||
'style' => $styleButton, | |||
'value' => $section->getId(), | |||
] | |||
] | |||
); | |||
); | |||
} | |||
} | |||
/** | |||
@@ -75,9 +109,9 @@ class SwitchSectionFormType extends AbstractType | |||
public function configureOptions(OptionsResolver $resolver) | |||
{ | |||
$resolver->setDefaults( | |||
[ | |||
'section' => null, | |||
] | |||
[ | |||
'section' => null, | |||
] | |||
); | |||
} | |||
@@ -11,7 +11,6 @@ use Lc\CaracoleBundle\Repository\File\DocumentStore; | |||
class DocumentReferenceGenerator | |||
{ | |||
protected DocumentStore $documentStore; | |||
public function __construct(DocumentStore $documentStore) | |||
@@ -19,7 +18,7 @@ class DocumentReferenceGenerator | |||
$this->documentStore = $documentStore; | |||
} | |||
public function buildReference(MerchantInterface $merchant, string $documentType) | |||
public function buildReference(MerchantInterface $merchant, string $documentType, OrderShopInterface $orderShop = null) | |||
{ | |||
$prefix = ''; | |||
if ($documentType == DocumentModel::TYPE_DELIVERY_NOTE) { |
@@ -28,4 +28,21 @@ class DocumentRepositoryQuery extends AbstractRepositoryQuery | |||
->andWhere('.buyerAddress = :buyerAddress') | |||
->setParameter('buyerAddress', $buyerAddress); | |||
} | |||
public function filterByReference(string $reference = null) | |||
{ | |||
if(is_null($reference)) { | |||
return $this->andWhere('.reference IS NULL'); | |||
} | |||
else { | |||
return $this | |||
->andWhere('.reference LIKE :reference') | |||
->setParameter('reference', $reference); | |||
} | |||
} | |||
public function filterIsReferenceNotNull() | |||
{ | |||
return $this->andWhere('.reference IS NOT NULL'); | |||
} | |||
} |
@@ -4,6 +4,7 @@ namespace Lc\CaracoleBundle\Repository\File; | |||
use App\Entity\Address\Address; | |||
use Lc\CaracoleBundle\Model\File\DocumentInterface; | |||
use Lc\CaracoleBundle\Model\File\DocumentModel; | |||
use Lc\CaracoleBundle\Repository\MerchantStoreTrait; | |||
use Lc\CaracoleBundle\Repository\SectionStoreTrait; | |||
use Lc\CaracoleBundle\Repository\AbstractStore; | |||
@@ -22,7 +23,6 @@ class DocumentStore extends AbstractStore | |||
public function orderByDefault(RepositoryQueryInterface $query): RepositoryQueryInterface | |||
{ | |||
$query->orderBy('id'); | |||
return $query; | |||
} | |||
@@ -43,12 +43,29 @@ class DocumentStore extends AbstractStore | |||
return $query; | |||
} | |||
public function getOneByReference(string $reference = null, string $type = null, $query = null) | |||
{ | |||
$query = $this->createDefaultQuery($query); | |||
$query | |||
->filterByReference($reference) | |||
->orderBy('createdAt', 'ASC') | |||
->innerJoin('.orderShops', 'orderShops') | |||
; | |||
if(!is_null($type)) { | |||
$query->filterByType($type); | |||
} | |||
return $query->findOne(); | |||
} | |||
public function getOneLatestByType(string $documentType, $query = null): DocumentInterface | |||
{ | |||
$query = $this->createDefaultQuery($query); | |||
$query | |||
->filterIsReferenceNotNull() | |||
->filterByType($documentType) | |||
->orderBy('createdAt', 'DESC'); | |||
@@ -168,7 +168,8 @@ class ProductFamilyRepositoryQuery extends AbstractRepositoryQuery | |||
$this->leftJoin('.productCategories', 'productCategories'); | |||
if ($addSelect) { | |||
$this->addSelect('productCategories'); | |||
//Commenté sinon doctrine n'hydrate pas correctement les catégories liés au ProductFamily (exemple : un seul sur trois) | |||
//$this->addSelect('productCategories'); | |||
} | |||
return $this; | |||
} |
@@ -51,10 +51,11 @@ class ProductFamilyStore extends AbstractStore | |||
} | |||
public function getByParentCategory( | |||
ProductCategoryInterface $parentCategory, | |||
$user = null, | |||
$query = null | |||
) { | |||
ProductCategoryInterface $parentCategory, | |||
$user = null, | |||
$query = null | |||
) | |||
{ | |||
$productFamiliesArray = []; | |||
foreach ($parentCategory->getChildrens() as $i => $category) { | |||
@@ -69,14 +70,15 @@ class ProductFamilyStore extends AbstractStore | |||
// getProductFamiliesByCategory | |||
public function getByCategory( | |||
ProductCategoryInterface $productCategory, | |||
$query = null | |||
) { | |||
ProductCategoryInterface $productCategory, | |||
$query = null | |||
) | |||
{ | |||
$query = $this->createDefaultQuery($query); | |||
$query | |||
->filterIsOnline() | |||
->filterByProductCategory($productCategory); | |||
->filterIsOnline() | |||
->filterByProductCategory($productCategory); | |||
return $query->find(); | |||
} | |||
@@ -85,7 +87,8 @@ class ProductFamilyStore extends AbstractStore | |||
public function getByCategoryOnlineAndOffline( | |||
ProductCategoryInterface $productCategory, | |||
$query = null | |||
) { | |||
) | |||
{ | |||
$query = $this->createDefaultQuery($query); | |||
$query | |||
@@ -100,8 +103,8 @@ class ProductFamilyStore extends AbstractStore | |||
$query = $this->createDefaultQuery($query); | |||
$query | |||
->filterByPropertyNoveltyExpirationDate() | |||
->filterIsOnline(); | |||
->filterByPropertyNoveltyExpirationDate() | |||
->filterIsOnline(); | |||
$results = $query->find(); | |||
@@ -114,8 +117,8 @@ class ProductFamilyStore extends AbstractStore | |||
$query = $this->createDefaultQuery($query); | |||
$query | |||
->filterIsOrganicLabel() | |||
->filterIsOnline(); | |||
->filterIsOrganicLabel() | |||
->filterIsOnline(); | |||
$results = $query->find(); | |||
@@ -133,10 +136,10 @@ class ProductFamilyStore extends AbstractStore | |||
{ | |||
if ($user) { | |||
return $this->getWithReductions( | |||
$user->getFavoriteProductFamilies(), | |||
$user, | |||
false, | |||
$organizeByParentCategory | |||
$user->getFavoriteProductFamilies(), | |||
$user, | |||
false, | |||
$organizeByParentCategory | |||
); | |||
} | |||
@@ -146,12 +149,13 @@ class ProductFamilyStore extends AbstractStore | |||
// findByTerms | |||
public function getByTerms( | |||
$terms, | |||
$maxResults = false, | |||
$organizeByParentCategory = false, | |||
$user = null, | |||
$query = null | |||
) { | |||
$terms, | |||
$maxResults = false, | |||
$organizeByParentCategory = false, | |||
$user = null, | |||
$query = null | |||
) | |||
{ | |||
$query = $this->createDefaultQuery($query); | |||
$query->filterIsOnline(); | |||
@@ -169,26 +173,21 @@ class ProductFamilyStore extends AbstractStore | |||
} | |||
public function getBestReductionCatalog( | |||
ProductFamilyInterface $productFamily, | |||
ReductionCatalogInterface $reductionCatalog1, | |||
ReductionCatalogInterface $reductionCatalog2 | |||
) { | |||
$price1 = $this->priceSolver->applyReductionCatalog( | |||
$productFamily, | |||
$this->priceSolver->getPrice($productFamily), | |||
$this->priceSolver->getPriceWithTax($productFamily), | |||
1, | |||
$reductionCatalog1 | |||
ProductFamilyInterface $productFamily, | |||
ReductionCatalogInterface $reductionCatalog1, | |||
ReductionCatalogInterface $reductionCatalog2 | |||
) | |||
{ | |||
$price1 = $this->priceSolver->getPriceWithTaxByReduction( | |||
$productFamily, | |||
$reductionCatalog1 | |||
); | |||
$price2 = $this->priceSolver->applyReductionCatalog( | |||
$productFamily, | |||
$this->priceSolver->getPrice($productFamily), | |||
$this->priceSolver->getPriceWithTax($productFamily), | |||
1, | |||
$reductionCatalog2 | |||
$price2 = $this->priceSolver->getPriceWithTaxByReduction( | |||
$productFamily, | |||
$reductionCatalog2 | |||
); | |||
if ($price1 > $price2) { | |||
return $reductionCatalog2; | |||
} else { | |||
@@ -198,29 +197,32 @@ class ProductFamilyStore extends AbstractStore | |||
// setReductionForProductFamilies | |||
public function getWithReductions( | |||
$productFamilies, | |||
UserInterface $user = null, | |||
$organizeByCategory = false, | |||
$organizeByParentCategory = false, | |||
$onlyOnDiscount = false | |||
) { | |||
$productFamilies, | |||
UserInterface $user = null, | |||
$organizeByCategory = false, | |||
$organizeByParentCategory = false, | |||
$onlyOnDiscount = false | |||
) | |||
{ | |||
$conditions = [ | |||
'ids' => [], | |||
'categories' => [], | |||
'productFamiliesIds' => [], | |||
'categories' => [], | |||
'productFamilies' => [], | |||
]; | |||
foreach ($productFamilies as $productFamily) { | |||
$conditions['ids'][] = $productFamily->getId(); | |||
$conditions['productFamiliesIds'][] = $productFamily->getId(); | |||
$conditions['productFamilies'][] = $productFamily; | |||
$conditions['categories'] = array_merge( | |||
$conditions['categories'], | |||
$productFamily->getProductCategories()->toArray() | |||
$conditions['categories'], | |||
$productFamily->getProductCategories()->toArray() | |||
); | |||
} | |||
if ($productFamilies) { | |||
$reductionCatalogs = $this->reductionCatalogStore->getByProductFamiliesConditions( | |||
$conditions, | |||
$user | |||
$conditions, | |||
$user | |||
); | |||
} | |||
@@ -230,20 +232,19 @@ class ProductFamilyStore extends AbstractStore | |||
$conditionProductFamilies = $conditionProductFamily = $conditionProductCategory = false; | |||
if ($reductionCatalog->getProductFamilies()->contains( | |||
$productFamily | |||
) || $reductionCatalog->getProductFamilies()->isEmpty()) { | |||
$productFamily | |||
) || $reductionCatalog->getProductFamilies()->isEmpty()) { | |||
$conditionProductFamilies = true; | |||
} | |||
if ($reductionCatalog->getProductFamily() == $productFamily || $reductionCatalog->getProductFamily( | |||
) === null) { | |||
if ($reductionCatalog->getProductFamily() == $productFamily || $reductionCatalog->getProductFamily() === null) { | |||
$conditionProductFamily = true; | |||
} | |||
foreach ($productFamily->getProductCategories() as $productCategory) { | |||
if ($reductionCatalog->getProductCategories()->contains( | |||
$productCategory | |||
) || $reductionCatalog->getProductCategories()->isEmpty()) { | |||
$productCategory | |||
) || $reductionCatalog->getProductCategories()->isEmpty()) { | |||
$conditionProductCategory = true; | |||
} | |||
} | |||
@@ -251,11 +252,11 @@ class ProductFamilyStore extends AbstractStore | |||
if ($conditionProductFamilies && $conditionProductFamily && $conditionProductCategory) { | |||
if ($productFamily->getReductionCatalog()) { | |||
$productFamily->setReductionCatalog( | |||
$this->getBestReductionCatalog( | |||
$productFamily, | |||
$reductionCatalog, | |||
$productFamily->getReductionCatalog() | |||
) | |||
$this->getBestReductionCatalog( | |||
$productFamily, | |||
$reductionCatalog, | |||
$productFamily->getReductionCatalog() | |||
) | |||
); | |||
} else { | |||
$productFamily->setReductionCatalog($reductionCatalog); | |||
@@ -273,8 +274,8 @@ class ProductFamilyStore extends AbstractStore | |||
if ($this->productCategorySolver->isDisplay($parentCategory, $user)) { | |||
if (!isset($productFamiliesToReturn[$parentCategory->getId()])) { | |||
$productFamiliesToReturn[$parentCategory->getId()] = [ | |||
'category' => $parentCategory, | |||
'products' => [] | |||
'category' => $parentCategory, | |||
'products' => [] | |||
]; | |||
} | |||
$productFamiliesToReturn[$parentCategory->getId()]['products'][] = $productFamily; |
@@ -2,6 +2,7 @@ | |||
namespace Lc\CaracoleBundle\Repository\Reduction; | |||
use Doctrine\Common\Collections\ArrayCollection; | |||
use Knp\Component\Pager\PaginatorInterface; | |||
use Lc\CaracoleBundle\Model\Product\ProductFamilyInterface; | |||
use Lc\CaracoleBundle\Repository\MerchantRepositoryQueryTrait; | |||
@@ -29,8 +30,8 @@ class ReductionCatalogRepositoryQuery extends AbstractRepositoryQuery | |||
$this->isJoinUsers = true; | |||
return $this | |||
->leftJoin('.users', 'pf_users') | |||
->addSelect('pf_users') ; | |||
->leftJoin('.users', 'pf_users') | |||
->addSelect('pf_users'); | |||
} | |||
return $this; | |||
} | |||
@@ -41,8 +42,8 @@ class ReductionCatalogRepositoryQuery extends AbstractRepositoryQuery | |||
$this->isJoinGroupUsers = true; | |||
return $this | |||
->leftJoin('.groupUsers', 'groupUsers') | |||
->addSelect('groupUsers') ; | |||
->leftJoin('.groupUsers', 'groupUsers') | |||
->addSelect('groupUsers'); | |||
} | |||
return $this; | |||
} | |||
@@ -53,8 +54,8 @@ class ReductionCatalogRepositoryQuery extends AbstractRepositoryQuery | |||
$this->isJoinProductFamilies = true; | |||
return $this | |||
->leftJoin('.productFamilies', 'productFamilies') | |||
->addSelect('productFamilies') ; | |||
->leftJoin('.productFamilies', 'productFamilies') | |||
->addSelect('productFamilies'); | |||
} | |||
return $this; | |||
} | |||
@@ -65,8 +66,8 @@ class ReductionCatalogRepositoryQuery extends AbstractRepositoryQuery | |||
$this->isJoinProductFamily = true; | |||
return $this | |||
->leftJoin('.productFamily', 'productFamily') | |||
->addSelect('productFamily') ; | |||
->leftJoin('.productFamily', 'productFamily') | |||
->addSelect('productFamily'); | |||
} | |||
return $this; | |||
@@ -78,8 +79,8 @@ class ReductionCatalogRepositoryQuery extends AbstractRepositoryQuery | |||
$this->isJoinProductCategories = true; | |||
return $this | |||
->leftJoin('.productCategories', 'productCategories') | |||
->addSelect('productCategories') ; | |||
->leftJoin('.productCategories', 'productCategories') | |||
->addSelect('productCategories'); | |||
} | |||
return $this; | |||
@@ -88,15 +89,15 @@ class ReductionCatalogRepositoryQuery extends AbstractRepositoryQuery | |||
public function filterProductFamily(ProductFamilyInterface $productFamily) | |||
{ | |||
return $this | |||
->andWhere('.productFamily = :productFamily') | |||
->setParameter(':productFamily', $productFamily); | |||
->andWhere('.productFamily = :productFamily') | |||
->setParameter(':productFamily', $productFamily); | |||
} | |||
public function filterConditionDate() | |||
{ | |||
return $this | |||
->andWhere('.permanent = 1 OR ( .dateStart <= :now AND .dateEnd >= :now)') | |||
->setParameter(':now', new \DateTime()); | |||
->andWhere('.permanent = 1 OR ( .dateStart <= :now AND .dateEnd >= :now)') | |||
->setParameter(':now', new \DateTime()); | |||
} | |||
public function filterConditionUser(UserInterface $user = null) | |||
@@ -105,11 +106,11 @@ class ReductionCatalogRepositoryQuery extends AbstractRepositoryQuery | |||
if ($user) { | |||
return $this | |||
->andWhere(':user MEMBER OF .users OR .users is empty') | |||
->setParameter('user', $user); | |||
->andWhere(':user MEMBER OF .users OR .users is empty') | |||
->setParameter('user', $user); | |||
} else { | |||
return $this | |||
->andWhere('.users is empty'); | |||
->andWhere('.users is empty'); | |||
} | |||
} | |||
@@ -119,21 +120,24 @@ class ReductionCatalogRepositoryQuery extends AbstractRepositoryQuery | |||
if ($user) { | |||
return $this | |||
->andWhere(':groupUser MEMBER OF .groupUsers OR .groupUsers is empty') | |||
->setParameter('groupUser', $user->getGroupUsers()); | |||
->andWhere(':groupUser MEMBER OF .groupUsers OR .groupUsers is empty') | |||
->setParameter('groupUser', $user->getGroupUsers()); | |||
} else { | |||
return $this | |||
->andWhere('.groupUsers is empty'); | |||
->andWhere('.groupUsers is empty'); | |||
} | |||
} | |||
public function filterConditionProductFamilies(array $productFamilies) | |||
public function filterConditionProductFamilies(array $productFamiliesIds, array $productFamilies) | |||
{ | |||
$this->joinProductFamilies(); | |||
$this->joinProductFamily(); | |||
return $this | |||
->andWhere(':productFamilies MEMBER OF .productFamilies OR .productFamilies is empty') | |||
->setParameter('productFamilies', $productFamilies); | |||
->andWhere(':productFamiliesIds MEMBER OF .productFamilies OR .productFamilies is empty') | |||
->andWhere('.productFamily IN (:productFamilies) OR .productFamily is null') | |||
->setParameter('productFamiliesIds', $productFamiliesIds) | |||
->setParameter('productFamilies', $productFamilies); | |||
} | |||
public function filterConditionProductFamily(ProductFamilyInterface $productFamily) | |||
@@ -141,8 +145,8 @@ class ReductionCatalogRepositoryQuery extends AbstractRepositoryQuery | |||
$this->joinProductFamily(); | |||
return $this | |||
->andWhere(':productFamily MEMBER OF .productFamily OR .productFamily is empty') | |||
->setParameter('productFamily', $productFamily); | |||
->andWhere(':productFamily MEMBER OF .productFamily OR .productFamily is empty') | |||
->setParameter('productFamily', $productFamily); | |||
} | |||
public function filterConditionProductCategories(array $productCategories) | |||
@@ -150,9 +154,13 @@ class ReductionCatalogRepositoryQuery extends AbstractRepositoryQuery | |||
$this->joinProductCategories(); | |||
return $this | |||
->andWhere(':productCategory MEMBER OF .productCategories OR .productCategories is empty') | |||
->setParameter('productCategory', $productCategories); | |||
->andWhere(':productCategory MEMBER OF .productCategories OR .productCategories is empty') | |||
->setParameter('productCategory', $productCategories); | |||
} | |||
public function filterIsNotLinkToProductFamily() | |||
{ | |||
return $this->andWhere('.productFamily is null'); | |||
} | |||
} |
@@ -112,7 +112,12 @@ entity: | |||
Merchant: | |||
label: Marchand | |||
label_plurial: Marchands | |||
flashes: | |||
error: | |||
switchMerchant: Une erreur est survenue lors du changement de marchand, veuillez réessayer. | |||
switchFavoriteMerchant: Une erreur est survenue lors de la sauvegarde de votre marchand favoris. | |||
success: | |||
switchFavoriteMerchant: "%merchant% est maintenant votre marchand favoris." | |||
Section: | |||
label: Section | |||
label_plurial: Sections | |||
@@ -167,6 +172,16 @@ entity: | |||
error: | |||
saveCreditHistory: Une erreur est survenue à l'ajout de crédit/débit | |||
OrderShop: | |||
modals: | |||
sendPaymentLink: Envoyer le lien de paiement | |||
changeOrderStatus: Modifier le statut de commande | |||
invoiceAddress: Modifier l'adresse de facturation | |||
deliveryAddress: Modifier l'adresse de livraison | |||
addOrderProduct: Ajouter un produit | |||
addReductionCart: Ajouter une réduction panier | |||
addReductionCredit: Ajouter un avoir | |||
orderPayment: Ajouter un paiement | |||
orderStatusHistories: Historique des changements de statuts | |||
fields: | |||
deliveryInfos: | | |||
Merci de nous laisser le maximum d'informations pour faciliter notre arrivée : digicode, |
@@ -1,9 +1,11 @@ | |||
{% set value = field.value %} | |||
{% set item = entity.instance %} | |||
{% for val in value %} | |||
<span class="badge badge-success"> | |||
{{ val.meanPayment|sov_trans_admin_choice('meanPayment', 'OrderPayment') }} | |||
</span> | |||
{% if val.meanPayment %} | |||
<span class="badge badge-success"> | |||
{{ val.meanPayment|sov_trans_admin_choice('meanPayment', 'OrderPayment') }} | |||
</span> | |||
{% endif %} | |||
{% endfor %} | |||
{% set is_paid = order_shop_container.resolver.isPaid(item) %} |
@@ -8,22 +8,14 @@ | |||
<nav class="carac navbar navbar-expand navbar-light main-header{% if is_display_switch_section %} display-section-switch {{ section_container.solver.getHtmlClass(section_current()) }}{% endif %}"> | |||
{% if is_display_switch_section %} | |||
<ul class="navbar-nav left"> | |||
<li class="nav-item d-none d-sm-inline-block"> | |||
{{ _self.form_switch_section(null) }} | |||
</li> | |||
{% for section in carac_sections() %} | |||
<li class="nav-item d-none d-sm-inline-block"> | |||
{{ _self.form_switch_section(section) }} | |||
</li> | |||
{% endfor %} | |||
</ul> | |||
{% endif %} | |||
{% if is_display_switch_section %} | |||
{{ _self.form_switch_section() }} | |||
{% endif %} | |||
<ul class="navbar-nav ml-auto right"> | |||
<li class="nav-item nav-switch-merchant"> | |||
<i class="fa fa-store"></i> | |||
{% set form_switch_merchant = carac_form_switch_merchant('admin') %} | |||
{% set form_switch_merchant = carac_form_switch_merchant('admin', 'carac_merchant_switch', false) %} | |||
{% form_theme form_switch_merchant '@LcSov/adminlte/crud/form_theme.html.twig' %} | |||
{{ form_start(form_switch_merchant) }} | |||
{{ form(form_switch_merchant) }} | |||
@@ -47,14 +39,20 @@ | |||
{% if(user.favoriteMerchant != merchant_current) %} | |||
{# modal affichée uniquement si la sessionStorage.visit_merchant n'est pas défini (js) #} | |||
{% include '@LcCaracole/admin/merchant/modal/switch_merchant.html.twig' %} | |||
{% include '@LcCaracole/admin/merchant/modal/switch_merchant.html.twig' %} | |||
{% endif %} | |||
{% endblock %} | |||
{% macro form_switch_section(section) %} | |||
{% set form_switch_section = carac_form_switch_section(section) %} | |||
{% macro form_switch_section() %} | |||
{% set form_switch_section = carac_form_switch_section() %} | |||
{% form_theme form_switch_section '@LcSov/adminlte/crud/form_theme.html.twig' %} | |||
{{ form_start(form_switch_section) }} | |||
{{ form(form_switch_section) }} | |||
<ul class="navbar-nav left"> | |||
{% for field in form_switch_section %} | |||
<li class="nav-item d-none d-sm-inline-block"> | |||
{{ form_row(field) }} | |||
</li> | |||
{% endfor %} | |||
</ul> | |||
{{ form_end(form_switch_section) }} | |||
{% endmacro %} |
@@ -5,6 +5,7 @@ namespace Lc\CaracoleBundle\Solver\Price; | |||
use Lc\CaracoleBundle\Doctrine\Extension\ProductPropertyInterface; | |||
use Lc\CaracoleBundle\Model\Product\ProductFamilyInterface; | |||
use Lc\CaracoleBundle\Model\Product\ProductInterface; | |||
use Lc\CaracoleBundle\Model\Reduction\ReductionCatalogInterface; | |||
use Lc\CaracoleBundle\Solver\Product\ProductFamilySolver; | |||
use Lc\CaracoleBundle\Solver\Product\ProductSolver; | |||
@@ -87,6 +88,18 @@ class ProductPriceSolver | |||
); | |||
} | |||
//Bridge pour applyReductionCatalog qui ne peut pas être appeler à cause du call | |||
public function getPriceWithTaxByReduction(ProductPropertyInterface $product, ReductionCatalogInterface $reductionCatalog) | |||
{ | |||
return $this->applyReductionCatalog( | |||
$product, | |||
$this->getPrice($product), | |||
$this->getPriceWithTax($product), | |||
1, | |||
$reductionCatalog | |||
); | |||
} | |||
public function getPriceByRefUnitWithTaxAndReduction(ProductPropertyInterface $product) | |||
{ | |||
return ($this->getPriceByRefUnitWithTax($product) * $this->getPriceWithTaxAndReduction($product)) |
@@ -112,11 +112,12 @@ class OrderShopTransformer | |||
'orderReference' => $order->getReference(), | |||
'comment' => $orderPayment->getComment(), | |||
'meanPayment' => $orderPayment->getMeanPayment(), | |||
'meanPaymentText' => $this->translatorAdmin->transChoice( | |||
'OrderPayment', | |||
'meanPayment', | |||
$orderPayment->getMeanPayment() | |||
), | |||
'meanPaymentText' => $orderPayment->getMeanPayment() ? | |||
$this->translatorAdmin->transChoice( | |||
'OrderPayment', | |||
'meanPayment', | |||
$orderPayment->getMeanPayment() | |||
) : '', | |||
'paidAtText' => $orderPayment->getPaidAt()->format('d/m/Y'), | |||
'paidAt' => $orderPayment->getPaidAt()->format('Y-m-d'), | |||
'amount' => $orderPayment->getAmount(), |
@@ -2,12 +2,8 @@ | |||
namespace Lc\CaracoleBundle\Twig; | |||
use Lc\CaracoleBundle\Form\Merchant\SwitchMerchantButtonAdminFormType; | |||
use Lc\CaracoleBundle\Form\Merchant\SwitchMerchantFormType; | |||
use Lc\CaracoleBundle\Form\Section\SwitchSectionFormType; | |||
use Lc\CaracoleBundle\Repository\Merchant\MerchantRepositoryQuery; | |||
use Lc\CaracoleBundle\Repository\Section\SectionRepository; | |||
use Lc\CaracoleBundle\Repository\Section\SectionRepositoryInterface; | |||
use Symfony\Component\Form\FormFactoryInterface; | |||
use Symfony\Component\Routing\Generator\UrlGeneratorInterface; | |||
use Twig\Extension\AbstractExtension; | |||
@@ -34,7 +30,7 @@ class FormTwigExtension extends AbstractExtension | |||
); | |||
} | |||
public function getFormSwitchMerchant($context = 'front', $actionRoute = 'carac_merchant_switch') | |||
public function getFormSwitchMerchant($context = 'front', $actionRoute = 'carac_merchant_switch', $csrfProtection = true) | |||
{ | |||
$form = $this->formFactory->create( | |||
SwitchMerchantFormType::class, | |||
@@ -42,21 +38,21 @@ class FormTwigExtension extends AbstractExtension | |||
[ | |||
'action' => $this->urlGenerator->generate($actionRoute), | |||
'attr' => ['class' => 'switch-merchant'], | |||
'csrf_protection' => $csrfProtection, | |||
'context' => $context | |||
] | |||
); | |||
return $form->createView(); | |||
} | |||
public function getFormSwitchSection($section) | |||
public function getFormSwitchSection() | |||
{ | |||
$form = $this->formFactory->create( | |||
SwitchSectionFormType::class, | |||
null, | |||
[ | |||
'action' => $this->urlGenerator->generate('admin_section_switch'), | |||
'attr' => ['class' => 'switch-section'], | |||
'section' => $section, | |||
'attr' => ['class' => 'switch-section'] | |||
] | |||
); | |||
return $form->createView(); |