Browse Source

Merge branch 'develop'

master^2
Guillaume 3 years ago
parent
commit
1e9e4c32ee
80 changed files with 1727 additions and 343 deletions
  1. +8
    -0
      ShopBundle/Context/SectionInterface.php
  2. +8
    -0
      ShopBundle/Context/SectionUtilsInterface.php
  3. +8
    -1
      ShopBundle/Controller/AddressApiController.php
  4. +165
    -43
      ShopBundle/Controller/Backend/AdminController.php
  5. +4
    -3
      ShopBundle/Controller/Backend/DocumentController.php
  6. +9
    -6
      ShopBundle/Controller/Backend/NewsController.php
  7. +20
    -2
      ShopBundle/Controller/Backend/OrderController.php
  8. +4
    -6
      ShopBundle/Controller/Backend/ProductFamilyController.php
  9. +104
    -11
      ShopBundle/Controller/Backend/TicketController.php
  10. +4
    -2
      ShopBundle/Controller/Backend/UserMerchantController.php
  11. +4
    -0
      ShopBundle/Controller/Frontend/CartController.php
  12. +14
    -9
      ShopBundle/Form/Backend/ProductFamily/ProductFamilyCategoriesType.php
  13. +17
    -17
      ShopBundle/Form/Backend/ProductFamily/ProductType.php
  14. +78
    -0
      ShopBundle/Form/Backend/Ticket/TicketTypeType.php
  15. +2
    -0
      ShopBundle/Form/Frontend/RegistrationType.php
  16. +18
    -1
      ShopBundle/Model/OrderShop.php
  17. +5
    -0
      ShopBundle/Model/PriceTrait.php
  18. +31
    -6
      ShopBundle/Model/ProductCategory.php
  19. +51
    -1
      ShopBundle/Model/ProductFamily.php
  20. +5
    -3
      ShopBundle/Model/ProductPropertyTrait.php
  21. +1
    -1
      ShopBundle/Model/ReductionCart.php
  22. +172
    -0
      ShopBundle/Model/Section.php
  23. +1
    -0
      ShopBundle/Model/Ticket.php
  24. +4
    -0
      ShopBundle/Repository/OrderShopRepository.php
  25. +13
    -1
      ShopBundle/Repository/ProductCategoryRepository.php
  26. +19
    -1
      ShopBundle/Repository/ProductFamilyRepository.php
  27. +50
    -0
      ShopBundle/Repository/SectionRepository.php
  28. +179
    -113
      ShopBundle/Resources/public/css/backend/custom.css
  29. +84
    -0
      ShopBundle/Resources/public/js/backend/script/default/init-common.js
  30. +4
    -0
      ShopBundle/Resources/public/js/backend/script/merchant/vuejs-merchant.js
  31. +15
    -2
      ShopBundle/Resources/public/js/backend/script/productfamily/vuejs-product-family.js
  32. +3
    -2
      ShopBundle/Resources/public/js/backend/script/user/init-edit.js
  33. +41
    -4
      ShopBundle/Resources/public/sass/backend/custom.scss
  34. +20
    -1
      ShopBundle/Resources/translations/lcshop.fr.yaml
  35. +19
    -10
      ShopBundle/Resources/views/backend/default/block/actions.html.twig
  36. +2
    -2
      ShopBundle/Resources/views/backend/default/block/list_tickets.html.twig
  37. +103
    -0
      ShopBundle/Resources/views/backend/default/block/paginator.html.twig
  38. +34
    -0
      ShopBundle/Resources/views/backend/default/edit-ajax.html.twig
  39. +0
    -0
      ShopBundle/Resources/views/backend/default/field/association.html.twig
  40. +0
    -0
      ShopBundle/Resources/views/backend/default/field/association_users.html.twig
  41. +0
    -0
      ShopBundle/Resources/views/backend/default/field/badge.html.twig
  42. +0
    -0
      ShopBundle/Resources/views/backend/default/field/children.html.twig
  43. +0
    -0
      ShopBundle/Resources/views/backend/default/field/date.html.twig
  44. +0
    -0
      ShopBundle/Resources/views/backend/default/field/datetime.html.twig
  45. +0
    -0
      ShopBundle/Resources/views/backend/default/field/day.html.twig
  46. +0
    -0
      ShopBundle/Resources/views/backend/default/field/options_translatable.html.twig
  47. +0
    -0
      ShopBundle/Resources/views/backend/default/field/price.html.twig
  48. +0
    -0
      ShopBundle/Resources/views/backend/default/field/product_family_available_quantity.html.twig
  49. +0
    -0
      ShopBundle/Resources/views/backend/default/field/product_family_total_product_ordered.html.twig
  50. +3
    -0
      ShopBundle/Resources/views/backend/default/field/supplier.html.twig
  51. +0
    -0
      ShopBundle/Resources/views/backend/default/field/ticket_last_message.html.twig
  52. +0
    -0
      ShopBundle/Resources/views/backend/default/field/ticket_status.html.twig
  53. +9
    -0
      ShopBundle/Resources/views/backend/default/field/toggle.html.twig
  54. +0
    -0
      ShopBundle/Resources/views/backend/default/field/total.html.twig
  55. +24
    -1
      ShopBundle/Resources/views/backend/default/layout/layout-ajax.html.twig
  56. +0
    -14
      ShopBundle/Resources/views/backend/default/list-fields/field_toggle.html.twig
  57. +39
    -13
      ShopBundle/Resources/views/backend/default/list.html.twig
  58. +2
    -2
      ShopBundle/Resources/views/backend/form/custom_bootstrap_4.html.twig
  59. +3
    -1
      ShopBundle/Resources/views/backend/merchant/form.html.twig
  60. +18
    -0
      ShopBundle/Resources/views/backend/merchant/panel_lunch.html.twig
  61. +11
    -0
      ShopBundle/Resources/views/backend/order/show-cart.html.twig
  62. +12
    -0
      ShopBundle/Resources/views/backend/order/show-order.html.twig
  63. +0
    -0
      ShopBundle/Resources/views/backend/order/show.html.twigTODELETE
  64. +7
    -2
      ShopBundle/Resources/views/backend/productfamily/edit.html.twig
  65. +6
    -6
      ShopBundle/Resources/views/backend/productfamily/form.html.twig
  66. +1
    -1
      ShopBundle/Resources/views/backend/productfamily/macros.html.twig
  67. +23
    -4
      ShopBundle/Resources/views/backend/productfamily/panel_general.html.twig
  68. +6
    -6
      ShopBundle/Resources/views/backend/ticket/list-fields/field_lastmessage_date.html.twig
  69. +38
    -0
      ShopBundle/Resources/views/backend/ticket/modal/create.html.twig
  70. +30
    -17
      ShopBundle/Resources/views/backend/user/edit.html.twig
  71. +14
    -4
      ShopBundle/Resources/views/backend/usermerchant/show.html.twig
  72. +16
    -6
      ShopBundle/Services/Order/OrderUtils.php
  73. +3
    -2
      ShopBundle/Services/Order/OrderUtilsCartTrait.php
  74. +19
    -2
      ShopBundle/Services/Order/OrderUtilsStockTrait.php
  75. +26
    -3
      ShopBundle/Services/Price/ProductPriceUtils.php
  76. +15
    -0
      ShopBundle/Services/ProductFamilyUtils.php
  77. +37
    -0
      ShopBundle/Services/SectionUtils.php
  78. +23
    -10
      ShopBundle/Services/TicketUtils.php
  79. +9
    -0
      ShopBundle/Services/Utils.php
  80. +10
    -1
      ShopBundle/Services/UtilsManager.php

+ 8
- 0
ShopBundle/Context/SectionInterface.php View File

<?php

namespace Lc\ShopBundle\Context;

interface SectionInterface
{

}

+ 8
- 0
ShopBundle/Context/SectionUtilsInterface.php View File

<?php

namespace Lc\ShopBundle\Context;

interface SectionUtilsInterface
{

}

+ 8
- 1
ShopBundle/Controller/AddressApiController.php View File



$codesPostaux = $city->codesPostaux ; $codesPostaux = $city->codesPostaux ;


if($context == 'frontend') {
$label = '<span class="city">'.$city->nom.'</span> <span class="zip">'.$codesPostaux[0].'</span>' ;
}
else {
$label = $city->nom.' - '.$codesPostaux[0] ;
}

$return[] = [ $return[] = [
'label' => '<span class="city">'.$city->nom.'</span> <span class="zip">'.$codesPostaux[0].'</span>',
'label' => $label,
'city' => $city->nom, 'city' => $city->nom,
'value' => $city->code 'value' => $city->code
] ; ] ;

+ 165
- 43
ShopBundle/Controller/Backend/AdminController.php View File

use Symfony\Component\Form\FormEvents; use Symfony\Component\Form\FormEvents;
use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Security\Core\Security; use Symfony\Component\Security\Core\Security;
use Symfony\Contracts\Translation\TranslatorInterface; use Symfony\Contracts\Translation\TranslatorInterface;


protected $merchantUtils; protected $merchantUtils;
protected $mailjetTransport; protected $mailjetTransport;
protected $orderUtils; protected $orderUtils;
protected $mailUtils ;
protected $mailUtils;
protected $translator; protected $translator;
protected $utilsProcess; protected $utilsProcess;
protected $session;
protected $sectionUtils;
protected $filtersForm = null; protected $filtersForm = null;


public function __construct(Security $security, UserManagerInterface $userManager, EntityManagerInterface $em, public function __construct(Security $security, UserManagerInterface $userManager, EntityManagerInterface $em,
MailjetTransport $mailjetTransport, UtilsManager $utilsManager, TranslatorInterface $translator)
MailjetTransport $mailjetTransport, UtilsManager $utilsManager, TranslatorInterface $translator, SessionInterface $session)
{ {
$this->security = $security; $this->security = $security;
$this->userManager = $userManager; $this->userManager = $userManager;
$this->utils = $utilsManager->getUtils(); $this->utils = $utilsManager->getUtils();
$this->merchantUtils = $utilsManager->getMerchantUtils(); $this->merchantUtils = $utilsManager->getMerchantUtils();
$this->orderUtils = $utilsManager->getOrderUtils();; $this->orderUtils = $utilsManager->getOrderUtils();;
$this->mailUtils = $utilsManager->getMailUtils() ;
$this->utilsProcess = $utilsManager->getUtilsProcess() ;
$this->mailUtils = $utilsManager->getMailUtils();
$this->utilsProcess = $utilsManager->getUtilsProcess();
$this->sectionUtils = $utilsManager->getSectionUtils();
$this->translator = $translator; $this->translator = $translator;
$this->session = $session;
} }


public function createCustomForm($class, $action, $parameters, $data = true, $options = array()) public function createCustomForm($class, $action, $parameters, $data = true, $options = array())
$dqlFilter = sprintf(str_replace('currentMerchant', $this->getUser()->getMerchant()->getId(), $dqlFilter)); $dqlFilter = sprintf(str_replace('currentMerchant', $this->getUser()->getMerchant()->getId(), $dqlFilter));
} }


if ($pos = strpos($dqlFilter, 'TODAYSTART')) {
$date = new \DateTime();
$dqlFilter = sprintf(str_replace('TODAYSTART', $date->format('Y-m-d').' 00:00:00', $dqlFilter));
}
if ($pos = strpos($dqlFilter, 'TODAYEND')) {
$date = new \DateTime();
$dqlFilter = sprintf(str_replace('TODAYEND', $date->format('Y-m-d').' 23:59:59', $dqlFilter));
}

if ($pos = strpos($dqlFilter, 'sectionLunch')) {
$dqlFilter = sprintf(str_replace('sectionLunch', $this->sectionUtils->getSection('lunch')->getId(), $dqlFilter));
} else if ($pos = strpos($dqlFilter, 'sectionMarket')) {
$dqlFilter = sprintf(str_replace('sectionMarket', $this->sectionUtils->getSection('market')->getId(), $dqlFilter));
}

if (new $entityClass instanceof StatusInterface && strpos($dqlFilter, 'entity.status') === false) { if (new $entityClass instanceof StatusInterface && strpos($dqlFilter, 'entity.status') === false) {
if ($dqlFilter) $dqlFilter .= sprintf(' AND entity.status > = 0'); if ($dqlFilter) $dqlFilter .= sprintf(' AND entity.status > = 0');
else $dqlFilter .= sprintf(' entity.status > = 0'); else $dqlFilter .= sprintf(' entity.status > = 0');
'entity_class' => $this->entity['class'] 'entity_class' => $this->entity['class']
)); ));
$this->filtersForm->handleRequest($this->request); $this->filtersForm->handleRequest($this->request);

