This commit is contained in:
300
api/app/Services/Imunizacao/CadastroCampanhaService.php
Normal file
300
api/app/Services/Imunizacao/CadastroCampanhaService.php
Normal 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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user