Procházet zdrojové kódy

[Administration] Refactoring DistributionController #1342

feature/souke
Guillaume Bourgeois před 1 rokem
rodič
revize
b4370c19ba
5 změnil soubory, kde provedl 265 přidání a 239 odebrání
  1. +3
    -93
      backend/controllers/DistributionController.php
  2. +83
    -0
      common/components/TillerClient.php
  3. +0
    -146
      common/helpers/Tiller.php
  4. +7
    -0
      common/logic/Order/Order/Module/OrderModule.php
  5. +172
    -0
      common/logic/Order/Order/Service/TillerManager.php

+ 3
- 93
backend/controllers/DistributionController.php Zobrazit soubor

@@ -433,12 +433,7 @@ class DistributionController extends BackendController

public function buildAjaxInfosResponseTiller(Producer $producer, string $date)
{
if ($producer->tiller) {
$tiller = new Tiller();
return (int) $tiller->isSynchro($date);
}

return false;
return $this->getOrderModule()->getTillerManager()->isSynchronized($date);
}

public function buildAjaxInfosResponseMissingSubscriptions(string $date, Distribution $distribution, array $ordersArray)
@@ -825,95 +820,10 @@ class DistributionController extends BackendController
*
* @param string $date
*/
public function actionAjaxProcessSynchroTiller($date)
public function actionAjaxProcessSynchroTiller(string $date)
{
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;

$producerModule = $this->getProducerModule();
$productOrderModule = $this->getProductOrderModule();
$orderModule = $this->getOrderModule();

$return = [];
$producerTiller = $producerModule->getConfig('tiller');

if ($producerTiller) {
$tiller = new Tiller();
$isSynchro = $tiller->isSynchro($date);

if (!$isSynchro) {
$orders = Order::searchAll([
'distribution.date' => $date,
'order.tiller_synchronization' => 1
], [
'conditions' => 'date_delete IS NULL'
]);

$strDate = date('Y-m-d\T12:i:s+0000', strtotime($date) + 1);

if ($orders && count($orders)) {
foreach ($orders as $order) {
$orderModule->initOrder($order);
$lines = [];
foreach ($order->productOrder as $productOrder) {
$lines[] = [
'name' => $productOrder->product->name,
'price' => $productOrderModule->getPriceWithTax($productOrder) * 100 * $productOrder->quantity,
'tax' => $productOrder->taxRate->value * 100,
'date' => $strDate,
'quantity' => $productOrder->quantity
];
}

$typePaymentTiller = '';
if ($order->mean_payment == MeanPayment::MONEY) {
$typePaymentTiller = 'CASH';
}
if ($order->mean_payment == MeanPayment::CREDIT_CARD
|| $order->mean_payment == MeanPayment::CREDIT
|| $order->mean_payment == MeanPayment::TRANSFER
|| $order->mean_payment == MeanPayment::OTHER) {
$typePaymentTiller = 'CARD';
}
if ($order->mean_payment == MeanPayment::CHEQUE) {
$typePaymentTiller = 'BANK_CHECK';
}
if (!strlen($typePaymentTiller) || !$order->mean_payment) {
$typePaymentTiller = 'CASH';
}

if(!$tiller->isSynchro($date, $order->id)) {
$returnTiller = $tiller->postOrder([
'externalId' => $order->id,
'type' => 1,
'status' => 'IN_PROGRESS',
'openDate' => $strDate,
'closeDate' => $strDate,
'lines' => $lines,
'payments' => [
[
'type' => $typePaymentTiller,
'amount' => $orderModule->getOrderAmountWithTax(
$order,
Order::AMOUNT_PAID
) * 100,
'status' => 'ACCEPTED',
'date' => $strDate
]
]
]);

$returnTillerObject = json_decode($returnTiller);
$order->tiller_external_id = '' . $returnTillerObject->id;
$order->save();

$return[] = $returnTiller;
}
}
}
}
}

return $return;
return $this->getOrderModule()->getTillerManager()->synchronizeDistribution($date);
}

public function actionAjaxGenerateDeliveryNotePointSale(string $idOrders)

+ 83
- 0
common/components/TillerClient.php Zobrazit soubor

@@ -0,0 +1,83 @@
<?php