if ($this->filtersForm->isSubmitted() && $this->filtersForm->isValid()) {
$easyadmin = $this->request->attributes->get('easyadmin');
$view = $easyadmin['view'];
if($easyadmin['view']=='listChildren') $view = 'list';
if (($this->filtersForm->isSubmitted() && $this->filtersForm->isValid()) || $this->entity[$view]['filters']!==false) {
foreach ($listFields as $field) { foreach ($listFields as $field) {
if ($this->filtersForm->has($field['property'])) {
//if ($this->filtersForm->has($field['property'])->getConfig()->getOption('AdminController')) {
if ($this->filtersForm->has($field['property'])) {
switch ($field['dataType']) { switch ($field['dataType']) {
case 'option': case 'option':
case 'integer': case 'integer':
case 'text': case 'text':
case 'string': case 'string':
case 'toggle': case 'toggle':
$filter = $this->filtersForm->get($field['property'])->getData();
$filter = $this->getListFilterParam($field['property']);
//$filter = $this->filtersForm->get($field['property'])->getData();
if ($filter !== null) { if ($filter !== null) {


$queryBuilder->andWhere('entity.' . $field['property'] . ' LIKE :' . $field['property'] . ''); $queryBuilder->andWhere('entity.' . $field['property'] . ' LIKE :' . $field['property'] . '');
} }
break; break;
case 'association' : case 'association' :
$filter = $this->filtersForm->get($field['property'])->getData();
$filter = $this->getListFilterParam($field['property']);
//$filter = $this->filtersForm->get($field['property'])->getData();
if ($filter !== null) { if ($filter !== null) {
if ($field['type_options']['multiple']) { if ($field['type_options']['multiple']) {
$queryBuilder->andWhere(':' . $field['property'] . ' MEMBER OF entity.' . $field['property'] . ''); $queryBuilder->andWhere(':' . $field['property'] . ' MEMBER OF entity.' . $field['property'] . '');
} else { } else {
$queryBuilder->andWhere('entity.' . $field['property'] . ' = :' . $field['property'] . ''); $queryBuilder->andWhere('entity.' . $field['property'] . ' = :' . $field['property'] . '');
} }
if($filter instanceof TreeInterface && $filter->getParent() == null) {
if ($filter instanceof TreeInterface && $filter->getParent() == null) {
$queryBuilder->setParameter($field['property'], array_merge(array($filter), $filter->getChildrens()->toArray())); $queryBuilder->setParameter($field['property'], array_merge(array($filter), $filter->getChildrens()->toArray()));
}else{
} else {
$queryBuilder->setParameter($field['property'], $filter); $queryBuilder->setParameter($field['property'], $filter);
} }
} }
break; break;
case 'datetime': case 'datetime':
case 'date': case 'date':
$dateStart = $this->filtersForm->get($field['property'])->get('dateStart')->getData();
$dateEnd = $this->filtersForm->get($field['property'])->get('dateEnd')->getData();

$dateStart = $this->getListFilterParam($field['property'], 'dateStart');
$dateEnd = $this->getListFilterParam($field['property'], 'dateEnd');


if ($dateStart) $queryBuilder->andWhere('entity.' . $field['property'] . ' >= :dateStart')->setParameter('dateStart', $dateStart); if ($dateStart) $queryBuilder->andWhere('entity.' . $field['property'] . ' >= :dateStart')->setParameter('dateStart', $dateStart);
if ($dateEnd) $queryBuilder->andWhere('entity.' . $field['property'] . ' <= :dateEnd')->setParameter('dateEnd', $dateEnd); if ($dateEnd) $queryBuilder->andWhere('entity.' . $field['property'] . ' <= :dateEnd')->setParameter('dateEnd', $dateEnd);
} }
} }


//TODO déplacer dans LC
if($this->entity['name']== 'OrderShopLunch' || $this->entity['name']== 'OrderShopLunchDay'){
$queryBuilder->addOrderBy('entity.user', 'asc');
}

return $queryBuilder; return $queryBuilder;
} }


//TODO finaliser la sauvegarde des filtres

protected function getListFilterParam($param, $extraParam = null){
$entityName = $this->entity['name'];
$sessionParam = $entityName.$param.$extraParam;
//CUSTOM
if($extraParam){
$value = $this->filtersForm->get($param)->get($extraParam)->getViewData();
}else{
$value = $this->filtersForm->get($param)->getViewData();
}

if($this->request->query->get('filterClear')){
$this->session->remove($sessionParam);
}else {
if ($value) {
$this->session->set($sessionParam, $value);
} else if ($this->session->get($sessionParam) && !$this->filtersForm->isSubmitted() && $this->filtersForm->get($param)) {
$value = $this->session->get($sessionParam);

if($extraParam){

if($this->filtersForm->get($param)->get($extraParam)->getConfig()->getOption('input')=='datetime'){

$this->filtersForm->get($param)->get($extraParam)->setData(new \DateTime($value));
}else{
$this->filtersForm->get($param)->get($extraParam)->setData($value);
}

}else {
//Champ association
if ($this->filtersForm->get($param)->getConfig()->getOption('class')) {
$valFormated = $this->em->getRepository($this->filtersForm->get($param)->getConfig()->getOption('class'))->find($value);
$this->filtersForm->get($param)->setData($valFormated);
} else {
//Champ noramux
$this->filtersForm->get($param)->setData($value);
}
}

}
}

if($value !== "")return $value;
else return null;

}




public function renderTemplate($actionName, $templatePath, array $parameters = []) public function renderTemplate($actionName, $templatePath, array $parameters = [])
{ {
} }




protected function getListParam($param, $default =null){
$entityName = $this->entity['name'];
$sessionParam = $entityName.$param;
//CUSTOM
if($param == 'maxResults'){
$val = $this->entity['list']['max_results'];
}else{
$val = $this->request->query->get($param, $default);
}

if(isset($_GET[$param])){
$val = $this->request->query->get($param);
$this->session->set($sessionParam, $val);
}else if($this->session->get($sessionParam)){
$val = $this->session->get($sessionParam);
$this->request->query->set($param, $val);
}

return $val;
}

protected function listAction()
{
$this->dispatch(EasyAdminEvents::PRE_LIST);

$fields = $this->entity['list']['fields'];

$paginator = $this->findAll($this->entity['class'], $this->getListParam('page', 1), $this->getListParam('maxResults'), $this->getListParam('sortField'), $this->getListParam('sortDirection'), $this->entity['list']['dql_filter']);

$this->dispatch(EasyAdminEvents::POST_LIST, ['paginator' => $paginator]);

$parameters = [
'paginator' => $paginator,
'fields' => $fields,
'batch_form' => $this->createBatchForm($this->entity['name'])->createView(),
'delete_form_template' => $this->createDeleteForm($this->entity['name'], '__id__')->createView(),
];

return $this->executeDynamicMethod('render<EntityName>Template', ['list', $this->entity['templates']['list'], $parameters]);
}

public function sortAction() public function sortAction()
{ {


$form->add($child->getName(), EntityType::class, array( $form->add($child->getName(), EntityType::class, array(
'class' => $this->em->getClassMetadata($passedOptions['class'])->getName(), 'class' => $this->em->getClassMetadata($passedOptions['class'])->getName(),
'label' => $passedOptions['label'], 'label' => $passedOptions['label'],
'expanded' => isset($passedOptions['expanded']) ? $passedOptions['expanded'] : false,
'multiple' => isset($passedOptions['multiple']) ? $passedOptions['multiple'] : false, 'multiple' => isset($passedOptions['multiple']) ? $passedOptions['multiple'] : false,
'placeholder' => '--', 'placeholder' => '--',
'translation_domain' => 'lcshop', 'translation_domain' => 'lcshop',


$id = $this->request->query->get('id'); $id = $this->request->query->get('id');
$easyadmin = $this->request->attributes->get('easyadmin'); $easyadmin = $this->request->attributes->get('easyadmin');
$entity = $easyadmin['item'];
$entity = $easyadmin['item'];


if ($this->request->isXmlHttpRequest() && $property = $this->request->query->get('property')) { if ($this->request->isXmlHttpRequest() && $property = $this->request->query->get('property')) {
$newValue = 'true' === mb_strtolower($this->request->query->get('newValue')); $newValue = 'true' === mb_strtolower($this->request->query->get('newValue'));
return $this->executeDynamicMethod('render<EntityName>Template', ['edit', $this->entity['templates']['edit'], $parameters]); return $this->executeDynamicMethod('render<EntityName>Template', ['edit', $this->entity['templates']['edit'], $parameters]);
} }


/* public function createNewEntity(){
$idDuplicate = $this->request->query->get('duplicate', null);
if($idDuplicate){
$easyadmin = $this->request->attributes->get('easyadmin');
$entity= $this->em->getRepository($easyadmin['entity']['class'])->find($idDuplicate);
/* public function createNewEntity(){
$idDuplicate = $this->request->query->get('duplicate', null);
if($idDuplicate){
$easyadmin = $this->request->attributes->get('easyadmin');
$entity= $this->em->getRepository($easyadmin['entity']['class'])->find($idDuplicate);


$newProductFamily = clone $entity ;
$this->em->persist($newProductFamily) ;
$this->em->flush() ;
}else{
$entityFullyQualifiedClassName = $this->entity['class'];
$newProductFamily = clone $entity ;
$this->em->persist($newProductFamily) ;
$this->em->flush() ;
}else{
$entityFullyQualifiedClassName = $this->entity['class'];


return new $entityFullyQualifiedClassName();
}
return new $entityFullyQualifiedClassName();
}


}*/
}*/


public function duplicateAction(){
public function duplicateAction()
{


$id = $this->request->query->get('id'); $id = $this->request->query->get('id');
$refererUrl = $this->request->query->get('referer', ''); $refererUrl = $this->request->query->get('referer', '');


$easyadmin = $this->request->attributes->get('easyadmin'); $easyadmin = $this->request->attributes->get('easyadmin');


$entity= $this->em->getRepository($easyadmin['entity']['class'])->find($id);
$entity = $this->em->getRepository($easyadmin['entity']['class'])->find($id);


$newEntity = $this->utilsProcess->duplicateEntity($entity); $newEntity = $this->utilsProcess->duplicateEntity($entity);


return $this->redirectToRoute('easyadmin', ['entity' => $easyadmin['entity']['name'], 'action' => 'edit', 'id' =>$newEntity->getId(), 'referer' =>$refererUrl ]) ;
return $this->redirectToRoute('easyadmin', ['entity' => $easyadmin['entity']['name'], 'action' => 'edit', 'id' => $newEntity->getId(), 'referer' => $refererUrl]);
} }


public function duplicateOtherHubAction(){
public function duplicateOtherHubAction()
{


$id = $this->request->query->get('id'); $id = $this->request->query->get('id');
$hubAlias = $this->request->query->get('hub'); $hubAlias = $this->request->query->get('hub');
$refererUrl = $this->request->query->get('referer', ''); $refererUrl = $this->request->query->get('referer', '');
$user = $this->security->getUser() ;
$user = $this->security->getUser();


$easyadmin = $this->request->attributes->get('easyadmin'); $easyadmin = $this->request->attributes->get('easyadmin');


$entity= $this->em->getRepository($easyadmin['entity']['class'])->find($id);
$hub= $this->em->getRepository(MerchantInterface::class)->findOneByDevAlias($hubAlias);
$entity = $this->em->getRepository($easyadmin['entity']['class'])->find($id);
$hub = $this->em->getRepository(MerchantInterface::class)->findOneByDevAlias($hubAlias);


$newEntity = $this->utilsProcess->duplicateEntityToOtherHub($entity,$hub);
$newEntity = $this->utilsProcess->duplicateEntityToOtherHub($entity, $hub);


$user->setMerchant($hub); $user->setMerchant($hub);
$this->em->persist($user); $this->em->persist($user);
$this->em->flush(); $this->em->flush();


$redirectUrl = $this->generateUrl('easyadmin', ['entity' => $easyadmin['entity']['name'], 'action' => 'edit', 'id' =>$newEntity->getId(), 'referer' =>$refererUrl ]).'&hubredirection=true';
$redirectUrl = $this->generateUrl('easyadmin', ['entity' => $easyadmin['entity']['name'], 'action' => 'edit', 'id' => $newEntity->getId(), 'referer' => $refererUrl]) . '&hubredirection=true';


return $this->redirectToOtherHub($hub, $redirectUrl) ;
return $this->redirectToOtherHub($hub, $redirectUrl);
} }


public function redirectToOtherHub($hub, $url){
if(strpos($_SERVER['HTTP_HOST'], 'localhost')!==false){
public function redirectToOtherHub($hub, $url)
{
if (strpos($_SERVER['HTTP_HOST'], 'localhost') !== false) {
return $this->redirect($url); return $this->redirect($url);
}else{
return $this->redirect($hub->getMerchantConfig('url').substr($url,1));
} else {
return $this->redirect($hub->getMerchantConfig('url') . substr($url, 1));
} }


} }

+ 4
- 3
ShopBundle/Controller/Backend/DocumentController.php View File

use Lc\ShopBundle\Services\UtilsManager; use Lc\ShopBundle\Services\UtilsManager;
use Mailjet\MailjetSwiftMailer\SwiftMailer\MailjetTransport; use Mailjet\MailjetSwiftMailer\SwiftMailer\MailjetTransport;
use Symfony\Component\HttpFoundation\BinaryFileResponse; use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpFoundation\StreamedResponse; use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Security\Core\Security; use Symfony\Component\Security\Core\Security;
{ {
protected $documentRepository ; protected $documentRepository ;


public function __construct(Security $security, UserManagerInterface $userManager, EntityManagerInterface $em, MailjetTransport $mailjetTransport, UtilsManager $utilsManager, TranslatorInterface $translator)
public function __construct(Security $security, UserManagerInterface $userManager, EntityManagerInterface $em, MailjetTransport $mailjetTransport, UtilsManager $utilsManager, TranslatorInterface $translator, SessionInterface $session)
{ {
parent::__construct($security, $userManager, $em, $mailjetTransport, $utilsManager, $translator);
parent::__construct($security, $userManager, $em, $mailjetTransport, $utilsManager, $translator, $session);
$this->documentRepository = $this->em->getRepository($this->em->getClassMetadata(DocumentInterface::class)->getName()) ; $this->documentRepository = $this->em->getRepository($this->em->getClassMetadata(DocumentInterface::class)->getName()) ;
} }


} }
} }


}
}

+ 9
- 6
ShopBundle/Controller/Backend/NewsController.php View File

use Lc\ShopBundle\Services\UtilsManager; use Lc\ShopBundle\Services\UtilsManager;
use Mailjet\MailjetSwiftMailer\SwiftMailer\MailjetTransport; use Mailjet\MailjetSwiftMailer\SwiftMailer\MailjetTransport;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Security; use Symfony\Component\Security\Core\Security;
{ {
protected $parameterBag ; protected $parameterBag ;


public function __construct(Security $security, UserManagerInterface $userManager, EntityManagerInterface $em,
MailjetTransport $mailjetTransport, UtilsManager $utilsManager, TranslatorInterface $translator,
ParameterBagInterface $parameterBag)
public function __construct(Security $security, UserManagerInterface $userManager, EntityManagerInterface $em, MailjetTransport $mailjetTransport, UtilsManager $utilsManager, TranslatorInterface $translator, SessionInterface $session, ParameterBagInterface $parameterBag)
{ {
parent::__construct($security, $userManager, $em, $mailjetTransport, $utilsManager, $translator, $session);
$this->parameterBag = $parameterBag ; $this->parameterBag = $parameterBag ;
parent::__construct($security, $userManager, $em, $mailjetTransport, $utilsManager, $translator);
} }


public function sendTestAction() public function sendTestAction()
$newsletter = $this->getNewsletter() ; $newsletter = $this->getNewsletter() ;
$news = $this->getNews() ; $news = $this->getNews() ;
$users = $this->em->getRepository($this->em->getClassMetadata(UserInterface::class)->getName())->findAllByNewsletter($newsletter) ; $users = $this->em->getRepository($this->em->getClassMetadata(UserInterface::class)->getName())->findAllByNewsletter($newsletter) ;
$countUsers = count($users) ; $countUsers = count($users) ;


$packageMessagesArray = []; $packageMessagesArray = [];
] ; ] ;


$i = 0 ; $i = 0 ;

foreach ($users as $user) { foreach ($users as $user) {
$paramsTemplate['user'] =$user;

if(!isset($packageMessagesArray[$i])) { if(!isset($packageMessagesArray[$i])) {
$packageMessagesArray[$i] = [] ; $packageMessagesArray[$i] = [] ;
} }
public function getNewsletter() public function getNewsletter()
{ {
$newsletter = $this->merchantUtils->getMerchantCurrent()->getNewsletter() ; $newsletter = $this->merchantUtils->getMerchantCurrent()->getNewsletter() ;

if($newsletter) { if($newsletter) {
return $newsletter ; return $newsletter ;
} }
} }
} }


}
}

+ 20
- 2
ShopBundle/Controller/Backend/OrderController.php View File

use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Security; use Symfony\Component\Security\Core\Security;
use Symfony\Contracts\Translation\TranslatorInterface; use Symfony\Contracts\Translation\TranslatorInterface;
protected $creditUtils; protected $creditUtils;
protected $mailUtils; protected $mailUtils;


public function __construct(Security $security, UserManagerInterface $userManager, EntityManagerInterface $em, MailjetTransport $mailjetTransport, UtilsManager $utilsManager, TranslatorInterface $translator)
public function __construct(Security $security, UserManagerInterface $userManager, EntityManagerInterface $em, MailjetTransport $mailjetTransport, UtilsManager $utilsManager, TranslatorInterface $translator, SessionInterface $session)
{ {
parent::__construct($security, $userManager, $em, $mailjetTransport, $utilsManager, $translator, $session);
$this->creditUtils = $utilsManager->getCreditUtils(); $this->creditUtils = $utilsManager->getCreditUtils();
$this->mailUtils = $utilsManager->getMailUtils(); $this->mailUtils = $utilsManager->getMailUtils();
parent::__construct($security, $userManager, $em, $mailjetTransport, $utilsManager, $translator);
} }


protected function createListQueryBuilder($entityClass, $sortDirection, $sortField = null, $dqlFilter = null) protected function createListQueryBuilder($entityClass, $sortDirection, $sortField = null, $dqlFilter = null)
$id = $this->request->query->get('id'); $id = $this->request->query->get('id');
$entity = $this->request->query->get('entity'); $entity = $this->request->query->get('entity');


if ($this->request->isXmlHttpRequest() && $property = $this->request->query->get('property')) {
$newValue = 'true' === mb_strtolower($this->request->query->get('newValue'));
$fieldsMetadata = $this->entity['list']['fields'];
if($property == 'isGivenToCustomer'){
$orderShop =$this->getOrderShopEntity();
$orderShop->setIsGivenToCustomer($newValue);
$this->em->persist($orderShop);
$this->em->flush();
$this->utils->addFlash('success', 'success.common.fieldChange');
$response['flashMessages'] = $this->utils->getFlashMessages();
return new Response(json_encode($response));
}


}


return $this->redirectToRoute('easyadmin', [ return $this->redirectToRoute('easyadmin', [
'action' => 'show', 'action' => 'show',
'entity' => $entity, 'entity' => $entity,

+ 4
- 6
ShopBundle/Controller/Backend/ProductFamilyController.php View File

use Symfony\Component\Form\Extension\Core\Type\NumberType; use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\FormError; use Symfony\Component\Form\FormError;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Security\Core\Security; use Symfony\Component\Security\Core\Security;
use Symfony\Contracts\Translation\TranslatorInterface; use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
private $parameterBag ; private $parameterBag ;
private $productFamilyUtils ; private $productFamilyUtils ;


public function __construct(Security $security, UserManagerInterface $userManager, EntityManagerInterface $em,
MailjetTransport $mailjetTransport, UtilsManager $utilsManager, TranslatorInterface $translator,
ParameterBagInterface $parameterBag)
public function __construct(Security $security, UserManagerInterface $userManager, EntityManagerInterface $em, MailjetTransport $mailjetTransport, UtilsManager $utilsManager, TranslatorInterface $translator, SessionInterface $session, ParameterBagInterface $parameterBag)
{ {
parent::__construct($security, $userManager, $em, $mailjetTransport, $utilsManager, $translator);
parent::__construct($security, $userManager, $em, $mailjetTransport, $utilsManager, $translator, $session);
$this->parameterBag = $parameterBag ; $this->parameterBag = $parameterBag ;
$this->productFamilyUtils = $utilsManager->getProductFamilyUtils() ; $this->productFamilyUtils = $utilsManager->getProductFamilyUtils() ;
} }


protected function editAction() protected function editAction()
{ {

$this->dispatch(EasyAdminEvents::PRE_EDIT); $this->dispatch(EasyAdminEvents::PRE_EDIT);


$id = $this->request->query->get('id'); $id = $this->request->query->get('id');


if ($editForm->get('stayOnPage')->getData() != "false" || $this->request->get('submitAndStay') !== null) { if ($editForm->get('stayOnPage')->getData() != "false" || $this->request->get('submitAndStay') !== null) {
$refererUrl = $this->request->query->get('referer', ''); $refererUrl = $this->request->query->get('referer', '');
return $this->redirectToRoute('easyadmin', ['entity' => 'ProductFamily', 'action' => 'edit', 'id' => $id, 'referer' => $refererUrl]);
return $this->redirectToRoute('easyadmin', ['entity' => 'ProductFamily', 'action' => 'edit', 'id' => $id, 'referer' => $refererUrl, 'ajax' => $this->request->query->get('ajax')]);
} else { } else {
return $this->redirectToReferrer(); return $this->redirectToReferrer();
} }

+ 104
- 11
ShopBundle/Controller/Backend/TicketController.php View File

use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityManagerInterface;
use EasyCorp\Bundle\EasyAdminBundle\Event\EasyAdminEvents; use EasyCorp\Bundle\EasyAdminBundle\Event\EasyAdminEvents;
use FOS\UserBundle\Model\UserManagerInterface; use FOS\UserBundle\Model\UserManagerInterface;
use Lc\ShopBundle\Context\OrderShopInterface;
use Lc\ShopBundle\Context\UserInterface;
use Lc\ShopBundle\Form\Backend\Ticket\TicketMessageType; use Lc\ShopBundle\Form\Backend\Ticket\TicketMessageType;
use Lc\ShopBundle\Form\Backend\Ticket\TicketStatusType; use Lc\ShopBundle\Form\Backend\Ticket\TicketStatusType;
use Lc\ShopBundle\Model\Ticket; use Lc\ShopBundle\Model\Ticket;
use Lc\ShopBundle\Services\UtilsManager; use Lc\ShopBundle\Services\UtilsManager;
use Mailjet\MailjetSwiftMailer\SwiftMailer\MailjetTransport; use Mailjet\MailjetSwiftMailer\SwiftMailer\MailjetTransport;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Security\Core\Security; use Symfony\Component\Security\Core\Security;
use Symfony\Contracts\Translation\TranslatorInterface; use Symfony\Contracts\Translation\TranslatorInterface;


class TicketController extends AdminController class TicketController extends AdminController
{ {
protected $ticketUtils; protected $ticketUtils;
public function __construct(Security $security, UserManagerInterface $userManager, EntityManagerInterface $em, MailjetTransport $mailjetTransport, UtilsManager $utilsManager, TranslatorInterface $translator)
protected $userUtils;

public function __construct(Security $security, UserManagerInterface $userManager, EntityManagerInterface $em, MailjetTransport $mailjetTransport, UtilsManager $utilsManager, TranslatorInterface $translator, SessionInterface $session)
{ {
parent::__construct($security, $userManager, $em, $mailjetTransport, $utilsManager, $translator, $session);
$this->ticketUtils = $utilsManager->getTicketUtils(); $this->ticketUtils = $utilsManager->getTicketUtils();
parent::__construct($security, $userManager, $em, $mailjetTransport, $utilsManager, $translator);

$this->userUtils = $utilsManager->getUserUtils();
} }


public function persistTicketEntity($entity, $form)
{
$entity->setStatus(Ticket::TICKET_STATUS_OPEN);

$ticket = $this->ticketUtils->createTicket([
'user' => $entity->getUser(),
'type' => $entity->getType(),
'orderShop' => $entity->getOrderShop(),
'subject' => $entity->getSubject(),
'message' => $form->get('message')->getData(),
'createByAdmin' => true,
]);

}


protected function createListQueryBuilder($entityClass, $sortDirection, $sortField = null, $dqlFilter = null) protected function createListQueryBuilder($entityClass, $sortDirection, $sortField = null, $dqlFilter = null)
{ {
} }




public function ticketStatusAction(){
public function ticketStatusAction()
{
$easyadmin = $this->request->attributes->get('easyadmin'); $easyadmin = $this->request->attributes->get('easyadmin');
$ticket = $easyadmin['item']; $ticket = $easyadmin['item'];


$formTicketStatusForm->handleRequest($this->request); $formTicketStatusForm->handleRequest($this->request);


if ($formTicketStatusForm->isSubmitted() && $formTicketStatusForm->isValid()) { if ($formTicketStatusForm->isSubmitted() && $formTicketStatusForm->isValid()) {
$this->em->persist($ticket);
$this->em->flush();
$this->em->persist($ticket);
$this->em->flush();


$this->utils->addFlash('success', 'success.ticket.statusChange');
$this->utils->addFlash('success', 'success.ticket.statusChange');
} else { } else {
$this->utils->addFlash('error', $formTicketStatusForm->getErrors()); $this->utils->addFlash('error', $formTicketStatusForm->getErrors());
} }
return new Response(json_encode($response)); return new Response(json_encode($response));
} }


public function newMessageTicketAction(){
public function newMessageTicketAction()
{
$easyadmin = $this->request->attributes->get('easyadmin'); $easyadmin = $this->request->attributes->get('easyadmin');
$ticket = $easyadmin['item']; $ticket = $easyadmin['item'];




if ($formAddTicketMessage->isSubmitted() && $formAddTicketMessage->isValid()) { if ($formAddTicketMessage->isSubmitted() && $formAddTicketMessage->isValid()) {
$this->ticketUtils->createTicketMessage(array( $this->ticketUtils->createTicketMessage(array(
'ticket'=>$ticket,
'message'=> $formAddTicketMessage->get('message')->getData(),
'answerByAdmin'=>true
'ticket' => $ticket,
'message' => $formAddTicketMessage->get('message')->getData(),
'answerByAdmin' => true
)); ));


$this->utils->addFlash('success', 'success.ticket.addMessage'); $this->utils->addFlash('success', 'success.ticket.addMessage');
'id' => $ticket->getId() 'id' => $ticket->getId()
]); ]);
} }

public function newAction()
{
$this->dispatch(EasyAdminEvents::PRE_NEW);

$entity = $this->executeDynamicMethod('createNew<EntityName>Entity');

$easyadmin = $this->request->attributes->get('easyadmin');
$easyadmin['item'] = $entity;
$this->request->attributes->set('easyadmin', $easyadmin);

$fields = $this->entity['new']['fields'];

$newForm = $this->executeDynamicMethod('create<EntityName>NewForm', [$entity, $fields]);

if ($this->request->request->get('user')) {
$userRepo = $this->em->getRepository(UserInterface::class);
$newForm->get('user')->setData($userRepo->find($this->request->request->get('user')));
}

if ($this->request->request->get('orderId')) {
$newForm->get('orderId')->setData($this->request->request->get('orderId'));
}


$newForm->handleRequest($this->request);

if ($newForm->isSubmitted() && $newForm->isValid()) {

if ($newForm->get('orderId')->getData()) {
$orderShopRepo = $this->em->getRepository(OrderShopInterface::class);
$orderShop = $orderShopRepo->find($newForm->get('orderId')->getData());
if($orderShop)$entity->setOrderShop($orderShop);
}


$this->processUploadedFiles($newForm);

$this->dispatch(EasyAdminEvents::PRE_PERSIST, ['entity' => $entity]);
$this->executeDynamicMethod('persist<EntityName>Entity', [$entity, $newForm]);
$this->dispatch(EasyAdminEvents::POST_PERSIST, ['entity' => $entity]);

$this->utils->addFlash('success', 'success.ticket.addMessage');

if ($this->request->isXmlHttpRequest()) {
$response['type'] = 'success';
$response['flashMessages'] = $this->utils->getFlashMessages();
return new Response(json_encode($response));
} else {
return $this->redirectToReferrer();
}


}
$this->dispatch(EasyAdminEvents::POST_NEW, [
'entity_fields' => $fields,
'form' => $newForm,
'entity' => $entity,
]);

$parameters = [
'form' => $newForm->createView(),
'entity_fields' => $fields,
'entity' => $entity,
];
if ($this->request->isXmlHttpRequest()) {
$response['modal'] = $this->renderView('@LcShop/backend/ticket/modal/create.html.twig', $parameters);
return new Response(json_encode($response));
} else {
return $this->executeDynamicMethod('render<EntityName>Template', ['new', $this->entity['templates']['new'], $parameters]);
}
}
} }

+ 4
- 2
ShopBundle/Controller/Backend/UserMerchantController.php View File

use Mailjet\MailjetSwiftMailer\SwiftMailer\MailjetTransport; use Mailjet\MailjetSwiftMailer\SwiftMailer\MailjetTransport;
use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Security\Core\Security; use Symfony\Component\Security\Core\Security;
use Symfony\Contracts\Translation\TranslatorInterface; use Symfony\Contracts\Translation\TranslatorInterface;


{ {
protected $creditUtils; protected $creditUtils;


public function __construct(Security $security, UserManagerInterface $userManager, EntityManagerInterface $em, MailjetTransport $mailjetTransport, UtilsManager $utilsManager, TranslatorInterface $translator)
public function __construct(Security $security, UserManagerInterface $userManager, EntityManagerInterface $em, MailjetTransport $mailjetTransport, UtilsManager $utilsManager, TranslatorInterface $translator, SessionInterface $session)
{ {
parent::__construct($security, $userManager, $em, $mailjetTransport, $utilsManager, $translator);
parent::__construct($security, $userManager, $em, $mailjetTransport, $utilsManager, $translator, $session);
$this->creditUtils = $utilsManager->getCreditUtils(); $this->creditUtils = $utilsManager->getCreditUtils();

} }


public function addCreditHistoryAction(){ public function addCreditHistoryAction(){

+ 4
- 0
ShopBundle/Controller/Frontend/CartController.php View File

protected $orderUtils ; protected $orderUtils ;
protected $userUtils ; protected $userUtils ;
protected $priceUtils ; protected $priceUtils ;
protected $sectionUtils ;
protected $mailUtils ;
protected $router ; protected $router ;
protected $productFamilyRepository ; protected $productFamilyRepository ;
protected $orderProductRepository ; protected $orderProductRepository ;
$this->orderUtils = $utilsManager->getOrderUtils() ; $this->orderUtils = $utilsManager->getOrderUtils() ;
$this->userUtils = $utilsManager->getUserUtils() ; $this->userUtils = $utilsManager->getUserUtils() ;
$this->priceUtils = $utilsManager->getPriceUtils() ; $this->priceUtils = $utilsManager->getPriceUtils() ;
$this->sectionUtils = $utilsManager->getSectionUtils() ;
$this->mailUtils = $utilsManager->getMailUtils() ;
$this->router = $router ; $this->router = $router ;
$this->productFamilyRepository = $this->em->getRepository($this->em->getClassMetaData(ProductFamilyInterface::class)->getName()) ; $this->productFamilyRepository = $this->em->getRepository($this->em->getClassMetaData(ProductFamilyInterface::class)->getName()) ;
$this->orderProductRepository = $this->em->getRepository($this->em->getClassMetaData(OrderProductInterface::class)->getName()) ; $this->orderProductRepository = $this->em->getRepository($this->em->getClassMetaData(OrderProductInterface::class)->getName()) ;

+ 14
- 9
ShopBundle/Form/Backend/ProductFamily/ProductFamilyCategoriesType.php View File

class ProductFamilyCategoriesType extends AbstractType class ProductFamilyCategoriesType extends AbstractType
{ {
protected $em; protected $em;
protected $productCategoryRepository ;
protected $productCategoryRepository;


public function __construct(EntityManagerInterface $entityManager, ProductCategoryRepository $productCategoryRepository) public function __construct(EntityManagerInterface $entityManager, ProductCategoryRepository $productCategoryRepository)
{ {
$this->em = $entityManager; $this->em = $entityManager;
$this->productCategoryRepository = $productCategoryRepository ;
$this->productCategoryRepository = $productCategoryRepository;
} }


public function buildForm(FormBuilderInterface $builder, array $options) public function buildForm(FormBuilderInterface $builder, array $options)


foreach ($categories as $category) { foreach ($categories as $category) {
$builder->add('category_' . $category->getId(), CheckboxType::class, [ $builder->add('category_' . $category->getId(), CheckboxType::class, [
'label' => $category->getStatus() == 0 ? $category->getTitle() .' (hors ligne)': $category->getTitle() ,
'label' => $category->getStatus() == 0 ? $category->getTitle() . ' (hors ligne)' : $category->getTitle(),
'data' => $currentProductCategories->contains($category), 'data' => $currentProductCategories->contains($category),
'required' => false, 'required' => false,
'disabled'=>true,
'attr'=>[
'class'=>'none'
]
'disabled' => true,
'attr' => [
'class' => 'none',
'data-section' => $category->getSection()->getId()
],
]); ]);
$childrenCategories = $this->productCategoryRepository->findAllByParent($category, true); $childrenCategories = $this->productCategoryRepository->findAllByParent($category, true);
foreach ($childrenCategories as $children) { foreach ($childrenCategories as $children) {
$builder->add('category_children_' . $children->getId(), CheckboxType::class, [ $builder->add('category_children_' . $children->getId(), CheckboxType::class, [
'label' => $children->getStatus() == 0 ? $children->getTitle() .' (hors ligne)': $children->getTitle() ,
'label' => $children->getStatus() == 0 ? $children->getTitle() . ' (hors ligne)' : $children->getTitle(),
'data' => $currentProductCategories->contains($children), 'data' => $currentProductCategories->contains($children),
'required' => false
'required' => false,
'attr' => [
'data-section' => $category->getSection()->getId()
],

]); ]);
} }
} }

+ 17
- 17
ShopBundle/Form/Backend/ProductFamily/ProductType.php View File

$this->em = $entityManager; $this->em = $entityManager;
$this->utils = $utils; $this->utils = $utils;
} }

public function buildForm(FormBuilderInterface $builder, array $options) public function buildForm(FormBuilderInterface $builder, array $options)
{ {




$builder->add('title', TextType::class, array( $builder->add('title', TextType::class, array(
"required" => false "required" => false
)) ;

));


$builder->add('quantity', NumberType::class, array( $builder->add('quantity', NumberType::class, array(
'label' => 'Quantité', 'label' => 'Quantité',
'required'=>false,
'required' => false,
'attr' => [ 'attr' => [
'append_html' => 'g' 'append_html' => 'g'
] ]
$unitClass = $this->em->getClassMetadata(UnitInterface::class)->getName(); $unitClass = $this->em->getClassMetadata(UnitInterface::class)->getName();


$builder->add('unit', EntityType::class, array( $builder->add('unit', EntityType::class, array(
'class'=> $unitClass,
'class' => $unitClass,
'data' => 0, 'data' => 0,
'required'=>false,
'required' => false,
'choice_attr' => function ($choice) { 'choice_attr' => function ($choice) {
return [ return [
'data-unit-reference' => $choice->getUnitReference(), 'data-unit-reference' => $choice->getUnitReference(),


$builder->add('buyingPrice', NumberType::class, array( $builder->add('buyingPrice', NumberType::class, array(
'label' => 'Prix d\'achat', 'label' => 'Prix d\'achat',
'required'=>false
'required' => false
)); ));


$builder->add('buyingPriceWithTax', NumberType::class, array( $builder->add('buyingPriceWithTax', NumberType::class, array(


$builder->add('buyingPriceByRefUnit', NumberType::class, array( $builder->add('buyingPriceByRefUnit', NumberType::class, array(
'label' => 'Prix d\'achat', 'label' => 'Prix d\'achat',
'required'=>false
'required' => false
)); ));


$builder->add('buyingPriceByRefUnitWithTax', NumberType::class, array( $builder->add('buyingPriceByRefUnitWithTax', NumberType::class, array(
)); ));
$builder->add('multiplyingFactor', NumberType::class, array( $builder->add('multiplyingFactor', NumberType::class, array(
'label' => 'Coefficiant de multiplication', 'label' => 'Coefficiant de multiplication',
'mapped'=>false,
'required'=>false
'mapped' => false,
'required' => false
)); ));


$builder->add('priceByRefUnit', NumberType::class, array( $builder->add('priceByRefUnit', NumberType::class, array(
'required'=>false
'required' => false
)); ));


$builder->add('priceByRefUnitWithTax', NumberType::class, array( $builder->add('priceByRefUnitWithTax', NumberType::class, array(
$builder->add('position', HiddenType::class); $builder->add('position', HiddenType::class);
$builder->add('status', HiddenType::class); $builder->add('status', HiddenType::class);
$builder->add('exportTitle', TextType::class, array( $builder->add('exportTitle', TextType::class, array(
'required' =>false
'required' => false
)); ));
$builder->add('exportNote', TextType::class, array( $builder->add('exportNote', TextType::class, array(
'required' =>false
'required' => false
)); ));
$reductionCartClass = $this->em->getClassMetadata(ReductionCartInterface::class)->getName(); $reductionCartClass = $this->em->getClassMetadata(ReductionCartInterface::class)->getName();
$reductionCartRepo = $this->em->getRepository(ReductionCartInterface::class); $reductionCartRepo = $this->em->getRepository(ReductionCartInterface::class);


/* $builder->add('giftVoucherReductionCart', EntityType::class, array(
'required' =>false,
'class'=> $reductionCartClass,
'choices' => $reductionCartRepo->getOnlineReductionCart(),
));*/
/* $builder->add('giftVoucherReductionCart', EntityType::class, array(
'required' =>false,
'class'=> $reductionCartClass,
'choices' => $reductionCartRepo->getOnlineReductionCart(),
));*/


} }



+ 78
- 0
ShopBundle/Form/Backend/Ticket/TicketTypeType.php View File

<?php

namespace Lc\ShopBundle\Form\Backend\Ticket;

use App\Entity\Product;
use Doctrine\ORM\EntityManagerInterface;
use Lc\ShopBundle\Context\CreditHistoryInterface;
use Lc\ShopBundle\Context\OrderProductInterface;
use Lc\ShopBundle\Context\OrderReductionCartInterface;
use Lc\ShopBundle\Context\OrderShopInterface;
use Lc\ShopBundle\Context\OrderUtilsInterface;
use Lc\ShopBundle\Context\ProductInterface;
use Lc\ShopBundle\Context\ReductionCartInterface;
use Lc\ShopBundle\Context\ReductionCreditInterface;
use Lc\ShopBundle\Context\TicketInterface;
use Lc\ShopBundle\Context\TicketMessageInterface;
use Lc\ShopBundle\Form\DataTransformer\ProductToIdTransformer;
use Lc\ShopBundle\Model\CreditHistory;
use Lc\ShopBundle\Model\Ticket;
use Lc\ShopBundle\Services\Utils;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ButtonType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\MoneyType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolver;

class TicketTypeType extends AbstractType
{
protected $em;


public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event){
$builder = $event->getForm()->getParent();

$builder->add('type', ChoiceType::class, [
'label' => 'field.Ticket.type',
'multiple' => false,
'expanded' => false,
'choices' => [
'field.Ticket.typeOptions.' . Ticket::TYPE_MESSAGE_FROM_PDL => Ticket::TYPE_MESSAGE_FROM_PDL,
'field.Ticket.typeOptions.' . Ticket::TYPE_GENERAL_QUESTION => Ticket::TYPE_GENERAL_QUESTION,
'field.Ticket.typeOptions.' . Ticket::TYPE_PRODUCT_UNAVAILABLE => Ticket::TYPE_PRODUCT_UNAVAILABLE,
'field.Ticket.typeOptions.' . Ticket::TYPE_PRODUCT_ERROR => Ticket::TYPE_PRODUCT_ERROR,
'field.Ticket.typeOptions.' . Ticket::TYPE_TECHNICAL_PROBLEM => Ticket::TYPE_TECHNICAL_PROBLEM,
'field.Ticket.typeOptions.' . Ticket::TYPE_POULTRY_BOOKING => Ticket::TYPE_POULTRY_BOOKING,
],
'translation_domain' => 'lcshop',
]);
});

}

public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => $this->em->getClassMetadata(TicketInterface::class)->getName(),
'translation_domain' => 'lcshop'
]);
}
}

+ 2
- 0
ShopBundle/Form/Frontend/RegistrationType.php View File

'translation_domain' => 'lcshop', 'translation_domain' => 'lcshop',
]) ])
->add('subscribeNewsletter', CheckboxType::class, [ ->add('subscribeNewsletter', CheckboxType::class, [
'data' => true,
'label' => 'field.default.subscribeNewsletter', 'label' => 'field.default.subscribeNewsletter',
'required' => false, 'required' => false,
'mapped' => false, 'mapped' => false,
'translation_domain' => 'lcshop', 'translation_domain' => 'lcshop',
'help' => 'Un seul mail par semaine qui annonce l’ouverture des ventes, les nouveautés et promotions de la semaine ainsi que des informations utiles.'
]); ]);


// captcha // captcha

+ 18
- 1
ShopBundle/Model/OrderShop.php View File

*/ */
protected $updatedBy; protected $updatedBy;



/** /**
* @ORM\OneToMany(targetEntity="Lc\ShopBundle\Context\TicketInterface", mappedBy="orderShop") * @ORM\OneToMany(targetEntity="Lc\ShopBundle\Context\TicketInterface", mappedBy="orderShop")
*/ */
protected $tickets; protected $tickets;


/**
* @ORM\ManyToOne(targetEntity="Lc\ShopBundle\Context\SectionInterface", inversedBy="orderShops")
* @ORM\JoinColumn(nullable=false)
*/
protected $section;

public function __construct() public function __construct()
{ {
$this->orderStatusHistories = new ArrayCollection(); $this->orderStatusHistories = new ArrayCollection();
return false ; return false ;
} }


public function getSection(): ?Section
{
return $this->section;
}

public function setSection(?Section $section): self
{
$this->section = $section;

return $this;
}

} }

+ 5
- 0
ShopBundle/Model/PriceTrait.php View File

return $this->getTaxRate() ; return $this->getTaxRate() ;
} }


public function getBuyingPriceInherited(): ?float
{
return $this->getBuyingPrice() ;
}

public function getBuyingPrice(): ?float public function getBuyingPrice(): ?float
{ {
return $this->buyingPrice; return $this->buyingPrice;

+ 31
- 6
ShopBundle/Model/ProductCategory.php View File



namespace Lc\ShopBundle\Model; namespace Lc\ShopBundle\Model;


use App\Entity\Hub;
use App\Entity\ProductFamily;
use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection; use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
protected $childrens; protected $childrens;


/** /**
* @ORM\ManyToMany(targetEntity="App\Entity\ProductFamily", mappedBy="productCategories")
* @ORM\ManyToMany(targetEntity="Lc\ShopBundle\Context\ProductFamilyInterface", mappedBy="productCategories")
*/ */
protected $productFamilies; protected $productFamilies;


*/ */
protected $saleStatus; protected $saleStatus;



/**
* @ORM\ManyToOne(targetEntity="Lc\ShopBundle\Context\SectionInterface", inversedBy="productCategories")
* @ORM\JoinColumn(nullable=false)
*/
protected $section;

public function __construct() public function __construct()
{ {
$this->childrens = new ArrayCollection(); $this->childrens = new ArrayCollection();


public function __toString() public function __toString()
{ {
// TODO: Implement __toString() method.
return $this->getTitle();
$parent = $this->getParent() ;
$title = $parent ? $parent->getTitle().' - ' : '' ;
$title .= $this->getTitle() ;
return $title ;
} }


public function getParent(): ?self public function getParent(): ?self
*/ */
public function getChildrens(): Collection public function getChildrens(): Collection
{ {
return $this->childrens;
//TODO les lignes ci-dessous ne devraient pas exister, sert à résoudre le problème d'ordre dans le menu
$iterator = $this->childrens->getIterator();
$iterator->uasort(function ($a, $b) {
return ($a->getPosition() < $b->getPosition()) ? -1 : 1;
});
return new ArrayCollection(iterator_to_array($iterator));
} }


public function addChildren(self $productCategory): self public function addChildren(self $productCategory): self


return $this; return $this;
} }

public function getSection(): ?Section
{
return $this->section;
}

public function setSection(?Section $section): self
{
$this->section = $section;

return $this;
}

} }

+ 51
- 1
ShopBundle/Model/ProductFamily.php View File

*/ */
protected $behaviorPrice; protected $behaviorPrice;



/** /**
* @ORM\Column(type="boolean") * @ORM\Column(type="boolean")
*/ */
protected $saleStatus; protected $saleStatus;


/**
* @ORM\ManyToMany(targetEntity="Lc\ShopBundle\Context\SectionInterface", inversedBy="productFamilies")
*/
protected $sections;

public function __construct() public function __construct()
{ {
$this->productCategories = new ArrayCollection(); $this->productCategories = new ArrayCollection();


return $this; return $this;
} }

/**
* @return Collection|Section[]
*/
public function getSections(): Collection
{
return $this->sections;
}

public function addSection(Section $section): self
{
if (!$this->sections->contains($section)) {
$this->sections[] = $section;
}

return $this;
}

public function removeSection(Section $section): self
{
if ($this->sections->contains($section)) {
$this->sections->removeElement($section);
}

return $this;
}

public function getFieldBuyingPrice()
{
if($this->getBehaviorPrice() === self::BEHAVIOR_PRICE_BY_PIECE) {
return 'buyingPrice' ;
}
elseif($this->getBehaviorPrice() === self::BEHAVIOR_PRICE_BY_REFERENCE_UNIT) {
return 'buyingPriceByRefUnit' ;
}
}

public function getFieldPrice()
{
if($this->getBehaviorPrice() === self::BEHAVIOR_PRICE_BY_PIECE) {
return 'price' ;
}
elseif($this->getBehaviorPrice() === self::BEHAVIOR_PRICE_BY_REFERENCE_UNIT) {
return 'priceByRefUnit' ;
}
}
} }

+ 5
- 3
ShopBundle/Model/ProductPropertyTrait.php View File

*/ */
protected $propertyExpirationDate; protected $propertyExpirationDate;





public function getBuyingPriceByRefUnit(): ?float public function getBuyingPriceByRefUnit(): ?float
{ {
return $this->buyingPriceByRefUnit; return $this->buyingPriceByRefUnit;
} }


public function getBuyingPriceByRefUnitInherited(): ?float
{
return $this->getBuyingPriceByRefUnit() ;
}

public function setBuyingPriceByRefUnit(?float $buyingPriceByRefUnit): self public function setBuyingPriceByRefUnit(?float $buyingPriceByRefUnit): self
{ {
$this->buyingPriceByRefUnit = $buyingPriceByRefUnit; $this->buyingPriceByRefUnit = $buyingPriceByRefUnit;

+ 1
- 1
ShopBundle/Model/ReductionCart.php View File

protected $uncombinableTypes = []; protected $uncombinableTypes = [];


/** /**
* @ORM\Column(type="integer")
* @ORM\Column(type="integer", nullable=true)
*/ */
protected $availableQuantityPerCode; protected $availableQuantityPerCode;
public function __toString() public function __toString()

+ 172
- 0
ShopBundle/Model/Section.php View File

<?php

namespace Lc\ShopBundle\Model;

use App\Entity\Hub;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Lc\ShopBundle\Context\FilterMerchantInterface;

/**
* @ORM\MappedSuperclass()
*/
abstract class Section extends AbstractDocumentEntity implements FilterMerchantInterface
{
/**
* @ORM\ManyToOne(targetEntity="Lc\ShopBundle\Context\MerchantInterface")
* @ORM\JoinColumn(nullable=false)
*/
protected $merchant;

/**
* @ORM\Column(type="string", length=32)
*/
protected $cycle;

const SECTION_CYCLE_DAY = 'day' ;
const SECTION_CYCLE_WEEK = 'week' ;
const SECTION_CYCLE_MONTH = 'month' ;
const SECTION_CYCLE_YEAR = 'year' ;

/**
* @ORM\ManyToMany(targetEntity="Lc\ShopBundle\Context\ProductFamilyInterface", mappedBy="sections")
*/
protected $productFamilies;

/**
* @ORM\OneToMany(targetEntity="Lc\ShopBundle\Context\OrderShopInterface", mappedBy="section")
*/
protected $orderShops;


/**
* @ORM\OneToMany(targetEntity="Lc\ShopBundle\Context\ProductCategoryInterface", mappedBy="section")
*/
protected $productCategories;

public function __construct()
{
$this->productFamilies = new ArrayCollection();
$this->orderShops = new ArrayCollection();
}

public function __toString()
{
return $this->getTitle();
}

public function getMerchant(): ?Hub
{
return $this->merchant;
}

public function setMerchant(?Hub $merchant): self
{
$this->merchant = $merchant;

return $this;
}

public function getCycle(): ?string
{
return $this->cycle;
}

public function setCycle(string $cycle): self
{
$this->cycle = $cycle;

return $this;
}

/**
* @return Collection|ProductFamily[]
*/
public function getProductFamilies(): Collection
{
return $this->productFamilies;
}

public function addProductFamily(ProductFamily $productFamily): self
{
if (!$this->productFamilies->contains($productFamily)) {
$this->productFamilies[] = $productFamily;
$productFamily->addSection($this);
}

return $this;
}

public function removeProductFamily(ProductFamily $productFamily): self
{
if ($this->productFamilies->contains($productFamily)) {
$this->productFamilies->removeElement($productFamily);
$productFamily->removeSection($this);
}

return $this;
}

/**
* @return Collection|OrderShop[]
*/
public function getOrderShops(): Collection
{
return $this->orderShops;
}

public function addOrderShop(OrderShop $orderShop): self
{
if (!$this->orderShops->contains($orderShop)) {
$this->orderShops[] = $orderShop;
$orderShop->setSection($this);
}

return $this;
}

public function removeOrderShop(OrderShop $orderShop): self
{
if ($this->orderShops->contains($orderShop)) {
$this->orderShops->removeElement($orderShop);
// set the owning side to null (unless already changed)
if ($orderShop->getSection() === $this) {
$orderShop->setSection(null);
}
}

return $this;
}

/**
* @return Collection|ProductCategory[]
*/
public function getProductCategories(): Collection
{
return $this->productCategories;
}

public function addProductCategory(ProductCategory $productCategory): self
{
if (!$this->productCategories->contains($productCategory)) {
$this->productCategories[] = $productCategory;
$productCategory->setSection($this);
}

return $this;
}

public function removeProductCategory(ProductCategory $productCategory): self
{
if ($this->productCategories->contains($productCategory)) {
$this->productCategories->removeElement($productCategory);
// set the owning side to null (unless already changed)
if ($productCategory->getSection() === $this) {
$productCategory->setSection(null);
}
}

return $this;
}
}

+ 1
- 0
ShopBundle/Model/Ticket.php View File

const TYPE_TECHNICAL_PROBLEM = 'technical-problem' ; const TYPE_TECHNICAL_PROBLEM = 'technical-problem' ;
const TYPE_GENERAL_QUESTION = 'general-question' ; const TYPE_GENERAL_QUESTION = 'general-question' ;
const TYPE_POULTRY_BOOKING = 'poultry-booking' ; const TYPE_POULTRY_BOOKING = 'poultry-booking' ;
const TYPE_MESSAGE_FROM_PDL = 'message-from-pdl' ;




const TICKET_STATUS_OPEN = 'open' ; const TICKET_STATUS_OPEN = 'open' ;

+ 4
- 0
ShopBundle/Repository/OrderShopRepository.php View File

$query->select( $params['select']); $query->select( $params['select']);
} }


if (isset($params['section'])) {
$query = $query->andWhere('e.section = :section')->setParameter('section', $params['section']);
}

if (isset($params['dateStart']) || isset($params['dateEnd'])) { if (isset($params['dateStart']) || isset($params['dateEnd'])) {
$params['dateField'] = isset($params['dateField']) ? $params['dateField'] : 'validationDate'; $params['dateField'] = isset($params['dateField']) ? $params['dateField'] : 'validationDate';
} }

+ 13
- 1
ShopBundle/Repository/ProductCategoryRepository.php View File

return $query->getQuery()->getOneOrNullResult() ; return $query->getQuery()->getOneOrNullResult() ;
} }


public function findOneByDevAlias($devAlias)
{
$query = $this->findByMerchantQuery() ;
$query->andWhere('e.devAlias = :devAlias')->setParameter('devAlias',$devAlias) ;
return $query->getQuery()->getOneOrNullResult() ;
}

public function findAllParents($withOffline = false) public function findAllParents($withOffline = false)
{ {
$query = $this->findByMerchantQuery() $query = $this->findByMerchantQuery()
return $query->getQuery()->getResult(); return $query->getQuery()->getResult();
} }


public function findAllByParent($parentCategory, $withOffline = false, $withEmptyCategories = true)
public function findAllByParent($parentCategory, $withOffline = false, $withEmptyCategories = true, $filterBySpecificDay = false)
{ {
$query = $this->createQueryBuilder('e'); $query = $this->createQueryBuilder('e');
$query->andWhere('e.parent = :idParentCategory'); $query->andWhere('e.parent = :idParentCategory');
$query->andWhere('pf.status = 1') ; $query->andWhere('pf.status = 1') ;
} }


if($filterBySpecificDay) {
$query->andWhere('e.displaySpecificDay IS NULL OR e.displaySpecificDay = :dayToday') ;
$query->setParameter('dayToday', date('N')) ;
}

$query->addOrderBy('e.position', 'ASC') ; $query->addOrderBy('e.position', 'ASC') ;


return $query->getQuery()->getResult(); return $query->getQuery()->getResult();

+ 19
- 1
ShopBundle/Repository/ProductFamilyRepository.php View File

$query = $this->findByMerchantQuery() ; $query = $this->findByMerchantQuery() ;
$query = $this->joinRelations($query) ; $query = $this->joinRelations($query) ;
$query->andWhere('e.status = 1') ; $query->andWhere('e.status = 1') ;
$query->orderBy('RAND()');
return $query->getQuery()->getResult() ; return $query->getQuery()->getResult() ;
} }


$query->andWhere('e.status = 1'); $query->andWhere('e.status = 1');
$query->andWhere(':now <= e.propertyNoveltyExpirationDate') $query->andWhere(':now <= e.propertyNoveltyExpirationDate')
->setParameter('now', new \DateTime()) ; ->setParameter('now', new \DateTime()) ;
$query->orderBy('e.createdAt', 'DESC');
$query->orderBy('RAND()');


return $query->getQuery()->getResult() ; return $query->getQuery()->getResult() ;
} }
return $query->getQuery()->getResult() ; return $query->getQuery()->getResult() ;
} }


public function getProductFamiliesBySection($section, $maxResults = false, $sortField = 'productCategories.position', $sortDirection = 'ASC')
{
$query = $this->findByMerchantQuery() ;
$query = $this->joinRelations($query) ;


$query->andWhere('e.status = 1');
$query->andWhere(':section MEMBER OF e.sections')
->setParameter('section', $section) ;
$query->leftJoin('e.productCategories', 'productCategories');
if($sortField){
$query->orderBy($sortField,$sortDirection);
}
if($maxResults) {
$query->setMaxResults($maxResults) ;
}

return $query->getQuery()->getResult() ;
}




} }

+ 50
- 0
ShopBundle/Repository/SectionRepository.php View File

<?php

namespace Lc\ShopBundle\Repository;

use Lc\ShopBundle\Context\SectionInterface;
use Lc\ShopBundle\Context\DefaultRepositoryInterface;

/**
* @method SectionInterface|null find($id, $lockMode = null, $lockVersion = null)
* @method SectionInterface|null findOneBy(array $criteria, array $orderBy = null)
* @method SectionInterface[] findAll()
* @method SectionInterface[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class SectionRepository extends BaseRepository implements DefaultRepositoryInterface
{
public function getInterfaceClass()
{
return SectionInterface::class;
}

// /**
// * @return Address[] Returns an array of Address objects
// */
/*
public function findByExampleField($value)
{
return $this->createQueryBuilder('a')
->andWhere('a.exampleField = :val')
->setParameter('val', $value)
->orderBy('a.id', 'ASC')
->setMaxResults(10)
->getQuery()
->getResult()
;
}
*/

/*
public function findOneBySomeField($value): ?Address
{
return $this->createQueryBuilder('a')
->andWhere('a.exampleField = :val')
->setParameter('val', $value)
->getQuery()
->getOneOrNullResult()
;
}
*/
}


+ 179
- 113
ShopBundle/Resources/public/css/backend/custom.css View File



/* line 60, ../../sass/backend/custom.scss */ /* line 60, ../../sass/backend/custom.scss */
table th.sorting_asc, table th.sorting_desc { table th.sorting_asc, table th.sorting_desc {
border-top: 3px solid var(--success);
border-top: 2px solid var(--success);
} }


/* line 61, ../../sass/backend/custom.scss */ /* line 61, ../../sass/backend/custom.scss */
.card-body table.lc-table-list th.sorted, table th.sorting_asc, table th.sorting_desc {
border-top: 2px solid var(--success);
.card-body table.lc-table-list th.filtered {
border-top: 2px solid var(--primary);
} }


/*.card-body table.lc-table-list th{border-top:3px solid var(--success);}*/ /*.card-body table.lc-table-list th{border-top:3px solid var(--success);}*/
/* line 63, ../../sass/backend/custom.scss */ /* line 63, ../../sass/backend/custom.scss */
table th.filtered { table th.filtered {
border-top: 3px solid var(--primary);
border-top: 2px solid var(--primary);
}

/* line 64, ../../sass/backend/custom.scss */
.card-body table.lc-table-list th.sorted, table th.sorting_asc, table th.sorting_desc {
border-top: 2px solid var(--success);
}

/* line 65, ../../sass/backend/custom.scss */
.card-body table.lc-table-list th.sorted.filtered {
border-top: 0px;
position: relative;
} }


/* line 66, ../../sass/backend/custom.scss */ /* line 66, ../../sass/backend/custom.scss */
.card-body table.lc-table-list th.sorted.filtered:after {
content: '';
height: 2px;
position: absolute;
left: 0;
width: 100%;
right: 0;
top: -1px;
background: linear-gradient(to right, var(--success) 0%, var(--success) 50%, var(--primary) 50%, var(--primary) 100%);
}

/* line 69, ../../sass/backend/custom.scss */
.lc-table-list thead a { .lc-table-list thead a {
color: #212529; color: #212529;
} }


/* line 67, ../../sass/backend/custom.scss */
/* line 70, ../../sass/backend/custom.scss */
.table-filters-line th { .table-filters-line th {
font-weight: 400; font-weight: 400;
position: relative; position: relative;
} }


/* line 69, ../../sass/backend/custom.scss */
/* line 72, ../../sass/backend/custom.scss */
#list_filter_id { #list_filter_id {
width: 60px; width: 60px;
} }


