Ajout des modules ColissimoWs et ColissimoLabel.php

Ne pas oublier de vérifier si les tables nécessaires sont bien créées en BDD.
This commit is contained in:
2020-05-07 11:45:31 +02:00
parent 28b21af6c8
commit 649c92e52f
114 changed files with 21550 additions and 8312 deletions

View File

@@ -0,0 +1,170 @@
<?php
/*************************************************************************************/
/* This file is part of the Thelia package. */
/* */
/* Copyright (c) OpenStudio */
/* email : dev@thelia.net */
/* web : http://www.thelia.net */
/* */
/* For the full copyright and license information, please view the LICENSE.txt */
/* file that was distributed with this source code. */
/*************************************************************************************/
namespace ColissimoLabel;
use ColissimoLabel\Request\Helper\OutputFormat;
use Propel\Runtime\Connection\ConnectionInterface;
use Symfony\Component\Filesystem\Filesystem;
use Thelia\Module\BaseModule;
use Thelia\Install\Database;
/**
* @author Gilles Bourgeat >gilles.bourgeat@gmail.com>
*/
class ColissimoLabel extends BaseModule
{
/** @var string */
const DOMAIN_NAME = 'colissimolabel';
const LABEL_FOLDER = THELIA_LOCAL_DIR . 'colissimo-label';
const BORDEREAU_FOLDER = self::LABEL_FOLDER . DIRECTORY_SEPARATOR . 'bordereau';
const CONFIG_KEY_DEFAULT_LABEL_FORMAT = 'default-label-format';
const CONFIG_KEY_CONTRACT_NUMBER = 'contract-number';
const CONFIG_KEY_PASSWORD = 'password';
const CONFIG_KEY_AUTO_SENT_STATUS = 'auto-sent-status';
const CONFIG_DEFAULT_AUTO_SENT_STATUS = 1;
const CONFIG_KEY_SENT_STATUS_ID = 'sent-status-id';
const CONFIG_DEFAULT_SENT_STATUS_ID = 4;
const CONFIG_KEY_PRE_FILL_INPUT_WEIGHT = 'pre-fill-input-weight';
const CONFIG_DEFAULT_PRE_FILL_INPUT_WEIGHT = 1;
const CONFIG_KEY_LAST_BORDEREAU_DATE = 'last-bordereau-date';
const CONFIG_DEFAULT_KEY_LAST_BORDEREAU_DATE = 1970;
/**
* @param ConnectionInterface $con
*/
public function postActivation(ConnectionInterface $con = null)
{
static::checkLabelFolder();
if (!$this->getConfigValue('is_initialized', false)) {
$database = new Database($con);
$database->insertSql(null, [__DIR__ . "/Config/thelia.sql"]);
$this->setConfigValue('is_initialized', true);
}
$this->checkConfigurationsValues();
}
public function update($currentVersion, $newVersion, ConnectionInterface $con = null)
{
parent::update($currentVersion, $newVersion, $con);
$this->checkConfigurationsValues();
}
protected function checkConfigurationsValues()
{
if (null === self::getConfigValue(self::CONFIG_KEY_DEFAULT_LABEL_FORMAT)) {
self::setConfigValue(
self::CONFIG_KEY_DEFAULT_LABEL_FORMAT,
OutputFormat::OUTPUT_PRINTING_TYPE_DEFAULT
);
}
if (null === self::getConfigValue(self::CONFIG_KEY_CONTRACT_NUMBER)) {
self::setConfigValue(
self::CONFIG_KEY_CONTRACT_NUMBER,
""
);
}
if (null === self::getConfigValue(self::CONFIG_KEY_PASSWORD)) {
self::setConfigValue(
self::CONFIG_KEY_PASSWORD,
""
);
}
if (null === self::getConfigValue(self::CONFIG_KEY_AUTO_SENT_STATUS)) {
self::setConfigValue(
self::CONFIG_KEY_AUTO_SENT_STATUS,
self::CONFIG_DEFAULT_AUTO_SENT_STATUS
);
}
if (null === self::getConfigValue(self::CONFIG_KEY_SENT_STATUS_ID)) {
self::setConfigValue(
self::CONFIG_KEY_SENT_STATUS_ID,
self::CONFIG_DEFAULT_SENT_STATUS_ID
);
}
if (null === self::getConfigValue(self::CONFIG_KEY_AUTO_SENT_STATUS)) {
self::setConfigValue(
self::CONFIG_KEY_AUTO_SENT_STATUS,
self::CONFIG_DEFAULT_AUTO_SENT_STATUS
);
}
if (null === self::getConfigValue(self::CONFIG_KEY_PRE_FILL_INPUT_WEIGHT)) {
self::setConfigValue(
self::CONFIG_KEY_PRE_FILL_INPUT_WEIGHT,
self::CONFIG_DEFAULT_PRE_FILL_INPUT_WEIGHT
);
}
if (null === self::getConfigValue(self::CONFIG_KEY_LAST_BORDEREAU_DATE)) {
self::setConfigValue(
self::CONFIG_KEY_LAST_BORDEREAU_DATE,
self::CONFIG_DEFAULT_KEY_LAST_BORDEREAU_DATE
);
}
}
public static function checkLabelFolder()
{
$fileSystem = new Filesystem();
if (!$fileSystem->exists(self::LABEL_FOLDER)) {
$fileSystem->mkdir(self::LABEL_FOLDER);
}
if (!$fileSystem->exists(self::BORDEREAU_FOLDER)) {
$fileSystem->mkdir(self::BORDEREAU_FOLDER);
}
}
public static function getLabelPath($number, $extension)
{
return self::LABEL_FOLDER . DIRECTORY_SEPARATOR . $number . '.' . $extension;
}
public static function getLabelCN23Path($number, $extension)
{
return self::LABEL_FOLDER . DIRECTORY_SEPARATOR . $number . '.' . $extension;
}
public static function getBordereauPath($date)
{
return self::BORDEREAU_FOLDER . DIRECTORY_SEPARATOR . $date . '.pdf';
}
public static function getExtensionFile()
{
return strtolower(substr(ColissimoLabel::getConfigValue(ColissimoLabel::CONFIG_KEY_DEFAULT_LABEL_FORMAT), 0, 3));
}
}

View File

@@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8" ?>
<config xmlns="http://thelia.net/schema/dic/config"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://thelia.net/schema/dic/config http://thelia.net/schema/dic/config/thelia-1.0.xsd">
<loops>
<loop name="colissimo-label" class="ColissimoLabel\Loop\ColissimoLabel" />
</loops>
<forms>
<!--
<form name="MyFormName" class="ColissimoLabel\Form\MySuperForm" />
-->
</forms>
<commands>
<!--
<command class="ColissimoLabel\Command\MySuperCommand" />
-->
</commands>
<!--
<services>
</services>
-->
<hooks>
<hook id="colissimo.label.hook.back.order_edit" class="ColissimoLabel\Hook\Back\OrderEditHook">
<tag name="hook.event_listener" event="order.edit-js" type="back" method="onOrderEditJs" />
</hook>
<hook id="colissimo.label.hook.hook.main.in.top.menu.items" class="ColissimoLabel\Hook\Back\MenuHook">
<tag name="hook.event_listener" event="main.in-top-menu-items" type="back" />
</hook>
</hooks>
<!--
<exports>
</exports>
-->
<!--
<imports>
</imports>
-->
</config>

View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="http://thelia.net/schema/dic/module"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://thelia.net/schema/dic/module http://thelia.net/schema/dic/module/module-2_2.xsd">
<fullnamespace>ColissimoLabel\ColissimoLabel</fullnamespace>
<descriptive locale="en_US">
<title>Generate the delivery labels for Colissimo</title>
</descriptive>
<descriptive locale="fr_FR">
<title>Genérer les étiquettes de livraison pour Colissimo</title>
</descriptive>
<languages>
<language>en_US</language>
<language>fr_FR</language>
</languages>
<version>0.3.4</version>
<authors>
<author>
<name>Gilles Bourgeat</name>
<email>gbourgeat@openstudio.fr</email>
</author>
</authors>
<type>classic</type>
<thelia>2.2.0</thelia>
<stability>beta</stability>
<mandatory>0</mandatory>
<hidden>0</hidden>
</module>

View File

@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8" ?>
<routes xmlns="http://symfony.com/schema/routing"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
<route id="colissimolabel.admin.generate.label" path="/admin/module/colissimolabel/order/{orderId}/generate-label" methods="get">
<default key="_controller">ColissimoLabel\Controller\Admin\OrderController::generateLabelAction</default>
<requirement key="id">[0-9]+</requirement>
</route>
<route id="colissimolabel.admin.get.label" path="/admin/module/colissimolabel/label/{number}" methods="get">
<default key="_controller">ColissimoLabel\Controller\Admin\OrderController::getLabelAction</default>
<requirement key="number">[0-9A-Z]+</requirement>
</route>
<route id="colissimolabel.admin.get.list-labels" path="/admin/module/colissimolabel/order/{orderId}/ajax-get-labels" methods="get">
<default key="_controller">ColissimoLabel\Controller\Admin\OrderController::getOrderLabelsAction</default>
<requirement key="id">[0-9]+</requirement>
</route>
<route id="colissimolabel.admin.bordereau.list" path="/admin/module/colissimolabel/bordereau/list" methods="get">
<default key="_controller">ColissimoLabel\Controller\Admin\BordereauController::listBordereauAction</default>
</route>
<route id="colissimolabel.admin.bordereau.generate" path="/admin/module/colissimolabel/bordereau/generate" methods="get">
<default key="_controller">ColissimoLabel\Controller\Admin\BordereauController::generateBordereauAction</default>
</route>
<route id="colissimolabel.admin.bordereau.download" path="/admin/module/colissimolabel/bordereau/download" methods="get">
<default key="_controller">ColissimoLabel\Controller\Admin\BordereauController::downloadBordereauAction</default>
</route>
</routes>

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<database defaultIdMethod="native" name="thelia"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../../../../vendor/propel/propel/resources/xsd/database.xsd" >
<table name="colissimo_label" namespace="ColissimoLabel\Model">
<column autoIncrement="true" name="id" primaryKey="true" required="true" type="INTEGER" />
<column name="order_id" type="INTEGER" required="true" />
<column name="weight" type="DECIMAL" scale="2" size="6" defaultValue="0.00" />
<column name="number" type="VARCHAR" size="255" />
<foreign-key foreignTable="order" onDelete="CASCADE" onUpdate="RESTRICT">
<reference local="order_id" foreign="id" />
</foreign-key>
<behavior name="timestampable" />
</table>
<external-schema filename="local/config/schema.xml" referenceOnly="true" />
</database>

View File

@@ -0,0 +1,30 @@
# This is a fix for InnoDB in MySQL >= 4.1.x
# It "suspends judgement" for fkey relationships until are tables are set.
SET FOREIGN_KEY_CHECKS = 0;
-- ---------------------------------------------------------------------
-- colissimo_label
-- ---------------------------------------------------------------------
DROP TABLE IF EXISTS `colissimo_label`;
CREATE TABLE `colissimo_label`
(
`id` INTEGER NOT NULL AUTO_INCREMENT,
`order_id` INTEGER NOT NULL,
`weight` DECIMAL(6,2) DEFAULT 0.00,
`number` VARCHAR(255),
`created_at` DATETIME,
`updated_at` DATETIME,
PRIMARY KEY (`id`),
INDEX `colissimo_label_FI_1` (`order_id`),
CONSTRAINT `colissimo_label_FK_1`
FOREIGN KEY (`order_id`)
REFERENCES `order` (`id`)
ON UPDATE RESTRICT
ON DELETE CASCADE
) ENGINE=InnoDB;
# This restores the fkey checks, after having unset them earlier
SET FOREIGN_KEY_CHECKS = 1;

View File

@@ -0,0 +1,92 @@
<?php
namespace ColissimoLabel\Controller\Admin;
use ColissimoLabel\ColissimoLabel;
use ColissimoLabel\Model\ColissimoLabel as ColissimoLabelModel;
use ColissimoLabel\Model\ColissimoLabelQuery;
use ColissimoLabel\Request\Helper\BordereauRequestAPIConfiguration;
use ColissimoLabel\Service\SOAPService;
use Propel\Runtime\ActiveQuery\Criteria;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Finder\Finder;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Thelia\Controller\Admin\AdminController;
class BordereauController extends AdminController
{
public function listBordereauAction()
{
ColissimoLabel::checkLabelFolder();
$lastBordereauDate = ColissimoLabel::getConfigValue(ColissimoLabel::CONFIG_KEY_LAST_BORDEREAU_DATE);
$finder = new Finder();
$finder->files()->in(ColissimoLabel::BORDEREAU_FOLDER);
$bordereaux = [];
foreach ($finder as $file) {
$bordereaux[] = [
"name" => $file->getRelativePathname(),
"path" => $file->getRealPath()
];
}
$bordereaux = array_reverse($bordereaux);
sort($bordereaux);
return $this->render('colissimo-label/bordereau-list', compact("lastBordereauDate", "bordereaux"));
}
public function generateBordereauAction()
{
ColissimoLabel::checkLabelFolder();
$lastBordereauDate = ColissimoLabel::getConfigValue(ColissimoLabel::CONFIG_KEY_LAST_BORDEREAU_DATE);
$labels = ColissimoLabelQuery::create()
->filterByCreatedAt($lastBordereauDate, Criteria::GREATER_THAN)
->find();
$parcelNumbers = [];
/** @var ColissimoLabelModel $label */
foreach ($labels as $label) {
$parcelNumbers[] = $label->getNumber();
}
$service = new SOAPService();
$APIConfiguration = new BordereauRequestAPIConfiguration();
$APIConfiguration->setContractNumber(ColissimoLabel::getConfigValue(ColissimoLabel::CONFIG_KEY_CONTRACT_NUMBER));
$APIConfiguration->setPassword(ColissimoLabel::getConfigValue(ColissimoLabel::CONFIG_KEY_PASSWORD));
$parseResponse = $service->callGenerateBordereauByParcelsNumbersAPI($APIConfiguration, $parcelNumbers);
$resultAttachment = $parseResponse->attachments;
if (!isset($resultAttachment[0])) {
throw new \Exception("No label found");
}
$bordereauContent = $resultAttachment[0];
$fileContent = $bordereauContent["data"];
if ("" == $fileContent) {
throw new \Exception("File is empty");
}
$filePath = ColissimoLabel::getBordereauPath("bordereau_".(new \DateTime())->format("Y-m-d_H-i-s"));
$fileSystem = new Filesystem();
$fileSystem->dumpFile(
$filePath,
$fileContent
);
ColissimoLabel::setConfigValue(ColissimoLabel::CONFIG_KEY_LAST_BORDEREAU_DATE, (new \DateTime())->format("Y-m-d H:i:s"));
return $this->listBordereauAction();
}
public function downloadBordereauAction()
{
$filePath = $this->getRequest()->get('filePath');
return new BinaryFileResponse($filePath);
}
}

