Procházet zdrojové kódy

[Technique] Administration : refactoring DistributionController #1173

feature/souke
Guillaume Bourgeois před 1 rokem
rodič
revize
6874596f06
8 změnil soubory, kde provedl 402 přidání a 479 odebrání
  1. +15
    -445
      backend/controllers/DistributionController.php
  2. +238
    -0
      common/logic/Distribution/Distribution/Service/DistributionReportCsvGenerator.php
  3. +10
    -0
      common/logic/Distribution/Distribution/Service/DistributionReportGridCsvGenerator.php
  4. +125
    -0
      common/logic/Distribution/Distribution/Service/DistributionReportPdfGenerator.php
  5. +7
    -16
      common/logic/Distribution/Distribution/Wrapper/DistributionContainer.php
  6. +6
    -0
      common/logic/Distribution/Distribution/Wrapper/DistributionManager.php
  7. +1
    -1
      common/logic/Order/Order/Repository/OrderRepository.php
  8. +0
    -17
      common/logic/Product/Product/Repository/ProductRepository.php

+ 15
- 445
backend/controllers/DistributionController.php Zobrazit soubor

@@ -552,267 +552,25 @@ class DistributionController extends BackendController
/**
* Génére un PDF récapitulatif des commandes d'un producteur pour une
* date donnée.
*
* @param string $date
* @param boolean $save
* @param integer $idProducer
* @return Pdf|null|string
*/
public function actionReport($date = '', $save = false, $idProducer = 0, $type = "pdf")
public function actionReport(string $date = '', bool $save = false, int $idProducer = 0, string $type = "pdf")
{
$productDistributionManager = $this->getProductDistributionManager();
$producerManager = $this->getProducerManager();
$orderManager = $this->getOrderManager();
$productManager = $this->getProductManager();
$pointSaleManager = $this->getPointSaleManager();

if (!\Yii::$app->user->isGuest) {
$idProducer = GlobalParam::getCurrentProducerId();
if (!$idProducer) {
$idProducer = $this->getProducerCurrent()->id;
}

$ordersArray = Order::searchAll(
[
'distribution.date' => $date,
'distribution.id_producer' => $idProducer
],
[
'orderby' => 'user.lastname ASC, user.name ASC, comment_point_sale ASC',
'conditions' => 'date_delete IS NULL'
]
);

$distribution = Distribution::searchOne([
'id_producer' => $idProducer
], [
'conditions' => 'date LIKE :date',
'params' => [':date' => $date]
]);
$distributionManager = $this->getDistributionManager();
$producerManager = $this->getProducerManager();
$producerCurrent = $producerManager->findOneProducerById($idProducer);
$this->getLogic()->setProducerContext($producerCurrent);
$distribution = $distributionManager->findOneDistribution($date);

if ($distribution) {
$selectedProductsArray = $productDistributionManager->findProductDistributionsByDistribution($distribution);
$pointsSaleArray = PointSale::searchAll([
'point_sale.id_producer' => $idProducer
]);

foreach ($pointsSaleArray as $pointSale) {
$orderManager->initPointSaleOrders($pointSale, $ordersArray);
}

// produits
$productsArray = Product::find()
->joinWith([
'productDistribution' => function ($q) use ($distribution) {
$q->where(['id_distribution' => $distribution->id]);
}
])
->where([
'id_producer' => $idProducer,
])
->orderBy('order ASC')
->all();

if ($type == 'pdf') {
$viewPdf = 'report';
$orientationPdf = Pdf::ORIENT_PORTRAIT;
$producer = GlobalParam::getCurrentProducer();
if ($producer->slug == 'bourlinguepacotille') {
$viewPdf = 'report-bourlingue';
$orientationPdf = Pdf::ORIENT_LANDSCAPE;
}

// get your HTML raw content without any layouts or scripts
$content = $this->renderPartial($viewPdf, [
'date' => $date,
'distribution' => $distribution,
'selectedProductsArray' => $selectedProductsArray,
'pointsSaleArray' => $pointsSaleArray,
'productsArray' => $productsArray,
'ordersArray' => $ordersArray,
'producer' => $producerManager->findOneProducerById($idProducer)
]);

$dateStr = date('d/m/Y', strtotime($date));

if ($save) {
$destination = Pdf::DEST_FILE;
} else {
$destination = Pdf::DEST_BROWSER;
}

$pdf = new Pdf([
// set to use core fonts only
'mode' => Pdf::MODE_UTF8,
// A4 paper format
'format' => Pdf::FORMAT_A4,
// portrait orientation
'orientation' => $orientationPdf,
// stream to browser inline
'destination' => $destination,
'filename' => \Yii::getAlias(
'@app/web/pdf/Commandes-' . $date . '-' . $idProducer . '.pdf'
),
// your html content input
'content' => $content,
// format content from your own css file if needed or use the
// enhanced bootstrap css built by Krajee for mPDF formatting
//'cssFile' => Yii::getAlias('@web/css/distribution/report.css'),
// any css to be embedded if required
'cssInline' => '
table {
border-spacing : 0px ;
border-collapse : collapse ;
width: 100% ;
}
table tr th,
table tr td {
padding: 0px ;
margin: 0px ;
border: solid 1px #e0e0e0 ;
padding: 3px 8px ;
vertical-align : top;
page-break-inside: avoid !important;
color: black;
}

table tr th {
font-size: 13px ;
}

table tr td {
font-size: 13px ;
}
',
// set mPDF properties on the fly
//'options' => ['title' => 'Krajee Report Title'],
// call mPDF methods on the fly
'methods' => [
'SetHeader' => ['Commandes du ' . $dateStr],
'SetFooter' => ['{PAGENO}'],
]
]);

// return the pdf output as per the destination setting
return $pdf->render();
} elseif ($type == 'csv') {
$datas = [];

$optionCsvExportAllProducts = $producerManager->getConfig('option_csv_export_all_products');
$optionCsvExportByPiece = $producerManager->getConfig('option_csv_export_by_piece');

// produits en colonne
$productsNameArray = ['', 'Commentaire'];
$productsIndexArray = [];
$productsHasQuantity = [];
$cpt = 2;
foreach ($productsArray as $product) {
$productsHasQuantity[$product->id] = 0;
foreach (Product::$unitsArray as $unit => $dataUnit) {
$quantity = $orderManager->getProductQuantity($product, $ordersArray, true, $unit);
if ($quantity) {
$productsHasQuantity[$product->id] += $quantity;
}
}
if ($productsHasQuantity[$product->id] > 0 || $optionCsvExportAllProducts) {
$productName = $productManager->getNameExport($product);

if ($optionCsvExportByPiece) {
$productUnit = 'piece';
} else {
$productUnit = $product->unit;
}

$productName .= ' (' . $productManager->strUnit($productUnit, 'wording_short', true) . ')';

$productsNameArray[] = $productName;
$productsIndexArray[$product->id] = $cpt++;
}
}
$datas[] = $productsNameArray;

// points de vente
foreach ($pointsSaleArray as $pointSale) {
if (count($pointSale->orders)) {
// listing commandes
$datas[] = ['> ' . $pointSale->name];
foreach ($pointSale->orders as $order) {
$orderLine = [$orderManager->getOrderUsername($order), $orderManager->getCommentReport($order)];

if ($optionCsvExportByPiece) {
foreach ($order->productOrder as $productOrder) {
$orderLine[$productsIndexArray[$productOrder->id_product]] = $orderManager->getProductQuantityPieces(
$productOrder->product,
[$order]
);
}
} else {
foreach ($productsIndexArray as $idProduct => $indexProduct) {
$orderLine[$indexProduct] = '';
}

foreach ($order->productOrder as $productOrder) {
if (strlen($orderLine[$productsIndexArray[$productOrder->id_product]])) {
$orderLine[$productsIndexArray[$productOrder->id_product]] .= ' + ';
}
$orderLine[$productsIndexArray[$productOrder->id_product]] .= $productOrder->quantity;
if ($productOrder->product->unit != $productOrder->unit) {
$orderLine[$productsIndexArray[$productOrder->id_product]] .= $productManager->strUnit(
$productOrder->unit,
'wording_short',
true
);
}
}
}

$datas[] = $this->_lineOrderReportCSV($orderLine, $cpt);
}

// total point de vente
if ($optionCsvExportByPiece) {
$totalsPointSaleArray = $this->_totalReportPiecesCSV(
'Total',
$pointSale->orders,
$productsArray,
$productsIndexArray
);
} else {
$totalsPointSaleArray = $this->_totalReportCSV(
'Total',
$pointSale->orders,
$productsArray,
$productsIndexArray
);
}

$datas[] = $this->_lineOrderReportCSV($totalsPointSaleArray, $cpt);

$datas[] = [];
}
}

// global
if ($optionCsvExportByPiece) {
$totalsGlobalArray = $this->_totalReportPiecesCSV(
'> Totaux',
$ordersArray,
$productsArray,
$productsIndexArray
);
} else {
$totalsGlobalArray = $this->_totalReportCSV(
'> Totaux',
$ordersArray,
$productsArray,
$productsIndexArray
);
}

$datas[] = $this->_lineOrderReportCSV($totalsGlobalArray, $cpt);

CSV::downloadSendHeaders('Commandes_' . $date . '.csv');
echo CSV::array2csv($datas);
die();
return $distributionManager->generateDistributionReportPdf($distribution, $save);
}
elseif ($type == 'csv') {
$distributionManager->generateDistributionReportCsv($distribution);
}
}

@@ -1007,194 +765,6 @@ class DistributionController extends BackendController
}
}

