src/Admin/ContaPagarAdmin.php line 36

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Admin;
  4. use App\Entity\CentroCusto;
  5. use App\Entity\ContaPagar;
  6. use App\Entity\ContaReceber;
  7. use App\Entity\FluxoCaixa;
  8. use App\Entity\PropostaComercial;
  9. use App\Enums\StatusContaFinanceiro;
  10. use App\Enums\PeriodicidadeRecorrenciaEnum;
  11. use App\Enums\TipoContaPagarEnum;
  12. use App\Enums\ContasBancariasEnum;
  13. use App\Enums\UFEnum;
  14. use Sonata\AdminBundle\Admin\AbstractAdmin;
  15. use Sonata\AdminBundle\Datagrid\DatagridMapper;
  16. use Sonata\AdminBundle\Datagrid\ListMapper;
  17. use Sonata\AdminBundle\Form\FormMapper;
  18. use Sonata\AdminBundle\Form\Type\ModelType;
  19. use Sonata\AdminBundle\Show\ShowMapper;
  20. use Sonata\DoctrineORMAdminBundle\Filter\ChoiceFilter;
  21. use Sonata\DoctrineORMAdminBundle\Filter\DateRangeFilter;
  22. use Sonata\Form\Type\DatePickerType;
  23. use Sonata\Form\Type\DateRangePickerType;
  24. use Sonata\Form\Type\DateTimeRangePickerType;
  25. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  26. use Symfony\Component\Form\Extension\Core\Type\FileType;
  27. use Symfony\Component\Form\Extension\Core\Type\MoneyType;
  28. use Symfony\Component\Validator\Constraints as Assert;
  29. use Sonata\Form\Type\CollectionType;
  30. use Sonata\Form\Validator\ErrorElement;
  31. use Sonata\AdminBundle\Route\RouteCollection;
  32. final class ContaPagarAdmin extends AbstractAdmin
  33. {
  34.     //protected $perPageOptions = [64, 128, 256, 2000];
  35.     protected $datagridValues = [
  36.         '_page'         => 1,
  37.         '_sort_order'   => 'ASC',
  38.         '_sort_by'      => 'vencimento',
  39.         //'_per_page'     => 2000
  40.     ];
  41.     protected function configureRoutes(RouteCollection $collection)
  42.     {
  43.         $collection->add('opendocument');
  44.     }
  45.     //protected $maxPerPage = 2000;
  46.     protected function configureDatagridFilters(DatagridMapper $datagridMapper): void
  47.     {
  48.         $datagridMapper
  49.             ->add('descricao','doctrine_orm_callback',[
  50.                 'label'=>'Descrição',
  51.                 'callback'   => array($this'filterDescricao'),
  52.             ])
  53.             ->add('classificacao',null,  array('label'=>'Classificação''field_options' => ['expanded' => false'multiple' => true]))
  54.             ->add('fornecedor',null,  array('label'=>'Fornecedor'))
  55.             ->add('colaborador',null,  array('label'=>'Credor'))
  56.             ->add('os',null,  array('label'=>'Ordem de Serviço'))
  57.             ->add('tipoDocumento',null,  array(), ChoiceType::class, array(
  58.                 'choices' => TipoContaPagarEnum::getAssociatedValues()
  59.             ))
  60.             ->add('status','doctrine_orm_callback',  array(
  61.                 'label' => 'Situação',
  62.                 'callback' => function($queryBuilder$alias$field$value) {
  63.                     if (!$value['value']) {
  64.                         return;
  65.                     }
  66.                     if($value['value']==StatusContaFinanceiro::ABERTO) {
  67.                         $queryBuilder->andWhere($alias.'.pagoEm is null');
  68.                         $queryBuilder->andWhere($alias.'.vencimento < :hoje');
  69.                         $queryBuilder->setParameter('hoje',new \DateTime('now'));
  70.                     } else if($value['value']==StatusContaFinanceiro::PAGO) {
  71.                         $queryBuilder->andWhere($alias.'.pagoEm is not null');
  72.                     } else if($value['value']==StatusContaFinanceiro::ATRASADO) {
  73.                         $queryBuilder->andWhere($alias.'.pagoEm is null');
  74.                         $queryBuilder->andWhere($alias.'.vencimento < :hoje');
  75.                         $queryBuilder->setParameter('hoje',new \DateTime('now'));
  76.                     }
  77.                     return true;
  78.                 }
  79.             ), ChoiceType::class, array(
  80.                 'choices' => StatusContaFinanceiro::getAssociatedValues()
  81.             ))
  82.             ->add('vencimento''doctrine_orm_datetime_range', ['field_type'=> DateRangePickerType::class])
  83.             ->add('valor')
  84.             ->add('numeroNota'null, ['label'=>'Nº nota fiscal'])
  85.             ->add('parcela')
  86.             ->add('pagoEm''doctrine_orm_datetime_range', ['field_type'=> DateRangePickerType::class])
  87.             ->add('valorPago'null, ['label'=>'Valor pago'])
  88.             ->add('createdAt'null, ['label'=>'Data de cadastro'])
  89.             ->add('updatedAt'null, ['label'=>'Data da última atualização'])
  90.             ->add('isGeral',null,  ['label'=>'Despesa Geral'], ChoiceType::class, array(
  91.                 'choices' => [
  92.                     'Sim' => 1,
  93.                     'Não' => 0
  94.                 ]
  95.             ))
  96.             ;
  97.     }
  98.     protected function configureListFields(ListMapper $listMapper): void
  99.     {
  100.         $this->setTemplate('list''ContaPagar/list.html.twig');
  101.         $listMapper
  102.             ->add('status',null, ['label'=>false,'template'=>'ContaPagar/status_list.html.twig'])
  103.             ->add('descricao'null, ['label'=>'Descrição','template'=>'ContaPagar/descricao_list.html.twig'])
  104.             ->add('vencimento')
  105.             ->add('numeroNota'null, ['label'=>'Nº nota fiscal'])
  106.             ->add('pagoEm'null, ['label'=>'Data do pagamento'])
  107.             ->add('valor'null, ['label'=>'Valor','template'=>'Generic/currency_list.html.twig'])
  108.             ->add('valorPago'null, ['label'=>'Valor Bruto','template'=>'Generic/currency_valorPago_list.html.twig'])
  109.             ->add('classificacao',null,  array('label'=>'Classificação'))
  110.             ->add('_action'null, [
  111.                 'actions' => [
  112.                     'show' => [],
  113.                     'edit' => [],
  114.                     'delete' => [],
  115.                 ],
  116.             ]);
  117.     }
  118.     public function filterDescricao($queryBuilder$alias$field$value)
  119.     {
  120.         if (!$value['value']) {
  121.             return;
  122.         }
  123.         $value mb_strtolower($value['value']);
  124.         $queryBuilder
  125.             //->andWhere("UNACCENT(LOWER($alias.descricao)) LIKE UNACCENT(:nome)" )
  126.             ->andWhere("LOWER($alias.descricao) LIKE :nome" )
  127.             ->setParameter('nome'"%$value%");
  128.         return true;
  129.     }
  130.     protected function configureFormFields(FormMapper $formMapper): void
  131.     {
  132.         /** @var ContaPagar $contaPagar */
  133.         $contaPagar $this->getSubject();
  134.         //$imgReq = !is_null($empresa) && is_null($empresa->getId());
  135.         $imgReq false;
  136.         $fileFieldOptionsNotaFiscal = [
  137.             'data_class' => null,
  138.             'required' => false,
  139.             'label' => 'Nota Fiscal',
  140.             'help' => '',
  141.         ];
  142.         if (!is_null($contaPagar) && $contaPagar->getNotaFiscal() != '') {
  143.             $fileFieldOptionsNotaFiscal['help'] = '<a href="/'.$contaPagar->getNotaFiscal().'" target="_blank" class="btn btn-warning"/><i class="fa fa-eye" aria-hidden="true"></i> Visualizar</a>';
  144.         }
  145.         $fileFieldOptionsComprovantePagamento = [
  146.             'data_class' => null,
  147.             'required' => false,
  148.             'label' => 'Comprovante de Pagamento',
  149.             'help' => '',
  150.         ];
  151.         if (!is_null($contaPagar) && $contaPagar->getComprovantePagamento() != '') {
  152.             $fileFieldOptionsComprovantePagamento['help'] = '<a href="/'.$contaPagar->getComprovantePagamento().'" target="_blank" class="btn btn-warning"/><i class="fa fa-eye" aria-hidden="true"></i> Visualizar</a>';
  153.         }
  154.         $fileFieldOptionsDocumentoPagamento = [
  155.             'data_class' => null,
  156.             'required' => false,
  157.             'label' => 'Documento para Pagamento',
  158.             'help' => '',
  159.         ];
  160.         if (!is_null($contaPagar) && $contaPagar->getDocumentoPagamento() != '') {
  161.             $fileFieldOptionsDocumentoPagamento['help'] = '<a href="/'.$contaPagar->getDocumentoPagamento().'" target="_blank" class="btn btn-warning"/><i class="fa fa-eye" aria-hidden="true"></i> Visualizar</a>';
  162.         }
  163.         $queryBuilderClassificacao $this->getModelManager()
  164.             ->getEntityManager(CentroCusto::class)
  165.             ->createQueryBuilder('cc')
  166.             ->select('cc')
  167.             ->where('cc.classificacao != :classificacao')
  168.             ->from('App:CentroCusto''cc')
  169.             ->setParameter('classificacao','RECEBIMENTOS')
  170.             ->orderBy('cc.titulo''ASC')
  171.         ;
  172.         $formMapper
  173.             ->with('Informações I', ['class' => 'col-md-6'])
  174.                 ->add('descricao')
  175.                 ->add('tipoDocumento'ChoiceType::class, [
  176.                     'label' => 'Tipo de documento',
  177.                     'placeholder' => '-- Selecione --',
  178.                     'choices' => TipoContaPagarEnum::getAssociatedValues(),
  179.                 ])
  180.                 ->add('classificacao'ModelType::class, [
  181.                     'placeholder' => '-- Selecione --',
  182.                     'label' => 'Classificação',
  183.                     'required' => true,
  184.                     'expanded' => false,
  185.                     'multiple' => false,
  186.                     'query' => $queryBuilderClassificacao
  187.                 ])
  188.                 ->add('fornecedor'ModelType::class, [
  189.                     'placeholder' => '-- Selecione --',
  190.                     'label' => 'Fornecedor',
  191.                     'required' => false,
  192.                     'expanded' => false,
  193.                     'multiple' => false
  194.                 ])
  195.                 ->add('os'ModelType::class, [
  196.                     'placeholder' => '-- Selecione --',
  197.                     'label' => 'Ordem de serviço',
  198.                     'required' => false,
  199.                     'expanded' => false,
  200.                     'multiple' => false
  201.                 ])
  202.                 ->add('isGeral',null, ['label'=>'Despesa Geral'])
  203.                 ->add('colaborador'ModelType::class, [
  204.                     'placeholder' => '-- Selecione --',
  205.                     'label' => 'Credor(colaborador)',
  206.                     'required' => false,
  207.                     'expanded' => false,
  208.                     'multiple' => false
  209.                 ])
  210.                 ->add('vencimento'DatePickerType::class,['label'=>'Data do vencimento''required'=>true])
  211.                 ->add('isRecorrente',null, ['label'=>'É recorrente'])
  212.                 ->add('isValorFixo',null, ['label'=>'É valor fixo'])
  213.                 ->add('periodicidadeRecorrencia'ChoiceType::class, [
  214.                     'label' => 'Periodicidade Recorrência',
  215.                     'placeholder' => '-- Selecione --',
  216.                     'choices' => PeriodicidadeRecorrenciaEnum::getAssociatedValues(),
  217.                     'required' => false
  218.                 ])
  219.                 ->add('contaBancaria'ChoiceType::class, [
  220.                     'label' => 'Conta Bancária da movimentação',
  221.                     'placeholder' => '-- Selecione --',
  222.                     'choices' => ContasBancariasEnum::getAssociatedValues(),
  223.                     'required' => false
  224.                 ])
  225.             ->end()
  226.             ->with('Informações II', ['class' => 'col-md-6'])
  227.                 ->add('valor'MoneyType::class, [
  228.                     'label' => 'Valor original',
  229.                     'currency' => 'BRL',
  230.                     'grouping' => true,
  231.                     'required' => true,
  232.                     'attr' => ['class' => 'maskMoney'],
  233.                 ])
  234.                 ->add('numeroNota'null, ['label'=>'Nº nota fiscal'])
  235.                 ->add('parcelas'null, ['label'=>'Parcelas''help'=>'*Caso uma conta seja parcelada''attr'=>['type'=>'number''min'=>1'class'=>'parcelas_conta_receber']])
  236.                 ->add('parcela',null, ['label'=>'Parcela atual''help'=>'*Caso seja uma parcela sendo paga''attr'=>['type'=>'number''min'=>1'class'=>'parcela_atual_conta_receber']])
  237.                 ->add('pagoEm'DatePickerType::class,['label'=>'Data do pagamento''required'=>false])
  238.                 ->add('valorPago'MoneyType::class, [
  239.                     'label' => 'Valor pago',
  240.                     'currency' => 'BRL',
  241.                     'grouping' => true,
  242.                     'required' => false,
  243.                     'attr' => ['class' => 'maskMoney'],
  244.                 ])
  245.             ->add('notaFiscalFile'FileType::class, [
  246.                 'constraints' => [new Assert\File([
  247.                     'mimeTypes' => [
  248.                         'application/pdf',
  249.                         'application/x-pdf'
  250.                     ],
  251.                     'mimeTypesMessage' => 'O sistema só aceita arquivos no formato .pdf'
  252.                 ])],
  253.                 'label' => 'Nota Fiscal',
  254.                 'help' => $fileFieldOptionsNotaFiscal['help'],
  255.                 'required' => false,
  256.             ])
  257.             ->add('documentoPagamentoFile'FileType::class, [
  258.                 'constraints' => [new Assert\File([
  259.                     'mimeTypes' => [
  260.                         'application/pdf',
  261.                         'application/x-pdf'
  262.                     ],
  263.                     'mimeTypesMessage' => 'O sistema só aceita arquivos no formato .pdf'
  264.                 ])],
  265.                 'label' => 'Documento para pagamento',
  266.                 'help' => $fileFieldOptionsDocumentoPagamento['help'],
  267.                 'required' => false,
  268.             ])
  269.             ->add('comprovantePagamentoFile'FileType::class, [
  270.                 'constraints' => [new Assert\File([
  271.                     'mimeTypes' => [
  272.                         'application/pdf',
  273.                         'application/x-pdf'
  274.                     ],
  275.                     'mimeTypesMessage' => 'O sistema só aceita arquivos no formato .pdf'
  276.                 ])],
  277.                 'label' => 'Comprovante de pagamento',
  278.                 'help' => $fileFieldOptionsComprovantePagamento['help'],
  279.                 'required' => false,
  280.             ])
  281.             ->end()
  282.                 ->with('Split do total do valor a pgar', ['class' => 'col-md-12'])
  283.                 ->add('splits'CollectionType::class, [
  284.                     'label' => 'Split de valor',
  285.                     'by_reference' => false,
  286.                 ], [
  287.                     'edit' => 'inline',
  288.                     'inline' => 'table'
  289.                 ])
  290.             ->end()
  291.             ;
  292.     }
  293.     protected function configureShowFields(ShowMapper $showMapper): void
  294.     {
  295.         $showMapper
  296.             ->add('id')
  297.             ->add('tipo')
  298.             ->add('fornecedor.nome')
  299.             ->add('colaborador')
  300.             ->add('vencimento')
  301.             ->add('valor'null, ['label'=>'Valor''template'=>'Generic/currency_show.html.twig'])
  302.             ->add('classificacao',null, ['label'=>'Classificação'])
  303.             ->add('numeroNota'null, ['label'=>'Nº nota fiscal'])
  304.             ->add('parcela')
  305.             ->add('pagoEm'null, ['label'=>'Data do pagamento'])
  306.             ->add('valorPago'null, ['label'=>'Valor pago''template'=>'Generic/currency_show_valor_pago.html.twig'])
  307.             ->add('createdAt'null, ['label'=>'Data de cadastro'])
  308.             ->add('updatedAt'null, ['label'=>'Data da última atualização'])
  309.             ;
  310.     }
  311.     public function prePersist($object)
  312.     {
  313.         ini_set('upload_max_filesize''10M');
  314.         $object->setCreatedAt(new \DateTime('now'));
  315.         $object->setUpdatedAt(new \DateTime('now'));
  316.         
  317.         // if(!$this->totalSplitCorreto($object)){
  318.         //     exit('Os valores de split não batem com o valor total');
  319.         // }
  320.         if($object->getNotaFiscalFile()){
  321.             $this->manageFilesUploadPdfNotaFiscal($object);
  322.         }
  323.         if($object->getComprovantePagamentoFile()){
  324.             $this->manageFilesUploadPdfComprovante($object);
  325.         }
  326.         if($object->getDocumentoPagamentoFile()){
  327.             $this->manageFilesUploadPdfDocumentoPagamento($object);
  328.         }
  329.         
  330.         // Verifica se é parcelado
  331.         if(!empty($object->getParcelas())){
  332.             $object->setIsParcelado(true);
  333.             $object->setParcela(1);
  334.             
  335.             if(!$object->getIsValorFixo()){
  336.                 $valorParcela $object->getValor()/$object->getParcelas();
  337.                 $valorParcela round($valorParcela,2);
  338.                 $object->setValor($valorParcela);
  339.             }
  340.         }
  341.         
  342.         $object $this->setConntaPagarSplit($object);
  343.         return $object;
  344.     }
  345.     
  346.     public function setConntaPagarSplit($object){
  347.         foreach ($object->getSplits() as $split) {
  348.             $split->setContaPagar($object);
  349.         }
  350.         return $object;
  351.     }
  352.     public function preUpdate($object)
  353.     {
  354.         ini_set('upload_max_filesize''10M');
  355.         $object->setUpdatedAt(new \DateTime('now'));
  356.         if($object->getNotaFiscalFile()){
  357.             $this->manageFilesUploadPdfNotaFiscal($object);
  358.         }
  359.         if($object->getComprovantePagamentoFile()){
  360.             $this->manageFilesUploadPdfComprovante($object);
  361.         }
  362.         if($object->getDocumentoPagamentoFile()){
  363.             $this->manageFilesUploadPdfDocumentoPagamento($object);
  364.         }
  365.         
  366.         $object $this->setConntaPagarSplit($object);
  367.         return $object;
  368.     }
  369.     public function postPersist($object)
  370.     {
  371.         parent::postPersist($object); // TODO: Change the autogenerated stub
  372.         $this->geraFluxoCaixa($object);
  373.         $this->geraParcelas($object);
  374.     }
  375.     public function postUpdate($object)
  376.     {
  377.         /** @var ContaPagar $object */
  378.         parent::postUpdate($object); // TODO: Change the autogenerated stub
  379.         $this->geraFluxoCaixa($object);
  380.     }
  381.     private function geraFluxoCaixa($object) {
  382.         // Criar um fluxo de caixa
  383.         $container $this->getConfigurationPool()->getContainer();
  384.         $em $container->get('doctrine.orm.entity_manager');
  385.         if($object->getPagoEm()) {
  386.             $fluxoCaixaConta $em->getRepository(FluxoCaixa::class)->findOneBy(['contaPagar'=>$object]);
  387.             if(!$fluxoCaixaConta instanceof FluxoCaixa){
  388.                 $fluxoCaixa = (new FluxoCaixa())
  389.                     ->setContaPagar($object)
  390.                     ->setTipo('CONTA PAGAR')
  391.                     ->setDataExtrato($object->getPagoEm());
  392.                 $em->persist($fluxoCaixa);
  393.                 $em->flush();
  394.             }
  395.         }
  396.     }
  397.     
  398.     public function validate(ErrorElement $errorElement$object)
  399.     {
  400.         if(!$this->totalSplitCorreto($object)){
  401.             $errorElement->with('splits')->addViolation('Os valores de split não batem com o valor total');
  402.         }
  403.     }
  404.     public function postRemove($object)
  405.     {
  406.         parent::postRemove($object); // TODO: Change the autogenerated stub
  407.         if($object->getNotaFiscalFile()){
  408.             if (file_exists($object->getNotaFiscalFile())) {
  409.                 @unlink($object->getNotaFiscal());
  410.             }
  411.         }
  412.         if($object->getComprovantePagamentoFile()){
  413.             if (file_exists($object->getComprovantePagamentoFile())) {
  414.                 @unlink($object->getComprovantePagamento());
  415.             }
  416.         }
  417.         if($object->getDocumentoPagamentoFile()){
  418.             if (file_exists($object->getDocumentoPagamentoFile())) {
  419.                 @unlink($object->getDocumentoPagamentoFile());
  420.             }
  421.         }
  422.     }
  423.     /**
  424.      * @param ContaPagar $obj
  425.      * @return ContaPagar
  426.      */
  427.     private function manageFilesUploadPdfNotaFiscal($obj)
  428.     {
  429.         $file $obj->getNotaFiscalFile();
  430.         $nameFile $filename md5(date('Y-m-d H:i:s:u')).".".$file->getClientOriginalExtension();
  431.         $uploadPath "uploads/notas-fiscais-contas-pagar";
  432.         $file->move($uploadPath$nameFile);
  433.         $obj->setNotaFiscalOriginal($uploadPath "/" $filename);
  434.         $obj->setNotaFiscal($uploadPath "/" $filename);
  435.     }
  436.     /**
  437.      * @param ContaPagar $obj
  438.      * @return ContaPagar
  439.      */
  440.     private function manageFilesUploadPdfComprovante($obj)
  441.     {
  442.         $file $obj->getComprovantePagamentoFile();
  443.         $nameFile $filename md5(date('Y-m-d H:i:s:u')).".".$file->getClientOriginalExtension();
  444.         $uploadPath "uploads/comprovantes-contas-pagar";
  445.         $file->move($uploadPath$nameFile);
  446.         $obj->setComprovantePagamento($uploadPath "/" $filename);
  447.         $obj->setComprovantePagamentoOriginal($uploadPath "/" $filename);
  448.     }
  449.     /**
  450.      * @param ContaPagar $obj
  451.      * @return ContaPagar
  452.      */
  453.     private function manageFilesUploadPdfDocumentoPagamento($obj)
  454.     {
  455.         $file $obj->getDocumentoPagamentoFile();
  456.         $nameFile $filename md5(date('Y-m-d H:i:s:u')).".".$file->getClientOriginalExtension();
  457.         $uploadPath "uploads/documento-pagamento-contas-pagar";
  458.         $file->move($uploadPath$nameFile);
  459.         $obj->setDocumentoPagamento($uploadPath "/" $filename);
  460.         $obj->setDocumentoPagamentoOriginal($uploadPath "/" $filename);
  461.     }
  462.     
  463.     private function totalSplitCorreto($contaPagar) {
  464.         
  465.         // if(count($contaPagar->getSplits())==0){
  466.         //     return true;
  467.         // }
  468.         
  469.         // $totalSplit = 0;
  470.         // foreach ($contaPagar->getSplits() as $split) {
  471.         //     $totalSplit += $split->getValor();
  472.         // }
  473.         
  474.         // $valorOriginal = floatval($contaPagar->getValor());
  475.         // $totalSplit = floatval($totalSplit);
  476.         
  477.         // var_dump($valorOriginal);
  478.         // echo '<br/>';
  479.         // var_dump($totalSplit);
  480.         // echo '<br/>';
  481.         
  482.         // echo 'TOTAL: ' . $valorOriginal . '<br/>';
  483.         // echo 'TOTAL SPLIT: ' . $totalSplit . '<br/>';
  484.         // if($valorOriginal==$totalSplit){
  485.         //     exit('BATEU!');
  486.         //     return true;
  487.         // }
  488.         
  489.         // exit('OK');
  490.         // return false;
  491.         
  492.         return true;
  493.     }
  494.     
  495.     private function geraParcelas($contaPagar) {
  496.         $container $this->getConfigurationPool()->getContainer();
  497.         $em $container->get('doctrine.orm.entity_manager');
  498.         if($contaPagar instanceof ContaPagar){
  499.         
  500.             for($i=1;$i<$contaPagar->getParcelas();$i++){
  501.                 $parcela $i+1;
  502.                 $contaPagarNew = clone $contaPagar;
  503.                 // próxima parcela
  504.                 $dataVencimento $contaPagarNew->getVencimento()->format('Y-m-d');
  505.                 $proximoMes date('Y-m-d'strtotime('+'.$i.' month'strtotime(date($dataVencimento))));
  506.                 $dateDiaUtil $this->proximoDiaUtil($proximoMes);
  507.                 $date = \DateTime::createFromFormat('Y-m-d'$dateDiaUtil);
  508.                 $contaPagarNew->setVencimento($date);
  509.                 $contaPagarNew->setParcela($parcela);
  510.                 
  511.                 $em->persist($contaPagarNew);
  512.                 $em->flush();
  513.             }
  514.         }
  515.     }
  516.     private function proximoDiaUtil($data$saida 'Y-m-d') {
  517.         // Converte $data em um UNIX TIMESTAMP
  518.         $timestamp strtotime($data);
  519.         // Calcula qual o dia da semana de $data
  520.         // O resultado será um valor numérico:
  521.         // 1 -> Segunda ... 7 -> Domingo
  522.         $dia date('N'$timestamp);
  523.         // Se for sábado (6) ou domingo (7), calcula a próxima segunda-feira
  524.         if ($dia >= 6) {
  525.             $timestamp_final $timestamp + (($dia) * 3600 24);
  526.         } else {
  527.             // Não é sábado nem domingo, mantém a data de entrada
  528.             $timestamp_final $timestamp;
  529.         }
  530.         return date($saida$timestamp_final);
  531.         //echo proximoDiaUtil('2016-09-04');
  532.     }
  533. }