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(); } }