Files
Nexora/app/Models/Project.php
Javi e42ce8b092
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled
new functionality: Add project coding configuration feature for projects
2025-12-09 23:02:35 +01:00

196 lines
5.7 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
class Project extends Model
{
protected $fillable = [
'reference',
'name',
'description',
'creator_id',
'status',
'project_image_path',
'address',
'province',
'country',
'postal_code',
'latitude',
'longitude',
'icon',
'start_date',
'deadline',
'company_id',
// Agrega cualquier otro campo nuevo aquí
];
public function folders() {
return $this->hasMany(Folder::class);
}
public function currentFolder()
{
return $this->belongsTo(Folder::class);
}
public function documents() {
return $this->hasMany(Document::class);
}
public function rootFolders()
{
return $this->folders()->whereNull('parent_id')->with('children');
}
public function creator()
{
return $this->belongsTo(User::class, 'creator_id');
}
public function managers()
{
return $this->belongsToMany(User::class, 'project_managers');
}
public function users()
{
return $this->belongsToMany(User::class, 'project_users');
}
public function scopeFilter(Builder $query, array $filters)
{
$query->when($filters['search'] ?? false, function($query, $search) {
$query->where(function($query) use ($search) {
$query->where('name', 'like', "%{$search}%")
->orWhere('description', 'like', "%{$search}%");
});
});
// Agrega más filtros según necesites
/*
$query->when($filters['status'] ?? false, function($query, $status) {
$query->where('status', $status);
});
*/
}
public function categories()
{
return $this->belongsToMany(Category::class);
}
public function company()
{
return $this->belongsTo(Company::class);
}
// Agregar estas relaciones al modelo Project
public function codingConfig()
{
return $this->hasOne(ProjectCodingConfig::class);
}
public function documentStatuses()
{
//return $this->hasMany(ProjectDocumentStatus::class);
}
public function defaultStatus()
{
//return $this->hasOne(ProjectDocumentStatus::class)->where('is_default', true);
}
// Método para inicializar la configuración
public function initializeSettings()
{
// Crear configuración de codificación si no existe
if (!$this->codingConfig) {
$this->codingConfig()->create([
'format' => '[PROJECT]-[TYPE]-[YEAR]-[SEQUENCE]',
'next_sequence' => 1,
'year_format' => 'Y',
'separator' => '-',
'sequence_length' => 4,
'auto_generate' => true,
]);
}
// Crear estados predeterminados si no existen
/*
if ($this->documentStatuses()->count() === 0) {
$defaultStatuses = [
[
'name' => 'Borrador',
'slug' => 'draft',
'color' => '#6b7280', // Gris
'order' => 1,
'is_default' => true,
'allow_upload' => true,
'allow_edit' => true,
'allow_delete' => true,
'requires_approval' => false,
'description' => 'Documento en proceso de creación',
],
[
'name' => 'En Revisión',
'slug' => 'in_review',
'color' => '#f59e0b', // Ámbar
'order' => 2,
'is_default' => false,
'allow_upload' => false,
'allow_edit' => false,
'allow_delete' => false,
'requires_approval' => true,
'description' => 'Documento en proceso de revisión',
],
[
'name' => 'Aprobado',
'slug' => 'approved',
'color' => '#10b981', // Verde
'order' => 3,
'is_default' => false,
'allow_upload' => false,
'allow_edit' => false,
'allow_delete' => false,
'requires_approval' => false,
'description' => 'Documento aprobado',
],
[
'name' => 'Rechazado',
'slug' => 'rejected',
'color' => '#ef4444', // Rojo
'order' => 4,
'is_default' => false,
'allow_upload' => true,
'allow_edit' => true,
'allow_delete' => false,
'requires_approval' => false,
'description' => 'Documento rechazado',
],
[
'name' => 'Archivado',
'slug' => 'archived',
'color' => '#8b5cf6', // Violeta
'order' => 5,
'is_default' => false,
'allow_upload' => false,
'allow_edit' => false,
'allow_delete' => false,
'requires_approval' => false,
'description' => 'Documento archivado',
],
];
foreach ($defaultStatuses as $status) {
//$this->documentStatuses()->create($status);
}
}*/
return $this;
}
}