<?php
namespace App\AtechNet\CoreBundle\Entity;
use Doctrine\ORM\Mapping\Column;
use Doctrine\ORM\Mapping\Entity;
use Doctrine\ORM\Mapping\HasLifecycleCallbacks;
use Doctrine\ORM\Mapping\JoinColumn;
use Doctrine\ORM\Mapping\ManyToOne;
use Doctrine\ORM\Mapping\OneToMany;
use Doctrine\ORM\Mapping\OrderBy;
use Doctrine\ORM\Mapping\Table as Table;
use Doctrine\ORM\PersistentCollection;
/**
* MarketplaceJob
*
* @Table(name="marketplace_job")
* @Entity(repositoryClass="App\AtechNet\CoreBundle\Repository\MarketplaceJobRepository")
* @HasLifecycleCallbacks
*/
class MarketplaceJob extends AbstractSignedEntity
{
public const JOB_STATUS_NEW = 0;
public const JOB_STATUS_PENDING = 1;
public const JOB_STATUS_SUCCESS = 2;
public const JOB_STATUS_FAILED = 3;
public const JOB_STATUS_PARTLY_FAILED = 4;
public const JOB_STATUS_REPAIRED = 5;
public const JOB_ITEM_STATUS_NEW = -1;
public const JOB_ITEM_STATUS_PENDING = 0;
public const JOB_ITEM_STATUS_SUCCESS = 1;
public const JOB_ITEM_STATUS_APPROVING_IS_REQUIRED = 2;
public const JOB_ITEM_STATUS_LISTING_LIMIT_REACHED = 3;
public const JOB_ITEM_STATUS_ERROR = 4;
public const JOB_ITEM_STATUS_LISTINGS_WILL_BE_ACTIVATED = 5;
public const JOB_ITEM_STATUS_LISTINGS_WILL_BE_DEACTIVATED = 6;
public const JOB_ITEM_STATUS_SUCCESS_SKIPPED = 7;
public const JOB_ITEM_STATUS_PAUSE = 8;
public const JOB_ITEM_STATUS_RESUME = 9;
public const array JOB_ITEM_STATUS_TITLE_LIST = [
self::JOB_ITEM_STATUS_NEW => 'NEW',
self::JOB_ITEM_STATUS_PENDING => 'PENDING',
self::JOB_ITEM_STATUS_SUCCESS => 'SUCCESS',
self::JOB_ITEM_STATUS_APPROVING_IS_REQUIRED => 'APPROVE IS REQUIRED',
self::JOB_ITEM_STATUS_LISTING_LIMIT_REACHED => 'LISTING LIMIT REACHED',
self::JOB_ITEM_STATUS_ERROR => 'ERROR',
self::JOB_ITEM_STATUS_LISTINGS_WILL_BE_ACTIVATED => 'Listing ACTIVATION',
self::JOB_ITEM_STATUS_LISTINGS_WILL_BE_DEACTIVATED => 'Listing DEACTIVATION',
self::JOB_ITEM_STATUS_SUCCESS_SKIPPED => 'SKIPPED',
self::JOB_ITEM_STATUS_PAUSE => 'LISTING PAUSE',
self::JOB_ITEM_STATUS_RESUME => 'LISTING RESUME',
];
public const JOB_SYNC_TYPE_STOCK = 1;
public const JOB_LISTING_CREATE = 2;
public const JOB_SYNC_TYPE_PRICE = 3;
public const JOB_SYNC_TYPE_PRICE_AT_NIGHT = 4;
public const JOB_SYNC_TYPE_STOCK_CORRECTION = 5;
public const AUTO_REACTIVATION_QTY_THRESHOLD = 15;
public static function statusList(): array
{
return [
self::JOB_STATUS_NEW => 'NEW',
self::JOB_STATUS_PENDING => 'PENDING',
self::JOB_STATUS_SUCCESS => 'SUCCESS',
self::JOB_STATUS_FAILED => 'FAILED',
self::JOB_STATUS_PARTLY_FAILED => 'PARTLY_FAILED',
self::JOB_STATUS_REPAIRED => 'REPAIRED',
];
}
public static function syncTypeList(): array
{
return [
self::JOB_SYNC_TYPE_STOCK => 'Stock',
self::JOB_SYNC_TYPE_PRICE => 'Price',
self::JOB_SYNC_TYPE_PRICE_AT_NIGHT => 'Price (Night)',
self::JOB_LISTING_CREATE => 'Listing create',
self::JOB_SYNC_TYPE_STOCK_CORRECTION => 'Stock Correction (Night)'
];
}
/**
* @var Customer|null
*
* @ManyToOne(targetEntity="Customer")
* @JoinColumn(name="customer_id", referencedColumnName="id", nullable=true)
*/
private ?Customer $marketplace = null;
/**
* @var int
*
* @Column(name="status", type="integer", length=1)
*/
private int $status;
/**
* @var int
*
* @Column(name="sync_type", type="integer", nullable=false)
*/
private int $syncType;
/**
* @var PersistentCollection
*
* @OneToMany(targetEntity="MarketplaceJobProductModel", mappedBy="marketplaceJob", orphanRemoval=true)
* @OrderBy({"created" = "ASC", "id" = "ASC"})
*/
private $productModels;
/**
* @var PersistentCollection
*
* @OneToMany(targetEntity="MarketplaceJobProduct", mappedBy="marketplaceJob", orphanRemoval=true)
* @OrderBy({"created" = "ASC", "id" = "ASC"})
*/
private $products;
public function __construct()
{
parent::__construct();
$this->status = self::JOB_STATUS_NEW;
}
/**
* @return Customer|null
*/
public function getMarketplace(): ?Customer
{
return $this->marketplace;
}
/**
* @param Customer|null $marketplace
*/
public function setMarketplace(?Customer $marketplace)
{
$this->marketplace = $marketplace;
}
/**
* @return int
*/
public function getStatus()
{
return $this->status;
}
/**
* @param int $status
*/
public function setStatus(int $status)
{
$this->status = $status;
}
/**
* @return string
*/
public function getSyncType()
{
return $this->syncType;
}
/**
* @param int $syncType
*/
public function setSyncType(int $syncType)
{
$this->syncType = $syncType;
}
/**
* @param PersistentCollection $productModels
* @return void
*/
public function setProductModels(PersistentCollection $productModels): void
{
$this->productModels = $productModels;
}
/**
* @return PersistentCollection
*/
public function getProductModels(): PersistentCollection
{
return $this->productModels;
}
public function getApprovedProductModelItemList()
{
return $this->productModels->filter(
function (MarketplaceJobProductModel $mjpm) {
return in_array($mjpm->getStatus(), [
MarketplaceJob::JOB_ITEM_STATUS_PENDING,
MarketplaceJob::JOB_ITEM_STATUS_LISTING_LIMIT_REACHED,
MarketplaceJob::JOB_ITEM_STATUS_LISTINGS_WILL_BE_ACTIVATED,
MarketplaceJob::JOB_ITEM_STATUS_LISTINGS_WILL_BE_DEACTIVATED,
]);
}
);
}
public function getProductModelListByStatus(int $statusId)
{
return $this->productModels->filter(
function (MarketplaceJobProductModel $mjpm) use ($statusId) {
return $mjpm->getStatus() == $statusId;
}
);
}
public function getNotApprovedProductModelItemList()
{
return $this->getProductModelListByStatus(MarketplaceJob::JOB_ITEM_STATUS_APPROVING_IS_REQUIRED);
}
public function hasNotApprovedProductModelItem(): bool
{
return $this->getNotApprovedProductModelItemList()->count() > 0;
}
public function getPendingProductModelList()
{
return $this->productModels->filter(
function (MarketplaceJobProductModel $mjpm) {
return in_array($mjpm->getStatus(), [
MarketplaceJob::JOB_ITEM_STATUS_PENDING,
MarketplaceJob::JOB_ITEM_STATUS_LISTINGS_WILL_BE_ACTIVATED,
MarketplaceJob::JOB_ITEM_STATUS_LISTINGS_WILL_BE_DEACTIVATED,
]);
}
);
}
public function getSuccesfullySyncedProductModelList()
{
return $this->productModels->filter(
function (MarketplaceJobProductModel $mjpm) {
return in_array($mjpm->getStatus(), [
MarketplaceJob::JOB_ITEM_STATUS_SUCCESS,
MarketplaceJob::JOB_ITEM_STATUS_SUCCESS_SKIPPED,
]);
}
);
}
public function getNotSyncedProductList()
{
return $this->products->filter(
function (MarketplaceJobProduct $mjp) {
$lastLog = $mjp->getLastStatusLog();
return $lastLog !== null && !in_array($lastLog->getStatus(), [
MarketplaceJob::JOB_ITEM_STATUS_SUCCESS,
MarketplaceJob::JOB_ITEM_STATUS_SUCCESS_SKIPPED,
MarketplaceJob::JOB_ITEM_STATUS_APPROVING_IS_REQUIRED
]);
}
);
}
public function hasProductModelSyncWithError()
{
return $this->getProductModelListByStatus(MarketplaceJob::JOB_ITEM_STATUS_ERROR)->count() > 0;
}
/**
* @param PersistentCollection $products
* @return void
*/
public function setProducts(PersistentCollection $products): void
{
$this->products = $products;
}
/**
* @return PersistentCollection
*/
public function getProducts(): PersistentCollection
{
return $this->products;
}
public function getApprovedProductItemList()
{
return $this->products->filter(
function (MarketplaceJobProductModel $mjpm) {
return in_array($mjpm->getStatus(), [
MarketplaceJob::JOB_ITEM_STATUS_PENDING,
MarketplaceJob::JOB_ITEM_STATUS_LISTING_LIMIT_REACHED,
MarketplaceJob::JOB_ITEM_STATUS_LISTINGS_WILL_BE_ACTIVATED,
MarketplaceJob::JOB_ITEM_STATUS_LISTINGS_WILL_BE_DEACTIVATED,
]);
}
);
}
public function getProductListByStatus(int $statusId)
{
return $this->products->filter(
function (MarketplaceJobProductModel $mjpm) use ($statusId) {
return $mjpm->getStatus() == $statusId;
}
);
}
public function getNotApprovedProductItemList()
{
return $this->getProductListByStatus(MarketplaceJob::JOB_ITEM_STATUS_APPROVING_IS_REQUIRED);
}
public function hasNotApprovedProductItem(): bool
{
return $this->getNotApprovedProductItemList()->count() > 0;
}
public function getPendingProductList()
{
return $this->products->filter(
function (MarketplaceJobProductModel $mjpm) {
return in_array($mjpm->getStatus(), [
MarketplaceJob::JOB_ITEM_STATUS_PENDING,
MarketplaceJob::JOB_ITEM_STATUS_LISTINGS_WILL_BE_ACTIVATED,
MarketplaceJob::JOB_ITEM_STATUS_LISTINGS_WILL_BE_DEACTIVATED,
]);
}
);
}
}