View File

@@ -0,0 +1,173 @@
<?php
namespace ColissimoLabel\Controller\Admin;
use ColissimoLabel\ColissimoLabel;
use ColissimoLabel\Event\ColissimoLabelEvents;
use ColissimoLabel\Event\LabelRequestEvent;
use ColissimoLabel\Model\ColissimoLabel as ColissimoLabelModel;
use ColissimoLabel\Service\SOAPService;
use ColissimoLabel\Request\Helper\LabelRequestAPIConfiguration;
use ColissimoLabel\Request\LabelRequest;
use Propel\Runtime\ActiveQuery\Criteria;
use SoColissimo\Model\OrderAddressSocolissimoQuery;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Thelia\Controller\Admin\AdminController;
use Thelia\Core\Event\Order\OrderEvent;
use Thelia\Core\Event\TheliaEvents;
use Thelia\Core\HttpFoundation\JsonResponse;
use Thelia\Core\HttpFoundation\Request;
use Thelia\Core\HttpFoundation\Response;
use Thelia\Core\Security\AccessManager;
use Thelia\Core\Security\Resource\AdminResources;
use Thelia\Model\OrderQuery;
use Thelia\Model\OrderStatusQuery;
use Thelia\Tools\URL;
/**
* @author Gilles Bourgeat >gilles.bourgeat@gmail.com>
*/
class OrderController extends AdminController
{
public function generateLabelAction(Request $request, $orderId)
{
if (null !== $response = $this->checkAuth(AdminResources::ORDER, [], AccessManager::UPDATE)) {
return new JsonResponse([
'error' => $this->getTranslator()->trans("Sorry, you're not allowed to perform this action")
], 403);
}
ColissimoLabel::checkLabelFolder();
$order = OrderQuery::create()->filterById((int) $orderId, Criteria::EQUAL)->findOne();
$APIConfiguration = new LabelRequestAPIConfiguration();
$APIConfiguration->setContractNumber(ColissimoLabel::getConfigValue(ColissimoLabel::CONFIG_KEY_CONTRACT_NUMBER));
$APIConfiguration->setPassword(ColissimoLabel::getConfigValue(ColissimoLabel::CONFIG_KEY_PASSWORD));
if ('SoColissimo' === $order->getModuleRelatedByDeliveryModuleId()->getCode()) {
if (null !== $addressSocolissimo = OrderAddressSocolissimoQuery::create()
->findOneById($order->getDeliveryOrderAddressId())) {
if ($addressSocolissimo) {
$colissimoRequest = new LabelRequest(
$order,
$addressSocolissimo->getCode() == '0' ? null : $addressSocolissimo->getCode(),
$addressSocolissimo->getType()
);
$colissimoRequest->getLetter()->getService()->setCommercialName(
$colissimoRequest->getLetter()->getSender()->getAddress()->getCompanyName()
);
}
}
}
if (!isset($colissimoRequest)) {
$colissimoRequest = new LabelRequest($order);
}
if (null !== $weight = $request->get('weight')) {
$colissimoRequest->getLetter()->getParcel()->setWeight($weight);
}
$service = new SOAPService();
$this->getDispatcher()->dispatch(
ColissimoLabelEvents::LABEL_REQUEST,
new LabelRequestEvent($colissimoRequest)
);
$response = $service->callAPI($APIConfiguration, $colissimoRequest);
if ($response->isValid()) {
$fileSystem = new Filesystem();
$fileSystem->dumpFile(
ColissimoLabel::getLabelPath($response->getParcelNumber(), ColissimoLabel::getExtensionFile()),
$response->getFile()
);
if ($response->hasFileCN23()) {
$fileSystem->dumpFile(
ColissimoLabel::getLabelCN23Path($response->getParcelNumber(), ColissimoLabel::getExtensionFile()),
$response->getFileCN23()
);
}
$colissimoLabelModel = (new ColissimoLabelModel())
->setOrderId($order->getId())
->setWeight($colissimoRequest->getLetter()->getParcel()->getWeight())
->setNumber($response->getParcelNumber());
$colissimoLabelModel->save();
$order->setDeliveryRef($response->getParcelNumber());
$order->save();
if ((int) ColissimoLabel::getConfigValue(ColissimoLabel::CONFIG_KEY_AUTO_SENT_STATUS)) {
$sentStatusId = (int) ColissimoLabel::getConfigValue(ColissimoLabel::CONFIG_KEY_SENT_STATUS_ID);
if ((int) $order->getOrderStatus()->getId() !== (int) $sentStatusId) {
$order->setOrderStatus(
OrderStatusQuery::create()->findOneById((int) $sentStatusId)
);
$this->getDispatcher()->dispatch(
TheliaEvents::ORDER_UPDATE_STATUS,
(new OrderEvent($order))->setStatus((int) $sentStatusId)
);
}
}
return new JsonResponse([
'id' => $colissimoLabelModel->getId(),
'url' => URL::getInstance()->absoluteUrl('/admin/module/colissimolabel/label/' . $response->getParcelNumber()),
'number' => $response->getParcelNumber(),
'order' => [
'id' => $order->getId(),
'status' => [
'id' => $order->getOrderStatus()->getId()
]
]
]);
} else {
return new JsonResponse([
'error' => $response->getError()
]);
}
}
public function getOrderLabelsAction($orderId)
{
if (null !== $response = $this->checkAuth(AdminResources::ORDER, [], AccessManager::UPDATE)) {
return new Response($this->getTranslator()->trans("Sorry, you're not allowed to perform this action"), 403);
}
return $this->render('colissimo-label/label-list', ['order_id' => $orderId]);
}
public function getLabelAction(Request $request, $number)
{
if (null !== $response = $this->checkAuth(AdminResources::ORDER, [], AccessManager::UPDATE)) {
return $response;
}
$response = new BinaryFileResponse(
ColissimoLabel::getLabelPath($number, ColissimoLabel::getExtensionFile())
);
$ext = strtolower(substr(ColissimoLabel::getConfigValue(ColissimoLabel::CONFIG_KEY_DEFAULT_LABEL_FORMAT), 3));
if ($request->get('download')) {
$response->setContentDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT,
$number . '.' . ColissimoLabel::getExtensionFile()
);
}
return $response;
}
}

View File

@@ -0,0 +1,11 @@
<?php
namespace ColissimoLabel\Event;
/**
* @author Gilles Bourgeat >gilles.bourgeat@gmail.com>
*/
class ColissimoLabelEvents
{
const LABEL_REQUEST = 'ColissimoLabel.labelRequest';
}

View File

@@ -0,0 +1,24 @@
<?php
namespace ColissimoLabel\Event;
use ColissimoLabel\Request\LabelRequest;
use Symfony\Component\EventDispatcher\Event;
/**
* @author Gilles Bourgeat >gilles.bourgeat@gmail.com>
*/
class LabelRequestEvent extends Event
{
protected $labelRequest;
public function __construct(LabelRequest $labelRequest)
{
$this->labelRequest = $labelRequest;
}
public function getLabelRequest()
{
return $this->labelRequest;
}
}

View File

@@ -0,0 +1,9 @@
<?php
namespace ColissimoLabel\Exception;
/**
* @author Gilles Bourgeat >gilles.bourgeat@gmail.com>
*/
class Exception extends \Exception
{
}

View File

@@ -0,0 +1,9 @@
<?php
namespace ColissimoLabel\Exception;
/**
* @author Gilles Bourgeat >gilles.bourgeat@gmail.com>
*/
class InvalidArgumentException extends \InvalidArgumentException
{
}

View File

@@ -0,0 +1,17 @@
<?php
namespace ColissimoLabel\Hook\Back;
use Thelia\Core\Event\Hook\HookRenderEvent;
use Thelia\Core\Hook\BaseHook;
class MenuHook extends BaseHook
{
public function onMainInTopMenuItems(HookRenderEvent $event)
{
$event->add(
$this->render('colissimo-label/hook/main.in.top.menu.items.html', [])
);
}
}

View File

@@ -0,0 +1,26 @@
<?php
namespace ColissimoLabel\Hook\Back;
use ColissimoLabel\ColissimoLabel;
use Thelia\Core\Event\Hook\HookRenderEvent;
use Thelia\Core\Hook\BaseHook;
/**
* @author Gilles Bourgeat >gilles.bourgeat@gmail.com>
*/
class OrderEditHook extends BaseHook
{
public function onOrderEditJs(HookRenderEvent $event)
{
$event->add($this->render(
'colissimo-label/hook/order-edit-js.html',
array_merge(
$event->getArguments(),
[
'preFillWeightInput' => ColissimoLabel::getConfigValue(ColissimoLabel::CONFIG_KEY_PRE_FILL_INPUT_WEIGHT)
]
)
));
}
}

View File

@@ -0,0 +1,4 @@
<?php
return array(
);

View File

@@ -0,0 +1,18 @@
<?php
return array(
'Cancel' => 'Annuler',
'Date' => 'Date',
'Download' => 'Télécharger',
'Generate bordereau for label since : %date' => 'Générer un bordereau pour les étiquettes créée depuis : %date',
'Generate new label' => 'Générer une étiquette',
'Labels Colissimo' => 'Étiquette Colissimo',
'No existing label for this order' => 'Aucune étiquette pour cette commande',
'Number' => 'Numéro',
'Please wait ...' => 'Veillez patienter ...',
'Print' => 'Imprimer',
'Shipping weight :' => 'Poids d\'expédition :',
'Tracking URL' => 'URL de tracking',
'View' => 'Voir',
'Weight' => 'Poids',
);

View File

@@ -0,0 +1,4 @@
<?php
return array(
// 'an english string' => 'The displayed english string',
);

View File

@@ -0,0 +1,4 @@
<?php
return array(
// 'an english string' => 'La traduction française de la chaine',
);

