vendor/crosiersource/crosierlib-radx/src/Entity/Estoque/Produto.php line 97

Open in your IDE?
  1. <?php
  2. namespace CrosierSource\CrosierLibRadxBundle\Entity\Estoque;
  3. use ApiPlatform\Core\Annotation\ApiFilter;
  4. use ApiPlatform\Core\Annotation\ApiResource;
  5. use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\BooleanFilter;
  6. use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\DateFilter;
  7. use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\OrderFilter;
  8. use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\RangeFilter;
  9. use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter;
  10. use ApiPlatform\Core\Serializer\Filter\PropertyFilter;
  11. use CrosierSource\CrosierLibBaseBundle\ApiPlatform\Filter\JsonFilter;
  12. use CrosierSource\CrosierLibBaseBundle\ApiPlatform\Filter\LikeFilter;
  13. use CrosierSource\CrosierLibBaseBundle\Doctrine\Annotations\EntityHandler;
  14. use CrosierSource\CrosierLibBaseBundle\Doctrine\Annotations\NotUppercase;
  15. use CrosierSource\CrosierLibBaseBundle\Doctrine\Annotations\TrackedEntity;
  16. use CrosierSource\CrosierLibBaseBundle\Entity\EntityId;
  17. use CrosierSource\CrosierLibBaseBundle\Entity\EntityIdTrait;
  18. use Doctrine\Common\Collections\ArrayCollection;
  19. use Doctrine\ORM\Mapping as ORM;
  20. use Doctrine\ORM\PersistentCollection;
  21. use Symfony\Component\Serializer\Annotation\Groups;
  22. use Symfony\Component\Serializer\Annotation\MaxDepth;
  23. use Symfony\Component\Serializer\Annotation\SerializedName;
  24. /**
  25.  * @ApiResource(
  26.  *     normalizationContext={"groups"={"produto","depto","grupo","subgrupo","fornecedor","produtoPreco","produtoSaldo","listaPreco","unidade","entityId"},"enable_max_depth"=true},
  27.  *     denormalizationContext={"groups"={"produto"},"enable_max_depth"=true},
  28.  *
  29.  *     itemOperations={
  30.  *          "get"={"path"="/est/produto/{id}", "security"="is_granted('ROLE_ESTOQUE') or is_granted('ROLE_VENDAS')"},
  31.  *          "put"={"path"="/est/produto/{id}", "security"="is_granted('ROLE_ESTOQUE')"},
  32.  *          "delete"={"path"="/est/produto/{id}", "security"="is_granted('ROLE_ESTOQUE_ADMIN')"}
  33.  *     },
  34.  *     collectionOperations={
  35.  *          "get"={"path"="/est/produto", "security"="is_granted('ROLE_ESTOQUE') or is_granted('ROLE_VENDAS')"},
  36.  *          "post"={"path"="/est/produto", "security"="is_granted('ROLE_ESTOQUE')"}
  37.  *     },
  38.  *
  39.  *     attributes={
  40.  *          "pagination_items_per_page"=10,
  41.  *          "formats"={"jsonld", "csv"={"text/csv"}}
  42.  *     }
  43.  * )
  44.  * @ApiFilter(PropertyFilter::class)
  45.  *
  46.  * @ApiFilter(SearchFilter::class, properties={
  47.  *     "id": "exact",
  48.  *     "status": "exact",
  49.  *     "codigo": "exact",
  50.  *     "depto": "exact",
  51.  *     "grupo": "exact",
  52.  *     "subgrupo": "exact",
  53.  *     "nome": "partial",
  54.  *     "composicao": "exact",
  55.  * })
  56.  *
  57.  * @ApiFilter(LikeFilter::class, properties={"nome"})
  58.  *
  59.  * @ApiFilter(RangeFilter::class, properties={"qtdeTotal"})
  60.  *
  61.  * @ApiFilter(BooleanFilter::class, properties={
  62.  *     "ecommerce": "exact"
  63.  * })
  64.  *
  65.  * @ApiFilter(DateFilter::class, properties={"dtUltIntegracaoEcommerce"})
  66.  *
  67.  * @ApiFilter(OrderFilter::class, properties={
  68.  *     "id",
  69.  *     "codigo",
  70.  *     "marca",
  71.  *     "qtdeTotal",
  72.  *     "composicao",
  73.  *     "depto.codigo",
  74.  *     "grupo.codigo",
  75.  *     "subgrupo.codigo",
  76.  *     "fornecedor.nome",
  77.  *     "nome",
  78.  *     "dtUltIntegracaoEcommerce",
  79.  *     "updated"
  80.  * }, arguments={"orderParameterName"="order"})
  81.  *
  82.  * @ApiFilter(JsonFilter::class, properties={
  83.  *     "jsonData.referencias_extras"={ "type": "string", "strategy": "partial" }
  84.  * })
  85.  *
  86.  * @EntityHandler(entityHandlerClass="CrosierSource\CrosierLibRadxBundle\EntityHandler\Estoque\ProdutoEntityHandler")
  87.  *
  88.  * @ORM\Entity(repositoryClass="CrosierSource\CrosierLibRadxBundle\Repository\Estoque\ProdutoRepository")
  89.  * @ORM\Table(name="est_produto")
  90.  * @TrackedEntity
  91.  *
  92.  * @author Carlos Eduardo Pauluk
  93.  */
  94. class Produto implements EntityId
  95. {
  96.     use EntityIdTrait;
  97.     /**
  98.      * @ORM\Column(name="uuid", type="string", nullable=false, length=36)
  99.      * @NotUppercase()
  100.      * @Groups("produto")
  101.      * @var string|null
  102.      */
  103.     public ?string $UUID null;
  104.     /**
  105.      * @ORM\Column(name="codigo", type="string", nullable=false)
  106.      * @Groups("produto")
  107.      * @var null|string
  108.      */
  109.     public ?string $codigo null;
  110.     /**
  111.      * @ORM\Column(name="nome", type="string", nullable=false)
  112.      * @Groups("produto")
  113.      * @var null|string
  114.      */
  115.     public ?string $nome null;
  116.     /**
  117.      * @ORM\Column(name="ean", type="string", nullable=true)
  118.      * @Groups("produto")
  119.      * @var null|string
  120.      */
  121.     public ?string $ean null;
  122.     /**
  123.      * @ORM\Column(name="ncm", type="string", nullable=true)
  124.      * @Groups("produto")
  125.      * @var null|string
  126.      */
  127.     public ?string $ncm null;
  128.     /**
  129.      * @ORM\Column(name="referencia", type="string", nullable=true)
  130.      * @Groups("produto")
  131.      * @var null|string
  132.      */
  133.     public ?string $referencia null;
  134.     /**
  135.      * @ORM\ManyToOne(targetEntity="CrosierSource\CrosierLibRadxBundle\Entity\Estoque\Depto")
  136.      * @ORM\JoinColumn(name="depto_id", nullable=false)
  137.      * @Groups("produto")
  138.      * @MaxDepth(1)
  139.      * @var $depto null|Depto
  140.      */
  141.     public ?Depto $depto null;
  142.     /**
  143.      * @ORM\ManyToOne(targetEntity="CrosierSource\CrosierLibRadxBundle\Entity\Estoque\Grupo")
  144.      * @ORM\JoinColumn(name="grupo_id", nullable=false)
  145.      * @Groups("produto")
  146.      * @MaxDepth(1)
  147.      * @var $grupo null|Grupo
  148.      */
  149.     public ?Grupo $grupo null;
  150.     /**
  151.      * @ORM\ManyToOne(targetEntity="CrosierSource\CrosierLibRadxBundle\Entity\Estoque\Subgrupo")
  152.      * @ORM\JoinColumn(name="subgrupo_id", nullable=false)
  153.      * @Groups("produto")
  154.      * @MaxDepth(1)
  155.      * @var $subgrupo null|Subgrupo
  156.      */
  157.     public ?Subgrupo $subgrupo null;
  158.     /**
  159.      * @ORM\ManyToOne(targetEntity="CrosierSource\CrosierLibRadxBundle\Entity\Estoque\Fornecedor")
  160.      * @ORM\JoinColumn(name="fornecedor_id", nullable=false)
  161.      * @Groups("produto")
  162.      * @var $fornecedor null|Fornecedor
  163.      */
  164.     public ?Fornecedor $fornecedor null;
  165.     /**
  166.      * @ORM\ManyToOne(targetEntity="CrosierSource\CrosierLibRadxBundle\Entity\Estoque\Unidade")
  167.      * @ORM\JoinColumn(name="unidade_padrao_id", nullable=false)
  168.      * @Groups("produto")
  169.      * @var null|Unidade
  170.      */
  171.     public ?Unidade $unidadePadrao null;
  172.     /**
  173.      * @ORM\Column(name="marca", type="string", nullable=true)
  174.      * @Groups("produto")
  175.      * @var null|string
  176.      */
  177.     public ?string $marca null;
  178.     /**
  179.      * ATIVO,INATIVO
  180.      * @ORM\Column(name="status", type="string", nullable=true)
  181.      * @Groups("produto")
  182.      * @var null|string
  183.      */
  184.     public ?string $status null;
  185.     /**
  186.      * @ORM\Column(name="obs", type="string", nullable=true)
  187.      * @Groups("produto")
  188.      * @var null|string
  189.      */
  190.     public ?string $obs null;
  191.     /**
  192.      * S,N
  193.      * @ORM\Column(name="composicao", type="string", nullable=true)
  194.      * @Groups("produto")
  195.      * @var null|string
  196.      */
  197.     public ?string $composicao 'N';
  198.     /**
  199.      * @ORM\Column(name="qtde_total", type="decimal", nullable=false, precision=15, scale=3)
  200.      * @var null|float
  201.      */
  202.     public ?float $qtdeTotal 0.0;
  203.     /**
  204.      * @ORM\Column(name="qtde_minima", type="decimal", nullable=true, precision=15, scale=3)
  205.      * @var null|float
  206.      */
  207.     public ?float $qtdeMinima null;
  208.     /**
  209.      * Informa se o produto está em e-commerce.
  210.      *
  211.      * @ORM\Column(name="ecommerce", type="boolean", nullable=true)
  212.      * @Groups("produto")
  213.      */
  214.     public ?bool $ecommerce false;
  215.     /**
  216.      * Marca a última data de integração ao e-commerce.
  217.      *
  218.      * @ORM\Column(name="dt_ult_integracao_ecommerce", type="datetime", nullable=true)
  219.      * @Groups("produto")
  220.      */
  221.     public ?\DateTime $dtUltIntegracaoEcommerce null;
  222.     /**
  223.      * @ORM\OneToMany(targetEntity="ProdutoImagem", mappedBy="produto", cascade={"all"}, orphanRemoval=true)
  224.      * @var ProdutoImagem[]|ArrayCollection|null
  225.      * @ORM\OrderBy({"ordem" = "ASC"})
  226.      */
  227.     public $imagens;
  228.     /**
  229.      * @ORM\OneToMany(targetEntity="ProdutoComposicao", mappedBy="produtoPai", cascade={"all"}, orphanRemoval=true, fetch="EXTRA_LAZY")
  230.      * @var ProdutoComposicao[]|ArrayCollection|null
  231.      * @ORM\OrderBy({"ordem" = "ASC"})
  232.      */
  233.     public $composicoes;
  234.     /**
  235.      * @ORM\OneToMany(targetEntity="ProdutoPreco", mappedBy="produto", cascade={"all"}, orphanRemoval=true, fetch="EXTRA_LAZY")
  236.      * @ORM\OrderBy({"atual" = "DESC"})
  237.      * @var ProdutoPreco[]|ArrayCollection|null
  238.      * @Groups("produto")
  239.      */
  240.     public $precos;
  241.     /**
  242.      * @var array
  243.      */
  244.     private array $precosPorLista = [];
  245.     /**
  246.      * @ORM\OneToMany(targetEntity="ProdutoSaldo", mappedBy="produto", cascade={"all"}, orphanRemoval=true, fetch="EXTRA_LAZY")
  247.      * @var ProdutoSaldo[]|ArrayCollection|null
  248.      * @Groups("produto")
  249.      */
  250.     public $saldos;
  251.     /**
  252.      * @ORM\Column(name="json_data", type="json")
  253.      * @var null|array
  254.      * @NotUppercase()
  255.      * @Groups("produto")
  256.      */
  257.     public ?array $jsonData null;
  258.     public function __construct()
  259.     {
  260.         $this->imagens = new ArrayCollection();
  261.         $this->composicoes = new ArrayCollection();
  262.         $this->precos = new ArrayCollection();
  263.         $this->saldos = new ArrayCollection();
  264.     }
  265.     /**
  266.      * @return ProdutoImagem[]|null
  267.      */
  268.     public function getImagens(): ?array
  269.     {
  270.         if ($this->imagens) {
  271.             if (is_array($this->imagens)) {
  272.                 return $this->imagens;
  273.             }
  274.             if (($this->imagens instanceof ArrayCollection) || ($this->imagens instanceof PersistentCollection)) {
  275.                 return $this->imagens->toArray();
  276.             }
  277.         }
  278.         return null;
  279.     }
  280.     /**
  281.      * @param ProdutoImagem[]|ArrayCollection|null $imagens
  282.      * @return Produto
  283.      */
  284.     public function setImagens($imagens): Produto
  285.     {
  286.         $this->imagens $imagens;
  287.         return $this;
  288.     }
  289.     /**
  290.      * @return ProdutoComposicao[]|ArrayCollection|null
  291.      */
  292.     public function getComposicoes()
  293.     {
  294.         return $this->composicoes;
  295.     }
  296.     /**
  297.      * @param ProdutoComposicao[]|ArrayCollection|null $composicoes
  298.      * @return Produto
  299.      */
  300.     public function setComposicoes($composicoes): Produto
  301.     {
  302.         $this->composicoes $composicoes;
  303.         return $this;
  304.     }
  305.     /**
  306.      * @return array
  307.      */
  308.     public function getPrecosPorLista(): array
  309.     {
  310.         if (!$this->precosPorLista) {
  311.             $precosPorLista = [];
  312.             foreach ($this->precos as $preco) {
  313.                 $precosPorLista[strtoupper($preco->lista->descricao)] = $preco->precoPrazo;
  314.             }
  315.             $precosPorLista['VAREJO'] = $precosPorLista['VAREJO'] ?? 0.0;
  316.             $precosPorLista['ATACADO'] = $precosPorLista['ATACADO'] ?? 0.0;
  317.             $this->precosPorLista $precosPorLista;
  318.         }
  319.         return $this->precosPorLista;
  320.     }
  321.     /**
  322.      * @SerializedName("descricaoMontada")
  323.      * @Groups("produto")
  324.      * @return string
  325.      */
  326.     public function getDescricaoMontada(): string
  327.     {
  328.         return $this->codigo ' - ' $this->nome ' (' $this->unidadePadrao->label ')';
  329.     }
  330.     /**
  331.      * Para aceitar tanto em string quanto em double.
  332.      * @Groups("produto")
  333.      * @SerializedName("qtdeTotal")
  334.      * @return float
  335.      */
  336.     public function getQtdeTotalFormatted(): float
  337.     {
  338.         return (float)$this->qtdeTotal;
  339.     }
  340.     /**
  341.      * Para aceitar tanto em string quanto em double.
  342.      * @Groups("produto")
  343.      * @SerializedName("qtdeTotal")
  344.      * @param float $qtdeTotal
  345.      */
  346.     public function setQtdeTotalFormatted(float $qtdeTotal)
  347.     {
  348.         $this->qtdeTotal $qtdeTotal;
  349.     }
  350.     /**
  351.      * Para aceitar tanto em string quanto em double.
  352.      * @Groups("produto")
  353.      * @SerializedName("qtdeMinima")
  354.      * @return float
  355.      */
  356.     public function getQtdeMinimaFormatted(): float
  357.     {
  358.         return (float)$this->qtdeMinima;
  359.     }
  360.     /**
  361.      * Para aceitar tanto em string quanto em double.
  362.      * @Groups("produto")
  363.      * @SerializedName("qtdeMinima")
  364.      * @param float $qtdeMinima
  365.      */
  366.     public function setQtdeMinimaFormatted(float $qtdeMinima)
  367.     {
  368.         $this->qtdeMinima $qtdeMinima;
  369.     }
  370. }