Browse Source

Merge branch 'develop'

master
Guillaume Bourgeois 4 months ago
parent
commit
8732c27c68
16 changed files with 152 additions and 104 deletions
  1. +1
    -1
      backend/controllers/DistributionController.php
  2. +2
    -1
      backend/views/automatic-email/_form.php
  3. +8
    -1
      backend/views/automatic-email/index.php
  4. +1
    -1
      backend/views/dashboard/index.php
  5. +0
    -1
      backend/views/product/_form.php
  6. +1
    -1
      console/commands/AutomaticEmailController.php
  7. +28
    -22
      domain/Communication/AutomaticEmail/AutomaticEmail.php
  8. +19
    -3
      domain/Distribution/Distribution/Distribution.php
  9. +35
    -3
      domain/Order/Order/Order.php
  10. +1
    -1
      domain/Order/Order/OrderBuilder.php
  11. +2
    -2
      domain/Order/Order/OrderManager.php
  12. +8
    -40
      domain/Order/Order/OrderSolver.php
  13. +1
    -1
      producer/controllers/OrderController.php
  14. +1
    -1
      producer/views/order/history.php
  15. +34
    -24
      producer/web/css/screen.css
  16. +10
    -1
      producer/web/sass/order/_order.scss

+ 1
- 1
backend/controllers/DistributionController.php View File

