leftJoin( 'exame_laboratorial_formula_exame_fator', 'exame_laboratorial_formula_exame_fator.formula_exame_id', 'exame_laboratorial_formula_exame.id' ) ->groupBy('exame_laboratorial_formula_exame.id') ->select( 'exame_laboratorial_formula_exame.id', 'exame_laboratorial_formula_exame.nome', DB::raw('group_concat(exame_laboratorial_formula_exame_fator.fator separator ", ") as fatores'), ) ->whereNull('exame_laboratorial_formula_exame.deleted_at'); return $FormulaExame; } public static function create() { return [ 'form' => [ 'operacoes' => Operacao::orderBy('id') ->get() ->map(fn ($query) => [ 'id' => $query->id, 'descricao' => $query->descricao, ]), ], ]; } public static function store(Request $request) { self::validate($request); $formula_exame = new FormulaExame; DB::transaction(function () use ($request) { $formula_exame = FormulaExame::create($request->all()); $formula_exame_id = $formula_exame->id; foreach ($request['fatores'] as $param) { $fator = new FormulaExameFator(); $fator->fill($param); $fator->formula_exame_id = $formula_exame_id; $fator->valor = $param['valor']; if (!is_null($param['valor'])) { $fator->valor = str_replace('.', '', $fator->valor); $fator->valor = str_replace(',', '.', $fator->valor); } $fator->exponenciacao_valor = $param['exponenciacao_valor']; if (!is_null($param['exponenciacao_valor'])) { $fator->exponenciacao_valor = str_replace('.', '', $fator->exponenciacao_valor); $fator->exponenciacao_valor = str_replace(',', '.', $fator->exponenciacao_valor); } $fator->save(); } }); return $formula_exame; } public static function edit($id) { $FormulaExame = FormulaExame::findOrFail($id); return [ 'form' => [ 'operacoes' => Operacao::orderBy('id') ->get() ->map(fn ($query) => [ 'id' => $query->id, 'descricao' => $query->descricao, ]), ], 'model' => [ 'id' => $FormulaExame->id, 'nome' => $FormulaExame->nome, 'fatores' => FormulaExameFator::where('formula_exame_id', $FormulaExame->id) ->get() ->map(function($query) { return [ 'id' => $query->id, 'formula_exame_id' => $query->formula_exame_id, 'fator' => $query->fator, 'operacao_id' => $query->operacao_id, 'operacao_descricao' => $query->operacao->descricao, 'tipo' => $query->tipo, 'valor' => $query->valor ? number_format($query->valor, 6, ',', '.') : null, 'exponenciacao' => $query->exponenciacao ? true : false, 'exponenciacao_tipo' => $query->exponenciacao_tipo, 'exponenciacao_valor' => $query->exponenciacao_valor ? number_format($query->exponenciacao_valor, 6, ',', '.') : null, 'ordem' => $query->ordem, ]; })->values(), ] ]; } public static function update($request, $id) { self::validate($request); $FormulaExame = FormulaExame::findOrFail($id); DB::transaction(function () use ($request, $FormulaExame, $id) { $FormulaExame->update($request->all()); $ids = []; foreach ($request['fatores'] as $param) { $fator = FormulaExameFator::where('id', $param['id']) ->first() ?? new FormulaExameFator(); $fator->fill($param); $fator->formula_exame_id = $id; $fator->valor = $param['valor']; if (!is_null($param['valor'])) { $fator->valor = str_replace('.', '', $fator->valor); $fator->valor = str_replace(',', '.', $fator->valor); } $fator->exponenciacao_valor = $param['exponenciacao_valor']; if (!is_null($param['exponenciacao_valor'])) { $fator->exponenciacao_valor = str_replace('.', '', $fator->exponenciacao_valor); $fator->exponenciacao_valor = str_replace(',', '.', $fator->exponenciacao_valor); } $fator->save(); $ids[] = $fator->id; } FormulaExameFator::where('formula_exame_id', $id)->whereNotIn('id', $ids)->delete(); }); return $FormulaExame; } public static function destroy($id) { FormulaExame::findOrFail($id)->delete(); return null; } private static function validate($request) { $validations = [ 'nome' => [ 'required', 'string', 'between:3,100', ], 'fatores.*.fator' => [ 'required', 'string', 'between:3,50', ], 'fatores.*.operacao_id' => [ 'required', 'integer', ], 'fatores.*.ordem' => [ 'required', 'integer', ], ]; $messages = [ 'nome.required' => 'Nome é obrigatório.', 'fatores.*.fator' => 'Fator é obrigatório.', 'fatores.*.operacao_id' => 'Operação é obrigatória.', 'fatores.*.ordem' => 'Ordem é obrigatória.', ]; return $request->validate($validations, $messages); } }