Skip to content

Instantly share code, notes, and snippets.

@winzou
Last active May 30, 2016 09:53
Show Gist options
  • Save winzou/20fb58051437983d517422959d6d0cee to your computer and use it in GitHub Desktop.
Save winzou/20fb58051437983d517422959d6d0cee to your computer and use it in GitHub Desktop.
TNTBundle usage
<?php
namespace Caissin\CoreBundle\TNT;
use Caissin\CoreBundle\Entity\Address;
use Caissin\CoreBundle\Entity\Shipment;
use libphonenumber\PhoneNumberUtil;
use TNTExpress\Model\ParcelRequest;
use TNTExpress\Model\PickUpRequest;
use TNTExpress\Model\Receiver;
use TNTExpress\Model\Sender;
use winzou\Bundle\TNTExpressBundle\Entity\ExpeditionRequest;
class ExpeditionFactory
{
/**
* @var PhoneNumberUtil
*/
protected $phoneUtil;
public function __construct(PhoneNumberUtil $phoneUtil)
{
$this->phoneUtil = $phoneUtil;
}
public function createExpeditionFromShipment(Shipment $shipment, array $parameters)
{
return $this->createExpedition(
$this->createSender($parameters['sender']),
$this->createReceiver($shipment->getOrder()->getShippingAddress(), $shipment->getOrder()->getCustomer()->getEmail()),
$this->createParcelRequest($shipment),
$this->createPickupRequest($parameters['pickup']),
$parameters['account_number']
);
}
public function createExpedition(Sender $sender, Receiver $receiver, ParcelRequest $parcelRequest, PickUpRequest $pickupRequest, $accountNumber)
{
$expeditionRequest = new ExpeditionRequest();
// If we're in the weekend, or if later than 2pm, then we ship the day after
if (6 <= date('N') || 14 < date('G')) {
$date = new \Datetime('+1 weekdays');
} else {
$date = new \Datetime();
}
$expeditionRequest->setShippingDate($date);
$expeditionRequest->setAccountNumber($accountNumber);
$expeditionRequest->setSender($sender);
$expeditionRequest->setReceiver($receiver);
$expeditionRequest->setQuantity(1);
$expeditionRequest->setParcelsRequest(array($parcelRequest));
$expeditionRequest->setPickupRequest($pickupRequest);
return $expeditionRequest;
}
public function createSender(array $parameters)
{
$sender = new Sender();
$sender->setName(substr($parameters['name'], 0, 32));
$sender->setAddress1(substr($parameters['address1'], 0, 32));
$sender->setAddress2(substr($parameters['address2'], 0, 32));
$sender->setZipCode($parameters['zipcode']);
$sender->setCity(substr($parameters['city'], 0, 27));
return $sender;
}
public function createReceiver(Address $address, $email)
{
$receiver = new Receiver();
$receiver->setAddress1(substr($address->getStreet(), 0, 32));
$receiver->setAddress2(substr($address->getStreet2(), 0, 32));
$receiver->setZipCode($address->getPostcode());
$receiver->setCity(substr($address->getCity(), 0, 27));
$receiver->setContactFirstName(substr($address->getFirstName(), 0, 12));
$receiver->setContactLastName(substr($address->getLastName(), 0, 19));
$receiver->setEmailAddress(substr($email, 0, 80));
$receiver->setInstructions(substr($address->getIndication(), 0, 60));
$receiver->setPhoneNumber('0'.$this->phoneUtil->parse($address->getPhoneNumber(), 'FR')->getNationalNumber());
if (!$address->isDropoffPoint()) {
if (null === $address->getCompany()) {
$receiver->setType('INDIVIDUAL');
} else {
$receiver->setType('ENTERPRISE');
$receiver->setName(substr($address->getCompany(), 0, 32));
}
} else {
$receiver->setType('DROPOFFPOINT');
$receiver->setTypeId($address->getTntCode());
$receiver->setName(substr($address->getCompany(), 0, 32));
}
return $receiver;
}
public function createParcelRequest(Shipment $shipment)
{
$parcelRequest = new ParcelRequest();
$parcelRequest->setSequenceNumber(1);
$parcelRequest->setWeight($shipment->getShippingWeight());
$parcelRequest->setCustomerReference(substr($shipment->getOrder()->getNumber(), 0, 30));
return $parcelRequest;
}
public function createPickupRequest(array $parameters)
{
return new PickUpRequest(
$parameters['phone_number'],
$parameters['email'],
$parameters['opening_hour']
);
}
}
<?php
/** @var Caissin\CoreBundle\TNT\ExpeditionFactory $expeditionFactory */
$expeditionFactory = $this->get('core.tnt.expedition_factory');
$expeditionRequest = $expeditionFactory->createExpeditionFromShipment(
$shipment,
$this->container->getParameter('caissin.tnt')
);
/** @var winzou\Bundle\TNTExpressBundle\Expedition\ExpeditionManager */
$expeditionManager = $this->get('winzou.tnt.expedition.manager');
$expedition = $expeditionManager->createExpedition($expeditionRequest);
$shipment->setExpedition($expedition);
$shipment->setTracking($expedition->getParcelResponse(0)->getParcelNumber());
$em = $this->getDoctrine()->getManager();
$em->persist($expeditionRequest);
$em->persist($expedition);
$em->flush();
// To print the bordereau:
return new Response(
$expedition->getPDFLabels(),
200,
array(
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'attachment; filename="BT-'.$shipment->getOrder()->getNumber().'.pdf"',
)
);
core.listener.shipment_tracker:
class: Caissin\CoreBundle\EventListener\ShipmentTrackingListener
tags:
# Calling this listener when shipment is delivered to customer
- { name: kernel.event_listener, event: winzou.tntexpress.events.deliveryDate, method: updateShipmentState }
<?php
/** @var winzou\Bundle\TNTExpressBundle\Tracking\DispatchTrackingManager */
$trackingManager = $this->getContainer()->get('winzou.tnt.tracking.dispatch_manager');
$trackingManager->updateEvents($shipment->getExpedition()->getParcelResponse()); // will dispatch events if state changes
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment