This commit is contained in:
336
api/app/Services/Cadastro/VacinaService.php
Normal file
336
api/app/Services/Cadastro/VacinaService.php
Normal file
@@ -0,0 +1,336 @@
|
||||
<?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'),
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user