Files
rkm-conectasus-ci-sandbox/api/app/Services/ProntoAtendimento/RelatorioDocumentoNaoAssinadoService.php
Antonio Lopes dos Santos afec302c3e
All checks were successful
build-api-image / build (push) Successful in 51s
init commit
2026-08-04 16:52:02 -03:00

279 lines
14 KiB
PHP

<?php
namespace App\Services\ProntoAtendimento;
use App\Models\Cadastro\Estabelecimento\Infraestrutura;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Models\Cadastro\SujeitoAtencao\Usuario;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
class RelatorioDocumentoNaoAssinadoService extends Service
{
public static function index()
{
$periodo = [
Carbon::createFromFormat('d/m/Y', request()->periodo['start'])->setTime(0, 0, 0),
Carbon::createFromFormat('d/m/Y', request()->periodo['end'])->setTime(23, 59, 59)
];
$triagemQuery = DB::table('pronto_atendimento_atendimento_triagem as triagem')
->join('cadastro_centro_custo as centro_custo', 'centro_custo.id', 'triagem.created_centro_custo_id')
->join('cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'centro_custo.infraestrutura_id')
->join('cadastro_unidade as unidade', 'unidade.id', 'infraestrutura.unidade_id')
->join('cadastro_lotacao as lotacao', 'lotacao.id', 'triagem.created_lotacao_id')
->join('cadastro_usuario as usuario', 'usuario.id', 'lotacao.usuario_id')
->join('cadastro_cidadao as cidadao', 'cidadao.id', 'usuario.cidadao_id')
->join('pronto_atendimento_atendimento as atendimento', 'atendimento.id', 'triagem.atendimento_id')
->join('pronto_atendimento_faa as faa', 'faa.id', 'atendimento.faa_id')
->whereNull('triagem.deleted_at')
->where('triagem.is_faa_assinada', false)
->when(request()->infraestrutura_id, fn ($q, $id) => $q->where('centro_custo.infraestrutura_id', $id))
->when(request()->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
->when(request()->profissional_id, fn ($q, $id) => $q->where('lotacao.usuario_id', $id))
->whereBetween('triagem.created_at', $periodo)
->select(DB::raw("
'TRIAGEM' as tipo,
triagem.created_at as data_hora,
unidade.nome_fantasia as unidade,
COALESCE(infraestrutura.nome, unidade.nome_fantasia) as infraestrutura,
cidadao.nome as profissional,
atendimento.faa_id AS faa,
faa.numero AS faa_numero
"));
$medicoQuery = DB::table('pronto_atendimento_atendimento_medico as medico')
->join('cadastro_centro_custo as centro_custo', 'centro_custo.id', 'medico.created_centro_custo_id')
->join('cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'centro_custo.infraestrutura_id')
->join('cadastro_unidade as unidade', 'unidade.id', 'infraestrutura.unidade_id')
->join('cadastro_lotacao as lotacao', 'lotacao.id', 'medico.created_lotacao_id')
->join('cadastro_usuario as usuario', 'usuario.id', 'lotacao.usuario_id')
->join('cadastro_cidadao as cidadao', 'cidadao.id', 'usuario.cidadao_id')
->join('pronto_atendimento_atendimento as atendimento', 'atendimento.id', 'medico.atendimento_id')
->join('pronto_atendimento_faa as faa', 'faa.id', 'atendimento.faa_id')
->whereNull('medico.deleted_at')
->where('medico.is_faa_assinada', false)
->when(request()->infraestrutura_id, fn ($q, $id) => $q->where('centro_custo.infraestrutura_id', $id))
->when(request()->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
->when(request()->profissional_id, fn ($q, $id) => $q->where('lotacao.usuario_id', $id))
->whereBetween('medico.created_at', $periodo)
->select(DB::raw("
CONCAT('MÉDICO', IF(medico.is_observacao = 1,' (OBSERVAÇÃO)', '')) as tipo,
medico.created_at as data_hora,
unidade.nome_fantasia as unidade,
COALESCE(infraestrutura.nome, unidade.nome_fantasia) as infraestrutura,
cidadao.nome as profissional,
atendimento.faa_id AS faa,
faa.numero AS faa_numero
"));
$enfermagemQuery = DB::table('pronto_atendimento_atendimento_enfermagem as enfermagem')
->join('cadastro_centro_custo as centro_custo', 'centro_custo.id', 'enfermagem.created_centro_custo_id')
->join('cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'centro_custo.infraestrutura_id')
->join('cadastro_unidade as unidade', 'unidade.id', 'infraestrutura.unidade_id')
->join('cadastro_lotacao as lotacao', 'lotacao.id', 'enfermagem.created_lotacao_id')
->join('cadastro_usuario as usuario', 'usuario.id', 'lotacao.usuario_id')
->join('cadastro_cidadao as cidadao', 'cidadao.id', 'usuario.cidadao_id')
->join('pronto_atendimento_atendimento as atendimento', 'atendimento.id', 'enfermagem.atendimento_id')
->join('pronto_atendimento_faa as faa', 'faa.id', 'atendimento.faa_id')
->whereNull('enfermagem.deleted_at')
->where('enfermagem.is_faa_assinada', false)
->when(request()->infraestrutura_id, fn ($q, $id) => $q->where('centro_custo.infraestrutura_id', $id))
->when(request()->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
->when(request()->profissional_id, fn ($q, $id) => $q->where('lotacao.usuario_id', $id))
->whereBetween('enfermagem.created_at', $periodo)
->select(DB::raw("
'ENFERMAGEM' as tipo,
enfermagem.created_at as data_hora,
unidade.nome_fantasia as unidade,
COALESCE(infraestrutura.nome, unidade.nome_fantasia) as infraestrutura,
cidadao.nome as profissional,
atendimento.faa_id AS faa,
faa.numero AS faa_numero
"));
$observacaoQuery = DB::table('pronto_atendimento_paciente_observacao as observacao')
->join('cadastro_centro_custo as centro_custo', 'centro_custo.id', 'observacao.created_centro_custo_id')
->join('cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'centro_custo.infraestrutura_id')
->join('cadastro_unidade as unidade', 'unidade.id', 'infraestrutura.unidade_id')
->join('cadastro_lotacao as lotacao', 'lotacao.id', 'observacao.created_lotacao_id')
->join('cadastro_usuario as usuario', 'usuario.id', 'lotacao.usuario_id')
->join('cadastro_cidadao as cidadao', 'cidadao.id', 'usuario.cidadao_id')
->join('pronto_atendimento_atendimento as atendimento', 'atendimento.id', 'observacao.atendimento_id')
->join('pronto_atendimento_faa as faa', 'faa.id', 'atendimento.faa_id')
->whereNull('observacao.deleted_at')
->where('observacao.is_faa_assinada', false)
->when(request()->infraestrutura_id, fn ($q, $id) => $q->where('centro_custo.infraestrutura_id', $id))
->when(request()->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
->when(request()->profissional_id, fn ($q, $id) => $q->where('lotacao.usuario_id', $id))
->whereBetween('observacao.created_at', $periodo)
->select(DB::raw("
'ENFERMAGEM (OBSERVAÇÃO)' as tipo,
observacao.created_at as data_hora,
unidade.nome_fantasia as unidade,
COALESCE(infraestrutura.nome, unidade.nome_fantasia) as infraestrutura,
cidadao.nome as profissional,
atendimento.faa_id AS faa,
faa.numero AS faa_numero
"));
$receitaMedicaQuery = DB::table('pronto_atendimento_atendimento_medico_receita as receita')
->join('cadastro_centro_custo as centro_custo', 'centro_custo.id', 'receita.created_centro_custo_id')
->join('cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'centro_custo.infraestrutura_id')
->join('cadastro_unidade as unidade', 'unidade.id', 'infraestrutura.unidade_id')
->join('cadastro_lotacao as lotacao', 'lotacao.id', 'receita.created_lotacao_id')
->join('cadastro_usuario as usuario', 'usuario.id', 'lotacao.usuario_id')
->join('cadastro_cidadao as cidadao', 'cidadao.id', 'usuario.cidadao_id')
->join('pronto_atendimento_atendimento_medico as medico', 'medico.id', 'receita.atendimento_medico_id')
->join('pronto_atendimento_atendimento as atendimento', 'atendimento.id', 'medico.atendimento_id')
->join('pronto_atendimento_faa as faa', 'faa.id', 'atendimento.faa_id')
->whereNull('receita.deleted_at')
->where('receita.is_assinada', false)
->when(request()->infraestrutura_id, fn ($q, $id) => $q->where('centro_custo.infraestrutura_id', $id))
->when(request()->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
->when(request()->profissional_id, fn ($q, $id) => $q->where('lotacao.usuario_id', $id))
->whereBetween('receita.created_at', $periodo)
->select(DB::raw("
CONCAT('MÉDICO', IF(medico.is_observacao = 1,' (OBSERVAÇÃO)', ''), ' - RECEITA MÉDICA') as tipo,
receita.created_at as data_hora,
unidade.nome_fantasia as unidade,
COALESCE(infraestrutura.nome, unidade.nome_fantasia) as infraestrutura,
cidadao.nome as profissional,
atendimento.faa_id AS faa,
faa.numero AS faa_numero
"));
$documentos = null;
if (request()->tipo_documento == 'atendimento') {
$documentos = $triagemQuery
->unionAll($medicoQuery)
->unionAll($enfermagemQuery)
->unionAll($observacaoQuery);
}
else if (request()->tipo_documento == 'receita_medica') {
$documentos = $receitaMedicaQuery;
}
else {
$documentos = $triagemQuery
->unionAll($medicoQuery)
->unionAll($enfermagemQuery)
->unionAll($observacaoQuery)
->unionAll($receitaMedicaQuery);
}
$documentos = $documentos
->orderBy('data_hora')
->get();
return compact('documentos');
}
public static function list()
{
return [
'additionals' => self::getAdditionalsData(),
'form' => self::getFormData(),
'model' => self::getModelData(),
];
}
public static function getAdditionalsData()
{
return [
'data_atual' => Carbon::now()->format('d/m/Y'),
];
}
public static function getFormData()
{
$unidades = Unidade::orderBy('nome_fantasia')
->get(['id', 'nome_fantasia'])
->map(fn ($unidade) => [
'id' => $unidade->id,
'nome_fantasia' => $unidade->nome_fantasia,
'infraestruturas' => $unidade->infraestruturas()
->get(['id', 'nome', 'principal', 'unidade_id'])
->map(fn ($infraestrutura) => [
'id' => $infraestrutura->id,
'nome' => $infraestrutura->nome,
'profissionais' => $infraestrutura->lotacoes()
->with([
'usuario:id,cidadao_id',
'usuario.cidadao:id,nome',
])
->distinct()
->get(['usuario_id'])
->map(fn ($lotacao) => [
'id' => $lotacao->usuario_id,
'nome' => $lotacao->usuario()->withTrashed()->first()->cidadao->nome
])
->sortBy('nome')
->values()
])
->sortBy('nome')
->values()
]);
return [
'unidades' => $unidades,
'tipos_documento' => self::getTiposDocumento(),
];
}
private static function getTiposDocumento()
{
return collect([
['value' => 'atendimento', 'text' => 'ATENDIMENTO'],
['value' => 'receita_medica', 'text' => 'RECEITA MÉDICA'],
]);
}
public static function getModelData()
{
$now = Carbon::now()->format('d/m/Y');
return [
'periodo' => [
'start' => $now,
'end' => $now,
],
'unidade_id' => null,
'infraestrutura_id' => null,
'profissional_id' => null,
'tipo_documento' => null,
];
}
public static function getPrintExportData()
{
$resultado = self::index();
$itens = $resultado['documentos'];
$itens->each(function ($item) {
$item->data_hora = (new Carbon($item->data_hora))->format('d/m/Y H:i');
});
$unidade = Unidade::find(request()->unidade_id);
$infraestrutura = Infraestrutura::find(request()->infraestrutura_id);
$profissional = Usuario::find(request()->profissional_id);
$tipo = self::getTiposDocumento()->firstWhere('value', request()->tipo_documento);
return [
'inicio' => request()->periodo['start'],
'fim' => request()->periodo['end'],
'unidade' => $unidade->nome_fantasia ?? 'Todas',
'infraestrutura' => $infraestrutura->nome ?? 'Todas',
'profissional' => $profissional->cidadao->nome ?? 'Todos',
'tipo' => $tipo['text'] ?? 'Todos',
'colunas' => collect(request()->selectedCols),
'itens' => $itens,
];
}
}