/**
* Génère un export des commandes au format CSV à destination du Google Drive
* de Terre de pains.
*/

public function actionReportTerredepains($date, $key)
{
$producerManager = $this->getProducerManager();
$orderManager = $this->getOrderManager();
$productManager = $this->getProductManager();

if ($key == 'ef572cc148c001f0180c4a624189ed30') {
$producer = $producerManager->findOneProducerBySlug('terredepains');
$idProducer = $producer->id;

$ordersArray = Order::searchAll(
[
'distribution.date' => $date,
'distribution.id_producer' => $idProducer
],
[
'orderby' => 'user.lastname ASC, user.name ASC, comment_point_sale ASC',
'conditions' => 'date_delete IS NULL'
]
);

$distribution = Distribution::searchOne([
'distribution.id_producer' => $idProducer
], [
'conditions' => 'date LIKE :date',
'params' => [
':date' => $date,
]
]);

if ($distribution) {
$pointsSaleArray = PointSale::searchAll([
'point_sale.id_producer' => $idProducer
]);

foreach ($pointsSaleArray as $pointSale) {
$orderManager->initPointSaleOrders($pointSale, $ordersArray);
}

// produits
$productsArray = Product::find()
->joinWith([
'productDistribution' => function ($q) use ($distribution) {
$q->where(['id_distribution' => $distribution->id]);
}
])
->where([
'id_producer' => $idProducer,
])
->orderBy('order ASC')
->all();

$datas = [];

// produits en colonne
$productsNameArray = [''];
$productsIndexArray = [];
$productsHasQuantity = [];
$cpt = 1;
foreach ($productsArray as $product) {
$theUnit = $productManager->strUnit($product->unit, 'wording_short', true);
$theUnit = ($theUnit == 'p.') ? '' : ' (' . $theUnit . ')';
$productsNameArray[] = $product->name . $theUnit;
$productsIndexArray[$product->id] = $cpt++;
}
$productsNameArray[] = 'Total';
$datas[] = $productsNameArray;

// global
$totalsGlobalArray = $this->_totalReportCSV(
'> Totaux',
$ordersArray,
$productsArray,
$productsIndexArray
);
$datas[] = $this->_lineOrderReportCSV($totalsGlobalArray, $cpt - 1, true);

$datas[] = [];

// points de vente
foreach ($pointsSaleArray as $pointSale) {
if (count($pointSale->orders)) {
// total point de vente
$totalsPointSaleArray = $this->_totalReportCSV(
'> ' . $pointSale->name,
$pointSale->orders,
$productsArray,
$productsIndexArray
);
$datas[] = $this->_lineOrderReportCSV($totalsPointSaleArray, $cpt - 1, true);
}
}

CSV::downloadSendHeaders('Commandes_' . $date . '.csv');
echo CSV::array2csv($datas);
die();
}

return null;
}
}