/**
* Copyright distrib (2018)
*
* contact@opendistrib.net
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
*
* Ce logiciel est régi par la licence CeCILL soumise au droit français et
* respectant les principes de diffusion des logiciels libres. Vous pouvez
* utiliser, modifier et/ou redistribuer ce programme sous les conditions
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
* sur le site "http://www.cecill.info".
*
* En contrepartie de l'accessibilité au code source et des droits de copie,
* de modification et de redistribution accordés par cette licence, il n'est
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
* seule une responsabilité restreinte pèse sur l'auteur du programme, le
* titulaire des droits patrimoniaux et les concédants successifs.
*
* A cet égard l'attention de l'utilisateur est attirée sur les risques
* associés au chargement, à l'utilisation, à la modification et/ou au
* développement et à la reproduction du logiciel par l'utilisateur étant
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à
* manipuler et qui le réserve donc à des développeurs et des professionnels
* avertis possédant des connaissances informatiques approfondies. Les
* utilisateurs sont donc invités à charger et tester l'adéquation du
* logiciel à leurs besoins dans des conditions permettant d'assurer la
* sécurité de leurs systèmes et ou de leurs données et, plus généralement,
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
*
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
* pris connaissance de la licence CeCILL, et que vous en avez accepté les
* termes.
*/

namespace common\components;

use linslin\yii2\curl;

class TillerClient
{
var $curl;
var $providerToken;
var $restaurantToken;
var $urlApi = 'https://app.tillersystems.com/api/';

public function __construct(string $providerToken, string $restaurantToken)
{
$this->curl = new curl\Curl();
$this->providerToken = $providerToken;
$this->restaurantToken = $restaurantToken;
}

public function getOrders($date)
{
$orders = $this->curl->setGetParams([
'provider_token' => $this->providerToken,
'restaurant_token' => $this->restaurantToken,
'dateFrom' => date('Y-m-d H-i-s', strtotime($date)),
'dateTo' => date(
'Y-m-d H-i-s',
strtotime($date) + 24 * 60 * 60 - 1
),
'status' => 'IN_PROGRESS',
])->get($this->urlApi . 'orders');

return json_decode($orders);
}

public function postOrder($params)
{
return $this->curl->setPostParams(
array_merge([
'provider_token' => $this->providerToken,
'restaurant_token' => $this->restaurantToken,
], $params)
)
->post($this->urlApi . 'orders');
}
}

+ 0
- 146
common/helpers/Tiller.php Zobrazit soubor

@@ -1,146 +0,0 @@
<?php

/**
* Copyright distrib (2018)
*
* contact@opendistrib.net
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
*
* Ce logiciel est régi par la licence CeCILL soumise au droit français et
* respectant les principes de diffusion des logiciels libres. Vous pouvez
* utiliser, modifier et/ou redistribuer ce programme sous les conditions
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
* sur le site "http://www.cecill.info".
*
* En contrepartie de l'accessibilité au code source et des droits de copie,
* de modification et de redistribution accordés par cette licence, il n'est
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
* seule une responsabilité restreinte pèse sur l'auteur du programme, le
* titulaire des droits patrimoniaux et les concédants successifs.
*
* A cet égard l'attention de l'utilisateur est attirée sur les risques
* associés au chargement, à l'utilisation, à la modification et/ou au
* développement et à la reproduction du logiciel par l'utilisateur étant
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à
* manipuler et qui le réserve donc à des développeurs et des professionnels
* avertis possédant des connaissances informatiques approfondies. Les
* utilisateurs sont donc invités à charger et tester l'adéquation du
* logiciel à leurs besoins dans des conditions permettant d'assurer la
* sécurité de leurs systèmes et ou de leurs données et, plus généralement,
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
*
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
* pris connaissance de la licence CeCILL, et que vous en avez accepté les
* termes.
*/

namespace common\helpers;

use common\logic\Order\Order\Model\Order;
use common\logic\Order\Order\Module\OrderModule;
use common\logic\Producer\Producer\Module\ProducerModule;
use linslin\yii2\curl;

