deploy: 2026-03-11 배포

- feat: QMS 감사 체크리스트 (AuditChecklist CRUD, 카테고리/항목/표준문서 모델, 마이그레이션)
- feat: QMS LOT 감사 (QmsLotAudit 컨트롤러/서비스, 확인/문서상세 FormRequest)
- fix: CalendarService, MemberService 수정
- chore: QualityDocumentLocation options 컬럼 추가, tenant_id 마이그레이션, 품질 더미데이터 시더
This commit is contained in:
2026-03-11 02:04:29 +09:00
parent bd500a87bd
commit 047524c19f
21 changed files with 2356 additions and 1 deletions

View File

@@ -0,0 +1,57 @@
<?php
namespace App\Models\Qualitys;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;
class AuditChecklist extends Model
{
use Auditable, BelongsToTenant, SoftDeletes;
protected $table = 'audit_checklists';
const STATUS_DRAFT = 'draft';
const STATUS_IN_PROGRESS = 'in_progress';
const STATUS_COMPLETED = 'completed';
const TYPE_STANDARD_MANUAL = 'standard_manual';
protected $fillable = [
'tenant_id',
'year',
'quarter',
'type',
'status',
'options',
'created_by',
'updated_by',
'deleted_by',
];
protected $casts = [
'year' => 'integer',
'quarter' => 'integer',
'options' => 'array',
];
public function categories(): HasMany
{
return $this->hasMany(AuditChecklistCategory::class, 'checklist_id')->orderBy('sort_order');
}
public function isDraft(): bool
{
return $this->status === self::STATUS_DRAFT;
}
public function isCompleted(): bool
{
return $this->status === self::STATUS_COMPLETED;
}
}

View File

@@ -0,0 +1,35 @@
<?php
namespace App\Models\Qualitys;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
class AuditChecklistCategory extends Model
{
protected $table = 'audit_checklist_categories';
protected $fillable = [
'tenant_id',
'checklist_id',
'title',
'sort_order',
'options',
];
protected $casts = [
'sort_order' => 'integer',
'options' => 'array',
];
public function checklist(): BelongsTo
{
return $this->belongsTo(AuditChecklist::class, 'checklist_id');
}
public function items(): HasMany
{
return $this->hasMany(AuditChecklistItem::class, 'category_id')->orderBy('sort_order');
}
}

View File

@@ -0,0 +1,47 @@
<?php
namespace App\Models\Qualitys;
use App\Models\User;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
class AuditChecklistItem extends Model
{
protected $table = 'audit_checklist_items';
protected $fillable = [
'tenant_id',
'category_id',
'name',
'description',
'is_completed',
'completed_at',
'completed_by',
'sort_order',
'options',
];
protected $casts = [
'is_completed' => 'boolean',
'completed_at' => 'datetime',
'sort_order' => 'integer',
'options' => 'array',
];
public function category(): BelongsTo
{
return $this->belongsTo(AuditChecklistCategory::class, 'category_id');
}
public function completedByUser(): BelongsTo
{
return $this->belongsTo(User::class, 'completed_by');
}
public function standardDocuments(): HasMany
{
return $this->hasMany(AuditStandardDocument::class, 'checklist_item_id');
}
}

View File

@@ -0,0 +1,37 @@
<?php
namespace App\Models\Qualitys;
use App\Models\Documents\Document;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class AuditStandardDocument extends Model
{
protected $table = 'audit_standard_documents';
protected $fillable = [
'tenant_id',
'checklist_item_id',
'title',
'version',
'date',
'document_id',
'options',
];
protected $casts = [
'date' => 'date',
'options' => 'array',
];
public function checklistItem(): BelongsTo
{
return $this->belongsTo(AuditChecklistItem::class, 'checklist_item_id');
}
public function document(): BelongsTo
{
return $this->belongsTo(Document::class);
}
}

View File

@@ -26,10 +26,12 @@ class QualityDocumentLocation extends Model
'inspection_data',
'document_id',
'inspection_status',
'options',
];
protected $casts = [
'inspection_data' => 'array',
'options' => 'array',
];
public function qualityDocument()