vendor/crosiersource/crosierlib-radx/src/Entity/Financeiro/Movimentacao.php line 111

Open in your IDE?
  1. <?php
  2. namespace CrosierSource\CrosierLibRadxBundle\Entity\Financeiro;
  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\NotLikeFilter;
  12. use CrosierSource\CrosierLibBaseBundle\Doctrine\Annotations\EntityHandler;
  13. use CrosierSource\CrosierLibBaseBundle\Doctrine\Annotations\NotUppercase;
  14. use CrosierSource\CrosierLibBaseBundle\Doctrine\Annotations\TrackDateOnly;
  15. use CrosierSource\CrosierLibBaseBundle\Doctrine\Annotations\TrackedEntity;
  16. use CrosierSource\CrosierLibBaseBundle\Entity\EntityId;
  17. use CrosierSource\CrosierLibBaseBundle\Entity\EntityIdTrait;
  18. use CrosierSource\CrosierLibBaseBundle\Utils\StringUtils\StringUtils;
  19. use DateTime;
  20. use Doctrine\ORM\Mapping as ORM;
  21. use Symfony\Component\Serializer\Annotation\Groups;
  22. use Symfony\Component\Serializer\Annotation\MaxDepth;
  23. use Symfony\Component\Serializer\Annotation\SerializedName;
  24. use Symfony\Component\Validator\Constraints as Assert;
  25. /**
  26.  * Entidade 'Movimentação'.
  27.  *
  28.  * @ApiResource(
  29.  *     shortName="Financeiro/Movimentacao",
  30.  *     normalizationContext={"groups"={"movimentacao","fatura","modo","banco","operadoraCartao","bandeiraCartao","carteira","categoria","grupoItem","grupo","entityId"},"enable_max_depth"=true},
  31.  *     denormalizationContext={"groups"={"movimentacao"},"enable_max_depth"=true},
  32.  *
  33.  *     itemOperations={
  34.  *          "get"={"path"="/fin/movimentacao/{id}", "security"="is_granted('ROLE_FINAN')"},
  35.  *          "put"={"path"="/fin/movimentacao/{id}", "security"="is_granted('ROLE_FINAN')"},
  36.  *          "delete"={"path"="/fin/movimentacao/{id}", "security"="is_granted('ROLE_FINAN_ADMIN')"}
  37.  *     },
  38.  *     collectionOperations={
  39.  *          "get"={"path"="/fin/movimentacao", "security"="is_granted('ROLE_FINAN')"},
  40.  *          "post"={"path"="/fin/movimentacao", "security"="is_granted('ROLE_FINAN')"}
  41.  *     },
  42.  *
  43.  *     attributes={
  44.  *          "pagination_items_per_page"=10,
  45.  *          "formats"={"jsonld", "csv"={"text/csv"}}
  46.  *     }
  47.  *
  48.  * )
  49.  * @ApiFilter(PropertyFilter::class)
  50.  *
  51.  * @ApiFilter(SearchFilter::class,
  52.  *     properties={
  53.  *     "id": "exact",
  54.  *     "fatura": "exact",
  55.  *     "descricao": "partial",
  56.  *     "categoria": "exact",
  57.  *     "categoria.codigoSuper": "exact",
  58.  *     "carteira": "exact",
  59.  *     "carteira.codigo": "exact",
  60.  *     "modo": "exact",
  61.  *     "status": "exact",
  62.  *     "centroCusto": "exact",
  63.  *     "grupoItem": "exact",
  64.  *     "chequeNumCheque": "exact",
  65.  *     "dtMoviment": "exact"
  66.  * })
  67.  *
  68.  * @ApiFilter(DateFilter::class, properties={
  69.  *     "dtMoviment",
  70.  *     "dtUtil",
  71.  *     "dtVenctoEfetiva",
  72.  *     "dtVencto",
  73.  *     "dtPagto"
  74.  * })
  75.  *
  76.  * @ApiFilter(RangeFilter::class, properties={"valorTotal"})
  77.  *
  78.  * @ApiFilter(BooleanFilter::class, properties={
  79.  *     "recorrente"
  80.  * })
  81.  *
  82.  * @ApiFilter(OrderFilter::class, properties={
  83.  *     "id",
  84.  *     "descricao",
  85.  *     "dtUtil",
  86.  *     "dtVencto",
  87.  *     "dtVenctoEfetiva",
  88.  *     "dtPagto",
  89.  *     "valor",
  90.  *     "valorTotal",
  91.  *     "carteira.codigo",
  92.  *     "categoria.codigo",
  93.  *     "categoria.codigoSuper",
  94.  *     "modo.codigo",
  95.  *     "updated"
  96.  * }, arguments={"orderParameterName"="order"})
  97.  *
  98.  * @ApiFilter(NotLikeFilter::class, properties={"status"})
  99.  *
  100.  * @EntityHandler(entityHandlerClass="CrosierSource\CrosierLibRadxBundle\EntityHandler\Financeiro\MovimentacaoEntityHandler")
  101.  *
  102.  * @ORM\Entity(repositoryClass="CrosierSource\CrosierLibRadxBundle\Repository\Financeiro\MovimentacaoRepository")
  103.  * @ORM\Table(name="fin_movimentacao")
  104.  * @TrackedEntity
  105.  *
  106.  * @author Carlos Eduardo Pauluk
  107.  */
  108. class Movimentacao implements EntityId
  109. {
  110.     const ALL_SERIAL_GROUPS = ['movimentacao''modo''banco''tipoLancto''carteira''categoria''centroCusto''grupoItem''operadoraCartao''bandeiraCartao''cadeia''fatura'];
  111.     use EntityIdTrait;
  112.     /**
  113.      * @Groups("movimentacao")
  114.      * @ORM\Column(name="uuid", type="string", nullable=true)
  115.      * @NotUppercase()
  116.      */
  117.     public ?string $UUID null;
  118.     /**
  119.      * @ORM\ManyToOne(targetEntity="CrosierSource\CrosierLibRadxBundle\Entity\Financeiro\Fatura", inversedBy="movimentacoes")
  120.      * @ORM\JoinColumn(name="fatura_id", nullable=true)
  121.      * @Groups("movimentacao")
  122.      * @MaxDepth(2)
  123.      */
  124.     public ?Fatura $fatura null;
  125.     /**
  126.      * @ORM\Column(name="fatura_ordem", type="integer", nullable=true)
  127.      * @Groups("movimentacao")
  128.      */
  129.     public ?int $faturaOrdem null;
  130.     /**
  131.      * @ORM\ManyToOne(targetEntity="CrosierSource\CrosierLibRadxBundle\Entity\Financeiro\Modo")
  132.      * @ORM\JoinColumn(name="modo_id")
  133.      * @Groups("movimentacao")
  134.      */
  135.     public ?Modo $modo null;
  136.     /**
  137.      * @ORM\ManyToOne(targetEntity="CrosierSource\CrosierLibRadxBundle\Entity\Financeiro\Banco")
  138.      * @ORM\JoinColumn(name="documento_banco_id", nullable=true)
  139.      * @Groups("movimentacao")
  140.      */
  141.     public ?Banco $documentoBanco null;
  142.     /**
  143.      * @ORM\Column(name="documento_num", type="string", length=200, nullable=true)
  144.      * @Groups("movimentacao")
  145.      */
  146.     public ?string $documentoNum null;
  147.     /**
  148.      * CPF/CNPJ de quem paga esta movimentação.
  149.      *
  150.      * @ORM\Column(name="sacado_documento", type="string", nullable=true)
  151.      * @Groups("movimentacao")
  152.      */
  153.     public ?string $sacadoDocumento null;
  154.     /**
  155.      * Nome/Razão Social de quem paga esta movimentação.
  156.      *
  157.      * @ORM\Column(name="sacado_nome", type="string", nullable=true)
  158.      * @Groups("movimentacao")
  159.      */
  160.     public ?string $sacadoNome null;
  161.     /**
  162.      * CPF/CNPJ de quem recebe esta movimentação.
  163.      *
  164.      * @ORM\Column(name="cedente_documento", type="string", nullable=true)
  165.      * @Groups("movimentacao")
  166.      */
  167.     public ?string $cedenteDocumento null;
  168.     /**
  169.      * Nome/Razão Social de quem recebe esta movimentação.
  170.      *
  171.      * @ORM\Column(name="cedente_nome", type="string", nullable=true)
  172.      * @Groups("movimentacao")
  173.      */
  174.     public ?string $cedenteNome null;
  175.     /**
  176.      * @ORM\Column(name="quitado", type="boolean", nullable=true)
  177.      * @Groups("movimentacao")
  178.      */
  179.     public ?bool $quitado false;
  180.     /**
  181.      * @ORM\ManyToOne(targetEntity="CrosierSource\CrosierLibRadxBundle\Entity\Financeiro\Movimentacao")
  182.      * @ORM\JoinColumn(name="movimentacao_pagante_id", nullable=true)
  183.      * @Groups("movimentacao")
  184.      * @MaxDepth(1)
  185.      */
  186.     public ?Movimentacao $movimentacaoPagante null;
  187.     /**
  188.      * @ORM\ManyToOne(targetEntity="CrosierSource\CrosierLibRadxBundle\Entity\Financeiro\TipoLancto")
  189.      * @ORM\JoinColumn(name="tipo_lancto_id", nullable=true)
  190.      * @Groups("movimentacao")
  191.      */
  192.     public ?TipoLancto $tipoLancto null;
  193.     /**
  194.      * @ORM\ManyToOne(targetEntity="CrosierSource\CrosierLibRadxBundle\Entity\Financeiro\Carteira")
  195.      * @ORM\JoinColumn(name="carteira_id")
  196.      * @Groups("movimentacao")
  197.      * @MaxDepth(2)
  198.      */
  199.     public ?Carteira $carteira null;
  200.     /**
  201.      * Carteira informada em casos de TRANSF_PROPRIA.
  202.      *
  203.      * @ORM\ManyToOne(targetEntity="CrosierSource\CrosierLibRadxBundle\Entity\Financeiro\Carteira")
  204.      * @ORM\JoinColumn(name="carteira_destino_id", nullable=true)
  205.      * @Groups("movimentacao")
  206.      * @MaxDepth(2)
  207.      */
  208.     public ?Carteira $carteiraDestino null;
  209.     /**
  210.      * @ORM\ManyToOne(targetEntity="CrosierSource\CrosierLibRadxBundle\Entity\Financeiro\Categoria")
  211.      * @ORM\JoinColumn(name="categoria_id")
  212.      * @Groups("movimentacao")
  213.      * @MaxDepth(2)
  214.      */
  215.     public ?Categoria $categoria null;
  216.     /**
  217.      * @ORM\ManyToOne(targetEntity="CrosierSource\CrosierLibRadxBundle\Entity\Financeiro\CentroCusto")
  218.      * @ORM\JoinColumn(name="centrocusto_id", nullable=true)
  219.      * @Groups("movimentacao")
  220.      */
  221.     public ?CentroCusto $centroCusto null;
  222.     /**
  223.      * Caso seja uma movimentação agrupada em um Grupo de Movimentação (item).
  224.      *
  225.      * @ORM\ManyToOne(targetEntity="CrosierSource\CrosierLibRadxBundle\Entity\Financeiro\GrupoItem", inversedBy="movimentacoes")
  226.      * @ORM\JoinColumn(name="grupo_item_id", nullable=true)
  227.      * @Groups("movimentacao")
  228.      * @MaxDepth(2)
  229.      */
  230.     public ?GrupoItem $grupoItem null;
  231.     /**
  232.      * @ORM\Column(name="status", type="string", length=50, nullable=true)
  233.      * @Groups("movimentacao")
  234.      */
  235.     public ?string $status null;
  236.     /**
  237.      * @ORM\Column(name="descricao", type="string", length=500)
  238.      * @Groups("movimentacao")
  239.      */
  240.     public ?string $descricao null;
  241.     /**
  242.      * Data em que a movimentação efetivamente aconteceu.
  243.      *
  244.      * @ORM\Column(name="dt_moviment", type="datetime")
  245.      * @Groups("movimentacao")
  246.      * @TrackDateOnly
  247.      */
  248.     public ?DateTime $dtMoviment null;
  249.     /**
  250.      * Data prevista para pagamento.
  251.      *
  252.      * @ORM\Column(name="dt_vencto", type="datetime")
  253.      * @Groups("movimentacao")
  254.      * @TrackDateOnly
  255.      */
  256.     public ?DateTime $dtVencto null;
  257.     /**
  258.      * Data prevista (postergando para dia útil) para pagamento.
  259.      *
  260.      * @ORM\Column(name="dt_vencto_efetiva", type="datetime")
  261.      * @Groups("movimentacao")
  262.      * @TrackDateOnly
  263.      */
  264.     public ?DateTime $dtVenctoEfetiva null;
  265.     /**
  266.      * Data em que a movimentação foi paga.
  267.      *
  268.      * @ORM\Column(name="dt_pagto", type="datetime", nullable=true)
  269.      * @Groups("movimentacao")
  270.      * @TrackDateOnly
  271.      */
  272.     public ?DateTime $dtPagto null;
  273.     /**
  274.      * Se dtPagto != null ? dtPagto : dtVencto.
  275.      *
  276.      * @ORM\Column(name="dt_util", type="datetime", nullable=true)
  277.      * @Groups("movimentacao")
  278.      * @TrackDateOnly
  279.      */
  280.     public ?DateTime $dtUtil null;
  281.     /**
  282.      * @ORM\ManyToOne(targetEntity="CrosierSource\CrosierLibRadxBundle\Entity\Financeiro\Banco")
  283.      * @ORM\JoinColumn(name="cheque_banco_id", nullable=true)
  284.      * @Groups("movimentacao")
  285.      */
  286.     public ?Banco $chequeBanco null;
  287.     /**
  288.      * Código da agência (sem o dígito verificador).
  289.      *
  290.      * @ORM\Column(name="cheque_agencia", type="string", length=30, nullable=true)
  291.      * @Groups("movimentacao")
  292.      */
  293.     public ?string $chequeAgencia null;
  294.     /**
  295.      * Número da conta no banco (não segue um padrão).
  296.      *
  297.      * @ORM\Column(name="cheque_conta", type="string", length=30, nullable=true)
  298.      * @Groups("movimentacao")
  299.      */
  300.     public ?string $chequeConta null;
  301.     /**
  302.      * @ORM\Column(name="cheque_num_cheque", type="string", length=30, nullable=true)
  303.      * @Groups("movimentacao")
  304.      */
  305.     public ?string $chequeNumCheque null;
  306.     /**
  307.      * @ORM\ManyToOne(targetEntity="CrosierSource\CrosierLibRadxBundle\Entity\Financeiro\OperadoraCartao")
  308.      * @ORM\JoinColumn(name="operadora_cartao_id", nullable=true)
  309.      * @Groups("movimentacao")
  310.      * @MaxDepth(2)
  311.      */
  312.     public ?OperadoraCartao $operadoraCartao null;
  313.     /**
  314.      * @ORM\ManyToOne(targetEntity="CrosierSource\CrosierLibRadxBundle\Entity\Financeiro\BandeiraCartao")
  315.      * @ORM\JoinColumn(name="bandeira_cartao_id", nullable=true)
  316.      * @Groups("movimentacao")
  317.      */
  318.     public ?BandeiraCartao $bandeiraCartao null;
  319.     /**
  320.      * Geralmente o NSU.
  321.      *
  322.      * @ORM\Column(name="id_transacao_cartao", type="string", nullable=true)
  323.      * @Groups("movimentacao")
  324.      */
  325.     public ?string $idTransacaoCartao null;
  326.     /**
  327.      * Número do cartão, geralmente identificado como: **** **** **** 1234
  328.      * @ORM\Column(name="num_cartao", type="string", nullable=true)
  329.      * @Groups("movimentacao")
  330.      */
  331.     public ?string $numCartao null;
  332.     /**
  333.      * @ORM\Column(name="recorrente", type="boolean", nullable=true)
  334.      * @Groups("movimentacao")
  335.      */
  336.     public ?bool $recorrente false;
  337.     /**
  338.      * @ORM\Column(name="recorr_frequencia", type="string", length=50, nullable=true)
  339.      * @Groups("movimentacao")
  340.      */
  341.     public ?string $recorrFrequencia null;
  342.     /**
  343.      * @ORM\Column(name="recorr_tipo_repet", type="string", length=50, nullable=true)
  344.      * @Groups("movimentacao")
  345.      */
  346.     public ?string $recorrTipoRepet null;
  347.     /**
  348.      * Utilizar 32 para marcar o último dia do mês.
  349.      *
  350.      * @ORM\Column(name="recorr_dia", type="integer", nullable=true)
  351.      * @Groups("movimentacao")
  352.      */
  353.     public ?int $recorrDia null;
  354.     /**
  355.      * Utilizado para marcar a variação em relação ao dia em que seria o vencimento.
  356.      * Exemplo: dia=32 (último dia do mês) + variacao=-2 >>> 2 dias antes do último dia do mês
  357.      *
  358.      * @ORM\Column(name="recorr_variacao", type="integer", nullable=true)
  359.      * @Groups("movimentacao")
  360.      */
  361.     public ?int $recorrVariacao null;
  362.     /**
  363.      * Valor bruto da movimentação.
  364.      *
  365.      * @ORM\Column(name="valor", type="decimal", precision=15, scale=2)
  366.      * @Groups("N")
  367.      * @Assert\Type(type="string")
  368.      */
  369.     public ?string $valor null;
  370.     /**
  371.      * Possíveis descontos (sempre negativo).
  372.      *
  373.      * @ORM\Column(name="descontos", type="decimal", precision=15, scale=2, nullable=true)
  374.      * @Groups("N")
  375.      * @Assert\Type(type="string")
  376.      */
  377.     public ?string $descontos null;
  378.     /**
  379.      * Possíveis acréscimos (sempre positivo).
  380.      *
  381.      * @ORM\Column(name="acrescimos", type="decimal", precision=15, scale=2, nullable=true)
  382.      * @Groups("N")
  383.      * @Assert\Type(type="string")
  384.      */
  385.     public ?string $acrescimos null;
  386.     /**
  387.      * @ORM\Column(name="valor_total", type="decimal", precision=15, scale=2)
  388.      * @Groups("N")
  389.      * @Assert\Type(type="string")
  390.      */
  391.     public ?string $valorTotal null;
  392.     /**
  393.      * @ORM\ManyToOne(targetEntity="CrosierSource\CrosierLibRadxBundle\Entity\Financeiro\Cadeia", inversedBy="movimentacoes")
  394.      * @ORM\JoinColumn(name="cadeia_id", referencedColumnName="id", nullable=true)
  395.      * @Groups("movimentacao")
  396.      * @MaxDepth(2)
  397.      */
  398.     public ?Cadeia $cadeia null;
  399.     /**
  400.      * @ORM\Column(name="parcelamento", type="boolean", nullable=true)
  401.      * @Groups("movimentacao")
  402.      */
  403.     public ?bool $parcelamento false;
  404.     /**
  405.      * O número da parcela.
  406.      *
  407.      * @ORM\Column(name="parcela_num", type="integer", nullable=true)
  408.      * @Groups("movimentacao")
  409.      */
  410.     public ?int $parcelaNum null;
  411.     /**
  412.      * A qtde total de parcelas.
  413.      *
  414.      * @ORM\Column(name="qtde_parcelas", type="integer", nullable=true)
  415.      * @Groups("movimentacao")
  416.      */
  417.     public ?int $qtdeParcelas null;
  418.     /**
  419.      * Caso a movimentação faça parte de uma cadeia, informa em qual posição.
  420.      * Não deve ser utilizado para armazenar o número da parcela, pois a cadeia pode conter mais movimentações que o
  421.      * número de parcelas do parcelamento.
  422.      *
  423.      * @ORM\Column(name="cadeia_ordem", type="integer", nullable=true)
  424.      * @Groups("movimentacao")
  425.      */
  426.     public ?int $cadeiaOrdem null;
  427.     /**
  428.      * Informa o total de movimentações na cadeia.
  429.      *
  430.      * @ORM\Column(name="cadeia_qtde", type="integer", nullable=true)
  431.      * @Groups("movimentacao")
  432.      */
  433.     public ?int $cadeiaQtde null;
  434.     /**
  435.      * @ORM\Column(name="obs", type="string", length=5000, nullable=true)
  436.      * @Groups("movimentacao")
  437.      */
  438.     public ?string $obs null;
  439.     /**
  440.      * Marcador para agrupar movimentações que foram importadas juntas.
  441.      *
  442.      * @Groups("movimentacao")
  443.      * @ORM\Column(name="uuid_importacao", type="string", nullable=true)
  444.      * @NotUppercase()
  445.      */
  446.     public ?string $uuidImportacao null;
  447.     /**
  448.      * @ORM\Column(name="json_data", type="json", nullable=true)
  449.      * @NotUppercase()
  450.      * @Groups("movimentacao")
  451.      */
  452.     public ?array $jsonData null;
  453.     /**
  454.      * @Groups("movimentacao")
  455.      * @return null|string
  456.      */
  457.     public function getSacado(): ?string
  458.     {
  459.         if ($this->sacadoDocumento && $this->sacadoNome) {
  460.             return StringUtils::mascararCnpjCpf($this->sacadoDocumento) . ' - ' $this->sacadoNome;
  461.         }
  462.         return null;
  463.     }
  464.     /**
  465.      * @Groups("movimentacao")
  466.      * @return null|string
  467.      */
  468.     public function getCedente(): ?string
  469.     {
  470.         if ($this->cedenteDocumento && $this->cedenteNome) {
  471.             return StringUtils::mascararCnpjCpf($this->cedenteDocumento) . ' - ' $this->cedenteNome;
  472.         }
  473.         return null;
  474.     }
  475.     /**
  476.      * @Groups("movimentacao")
  477.      * @SerializedName("valor")
  478.      * @return null|float
  479.      */
  480.     public function getValorFormatted(): ?float
  481.     {
  482.         return (float)$this->valor;
  483.     }
  484.     /**
  485.      * @Groups("movimentacao")
  486.      * @SerializedName("valor")
  487.      * @param null|float $valor
  488.      */
  489.     public function setValorFormatted(?float $valor)
  490.     {
  491.         $this->valor $valor;
  492.     }
  493.     /**
  494.      * @Groups("movimentacao")
  495.      * @SerializedName("descontos")
  496.      * @return null|float
  497.      */
  498.     public function getDescontosFormatted(): ?float
  499.     {
  500.         return (float)$this->descontos;
  501.     }
  502.     /**
  503.      * @Groups("movimentacao")
  504.      * @SerializedName("descontos")
  505.      * @param null|float $descontos
  506.      */
  507.     public function setDescontosFormatted(?float $descontos)
  508.     {
  509.         $this->descontos $descontos;
  510.     }
  511.     /**
  512.      * @Groups("movimentacao")
  513.      * @SerializedName("acrescimos")
  514.      * @return null|float
  515.      */
  516.     public function getAcrescimosFormatted(): ?float
  517.     {
  518.         return (float)$this->acrescimos;
  519.     }
  520.     /**
  521.      * @Groups("movimentacao")
  522.      * @SerializedName("acrescimos")
  523.      * @param null|float $acrescimos
  524.      */
  525.     public function setAcrescimosFormatted(?float $acrescimos)
  526.     {
  527.         $this->acrescimos $acrescimos;
  528.     }
  529.     /**
  530.      * @Groups("movimentacao")
  531.      * @SerializedName("valorTotal")
  532.      * @return null|float
  533.      */
  534.     public function getValorTotalFormatted(): ?float
  535.     {
  536.         return (float)$this->valorTotal;
  537.     }
  538.     /**
  539.      * @Groups("movimentacao")
  540.      * @SerializedName("valorTotal")
  541.      * @param null|float $valorTotal
  542.      */
  543.     public function setValorTotalFormatted(?float $valorTotal)
  544.     {
  545.         $this->valorTotal $valorTotal;
  546.     }
  547.     /**
  548.      * @Groups("movimentacao")
  549.      * @return string
  550.      */
  551.     public function getDescricaoMontada(): string
  552.     {
  553.         $sufixo '';
  554.         if ($this->parcelamento || ($this->qtdeParcelas && $this->parcelaNum)) {
  555.             $zerosfill strlen('' $this->qtdeParcelas);
  556.             $zerosfill $zerosfill $zerosfill;
  557.             $sufixo .= ' (' str_pad($this->parcelaNum ?? 0$zerosfill'0'STR_PAD_LEFT) . '/' str_pad($this->qtdeParcelas ?? 0$zerosfill'0'STR_PAD_LEFT) . ')';
  558.         }
  559.         if ($this->documentoNum) {
  560.             $sufixo .= ' (Doc: ' $this->documentoNum ')';
  561.         }
  562.         if ($this->chequeNumCheque) {
  563.             $nomeBanco '';
  564.             if ($this->chequeBanco) {
  565.                 $nomeBanco $this->chequeBanco->nome ' - ';
  566.             }
  567.             $sufixo .= '<br /> (CHQ: ' $nomeBanco 'nº ' $this->chequeNumCheque ')';
  568.         }
  569.         if ($this->bandeiraCartao || $this->operadoraCartao) {
  570.             if ($this->bandeiraCartao) {
  571.                 $sufixo .= ' (Bandeira: ' $this->bandeiraCartao->descricao ')';
  572.                 if (!$this->operadoraCartao) {
  573.                     $sufixo .= ' (Operadora não informada)';
  574.                 }
  575.             }
  576.             if ($this->operadoraCartao) {
  577.                 $sufixo .= ' (Operadora: ' $this->operadoraCartao->descricao ')';
  578.                 if (!$this->bandeiraCartao) {
  579.                     $sufixo .= ' (Bandeira não informada)';
  580.                 }
  581.             }
  582.         }
  583.         if ($this->numCartao) {
  584.             $sufixo .= ' (**** ' $this->numCartao ')';
  585.         }
  586.         return $this->descricao $sufixo;
  587.     }
  588.     /**
  589.      * Calcula e seta o valor total.
  590.      */
  591.     public function calcValorTotal(): void
  592.     {
  593.         $valorTotal $this->valor $this->descontos $this->acrescimos;
  594.         $this->valorTotal $valorTotal;
  595.     }
  596.     /**
  597.      * Retorna as outras movimentações que fazem parte da mesma cadeia desta.
  598.      *
  599.      * @return array
  600.      */
  601.     public function getOutrasMovimentacoesDaCadeia(): array
  602.     {
  603.         $outrasMovs = [];
  604.         if ($this->cadeia) {
  605.             foreach ($this->cadeia->movimentacoes as $outraMov) {
  606.                 if ($outraMov->getId() !== $this->getId()) {
  607.                     $outrasMovs[] = $outraMov;
  608.                 }
  609.             }
  610.         }
  611.         return $outrasMovs;
  612.     }
  613.     /**
  614.      * @return bool
  615.      * @Groups("movimentacao")
  616.      */
  617.     public function isTransferenciaEntreCarteiras(): bool
  618.     {
  619.         return
  620.             $this->cadeia &&
  621.             $this->cadeia->movimentacoes &&
  622.             $this->cadeia->movimentacoes->count() === &&
  623.             $this->categoria &&
  624.             in_array($this->categoria->codigo, [199299], true);
  625.     }
  626.     /**
  627.      * @return bool
  628.      * @Groups("movimentacao")
  629.      */
  630.     public function isTransferenciaEntradaCaixa(): bool
  631.     {
  632.         return
  633.             $this->cadeia &&
  634.             $this->cadeia->movimentacoes &&
  635.             $this->cadeia->movimentacoes->count() === &&
  636.             $this->categoria &&
  637.             in_array($this->categoria->codigo, [101102199299], true);
  638.     }
  639.     /**
  640.      * @return bool
  641.      * @Groups("movimentacao")
  642.      */
  643.     public function isUltimaNaCadeia(): bool
  644.     {
  645.         return
  646.             $this->cadeia &&
  647.             $this->cadeia->movimentacoes &&
  648.             $this->cadeia->movimentacoes->count() === $this->cadeiaOrdem;
  649.     }
  650.     /**
  651.      * Nos casos das movimentações entre carteiras 1.99 ou 2.99...
  652.      * @Groups("movimentacao")
  653.      * @MaxDepth(2)
  654.      *
  655.      * @return null|Movimentacao
  656.      */
  657.     public function getMovimentacaoOposta(): ?Movimentacao
  658.     {
  659.         if ($this->isTransferenciaEntreCarteiras()) {
  660.             return $this->getOutrasMovimentacoesDaCadeia()[0];
  661.         }
  662.         return null;
  663.     }
  664. }