all(), [ 'name' => 'required|string|unique:stat_tree', 'model' => 'required|string', 'slug' => 'required|string|unique:stat_tree' ]); if ($validatedData->fails()) return $this->fail($validatedData->errors()->first()); [ 'name' => $name, 'model' => $model, 'slug' => $slug ] = $request->all(); $nextId = DB::select("select nextval('stat_tree_id_seq')"); $statTree = new StatTree; $statTree->id = $nextId[0]->nextval; $statTree->uid = Uuid::uuid4(); $statTree->name = $name; $statTree->model = $model; $statTree->slug = $slug; $statTree->save(); return $this->pass($statTree->uid); } public function edit(Request $request, StatTree $statTree) { $clauses = Clause::where('model', $statTree->model)->orderBy('position_index')->get(); return view('app.stat-tree.stat-trees.sub.edit', compact('statTree', 'clauses')); } public function delete(Request $request){ $request->validate([ 'id' => 'required' ]); $id = $request->get('id'); $statTree = StatTree::where('id', $id)->first(); } public function replaceAllLines(Request $request){ $parents = []; $statTreeID = (int) $request->get('statTreeID'); $data = $request->get('data'); $rows = json_decode($data, true); $statTree = StatTree::where('id', $statTreeID)->first(); $model = $statTree->model; DB::beginTransaction(); DB::statement("DELETE FROM stat_tree_line WHERE stat_tree_id = :stat_tree_id", ['stat_tree_id' => $statTree->id]); for($x = 0; $x < count($rows); $x++){ $row = $rows[$x]; $nextStatLineId = DB::select("select nextval('stat_tree_line_id_seq')"); $statTreeLine = new StatTreeLine; $statTreeLine->id = $nextStatLineId[0]->nextval; $statTreeLine->uid = Uuid::uuid4(); $statTreeLine->stat_tree_id = $statTree->id; $statTreeLine->tree_order_position_index = $x; $statTreeLine->last_refresh_count = null; $statTreeLine->tsv_text_for_report_columns = null; $statTreeLine->save(); DB::statement("DELETE FROM stat_tree_line_clause WHERE stat_tree_line_id = :stat_tree_line_id", ['stat_tree_line_id' => $statTreeLine->id]); $allClauses = []; for($i = 0; $i < count($row); $i++){ $cell = $row[$i]; if(!$cell || empty($cell)) continue; $clause = Clause::where('label', $cell)->where('model', 'ilike', $model)->first(); if(!$clause){ DB::rollBack(); return $this->fail('No clause record found for ' . $cell); } $nextStatLineClauseId = DB::select("select nextval('stat_tree_line_clause_id_seq')"); $statTreeLineClause = new StatTreeLineClause; $statTreeLineClause->id = $nextStatLineClauseId[0]->nextval; $statTreeLineClause->uid = Uuid::uuid4(); $statTreeLineClause->stat_tree_line_id = $statTreeLine->id; $statTreeLineClause->clause_id = $clause->id; $statTreeLineClause->clause_label = $cell; $statTreeLineClause->position_index = $i; $statTreeLineClause->detail_json = json_encode(['model' => $model]); $statTreeLineClause->save(); $allClauses[] = $cell; } $parents[implode("|", $allClauses)] = $statTreeLine; // if child, find and set parent $nonEmpty = []; for($i = 0; $i < count($row); $i++){ if($row[$i] && !empty($row[$i])) $nonEmpty[] = $row[$i]; } if(count($nonEmpty) > 1) { $parentClauses = []; for($i = 0; $i < count($nonEmpty) - 1; $i++){ $cell = $nonEmpty[$i]; $clause = Clause::where('label', $cell)->where('model', 'ilike', $model)->first(); if(!$clause){ DB::rollBack(); return $this->fail('No clause record found for ' . $cell); } $parentClauses[] = $clause->label; } $parentClauses = implode("|", $parentClauses); if(@$parents[$parentClauses]) { $statTreeLine->parent_stat_tree_line_id = $parents[$parentClauses]->id; $statTreeLine->save(); } } } DB::commit(); return $this->pass(); } }