class Tiller
{
var $curl;
var $producer_tiller;
var $provider_token;
var $restaurant_token;
//var $url_api = 'https://developers.tillersystems.com/api/';
var $url_api = 'https://app.tillersystems.com/api/';

public function __construct()
{
$producerModule = ProducerModule::getInstance();

$this->curl = new curl\Curl();
$this->producer_tiller = $producerModule->getConfig('tiller');
$this->provider_token = $producerModule->getConfig('tiller_provider_token');
$this->restaurant_token = $producerModule->getConfig('tiller_restaurant_token');
}

public function getOrders($date)
{
if ($this->producer_tiller) {
$orders = $this->curl->setGetParams([
'provider_token' => $this->provider_token,
'restaurant_token' => $this->restaurant_token,
'dateFrom' => date('Y-m-d H-i-s', strtotime($date)),
'dateTo' => date(
'Y-m-d H-i-s',
strtotime($date) + 24 * 60 * 60 - 1
),
'status' => 'IN_PROGRESS',
])->get($this->url_api . 'orders');

return json_decode($orders);
}
}

public function isSynchro($date, $idOrder = null)
{
$orderModule = OrderModule::getInstance();

if ($this->producer_tiller) {
$ordersTiller = $this->getOrders($date);

$ordersOpendistrib = Order::searchAll([
'distribution.date' => $date,
'order.tiller_synchronization' => 1
], [
'conditions' => 'date_delete IS NULL'
]);

$ordersOpendistribSynchro = [];

if ($ordersOpendistrib) {
foreach ($ordersOpendistrib as $orderOpendistrib) {
$orderModule->initOrder($orderOpendistrib);
$ordersOpendistribSynchro[$orderOpendistrib->id] = false;
if (isset($ordersTiller->orders)) {
foreach ($ordersTiller->orders as $orderTiller) {
if ($orderOpendistrib->tiller_external_id == $orderTiller->id) {
$amountTotalPaidOrderOpendistrib = (int)round(
$orderModule->getOrderAmountWithTax($orderOpendistrib, Order::AMOUNT_PAID) * 100
);
if ($amountTotalPaidOrderOpendistrib >= (int)$orderTiller->currentPayedAmount
|| $amountTotalPaidOrderOpendistrib >= (int)$orderTiller->currentBill) {
$ordersOpendistribSynchro[$orderOpendistrib->id] = true;
}
}
}
}
}
}

if($idOrder && isset($ordersOpendistribSynchro[$idOrder])) {
return $ordersOpendistribSynchro[$idOrder];
}
else {
foreach ($ordersOpendistribSynchro as $idOrder => $isSynchro) {
if (!$isSynchro) {
return false;
}
}
}

return true;
}
}

public function postOrder($params)
{
if ($this->producer_tiller) {
return $this->curl->setPostParams(
array_merge([
'provider_token' => $this->provider_token,
'restaurant_token' => $this->restaurant_token,
], $params)
)
->post($this->url_api . 'orders');
}
}
}

+ 7
- 0
common/logic/Order/Order/Module/OrderModule.php Zobrazit soubor

@@ -9,6 +9,7 @@ use common\logic\Order\Order\Service\OrderDefinition;
use common\logic\Order\Order\Service\OrderDocumentManager;
use common\logic\Order\Order\Service\OrderSolver;
use common\logic\Order\Order\Service\OrderManager;
use common\logic\Order\Order\Service\TillerManager;