/* line 70, ../../sass/backend/custom.scss */
/* line 73, ../../sass/backend/custom.scss */
.lc-table-list .date-range { .lc-table-list .date-range {
width: 130px; width: 130px;
} }


/* line 72, ../../sass/backend/custom.scss */
/* line 75, ../../sass/backend/custom.scss */
th.actions, td.actions { th.actions, td.actions {
white-space: nowrap; white-space: nowrap;
text-align: right; text-align: right;
} }


/* line 74, ../../sass/backend/custom.scss */
/* line 77, ../../sass/backend/custom.scss */
.table td, .table th { .table td, .table th {
padding: 0.35rem; padding: 0.35rem;
} }


/* line 75, ../../sass/backend/custom.scss */
/* line 78, ../../sass/backend/custom.scss */
.delivery-field .form-group { .delivery-field .form-group {
display: inline-block; display: inline-block;
margin-bottom: 0px; margin-bottom: 0px;
margin-right: 15px; margin-right: 15px;
} }


/* line 76, ../../sass/backend/custom.scss */
/* line 79, ../../sass/backend/custom.scss */
.delivery-field .form-group .form-control { .delivery-field .form-group .form-control {
width: 150px; width: 150px;
} }


/* line 78, ../../sass/backend/custom.scss */
/* line 81, ../../sass/backend/custom.scss */
table th input { table th input {
width: 100%; width: 100%;
} }


/* line 79, ../../sass/backend/custom.scss */
/* line 82, ../../sass/backend/custom.scss */
table th .select2-container--default .select2-selection--single { table th .select2-container--default .select2-selection--single {
padding: 0.3rem 0.4rem; padding: 0.3rem 0.4rem;
} }


/************************ LOGIN PAGE *********************/ /************************ LOGIN PAGE *********************/
/* line 82, ../../sass/backend/custom.scss */
/* line 85, ../../sass/backend/custom.scss */
.login-logo { .login-logo {
display: block; display: block;
margin: auto; margin: auto;
} }


/************************ form error *********************/ /************************ form error *********************/
/* line 85, ../../sass/backend/custom.scss */
/* line 88, ../../sass/backend/custom.scss */
.form-sent .form-control:invalid { .form-sent .form-control:invalid {
border-color: #dc3545; border-color: #dc3545;
padding-right: 2.25rem; padding-right: 2.25rem;
background-size: calc(.75em + .375rem) calc(.75em + .375rem); background-size: calc(.75em + .375rem) calc(.75em + .375rem);
} }


/* line 86, ../../sass/backend/custom.scss */
/* line 89, ../../sass/backend/custom.scss */
.form-sent select.form-control:invalid + .select2 .select2-selection { .form-sent select.form-control:invalid + .select2 .select2-selection {
border-color: #dc3545; border-color: #dc3545;
} }


/* line 87, ../../sass/backend/custom.scss */
/* line 90, ../../sass/backend/custom.scss */
.form-sent select.form-control:invalid + .select2 .select2-selection b { .form-sent select.form-control:invalid + .select2 .select2-selection b {
border-color: #dc3545 transparent transparent transparent; border-color: #dc3545 transparent transparent transparent;
} }


/*CUSTOM Checkbox /*CUSTOM Checkbox
/* Customize the label (the container) */ /* Customize the label (the container) */
/* line 92, ../../sass/backend/custom.scss */
/* line 95, ../../sass/backend/custom.scss */
.form-check-label { .form-check-label {
display: block; display: block;
position: relative; position: relative;
} }


/* Hide the browser's default checkbox */ /* Hide the browser's default checkbox */
/* line 94, ../../sass/backend/custom.scss */
/* line 97, ../../sass/backend/custom.scss */
.form-check-label input { .form-check-label input {
position: absolute; position: absolute;
opacity: 0; opacity: 0;
} }


/* Create a custom checkbox */ /* Create a custom checkbox */
/* line 97, ../../sass/backend/custom.scss */
/* line 100, ../../sass/backend/custom.scss */
.form-check { .form-check {
padding-left: 0px; padding-left: 0px;
} }


/* line 99, ../../sass/backend/custom.scss */
/* line 102, ../../sass/backend/custom.scss */
.form-sent .form-check-label input:invalid ~ .checkmark { .form-sent .form-check-label input:invalid ~ .checkmark {
border-color: #dc3545; border-color: #dc3545;
} }


/* line 100, ../../sass/backend/custom.scss */
/* line 103, ../../sass/backend/custom.scss */
.form-check-label input:disabled ~ .checkmark { .form-check-label input:disabled ~ .checkmark {
display: none; display: none;
} }


/* line 101, ../../sass/backend/custom.scss */
/* line 104, ../../sass/backend/custom.scss */
.form-check-label input ~ .checkmark { .form-check-label input ~ .checkmark {
position: absolute; position: absolute;
top: 0; top: 0;
border: 1px solid var(--primary); border: 1px solid var(--primary);
} }


/* line 102, ../../sass/backend/custom.scss */
/* line 105, ../../sass/backend/custom.scss */
.form-check-label.big input ~ .checkmark { .form-check-label.big input ~ .checkmark {
height: 21px; height: 21px;
width: 21px; width: 21px;
} }


/* line 103, ../../sass/backend/custom.scss */
/* line 106, ../../sass/backend/custom.scss */
.form-check-label input[type="checkbox"] ~ .checkmark { .form-check-label input[type="checkbox"] ~ .checkmark {
top: 2px; top: 2px;
} }


/* line 104, ../../sass/backend/custom.scss */
/* line 107, ../../sass/backend/custom.scss */
.form-check-label input[type="radio"] ~ .checkmark { .form-check-label input[type="radio"] ~ .checkmark {
top: 3px; top: 3px;
border-radius: 50%; border-radius: 50%;
} }


/* line 105, ../../sass/backend/custom.scss */
/* line 108, ../../sass/backend/custom.scss */
.form-check-label:hover input ~ .checkmark { .form-check-label:hover input ~ .checkmark {
background-color: #ccc; background-color: #ccc;
} }


/* When the checkbox is checked, add a blue background */ /* When the checkbox is checked, add a blue background */
/* line 107, ../../sass/backend/custom.scss */
/* line 110, ../../sass/backend/custom.scss */
.form-check-label input:checked ~ .checkmark { .form-check-label input:checked ~ .checkmark {
background-color: var(--primary); background-color: var(--primary);
} }


/* Create the checkmark/indicator (hidden when not checked) */ /* Create the checkmark/indicator (hidden when not checked) */
/* line 109, ../../sass/backend/custom.scss */
/* line 112, ../../sass/backend/custom.scss */
.form-check-label .checkmark:after { .form-check-label .checkmark:after {
content: ""; content: "";
position: absolute; position: absolute;
} }


/* Show the checkmark when checked */ /* Show the checkmark when checked */
/* line 111, ../../sass/backend/custom.scss */
/* line 114, ../../sass/backend/custom.scss */
.form-check-label input:checked ~ .checkmark:after { .form-check-label input:checked ~ .checkmark:after {
display: block; display: block;
} }


/* Style the checkmark/indicator */ /* Style the checkmark/indicator */
/* line 113, ../../sass/backend/custom.scss */
/* line 116, ../../sass/backend/custom.scss */
.form-check-label .checkmark:after { .form-check-label .checkmark:after {
left: 7px; left: 7px;
top: 3px; top: 3px;
transform: rotate(45deg); transform: rotate(45deg);
} }


/* line 114, ../../sass/backend/custom.scss */
/* line 117, ../../sass/backend/custom.scss */
.form-check-label input[type="checkbox"] ~ .checkmark:after { .form-check-label input[type="checkbox"] ~ .checkmark:after {
left: 6px; left: 6px;
top: 2px; top: 2px;
transform: rotate(45deg); transform: rotate(45deg);
} }


/* line 115, ../../sass/backend/custom.scss */
/* line 118, ../../sass/backend/custom.scss */
.form-check-label input[type="radio"] ~ .checkmark:after { .form-check-label input[type="radio"] ~ .checkmark:after {
top: 4px; top: 4px;
left: 4px; left: 4px;
background: white; background: white;
} }


/* line 117, ../../sass/backend/custom.scss */
/* line 120, ../../sass/backend/custom.scss */
.form-check-label.big input[type="checkbox"] ~ .checkmark:after { .form-check-label.big input[type="checkbox"] ~ .checkmark:after {
left: 7px; left: 7px;
top: 3px; top: 3px;
} }


/* Create a custom radio button */ /* Create a custom radio button */
/* line 121, ../../sass/backend/custom.scss */
/* line 124, ../../sass/backend/custom.scss */
.product-categories .parent .form-group.field-checkbox .form-check-label { .product-categories .parent .form-group.field-checkbox .form-check-label {
padding-left: 0px; padding-left: 0px;
font-style: italic; font-style: italic;
} }


/* line 122, ../../sass/backend/custom.scss */
/* line 125, ../../sass/backend/custom.scss */
.product-categories .children .form-group.field-checkbox { .product-categories .children .form-group.field-checkbox {
margin-left: 20px; margin-left: 20px;
} }


/* line 123, ../../sass/backend/custom.scss */
/* line 126, ../../sass/backend/custom.scss */
.product-categories .form-group { .product-categories .form-group {
margin-bottom: 0.15rem; margin-bottom: 0.15rem;
} }


/* line 124, ../../sass/backend/custom.scss */
/* line 127, ../../sass/backend/custom.scss */
.lc-deleted-field { .lc-deleted-field {
display: none; display: none;
} }


/* line 125, ../../sass/backend/custom.scss */
/* line 128, ../../sass/backend/custom.scss */
.lc-offline-field { .lc-offline-field {
opacity: 0.5; opacity: 0.5;
} }


/* line 126, ../../sass/backend/custom.scss */
/* line 129, ../../sass/backend/custom.scss */
.lc-offline-field label::after { .lc-offline-field label::after {
content: ' [hors ligne]'; content: ' [hors ligne]';
} }


/* Général */ /* Général */
/* line 132, ../../sass/backend/custom.scss */
/* line 135, ../../sass/backend/custom.scss */
.btn.action-save { .btn.action-save {
float: right; float: right;
margin-left: 10px; margin-left: 10px;
} }


/* line 133, ../../sass/backend/custom.scss */
/* line 136, ../../sass/backend/custom.scss */
.button-action a.float-right { .button-action a.float-right {
margin-left: 10px; margin-left: 10px;
} }


/* line 135, ../../sass/backend/custom.scss */
/* line 138, ../../sass/backend/custom.scss */
.input-group-text { .input-group-text {
padding: 0.25rem 0.75rem; padding: 0.25rem 0.75rem;
} }


/* line 139, ../../sass/backend/custom.scss */
/* line 142, ../../sass/backend/custom.scss */
.col-form-label { .col-form-label {
font-weight: bold; font-weight: bold;
} }


/* line 141, ../../sass/backend/custom.scss */
/* line 144, ../../sass/backend/custom.scss */
#toast-container.toast-top-right { #toast-container.toast-top-right {
top: 60px; top: 60px;
} }


/* SIDEBAR */ /* SIDEBAR */
/* line 144, ../../sass/backend/custom.scss */
/* line 147, ../../sass/backend/custom.scss */
.main-header.navbar { .main-header.navbar {
padding: 0; padding: 0;
min-height: 57px; min-height: 57px;
} }


/* line 145, ../../sass/backend/custom.scss */
/* line 148, ../../sass/backend/custom.scss */
.lc-navbar li { .lc-navbar li {
border-left: 1px solid #e0e0e0; border-left: 1px solid #e0e0e0;
padding: 0.5rem 1.5rem; padding: 0.5rem 1.5rem;
} }


/* line 146, ../../sass/backend/custom.scss */
/* line 149, ../../sass/backend/custom.scss */
.lc-navbar li label { .lc-navbar li label {
margin-bottom: 0; margin-bottom: 0;
vertical-align: middle; vertical-align: middle;
font-weight: normal !important; font-weight: normal !important;
} }


/* line 148, ../../sass/backend/custom.scss */
/* line 151, ../../sass/backend/custom.scss */
#switch-merchant { #switch-merchant {
min-width: 170px; min-width: 170px;
} }


/*************************** PAGINATION *******************************/
/* line 155, ../../sass/backend/custom.scss */
.pagination {
justify-content: center;
}

/* line 156, ../../sass/backend/custom.scss */
.disabled .page-link {
color: #343a40;
}

/* line 157, ../../sass/backend/custom.scss */
.disabled .page-link:hover, .page-link.current:hover {
background-color: #fff;
cursor: default;
}

/* Sortable */ /* Sortable */
/* line 154, ../../sass/backend/custom.scss */
/* line 162, ../../sass/backend/custom.scss */
.ui-sortable-helper { .ui-sortable-helper {
display: table; display: table;
} }


/* line 155, ../../sass/backend/custom.scss */
/* line 163, ../../sass/backend/custom.scss */
.ui-state-highlight { .ui-state-highlight {
background: #eee; background: #eee;
} }


/* line 156, ../../sass/backend/custom.scss */
/* line 164, ../../sass/backend/custom.scss */
.lc-sortable div:last-child { .lc-sortable div:last-child {
display: none; display: none;
} }
.lc-ckfinder-wrap .lc-ckfinder-button{width: 100%; bottom: 0px; left: 0; position: absolute;} .lc-ckfinder-wrap .lc-ckfinder-button{width: 100%; bottom: 0px; left: 0; position: absolute;}
*/ */
/* VUES JS */ /* VUES JS */
/* line 171, ../../sass/backend/custom.scss */
/* line 179, ../../sass/backend/custom.scss */
.nav-item .btn { .nav-item .btn {
padding-right: 15px; padding-right: 15px;
position: relative; position: relative;
} }


/* line 172, ../../sass/backend/custom.scss */
/* line 180, ../../sass/backend/custom.scss */
.nav-item .btn .invalid-form { .nav-item .btn .invalid-form {
display: none; display: none;
position: absolute; position: absolute;
font-size: 1.2rem; font-size: 1.2rem;
} }


/* line 173, ../../sass/backend/custom.scss */
/* line 181, ../../sass/backend/custom.scss */
.nav-item.has-invalid .btn .invalid-form { .nav-item.has-invalid .btn .invalid-form {
display: inline-block; display: inline-block;
z-index: 2; z-index: 2;
} }


/* ProductFamily */ /* ProductFamily */
/* line 178, ../../sass/backend/custom.scss */
/* line 186, ../../sass/backend/custom.scss */
.field-unit-quantity { .field-unit-quantity {
border-bottom: 2px dotted #eee; border-bottom: 2px dotted #eee;
padding-bottom: 10px; padding-bottom: 10px;
margin-bottom: 20px; margin-bottom: 20px;
} }


/* line 179, ../../sass/backend/custom.scss */
/* line 187, ../../sass/backend/custom.scss */
.field-reduction-apply { .field-reduction-apply {
border-top: 2px dotted #eee; border-top: 2px dotted #eee;
padding-top: 10px; padding-top: 10px;
margin-top: 20px; margin-top: 20px;
} }


/* line 181, ../../sass/backend/custom.scss */
/* line 189, ../../sass/backend/custom.scss */
.new-productfamily #nav-params, .new-productfamily #nav-params,
.edit-productfamily #nav-params { .edit-productfamily #nav-params {
margin-bottom: 30px; margin-bottom: 30px;
} }


/* line 186, ../../sass/backend/custom.scss */
/* line 194, ../../sass/backend/custom.scss */
.new-productfamily #nav-params .btn, .new-productfamily #nav-params .btn,
.edit-productfamily #nav-params .btn { .edit-productfamily #nav-params .btn {
margin-left: 20px; margin-left: 20px;
} }


/* line 191, ../../sass/backend/custom.scss */
/* line 199, ../../sass/backend/custom.scss */
.new-productfamily #product-categories .row, .new-productfamily #product-categories .row,
.edit-productfamily #product-categories .row { .edit-productfamily #product-categories .row {
padding: 10px; padding: 10px;
} }


/* line 196, ../../sass/backend/custom.scss */
/* line 204, ../../sass/backend/custom.scss */
.new-productfamily #product-categories .form-group, .new-productfamily #product-categories .form-group,
.edit-productfamily #product-categories .form-group { .edit-productfamily #product-categories .form-group {
width: 100%; width: 100%;
padding: 4px; padding: 4px;
} }


/* line 202, ../../sass/backend/custom.scss */
/* line 210, ../../sass/backend/custom.scss */
.new-productfamily #product-categories .children, .new-productfamily #product-categories .children,
.edit-productfamily #product-categories .children { .edit-productfamily #product-categories .children {
margin-left: 20px; margin-left: 20px;
width: 100%; width: 100%;
} }


/* line 208, ../../sass/backend/custom.scss */
/* line 216, ../../sass/backend/custom.scss */
.new-productfamily ul.products, .new-productfamily ul.products,
.edit-productfamily ul.products { .edit-productfamily ul.products {
padding: 0px; padding: 0px;
list-style-type: none; list-style-type: none;
} }


/* line 214, ../../sass/backend/custom.scss */
/* line 222, ../../sass/backend/custom.scss */
.new-productfamily ul.products li.product, .new-productfamily ul.products li.product,
.edit-productfamily ul.products li.product { .edit-productfamily ul.products li.product {
padding: 0px; padding: 0px;
position: relative; position: relative;
} }


/* line 221, ../../sass/backend/custom.scss */
/* line 229, ../../sass/backend/custom.scss */
.new-productfamily ul.products li.add, .new-productfamily ul.products li.add,
.edit-productfamily ul.products li.add { .edit-productfamily ul.products li.add {
text-align: right; text-align: right;
} }


