src/AtechNet/CoreBundle/Entity/MarketplaceJob.php line 22

Open in your IDE?
  1. <?php
  2. namespace App\AtechNet\CoreBundle\Entity;
  3. use Doctrine\ORM\Mapping\Column;
  4. use Doctrine\ORM\Mapping\Entity;
  5. use Doctrine\ORM\Mapping\HasLifecycleCallbacks;
  6. use Doctrine\ORM\Mapping\JoinColumn;
  7. use Doctrine\ORM\Mapping\ManyToOne;
  8. use Doctrine\ORM\Mapping\OneToMany;
  9. use Doctrine\ORM\Mapping\OrderBy;
  10. use Doctrine\ORM\Mapping\Table as Table;
  11. use Doctrine\ORM\PersistentCollection;
  12. /**
  13.  * MarketplaceJob
  14.  *
  15.  * @Table(name="marketplace_job")
  16.  * @Entity(repositoryClass="App\AtechNet\CoreBundle\Repository\MarketplaceJobRepository")
  17.  * @HasLifecycleCallbacks
  18.  */
  19. class MarketplaceJob extends AbstractSignedEntity
  20. {
  21.     public const JOB_STATUS_NEW = 0;
  22.     public const JOB_STATUS_PENDING = 1;
  23.     public const JOB_STATUS_SUCCESS = 2;
  24.     public const JOB_STATUS_FAILED = 3;
  25.     public const JOB_STATUS_PARTLY_FAILED = 4;
  26.     public const JOB_STATUS_REPAIRED = 5;
  27.     public const JOB_ITEM_STATUS_NEW = -1;
  28.     public const JOB_ITEM_STATUS_PENDING = 0;
  29.     public const JOB_ITEM_STATUS_SUCCESS = 1;
  30.     public const JOB_ITEM_STATUS_APPROVING_IS_REQUIRED = 2;
  31.     public const JOB_ITEM_STATUS_LISTING_LIMIT_REACHED = 3;
  32.     public const JOB_ITEM_STATUS_ERROR = 4;
  33.     public const JOB_ITEM_STATUS_LISTINGS_WILL_BE_ACTIVATED = 5;
  34.     public const JOB_ITEM_STATUS_LISTINGS_WILL_BE_DEACTIVATED = 6;
  35.     public const JOB_ITEM_STATUS_SUCCESS_SKIPPED = 7;
  36.     public const JOB_ITEM_STATUS_PAUSE = 8;
  37.     public const JOB_ITEM_STATUS_RESUME = 9;
  38.     public const array JOB_ITEM_STATUS_TITLE_LIST = [
  39.         self::JOB_ITEM_STATUS_NEW                           => 'NEW',
  40.         self::JOB_ITEM_STATUS_PENDING                       => 'PENDING',
  41.         self::JOB_ITEM_STATUS_SUCCESS                       => 'SUCCESS',
  42.         self::JOB_ITEM_STATUS_APPROVING_IS_REQUIRED         => 'APPROVE IS REQUIRED',
  43.         self::JOB_ITEM_STATUS_LISTING_LIMIT_REACHED         => 'LISTING LIMIT REACHED',
  44.         self::JOB_ITEM_STATUS_ERROR                         => 'ERROR',
  45.         self::JOB_ITEM_STATUS_LISTINGS_WILL_BE_ACTIVATED    => 'Listing ACTIVATION',
  46.         self::JOB_ITEM_STATUS_LISTINGS_WILL_BE_DEACTIVATED  => 'Listing DEACTIVATION',
  47.         self::JOB_ITEM_STATUS_SUCCESS_SKIPPED               => 'SKIPPED',
  48.         self::JOB_ITEM_STATUS_PAUSE                         => 'LISTING PAUSE',
  49.         self::JOB_ITEM_STATUS_RESUME                        => 'LISTING RESUME',
  50.     ];
  51.     public const JOB_SYNC_TYPE_STOCK = 1;
  52.     public const JOB_LISTING_CREATE = 2;
  53.     public const JOB_SYNC_TYPE_PRICE = 3;
  54.     public const JOB_SYNC_TYPE_PRICE_AT_NIGHT = 4;
  55.     public const JOB_SYNC_TYPE_STOCK_CORRECTION = 5;
  56.     public const AUTO_REACTIVATION_QTY_THRESHOLD = 15;
  57.     public static function statusList(): array
  58.     {
  59.         return [
  60.             self::JOB_STATUS_NEW           => 'NEW',
  61.             self::JOB_STATUS_PENDING       => 'PENDING',
  62.             self::JOB_STATUS_SUCCESS       => 'SUCCESS',
  63.             self::JOB_STATUS_FAILED        => 'FAILED',
  64.             self::JOB_STATUS_PARTLY_FAILED => 'PARTLY_FAILED',
  65.             self::JOB_STATUS_REPAIRED      => 'REPAIRED',
  66.         ];
  67.     }
  68.     public static function syncTypeList(): array
  69.     {
  70.         return [
  71.             self::JOB_SYNC_TYPE_STOCK               => 'Stock',
  72.             self::JOB_SYNC_TYPE_PRICE               => 'Price',
  73.             self::JOB_SYNC_TYPE_PRICE_AT_NIGHT      => 'Price (Night)',
  74.             self::JOB_LISTING_CREATE                => 'Listing create',
  75.             self::JOB_SYNC_TYPE_STOCK_CORRECTION    => 'Stock Correction (Night)'
  76.         ];
  77.     }
  78.     /**
  79.      * @var Customer|null
  80.      *
  81.      * @ManyToOne(targetEntity="Customer")
  82.      * @JoinColumn(name="customer_id", referencedColumnName="id", nullable=true)
  83.      */
  84.     private ?Customer $marketplace = null;
  85.     /**
  86.      * @var int
  87.      *
  88.      * @Column(name="status", type="integer", length=1)
  89.      */
  90.     private int $status;
  91.     /**
  92.      * @var int
  93.      *
  94.      * @Column(name="sync_type", type="integer", nullable=false)
  95.      */
  96.     private int $syncType;
  97.     /**
  98.      * @var PersistentCollection
  99.      *
  100.      * @OneToMany(targetEntity="MarketplaceJobProductModel", mappedBy="marketplaceJob", orphanRemoval=true)
  101.      * @OrderBy({"created" = "ASC", "id" = "ASC"})
  102.      */
  103.     private $productModels;
  104.     /**
  105.      * @var PersistentCollection
  106.      *
  107.      * @OneToMany(targetEntity="MarketplaceJobProduct", mappedBy="marketplaceJob", orphanRemoval=true)
  108.      * @OrderBy({"created" = "ASC", "id" = "ASC"})
  109.      */
  110.     private $products;
  111.     public function __construct()
  112.     {
  113.         parent::__construct();
  114.         $this->status = self::JOB_STATUS_NEW;
  115.     }
  116.     /**
  117.      * @return Customer|null
  118.      */
  119.     public function getMarketplace(): ?Customer
  120.     {
  121.         return $this->marketplace;
  122.     }
  123.     /**
  124.      * @param Customer|null $marketplace
  125.      */
  126.     public function setMarketplace(?Customer $marketplace)
  127.     {
  128.         $this->marketplace = $marketplace;
  129.     }
  130.     /**
  131.      * @return int
  132.      */
  133.     public function getStatus()
  134.     {
  135.         return $this->status;
  136.     }
  137.     /**
  138.      * @param int $status
  139.      */
  140.     public function setStatus(int $status)
  141.     {
  142.         $this->status = $status;
  143.     }
  144.     /**
  145.      * @return string
  146.      */
  147.     public function getSyncType()
  148.     {
  149.         return $this->syncType;
  150.     }
  151.     /**
  152.      * @param int $syncType
  153.      */
  154.     public function setSyncType(int $syncType)
  155.     {
  156.         $this->syncType = $syncType;
  157.     }
  158.     /**
  159.      * @param PersistentCollection $productModels
  160.      * @return void
  161.      */
  162.     public function setProductModels(PersistentCollection $productModels): void
  163.     {
  164.         $this->productModels = $productModels;
  165.     }
  166.     /**
  167.      * @return PersistentCollection
  168.      */
  169.     public function getProductModels(): PersistentCollection
  170.     {
  171.         return $this->productModels;
  172.     }
  173.     public function getApprovedProductModelItemList()
  174.     {
  175.         return $this->productModels->filter(
  176.             function (MarketplaceJobProductModel $mjpm) {
  177.                 return in_array($mjpm->getStatus(), [
  178.                     MarketplaceJob::JOB_ITEM_STATUS_PENDING,
  179.                     MarketplaceJob::JOB_ITEM_STATUS_LISTING_LIMIT_REACHED,
  180.                     MarketplaceJob::JOB_ITEM_STATUS_LISTINGS_WILL_BE_ACTIVATED,
  181.                     MarketplaceJob::JOB_ITEM_STATUS_LISTINGS_WILL_BE_DEACTIVATED,
  182.                 ]);
  183.             }
  184.         );
  185.     }
  186.     public function getProductModelListByStatus(int $statusId)
  187.     {
  188.         return $this->productModels->filter(
  189.             function (MarketplaceJobProductModel $mjpm) use ($statusId) {
  190.                 return $mjpm->getStatus() == $statusId;
  191.             }
  192.         );
  193.     }
  194.     public function getNotApprovedProductModelItemList()
  195.     {
  196.         return $this->getProductModelListByStatus(MarketplaceJob::JOB_ITEM_STATUS_APPROVING_IS_REQUIRED);
  197.     }
  198.     public function hasNotApprovedProductModelItem(): bool
  199.     {
  200.         return $this->getNotApprovedProductModelItemList()->count() > 0;
  201.     }
  202.     public function getPendingProductModelList()
  203.     {
  204.         return $this->productModels->filter(
  205.             function (MarketplaceJobProductModel $mjpm) {
  206.                 return in_array($mjpm->getStatus(), [
  207.                     MarketplaceJob::JOB_ITEM_STATUS_PENDING,
  208.                     MarketplaceJob::JOB_ITEM_STATUS_LISTINGS_WILL_BE_ACTIVATED,
  209.                     MarketplaceJob::JOB_ITEM_STATUS_LISTINGS_WILL_BE_DEACTIVATED,
  210.                 ]);
  211.             }
  212.         );
  213.     }
  214.     public function getSuccesfullySyncedProductModelList()
  215.     {
  216.         return $this->productModels->filter(
  217.             function (MarketplaceJobProductModel $mjpm) {
  218.                 return in_array($mjpm->getStatus(), [
  219.                     MarketplaceJob::JOB_ITEM_STATUS_SUCCESS,
  220.                     MarketplaceJob::JOB_ITEM_STATUS_SUCCESS_SKIPPED,
  221.                 ]);
  222.             }
  223.         );
  224.     }
  225.     public function getNotSyncedProductList()
  226.     {
  227.         return $this->products->filter(
  228.             function (MarketplaceJobProduct $mjp) {
  229.                 $lastLog = $mjp->getLastStatusLog();
  230.                 return $lastLog !== null && !in_array($lastLog->getStatus(), [
  231.                     MarketplaceJob::JOB_ITEM_STATUS_SUCCESS,
  232.                     MarketplaceJob::JOB_ITEM_STATUS_SUCCESS_SKIPPED,
  233.                     MarketplaceJob::JOB_ITEM_STATUS_APPROVING_IS_REQUIRED
  234.                 ]);
  235.             }
  236.         );
  237.     }
  238.     public function hasProductModelSyncWithError()
  239.     {
  240.         return $this->getProductModelListByStatus(MarketplaceJob::JOB_ITEM_STATUS_ERROR)->count() > 0;
  241.     }
  242.     /**
  243.      * @param PersistentCollection $products
  244.      * @return void
  245.      */
  246.     public function setProducts(PersistentCollection $products): void
  247.     {
  248.         $this->products = $products;
  249.     }
  250.     /**
  251.      * @return PersistentCollection
  252.      */
  253.     public function getProducts(): PersistentCollection
  254.     {
  255.         return $this->products;
  256.     }
  257.     public function getApprovedProductItemList()
  258.     {
  259.         return $this->products->filter(
  260.             function (MarketplaceJobProductModel $mjpm) {
  261.                 return in_array($mjpm->getStatus(), [
  262.                     MarketplaceJob::JOB_ITEM_STATUS_PENDING,
  263.                     MarketplaceJob::JOB_ITEM_STATUS_LISTING_LIMIT_REACHED,
  264.                     MarketplaceJob::JOB_ITEM_STATUS_LISTINGS_WILL_BE_ACTIVATED,
  265.                     MarketplaceJob::JOB_ITEM_STATUS_LISTINGS_WILL_BE_DEACTIVATED,
  266.                 ]);
  267.             }
  268.         );
  269.     }
  270.     public function getProductListByStatus(int $statusId)
  271.     {
  272.         return $this->products->filter(
  273.             function (MarketplaceJobProductModel $mjpm) use ($statusId) {
  274.                 return $mjpm->getStatus() == $statusId;
  275.             }
  276.         );
  277.     }
  278.     public function getNotApprovedProductItemList()
  279.     {
  280.         return $this->getProductListByStatus(MarketplaceJob::JOB_ITEM_STATUS_APPROVING_IS_REQUIRED);
  281.     }
  282.     public function hasNotApprovedProductItem(): bool
  283.     {
  284.         return $this->getNotApprovedProductItemList()->count() > 0;
  285.     }
  286.     public function getPendingProductList()
  287.     {
  288.         return $this->products->filter(
  289.             function (MarketplaceJobProductModel $mjpm) {
  290.                 return in_array($mjpm->getStatus(), [
  291.                     MarketplaceJob::JOB_ITEM_STATUS_PENDING,
  292.                     MarketplaceJob::JOB_ITEM_STATUS_LISTINGS_WILL_BE_ACTIVATED,
  293.                     MarketplaceJob::JOB_ITEM_STATUS_LISTINGS_WILL_BE_DEACTIVATED,
  294.                 ]);
  295.             }
  296.         );
  297.     }
  298. }