if ($ordersArray) { if ($ordersArray) {
foreach ($ordersArray as $order) { foreach ($ordersArray as $order) {
$orderModule->initOrder($order); $orderModule->initOrder($order);
if($orderModule->getSolver()->isOrderStatusValid($order)) {
if($order->isOrderStatusValid()) {
$revenues += $orderModule->getOrderAmount($order); $revenues += $orderModule->getOrderAmount($order);
$revenuesWithTax += $orderModule->getOrderAmountWithTax($order); $revenuesWithTax += $orderModule->getOrderAmountWithTax($order);
$weight += $order->weight; $weight += $order->weight;

+ 2
- 1
backend/views/automatic-email/_form.php View File

?> ?>


<div class="automatic-email-form"> <div class="automatic-email-form">
<?php $form = ActiveForm::begin(); ?>
<?php $form = ActiveForm::begin(['enableClientValidation' => false]); ?>
<div class="col-md-8"> <div class="col-md-8">
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
</div> </div>
</div> </div>
</div> </div>

<?= $this->render('@backend/views/_include/form_actions.php',[ <?= $this->render('@backend/views/_include/form_actions.php',[
'model' => $automaticEmail, 'model' => $automaticEmail,
]); ?> ]); ?>

+ 8
- 1
backend/views/automatic-email/index.php View File



?> ?>


<div class="accessory-index">
<div class="callout callout-info">
<p>
<i class="icon fa fa-info-circle"></i>
L'heure d'envoi des emails automatiques est programmée à 7h
</p>
</div>

<div class="automatic-email-index">
<?= GridView::widget([ <?= GridView::widget([
'dataProvider' => $dataProvider, 'dataProvider' => $dataProvider,
'columns' => [ 'columns' => [

+ 1
- 1
backend/views/dashboard/index.php View File

<div class="info-box-content"> <div class="info-box-content">
<span class="info-box-text"> <span class="info-box-text">
<?php if(count($distribution->order)): ?> <?php if(count($distribution->order)): ?>
<strong><?= count($distribution->order); ?></strong> COMMANDES
<strong><?= $distribution->countOrders(); ?></strong> COMMANDES
<?php else: ?> <?php else: ?>
AUCUNE COMMANDE AUCUNE COMMANDE
<?php endif; ?> <?php endif; ?>

+ 0
- 1
backend/views/product/_form.php View File

<h3 class="panel-title"> <h3 class="panel-title">
<i class="fa fa-<?= $accessoryModule->getDefinition()->getIcon() ?>"></i> <i class="fa fa-<?= $accessoryModule->getDefinition()->getIcon() ?>"></i>
Accessoires Accessoires
<a class="btn btn-default btn-xs" href="<?= Yii::$app->urlManager->createUrl(['accessory/index']) ?>">Gérer</a>
</h3> </h3>
</div> </div>
<div class="panel-body"> <div class="panel-body">

+ 1
- 1
console/commands/AutomaticEmailController.php View File

$automaticEmailsArray = $automaticEmailModule->getRepository()->findAutomaticEmails(); $automaticEmailsArray = $automaticEmailModule->getRepository()->findAutomaticEmails();
foreach($automaticEmailsArray as $automaticEmail) { foreach($automaticEmailsArray as $automaticEmail) {
$distribution = $automaticEmailModule->getResolver()->getMatchedDistribution($automaticEmail); $distribution = $automaticEmailModule->getResolver()->getMatchedDistribution($automaticEmail);
if($distribution) {
if($automaticEmail->isEnabled() && $distribution) {
$email = $automaticEmailModule->getManager()->createEmailFromAutomaticEmail($automaticEmail, $distribution); $email = $automaticEmailModule->getManager()->createEmailFromAutomaticEmail($automaticEmail, $distribution);
$usersArray = $emailModule->getContactListResolver()->search($producer, Email::TYPE_ORDER_TAKING, $distribution); $usersArray = $emailModule->getContactListResolver()->search($producer, Email::TYPE_ORDER_TAKING, $distribution);
$emailModule->getBulkMailer()->sendEmail($email, $usersArray); $emailModule->getBulkMailer()->sendEmail($email, $usersArray);

+ 28
- 22
domain/Communication/AutomaticEmail/AutomaticEmail.php View File



use common\components\ActiveRecordCommon; use common\components\ActiveRecordCommon;
use common\components\Date; use common\components\Date;
use domain\_\StatusInterface;
use domain\Producer\Producer\Producer; use domain\Producer\Producer\Producer;
use yii\db\ActiveQuery; use yii\db\ActiveQuery;


]; ];
} }


/* Méthodes */

public function isEnabled(): bool
{
return (bool) $this->getStatus() == StatusInterface::STATUS_ONLINE;
}

public function getDayAsString(): string
{
return Date::getDayOfWeekStringByNumber($this->getDay());
}

public function getDelayBeforeDistributionAsString(): string
{
return $this->getDelayBeforeDistribution().' jour(s) avant';
}

public function getStatusAsHtml(): string
{
if($this->getStatus()) {
return '<span class="label label-success">Activé</span>';
}
else {
return '<span class="label label-danger">Désactivé</span>';
}
}

/* Getters / Setters */ /* Getters / Setters */


public function getId(): ?int public function getId(): ?int
{ {
return $this->hasOne(Producer::class, ['id' => 'id_producer']); return $this->hasOne(Producer::class, ['id' => 'id_producer']);
} }

/* Méthodes */

public function getDayAsString(): string
{
return Date::getDayOfWeekStringByNumber($this->getDay());
}

public function getDelayBeforeDistributionAsString(): string
{
return $this->getDelayBeforeDistribution().' jour(s) avant';
}

public function getStatusAsHtml(): string
{
if($this->getStatus()) {
return '<span class="label label-success">Activé</span>';
}
else {
return '<span class="label label-danger">Désactivé</span>';
}
}
} }

+ 19
- 3
domain/Distribution/Distribution/Distribution.php View File

]; ];
} }


/*
* Relations
*/
/* Getters / Setters */

/* Méthodes */

public function countOrders(): int
{
$count = 0;
$ordersArray = $this->order;

foreach($ordersArray as $order) {
if($order->isOrderStatusValid()) {
$count ++;
}
}

return $count;
}

/* Relations */


public function getProducer() public function getProducer()
{ {

+ 35
- 3
domain/Order/Order/Order.php View File

]; ];
} }


/*
* Relations
*/
/* Getters / Setters */

/* Méthodes */

public function isOrderStatusValid(): bool
{
return $this->isOrderStatusOrdered() || $this->isOrderStatusUpdated();
}

public function isOrderStatusCanceledOrDeleted(): bool
{
return $this->isOrderStatusCanceled() || $this->isOrderStatusDeleted();
}

public function isOrderStatusOrdered(): bool
{
return $this->getOrderStatusAlias() == OrderStatus::ALIAS_ORDERED;
}

public function isOrderStatusUpdated(): bool
{
return $this->getOrderStatusAlias() == OrderStatus::ALIAS_UPDATED;
}

public function isOrderStatusCanceled(): bool
{
return $this->getOrderStatusAlias() == OrderStatus::ALIAS_CANCELED;
}

public function isOrderStatusDeleted(): bool
{
return $this->getOrderStatusAlias() == OrderStatus::ALIAS_DELETED;
}

/* Relations */


public function getUser() public function getUser()
{ {

+ 1
- 1
domain/Order/Order/OrderBuilder.php View File

if ($pointSale->id == $order->id_point_sale) { if ($pointSale->id == $order->id_point_sale) {
$pointSale->orders[] = $order; $pointSale->orders[] = $order;


if($this->orderSolver->isOrderStatusValid($order)) {
if($order->isOrderStatusValid()) {
$pointSale->revenues += (float)$order->amount; $pointSale->revenues += (float)$order->amount;
$pointSale->revenues_with_tax += (float)$order->amount_with_tax; $pointSale->revenues_with_tax += (float)$order->amount_with_tax;
} }

+ 2
- 2
domain/Order/Order/OrderManager.php View File

$orderStatus = $this->orderStatusRepository->getOrderStatusByAlias($orderStatusAlias); $orderStatus = $this->orderStatusRepository->getOrderStatusByAlias($orderStatusAlias);


$order->setOrderStatus($orderStatus); $order->setOrderStatus($orderStatus);
if(!$this->orderSolver->isOrderStatusOrdered($order)) {
if(!$order->isOrderStatusOrdered()) {
$this->orderBuilder->initDateUpdate($order); $this->orderBuilder->initDateUpdate($order);
} }
$this->orderBuilder->update($order); $this->orderBuilder->update($order);
// delete // delete
if ($this->producerSolver->getConfig('option_behavior_cancel_order') == Producer::BEHAVIOR_DELETE_ORDER_DELETE || if ($this->producerSolver->getConfig('option_behavior_cancel_order') == Producer::BEHAVIOR_DELETE_ORDER_DELETE ||
($this->producerSolver->getConfig('option_behavior_cancel_order') == Producer::BEHAVIOR_DELETE_ORDER_STATUS ($this->producerSolver->getConfig('option_behavior_cancel_order') == Producer::BEHAVIOR_DELETE_ORDER_STATUS
&& $this->orderSolver->isOrderStatusCanceled($order))
&& $order->isOrderStatusCanceled())
|| $force) { || $force) {


$this->changeOrderStatus($order, OrderStatus::ALIAS_DELETED, $user); $this->changeOrderStatus($order, OrderStatus::ALIAS_DELETED, $user);

+ 8
- 40
domain/Order/Order/OrderSolver.php View File



if (count($ordersArray)) { if (count($ordersArray)) {
foreach ($ordersArray as $order) { foreach ($ordersArray as $order) {
if($this->isOrderStatusValid($order)) {
if($order->isOrderStatusValid()) {
foreach ($order->productOrder as $productOrder) { foreach ($order->productOrder as $productOrder) {
if ($productOrder->id_product == $product->id) { if ($productOrder->id_product == $product->id) {
$quantity += $this->productOrderSolver->getQuantityPieces($productOrder); $quantity += $this->productOrderSolver->getQuantityPieces($productOrder);


if (count($ordersArray)) { if (count($ordersArray)) {
foreach ($ordersArray as $order) { foreach ($ordersArray as $order) {
if ($this->isOrderStatusValid($order) || $ignoreCancel) {
if ($order->isOrderStatusValid() || $ignoreCancel) {
foreach ($order->productOrder as $productOrder) { foreach ($order->productOrder as $productOrder) {
if ($productOrder->id_product == $product->id && if ($productOrder->id_product == $product->id &&
((is_null($unit) && $productOrder->product->unit == $productOrder->unit) ((is_null($unit) && $productOrder->product->unit == $productOrder->unit)
// getClassHistory // getClassHistory
public function getHistoryClass(Order $order): string public function getHistoryClass(Order $order): string
{ {
if($this->isOrderStatusCanceled($order)) {
if($order->isOrderStatusCanceled()) {
return 'commande-delete'; return 'commande-delete';
} }


return $orderStatusHistoryReturn; return $orderStatusHistoryReturn;
} }


public function isOrderStatusValid(Order $order): bool
{
return $this->isOrderStatusOrdered($order)
|| $this->isOrderStatusUpdated($order);
}

public function isOrderStatusCanceledOrDeleted(Order $order): bool
{
return $this->isOrderStatusCanceled($order)
|| $this->isOrderStatusDeleted($order);
}

public function isOrderStatusOrdered(Order $order): bool
{
return $order->getOrderStatusAlias() == OrderStatus::ALIAS_ORDERED;
}

public function isOrderStatusUpdated(Order $order): bool
{
return $order->getOrderStatusAlias() == OrderStatus::ALIAS_UPDATED;
}

public function isOrderStatusCanceled(Order $order): bool
{
return $order->getOrderStatusAlias() == OrderStatus::ALIAS_CANCELED;
}

public function isOrderStatusDeleted(Order $order): bool
{
return $order->getOrderStatusAlias() == OrderStatus::ALIAS_DELETED;
}

public function getLabelDeleteAction(Order $order): string public function getLabelDeleteAction(Order $order): string
{ {
$optionBehaviorCancelOrder = $this->producerSolver->getConfig('option_behavior_cancel_order'); $optionBehaviorCancelOrder = $this->producerSolver->getConfig('option_behavior_cancel_order');


if($optionBehaviorCancelOrder == Producer::BEHAVIOR_DELETE_ORDER_STATUS && $this->isOrderStatusValid($order)) {
if($optionBehaviorCancelOrder == Producer::BEHAVIOR_DELETE_ORDER_STATUS && $order->isOrderStatusValid()) {
return 'Annuler'; return 'Annuler';
} }




public function getOrderStatusCssClass(Order $order): string public function getOrderStatusCssClass(Order $order): string
{ {
if($this->isOrderStatusOrdered($order)) {
if($order->isOrderStatusOrdered()) {
return 'success'; return 'success';
} }
elseif($this->isOrderStatusUpdated($order)) {
elseif($order->isOrderStatusUpdated()) {
return 'warning'; return 'warning';
} }
elseif($this->isOrderStatusCanceled($order)) {
elseif($order->isOrderStatusCanceled()) {
return 'danger'; return 'danger';
} }
elseif($this->isOrderStatusDeleted($order)) {
elseif($order->isOrderStatusDeleted()) {
return 'danger'; return 'danger';
} }



+ 1
- 1
producer/controllers/OrderController.php View File

$pointSaleModule->getComment($pointSale) : ''; $pointSaleModule->getComment($pointSale) : '';


// une commande annulée est automatiquement réactivée lors d'une modification // une commande annulée est automatiquement réactivée lors d'une modification
if($orderModule->getSolver()->isOrderStatusCanceled($order)) {
if($order->isOrderStatusCanceled()) {
$orderModule->getManager()->changeOrderStatus($order, OrderStatus::ALIAS_UPDATED, $this->getUserCurrent()); $orderModule->getManager()->changeOrderStatus($order, OrderStatus::ALIAS_UPDATED, $this->getUserCurrent());
} }



+ 1
- 1
producer/views/order/history.php View File

'value' => function($order) use ($orderModule) { 'value' => function($order) use ($orderModule) {
$html = '' ; $html = '' ;
if($orderModule->getSolver()->isOrderStatusCanceled($order)) {
if($order->isOrderStatusCanceled()) {
$html .= '<span class="badge text-bg-danger">Annulée</span>' ; $html .= '<span class="badge text-bg-danger">Annulée</span>' ;
} }
else { else {

+ 34
- 24
producer/web/css/screen.css View File

/* line 333, ../sass/order/_order.scss */ /* line 333, ../sass/order/_order.scss */
.order-order #main #app-order-order table#products .price-unit .decreasing-prices { .order-order #main #app-order-order table#products .price-unit .decreasing-prices {
margin-top: 10px; margin-top: 10px;
font-size: 10px;
font-size: 12px;
line-height: 15px;
padding-top: 6px; padding-top: 6px;
padding-bottom: 2px; padding-bottom: 2px;
margin-bottom: 0px; margin-bottom: 0px;
padding-left: 10px;
padding-right: 10px;
}
/* line 343, ../sass/order/_order.scss */
.order-order #main #app-order-order table#products .price-unit .decreasing-prices ul {
padding: 0px;
margin: 0px;
list-style-type: none;
} }
/* line 341, ../sass/order/_order.scss */
/* line 348, ../sass/order/_order.scss */
.order-order #main #app-order-order table#products .price-unit .decreasing-prices ul li { .order-order #main #app-order-order table#products .price-unit .decreasing-prices ul li {
margin-bottom: 5px; margin-bottom: 5px;
text-align: left;
} }
/* line 343, ../sass/order/_order.scss */
/* line 352, ../sass/order/_order.scss */
.order-order #main #app-order-order table#products .price-unit .decreasing-prices ul li strong { .order-order #main #app-order-order table#products .price-unit .decreasing-prices ul li strong {
font-weight: bold; font-weight: bold;
} }
/* line 351, ../sass/order/_order.scss */
/* line 360, ../sass/order/_order.scss */
.order-order #main #app-order-order table#products .price-unit, .order-order #main #app-order-order table#products .price-total { .order-order #main #app-order-order table#products .price-unit, .order-order #main #app-order-order table#products .price-total {
width: 135px; width: 135px;
text-align: center; text-align: center;
} }
/* line 355, ../sass/order/_order.scss */
/* line 364, ../sass/order/_order.scss */
.order-order #main #app-order-order table#products .price-unit .price-infos, .order-order #main #app-order-order table#products .price-total .price-infos { .order-order #main #app-order-order table#products .price-unit .price-infos, .order-order #main #app-order-order table#products .price-total .price-infos {
color: gray; color: gray;
font-size: 13px; font-size: 13px;
line-height: 15px; line-height: 15px;
} }
/* line 362, ../sass/order/_order.scss */
/* line 371, ../sass/order/_order.scss */
.order-order #main #app-order-order table#products tr.product-open td.price-total { .order-order #main #app-order-order table#products tr.product-open td.price-total {
font-size: 1.1rem; font-size: 1.1rem;
font-family: 'worksans_bold'; font-family: 'worksans_bold';
padding-top: 19px; padding-top: 19px;
} }
/* line 368, ../sass/order/_order.scss */
/* line 377, ../sass/order/_order.scss */
.order-order #main #app-order-order table#products .td-quantity { .order-order #main #app-order-order table#products .td-quantity {
width: 175px; width: 175px;
} }
/* line 371, ../sass/order/_order.scss */
/* line 380, ../sass/order/_order.scss */
.order-order #main #app-order-order table#products .td-quantity input.quantity, .order-order #main #app-order-order table#products .td-quantity input.quantity,
.order-order #main #app-order-order table#products .td-quantity .input-group-text { .order-order #main #app-order-order table#products .td-quantity .input-group-text {
background-color: white; background-color: white;
} }
/* line 376, ../sass/order/_order.scss */
/* line 385, ../sass/order/_order.scss */
.order-order #main #app-order-order table#products .td-quantity input.quantity { .order-order #main #app-order-order table#products .td-quantity input.quantity {
text-align: center; text-align: center;
border: 0px none; border: 0px none;
} }
/* line 380, ../sass/order/_order.scss */
/* line 389, ../sass/order/_order.scss */
.order-order #main #app-order-order table#products .td-quantity .input-group-text { .order-order #main #app-order-order table#products .td-quantity .input-group-text {
border: 0px none; border: 0px none;
padding-right: 10px; padding-right: 10px;
padding-left: 0px; padding-left: 0px;
margin: 0px; margin: 0px;
} }
/* line 388, ../sass/order/_order.scss */
/* line 397, ../sass/order/_order.scss */
.order-order #main #app-order-order table#products .td-quantity .input-group-btn button { .order-order #main #app-order-order table#products .td-quantity .input-group-btn button {
padding: 4px 5px 0px 5px; padding: 4px 5px 0px 5px;
} }
/* line 390, ../sass/order/_order.scss */
/* line 399, ../sass/order/_order.scss */
.order-order #main #app-order-order table#products .td-quantity .input-group-btn button .bi { .order-order #main #app-order-order table#products .td-quantity .input-group-btn button .bi {
font-size: 1.5em; font-size: 1.5em;
font-weight: bold; font-weight: bold;
margin: 0px; margin: 0px;
} }
/* line 401, ../sass/order/_order.scss */
/* line 410, ../sass/order/_order.scss */
.order-order #main #app-order-order table#products tr.total .summary { .order-order #main #app-order-order table#products tr.total .summary {
padding: 25px; padding: 25px;
} }
/* line 404, ../sass/order/_order.scss */
/* line 413, ../sass/order/_order.scss */
.order-order #main #app-order-order table#products tr.total .summary h3 { .order-order #main #app-order-order table#products tr.total .summary h3 {
font-family: 'worksans_bold'; font-family: 'worksans_bold';
margin-top: 0px; margin-top: 0px;
text-transform: uppercase; text-transform: uppercase;
margin-bottom: 5px; margin-bottom: 5px;
} }
/* line 411, ../sass/order/_order.scss */
/* line 420, ../sass/order/_order.scss */
.order-order #main #app-order-order table#products tr.total .summary ul { .order-order #main #app-order-order table#products tr.total .summary ul {
margin-bottom: 15px; margin-bottom: 15px;
padding-left: 20px; padding-left: 20px;
line-height: 1.4rem; line-height: 1.4rem;
list-style-type: disc; list-style-type: disc;
} }
/* line 419, ../sass/order/_order.scss */
/* line 428, ../sass/order/_order.scss */
.order-order #main #app-order-order table#products tr.total .summary ul li .quantity { .order-order #main #app-order-order table#products tr.total .summary ul li .quantity {
font-weight: bold; font-weight: bold;
} }
/* line 426, ../sass/order/_order.scss */
/* line 435, ../sass/order/_order.scss */
.order-order #main #app-order-order table#products tr.total .price-total { .order-order #main #app-order-order table#products tr.total .price-total {
padding-top: 25px; padding-top: 25px;
font-size: 1.5rem; font-size: 1.5rem;
font-family: 'worksans_bold'; font-family: 'worksans_bold';
} }
/* line 431, ../sass/order/_order.scss */
/* line 440, ../sass/order/_order.scss */
.order-order #main #app-order-order table#products tr.total .price-total span { .order-order #main #app-order-order table#products tr.total .price-total span {
display: inline-block; display: inline-block;
padding: 7px 15px; padding: 7px 15px;
color: white; color: white;
font-size: 1.2rem; font-size: 1.2rem;
} }
/* line 443, ../sass/order/_order.scss */
/* line 452, ../sass/order/_order.scss */
.order-order #main #app-order-order #payment-methods .infos { .order-order #main #app-order-order #payment-methods .infos {
margin-top: 10px; margin-top: 10px;
color: gray; color: gray;
} }
/* line 450, ../sass/order/_order.scss */
/* line 459, ../sass/order/_order.scss */
.order-order #main #app-order-order #content-step-payment .delivery { .order-order #main #app-order-order #content-step-payment .delivery {
margin-bottom: 20px; margin-bottom: 20px;
} }
/* line 454, ../sass/order/_order.scss */
/* line 463, ../sass/order/_order.scss */
.order-order #main #app-order-order #content-step-payment .comment { .order-order #main #app-order-order #content-step-payment .comment {
margin-bottom: 20px; margin-bottom: 20px;
} }
/* line 458, ../sass/order/_order.scss */
/* line 467, ../sass/order/_order.scss */
.order-order #main #app-order-order #content-step-payment #payment-methods { .order-order #main #app-order-order #content-step-payment #payment-methods {
margin-bottom: 20px; margin-bottom: 20px;
} }
/* line 463, ../sass/order/_order.scss */
/* line 472, ../sass/order/_order.scss */
.order-order #main #app-order-order #content-step-payment .credit .info { .order-order #main #app-order-order #content-step-payment .credit .info {
margin-left: 20px; margin-left: 20px;
color: gray; color: gray;
} }


/* line 476, ../sass/order/_order.scss */
/* line 485, ../sass/order/_order.scss */
#main #content .panel h3 { #main #content .panel h3 {
font-family: "worksans_bold"; font-family: "worksans_bold";
margin: 0px; margin: 0px;

+ 10
- 1
producer/web/sass/order/_order.scss View File

.price-unit { .price-unit {
.decreasing-prices { .decreasing-prices {
margin-top: 10px; margin-top: 10px;
font-size: 10px;
font-size: 12px;
line-height: 15px;
padding-top: 6px; padding-top: 6px;
padding-bottom: 2px; padding-bottom: 2px;
margin-bottom: 0px; margin-bottom: 0px;
padding-left: 10px;
padding-right: 10px;


ul { ul {
padding: 0px;
margin: 0px;
list-style-type: none;

li { li {
margin-bottom: 5px; margin-bottom: 5px;
text-align: left;

strong { strong {
font-weight: bold; font-weight: bold;
} }

Loading…
Cancel
Save