337 lines
13 KiB
PHP
337 lines
13 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Cadastro;
|
|
|
|
use App\Enums\Imunizacao\ParametrizacaoDescricaoVacina;
|
|
use App\Models\Cadastro\SujeitoAtencao\Paciente;
|
|
use App\Models\Cadastro\Vacina;
|
|
use App\Models\Imunizacao\Parametrizacao;
|
|
use App\Services\Service;
|
|
use App\Utils\DataUtil;
|
|
use Carbon\Carbon;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Validation\Rule;
|
|
|
|
class VacinaService extends Service
|
|
{
|
|
public static function getDescricaoRaw($tableAlias = 'vacina')
|
|
{
|
|
switch (Parametrizacao::first()->parametrizacao_descricao_vacina_id ?? null) {
|
|
|
|
case ParametrizacaoDescricaoVacina::DESCRICAO: {
|
|
|
|
return "{$tableAlias}.nome";
|
|
}
|
|
case ParametrizacaoDescricaoVacina::DESCRICAO_ABREVIADA: {
|
|
|
|
return "{$tableAlias}.abreviacao";
|
|
}
|
|
case ParametrizacaoDescricaoVacina::SIGLA: {
|
|
|
|
return "{$tableAlias}.sigla";
|
|
}
|
|
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO: {
|
|
|
|
return "CONCAT({$tableAlias}.sigla, ' - ', {$tableAlias}.nome)";
|
|
}
|
|
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO_ABREVIADA: {
|
|
|
|
return "CONCAT({$tableAlias}.sigla, ' - ', {$tableAlias}.abreviacao)";
|
|
}
|
|
case ParametrizacaoDescricaoVacina::DESCRICAO_ABREVIADA_DESCRICAO: {
|
|
|
|
return "CONCAT({$tableAlias}.abreviacao, ' - ', {$tableAlias}.nome)";
|
|
}
|
|
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO_ABREVIADA_DESCRICAO: {
|
|
|
|
return "CONCAT({$tableAlias}.sigla, ' - ', {$tableAlias}.abreviacao, ' - ', {$tableAlias}.nome)";
|
|
}
|
|
default: {
|
|
|
|
return "{$tableAlias}.nome";
|
|
}
|
|
}
|
|
}
|
|
|
|
public static function getDescricao($vacinaModel)
|
|
{
|
|
switch (Parametrizacao::first()->parametrizacao_descricao_vacina_id ?? null) {
|
|
|
|
case ParametrizacaoDescricaoVacina::DESCRICAO: {
|
|
|
|
return $vacinaModel->nome;
|
|
}
|
|
case ParametrizacaoDescricaoVacina::DESCRICAO_ABREVIADA: {
|
|
|
|
return $vacinaModel->abreviacao;
|
|
}
|
|
case ParametrizacaoDescricaoVacina::SIGLA: {
|
|
|
|
return $vacinaModel->sigla;
|
|
}
|
|
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO: {
|
|
|
|
return "{$vacinaModel->sigla} - {$vacinaModel->nome}";
|
|
}
|
|
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO_ABREVIADA: {
|
|
|
|
return "{$vacinaModel->sigla} - {$vacinaModel->abreviacao}";
|
|
}
|
|
case ParametrizacaoDescricaoVacina::DESCRICAO_ABREVIADA_DESCRICAO: {
|
|
|
|
return "{$vacinaModel->abreviacao} - {$vacinaModel->nome}";
|
|
}
|
|
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO_ABREVIADA_DESCRICAO: {
|
|
|
|
return "{$vacinaModel->sigla} - {$vacinaModel->abreviacao} - {$vacinaModel->nome}";
|
|
}
|
|
default: {
|
|
|
|
return $vacinaModel->nome;
|
|
}
|
|
}
|
|
}
|
|
|
|
public static function create()
|
|
{
|
|
return [
|
|
'model' => self::getModelData(),
|
|
];
|
|
}
|
|
|
|
public static function store($request)
|
|
{
|
|
self::validate($request);
|
|
|
|
return Vacina::create($request->all())->fresh();
|
|
}
|
|
|
|
public static function show($id)
|
|
{
|
|
return Vacina::find($id);
|
|
}
|
|
|
|
public static function edit($id)
|
|
{
|
|
return [
|
|
'model' => self::getModelData($id),
|
|
];
|
|
}
|
|
|
|
public static function update($request, $id)
|
|
{
|
|
self::validate($request);
|
|
|
|
return self::show($id)->update($request->all());
|
|
}
|
|
|
|
public static function destroy($id)
|
|
{
|
|
return self::show($id)->delete();
|
|
}
|
|
|
|
public static function datatable()
|
|
{
|
|
return DB::table('cadastro_vacina')
|
|
->select([
|
|
'id',
|
|
'codigo',
|
|
'nome',
|
|
'abreviacao',
|
|
'sigla',
|
|
DB::raw("CASE WHEN calendario THEN 'Sim' ELSE 'Não' END AS calendario"),
|
|
]);
|
|
}
|
|
|
|
public static function autocomplete()
|
|
{
|
|
|
|
$vacinas = DB::table('cadastro_vacina')
|
|
->select([
|
|
'id',
|
|
'codigo',
|
|
'nome',
|
|
'abreviacao',
|
|
'sigla',
|
|
]);
|
|
|
|
|
|
if (request('distribuicao')) {
|
|
|
|
$vacinas = DB::table('cadastro_vacina')
|
|
->select([
|
|
'cadastro_vacina.id',
|
|
'cadastro_vacina.codigo',
|
|
'cadastro_vacina.nome',
|
|
'cadastro_vacina.abreviacao',
|
|
'cadastro_vacina.sigla',
|
|
'imunizacao_entrada_vacina.lote',
|
|
'imunizacao_produtor.nome AS produtor_nome',
|
|
'imunizacao_apresentacao.nome AS apresentacao'
|
|
])
|
|
->join('imunizacao_entrada_vacina', 'imunizacao_entrada_vacina.vacina_id', 'cadastro_vacina.id')
|
|
->join('imunizacao_produtor', 'imunizacao_produtor.id', 'imunizacao_entrada_vacina.produtor_id')
|
|
->leftJoin('imunizacao_apresentacao', 'imunizacao_apresentacao.id', 'imunizacao_entrada_vacina.apresentacao_id')
|
|
->join('imunizacao_entrada', 'imunizacao_entrada_vacina.entrada_id', 'imunizacao_entrada.id')
|
|
->where('imunizacao_entrada.sala_vacinacao_id', request()->get('sala_vacinacao_id'))
|
|
->groupBy([
|
|
'cadastro_vacina.id',
|
|
'cadastro_vacina.codigo',
|
|
'cadastro_vacina.nome',
|
|
'cadastro_vacina.abreviacao',
|
|
'cadastro_vacina.sigla',
|
|
'imunizacao_entrada_vacina.lote',
|
|
'imunizacao_produtor.nome',
|
|
'imunizacao_apresentacao.nome'
|
|
])
|
|
->havingRaw('
|
|
SUM(
|
|
imunizacao_entrada_vacina.quantidade -
|
|
COALESCE((
|
|
SELECT SUM(isv.quantidade)
|
|
FROM imunizacao_saida_vacina AS isv
|
|
WHERE isv.entrada_vacina_id = imunizacao_entrada_vacina.id
|
|
), 0)
|
|
) > 0
|
|
');
|
|
}
|
|
|
|
if(request()->has('registro')) {
|
|
if (request()->has('usar_esquema_vacinal') && DataUtil::isStringTrue(request()->usar_esquema_vacinal)) {
|
|
$dataNascimento = Paciente::findOrFail(request()->paciente_id)->cidadao->data_nascimento;
|
|
|
|
if (is_null($dataNascimento)) {
|
|
$vacinas->whereRaw('1 = 0');
|
|
}
|
|
|
|
$dataRegistro = Carbon::createFromFormat('d/m/Y', request()->data_registro);
|
|
$idade = $dataNascimento->diff($dataRegistro);
|
|
|
|
$vacinas->whereExists(function ($query) use ($idade) {
|
|
$query->select(DB::raw(1))
|
|
->from('imunizacao_esquema_vacinal_regra as regra')
|
|
->join('imunizacao_esquema_vacinal_faixa_etaria as faixa_etaria', 'faixa_etaria.id', 'regra.faixa_etaria_id')
|
|
->whereColumn('regra.vacina_id', 'cadastro_vacina.id')
|
|
->where(fn ($q) => $q
|
|
->where(fn ($q) => $q
|
|
->where('faixa_etaria.inicio_ano', '<', $idade->y)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.inicio_ano', '=', $idade->y)
|
|
->where('faixa_etaria.inicio_mes', '<', $idade->m)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.inicio_ano', '=', $idade->y)
|
|
->where('faixa_etaria.inicio_mes', '=', $idade->m)
|
|
->where('faixa_etaria.inicio_dia', '<=', $idade->d)
|
|
)
|
|
)
|
|
->where(fn ($q) => $q
|
|
->where('faixa_etaria.fim_ano', '>', $idade->y)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.fim_ano', '=', $idade->y)
|
|
->where('faixa_etaria.fim_mes', '>', $idade->m)
|
|
)
|
|
->orWhere(fn ($q) => $q
|
|
->where('faixa_etaria.fim_ano', '=', $idade->y)
|
|
->where('faixa_etaria.fim_mes', '=', $idade->m)
|
|
->where('faixa_etaria.fim_dia', '>=', $idade->d)
|
|
)
|
|
)
|
|
);
|
|
});
|
|
}
|
|
else {
|
|
$vacinas->whereExists(function($query) {
|
|
$query->select(DB::raw(1))
|
|
->from('atencao_basica_vacinacao_regra')
|
|
->when((isset(request()->origem) && request()->origem === 'aplicacao'), fn ($q) => $q->where('exibe_aplicacao', true))
|
|
->when((isset(request()->origem) && request()->origem === 'atualizacao'), fn ($q) => $q->where('exibe_atualizacao', true))
|
|
->when((isset(request()->origem) && request()->origem === 'aprazamento'), fn ($q) => $q->where('exibe_aprazamento', true))
|
|
->whereColumn('atencao_basica_vacinacao_regra.codigo', 'cadastro_vacina.codigo');
|
|
});
|
|
}
|
|
}
|
|
|
|
if(request()->has('cria_ficha_ab')) {
|
|
$vacinas->whereNotNull('codigo');
|
|
}
|
|
|
|
/*if (request()->has('sala_vacinacao_id') && request()->has('possui_saldo_estoque')) {
|
|
$vacinas->whereRaw('
|
|
(
|
|
SELECT SUM(imunizacao_entrada_vacina.quantidade - COALESCE((
|
|
SELECT SUM(imunizacao_saida_vacina.quantidade)
|
|
FROM imunizacao_saida_vacina
|
|
WHERE imunizacao_saida_vacina.entrada_vacina_id = imunizacao_entrada_vacina.id
|
|
), 0))
|
|
FROM imunizacao_entrada_vacina
|
|
INNER JOIN imunizacao_entrada
|
|
ON imunizacao_entrada.id = imunizacao_entrada_vacina.entrada_id
|
|
WHERE imunizacao_entrada.sala_vacinacao_id = ' . request()->get('sala_vacinacao_id') . '
|
|
AND imunizacao_entrada_vacina.vacina_id = cadastro_vacina.id
|
|
) > 0
|
|
');
|
|
}*/
|
|
|
|
return $vacinas;
|
|
}
|
|
|
|
private static function validate($request)
|
|
{
|
|
return $request->validate([
|
|
'nome' => [
|
|
'required',
|
|
'string',
|
|
'between:3,300',
|
|
Rule::unique('cadastro_vacina')->ignore($request->vacina),
|
|
],
|
|
'abreviacao' => [
|
|
'required',
|
|
'string',
|
|
'between:1,100',
|
|
],
|
|
'sigla' => [
|
|
'required',
|
|
'string',
|
|
'between:1,100',
|
|
],
|
|
'calendario' => [
|
|
'required',
|
|
'boolean',
|
|
],
|
|
]);
|
|
}
|
|
|
|
private static function getModelData($id = null)
|
|
{
|
|
$vacina = self::show($id);
|
|
|
|
return [
|
|
'id' => $vacina->id ?? null,
|
|
'codigo' => $vacina->codigo ?? null,
|
|
'nome' => $vacina->nome ?? null,
|
|
'abreviacao' => $vacina->abreviacao ?? null,
|
|
'sigla' => $vacina->sigla ?? null,
|
|
'calendario' => $vacina->calendario ?? false,
|
|
];
|
|
}
|
|
|
|
public static function getPaciente($id)
|
|
{
|
|
$paciente = DB::table('cadastro_paciente')
|
|
->select([
|
|
'cadastro_cidadao.data_nascimento AS cidadao_data_nascimento',
|
|
])
|
|
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
|
|
->whereNull('cadastro_paciente.deleted_at')
|
|
->where('cadastro_paciente.id', $id)
|
|
->first();
|
|
|
|
return [
|
|
'cidadao_idade_anos' => (int) Carbon::create($paciente->cidadao_data_nascimento)->diff(Carbon::now())->format('%y'),
|
|
'cidadao_idade_meses' => (int) Carbon::create($paciente->cidadao_data_nascimento)->diff(Carbon::now())->format('%m'),
|
|
'cidadao_idade_dias' => (int) Carbon::create($paciente->cidadao_data_nascimento)->diff(Carbon::now())->format('%d'),
|
|
];
|
|
}
|
|
}
|