/**
* @mixin OrderDefinition
@@ -28,6 +29,7 @@ class OrderModule extends AbstractModule
OrderBuilder::class,
OrderManager::class,
OrderDocumentManager::class,
TillerManager::class,
];
}

@@ -60,4 +62,9 @@ class OrderModule extends AbstractModule
{
return OrderDocumentManager::getInstance();
}

public function getTillerManager(): TillerManager
{
return TillerManager::getInstance();
}
}

+ 172
- 0
common/logic/Order/Order/Service/TillerManager.php Zobrazit soubor

@@ -0,0 +1,172 @@
<?php

namespace common\logic\Order\Order\Service;

use common\components\TillerClient;
use common\helpers\MeanPayment;
use common\logic\AbstractManager;
use common\logic\Order\Order\Model\Order;
use common\logic\Order\ProductOrder\Service\ProductOrderSolver;
use common\logic\Producer\Producer\Service\ProducerSolver;

class TillerManager extends AbstractManager
{
protected bool $tillerActivated;
protected ProducerSolver $producerSolver;
protected TillerClient $tillerClient;
protected OrderSolver $orderSolver;
protected OrderBuilder $orderBuilder;
protected ProductOrderSolver $productOrderSolver;

public function loadDependencies(): void
{
$this->producerSolver = $this->loadService(ProducerSolver::class);
$this->tillerActivated = $this->producerSolver->getConfig('tiller');
$this->tillerClient = $this->getClient();
$this->orderSolver = $this->loadService(OrderSolver::class);
$this->orderBuilder = $this->loadService(OrderBuilder::class);
$this->productOrderSolver = $this->loadService(ProductOrderSolver::class);
}

public function getClient(): TillerClient
{
return new TillerClient(
$this->producerSolver->getConfig('tiller_provider_token'),
$this->producerSolver->getConfig('tiller_restaurant_token')
);
}

public function synchronizeDistribution(string $date): array
{
$return = [];

if($this->tillerActivated) {
$isSynchro = $this->isSynchronized($date);

if (!$isSynchro) {
$orders = Order::searchAll([
'distribution.date' => $date,
'order.tiller_synchronization' => 1
], [
'conditions' => 'date_delete IS NULL'
]);

$strDate = date('Y-m-d\T12:i:s+0000', strtotime($date) + 1);

if ($orders && count($orders)) {
foreach ($orders as $order) {
$this->orderBuilder->initOrder($order);
$lines = [];
foreach ($order->productOrder as $productOrder) {
$lines[] = [
'name' => $productOrder->product->name,
'price' => $this->productOrderSolver->getPriceWithTax($productOrder) * 100 * $productOrder->quantity,
'tax' => $productOrder->taxRate->value * 100,
'date' => $strDate,
'quantity' => $productOrder->quantity
];
}

$typePaymentTiller = '';
if ($order->mean_payment == MeanPayment::MONEY) {
$typePaymentTiller = 'CASH';
}
if ($order->mean_payment == MeanPayment::CREDIT_CARD
|| $order->mean_payment == MeanPayment::CREDIT
|| $order->mean_payment == MeanPayment::TRANSFER
|| $order->mean_payment == MeanPayment::OTHER) {
$typePaymentTiller = 'CARD';
}
if ($order->mean_payment == MeanPayment::CHEQUE) {
$typePaymentTiller = 'BANK_CHECK';
}
if (!strlen($typePaymentTiller) || !$order->mean_payment) {
$typePaymentTiller = 'CASH';
}

if (!$this->isSynchronized($date, $order->id)) {
$returnTiller = $this->tillerClient->postOrder([
'externalId' => $order->id,
'type' => 1,
'status' => 'IN_PROGRESS',
'openDate' => $strDate,
'closeDate' => $strDate,
'lines' => $lines,
'payments' => [
[
'type' => $typePaymentTiller,
'amount' => $this->orderSolver->getOrderAmountWithTax(
$order,
Order::AMOUNT_PAID
) * 100,
'status' => 'ACCEPTED',
'date' => $strDate
]
]
]);

$returnTillerObject = json_decode($returnTiller);
$order->tiller_external_id = '' . $returnTillerObject->id;
$order->save();

$return[] = $returnTiller;
}
}
}
}
}

return $return;
}

public function isSynchronized($date, $idOrder = null): bool
{
if ($this->tillerActivated) {
$ordersTiller = $this->tillerClient->getOrders($date);

$ordersOpendistrib = Order::searchAll([
'distribution.date' => $date,
'order.tiller_synchronization' => 1
], [
'conditions' => 'date_delete IS NULL'
]);

$ordersOpendistribSynchro = [];

if ($ordersOpendistrib) {
foreach ($ordersOpendistrib as $orderOpendistrib) {
$this->orderBuilder->initOrder($orderOpendistrib);
$ordersOpendistribSynchro[$orderOpendistrib->id] = false;
if (isset($ordersTiller->orders)) {
foreach ($ordersTiller->orders as $orderTiller) {
if ($orderOpendistrib->tiller_external_id == $orderTiller->id) {
$amountTotalPaidOrderOpendistrib = (int)round(
$this->orderSolver->getOrderAmountWithTax($orderOpendistrib, Order::AMOUNT_PAID) * 100
);
if ($amountTotalPaidOrderOpendistrib >= (int)$orderTiller->currentPayedAmount
|| $amountTotalPaidOrderOpendistrib >= (int)$orderTiller->currentBill) {
$ordersOpendistribSynchro[$orderOpendistrib->id] = true;
}
}
}
}
}
}

if($idOrder && isset($ordersOpendistribSynchro[$idOrder])) {
return $ordersOpendistribSynchro[$idOrder];
}
else {
foreach ($ordersOpendistribSynchro as $idOrder => $isSynchro) {
if (!$isSynchro) {
return false;
}
}
}

return true;
}

return false;
}
}

Načítá se…
Zrušit
Uložit