public function _totalReportCSV($label, $ordersArray, $productsArray, $productsIndexArray)
{
$orderManager = $this->getOrderManager();
$productManager = $this->getProductManager();

$totalsPointSaleArray = [$label];
foreach ($productsArray as $product) {
foreach (Product::$unitsArray as $unit => $dataUnit) {
$quantity = $orderManager->getProductQuantity($product, $ordersArray, false, $unit);
if ($quantity) {
$index = $productsIndexArray[$product->id];
if (!isset($totalsPointSaleArray[$index])) {
$totalsPointSaleArray[$index] = '';
}

if (strlen($totalsPointSaleArray[$index])) {
$totalsPointSaleArray[$index] .= ' + ';
}

$totalsPointSaleArray[$index] .= $quantity;

if ($product->unit != $unit) {
$totalsPointSaleArray[$index] .= '' . $productManager->strUnit($unit, 'wording_short', true);
}
}
}
}
return $totalsPointSaleArray;
}

public function _totalReportPiecesCSV($label, $ordersArray, $productsArray, $productsIndexArray)
{
$orderManager = $this->getOrderManager();

$totalsPointSaleArray = [$label];
foreach ($productsArray as $product) {
$quantity = 0;
foreach (Product::$unitsArray as $unit => $dataUnit) {
$quantityProduct = $orderManager->getProductQuantity($product, $ordersArray, false, $unit);

if ($unit == 'piece') {
$quantity += $quantityProduct;
} else {
if ($product->weight > 0) {
$quantity += ($quantityProduct * $dataUnit['coefficient']) / $product->weight;
}
}
}

if ($quantity) {
$index = $productsIndexArray[$product->id];
$totalsPointSaleArray[$index] = $quantity;
}
}

return $totalsPointSaleArray;
}

