158 lines
7.1 KiB
PHP
158 lines
7.1 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Impressao\Manutencao;
|
|
|
|
use App\Enums\Manutencao\StatusTipo;
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\Cadastro\Material\Material as MaterialModel;
|
|
use App\Models\Manutencao\Solicitacao;
|
|
use App\Models\Manutencao\SolicitacaoItensAlmoxarifado;
|
|
use App\Models\Manutencao\SolicitacaoMensagem;
|
|
use App\Models\Manutencao\SolicitacaoResposta;
|
|
use App\Utils\Exports\Pdf1;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Str;
|
|
|
|
class GerenciamentoController extends Controller
|
|
{
|
|
private const TITLE = 'SOLICITAÇÃO DE MANUTENÇÃO';
|
|
private const TEMPLATE = 'manutencao.gerenciamento';
|
|
|
|
public static function getTemplate($id)
|
|
{
|
|
|
|
$solicitacao = Solicitacao::findOrFail($id);
|
|
|
|
$causasProvaveis = $solicitacao->causaProvavel->map(function ($causaProvavel) {
|
|
return $causaProvavel->causaProvavel ? $causaProvavel->causaProvavel->nome : null;
|
|
})->filter();
|
|
|
|
$prestador = DB::table('cadastro_servico_manutencao_prestador_fornecedor as prestador')
|
|
->join('cadastro_unidade_executante_manutencao as unidade_executante', 'unidade_executante.id', 'prestador.unidade_executante_manutencao_id')
|
|
->leftJoin('cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'unidade_executante.infraestrutura_id')
|
|
->leftJoin('cadastro_unidade as unidade', 'unidade.id', 'infraestrutura.unidade_id')
|
|
->where('prestador.id', $solicitacao->prestador_id)
|
|
->select('unidade.nome_fantasia')
|
|
->get();
|
|
|
|
if ($prestador->isEmpty() || $prestador[0]->nome_fantasia === null) {
|
|
|
|
$prestador = DB::table('cadastro_servico_manutencao_prestador_fornecedor as prestador')
|
|
->join('cadastro_unidade_executante_manutencao as unidade_executante', 'unidade_executante.id', 'prestador.unidade_executante_manutencao_id')
|
|
->join('cadastro_fornecedor as fornecedor', 'fornecedor.id', 'unidade_executante.fornecedor_id')
|
|
->where('prestador.id', $solicitacao->prestador_id)
|
|
->select('fornecedor.nome_fantasia')
|
|
->get();
|
|
}
|
|
|
|
$mensagens = SolicitacaoMensagem::where('solicitacao_id', $solicitacao->id)
|
|
->orderBy('id', 'desc')
|
|
->get();
|
|
|
|
$resposta = SolicitacaoResposta::where('solicitacao_id', $solicitacao->id)
|
|
->orderBy('id', 'desc')
|
|
->get();
|
|
|
|
$mensagens = $mensagens->map(function ($mensagem, $key) use ($resposta) {
|
|
return [
|
|
'resposta' => isset($resposta[$key]) ? [
|
|
'mensagem' => $resposta[$key]->mensagem ?? null,
|
|
'data' => $resposta[$key]->created_at->format('d/m/Y') ?? null,
|
|
'hora' => $resposta[$key]->created_at->format('H:i') ?? null,
|
|
'nome_usuario' => $resposta[$key]->usuario->cidadao->nome ?? null,
|
|
'nome_unidade' => $resposta[$key]->infraestrutura->unidade->nome_fantasia ?? null,
|
|
] : null,
|
|
'mensagem' => [
|
|
'mensagem' => $mensagem->mensagem,
|
|
'data' => $mensagem->created_at->format('d/m/Y'),
|
|
'hora' => $mensagem->created_at->format('H:i'),
|
|
'is_respondida' => $mensagem->is_respondida ?? FALSE,
|
|
'resposta' => $mensagem->is_respondida,
|
|
'nome_usuario' => $mensagem->usuario->cidadao->nome,
|
|
'nome_unidade' => $mensagem->infraestrutura->unidade->nome_fantasia,
|
|
],
|
|
];
|
|
});
|
|
|
|
$itensAlmoxarifado = SolicitacaoItensAlmoxarifado::where('solicitacao_id', $solicitacao->id)
|
|
->get();
|
|
|
|
if ($itensAlmoxarifado->isNotEmpty()) {
|
|
|
|
$itensAlmoxarifado = $itensAlmoxarifado->map(function ($item) {
|
|
$descricao = MaterialModel::find($item->material_id)->descricao;
|
|
|
|
return [
|
|
'item' => $descricao,
|
|
'quantidade' => $item->quantidade,
|
|
];
|
|
});
|
|
} else {
|
|
|
|
$itensAlmoxarifado = collect([]);
|
|
}
|
|
|
|
$statusAberto = DB::table('manutencao_solicitacao_status_historico as historico')
|
|
->join('manutencao_parametrizacao_status as status', 'status.id', 'historico.status_id')
|
|
->where('historico.solicitacao_id', $solicitacao->id)
|
|
->where('status.tipo_id', StatusTipo::EM_ABERTO)
|
|
->select(
|
|
DB::raw('"Assinatura Solicitante" as assinatura'),
|
|
DB::raw('DATE_FORMAT(historico.created_at, "%d/%m/%Y") as data')
|
|
)
|
|
->orderBy('historico.created_at', 'asc')
|
|
->first();
|
|
|
|
$statusEmAtendimento = DB::table('manutencao_solicitacao_status_historico as historico')
|
|
->join('manutencao_parametrizacao_status as status', 'status.id', 'historico.status_id')
|
|
->where('historico.solicitacao_id', $solicitacao->id)
|
|
->where('status.tipo_id', StatusTipo::EM_ATENDIMENTO)
|
|
->select(
|
|
DB::raw('"Assinatura Prestador" as assinatura'),
|
|
DB::raw('DATE_FORMAT(historico.created_at, "%d/%m/%Y") as data')
|
|
)
|
|
->orderBy('historico.created_at', 'asc')
|
|
->first();
|
|
|
|
$resultadoImpressao = collect([]);
|
|
|
|
if ($statusAberto) {
|
|
$resultadoImpressao->push($statusAberto);
|
|
}
|
|
|
|
if ($statusEmAtendimento) {
|
|
$resultadoImpressao->push($statusEmAtendimento);
|
|
}
|
|
|
|
$data = [
|
|
'solicitou' => Str::ucfirst($solicitacao->created_at->translatedFormat('l, d \de F \de Y, \à\s H:i:s')),
|
|
'solicitante' =>[
|
|
'usuario' => $solicitacao->createdLotacao->usuario->cidadao->nome,
|
|
'unidade' => $solicitacao->infraestruturaSolicitante->unidade->nome_fantasia,
|
|
'infraestrutura' => $solicitacao->infraestruturaSolicitante->nome,
|
|
],
|
|
'grupo' => $solicitacao->grupo->nome,
|
|
'subgrupo' => $solicitacao->subgrupo->nome,
|
|
'servico' => $solicitacao->servico->nome,
|
|
'causaProvavel' => $causasProvaveis->isNotEmpty() ? $causasProvaveis->sort()->values() : collect('-'),
|
|
'assunto' => $solicitacao->assunto ?? '-',
|
|
'detalhe' => $solicitacao->detalhe ?? '-',
|
|
'status' => $solicitacao->status->nome,
|
|
'comentarios' => $mensagens,
|
|
'custo' => isset($solicitacao->custo) ? 'R$ '.number_format($solicitacao->custo, 2, ',', '.') : '-',
|
|
'agendamento' => !empty($solicitacao->data_agendamento) ? $solicitacao->data_agendamento->format('d/m/Y') : '-',
|
|
'numeroOs' => $solicitacao->os_prestador ?? '-',
|
|
'prestador' => $prestador->isNotEmpty() ? $prestador->first()->nome_fantasia : '-',
|
|
'itens_almoxarifado' => $itensAlmoxarifado->isNotEmpty() ? $itensAlmoxarifado : collect([]),
|
|
'linhasParaAssinatura' => $resultadoImpressao->isNotEmpty() ? $resultadoImpressao : collect([]),
|
|
];
|
|
|
|
return $data;
|
|
}
|
|
|
|
public function __invoke($id)
|
|
{
|
|
return Pdf1::generate(self::TITLE, self::TEMPLATE, self::getTemplate($id));
|
|
}
|
|
}
|