This commit is contained in:
salam committed 2026-07-04 18:15:17 +02:00
1 parent eb598ae0ce
commit 16c0aa24fe
14 files changed
+307 -174

No files matched your search

+91
View File
@@ -0,0 +1,91 @@
<?php
namespace App\Actions\Cloning;
use App\Models\ProjektAllgemeinflaechen;
use App\Models\Projekte;
use App\Models\ProjektInhaltsverzeichnis;
use App\Models\ProjektMerkmale;
use App\Models\ProjektMethode;
use App\Models\ProjektObjekte;
use App\Models\ProjektObjekteImDetail;
use App\Models\ProjektPlatzhalter;
use App\Models\ProjektUser;
use Illuminate\Support\Facades\Auth;
class CloneProjekt
{
public static function clone(Projekte $record)
{
/**
* projektes
* projekt_users
* projekt_allgemeinflaechens
* projekt_inhaltsverzeichnis
* projekt_merkmales
* projekt_methodes
* projekt_platzhalters
* projekt_objekte_im_details
* projekt_objektes
*/
$news_project = $record->replicate();
$news_project->cloned_from_id = $record->id;
$news_project->save();
ProjektUser::create(['user_id' => Auth::user()->id, 'projekte_id' => $news_project->id]);
$res = ProjektObjekte::where('projekte_id', $record->id)->get();
foreach ($res as $row) {
$new = $row->replicate();
$new->projekte_id = $news_project->id;
$new->projekte_cloned_from_id = $row->id;
$new->save();
$res2 = ProjektObjekteImDetail::where('projekte_id', $record->id)->where('projekt_objekte_id', $row->id)->get();
foreach ($res2 as $row2) {
$new2 = $row2->replicate();
$new2->projekte_id = $news_project->id;
$new2->projekt_objekte_id = $new->id;
$new2->projekte_objekte_cloned_from_id = $row2->id;
$new2->save();
}
}
$res = ProjektAllgemeinflaechen::where('projekte_id', $record->id)->get();
foreach ($res as $row) {
$new = $row->replicate();
$new->projekte_id = $news_project->id;
$new->save();
}
$res = ProjektInhaltsverzeichnis::where('projekte_id', $record->id)->get();
foreach ($res as $row) {
$new = $row->replicate();
$new->projekte_id = $news_project->id;
$new->save();
}
$res = ProjektPlatzhalter::where('projekte_id', $record->id)->get();
foreach ($res as $row) {
$new = $row->replicate();
$new->projekte_id = $news_project->id;
$new->save();
}
$res = ProjektMerkmale::where('projekte_id', $record->id)->get();
foreach ($res as $row) {
$new = $row->replicate();
$new->projekte_id = $news_project->id;
$new->save();
}
$res = ProjektMethode::where('projekte_id', $record->id)->get();
foreach ($res as $row) {
$new = $row->replicate();
$new->projekte_id = $news_project->id;
$new->save();
}
$res = ProjektPlatzhalter::where('projekte_id', $record->id)->get();
foreach ($res as $row) {
$new = $row->replicate();
$new->projekte_id = $news_project->id;
$new->save();
}
}
}
+100
View File
@@ -0,0 +1,100 @@
<?php
namespace App\Actions\Cloning;
use App\Models\ProjektAllgemeinflaechen;
use App\Models\Projekte;
use App\Models\ProjektInhaltsverzeichnis;
use App\Models\ProjektMerkmale;
use App\Models\ProjektMethode;
use App\Models\ProjektObjekte;
use App\Models\ProjektObjekteImDetail;
use App\Models\ProjektPlatzhalter;
class CloneValidation
{
public static function validate(Projekte $record)
{
/**
* projektes
* projekt_users
* projekt_allgemeinflaechens
* projekt_inhaltsverzeichnis
* projekt_merkmales
* projekt_methodes
* projekt_platzhalters
* projekt_objekte_im_details
* projekt_objektes
*/
$ORIGINAL = $record->cloned_from_id;
$GEKLONT = $record->id;
// $originals = ProjektObjekte::where('projekte_id', $ORIGINAL)->get();
// foreach ($originals as $original) {
// $check = ProjektObjekte::where('projekte_id', $GEKLONT)->where('top_nummer', $original->top_nummer)->first();
// if (! $check) {
// /**
// * Im original dazugekommen
// */
// $new = $original->replicate();
// $new->projekte_id = $GEKLONT;
// $new->save();
// $res2 = ProjektObjekteImDetail::where('projekte_id', $ORIGINAL)->where('projekt_objekte_id', $original->id)->get();
// foreach ($res2 as $row2) {
// $check = ProjektObjekteImDetail::where('projekte_id', $GEKLONT)->where('raumart', $row2->raumart)->first();
// if (! $check) {
// $new2 = $row2->replicate();
// $new2->projekte_id = $GEKLONT;
// $new2->projekt_objekte_id = $new->id;
// $new2->save();
// }
// }
// }
// }
// $res = ProjektAllgemeinflaechen::where('projekte_id', $original_id)->get();
// foreach ($res as $row) {
// $check = ProjektInhaltsverzeichnis::where('projekte_id', $original_id)->where('raumart', $original->raumart)->first();
// if (! $check) {
// $new = $row->replicate();
// $new->projekte_id = $record->id;
// $new->save();
// }
// }
// $res = ProjektInhaltsverzeichnis::where('projekte_id', $original_id)->get();
// foreach ($res as $row) {
// $check = ProjektInhaltsverzeichnis::where('projekte_id', $original_id)->where('top_nummer', $original->top_nummer)->first();
// if (! $check) {
// $new = $row->replicate();
// $new->projekte_id = $record->id;
// $new->save();
// }
// }
// $res = ProjektPlatzhalter::where('projekte_id', $record->id)->get();
// foreach ($res as $row) {
// $new = $row->replicate();
// $new->projekte_id = $record->id;
// $new->save();
// }
// $res = ProjektMerkmale::where('projekte_id', $record->id)->get();
// foreach ($res as $row) {
// $new = $row->replicate();
// $new->projekte_id = $record->id;
// $new->save();
// }
// $res = ProjektMethode::where('projekte_id', $record->id)->get();
// foreach ($res as $row) {
// $new = $row->replicate();
// $new->projekte_id = $record->id;
// $new->save();
// }
// $res = ProjektPlatzhalter::where('projekte_id', $record->id)->get();
// foreach ($res as $row) {
// $new = $row->replicate();
// $new->projekte_id = $record->id;
// $new->save();
// }
}
}
@@ -2,6 +2,7 @@
namespace App\Filament\Resources\Projektes\Pages;
use App\Actions\Cloning\CloneValidation;
use App\Actions\Validation\GutachtenValidation;
use App\Filament\Resources\Projektes\ProjekteResource;
use App\Models\Konto;
@@ -138,8 +139,24 @@ class EditProjekte extends EditRecord
->icon('phosphor-download')
->color('info')
->button(),
DeleteAction::make()->icon('heroicon-o-trash')
->modalDescription('Möchten Sie dieses Projekt wirklich löschen? Die Daten werden unwiderbringlich gelöscht, dieser Vorgang kann nicht rückgängig gemacht werden.'),
/**
* ADMIN
*/
ActionGroup::make([
Action::make('relationen')
->label('Relationen überprüfen')
->modalIcon('phosphor-gear')
->modalDescription('Dieses Projekt wurde gekloned. Mit dieser Funktion können Fehler behoben und Änderungen vom originalen Projekt übernommen werden. Objekte ohne Verbindung werden gelöscht.')
->hidden(fn ($record): bool => ! $record->cloned_from_id)
->action(fn ($record) => CloneValidation::validate($record))
->icon('phosphor-gear'),
DeleteAction::make()->icon('heroicon-o-trash')
->modalDescription('Möchten Sie dieses Projekt wirklich löschen? Die Daten werden unwiderbringlich gelöscht, dieser Vorgang kann nicht rückgängig gemacht werden.'),
])->label('Admin')
->icon('phosphor-user-circle')
->button(),
];
}
@@ -2,6 +2,7 @@
namespace App\Filament\Resources\Projektes\Tables;
use App\Actions\Cloning\CloneProjekt;
use App\Enums\ProjektStatus;
use App\Models\Auftraggeber;
use App\Models\Gutachter;
@@ -16,9 +17,9 @@ use Filament\Tables\Enums\FiltersLayout;
use Filament\Tables\Filters\Filter;
use Filament\Tables\Filters\SelectFilter;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\HtmlString;
use Illuminate\Database\Eloquent\Builder;
class ProjektesTable
{
@@ -28,17 +29,17 @@ class ProjektesTable
->columns([
TextColumn::make('id'),
ToggleColumn::make('meine')
->state(fn($record) => ProjektUser::where('user_id', auth()->user()->id)->where('projekte_id', $record->id)->count())
->state(fn ($record) => ProjektUser::where('user_id', auth()->user()->id)->where('projekte_id', $record->id)->count())
->beforeStateUpdated(function ($record, $state) {
if($state){
if ($state) {
ProjektUser::create(['user_id' => auth()->user()->id, 'projekte_id' => $record->id]);
}else{
} else {
ProjektUser::where('user_id', auth()->user()->id)->where('projekte_id', $record->id)->delete();
}
}),
TextColumn::make('interner_name')
->badge()
->tooltip(fn($record): HtmlString => new HtmlString($record->beschreibung))
->tooltip(fn ($record): HtmlString => new HtmlString($record->beschreibung))
->label('Interner Name')
->color(fn ($record): string => match ($record->status) {
'entwurf' => 'primary',
@@ -53,7 +54,6 @@ class ProjektesTable
->label('Offizieller Name'),
TextColumn::make('gutachter.company'),
TextColumn::make('auftraggeber.company'),
// TextColumn::make('ort'),
TextColumn::make('erstellung')->sortable(),
])
->striped()
@@ -63,12 +63,12 @@ class ProjektesTable
->filters([
Filter::make('meine')
->schema([
Toggle::make('meine')->label('Meine Projekte')
Toggle::make('meine')->label('Meine Projekte'),
])->query(function (Builder $query, array $data): Builder {
return $query->when(
$data['meine'],
function (Builder $query, $meine) {
$query->whereHas('projekt_users', function ($query) {
$query->whereHas('projekt_users', function ($query) {
$query->where('projekt_users.user_id', auth()->user()->id);
});
}
@@ -101,7 +101,7 @@ class ProjektesTable
->recordActions([
EditAction::make()->iconButton(),
Action::make('dokument_klonen')
->action(fn(Projekte $record) => $record->duplicate())
->action(fn (Projekte $record) => CloneProjekt::clone($record))
->iconButton()
->icon('phosphor-copy')
->requiresConfirmation(),
+1
View File
@@ -10,6 +10,7 @@ class ProjektObjekte extends Model
{
protected $fillable = [
'projekte_id',
'projekte_cloned_from_id',
'orientierung_id',
'nicht_in_orientierung',
'top_nummer',
+1
View File
@@ -9,6 +9,7 @@ class ProjektObjekteImDetail extends Model
protected $fillable = [
'projekte_id',
'projekt_objekte_id',
'projekte_objekte_cloned_from_id',
'methode_id',
'top_nummer',
'geschoss',
+1 -12
View File
@@ -7,18 +7,6 @@ use Illuminate\Database\Eloquent\Model;
class Projekte extends Model
{
use \Bkwld\Cloner\Cloneable;
protected $cloneable_relations = [
'projekt_objekte',
'projekt_platzhalters',
'projekt_allgemeinflaechens',
'projekt_raeumealles',
'projekt_methodes',
'projekt_inhaltsverzeichnis',
'projekt_merkmale',
];
protected $primaryKey = 'id';
protected $fillable = [
@@ -26,6 +14,7 @@ class Projekte extends Model
'konto_id',
'auftraggeber_id',
'gutachter_id',
'cloned_from_id',
'interner_name',
'offizieller_name',
'ort',