src/Controller/CRUD/OrdemDeServicoCRUDController.php line 1428

Open in your IDE?
  1. <?php
  2. namespace App\Controller\CRUD;
  3. use App\Application\Sonata\UserBundle\Entity\User;
  4. use App\Entity\ArquivoResultado;
  5. use App\Entity\BoletimMedicao;
  6. use App\Entity\ContaPagar;
  7. use App\Entity\ContaReceber;
  8. use App\Entity\Empresa;
  9. use App\Entity\ArquivoOs;
  10. use App\Entity\Concretagem;
  11. use App\Entity\CorpoProvaConcreto;
  12. use App\Entity\OrdemDeServico;
  13. use App\Entity\PropostaComercial;
  14. use App\Entity\ResultadoMensalProdutor;
  15. use App\Entity\ServicoPropostaComercial;
  16. use App\Entity\ServicoBoletimMedicao;
  17. use App\Enums\StatusBoletimEnum;
  18. use App\Repository\OrdemDeServicoRepository;
  19. use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse;
  20. use Knp\Snappy\Pdf;
  21. use Sonata\AdminBundle\Controller\CRUDController;
  22. use Symfony\Component\HttpFoundation\RedirectResponse;
  23. use Symfony\Component\HttpFoundation\Request;
  24. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  25. use Symfony\Component\Validator\Validator\ValidatorInterface;
  26. use Symfony\Component\HttpFoundation\Response;
  27. use Symfony\Component\Security\Core\Security;
  28. /**
  29.  * Class OrdemDeServicoCRUDController
  30.  * @package App\Controller\Admin
  31.  */
  32. class OrdemDeServicoCRUDController extends CRUDController
  33. {
  34.     /**
  35.      * @var ValidatorInterface
  36.      */
  37.     private $validator;
  38.     /**
  39.      * @var Pdf
  40.      */
  41.     private $snappyPDF;
  42.     private $os;
  43.     
  44.     /**
  45.      * @var Security
  46.      */
  47.     private $security;
  48.     public function __construct(ValidatorInterface $validatorPdf $snappyPDFSecurity $security)
  49.     {
  50.         $this->validator $validator;
  51.         $this->snappyPDF $snappyPDF;
  52.         $this->security $security;
  53.     }
  54.      /**
  55.      * Relatório de quais os equipamentos estão fora do almoxarifado
  56.      */
  57.     public function equipamentosForaAlmoxarifadoAction() {
  58.         $em $this->getDoctrine()->getManager();
  59.         $equipamentos $em->getRepository('App:Equipamento')->findAll();
  60.         $saidaItemRepo $em->getRepository('App:SaidaItemAlmoxarifado');
  61.         $relatorio = [];
  62.         foreach ($equipamentos as $equipamento) {
  63.             $itens $saidaItemRepo->findItensEmSaidaPorEquipamento($equipamento);
  64.             foreach ($itens as $item) {
  65.                 $saida $item->getSaida();
  66.                 $motivo $saida->getMotivo();
  67.                 $os $saida->getOs();
  68.                 $osNumero $os $os->getProposta()->getNumeroFormatado() : '';
  69.                 $relatorio[] = [
  70.                     'codigo' => $equipamento->getCodigo(),
  71.                     'titulo' => $equipamento->getTitulo(),
  72.                     'marca' => $equipamento->getMarca(),
  73.                     'modelo' => $equipamento->getModelo(),
  74.                     'quantidade' => $item->getQuantidadeSolicitada(),
  75.                     'motivo' => $motivo,
  76.                     'os' => $osNumero,
  77.                 ];
  78.             }
  79.         }
  80.         return $this->render('Equipamento/relatorio.html.twig', [
  81.             'relatorio' => $relatorio
  82.         ]);
  83.     }
  84.     
  85.     /**
  86.      * Delete action with custom validation and error page
  87.      */
  88.     public function deleteAction($id)
  89.     {
  90.         $request $this->getRequest();
  91.         $id $request->get($this->admin->getIdParameter());
  92.         $object $this->admin->getObject($id);
  93.         if (!$object) {
  94.             throw $this->createNotFoundException(sprintf('unable to find the object with id: %s'$id));
  95.         }
  96.         $this->admin->checkAccess('delete'$object);
  97.         $preResponse $this->preDelete($request$object);
  98.         if ($preResponse !== null) {
  99.             return $preResponse;
  100.         }
  101.         if ($this->getRestMethod() === 'DELETE') {
  102.             try {
  103.                 // Verificar dependências antes de deletar
  104.                 $this->checkDeleteDependencies($object);
  105.                 
  106.                 $this->admin->delete($object);
  107.                 if ($this->isXmlHttpRequest()) {
  108.                     return $this->renderJson(['result' => 'ok'], 200, []);
  109.                 }
  110.                 $this->addFlash(
  111.                     'sonata_flash_success',
  112.                     $this->trans(
  113.                         'flash_delete_success',
  114.                         ['%name%' => $this->escapeHtml($this->admin->toString($object))],
  115.                         'SonataAdminBundle'
  116.                     )
  117.                 );
  118.             } catch (\RuntimeException $e) {
  119.                 // Renderizar página de erro customizada
  120.                 return $this->render('OrdemDeServico/delete_error.html.twig', [
  121.                     'error_message' => $e->getMessage(),
  122.                     'object' => $object,
  123.                     'admin' => $this->admin,
  124.                     'base_template' => $this->getBaseTemplate(),
  125.                 ]);
  126.             }
  127.             return $this->redirectTo($object);
  128.         }
  129.         return $this->renderWithExtraParams('CRUD/delete.html.twig', [
  130.             'object' => $object,
  131.             'action' => 'delete',
  132.             'csrf_token' => $this->getCsrfToken('sonata.delete'),
  133.         ], null);
  134.     }
  135.     /**
  136.      * Check if the OS has dependencies that prevent deletion
  137.      */
  138.     private function checkDeleteDependencies(OrdemDeServico $os)
  139.     {
  140.         $em $this->getDoctrine()->getManager();
  141.         
  142.         // Verificar contas a pagar
  143.         $contasPagar $em->getRepository('App\Entity\ContaPagar')->findBy(['os' => $os]);
  144.         if (!empty($contasPagar)) {
  145.             throw new \RuntimeException(
  146.                 'Não é possível excluir esta Ordem de Serviço. ' .
  147.                 'Existem ' count($contasPagar) . ' conta(s) a pagar vinculada(s). ' .
  148.                 'Exclua primeiro todas as contas a pagar relacionadas.'
  149.             );
  150.         }
  151.         // Verificar contas a receber através dos boletins
  152.         $boletins $em->getRepository('App\Entity\BoletimMedicao')->findBy(['os' => $os]);
  153.         if (!empty($boletins)) {
  154.             $contasReceber = [];
  155.             foreach ($boletins as $boletim) {
  156.                 $contasBoletim $em->getRepository('App\Entity\ContaReceber')->findBy(['boletimMedicao' => $boletim]);
  157.                 $contasReceber array_merge($contasReceber$contasBoletim);
  158.             }
  159.             
  160.             if (!empty($contasReceber)) {
  161.                 throw new \RuntimeException(
  162.                     'Não é possível excluir esta Ordem de Serviço. ' .
  163.                     'Existem ' count($contasReceber) . ' conta(s) a receber vinculada(s) através dos boletins de medição. ' .
  164.                     'Exclua primeiro todas as contas a receber e boletins relacionados.'
  165.                 );
  166.             }
  167.         }
  168.     }
  169.     
  170.     public function addConcretagemAction(Request $request) {
  171.     
  172.         /** @var User $user */
  173.         $user $this->container
  174.             ->get('security.token_storage')
  175.             ->getToken()
  176.             ->getUser();
  177.         
  178.         if(!$user instanceof User){
  179.             header("Location: /login");
  180.             die();
  181.         }
  182.         
  183.         $data json_decode($request->getContent(), false);
  184.         
  185.         $os $this->getDoctrine()->getRepository(OrdemDeServico::class)->find($data->os);
  186.         if(!$os instanceof OrdemDeServico) {
  187.             throw new NotFoundHttpException(sprintf('OS não localizado com o id: %s'$data->os));
  188.         }
  189.         
  190.         $data $data->concretagem;
  191.         
  192.         $concretagem = (new Concretagem())
  193.             ->setCreatedAt(new \DateTime('now'))
  194.             ->setOs($os)
  195.             ->setColaborador($user)
  196.             ->setNotaFiscal($data->notaFiscal)
  197.             ->setVolume($data->volume)
  198.             ->setConcreteira($data->concreteira)
  199.             ->setFck($data->fck)
  200.             ->setSlumpInicial($data->slumpInicial)
  201.             ->setSlumpFinal($data->slumpFinal)
  202.             ->setAplicacao($data->aplicacao);
  203.             
  204.             if($data->observacao != ''){
  205.                 $concretagem->setObservacao($data->observacao);
  206.             }
  207.         foreach ($data->moldes as $molde) {
  208.             $dataParaRomper = new \DateTime('now');
  209.             $dataParaRomper->modify('+'.$molde->diasRompimento.' day');
  210.             
  211.             $moldeIdentificao $this->getDoctrine()->getRepository(CorpoProvaConcreto::class)->findOneBy(['codigo'=>$molde->identificado]);
  212.             if($moldeIdentificao instanceof CorpoProvaConcreto){
  213.                 return $this->responseError($headersResponse::HTTP_NO_CONTENT"O molde identificado pelo código: " $molde->identificado " já foi cadastrado na plataforma");
  214.             }
  215.             $molde = (new CorpoProvaConcreto())
  216.                 ->setCodigo($molde->codigo)
  217.                 ->setDiasRompimento($molde->prazoRuptura)
  218.                 ->setDataRompimento($dataParaRomper)
  219.                 ->setObservacao($molde->observacao)
  220.                 ->setTipo('molde')
  221.                 ;
  222.             
  223.             $concretagem->addMolde($molde);
  224.         }
  225.         
  226.         // Edita a data do relatorio
  227.         $dataRelatorio $this->getDataDoRelatorio($concretagem->getMoldes());
  228.         $concretagem->setDataRelatorio($dataRelatorio);
  229.         // Edita a data do relatorio
  230.         $this->getDoctrine()->getManager()->persist($concretagem);
  231.         $this->getDoctrine()->getManager()->flush();
  232.         $os->addConcretagem($concretagem);
  233.         $this->getDoctrine()->getManager()->flush();
  234.         
  235.         exit('OK');
  236.         
  237.     }
  238.     
  239.     public function salvarpesquisaAction(Request $request) {
  240.         $data json_decode($request->getContent(), false);
  241.         $os $this->getDoctrine()->getRepository(OrdemDeServico::class)->find($data->os);
  242.         if(!$os instanceof OrdemDeServico) {
  243.             throw new NotFoundHttpException(sprintf('OS não localizado com o id: %s'$data->os));
  244.         }
  245.         
  246.         if(!$data->load){
  247.             
  248.             $os->setPerguntaUmSatisfacao($data->pergunta1);
  249.             $os->setPeruntaDoisSatisfacao($data->pergunta2);
  250.             $os->setPerguntaTresSatisfacao($data->pergunta3);
  251.             $os->setPeruntaQuatroSatisfacao($data->pergunta4);
  252.             $os->setPerguntaCincoSatisfacao($data->pergunta5);
  253.             
  254.             $this->getDoctrine()->getManager()->flush();
  255.             
  256.         }
  257.         
  258.         return new Response(
  259.             json_encode([
  260.                 'p1' => $os->getPerguntaUmSatisfacao(),
  261.                 'p2' => $os->getPeruntaDoisSatisfacao(),
  262.                 'p3' => $os->getPerguntaTresSatisfacao(),
  263.                 'p4' => $os->getPeruntaQuatroSatisfacao(),
  264.                 'p5' => $os->getPerguntaCincoSatisfacao()
  265.             ]),
  266.             Response::HTTP_OK,
  267.             ['Content-type' => 'application/json']
  268.         ); 
  269.                
  270.     }
  271.     
  272.     public function alterastatusAction(Request $request) {
  273.         $idOs $request->get('idOs');
  274.         $os $this->getDoctrine()->getRepository(OrdemDeServico::class)->find($idOs);
  275.         if(!$os instanceof OrdemDeServico) {
  276.             throw new NotFoundHttpException(sprintf('OS não localizado com o id: %s'$idOs));
  277.         }
  278.         
  279.         $os->setStatus($request->get('status'));
  280.         $this->getDoctrine()->getManager()->flush();
  281.         
  282.         exit('OK');        
  283.     }
  284.     
  285.     
  286.     public function salvaordemitemAction(Request $request) {
  287.         $data json_decode($request->getContent(), false);
  288.         
  289.         /** @var User $user */
  290.         $user $this->container
  291.             ->get('security.token_storage')
  292.             ->getToken()
  293.             ->getUser();
  294.             
  295.         if(!$user instanceof User){
  296.             throw new NotFoundHttpException('Usuário não autorizado');
  297.             die();
  298.         }
  299.             
  300.         $os $this->getDoctrine()->getRepository(OrdemDeServico::class)->find($data->os);
  301.         if(!$os instanceof OrdemDeServico) {
  302.             throw new NotFoundHttpException(sprintf('OS não localizado com o id: %s'$data->os));
  303.         }
  304.         
  305.         if($data->item=='status'){
  306.             $os->setStatus($data->valor);
  307.         } else {
  308.             $valor = \DateTime::createFromFormat('Y-m-d'$data->valor);
  309.         
  310.             if($data->item=='dataFinalPrevista'){
  311.                 $os->setPrevisaoEntrega($valor);
  312.             } else if($data->item=='dataConclusao') {
  313.                 $os->setFinalizadaEm($valor);
  314.             }
  315.         }
  316.         
  317.         $this->getDoctrine()->getManager()->flush();
  318.         
  319.         return new Response(
  320.             json_encode([]),
  321.             Response::HTTP_OK,
  322.             ['Content-type' => 'application/json']
  323.         );
  324.     }
  325.     
  326.     public function salvaordemAction(Request $request) {
  327.         $data json_decode($request->getContent(), false);
  328.         
  329.         /** @var User $user */
  330.         $user $this->container
  331.             ->get('security.token_storage')
  332.             ->getToken()
  333.             ->getUser();
  334.             
  335.         if(!$user instanceof User){
  336.             throw new NotFoundHttpException('Usuário não autorizado');
  337.             die();
  338.         }
  339.             
  340.         $molde $this->getDoctrine()->getRepository(Concretagem::class)->find($data->id);
  341.         if(!$molde instanceof Concretagem) {
  342.             throw new NotFoundHttpException(sprintf('Molde não localizado com o id: %s'$data->id));
  343.         }
  344.         
  345.         $molde->setOrdemRelatorio($data->ordem);
  346.         $this->getDoctrine()->getManager()->flush();
  347.         
  348.         return new Response(
  349.             json_encode([]),
  350.             Response::HTTP_OK,
  351.             ['Content-type' => 'application/json']
  352.         );
  353.     }
  354.     
  355.     public function putamostraAction(Request $request) {
  356.         $data json_decode($request->getContent(), false);
  357.     
  358.         /** @var User $user */
  359.         $user $this->container
  360.             ->get('security.token_storage')
  361.             ->getToken()
  362.             ->getUser();
  363.             
  364.             if(!$user instanceof User){
  365.                 header("Location: /login");
  366.                 die();
  367.             }
  368.             
  369.             $molde $this->getDoctrine()->getRepository(Concretagem::class)->find($data->id);
  370.            
  371.             if(!$molde instanceof Concretagem) {
  372.                 throw new NotFoundHttpException(sprintf('Molde não localizado com o id: %s'$data->id));
  373.             }
  374.              
  375.             $molde->setAplicacao($data->aplicacao);
  376.             $molde->setNotaFiscal($data->notaFiscal);
  377.             $molde->setVolume($data->volume);
  378.             $molde->setFck($data->fck);
  379.             $molde->setConcreteira($data->concreteira);
  380.             $molde->setSlumpInicial($data->slumpInicial);
  381.             $molde->setSlumpFinal($data->slumpFinal);
  382.             $molde->setObservacao($data->observacao);
  383.             $dateEmissao = \DateTime::createFromFormat('Y-m-d'$data->dataEmissao);
  384.             if($dateEmissao instanceof \DateTime){
  385.                 $molde->setCreatedAt($dateEmissao);
  386.             }
  387.             
  388.             $this->getDoctrine()->getManager()->flush();
  389.             
  390.             foreach($data->moldes as $moldeItem){
  391.                 
  392.                 $cp $this->getDoctrine()->getRepository(CorpoProvaConcreto::class)->find($moldeItem->id);
  393.                 if($cp instanceof CorpoProvaConcreto) {
  394.                     $cp->setTipo($moldeItem->tipo);
  395.                     $cp->setValorRompimento($moldeItem->valorRompimento);
  396.                     $cp->setDiasRompimento($moldeItem->prazoRuptura);
  397.                     
  398.                     $cp->setValorRompimento($moldeItem->valorRompimento);
  399.                     
  400.                     $dataRuptura = \DateTime::createFromFormat('d/m/Y'$moldeItem->dataRompimento);
  401.                     if($dataRuptura instanceof \DateTime){
  402.                         $cp->setDataRompimento($dataRuptura);
  403.                     }
  404.                 
  405.                     $cp->setCodigo($moldeItem->codigo);
  406.                     
  407.                     $this->getDoctrine()->getManager()->flush();
  408.                 }
  409.             
  410.             }
  411.             
  412.             return new Response(
  413.                 json_encode([]),
  414.                 Response::HTTP_OK,
  415.                 ['Content-type' => 'application/json']
  416.             );
  417.         
  418.     }
  419.     
  420.     public function getamostraAction(Request $request) {
  421.         
  422.         /** @var User $user */
  423.         $user $this->container
  424.             ->get('security.token_storage')
  425.             ->getToken()
  426.             ->getUser();
  427.             
  428.             if(!$user instanceof User){
  429.                 header("Location: /login");
  430.                 die();
  431.             }
  432.             
  433.             $id $request->get('id');
  434.             
  435.             $repo $this->getDoctrine()->getRepository(Concretagem::class);
  436.     
  437.             $molde $repo->find($id);
  438.             if(!$molde instanceof Concretagem) {
  439.                 throw new NotFoundHttpException(sprintf('Molde não localizado com o id: %s'$id));
  440.             }
  441.             
  442.             $moldes = [];
  443.             foreach($molde->getMoldes() as $moldeItem){
  444.                 
  445.                 $moldes[] = [
  446.                     'id'=>$moldeItem->getId(),
  447.                     'codigo'=>$moldeItem->getCodigo(),
  448.                     'valorRompimento'=>$moldeItem->getValorRompimento(),
  449.                     'tipo'=>$moldeItem->getTipo(), 
  450.                     'dataRompimento'=>$moldeItem->getDataRompimento()->format('d/m/Y'),
  451.                     'prazoRuptura' => $moldeItem->getDiasRompimento(),
  452.                     'observacao' => ($moldeItem->getObservacao()) ? $moldeItem->getObservacao() : 'sem observação'
  453.                     ];
  454.             }
  455.             
  456.             $dados = [
  457.                 'id' => $molde->getId(),
  458.                 'aplicacao' => $molde->getAplicacao(),
  459.                 'notaFiscal' => $molde->getNotaFiscal(),
  460.                 'volume' => $molde->getVolume(),
  461.                 'fck' => $molde->getFck(),
  462.                 'concreteira' => $molde->getConcreteira(),
  463.                 'slumpInicial' => $molde->getSlumpInicial(),
  464.                 'slumpFinal' => $molde->getSlumpFinal(),
  465.                 'moldes' => $moldes,
  466.                 'observacao' => $molde->getObservacao(),
  467.                 'dataEmissao' => $molde->getCreatedAt()->format('Y-m-d')
  468.             ];
  469.             
  470.             return new Response(
  471.                 json_encode($dados),
  472.                 Response::HTTP_OK,
  473.                 ['Content-type' => 'application/json']
  474.             );
  475.                 
  476.             
  477.     }
  478.     
  479.     
  480.     public function acompanhamentoMoldagemAction() {
  481.         
  482.         // Somente para usuários LTEC-GOIANIA
  483.         
  484.         /** @var User $user */
  485.         $user $this->container
  486.             ->get('security.token_storage')
  487.             ->getToken()
  488.             ->getUser();
  489.             
  490.             if(!$user instanceof User){
  491.                 header("Location: /login");
  492.                 die();
  493.             }
  494.             
  495.             if(
  496.                 $user->getEmail()=='suporte@logics.com.br' || 
  497.                 $user->getEmail()=='Mateus.ctgoiania@ltecti.eng.br' ||
  498.                 $user->getEmail()=='solosengenharia@gmail.com' ||
  499.                 $user->getEmail()=='paulo@ltec.eng.br'
  500.                 )
  501.             {
  502.                 
  503.                 $ossData = [];
  504.                 // Todas as os
  505.                 $empresa $this->getDoctrine()->getRepository(Empresa::class)->find(6);
  506.                 $oss $this->getDoctrine()->getRepository(OrdemDeServico::class)->findBy(['franquia'=>$empresa],['id'=>'desc'],20);
  507.                 
  508.                 foreach ( $oss as $os ){
  509.                    
  510.                    $moldagensData = [];
  511.                    
  512.                    $moldagens $this->getDoctrine()->getRepository(Concretagem::class)->findBy(['os'=>$os],['id'=>'desc']);
  513.                    foreach ( $moldagens as $moldagem ){
  514.                        
  515.                        $cpsData = [];
  516.                        $cps $this->getDoctrine()->getRepository(CorpoProvaConcreto::class)->findBy(['concretagem'=>$moldagem],['id'=>'desc']);
  517.                        
  518.                        foreach ( $cps as $cp ){
  519.                            $cpsData[] = ['codigo'=>$cp->getCodigo(),'dias'=>$cp->getDiasRompimento(),'data'=>$cp->getDataRompimento()->format('d/m/Y'), 'ruptura'=>$cp->getValorRompimento()];
  520.                        }
  521.                        
  522.                        $moldagensData[] = [
  523.                           'data'=> $moldagem->getCreatedAt()->format('d/m/Y H:i:s'),
  524.                           'nf'=> $moldagem->getNotaFiscal(),
  525.                           'concreteira' => $moldagem->getConcreteira(),
  526.                           'volume' => $moldagem->getVolume(),
  527.                           'fck' => $moldagem->getFck(),
  528.                           'slumpInicial' => $moldagem->getSlumpInicial(),
  529.                           'slumpFinal' => $moldagem->getSlumpFinal(),
  530.                           'aplicacao' => $moldagem->getAplicacao(),
  531.                           'modaldor' => $moldagem->getColaborador()->getNome(),
  532.                           'cps' => $cpsData
  533.                         ];
  534.                         
  535.                    }
  536.                    
  537.                    $ossData[] = ['os'=>$os->getObservacoes(),'moldagens'=>$moldagensData];
  538.                     
  539.                 }
  540.                 
  541.                 return $this->render('Os/acompanhamento_moldagem.html.twig',[
  542.                     'oss' => $ossData
  543.                 ]);
  544.                 
  545.             }
  546.             
  547.             exit('');
  548.         
  549.     }
  550.     
  551.     public function relatoriosCpsAction(Request $request) {
  552.         
  553.         $idOs $request->get('id');
  554.         
  555.         /** @var OrdemDeServicoRepository $osRepo */
  556.         $osRepo $this->getDoctrine()->getRepository(OrdemDeServico::class);
  557.         $os $osRepo->find($idOs);
  558.         if(!$os instanceof OrdemDeServico) {
  559.             throw new NotFoundHttpException(sprintf('OS não localizada com o id: %s'$idOs));
  560.         }
  561.         
  562.         $dataInicial = \DateTime::createFromFormat('Y-m-d'$request->get('start'));
  563.         $dataFinal = \DateTime::createFromFormat('Y-m-d'$request->get('end'));
  564.         $moldesDaOs $this->getDoctrine()->getRepository(Concretagem::class)->findByOsEIntervalo($os,$dataInicial,$dataFinal);
  565.         $relatorios = [];
  566.         
  567.         foreach ($moldesDaOs as $molde) {
  568.             
  569.                 //if(!$molde->getDataRelatorio() instanceof \DateTime){
  570.                     // Edita a data do relatorio
  571.                     $dataRelatorio $this->getDataDoRelatorio($molde->getMoldes());
  572.                     $molde->setDataRelatorio($dataRelatorio);
  573.                     $this->getDoctrine()->getManager()->flush();
  574.                 //}
  575.             
  576.                 $repo $this->getDoctrine()->getRepository(Concretagem::class);
  577.                 $id $molde->getId();
  578.                 $molde $repo->find($id);
  579.                 if(!$molde instanceof Concretagem) {
  580.                     throw new NotFoundHttpException(sprintf('Molde não localizado com o id: %s'$id));
  581.                 }
  582.                 
  583.                 // Criar um array de cps agrupados por prova e contraprova
  584.                 
  585.                 $linhasCP = [];
  586.                 
  587.                 
  588.                 $diasTestados = [];
  589.                 foreach($molde->getMoldes() as $moldeItem){
  590.                     if($moldeItem->getValorRompimento()>0){
  591.                         // Busca se já tem alguem com o mesmo dia
  592.                         $key 'dias_'.$moldeItem->getDiasRompimento();
  593.                         
  594.                         if(array_key_exists($key,$linhasCP)) {
  595.                             $linhasCP[$key][] = $moldeItem;
  596.                         } else {
  597.                             $diasTestados[] = $moldeItem->getDiasRompimento();
  598.                             $linhasCP[$key] = [$moldeItem];
  599.                         }
  600.                     }
  601.                 }
  602.                 
  603.                 asort($diasTestados);
  604.                 
  605.                 $maiorValorCP 0;
  606.                 foreach($molde->getMoldes() as $moldeItem){
  607.                     if($moldeItem->getValorRompimento()>$maiorValorCP){
  608.                         $maiorValorCP $moldeItem->getValorRompimento();
  609.                     }
  610.                 }
  611.                 
  612.                 $valores = [];
  613.                 
  614.                 foreach($diasTestados as $diaTestado){
  615.                     $valores[$diaTestado] = 0;
  616.                 }
  617.                 
  618.                 foreach($linhasCP as $linha){
  619.                     $valores[$linha[0]->getDiasRompimento()] = $linha[0]->getValorRompimento();
  620.                 }
  621.                 
  622.                 $valores implode($valores,',');
  623.                 $diasTestados implode($diasTestados,'|');
  624.                 $maiorValorCPCalculado 0;
  625.                 
  626.                 
  627.                 $maiorValorCPCalculado = (($maiorValorCP*1000)/78.54)/10;
  628.          
  629.                 $params = [
  630.                     'molde' => $molde,
  631.                     'moldes' => $linhasCP,
  632.                     'maiorValor' => ceil($maiorValorCP),
  633.                     'maiorValorCalculado' => $maiorValorCPCalculado,
  634.                     'valores' => $valores,
  635.                     'diasTestados' => $diasTestados
  636.                 ];
  637.                 
  638.                 $relatorios[] = $params;
  639.             
  640.         }
  641.         
  642.         
  643.         //exit('Maior Valor: ' . ceil($maiorValorCP));
  644.         
  645.         
  646.         $html $this->renderView('Os/relatorios_cps.html.twig', ['relatorios'=>$relatorios]);
  647.         return new PdfResponse(
  648.             $this->snappyPDF->getOutputFromHtml($html, [
  649.                 'orientation' => 'Portrait',
  650.                 'encoding' => 'utf-8',
  651.                 //'header-html' => $headerHtml,
  652.                 'header-spacing' => 0,
  653.                 //'footer-right' => 'Pagina [page]/[toPage]',
  654.                 //'footer-html' => $footerHtml,
  655.                 //'footer-font-size' => '9',
  656.                 //'footer-spacing' => 4,
  657.                 'margin-top' => '10mm'// Para aparecer o header
  658.                 'margin-bottom' => '5mm'// Para aparecer o footer
  659.             ]),
  660.             'Relatorio-cp-os-'.$id.'.pdf',
  661.             'application/pdf',
  662.             'inline'
  663.         );
  664.         return $this->render('Os/relatorio_cp.html.twig',$params);
  665.     }
  666.     
  667.     public function relatorioCpv2Action(Request $request) {
  668.         
  669.         $id $request->get('id');
  670.         
  671.         $repo $this->getDoctrine()->getRepository(Concretagem::class);
  672.         $molde $repo->find($id);
  673.         if(!$molde instanceof Concretagem) {
  674.             throw new NotFoundHttpException(sprintf('Molde não localizado com o id: %s'$id));
  675.         }
  676.         
  677.         // Criar um array de cps agrupados por prova e contraprova
  678.         
  679.         $linhasCP = [];
  680.         
  681.         /*
  682.         $linhasCP['dia_x'] = [28];
  683.         $linhasCP['dia_x'][] = 29;
  684.         */
  685.         
  686.         /*
  687.         $array['dias_28'] = [28;
  688.         
  689.         if(array_key_exists('dias_28',$array)){
  690.             $array['dias_28'][] = 29;
  691.         }
  692.         
  693.         print_r($array);
  694.         exit;
  695.         */
  696.         
  697.         $diasTestados = [];
  698.         
  699.         //if(!$molde->getDataRelatorio() instanceof \DateTime){
  700.             // Edita a data do relatorio
  701.             $dataRelatorio $this->getDataDoRelatorio($molde->getMoldes());
  702.             $molde->setDataRelatorio($dataRelatorio);
  703.             $this->getDoctrine()->getManager()->flush();
  704.         //}
  705.         
  706.         foreach($molde->getMoldes() as $moldeItem){
  707.             
  708.             if($moldeItem->getValorRompimento()>0){
  709.                 // Busca se já tem alguem com o mesmo dia
  710.                 $key 'dias_'.$moldeItem->getDiasRompimento();
  711.                 
  712.                 if(array_key_exists($key,$linhasCP)){
  713.                     $linhasCP[$key][] = $moldeItem;
  714.                 } else {
  715.                     $diasTestados[] = $moldeItem->getDiasRompimento();
  716.                     $linhasCP[$key] = [$moldeItem];
  717.                 } 
  718.             }
  719.             
  720.         }
  721.         
  722.         asort($diasTestados);
  723.         
  724.         $maiorValorCP 0;
  725.         foreach($molde->getMoldes() as $moldeItem){
  726.             if($moldeItem->getValorRompimento()>$maiorValorCP){
  727.                 $maiorValorCP $moldeItem->getValorRompimento();
  728.             }
  729.         }
  730.         
  731.         $valores = [];
  732.         
  733.         foreach($diasTestados as $diaTestado){
  734.             $valores[$diaTestado] = 0;
  735.         }
  736.         
  737.         foreach($linhasCP as $linha){
  738.             
  739.             $valorRompimento $linha[0]->getValorRompimento();
  740.             if($valorRompimento $linha[1]->getValorRompimento()){
  741.                 $valorRompimento $linha[1]->getValorRompimento();
  742.             }
  743.             
  744.             $valores[$linha[0]->getDiasRompimento()] = $valorRompimento;
  745.         }
  746.         
  747.         $valores implode($valores,',');
  748.         $diasTestados implode($diasTestados,'|');
  749.         $maiorValorCPCalculado 0;
  750.         
  751.         $maiorValorCPCalculado = (($maiorValorCP*1000)/78.54)/10;
  752.         
  753.         $numeroResitro $this->makeNumeroRegistroRelatorioCP($molde);
  754.       
  755.         $params = [
  756.             'numeroRegistro' => $numeroResitro,
  757.             'molde' => $molde,
  758.             'moldes' => $linhasCP,
  759.             'maiorValor' => ceil($maiorValorCP),
  760.             'maiorValorCalculado' => $maiorValorCPCalculado,
  761.             'valores' => $valores,
  762.             'diasTestados' => $diasTestados
  763.         ];
  764.         
  765.         
  766.         //exit('Maior Valor: ' . ceil($maiorValorCP));
  767.         
  768.         
  769.         $html $this->renderView('Os/relatorio_cp_v2.html.twig'$params);
  770.         
  771.         // exit($html);
  772.         return new PdfResponse(
  773.             $this->snappyPDF->getOutputFromHtml($html, [
  774.                 'orientation' => 'Portrait',
  775.                 'encoding' => 'utf-8',
  776.                 //'header-html' => $headerHtml,
  777.                 'header-spacing' => 0,
  778.                 //'footer-right' => 'Pagina [page]/[toPage]',
  779.                 //'footer-html' => $footerHtml,
  780.                 //'footer-font-size' => '9',
  781.                 //'footer-spacing' => 4,
  782.                 'margin-top' => '10mm'// Para aparecer o header
  783.                 'margin-bottom' => '5mm'// Para aparecer o footer
  784.             ]),
  785.             'Relatorio-cp-os-'.$id.'.pdf',
  786.             'application/pdf',
  787.             'inline'
  788.         );
  789.         return $this->render('Os/relatorio_cp_v2.html.twig',$params);
  790.     }
  791.     
  792.     private function getOrderMolde($molde) {
  793.     
  794.         $indexMolde null;
  795.         // Busca todas as concretagens executadas nesta os, na ordem de criacao
  796.         $modoldes_da_mesa_os $this->getDoctrine()->getRepository(Concretagem::class)->findBy(
  797.             ['os'=>$molde->getOs()], 
  798.             ['id' => 'ASC']
  799.         );
  800.         $index 0;
  801.         foreach ($modoldes_da_mesa_os as $modolde_da_mesa_os) {
  802.             $index++;
  803.             if($modolde_da_mesa_os->getId()==$molde->getId()){
  804.                 $indexMolde $index;
  805.             }
  806.         }
  807.     
  808.         if($indexMolde==null){
  809.             throw new NotFoundHttpException(sprintf('Posição do Molde não localizado com o id: %s'$molde->getId()));
  810.         }
  811.         
  812.         return str_pad($indexMolde2"0"STR_PAD_LEFT);
  813.     }
  814.     
  815.     private function makeNumeroRegistroRelatorioCP($molde) {
  816.         // [ano+os+numensaio(532)+ordemrelatorio];
  817.         $anoMoldagem    $molde->getCreatedAt()->format('Y');
  818.         $numeOs         $molde->getOs()->getId();
  819.         $numeroEnsaio   '532';
  820.         $ordemRelatorio $this->getOrderMolde($molde); // Pegar todos os moldes dessa OS e ordenar
  821.         
  822.         //$numero = $anoMoldagem . '-' . $numeOs . '-' . $numeroEnsaio . '-' . $ordemRelatorio;
  823.         $numero $anoMoldagem $numeOs $numeroEnsaio $ordemRelatorio;
  824.         
  825.         return $numero;
  826.         
  827.     }
  828.     
  829.     public function relatorioCpAction(Request $request) {
  830.         
  831.         $id $request->get('id');
  832.         
  833.         $repo $this->getDoctrine()->getRepository(Concretagem::class);
  834.         $molde $repo->find($id);
  835.         if(!$molde instanceof Concretagem) {
  836.             throw new NotFoundHttpException(sprintf('Molde não localizado com o id: %s'$id));
  837.         }
  838.         
  839.         // Criar um array de cps agrupados por prova e contraprova
  840.         
  841.         $linhasCP = [];
  842.         
  843.         /*
  844.         $linhasCP['dia_x'] = [28];
  845.         $linhasCP['dia_x'][] = 29;
  846.         */
  847.         
  848.         /*
  849.         $array['dias_28'] = [28;
  850.         
  851.         if(array_key_exists('dias_28',$array)){
  852.             $array['dias_28'][] = 29;
  853.         }
  854.         
  855.         print_r($array);
  856.         exit;
  857.         */
  858.         
  859.         $diasTestados = [];
  860.         
  861.         //if(!$molde->getDataRelatorio() instanceof \DateTime){
  862.             // Edita a data do relatorio
  863.             $dataRelatorio $this->getDataDoRelatorio($molde->getMoldes());
  864.             $molde->setDataRelatorio($dataRelatorio);
  865.             $this->getDoctrine()->getManager()->flush();
  866.         //}
  867.         
  868.         foreach($molde->getMoldes() as $moldeItem){
  869.             
  870.             if($moldeItem->getValorRompimento()>0){
  871.                 // Busca se já tem alguem com o mesmo dia
  872.                 $key 'dias_'.$moldeItem->getDiasRompimento();
  873.                 
  874.                 if(array_key_exists($key,$linhasCP)){
  875.                     $linhasCP[$key][] = $moldeItem;
  876.                 } else {
  877.                     $diasTestados[] = $moldeItem->getDiasRompimento();
  878.                     $linhasCP[$key] = [$moldeItem];
  879.                 } 
  880.             }
  881.             
  882.         }
  883.         
  884.         asort($diasTestados);
  885.         
  886.         $maiorValorCP 0;
  887.         foreach($molde->getMoldes() as $moldeItem){
  888.             if($moldeItem->getValorRompimento()>$maiorValorCP){
  889.                 $maiorValorCP $moldeItem->getValorRompimento();
  890.             }
  891.         }
  892.         
  893.         $valores = [];
  894.         
  895.         foreach($diasTestados as $diaTestado){
  896.             $valores[$diaTestado] = 0;
  897.         }
  898.         
  899.         foreach($linhasCP as $linha){
  900.             
  901.             $valorRompimento $linha[0]->getValorRompimento();
  902.             if($valorRompimento $linha[1]->getValorRompimento()){
  903.                 $valorRompimento $linha[1]->getValorRompimento();
  904.             }
  905.             
  906.             $valores[$linha[0]->getDiasRompimento()] = $valorRompimento;
  907.         }
  908.         
  909.         $valores implode($valores,',');
  910.         $diasTestados implode($diasTestados,'|');
  911.         $maiorValorCPCalculado 0;
  912.         
  913.         
  914.         $maiorValorCPCalculado = (($maiorValorCP*1000)/78.54)/10;
  915.         $params = [
  916.             'molde' => $molde,
  917.             'moldes' => $linhasCP,
  918.             'maiorValor' => ceil($maiorValorCP),
  919.             'maiorValorCalculado' => $maiorValorCPCalculado,
  920.             'valores' => $valores,
  921.             'diasTestados' => $diasTestados
  922.         ];
  923.         
  924.         
  925.         //exit('Maior Valor: ' . ceil($maiorValorCP));
  926.         
  927.         
  928.         $html $this->renderView('Os/relatorio_cp.html.twig'$params);
  929.         return new PdfResponse(
  930.             $this->snappyPDF->getOutputFromHtml($html, [
  931.                 'orientation' => 'Portrait',
  932.                 'encoding' => 'utf-8',
  933.                 //'header-html' => $headerHtml,
  934.                 'header-spacing' => 0,
  935.                 //'footer-right' => 'Pagina [page]/[toPage]',
  936.                 //'footer-html' => $footerHtml,
  937.                 //'footer-font-size' => '9',
  938.                 //'footer-spacing' => 4,
  939.                 'margin-top' => '10mm'// Para aparecer o header
  940.                 'margin-bottom' => '5mm'// Para aparecer o footer
  941.             ]),
  942.             'Relatorio-cp-os-'.$id.'.pdf',
  943.             'application/pdf',
  944.             'inline'
  945.         );
  946.         return $this->render('Os/relatorio_cp.html.twig',$params);
  947.     }
  948.     
  949.     private function getDataDoRelatorio($moldes) {
  950.         
  951.         // pegar o molde com ruptura mais longe
  952.         $moldeMaisAntigo $moldes[0];
  953.         $maior 0;
  954.         foreach ($moldes as $molde) {
  955.             if($molde->getValorRompimento() > 0){
  956.              if($molde->getDiasRompimento() > $maior){
  957.                 $maior $molde->getDiasRompimento();
  958.                 $moldeMaisAntigo $molde;
  959.                 } 
  960.             }
  961.         }
  962.         
  963.         $dataRelatorio $moldeMaisAntigo->getDataRompimento();
  964.         
  965.         // https://www.ti-enxame.com/pt/php/proximo-dia-util-da-data-indicada-em-php/971164682/
  966.         
  967.         /* Com Feriado
  968.         
  969.         $tmpDate = '2015-06-22';
  970.         $holidays = ['2015-07-04', '2015-10-31', '2015-12-25'];
  971.         $i = 1;
  972.         $nextBusinessDay = date('Y-m-d', strtotime($tmpDate . ' +' . $i . ' Weekday'));
  973.         
  974.         while (in_array($nextBusinessDay, $holidays)) {
  975.             $i++;
  976.             $nextBusinessDay = date('Y-m-d', strtotime($tmpDate . ' +' . $i . ' Weekday'));
  977.         }
  978.         
  979.         */
  980.         
  981.         $proximoDiaUtil date('Y-m-d'strtotime($dataRelatorio->format('Y-m-d') . ' +1 Weekday'));
  982.         $proximoDiaUtil = \DateTime::createFromFormat('Y-m-d'$proximoDiaUtil);
  983.         
  984.         return $proximoDiaUtil;
  985.         
  986.     }
  987.     
  988.     private function array_sort($array$on$order=SORT_ASC)
  989.     {
  990.         $new_array = array();
  991.         $sortable_array = array();
  992.     
  993.         if (count($array) > 0) {
  994.             foreach ($array as $k => $v) {
  995.                 if (is_array($v)) {
  996.                     foreach ($v as $k2 => $v2) {
  997.                         if ($k2 == $on) {
  998.                             $sortable_array[$k] = $v2;
  999.                         }
  1000.                     }
  1001.                 } else {
  1002.                     $sortable_array[$k] = $v;
  1003.                 }
  1004.             }
  1005.     
  1006.             switch ($order) {
  1007.                 case SORT_ASC:
  1008.                     asort($sortable_array);
  1009.                 break;
  1010.                 case SORT_DESC:
  1011.                     arsort($sortable_array);
  1012.                 break;
  1013.             }
  1014.     
  1015.             foreach ($sortable_array as $k => $v) {
  1016.                 $new_array[$k] = $array[$k];
  1017.             }
  1018.         }
  1019.     
  1020.         return $new_array;
  1021.     }
  1022.     public function salvaPercentualServicoAction(Request $request) {
  1023.         $data json_decode($request->getContent(), false);
  1024.         $id         $data->id;
  1025.         $percentual $data->percentual;
  1026.         if(!$id || !$percentual){
  1027.             exit('err1');
  1028.         }
  1029.         // Verificando permissões. Somente quem pode editar uma proposta
  1030.         //if(!$this->security->isGranted('ROLE_ADMIN_STATUS_PROPOSTA_EDIT')){
  1031.         //exit('err');
  1032.         //}
  1033.         /** @var ServicoPropostaComercial $servico */
  1034.         $servico $this->getDoctrine()->getRepository(ServicoPropostaComercial::class)->find($id);
  1035.         if(!$servico instanceof ServicoPropostaComercial){
  1036.             exit('err2');
  1037.         }
  1038.         $servico->setPercentualEntregue($percentual);
  1039.         $this->getDoctrine()->getManager()->flush();
  1040.         exit('OK');
  1041.     }
  1042.     public function cronogramaAction(Request $request) {
  1043.         
  1044.         if(!$this->security->isGranted('ROLE_ADMIN_VIEW_PAINEL_OS')){
  1045.             echo '<script>alert("Página não localizada."); window.close();</script>';
  1046.         }
  1047.         
  1048.         $idOs $request->get('id');
  1049.         /** @var User $user */
  1050.         $user $this->container
  1051.             ->get('security.token_storage')
  1052.             ->getToken()
  1053.             ->getUser();
  1054.         $franquia $user->getFranquia();
  1055.         if(!$franquia instanceof Empresa){
  1056.             exit('Este usuário logado não pertence a nenhuma franquia.');
  1057.         }
  1058.         /** @var OrdemDeServicoRepository $osRepo */
  1059.         $osRepo $this->getDoctrine()->getRepository(OrdemDeServico::class);
  1060.         $os $osRepo->find($idOs);
  1061.         if(!$os instanceof OrdemDeServico) {
  1062.             throw new NotFoundHttpException(sprintf('OS não localizada com o id: %s'$idOs));
  1063.         }
  1064.         $atrasado false;
  1065.         $diasAtraso 0;
  1066.         $dataInicial $os->getCreatedAt();
  1067.         $dataFinalPrevista $os->getPrevisaoEntrega();
  1068.         $dataFinalizacao $os->getFinalizadaEm();
  1069.         $dataAtual = new \DateTime('now');
  1070.         $diasPrevistos 0;
  1071.         $interval 0;
  1072.         if($dataFinalPrevista instanceof \DateTime){
  1073.             
  1074.                 $interval $dataInicial->diff($dataFinalPrevista);
  1075.                 $diasPrevistos $interval->format('%R%a');
  1076.         
  1077.                 $intervalFinal $dataAtual->diff($dataFinalPrevista);
  1078.                 $diasRestantes $intervalFinal->format('%R%a');
  1079.         
  1080.                 $diasTrabalhados $diasPrevistos $diasRestantes;
  1081.         
  1082.                 if($diasTrabalhados >  $diasPrevistos){
  1083.                     $atrasado true;
  1084.                     $diasAtraso $diasTrabalhados $diasPrevistos;
  1085.                 }
  1086.         } else {
  1087.             $dataFinalPrevista = new \DateTime('now');
  1088.         }
  1089.         $percentAtual 0;
  1090.         $emAndamento false;
  1091.         if($dataFinalizacao instanceof \DateTime){
  1092.             $percentAtual 100;
  1093.             $emAndamento false;
  1094.         } else {
  1095.             if($diasPrevistos 0){
  1096.                 $percentAtual = ( $diasTrabalhados 100 ) / $diasPrevistos;
  1097.             }
  1098.             $percentAtual round($percentAtual,2);
  1099.         }
  1100.         if($os->getStatus()=='CONCLUIDA'){
  1101.             $atrasado false;
  1102.             $percentAtual 100;
  1103.             $emAndamento false;
  1104.         }
  1105.         $receitas = [];
  1106.         $despesas = [];
  1107.         $contaReceberRepository $this->getDoctrine()->getRepository(ContaReceber::class);
  1108.         // Pegando receitas de uma OS
  1109.         $receitas $contaReceberRepository->getReceitasDeOs($ostrue);
  1110.         $despesas $this->getDoctrine()->getRepository(ContaPagar::class)->getDespesasDeOs($os);
  1111.         $totalDespesas 0;
  1112.         foreach ($despesas as $despesa){
  1113.             /** @var  ContaPagar $despesa */
  1114.             $totalDespesas $totalDespesas $despesa->getValorPago();
  1115.         }
  1116.         $totalReceitasOs $contaReceberRepository->getReceitasDeOs($os,true);
  1117.         $totalDespesasGerais $osRepo->getValorDespesasGerais($os,$totalReceitasOs,$user->getFranquia());
  1118.         $despesas $totalDespesas $totalDespesasGerais['total'];
  1119.         //$despesas = round($despesas,2);
  1120.         $despesas $this->cutNum($despesas2);
  1121.         
  1122.         $receitas $this->cutNum($receitas,2);
  1123.         $basedir =  $request->getBasePath();
  1124.         
  1125.         $percentuais = [];
  1126.         
  1127.         foreach ($os->getProposta()->getServicos() as $servico){
  1128.             $percentual = ($servico->getPercentualEntregue()!='') ? $servico->getPercentualEntregue() : 0;
  1129.             $percentuais[] = '{id:' $servico->getId() . ', percentual:' $percentual '}';
  1130.         }
  1131.         
  1132.         $percentuais join(',',$percentuais);
  1133.         
  1134.         $relatorioNovo false;
  1135.         
  1136.         $ltecCTAnapolis 5;
  1137.         $ltecCTDF       4;
  1138.         
  1139.         $requestV2 = ($request->get('v2')=='yes') ? true false;
  1140.         
  1141.         if(in_array($franquia->getId(),[$ltecCTAnapolis$ltecCTDF]) || $requestV2){
  1142.             $relatorioNovo true;
  1143.         }
  1144.         
  1145.         $arquivosOS = [];
  1146.         
  1147.         $arquivosEntity $this->getDoctrine()->getRepository(ArquivoOs::class)->findBy(['os'=>$os]);
  1148.         foreach ($arquivosEntity as $arquivoEntity) {
  1149.             $arquivosOS[] = [
  1150.                 'id' => $arquivoEntity->getId(),
  1151.                 'tipo' => $arquivoEntity->getTipo(),
  1152.                 'validaAte' => ($arquivoEntity->getExpiredAt() instanceof \DateTime) ? $arquivoEntity->getExpiredAt()->format('d/m/Y') : 'Não informada',
  1153.                 'link' => '/' $arquivoEntity->getArquivo()
  1154.             ];
  1155.         }
  1156.         $equipamentoUtilizados = [];
  1157.         $devolucoesEquipamentos = [];
  1158.         // Buscar todas as saídas vinculadas a esta OS
  1159.         $em $this->getDoctrine()->getManager();
  1160.         $saidaRepo $em->getRepository('App:SaidaAlmoxarifado');
  1161.         $saidas $saidaRepo->findBy(['os' => $os]);
  1162.         foreach ($saidas as $saida) {
  1163.             $dataSaida $saida->getCreatedAt();
  1164.             foreach ($saida->getItens() as $item) {
  1165.                 $equipamento $item->getEquipamento();
  1166.                 $equipamentoUtilizados[] = [
  1167.                     'dataSaida' => $dataSaida,
  1168.                     'equipamentoNome' => $equipamento $equipamento->getTitulo() : '',
  1169.                     'equipamentoId' => $equipamento $equipamento->getId() : null,
  1170.                     'quantidade' => $item->getQuantidadeSolicitada(),
  1171.                 ];
  1172.             }
  1173.         }
  1174.         // Buscar todas as devoluções vinculadas a esta OS
  1175.         $devolucaoRepo $em->getRepository('App:DevolucaoAlmoxarifado');
  1176.         // Buscar devoluções relacionadas às saídas desta OS
  1177.         foreach ($saidas as $saida) {
  1178.             $devolucoes $devolucaoRepo->findBy(['saida' => $saida]);
  1179.             foreach ($devolucoes as $devolucao) {
  1180.                 $dataDevolucao $devolucao->getCreatedAt();
  1181.                 foreach ($devolucao->getItens() as $item) {
  1182.                     $equipamento $item->getSaidaItem()->getEquipamento();
  1183.                     $devolucoesEquipamentos[] = [
  1184.                         'dataDevolucao' => $dataDevolucao,
  1185.                         'equipamentoNome' => $equipamento $equipamento->getTitulo() : '',
  1186.                         'equipamentoId' => $equipamento $equipamento->getId() : null,
  1187.                         'quantidade' => $item->getQuantidadeDevolvida(),
  1188.                     ];
  1189.                 }
  1190.             }
  1191.         }
  1192.         return $this->render('Os/cronograma.html.twig',[
  1193.             'equipamentoUtilizados' => $equipamentoUtilizados,
  1194.             'devolucoesEquipamentos' => $devolucoesEquipamentos,
  1195.             'receitas' => $receitas,
  1196.             'despesas' => $despesas,
  1197.             'arquivosOs' => $arquivosOS,
  1198.             'os' => $os->getProposta()->getNumeroFormatado(),
  1199.             'osAll' => $os,
  1200.             'cliente' => $os->getProposta()->getCliente(),
  1201.             'dataInicial' => $dataInicial,
  1202.             'dataConclusao' => ($os->getFinalizadaEm() instanceof \DateTime) ? $os->getFinalizadaEm()->format('Y-m-d') : $os->getCreatedAt()->format('Y-m-d'),
  1203.             'dataAtual' => $dataAtual,
  1204.             'dataFinalizacao' => $dataFinalizacao,
  1205.             'dataFinalPrevista' => $dataFinalPrevista,
  1206.             'emAndamento' => $emAndamento,
  1207.             'percentualTotal' => $percentAtual,
  1208.             'atrasado' => $atrasado,
  1209.             'diasAtraso' => $diasAtraso,
  1210.             'basedir' => $basedir,
  1211.             'percentuaisServico' => $percentuais,
  1212.             'isV2' => $relatorioNovo,
  1213.         ]);
  1214.     }
  1215.     
  1216.     private function cutNum($num$precision 2) {
  1217.         $value floor($num) . substr(str_replace(floor($num), ''$num), 0$precision 1) . '.00';
  1218.         $value explode('.',$value);
  1219.         return $value $value[0] . '.' $value[1];
  1220.     }
  1221.     public function centroCustoAction(Request $request) {
  1222.         $idOs $request->get('id');
  1223.         /** @var User $user */
  1224.         $user $this->container
  1225.             ->get('security.token_storage')
  1226.             ->getToken()
  1227.             ->getUser();
  1228.         $franquia $user->getFranquia();
  1229.         if(!$franquia instanceof Empresa){
  1230.             exit('Este usuário logado não pertence a nenhuma franquia.');
  1231.         }
  1232.         /** @var OrdemDeServicoRepository $osRepo */
  1233.         $osRepo $this->getDoctrine()->getRepository(OrdemDeServico::class);
  1234.         $os $osRepo->find($idOs);
  1235.         if(!$os instanceof OrdemDeServico) {
  1236.             throw new NotFoundHttpException(sprintf('OS não localizada com o id: %s'$idOs));
  1237.         }
  1238.         $receitas = [];
  1239.         $despesas = [];
  1240.         $contaReceberRepository $this->getDoctrine()->getRepository(ContaReceber::class);
  1241.         // Pegando receitas de uma OS
  1242.         $receitas $contaReceberRepository->getReceitasDeOs($os);
  1243.         $despesas $this->getDoctrine()->getRepository(ContaPagar::class)->getDespesasDeOs($os);
  1244.         $totalReceitasOs $contaReceberRepository->getReceitasDeOs($os,true);
  1245.         $totalDespesasGerais $osRepo->getValorDespesasGerais($os,$totalReceitasOs,$user->getFranquia());
  1246.         return $this->render('Os/relatorio-custo.html.twig',[
  1247.             'receitas' => $receitas,
  1248.             'despesas' => $despesas,
  1249.             'totalDespesasGerais' => $totalDespesasGerais['total'],
  1250.             'os' => $os->getProposta()->getNumeroFormatado(),
  1251.             'cliente' => $os->getProposta()->getCliente(),
  1252.             'start' => $totalDespesasGerais['start'],
  1253.             'end' => $totalDespesasGerais['end'],
  1254.             'hoje' => new \DateTime('now'),
  1255.             'dias_interrupcao' => $os->getDiasInterrupcoes()
  1256.         ]);
  1257.     }
  1258.     public function addBoletimAction(Request $request) {
  1259.         $idOs $request->get('id');
  1260.         $os $this->getDoctrine()->getRepository(OrdemDeServico::class)->find($idOs);
  1261.         if(!$os instanceof OrdemDeServico) {
  1262.             throw new NotFoundHttpException(sprintf('OS não localizada com o id: %s'$idOs));
  1263.         }
  1264.         // Verificar se esta proposta foi aceita
  1265.         // gerar o numero sequencial
  1266.         $bos $this->getDoctrine()->getRepository(BoletimMedicao::class)->findBy(['os'=>$os]);
  1267.         $numero count($bos) + 1;
  1268.         // Criar um novo boletim
  1269.         $boletim = (new BoletimMedicao())
  1270.             ->setNumero($numero)
  1271.             ->setCobrarART(true)
  1272.             ->setStatus(StatusBoletimEnum::GERADO)
  1273.             ->setOs($os);
  1274.         foreach ($os->getProposta()->getServicos() as $servico){
  1275.             $quantidade = ($servico->getQuantidade()) ? $servico->getQuantidade() : 1;
  1276.             $servicoBoletim = (new ServicoBoletimMedicao())
  1277.                 ->setServico($servico)
  1278.                 ->setProposta($os->getProposta())
  1279.                 ->setBoletim($boletim)
  1280.                 ->setQuantidade($quantidade);
  1281.             $boletim->addServico($servicoBoletim);
  1282.         }
  1283.         $this->getDoctrine()->getManager()->persist($boletim);
  1284.         $this->getDoctrine()->getManager()->flush();
  1285.         $this->addFlash('sonata_flash_success''Boletim gerado com sucesso!');
  1286.         return new RedirectResponse($this->generateUrl('admin_app_boletimmedicao_edit',['id'=>$boletim->getId()]));
  1287.     }
  1288. //    public function novaVersaoOsAction() {
  1289. //        $object = $this->admin->getSubject();
  1290. //        return $this->redirectToRoute('admin_app_propostacomercial_create',['idParaNovaVersao'=>$object->getId()]);
  1291. //    }
  1292. //    protected function preCreate(Request $request, $object)
  1293. //    {
  1294. //        $id = $request->get('idParaNovaVersao');
  1295. //
  1296. //        if(!$id){
  1297. //            return null;
  1298. //        }
  1299. //
  1300. //        /** @var PropostaComercial $object */
  1301. //        /** @var PropostaComercial $objPreenchido */
  1302. //
  1303. //        $objPreenchido = $this->getDoctrine()->getRepository(PropostaComercial::class)->find($id);
  1304. //
  1305. //        $object->setDestinatarioNome($objPreenchido->getDestinatarioNome());
  1306. //        $object->setCliente($objPreenchido->getCliente());
  1307. //        $object->setDestinatarioCargo($objPreenchido->getDestinatarioCargo());
  1308. //        $object->setDestinatarioEmail($objPreenchido->getDestinatarioEmail());
  1309. //        $object->setDestinatarioTelefone($objPreenchido->getDestinatarioTelefone());
  1310. //        $object->setTipo($objPreenchido->getTipo());
  1311. //
  1312. //        return null;
  1313. //    }
  1314.     public function osPdfAction(Request $request) {
  1315.         //$this->admin->checkAccess('novaVersaoProposta');
  1316.         $idOs $request->get('id');
  1317.         $basedir $this->getParameter('kernel.root_dir') . '/../public' $request->getBasePath();
  1318.         $os $this->getDoctrine()->getRepository(OrdemDeServico::class)->find($idOs);
  1319.         if(!$os instanceof OrdemDeServico){
  1320.             throw new NotFoundHttpException(sprintf('OS não localizada com o id: %s'$idOs));
  1321.         }
  1322.         $this->os $os;
  1323.         
  1324.         $dataInicial $os->getCreatedAt();
  1325.         $dataFinalPrevista $os->getPrevisaoEntrega();
  1326.         $dataFinalizacao $os->getFinalizadaEm();
  1327.         $params = [
  1328.             'basedir' => $basedir,
  1329.             'os' => $os,
  1330.             'dataPrevisaoTermino' => ($dataFinalPrevista instanceof \DateTime) ? $dataFinalPrevista->format('d/m/Y') : $os->getCreatedAt()->format('d/m/Y'),
  1331.             'dataConclusao' => ($os->getFinalizadaEm() instanceof \DateTime) ? $os->getFinalizadaEm()->format('d/m/Y') : $os->getCreatedAt()->format('d/m/Y'),
  1332.         ];
  1333.         $headerHtml $this->renderView(
  1334.             'Os/header-os-completa-pdf.html.twig'$params
  1335.         );
  1336.         $footerHtml $this->renderView(
  1337.             'Os/footer.os.html.twig'$params
  1338.         );
  1339.         $html $this->renderView('Os/os-completa-pdf.html.twig'$params);
  1340.         return new PdfResponse(
  1341.             $this->snappyPDF->getOutputFromHtml($html, [
  1342.                 'orientation' => 'Portrait',
  1343.                 'encoding' => 'utf-8',
  1344.                 'header-html' => $headerHtml,
  1345.                 'header-spacing' => 0,
  1346.                 //'footer-right' => 'Pagina [page]/[toPage]',
  1347.                 'footer-html' => $footerHtml,
  1348.                 'footer-font-size' => '9',
  1349.                 'footer-spacing' => 4,
  1350.                 'margin-top' => '40mm'// Para aparecer o header
  1351.                 'margin-bottom' => '30mm'// Para aparecer o footer
  1352.             ]),
  1353.             'Ordem de Servico-'.$os->getId().'.pdf',
  1354.             'application/pdf',
  1355.             'inline'
  1356.         );
  1357.     }
  1358.     public function relatorioDiarioObraPdfAction(Request $request) {
  1359.         //$this->admin->checkAccess('novaVersaoProposta');
  1360.         $idOs $request->get('id');
  1361.         $basedir $this->getParameter('kernel.root_dir') . '/../public' $request->getBasePath();
  1362.         $os $this->getDoctrine()->getRepository(OrdemDeServico::class)->find($idOs);
  1363.         if(!$os instanceof OrdemDeServico){
  1364.             throw new NotFoundHttpException(sprintf('OS não localizada com o id: %s'$idOs));
  1365.         }
  1366.         $this->os $os;
  1367.         $params = [
  1368.             'basedir' => $basedir,
  1369.             'os' => $os,
  1370.         ];
  1371.         $headerHtml $this->renderView(
  1372.             'Os/header-relatorio-diario-obra-completa-pdf.html.twig'$params
  1373.         );
  1374.         $footerHtml $this->renderView(
  1375.             'Os/footer.os.html.twig'$params
  1376.         );
  1377.         $html $this->renderView('Os/relatorio-diario-obra-completa-pdf.html.twig'$params);
  1378.         return new PdfResponse(
  1379.             $this->snappyPDF->getOutputFromHtml($html, [
  1380.                 'orientation' => 'Portrait',
  1381.                 'encoding' => 'utf-8',
  1382.                 'header-html' => $headerHtml,
  1383.                 'header-spacing' => 0,
  1384.                 //'footer-right' => 'Pagina [page]/[toPage]',
  1385.                 'footer-html' => $footerHtml,
  1386.                 'footer-font-size' => '9',
  1387.                 'footer-spacing' => 4,
  1388.                 'margin-top' => '36mm'// Para aparecer o header
  1389.                 'margin-bottom' => '30mm'// Para aparecer o footer
  1390.             ]),
  1391.             'Relatorio-diario-obra.pdf',
  1392.             'application/pdf',
  1393.             'inline'
  1394.         );
  1395.     }
  1396. }