public function _lineOrderReportCSV($orderLine, $cptMax, $showTotal = false)
{
$line = [];
$cptTotal = 0;

for ($i = 0; $i <= $cptMax; $i++) {
if (isset($orderLine[$i]) && $orderLine[$i]) {
$line[] = $orderLine[$i];
if (is_numeric($orderLine[$i])) {
$cptTotal += $orderLine[$i];
}
} else {
$line[] = '';
}
}

if ($cptTotal > 0 && $showTotal) {
$line[] = $cptTotal;
}

return $line;
}

public function actionAjaxProcessProductQuantityMax($idDistribution, $idProduct, $quantityMax)
{
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
@@ -1203,7 +773,7 @@ class DistributionController extends BackendController
$productDistribution = $this->getProductDistribution($idProduct, $idDistribution);

$productDistribution->quantity_max = ($quantityMax == -1) ? null : (float) abs($quantityMax);
$productDistributionManager->saveUpdate($productDistribution);
$productDistributionManager->update($productDistribution);

return ['success'];
}
@@ -1216,7 +786,7 @@ class DistributionController extends BackendController
$productDistribution = $this->getProductDistribution($idProduct, $idDistribution);

$productDistribution->active = $active;
$productDistributionManager->saveUpdate($productDistribution);
$productDistributionManager->update($productDistribution);

return ['success'];
}
@@ -1234,7 +804,7 @@ class DistributionController extends BackendController
$pointSaleManager->findOnePointSaleById($idPointSale)
);
$pointSaleDistribution->delivery = $delivery;
$pointSaleDistributionManager->saveUpdate($pointSaleDistribution);
$pointSaleDistributionManager->update($pointSaleDistribution);

return ['success'];
}

+ 238
- 0
common/logic/Distribution/Distribution/Service/DistributionReportCsvGenerator.php Zobrazit soubor

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

namespace common\logic\Distribution\Distribution\Service;

