<?php
namespace App\Controller\CRUD;
use App\Application\Sonata\UserBundle\Entity\User;
use App\Entity\ArquivoResultado;
use App\Entity\BoletimMedicao;
use App\Entity\ContaPagar;
use App\Entity\ContaReceber;
use App\Entity\Empresa;
use App\Entity\ArquivoOs;
use App\Entity\Concretagem;
use App\Entity\CorpoProvaConcreto;
use App\Entity\OrdemDeServico;
use App\Entity\PropostaComercial;
use App\Entity\ResultadoMensalProdutor;
use App\Entity\ServicoPropostaComercial;
use App\Entity\ServicoBoletimMedicao;
use App\Enums\StatusBoletimEnum;
use App\Repository\OrdemDeServicoRepository;
use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse;
use Knp\Snappy\Pdf;
use Sonata\AdminBundle\Controller\CRUDController;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Security;
/**
* Class OrdemDeServicoCRUDController
* @package App\Controller\Admin
*/
class OrdemDeServicoCRUDController extends CRUDController
{
/**
* @var ValidatorInterface
*/
private $validator;
/**
* @var Pdf
*/
private $snappyPDF;
private $os;
/**
* @var Security
*/
private $security;
public function __construct(ValidatorInterface $validator, Pdf $snappyPDF, Security $security)
{
$this->validator = $validator;
$this->snappyPDF = $snappyPDF;
$this->security = $security;
}
/**
* Relatório de quais os equipamentos estão fora do almoxarifado
*/
public function equipamentosForaAlmoxarifadoAction() {
$em = $this->getDoctrine()->getManager();
$equipamentos = $em->getRepository('App:Equipamento')->findAll();
$saidaItemRepo = $em->getRepository('App:SaidaItemAlmoxarifado');
$relatorio = [];
foreach ($equipamentos as $equipamento) {
$itens = $saidaItemRepo->findItensEmSaidaPorEquipamento($equipamento);
foreach ($itens as $item) {
$saida = $item->getSaida();
$motivo = $saida->getMotivo();
$os = $saida->getOs();
$osNumero = $os ? $os->getProposta()->getNumeroFormatado() : '';
$relatorio[] = [
'codigo' => $equipamento->getCodigo(),
'titulo' => $equipamento->getTitulo(),
'marca' => $equipamento->getMarca(),
'modelo' => $equipamento->getModelo(),
'quantidade' => $item->getQuantidadeSolicitada(),
'motivo' => $motivo,
'os' => $osNumero,
];
}
}
return $this->render('Equipamento/relatorio.html.twig', [
'relatorio' => $relatorio
]);
}
/**
* Delete action with custom validation and error page
*/
public function deleteAction($id)
{
$request = $this->getRequest();
$id = $request->get($this->admin->getIdParameter());
$object = $this->admin->getObject($id);
if (!$object) {
throw $this->createNotFoundException(sprintf('unable to find the object with id: %s', $id));
}
$this->admin->checkAccess('delete', $object);
$preResponse = $this->preDelete($request, $object);
if ($preResponse !== null) {
return $preResponse;
}
if ($this->getRestMethod() === 'DELETE') {
try {
// Verificar dependências antes de deletar
$this->checkDeleteDependencies($object);
$this->admin->delete($object);
if ($this->isXmlHttpRequest()) {
return $this->renderJson(['result' => 'ok'], 200, []);
}
$this->addFlash(
'sonata_flash_success',
$this->trans(
'flash_delete_success',
['%name%' => $this->escapeHtml($this->admin->toString($object))],
'SonataAdminBundle'
)
);
} catch (\RuntimeException $e) {
// Renderizar página de erro customizada
return $this->render('OrdemDeServico/delete_error.html.twig', [
'error_message' => $e->getMessage(),
'object' => $object,
'admin' => $this->admin,
'base_template' => $this->getBaseTemplate(),
]);
}
return $this->redirectTo($object);
}
return $this->renderWithExtraParams('CRUD/delete.html.twig', [
'object' => $object,
'action' => 'delete',
'csrf_token' => $this->getCsrfToken('sonata.delete'),
], null);
}
/**
* Check if the OS has dependencies that prevent deletion
*/
private function checkDeleteDependencies(OrdemDeServico $os)
{
$em = $this->getDoctrine()->getManager();
// Verificar contas a pagar
$contasPagar = $em->getRepository('App\Entity\ContaPagar')->findBy(['os' => $os]);
if (!empty($contasPagar)) {
throw new \RuntimeException(
'Não é possível excluir esta Ordem de Serviço. ' .
'Existem ' . count($contasPagar) . ' conta(s) a pagar vinculada(s). ' .
'Exclua primeiro todas as contas a pagar relacionadas.'
);
}
// Verificar contas a receber através dos boletins
$boletins = $em->getRepository('App\Entity\BoletimMedicao')->findBy(['os' => $os]);
if (!empty($boletins)) {
$contasReceber = [];
foreach ($boletins as $boletim) {
$contasBoletim = $em->getRepository('App\Entity\ContaReceber')->findBy(['boletimMedicao' => $boletim]);
$contasReceber = array_merge($contasReceber, $contasBoletim);
}
if (!empty($contasReceber)) {
throw new \RuntimeException(
'Não é possível excluir esta Ordem de Serviço. ' .
'Existem ' . count($contasReceber) . ' conta(s) a receber vinculada(s) através dos boletins de medição. ' .
'Exclua primeiro todas as contas a receber e boletins relacionados.'
);
}
}
}
public function addConcretagemAction(Request $request) {
/** @var User $user */
$user = $this->container
->get('security.token_storage')
->getToken()
->getUser();
if(!$user instanceof User){
header("Location: /login");
die();
}
$data = json_decode($request->getContent(), false);
$os = $this->getDoctrine()->getRepository(OrdemDeServico::class)->find($data->os);
if(!$os instanceof OrdemDeServico) {
throw new NotFoundHttpException(sprintf('OS não localizado com o id: %s', $data->os));
}
$data = $data->concretagem;
$concretagem = (new Concretagem())
->setCreatedAt(new \DateTime('now'))
->setOs($os)
->setColaborador($user)
->setNotaFiscal($data->notaFiscal)
->setVolume($data->volume)
->setConcreteira($data->concreteira)
->setFck($data->fck)
->setSlumpInicial($data->slumpInicial)
->setSlumpFinal($data->slumpFinal)
->setAplicacao($data->aplicacao);
if($data->observacao != ''){
$concretagem->setObservacao($data->observacao);
}
foreach ($data->moldes as $molde) {
$dataParaRomper = new \DateTime('now');
$dataParaRomper->modify('+'.$molde->diasRompimento.' day');
$moldeIdentificao = $this->getDoctrine()->getRepository(CorpoProvaConcreto::class)->findOneBy(['codigo'=>$molde->identificado]);
if($moldeIdentificao instanceof CorpoProvaConcreto){
return $this->responseError($headers, Response::HTTP_NO_CONTENT, "O molde identificado pelo código: " . $molde->identificado . " já foi cadastrado na plataforma");
}
$molde = (new CorpoProvaConcreto())
->setCodigo($molde->codigo)
->setDiasRompimento($molde->prazoRuptura)
->setDataRompimento($dataParaRomper)
->setObservacao($molde->observacao)
->setTipo('molde')
;
$concretagem->addMolde($molde);
}
// Edita a data do relatorio
$dataRelatorio = $this->getDataDoRelatorio($concretagem->getMoldes());
$concretagem->setDataRelatorio($dataRelatorio);
// Edita a data do relatorio
$this->getDoctrine()->getManager()->persist($concretagem);
$this->getDoctrine()->getManager()->flush();
$os->addConcretagem($concretagem);
$this->getDoctrine()->getManager()->flush();
exit('OK');
}
public function salvarpesquisaAction(Request $request) {
$data = json_decode($request->getContent(), false);
$os = $this->getDoctrine()->getRepository(OrdemDeServico::class)->find($data->os);
if(!$os instanceof OrdemDeServico) {
throw new NotFoundHttpException(sprintf('OS não localizado com o id: %s', $data->os));
}
if(!$data->load){
$os->setPerguntaUmSatisfacao($data->pergunta1);
$os->setPeruntaDoisSatisfacao($data->pergunta2);
$os->setPerguntaTresSatisfacao($data->pergunta3);
$os->setPeruntaQuatroSatisfacao($data->pergunta4);
$os->setPerguntaCincoSatisfacao($data->pergunta5);
$this->getDoctrine()->getManager()->flush();
}
return new Response(
json_encode([
'p1' => $os->getPerguntaUmSatisfacao(),
'p2' => $os->getPeruntaDoisSatisfacao(),
'p3' => $os->getPerguntaTresSatisfacao(),
'p4' => $os->getPeruntaQuatroSatisfacao(),
'p5' => $os->getPerguntaCincoSatisfacao()
]),
Response::HTTP_OK,
['Content-type' => 'application/json']
);
}
public function alterastatusAction(Request $request) {
$idOs = $request->get('idOs');
$os = $this->getDoctrine()->getRepository(OrdemDeServico::class)->find($idOs);
if(!$os instanceof OrdemDeServico) {
throw new NotFoundHttpException(sprintf('OS não localizado com o id: %s', $idOs));
}
$os->setStatus($request->get('status'));
$this->getDoctrine()->getManager()->flush();
exit('OK');
}
public function salvaordemitemAction(Request $request) {
$data = json_decode($request->getContent(), false);
/** @var User $user */
$user = $this->container
->get('security.token_storage')
->getToken()
->getUser();
if(!$user instanceof User){
throw new NotFoundHttpException('Usuário não autorizado');
die();
}
$os = $this->getDoctrine()->getRepository(OrdemDeServico::class)->find($data->os);
if(!$os instanceof OrdemDeServico) {
throw new NotFoundHttpException(sprintf('OS não localizado com o id: %s', $data->os));
}
if($data->item=='status'){
$os->setStatus($data->valor);
} else {
$valor = \DateTime::createFromFormat('Y-m-d', $data->valor);
if($data->item=='dataFinalPrevista'){
$os->setPrevisaoEntrega($valor);
} else if($data->item=='dataConclusao') {
$os->setFinalizadaEm($valor);
}
}
$this->getDoctrine()->getManager()->flush();
return new Response(
json_encode([]),
Response::HTTP_OK,
['Content-type' => 'application/json']
);
}
public function salvaordemAction(Request $request) {
$data = json_decode($request->getContent(), false);
/** @var User $user */
$user = $this->container
->get('security.token_storage')
->getToken()
->getUser();
if(!$user instanceof User){
throw new NotFoundHttpException('Usuário não autorizado');
die();
}
$molde = $this->getDoctrine()->getRepository(Concretagem::class)->find($data->id);
if(!$molde instanceof Concretagem) {
throw new NotFoundHttpException(sprintf('Molde não localizado com o id: %s', $data->id));
}
$molde->setOrdemRelatorio($data->ordem);
$this->getDoctrine()->getManager()->flush();
return new Response(
json_encode([]),
Response::HTTP_OK,
['Content-type' => 'application/json']
);
}
public function putamostraAction(Request $request) {
$data = json_decode($request->getContent(), false);
/** @var User $user */
$user = $this->container
->get('security.token_storage')
->getToken()
->getUser();
if(!$user instanceof User){
header("Location: /login");
die();
}
$molde = $this->getDoctrine()->getRepository(Concretagem::class)->find($data->id);
if(!$molde instanceof Concretagem) {
throw new NotFoundHttpException(sprintf('Molde não localizado com o id: %s', $data->id));
}
$molde->setAplicacao($data->aplicacao);
$molde->setNotaFiscal($data->notaFiscal);
$molde->setVolume($data->volume);
$molde->setFck($data->fck);
$molde->setConcreteira($data->concreteira);
$molde->setSlumpInicial($data->slumpInicial);
$molde->setSlumpFinal($data->slumpFinal);
$molde->setObservacao($data->observacao);
$dateEmissao = \DateTime::createFromFormat('Y-m-d', $data->dataEmissao);
if($dateEmissao instanceof \DateTime){
$molde->setCreatedAt($dateEmissao);
}
$this->getDoctrine()->getManager()->flush();
foreach($data->moldes as $moldeItem){
$cp = $this->getDoctrine()->getRepository(CorpoProvaConcreto::class)->find($moldeItem->id);
if($cp instanceof CorpoProvaConcreto) {
$cp->setTipo($moldeItem->tipo);
$cp->setValorRompimento($moldeItem->valorRompimento);
$cp->setDiasRompimento($moldeItem->prazoRuptura);
$cp->setValorRompimento($moldeItem->valorRompimento);
$dataRuptura = \DateTime::createFromFormat('d/m/Y', $moldeItem->dataRompimento);
if($dataRuptura instanceof \DateTime){
$cp->setDataRompimento($dataRuptura);
}
$cp->setCodigo($moldeItem->codigo);
$this->getDoctrine()->getManager()->flush();
}
}
return new Response(
json_encode([]),
Response::HTTP_OK,
['Content-type' => 'application/json']
);
}
public function getamostraAction(Request $request) {
/** @var User $user */
$user = $this->container
->get('security.token_storage')
->getToken()
->getUser();
if(!$user instanceof User){
header("Location: /login");
die();
}
$id = $request->get('id');
$repo = $this->getDoctrine()->getRepository(Concretagem::class);
$molde = $repo->find($id);
if(!$molde instanceof Concretagem) {
throw new NotFoundHttpException(sprintf('Molde não localizado com o id: %s', $id));
}
$moldes = [];
foreach($molde->getMoldes() as $moldeItem){
$moldes[] = [
'id'=>$moldeItem->getId(),
'codigo'=>$moldeItem->getCodigo(),
'valorRompimento'=>$moldeItem->getValorRompimento(),
'tipo'=>$moldeItem->getTipo(),
'dataRompimento'=>$moldeItem->getDataRompimento()->format('d/m/Y'),
'prazoRuptura' => $moldeItem->getDiasRompimento(),
'observacao' => ($moldeItem->getObservacao()) ? $moldeItem->getObservacao() : 'sem observação'
];
}
$dados = [
'id' => $molde->getId(),
'aplicacao' => $molde->getAplicacao(),
'notaFiscal' => $molde->getNotaFiscal(),
'volume' => $molde->getVolume(),
'fck' => $molde->getFck(),
'concreteira' => $molde->getConcreteira(),
'slumpInicial' => $molde->getSlumpInicial(),
'slumpFinal' => $molde->getSlumpFinal(),
'moldes' => $moldes,
'observacao' => $molde->getObservacao(),
'dataEmissao' => $molde->getCreatedAt()->format('Y-m-d')
];
return new Response(
json_encode($dados),
Response::HTTP_OK,
['Content-type' => 'application/json']
);
}
public function acompanhamentoMoldagemAction() {
// Somente para usuários LTEC-GOIANIA
/** @var User $user */
$user = $this->container
->get('security.token_storage')
->getToken()
->getUser();
if(!$user instanceof User){
header("Location: /login");
die();
}
if(
$user->getEmail()=='suporte@logics.com.br' ||
$user->getEmail()=='Mateus.ctgoiania@ltecti.eng.br' ||
$user->getEmail()=='solosengenharia@gmail.com' ||
$user->getEmail()=='paulo@ltec.eng.br'
)
{
$ossData = [];
// Todas as os
$empresa = $this->getDoctrine()->getRepository(Empresa::class)->find(6);
$oss = $this->getDoctrine()->getRepository(OrdemDeServico::class)->findBy(['franquia'=>$empresa],['id'=>'desc'],20);
foreach ( $oss as $os ){
$moldagensData = [];
$moldagens = $this->getDoctrine()->getRepository(Concretagem::class)->findBy(['os'=>$os],['id'=>'desc']);
foreach ( $moldagens as $moldagem ){
$cpsData = [];
$cps = $this->getDoctrine()->getRepository(CorpoProvaConcreto::class)->findBy(['concretagem'=>$moldagem],['id'=>'desc']);
foreach ( $cps as $cp ){
$cpsData[] = ['codigo'=>$cp->getCodigo(),'dias'=>$cp->getDiasRompimento(),'data'=>$cp->getDataRompimento()->format('d/m/Y'), 'ruptura'=>$cp->getValorRompimento()];
}
$moldagensData[] = [
'data'=> $moldagem->getCreatedAt()->format('d/m/Y H:i:s'),
'nf'=> $moldagem->getNotaFiscal(),
'concreteira' => $moldagem->getConcreteira(),
'volume' => $moldagem->getVolume(),
'fck' => $moldagem->getFck(),
'slumpInicial' => $moldagem->getSlumpInicial(),
'slumpFinal' => $moldagem->getSlumpFinal(),
'aplicacao' => $moldagem->getAplicacao(),
'modaldor' => $moldagem->getColaborador()->getNome(),
'cps' => $cpsData
];
}
$ossData[] = ['os'=>$os->getObservacoes(),'moldagens'=>$moldagensData];
}
return $this->render('Os/acompanhamento_moldagem.html.twig',[
'oss' => $ossData
]);
}
exit('');
}
public function relatoriosCpsAction(Request $request) {
$idOs = $request->get('id');
/** @var OrdemDeServicoRepository $osRepo */
$osRepo = $this->getDoctrine()->getRepository(OrdemDeServico::class);
$os = $osRepo->find($idOs);
if(!$os instanceof OrdemDeServico) {
throw new NotFoundHttpException(sprintf('OS não localizada com o id: %s', $idOs));
}
$dataInicial = \DateTime::createFromFormat('Y-m-d', $request->get('start'));
$dataFinal = \DateTime::createFromFormat('Y-m-d', $request->get('end'));
$moldesDaOs = $this->getDoctrine()->getRepository(Concretagem::class)->findByOsEIntervalo($os,$dataInicial,$dataFinal);
$relatorios = [];
foreach ($moldesDaOs as $molde) {
//if(!$molde->getDataRelatorio() instanceof \DateTime){
// Edita a data do relatorio
$dataRelatorio = $this->getDataDoRelatorio($molde->getMoldes());
$molde->setDataRelatorio($dataRelatorio);
$this->getDoctrine()->getManager()->flush();
//}
$repo = $this->getDoctrine()->getRepository(Concretagem::class);
$id = $molde->getId();
$molde = $repo->find($id);
if(!$molde instanceof Concretagem) {
throw new NotFoundHttpException(sprintf('Molde não localizado com o id: %s', $id));
}
// Criar um array de cps agrupados por prova e contraprova
$linhasCP = [];
$diasTestados = [];
foreach($molde->getMoldes() as $moldeItem){
if($moldeItem->getValorRompimento()>0){
// Busca se já tem alguem com o mesmo dia
$key = 'dias_'.$moldeItem->getDiasRompimento();
if(array_key_exists($key,$linhasCP)) {
$linhasCP[$key][] = $moldeItem;
} else {
$diasTestados[] = $moldeItem->getDiasRompimento();
$linhasCP[$key] = [$moldeItem];
}
}
}
asort($diasTestados);
$maiorValorCP = 0;
foreach($molde->getMoldes() as $moldeItem){
if($moldeItem->getValorRompimento()>$maiorValorCP){
$maiorValorCP = $moldeItem->getValorRompimento();
}
}
$valores = [];
foreach($diasTestados as $diaTestado){
$valores[$diaTestado] = 0;
}
foreach($linhasCP as $linha){
$valores[$linha[0]->getDiasRompimento()] = $linha[0]->getValorRompimento();
}
$valores = implode($valores,',');
$diasTestados = implode($diasTestados,'|');
$maiorValorCPCalculado = 0;
$maiorValorCPCalculado = (($maiorValorCP*1000)/78.54)/10;
$params = [
'molde' => $molde,
'moldes' => $linhasCP,
'maiorValor' => ceil($maiorValorCP),
'maiorValorCalculado' => $maiorValorCPCalculado,
'valores' => $valores,
'diasTestados' => $diasTestados
];
$relatorios[] = $params;
}
//exit('Maior Valor: ' . ceil($maiorValorCP));
$html = $this->renderView('Os/relatorios_cps.html.twig', ['relatorios'=>$relatorios]);
return new PdfResponse(
$this->snappyPDF->getOutputFromHtml($html, [
'orientation' => 'Portrait',
'encoding' => 'utf-8',
//'header-html' => $headerHtml,
'header-spacing' => 0,
//'footer-right' => 'Pagina [page]/[toPage]',
//'footer-html' => $footerHtml,
//'footer-font-size' => '9',
//'footer-spacing' => 4,
'margin-top' => '10mm', // Para aparecer o header
'margin-bottom' => '5mm', // Para aparecer o footer
]),
'Relatorio-cp-os-'.$id.'.pdf',
'application/pdf',
'inline'
);
return $this->render('Os/relatorio_cp.html.twig',$params);
}
public function relatorioCpv2Action(Request $request) {
$id = $request->get('id');
$repo = $this->getDoctrine()->getRepository(Concretagem::class);
$molde = $repo->find($id);
if(!$molde instanceof Concretagem) {
throw new NotFoundHttpException(sprintf('Molde não localizado com o id: %s', $id));
}
// Criar um array de cps agrupados por prova e contraprova
$linhasCP = [];
/*
$linhasCP['dia_x'] = [28];
$linhasCP['dia_x'][] = 29;
*/
/*
$array['dias_28'] = [28;
if(array_key_exists('dias_28',$array)){
$array['dias_28'][] = 29;
}
print_r($array);
exit;
*/
$diasTestados = [];
//if(!$molde->getDataRelatorio() instanceof \DateTime){
// Edita a data do relatorio
$dataRelatorio = $this->getDataDoRelatorio($molde->getMoldes());
$molde->setDataRelatorio($dataRelatorio);
$this->getDoctrine()->getManager()->flush();
//}
foreach($molde->getMoldes() as $moldeItem){
if($moldeItem->getValorRompimento()>0){
// Busca se já tem alguem com o mesmo dia
$key = 'dias_'.$moldeItem->getDiasRompimento();
if(array_key_exists($key,$linhasCP)){
$linhasCP[$key][] = $moldeItem;
} else {
$diasTestados[] = $moldeItem->getDiasRompimento();
$linhasCP[$key] = [$moldeItem];
}
}
}
asort($diasTestados);
$maiorValorCP = 0;
foreach($molde->getMoldes() as $moldeItem){
if($moldeItem->getValorRompimento()>$maiorValorCP){
$maiorValorCP = $moldeItem->getValorRompimento();
}
}
$valores = [];
foreach($diasTestados as $diaTestado){
$valores[$diaTestado] = 0;
}
foreach($linhasCP as $linha){
$valorRompimento = $linha[0]->getValorRompimento();
if($valorRompimento < $linha[1]->getValorRompimento()){
$valorRompimento = $linha[1]->getValorRompimento();
}
$valores[$linha[0]->getDiasRompimento()] = $valorRompimento;
}
$valores = implode($valores,',');
$diasTestados = implode($diasTestados,'|');
$maiorValorCPCalculado = 0;
$maiorValorCPCalculado = (($maiorValorCP*1000)/78.54)/10;
$numeroResitro = $this->makeNumeroRegistroRelatorioCP($molde);
$params = [
'numeroRegistro' => $numeroResitro,
'molde' => $molde,
'moldes' => $linhasCP,
'maiorValor' => ceil($maiorValorCP),
'maiorValorCalculado' => $maiorValorCPCalculado,
'valores' => $valores,
'diasTestados' => $diasTestados
];
//exit('Maior Valor: ' . ceil($maiorValorCP));
$html = $this->renderView('Os/relatorio_cp_v2.html.twig', $params);
// exit($html);
return new PdfResponse(
$this->snappyPDF->getOutputFromHtml($html, [
'orientation' => 'Portrait',
'encoding' => 'utf-8',
//'header-html' => $headerHtml,
'header-spacing' => 0,
//'footer-right' => 'Pagina [page]/[toPage]',
//'footer-html' => $footerHtml,
//'footer-font-size' => '9',
//'footer-spacing' => 4,
'margin-top' => '10mm', // Para aparecer o header
'margin-bottom' => '5mm', // Para aparecer o footer
]),
'Relatorio-cp-os-'.$id.'.pdf',
'application/pdf',
'inline'
);
return $this->render('Os/relatorio_cp_v2.html.twig',$params);
}
private function getOrderMolde($molde) {
$indexMolde = null;
// Busca todas as concretagens executadas nesta os, na ordem de criacao
$modoldes_da_mesa_os = $this->getDoctrine()->getRepository(Concretagem::class)->findBy(
['os'=>$molde->getOs()],
['id' => 'ASC']
);
$index = 0;
foreach ($modoldes_da_mesa_os as $modolde_da_mesa_os) {
$index++;
if($modolde_da_mesa_os->getId()==$molde->getId()){
$indexMolde = $index;
}
}
if($indexMolde==null){
throw new NotFoundHttpException(sprintf('Posição do Molde não localizado com o id: %s', $molde->getId()));
}
return str_pad($indexMolde, 2, "0", STR_PAD_LEFT);
}
private function makeNumeroRegistroRelatorioCP($molde) {
// [ano+os+numensaio(532)+ordemrelatorio];
$anoMoldagem = $molde->getCreatedAt()->format('Y');
$numeOs = $molde->getOs()->getId();
$numeroEnsaio = '532';
$ordemRelatorio = $this->getOrderMolde($molde); // Pegar todos os moldes dessa OS e ordenar
//$numero = $anoMoldagem . '-' . $numeOs . '-' . $numeroEnsaio . '-' . $ordemRelatorio;
$numero = $anoMoldagem . $numeOs . $numeroEnsaio . $ordemRelatorio;
return $numero;
}
public function relatorioCpAction(Request $request) {
$id = $request->get('id');
$repo = $this->getDoctrine()->getRepository(Concretagem::class);
$molde = $repo->find($id);
if(!$molde instanceof Concretagem) {
throw new NotFoundHttpException(sprintf('Molde não localizado com o id: %s', $id));
}
// Criar um array de cps agrupados por prova e contraprova
$linhasCP = [];
/*
$linhasCP['dia_x'] = [28];
$linhasCP['dia_x'][] = 29;
*/
/*
$array['dias_28'] = [28;
if(array_key_exists('dias_28',$array)){
$array['dias_28'][] = 29;
}
print_r($array);
exit;
*/
$diasTestados = [];
//if(!$molde->getDataRelatorio() instanceof \DateTime){
// Edita a data do relatorio
$dataRelatorio = $this->getDataDoRelatorio($molde->getMoldes());
$molde->setDataRelatorio($dataRelatorio);
$this->getDoctrine()->getManager()->flush();
//}
foreach($molde->getMoldes() as $moldeItem){
if($moldeItem->getValorRompimento()>0){
// Busca se já tem alguem com o mesmo dia
$key = 'dias_'.$moldeItem->getDiasRompimento();
if(array_key_exists($key,$linhasCP)){
$linhasCP[$key][] = $moldeItem;
} else {
$diasTestados[] = $moldeItem->getDiasRompimento();
$linhasCP[$key] = [$moldeItem];
}
}
}
asort($diasTestados);
$maiorValorCP = 0;
foreach($molde->getMoldes() as $moldeItem){
if($moldeItem->getValorRompimento()>$maiorValorCP){
$maiorValorCP = $moldeItem->getValorRompimento();
}
}
$valores = [];
foreach($diasTestados as $diaTestado){
$valores[$diaTestado] = 0;
}
foreach($linhasCP as $linha){
$valorRompimento = $linha[0]->getValorRompimento();
if($valorRompimento < $linha[1]->getValorRompimento()){
$valorRompimento = $linha[1]->getValorRompimento();
}
$valores[$linha[0]->getDiasRompimento()] = $valorRompimento;
}
$valores = implode($valores,',');
$diasTestados = implode($diasTestados,'|');
$maiorValorCPCalculado = 0;
$maiorValorCPCalculado = (($maiorValorCP*1000)/78.54)/10;
$params = [
'molde' => $molde,
'moldes' => $linhasCP,
'maiorValor' => ceil($maiorValorCP),
'maiorValorCalculado' => $maiorValorCPCalculado,
'valores' => $valores,
'diasTestados' => $diasTestados
];
//exit('Maior Valor: ' . ceil($maiorValorCP));
$html = $this->renderView('Os/relatorio_cp.html.twig', $params);
return new PdfResponse(
$this->snappyPDF->getOutputFromHtml($html, [
'orientation' => 'Portrait',
'encoding' => 'utf-8',
//'header-html' => $headerHtml,
'header-spacing' => 0,
//'footer-right' => 'Pagina [page]/[toPage]',
//'footer-html' => $footerHtml,
//'footer-font-size' => '9',
//'footer-spacing' => 4,
'margin-top' => '10mm', // Para aparecer o header
'margin-bottom' => '5mm', // Para aparecer o footer
]),
'Relatorio-cp-os-'.$id.'.pdf',
'application/pdf',
'inline'
);
return $this->render('Os/relatorio_cp.html.twig',$params);
}
private function getDataDoRelatorio($moldes) {
// pegar o molde com ruptura mais longe
$moldeMaisAntigo = $moldes[0];
$maior = 0;
foreach ($moldes as $molde) {
if($molde->getValorRompimento() > 0){
if($molde->getDiasRompimento() > $maior){
$maior = $molde->getDiasRompimento();
$moldeMaisAntigo = $molde;
}
}
}
$dataRelatorio = $moldeMaisAntigo->getDataRompimento();
// https://www.ti-enxame.com/pt/php/proximo-dia-util-da-data-indicada-em-php/971164682/
/* Com Feriado
$tmpDate = '2015-06-22';
$holidays = ['2015-07-04', '2015-10-31', '2015-12-25'];
$i = 1;
$nextBusinessDay = date('Y-m-d', strtotime($tmpDate . ' +' . $i . ' Weekday'));
while (in_array($nextBusinessDay, $holidays)) {
$i++;
$nextBusinessDay = date('Y-m-d', strtotime($tmpDate . ' +' . $i . ' Weekday'));
}
*/
$proximoDiaUtil = date('Y-m-d', strtotime($dataRelatorio->format('Y-m-d') . ' +1 Weekday'));
$proximoDiaUtil = \DateTime::createFromFormat('Y-m-d', $proximoDiaUtil);
return $proximoDiaUtil;
}
private function array_sort($array, $on, $order=SORT_ASC)
{
$new_array = array();
$sortable_array = array();
if (count($array) > 0) {
foreach ($array as $k => $v) {
if (is_array($v)) {
foreach ($v as $k2 => $v2) {
if ($k2 == $on) {
$sortable_array[$k] = $v2;
}
}
} else {
$sortable_array[$k] = $v;
}
}
switch ($order) {
case SORT_ASC:
asort($sortable_array);
break;
case SORT_DESC:
arsort($sortable_array);
break;
}
foreach ($sortable_array as $k => $v) {
$new_array[$k] = $array[$k];
}
}
return $new_array;
}
public function salvaPercentualServicoAction(Request $request) {
$data = json_decode($request->getContent(), false);
$id = $data->id;
$percentual = $data->percentual;
if(!$id || !$percentual){
exit('err1');
}
// Verificando permissões. Somente quem pode editar uma proposta
//if(!$this->security->isGranted('ROLE_ADMIN_STATUS_PROPOSTA_EDIT')){
//exit('err');
//}
/** @var ServicoPropostaComercial $servico */
$servico = $this->getDoctrine()->getRepository(ServicoPropostaComercial::class)->find($id);
if(!$servico instanceof ServicoPropostaComercial){
exit('err2');
}
$servico->setPercentualEntregue($percentual);
$this->getDoctrine()->getManager()->flush();
exit('OK');
}
public function cronogramaAction(Request $request) {
if(!$this->security->isGranted('ROLE_ADMIN_VIEW_PAINEL_OS')){
echo '<script>alert("Página não localizada."); window.close();</script>';
}
$idOs = $request->get('id');
/** @var User $user */
$user = $this->container
->get('security.token_storage')
->getToken()
->getUser();
$franquia = $user->getFranquia();
if(!$franquia instanceof Empresa){
exit('Este usuário logado não pertence a nenhuma franquia.');
}
/** @var OrdemDeServicoRepository $osRepo */
$osRepo = $this->getDoctrine()->getRepository(OrdemDeServico::class);
$os = $osRepo->find($idOs);
if(!$os instanceof OrdemDeServico) {
throw new NotFoundHttpException(sprintf('OS não localizada com o id: %s', $idOs));
}
$atrasado = false;
$diasAtraso = 0;
$dataInicial = $os->getCreatedAt();
$dataFinalPrevista = $os->getPrevisaoEntrega();
$dataFinalizacao = $os->getFinalizadaEm();
$dataAtual = new \DateTime('now');
$diasPrevistos = 0;
$interval = 0;
if($dataFinalPrevista instanceof \DateTime){
$interval = $dataInicial->diff($dataFinalPrevista);
$diasPrevistos = $interval->format('%R%a');
$intervalFinal = $dataAtual->diff($dataFinalPrevista);
$diasRestantes = $intervalFinal->format('%R%a');
$diasTrabalhados = $diasPrevistos - $diasRestantes;
if($diasTrabalhados > $diasPrevistos){
$atrasado = true;
$diasAtraso = $diasTrabalhados - $diasPrevistos;
}
} else {
$dataFinalPrevista = new \DateTime('now');
}
$percentAtual = 0;
$emAndamento = false;
if($dataFinalizacao instanceof \DateTime){
$percentAtual = 100;
$emAndamento = false;
} else {
if($diasPrevistos > 0){
$percentAtual = ( $diasTrabalhados * 100 ) / $diasPrevistos;
}
$percentAtual = round($percentAtual,2);
}
if($os->getStatus()=='CONCLUIDA'){
$atrasado = false;
$percentAtual = 100;
$emAndamento = false;
}
$receitas = [];
$despesas = [];
$contaReceberRepository = $this->getDoctrine()->getRepository(ContaReceber::class);
// Pegando receitas de uma OS
$receitas = $contaReceberRepository->getReceitasDeOs($os, true);
$despesas = $this->getDoctrine()->getRepository(ContaPagar::class)->getDespesasDeOs($os);
$totalDespesas = 0;
foreach ($despesas as $despesa){
/** @var ContaPagar $despesa */
$totalDespesas = $totalDespesas + $despesa->getValorPago();
}
$totalReceitasOs = $contaReceberRepository->getReceitasDeOs($os,true);
$totalDespesasGerais = $osRepo->getValorDespesasGerais($os,$totalReceitasOs,$user->getFranquia());
$despesas = $totalDespesas + $totalDespesasGerais['total'];
//$despesas = round($despesas,2);
$despesas = $this->cutNum($despesas, 2);
$receitas = $this->cutNum($receitas,2);
$basedir = $request->getBasePath();
$percentuais = [];
foreach ($os->getProposta()->getServicos() as $servico){
$percentual = ($servico->getPercentualEntregue()!='') ? $servico->getPercentualEntregue() : 0;
$percentuais[] = '{id:' . $servico->getId() . ', percentual:' . $percentual . '}';
}
$percentuais = join(',',$percentuais);
$relatorioNovo = false;
$ltecCTAnapolis = 5;
$ltecCTDF = 4;
$requestV2 = ($request->get('v2')=='yes') ? true : false;
if(in_array($franquia->getId(),[$ltecCTAnapolis, $ltecCTDF]) || $requestV2){
$relatorioNovo = true;
}
$arquivosOS = [];
$arquivosEntity = $this->getDoctrine()->getRepository(ArquivoOs::class)->findBy(['os'=>$os]);
foreach ($arquivosEntity as $arquivoEntity) {
$arquivosOS[] = [
'id' => $arquivoEntity->getId(),
'tipo' => $arquivoEntity->getTipo(),
'validaAte' => ($arquivoEntity->getExpiredAt() instanceof \DateTime) ? $arquivoEntity->getExpiredAt()->format('d/m/Y') : 'Não informada',
'link' => '/' . $arquivoEntity->getArquivo()
];
}
$equipamentoUtilizados = [];
$devolucoesEquipamentos = [];
// Buscar todas as saídas vinculadas a esta OS
$em = $this->getDoctrine()->getManager();
$saidaRepo = $em->getRepository('App:SaidaAlmoxarifado');
$saidas = $saidaRepo->findBy(['os' => $os]);
foreach ($saidas as $saida) {
$dataSaida = $saida->getCreatedAt();
foreach ($saida->getItens() as $item) {
$equipamento = $item->getEquipamento();
$equipamentoUtilizados[] = [
'dataSaida' => $dataSaida,
'equipamentoNome' => $equipamento ? $equipamento->getTitulo() : '',
'equipamentoId' => $equipamento ? $equipamento->getId() : null,
'quantidade' => $item->getQuantidadeSolicitada(),
];
}
}
// Buscar todas as devoluções vinculadas a esta OS
$devolucaoRepo = $em->getRepository('App:DevolucaoAlmoxarifado');
// Buscar devoluções relacionadas às saídas desta OS
foreach ($saidas as $saida) {
$devolucoes = $devolucaoRepo->findBy(['saida' => $saida]);
foreach ($devolucoes as $devolucao) {
$dataDevolucao = $devolucao->getCreatedAt();
foreach ($devolucao->getItens() as $item) {
$equipamento = $item->getSaidaItem()->getEquipamento();
$devolucoesEquipamentos[] = [
'dataDevolucao' => $dataDevolucao,
'equipamentoNome' => $equipamento ? $equipamento->getTitulo() : '',
'equipamentoId' => $equipamento ? $equipamento->getId() : null,
'quantidade' => $item->getQuantidadeDevolvida(),
];
}
}
}
return $this->render('Os/cronograma.html.twig',[
'equipamentoUtilizados' => $equipamentoUtilizados,
'devolucoesEquipamentos' => $devolucoesEquipamentos,
'receitas' => $receitas,
'despesas' => $despesas,
'arquivosOs' => $arquivosOS,
'os' => $os->getProposta()->getNumeroFormatado(),
'osAll' => $os,
'cliente' => $os->getProposta()->getCliente(),
'dataInicial' => $dataInicial,
'dataConclusao' => ($os->getFinalizadaEm() instanceof \DateTime) ? $os->getFinalizadaEm()->format('Y-m-d') : $os->getCreatedAt()->format('Y-m-d'),
'dataAtual' => $dataAtual,
'dataFinalizacao' => $dataFinalizacao,
'dataFinalPrevista' => $dataFinalPrevista,
'emAndamento' => $emAndamento,
'percentualTotal' => $percentAtual,
'atrasado' => $atrasado,
'diasAtraso' => $diasAtraso,
'basedir' => $basedir,
'percentuaisServico' => $percentuais,
'isV2' => $relatorioNovo,
]);
}
private function cutNum($num, $precision = 2) {
$value = floor($num) . substr(str_replace(floor($num), '', $num), 0, $precision + 1) . '.00';
$value = explode('.',$value);
return $value = $value[0] . '.' . $value[1];
}
public function centroCustoAction(Request $request) {
$idOs = $request->get('id');
/** @var User $user */
$user = $this->container
->get('security.token_storage')
->getToken()
->getUser();
$franquia = $user->getFranquia();
if(!$franquia instanceof Empresa){
exit('Este usuário logado não pertence a nenhuma franquia.');
}
/** @var OrdemDeServicoRepository $osRepo */
$osRepo = $this->getDoctrine()->getRepository(OrdemDeServico::class);
$os = $osRepo->find($idOs);
if(!$os instanceof OrdemDeServico) {
throw new NotFoundHttpException(sprintf('OS não localizada com o id: %s', $idOs));
}
$receitas = [];
$despesas = [];
$contaReceberRepository = $this->getDoctrine()->getRepository(ContaReceber::class);
// Pegando receitas de uma OS
$receitas = $contaReceberRepository->getReceitasDeOs($os);
$despesas = $this->getDoctrine()->getRepository(ContaPagar::class)->getDespesasDeOs($os);
$totalReceitasOs = $contaReceberRepository->getReceitasDeOs($os,true);
$totalDespesasGerais = $osRepo->getValorDespesasGerais($os,$totalReceitasOs,$user->getFranquia());
return $this->render('Os/relatorio-custo.html.twig',[
'receitas' => $receitas,
'despesas' => $despesas,
'totalDespesasGerais' => $totalDespesasGerais['total'],
'os' => $os->getProposta()->getNumeroFormatado(),
'cliente' => $os->getProposta()->getCliente(),
'start' => $totalDespesasGerais['start'],
'end' => $totalDespesasGerais['end'],
'hoje' => new \DateTime('now'),
'dias_interrupcao' => $os->getDiasInterrupcoes()
]);
}
public function addBoletimAction(Request $request) {
$idOs = $request->get('id');
$os = $this->getDoctrine()->getRepository(OrdemDeServico::class)->find($idOs);
if(!$os instanceof OrdemDeServico) {
throw new NotFoundHttpException(sprintf('OS não localizada com o id: %s', $idOs));
}
// Verificar se esta proposta foi aceita
// gerar o numero sequencial
$bos = $this->getDoctrine()->getRepository(BoletimMedicao::class)->findBy(['os'=>$os]);
$numero = count($bos) + 1;
// Criar um novo boletim
$boletim = (new BoletimMedicao())
->setNumero($numero)
->setCobrarART(true)
->setStatus(StatusBoletimEnum::GERADO)
->setOs($os);
foreach ($os->getProposta()->getServicos() as $servico){
$quantidade = ($servico->getQuantidade()) ? $servico->getQuantidade() : 1;
$servicoBoletim = (new ServicoBoletimMedicao())
->setServico($servico)
->setProposta($os->getProposta())
->setBoletim($boletim)
->setQuantidade($quantidade);
$boletim->addServico($servicoBoletim);
}
$this->getDoctrine()->getManager()->persist($boletim);
$this->getDoctrine()->getManager()->flush();
$this->addFlash('sonata_flash_success', 'Boletim gerado com sucesso!');
return new RedirectResponse($this->generateUrl('admin_app_boletimmedicao_edit',['id'=>$boletim->getId()]));
}
// public function novaVersaoOsAction() {
// $object = $this->admin->getSubject();
// return $this->redirectToRoute('admin_app_propostacomercial_create',['idParaNovaVersao'=>$object->getId()]);
// }
// protected function preCreate(Request $request, $object)
// {
// $id = $request->get('idParaNovaVersao');
//
// if(!$id){
// return null;
// }
//
// /** @var PropostaComercial $object */
// /** @var PropostaComercial $objPreenchido */
//
// $objPreenchido = $this->getDoctrine()->getRepository(PropostaComercial::class)->find($id);
//
// $object->setDestinatarioNome($objPreenchido->getDestinatarioNome());
// $object->setCliente($objPreenchido->getCliente());
// $object->setDestinatarioCargo($objPreenchido->getDestinatarioCargo());
// $object->setDestinatarioEmail($objPreenchido->getDestinatarioEmail());
// $object->setDestinatarioTelefone($objPreenchido->getDestinatarioTelefone());
// $object->setTipo($objPreenchido->getTipo());
//
// return null;
// }
public function osPdfAction(Request $request) {
//$this->admin->checkAccess('novaVersaoProposta');
$idOs = $request->get('id');
$basedir = $this->getParameter('kernel.root_dir') . '/../public' . $request->getBasePath();
$os = $this->getDoctrine()->getRepository(OrdemDeServico::class)->find($idOs);
if(!$os instanceof OrdemDeServico){
throw new NotFoundHttpException(sprintf('OS não localizada com o id: %s', $idOs));
}
$this->os = $os;
$dataInicial = $os->getCreatedAt();
$dataFinalPrevista = $os->getPrevisaoEntrega();
$dataFinalizacao = $os->getFinalizadaEm();
$params = [
'basedir' => $basedir,
'os' => $os,
'dataPrevisaoTermino' => ($dataFinalPrevista instanceof \DateTime) ? $dataFinalPrevista->format('d/m/Y') : $os->getCreatedAt()->format('d/m/Y'),
'dataConclusao' => ($os->getFinalizadaEm() instanceof \DateTime) ? $os->getFinalizadaEm()->format('d/m/Y') : $os->getCreatedAt()->format('d/m/Y'),
];
$headerHtml = $this->renderView(
'Os/header-os-completa-pdf.html.twig', $params
);
$footerHtml = $this->renderView(
'Os/footer.os.html.twig', $params
);
$html = $this->renderView('Os/os-completa-pdf.html.twig', $params);
return new PdfResponse(
$this->snappyPDF->getOutputFromHtml($html, [
'orientation' => 'Portrait',
'encoding' => 'utf-8',
'header-html' => $headerHtml,
'header-spacing' => 0,
//'footer-right' => 'Pagina [page]/[toPage]',
'footer-html' => $footerHtml,
'footer-font-size' => '9',
'footer-spacing' => 4,
'margin-top' => '40mm', // Para aparecer o header
'margin-bottom' => '30mm', // Para aparecer o footer
]),
'Ordem de Servico-'.$os->getId().'.pdf',
'application/pdf',
'inline'
);
}
public function relatorioDiarioObraPdfAction(Request $request) {
//$this->admin->checkAccess('novaVersaoProposta');
$idOs = $request->get('id');
$basedir = $this->getParameter('kernel.root_dir') . '/../public' . $request->getBasePath();
$os = $this->getDoctrine()->getRepository(OrdemDeServico::class)->find($idOs);
if(!$os instanceof OrdemDeServico){
throw new NotFoundHttpException(sprintf('OS não localizada com o id: %s', $idOs));
}
$this->os = $os;
$params = [
'basedir' => $basedir,
'os' => $os,
];
$headerHtml = $this->renderView(
'Os/header-relatorio-diario-obra-completa-pdf.html.twig', $params
);
$footerHtml = $this->renderView(
'Os/footer.os.html.twig', $params
);
$html = $this->renderView('Os/relatorio-diario-obra-completa-pdf.html.twig', $params);
return new PdfResponse(
$this->snappyPDF->getOutputFromHtml($html, [
'orientation' => 'Portrait',
'encoding' => 'utf-8',
'header-html' => $headerHtml,
'header-spacing' => 0,
//'footer-right' => 'Pagina [page]/[toPage]',
'footer-html' => $footerHtml,
'footer-font-size' => '9',
'footer-spacing' => 4,
'margin-top' => '36mm', // Para aparecer o header
'margin-bottom' => '30mm', // Para aparecer o footer
]),
'Relatorio-diario-obra.pdf',
'application/pdf',
'inline'
);
}
}