View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2019
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -0,0 +1,67 @@
<?php
namespace ColissimoLabel\Loop;
use ColissimoLabel\Model\ColissimoLabelQuery;
use Thelia\Core\Template\Element\BaseLoop;
use Thelia\Core\Template\Element\LoopResult;
use Thelia\Core\Template\Element\LoopResultRow;
use Thelia\Core\Template\Element\PropelSearchLoopInterface;
use Thelia\Core\Template\Loop\Argument\Argument;
use Thelia\Core\Template\Loop\Argument\ArgumentCollection;
/**
* Class CreditNoteStatus
* @package CreditNote\Loop
* @author Gilles Bourgeat <gilles.bourgeat@gmail.com>
*
* @method int getOrderId()
*/
class ColissimoLabel extends BaseLoop implements PropelSearchLoopInterface
{
protected $timestampable = true;
protected function getArgDefinitions()
{
return new ArgumentCollection(
Argument::createIntTypeArgument('order_id', null, true)
);
}
/**
* this method returns a Propel ModelCriteria
*
* @return \Propel\Runtime\ActiveQuery\ModelCriteria
*/
public function buildModelCriteria()
{
$query = new ColissimoLabelQuery();
$query->filterByOrderId($this->getOrderId());
return $query;
}
/**
* @param LoopResult $loopResult
*
* @return LoopResult
*/
public function parseResults(LoopResult $loopResult)
{
/** @var \ColissimoLabel\Model\ColissimoLabel $entry */
foreach ($loopResult->getResultDataCollection() as $entry) {
$row = new LoopResultRow($entry);
$row
->set('WEIGHT', $entry->getWeight())
->set("ID", $entry->getId())
->set("NUMBER", $entry->getNumber())
->set("ORDER_ID", $entry->getOrderId())
;
$this->addOutputFields($row, $entry);
$loopResult->addRow($row);
}
return $loopResult;
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,712 @@
<?php
namespace ColissimoLabel\Model\Base;
use \Exception;
use \PDO;
use ColissimoLabel\Model\ColissimoLabel as ChildColissimoLabel;
use ColissimoLabel\Model\ColissimoLabelQuery as ChildColissimoLabelQuery;
use ColissimoLabel\Model\Map\ColissimoLabelTableMap;
use Propel\Runtime\Propel;
use Propel\Runtime\ActiveQuery\Criteria;
use Propel\Runtime\ActiveQuery\ModelCriteria;
use Propel\Runtime\ActiveQuery\ModelJoin;
use Propel\Runtime\Collection\Collection;
use Propel\Runtime\Collection\ObjectCollection;
use Propel\Runtime\Connection\ConnectionInterface;
use Propel\Runtime\Exception\PropelException;
use Thelia\Model\Order;
/**
* Base class that represents a query for the 'colissimo_label' table.
*
*
*
* @method ChildColissimoLabelQuery orderById($order = Criteria::ASC) Order by the id column
* @method ChildColissimoLabelQuery orderByOrderId($order = Criteria::ASC) Order by the order_id column
* @method ChildColissimoLabelQuery orderByWeight($order = Criteria::ASC) Order by the weight column
* @method ChildColissimoLabelQuery orderByNumber($order = Criteria::ASC) Order by the number column
* @method ChildColissimoLabelQuery orderByCreatedAt($order = Criteria::ASC) Order by the created_at column
* @method ChildColissimoLabelQuery orderByUpdatedAt($order = Criteria::ASC) Order by the updated_at column
*
* @method ChildColissimoLabelQuery groupById() Group by the id column
* @method ChildColissimoLabelQuery groupByOrderId() Group by the order_id column
* @method ChildColissimoLabelQuery groupByWeight() Group by the weight column
* @method ChildColissimoLabelQuery groupByNumber() Group by the number column
* @method ChildColissimoLabelQuery groupByCreatedAt() Group by the created_at column
* @method ChildColissimoLabelQuery groupByUpdatedAt() Group by the updated_at column
*
* @method ChildColissimoLabelQuery leftJoin($relation) Adds a LEFT JOIN clause to the query
* @method ChildColissimoLabelQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query
* @method ChildColissimoLabelQuery innerJoin($relation) Adds a INNER JOIN clause to the query
*
* @method ChildColissimoLabelQuery leftJoinOrder($relationAlias = null) Adds a LEFT JOIN clause to the query using the Order relation
* @method ChildColissimoLabelQuery rightJoinOrder($relationAlias = null) Adds a RIGHT JOIN clause to the query using the Order relation
* @method ChildColissimoLabelQuery innerJoinOrder($relationAlias = null) Adds a INNER JOIN clause to the query using the Order relation
*
* @method ChildColissimoLabel findOne(ConnectionInterface $con = null) Return the first ChildColissimoLabel matching the query
* @method ChildColissimoLabel findOneOrCreate(ConnectionInterface $con = null) Return the first ChildColissimoLabel matching the query, or a new ChildColissimoLabel object populated from the query conditions when no match is found
*
* @method ChildColissimoLabel findOneById(int $id) Return the first ChildColissimoLabel filtered by the id column
* @method ChildColissimoLabel findOneByOrderId(int $order_id) Return the first ChildColissimoLabel filtered by the order_id column
* @method ChildColissimoLabel findOneByWeight(string $weight) Return the first ChildColissimoLabel filtered by the weight column
* @method ChildColissimoLabel findOneByNumber(string $number) Return the first ChildColissimoLabel filtered by the number column
* @method ChildColissimoLabel findOneByCreatedAt(string $created_at) Return the first ChildColissimoLabel filtered by the created_at column
* @method ChildColissimoLabel findOneByUpdatedAt(string $updated_at) Return the first ChildColissimoLabel filtered by the updated_at column
*
* @method array findById(int $id) Return ChildColissimoLabel objects filtered by the id column
* @method array findByOrderId(int $order_id) Return ChildColissimoLabel objects filtered by the order_id column
* @method array findByWeight(string $weight) Return ChildColissimoLabel objects filtered by the weight column
* @method array findByNumber(string $number) Return ChildColissimoLabel objects filtered by the number column
* @method array findByCreatedAt(string $created_at) Return ChildColissimoLabel objects filtered by the created_at column
* @method array findByUpdatedAt(string $updated_at) Return ChildColissimoLabel objects filtered by the updated_at column
*
*/
abstract class ColissimoLabelQuery extends ModelCriteria
{
/**
* Initializes internal state of \ColissimoLabel\Model\Base\ColissimoLabelQuery object.
*
* @param string $dbName The database name
* @param string $modelName The phpName of a model, e.g. 'Book'
* @param string $modelAlias The alias for the model in this query, e.g. 'b'
*/
public function __construct($dbName = 'thelia', $modelName = '\\ColissimoLabel\\Model\\ColissimoLabel', $modelAlias = null)
{
parent::__construct($dbName, $modelName, $modelAlias);
}
/**
* Returns a new ChildColissimoLabelQuery object.
*
* @param string $modelAlias The alias of a model in the query
* @param Criteria $criteria Optional Criteria to build the query from
*
* @return ChildColissimoLabelQuery
*/
public static function create($modelAlias = null, $criteria = null)
{
if ($criteria instanceof \ColissimoLabel\Model\ColissimoLabelQuery) {
return $criteria;
}
$query = new \ColissimoLabel\Model\ColissimoLabelQuery();
if (null !== $modelAlias) {
$query->setModelAlias($modelAlias);
}
if ($criteria instanceof Criteria) {
$query->mergeWith($criteria);
}
return $query;
}
/**
* Find object by primary key.
* Propel uses the instance pool to skip the database if the object exists.
* Go fast if the query is untouched.
*
* <code>
* $obj = $c->findPk(12, $con);
* </code>
*
* @param mixed $key Primary key to use for the query
* @param ConnectionInterface $con an optional connection object
*
* @return ChildColissimoLabel|array|mixed the result, formatted by the current formatter
*/
public function findPk($key, $con = null)
{
if ($key === null) {
return null;
}
if ((null !== ($obj = ColissimoLabelTableMap::getInstanceFromPool((string) $key))) && !$this->formatter) {
// the object is already in the instance pool
return $obj;
}
if ($con === null) {
$con = Propel::getServiceContainer()->getReadConnection(ColissimoLabelTableMap::DATABASE_NAME);
}
$this->basePreSelect($con);
if ($this->formatter || $this->modelAlias || $this->with || $this->select
|| $this->selectColumns || $this->asColumns || $this->selectModifiers
|| $this->map || $this->having || $this->joins) {
return $this->findPkComplex($key, $con);
} else {
return $this->findPkSimple($key, $con);
}
}
/**
* Find object by primary key using raw SQL to go fast.
* Bypass doSelect() and the object formatter by using generated code.
*
* @param mixed $key Primary key to use for the query
* @param ConnectionInterface $con A connection object
*
* @return ChildColissimoLabel A model object, or null if the key is not found
*/
protected function findPkSimple($key, $con)
{
$sql = 'SELECT ID, ORDER_ID, WEIGHT, NUMBER, CREATED_AT, UPDATED_AT FROM colissimo_label WHERE ID = :p0';
try {
$stmt = $con->prepare($sql);
$stmt->bindValue(':p0', $key, PDO::PARAM_INT);
$stmt->execute();
} catch (Exception $e) {
Propel::log($e->getMessage(), Propel::LOG_ERR);
throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), 0, $e);
}
$obj = null;
if ($row = $stmt->fetch(\PDO::FETCH_NUM)) {
$obj = new ChildColissimoLabel();
$obj->hydrate($row);
ColissimoLabelTableMap::addInstanceToPool($obj, (string) $key);
}
$stmt->closeCursor();
return $obj;
}
/**
* Find object by primary key.
*
* @param mixed $key Primary key to use for the query
* @param ConnectionInterface $con A connection object
*
* @return ChildColissimoLabel|array|mixed the result, formatted by the current formatter
*/
protected function findPkComplex($key, $con)
{
// As the query uses a PK condition, no limit(1) is necessary.
$criteria = $this->isKeepQuery() ? clone $this : $this;
$dataFetcher = $criteria
->filterByPrimaryKey($key)
->doSelect($con);
return $criteria->getFormatter()->init($criteria)->formatOne($dataFetcher);
}
/**
* Find objects by primary key
* <code>
* $objs = $c->findPks(array(12, 56, 832), $con);
* </code>
* @param array $keys Primary keys to use for the query
* @param ConnectionInterface $con an optional connection object
*
* @return ObjectCollection|array|mixed the list of results, formatted by the current formatter
*/
public function findPks($keys, $con = null)
{
if (null === $con) {
$con = Propel::getServiceContainer()->getReadConnection($this->getDbName());
}
$this->basePreSelect($con);
$criteria = $this->isKeepQuery() ? clone $this : $this;
$dataFetcher = $criteria
->filterByPrimaryKeys($keys)
->doSelect($con);
return $criteria->getFormatter()->init($criteria)->format($dataFetcher);
}
/**
* Filter the query by primary key
*
* @param mixed $key Primary key to use for the query
*
* @return ChildColissimoLabelQuery The current query, for fluid interface
*/
public function filterByPrimaryKey($key)
{
return $this->addUsingAlias(ColissimoLabelTableMap::ID, $key, Criteria::EQUAL);
}
/**
* Filter the query by a list of primary keys
*
* @param array $keys The list of primary key to use for the query
*
* @return ChildColissimoLabelQuery The current query, for fluid interface
*/
public function filterByPrimaryKeys($keys)
{
return $this->addUsingAlias(ColissimoLabelTableMap::ID, $keys, Criteria::IN);
}
/**
* Filter the query on the id column
*
* Example usage:
* <code>
* $query->filterById(1234); // WHERE id = 1234
* $query->filterById(array(12, 34)); // WHERE id IN (12, 34)
* $query->filterById(array('min' => 12)); // WHERE id > 12
* </code>
*
* @param mixed $id The value to use as filter.
* Use scalar values for equality.
* Use array values for in_array() equivalent.
* Use associative array('min' => $minValue, 'max' => $maxValue) for intervals.
* @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL
*
* @return ChildColissimoLabelQuery The current query, for fluid interface
*/
public function filterById($id = null, $comparison = null)
{
if (is_array($id)) {
$useMinMax = false;
if (isset($id['min'])) {
$this->addUsingAlias(ColissimoLabelTableMap::ID, $id['min'], Criteria::GREATER_EQUAL);
$useMinMax = true;
}
if (isset($id['max'])) {
$this->addUsingAlias(ColissimoLabelTableMap::ID, $id['max'], Criteria::LESS_EQUAL);
$useMinMax = true;
}
if ($useMinMax) {
return $this;
}
if (null === $comparison) {
$comparison = Criteria::IN;
}
}
return $this->addUsingAlias(ColissimoLabelTableMap::ID, $id, $comparison);
}
/**
* Filter the query on the order_id column
*
* Example usage:
* <code>
* $query->filterByOrderId(1234); // WHERE order_id = 1234
* $query->filterByOrderId(array(12, 34)); // WHERE order_id IN (12, 34)
* $query->filterByOrderId(array('min' => 12)); // WHERE order_id > 12
* </code>
*
* @see filterByOrder()
*
* @param mixed $orderId The value to use as filter.
* Use scalar values for equality.
* Use array values for in_array() equivalent.
* Use associative array('min' => $minValue, 'max' => $maxValue) for intervals.
* @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL
*
* @return ChildColissimoLabelQuery The current query, for fluid interface
*/
public function filterByOrderId($orderId = null, $comparison = null)
{
if (is_array($orderId)) {
$useMinMax = false;
if (isset($orderId['min'])) {
$this->addUsingAlias(ColissimoLabelTableMap::ORDER_ID, $orderId['min'], Criteria::GREATER_EQUAL);
$useMinMax = true;
}
if (isset($orderId['max'])) {
$this->addUsingAlias(ColissimoLabelTableMap::ORDER_ID, $orderId['max'], Criteria::LESS_EQUAL);
$useMinMax = true;
}
if ($useMinMax) {
return $this;
}
if (null === $comparison) {
$comparison = Criteria::IN;
}
}
return $this->addUsingAlias(ColissimoLabelTableMap::ORDER_ID, $orderId, $comparison);
}
/**
* Filter the query on the weight column
*
* Example usage:
* <code>
* $query->filterByWeight(1234); // WHERE weight = 1234
* $query->filterByWeight(array(12, 34)); // WHERE weight IN (12, 34)
* $query->filterByWeight(array('min' => 12)); // WHERE weight > 12
* </code>
*
* @param mixed $weight The value to use as filter.
* Use scalar values for equality.
* Use array values for in_array() equivalent.
* Use associative array('min' => $minValue, 'max' => $maxValue) for intervals.
* @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL
*
* @return ChildColissimoLabelQuery The current query, for fluid interface
*/
public function filterByWeight($weight = null, $comparison = null)
{
if (is_array($weight)) {
$useMinMax = false;
if (isset($weight['min'])) {
$this->addUsingAlias(ColissimoLabelTableMap::WEIGHT, $weight['min'], Criteria::GREATER_EQUAL);
$useMinMax = true;
}
if (isset($weight['max'])) {
$this->addUsingAlias(ColissimoLabelTableMap::WEIGHT, $weight['max'], Criteria::LESS_EQUAL);
$useMinMax = true;
}
if ($useMinMax) {
return $this;
}
if (null === $comparison) {
$comparison = Criteria::IN;
}
}
return $this->addUsingAlias(ColissimoLabelTableMap::WEIGHT, $weight, $comparison);
}
/**
* Filter the query on the number column
*
* Example usage:
* <code>
* $query->filterByNumber('fooValue'); // WHERE number = 'fooValue'
* $query->filterByNumber('%fooValue%'); // WHERE number LIKE '%fooValue%'
* </code>
*
* @param string $number The value to use as filter.
* Accepts wildcards (* and % trigger a LIKE)
* @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL
*
* @return ChildColissimoLabelQuery The current query, for fluid interface
*/
public function filterByNumber($number = null, $comparison = null)
{
if (null === $comparison) {
if (is_array($number)) {
$comparison = Criteria::IN;
} elseif (preg_match('/[\%\*]/', $number)) {
$number = str_replace('*', '%', $number);
$comparison = Criteria::LIKE;
}
}
return $this->addUsingAlias(ColissimoLabelTableMap::NUMBER, $number, $comparison);
}
/**
* Filter the query on the created_at column
*
* Example usage:
* <code>
* $query->filterByCreatedAt('2011-03-14'); // WHERE created_at = '2011-03-14'
* $query->filterByCreatedAt('now'); // WHERE created_at = '2011-03-14'
* $query->filterByCreatedAt(array('max' => 'yesterday')); // WHERE created_at > '2011-03-13'
* </code>
*
* @param mixed $createdAt The value to use as filter.
* Values can be integers (unix timestamps), DateTime objects, or strings.
* Empty strings are treated as NULL.
* Use scalar values for equality.
* Use array values for in_array() equivalent.
* Use associative array('min' => $minValue, 'max' => $maxValue) for intervals.
* @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL
*
* @return ChildColissimoLabelQuery The current query, for fluid interface
*/
public function filterByCreatedAt($createdAt = null, $comparison = null)
{
if (is_array($createdAt)) {
$useMinMax = false;
if (isset($createdAt['min'])) {
$this->addUsingAlias(ColissimoLabelTableMap::CREATED_AT, $createdAt['min'], Criteria::GREATER_EQUAL);
$useMinMax = true;
}
if (isset($createdAt['max'])) {
$this->addUsingAlias(ColissimoLabelTableMap::CREATED_AT, $createdAt['max'], Criteria::LESS_EQUAL);
$useMinMax = true;
}
if ($useMinMax) {
return $this;
}
if (null === $comparison) {
$comparison = Criteria::IN;
}
}
return $this->addUsingAlias(ColissimoLabelTableMap::CREATED_AT, $createdAt, $comparison);
}
/**
* Filter the query on the updated_at column
*
* Example usage:
* <code>
* $query->filterByUpdatedAt('2011-03-14'); // WHERE updated_at = '2011-03-14'
* $query->filterByUpdatedAt('now'); // WHERE updated_at = '2011-03-14'
* $query->filterByUpdatedAt(array('max' => 'yesterday')); // WHERE updated_at > '2011-03-13'
* </code>
*
* @param mixed $updatedAt The value to use as filter.
* Values can be integers (unix timestamps), DateTime objects, or strings.
* Empty strings are treated as NULL.
* Use scalar values for equality.
* Use array values for in_array() equivalent.
* Use associative array('min' => $minValue, 'max' => $maxValue) for intervals.
* @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL
*
* @return ChildColissimoLabelQuery The current query, for fluid interface
*/
public function filterByUpdatedAt($updatedAt = null, $comparison = null)
{
if (is_array($updatedAt)) {
$useMinMax = false;
if (isset($updatedAt['min'])) {
$this->addUsingAlias(ColissimoLabelTableMap::UPDATED_AT, $updatedAt['min'], Criteria::GREATER_EQUAL);
$useMinMax = true;
}
if (isset($updatedAt['max'])) {
$this->addUsingAlias(ColissimoLabelTableMap::UPDATED_AT, $updatedAt['max'], Criteria::LESS_EQUAL);
$useMinMax = true;
}
if ($useMinMax) {
return $this;
}
if (null === $comparison) {
$comparison = Criteria::IN;
}
}
return $this->addUsingAlias(ColissimoLabelTableMap::UPDATED_AT, $updatedAt, $comparison);
}
/**
* Filter the query by a related \Thelia\Model\Order object
*
* @param \Thelia\Model\Order|ObjectCollection $order The related object(s) to use as filter
* @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL
*
* @return ChildColissimoLabelQuery The current query, for fluid interface
*/
public function filterByOrder($order, $comparison = null)
{
if ($order instanceof \Thelia\Model\Order) {
return $this
->addUsingAlias(ColissimoLabelTableMap::ORDER_ID, $order->getId(), $comparison);
} elseif ($order instanceof ObjectCollection) {
if (null === $comparison) {
$comparison = Criteria::IN;
}
return $this
->addUsingAlias(ColissimoLabelTableMap::ORDER_ID, $order->toKeyValue('PrimaryKey', 'Id'), $comparison);
} else {
throw new PropelException('filterByOrder() only accepts arguments of type \Thelia\Model\Order or Collection');
}
}
/**
* Adds a JOIN clause to the query using the Order relation
*
* @param string $relationAlias optional alias for the relation
* @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join'
*
* @return ChildColissimoLabelQuery The current query, for fluid interface
*/
public function joinOrder($relationAlias = null, $joinType = Criteria::INNER_JOIN)
{
$tableMap = $this->getTableMap();
$relationMap = $tableMap->getRelation('Order');
// create a ModelJoin object for this join
$join = new ModelJoin();
$join->setJoinType($joinType);
$join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias);
if ($previousJoin = $this->getPreviousJoin()) {
$join->setPreviousJoin($previousJoin);
}
// add the ModelJoin to the current object
if ($relationAlias) {
$this->addAlias($relationAlias, $relationMap->getRightTable()->getName());
$this->addJoinObject($join, $relationAlias);
} else {
$this->addJoinObject($join, 'Order');
}
return $this;
}
/**
* Use the Order relation Order object
*
* @see useQuery()
*
* @param string $relationAlias optional alias for the relation,
* to be used as main alias in the secondary query
* @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join'
*
* @return \Thelia\Model\OrderQuery A secondary query class using the current class as primary query
*/
public function useOrderQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN)
{
return $this
->joinOrder($relationAlias, $joinType)
->useQuery($relationAlias ? $relationAlias : 'Order', '\Thelia\Model\OrderQuery');
}
/**
* Exclude object from result
*
* @param ChildColissimoLabel $colissimoLabel Object to remove from the list of results
*
* @return ChildColissimoLabelQuery The current query, for fluid interface
*/
public function prune($colissimoLabel = null)
{
if ($colissimoLabel) {
$this->addUsingAlias(ColissimoLabelTableMap::ID, $colissimoLabel->getId(), Criteria::NOT_EQUAL);
}
return $this;
}
/**
* Deletes all rows from the colissimo_label table.
*
* @param ConnectionInterface $con the connection to use
* @return int The number of affected rows (if supported by underlying database driver).
*/
public function doDeleteAll(ConnectionInterface $con = null)
{
if (null === $con) {
$con = Propel::getServiceContainer()->getWriteConnection(ColissimoLabelTableMap::DATABASE_NAME);
}
$affectedRows = 0; // initialize var to track total num of affected rows
try {
// use transaction because $criteria could contain info
// for more than one table or we could emulating ON DELETE CASCADE, etc.
$con->beginTransaction();
$affectedRows += parent::doDeleteAll($con);
// Because this db requires some delete cascade/set null emulation, we have to
// clear the cached instance *after* the emulation has happened (since
// instances get re-added by the select statement contained therein).
ColissimoLabelTableMap::clearInstancePool();
ColissimoLabelTableMap::clearRelatedInstancePool();
$con->commit();
} catch (PropelException $e) {
$con->rollBack();
throw $e;
}
return $affectedRows;
}
/**
* Performs a DELETE on the database, given a ChildColissimoLabel or Criteria object OR a primary key value.
*
* @param mixed $values Criteria or ChildColissimoLabel object or primary key or array of primary keys
* which is used to create the DELETE statement
* @param ConnectionInterface $con the connection to use
* @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows
* if supported by native driver or if emulated using Propel.
* @throws PropelException Any exceptions caught during processing will be
* rethrown wrapped into a PropelException.
*/
public function delete(ConnectionInterface $con = null)
{
if (null === $con) {
$con = Propel::getServiceContainer()->getWriteConnection(ColissimoLabelTableMap::DATABASE_NAME);
}
$criteria = $this;
// Set the correct dbName
$criteria->setDbName(ColissimoLabelTableMap::DATABASE_NAME);
$affectedRows = 0; // initialize var to track total num of affected rows
try {
// use transaction because $criteria could contain info
// for more than one table or we could emulating ON DELETE CASCADE, etc.
$con->beginTransaction();
ColissimoLabelTableMap::removeInstanceFromPool($criteria);
$affectedRows += ModelCriteria::delete($con);
ColissimoLabelTableMap::clearRelatedInstancePool();
$con->commit();
return $affectedRows;
} catch (PropelException $e) {
$con->rollBack();
throw $e;
}
}
// timestampable behavior
/**
* Filter by the latest updated
*
* @param int $nbDays Maximum age of the latest update in days
*
* @return ChildColissimoLabelQuery The current query, for fluid interface
*/
public function recentlyUpdated($nbDays = 7)
{
return $this->addUsingAlias(ColissimoLabelTableMap::UPDATED_AT, time() - $nbDays * 24 * 60 * 60, Criteria::GREATER_EQUAL);
}
/**
* Filter by the latest created
*
* @param int $nbDays Maximum age of in days
*
* @return ChildColissimoLabelQuery The current query, for fluid interface
*/
public function recentlyCreated($nbDays = 7)
{
return $this->addUsingAlias(ColissimoLabelTableMap::CREATED_AT, time() - $nbDays * 24 * 60 * 60, Criteria::GREATER_EQUAL);
}
/**
* Order by update date desc
*
* @return ChildColissimoLabelQuery The current query, for fluid interface
*/
public function lastUpdatedFirst()
{
return $this->addDescendingOrderByColumn(ColissimoLabelTableMap::UPDATED_AT);
}
/**
* Order by update date asc
*
* @return ChildColissimoLabelQuery The current query, for fluid interface
*/
public function firstUpdatedFirst()
{
return $this->addAscendingOrderByColumn(ColissimoLabelTableMap::UPDATED_AT);
}
/**
* Order by create date desc
*
* @return ChildColissimoLabelQuery The current query, for fluid interface
*/
public function lastCreatedFirst()
{
return $this->addDescendingOrderByColumn(ColissimoLabelTableMap::CREATED_AT);
}
/**
* Order by create date asc
*
* @return ChildColissimoLabelQuery The current query, for fluid interface
*/
public function firstCreatedFirst()
{
return $this->addAscendingOrderByColumn(ColissimoLabelTableMap::CREATED_AT);
}
} // ColissimoLabelQuery

