init commit
All checks were successful
build-api-image / build (push) Successful in 51s

This commit is contained in:
Antonio Lopes dos Santos
2026-08-04 16:52:02 -03:00
commit afec302c3e
11594 changed files with 1636728 additions and 0 deletions

View File

@@ -0,0 +1,300 @@
<?php
namespace App\Services\Imunizacao;
use App\Enums\Geral\MedidaTempo;
use App\Models\Imunizacao\Campanha;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
class CadastroCampanhaService extends Service
{
public static function index()
{
return [
'additionals' => self::getAdditionalsData(),
];
}
public static function create()
{
return [
'additionals' => self::getAdditionalsData(),
'form' => self::getFormData(),
'model' => self::getModelData(),
];
}
public static function store($request)
{
self::validate($request);
DB::transaction(function() use ($request) {
$campanha = Campanha::create([
'vacina_id' => $request['vacina_id'],
'nome' => $request['nome'],
'periodo_de' => Carbon::createFromFormat('d/m/Y', $request['periodo_de']),
'periodo_ate' => Carbon::createFromFormat('d/m/Y', $request['periodo_ate']),
'meta' => $request['meta'],
]);
$populacoes = [];
foreach ($request['populacoes'] as $populacao) {
$populacoes[] = [
'idade_inicial_medida_tempo_id' => $populacao['idade_inicial_medida_tempo_id'],
'idade_final_medida_tempo_id' => $populacao['idade_final_medida_tempo_id'],
'sexo_id' => $populacao['sexo_id'],
'idade_inicial' => $populacao['idade_inicial'],
'idade_final' => $populacao['idade_final'],
];
}
$campanha->populacoes()->createMany($populacoes);
});
}
public static function show($id)
{
return Campanha::find($id);
}
public static function edit($id)
{
$campanha = self::show($id);
return [
'additionals' => self::getAdditionalsData(),
'form' => self::getFormData(),
'model' => self::getModelData(count($campanha->aplicacoes) > 0 ? null : $campanha),
];
}
public static function update($request, $id)
{
self::validate($request);
DB::transaction(function() use ($request, $id) {
$campanha = tap(self::show($id))->update([
'vacina_id' => $request['vacina_id'],
'nome' => $request['nome'],
'periodo_de' => Carbon::createFromFormat('d/m/Y', $request['periodo_de']),
'periodo_ate' => Carbon::createFromFormat('d/m/Y', $request['periodo_ate']),
'meta' => $request['meta'],
]);
foreach ($request['populacoes'] as $populacao) {
$populacoes[] = [
'idade_inicial_medida_tempo_id' => $populacao['idade_inicial_medida_tempo_id'],
'idade_final_medida_tempo_id' => $populacao['idade_final_medida_tempo_id'],
'sexo_id' => $populacao['sexo_id'],
'idade_inicial' => $populacao['idade_inicial'],
'idade_final' => $populacao['idade_final'],
];
}
$campanha->populacoes()->delete();
$campanha->populacoes()->createMany($populacoes);
});
}
public static function destroy($id)
{
$campanha = self::show($id);
DB::transaction(function() use (&$campanha) {
$campanha->populacoes()->delete();
$campanha->delete();
});
return $campanha;
}
public static function datatable()
{
return DB::table('imunizacao_campanha')
->select([
'imunizacao_campanha.id',
'imunizacao_campanha.nome',
DB::raw("DATE_FORMAT(imunizacao_campanha.periodo_de, '%d/%m/%Y') AS periodo_de"),
DB::raw("DATE_FORMAT(imunizacao_campanha.periodo_ate, '%d/%m/%Y') AS periodo_ate"),
'imunizacao_campanha.vacina_id',
'cadastro_vacina.nome AS vacina_nome',
'cadastro_vacina.abreviacao AS vacina_abreviacao',
'cadastro_vacina.sigla AS vacina_sigla',
'imunizacao_campanha.meta',
DB::raw("CONCAT(cadastro_vacina.sigla, ' - ', cadastro_vacina.nome) AS vacina_sigla_nome"),
DB::raw("CONCAT(cadastro_vacina.sigla, ' - ', cadastro_vacina.abreviacao) AS vacina_sigla_abreviacao"),
DB::raw("CONCAT(cadastro_vacina.abreviacao, ' - ', cadastro_vacina.nome) AS vacina_abreviacao_nome"),
DB::raw("CONCAT(
cadastro_vacina.sigla, ' - ',
cadastro_vacina.abreviacao, ' - ',
cadastro_vacina.nome) AS vacina_sigla_abreviacao_nome"
),
DB::raw("
COALESCE((
SELECT TRUE
FROM imunizacao_registro_aplicacao
WHERE campanha_id = imunizacao_campanha.id
LIMIT 1
), FALSE) AS desativado
"),
])
->join('cadastro_vacina', 'cadastro_vacina.id', 'imunizacao_campanha.vacina_id');
}
private static function validate($request)
{
$rules = [];
foreach ($request['populacoes'] as $key => $value) {
$rules["populacoes.$key.idade_inicial"] = [
'required',
'integer',
'min:0',
'max:366',
];
$rules["populacoes.$key.idade_inicial_medida_tempo_id"] = [
'required',
'integer',
'exists:\App\Models\Geral\MedidaTempo,id',
];
$rules["populacoes.$key.idade_final"] = [
'required',
'integer',
'min:' . $value['idade_inicial'],
'max:366',
];
$rules["populacoes.$key.idade_final_medida_tempo_id"] = [
'required',
'integer',
'exists:\App\Models\Geral\MedidaTempo,id',
function ($_, $value, $fail) use ($request, $key) {
if ($request['populacoes'][$key] === MedidaTempo::MESES) {
if ($value === MedidaTempo::DIAS) {
$fail('Se a idade inicial for em Mês(es) a idade final também deverá ser em Mês(es) ou Ano(s).');
}
}
else if ($request['populacoes'][$key] === MedidaTempo::ANOS) {
if ($value !== MedidaTempo::ANOS) {
$fail('Se a idade inicial for em Anos(s) a idade inicial também deverá ser em Anos(s).');
}
}
},
];
$rules["populacoes.$key.sexo_id"] = [
'nullable',
'integer',
'exists:\App\Models\Cadastro\SujeitoAtencao\Sexo,id',
];
}
return $request->validate(array_merge([
'nome' => [
'required',
'string',
'between:3,300',
],
'periodo_de' => [
'required',
'date_format:d/m/Y',
],
'periodo_ate' => [
'required',
'date_format:d/m/Y',
'after_or_equal:periodo_de',
],
'vacina_id' => [
'required',
'integer',
'exists:\App\Models\Cadastro\Vacina,id',
],
'meta' => [
'required',
'integer',
'min:1',
'max:100',
],
], $rules));
}
private static function getAdditionalsData()
{
return [
'parametrizacao' => self::getParametrizacao(),
];
}
private static function getFormData()
{
return [
'sexos' => self::getSexos(),
'medidas_tempo' => self::getMedidasTempo(),
];
}
private static function getModelData($campanha = null)
{
return [
'id' => $campanha->id ?? null,
'nome' => $campanha->nome ?? null,
'periodo' => [
'start' => $campanha->periodo_de ?? null,
'end' => $campanha->periodo_ate ?? null,
],
'vacina' => [
'id' => $campanha->vacina_id ?? null,
'nome' => $campanha->vacina->nome ?? null,
'abreviacao' => $campanha->vacina->abreviacao ?? null,
'sigla' => $campanha->vacina->sigla ?? null,
],
'meta' => $campanha->meta ?? null,
'populacoes' => $campanha ? $campanha->populacoes->map(function($populacao) {
return [
'id' => $populacao->id,
'idade_inicial' => $populacao->idade_inicial,
'idade_inicial_medida_tempo_id' => $populacao->idade_inicial_medida_tempo_id,
'idade_inicial_medida_tempo_nome' => $populacao->idadeInicialMedidaTempo->nome,
'idade_final' => $populacao->idade_final,
'idade_final_medida_tempo_id' => $populacao->idade_final_medida_tempo_id,
'idade_final_medida_tempo_nome' => $populacao->idadeFinalMedidaTempo->nome,
'sexo_id' => $populacao->sexo_id ?? null,
'sexo_descricao' => $populacao->sexo->descricao ?? 'AMBOS',
];
}) : [],
];
}
private static function getParametrizacao()
{
return DB::table('imunizacao_parametrizacao')
->select([
'parametrizacao_descricao_vacina_id',
])
->first();
}
private static function getSexos()
{
return DB::table('cadastro_sexo')
->select([
'id',
'descricao',
])
->orderBy('descricao')
->get();
}
private static function getMedidasTempo()
{
return DB::table('geral_medida_tempo')
->select([
'id',
'nome',
])
->whereIn('id', [MedidaTempo::DIAS, MedidaTempo::MESES, MedidaTempo::ANOS])
->orderBy('nome')
->get();
}
}