use common\helpers\CSV;
use common\logic\AbstractGenerator;
use common\logic\Distribution\Distribution\Model\Distribution;
use common\logic\Order\Order\Repository\OrderRepository;
use common\logic\Order\Order\Service\OrderBuilder;
use common\logic\Order\Order\Service\OrderSolver;
use common\logic\PointSale\PointSale\Repository\PointSaleRepository;
use common\logic\Producer\Producer\Repository\ProducerRepository;
use common\logic\Product\Product\Model\Product;
use common\logic\Product\Product\Repository\ProductRepository;
use common\logic\Product\Product\Service\ProductSolver;

class DistributionReportCsvGenerator extends AbstractGenerator
{
protected ProducerRepository $producerRepository;
protected ProductRepository $productRepository;
protected ProductSolver $productSolver;
protected OrderRepository $orderRepository;
protected OrderSolver $orderSolver;
protected PointSaleRepository $pointSaleRepository;
protected OrderBuilder $orderBuilder;

public function loadDependencies(): void
{
$this->producerRepository = $this->loadService(ProducerRepository::class);
$this->productRepository = $this->loadService(ProductRepository::class);
$this->productSolver = $this->loadService(ProductSolver::class);
$this->orderRepository = $this->loadService(OrderRepository::class);
$this->orderSolver = $this->loadService(OrderSolver::class);
$this->pointSaleRepository = $this->loadService(PointSaleRepository::class);
$this->orderBuilder = $this->loadService(OrderBuilder::class);
}

public function generateDistributionReportCsv(Distribution $distribution)
{
$datas = [];
$ordersArray = $this->orderRepository->findOrdersByDistribution($distribution);
$productsArray = $this->productRepository->findProductsByDistribution($distribution);
$optionCsvExportAllProducts = $this->producerRepository->getConfig('option_csv_export_all_products');
$optionCsvExportByPiece = $this->producerRepository->getConfig('option_csv_export_by_piece');
$pointsSaleArray = $this->pointSaleRepository->findPointSales();
foreach ($pointsSaleArray as $pointSale) {
$this->orderBuilder->initPointSaleOrders($pointSale, $ordersArray);
}

// produits en colonne
$productsNameArray = ['', 'Commentaire'];
$productsIndexArray = [];
$productsHasQuantity = [];
$cpt = 2;
foreach ($productsArray as $product) {
$productsHasQuantity[$product->id] = 0;
foreach (Product::$unitsArray as $unit => $dataUnit) {
$quantity = $this->orderSolver->getProductQuantity($product, $ordersArray, true, $unit);
if ($quantity) {
$productsHasQuantity[$product->id] += $quantity;
}
}
if ($productsHasQuantity[$product->id] > 0 || $optionCsvExportAllProducts) {
$productName = $this->productSolver->getNameExport($product);

if ($optionCsvExportByPiece) {
$productUnit = 'piece';
} else {
$productUnit = $product->unit;
}

$productName .= ' (' . $this->productSolver->strUnit($productUnit, 'wording_short', true) . ')';

$productsNameArray[] = $productName;
$productsIndexArray[$product->id] = $cpt++;
}
}
$datas[] = $productsNameArray;

// points de vente
foreach ($pointsSaleArray as $pointSale) {
if (count($pointSale->orders)) {
// listing commandes
$datas[] = ['> ' . $pointSale->name];
foreach ($pointSale->orders as $order) {
$orderLine = [$this->orderSolver->getOrderUsername($order), $this->orderSolver->getCommentReport($order)];

if ($optionCsvExportByPiece) {
foreach ($order->productOrder as $productOrder) {
$orderLine[$productsIndexArray[$productOrder->id_product]] = $this->orderSolver->getProductQuantityPieces(
$productOrder->product,
[$order]
);
}
} else {
foreach ($productsIndexArray as $idProduct => $indexProduct) {
$orderLine[$indexProduct] = '';
}

foreach ($order->productOrder as $productOrder) {
if (strlen($orderLine[$productsIndexArray[$productOrder->id_product]])) {
$orderLine[$productsIndexArray[$productOrder->id_product]] .= ' + ';
}
$orderLine[$productsIndexArray[$productOrder->id_product]] .= $productOrder->quantity;
if ($productOrder->product->unit != $productOrder->unit) {
$orderLine[$productsIndexArray[$productOrder->id_product]] .= $productManager->strUnit(
$productOrder->unit,
'wording_short',
true
);
}
}
}

$datas[] = $this->lineOrderReport($orderLine, $cpt);
}

// total point de vente
if ($optionCsvExportByPiece) {
$totalsPointSaleArray = $this->totalReportPieces(
'Total',
$pointSale->orders,
$productsArray,
$productsIndexArray
);
} else {
$totalsPointSaleArray = $this->totalReport(
'Total',
$pointSale->orders,
$productsArray,
$productsIndexArray
);
}

$datas[] = $this->lineOrderReport($totalsPointSaleArray, $cpt);

$datas[] = [];
}
}

// global
if ($optionCsvExportByPiece) {
$totalsGlobalArray = $this->totalReportPieces(
'> Totaux',
$ordersArray,
$productsArray,
$productsIndexArray
);
} else {
$totalsGlobalArray = $this->totalReport(
'> Totaux',
$ordersArray,
$productsArray,
$productsIndexArray
);
}

$datas[] = $this->lineOrderReport($totalsGlobalArray, $cpt);

CSV::send('Commandes_' . $distribution->date . '.csv', $datas);
}

private function totalReport($label, $ordersArray, $productsArray, $productsIndexArray)
{
$totalsPointSaleArray = [$label];
foreach ($productsArray as $product) {
foreach (Product::$unitsArray as $unit => $dataUnit) {
$quantity = $this->orderSolver->getProductQuantity($product, $ordersArray, false, $unit);
if ($quantity) {
$index = $productsIndexArray[$product->id];
if (!isset($totalsPointSaleArray[$index])) {
$totalsPointSaleArray[$index] = '';
}

if (strlen($totalsPointSaleArray[$index])) {
$totalsPointSaleArray[$index] .= ' + ';
}

$totalsPointSaleArray[$index] .= $quantity;

if ($product->unit != $unit) {
$totalsPointSaleArray[$index] .= '' . $this->productSolver->strUnit($unit, 'wording_short', true);
}
}
}
}
return $totalsPointSaleArray;
}

private function totalReportPieces($label, $ordersArray, $productsArray, $productsIndexArray)
{
$totalsPointSaleArray = [$label];
foreach ($productsArray as $product) {
$quantity = 0;
foreach (Product::$unitsArray as $unit => $dataUnit) {
$quantityProduct = $this->orderSolver->getProductQuantity($product, $ordersArray, false, $unit);

if ($unit == 'piece') {
$quantity += $quantityProduct;
} else {
if ($product->weight > 0) {
$quantity += ($quantityProduct * $dataUnit['coefficient']) / $product->weight;
}
}
}

if ($quantity) {
$index = $productsIndexArray[$product->id];
$totalsPointSaleArray[$index] = $quantity;
}
}

return $totalsPointSaleArray;
}

private function lineOrderReport($orderLine, $cptMax, $showTotal = false)
{
$line = [];
$cptTotal = 0;

for ($i = 0; $i <= $cptMax; $i++) {
if (isset($orderLine[$i]) && $orderLine[$i]) {
$line[] = $orderLine[$i];
if (is_numeric($orderLine[$i])) {
$cptTotal += $orderLine[$i];
}
} else {
$line[] = '';
}
}

if ($cptTotal > 0 && $showTotal) {
$line[] = $cptTotal;
}

return $line;
}
}