View File

@@ -0,0 +1,10 @@
<?php
namespace ColissimoLabel\Model;
use ColissimoLabel\Model\Base\ColissimoLabel as BaseColissimoLabel;
class ColissimoLabel extends BaseColissimoLabel
{
}

View File

@@ -0,0 +1,21 @@
<?php
namespace ColissimoLabel\Model;
use ColissimoLabel\Model\Base\ColissimoLabelQuery as BaseColissimoLabelQuery;
/**
* Skeleton subclass for performing query and update operations on the 'colissimo_label' table.
*
*
*
* You should add additional methods to this class to meet the
* application requirements. This class will only be generated as
* long as it does not already exist in the output directory.
*
*/
class ColissimoLabelQuery extends BaseColissimoLabelQuery
{
} // ColissimoLabelQuery

View File

@@ -0,0 +1,456 @@
<?php
namespace ColissimoLabel\Model\Map;
use ColissimoLabel\Model\ColissimoLabel;
use ColissimoLabel\Model\ColissimoLabelQuery;
use Propel\Runtime\Propel;
use Propel\Runtime\ActiveQuery\Criteria;
use Propel\Runtime\ActiveQuery\InstancePoolTrait;
use Propel\Runtime\Connection\ConnectionInterface;
use Propel\Runtime\DataFetcher\DataFetcherInterface;
use Propel\Runtime\Exception\PropelException;
use Propel\Runtime\Map\RelationMap;
use Propel\Runtime\Map\TableMap;
use Propel\Runtime\Map\TableMapTrait;
/**
* This class defines the structure of the 'colissimo_label' table.
*
*
*
* This map class is used by Propel to do runtime db structure discovery.
* For example, the createSelectSql() method checks the type of a given column used in an
* ORDER BY clause to know whether it needs to apply SQL to make the ORDER BY case-insensitive
* (i.e. if it's a text column type).
*
*/
class ColissimoLabelTableMap extends TableMap
{
use InstancePoolTrait;
use TableMapTrait;
/**
* The (dot-path) name of this class
*/
const CLASS_NAME = 'ColissimoLabel.Model.Map.ColissimoLabelTableMap';
/**
* The default database name for this class
*/
const DATABASE_NAME = 'thelia';
/**
* The table name for this class
*/
const TABLE_NAME = 'colissimo_label';
/**
* The related Propel class for this table
*/
const OM_CLASS = '\\ColissimoLabel\\Model\\ColissimoLabel';
/**
* A class that can be returned by this tableMap
*/
const CLASS_DEFAULT = 'ColissimoLabel.Model.ColissimoLabel';
/**
* The total number of columns
*/
const NUM_COLUMNS = 6;
/**
* The number of lazy-loaded columns
*/
const NUM_LAZY_LOAD_COLUMNS = 0;
/**
* The number of columns to hydrate (NUM_COLUMNS - NUM_LAZY_LOAD_COLUMNS)
*/
const NUM_HYDRATE_COLUMNS = 6;
/**
* the column name for the ID field
*/
const ID = 'colissimo_label.ID';
/**
* the column name for the ORDER_ID field
*/
const ORDER_ID = 'colissimo_label.ORDER_ID';
/**
* the column name for the WEIGHT field
*/
const WEIGHT = 'colissimo_label.WEIGHT';
/**
* the column name for the NUMBER field
*/
const NUMBER = 'colissimo_label.NUMBER';
/**
* the column name for the CREATED_AT field
*/
const CREATED_AT = 'colissimo_label.CREATED_AT';
/**
* the column name for the UPDATED_AT field
*/
const UPDATED_AT = 'colissimo_label.UPDATED_AT';
/**
* The default string format for model objects of the related table
*/
const DEFAULT_STRING_FORMAT = 'YAML';
/**
* holds an array of fieldnames
*
* first dimension keys are the type constants
* e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id'
*/
protected static $fieldNames = array (
self::TYPE_PHPNAME => array('Id', 'OrderId', 'Weight', 'Number', 'CreatedAt', 'UpdatedAt', ),
self::TYPE_STUDLYPHPNAME => array('id', 'orderId', 'weight', 'number', 'createdAt', 'updatedAt', ),
self::TYPE_COLNAME => array(ColissimoLabelTableMap::ID, ColissimoLabelTableMap::ORDER_ID, ColissimoLabelTableMap::WEIGHT, ColissimoLabelTableMap::NUMBER, ColissimoLabelTableMap::CREATED_AT, ColissimoLabelTableMap::UPDATED_AT, ),
self::TYPE_RAW_COLNAME => array('ID', 'ORDER_ID', 'WEIGHT', 'NUMBER', 'CREATED_AT', 'UPDATED_AT', ),
self::TYPE_FIELDNAME => array('id', 'order_id', 'weight', 'number', 'created_at', 'updated_at', ),
self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, )
);
/**
* holds an array of keys for quick access to the fieldnames array
*
* first dimension keys are the type constants
* e.g. self::$fieldKeys[self::TYPE_PHPNAME]['Id'] = 0
*/
protected static $fieldKeys = array (
self::TYPE_PHPNAME => array('Id' => 0, 'OrderId' => 1, 'Weight' => 2, 'Number' => 3, 'CreatedAt' => 4, 'UpdatedAt' => 5, ),
self::TYPE_STUDLYPHPNAME => array('id' => 0, 'orderId' => 1, 'weight' => 2, 'number' => 3, 'createdAt' => 4, 'updatedAt' => 5, ),
self::TYPE_COLNAME => array(ColissimoLabelTableMap::ID => 0, ColissimoLabelTableMap::ORDER_ID => 1, ColissimoLabelTableMap::WEIGHT => 2, ColissimoLabelTableMap::NUMBER => 3, ColissimoLabelTableMap::CREATED_AT => 4, ColissimoLabelTableMap::UPDATED_AT => 5, ),
self::TYPE_RAW_COLNAME => array('ID' => 0, 'ORDER_ID' => 1, 'WEIGHT' => 2, 'NUMBER' => 3, 'CREATED_AT' => 4, 'UPDATED_AT' => 5, ),
self::TYPE_FIELDNAME => array('id' => 0, 'order_id' => 1, 'weight' => 2, 'number' => 3, 'created_at' => 4, 'updated_at' => 5, ),
self::TYPE_NUM => array(0, 1, 2, 3, 4, 5, )
);
/**
* Initialize the table attributes and columns
* Relations are not initialized by this method since they are lazy loaded
*
* @return void
* @throws PropelException
*/
public function initialize()
{
// attributes
$this->setName('colissimo_label');
$this->setPhpName('ColissimoLabel');
$this->setClassName('\\ColissimoLabel\\Model\\ColissimoLabel');
$this->setPackage('ColissimoLabel.Model');
$this->setUseIdGenerator(true);
// columns
$this->addPrimaryKey('ID', 'Id', 'INTEGER', true, null, null);
$this->addForeignKey('ORDER_ID', 'OrderId', 'INTEGER', 'order', 'ID', true, null, null);
$this->addColumn('WEIGHT', 'Weight', 'DECIMAL', false, 6, 0);
$this->addColumn('NUMBER', 'Number', 'VARCHAR', false, 255, null);
$this->addColumn('CREATED_AT', 'CreatedAt', 'TIMESTAMP', false, null, null);
$this->addColumn('UPDATED_AT', 'UpdatedAt', 'TIMESTAMP', false, null, null);
} // initialize()
/**
* Build the RelationMap objects for this table relationships
*/
public function buildRelations()
{
$this->addRelation('Order', '\\Thelia\\Model\\Order', RelationMap::MANY_TO_ONE, array('order_id' => 'id', ), 'CASCADE', 'RESTRICT');
} // buildRelations()
/**
*
* Gets the list of behaviors registered for this table
*
* @return array Associative array (name => parameters) of behaviors
*/
public function getBehaviors()
{
return array(
'timestampable' => array('create_column' => 'created_at', 'update_column' => 'updated_at', ),
);
} // getBehaviors()
/**
* Retrieves a string version of the primary key from the DB resultset row that can be used to uniquely identify a row in this table.
*
* For tables with a single-column primary key, that simple pkey value will be returned. For tables with
* a multi-column primary key, a serialize()d version of the primary key will be returned.
*
* @param array $row resultset row.
* @param int $offset The 0-based offset for reading from the resultset row.
* @param string $indexType One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME
* TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM
*/
public static function getPrimaryKeyHashFromRow($row, $offset = 0, $indexType = TableMap::TYPE_NUM)
{
// If the PK cannot be derived from the row, return NULL.
if ($row[TableMap::TYPE_NUM == $indexType ? 0 + $offset : static::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)] === null) {
return null;
}
return (string) $row[TableMap::TYPE_NUM == $indexType ? 0 + $offset : static::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)];
}
/**
* Retrieves the primary key from the DB resultset row
* For tables with a single-column primary key, that simple pkey value will be returned. For tables with
* a multi-column primary key, an array of the primary key columns will be returned.
*
* @param array $row resultset row.
* @param int $offset The 0-based offset for reading from the resultset row.
* @param string $indexType One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME
* TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM
*
* @return mixed The primary key of the row
*/
public static function getPrimaryKeyFromRow($row, $offset = 0, $indexType = TableMap::TYPE_NUM)
{
return (int) $row[
$indexType == TableMap::TYPE_NUM
? 0 + $offset
: self::translateFieldName('Id', TableMap::TYPE_PHPNAME, $indexType)
];
}
/**
* The class that the tableMap will make instances of.
*
* If $withPrefix is true, the returned path
* uses a dot-path notation which is translated into a path
* relative to a location on the PHP include_path.
* (e.g. path.to.MyClass -> 'path/to/MyClass.php')
*
* @param boolean $withPrefix Whether or not to return the path with the class name
* @return string path.to.ClassName
*/
public static function getOMClass($withPrefix = true)
{
return $withPrefix ? ColissimoLabelTableMap::CLASS_DEFAULT : ColissimoLabelTableMap::OM_CLASS;
}
/**
* Populates an object of the default type or an object that inherit from the default.
*
* @param array $row row returned by DataFetcher->fetch().
* @param int $offset The 0-based offset for reading from the resultset row.
* @param string $indexType The index type of $row. Mostly DataFetcher->getIndexType().
One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_STUDLYPHPNAME
* TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM.
*
* @throws PropelException Any exceptions caught during processing will be
* rethrown wrapped into a PropelException.
* @return array (ColissimoLabel object, last column rank)
*/
public static function populateObject($row, $offset = 0, $indexType = TableMap::TYPE_NUM)
{
$key = ColissimoLabelTableMap::getPrimaryKeyHashFromRow($row, $offset, $indexType);
if (null !== ($obj = ColissimoLabelTableMap::getInstanceFromPool($key))) {
// We no longer rehydrate the object, since this can cause data loss.
// See http://www.propelorm.org/ticket/509
// $obj->hydrate($row, $offset, true); // rehydrate
$col = $offset + ColissimoLabelTableMap::NUM_HYDRATE_COLUMNS;
} else {
$cls = ColissimoLabelTableMap::OM_CLASS;
$obj = new $cls();
$col = $obj->hydrate($row, $offset, false, $indexType);
ColissimoLabelTableMap::addInstanceToPool($obj, $key);
}
return array($obj, $col);
}
/**
* The returned array will contain objects of the default type or
* objects that inherit from the default.
*
* @param DataFetcherInterface $dataFetcher
* @return array
* @throws PropelException Any exceptions caught during processing will be
* rethrown wrapped into a PropelException.
*/
public static function populateObjects(DataFetcherInterface $dataFetcher)
{
$results = array();
// set the class once to avoid overhead in the loop
$cls = static::getOMClass(false);
// populate the object(s)
while ($row = $dataFetcher->fetch()) {
$key = ColissimoLabelTableMap::getPrimaryKeyHashFromRow($row, 0, $dataFetcher->getIndexType());
if (null !== ($obj = ColissimoLabelTableMap::getInstanceFromPool($key))) {
// We no longer rehydrate the object, since this can cause data loss.
// See http://www.propelorm.org/ticket/509
// $obj->hydrate($row, 0, true); // rehydrate
$results[] = $obj;
} else {
$obj = new $cls();
$obj->hydrate($row);
$results[] = $obj;
ColissimoLabelTableMap::addInstanceToPool($obj, $key);
} // if key exists
}
return $results;
}
/**
* Add all the columns needed to create a new object.
*
* Note: any columns that were marked with lazyLoad="true" in the
* XML schema will not be added to the select list and only loaded
* on demand.
*
* @param Criteria $criteria object containing the columns to add.
* @param string $alias optional table alias
* @throws PropelException Any exceptions caught during processing will be
* rethrown wrapped into a PropelException.
*/
public static function addSelectColumns(Criteria $criteria, $alias = null)
{
if (null === $alias) {
$criteria->addSelectColumn(ColissimoLabelTableMap::ID);
$criteria->addSelectColumn(ColissimoLabelTableMap::ORDER_ID);
$criteria->addSelectColumn(ColissimoLabelTableMap::WEIGHT);
$criteria->addSelectColumn(ColissimoLabelTableMap::NUMBER);
$criteria->addSelectColumn(ColissimoLabelTableMap::CREATED_AT);
$criteria->addSelectColumn(ColissimoLabelTableMap::UPDATED_AT);
} else {
$criteria->addSelectColumn($alias . '.ID');
$criteria->addSelectColumn($alias . '.ORDER_ID');
$criteria->addSelectColumn($alias . '.WEIGHT');
$criteria->addSelectColumn($alias . '.NUMBER');
$criteria->addSelectColumn($alias . '.CREATED_AT');
$criteria->addSelectColumn($alias . '.UPDATED_AT');
}
}
/**
* Returns the TableMap related to this object.
* This method is not needed for general use but a specific application could have a need.
* @return TableMap
* @throws PropelException Any exceptions caught during processing will be
* rethrown wrapped into a PropelException.
*/
public static function getTableMap()
{
return Propel::getServiceContainer()->getDatabaseMap(ColissimoLabelTableMap::DATABASE_NAME)->getTable(ColissimoLabelTableMap::TABLE_NAME);
}
/**
* Add a TableMap instance to the database for this tableMap class.
*/
public static function buildTableMap()
{
$dbMap = Propel::getServiceContainer()->getDatabaseMap(ColissimoLabelTableMap::DATABASE_NAME);
if (!$dbMap->hasTable(ColissimoLabelTableMap::TABLE_NAME)) {
$dbMap->addTableObject(new ColissimoLabelTableMap());
}
}
/**
* Performs a DELETE on the database, given a ColissimoLabel or Criteria object OR a primary key value.
*
* @param mixed $values Criteria or ColissimoLabel object or primary key or array of primary keys
* which is used to create the DELETE statement
* @param ConnectionInterface $con the connection to use
* @return int The number of affected rows (if supported by underlying database driver). This includes CASCADE-related rows
* if supported by native driver or if emulated using Propel.
* @throws PropelException Any exceptions caught during processing will be
* rethrown wrapped into a PropelException.
*/
public static function doDelete($values, ConnectionInterface $con = null)
{
if (null === $con) {
$con = Propel::getServiceContainer()->getWriteConnection(ColissimoLabelTableMap::DATABASE_NAME);
}
if ($values instanceof Criteria) {
// rename for clarity
$criteria = $values;
} elseif ($values instanceof \ColissimoLabel\Model\ColissimoLabel) { // it's a model object
// create criteria based on pk values
$criteria = $values->buildPkeyCriteria();
} else { // it's a primary key, or an array of pks
$criteria = new Criteria(ColissimoLabelTableMap::DATABASE_NAME);
$criteria->add(ColissimoLabelTableMap::ID, (array) $values, Criteria::IN);
}
$query = ColissimoLabelQuery::create()->mergeWith($criteria);
if ($values instanceof Criteria) { ColissimoLabelTableMap::clearInstancePool();
} elseif (!is_object($values)) { // it's a primary key, or an array of pks
foreach ((array) $values as $singleval) { ColissimoLabelTableMap::removeInstanceFromPool($singleval);
}
}
return $query->delete($con);
}
/**
* Deletes all rows from the colissimo_label table.
*
* @param ConnectionInterface $con the connection to use
* @return int The number of affected rows (if supported by underlying database driver).
*/
public static function doDeleteAll(ConnectionInterface $con = null)
{
return ColissimoLabelQuery::create()->doDeleteAll($con);
}
/**
* Performs an INSERT on the database, given a ColissimoLabel or Criteria object.
*
* @param mixed $criteria Criteria or ColissimoLabel object containing data that is used to create the INSERT statement.
* @param ConnectionInterface $con the ConnectionInterface connection to use
* @return mixed The new primary key.
* @throws PropelException Any exceptions caught during processing will be
* rethrown wrapped into a PropelException.
*/
public static function doInsert($criteria, ConnectionInterface $con = null)
{
if (null === $con) {
$con = Propel::getServiceContainer()->getWriteConnection(ColissimoLabelTableMap::DATABASE_NAME);
}
if ($criteria instanceof Criteria) {
$criteria = clone $criteria; // rename for clarity
} else {
$criteria = $criteria->buildCriteria(); // build Criteria from ColissimoLabel object
}
if ($criteria->containsKey(ColissimoLabelTableMap::ID) && $criteria->keyContainsValue(ColissimoLabelTableMap::ID) ) {
throw new PropelException('Cannot insert a value for auto-increment primary key ('.ColissimoLabelTableMap::ID.')');
}
// Set the correct dbName
$query = ColissimoLabelQuery::create()->mergeWith($criteria);
try {
// use transaction because $criteria could contain info
// for more than one table (I guess, conceivably)
$con->beginTransaction();
$pk = $query->doInsert($con);
$con->commit();
} catch (PropelException $e) {
$con->rollBack();
throw $e;
}
return $pk;
}
} // ColissimoLabelTableMap
// This is the static code needed to register the TableMap for this table with the main Propel class.
//
ColissimoLabelTableMap::buildTableMap();

