This commit is contained in:
@@ -0,0 +1,278 @@
|
||||
<?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,
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user