+ 10
- 0
common/logic/Distribution/Distribution/Service/DistributionReportGridCsvGenerator.php Zobrazit soubor

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

namespace common\logic\Distribution\Distribution\Service;

use common\logic\AbstractGenerator;

class DistributionReportGridCsvGenerator extends AbstractGenerator
{

}

+ 125
- 0
common/logic/Distribution/Distribution/Service/DistributionReportPdfGenerator.php Zobrazit soubor

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

namespace common\logic\Distribution\Distribution\Service;

use common\logic\AbstractGenerator;
use common\logic\Distribution\Distribution\Model\Distribution;
use common\logic\Distribution\ProductDistribution\Repository\ProductDistributionRepository;
use common\logic\Order\Order\Repository\OrderRepository;
use common\logic\Order\Order\Service\OrderBuilder;
use common\logic\PointSale\PointSale\Repository\PointSaleRepository;
use common\logic\Product\Product\Repository\ProductRepository;
use kartik\mpdf\Pdf;

class DistributionReportPdfGenerator extends AbstractGenerator
{
protected OrderRepository $orderRepository;
protected OrderBuilder $orderBuilder;
protected ProductRepository $productRepository;
protected ProductDistributionRepository $productDistributionRepository;
protected PointSaleRepository $pointSaleRepository;

public function loadDependencies(): void
{
$this->orderRepository = $this->loadService(OrderRepository::class);
$this->orderBuilder = $this->loadService(OrderBuilder::class);
$this->productRepository = $this->loadService(ProductRepository::class);
$this->productDistributionRepository = $this->loadService(ProductDistributionRepository::class);
$this->pointSaleRepository = $this->loadService(PointSaleRepository::class);
}

public function generateDistributionReportPdf(Distribution $distribution, bool $save = false)
{
$producer = $this->getProducerContext();
$ordersArray = $this->orderRepository->findOrdersByDistribution($distribution);
$productsArray = $this->productRepository->findProductsByDistribution($distribution);
$selectedProductsArray = $this->productDistributionRepository->findProductDistributionsByDistribution($distribution);
$pointsSaleArray = $this->pointSaleRepository->findPointSales();
foreach ($pointsSaleArray as $pointSale) {
$this->orderBuilder->initPointSaleOrders($pointSale, $ordersArray);
}

$viewPdf = '@backend/views/distribution/report';
$orientationPdf = Pdf::ORIENT_PORTRAIT;

if ($producer->slug == 'bourlinguepacotille') {
$viewPdf = '@backend/views/distribution/report-bourlingue';
$orientationPdf = Pdf::ORIENT_LANDSCAPE;
}

// get your HTML raw content without any layouts or scripts
$content = \Yii::$app->getView()->render($viewPdf, [
'date' => $distribution->date,
'distribution' => $distribution,
'selectedProductsArray' => $selectedProductsArray,
'pointsSaleArray' => $pointsSaleArray,
'productsArray' => $productsArray,
'ordersArray' => $ordersArray,
'producer' => $producer
]);

$dateStr = date('d/m/Y', strtotime($distribution->date));

if ($save) {
$destination = Pdf::DEST_FILE;
} else {
$destination = Pdf::DEST_BROWSER;
}

$pdf = new Pdf([
// set to use core fonts only
'mode' => Pdf::MODE_UTF8,
// A4 paper format
'format' => Pdf::FORMAT_A4,
// portrait orientation
'orientation' => $orientationPdf,
// stream to browser inline
'destination' => $destination,
'filename' => \Yii::getAlias(
'@app/web/pdf/Commandes-' . $distribution->date . '-' . $this->getProducerContextId() . '.pdf'
),
// your html content input
'content' => $content,
// format content from your own css file if needed or use the
// enhanced bootstrap css built by Krajee for mPDF formatting
//'cssFile' => Yii::getAlias('@web/css/distribution/report.css'),
// any css to be embedded if required
'cssInline' => '
table {
border-spacing : 0px ;
border-collapse : collapse ;
width: 100% ;
}
table tr th,
table tr td {
padding: 0px ;
margin: 0px ;
border: solid 1px #e0e0e0 ;
padding: 3px 8px ;
vertical-align : top;
page-break-inside: avoid !important;
color: black;
}

table tr th {
font-size: 13px ;
}

table tr td {
font-size: 13px ;
}
',
// set mPDF properties on the fly
//'options' => ['title' => 'Krajee Report Title'],
// call mPDF methods on the fly
'methods' => [
'SetHeader' => ['Commandes du ' . $dateStr],
'SetFooter' => ['{PAGENO}'],
]
]);

// return the pdf output as per the destination setting
return $pdf->render();
}
}

