Files
rkm-conectasus-ci-sandbox/api/app/Services/ProntoAtendimento/RelatorioPrescricaoInternaService.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

1197 lines
42 KiB
PHP

<?php
namespace App\Services\ProntoAtendimento;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;
class RelatorioPrescricaoInternaService extends Service
{
public static function autocompletePaciente()
{
$params = request()->all();
self::adjustPeriod($params);
$pacientes = DB::table('pronto_atendimento_atendimento_prescricao_interna_medicamento')
->select(
'cadastro_paciente.id',
'cadastro_cidadao.nome',
DB::raw("LPAD(cadastro_paciente.prontuario, 7, 0) as prontuario")
)
->distinct()
->join(
'cadastro_medicamento',
'cadastro_medicamento.id',
'pronto_atendimento_atendimento_prescricao_interna_medicamento.medicamento_id'
)
->join(
'pronto_atendimento_atendimento_prescricao_interna',
'pronto_atendimento_atendimento_prescricao_interna.id',
'pronto_atendimento_atendimento_prescricao_interna_medicamento.prescricao_interna_id'
)
->join(
'pronto_atendimento_atendimento_medico',
'pronto_atendimento_atendimento_medico.id',
'pronto_atendimento_atendimento_prescricao_interna.atendimento_medico_id'
)
->join(
'pronto_atendimento_atendimento',
'pronto_atendimento_atendimento.id',
'pronto_atendimento_atendimento_medico.atendimento_id'
)
->join(
'pronto_atendimento_faa',
'pronto_atendimento_faa.id',
'pronto_atendimento_atendimento.faa_id'
)
->join(
'cadastro_paciente',
'cadastro_paciente.id',
'pronto_atendimento_faa.paciente_id'
)
->join(
'cadastro_cidadao',
'cadastro_cidadao.id',
'cadastro_paciente.cidadao_id'
)
->join(
'pronto_atendimento_plantao',
'pronto_atendimento_plantao.id',
'pronto_atendimento_atendimento_medico.plantao_id'
)
->join(
'cadastro_lotacao',
'cadastro_lotacao.id',
'pronto_atendimento_plantao.lotacao_id'
)
->join(
'cadastro_usuario',
'cadastro_usuario.id',
'cadastro_lotacao.usuario_id'
)
->join(
'cadastro_cidadao AS cdp2',
'cdp2.id',
'cadastro_usuario.cidadao_id'
)
->join(
'pronto_atendimento_atendimento_prescricao_interna_aplicacao',
'pronto_atendimento_atendimento_prescricao_interna_aplicacao.prescricao_interna_medicamento_id',
'pronto_atendimento_atendimento_prescricao_interna_medicamento.id'
)
->leftJoin(
'pronto_atendimento_atendimento_enfermagem',
'pronto_atendimento_atendimento_enfermagem.id',
'pronto_atendimento_atendimento_prescricao_interna_aplicacao.atendimento_enfermagem_id'
)
->leftJoin(
'pronto_atendimento_plantao AS pap',
'pap.id',
'pronto_atendimento_atendimento_enfermagem.plantao_id'
)
->leftJoin(
'cadastro_lotacao AS cl',
'cl.id',
'pap.lotacao_id'
)
->leftJoin(
'cadastro_usuario AS cu',
'cu.id',
'cl.usuario_id'
)
->leftJoin(
'cadastro_cidadao AS cdu',
'cdu.id',
'cu.cidadao_id'
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'cadastro_lotacao.infraestrutura_id'
)
->join(
'cadastro_unidade',
'cadastro_unidade.id',
'cadastro_infraestrutura.unidade_id'
)
->join(
'sigtap.ocupacao AS o1',
'o1.id',
'cadastro_lotacao.ocupacao_id'
)
->leftJoin(
'sigtap.ocupacao AS o2',
'o2.id',
'cl.ocupacao_id'
)
->whereBetween(
DB::raw("DATE_FORMAT(pronto_atendimento_atendimento_prescricao_interna_medicamento.created_at, '%Y-%m-%d %H:%i')"),
[
$params['periodo']['date']['start'] ?? null,
$params['periodo']['date']['end'] ?? null
]
);
if (self::hasParamId($params, 'unidade_id')) {
$pacientes->where('cadastro_infraestrutura.unidade_id', $params['unidade_id']);
}
if (self::hasParamId($params, 'infraestrutura_id')) {
$pacientes->where('cadastro_infraestrutura.id', $params['infraestrutura_id']);
}
if (self::hasParamId($params, 'ocupacao_id')) {
$pacientes->whereRaw("COALESCE(o2.codigo, o1.codigo) IN ({$params['ocupacao_id']})");
}
if (self::hasParamId($params, 'profissional_id')) {
$pacientes->whereRaw("COALESCE(cu.id, cadastro_usuario.id) IN ({$params['profissional_id']})");
}
if (self::hasParamId($params, 'medicamento_id')) {
$medicamentoIds = $params['medicamento_id'];
$pacientes->whereIn('cadastro_medicamento.id', $medicamentoIds);
}
if (self::hasParamId($params, 'status')) {
$pacientes->where('pronto_atendimento_atendimento_prescricao_interna_aplicacao.status_id', $params['status']);
}
return $pacientes;
}
public static function index()
{
$params = request()->all();
self::adjustPeriod($params);
$atendimentos = DB::table('pronto_atendimento_atendimento_prescricao_interna_medicamento')
->select(
'pronto_atendimento_atendimento_medico.created_at AS data_hora',
'cadastro_medicamento.nome AS nome_medicamento',
'cdu.nome AS nome_medico',
'cdu2.nome AS _nome_aplicador',
'cdp.nome AS nome_paciente',
'pronto_atendimento_faa.numero AS numero_faa',
'cadastro_unidade.nome_fantasia AS nome_unidade',
DB::raw("
IF (
cadastro_infraestrutura.nome IS NULL,
cadastro_unidade.nome_fantasia,
cadastro_infraestrutura.nome
) AS local_atendimento
"),
DB::raw("CONCAT(o1.codigo, ' - ', o1.nome) AS cbo_medico"),
DB::raw("CONCAT(o2.codigo, ' - ', o2.nome) AS cbo_aplicador"),
DB::raw("
(
SELECT parametrizacao_exame_status.nome
FROM parametrizacao_exame_status
WHERE parametrizacao_exame_status.id = pronto_atendimento_atendimento_prescricao_interna_aplicacao.status_id
) AS status
"),
'cadastro_paciente.prontuario AS prontuario',
)
->join(
'cadastro_medicamento',
'cadastro_medicamento.id',
'pronto_atendimento_atendimento_prescricao_interna_medicamento.medicamento_id'
)
->join(
'pronto_atendimento_atendimento_prescricao_interna',
'pronto_atendimento_atendimento_prescricao_interna.id',
'pronto_atendimento_atendimento_prescricao_interna_medicamento.prescricao_interna_id'
)
->join(
'pronto_atendimento_atendimento_medico',
'pronto_atendimento_atendimento_medico.id',
'pronto_atendimento_atendimento_prescricao_interna.atendimento_medico_id'
)
->join(
'pronto_atendimento_atendimento',
'pronto_atendimento_atendimento.id',
'pronto_atendimento_atendimento_medico.atendimento_id'
)
->join(
'pronto_atendimento_faa',
'pronto_atendimento_faa.id',
'pronto_atendimento_atendimento.faa_id'
)
->join(
'cadastro_paciente',
'cadastro_paciente.id',
'pronto_atendimento_faa.paciente_id'
)
->join(
'cadastro_cidadao AS cdp',
'cdp.id',
'cadastro_paciente.cidadao_id'
)
->join(
'pronto_atendimento_plantao',
'pronto_atendimento_plantao.id',
'pronto_atendimento_atendimento_medico.plantao_id'
)
->join(
'cadastro_lotacao',
'cadastro_lotacao.id',
'pronto_atendimento_plantao.lotacao_id'
)
->join(
'cadastro_usuario',
'cadastro_usuario.id',
'cadastro_lotacao.usuario_id'
)
->join(
'cadastro_cidadao AS cdu',
'cdu.id',
'cadastro_usuario.cidadao_id'
)
->join(
'pronto_atendimento_atendimento_prescricao_interna_aplicacao',
'pronto_atendimento_atendimento_prescricao_interna_aplicacao.prescricao_interna_medicamento_id',
'pronto_atendimento_atendimento_prescricao_interna_medicamento.id'
)
->leftJoin(
'pronto_atendimento_atendimento_enfermagem',
'pronto_atendimento_atendimento_enfermagem.id',
'pronto_atendimento_atendimento_prescricao_interna_aplicacao.atendimento_enfermagem_id'
)
->leftJoin(
'pronto_atendimento_plantao AS pap',
'pap.id',
'pronto_atendimento_atendimento_enfermagem.plantao_id'
)
->leftJoin(
'cadastro_lotacao AS cl',
'cl.id',
'pap.lotacao_id'
)
->leftJoin(
'cadastro_usuario AS cu',
'cu.id',
'cl.usuario_id'
)
->leftJoin(
'cadastro_cidadao AS cdu2',
'cdu2.id',
'cu.cidadao_id'
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'cadastro_lotacao.infraestrutura_id'
)
->join(
'cadastro_unidade',
'cadastro_unidade.id',
'cadastro_infraestrutura.unidade_id'
)
->join(
'sigtap.ocupacao AS o1',
'o1.id',
'cadastro_lotacao.ocupacao_id'
)
->leftJoin(
'sigtap.ocupacao AS o2',
'o2.id',
'cl.ocupacao_id'
);
if (self::hasParamId($params, 'faa') && (int)$params['faa'] > 0 ) {
$atendimentos->where('pronto_atendimento_faa.numero', $params['faa']);
} else {
$atendimentos->whereBetween(
DB::raw("DATE_FORMAT(pronto_atendimento_atendimento_prescricao_interna.created_at, '%Y-%m-%d %H:%i')"),
[
$params['periodo']['date']['start'] ?? null,
$params['periodo']['date']['end'] ?? null
]
);
if (self::hasParamId($params, 'unidade_id')) {
$atendimentos->where('cadastro_infraestrutura.unidade_id', $params['unidade_id']);
}
if (self::hasParamId($params, 'local_atendimento_id')) {
$atendimentos->where('cadastro_infraestrutura.id', $params['local_atendimento_id']);
}
if (self::hasParamId($params, 'ocupacao_id')) {
$atendimentos->where(function ($query) use ($params) {
$query->where('o1.codigo', $params['ocupacao_id'])
->orWhere(function ($query) use ($params) {
$query->where('o2.codigo', $params['ocupacao_id'])
->whereNotNull('o2.codigo');
});
});
}
if (self::hasParamId($params, 'profissional_id')) {
$atendimentos->whereRaw(
"COALESCE(cu.id, cadastro_usuario.id) IN ({$params['profissional_id']})"
);
}
if (self::hasParamId($params, 'medicamento_id')) {
$medicamentoIds = $params['medicamento_id'];
$atendimentos->whereIn('cadastro_medicamento.id', $medicamentoIds);
}
if (isset($params['status'])) {
$atendimentos->where('pronto_atendimento_atendimento_prescricao_interna_aplicacao.status_id', $params['status']);
}
if (self::hasParamId($params, 'paciente_id')) {
$atendimentos->where('cadastro_paciente.id', $params['paciente_id']);
}
if (isset($params['prontuario'])) {
$atendimentos->where('cadastro_paciente.prontuario', (int)$params['prontuario']);
}
}
$atendimentos = $atendimentos->orderBy('pronto_atendimento_atendimento_prescricao_interna.created_at')
->get()
->map(function ($atendimento) {
return array_merge([
'atendido_em' => Carbon::parse($atendimento->data_hora)->format('d/m/Y H:i'),
'local_atendimento' => $atendimento->local_atendimento,
'medicamento' => $atendimento->nome_medicamento,
'nome_aplicador' => $atendimento->_nome_aplicador ?? '-',
'nome_medico_prescritor' => $atendimento->nome_medico ?? '-',
'nome_paciente' => $atendimento->nome_paciente,
'nome_unidade' => $atendimento->nome_unidade,
'numero_faa' => $atendimento->numero_faa,
'ocupacao_aplicador' => $atendimento->cbo_aplicador ?? '-',
'ocupacao_medico' => $atendimento->cbo_medico,
'prontuario' => $atendimento->prontuario,
'status_aplicacao' => $atendimento->status,
]);
});
return [
'atendimentos' => $atendimentos,
'total_atendimentos' => $atendimentos->count()
];
}
public static function list()
{
$params = collect(request()->all());
$camposParaCarregar = collect();
if($params->isNotEmpty()){
$camposParaCarregar->push(
'locais_atendimento',
'medicamentos',
'ocupacoes',
'profissionais',
'status',
'unidades',
);
}
return [
'form' => self::camposFiltrados($camposParaCarregar),
'model' => self::getModel(),
'additionals' => [
'data_atual' => Carbon::today()->format('d/m/Y'),
]
];
}
public static function filtragemPorUnidade(){
return self::camposFiltrados(collect([
'locais_atendimento',
'medicamentos',
'ocupacoes',
'profissionais',
'status',
]));
}
public static function filtragemPorLocalAtendimento(){
return self::camposFiltrados(collect([
'medicamentos',
'ocupacoes',
'profissionais',
'status',
]));
}
public static function filtragemPorOcupacao(){
return self::camposFiltrados(collect([
'medicamentos',
'profissionais',
'status',
]));
}
public static function filtragemPorProfissional(){
return self::camposFiltrados(collect([
'medicamentos',
'status'
]));
}
public static function filtragemPorMedicamento(){
return self::camposFiltrados(collect([
'status',
]));
}
private static function camposFiltrados(Collection $campos){
$params = request()->all();
$dados = collect();
self::adjustPeriod($params);
if ($campos->contains('unidades')) {
$dados->put('unidades', self::getUnidades($params));
}
if ($campos->contains('locais_atendimento')) {
$dados->put('locais_atendimento', self::getLocaisAtendimento($params));
}
if ($campos->contains('ocupacoes')) {
$dados->put('ocupacoes', self::getOcupacoes($params));
}
if ($campos->contains('profissionais')) {
$dados->put('profissionais', self::getProfissionais($params));
}
if ($campos->contains('medicamentos')) {
$dados->put('medicamentos', self::getMedicamentos($params));
}
if ($campos->contains('status')) {
$dados->put('status', self::getStatus($params));
}
return $dados->all();
}
private static function adjustPeriod(&$params)
{
if (is_null($params['periodo']['date']['start'] ?? null) || is_null($params['periodo']['date']['end'] ?? null)) {
return;
}
$dateStart = $params['periodo']['date']['start'];
$dateEnd = $params['periodo']['date']['end'];
$timeStart = $params['periodo']['time']['start'];
$timeEnd = $params['periodo']['time']['end'];
$params['periodo']['date']['start'] = (Carbon::createFromFormat('d/m/Y', "{$dateStart}"))->startOfDay();
$params['periodo']['date']['end'] = (Carbon::createFromFormat('d/m/Y', "{$dateEnd}"))->endOfDay();
if (!is_null($timeStart ?? null)) {
$params['periodo']['date']['start'] = Carbon::createFromFormat('d/m/Y H:i:s', "{$dateStart} {$timeStart}");
}
if (!is_null($timeEnd)) {
$params['periodo']['date']['end'] = Carbon::createFromFormat('d/m/Y H:i:s', "{$dateEnd} {$timeEnd}");
}
$params['periodo']['date']['start'] = $params['periodo']['date']['start']->format('Y-m-d H:i');
$params['periodo']['date']['end'] = $params['periodo']['date']['end']->format('Y-m-d H:i');
}
private static function getUnidades($params)
{
$unidades = DB::table('cadastro_unidade')
->select(
'cadastro_unidade.id',
'cadastro_unidade.nome_fantasia',
)
->distinct()
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.unidade_id',
'cadastro_unidade.id'
)
->join(
'cadastro_lotacao',
'cadastro_lotacao.infraestrutura_id',
'cadastro_infraestrutura.id'
)
->join(
'pronto_atendimento_plantao',
'pronto_atendimento_plantao.lotacao_id',
'cadastro_lotacao.id'
)
->join(
'pronto_atendimento_atendimento_medico',
'pronto_atendimento_atendimento_medico.plantao_id',
'pronto_atendimento_plantao.id'
)
->join(
'pronto_atendimento_atendimento_prescricao_interna',
'pronto_atendimento_atendimento_prescricao_interna.atendimento_medico_id',
'pronto_atendimento_atendimento_medico.id'
)
->join(
'pronto_atendimento_atendimento_prescricao_interna_medicamento',
'pronto_atendimento_atendimento_prescricao_interna_medicamento.prescricao_interna_id',
'pronto_atendimento_atendimento_prescricao_interna.id'
)
->whereBetween(
DB::raw("DATE_FORMAT(pronto_atendimento_atendimento_prescricao_interna.created_at, '%Y-%m-%d %H:%i')"),
[
$params['periodo']['date']['start'] ?? null,
$params['periodo']['date']['end'] ?? null
]
);
return $unidades
->orderBy('cadastro_unidade.nome_fantasia')
->get();
}
private static function getLocaisAtendimento($params)
{
$infraestruturas = DB::table('cadastro_infraestrutura')
->select(
'cadastro_infraestrutura.id',
DB::raw("
CASE WHEN cadastro_infraestrutura.nome IS NOT NULL
THEN cadastro_infraestrutura.nome
ELSE cadastro_unidade.nome_fantasia
END AS nome
"),
)
->distinct()
->join(
'cadastro_lotacao',
'cadastro_lotacao.infraestrutura_id',
'cadastro_infraestrutura.id'
)
->join(
'pronto_atendimento_plantao',
'pronto_atendimento_plantao.lotacao_id',
'cadastro_lotacao.id'
)
->join(
'pronto_atendimento_atendimento_medico',
'pronto_atendimento_atendimento_medico.plantao_id',
'pronto_atendimento_plantao.id'
)
->join(
'pronto_atendimento_atendimento_prescricao_interna',
'pronto_atendimento_atendimento_prescricao_interna.atendimento_medico_id',
'pronto_atendimento_atendimento_medico.id'
)
->join(
'pronto_atendimento_atendimento_prescricao_interna_medicamento',
'pronto_atendimento_atendimento_prescricao_interna_medicamento.prescricao_interna_id',
'pronto_atendimento_atendimento_prescricao_interna.id'
)
->leftJoin(
'cadastro_unidade',
'cadastro_unidade.id',
'cadastro_infraestrutura.unidade_id'
)
->whereBetween(
DB::raw("DATE_FORMAT(pronto_atendimento_atendimento_prescricao_interna.created_at, '%Y-%m-%d %H:%i')"),
[
$params['periodo']['date']['start'] ?? null,
$params['periodo']['date']['end'] ?? null
]
);
if (self::hasParamId($params, 'unidade_id')) {
$infraestruturas->where('cadastro_unidade.id', $params['unidade_id']);
}
return $infraestruturas->orderBy(DB::raw("
CASE WHEN cadastro_infraestrutura.nome IS NOT NULL
THEN cadastro_infraestrutura.nome
ELSE cadastro_unidade.nome_fantasia
END
"))
->get();
}
private static function getOcupacoes($params)
{
$ocupacoes = DB::table('pronto_atendimento_atendimento_prescricao_interna_medicamento')
->select(
DB::raw("
COALESCE(o2.codigo, o1.codigo) AS 'id'
"),
DB::raw("
COALESCE(o2.nome, o1.nome) AS 'nome'
"),
)
->distinct()
->join(
'pronto_atendimento_atendimento_prescricao_interna',
'pronto_atendimento_atendimento_prescricao_interna.id',
'pronto_atendimento_atendimento_prescricao_interna_medicamento.prescricao_interna_id'
)
->join(
'pronto_atendimento_atendimento_medico',
'pronto_atendimento_atendimento_medico.id',
'pronto_atendimento_atendimento_prescricao_interna.atendimento_medico_id'
)
->join(
'pronto_atendimento_atendimento',
'pronto_atendimento_atendimento.id',
'pronto_atendimento_atendimento_medico.atendimento_id'
)
->join(
'pronto_atendimento_plantao',
'pronto_atendimento_plantao.id',
'pronto_atendimento_atendimento_medico.plantao_id'
)
->join(
'cadastro_lotacao',
'cadastro_lotacao.id',
'pronto_atendimento_plantao.lotacao_id'
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'cadastro_lotacao.infraestrutura_id'
)
->join(
'cadastro_unidade',
'cadastro_unidade.id',
'cadastro_infraestrutura.unidade_id'
)
->leftJoin(
'pronto_atendimento_atendimento_prescricao_interna_aplicacao',
'pronto_atendimento_atendimento_prescricao_interna_aplicacao.prescricao_interna_medicamento_id',
'pronto_atendimento_atendimento_prescricao_interna_medicamento.id'
)
->leftJoin(
'pronto_atendimento_atendimento_enfermagem',
'pronto_atendimento_atendimento_enfermagem.id',
'pronto_atendimento_atendimento_prescricao_interna_aplicacao.atendimento_enfermagem_id'
)
->leftJoin(
'pronto_atendimento_plantao AS pap',
'pap.id',
'pronto_atendimento_atendimento_enfermagem.plantao_id'
)
->leftJoin(
'cadastro_lotacao AS cl',
'cl.id',
'pap.lotacao_id'
)
->leftJoin(
'sigtap.ocupacao AS o1',
'o1.id',
'cadastro_lotacao.ocupacao_id'
)
->leftJoin(
'sigtap.ocupacao AS o2',
'o2.id',
'cl.ocupacao_id'
)
->whereBetween(
DB::raw("DATE_FORMAT(pronto_atendimento_atendimento_prescricao_interna.created_at, '%Y-%m-%d %H:%i')"),
[
$params['periodo']['date']['start'] ?? null,
$params['periodo']['date']['end'] ?? null
]
);
if (self::hasParamId($params, 'unidade_id')) {
$ocupacoes->where('cadastro_infraestrutura.unidade_id', $params['unidade_id']);
}
if (self::hasParamId($params, 'infraestrutura_id')) {
$ocupacoes->where('cadastro_infraestrutura.id', $params['infraestrutura_id']);
}
return $ocupacoes
->orderBy('nome')
->get();
}
private static function getProfissionais($params)
{
$profissionais = DB::table('pronto_atendimento_atendimento_prescricao_interna_medicamento')
->select(
DB::raw("
COALESCE(cu.id, cadastro_usuario.id) AS 'id'
"),
DB::raw("
COALESCE(cdu.nome, cadastro_cidadao.nome) AS 'nome'
"),
)
->distinct()
->join(
'pronto_atendimento_atendimento_prescricao_interna',
'pronto_atendimento_atendimento_prescricao_interna.id',
'pronto_atendimento_atendimento_prescricao_interna_medicamento.prescricao_interna_id'
)
->join(
'pronto_atendimento_atendimento_medico',
'pronto_atendimento_atendimento_medico.id',
'pronto_atendimento_atendimento_prescricao_interna.atendimento_medico_id'
)
->join(
'pronto_atendimento_atendimento',
'pronto_atendimento_atendimento.id',
'pronto_atendimento_atendimento_medico.atendimento_id'
)
->join(
'pronto_atendimento_plantao',
'pronto_atendimento_plantao.id',
'pronto_atendimento_atendimento_medico.plantao_id'
)
->join(
'cadastro_lotacao',
'cadastro_lotacao.id',
'pronto_atendimento_plantao.lotacao_id'
)
->join(
'cadastro_usuario',
'cadastro_usuario.id',
'cadastro_lotacao.usuario_id'
)
->join(
'cadastro_cidadao',
'cadastro_cidadao.id',
'cadastro_usuario.cidadao_id'
)
->join(
'pronto_atendimento_atendimento_prescricao_interna_aplicacao',
'pronto_atendimento_atendimento_prescricao_interna_aplicacao.prescricao_interna_medicamento_id',
'pronto_atendimento_atendimento_prescricao_interna_medicamento.id'
)
->leftJoin(
'pronto_atendimento_atendimento_enfermagem',
'pronto_atendimento_atendimento_enfermagem.id',
'pronto_atendimento_atendimento_prescricao_interna_aplicacao.atendimento_enfermagem_id'
)
->leftJoin(
'pronto_atendimento_plantao AS pap',
'pap.id',
'pronto_atendimento_atendimento_enfermagem.plantao_id'
)
->leftJoin(
'cadastro_lotacao AS cl',
'cl.id',
'pap.lotacao_id'
)
->leftJoin(
'cadastro_usuario AS cu',
'cu.id',
'cl.usuario_id'
)
->leftJoin(
'cadastro_cidadao AS cdu',
'cdu.id',
'cu.cidadao_id'
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'cadastro_lotacao.infraestrutura_id'
)
->join(
'cadastro_unidade',
'cadastro_unidade.id',
'cadastro_infraestrutura.unidade_id'
)
->join(
'sigtap.ocupacao AS o1',
'o1.id',
'cadastro_lotacao.ocupacao_id'
)
->leftJoin(
'sigtap.ocupacao AS o2',
'o2.id',
'cl.ocupacao_id'
)
->whereBetween(
DB::raw("DATE_FORMAT(pronto_atendimento_atendimento_prescricao_interna_medicamento.created_at, '%Y-%m-%d %H:%i')"),
[
$params['periodo']['date']['start'] ?? null,
$params['periodo']['date']['end'] ?? null
]
);
if (self::hasParamId($params, 'unidade_id')) {
$profissionais->where('cadastro_infraestrutura.unidade_id', $params['unidade_id']);
}
if (self::hasParamId($params, 'infraestrutura_id')) {
$profissionais->where('cadastro_infraestrutura.id', $params['infraestrutura_id']);
}
if (self::hasParamId($params, 'ocupacao_id')) {
$profissionais->whereRaw("COALESCE(o2.codigo, o1.codigo) IN ({$params['ocupacao_id']})");
}
return $profissionais
->orderBy('nome')
->get();
}
private static function getMedicamentos($params)
{
$profissionais = DB::table('pronto_atendimento_atendimento_prescricao_interna_medicamento')
->select(
'cadastro_medicamento.id',
'cadastro_medicamento.nome AS nome'
)
->distinct()
->join(
'cadastro_medicamento',
'cadastro_medicamento.id',
'pronto_atendimento_atendimento_prescricao_interna_medicamento.medicamento_id'
)
->join(
'pronto_atendimento_atendimento_prescricao_interna',
'pronto_atendimento_atendimento_prescricao_interna.id',
'pronto_atendimento_atendimento_prescricao_interna_medicamento.prescricao_interna_id'
)
->join(
'pronto_atendimento_atendimento_medico',
'pronto_atendimento_atendimento_medico.id',
'pronto_atendimento_atendimento_prescricao_interna.atendimento_medico_id'
)
->join(
'pronto_atendimento_atendimento',
'pronto_atendimento_atendimento.id',
'pronto_atendimento_atendimento_medico.atendimento_id'
)
->join(
'pronto_atendimento_plantao',
'pronto_atendimento_plantao.id',
'pronto_atendimento_atendimento_medico.plantao_id'
)
->join(
'cadastro_lotacao',
'cadastro_lotacao.id',
'pronto_atendimento_plantao.lotacao_id'
)
->join(
'cadastro_usuario',
'cadastro_usuario.id',
'cadastro_lotacao.usuario_id'
)
->join(
'cadastro_cidadao',
'cadastro_cidadao.id',
'cadastro_usuario.cidadao_id'
)
->join(
'pronto_atendimento_atendimento_prescricao_interna_aplicacao',
'pronto_atendimento_atendimento_prescricao_interna_aplicacao.prescricao_interna_medicamento_id',
'pronto_atendimento_atendimento_prescricao_interna_medicamento.id'
)
->leftJoin(
'pronto_atendimento_atendimento_enfermagem',
'pronto_atendimento_atendimento_enfermagem.id',
'pronto_atendimento_atendimento_prescricao_interna_aplicacao.atendimento_enfermagem_id'
)
->leftJoin(
'pronto_atendimento_plantao AS pap',
'pap.id',
'pronto_atendimento_atendimento_enfermagem.plantao_id'
)
->leftJoin(
'cadastro_lotacao AS cl',
'cl.id',
'pap.lotacao_id'
)
->leftJoin(
'cadastro_usuario AS cu',
'cu.id',
'cl.usuario_id'
)
->leftJoin(
'cadastro_cidadao AS cdu',
'cdu.id',
'cu.cidadao_id'
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'cadastro_lotacao.infraestrutura_id'
)
->join(
'cadastro_unidade',
'cadastro_unidade.id',
'cadastro_infraestrutura.unidade_id'
)
->join(
'sigtap.ocupacao AS o1',
'o1.id',
'cadastro_lotacao.ocupacao_id'
)
->leftJoin(
'sigtap.ocupacao AS o2',
'o2.id',
'cl.ocupacao_id'
)
->whereBetween(
DB::raw("DATE_FORMAT(pronto_atendimento_atendimento_prescricao_interna_medicamento.created_at, '%Y-%m-%d %H:%i')"),
[
$params['periodo']['date']['start'] ?? null,
$params['periodo']['date']['end'] ?? null
]
);
if (self::hasParamId($params, 'unidade_id')) {
$profissionais->where('cadastro_infraestrutura.unidade_id', $params['unidade_id']);
}
if (self::hasParamId($params, 'infraestrutura_id')) {
$profissionais->where('cadastro_infraestrutura.id', $params['infraestrutura_id']);
}
if (self::hasParamId($params, 'ocupacao_id')) {
$profissionais->whereRaw("COALESCE(o2.codigo, o1.codigo) IN ({$params['ocupacao_id']})");
}
if (self::hasParamId($params, 'profissional_id')) {
$profissionais->whereRaw("COALESCE(cu.id, cadastro_usuario.id) IN ({$params['profissional_id']})");
}
return $profissionais
->orderBy('nome')
->get();
}
private static function getStatus($params)
{
$params = request()->all();
self::adjustPeriod($params);
$status = DB::table('pronto_atendimento_atendimento_prescricao_interna_medicamento')
->select(
'parametrizacao_exame_status.nome',
'parametrizacao_exame_status.id'
)
->distinct()
->join(
'cadastro_medicamento',
'cadastro_medicamento.id',
'pronto_atendimento_atendimento_prescricao_interna_medicamento.medicamento_id'
)
->join(
'pronto_atendimento_atendimento_prescricao_interna',
'pronto_atendimento_atendimento_prescricao_interna.id',
'pronto_atendimento_atendimento_prescricao_interna_medicamento.prescricao_interna_id'
)
->join(
'pronto_atendimento_atendimento_medico',
'pronto_atendimento_atendimento_medico.id',
'pronto_atendimento_atendimento_prescricao_interna.atendimento_medico_id'
)
->join(
'pronto_atendimento_atendimento',
'pronto_atendimento_atendimento.id',
'pronto_atendimento_atendimento_medico.atendimento_id'
)
->join(
'pronto_atendimento_faa',
'pronto_atendimento_faa.id',
'pronto_atendimento_atendimento.faa_id'
)
->join(
'cadastro_paciente',
'cadastro_paciente.id',
'pronto_atendimento_faa.paciente_id'
)
->join(
'cadastro_cidadao',
'cadastro_cidadao.id',
'cadastro_paciente.cidadao_id'
)
->join(
'pronto_atendimento_plantao',
'pronto_atendimento_plantao.id',
'pronto_atendimento_atendimento_medico.plantao_id'
)
->join(
'cadastro_lotacao',
'cadastro_lotacao.id',
'pronto_atendimento_plantao.lotacao_id'
)
->join(
'cadastro_usuario',
'cadastro_usuario.id',
'cadastro_lotacao.usuario_id'
)
->join(
'cadastro_cidadao AS cdp2',
'cdp2.id',
'cadastro_usuario.cidadao_id'
)
->join(
'pronto_atendimento_atendimento_prescricao_interna_aplicacao',
'pronto_atendimento_atendimento_prescricao_interna_aplicacao.prescricao_interna_medicamento_id',
'pronto_atendimento_atendimento_prescricao_interna_medicamento.id'
)
->leftJoin(
'pronto_atendimento_atendimento_enfermagem',
'pronto_atendimento_atendimento_enfermagem.id',
'pronto_atendimento_atendimento_prescricao_interna_aplicacao.atendimento_enfermagem_id'
)
->leftJoin(
'pronto_atendimento_plantao AS pap',
'pap.id',
'pronto_atendimento_atendimento_enfermagem.plantao_id'
)
->leftJoin(
'cadastro_lotacao AS cl',
'cl.id',
'pap.lotacao_id'
)
->leftJoin(
'cadastro_usuario AS cu',
'cu.id',
'cl.usuario_id'
)
->leftJoin(
'cadastro_cidadao AS cdu',
'cdu.id',
'cu.cidadao_id'
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'cadastro_lotacao.infraestrutura_id'
)
->join(
'cadastro_unidade',
'cadastro_unidade.id',
'cadastro_infraestrutura.unidade_id'
)
->join(
'sigtap.ocupacao AS o1',
'o1.id',
'cadastro_lotacao.ocupacao_id'
)
->leftJoin(
'sigtap.ocupacao AS o2',
'o2.id',
'cl.ocupacao_id'
)
->join(
'parametrizacao_exame_status',
'parametrizacao_exame_status.id',
'pronto_atendimento_atendimento_prescricao_interna_aplicacao.status_id'
)
->whereBetween(
DB::raw("DATE_FORMAT(pronto_atendimento_atendimento_prescricao_interna_medicamento.created_at, '%Y-%m-%d %H:%i')"),
[
$params['periodo']['date']['start'] ?? null,
$params['periodo']['date']['end'] ?? null
]
);
if (self::hasParamId($params, 'unidade_id')) {
$status->where('cadastro_infraestrutura.unidade_id', $params['unidade_id']);
}
if (self::hasParamId($params, 'infraestrutura_id')) {
$status->where('cadastro_infraestrutura.id', $params['infraestrutura_id']);
}
if (self::hasParamId($params, 'ocupacao_id')) {
$status->whereRaw("COALESCE(o2.codigo, o1.codigo) IN ({$params['ocupacao_id']})");
}
if (self::hasParamId($params, 'profissional_id')) {
$status->whereRaw("COALESCE(cu.id, cadastro_usuario.id) IN ({$params['profissional_id']})");
}
if (self::hasParamId($params, 'medicamento_id')) {
$medicamentoIds = $params['medicamento_id'];
$status->whereIn('cadastro_medicamento.id', $medicamentoIds);
}
return $status
->orderBy('nome')
->get();
}
private static function hasParamId($params, $param)
{
return isset($params[$param]) && $params[$param] > 0;
}
private static function getModel()
{
return [
'periodo' => [
'date' => [
'start' => null,
'end' => null,
],
'time' => [
'start' => null,
'end' => null,
]
],
'unidade_id' => null,
'local_atendimento_id' => null,
'profissional_id' => null,
'status' => null,
'paciente_id' => null,
'paciente' => null,
'prontuario' => null,
'ocupacaoId' => null,
'medicamentoId' => null,
'faa' => null,
];
}
}