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

720 lines
27 KiB
PHP

<?php
namespace App\Services\ProntoAtendimento;
use App\Models\Cadastro\SujeitoAtencao\Lotacao;
use App\Models\Sigtap\Procedimento;
use App\Services\Service;
use App\Utils\Format;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
class RelatorioQuantitativoProducaoService extends Service
{
public static function index()
{
$params = request()->all();
self::adjustPeriod($params);
$idadeDe = $params['idade_de'] ?? null;
$idadeAte = $params['idade_ate'] ?? null;
$procedimentosAtendimentos = DB::table('pronto_atendimento_atendimento_procedimento')
->select(
DB::raw(
'SUM(pronto_atendimento_atendimento_procedimento.quantidade) as quantidade',
),
'sigtap_procedimento.nome as procedimento_nome',
'sigtap_procedimento.codigo as procedimento_codigo',
'sigtap_ocupacao.nome as ocupacao_nome',
'sigtap_ocupacao.codigo as ocupacao_codigo',
'profissional.nome as profissional_nome',
DB::raw("CASE WHEN pronto_atendimento_faa.finalizado = 1 THEN 'FINALIZADO' ELSE 'EM ABERTO' END AS status"),
)
->join(
'sigtap.procedimento as sigtap_procedimento',
'sigtap_procedimento.id',
'pronto_atendimento_atendimento_procedimento.procedimento_id'
)
->join(
'cadastro_lotacao',
'cadastro_lotacao.id',
'pronto_atendimento_atendimento_procedimento.lotacao_id'
)
->join(
'sigtap.ocupacao as sigtap_ocupacao',
'sigtap_ocupacao.id',
'cadastro_lotacao.ocupacao_id'
)
->join(
'pronto_atendimento_atendimento',
'pronto_atendimento_atendimento.id',
'pronto_atendimento_atendimento_procedimento.atendimento_id'
)
->join(
'pronto_atendimento_faa',
'pronto_atendimento_faa.id',
'pronto_atendimento_atendimento.faa_id'
)
->join(
'cadastro_centro_custo',
'cadastro_centro_custo.id',
'pronto_atendimento_atendimento.created_centro_custo_id'
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'cadastro_centro_custo.infraestrutura_id'
)
->join(
'cadastro_paciente',
'cadastro_paciente.id',
'pronto_atendimento_faa.paciente_id'
)
->join(
'cadastro_cidadao',
'cadastro_cidadao.id',
'cadastro_paciente.cidadao_id'
)
->join(
'cadastro_usuario',
'cadastro_usuario.id',
'cadastro_lotacao.usuario_id'
)
->join(
'cadastro_cidadao as profissional',
'profissional.id',
'cadastro_usuario.cidadao_id'
)
->whereBetween(
'pronto_atendimento_faa.created_at',
[
$params['periodo']['date']['start'] ?? null,
$params['periodo']['date']['end'] ?? null
]
)
->where('pronto_atendimento_faa.cancelado', 0)
->whereNull('pronto_atendimento_faa.deleted_at')
->whereNull('pronto_atendimento_atendimento_procedimento.deleted_at')
->groupBy(
'sigtap_procedimento.codigo',
'sigtap_ocupacao.codigo',
DB::raw("CASE WHEN pronto_atendimento_faa.finalizado = 1 THEN 'FINALIZADO' ELSE 'EM ABERTO' END"),
)
->orderBy('sigtap_procedimento.nome');
if (!is_null($params['unidade_id'] ?? null)) {
$procedimentosAtendimentos->where('cadastro_infraestrutura.unidade_id', $params['unidade_id']);
}
if (!is_null($params['local_atendimento_id'] ?? null)) {
$procedimentosAtendimentos->where('cadastro_infraestrutura.id', $params['local_atendimento_id']);
}
if (!is_null($idadeDe)) {
$procedimentosAtendimentos->whereRaw("(TIMESTAMPDIFF(YEAR, cadastro_cidadao.data_nascimento, CURRENT_DATE)) >= $idadeDe");
}
if (!is_null($idadeAte)) {
$procedimentosAtendimentos->whereRaw("(TIMESTAMPDIFF(YEAR, cadastro_cidadao.data_nascimento, CURRENT_DATE)) <= $idadeAte");
}
if (!is_null($params['ocupacao_id'] ?? null)) {
$procedimentosAtendimentos->where('cadastro_lotacao.ocupacao_id', $params['ocupacao_id']);
}
if (!is_null($params['usuario_id'] ?? null)) {
$procedimentosAtendimentos->where('cadastro_lotacao.usuario_id', $params['usuario_id']);
}
if (!is_null($params['procedimento_id'] ?? null)) {
$procedimento = Procedimento::findOrFail($params['procedimento_id']);
$procedimentosAtendimentos->where('sigtap_procedimento.codigo', $procedimento->codigo);
}
if (!is_null($params['status'] ?? null)) {
$procedimentosAtendimentos->where('pronto_atendimento_faa.finalizado', $params['status']);
}
$procedimentosAtendimentos = $procedimentosAtendimentos->get();
$quantidadeTotal = 0;
$result = [];
$index = 1;
foreach ($procedimentosAtendimentos as $procedimentoAtendimento) {
$procedimentoAtendimento->index = $index;
$procedimentoCodigo = Format::getProcedimentoFormated($procedimentoAtendimento->procedimento_codigo);
$procedimentoAtendimento->procedimento_codigo_nome =
"{$procedimentoCodigo} - {$procedimentoAtendimento->procedimento_nome}";
$procedimentoAtendimento->ocupacao_codigo_nome =
"{$procedimentoAtendimento->ocupacao_codigo} - {$procedimentoAtendimento->ocupacao_nome}";
$quantidadeTotal += $procedimentoAtendimento->quantidade;
$index++;
}
return [
'procedimentos_atendimentos' => $procedimentosAtendimentos,
'quantidade_total' => $quantidadeTotal,
];
}
public static function list()
{
return [
'form' => self::getForm(),
'model' => self::getModel(),
'additionals' => [
'data_atual' => Carbon::today()->format('d/m/Y'),
]
];
}
private static function getForm()
{
$params = request()->all();
$lotacao = Lotacao::findOrFail(auth()->payload()->get('lotacao_id'));
self::adjustPeriod($params);
return [
'unidades' => self::getUnidades($params),
'locais_atendimento' => self::getLocaisAtendimento($params),
'ocupacoes' => self::getOcupacoes($params),
'procedimentos' => self::getProcedimentos($params),
'usuarios' => self::getUsuarios($params),
'status' => self::getStatus($params),
'unidade_logada' => [
'unidade_id' => $lotacao->infraestrutura->unidade->id,
'infraestrutura_id' => $lotacao->infraestrutura->id,
],
];
}
private static function adjustPeriod(&$params)
{
if (!is_null($params['periodo']['date']['start'] ?? null) && $params['periodo']['date']['end']) {
$params['periodo']['date']['start'] =
(Carbon::createFromFormat('d/m/Y', "{$params['periodo']['date']['start']}"))->startOfDay();
$params['periodo']['date']['end'] =
(Carbon::createFromFormat('d/m/Y', "{$params['periodo']['date']['end']}"))->endOfDay();
}
}
private static function getUnidades($params)
{
return DB::table('cadastro_unidade')
->select(
'cadastro_unidade.id',
'cadastro_unidade.nome_fantasia'
)
->whereExists(function ($query) use ($params) {
$query->select(DB::raw(1))
->from('pronto_atendimento_faa')
->join(
'cadastro_centro_custo',
'cadastro_centro_custo.id',
'=',
'pronto_atendimento_faa.created_centro_custo_id'
)
->join(
'pronto_atendimento_atendimento',
'pronto_atendimento_atendimento.faa_id',
'=',
'pronto_atendimento_faa.id'
)
->join(
'pronto_atendimento_atendimento_procedimento',
'pronto_atendimento_atendimento_procedimento.atendimento_id',
'=',
'pronto_atendimento_atendimento.id'
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'=',
'cadastro_centro_custo.infraestrutura_id'
)
->whereColumn('cadastro_infraestrutura.unidade_id', 'cadastro_unidade.id')
->whereBetween(
'pronto_atendimento_faa.created_at',
[
$params['periodo']['date']['start'] ?? null,
$params['periodo']['date']['end'] ?? null
]
);
})
->orderBy('cadastro_unidade.nome_fantasia')
->get();
}
private static function getLocaisAtendimento($params)
{
$locaisAtendimento = 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"
),
)
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->whereExists(function ($query) use ($params) {
$query->select(DB::raw(1))
->from('pronto_atendimento_faa')
->join(
'cadastro_centro_custo',
'cadastro_centro_custo.id',
'=',
'pronto_atendimento_faa.created_centro_custo_id'
)
->whereColumn('cadastro_centro_custo.infraestrutura_id', 'cadastro_infraestrutura.id')
->whereBetween(
'pronto_atendimento_faa.created_at',
[
$params['periodo']['date']['start'] ?? null,
$params['periodo']['date']['end'] ?? null
]
);
});
if (!is_null($params['unidade_id'] ?? null)) {
$locaisAtendimento->where('cadastro_unidade.id', $params['unidade_id']);
}
return $locaisAtendimento->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('sigtap.ocupacao as ocupacao')
->select(
'ocupacao.id',
'ocupacao.nome',
'ocupacao.codigo',
)
->whereExists(function ($query) use ($params) {
$idadeDe = $params['idade_de'] ?? null;
$idadeAte = $params['idade_ate'] ?? null;
$query->select(DB::raw(1))
->from('pronto_atendimento_atendimento_procedimento')
->join(
'cadastro_lotacao',
'cadastro_lotacao.id',
'pronto_atendimento_atendimento_procedimento.lotacao_id'
)
->join(
'pronto_atendimento_atendimento',
'pronto_atendimento_atendimento.id',
'pronto_atendimento_atendimento_procedimento.atendimento_id'
)
->join(
'pronto_atendimento_faa',
'pronto_atendimento_faa.id',
'pronto_atendimento_atendimento.faa_id'
)
->join(
'cadastro_centro_custo',
'cadastro_centro_custo.id',
'pronto_atendimento_atendimento.created_centro_custo_id'
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'cadastro_centro_custo.infraestrutura_id'
)
->join(
'cadastro_paciente',
'cadastro_paciente.id',
'pronto_atendimento_faa.paciente_id'
)
->join(
'cadastro_cidadao',
'cadastro_cidadao.id',
'cadastro_paciente.cidadao_id'
)
->whereBetween(
'pronto_atendimento_faa.created_at',
[
$params['periodo']['date']['start'] ?? null,
$params['periodo']['date']['end'] ?? null
]
)
->whereColumn('cadastro_lotacao.ocupacao_id', 'ocupacao.id');
if (!is_null($params['unidade_id'] ?? null)) {
$query->where('cadastro_infraestrutura.unidade_id', $params['unidade_id']);
}
if (!is_null($params['local_atendimento_id'] ?? null)) {
$query->where('cadastro_infraestrutura.id', $params['local_atendimento_id']);
}
if (!is_null($idadeDe)) {
$query->whereRaw("(YEAR(CURDATE()) - YEAR(cadastro_cidadao.data_nascimento)) >= $idadeDe");
}
if (!is_null($idadeAte)) {
$query->whereRaw("(YEAR(CURDATE()) - YEAR(cadastro_cidadao.data_nascimento)) <= $idadeAte");
}
});
$ocupacoes = $ocupacoes
->orderBy('ocupacao.nome')
->get();
foreach ($ocupacoes as $ocupacaoAtendimento) {
$ocupacaoCodigo = Format::getProcedimentoFormated($ocupacaoAtendimento->codigo);
$ocupacaoAtendimento->ocupacao_codigo_nome =
"{$ocupacaoCodigo} - {$ocupacaoAtendimento->nome}";
}
return $ocupacoes;
}
private static function getUsuarios($params)
{
$usuarios = DB::table('cadastro_usuario')
->select(
'cadastro_usuario.id',
'cadastro_cidadao.nome'
)
->join(
'cadastro_cidadao',
'cadastro_cidadao.id',
'cadastro_usuario.cidadao_id'
)
->whereExists(function ($query) use ($params) {
$idadeDe = $params['idade_de'] ?? null;
$idadeAte = $params['idade_ate'] ?? null;
$query->select(DB::raw(1))
->from('pronto_atendimento_atendimento_procedimento')
->join(
'pronto_atendimento_atendimento',
'pronto_atendimento_atendimento.id',
'pronto_atendimento_atendimento_procedimento.atendimento_id'
)
->join(
'cadastro_lotacao',
'cadastro_lotacao.id',
'pronto_atendimento_atendimento_procedimento.lotacao_id'
)
->join(
'pronto_atendimento_faa',
'pronto_atendimento_faa.id',
'pronto_atendimento_atendimento.faa_id'
)
->join(
'cadastro_centro_custo',
'cadastro_centro_custo.id',
'pronto_atendimento_atendimento.created_centro_custo_id'
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'cadastro_centro_custo.infraestrutura_id'
)
->join(
'cadastro_paciente',
'cadastro_paciente.id',
'pronto_atendimento_faa.paciente_id'
)
->join(
'cadastro_cidadao as paciente',
'paciente.id',
'cadastro_paciente.cidadao_id'
)
->whereBetween(
'pronto_atendimento_faa.created_at',
[
$params['periodo']['date']['start'] ?? null,
$params['periodo']['date']['end'] ?? null
]
)
->whereColumn('cadastro_lotacao.usuario_id', 'cadastro_usuario.id');
if (!is_null($params['unidade_id'] ?? null)) {
$query->where('cadastro_infraestrutura.unidade_id', $params['unidade_id']);
}
if (!is_null($params['local_atendimento_id'] ?? null)) {
$query->where('cadastro_infraestrutura.id', $params['local_atendimento_id']);
}
if (!is_null($idadeDe)) {
$query->whereRaw("(YEAR(CURDATE()) - YEAR(paciente.data_nascimento)) >= $idadeDe");
}
if (!is_null($idadeAte)) {
$query->whereRaw("(YEAR(CURDATE()) - YEAR(paciente.data_nascimento)) <= $idadeAte");
}
if (!is_null($params['ocupacao_id'] ?? null)) {
$query->where('cadastro_lotacao.ocupacao_id', $params['ocupacao_id']);
}
});
return $usuarios
->orderBy('cadastro_cidadao.nome')
->get();
}
private static function getProcedimentos($params)
{
$procedimentos = DB::table('sigtap.procedimento as procedimento')
->select(
'procedimento.id',
'procedimento.nome',
'procedimento.codigo',
)
->whereExists(function ($query) use ($params) {
$idadeDe = $params['idade_de'] ?? null;
$idadeAte = $params['idade_ate'] ?? null;
$query->select(DB::raw(1))
->from('pronto_atendimento_atendimento_procedimento')
->join(
'pronto_atendimento_atendimento',
'pronto_atendimento_atendimento.id',
'pronto_atendimento_atendimento_procedimento.atendimento_id'
)
->join(
'cadastro_lotacao',
'cadastro_lotacao.id',
'pronto_atendimento_atendimento_procedimento.lotacao_id'
)
->join(
'pronto_atendimento_faa',
'pronto_atendimento_faa.id',
'pronto_atendimento_atendimento.faa_id'
)
->join(
'cadastro_centro_custo',
'cadastro_centro_custo.id',
'pronto_atendimento_atendimento.created_centro_custo_id'
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'cadastro_centro_custo.infraestrutura_id'
)
->join(
'cadastro_paciente',
'cadastro_paciente.id',
'pronto_atendimento_faa.paciente_id'
)
->join(
'cadastro_cidadao',
'cadastro_cidadao.id',
'cadastro_paciente.cidadao_id'
)
->whereBetween(
'pronto_atendimento_faa.created_at',
[
$params['periodo']['date']['start'] ?? null,
$params['periodo']['date']['end'] ?? null
]
)
->whereColumn('pronto_atendimento_atendimento_procedimento.procedimento_id', 'procedimento.id');
if (!is_null($params['unidade_id'] ?? null)) {
$query->where('cadastro_infraestrutura.unidade_id', $params['unidade_id']);
}
if (!is_null($params['local_atendimento_id'] ?? null)) {
$query->where('cadastro_infraestrutura.id', $params['local_atendimento_id']);
}
if (!is_null($idadeDe)) {
$query->whereRaw("(YEAR(CURDATE()) - YEAR(cadastro_cidadao.data_nascimento)) >= $idadeDe");
}
if (!is_null($idadeAte)) {
$query->whereRaw("(YEAR(CURDATE()) - YEAR(cadastro_cidadao.data_nascimento)) <= $idadeAte");
}
if (!is_null($params['ocupacao_id'] ?? null)) {
$query->where('cadastro_lotacao.ocupacao_id', $params['ocupacao_id']);
}
});
$procedimentos = $procedimentos
->groupBy('procedimento.codigo')
->orderBy('procedimento.nome')
->get();
foreach ($procedimentos as $procedimentoAtendimento) {
$procedimentoCodigo = Format::getProcedimentoFormated($procedimentoAtendimento->codigo);
$procedimentoAtendimento->procedimento_codigo_nome =
"{$procedimentoCodigo} - {$procedimentoAtendimento->nome}";
}
return $procedimentos;
}
private static function getStatus($params)
{
return DB::table('pronto_atendimento_faa as paf')
->select(
'paf.finalizado',
)
->distinct()
->whereExists(function($query) use ($params) {
$idadeDe = $params['idade_de'] ?? null;
$idadeAte = $params['idade_ate'] ?? null;
$query->select(DB::raw(1))
->from('pronto_atendimento_atendimento')
->join(
'pronto_atendimento_faa',
'pronto_atendimento_faa.id',
'pronto_atendimento_atendimento.faa_id'
)
->join(
'pronto_atendimento_atendimento_procedimento',
'pronto_atendimento_atendimento_procedimento.atendimento_id',
'pronto_atendimento_atendimento.id'
)
->join(
'cadastro_lotacao',
'cadastro_lotacao.id',
'pronto_atendimento_atendimento_procedimento.lotacao_id'
)
->join(
'cadastro_infraestrutura',
'cadastro_infraestrutura.id',
'cadastro_lotacao.infraestrutura_id'
)
->join(
'cadastro_paciente',
'cadastro_paciente.id',
'pronto_atendimento_faa.paciente_id'
)
->join(
'cadastro_cidadao',
'cadastro_cidadao.id',
'cadastro_paciente.cidadao_id'
)
->whereColumn(
'pronto_atendimento_atendimento.faa_id',
'paf.id'
)
->whereBetween(
'paf.created_at',
[
$params['periodo']['date']['start'] ?? null,
$params['periodo']['date']['end'] ?? null
]
);
if (!is_null($params['unidade_id'] ?? null)) {
$query->where('cadastro_infraestrutura.unidade_id', $params['unidade_id']);
}
if (!is_null($params['local_atendimento_id'] ?? null)) {
$query->where('cadastro_infraestrutura.id', $params['local_atendimento_id']);
}
if (!is_null($idadeDe)) {
$query->whereRaw("(YEAR(CURDATE()) - YEAR(cadastro_cidadao.data_nascimento)) >= $idadeDe");
}
if (!is_null($idadeAte)) {
$query->whereRaw("(YEAR(CURDATE()) - YEAR(cadastro_cidadao.data_nascimento)) <= $idadeAte");
}
if (!is_null($params['ocupacao_id'] ?? null)) {
$query->where('cadastro_lotacao.ocupacao_id', $params['ocupacao_id']);
}
if (!is_null($params['procedimento_id'] ?? null)) {
$query->where('pronto_atendimento_atendimento_procedimento.procedimento_id', $params['procedimento_id']);
}
})
->get()
->map(function($status) {
return [
'valor' => $status->finalizado ?? false,
'nome' => $status->finalizado ? 'FINALIZADO' : 'EM ABERTO',
];
});
}
private static function getModel()
{
return [
'periodo' => [
'date' => [
'start' => $params['periodo']['date']['start'] ?? null,
'end' => $params['periodo']['date']['end'] ?? null,
],
'time' => [
'start' => $params['periodo']['time']['start'] ?? null,
'end' => $params['periodo']['time']['end'] ?? null,
]
],
'unidade_id' => null,
'localAtendimento_id' => null,
'ocupacao_id' => null,
'usuario_id' => null,
'procedimento_id' => null,
'idade_de' => null,
'idade_ate' => null,
'status' => null,
];
}
}