Files
grzanieplus.pl/plugins/stAllegroPlugin/lib/task/stAllegroSendTrackingNumberTask.class.php
2025-03-12 17:06:23 +01:00

188 lines
6.0 KiB
PHP

<?php
class stAllegroSendTackingNumberTask extends stTask
{
const LIMIT = 25;
protected $carriers = null;
public function started(): void
{
$this->setParameter('last_id', null);
}
public function count(): int
{
$c = $this->getCriteria();
return AllegroParcelTrackingNumberQueuePeer::doCount($c);
}
public function execute(int $offset): int
{
$c = $this->getCriteria();
$c->setLimit(self::LIMIT);
$lastId = $this->getParameter('last_id');
if ($lastId)
{
$c->add(AllegroParcelTrackingNumberQueuePeer::ORDER_ID, $lastId, Criteria::GREATER_THAN);
}
$api = stAllegroApi::getInstance();
$controller = sfContext::getInstance()->getController();
/**
* @var AllegroParcelTrackingNumberQueue $trackingNumberQueue
*/
foreach (AllegroParcelTrackingNumberQueuePeer::doSelectJoinOrder($c) as $trackingNumberQueue)
{
$this->setParameter('last_id', $trackingNumberQueue->getOrderId());
$order = $trackingNumberQueue->getOrder();
$numbers = $order->getOrderDelivery()->getNumbers();
if (empty($numbers)) {
$trackingNumberQueue->delete();
$offset++;
continue;
}
$deliveryName = $order->getOrderDelivery()->getName();
$allegroDeliveryId = $order->getOrderDelivery()->getOptAllegroDeliveryMethodId();
$orderLink = sprintf('[%s](%s)', $order->getNumber(), $controller->genUrl('@stOrder?action=edit&id='.$order->getId()));
if (null !== stPocztaPolskaClient::getServiceByAllegroDeliveryMethodId($allegroDeliveryId))
{
$carrierId = "POCZTA_POLSKA";
}
else
{
$carrierId = $this->getCarrierId($deliveryName);
if (false === $carrierId)
{
return $this->doCount();
}
}
if (!$carrierId)
{
$this->getLogger()->error("Wystąpił błąd podczas dodawania numeru przesyłki %number% dla zamówienia %order%:\n%error%", array(
"%number%" => implode(', ', $numbers),
"%error%" => "Nie znaleziono pasującego identyfikatora przewoźnika",
'%order%' => $orderLink,
));
$trackingNumberQueue->delete();
$offset++;
continue;
}
foreach ($numbers as $number)
{
if (strpos($number, ' ') !== false)
{
$this->getLogger()->error("Wystąpił błąd podczas dodawania numeru przesyłki %number% dla zamówienia %order%:\n%error%", array(
"%number%" => $number,
"%error%" => "Nieprawidłowy format numeru przesyłki",
'%order%' => $orderLink,
));
$offset++;
continue;
}
$this->getLogger()->info("Wysyłanie numeru przesyłki \"%number%\" dla zamówienia %order%", array(
"%number%" => $number,
'%order%' => $orderLink,
));
try
{
if ($carrierId)
{
$api->addParcelTrackingNumber($order->getOptAllegroCheckoutFormId(), $carrierId, $number);
}
else
{
$this->getLogger()->error("Wystąpił błąd podczas dodawania numeru przesyłki %number% dla zamówienia %order%:\n%error%", array(
"%number%" => $number,
"%error%" => "Nie znaleziono pasującego identyfikatora przewoźnika",
'%order%' => $orderLink,
));
}
}
catch (Throwable $e)
{
$error = stAllegroApi::getLastErrorsAsString();
$this->getLogger()->error("Wystąpił błąd podczas dodawania numeru przesyłki %number% dla zamówienia %order%:\n%error%", array(
"%number%" => $number,
"%error%" => $error ? $error : $e->getMessage(),
"%order%" => $orderLink,
));
}
}
$trackingNumberQueue->delete();
$offset++;
usleep(300000);
}
sleep(1);
return $offset;
}
protected function getCriteria()
{
$c = new Criteria();
$c->addAscendingOrderByColumn(AllegroParcelTrackingNumberQueuePeer::ORDER_ID);
return $c;
}
protected function getCarriers()
{
$api = stAllegroApi::getInstance();
if (null === $this->carriers)
{
$this->carriers = $api->getAvailableShippingCarriers();
}
return $this->carriers;
}
public function getCarrierId($deliveryName)
{
$deliveryName = str_replace('Dostawa Allegro - ', '', $deliveryName);
try
{
$carriers = $this->getCarriers();
}
catch(Throwable $e)
{
$error = stAllegroApi::getLastErrorsAsString();
$this->getLogger()->error("Wystąpił błąd podczas pobierania dostępnych identyfikatorów przewoźników:\n%error%", array(
"%error%" => $error ? $error : $e->getMessage(),
));
return false;
}
foreach ($carriers as $carrier)
{
if (!in_array($carrier->id, array('OTHER', 'ALLEGRO')) && false !== strpos($deliveryName, $carrier->name))
{
return $carrier->id;
}
}
return null;
}
}