/* line 226, ../../sass/backend/custom.scss */
/* line 234, ../../sass/backend/custom.scss */
.autoresize textarea { .autoresize textarea {
height: auto; height: auto;
min-height: 38px; min-height: 38px;
} }


/* line 228, ../../sass/backend/custom.scss */
/* line 236, ../../sass/backend/custom.scss */
.field-price .input-group.buyingPrice input, .field-price .input-group.buyingPrice .input-group-text { .field-price .input-group.buyingPrice input, .field-price .input-group.buyingPrice .input-group-text {
font-weight: bold; font-weight: bold;
border-color: #222; border-color: #222;
} }


/* line 229, ../../sass/backend/custom.scss */
/* line 237, ../../sass/backend/custom.scss */
.field-price .input-group.buyingPriceByRefUnit input, .field-price .input-group.buyingPriceByRefUnit .input-group-text { .field-price .input-group.buyingPriceByRefUnit input, .field-price .input-group.buyingPriceByRefUnit .input-group-text {
font-weight: bold; font-weight: bold;
border-color: #222; border-color: #222;
} }


/* line 230, ../../sass/backend/custom.scss */
/* line 238, ../../sass/backend/custom.scss */
.field-price .input-group.priceWithTax input, .field-price .input-group.priceWithTax .input-group-text { .field-price .input-group.priceWithTax input, .field-price .input-group.priceWithTax .input-group-text {
font-weight: bold; font-weight: bold;
border-color: #222; border-color: #222;
} }


/* line 231, ../../sass/backend/custom.scss */
/* line 239, ../../sass/backend/custom.scss */
.field-price .input-group.priceByRefUnitWithTax input, .field-price .input-group.priceByRefUnitWithTax .input-group-text { .field-price .input-group.priceByRefUnitWithTax input, .field-price .input-group.priceByRefUnitWithTax .input-group-text {
font-weight: bold; font-weight: bold;
border-color: #222; border-color: #222;
} }


/* line 232, ../../sass/backend/custom.scss */
/* line 240, ../../sass/backend/custom.scss */
.input-group.multiplyingFactor input, .input-group.multiplyingFactor .input-group-text { .input-group.multiplyingFactor input, .input-group.multiplyingFactor .input-group-text {
font-weight: bold; font-weight: bold;
border-color: #222; border-color: #222;
} }


/* line 244, ../../sass/backend/custom.scss */
.layout-ajax #edit-productfamily-form .card-sections {
width: 100%;
position: fixed;
left: 0px;
top: 0px;
z-index: 10;
}
/* line 252, ../../sass/backend/custom.scss */
.layout-ajax #edit-productfamily-form .form {
padding-top: 50px;
}
/* line 256, ../../sass/backend/custom.scss */
.layout-ajax #edit-productfamily-form .card-footer {
display: none;
}
/* line 261, ../../sass/backend/custom.scss */
.layout-ajax #edit-productfamily-form .in-advanced-editing-table .form {
padding-top: 0px;
}
/* line 264, ../../sass/backend/custom.scss */
.layout-ajax #edit-productfamily-form .in-advanced-editing-table .card-sections,
.layout-ajax #edit-productfamily-form .in-advanced-editing-table .row-note {
display: none;
}

/* ORDER */ /* ORDER */
/* line 238, ../../sass/backend/custom.scss */
/* line 274, ../../sass/backend/custom.scss */
.table-order-summary { .table-order-summary {
width: 100%; width: 100%;
} }


/* line 241, ../../sass/backend/custom.scss */
/* line 277, ../../sass/backend/custom.scss */
.order-product-item.redelivery { .order-product-item.redelivery {
background: rgba(18, 104, 253, 0.38) !important; background: rgba(18, 104, 253, 0.38) !important;
} }
/*.select2-container--bootstrap .select2-selection{max-width: none;}*/ /*.select2-container--bootstrap .select2-selection{max-width: none;}*/
/*.order-product-item{margin: 15px 0; padding: 0;}*/ /*.order-product-item{margin: 15px 0; padding: 0;}*/
/* Product */ /* Product */
/* line 246, ../../sass/backend/custom.scss */
/* line 282, ../../sass/backend/custom.scss */
.product-form-modal { .product-form-modal {
display: none; display: none;
} }


/* line 247, ../../sass/backend/custom.scss */
/* line 283, ../../sass/backend/custom.scss */
.product-form.modal .form-check-label { .product-form.modal .form-check-label {
font-style: italic; font-style: italic;
color: #666; color: #666;
text-align: left; text-align: left;
} }


/* line 248, ../../sass/backend/custom.scss */
/* line 284, ../../sass/backend/custom.scss */
.products-collection-table .inherited { .products-collection-table .inherited {
color: #888; color: #888;
font-style: italic; font-style: italic;
font-weight: initial; font-weight: initial;
} }


/* line 249, ../../sass/backend/custom.scss */
/* line 285, ../../sass/backend/custom.scss */
.products-collection-table td { .products-collection-table td {
position: relative; position: relative;
} }


/* line 250, ../../sass/backend/custom.scss */
/* line 286, ../../sass/backend/custom.scss */
.card-body.p-0 .products-collection-table tbody > tr > td:first-of-type, .card-body.p-0 .products-collection-table tbody > tr > th:first-of-type, .card-body.p-0 .products-collection-table thead > tr > td:first-of-type, .card-body.p-0 .products-collection-table thead > tr > th:first-of-type { .card-body.p-0 .products-collection-table tbody > tr > td:first-of-type, .card-body.p-0 .products-collection-table tbody > tr > th:first-of-type, .card-body.p-0 .products-collection-table thead > tr > td:first-of-type, .card-body.p-0 .products-collection-table thead > tr > th:first-of-type {
padding-left: 0.35rem; padding-left: 0.35rem;
} }


/* line 251, ../../sass/backend/custom.scss */
/* line 287, ../../sass/backend/custom.scss */
.products-collection-table .btn-empty-field { .products-collection-table .btn-empty-field {
position: absolute; position: absolute;
right: 3px; right: 3px;
padding: 0px; padding: 0px;
} }


/* line 252, ../../sass/backend/custom.scss */
/* line 288, ../../sass/backend/custom.scss */
#lc-product-family-edit .products-collection-table { #lc-product-family-edit .products-collection-table {
table-layout: fixed; table-layout: fixed;
/* background-clip: padding-box;*/ /* background-clip: padding-box;*/
border-collapse: collapse; border-collapse: collapse;
} }


/* line 253, ../../sass/backend/custom.scss */
/* line 289, ../../sass/backend/custom.scss */
#lc-product-family-edit .products-collection-table th { #lc-product-family-edit .products-collection-table th {
font-size: 13px; font-size: 13px;
border-left: 1px solid #dee2e6; border-left: 1px solid #dee2e6;
position: relative; position: relative;
} }


/* line 254, ../../sass/backend/custom.scss */
/* line 290, ../../sass/backend/custom.scss */
#lc-product-family-edit .products-collection-table tfoot th { #lc-product-family-edit .products-collection-table tfoot th {
border-top: 2px solid #dee2e6; border-top: 2px solid #dee2e6;
} }


/* line 255, ../../sass/backend/custom.scss */
/* line 291, ../../sass/backend/custom.scss */
#lc-product-family-edit .products-collection-table th span { #lc-product-family-edit .products-collection-table th span {
white-space: initial; white-space: initial;
} }


/* line 256, ../../sass/backend/custom.scss */
/* line 292, ../../sass/backend/custom.scss */
#lc-product-family-edit .products-collection-table th:last-child { #lc-product-family-edit .products-collection-table th:last-child {
border-right: 1px solid #dee2e6; border-right: 1px solid #dee2e6;
} }


/* line 257, ../../sass/backend/custom.scss */
/* line 293, ../../sass/backend/custom.scss */
#lc-product-family-edit .products-collection-table td { #lc-product-family-edit .products-collection-table td {
border-left: 1px solid #dee2e6; border-left: 1px solid #dee2e6;
text-align: center; text-align: center;
border-bottom: 1px solid #dee2e6; border-bottom: 1px solid #dee2e6;
} }


/* line 258, ../../sass/backend/custom.scss */
/* line 294, ../../sass/backend/custom.scss */
#lc-product-family-edit .products-collection-table td:last-child { #lc-product-family-edit .products-collection-table td:last-child {
border-right: 1px solid #dee2e6; border-right: 1px solid #dee2e6;
white-space: nowrap; white-space: nowrap;
} }


/* line 259, ../../sass/backend/custom.scss */
/* line 295, ../../sass/backend/custom.scss */
#lc-product-family-edit .btn-add-product { #lc-product-family-edit .btn-add-product {
margin: 20px 0; margin: 20px 0;
float: right; float: right;
} }


/* line 260, ../../sass/backend/custom.scss */
/* line 296, ../../sass/backend/custom.scss */
#lc-product-family-edit .inherited { #lc-product-family-edit .inherited {
color: #888; color: #888;
font-style: italic; font-style: italic;
font-weight: initial; font-weight: initial;
} }


/* line 261, ../../sass/backend/custom.scss */
/* line 297, ../../sass/backend/custom.scss */
#lc-product-family-edit .products-collection-table td .value { #lc-product-family-edit .products-collection-table td .value {
min-width: 80%; min-width: 80%;
margin: auto; margin: auto;
cursor: pointer; cursor: pointer;
} }


/* line 262, ../../sass/backend/custom.scss */
/* line 298, ../../sass/backend/custom.scss */
#lc-product-family-edit .products-collection-table td .modal { #lc-product-family-edit .products-collection-table td .modal {
text-align: left; text-align: left;
} }


/* line 263, ../../sass/backend/custom.scss */
/* line 299, ../../sass/backend/custom.scss */
table.products-collection-table th.main-info, td.buyingPrice, td.multiplyingFactor, td.priceWithTax { table.products-collection-table th.main-info, td.buyingPrice, td.multiplyingFactor, td.priceWithTax {
background: #eeeeee; background: #eeeeee;
background-clip: padding-box; background-clip: padding-box;
text-decoration: underline; text-decoration: underline;
} }


/* line 265, ../../sass/backend/custom.scss */
/* line 301, ../../sass/backend/custom.scss */
table.products-collection-table tr.disabled { table.products-collection-table tr.disabled {
opacity: 0.5; opacity: 0.5;
} }


/* line 266, ../../sass/backend/custom.scss */
/* line 302, ../../sass/backend/custom.scss */
.table-striped tbody .tr-sep { .table-striped tbody .tr-sep {
border-top: 2px solid #888; border-top: 2px solid #888;
} }


/* DeliveryZone */ /* DeliveryZone */
/* line 270, ../../sass/backend/custom.scss */
/* line 306, ../../sass/backend/custom.scss */
#autocomplete-cities { #autocomplete-cities {
position: relative; position: relative;
} }


/* line 274, ../../sass/backend/custom.scss */
/* line 310, ../../sass/backend/custom.scss */
#autocomplete-cities .ui-autocomplete { #autocomplete-cities .ui-autocomplete {
left: 30%; left: 30%;
top: 41px; top: 41px;
margin-left: 18px; margin-left: 18px;
} }


/* line 280, ../../sass/backend/custom.scss */
/* line 316, ../../sass/backend/custom.scss */
.head-reminders { .head-reminders {
margin-top: 15px; margin-top: 15px;
} }


/* TABLEAU DE BORD */ /* TABLEAU DE BORD */
/* line 283, ../../sass/backend/custom.scss */
/* line 319, ../../sass/backend/custom.scss */
.todo-list > li { .todo-list > li {
position: relative; position: relative;
} }


/* line 284, ../../sass/backend/custom.scss */
/* line 320, ../../sass/backend/custom.scss */
.todo-list > li .text { .todo-list > li .text {
margin-left: 30px; margin-left: 30px;
} }


/* line 285, ../../sass/backend/custom.scss */
/* line 321, ../../sass/backend/custom.scss */
.todo-list > li .tools { .todo-list > li .tools {
position: absolute; position: absolute;
top: 4px; top: 4px;
right: 15px; right: 15px;
} }


/* line 287, ../../sass/backend/custom.scss */
/* line 323, ../../sass/backend/custom.scss */
#addTicketMessageForm { #addTicketMessageForm {
margin-top: 30px; margin-top: 30px;
border-top: 2px dotted #eee; border-top: 2px dotted #eee;
padding-top: 30px; padding-top: 30px;
} }


/* line 289, ../../sass/backend/custom.scss */
/* line 325, ../../sass/backend/custom.scss */
#dashboard .list-btn-statistic { #dashboard .list-btn-statistic {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
justify-content: center; justify-content: center;
} }


/* line 290, ../../sass/backend/custom.scss */
/* line 326, ../../sass/backend/custom.scss */
#dashboard .btn-statistic { #dashboard .btn-statistic {
width: 120px; width: 120px;
height: 70px; height: 70px;
line-height: 1rem; line-height: 1rem;
} }


/* line 291, ../../sass/backend/custom.scss */
/* line 327, ../../sass/backend/custom.scss */
#dashboard .btn-statistic small { #dashboard .btn-statistic small {
margin-bottom: 10px; margin-bottom: 10px;
display: block; display: block;
} }


/* line 292, ../../sass/backend/custom.scss */
/* line 328, ../../sass/backend/custom.scss */
#dashboard .btn-statistic .value { #dashboard .btn-statistic .value {
display: block; display: block;
} }


/* line 294, ../../sass/backend/custom.scss */
/* line 330, ../../sass/backend/custom.scss */
#dashboard #range_date_interval { #dashboard #range_date_interval {
margin-bottom: 20px; margin-bottom: 20px;
} }


/* line 295, ../../sass/backend/custom.scss */
/* line 331, ../../sass/backend/custom.scss */
#dashboard #range_date_interval label { #dashboard #range_date_interval label {
float: left; float: left;
margin-right: 20px; margin-right: 20px;
} }


/* line 296, ../../sass/backend/custom.scss */
/* line 332, ../../sass/backend/custom.scss */
#dashboard #range_date_interval .form-check { #dashboard #range_date_interval .form-check {
float: left; float: left;
margin-right: 10px; margin-right: 10px;
} }


/* line 297, ../../sass/backend/custom.scss */
/* line 333, ../../sass/backend/custom.scss */
#dashboard .table-condensed .btn, #dashboard .table-condensed .btn-sm { #dashboard .table-condensed .btn, #dashboard .table-condensed .btn-sm {
white-space: nowrap; white-space: nowrap;
} }


/* Tickets */ /* Tickets */
/* line 303, ../../sass/backend/custom.scss */
/* line 339, ../../sass/backend/custom.scss */
#ticket-list .btn-sm { #ticket-list .btn-sm {
display: block; display: block;
} }


/* line 309, ../../sass/backend/custom.scss */
/* line 345, ../../sass/backend/custom.scss */
#toast-container { #toast-container {
width: 350px; width: 350px;
} }


/* line 310, ../../sass/backend/custom.scss */
/* line 346, ../../sass/backend/custom.scss */
.toast { .toast {
float: right; float: right;
} }


/* line 312, ../../sass/backend/custom.scss */
/* line 348, ../../sass/backend/custom.scss */
#toast-container:before:hover { #toast-container:before:hover {
opacity: 1; opacity: 1;
cursor: pointer; cursor: pointer;
} }


/* line 316, ../../sass/backend/custom.scss */
/* line 352, ../../sass/backend/custom.scss */
#toast-close-all { #toast-close-all {
border: 0; border: 0;
position: absolute; position: absolute;

+ 84
- 0
ShopBundle/Resources/public/js/backend/script/default/init-common.js View File

initButtonConfirm() initButtonConfirm()
initNotice(); initNotice();
initBtnEditReminder(); initBtnEditReminder();
initBtnWriteToUser();
initCollectionWidget()
$('form').on('focus', 'input[type=number]', function (e) { $('form').on('focus', 'input[type=number]', function (e) {
$(this).on('wheel.disableScroll', function (e) { $(this).on('wheel.disableScroll', function (e) {
e.preventDefault() e.preventDefault()
}); });


} }
function initBtnWriteToUser(){
$('#btn-ticket-write-to-user').on('click', function () {
$btn = $(this);
var order = '';
if($btn.data('order')) {
order = '&orderId=' + $btn.data('order');
}
$.ajax({
url: $btn.data('url'),
data: "user="+$btn.data('user')+order,
method: "POST",
dataType: "json",
success: function (response) {
$('body').append(response.modal);
initModalNewTicket();
}
});
});
}
function initModalNewTicket(){
$('#modal-new-ticket select.form-control').each(function (i, elm) {
if (!$(this).hasClass('disable-select2')) {
setSelect2($(elm));
}
});
$('#modal-new-ticket').modal('show');
log($('#modal-new-ticket .btn-save'));
$('#modal-new-ticket .btn-save').on('click', function (){
$form = $(this).parents('form');
if(checkFormValidity('#'+$form.prop('id'))) {
$('#modal-new-ticket').modal('hide');

$.ajax({
url: $form.prop('action'),
data: $form.serialize(),
method: $form.prop('method'),
dataType: "json",
success: function (response) {
setFlashMessages(response.flashMessages);
$('#modal-new-ticket').remove();
}
});
}
})
}


function initCollectionWidget(){
$('.form-widget-compound>div[data-prototype]').each(function (i,collectionWidget){
resetNumItemsCollectionField($(collectionWidget));
$(collectionWidget).on('easyadmin.collection.item-added', function (){
resetNumItemsCollectionField($(this));
})
});

}

function resetNumItemsCollectionField($collectionWidget){
numItems = $collectionWidget.children('div.form-group').length;
$collectionWidget.children('div.form-group').each(function (i,item){
$field = $(item).find('input[type="text"]');

//Chanegment ID
posId = $field.prop('id').lastIndexOf('_') + 1;
idPrefix = $field.prop('id').substr(0, posId);
$field.prop('id', idPrefix+i);

//Chanegment Name
posName = $field.prop('name').lastIndexOf('[') + 1;
namePrefix = $field.prop('name').substr(0, posName);
$field.prop('name', namePrefix+i+']');

$(item).find('.field-collection-item-action').remove();
$(item).find('.field-collection-item-row').append('<button style="border:0px; background: none; " class="field-collection-item-action field-collection-item-remove" type="button">&times;</button>');
});

$collectionWidget.find('.field-collection-item-remove').off('click');
$collectionWidget.find('.field-collection-item-remove').on('click', function (){
$(this).parents('.form-group:first').remove();
resetNumItemsCollectionField($collectionWidget);
});
}

+ 4
- 0
ShopBundle/Resources/public/js/backend/script/merchant/vuejs-merchant.js View File

{ {
name: 'maintenance', name: 'maintenance',
nameDisplay: 'Maintenance' nameDisplay: 'Maintenance'
},
{
name: 'lunch',
nameDisplay: 'Repas du midi'
} }
] ]
}, window.addressValues, window.merchantPanelOrderValues); }, window.addressValues, window.merchantPanelOrderValues);

+ 15
- 2
ShopBundle/Resources/public/js/backend/script/productfamily/vuejs-product-family.js View File

