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

220 lines
7.0 KiB
PHP

<?php
class stAllegroSyncTask extends stTask
{
const LIMIT = 50;
/**
* Kontroler
*
* @var sfWebController
*/
protected $controller;
public function initialize(): void
{
$this->controller = sfContext::getInstance()->getController();
}
public function started(): void
{
$this->setParameter('last_id', null);
}
public function count(): int
{
if (!stConfig::getInstance('stAllegroBackend')->get('access_token'))
{
return 0;
}
return AllegroAuctionPeer::doCount($this->getCriteria());
}
public function execute(int $offset): int
{
$c = $this->getCriteria();
$lastId = $this->getParameter('last_id');
if ($lastId)
{
$c->add(AllegroAuctionPeer::ID, $lastId, Criteria::GREATER_THAN);
}
$c->setLimit(self::LIMIT);
$publish = array();
$unpublish = array();
$api = stAllegroApi::getInstance();
/**
* @var AllegroAuction $auction
*/
foreach (AllegroAuctionPeer::doSelect($c) as $auction)
{
stNewProductOptions::clearStaticPool();
$this->setParameter('last_id', $auction->getId());
$offerLink = $this->getOfferLink($auction->getAuctionId());
try
{
if (null === $auction->getAuctionId() || null === $auction->getProduct())
{
$auction->delete();
$offer = null;
} else
{
try
{
$offer = $api->getOffer($auction->getAuctionId());
} catch (stAllegroException $e)
{
$errors = stAllegroApi::getLastErrors();
if ($errors[0]->code == 'NOT_FOUND')
{
$messages = array();
foreach ($errors as $error)
{
$messages[] = $error->userMessage;
}
$auction->delete();
$this->getLogger()->error("Oferta %offer% nie została znaleziona", array(
"%offer%" => $offerLink,
));
$offer = null;
}
}
}
if ($auction->getAllowSync() && $offer)
{
if ($offer->publication->status == 'ACTIVE' || $offer->publication->status == 'ENDED')
{
$auction->getProductOptionsArray();
$stock = $auction->getProduct()->getStock();
$config = stConfig::getInstance('stAllegroBackend');
$ok = true;
if ($stock > 0)
{
if ($config->get('offer_sync_product_price'))
{
$allegroCommission = new AllegroCommission();
$price = $allegroCommission->calculatePrice($auction->getProduct()->getPriceBrutto());
$offer->sellingMode->price->amount = $price;
}
$offer->stock->available = ceil($stock);
$this->getLogger()->info('Synchronizacja oferty %offer%', array('%offer%' => $offerLink));
$response = $api->updateOffer($auction->getAuctionId(), $offer);
if ($response->validation->errors)
{
$ok = false;
$messages = array();
foreach ($response->validation->errors as $error)
{
$messages[] = $error->userMessage;
}
$this->getLogger()->error("Wystąpił błąd podczas synchronizacji oferty %offer%:\n%error%", array(
"%offer%" => $offerLink,
"%error%" => implode("\n", $messages),
));
}
}
if ($ok)
{
if ($offer->publication->status == 'ENDED' && $stock > 0)
{
$publish[$auction->getAuctionId()] = $offerLink;
} elseif ($offer->publication->status == 'ACTIVE' && !$stock)
{
$unpublish[$auction->getAuctionId()] = $offerLink;
}
}
}
}
} catch (Exception $e)
{
$messages = array();
foreach (stAllegroApi::getLastErrors() as $error)
{
$messages[] = $error->userMessage;
}
$this->getLogger()->error("Wystąpił błąd podczas synchronizacji oferty %offer%:\n%error%", array(
"%offer%" => $offerLink,
"%error%" => implode("\n", $messages),
));
}
if (!$auction->isDeleted())
{
if ($offer)
{
$auction->setEnded(($offer->publication->status == 'ENDED' || isset($unpublish[$auction->getAuctionId()])) && !isset($publish[$auction->getAuctionId()]));
}
$auction->setRequiresSync(false);
$auction->save();
}
$offset++;
stNewProductOptions::clearStaticPool();
usleep(250000);
}
if ($unpublish)
{
$this->getLogger()->info("Zakończenie ofert %offers% z powodu braku produktów na magazynie", array('%offers%' => implode(", ", $unpublish)));
$api->publishOffers(array_keys($unpublish), false);
}
if ($publish)
{
$this->getLogger()->info("Wznowienie ofert %offers% z powodu ponownej dostępności produktów na magazynie", array('%offers%' => implode(", ", $publish)));
$api->publishOffers(array_keys($publish), true);
}
sleep(1);
return $offset;
}
private function getCriteria(): Criteria
{
$c = new Criteria();
$c->add(AllegroAuctionPeer::REQUIRES_SYNC, true);
$c->addAscendingOrderByColumn(AllegroAuctionPeer::ID);
return $c;
}
private function getOfferLink($offerId): string
{
$url = $this->controller->genUrl('@stAllegroPlugin?action=edit&id='.$offerId);
return sprintf('[%s](%s)', $offerId, $url);
}
}