+ 7
- 16
common/logic/Distribution/Distribution/Wrapper/DistributionContainer.php Zobrazit soubor

@@ -6,6 +6,9 @@ use common\logic\AbstractContainer;
use common\logic\Distribution\Distribution\Repository\DistributionRepository;
use common\logic\Distribution\Distribution\Service\DistributionBuilder;
use common\logic\Distribution\Distribution\Service\DistributionDefinition;
use common\logic\Distribution\Distribution\Service\DistributionReportCsvGenerator;
use common\logic\Distribution\Distribution\Service\DistributionReportGridCsvGenerator;
use common\logic\Distribution\Distribution\Service\DistributionReportPdfGenerator;
use common\logic\Distribution\Distribution\Service\DistributionSolver;

class DistributionContainer extends AbstractContainer
@@ -16,7 +19,10 @@ class DistributionContainer extends AbstractContainer
DistributionDefinition::class,
DistributionSolver::class,
DistributionRepository::class,
DistributionBuilder::class
DistributionBuilder::class,
DistributionReportCsvGenerator::class,
DistributionReportGridCsvGenerator::class,
DistributionReportPdfGenerator::class,
];
}

@@ -24,19 +30,4 @@ class DistributionContainer extends AbstractContainer
{
return DistributionDefinition::getInstance();
}