View File

@@ -0,0 +1,22 @@
# Colissimo Label
## Installation
### Manually
* Copy the module into ```<thelia_root>/local/modules/``` directory and be sure that the name of the module is ColissimoLabel.
* Activate it in your thelia administration panel
### Composer
Add it in your main thelia composer.json file
```
composer require thelia/colissimo-label-module:~0.3.2
```
### Configuration
For the moment, this module does not have interface.
You can change the values `contract-number` `password` on your table `module_config`

View File

@@ -0,0 +1,118 @@
<?php
namespace ColissimoLabel\Request;
use ColissimoLabel\Request\Helper\Letter;
use ColissimoLabel\Request\Helper\OutputFormat;
/**
* @author Gilles Bourgeat >gilles.bourgeat@gmail.com>
*/
abstract class AbstractLabelRequest extends AbstractRequest
{
/** @var OutputFormat|null */
private $outputFormat;
/** @var Letter */
private $letter;
/**
* @return OutputFormat|null
*/
public function getOutputFormat()
{
return $this->outputFormat;
}
/**
* @param OutputFormat $outputFormat
* @return self
*/
protected function setOutputFormat(OutputFormat $outputFormat)
{
$this->outputFormat = $outputFormat;
return $this;
}
/**
* @return Letter
*/
public function getLetter()
{
return $this->letter;
}
/**
* @param Letter $letter
* @return self
*/
protected function setLetter(Letter $letter)
{
$this->letter = $letter;
return $this;
}
/**
* @inheritdoc
*/
public function generateArrayRequest()
{
return array_merge_recursive(parent::generateArrayRequest(), [
'outputFormat' => [
'x' => $this->getOutputFormat()->getX(),
'y' => $this->getOutputFormat()->getY(),
'outputPrintingType' => $this->getOutputFormat()->getOutputPrintingType()
],
'letter' => [
'service' => [
"productCode" => $this->getLetter()->getService()->getProductCode(),
"depositDate" => $this->getLetter()->getService()->getDepositDate()->format('Y-m-d'),
"orderNumber" => $this->getLetter()->getService()->getOrderNumber(),
'commercialName' => $this->getLetter()->getService()->getCommercialName()
],
'parcel' => [
'weight' => $this->getLetter()->getParcel()->getWeight(),
'pickupLocationId' => $this->getLetter()->getParcel()->getPickupLocationId()
],
'sender' => [
'senderParcelRef' => $this->getLetter()->getSender()->getSenderParcelRef(),
'address' => [
'companyName' => $this->getLetter()->getSender()->getAddress()->getCompanyName(),
'lastName' => $this->getLetter()->getSender()->getAddress()->getLastName(),
'firstName' => $this->getLetter()->getSender()->getAddress()->getFirstName(),
'line0' => $this->getLetter()->getSender()->getAddress()->getLine0(),
'line1' => $this->getLetter()->getSender()->getAddress()->getLine1(),
'line2' => $this->getLetter()->getSender()->getAddress()->getLine2(),
'line3' => $this->getLetter()->getSender()->getAddress()->getLine3(),
'countryCode' => $this->getLetter()->getSender()->getAddress()->getCountryCode(),
'city' => $this->getLetter()->getSender()->getAddress()->getCity(),
'zipCode' => $this->getLetter()->getSender()->getAddress()->getZipCode(),
'phoneNumber' => $this->getLetter()->getSender()->getAddress()->getPhoneNumber(),
'mobileNumber' => $this->getLetter()->getSender()->getAddress()->getMobileNumber(),
'email'=> $this->getLetter()->getSender()->getAddress()->getEmail(),
'language' => $this->getLetter()->getSender()->getAddress()->getLanguage()
]
],
'addressee' => [
'addresseeParcelRef' => $this->getLetter()->getAddressee()->getAddresseeParcelRef(),
'address' => [
'companyName' => $this->getLetter()->getAddressee()->getAddress()->getCompanyName(),
'lastName' => $this->getLetter()->getAddressee()->getAddress()->getLastName(),
'firstName' => $this->getLetter()->getAddressee()->getAddress()->getFirstName(),
'line0' => $this->getLetter()->getAddressee()->getAddress()->getLine0(),
'line1' => $this->getLetter()->getAddressee()->getAddress()->getLine1(),
'line2' => $this->getLetter()->getAddressee()->getAddress()->getLine2(),
'line3' => $this->getLetter()->getAddressee()->getAddress()->getLine3(),
'countryCode' => $this->getLetter()->getAddressee()->getAddress()->getCountryCode(),
'city' => $this->getLetter()->getAddressee()->getAddress()->getCity(),
'zipCode' => $this->getLetter()->getAddressee()->getAddress()->getZipCode(),
'phoneNumber' => $this->getLetter()->getAddressee()->getAddress()->getPhoneNumber(),
'mobileNumber' => $this->getLetter()->getAddressee()->getAddress()->getMobileNumber(),
'email'=> $this->getLetter()->getAddressee()->getAddress()->getEmail(),
'language' => $this->getLetter()->getAddressee()->getAddress()->getLanguage()
]
]
]
]);
}
}

