@@ -182,7 +182,6 @@ class AdminController extends EasyAdminController | |||
$dqlFilter = $this->commonDqlFilterQueryBuilder($entityClass, $dqlFilter); | |||
$queryBuilder = parent::createListQueryBuilder($entityClass, $sortDirection, $sortField, $dqlFilter); | |||
$this->commonQueryFilter($entityClass, $queryBuilder); | |||
$listFields = $this->entity['list']['fields']; | |||
$this->filtersForm = $this->createForm(ListFilterType::class, null, array( |
@@ -2,7 +2,9 @@ | |||
namespace Lc\ShopBundle\Controller\Backend; | |||
use App\Entity\OrderShop; | |||
use App\Form\Backend\Common\AddressType; | |||
use EasyCorp\Bundle\EasyAdminBundle\Event\EasyAdminEvents; | |||
use FOS\UserBundle\Doctrine\UserManager; | |||
use FOS\UserBundle\Model\UserManagerInterface ; | |||
use Lc\ShopBundle\Context\AddressInterface; | |||
@@ -11,6 +13,47 @@ use Lc\ShopBundle\Model\Address; | |||
class UserController extends AdminController | |||
{ | |||
public function showAction() | |||
{ | |||
$id = $this->request->query->get('id'); | |||
$easyadmin = $this->request->attributes->get('easyadmin'); | |||
$entity = $easyadmin['item']; | |||
$this->orderShoprepo = $this->em->getRepository(OrderShop::class); | |||
/* dump($this->orderUtils->getRankTotalOrder($entity)); | |||
die(); | |||
dump($this->orderUtils->getRankSumOrderByUser($entity)); | |||
dump($this->orderUtils->getRankTotalOrderByUser($entity)); | |||
dump($this->orderUtils->getTotalSpentByUser($entity)); | |||
dump($this->orderUtils->getAverageOrderByUser($entity)); | |||
die();*/ | |||
$this->dispatch(EasyAdminEvents::PRE_SHOW); | |||
$fields = $this->entity['show']['fields']; | |||
$deleteForm = $this->createDeleteForm($this->entity['name'], $id); | |||
$this->dispatch(EasyAdminEvents::POST_SHOW, [ | |||
'deleteForm' => $deleteForm, | |||
'fields' => $fields, | |||
'entity' => $entity, | |||
]); | |||
$parameters = [ | |||
'entity' => $entity, | |||
'fields' => $fields, | |||
'delete_form' => $deleteForm->createView(), | |||
]; | |||
return $this->executeDynamicMethod('render<EntityName>Template', ['show', $this->entity['templates']['show'], $parameters]); | |||
} | |||
public function createNewEntity() | |||
{ | |||
return $this->userManager->createUser(); |
@@ -15,8 +15,8 @@ use Lc\ShopBundle\Context\StatusInterface; | |||
*/ | |||
abstract class ReductionCredit extends AbstractEntity implements ReductionInterface, FilterMerchantInterface, StatusInterface | |||
{ | |||
const TYPE_CREDIT = 'credit' ; | |||
const TYPE_GIFT = 'gift' ; | |||
const TYPE_CREDIT = 'credit'; | |||
const TYPE_GIFT = 'gift'; | |||
use ReductionTrait; | |||
@@ -29,10 +29,11 @@ abstract class ReductionCredit extends AbstractEntity implements ReductionInterf | |||
protected $title; | |||
/** | |||
* @ORM\ManyToMany(targetEntity="Lc\ShopBundle\Context\UserInterface") | |||
* @ORM\ManyToMany(targetEntity="Lc\ShopBundle\Context\UserInterface", inversedBy="reductionCredits") | |||
*/ | |||
protected $users; | |||
/** | |||
* @ORM\ManyToOne(targetEntity="Lc\ShopBundle\Context\MerchantInterface") | |||
* @ORM\JoinColumn(nullable=false) | |||
@@ -90,6 +91,19 @@ abstract class ReductionCredit extends AbstractEntity implements ReductionInterf | |||
return $this; | |||
} | |||
public function getType(): ?string | |||
{ | |||
return $this->type; | |||
} | |||
public function setType(string $type): self | |||
{ | |||
$this->type = $type; | |||
return $this; | |||
} | |||
/** | |||
* @return Collection|User[] | |||
*/ | |||
@@ -116,20 +130,6 @@ abstract class ReductionCredit extends AbstractEntity implements ReductionInterf | |||
return $this; | |||
} | |||
public function getType(): ?string | |||
{ | |||
return $this->type; | |||
} | |||
public function setType(string $type): self | |||
{ | |||
$this->type = $type; | |||
return $this; | |||
} | |||
public function getSended(): ?bool | |||
{ |
@@ -108,6 +108,11 @@ abstract class User extends UserModelFOS | |||
protected $ticketTypesNotification = []; | |||
/** | |||
* @ORM\ManyToMany(targetEntity="Lc\ShopBundle\Context\ReductionCreditInterface", mappedBy="users") | |||
*/ | |||
protected $reductionCredits; | |||
public function __construct() | |||
{ | |||
@@ -119,6 +124,8 @@ abstract class User extends UserModelFOS | |||
$this->favoriteProductFamilies = new ArrayCollection(); | |||
$this->userPointSales = new ArrayCollection(); | |||
$this->userMerchants = new ArrayCollection(); | |||
$this->reductionCredits = new ArrayCollection(); | |||
$this->tickets = new ArrayCollection(); | |||
} | |||
public function __toString() | |||
@@ -464,4 +471,33 @@ abstract class User extends UserModelFOS | |||
return $this; | |||
} | |||
/** | |||
* @return Collection|ReductionCredit[] | |||
*/ | |||
public function getReductionCredits(): Collection | |||
{ | |||
return $this->reductionCredits; | |||
} | |||
public function addReductionCredit(ReductionCredit $reductionCredit): self | |||
{ | |||
if (!$this->reductionCredits->contains($reductionCredit)) { | |||
$this->reductionCredits[] = $reductionCredit; | |||
$reductionCredit->addUser($this); | |||
} | |||
return $this; | |||
} | |||
public function removeReductionCredit(ReductionCredit $reductionCredit): self | |||
{ | |||
if ($this->reductionCredits->contains($reductionCredit)) { | |||
$this->reductionCredits->removeElement($reductionCredit); | |||
$reductionCredit->removeUser($this); | |||
} | |||
return $this; | |||
} | |||
} |
@@ -71,7 +71,7 @@ class ReductionCartRepository extends BaseRepository implements DefaultRepositor | |||
foreach($reductionCarts as $reductionCart) { | |||
if($this->orderUtils->isReductionCartMatchWithUser($reductionCart, $user) | |||
&& $this->orderUtils->isReductionCartMatchWithGroupUser($reductionCart, $user) | |||
&& $this->orderUtils->countReductionCartAvailableForUser($reductionCart, $user) | |||
&& $this->orderUtils->getReductionCartRemainingQuantityPerUser($reductionCart, $user) | |||
&& ($reductionCart->getUsers()->count() > 0 || $reductionCart->getGroupUsers()->count() > 0)) { | |||
$reductionCartsArray[] = $reductionCart ; |
@@ -31,6 +31,7 @@ body{font-size: 0.9rem;} | |||
a.link-as-text{color:#333;} | |||
.badge{font-size: 90%;} | |||
/***************************************** ADMIN SIDEBAR ***************************************/ | |||
.main-sidebar p{font-size: 0.8rem;} |
@@ -23,6 +23,8 @@ group: | |||
default: Édition | |||
Général: Général | |||
Adresse: Adresse | |||
Redelivery: | |||
list: Liste des relivraisons | |||
Supplier: | |||
contact: Personne de contact | |||
Reminder: | |||
@@ -53,10 +55,13 @@ group: | |||
ReductionCatalog: | |||
info: Informations principal | |||
conditions: Conditions d'application | |||
ReductionCredit: | |||
list: Liste des avoirs | |||
ReductionCart: | |||
info: Informations | |||
conditions: Conditions d'applications | |||
actions: Actions | |||
list: Liste des réductions paniers | |||
OrderShop: | |||
redelivery: Relivraison | |||
resume: Résumé de commande | |||
@@ -72,6 +77,7 @@ group: | |||
tickets: Tickets relatif à la commande | |||
orderStatusHistories: Historique de changement de statut | |||
waitingBankReturn: Commandes en attente de retour banque | |||
list: Liste des commandes | |||
Ticket: | |||
listMessages: Liste des messages | |||
list: Tickets ouverts |
@@ -0,0 +1,11 @@ | |||
<div class="small-box {% block class %}bg-info{% endblock %}"> | |||
<div class="inner"> | |||
<h3>{% block value %}{% endblock %}</h3> | |||
<p>{% block label %}{% endblock %}</p> | |||
<div class="icon"> | |||
<i class="fa fa-{% block icon %}bg-info{% endblock %}"></i> | |||
</div> | |||
</div> | |||
</div> |
@@ -1,31 +0,0 @@ | |||
<table class="table table-condensed" id="ticket-list"> | |||
<thead> | |||
<tr> | |||
<th>Sujet</th> | |||
<th>Statut</th> | |||
<th>Dernier message</th> | |||
<th></th> | |||
</tr> | |||
</thead> | |||
<tbody> | |||
{% for ticket in tickets %} | |||
<tr> | |||
<td>{{ ticket.subject }}</td> | |||
<td> | |||
{% set value = ticket.status %} | |||
{% include '@LcShop/backend/default/field/ticket_status.html.twig' %} | |||
</td> | |||
<td> | |||
{% set item = ticket %} | |||
{% include '@LcShop/backend/default/field/ticket_last_message.html.twig' %} | |||
</td> | |||
<td> | |||
<a class="btn-sm btn-success" href="{{ path('easyadmin', {id: ticket.id, entity: 'Ticket', action: 'show'}) }}"> | |||
<i class="fas fa-eye"></i> | |||
</a> | |||
</td> | |||
</tr> | |||
{% endfor %} | |||
</tbody> | |||
</table> | |||
@@ -276,19 +276,157 @@ | |||
{% endmacro available_quantity_product %} | |||
{# {% macro modal(title, form) %} | |||
{% embed '@LcShop/backend/default/block/embed_modal.twig' %} | |||
{% trans_default_domain 'lcshop' %} | |||
{% block id %}{{ id }}{% endblock %} | |||
{% block title %}{{ title }}{% endblock %} | |||
{% block form_start %} | |||
{{ form_start(form) }} | |||
{% endblock %} | |||
{% block icon %}{{ icon }}{% endblock %} | |||
{% block label %}{{ label }}{% endblock %} | |||
{% block value %} | |||
{{ value }} | |||
{% endblock %} | |||
{% endembed %} | |||
{% endmacro box_info %}#} | |||
{% macro button(entity, action, id=null, class="success", title=null, icon=null) %} | |||
{% if title %} | |||
{% set trad = title %} | |||
{% else %} | |||
{% set trad = 'action.'~action %} | |||
{% endif %} | |||
{% if icon is null %} | |||
{% if action=="edit" %}{% set icon = 'pen' %} | |||
{% elseif action=="show" %}{% set icon = 'eye' %} | |||
{% endif %} | |||
{% endif %} | |||
{% set param = {action : action, entity: entity, referer: app.request.requestUri} %} | |||
{% if id %}{% set param = param|merge({id: id}) %}{% endif %} | |||
<a class="btn-sm btn-{{ class }}" data-toggle="tooltip" title="{{ trad|trans({}, "lcshop") }}" | |||
href="{{ path('easyadmin', param) }}"> | |||
<i class="fas fa-{{ icon }}"></i> | |||
</a> | |||
{% endmacro button %} | |||
{% macro list_tickets(tickets) %} | |||
<table class="table table-condensed"> | |||
<thead> | |||
<tr> | |||
<th>Sujet</th> | |||
<th>Statut</th> | |||
<th>Dernier message</th> | |||
<th></th> | |||
</tr> | |||
</thead> | |||
<tbody> | |||
{% for ticket in tickets %} | |||
<tr> | |||
<td>{{ ticket.subject }}</td> | |||
<td> | |||
{% set value = ticket.status %} | |||
{% include '@LcShop/backend/default/field/ticket_status.html.twig' %} | |||
</td> | |||
<td> | |||
{% set item = ticket %} | |||
{% include '@LcShop/backend/default/field/ticket_last_message.html.twig' %} | |||
</td> | |||
<td> | |||
{{ _self.button('Ticket', 'show', ticket.id) }} | |||
</td> | |||
</tr> | |||
{% endfor %} | |||
</tbody> | |||
</table> | |||
{% endmacro list_tickets %} | |||
{% macro list_reduction_credits(reductionCredits) %} | |||
<table class="table table-condensed"> | |||
<thead> | |||
<tr> | |||
<th>Titre</th> | |||
<th>Montant</th> | |||
<th>En ligne</th> | |||
<th>Utilisé</th> | |||
<th></th> | |||
</tr> | |||
</thead> | |||
<tbody> | |||
{% for reductionCredit in reductionCredits %} | |||
{% set isUsed = orderUtils.isReductionCreditUsed(reductionCredit) %} | |||
<tr> | |||
<td>{{ reductionCredit.title }}</td> | |||
<td> | |||
{{ reductionCredit.value|format_price(false) }} | |||
</td> | |||
<td> | |||
{% include '@EasyAdmin/default/field_boolean.html.twig' with {value: reductionCredit.status} %} | |||
</td> | |||
<td> | |||
{% include '@EasyAdmin/default/field_boolean.html.twig' with {value: isUsed} %} | |||
</td> | |||
<td> | |||
{% if isUsed == false %} | |||
{{ _self.button('ReductionCredit', 'edit', reductionCredit.id, 'primary') }} | |||
{% endif %} | |||
</td> | |||
</tr> | |||
{% endfor %} | |||
</tbody> | |||
</table> | |||
{% endmacro list_reduction_credits %} | |||
{% macro list_reduction_carts(reductionCarts, user = false) %} | |||
<table class="table table-condensed"> | |||
<thead> | |||
<tr> | |||
<th>Titre</th> | |||
<th>Montant</th> | |||
<th>Quantité utilisé</th> | |||
<th>Quantité restante</th> | |||
<th>En ligne</th> | |||
<th>Actions</th> | |||
</tr> | |||
</thead> | |||
<tbody> | |||
{% for reductionCart in reductionCarts %} | |||
<tr> | |||
<td>{{ reductionCart.title }}</td> | |||
<td> | |||
{% if reductionCart.value > 0 %} | |||
{{ reductionCart.value }} | |||
{% if reductionCart.unit == 'percent' %}%{% else %}€{% endif %} | |||
{% if reductionCart.appliedTo is defined and reductionCart.appliedTo|length > 0 %} | |||
sur | |||
{% if reductionCart.appliedTo == 'order-products' %} | |||
les produits | |||
{% endif %} | |||
{% endif %} | |||
({% if reductionCart.behaviorTaxRate == 'tax-included' %}TTC{% else %}HT{% endif %}) | |||
{% endif %} | |||
{% if reductionCart.freeShipping %} | |||
{% if reductionCart.value > 0 %}<br/>{% endif %} | |||
Livraison offerte | |||
{% endif %} | |||
</td> | |||
<td> | |||
{% if user is not null %} | |||
{% set totalUsed = orderUtils.getReductionCartUsedQuantityPerUser(reductionCart, user) %} | |||
{{ totalUsed }} | |||
{% endif %} | |||
</td> | |||
<td> | |||
{% if user is not null %} | |||
{{ reductionCart.availableQuantityPerUser - totalUsed }} | |||
{% endif %} | |||
</td> | |||
<td> | |||
{% include '@EasyAdmin/default/field_boolean.html.twig' with {value: reductionCart.status} %} | |||
</td> | |||
<td> | |||
{{ _self.button('ReductionCart', 'edit', reductionCart.id, 'primary') }} | |||
</td> | |||
</tr> | |||
{% endfor %} | |||
</tbody> | |||
</table> | |||
{% endmacro list_reduction_carts %} | |||
@@ -1,8 +1,12 @@ | |||
{# {{ value|date('U')}} #} | |||
{% if field_options.format == "d/m/Y h:i A e" or field_options.format == null %} | |||
{% if value is not null %} | |||
{% if field_options is not defined or field_options.format == "d/m/Y h:i A e" or field_options.format == null %} | |||
{% set format = "d/m/Y H:i" %} | |||
{% else %} | |||
{% set format = field_options.format %} | |||
{% endif %} | |||
<time data-timestamp="{{ value|date('U') }}" title="{{ value|date('r') }}">{{ value|date(format) }}</time> | |||
{% else %} | |||
<span class="badge badge-secondary">Non défini</span> | |||
{% endif %} |
@@ -1 +1,2 @@ | |||
{{ priceUtils.getTotalWithTax(item)|format_price|raw }} | |||
{{ priceUtils.getTotalWithTax(item, true)|format_price|raw }}<br /> | |||
{{ item.statTotalWithTax }} |
@@ -0,0 +1 @@ | |||
<span class="badge badge-{{ value.color is defined ? value.color : item.orderStatus.color }}">{{ value }}</span> |
@@ -0,0 +1 @@ | |||
{{ item.availableQuantity - orderUtils.getReductionCartUsedQuantity(item) }} |
@@ -0,0 +1,3 @@ | |||
{% set totalUsed = orderUtils.getReductionCartUsedQuantity(item) %} | |||
<span class="badge badge-success">{{ totalUsed }}</span> utilisé(s) | |||
/ <span class="badge badge-primary">{{ item.availableQuantity - totalUsed }}</span> restante(s) |
@@ -0,0 +1,10 @@ | |||
{% set totalOrder = orderUtils.countValidOrderShopByUser(item) %} | |||
{% if totalOrder > 0 %} | |||
<span class="badge badge-success"> | |||
{{ totalOrder }} commandes | |||
</span> | |||
{% else %} | |||
<span class="badge badge-secondary"> | |||
0 commandes | |||
</span> | |||
{% endif %} |
@@ -0,0 +1 @@ | |||
{{ orderUtils.getRankSumOrderByUser(item) }} |
@@ -0,0 +1 @@ | |||
{{ orderUtils.getRankTotalOrderByUser(item) }} |
@@ -0,0 +1,6 @@ | |||
{% set totalSpent = orderUtils.getTotalSpentByUser(item) %} | |||
{% if totalSpent >0 %} | |||
<span class="badge badge-primary"> {{ totalSpent|format_price(false) }}</span> | |||
{% else %} | |||
<span class="badge badge-secondary"> {{ totalSpent|format_price(false) }}</span> | |||
{% endif %} |
@@ -1,10 +0,0 @@ | |||
{% if value|length > 0 %} | |||
<span class="badge badge-success"> | |||
{{ value|length }} commandes | |||
</span> | |||
{% else %} | |||
<span class="badge badge-danger"> | |||
0 commandes | |||
</span> | |||
{% endif %} |
@@ -0,0 +1,215 @@ | |||
{% trans_default_domain 'lcshop' %} | |||
{% macro box_info(user) %} | |||
<div class="card card-primary card-outline"> | |||
<div class="card-body box-profile"> | |||
<h3 class="profile-username"> | |||
<i class="fa fa-user"></i> {{ user.gender == 1 ? 'Mme.' : 'M.' }} {{ user.name }} {{ user.age < 200 ? '('~user.age~' ans)' : ''}} | |||
</h3> | |||
<ul class="list-group list-group-unbordered"> | |||
{% if user.age < 200 %} | |||
<li class="list-group-item"> | |||
<b> <i class="fa fa-birthday-cake"></i> Age </b> | |||
<span class="float-right"> ans ({{ user.birthdate|date('d/m/Y') }})</span> | |||
</li> | |||
{% endif %} | |||
<li class="list-group-item"> | |||
<b> <i class="fa fa-envelope"></i> Email</b> | |||
<span class="float-right"> {{ user.email }}</span> | |||
</li> | |||
<li class="list-group-item"> | |||
<b> <i class="fa fa-phone"></i> Téléphone</b> | |||
<span class="float-right"> {{ user.phone }}</span> | |||
</li> | |||
<li class="list-group-item"> | |||
<b><i class="fa fa-fw fa-bullhorn"></i> Newsletters</b> | |||
{% for newsletter in user.newsletters %} | |||
<span class="badge badge-success float-right">{{ newsletter }}</span> | |||
{% else %} | |||
<span class="badge badge-dark float-right">Aucune</span> | |||
{% endfor %} | |||
</li> | |||
<li class="list-group-item"> | |||
<b> <i class="fa fa-users"></i> Groupes</b> | |||
{% for group in user.groups %} | |||
<span class="badge badge-info float-right">{{ group }}</span> | |||
{% else %} | |||
<span class="badge badge-dark float-right">Aucun</span> | |||
{% endfor %} | |||
</li> | |||
{% if is_granted('ROLE_SUPER_ADMIN') == false %} | |||
<li class="list-group-item"> | |||
<b> <i class="fa fa-user-shield"></i> Roles</b> | |||
{% for role in user.roles %} | |||
<span class="badge badge-danger float-right">{{ role }}</span> | |||
{% endfor %} | |||
</li> | |||
{% endif %} | |||
</ul> | |||
</div> | |||
</div> | |||
{% endmacro box_info %} | |||
{% macro box_rank_sum_order(user) %} | |||
{% embed '@LcShop/backend/default/block/embed_figure_box.twig' %} | |||
{% block class %}bg-maroon{% endblock %} | |||
{% block icon %}cubes{% endblock %} | |||
{% block label %} Classement par total dépensés{% endblock %} | |||
{% block value %} | |||
{% set rankSumOrder = orderUtils.rankSumOrderByUser(user) %} | |||
{% if rankSumOrder %} | |||
{{ rankSumOrder }} <small style="opacity: 0.7"> / {{ orderUtils.countUsersWithValidOrderShop() }}</small> | |||
{% else %} | |||
Non classé | |||
{% endif %} | |||
{% endblock %} | |||
{% endembed %} | |||
{% endmacro box_rank_sum_order %} | |||
{% macro box_total_spent(user) %} | |||
{% embed '@LcShop/backend/default/block/embed_figure_box.twig' %} | |||
{% trans_default_domain 'lcshop' %} | |||
{% block class %}bg-pink{% endblock %} | |||
{% block icon %}euro-sign{% endblock %} | |||
{% block label %} Total dépensés{% endblock %} | |||
{% block value %} | |||
{{ orderUtils.totalSpentByUser(user)|format_price(false) }} | |||
{% endblock %} | |||
{% endembed %} | |||
{% endmacro box_total_spent %} | |||
{% macro box_rank_total_order(user) %} | |||
{% embed '@LcShop/backend/default/block/embed_figure_box.twig' %} | |||
{% block class %}bg-info{% endblock %} | |||
{% block icon %}cubes{% endblock %} | |||
{% block label %}Classement par nombre de commande {% endblock %} | |||
{% block value %} | |||
{% set rankTotalOrder = orderUtils.rankTotalOrderByUser(user) %} | |||
{% if rankTotalOrder %} | |||
{{ rankTotalOrder }} <small style="opacity: 0.7"> / {{ orderUtils.countUsersWithValidOrderShop() }}</small> | |||
{% else %} | |||
Non classé | |||
{% endif %} | |||
{% endblock %} | |||
{% endembed %} | |||
{% endmacro box_rank_total_order %} | |||
{% macro box_total_order(user) %} | |||
{% embed '@LcShop/backend/default/block/embed_figure_box.twig' %} | |||
{% trans_default_domain 'lcshop' %} | |||
{% block class %}bg-lightblue{% endblock %} | |||
{% block icon %}shopping-cart{% endblock %} | |||
{% block label %} Nombre de commandes{% endblock %} | |||
{% block value %} | |||
{{ orderUtils.countValidOrderShopByUser(user) }} | |||
{% endblock %} | |||
{% endembed %} | |||
{% endmacro box_total_order %} | |||
{% macro box_register_since(user) %} | |||
{% embed '@LcShop/backend/default/block/embed_figure_box.twig' %} | |||
{% trans_default_domain 'lcshop' %} | |||
{% block class %}bg-success{% endblock %} | |||
{% block icon %}calendar-plus{% endblock %} | |||
{% block label %}Date de l'inscription{% endblock %} | |||
{% block value %} | |||
{{ user.createdAt|date('d/m/Y H:i') }} | |||
{% endblock %} | |||
{% endembed %} | |||
{% endmacro box_register_since %} | |||
{% macro box_login_since(user) %} | |||
{% embed '@LcShop/backend/default/block/embed_figure_box.twig' %} | |||
{% trans_default_domain 'lcshop' %} | |||
{% block class %}bg-olive{% endblock %} | |||
{% block icon %}calendar-check{% endblock %} | |||
{% block label %}Date de dernière visite{% endblock %} | |||
{% block value %} | |||
{{ user.lastLogin|date('d/m/Y H:i') }} | |||
{% endblock %} | |||
{% endembed %} | |||
{% endmacro box_login_since %} | |||
{% macro list_order_product_redelivery(orderProductsRedelivery) %} | |||
<table class="table lc-table-list table-striped"> | |||
<thead> | |||
<tr> | |||
<th>Id</th> | |||
<th>Produit</th> | |||
<th>Quantité</th> | |||
<th>Date de livraison</th> | |||
<th>Statut</th> | |||
<th></th> | |||
</tr> | |||
</thead> | |||
<tbody> | |||
{% for orderProduct in orderProductsRedelivery %} | |||
<tr> | |||
<td>{{ orderProduct.id }}</td> | |||
<td>{{ orderProduct.title }}</td> | |||
<td>{{ orderProduct.quantityOrder }}</td> | |||
<td> | |||
{% include '@LcShop/backend/default/field/datetime.html.twig' with {value : orderProduct.orderShop.deliveryDate} %}</td> | |||
<td>{% include '@LcShop/backend/order/field/order_status.html.twig' with {value : orderProduct.orderShop.orderStatus} %}</td> | |||
<td> | |||
{% import '@LcShop/backend/default/block/macros.html.twig' as macros %} | |||
{% if orderProduct.orderShop.isCart() %} | |||
{{ macros.button('OrderProductRedelivery', 'edit', orderProduct.id, 'primary') }} | |||
{% endif %} | |||
{{ macros.button('OrderShop', 'show', orderProduct.orderShop.id) }} | |||
</td> | |||
</tr> | |||
{% endfor %} | |||
</tbody> | |||
</table> | |||
{% endmacro list_order_product_redelivery %} | |||
{% macro list_order_shops(orderShops) %} | |||
<table class="table table-striped"> | |||
<tbody> | |||
<thead> | |||
<tr> | |||
<th>Id</th> | |||
<th>WeekId</th> | |||
<th>Numéro de semaine</th> | |||
<th>Référence</th> | |||
<th>Montant TTC</th> | |||
<th>Statut</th> | |||
<th></th> | |||
</tr> | |||
</thead> | |||
<tbody> | |||
{% for orderShop in orderShops %} | |||
<tr> | |||
<td>{{ orderShop.id }}</td> | |||
<td>{{ orderShop.weekId }}</td> | |||
<td>{{ orderShop.weekNumber }}</td> | |||
<td>{{ orderShop.reference }}</td> | |||
<td>{{ priceUtils.getTotalWithTax(orderShop, true)|format_price(false) }}</td> | |||
<td>{% include '@LcShop/backend/order/field/order_status.html.twig' with {value : orderShop.orderStatus} %}</td> | |||
<td> | |||
{% import '@LcShop/backend/default/block/macros.html.twig' as macros %} | |||
{{ macros.button('OrderShop', 'show', orderShop.id) }} | |||
</td> | |||
</tr> | |||
{% endfor %} | |||
</tbody> | |||
</table> | |||
{% endmacro list_order_shops %} |
@@ -0,0 +1,79 @@ | |||
{% extends '@LcShop/backend/default/show.html.twig' %} | |||
{% trans_default_domain 'lcshop' %} | |||
{% import '@LcShop/backend/default/block/macros.html.twig' as macros %} | |||
{% import '@LcShop/backend/user/macros.html.twig' as user_macros %} | |||
{% block global_actions %} | |||
{% if entity is not null %} | |||
{% set action = {label : "action.user.switch", icon: 'user-secret', css_class: 'btn btn-sm btn-danger'} %} | |||
{% include '@LcShop/backend/user/block/user-switch.html.twig' with {item: entity, is_dropdown: false, action: action, translation_domain: 'lcshop', trans_parameters: {}, item_id: entity.id}%} | |||
<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> | |||
{% endif %} | |||
{% endblock %} | |||
{% block main %} | |||
<div class="lc-vue-js-container" id="lc-user"> | |||
<div class="row"> | |||
<div class="col-3"> | |||
{{ user_macros.box_info(entity) }} | |||
</div> | |||
<div class="col-3"> | |||
{{ user_macros.box_rank_total_order(entity) }} | |||
{{ user_macros.box_total_order(entity) }} | |||
</div> | |||
<div class="col-3"> | |||
{{ user_macros.box_rank_sum_order(entity) }} | |||
{{ user_macros.box_total_spent(entity) }} | |||
</div> | |||
<div class="col-3"> | |||
{{ user_macros.box_register_since(entity) }} | |||
{{ user_macros.box_login_since(entity) }} | |||
</div> | |||
<div class="col-6"> | |||
{% set redeliveries = orderUtils.getRedeliveryByUser(entity) %} | |||
{% if redeliveries|length %} | |||
{{ macros.card_start('Redelivery.list', 'danger card-outline', true) }} | |||
{{ user_macros.list_order_product_redelivery(redeliveries) }} | |||
{{ macros.card_end() }} | |||
{% endif %} | |||
{% if entity.tickets|length %} | |||
{{ macros.card_start('Ticket.listMessages', 'warning card-outline', false) }} | |||
{{ macros.list_tickets(entity.tickets) }} | |||
{{ macros.card_end() }} | |||
{% endif %} | |||
{% if entity.reductionCredits|length %} | |||
{{ macros.card_start('ReductionCredit.list', 'warning card-outline', false) }} | |||
{{ macros.list_reduction_credits(entity.reductionCredits) }} | |||
{{ macros.card_end() }} | |||
{% endif %} | |||
{% set reductionCartsAvailable = orderUtils.getReductionCartsAvailableByUser(entity) %} | |||
{% if reductionCartsAvailable|length %} | |||
{{ macros.card_start('ReductionCart.list', 'success card-outline', false) }} | |||
{{ macros.list_reduction_carts(reductionCartsAvailable, entity) }} | |||
{{ macros.card_end() }} | |||
{% endif %} | |||
</div> | |||
<div class="col-6"> | |||
{{ macros.card_start('OrderShop.list', 'primary card-outline', false) }} | |||
{{ user_macros.list_order_shops(orderUtils.getOrderShops({'user': entity})) }} | |||
{{ macros.card_end() }} | |||
</div> | |||
</div> | |||
</div> | |||
{% endblock %} |
@@ -111,12 +111,24 @@ trait OrderUtilsReductionTrait | |||
public function getReductionCartRemainingQuantity($reductionCart) :float | |||
{ | |||
return $reductionCart->getAvailableQuantity() - $this->orderShopRepo->countValidOrderWithReductionCart(); | |||
return $reductionCart->getAvailableQuantity() - $this->orderShopRepo->countValidOrderWithReductionCart($reductionCart); | |||
} | |||
public function getReductionCartRemainingQuantityPerUser($reductionCart) :float | |||
public function getReductionCartUsedQuantityPerUser($reductionCart, $user) :float | |||
{ | |||
return $reductionCart->getAvailableQuantityPerUser() - $this->orderShopRepo->countValidOrderWithReductionCartPerUser(); | |||
return $this->orderShopRepo->countValidOrderWithReductionCartPerUser($reductionCart, $user); | |||
} | |||
public function getReductionCartUsedQuantity($reductionCart) :float | |||
{ | |||
return $this->orderShopRepo->countValidOrderWithReductionCart($reductionCart); | |||
} | |||
public function getReductionCartRemainingQuantityPerUser($reductionCart, $user) :float | |||
{ | |||
if ($reductionCart->getAvailableQuantityPerUser()) { | |||
return $reductionCart->getAvailableQuantityPerUser() - $this->orderShopRepo->countValidOrderWithReductionCartPerUser($reductionCart, $user); | |||
} | |||
return false; | |||
} | |||
@@ -145,15 +157,13 @@ trait OrderUtilsReductionTrait | |||
return false ; | |||
} | |||
/*public function getReductionCreditsAvailable($order) | |||
{ | |||
$reductionCreditRepo = $this->em->getRepository(ReductionCreditInterface::class); | |||
$reductionCredits = $reductionCreditRepo->getReductionCreditByUser($order->getUser()); | |||
foreach ($reductionCredits as $reductionCredit){ | |||
public function getReductionCartsAvailableByUser($user) | |||
{ | |||
$reductionCartRepository = $this->em->getRepository(ReductionCartInterface::class) ; | |||
return $reductionCartRepository->findAllAvailableForUser($user); | |||
} | |||
} | |||
}*/ | |||
public function getReductionCreditsAvailableByUser($user) | |||
{ | |||
$reductionCredits = $this->reductionCreditRepo->findReductionCreditsByUser($user) ; | |||
@@ -189,6 +199,15 @@ trait OrderUtilsReductionTrait | |||
return false; | |||
} | |||
} | |||
public function isReductionCreditUsed($reductionCredit){ | |||
if($this->orderShopRepo->countValidOrderWithReductionCredit($reductionCredit)) { | |||
return true; | |||
}else{ | |||
return false; | |||
} | |||
} | |||
public function isReductionCreditAddedToOrder($orderShop, $reductionCredit) | |||
{ | |||
foreach($orderShop->getOrderReductionCredits() as $orderReductionCredit) { |
@@ -40,22 +40,26 @@ class OrderShopPriceUtils implements OrderShopPriceUtilsInterface | |||
return $total; | |||
} | |||
public function getMarginOrderProductsWithReductions(OrderShopInterface $orderShop): float | |||
public function getMarginOrderProductsWithReductions(OrderShopInterface $orderShop, $cache = false): float | |||
{ | |||
$total = $this->getMarginOrderProducts($orderShop); | |||
if ($cache && $orderShop->getStatMarginOrderProductsWithReductions() !== null) { | |||
return $orderShop->getStatMarginOrderProductsWithReductions(); | |||
} else { | |||
$total = $this->getMarginOrderProducts($orderShop); | |||
$totalReductionAmount = 0; | |||
foreach ($orderShop->getOrderReductionCarts() as $orderReductionCart) { | |||
$totalReductionAmount += $this->getOrderProductsReductionCartAmountWithoutTax($orderShop, $orderReductionCart); | |||
} | |||
$totalReductionAmount = 0; | |||
foreach ($orderShop->getOrderReductionCarts() as $orderReductionCart) { | |||
$totalReductionAmount += $this->getOrderProductsReductionCartAmountWithoutTax($orderShop, $orderReductionCart); | |||
} | |||
foreach ($orderShop->getOrderReductionCredits() as $orderReductionCredit) { | |||
$totalReductionAmount += $this->getOrderProductsReductionCreditAmountWithoutTax($orderShop, $orderReductionCredit); | |||
} | |||
foreach ($orderShop->getOrderReductionCredits() as $orderReductionCredit) { | |||
$totalReductionAmount += $this->getOrderProductsReductionCreditAmountWithoutTax($orderShop, $orderReductionCredit); | |||
} | |||
$total -= $totalReductionAmount; | |||
$total -= $totalReductionAmount; | |||
return $total; | |||
return $total; | |||
} | |||
} | |||
public function getMarginOrderProductsWithReductionsPercent(OrderShopInterface $orderShop): float | |||
@@ -165,12 +169,16 @@ class OrderShopPriceUtils implements OrderShopPriceUtilsInterface | |||
return $this->getTotalOrderProductsWithTax($orderShop) / $this->getTotalOrderProducts($orderShop); | |||
} | |||
public function getTotalOrderProductsWithReductions(OrderShopInterface $orderShop) | |||
public function getTotalOrderProductsWithReductions(OrderShopInterface $orderShop, $cache = false) | |||
{ | |||
$total = $this->getTotalOrderProducts($orderShop); | |||
$total -= $this->getTotalReductionCartsAmount($orderShop); | |||
$total -= $this->getTotalReductionCreditsAmount($orderShop); | |||
return $total; | |||
if($cache && $orderShop->getStatTotalOrderProductsWithReductions()!==null){ | |||
return $orderShop->getStatTotalOrderProductsWithReductions(); | |||
}else { | |||
$total = $this->getTotalOrderProducts($orderShop); | |||
$total -= $this->getTotalReductionCartsAmount($orderShop); | |||
$total -= $this->getTotalReductionCreditsAmount($orderShop); | |||
return $total; | |||
} | |||
} | |||
public function getTotalOrderProductsWithReductionCarts(OrderShopInterface $orderShop) | |||
@@ -198,12 +206,16 @@ class OrderShopPriceUtils implements OrderShopPriceUtilsInterface | |||
return $totalReductionAmount; | |||
} | |||
public function getTotalOrderProductsWithTaxAndReductions(OrderShopInterface $orderShop) | |||
public function getTotalOrderProductsWithTaxAndReductions(OrderShopInterface $orderShop, $cache = false) | |||
{ | |||
$total = $this->getTotalOrderProductsWithTax($orderShop); | |||
$total -= $this->getTotalReductionCartsAmountWithTax($orderShop); | |||
$total -= $this->getTotalReductionCreditsAmountWithTax($orderShop); | |||
return $total; | |||
if($cache && $orderShop->getStatTotalOrderProductsWithTaxAndReductions()!==null){ | |||
return $orderShop->getStatTotalOrderProductsWithTaxAndReductions(); | |||
}else { | |||
$total = $this->getTotalOrderProductsWithTax($orderShop); | |||
$total -= $this->getTotalReductionCartsAmountWithTax($orderShop); | |||
$total -= $this->getTotalReductionCreditsAmountWithTax($orderShop); | |||
return $total; | |||
} | |||
} | |||
public function getTotalOrderProductsWithTaxAndReductionCarts(OrderShopInterface $orderShop) | |||
@@ -303,32 +315,32 @@ class OrderShopPriceUtils implements OrderShopPriceUtilsInterface | |||
public function getTotalReductions(OrderShopInterface $orderShop) | |||
{ | |||
$total = 0 ; | |||
$total = 0; | |||
foreach($orderShop->getOrderReductionCarts() as $orderReductionCart) { | |||
$total += $this->getOrderProductsReductionCartAmountWithoutTax($orderShop, $orderReductionCart) ; | |||
foreach ($orderShop->getOrderReductionCarts() as $orderReductionCart) { | |||
$total += $this->getOrderProductsReductionCartAmountWithoutTax($orderShop, $orderReductionCart); | |||
} | |||
foreach($orderShop->getOrderReductionCredits() as $orderReductionCredit) { | |||
$total += $this->getOrderProductsReductionCreditAmountWithoutTax($orderShop, $orderReductionCredit) ; | |||
foreach ($orderShop->getOrderReductionCredits() as $orderReductionCredit) { | |||
$total += $this->getOrderProductsReductionCreditAmountWithoutTax($orderShop, $orderReductionCredit); | |||
} | |||
return $total ; | |||
return $total; | |||
} | |||
public function getTotalReductionsWithTax(OrderShopInterface $orderShop) | |||
{ | |||
$total = 0 ; | |||
$total = 0; | |||
foreach($orderShop->getOrderReductionCarts() as $orderReductionCart) { | |||
$total += $this->getOrderProductsReductionCartAmountWithTax($orderShop, $orderReductionCart) ; | |||
foreach ($orderShop->getOrderReductionCarts() as $orderReductionCart) { | |||
$total += $this->getOrderProductsReductionCartAmountWithTax($orderShop, $orderReductionCart); | |||
} | |||
foreach($orderShop->getOrderReductionCredits() as $orderReductionCredit) { | |||
$total += $this->getOrderProductsReductionCreditAmountWithTax($orderShop, $orderReductionCredit) ; | |||
foreach ($orderShop->getOrderReductionCredits() as $orderReductionCredit) { | |||
$total += $this->getOrderProductsReductionCreditAmountWithTax($orderShop, $orderReductionCredit); | |||
} | |||
return $total ; | |||
return $total; | |||
} | |||
} | |||
@@ -588,5 +588,10 @@ class Utils | |||
return substr($fieldName, 0, strpos($fieldName, $needle)); | |||
} | |||
public function round($price, $precision = 2) | |||
{ | |||
return round((($price * 100)) / 100, $precision); | |||
} | |||
} |