public function getSolver(): DistributionSolver
{
return DistributionSolver::getInstance();
}

public function getRepository(): DistributionRepository
{
return DistributionRepository::getInstance();
}

public function getBuilder(): DistributionBuilder
{
return DistributionBuilder::getInstance();
}
}

+ 6
- 0
common/logic/Distribution/Distribution/Wrapper/DistributionManager.php Zobrazit soubor

@@ -6,6 +6,9 @@ use common\logic\AbstractManager;
use common\logic\Distribution\Distribution\Repository\DistributionRepository;
use common\logic\Distribution\Distribution\Service\DistributionBuilder;
use common\logic\Distribution\Distribution\Service\DistributionDefinition;
use common\logic\Distribution\Distribution\Service\DistributionReportCsvGenerator;
use common\logic\Distribution\Distribution\Service\DistributionReportGridCsvGenerator;
use common\logic\Distribution\Distribution\Service\DistributionReportPdfGenerator;
use common\logic\Distribution\Distribution\Service\DistributionSolver;

/**
@@ -13,6 +16,9 @@ use common\logic\Distribution\Distribution\Service\DistributionSolver;
* @mixin DistributionSolver
* @mixin DistributionRepository
* @mixin DistributionBuilder
* @mixin DistributionReportCsvGenerator
* @mixin DistributionReportGridCsvGenerator
* @mixin DistributionReportPdfGenerator
*/
class DistributionManager extends AbstractManager
{

+ 1
- 1
common/logic/Order/Order/Repository/OrderRepository.php Zobrazit soubor

@@ -109,7 +109,7 @@ class OrderRepository extends AbstractRepository
->filterByDistributionDate($distribution->date)
->filterIsValid()
->filterByCondition($conditionAppend)
->orderBy('user.lastname ASC, user.name ASC')
->orderBy('user.lastname ASC, user.name ASC, comment_point_sale ASC')
->find();
}


+ 0
- 17
common/logic/Product/Product/Repository/ProductRepository.php Zobrazit soubor

@@ -69,31 +69,14 @@ class ProductRepository extends AbstractRepository
public function queryProductsByDistribution(Distribution $distribution)
{
return $this->createDefaultQuery()
//->leftJoin('product_distribution', 'product.id = product_distribution.id_product')
->joinWith([
//'taxRate',
'productDistribution' => function ($query) use ($distribution) {
$query->andOnCondition(
'product_distribution.id_distribution = ' . $distribution->id
);
}
])
//->filterByDistribution($distribution)
->orderBy('product_distribution.active DESC, product.order ASC');


/*$productsQuery = Product::find()
->orWhere(['id_producer' => GlobalParam::getCurrentProducerId(),])
->joinWith([
'taxRate',
'productDistribution' => function ($query) use ($distribution) {
$query->andOnCondition(
'product_distribution.id_distribution = ' . $distribution->id
);
}
])
->orderBy('product_distribution.active DESC, order ASC');*/

}

/**

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