View File

@@ -0,0 +1,57 @@
<?php
namespace ColissimoLabel\Request;
/**
* @author Gilles Bourgeat >gilles.bourgeat@gmail.com>
*/
abstract class AbstractRequest
{
protected $contractNumber = '';
protected $password = '';
/**
* @return string
*/
public function getContractNumber()
{
return $this->contractNumber;
}
/**
* @param string $contractNumber
* @return self
*/
public function setContractNumber($contractNumber)
{
$this->contractNumber = $contractNumber;
return $this;
}
/**
* @return string
*/
public function getPassword()
{
return $this->password;
}
/**
* @param string $password
* @return self
*/
public function setPassword($password)
{
$this->password = $password;
return $this;
}
public function generateArrayRequest()
{
return [
'contractNumber' => $this->getContractNumber(),
'password' => $this->getPassword()
];
}
}

View File

@@ -0,0 +1,118 @@
<?php
namespace ColissimoLabel\Request\Helper;
use Thelia\Model\ConfigQuery;
/**
* @author Gilles Bourgeat >gilles.bourgeat@gmail.com>
*/
abstract class APIConfiguration
{
protected $contractNumber = '';
protected $password = '';
protected $version = '2.0';
protected $wsdl = '';
protected $method = '';
public function __construct()
{
$this->setContractNumber(ConfigQuery::read('colissimo.api.contract.number'));
$this->setPassword(ConfigQuery::read('colissimo.api.password'));
$this->setWsdl('https://ws.colissimo.fr/sls-ws/SlsServiceWS/2.0?wsdl');
}
/**
* @return string
*/
public function getContractNumber()
{
return $this->contractNumber;
}
/**
* @param string $contractNumber
* @return self
*/
public function setContractNumber($contractNumber)
{
$this->contractNumber = $contractNumber;
return $this;
}
/**
* @return string
*/
public function getPassword()
{
return $this->password;
}
/**
* @param string $password
* @return self
*/
public function setPassword($password)
{
$this->password = $password;
return $this;
}
/**
* @return string
*/
public function getVersion()
{
return $this->version;
}
/**
* @param string $version
* @return self
*/
public function setVersion($version)
{
$this->version = $version;
return $this;
}
/**
* @return string
*/
public function getWsdl()
{
return $this->wsdl;
}
/**
* @param string $wsdl
* @return self
*/
public function setWsdl($wsdl)
{
$this->wsdl = $wsdl;
return $this;
}
/**
* @return string
*/
public function getMethod()
{
return $this->method;
}
/**
* @param string $method
* @return self
*/
public function setMethod($method)
{
$this->method = $method;
return $this;
}
}

View File

@@ -0,0 +1,289 @@
<?php
namespace ColissimoLabel\Request\Helper;
/**
* @author Gilles Bourgeat >gilles.bourgeat@gmail.com>
*/
class Address
{
protected $companyName ='';
protected $lastName = '';
protected $firstName = '';
protected $line0 = '';
protected $line1 = '';
protected $line2 = '';
protected $line3 = '';
protected $countryCode = '';
protected $city = '';
protected $zipCode = '';
protected $phoneNumber = '';
protected $mobileNumber = '';
protected $email = '';
protected $language = '';
/**
* @return string
*/
public function getLanguage()
{
return $this->language;
}
/**
* @param string $language
* @return Address
*/
public function setLanguage($language)
{
$this->language = $language;
return $this;
}
/**
* @return string
*/
public function getPhoneNumber()
{
return $this->phoneNumber;
}
/**
* @param string $phoneNumber
* @return Address
*/
public function setPhoneNumber($phoneNumber)
{
$this->phoneNumber = $phoneNumber;
return $this;
}
/**
* @return string
*/
public function getMobileNumber()
{
return $this->mobileNumber;
}
/**
* @param string $mobileNumber
* @return Address
*/
public function setMobileNumber($mobileNumber)
{
$this->mobileNumber = $mobileNumber;
return $this;
}
/**
* @return string
*/
public function getEmail()
{
return $this->email;
}
/**
* @param string $email
* @return Address
*/
public function setEmail($email)
{
$this->email = $email;
return $this;
}
/**
* @return string
*/
public function getCompanyName()
{
return $this->companyName;
}
/**
* @param string $companyName
* @return self
*/
public function setCompanyName($companyName)
{
$this->companyName = $companyName;
return $this;
}
/**
* @return string
*/
public function getLastName()
{
return $this->lastName;
}
/**
* @param string $lastName
* @return self
*/
public function setLastName($lastName)
{
$this->lastName = $lastName;
return $this;
}
/**
* @return string
*/
public function getFirstName()
{
return $this->firstName;
}
/**
* @param string $firstName
* @return self
*/
public function setFirstName($firstName)
{
$this->firstName = $firstName;
return $this;
}
/**
* @return string
*/
public function getLine0()
{
return $this->line0;
}
/**
* @param string $line0
* @return self
*/
public function setLine0($line0)
{
$this->line0 = $line0;
return $this;
}
/**
* @return string
*/
public function getLine1()
{
return $this->line1;
}
/**
* @param string $line1
* @return self
*/
public function setLine1($line1)
{
$this->line1 = $line1;
return $this;
}
/**
* @return string
*/
public function getLine2()
{
return $this->line2;
}
/**
* @param string $line2
* @return self
*/
public function setLine2($line2)
{
$this->line2 = $line2;
return $this;
}
/**
* @return string
*/
public function getLine3()
{
return $this->line3;
}
/**
* @param string $line3
* @return self
*/
public function setLine3($line3)
{
$this->line3 = $line3;
return $this;
}
/**
* @return string
*/
public function getCountryCode()
{
return $this->countryCode;
}
/**
* @param string $countryCode
* @return self
*/
public function setCountryCode($countryCode)
{
$this->countryCode = $countryCode;
return $this;
}
/**
* @return string
*/
public function getCity()
{
return $this->city;
}
/**
* @param string $city
* @return self
*/
public function setCity($city)
{
$this->city = $city;
return $this;
}
/**
* @return string
*/
public function getZipCode()
{
return $this->zipCode;
}
/**
* @param string $zipCode
* @return self
*/
public function setZipCode($zipCode)
{
$this->zipCode = $zipCode;
return $this;
}
}

View File

@@ -0,0 +1,44 @@
<?php
namespace ColissimoLabel\Request\Helper;
/**
* @author Gilles Bourgeat >gilles.bourgeat@gmail.com>
*/
class Addressee
{
/** @var string */
protected $addresseeParcelRef;
/** @var Address */
protected $address;
public function __construct(Address $address)
{
$this->address = $address;
}
/**
* @return string
*/
public function getAddresseeParcelRef()
{
return $this->addresseeParcelRef;
}
/**
* @param string $addresseeParcelRef
*/
public function setAddresseeParcelRef($addresseeParcelRef)
{
$this->addresseeParcelRef = $addresseeParcelRef;
}
/**
* @return Address
*/
public function getAddress()
{
return $this->address;
}
}

View File

@@ -0,0 +1,16 @@
<?php
namespace ColissimoLabel\Request\Helper;
/**
* @author Gilles Bourgeat >gilles.bourgeat@gmail.com>
*/
class BordereauRequestAPIConfiguration extends APIConfiguration
{
public function __construct()
{
parent::__construct();
$this->setMethod('generateBordereauByParcelsNumbers');
}
}

View File

@@ -0,0 +1,16 @@
<?php
namespace ColissimoLabel\Request\Helper;
/**
* @author Gilles Bourgeat >gilles.bourgeat@gmail.com>
*/
class LabelRequestAPIConfiguration extends APIConfiguration
{
public function __construct()
{
parent::__construct();
$this->setMethod('generateLabel');
}
}

View File

@@ -0,0 +1,65 @@
<?php
namespace ColissimoLabel\Request\Helper;
/**
* @author Gilles Bourgeat >gilles.bourgeat@gmail.com>
*/
class Letter
{
/** @var Sender */
protected $sender;
/** @var Addressee */
protected $addressee;
/** @var Parcel */
protected $parcel;
/** @var Service */
protected $service;
public function __construct(
Service $service,
Sender $sender,
Addressee $addressee,
Parcel $parcel
) {
$this->sender = $sender;
$this->addressee = $addressee;
$this->parcel = $parcel;
$this->service = $service;
}
/**
* @return Service
*/
public function getService()
{
return $this->service;
}
/**
* @return Sender
*/
public function getSender()
{
return $this->sender;
}
/**
* @return Addressee
*/
public function getAddressee()
{
return $this->addressee;
}
/**
* @return Parcel
*/
public function getParcel()
{
return $this->parcel;
}
}

View File

@@ -0,0 +1,86 @@
<?php
namespace ColissimoLabel\Request\Helper;
use ColissimoLabel\Exception\InvalidArgumentException;
/**
* @author Gilles Bourgeat >gilles.bourgeat@gmail.com>
*/
class OutputFormat
{
const OUTPUT_PRINTING_TYPE = [
0 => 'ZPL_10x15_203dpi',
1 => 'ZPL_10x15_300dpi',
2 => 'DPL_10x15_203dpi',
3 => 'DPL_10x15_300dpi',
4 => 'PDF_10x15_300dpi',
5 => 'PDF_A4_300dpi'
];
const OUTPUT_PRINTING_TYPE_DEFAULT = self::OUTPUT_PRINTING_TYPE[4];
protected $x = 0;
protected $y = 0;
protected $outputPrintingType = self::OUTPUT_PRINTING_TYPE_DEFAULT;
/**
* @return int
*/
public function getX()
{
return $this->x;
}
/**
* @param int $x
* @return self
*/
public function setX($x)
{
$this->x = (int) $x;
return $this;
}
/**
* @return int
*/
public function getY()
{
return $this->y;
}
/**
* @param int $y
* @return self
*/
public function setY($y)
{
$this->y = (int) $y;
return $this;
}
/**
* @return string value of the list ColissimoAPI\Request\Helper\LabelOutputFormat::OUTPUT_PRINTING_TYPE
*/
public function getOutputPrintingType()
{
return $this->outputPrintingType;
}
/**
* @param string $outputPrintingType value of the list ColissimoAPI\Request\Helper\LabelOutputFormat::OUTPUT_PRINTING_TYPE
* @return self
*/
public function setOutputPrintingType($outputPrintingType)
{
if (\in_array($outputPrintingType, self::OUTPUT_PRINTING_TYPE)) {
new InvalidArgumentException('Invalid value "' . $outputPrintingType . '" for argument $outputPrintingType');
}
$this->outputPrintingType = $outputPrintingType;
return $this;
}
}

View File

@@ -0,0 +1,74 @@
<?php
namespace ColissimoLabel\Request\Helper;
/**
* @author Gilles Bourgeat >gilles.bourgeat@gmail.com>
*/
class Parcel
{
protected $weight = 0;
protected $instructions = '';
protected $pickupLocationId;
public function __construct($weight)
{
$this->weight = (float) $weight;
}
/**
* @return int
*/
public function getWeight()
{
return $this->weight;
}
/**
* @param int $weight
* @return self
*/
public function setWeight($weight)
{
$this->weight = $weight;
return $this;
}
/**
* @return string
*/
public function getInstructions()
{
return $this->instructions;
}
/**
* @param string $instructions
* @return self
*/
public function setInstructions($instructions)
{
$this->instructions = $instructions;
return $this;
}
/**
* @return string
*/
public function getPickupLocationId()
{
return $this->pickupLocationId;
}
/**
* @param string $pickupLocationId
* @return self
*/
public function setPickupLocationId($pickupLocationId)
{
$this->pickupLocationId = $pickupLocationId;
return $this;
}
}