// Reference array sent to dynamic staticRenderFns // Reference array sent to dynamic staticRenderFns
var staticRenderFns = []; var staticRenderFns = [];
$(window).on('load', function () { $(window).on('load', function () {
/*var appProductFamily ;
lcInitProductFamily() ;*/


Vue.component('product-unit-price', { Vue.component('product-unit-price', {
mixins: [mixinUnit, mixinPrice, mixinTemplate], mixins: [mixinUnit, mixinPrice, mixinTemplate],
watch: {} watch: {}
}); });



appProductFamily = new Vue({ appProductFamily = new Vue({
el: '#lc-product-family-edit', el: '#lc-product-family-edit',
mixins: [mixinReduction], mixins: [mixinReduction],
activeProducts: false, activeProducts: false,
giftVoucherActive: false, giftVoucherActive: false,
productsQuantityAsTitle: false, productsQuantityAsTitle: false,
section: null,
formProducts: {}, formProducts: {},
currentSection: 'general', currentSection: 'general',
sectionsArray: [ sectionsArray: [
} }


} }
this.sectionHasChanged();
this.initLcSortableProductsList(); this.initLcSortableProductsList();
}); });


if (typeof this.$refs.productUnitPrice !== 'undefined') { if (typeof this.$refs.productUnitPrice !== 'undefined') {
return this.$refs.productUnitPrice.behaviorPrice; return this.$refs.productUnitPrice.behaviorPrice;
} }
},
sectionHasChanged: function (){
$('.product-categories').find('.form-check-input:not(.none)').prop('disabled', true);
$('.product-categories').find('.form-check-input[data-section="'+this.section+'"]:not(.none)').prop('disabled', false);
} }
}, },
watch: { watch: {
title: function () { title: function () {
this.updateChild() this.updateChild()
}, },
section: function (){
this.sectionHasChanged()
},
propertyNoveltyExpirationDateActive: function () { propertyNoveltyExpirationDateActive: function () {
if(!this.propertyNoveltyExpirationDateActive){ if(!this.propertyNoveltyExpirationDateActive){
this.propertyNoveltyExpirationDate = null; this.propertyNoveltyExpirationDate = null;
for (var key in formProductTemplate) { for (var key in formProductTemplate) {
appProductFamily.formProducts[key] = formProductTemplate[key]; appProductFamily.formProducts[key] = formProductTemplate[key];
} }

}); });

function lcInitProductFamily() {

}

+ 3
- 2
ShopBundle/Resources/public/js/backend/script/user/init-edit.js View File

dataType: "json", dataType: "json",
success: function (response) { success: function (response) {
setFlashMessages(response.flashMessages); setFlashMessages(response.flashMessages);
$('body').append(response.data);
$('body').append(response.data).ready(function () {
initCollectionWidget();
});
$('#modal-user-address').modal('show'); $('#modal-user-address').modal('show');
$('#modal-user-address').on('hidden.bs.modal', function (e) { $('#modal-user-address').on('hidden.bs.modal', function (e) {
$('#modal-user-address').remove(); $('#modal-user-address').remove();
appUserAddress = null; appUserAddress = null;
function initUserAddressForm(form, btn) { function initUserAddressForm(form, btn) {
appUserAddress = null; appUserAddress = null;

$(form).find('button').off('click'); $(form).find('button').off('click');
$(form).find('button').on('click', function () { $(form).find('button').on('click', function () {
if(checkFormValidity('#'+$(form).prop('id'))) { if(checkFormValidity('#'+$(form).prop('id'))) {

+ 41
- 4
ShopBundle/Resources/public/sass/backend/custom.scss View File

.dataTables_length, .dataTables_filter{padding: .75rem 1.25rem 0.25rem;} .dataTables_length, .dataTables_filter{padding: .75rem 1.25rem 0.25rem;}


table.fixedHeader-floating{margin-top: 0px !important;} table.fixedHeader-floating{margin-top: 0px !important;}
table th.sorting_asc, table th.sorting_desc{border-top:3px solid var(--success);}
.card-body table.lc-table-list th.sorted, table th.sorting_asc, table th.sorting_desc{border-top:2px solid var(--success);}
table th.sorting_asc, table th.sorting_desc{border-top:2px solid var(--success);}
.card-body table.lc-table-list th.filtered{border-top:2px solid var(--primary);}
/*.card-body table.lc-table-list th{border-top:3px solid var(--success);}*/ /*.card-body table.lc-table-list th{border-top:3px solid var(--success);}*/
table th.filtered{border-top:3px solid var(--primary);}
table th.filtered{border-top:2px solid var(--primary);}
.card-body table.lc-table-list th.sorted, table th.sorting_asc, table th.sorting_desc{border-top:2px solid var(--success);}
.card-body table.lc-table-list th.sorted.filtered{border-top:0px; position: relative;}
.card-body table.lc-table-list th.sorted.filtered:after{ content: ''; height: 2px; position: absolute; left: 0; width: 100%; right: 0; top: -1px; background: linear-gradient(to right, var(--success) 0%, var(--success) 50%, var(--primary) 50%, var(--primary) 100%);}




.lc-table-list thead a{color: #212529} .lc-table-list thead a{color: #212529}
#switch-merchant { #switch-merchant {
min-width: 170px ; min-width: 170px ;
} }
/*************************** PAGINATION *******************************/
.pagination{justify-content: center;}
.disabled .page-link{color: #343a40;}
.disabled .page-link:hover, .page-link.current:hover{background-color: #fff; cursor: default;}



/* Sortable */ /* Sortable */


.field-price .input-group.priceByRefUnitWithTax input,.field-price .input-group.priceByRefUnitWithTax .input-group-text{font-weight: bold; border-color: #222 } .field-price .input-group.priceByRefUnitWithTax input,.field-price .input-group.priceByRefUnitWithTax .input-group-text{font-weight: bold; border-color: #222 }
.input-group.multiplyingFactor input,.input-group.multiplyingFactor .input-group-text{font-weight: bold; border-color: #222 } .input-group.multiplyingFactor input,.input-group.multiplyingFactor .input-group-text{font-weight: bold; border-color: #222 }



.layout-ajax {
#edit-productfamily-form {
.card-sections {
width: 100%;
position: fixed;
left: 0px;
top: 0px;
z-index: 10;
}

.form {
padding-top: 50px;
}

.card-footer {
display: none;
}

.in-advanced-editing-table {
.form {
padding-top: 0px ;
}
.card-sections,
.row-note {
display: none;
}
}
}
}


/* ORDER */ /* ORDER */


-webkit-box-shadow: 0 0 12px #999; -webkit-box-shadow: 0 0 12px #999;
box-shadow: 0 0 12px #999; box-shadow: 0 0 12px #999;
} }


+ 20
- 1
ShopBundle/Resources/translations/lcshop.fr.yaml View File

Statistic: Statistic:
title: Statistiques title: Statistiques
ProductFamily: ProductFamily:
status: Espaces et statuts
addresses: Livraisons & facturation addresses: Livraisons & facturation
main: Général main: Général
products: Déclinaisons products: Déclinaisons
email: Email email: Email
delivery: Livraison delivery: Livraison
maintenance: Maintenance maintenance: Maintenance
lunch: Repas du midi
Address: Address:
listLoopBesancon: Adresses de Besançon à spécifier (lat / long) listLoopBesancon: Adresses de Besançon à spécifier (lat / long)


editStockNoQuantityDefault: "Le stock n'a pas été modifié pour le produit #%id% (Aucune quantité par défaut)" editStockNoQuantityDefault: "Le stock n'a pas été modifié pour le produit #%id% (Aucune quantité par défaut)"
field: field:
default: default:
section: Espace
unit: Unité
placeholder: Choisissez une option placeholder: Choisissez une option
deliveryPointSale: Lieu de livraison deliveryPointSale: Lieu de livraison
deliveryAvailabilty: Créneau de livraison deliveryAvailabilty: Créneau de livraison
purchaseOrderEmailContent: "Contenu par défaut de l'email envoyé aux producteurs" purchaseOrderEmailContent: "Contenu par défaut de l'email envoyé aux producteurs"
dateStart: Date de début dateStart: Date de début
dateEnd: Date de fin dateEnd: Date de fin
messageLunchOpen: Message (section ouverte)
messageLunchClosed: Message (section fermée)
displaySpecificDay: Disponible un jour spécifique
groupUsers: Groupes
ticketTypesNotification: Catégorie ticket


PointSale: PointSale:
code: Code code: Code
displayTotalWeightInPurchaseOrder: Afficher le poids total dans les bons de commande displayTotalWeightInPurchaseOrder: Afficher le poids total dans les bons de commande


ProductFamily: ProductFamily:
sections: Espace où le produit est vendu
taxRateInherited: Utiliser la TVA par défaut taxRateInherited: Utiliser la TVA par défaut
activeProducts: Activer les déclinaisons activeProducts: Activer les déclinaisons
productsType: Type de déclinaisons productsType: Type de déclinaisons
quantityOrder: Quantité commandé quantityOrder: Quantité commandé
quantityProduct: Quantité (en rapport à l'unité) quantityProduct: Quantité (en rapport à l'unité)
unit: Unité unit: Unité
OrderShopLunch:
deliveryTypeOptions:
point-sale: En ambassade
home: À domicile
OrderShop: OrderShop:
hasReach: Étape atteinte hasReach: Étape atteinte
deliveryTrucks: Véhicules de livraison deliveryTrucks: Véhicules de livraison
type: Catégorie type: Catégorie
message: Votre réponse message: Votre réponse
typeOptions: typeOptions:
message-from-pdl: Messsage de l'équipe Place du Local
general-question: Questions générales general-question: Questions générales
product-unavailable: Produit manquant product-unavailable: Produit manquant
product-error: Erreur sur un produit product-error: Erreur sur un produit
days: Par jour days: Par jour
week: Par semaine week: Par semaine
month: Par mois month: Par mois

User:
isSaleAlwaysOpen: Commandes toujours ouvertes
action: action:
apply: Appliquer apply: Appliquer
new: Créer %entity_label% new: Créer %entity_label%
logout: Me déconnecter logout: Me déconnecter
address: Adresse utilisateur address: Adresse utilisateur
switch: Prendre la main switch: Prendre la main

order: order:
addOrderProduct: Ajouter un produit addOrderProduct: Ajouter un produit
addReductionCart: Ajouter une réduction addReductionCart: Ajouter une réduction
add: Ajouter un pense-bête add: Ajouter un pense-bête
address: address:
add: Ajouter une adresse add: Ajouter une adresse
ticket:
writeToUser: Écrire à l'utilisateur
resetting: resetting:
check_email: | check_email: |
Un e-mail vous a été envoyé. Il contient un lien sur lequel il vous faudra cliquer pour réinitialiser votre mot de passe. Si vous ne recevez pas d'email, vérifiez votre dossier spam ou essayez à nouveau. Un e-mail vous a été envoyé. Il contient un lien sur lequel il vous faudra cliquer pour réinitialiser votre mot de passe. Si vous ne recevez pas d'email, vérifiez votre dossier spam ou essayez à nouveau.

+ 19
- 10
ShopBundle/Resources/views/backend/default/block/actions.html.twig View File

{% if action.group is defined and action.group==true %} {% if action.group is defined and action.group==true %}
{% set dropdownAction = dropdownAction|merge({(loop.index0): action}) %} {% set dropdownAction = dropdownAction|merge({(loop.index0): action}) %}
{% else %} {% else %}
{% set display_button = true %}

{% if 'list' == action.name %} {% if 'list' == action.name %}
{% set action_href = request_parameters.referer|default('') ? request_parameters.referer|easyadmin_urldecode : path('easyadmin', request_parameters|merge({ action: 'list' })) %} {% set action_href = request_parameters.referer|default('') ? request_parameters.referer|easyadmin_urldecode : path('easyadmin', request_parameters|merge({ action: 'list' })) %}
{% elseif 'method' == action.type %} {% elseif 'method' == action.type %}
{% set action_href = path('easyadmin', request_parameters|merge({ action: action.name, id: item_id })) %} {% set action_href = path('easyadmin', request_parameters|merge({ action: action.name, id: item_id })) %}
{% elseif 'route' == action.type %} {% elseif 'route' == action.type %}
{% set action_href = path(action.name, request_parameters|merge({ action: action.name, id: item_id })) %} {% set action_href = path(action.name, request_parameters|merge({ action: action.name, id: item_id })) %}
{% elseif 'productfamily_advanced_editing' == action.type %}
{% set action_href = path('easyadmin', request_parameters|merge({ action: action.action, id: item_id })) %}
{% if action.name == 'products' and not item.activeProducts %}
{% set display_button = false %}
{% endif %}
{% endif %} {% endif %}


{{ include(action.template, {
action: action,
action_href: action_href,
is_dropdown: is_dropdown|default(false),
item: item,
item_id: item_id,
request_parameters: request_parameters,
translation_domain: translation_domain,
trans_parameters: trans_parameters,
}, with_context = false) }}
{% if display_button %}
{{ include(action.template, {
action: action,
action_href: action_href,
is_dropdown: is_dropdown|default(false),
item: item,
item_id: item_id,
request_parameters: request_parameters,
translation_domain: translation_domain,
trans_parameters: trans_parameters,
}, with_context = false) }}
{% endif %}
{% endif %} {% endif %}
{% endfor %} {% endfor %}
{% if dropdownAction|length > 0 %} {% if dropdownAction|length > 0 %}

+ 2
- 2
ShopBundle/Resources/views/backend/default/block/list_tickets.html.twig View File

<td>{{ ticket.subject }}</td> <td>{{ ticket.subject }}</td>
<td> <td>
{% set value = ticket.status %} {% set value = ticket.status %}
{% include '@LcShop/backend/default/list-fields/field_ticket_status.html.twig' %}
{% include '@LcShop/backend/default/field/ticket_status.html.twig' %}
</td> </td>
<td> <td>
{% set item = ticket %} {% set item = ticket %}
{% include '@LcShop/backend/default/list-fields/field_ticket_last_message.html.twig' %}
{% include '@LcShop/backend/default/field/ticket_last_message.html.twig' %}
</td> </td>
<td> <td>
<a class="btn-sm btn-success" href="{{ path('easyadmin', {id: ticket.id, entity: 'Ticket', action: 'show'}) }}"> <a class="btn-sm btn-success" href="{{ path('easyadmin', {id: ticket.id, entity: 'Ticket', action: 'show'}) }}">

+ 103
- 0
ShopBundle/Resources/views/backend/default/block/paginator.html.twig View File

{% trans_default_domain 'EasyAdminBundle' %}

{% set _paginator_request_parameters = _request_parameters|merge({'referer': null}) %}

{% if paginator.haveToPaginate %}
<div class="list-pagination">
<div class="row">
<div class="col-sm-3 hidden-xs list-pagination-counter">
{{ 'paginator.counter'|trans({ '%start%': paginator.currentPageOffsetStart, '%end%': paginator.currentPageOffsetEnd, '%results%': paginator.nbResults})|raw }}
</div>
<div class="col-xs-12 col-sm-9">
<ul class="pagination list-pagination-paginator {{ 1 == paginator.currentPage ? 'first-page' : '' }} {{ paginator.hasNextPage ? '' : 'last-page' }}">
{% if 1 == paginator.currentPage %}
<li class="disabled">
<span class="page-link ">
<i class="fa fa-angle-double-left"></i>
</span>
</li>
{% else %}
<li>
<a class="page-link"
href="{{ path('easyadmin', _paginator_request_parameters|merge({ page: 1 }) ) }}">
<i class="fa fa-angle-double-left"></i>
</a>
</li>
{% endif %}

{% if paginator.hasPreviousPage %}
<li>
<a class="page-link"
href="{{ path('easyadmin', _paginator_request_parameters|merge({ page: paginator.previousPage }) ) }}">
<i class="fa fa-angle-left"></i>
</a>
</li>
{% else %}
<li class="disabled">
<span class="page-link">
<i class="fa fa-angle-left"></i>
</span>
</li>
{% endif %}

{# BEGIN DISPLAYING PAGE NUMBERS #}

{# the number of pages that are displayed around the active page #}
{% set nearbyPagesLimit = 8 %}

{% if paginator.currentPage > 1 %}
{% for i in range(paginator.currentPage-nearbyPagesLimit, paginator.currentPage-1) if ( i > 0 ) %}
<li >
<a class="page-link"
href="{{ path('easyadmin', _paginator_request_parameters|merge({ page: i }) ) }}">{{ i }}</a>
</li>
{% endfor %}
{% endif %}
<li>
<a class="current page-link">{{ paginator.currentPage }}</a>
</li>
{% if paginator.currentPage < paginator.nbPages %}
{% for i in range(paginator.currentPage+1, paginator.currentPage + nearbyPagesLimit) if ( i <= paginator.nbPages ) %}
<li>
<a class="page-link"
href="{{ path('easyadmin', _paginator_request_parameters|merge({ page: i }) ) }}">{{ i }}</a>
</li>
{% endfor %}
{% endif %}

{# END DISPLAYING PAGE NUMBERS #}

{% if paginator.hasNextPage %}
<li>
<a class="page-link"
href="{{ path('easyadmin', _paginator_request_parameters|merge({ page: paginator.nextPage }) ) }}">
<i class="fa fa-angle-right"></i>
</a>
</li>
{% else %}
<li class="disabled">
<span class="page-link">
<i class="fa fa-angle-right"></i>
</span>
</li>
{% endif %}

{% if paginator.currentPage < paginator.nbPages %}
<li>
<a class="page-link"
href="{{ path('easyadmin', _paginator_request_parameters|merge({ page: paginator.nbPages }) ) }}">
<i class="fa fa-angle-double-right"></i>
</a>
</li>
{% else %}
<li class="disabled">
<span class="page-link">
<i class="fa fa-angle-double-right"></i>
</span>
</li>
{% endif %}
</ul>
</div>
</div>
</div>
{% endif %}

+ 34
- 0
ShopBundle/Resources/views/backend/default/edit-ajax.html.twig View File

{% form_theme form with easyadmin_config('design.form_theme') only %}

{% set _entity_config = easyadmin_entity(app.request.query.get('entity')) %}
{% set _entity_id = attribute(entity, _entity_config.primary_key_field_name) %}
{% trans_default_domain _entity_config.translation_domain %}

{% set _trans_parameters = { '%entity_name%': _entity_config.name|trans, '%entity_label%': _entity_config.label|trans, '%entity_id%': _entity_id } %}

{% extends '@LcShop/backend/default/layout/layout-ajax.html.twig' %}

{% block ajax %}
{% block entity_form %}
{{ form(form) }}
{% endblock entity_form %}

{% block head_stylesheets %}
{{ parent() }}
<link rel="stylesheet"
href="{{ asset('bundles/lcshop/css/backend/adminlte/plugins/jquery-ui/jquery-ui.min.css') }}">
{% endblock %}

{% block plugin_javascript %}
{{ parent() }}
<script src="{{ asset('bundles/lcshop/js/backend/plugin/jquery-ui/jquery-ui.min.js') }}"></script>
<script type="text/javascript">
var CKEDITOR_BASEPATH = "{{ ckeditor_base_path("/bundles/fosckeditor/") }}";
</script>
<script type="text/javascript" src="{{ asset('bundles/fosckeditor/ckeditor.js') }}"></script>
{% endblock %}

{% block script_javascript %}
<script src="{{ asset('bundles/lcshop/js/backend/script/default/init-edit.js') }}"></script>
{% endblock %}
{% endblock %}

ShopBundle/Resources/views/backend/default/list-fields/list_association.html.twig → ShopBundle/Resources/views/backend/default/field/association.html.twig View File


ShopBundle/Resources/views/backend/default/list-fields/list_association_users.html.twig → ShopBundle/Resources/views/backend/default/field/association_users.html.twig View File


ShopBundle/Resources/views/backend/default/list-fields/field_badge.html.twig → ShopBundle/Resources/views/backend/default/field/badge.html.twig View File


ShopBundle/Resources/views/backend/default/list-fields/list_children.html.twig → ShopBundle/Resources/views/backend/default/field/children.html.twig View File


ShopBundle/Resources/views/backend/default/list-fields/field_date.html.twig → ShopBundle/Resources/views/backend/default/field/date.html.twig View File


ShopBundle/Resources/views/backend/default/list-fields/field_datetime.html.twig → ShopBundle/Resources/views/backend/default/field/datetime.html.twig View File


ShopBundle/Resources/views/backend/default/list-fields/list_day.html.twig → ShopBundle/Resources/views/backend/default/field/day.html.twig View File


ShopBundle/Resources/views/backend/default/list-fields/field_options_translatable.html.twig → ShopBundle/Resources/views/backend/default/field/options_translatable.html.twig View File


ShopBundle/Resources/views/backend/default/list-fields/field_price.html.twig → ShopBundle/Resources/views/backend/default/field/price.html.twig View File


ShopBundle/Resources/views/backend/default/list-fields/field_product_family_available_quantity.html.twig → ShopBundle/Resources/views/backend/default/field/product_family_available_quantity.html.twig View File


ShopBundle/Resources/views/backend/default/list-fields/field_product_family_total_product_ordered.html.twig → ShopBundle/Resources/views/backend/default/field/product_family_total_product_ordered.html.twig View File


+ 3
- 0
ShopBundle/Resources/views/backend/default/field/supplier.html.twig View File

{% if link_parameters is defined %}
<a href="{{ path('easyadmin', link_parameters|merge({entity: 'Supplier', referer: '' })) }}">{{ value|easyadmin_truncate }}</a>
{% endif %}

ShopBundle/Resources/views/backend/default/list-fields/field_ticket_last_message.html.twig → ShopBundle/Resources/views/backend/default/field/ticket_last_message.html.twig View File


ShopBundle/Resources/views/backend/default/list-fields/field_ticket_status.html.twig → ShopBundle/Resources/views/backend/default/field/ticket_status.html.twig View File


+ 9
- 0
ShopBundle/Resources/views/backend/default/field/toggle.html.twig View File

{% trans_default_domain 'EasyAdminBundle' %}

{% block toggle %}
<div class="custom-control custom-switch custom-switch-on-success custom-switch-off-danger" data-propertyname="{{ field_options.property }}">
<input type="checkbox" class="custom-control-input" id="customSwitch{{ item.id }}-{{ field_options.property }}" {{ value == true ? 'checked' }}>
<label class="custom-control-label" for="customSwitch{{ item.id }}-{{ field_options.property }}">{% block label %}{{ field_options.label }}{% endblock %}</label>
</div>
{% endblock %}


ShopBundle/Resources/views/backend/default/list-fields/field_total.html.twig → ShopBundle/Resources/views/backend/default/field/total.html.twig View File


+ 24
- 1
ShopBundle/Resources/views/backend/default/layout/layout-ajax.html.twig View File

{% trans_default_domain "lcshop" %} {% trans_default_domain "lcshop" %}


<div class="layout-ajax">
{% block ajax %} {% block ajax %}
{% block head_stylesheets %}
<link rel="stylesheet" href="{{ asset('bundles/lcshop/css/backend/adminlte/plugins/fontawesome-free/css/all.min.css') }}">
<link rel="stylesheet" href="{{ asset('bundles/lcshop/css/backend/adminlte/adminlte.css') }}">
<link rel="stylesheet" href="{{ asset('bundles/lcshop/css/backend/custom.css') }}">
{% endblock %}


{% endblock %}
{% block plugin_javascript %}
<!-- jQuery -->
<script src="{{ asset('bundles/lcshop/js/backend/plugin/jquery/jquery.min.js') }}"></script>
<!-- Bootstrap 4 -->
<script src="{{ asset('bundles/lcshop/js/backend/plugin/bootstrap/bootstrap.bundle.min.js') }}"></script>
<script src="{{ asset('bundles/lcshop/js/backend/plugin/toastr/toastr.min.js') }}"></script>
<script src="{{ asset('bundles/lcshop/js/backend/plugin/select2/select2.full.min.js') }}"></script>
<script src="{{ asset('bundles/lcshop/js/backend/plugin/bootstrap/bootstrap-switch.min.js') }}"></script>
<!-- AdminLTE App -->
<script src="{{ asset('bundles/lcshop/js/backend/plugin/adminlte.min.js') }}"></script>
<script src="{{ asset('bundles/lcshop/js/backend/script/default/utils.js') }}"></script>
{% endblock plugin_javascript %}

{% block script_javascript %}
<script src="{{ asset('bundles/lcshop/js/backend/script/default/init-common.js') }}"></script>
{% endblock script_javascript %}
{% endblock %}
</div>

+ 0
- 14
ShopBundle/Resources/views/backend/default/list-fields/field_toggle.html.twig View File

{% trans_default_domain 'EasyAdminBundle' %}

<div class="custom-control custom-switch custom-switch-on-success custom-switch-off-danger" data-propertyname="{{ field_options.property }}">
<input type="checkbox" class="custom-control-input" id="customSwitch{{ item.id }}-{{ field_options.property }}" {{ value == true ? 'checked' }}>
<label class="custom-control-label" for="customSwitch{{ item.id }}-{{ field_options.property }}">{{ field_options.label }}</label>
</div>
{#

{% if value == true %}
<span class="badge badge-success">{{ 'label.true'|trans }}</span>
{% else %}
<span class="badge badge-danger">{{ 'label.false'|trans }}</span>
{% endif %}
#}

+ 39
- 13
ShopBundle/Resources/views/backend/default/list.html.twig View File

sortField: app.request.get('sortField'), sortField: app.request.get('sortField'),
sortDirection: app.request.get('sortDirection'), sortDirection: app.request.get('sortDirection'),
page: app.request.get('page', 1), page: app.request.get('page', 1),
maxResults: app.request.get('maxResults', _entity_config.list.max_results),
filters: app.request.get('filters', []), filters: app.request.get('filters', []),
referer: null referer: null
}) %} }) %}
{% set _has_filters = _entity_config.list.filters|default(false) %} {% set _has_filters = _entity_config.list.filters|default(false) %}


{% block body_id 'easyadmin-list-' ~ _entity_config.name %} {% block body_id 'easyadmin-list-' ~ _entity_config.name %}
{#{% block body_class 'list list-' ~ _entity_config.name|lower %}#}
{# {% block body_class 'list list-' ~ _entity_config.name|lower %} #}


{% block content_title %} {% block content_title %}
{% apply spaceless %} {% apply spaceless %}
{% endblock %} {% endblock %}


{% block global_actions %} {% block global_actions %}
{#{% if easyadmin_action_is_enabled_for_list_view('new', _entity_config.name) %}
{# {% if easyadmin_action_is_enabled_for_list_view('new', _entity_config.name) %}
{% set _action = easyadmin_get_action_for_list_view('new', _entity_config.name) %} {% set _action = easyadmin_get_action_for_list_view('new', _entity_config.name) %}
{% block new_action %} {% block new_action %}
<div class="button-action"> <div class="button-action">
</a> </a>
</div> </div>
{% endblock new_action %} {% endblock new_action %}
{% endif %}#}
{% endif %} #}
{% endblock global_actions %} {% endblock global_actions %}


{% block batch_actions %} {% block batch_actions %}
{% set _fields_visible_by_user = fields|filter((metadata, field) => easyadmin_is_granted(metadata.permission)) %} {% set _fields_visible_by_user = fields|filter((metadata, field) => easyadmin_is_granted(metadata.permission)) %}
{% set _number_of_hidden_results = 0 %} {% set _number_of_hidden_results = 0 %}
{% set _list_item_actions = easyadmin_get_actions_for_list_item(_entity_config.name) %} {% set _list_item_actions = easyadmin_get_actions_for_list_item(_entity_config.name) %}
<div class="row">
<div class="row" id="{% block list_id %}{% endblock %}">
<div class="col-12"> <div class="col-12">
<div class="card card-outline card-primary"> <div class="card card-outline card-primary">
<div class="card-header"> <div class="card-header">
{% block card_header %} {% block card_header %}

<h2 class="card-title text-lg "> <h2 class="card-title text-lg ">
<div class="btn-group">
{% set itemsPerPage = [10,20,30,50,100,200] %}
{% for itemPerPage in itemsPerPage %}
<a href="{{ path('easyadmin', _request_parameters|merge({ maxResults: itemPerPage, page : "1" })) }}"
class="btn btn-sm {{ paginator.maxPerPage == itemPerPage ? 'btn-outline-secondary' : 'btn-secondary' }}">{{ itemPerPage }}</a>
{% endfor %}

</div>
{% block paginator_nb_results %} {% block paginator_nb_results %}
{#{{ "list.title"|trans({'%label%' : _entity_config['label']|lower }) }}#}
{# {{ "list.title"|trans({'%label%' : _entity_config['label']|lower }) }} #}
{% if paginator.nbResultsTotal != paginator.nbResults %} {% if paginator.nbResultsTotal != paginator.nbResults %}
<span data-toggle="tooltip" title="{{ "list.nbResultsFiltered"|trans }}" <span data-toggle="tooltip" title="{{ "list.nbResultsFiltered"|trans }}"
class="badge badge-info">{{ paginator.nbResults }} <i class="badge badge-info">{{ paginator.nbResults }} <i
{% set nextSortDirection = isSortingField ? (app.request.get('sortDirection') == 'DESC' ? 'ASC' : 'DESC') : 'DESC' %} {% set nextSortDirection = isSortingField ? (app.request.get('sortDirection') == 'DESC' ? 'ASC' : 'DESC') : 'DESC' %}
{% set _column_label = metadata.label|trans(_trans_parameters) %} {% set _column_label = metadata.label|trans(_trans_parameters) %}
{% set _column_icon = isSortingField ? (nextSortDirection == 'DESC' ? 'fa-arrow-up' : 'fa-arrow-down') : 'fa-sort' %} {% set _column_icon = isSortingField ? (nextSortDirection == 'DESC' ? 'fa-arrow-up' : 'fa-arrow-down') : 'fa-sort' %}
{% set isFilteredField = false %}
{% if filters_form[field] is defined and filters_form[field].vars.value is not empty %}
{% if (metadata['dataType'] == 'datetime' or metadata['dataType'] == 'date') %}
{% if filters_form[field]['dateStart'].vars.value is not empty and filters_form[field]['dateEnd'].vars.value is not empty %}
{% set isFilteredField = true %}
{% endif %}
{% else %}
{% set isFilteredField = true %}
{% endif %}
{% endif %}



<th class="{{ isSortingField ? 'sorted' }} {{ metadata.virtual ? 'virtual' }} {{ metadata.dataType|lower }} {{ metadata.css_class }}" {{ easyadmin_config('design.rtl') ? 'dir="rtl"' }}>
<th class="{{ isSortingField ? 'sorted' }} {{ isFilteredField ? 'filtered': '' }} {{ metadata.virtual ? 'virtual' }} {{ metadata.dataType|lower }} {{ metadata.css_class }}" {{ easyadmin_config('design.rtl') ? 'dir="rtl"' }}>
{% if metadata.sortable %} {% if metadata.sortable %}
<a href="{{ path('easyadmin', _request_parameters|merge({ page: 1, sortField: metadata.property, sortDirection: nextSortDirection })) }}"> <a href="{{ path('easyadmin', _request_parameters|merge({ page: 1, sortField: metadata.property, sortDirection: nextSortDirection })) }}">
{{ _column_label|raw }} <i class="fa fa-fw {{ _column_icon }}"></i> {{ _column_label|raw }} <i class="fa fa-fw {{ _column_icon }}"></i>
</tr> </tr>
{% endblock table_head %} {% endblock table_head %}
{% block table_filters %} {% block table_filters %}
{% set fieldAreNotEmpty = false %}
{% if filters_form is defined %} {% if filters_form is defined %}
<tr class="table-filters-line"> <tr class="table-filters-line">
{% if _has_batch_actions %} {% if _has_batch_actions %}
<th> <th>


{% if filters_form[field] is defined %} {% if filters_form[field] is defined %}

{% if filters_form[field].vars.value is not null and filters_form[field].vars.value is not empty %}{% set fieldAreNotEmpty = true %}{% endif %}
{% if metadata['dataType'] == 'datetime' or metadata['dataType'] == 'date' %} {% if metadata['dataType'] == 'datetime' or metadata['dataType'] == 'date' %}
<div class="input-group input-group-sm"> <div class="input-group input-group-sm">
<input type="text" <input type="text"
aria-label="{{ "action.apply"|trans({}, 'lcshop') }}"> aria-label="{{ "action.apply"|trans({}, 'lcshop') }}">
<i class="fa fa-search"></i> <i class="fa fa-search"></i>
</button> </button>
{% if filters_form.vars.submitted %}
<a href="{{ path('easyadmin', {action: app.request.get('action'), entity: _entity_config.name}) }}"
{% if filters_form.vars.submitted or fieldAreNotEmpty %}
<a href="{{ path('easyadmin', _request_parameters|merge({ 'filterClear' : 'clearAll', list_filter : null, referer : null })) }}"
class="btn btn-sm btn-warning lc-reset-filters" class="btn btn-sm btn-warning lc-reset-filters"
data-toggle="tooltip" data-toggle="tooltip"
title="{{ "action.reset"|trans({}, 'lcshop') }}" title="{{ "action.reset"|trans({}, 'lcshop') }}"
{% else %} {% else %}
{# the empty string concatenation is needed when the primary key is an object (e.g. an Uuid object) #} {# the empty string concatenation is needed when the primary key is an object (e.g. an Uuid object) #}
{% set _item_id = '' ~ attribute(item, _entity_config.primary_key_field_name) %} {% set _item_id = '' ~ attribute(item, _entity_config.primary_key_field_name) %}
<tr data-id="{{ _item_id }}">
<tr id="tr-entity-id-{{ _item_id }}" data-id="{{ _item_id }}">
{% if _has_batch_actions %} {% if _has_batch_actions %}
<td><input type="checkbox" class="form-batch-checkbox" <td><input type="checkbox" class="form-batch-checkbox"
value="{{ _item_id }}"></td> value="{{ _item_id }}"></td>




<td class="{{ isSortingField ? 'sorted' }} {{ metadata.dataType|lower }} {{ metadata.css_class }}" {{ easyadmin_config('design.rtl') ? 'dir="rtl"' }}> <td class="{{ isSortingField ? 'sorted' }} {{ metadata.dataType|lower }} {{ metadata.css_class }}" {{ easyadmin_config('design.rtl') ? 'dir="rtl"' }}>
{% if (field == 'title' or field== 'id') and (metadata.dataType=="string" or metadata.dataType=="integer") %}

{% if (field == 'title' or field== 'id') and (metadata.dataType=="string" or metadata.dataType=="integer") and _entity_config.name != 'ProductFamilyAdvancedEditing' %}
<a class="link-as-text" <a class="link-as-text"
href="{{ path('easyadmin', _request_parameters|merge({ action: 'edit', id: item.id })) }}"> href="{{ path('easyadmin', _request_parameters|merge({ action: 'edit', id: item.id })) }}">
{{ easyadmin_render_field_for_list_view(_entity_config.name, item, metadata) }} {{ easyadmin_render_field_for_list_view(_entity_config.name, item, metadata) }}
</a> </a>
{% else %} {% else %}
{# {% if metadatafieldName =="supplier" %}
{{ dump(metadata) }}
{% endif %} #}
{{ easyadmin_render_field_for_list_view(_entity_config.name, item, metadata) }} {{ easyadmin_render_field_for_list_view(_entity_config.name, item, metadata) }}
{% endif %} {% endif %}
</td> </td>
<script src="{{ asset('bundles/lcshop/js/backend/plugin/daterange/daterangepicker.js') }}"></script> <script src="{{ asset('bundles/lcshop/js/backend/plugin/daterange/daterangepicker.js') }}"></script>
<script src="{{ asset('bundles/lcshop/js/backend/plugin/datatables/jquery.highlight.js') }}"></script> <script src="{{ asset('bundles/lcshop/js/backend/plugin/datatables/jquery.highlight.js') }}"></script>
<script src="{{ asset('bundles/lcshop/js/backend/plugin/autocomplete/bootstrap-autocomplete.min.js') }}"></script> <script src="{{ asset('bundles/lcshop/js/backend/plugin/autocomplete/bootstrap-autocomplete.min.js') }}"></script>
{#<script src="{{ asset('bundles/lcshop/js/backend/plugin/datatables/responsive.bootstrap4.min.js') }}"></script>#}
{# <script src="{{ asset('bundles/lcshop/js/backend/plugin/datatables/responsive.bootstrap4.min.js') }}"></script> #}
{% endblock %} {% endblock %}


{% block script_javascript %} {% block script_javascript %}




<script type="text/javascript"> <script type="text/javascript">


$(document).ready(function () { $(document).ready(function () {
const toggles = document.querySelectorAll('.custom-switch input[type="checkbox"]'); const toggles = document.querySelectorAll('.custom-switch input[type="checkbox"]');
for (i = 0; i < toggles.length; i++) { for (i = 0; i < toggles.length; i++) {

+ 2
- 2
ShopBundle/Resources/views/backend/form/custom_bootstrap_4.html.twig View File

{% set _translation_domain = easyadmin.entity.translation_domain %} {% set _translation_domain = easyadmin.entity.translation_domain %}
{% set _trans_parameters = { '%entity_name%': easyadmin.entity.name|trans(domain = _translation_domain), '%entity_label%': easyadmin.entity.label|trans(domain = _translation_domain) } %} {% set _trans_parameters = { '%entity_name%': easyadmin.entity.name|trans(domain = _translation_domain), '%entity_label%': easyadmin.entity.label|trans(domain = _translation_domain) } %}


{# the 'save' action is hardcoded for the 'edit' and 'new' views #}
<button type="submit" name="save_and_leave" class="btn btn-primary action-save"> <button type="submit" name="save_and_leave" class="btn btn-primary action-save">
<span class="btn-label">{{ 'action.save'|trans(_trans_parameters, _translation_domain) }}</span> <span class="btn-label">{{ 'action.save'|trans(_trans_parameters, _translation_domain) }}</span>
</button> </button>

{% if easyadmin.entity.name =='ProductFamily' %} {% if easyadmin.entity.name =='ProductFamily' %}
<button name="submitAndStay" value="1" type="submit" class="btn btn-success action-save">
<button name="submitAndStay" value="1" type="submit" class="btn btn-success action-save action-save-and-stay">
<span class="btn-label">{{ 'action.saveAndStay'|trans(_trans_parameters, _translation_domain) }}</span> <span class="btn-label">{{ 'action.saveAndStay'|trans(_trans_parameters, _translation_domain) }}</span>
</button> </button>
{% endif %} {% endif %}

+ 3
- 1
ShopBundle/Resources/views/backend/merchant/form.html.twig View File

<div v-show="currentSection == 'maintenance'" class="panel panel-default"> <div v-show="currentSection == 'maintenance'" class="panel panel-default">
{% include '@LcShop/backend/merchant/panel_maintenance.html.twig' %} {% include '@LcShop/backend/merchant/panel_maintenance.html.twig' %}
</div> </div>

<div v-show="currentSection == 'lunch'" class="panel panel-default">
{% include '@LcShop/backend/merchant/panel_lunch.html.twig' %}
</div>
</div> </div>


</div> </div>

+ 18
- 0
ShopBundle/Resources/views/backend/merchant/panel_lunch.html.twig View File

{% import '@LcShop/backend/default/block/macros.html.twig' as macros %}

<div class="row">
<div class="col-8">
{{ macros.card_start('Merchant.lunch','light') }}
{% if form.merchantConfigs['message-lunch-open'] is defined %}
<div class="col-12">
{{ form_row(form.merchantConfigs['message-lunch-open']) }}
</div>
{% endif %}
{% if form.merchantConfigs['message-lunch-closed'] is defined %}
<div class="col-12">
{{ form_row(form.merchantConfigs['message-lunch-closed']) }}
</div>
{% endif %}
{{ macros.card_end() }}
</div>
</div>

+ 11
- 0
ShopBundle/Resources/views/backend/order/show-cart.html.twig View File

{% import '@LcShop/backend/default/block/macros.html.twig' as macros %} {% import '@LcShop/backend/default/block/macros.html.twig' as macros %}
{% import '@LcShop/backend/order/macros.html.twig' as order_macros %} {% import '@LcShop/backend/order/macros.html.twig' as order_macros %}


{% block global_actions %}
{% if entity.user is not null %}
<button id="btn-ticket-write-to-user"
data-url="{{ path('easyadmin', {'entity': 'Ticket', 'action': 'new'}) }}"
data-user="{{ entity.user.id }}"
class="btn-sm btn-success"
type="button"><i class="fa fa-pen-alt"></i> {{ "action.ticket.writeToUser"|trans }}
</button>
{% endif %}
{% endblock %}

{% block main %} {% block main %}


<div class="lc-vue-js-container" id="lc-order-edit"> <div class="lc-vue-js-container" id="lc-order-edit">

+ 12
- 0
ShopBundle/Resources/views/backend/order/show-order.html.twig View File

{% import '@LcShop/backend/default/block/macros.html.twig' as macros %} {% import '@LcShop/backend/default/block/macros.html.twig' as macros %}
{% import '@LcShop/backend/order/macros.html.twig' as order_macros %} {% import '@LcShop/backend/order/macros.html.twig' as order_macros %}


{% block global_actions %}
{% if entity.user is not null %}
<button id="btn-ticket-write-to-user"
data-url="{{ path('easyadmin', {'entity': 'Ticket', 'action': 'new'}) }}"
data-user="{{ entity.user.id }}"
data-order="{{ entity.id }}"
class="btn-sm btn-success"
type="button"><i class="fa fa-pen-alt"></i> {{ "action.ticket.writeToUser"|trans }}
</button>
{% endif %}
{% endblock %}

{% block main %} {% block main %}


<div class="lc-vue-js-container" id="lc-order-edit"> <div class="lc-vue-js-container" id="lc-order-edit">

ShopBundle/Resources/views/backend/order/show.html.twig → ShopBundle/Resources/views/backend/order/show.html.twigTODELETE View File


+ 7
- 2
ShopBundle/Resources/views/backend/productfamily/edit.html.twig View File

{% extends app.request.query.get('action') == 'edit' ? '@LcShop/backend/default/edit.html.twig' : '@LcShop/backend/default/new.html.twig' %}
{% extends app.request.query.get('action') == 'edit'
? (app.request.query.get('ajax') == 1 ? '@LcShop/backend/default/edit-ajax.html.twig' : '@LcShop/backend/default/edit.html.twig')
: '@LcShop/backend/default/new.html.twig' %}


{% block entity_form %} {% block entity_form %}
{% include '@LcShop/backend/productfamily/form.html.twig' %} {% include '@LcShop/backend/productfamily/form.html.twig' %}
{% block script_javascript %} {% block script_javascript %}
{{ parent() }} {{ parent() }}
{% include '@LcShop/backend/default/block/script-vuejs.html.twig' %} {% include '@LcShop/backend/default/block/script-vuejs.html.twig' %}
<script src="{{ asset('bundles/lcshop/js/backend/script/productfamily/vuejs-product-family.js')|lc_cache }}"></script>
<script src="{{ asset('bundles/lcshop/js/backend/script/productfamily/vuejs-product-family.js') }}"></script>
<script>
lcInitProductFamily() ;
</script>
{% endblock %} {% endblock %}

+ 6
- 6
ShopBundle/Resources/views/backend/productfamily/form.html.twig View File

{% import '@LcShop/backend/productfamily/macros.html.twig' as product_family_macros %} {% import '@LcShop/backend/productfamily/macros.html.twig' as product_family_macros %}


{% set formValues = form.vars.value %} {% set formValues = form.vars.value %}

<div id="lc-product-family-edit">
<div class="card card-light">
<div id="lc-product-family-edit" class="{% if app.request.query.get('inAdvancedEditingTable') %}in-advanced-editing-table{% endif %}">
<div class="card card-light card-sections">
<div class="lc-vue-js-container card-header p-0 border-bottom-0"> <div class="lc-vue-js-container card-header p-0 border-bottom-0">
<ul class="nav nav-tabs" id="nav-params"> <ul class="nav nav-tabs" id="nav-params">
<li class="nav-item" v-for="section in sectionsArray"> <li class="nav-item" v-for="section in sectionsArray">
<span class="glyphicon glyphicon-triangle-bottom"></span> <span class="glyphicon glyphicon-triangle-bottom"></span>
<i class="fa fa-exclamation-circle invalid-form"></i> <i class="fa fa-exclamation-circle invalid-form"></i>
</a> </a>

</li> </li>
</ul> </ul>
</div> </div>
{% if formValues.activeProducts %}activeProducts: "{{ formValues.activeProducts }}",{% endif %} {% if formValues.activeProducts %}activeProducts: "{{ formValues.activeProducts }}",{% endif %}
{% if formValues.giftVoucherActive %}giftVoucherActive: "{{ formValues.giftVoucherActive }}",{% endif %} {% if formValues.giftVoucherActive %}giftVoucherActive: "{{ formValues.giftVoucherActive }}",{% endif %}
{% if formValues.productsQuantityAsTitle %}productsQuantityAsTitle: {{ formValues.productsQuantityAsTitle }},{% endif %} {% if formValues.productsQuantityAsTitle %}productsQuantityAsTitle: {{ formValues.productsQuantityAsTitle }},{% endif %}
{% set current_section = app.request.query.get('currentSection') %}
{% if current_section is defined and current_section|length > 0 %}currentSection: "{{ current_section }}",{% endif %}
{% if form.sections.vars.value %}section: {{ form.sections.vars.value[0] }},{% endif %}


}; };
multiplyingFactor = "{{ form.multiplyingFactor.vars.value }}" multiplyingFactor = "{{ form.multiplyingFactor.vars.value }}"
</div> </div>
</div> </div>
{% if entity.note|striptags !="" %} {% if entity.note|striptags !="" %}
<div class="row">
<div class="row row-note">
{{ macros.startCard(12, 'ProductFamily.note', 'light') }} {{ macros.startCard(12, 'ProductFamily.note', 'light') }}
{{ entity.note|raw }} {{ entity.note|raw }}
{{ macros.endCard() }} {{ macros.endCard() }}
</div> </div>
{{ form_widget(form.stayOnPage, {"attr": {"v-model": "stayOnPage"}}) }} {{ form_widget(form.stayOnPage, {"attr": {"v-model": "stayOnPage"}}) }}



</div> </div>
{{ form_end(form) }} {{ form_end(form) }}



+ 1
- 1
ShopBundle/Resources/views/backend/productfamily/macros.html.twig View File

{{ productFamily.unit.unitReference }} {{ productFamily.unit.unitReference }}
{% endif %} {% endif %}
</strong> </strong>
</span>
</span>
<br /> <br />
{% endfor %} {% endfor %}
{% endmacro total_order_product_family %} {% endmacro total_order_product_family %}

+ 23
- 4
ShopBundle/Resources/views/backend/productfamily/panel_general.html.twig View File

{% import '@LcShop/backend/default/block/macros.html.twig' as macros %} {% import '@LcShop/backend/default/block/macros.html.twig' as macros %}


<div class="row"> <div class="row">
{{ macros.startCard(8, 'ProductFamily.main','light') }}
<div class="col-12">
{{ macros.startCard(8, 'ProductFamily.status','light') }}
<div class="col-6">
{{ form_row(form.status) }} {{ form_row(form.status) }}
</div> </div>
<div class="col-12">
<div class="col-6">
<label>Status de vente</label>
{{ form_row(form.saleStatus) }} {{ form_row(form.saleStatus) }}
</div> </div>

<div class="col-12">
{{ form_label(form.sections) }}
{% for section in form.sections %}
<div class="form-check">
<label class="form-check-label" for="{{ section.vars.id }}">
<input v-model="section" type="radio" id="{{ section.vars.id }}" name="{{ section.vars.full_name }}" class="form-check-input" value="{{ section.vars.value }}" {{ section.vars.checked == true ? 'checked="checked"' : '' }}>
<span class="checkmark"></span>
{{ section.vars.label }}
</label>
</div>
{% endfor %}
{% do form.sections.setRendered %}
</div>
{{ macros.endCard() }}


{{ macros.startCard(8, 'ProductFamily.main','light') }}
<div class="col-12"> <div class="col-12">
{{ form_row(form.supplier) }} {{ form_row(form.supplier) }}
</div> </div>
<div class="col-12 product-categories"> <div class="col-12 product-categories">
{% for category in form.productCategories %} {% for category in form.productCategories %}


<div class="field {{ category.vars.disabled ? 'parent' }}">
<div class="field {{ category.vars.disabled ? 'parent' }}">
{{ form_row(category) }} {{ form_row(category) }}
</div> </div>



+ 6
- 6
ShopBundle/Resources/views/backend/ticket/list-fields/field_lastmessage_date.html.twig View File



{% set lastMessage = item.ticketMessages.last %} {% set lastMessage = item.ticketMessages.last %}
{% if lastMessage.answerByAdmin != true %}
<span class="badge badge-danger">
{% if lastMessage %}
{% if lastMessage.answerByAdmin != true %}
<span class="badge badge-danger">
New New
</span>
</span>
{% endif %}
{{ lastMessage.createdAt|date('d/m/Y H:i') }} par {{ lastMessage.createdBy }}
{% endif %} {% endif %}
{{ lastMessage.createdAt|date('d/m/Y H:i') }} par {{ lastMessage.createdBy }}

+ 38
- 0
ShopBundle/Resources/views/backend/ticket/modal/create.html.twig View File


{% embed "@LcShop/backend/default/block/embed_modal.twig" %}
{% trans_default_domain 'lcshop' %}

{% block id %}modal-new-ticket{% endblock %}
{% block title %}{{ "action.ticket.writeToUser"|trans }}{% endblock %}

{% block form_start %}
{{ form_start(form, {'attr': { 'id' : 'newTicket', 'action': path('easyadmin', {'entity' : 'Ticket', 'action': 'new'})}}) }}
{% form_theme form '@LcShop/backend/form/custom_modal_bootstrap_4.html.twig' %}
{% endblock %}

{% block content %}
<div class="col">
{{ form_row(form.user) }}
{{ form_row(form.subject) }}

{% if form.orderId.vars.value is not empty %}
<p>
<strong>Ce ticket concernera la commande #{{ form.orderId.vars.value }}</strong><br />
<i>Si vous ne le souhaitez pas, écrivez à l'utilisateur depuis l'onglet utilisateur</i>
</p>
{% endif %}
{{ form_rest(form) }}
</div>
{% endblock %}

{% block footer %}
{{ parent() }}
<button type="button" class="btn btn-primary btn-save" >{{ 'action.send'|trans }}</button>
{#{{ form_rest(form) }}#}
{% endblock %}

{% block form_end %}
{{ form_end(form) }}
{% endblock %}

{% endembed %}

+ 30
- 17
ShopBundle/Resources/views/backend/user/edit.html.twig View File

{% extends app.request.query.get('action') == 'edit' ? '@LcShop/backend/default/edit.html.twig' : '@LcShop/backend/default/new.html.twig' %}
{% extends app.request.query.get('action') == 'edit' ? '@LcShop/backend/default/edit.html.twig' : '@LcShop/backend/default/new.html.twig' %}
{% trans_default_domain 'lcshop' %} {% trans_default_domain 'lcshop' %}

{% block global_actions %}
<button id="btn-ticket-write-to-user"
data-url="{{ path('easyadmin', {'entity': 'Ticket', 'action': 'new'}) }}"
data-user="{{ entity.id }}"
class="btn-sm btn-success"
type="button"><i class="fa fa-pen-alt"></i> {{ "action.ticket.writeToUser"|trans }}</button>

{% endblock %}

{% block entity_form %} {% block entity_form %}
{% import '@LcShop/backend/default/block/macros.html.twig' as macros %} {% import '@LcShop/backend/default/block/macros.html.twig' as macros %}
{{ form_start(form) }} {{ form_start(form) }}
{% form_theme form '@LcShop/backend/form/custom_bootstrap_4.html.twig' %} {% form_theme form '@LcShop/backend/form/custom_bootstrap_4.html.twig' %}
<div class="row"> <div class="row">
<div class="col-7">
{{ macros.card_start() }}
<div class="col">
{% for field in form.children %}
{{ form_row(field) }}
{% endfor %}
</div>
{{ macros.card_end() }}
</div>
<div class="col-7">
{{ macros.card_start() }}
<div class="col">
{% for field in form.children %}
{{ form_row(field) }}
{% endfor %}
</div>
{{ macros.card_end() }}
</div>




<div class="col-5"> <div class="col-5">

<div class="row" id="user-addresses"> <div class="row" id="user-addresses">
{% for address in entity.addresses %}
{% if address.status >=0 %}
{% include '@LcShop/backend/user/block_useraddress.html.twig' %}
{% endif %}
{% endfor %}
{% for address in entity.addresses %}
{% if address.status >=0 %}
{% include '@LcShop/backend/user/block_useraddress.html.twig' %}
{% endif %}
{% endfor %}
</div> </div>
<button type="button" data-url="{{ path('easyadmin', {"action": 'editAddressUser', 'entity': 'User', 'id': entity.id, 'addressId': 'new'}) }}"
class="btn btn-primary btn-add-user-address" ><i class="fa fa-plus"></i> {{ 'action.address.add'|trans }}
<button type="button"
data-url="{{ path('easyadmin', {"action": 'editAddressUser', 'entity': 'User', 'id': entity.id, 'addressId': 'new'}) }}"
class="btn btn-primary btn-add-user-address"><i
class="fa fa-plus"></i> {{ 'action.address.add'|trans }}
</button> </button>


</div> </div>

+ 14
- 4
ShopBundle/Resources/views/backend/usermerchant/show.html.twig View File

{% extends '@LcShop/backend/default/show.html.twig' %} {% extends '@LcShop/backend/default/show.html.twig' %}


{% trans_default_domain 'lcshop' %} {% trans_default_domain 'lcshop' %}

{% block global_actions %}
<button id="btn-ticket-write-to-user"
data-url="{{ path('easyadmin', {'entity': 'Ticket', 'action': 'new'}) }}"
data-user="{{ entity.user.id }}"
class="btn-sm btn-success"
type="button"><i class="fa fa-pen-alt"></i> {{ "action.ticket.writeToUser"|trans }}</button>
{% endblock %}

{% block main %} {% block main %}


<div class="row"> <div class="row">
<td class="sorted">{{ creditHistory.id }}</td> <td class="sorted">{{ creditHistory.id }}</td>
<td class="association">{{ creditHistory.type }}</td> <td class="association">{{ creditHistory.type }}</td>
<td class="">{{ creditHistory.amountInherited }} €</td> <td class="">{{ creditHistory.amountInherited }} €</td>
<td class="">{{ creditHistory.meanPaymentInherited }}</td>
<td class="">{{ creditHistory.meanPaymentInherited }}</td>
<td class="">{{ creditHistory.paidAtInherited |date('d-m-y') }}</td> <td class="">{{ creditHistory.paidAtInherited |date('d-m-y') }}</td>
<td class="">{{ creditHistory.referenceInherited }}</td>
<td class="">{{ creditHistory.commentInherited }}</td>
<td class="">{{ creditHistory.referenceInherited }}</td>
<td class="">{{ creditHistory.commentInherited }}</td>
</tr> </tr>


{% else %} {% else %}


{% block head_stylesheets %} {% block head_stylesheets %}
{{ parent() }} {{ parent() }}
<link rel="stylesheet" href="{{ asset('bundles/lcshop/css/backend/adminlte/plugins/datatables/fixedHeader.dataTables.min.css') }}">
<link rel="stylesheet"
href="{{ asset('bundles/lcshop/css/backend/adminlte/plugins/datatables/fixedHeader.dataTables.min.css') }}">
<link rel="stylesheet" <link rel="stylesheet"
href="{{ asset('bundles/lcshop/css/backend/adminlte/plugins/datatables/dataTables.bootstrap4.min.css') }}"> href="{{ asset('bundles/lcshop/css/backend/adminlte/plugins/datatables/dataTables.bootstrap4.min.css') }}">
{% endblock %} {% endblock %}

+ 16
- 6
ShopBundle/Services/Order/OrderUtils.php View File

use Lc\ShopBundle\Context\PriceUtilsInterface; use Lc\ShopBundle\Context\PriceUtilsInterface;
use Lc\ShopBundle\Context\ProductFamilyUtilsInterface; use Lc\ShopBundle\Context\ProductFamilyUtilsInterface;
use Lc\ShopBundle\Context\ReductionCreditInterface; use Lc\ShopBundle\Context\ReductionCreditInterface;
use Lc\ShopBundle\Context\SectionInterface;
use Lc\ShopBundle\Context\SectionUtilsInterface;
use Lc\ShopBundle\Context\UserUtilsInterface; use Lc\ShopBundle\Context\UserUtilsInterface;
use Lc\ShopBundle\Model\ProductFamily; use Lc\ShopBundle\Model\ProductFamily;
use Lc\ShopBundle\Services\CreditUtils; use Lc\ShopBundle\Services\CreditUtils;
use Lc\ShopBundle\Services\DocumentUtils; use Lc\ShopBundle\Services\DocumentUtils;
use Lc\ShopBundle\Services\UserUtils; use Lc\ShopBundle\Services\UserUtils;
use Lc\ShopBundle\Services\Utils; use Lc\ShopBundle\Services\Utils;
use Lc\ShopBundle\Services\UtilsManager;
use Symfony\Component\Routing\RouterInterface; use Symfony\Component\Routing\RouterInterface;


use Symfony\Component\Security\Core\Security; use Symfony\Component\Security\Core\Security;
protected $utils; protected $utils;
protected $creditUtils; protected $creditUtils;
protected $router; protected $router;
protected $sectionUtils ;


public function __construct(EntityManagerInterface $em, Security $security, RouterInterface $router, UserUtilsInterface $userUtils, public function __construct(EntityManagerInterface $em, Security $security, RouterInterface $router, UserUtilsInterface $userUtils,
MerchantUtilsInterface $merchantUtils, PriceUtilsInterface $priceUtils, ProductFamilyUtilsInterface $productFamilyUtils, MerchantUtilsInterface $merchantUtils, PriceUtilsInterface $priceUtils, ProductFamilyUtilsInterface $productFamilyUtils,
DocumentUtils $documentUtils, Utils $utils, CreditUtils $creditUtils)
DocumentUtils $documentUtils, Utils $utils, CreditUtils $creditUtils, SectionUtilsInterface $sectionUtils)
{ {
$this->em = $em; $this->em = $em;
$this->security = $security; $this->security = $security;
$this->utils = $utils; $this->utils = $utils;
$this->creditUtils = $creditUtils; $this->creditUtils = $creditUtils;
$this->router = $router; $this->router = $router;
$this->sectionUtils = $sectionUtils ;
} }




public function createOrderShop($params) public function createOrderShop($params)
{ {
//TODO vérifier que l'utilisateur n'a pas déjà une commande en cours //TODO vérifier que l'utilisateur n'a pas déjà une commande en cours
throw new \ErrorException('La commande doit être liée à un merchant.'); throw new \ErrorException('La commande doit être liée à un merchant.');
} }


// pour le moment, à la création, on lie simplement la commande à la section "Marché"
$section = $this->sectionUtils->getSectionMarket() ;
if($section) {
$orderShop->setSection($section) ;
}
else {
throw new \ErrorException('La commande doit être liée à une section.');
}

$orderShop = $this->changeOrderStatus('cart', $orderShop); $orderShop = $this->changeOrderStatus('cart', $orderShop);


return $orderShop; return $orderShop;


public function addOrderProduct($orderShop, $orderProductAdd, $persist = true) public function addOrderProduct($orderShop, $orderProductAdd, $persist = true)
{ {

$return = false; $return = false;



if (!$orderShop) { if (!$orderShop) {
$user = $this->security->getUser(); $user = $this->security->getUser();
$visitor = $this->userUtils->getVisitorCurrent(); $visitor = $this->userUtils->getVisitorCurrent();
$orderShop = $this->createOrderShop([ $orderShop = $this->createOrderShop([
'user' => $user, 'user' => $user,
'visitor' => $visitor, 'visitor' => $visitor,
'merchant' => $this->merchantUtils->getMerchantCurrent()
'merchant' => $this->merchantUtils->getMerchantCurrent(),
]); ]);
} }



+ 3
- 2
ShopBundle/Services/Order/OrderUtilsCartTrait.php View File



namespace Lc\ShopBundle\Services\Order; namespace Lc\ShopBundle\Services\Order;



use Lc\ShopBundle\Context\OrderShopInterface; use Lc\ShopBundle\Context\OrderShopInterface;
use Lc\ShopBundle\Model\OrderStatus; use Lc\ShopBundle\Model\OrderStatus;


} }


if($createIfNotExist && !$orderShop) { if($createIfNotExist && !$orderShop) {
$merchant = $this->merchantUtils->getMerchantCurrent() ;

$orderShop = $this->createOrderShop([ $orderShop = $this->createOrderShop([
'user' => $user, 'user' => $user,
'visitor' => $visitor, 'visitor' => $visitor,
'merchant' => $this->merchantUtils->getMerchantCurrent()
'merchant' => $merchant,
]); ]);
} }



+ 19
- 2
ShopBundle/Services/Order/OrderUtilsStockTrait.php View File

} }


$allCategoriesSalesOff = true; $allCategoriesSalesOff = true;
$unavailableSpecificDay = false;

foreach ($product->getProductFamily()->getProductCategories() as $category){ foreach ($product->getProductFamily()->getProductCategories() as $category){
if($category->getParent()) { if($category->getParent()) {
if($category->getSaleStatus() && $category->getParent()->getSaleStatus()) if($category->getSaleStatus() && $category->getParent()->getSaleStatus())
$allCategoriesSalesOff = false; $allCategoriesSalesOff = false;
} }
else { else {
if($category->getSaleStatus()) $allCategoriesSalesOff = false;
if($category->getSaleStatus()) {
$allCategoriesSalesOff = false;
}
} }

// specific day
$displaySpecificDay = $category->getDisplaySpecificDay() ;
if($displaySpecificDay && $displaySpecificDay != date('N')) {
$unavailableSpecificDay = true;
}
}

if($allCategoriesSalesOff) {
return false;
}

if($unavailableSpecificDay) {
return false;
} }
if($allCategoriesSalesOff) return false;


return true ; return true ;
} }

+ 26
- 3
ShopBundle/Services/Price/ProductPriceUtils.php View File

public function getBuyingPrice(ProductPropertyInterface $product) public function getBuyingPrice(ProductPropertyInterface $product)
{ {
if ($product->getBehaviorPriceInherited() == 'by-piece') { if ($product->getBehaviorPriceInherited() == 'by-piece') {
return $product->getBuyingPriceInherited();
return $product->getBuyingPriceInherited() ;
} }
elseif ($product->getBehaviorPriceInherited() == 'by-reference-unit') { elseif ($product->getBehaviorPriceInherited() == 'by-reference-unit') {


if ($product->getQuantityInherited() > 0) { if ($product->getQuantityInherited() > 0) {
return $product->getBuyingPriceByRefUnitInherited() * ($product->getQuantityInherited() / $product->getUnitInherited()->getCoefficient()); return $product->getBuyingPriceByRefUnitInherited() * ($product->getQuantityInherited() / $product->getUnitInherited()->getCoefficient());
}else{
}
else {
return 0; return 0;
} }
} }
} }


public function getMultiplyingFactor(ProductPropertyInterface $product){
public function getBuyingPriceWithTax(ProductPropertyInterface $product)
{
return $this->applyTax(
$this->getBuyingPrice($product),
$product->getTaxRateInherited()->getValue()
);
}

public function getBuyingPriceByRefUnit(ProductPropertyInterface $product)
{
return $product->getBuyingPriceByRefUnitInherited() ;
}

public function getBuyingPriceByRefUnitWithTax(ProductPropertyInterface $product)
{
return $this->applyTax(
$this->getBuyingPriceByRefUnit($product),
$product->getTaxRateInherited()->getValue()
);
}

public function getMultiplyingFactor(ProductPropertyInterface $product)
{
return $this->round($this->getPriceWithTax($product) / $this->getBuyingPrice($product)); return $this->round($this->getPriceWithTax($product) / $this->getBuyingPrice($product));
} }



+ 15
- 0
ShopBundle/Services/ProductFamilyUtils.php View File

} }
} }


public function getMultiplyingFactor($productFamily)
{
if($productFamily->getBehaviorPrice() == ProductFamily::BEHAVIOR_PRICE_BY_PIECE) {
if($productFamily->getBuyingPrice() > 0) {
return number_format($this->priceUtils->getPriceWithTax($productFamily) / $productFamily->getBuyingPrice(), 3) ;
}
}
elseif($productFamily->getBehaviorPrice() == ProductFamily::BEHAVIOR_PRICE_BY_REFERENCE_UNIT) {
if($productFamily->getBuyingPriceByRefUnit() > 0) {
return number_format($this->priceUtils->getPriceByRefUnitWithTax($productFamily) / $productFamily->getBuyingPriceByRefUnit(), 3) ;
}
}

}

} }

+ 37
- 0
ShopBundle/Services/SectionUtils.php View File

<?php

namespace Lc\ShopBundle\Services ;

use Doctrine\ORM\EntityManagerInterface;
use Http\Discovery\Exception\NotFoundException;
use Lc\ShopBundle\Context\MerchantUtilsInterface;
use Lc\ShopBundle\Context\SectionInterface;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

class SectionUtils
{
protected $em ;
protected $merchantUtils ;
protected $sectionRepository ;

public function __construct(EntityManagerInterface $em, MerchantUtilsInterface $merchantUtils)
{
$this->em = $em ;
$this->sectionRepository = $this->em->getRepository($this->em->getClassMetadata(SectionInterface::class)->getName()) ;
$this->merchantUtils = $merchantUtils ;
}

public function getSection($devAlias)
{
$section = $this->sectionRepository->findOneBy([
'merchant' => $this->merchantUtils->getMerchantCurrent(),
'devAlias' => $devAlias
]) ;

if(!$section) {
throw new NotFoundException('La section '.$devAlias.' est introuvable') ;
}

return $section ;
}
}

+ 23
- 10
ShopBundle/Services/TicketUtils.php View File

$ticketMessage->setStatus(1) ; $ticketMessage->setStatus(1) ;
$ticketMessage->setTicket($ticket) ; $ticketMessage->setTicket($ticket) ;
$ticketMessage->setMessage($params['message']) ; $ticketMessage->setMessage($params['message']) ;
if(isset($params['createByAdmin']) && $params['createByAdmin'])$ticketMessage->setAnswerByAdmin(true);
$this->em->persist($ticketMessage); $this->em->persist($ticketMessage);


$this->em->flush() ; $this->em->flush() ;


// envoi email au client
$this->mailUtils->send([
MailUtils::SUBJECT => 'Nouvelle demande',
MailUtils::TO_EMAIL => $email,
MailUtils::CONTENT_TEMPLATE => 'mail/ticket-new',
MailUtils::CONTENT_DATA => [
'firstname' => $firstname,
'ticket' => $ticket
],
]) ;
if(isset($params['createByAdmin']) && $params['createByAdmin']) {
// envoi email au client
$this->mailUtils->send([
MailUtils::SUBJECT => 'Vous avez reçu un nouveau message',
MailUtils::TO_EMAIL => $email,
MailUtils::CONTENT_TEMPLATE => 'mail/ticket-new-by-admin',
MailUtils::CONTENT_DATA => [
'firstname' => $firstname,
'ticket' => $ticket
],
]);
}else{
$this->mailUtils->send([
MailUtils::SUBJECT => 'Nouvelle demande',
MailUtils::TO_EMAIL => $email,
MailUtils::CONTENT_TEMPLATE => 'mail/ticket-new',
MailUtils::CONTENT_DATA => [
'firstname' => $firstname,
'ticket' => $ticket
],
]);
}




$this->notifyAdmin($ticket, $ticketMessage); $this->notifyAdmin($ticket, $ticketMessage);

+ 9
- 0
ShopBundle/Services/Utils.php View File

]); ]);
} }


public function urlEncryptData($datas){
$key = 'secretToken';
foreach ($datas as $data) {
$key .= $data;
}
return md5($key);
}


} }

+ 10
- 1
ShopBundle/Services/UtilsManager.php View File

use Lc\ShopBundle\Context\OrderUtilsInterface; use Lc\ShopBundle\Context\OrderUtilsInterface;
use Lc\ShopBundle\Context\PriceUtilsInterface; use Lc\ShopBundle\Context\PriceUtilsInterface;
use Lc\ShopBundle\Context\ProductFamilyUtilsInterface; use Lc\ShopBundle\Context\ProductFamilyUtilsInterface;
use Lc\ShopBundle\Context\SectionUtilsInterface;
use Lc\ShopBundle\Context\Services\StatisticsUtilsInterface; use Lc\ShopBundle\Context\Services\StatisticsUtilsInterface;
use Lc\ShopBundle\Context\UserUtilsInterface; use Lc\ShopBundle\Context\UserUtilsInterface;
use League\Flysystem\Util; use League\Flysystem\Util;
protected $ticketUtils ; protected $ticketUtils ;
protected $statisticsUtils; protected $statisticsUtils;
protected $pointLocationUtils ; protected $pointLocationUtils ;
protected $sectionUtils ;


public function __construct( public function __construct(
Utils $utils, Utils $utils,
MailUtils $mailUtils, MailUtils $mailUtils,
TicketUtils $ticketUtils, TicketUtils $ticketUtils,
PointLocationUtils $pointLocationUtils, PointLocationUtils $pointLocationUtils,
UtilsProcess $utilsProcess
UtilsProcess $utilsProcess,
SectionUtilsInterface $sectionUtils
) )
{ {
$this->utils = $utils ; $this->utils = $utils ;
$this->ticketUtils = $ticketUtils ; $this->ticketUtils = $ticketUtils ;
$this->pointLocationUtils = $pointLocationUtils ; $this->pointLocationUtils = $pointLocationUtils ;
$this->utilsProcess = $utilsProcess ; $this->utilsProcess = $utilsProcess ;
$this->sectionUtils = $sectionUtils ;
} }


public function getUtils(): Utils public function getUtils(): Utils
return $this->utilsProcess ; return $this->utilsProcess ;
} }


public function getSectionUtils(): SectionUtilsInterface
{
return $this->sectionUtils ;
}

} }

Loading…
Cancel
Save