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

336 lines
19 KiB
PHP

<?php
namespace App\Services\Ambulatorio;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
class RelatorioQuantitativoCidService extends Service
{
public static function index()
{
$params = self::getParams();
$atendimentos = DB::table('ambulatorio_atendimento_soap_problema_condicao')
->select([
'cid.codigo AS cid_codigo',
'cid.nome AS cid_nome',
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
DB::raw("COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS infraestrutura_nome"),
DB::raw("COALESCE(COUNT(IF(ambulatorio_jornada.data BETWEEN '" . $params->periodo['start'] . "' AND '" . $params->periodo['end'] . "', 1, NULL)), 0) AS quantidade_jornada"),
DB::raw("COALESCE(COUNT(IF(ambulatorio_demanda_espontanea.data BETWEEN '{$params->periodo['start']}' AND '{$params->periodo['end']}', 1, NULL)), 0) AS quantidade_demanda"),
])
->join('ambulatorio_atendimento_soap', 'ambulatorio_atendimento_soap.id', 'ambulatorio_atendimento_soap_problema_condicao.soap_id')
->join('ambulatorio_atendimento', 'ambulatorio_atendimento.id', 'ambulatorio_atendimento_soap.atendimento_id')
->leftJoin('ambulatorio_agendamento', 'ambulatorio_agendamento.id', 'ambulatorio_atendimento.agendamento_id')
->leftJoin('ambulatorio_jornada', 'ambulatorio_jornada.id', 'ambulatorio_agendamento.jornada_id')
->leftJoin('ambulatorio_demanda_espontanea', 'ambulatorio_demanda_espontanea.id', 'ambulatorio_atendimento.demanda_espontanea_id')
->leftJoin('cadastro_lotacao', function ($join) {
$join->on('cadastro_lotacao.id', '=', 'ambulatorio_jornada.lotacao_id')
->orOn('cadastro_lotacao.id', '=', 'ambulatorio_demanda_espontanea.created_lotacao_id');
})
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_lotacao.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->join('sigtap.cid', 'cid.id', 'ambulatorio_atendimento_soap_problema_condicao.cid_id')
->leftJoin('cadastro_paciente as paciente_agendamento', 'paciente_agendamento.id', '=', 'ambulatorio_agendamento.paciente_id')
->leftJoin('cadastro_paciente as paciente_demanda', 'paciente_demanda.id', '=', 'ambulatorio_demanda_espontanea.paciente_id')
->join('cadastro_cidadao', function($join) {
$join->on('cadastro_cidadao.id', '=', DB::raw('COALESCE(paciente_agendamento.cidadao_id, paciente_demanda.cidadao_id)'));
})
->where('ambulatorio_atendimento_soap.is_rascunho', false)
->whereNull('cadastro_lotacao.deleted_at')
->whereNull('cadastro_infraestrutura.deleted_at')
->whereNull('cadastro_unidade.deleted_at')
->havingRaw("quantidade_demanda + quantidade_jornada > 0")
->when($params->unidade_id, fn ($q, $unidadeId) => $q
->where('cadastro_infraestrutura.unidade_id', $unidadeId)
)
->when($params->infraestrutura_id, fn ($q, $infraestruturaId) => $q
->where('cadastro_infraestrutura.id', $infraestruturaId)
)
->when($params->ocupacao_id, function ($q, $ocupacaoId) {
$q->where(function ($query) use ($ocupacaoId) {
$query->where('cadastro_lotacao.ocupacao_id', $ocupacaoId)
->orWhere('ambulatorio_demanda_espontanea.ocupacao_id', $ocupacaoId);
});
})
->when($params->cid_id, fn ($q, $cidId) => $q
->where('cid.id', $cidId)
)
->when($params->idade_de, fn ($q, $idadeDe) => $q
->whereRaw(DB::raw("TIMESTAMPDIFF(YEAR, cadastro_cidadao.data_nascimento, CURRENT_DATE) >= " . $idadeDe))
)
->when($params->idade_ate, fn ($q, $idadeAte) => $q
->whereRaw(DB::raw("TIMESTAMPDIFF(YEAR, cadastro_cidadao.data_nascimento, CURRENT_DATE) <= " . $idadeAte))
)
->groupBy([
'cid.codigo',
'cid.nome',
'cadastro_unidade.nome_fantasia',
DB::raw("COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia)"),
])
->get()
->map(function($query) {
$query->cid = $query->cid_codigo . ' - ' . $query->cid_nome;
$query->quantidade = $query->quantidade_jornada + $query->quantidade_demanda;
unset($query->cid_codigo, $query->cid_nome, $query->quantidade_jornada, $query->quantidade_demanda);
return $query;
});
return ['itens' => $atendimentos];
}
public static function create()
{
return [
'form' => [
'unidades' => [],
'infraestruturas' => [],
'ocupacoes' => [],
],
'model' => [
'periodo' => ['start' => null, 'end' => null],
'unidade_id' => null,
'infraestrutura_id' => null,
'ocupacao_id' => null,
'cid' => null,
'idade_de' => null,
'idade_ate' => null,
],
];
}
public static function list()
{
$params = self::getParams();
switch (request()->listar) {
case 'unidades': {
return [
'unidades' => self::getUnidades($params),
'infraestruturas' => self::getInfraestruturas($params),
'ocupacoes' => self::getOcupacoes($params),
];
}
case 'infraestruturas': {
return [
'infraestruturas' => self::getInfraestruturas($params),
'ocupacoes' => self::getOcupacoes($params),
];
}
case 'ocupacoes': {
return [
'ocupacoes' => self::getOcupacoes($params),
];
}
}
}
private static function getParams()
{
return (object) [
'periodo' => [
'start' => Carbon::createFromFormat('d/m/Y', request()->get('periodo')['start'])->setTime(0, 0, 0),
'end' => Carbon::createFromFormat('d/m/Y', request()->get('periodo')['end'])->setTime(23, 59, 59)
],
'unidade_id' => request()->get('unidade_id'),
'infraestrutura_id' => request()->get('infraestrutura_id'),
'ocupacao_id' => request()->get('ocupacao_id'),
'cid_id' => request()->get('cid_id'),
'idade_de' => request()->get('idade_de'),
'idade_ate' => request()->get('idade_ate'),
];
}
private static function getUnidades($params)
{
return DB::table('cadastro_unidade')
->select([
'cadastro_unidade.id',
'cadastro_unidade.nome_fantasia',
])
->whereExists(fn ($q) => $q
->select(DB::raw(1))
->from('ambulatorio_atendimento_soap_problema_condicao')
->join('ambulatorio_atendimento_soap', 'ambulatorio_atendimento_soap.id', 'ambulatorio_atendimento_soap_problema_condicao.soap_id')
->join('ambulatorio_atendimento', 'ambulatorio_atendimento.id', 'ambulatorio_atendimento_soap.atendimento_id')
->join('ambulatorio_agendamento', 'ambulatorio_agendamento.id', 'ambulatorio_atendimento.agendamento_id')
->join('ambulatorio_jornada', 'ambulatorio_jornada.id', 'ambulatorio_agendamento.jornada_id')
->join('cadastro_lotacao', 'cadastro_lotacao.id', 'ambulatorio_jornada.lotacao_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_lotacao.infraestrutura_id')
->whereColumn('cadastro_infraestrutura.unidade_id', 'cadastro_unidade.id')
->where('ambulatorio_atendimento_soap.is_rascunho', false)
->whereNotNull('ambulatorio_atendimento_soap_problema_condicao.cid_id')
->whereBetween('ambulatorio_jornada.data', $params->periodo)
)
->orWhereExists(fn ($q) => $q
->from('ambulatorio_atendimento_soap_problema_condicao')
->join('ambulatorio_atendimento_soap', 'ambulatorio_atendimento_soap.id', 'ambulatorio_atendimento_soap_problema_condicao.soap_id')
->join('ambulatorio_atendimento', 'ambulatorio_atendimento.id', 'ambulatorio_atendimento_soap.atendimento_id')
->join('ambulatorio_demanda_espontanea', 'ambulatorio_demanda_espontanea.id', 'ambulatorio_atendimento.demanda_espontanea_id')
->join('cadastro_lotacao', 'cadastro_lotacao.id', 'ambulatorio_demanda_espontanea.created_lotacao_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_lotacao.infraestrutura_id')
->whereColumn('cadastro_infraestrutura.unidade_id', 'cadastro_unidade.id')
->where('ambulatorio_atendimento_soap.is_rascunho', false)
->whereNotNull('ambulatorio_atendimento_soap_problema_condicao.cid_id')
->whereNotNull('ambulatorio_demanda_espontanea.ocupacao_id')
->whereBetween('ambulatorio_demanda_espontanea.data', $params->periodo)
)
->orderBy('cadastro_unidade.nome_fantasia')
->get();
}
private static function getInfraestruturas($params)
{
return DB::table('cadastro_infraestrutura')
->select([
'cadastro_infraestrutura.id',
DB::raw("COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS nome"),
])
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->where('cadastro_infraestrutura.unidade_id', $params->unidade_id)
->where(fn ($q) => $q
->whereExists(fn ($q) => $q
->select(DB::raw(1))
->from('ambulatorio_atendimento_soap_problema_condicao')
->join('ambulatorio_atendimento_soap', 'ambulatorio_atendimento_soap.id', 'ambulatorio_atendimento_soap_problema_condicao.soap_id')
->join('ambulatorio_atendimento', 'ambulatorio_atendimento.id', 'ambulatorio_atendimento_soap.atendimento_id')
->join('ambulatorio_agendamento', 'ambulatorio_agendamento.id', 'ambulatorio_atendimento.agendamento_id')
->join('ambulatorio_jornada', 'ambulatorio_jornada.id', 'ambulatorio_agendamento.jornada_id')
->join('cadastro_lotacao', 'cadastro_lotacao.id', 'ambulatorio_jornada.lotacao_id')
->whereColumn('cadastro_lotacao.infraestrutura_id', 'cadastro_infraestrutura.id')
->where('ambulatorio_atendimento_soap.is_rascunho', false)
->whereNotNull('ambulatorio_atendimento_soap_problema_condicao.cid_id')
->whereBetween('ambulatorio_jornada.data', $params->periodo)
)
->orWhereExists(fn ($q) => $q
->select(DB::raw(1))
->from('ambulatorio_atendimento_soap_problema_condicao')
->join('ambulatorio_atendimento_soap', 'ambulatorio_atendimento_soap.id', 'ambulatorio_atendimento_soap_problema_condicao.soap_id')
->join('ambulatorio_atendimento', 'ambulatorio_atendimento.id', 'ambulatorio_atendimento_soap.atendimento_id')
->join('ambulatorio_demanda_espontanea', 'ambulatorio_demanda_espontanea.id', 'ambulatorio_atendimento.demanda_espontanea_id')
->join('cadastro_lotacao', 'cadastro_lotacao.id', 'ambulatorio_demanda_espontanea.created_lotacao_id')
->whereColumn('cadastro_lotacao.infraestrutura_id', 'cadastro_infraestrutura.id')
->where('ambulatorio_atendimento_soap.is_rascunho', false)
->whereNotNull('ambulatorio_atendimento_soap_problema_condicao.cid_id')
->whereNotNull('ambulatorio_demanda_espontanea.ocupacao_id')
->whereBetween('ambulatorio_demanda_espontanea.data', $params->periodo)
)
)
->orderByRaw('COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia)')
->get();
}
private static function getOcupacoes($params)
{
return DB::table('sigtap.ocupacao')
->select([
'ocupacao.id',
DB::raw("CONCAT(ocupacao.codigo, ' - ', ocupacao.nome) AS nome"),
])
->whereExists(fn ($q) => $q
->select(DB::raw(1))
->from('ambulatorio_atendimento_soap_problema_condicao')
->join('ambulatorio_atendimento_soap', 'ambulatorio_atendimento_soap.id', 'ambulatorio_atendimento_soap_problema_condicao.soap_id')
->join('ambulatorio_atendimento', 'ambulatorio_atendimento.id', 'ambulatorio_atendimento_soap.atendimento_id')
->join('ambulatorio_agendamento', 'ambulatorio_agendamento.id', 'ambulatorio_atendimento.agendamento_id')
->join('ambulatorio_jornada', 'ambulatorio_jornada.id', 'ambulatorio_agendamento.jornada_id')
->join('cadastro_lotacao', 'cadastro_lotacao.id', 'ambulatorio_jornada.lotacao_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_lotacao.infraestrutura_id')
->whereColumn('cadastro_lotacao.ocupacao_id', 'ocupacao.id')
->where('ambulatorio_atendimento_soap.is_rascunho', false)
->whereNotNull('ambulatorio_atendimento_soap_problema_condicao.cid_id')
->whereBetween('ambulatorio_jornada.data', $params->periodo)
->when($params->unidade_id, fn ($q, $unidadeId) => $q
->where('cadastro_infraestrutura.unidade_id', $unidadeId)
)
->when($params->infraestrutura_id, fn ($q, $infraestruturaId) => $q
->where('cadastro_infraestrutura.id', $infraestruturaId)
)
)
->orWhereExists(fn ($q) => $q
->select(DB::raw(1))
->from('ambulatorio_atendimento_soap_problema_condicao')
->join('ambulatorio_atendimento_soap', 'ambulatorio_atendimento_soap.id', 'ambulatorio_atendimento_soap_problema_condicao.soap_id')
->join('ambulatorio_atendimento', 'ambulatorio_atendimento.id', 'ambulatorio_atendimento_soap.atendimento_id')
->join('ambulatorio_demanda_espontanea', 'ambulatorio_demanda_espontanea.id', 'ambulatorio_atendimento.demanda_espontanea_id')
->join('cadastro_lotacao', 'cadastro_lotacao.id', 'ambulatorio_demanda_espontanea.created_lotacao_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_lotacao.infraestrutura_id')
->whereColumn('ambulatorio_demanda_espontanea.ocupacao_id', 'ocupacao.id')
->where('ambulatorio_atendimento_soap.is_rascunho', false)
->whereNotNull('ambulatorio_atendimento_soap_problema_condicao.cid_id')
->whereBetween('ambulatorio_demanda_espontanea.data', $params->periodo)
->where('cadastro_infraestrutura.unidade_id', $params->unidade_id)
->where('cadastro_infraestrutura.id', $params->infraestrutura_id)
)
->orderByRaw("CONCAT(ocupacao.codigo, ' - ', ocupacao.nome)")
->get();
}
public static function autocomplete()
{
$params = self::getParams();
$cids = DB::table('ambulatorio_atendimento_soap_problema_condicao')
->select([
'ambulatorio_jornada.data',
'cadastro_infraestrutura.unidade_id',
'cadastro_infraestrutura.id AS infraestrutura_id',
'cadastro_lotacao.ocupacao_id',
'ambulatorio_atendimento_soap_problema_condicao.cid_id',
'cadastro_cidadao.data_nascimento',
'ambulatorio_atendimento_soap.is_rascunho',
])
->join('ambulatorio_atendimento_soap', 'ambulatorio_atendimento_soap.id', 'ambulatorio_atendimento_soap_problema_condicao.soap_id')
->join('ambulatorio_atendimento', 'ambulatorio_atendimento.id', 'ambulatorio_atendimento_soap.atendimento_id')
->join('ambulatorio_agendamento', 'ambulatorio_agendamento.id', 'ambulatorio_atendimento.agendamento_id')
->join('ambulatorio_jornada', 'ambulatorio_jornada.id', 'ambulatorio_agendamento.jornada_id')
->join('cadastro_lotacao', 'cadastro_lotacao.id', 'ambulatorio_jornada.lotacao_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_lotacao.infraestrutura_id')
->join('cadastro_paciente', 'cadastro_paciente.id', 'ambulatorio_agendamento.paciente_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
->union(
DB::table('ambulatorio_atendimento_soap_problema_condicao')
->select([
'ambulatorio_demanda_espontanea.data',
'cadastro_infraestrutura.unidade_id',
'cadastro_infraestrutura.id AS infraestrutura_id',
'ambulatorio_demanda_espontanea.ocupacao_id',
'ambulatorio_atendimento_soap_problema_condicao.cid_id',
'cadastro_cidadao.data_nascimento',
'ambulatorio_atendimento_soap.is_rascunho',
])
->join('ambulatorio_atendimento_soap', 'ambulatorio_atendimento_soap.id', 'ambulatorio_atendimento_soap_problema_condicao.soap_id')
->join('ambulatorio_atendimento', 'ambulatorio_atendimento.id', 'ambulatorio_atendimento_soap.atendimento_id')
->join('ambulatorio_demanda_espontanea', 'ambulatorio_demanda_espontanea.id', 'ambulatorio_atendimento.demanda_espontanea_id')
->join('cadastro_lotacao', 'cadastro_lotacao.id', 'ambulatorio_demanda_espontanea.created_lotacao_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_lotacao.infraestrutura_id')
->join('cadastro_paciente', 'cadastro_paciente.id', 'ambulatorio_demanda_espontanea.paciente_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
);
return DB::table('sigtap.cid')
->select([
'cid.id',
'cid.codigo',
'cid.nome',
])
->whereExists(fn ($q) => $q
->select(DB::raw(1))
->from(DB::raw("({$cids->toSql()}) AS x"))
->whereColumn('x.cid_id', 'cid.id')
->where('x.is_rascunho', false)
->whereBetween('x.data', $params->periodo)
->when($params->unidade_id, fn ($q, $unidadeId) => $q
->where('x.unidade_id', $unidadeId)
)
->when($params->infraestrutura_id, fn ($q, $infraestruturaId) => $q
->where('x.infraestrutura_id', $infraestruturaId)
)
);
}
}