View File

@@ -0,0 +1,46 @@
<?php
namespace ColissimoLabel\Request\Helper;
/**
* @author Gilles Bourgeat >gilles.bourgeat@gmail.com>
*/
class Sender
{
/** @var string */
protected $senderParcelRef;
/** @var Address */
protected $address;
public function __construct(Address $address)
{
$this->address = $address;
}
/**
* @return string
*/
public function getSenderParcelRef()
{
return $this->senderParcelRef;
}
/**
* @param string $senderParcelRef
* @return self
*/
public function setSenderParcelRef($senderParcelRef)
{
$this->senderParcelRef = $senderParcelRef;
return $this;
}
/**
* @return Address
*/
public function getAddress()
{
return $this->address;
}
}

View File

@@ -0,0 +1,136 @@
<?php
namespace ColissimoLabel\Request\Helper;
use ColissimoLabel\Exception\InvalidArgumentException;
/**
* @author Gilles Bourgeat >gilles.bourgeat@gmail.com>
*/
class Service
{
const PRODUCT_CODE_LIST = [
0 => 'DOM',
1 => 'COLD',
2 => 'DOS',
3 => 'COL',
4 => 'BPR',
5 => 'A2P',
6 => 'CORE',
7 => 'COLR',
8 => 'J+1 ',
9 => 'CORI',
10 => 'COM',
11 => 'CDS',
12 => 'ECO',
13 => 'CORI',
14 => 'COLI',
15 => 'ACCI',
16 => 'CMT',
17 => 'PCS',
18 => 'DOM',
19 => 'DOS',
20 => 'BDP'
];
const PRODUCT_CODE_LIST_COMMERCIAL_NAME = [
0 => 'France Colissimo Domicile - sans signature',
1 => 'France Colissimo Domicile - sans signature',
2 => 'France Colissimo Domicile - avec signature',
3 => 'France Colissimo Domicile - avec signature',
4 => 'France Colissimo - Point Retrait en Bureau de Poste ** ',
5 => 'France Colissimo - Point Retrait en relais Pickup ou en consigne Pickup Station',
6 => 'France Colissimo Retour France',
7 => 'France Colissimo Flash - sans signature',
8 => 'Colissimo Flash avec signature',
9 => 'Colissimo Retour International ',
10 => 'Outre-Mer Colissimo Domicile - sans signature ',
11 => 'Outre-Mer Colissimo Domicile - avec signature',
12 => 'Outre-Mer Colissimo Eco OM',
13 => 'Outre-Mer Colissimo Retour OM',
14 => 'International Colissimo Expert International',
15 => 'International Offre Economique Grand Export (offre en test pour la Chine pour un client Pilote)',
16 => 'International (Europe) Colissimo - Point Retrait en relais ****',
17 => 'International (Europe) Colissimo - Point Retrait Consigne Pickup Station Sauf France et Belgique',
18 => 'International (Europe) Colissimo Domicile - sans signature ****',
19 => 'International (Europe) Colissimo Domicile - avec signature ****',
20 => 'International (Europe) Colissimo Point Retrait en bureau de poste ****'
];
protected $productCode = '';
/** @var \DateTime */
protected $depositDate;
protected $orderNumber = '';
protected $commercialName = '';
public function __construct($productCode, \DateTime $depositDate, $orderNumber)
{
if (empty($orderNumber)) {
throw new InvalidArgumentException('Invalid argument orderNumber');
}
if (empty($productCode)) {
throw new InvalidArgumentException('Invalid argument productCode');
}
$this->orderNumber = $orderNumber;
$this->depositDate = $depositDate;
$this->productCode = $productCode;
}
/**
* @return string
*/
public function getProductCode()
{
return $this->productCode;
}
/**
* @param string $productCode
* @return $this
*/
public function setProductCode($productCode)
{
$this->productCode = $productCode;
return $this;
}
/**
* @return \DateTime
*/
public function getDepositDate()
{
return $this->depositDate;
}
/**
* @return string
*/
public function getOrderNumber()
{
return $this->orderNumber;
}
/**
* @return string
*/
public function getCommercialName()
{
return $this->commercialName;
}
/**
* @param string $commercialName
* @return Service
*/
public function setCommercialName($commercialName)
{
$this->commercialName = $commercialName;
return $this;
}
}

View File

@@ -0,0 +1,92 @@
<?php
namespace ColissimoLabel\Request;
use ColissimoLabel\ColissimoLabel;
use ColissimoLabel\Request\Helper\Addressee;
use ColissimoLabel\Request\Helper\Letter;
use ColissimoLabel\Request\Helper\OutputFormat;
use ColissimoLabel\Request\Helper\Parcel;
use ColissimoLabel\Request\Helper\Sender;
use ColissimoLabel\Request\Helper\Service;
use ColissimoLabel\Request\Traits\MethodCreateAddressFromOrderAddress;
use ColissimoLabel\Request\Traits\MethodCreateAddressFromStore;
use Thelia\Model\Order;
use Thelia\Model\OrderAddress;
use Thelia\Model\OrderAddressQuery;
/**
* @author Gilles Bourgeat >gilles.bourgeat@gmail.com>
*/
class LabelRequest extends AbstractLabelRequest
{
use MethodCreateAddressFromStore;
use MethodCreateAddressFromOrderAddress;
public function __construct(Order $order, $pickupCode = null, $pickupType = null)
{
$orderAddress = OrderAddressQuery::create()->findOneById($order->getDeliveryOrderAddressId());
$this->setLetter(new Letter(
new Service(
null !== $pickupType ? $pickupType : $this->getProductCode($order),
(new \DateTime()),
$order->getRef()
),
new Sender(
$this->createAddressFromStore()
),
new Addressee(
$this->createAddressFromOrderAddress(
$orderAddress,
$order->getCustomer()
)
),
new Parcel(
$order->getWeight()
)
));
if (null !== $pickupCode) {
$this->getLetter()->getParcel()->setPickupLocationId($pickupCode);
}
//$this->getLetter()->getAddressee()->setAddresseeParcelRef($order->getRef());
$this->getLetter()->getSender()->setSenderParcelRef($order->getRef());
$this->setOutputFormat(new OutputFormat());
$this->getOutputFormat()->setOutputPrintingType(
ColissimoLabel::getConfigValue(ColissimoLabel::CONFIG_KEY_DEFAULT_LABEL_FORMAT)
);
}
protected function getProductCode(Order $order)
{
/** @var OrderAddress $deliveryAddress */
$deliveryAddress = $order->getOrderAddressRelatedByDeliveryOrderAddressId();
$code = $deliveryAddress->getCountry()->getIsocode();
// france case
if ($code == '250') {
return Service::PRODUCT_CODE_LIST[0];
} elseif (in_array( // europe
$code,
[
"040", "056", "100", "191", "196", "203", "208", "233", "246", "250", "276", "300", "348", "372", "380", "428", "440", "442", "470", "528", "616", "620", "642", "705", "724", "752", "826"
]
)) {
return Service::PRODUCT_CODE_LIST[0];
} elseif (in_array( // europe
$code,
[
"312", "254", "666", "474", "638", "175"
]
)) { // outre mer
return Service::PRODUCT_CODE_LIST[10];
} else { // other
return Service::PRODUCT_CODE_LIST[14];
}
}
}

View File

@@ -0,0 +1,32 @@
<?php
namespace ColissimoLabel\Request\Traits;
use ColissimoLabel\Request\Helper\Address;
use Thelia\Model\Customer;
use Thelia\Model\LangQuery;
use Thelia\Model\OrderAddress;
/**
* @author Gilles Bourgeat >gilles.bourgeat@gmail.com>
*/
trait MethodCreateAddressFromOrderAddress
{
public function createAddressFromOrderAddress(OrderAddress $orderAddress, Customer $customer)
{
return (new Address())
->setCompanyName($orderAddress->getCompany())
->setFirstName($orderAddress->getFirstname())
->setLastName($orderAddress->getLastname())
->setCity($orderAddress->getCity())
->setZipCode($orderAddress->getZipcode())
->setCountryCode($orderAddress->getCountry()->getIsoalpha2())
->setLine2($orderAddress->getAddress1())
->setLine3($orderAddress->getAddress2())
->setPhoneNumber(trim(str_replace(' ', '', $orderAddress->getPhone())))
->setMobileNumber(trim(str_replace(' ', '', $orderAddress->getCellphone())))
->setEmail($customer->getEmail())
->setLanguage(strtoupper(LangQuery::create()->filterByByDefault(true)->findOne()->getCode()))
;
}
}

View File

@@ -0,0 +1,29 @@
<?php
namespace ColissimoLabel\Request\Traits;
use ColissimoLabel\Request\Helper\Address;
use Thelia\Model\ConfigQuery;
use Thelia\Model\CountryQuery;
use Thelia\Model\LangQuery;
/**
* @author Gilles Bourgeat >gilles.bourgeat@gmail.com>
*/
trait MethodCreateAddressFromStore
{
public function createAddressFromStore()
{
return (new Address())
->setCompanyName(ConfigQuery::read('store_name'))
->setCity(ConfigQuery::read('store_city'))
->setZipCode(ConfigQuery::read('store_zipcode'))
->setCountryCode(CountryQuery::create()->findOneById(ConfigQuery::read('store_country'))->getIsoalpha2())
->setLine2(ConfigQuery::read('store_address1'))
->setLine3(ConfigQuery::read('store_address2'))
->setEmail(trim(ConfigQuery::read('store_email')))
->setPhoneNumber(trim(str_replace(' ', '', ConfigQuery::read('store_phone'))))
->setLanguage(strtoupper(LangQuery::create()->filterByByDefault(true)->findOne()->getCode()))
;
}
}

View File

@@ -0,0 +1,78 @@
<?php
namespace ColissimoLabel\Response;
/**
* @author Gilles Bourgeat >gilles.bourgeat@gmail.com>
*/
class BordereauResponse
{
const UUID = '/--uuid:/'; //This is the separator of each part of the response
const CONTENT = 'Content-';
public $soapResponse;
public $attachments = [];
public $uuid;
public function __construct($soapResponse)
{
$this->soapResponse = $soapResponse;
$this->parseResponse($soapResponse);
}
protected function parseResponse($response)
{
$content = array ();
$matches = array ();
preg_match_all(self::UUID, $response, $matches, PREG_OFFSET_CAPTURE);
for($i = 0; $i < count ( $matches [0] ) -1; $i ++) {
if ($i + 1 < count ( $matches [0] )) {
$content [$i] = substr ( $response, $matches [0] [$i] [1], $matches [0] [$i + 1] [1] - $matches [0][$i] [1] );
} else {
$content [$i] = substr ( $response, $matches [0] [$i] [1], strlen ( $response ) );
}
}
foreach ( $content as $part ) {
if ($this->uuid == null) {
$uuidStart = 0;
$uuidEnd = 0;
$uuidStart = strpos($part, self::UUID, 0) + strlen(self::UUID);
$uuidEnd = strpos($part, "\r\n", $uuidStart);
$this->uuid = substr($part, $uuidStart, $uuidEnd - $uuidStart);
}
$header = $this->extractHeader($part);
if(count($header) > 0) {
if (strpos($header['Content-Type'], 'type="text/xml"') !== FALSE) {
$this->soapResponse['header'] = $header;
$this->soapResponse['data'] = trim(substr($part, $header['offsetEnd']));
} else {
$attachment['header'] = $header;
$attachment['data'] = trim(substr($part, $header['offsetEnd']));
array_push($this->attachments, $attachment);
}
}
}
}
/**
* Exclude the header from the Web Service response * @param string $part
* @return array $header
*/
private function extractHeader($part)
{
$header = array();
$headerLineStart = strpos($part, self::CONTENT, 0);
$endLine = 0;
while($headerLineStart !== FALSE) {
$header['offsetStart'] = $headerLineStart;
$endLine = strpos($part, "\r\n", $headerLineStart);
$headerLine = explode(': ', substr($part, $headerLineStart, $endLine-$headerLineStart)); $header[$headerLine[0]] = $headerLine[1];
$headerLineStart = strpos($part, self::CONTENT, $endLine);
}
$header['offsetEnd'] = $endLine;
return $header;
}
}

View File

@@ -0,0 +1,155 @@
<?php
namespace ColissimoLabel\Response;
/**
* @author Gilles Bourgeat >gilles.bourgeat@gmail.com>
*/
class LabelResponse
{
const UUID = '/--uuid:/'; //This is the separator of each part of the response
const CONTENT = 'Content-';
protected $soapResponse;
protected $cacheAttachments = [];
protected $cacheSoapResponse = [];
protected $uuid;
public function __construct($soapResponse)
{
$this->soapResponse = $soapResponse;
$this->parseResponse($soapResponse);
}
public function getFile()
{
if ($this->isValid()) {
return $this->cacheAttachments[0]["data"];
}
return null;
}
public function getParcelNumber()
{
if ($this->isValid()) {
$pieces = explode("<parcelNumber>", $this->cacheSoapResponse["data"]);
$pieces = explode("</parcelNumber>", $pieces[1]);
return $pieces[0];
}
return null;
}
public function hasFileCN23()
{
if ($this->isValid()) {
return isset($this->cacheAttachments[1]["data"]);
}
return false;
}
public function getFileCN23()
{
if ($this->isValid()) {
if (\count($this->cacheAttachments) > 1) {
$this->cacheAttachments[1]["data"];
}
}
return null;
}
public function isValid()
{
if (!isset($this->cacheSoapResponse["data"])) {
return false;
}
$soapResult = $this->cacheSoapResponse["data"];
$errorCode = explode("<id>", $soapResult);
$errorCode = explode("</id>", $errorCode[1]);
//- Parse Web Service Response
//+ Error handling and label saving
if ($errorCode[0] == 0) {
return true;
}
return false;
}
public function getError()
{
if (!isset($this->cacheSoapResponse["data"])) {
return [$this->soapResponse];
}
if ($this->isValid()) {
return [];
}
$soapResult = $this->cacheSoapResponse["data"];
$errorCode = explode("<id>", $soapResult);
$errorCode = explode("</id>", $errorCode[1]);
$errorMessage = explode("<messageContent>", $this->cacheSoapResponse["data"]);
$errorMessage = explode("</messageContent>", $errorMessage[1]);
return [$errorCode[0] => $errorMessage];
}
protected function parseResponse($response)
{
$content = array ();
$matches = array ();
preg_match_all(self::UUID, $response, $matches, PREG_OFFSET_CAPTURE);
for ($i = 0; $i < count($matches[0]) -1; $i++) {
if ($i + 1 < count($matches[0])) {
$content[$i] = substr($response, $matches[0][$i][1], $matches[0][$i + 1][1] - $matches[0][$i][1]);
} else {
$content[$i] = substr($response, $matches[0][$i][1], strlen($response));
}
}
foreach ($content as $part) {
if ($this->uuid == null) {
$uuidStart = strpos($part, self::UUID, 0)+strlen(self::UUID);
$uuidEnd = strpos($part, "\r\n", $uuidStart);
$this->uuid = substr($part, $uuidStart, $uuidEnd-$uuidStart);
}
$header = $this->extractHeader($part);
if (count($header) > 0) {
if (false !== strpos($header['Content-Type'], 'type="text/xml"')) {
$this->cacheSoapResponse['header'] = $header;
$this->cacheSoapResponse['data'] = trim(substr($part, $header['offsetEnd']));
} else {
$attachment['header'] = $header;
$attachment['data'] = trim(substr($part, $header['offsetEnd']));
array_push($this->cacheAttachments, $attachment);
}
}
}
return $this;
}
protected function extractHeader($part)
{
$header = array();
$headerLineStart = strpos($part, self::CONTENT, 0);
$endLine = 0;
while (false !== $headerLineStart) {
$header['offsetStart'] = $headerLineStart;
$endLine = strpos($part, "\r\n", $headerLineStart);
$headerLine = explode(': ', substr($part, $headerLineStart, $endLine-$headerLineStart));
$header[$headerLine[0]] = $headerLine[1];
$headerLineStart = strpos($part, self::CONTENT, $endLine);
}
$header['offsetEnd'] = $endLine;
return $header;
}
}

View File

@@ -0,0 +1,86 @@
<?php
namespace ColissimoLabel\Service;
use ColissimoLabel\Request\AbstractRequest;
use ColissimoLabel\Request\Helper\APIConfiguration;
use ColissimoLabel\Response\BordereauResponse;
use ColissimoLabel\Response\LabelResponse;
/**
* @author Gilles Bourgeat >gilles.bourgeat@gmail.com>
*/
class SOAPService
{
public function callGenerateBordereauByParcelsNumbersAPI(APIConfiguration $APIConfiguration, $parcelNumbers = [])
{
//+ Generate SOAPRequest
$xml = new \SimpleXMLElement('<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" />');
$xml->addChild("soapenv:Header");
$children = $xml->addChild("soapenv:Body");
$children = $children->addChild("sls:generateBordereauByParcelsNumbers", null, 'http://sls.ws.coliposte.fr');
$children->addChild("contractNumber", $APIConfiguration->getContractNumber(), "");
$children->addChild("password", $APIConfiguration->getPassword(), "");
$children = $children->addChild("generateBordereauParcelNumberList", null, "");
foreach ($parcelNumbers as $parcelNumber)
{
$children->addChild("parcelsNumbers", $parcelNumber, "");
}
$soap = new \SoapClient($APIConfiguration->getWsdl());
return new BordereauResponse($soap->__doRequest(
$xml->asXML(),
$APIConfiguration->getWsdl(),
$APIConfiguration->getMethod(),
$APIConfiguration->getVersion(),
0
));
}
public function callAPI(APIConfiguration $APIConfiguration, AbstractRequest $request)
{
$request->setContractNumber($APIConfiguration->getContractNumber());
$request->setPassword($APIConfiguration->getPassword());
//+ Generate SOAPRequest
$xml = new \SimpleXMLElement('<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" />');
$xml->addChild("soapenv:Header");
$children = $xml->addChild("soapenv:Body");
$children = $children->addChild("sls:generateLabel", null, 'http://sls.ws.coliposte.fr');
$children = $children->addChild("generateLabelRequest", null, "");
$this->arrayToXml($request->generateArrayRequest(), $children);
$soap = new \SoapClient($APIConfiguration->getWsdl());
return new LabelResponse($soap->__doRequest(
$xml->asXML(),
$APIConfiguration->getWsdl(),
$APIConfiguration->getMethod(),
$APIConfiguration->getVersion(),
0
));
}
protected function arrayToXml(array $soapRequest, \SimpleXMLElement $soapRequestXml)
{
foreach ($soapRequest as $key => $value) {
if ($value === null || empty($value)) {
continue;
}
if (is_array($value)) {
if (!is_numeric($key)) {
$subnode = $soapRequestXml->addChild($key);
$this->arrayToXml($value, $subnode);
} else {
$subnode = $soapRequestXml->addChild("item" . $key);
$this->arrayToXml($value, $subnode);
}
} else {
$soapRequestXml->addChild($key, htmlspecialchars($value));
}
}
}
}

View File

@@ -0,0 +1,11 @@
{
"name": "thelia/colissimo-label-module",
"license": "LGPL-3.0+",
"type": "thelia-module",
"require": {
"thelia/installer": "~1.1"
},
"extra": {
"installer-name": "ColissimoLabel"
}
}

View File

@@ -0,0 +1,38 @@
{extends file="admin-layout.tpl"}
{block name="check-resource"}admin.order{/block}
{block name="check-access"}view{/block}
{block name="page-title"}Bordereaux Colissimo{/block}
{block name="after-admin-css"}
{/block}
{block name="main-content"}
<div id="wrapper" class="container">
<div class="row">
<div class="col-md-12 general-block-decorator">
<div class="row">
<a href="{url path="/admin/module/colissimolabel/bordereau/generate"}" class="btn btn-block btn-info">
{intl l="Generate bordereau for label since : %date" date="{format_date date=$lastBordereauDate}" d="colissimolabel.bo.default"}
</a>
</div>
</div>
<div class="col-md-12 general-block-decorator">
<div class="row">
<ul>
{foreach from=$bordereaux item=bordereau}
<li>
<a href="{url path="/admin/module/colissimolabel/bordereau/download" filePath="{$bordereau['path']}"}">
{$bordereau['name']}
</a>
</li>
{/foreach}
</ul>
</div>
</div>
</div>
</div>
{/block}
{block name="javascript-last-call"}
{/block}

View File

@@ -0,0 +1,6 @@
<li class="" id="module_menu_colissimo_label">
<a title="Modules" href="{url path="/admin/module/colissimolabel/bordereau/list"}">
<span class="icon-orders"></span>
<span class="item-text">Bordereaux Colissimo</span>
</a>
</li>

View File

@@ -0,0 +1,201 @@
{loop type="order" name="the-order" id=$order_id customer="*" backend_context=true}
{$enable = false}
{loop type="module" name="module-order" active="yes" backend_context=true id=$DELIVERY_MODULE_ID}
{if $CODE === "Colissimo" || $CODE === "SoColissimo"}
{$enable = true}
{/if}
{/loop}
{if $enable}
<div class="modal fade" id="modal-colissimo-label" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Fermer">
<span aria-hidden="true">&times;</span>
</button>
<h4 class="modal-title" id="exampleModalLabel">{intl l="Labels Colissimo" d="colissimolabel.bo.default"}</h4>
</div>
<form action="{url path="/admin/module/colissimolabel/order/{$order_id}/generate-label"}">
<div class="modal-body">
<div class="form-inline">
<div class="form-group">
<label for="colissimo-input-weight">{intl l="Shipping weight :" d="colissimolabel.bo.default"}</label>
<div class="input-group">
{$weightValue = {$WEIGHT|round:2}}
{if !$preFillWeightInput || $weightValue == 0}
{$weightValue = ''}
{/if}
<input id="colissimo-input-weight" type="number" required class="form-control" name="weight" min="0" step="0.01" value="{$weightValue}" style="width: 150px;"/>
<div class="input-group-addon"> / kg</div>
</div>
</div>
</div>
</div>
<div class="modal-iframe hide">
</div>
<div class="modal-loader hide text-center">
{intl l="Please wait ..." d="colissimolabel.bo.default"}
</div>
<div class="modal-error hide">
<div class="alert alert-danger">
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">{intl l="Cancel" d="colissimolabel.bo.default"}</button>
<button type="submit" name="target" value="print" class="btn btn-primary">{intl l="Print" d="colissimolabel.bo.default"}</button>
</div>
</form>
</div>
</div>
</div>
<script type="text/html" id="colissimo-label-tpl">
<table class="table table-striped" id="colissimo-label-table" data-url="{url path="/admin/module/colissimolabel/order/{$order_id}/ajax-get-labels"}">
<caption>
{intl l="Labels Colissimo" d="colissimolabel.bo.default"}
<button class="btn btn-primary pull-right" name="target" data-toggle="modal" data-target="#modal-colissimo-label">
{intl l="Generate new label" d="colissimolabel.bo.default"}
</button>
</caption>
<thead>
<tr>
<th>
{intl l="Number" d="colissimolabel.bo.default"}
</th>
<th>
{intl l="Weight" d="colissimolabel.bo.default"}
</th>
<th>
{intl l="Date" d="colissimolabel.bo.default"}
</th>
<th>
{intl l="Tracking URL" d="colissimolabel.bo.default"}
</th>
<th>
</th>
</tr>
</thead>
<tbody>
{include file="colissimo-label/label-list.html"}
</tbody>
</table>
</script>
<script>
(function(){
// ajout de bloque colissimo
$('#bill').prepend($('#colissimo-label-tpl').html());
var $modal = $('#modal-colissimo-label'),
$modalBody = $modal.find('.modal-body'),
$modalFooter = $modal.find('.modal-footer'),
$modalError = $modal.find('.modal-error'),
$modalLoader = $modal.find('.modal-loader'),
$modalErrorAlert = $modalError.find('.alert'),
$modalInputWeight = $modal.find("input[name='weight']"),
$table = $('#colissimo-label-table');
function print(url, number) {
var iframeName = 'iframe-colissimo-label-' + number;
if (typeof window.frames[iframeName] !== 'undefined') {
window.frames[iframeName].remove();
}
var iframe = document.createElement('iframe');
iframe.src = url;
iframe.id = iframeName;
iframe.name = iframeName;
iframe.style.display = "none";
$('body').append(iframe);
window.frames[iframeName].onload = function() {
window.frames[iframeName].focus();
window.frames[iframeName].print();
};
}
function refreshTable() {
var request = $.ajax({
url: $table.data('url')
});
request.done(function(html) {
$table.find('tbody').html(html);
});
request.fail(function(jqXHR, textStatus) {
$table.find('tbody').html('<tr><td colspan="99">' + textStatus + '</td></tr>');
});
}
$modal.on('show.bs.modal', function (event) {
$modalInputWeight.focus();
$modalBody.removeClass('hide');
$modalFooter.removeClass('hide');
$modalLoader.addClass('hide');
$modalError.addClass('hide');
$modalErrorAlert.html('')
});
$modal.on('shown.bs.modal', function (event) {
$modalInputWeight.focus();
var elem = $modalInputWeight[0];
var val = elem.value; //store the value of the element
elem.value = ''; //clear the value of the element
elem.value = val;
});
// modal action print
$table.on('click', '.js-action-print', function(e){
e.preventDefault();
print($(this).attr('href'), this.dataset.number);
});
$modal.find('form').on('submit', function(e){
e.preventDefault();
$modalBody.addClass('hide');
$modalFooter.addClass('hide');
$modalLoader.removeClass('hide');
var request = $.ajax({
url: $(this).attr('action'),
data: $(this).serialize(),
type: 'GET',
dataType: 'json'
});
request.done(function(json) {
$modalLoader.addClass('hide');
if (json.error) {
$modalError.removeClass('hide');
$modalErrorAlert.html('');
for (var i in json.error) {
$modalErrorAlert.html('Code : ' + i + ' : ' + ((Array.isArray(json.error[i])) ? json.error[i][0] : json.error[i]));
}
} else {
$('input[name="delivery_ref"]').val(json.number);
print(json.url, json.number);
refreshTable();
$modal.modal('hide');
$('select[name="status_id"]').val(json.order.status.id).selectpicker('refresh');
}
});
request.fail(function(jqXHR, textStatus) {
$modalLoader.addClass('hide');
$modalError.removeClass('hide');
$modalErrorAlert.html(textStatus);
});
});
}());
</script>
{/if}
{/loop}

View File

@@ -0,0 +1,30 @@
{ifloop rel="colissimo-label"}
{loop type="colissimo-label" name="colissimo-label" order_id=$order_id}
<tr>
<td>
{$NUMBER}
</td>
<td>
{$WEIGHT} / Kg
</td>
<td>
{format_date date=$CREATE_DATE}
</td>
<td>
<a href="https://www.laposte.fr/particulier/outils/suivre-vos-envois?code={$NUMBER}" target="_blank">https://www.laposte.fr/particulier/outils/suivre-vos-envois?code={$NUMBER}</a>
</td>
<td>
<a class="btn btn-primary pull-right" href="{url path="/admin/module/colissimolabel/label/{$NUMBER}" download=1}">{intl l="Download" d="colissimolabel.bo.default"}</a>
<a class="btn btn-info pull-right" target="_blank" href="{url path="/admin/module/colissimolabel/label/{$NUMBER}"}">{intl l="View" d="colissimolabel.bo.default"}</a>
<a class="btn btn-success pull-right js-action-print" data-number="{$NUMBER}" href="{url path="/admin/module/colissimolabel/label/{$NUMBER}"}">{intl l="Print" d="colissimolabel.bo.default"}</a>
</td>
</tr>
{/loop}
{/ifloop}
{elseloop rel="colissimo-label"}
<tr>
<td colspan="99">
{intl l="No existing label for this order" d="colissimolabel.bo.default"}
</td>
</tr>
{/elseloop}