feat: Auditable 트레이트 구현 및 97개 모델 적용

- Auditable 트레이트 신규 생성 (bootAuditable 패턴)
  - creating: created_by/updated_by 자동 채우기
  - updating: updated_by 자동 채우기
  - deleting: deleted_by 채우기 + saveQuietly()
  - created/updated/deleted: audit_logs 자동 기록
- 기존 AuditLogger 패턴과 동일한 try/catch 조용한 실패
- 변경된 필드만 before/after 기록 (updated 이벤트)
- auditExclude 프로퍼티로 모델별 제외 필드 설정 가능
- 제외 대상: Attendance, StockTransaction, TodayIssue 등 고빈도/시스템 모델

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-29 15:33:54 +09:00
parent 00a1257c63
commit 189b38c936
97 changed files with 317 additions and 96 deletions

View File

@@ -4,6 +4,7 @@
use App\Models\Members\User;
use App\Models\Orders\Client;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -12,7 +13,7 @@
class BadDebt extends Model
{
use BelongsToTenant, SoftDeletes;
use Auditable, BelongsToTenant, SoftDeletes;
protected $fillable = [
'tenant_id',

View File

@@ -5,6 +5,7 @@
use App\Models\Members\User;
use App\Models\Orders\Client;
use App\Models\Quote\Quote;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
@@ -13,7 +14,7 @@
class Bidding extends Model
{
use BelongsToTenant, HasFactory, SoftDeletes;
use Auditable, BelongsToTenant, HasFactory, SoftDeletes;
protected $fillable = [
'tenant_id',

View File

@@ -3,6 +3,7 @@
namespace App\Models;
use App\Models\Tenants\Tenant;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -15,7 +16,7 @@
*/
class CategoryGroup extends Model
{
use BelongsToTenant;
use Auditable, BelongsToTenant;
protected $table = 'category_groups';

View File

@@ -2,6 +2,7 @@
namespace App\Models\Commons;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -9,7 +10,7 @@
class Category extends Model
{
use BelongsToTenant, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;
protected $fillable = [
'tenant_id', 'parent_id', 'code_group', 'code', 'name',

View File

@@ -2,6 +2,7 @@
namespace App\Models\Commons;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -9,7 +10,7 @@
class CategoryField extends Model
{
use BelongsToTenant, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;
protected $table = 'category_fields';

View File

@@ -2,13 +2,14 @@
namespace App\Models\Commons;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
class CategoryLog extends Model
{
use BelongsToTenant, ModelTrait;
use Auditable, BelongsToTenant, ModelTrait;
protected $table = 'category_logs';

View File

@@ -2,13 +2,14 @@
namespace App\Models\Commons;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
class CategoryTemplate extends Model
{
use BelongsToTenant, ModelTrait;
use Auditable, BelongsToTenant, ModelTrait;
protected $table = 'category_templates';

View File

@@ -2,6 +2,7 @@
namespace App\Models\Commons;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -9,7 +10,7 @@
class Classification extends Model
{
use BelongsToTenant, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;
protected $fillable = [
'tenant_id',

View File

@@ -3,6 +3,7 @@
namespace App\Models\Commons;
use App\Models\Scopes\TenantScope;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -15,7 +16,7 @@
*/
class Menu extends Model
{
use BelongsToTenant, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;
protected $fillable = [
'tenant_id', 'parent_id', 'global_menu_id', 'name', 'url', 'is_active', 'sort_order',

View File

@@ -3,6 +3,7 @@
namespace App\Models\Construction;
use App\Models\Members\User;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -42,7 +43,7 @@
*/
class Contract extends Model
{
use BelongsToTenant, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;
protected $table = 'contracts';

View File

@@ -3,6 +3,7 @@
namespace App\Models\Construction;
use App\Models\Members\User;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -49,7 +50,7 @@
*/
class HandoverReport extends Model
{
use BelongsToTenant, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;
protected $table = 'handover_reports';

View File

@@ -3,6 +3,7 @@
namespace App\Models\Construction;
use App\Models\Members\User;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -25,7 +26,7 @@
*/
class HandoverReportItem extends Model
{
use BelongsToTenant;
use Auditable, BelongsToTenant;
protected $table = 'handover_report_items';

View File

@@ -3,6 +3,7 @@
namespace App\Models\Construction;
use App\Models\Members\User;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -24,7 +25,7 @@
*/
class HandoverReportManager extends Model
{
use BelongsToTenant;
use Auditable, BelongsToTenant;
protected $table = 'handover_report_managers';

View File

@@ -4,6 +4,7 @@
use App\Models\Members\User;
use App\Models\Site;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -38,7 +39,7 @@
*/
class StructureReview extends Model
{
use BelongsToTenant, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;
protected $table = 'structure_reviews';

View File

@@ -3,6 +3,7 @@
namespace App\Models\Documents;
use App\Models\Members\User;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -32,7 +33,7 @@
*/
class Document extends Model
{
use BelongsToTenant, SoftDeletes;
use Auditable, BelongsToTenant, SoftDeletes;
protected $table = 'documents';

View File

@@ -3,6 +3,7 @@
namespace App\Models\Estimate;
use App\Models\Commons\Category;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
@@ -12,7 +13,7 @@
class Estimate extends Model
{
use BelongsToTenant, HasFactory, SoftDeletes;
use Auditable, BelongsToTenant, HasFactory, SoftDeletes;
protected $fillable = [
'tenant_id',

View File

@@ -2,6 +2,7 @@
namespace App\Models\Estimate;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
@@ -10,7 +11,7 @@
class EstimateItem extends Model
{
use BelongsToTenant, HasFactory, SoftDeletes;
use Auditable, BelongsToTenant, HasFactory, SoftDeletes;
protected $fillable = [
'tenant_id',

View File

@@ -2,6 +2,7 @@
namespace App\Models\ItemMaster;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -9,7 +10,7 @@
class CustomTab extends Model
{
use BelongsToTenant, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;
protected $fillable = [
'tenant_id',

View File

@@ -2,6 +2,7 @@
namespace App\Models\ItemMaster;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -17,7 +18,7 @@
*/
class EntityRelationship extends Model
{
use BelongsToTenant, ModelTrait;
use Auditable, BelongsToTenant, ModelTrait;
protected $fillable = [
'tenant_id',

View File

@@ -2,6 +2,7 @@
namespace App\Models\ItemMaster;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -9,7 +10,7 @@
class ItemBomItem extends Model
{
use BelongsToTenant, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;
protected $fillable = [
'tenant_id',

View File

@@ -2,6 +2,7 @@
namespace App\Models\ItemMaster;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -9,7 +10,7 @@
class ItemField extends Model
{
use BelongsToTenant, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;
protected $fillable = [
'tenant_id',

View File

@@ -2,6 +2,7 @@
namespace App\Models\ItemMaster;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -9,7 +10,7 @@
class ItemPage extends Model
{
use BelongsToTenant, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;
protected $fillable = [
'tenant_id',

View File

@@ -2,6 +2,7 @@
namespace App\Models\ItemMaster;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -9,7 +10,7 @@
class ItemSection extends Model
{
use BelongsToTenant, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;
protected $fillable = [
'tenant_id',

View File

@@ -2,13 +2,14 @@
namespace App\Models\ItemMaster;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
class TabColumn extends Model
{
use BelongsToTenant, ModelTrait;
use Auditable, BelongsToTenant, ModelTrait;
protected $fillable = [
'tenant_id',

View File

@@ -2,6 +2,7 @@
namespace App\Models\ItemMaster;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -9,7 +10,7 @@
class UnitOption extends Model
{
use BelongsToTenant, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;
protected $fillable = [
'tenant_id',

View File

@@ -5,6 +5,7 @@
use App\Models\Commons\Category;
use App\Models\Commons\File;
use App\Models\Commons\Tag;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -18,7 +19,7 @@
*/
class Item extends Model
{
use BelongsToTenant, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;
protected $fillable = [
'tenant_id',

View File

@@ -3,6 +3,7 @@
namespace App\Models\Items;
use App\Models\Members\User;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
@@ -30,7 +31,7 @@
*/
class ItemReceipt extends Model
{
use BelongsToTenant, SoftDeletes;
use Auditable, BelongsToTenant, SoftDeletes;
protected $table = 'item_receipts';

View File

@@ -2,6 +2,7 @@
namespace App\Models;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -9,7 +10,7 @@
class Labor extends Model
{
use BelongsToTenant, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;
protected $table = 'labors';

View File

@@ -6,6 +6,7 @@
use App\Models\Commons\File;
use App\Models\Commons\Tag;
use App\Models\Qualitys\Lot;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -16,7 +17,7 @@
*/
class Material extends Model
{
use BelongsToTenant, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;
protected $fillable = [
'tenant_id',

View File

@@ -4,6 +4,7 @@
use App\Models\Permissions\Role;
use App\Models\Tenants\Tenant;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
@@ -13,7 +14,7 @@
*/
class UserRole extends Model
{
use BelongsToTenant, SoftDeletes;
use Auditable, BelongsToTenant, SoftDeletes;
protected $fillable = [
'user_id', 'tenant_id', 'role_id', 'assigned_at',

View File

@@ -3,6 +3,7 @@
namespace App\Models\Members;
use App\Models\Tenants\Tenant;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -13,7 +14,7 @@
*/
class UserTenant extends Model
{
use BelongsToTenant, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;
protected $fillable = [
'user_id', 'tenant_id', 'is_active', 'is_default', 'joined_at', 'left_at',

View File

@@ -2,13 +2,14 @@
namespace App\Models;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class NotificationSetting extends Model
{
use BelongsToTenant;
use Auditable, BelongsToTenant;
protected $fillable = [
'tenant_id',

View File

@@ -2,6 +2,7 @@
namespace App\Models;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -9,7 +10,7 @@
class NotificationSettingGroup extends Model
{
use BelongsToTenant;
use Auditable, BelongsToTenant;
protected $fillable = [
'tenant_id',

View File

@@ -2,13 +2,14 @@
namespace App\Models;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class NotificationSettingGroupState extends Model
{
use BelongsToTenant;
use Auditable, BelongsToTenant;
protected $fillable = [
'tenant_id',

View File

@@ -3,6 +3,7 @@
namespace App\Models\Orders;
use App\Models\BadDebts\BadDebt;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -10,7 +11,7 @@
class Client extends Model
{
use BelongsToTenant, ModelTrait;
use Auditable, BelongsToTenant, ModelTrait;
protected $fillable = [
'tenant_id',

View File

@@ -2,6 +2,7 @@
namespace App\Models\Orders;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -9,7 +10,7 @@
class ClientGroup extends Model
{
use BelongsToTenant, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;
protected $fillable = [
'tenant_id',

View File

@@ -8,6 +8,7 @@
use App\Models\Quote\Quote;
use App\Models\Tenants\Sale;
use App\Models\Tenants\Shipment;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -21,7 +22,7 @@
*/
class Order extends Model
{
use BelongsToTenant, SoftDeletes;
use Auditable, BelongsToTenant, SoftDeletes;
// 상태 코드
public const STATUS_DRAFT = 'DRAFT';

View File

@@ -5,6 +5,7 @@
use App\Models\Items\Item;
use App\Models\Quote\Quote;
use App\Models\Quote\QuoteItem;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -18,7 +19,7 @@
*/
class OrderItem extends Model
{
use BelongsToTenant, SoftDeletes;
use Auditable, BelongsToTenant, SoftDeletes;
protected $table = 'order_items';

View File

@@ -6,6 +6,7 @@
use App\Models\Members\User;
use App\Models\Members\UserRole;
use App\Models\Tenants\Tenant;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
@@ -15,7 +16,7 @@
*/
class Role extends Model
{
use BelongsToTenant, SoftDeletes;
use Auditable, BelongsToTenant, SoftDeletes;
protected $fillable = [
'tenant_id',

View File

@@ -4,6 +4,7 @@
use App\Models\Members\User;
use App\Models\Tenants\Department;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
@@ -12,7 +13,7 @@
class Popup extends Model
{
use BelongsToTenant, SoftDeletes;
use Auditable, BelongsToTenant, SoftDeletes;
protected $fillable = [
'tenant_id',

View File

@@ -2,6 +2,7 @@
namespace App\Models;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Factories\HasFactory;
@@ -12,7 +13,7 @@
class Process extends Model
{
use BelongsToTenant;
use Auditable, BelongsToTenant;
use HasFactory;
use ModelTrait;
use SoftDeletes;

View File

@@ -7,6 +7,7 @@
use App\Models\Process;
use App\Models\Tenants\Department;
use App\Models\Tenants\Shipment;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -22,7 +23,7 @@
*/
class WorkOrder extends Model
{
use BelongsToTenant, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;
protected $table = 'work_orders';

View File

@@ -3,6 +3,7 @@
namespace App\Models\Production;
use App\Models\Members\User;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -15,7 +16,7 @@
*/
class WorkOrderAssignee extends Model
{
use BelongsToTenant, ModelTrait;
use Auditable, BelongsToTenant, ModelTrait;
protected $table = 'work_order_assignees';

View File

@@ -2,6 +2,7 @@
namespace App\Models\Production;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -13,7 +14,7 @@
*/
class WorkOrderBendingDetail extends Model
{
use BelongsToTenant;
use Auditable, BelongsToTenant;
protected $table = 'work_order_bending_details';

View File

@@ -3,6 +3,7 @@
namespace App\Models\Production;
use App\Models\Members\User;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -14,7 +15,7 @@
*/
class WorkOrderIssue extends Model
{
use BelongsToTenant;
use Auditable, BelongsToTenant;
protected $table = 'work_order_issues';

View File

@@ -3,6 +3,7 @@
namespace App\Models\Production;
use App\Models\Items\Item;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -12,7 +13,7 @@
*/
class WorkOrderItem extends Model
{
use BelongsToTenant;
use Auditable, BelongsToTenant;
protected $table = 'work_order_items';

View File

@@ -3,6 +3,7 @@
namespace App\Models\Production;
use App\Models\Members\User;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -16,7 +17,7 @@
*/
class WorkResult extends Model
{
use BelongsToTenant, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;
protected $table = 'work_results';

View File

@@ -2,6 +2,7 @@
namespace App\Models\Products;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -12,7 +13,7 @@
*/
class CommonCode extends Model
{
use BelongsToTenant, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;
protected $table = 'common_codes';

View File

@@ -3,6 +3,7 @@
namespace App\Models\Products;
use App\Models\Orders\ClientGroup;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -12,7 +13,7 @@
class Price extends Model
{
use BelongsToTenant, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;
protected $table = 'prices';

View File

@@ -3,13 +3,14 @@
namespace App\Models\Products;
use App\Models\User;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class PriceRevision extends Model
{
use BelongsToTenant;
use Auditable, BelongsToTenant;
protected $table = 'price_revisions';

View File

@@ -5,6 +5,7 @@
use App\Models\Commons\Category;
use App\Models\Commons\File;
use App\Models\Commons\Tag;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -12,7 +13,7 @@
class Product extends Model
{
use BelongsToTenant, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;
protected $fillable = [
'tenant_id', 'code', 'name', 'unit', 'category_id',

View File

@@ -3,6 +3,7 @@
namespace App\Models\Products;
use App\Models\Materials\Material;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -10,7 +11,7 @@
class ProductComponent extends Model
{
use BelongsToTenant, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;
protected $table = 'product_components';

View File

@@ -2,6 +2,7 @@
namespace App\Models;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -9,7 +10,7 @@
class PushDeviceToken extends Model
{
use BelongsToTenant;
use Auditable, BelongsToTenant;
use SoftDeletes;
protected $fillable = [

View File

@@ -2,13 +2,14 @@
namespace App\Models;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class PushNotificationSetting extends Model
{
use BelongsToTenant;
use Auditable, BelongsToTenant;
protected $fillable = [
'tenant_id',

View File

@@ -4,6 +4,7 @@
use App\Models\Items\Item;
use App\Models\Members\User;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Model;
@@ -32,7 +33,7 @@
*/
class Inspection extends Model
{
use BelongsToTenant, SoftDeletes;
use Auditable, BelongsToTenant, SoftDeletes;
protected $table = 'inspections';

View File

@@ -7,6 +7,7 @@
use App\Models\Orders\Client;
use App\Models\Orders\Order;
use App\Models\Tenants\SiteBriefing;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
@@ -16,7 +17,7 @@
class Quote extends Model
{
use BelongsToTenant, HasFactory, SoftDeletes;
use Auditable, BelongsToTenant, HasFactory, SoftDeletes;
protected $fillable = [
'tenant_id',

View File

@@ -3,6 +3,7 @@
namespace App\Models\Quote;
use App\Models\User;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Builder;
@@ -29,7 +30,7 @@
*/
class QuoteFormula extends Model
{
use BelongsToTenant, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;
protected $table = 'quote_formulas';

View File

@@ -3,6 +3,7 @@
namespace App\Models\Quote;
use App\Models\User;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Builder;
@@ -26,7 +27,7 @@
*/
class QuoteFormulaCategory extends Model
{
use BelongsToTenant, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;
protected $table = 'quote_formula_categories';

View File

@@ -2,6 +2,7 @@
namespace App\Models\Quote;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
@@ -9,7 +10,7 @@
class QuoteItem extends Model
{
use BelongsToTenant, HasFactory;
use Auditable, BelongsToTenant, HasFactory;
protected $fillable = [
'quote_id',

View File

@@ -3,6 +3,7 @@
namespace App\Models\Quote;
use App\Models\Members\User;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
@@ -10,7 +11,7 @@
class QuoteRevision extends Model
{
use BelongsToTenant, HasFactory;
use Auditable, BelongsToTenant, HasFactory;
const UPDATED_AT = null;

View File

@@ -3,6 +3,7 @@
namespace App\Models\Tenants;
use App\Models\Members\User;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -30,7 +31,7 @@
*/
class Approval extends Model
{
use BelongsToTenant, SoftDeletes;
use Auditable, BelongsToTenant, SoftDeletes;
protected $table = 'approvals';

View File

@@ -3,6 +3,7 @@
namespace App\Models\Tenants;
use App\Models\Members\User;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -25,7 +26,7 @@
*/
class ApprovalForm extends Model
{
use BelongsToTenant, SoftDeletes;
use Auditable, BelongsToTenant, SoftDeletes;
protected $table = 'approval_forms';

View File

@@ -3,6 +3,7 @@
namespace App\Models\Tenants;
use App\Models\Members\User;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -22,7 +23,7 @@
*/
class ApprovalLine extends Model
{
use BelongsToTenant, SoftDeletes;
use Auditable, BelongsToTenant, SoftDeletes;
protected $table = 'approval_lines';

View File

@@ -3,6 +3,7 @@
namespace App\Models\Tenants;
use App\Models\Members\User;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -28,7 +29,7 @@
*/
class BankAccount extends Model
{
use BelongsToTenant, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;
protected $table = 'bank_accounts';

View File

@@ -2,6 +2,7 @@
namespace App\Models\Tenants;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -10,7 +11,7 @@
class Bill extends Model
{
use BelongsToTenant, SoftDeletes;
use Auditable, BelongsToTenant, SoftDeletes;
protected $fillable = [
'tenant_id',

View File

@@ -2,11 +2,14 @@
namespace App\Models\Tenants;
use App\Traits\Auditable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class BillInstallment extends Model
{
use Auditable;
protected $fillable = [
'bill_id',
'installment_date',

View File

@@ -3,6 +3,7 @@
namespace App\Models\Tenants;
use App\Models\Members\User;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -29,7 +30,7 @@
*/
class Card extends Model
{
use BelongsToTenant, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;
protected $table = 'cards';

View File

@@ -5,6 +5,7 @@
use App\Models\Members\User;
use App\Models\Permissions\PermissionOverride;
use App\Models\Tenants\Pivots\DepartmentUser;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -16,7 +17,7 @@
class Department extends Model
{
use BelongsToTenant, HasRoles, ModelTrait, SoftDeletes; // 부서도 권한/역할을 가짐
use Auditable, BelongsToTenant, HasRoles, ModelTrait, SoftDeletes; // 부서도 권한/역할을 가짐
protected $table = 'departments';

View File

@@ -2,6 +2,7 @@
namespace App\Models\Tenants;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -9,7 +10,7 @@
class Deposit extends Model
{
use BelongsToTenant, SoftDeletes;
use Auditable, BelongsToTenant, SoftDeletes;
protected $fillable = [
'tenant_id',

View File

@@ -2,6 +2,7 @@
namespace App\Models\Tenants;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
@@ -11,7 +12,7 @@
class ExpectedExpense extends Model
{
use BelongsToTenant, SoftDeletes;
use Auditable, BelongsToTenant, SoftDeletes;
protected $fillable = [
'tenant_id',

View File

@@ -3,6 +3,7 @@
namespace App\Models\Tenants;
use App\Models\Orders\Client;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Factories\HasFactory;
@@ -17,7 +18,7 @@
*/
class ExpenseAccount extends Model
{
use BelongsToTenant, HasFactory, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, HasFactory, ModelTrait, SoftDeletes;
protected $table = 'expense_accounts';

View File

@@ -3,6 +3,7 @@
namespace App\Models\Tenants;
use App\Models\Members\User;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -30,7 +31,7 @@
*/
class Leave extends Model
{
use BelongsToTenant, SoftDeletes;
use Auditable, BelongsToTenant, SoftDeletes;
protected $table = 'leaves';

View File

@@ -3,6 +3,7 @@
namespace App\Models\Tenants;
use App\Models\Members\User;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -20,7 +21,7 @@
*/
class LeaveBalance extends Model
{
use BelongsToTenant;
use Auditable, BelongsToTenant;
protected $table = 'leave_balances';

View File

@@ -3,6 +3,7 @@
namespace App\Models\Tenants;
use App\Models\Members\User;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -24,7 +25,7 @@
*/
class LeaveGrant extends Model
{
use BelongsToTenant, SoftDeletes;
use Auditable, BelongsToTenant, SoftDeletes;
protected $table = 'leave_grants';

View File

@@ -2,6 +2,7 @@
namespace App\Models\Tenants;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -25,7 +26,7 @@
*/
class LeavePolicy extends Model
{
use BelongsToTenant;
use Auditable, BelongsToTenant;
protected $table = 'leave_policies';

View File

@@ -2,6 +2,7 @@
namespace App\Models\Tenants;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Factories\HasFactory;
@@ -11,7 +12,7 @@
class Loan extends Model
{
use BelongsToTenant, HasFactory, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, HasFactory, ModelTrait, SoftDeletes;
// =========================================================================
// 상수 정의

View File

@@ -2,6 +2,7 @@
namespace App\Models\Tenants;
use App\Traits\Auditable;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
@@ -24,7 +25,7 @@
*/
class Payment extends Model
{
use SoftDeletes;
use Auditable, SoftDeletes;
// =========================================================================
// 상수 정의

View File

@@ -3,6 +3,7 @@
namespace App\Models\Tenants;
use App\Models\Members\User;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -41,7 +42,7 @@
*/
class Payroll extends Model
{
use BelongsToTenant, SoftDeletes;
use Auditable, BelongsToTenant, SoftDeletes;
protected $table = 'payrolls';

View File

@@ -2,6 +2,7 @@
namespace App\Models\Tenants;
use App\Traits\Auditable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
@@ -23,7 +24,7 @@
*/
class Plan extends Model
{
use SoftDeletes;
use Auditable, SoftDeletes;
// =========================================================================
// 상수 정의

View File

@@ -2,6 +2,7 @@
namespace App\Models\Tenants;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -20,7 +21,7 @@
*/
class Position extends Model
{
use BelongsToTenant, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;
protected $table = 'positions';

View File

@@ -2,6 +2,7 @@
namespace App\Models\Tenants;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -9,7 +10,7 @@
class Purchase extends Model
{
use BelongsToTenant, SoftDeletes;
use Auditable, BelongsToTenant, SoftDeletes;
protected $fillable = [
'tenant_id',

View File

@@ -2,6 +2,7 @@
namespace App\Models\Tenants;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -9,7 +10,7 @@
class Receiving extends Model
{
use BelongsToTenant, SoftDeletes;
use Auditable, BelongsToTenant, SoftDeletes;
protected $fillable = [
'tenant_id',

View File

@@ -3,6 +3,7 @@
namespace App\Models\Tenants;
use App\Models\Members\User;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -34,7 +35,7 @@
*/
class Salary extends Model
{
use BelongsToTenant, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;
protected $table = 'salaries';

View File

@@ -3,6 +3,7 @@
namespace App\Models\Tenants;
use App\Models\Orders\Order;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -10,7 +11,7 @@
class Sale extends Model
{
use BelongsToTenant, SoftDeletes;
use Auditable, BelongsToTenant, SoftDeletes;
/**
* 매출 생성 시점 상수

View File

@@ -3,7 +3,7 @@
namespace App\Models\Tenants;
use App\Models\Members\User;
use Illuminate\Database\Eloquent\Builder;
use App\Traits\Auditable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
@@ -16,7 +16,7 @@
*/
class Schedule extends Model
{
use SoftDeletes;
use Auditable, SoftDeletes;
protected $table = 'schedules';

View File

@@ -5,6 +5,7 @@
use App\Models\Orders\Order;
use App\Models\Production\WorkOrder;
use App\Models\Products\CommonCode;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -13,7 +14,7 @@
class Shipment extends Model
{
use BelongsToTenant, SoftDeletes;
use Auditable, BelongsToTenant, SoftDeletes;
protected $fillable = [
'tenant_id',

View File

@@ -2,6 +2,7 @@
namespace App\Models\Tenants;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -9,7 +10,7 @@
class ShipmentItem extends Model
{
use BelongsToTenant, SoftDeletes;
use Auditable, BelongsToTenant, SoftDeletes;
protected $fillable = [
'tenant_id',

View File

@@ -4,6 +4,7 @@
use App\Models\Members\User;
use App\Models\Orders\Client;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -30,7 +31,7 @@
*/
class Site extends Model
{
use BelongsToTenant, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;
protected $table = 'sites';

View File

@@ -5,6 +5,7 @@
use App\Models\Members\User;
use App\Models\Orders\Client;
use App\Models\Quote\Quote;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
@@ -45,7 +46,7 @@
*/
class SiteBriefing extends Model
{
use BelongsToTenant, ModelTrait, SoftDeletes;
use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;
protected $table = 'site_briefings';

View File

@@ -2,6 +2,7 @@
namespace App\Models\Tenants;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -10,7 +11,7 @@
class Stock extends Model
{
use BelongsToTenant, SoftDeletes;
use Auditable, BelongsToTenant, SoftDeletes;
protected $fillable = [
'tenant_id',

View File

@@ -2,6 +2,7 @@
namespace App\Models\Tenants;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -9,7 +10,7 @@
class StockLot extends Model
{
use BelongsToTenant, SoftDeletes;
use Auditable, BelongsToTenant, SoftDeletes;
protected $fillable = [
'tenant_id',

View File

@@ -2,6 +2,7 @@
namespace App\Models\Tenants;
use App\Traits\Auditable;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
@@ -25,7 +26,7 @@
*/
class Subscription extends Model
{
use SoftDeletes;
use Auditable, SoftDeletes;
// =========================================================================
// 상수 정의

View File

@@ -2,6 +2,7 @@
namespace App\Models\Tenants;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -10,7 +11,7 @@
class TaxInvoice extends Model
{
use BelongsToTenant, SoftDeletes;
use Auditable, BelongsToTenant, SoftDeletes;
// =========================================================================
// 상수 정의

View File

@@ -3,7 +3,7 @@
namespace App\Models\Tenants;
use App\Models\Members\User;
use Illuminate\Database\Eloquent\Model;
use App\Traits\Auditable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
/**
@@ -20,6 +20,7 @@
*/
class TenantUserProfile extends Model
{
use Auditable;
protected $casts = [
'json_extra' => 'array',
];

View File

@@ -2,6 +2,7 @@
namespace App\Models\Tenants;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -9,7 +10,7 @@
class Withdrawal extends Model
{
use BelongsToTenant, SoftDeletes;
use Auditable, BelongsToTenant, SoftDeletes;
protected $fillable = [
'tenant_id',

View File

@@ -5,6 +5,7 @@
use App\Models\Members\User;
use App\Models\Permissions\Role;
use App\Models\Tenants\Tenant;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -12,7 +13,7 @@
class UserInvitation extends Model
{
use BelongsToTenant;
use Auditable, BelongsToTenant;
// 상태 상수
public const STATUS_PENDING = 'pending';

124
app/Traits/Auditable.php Normal file
View File

@@ -0,0 +1,124 @@
<?php
namespace App\Traits;
use App\Models\Audit\AuditLog;
use Illuminate\Support\Str;
trait Auditable
{
protected static function bootAuditable(): void
{
static::creating(function ($model) {
$actorId = static::resolveActorId();
if ($actorId) {
if ($model->isFillable('created_by') && ! $model->created_by) {
$model->created_by = $actorId;
}
if ($model->isFillable('updated_by') && ! $model->updated_by) {
$model->updated_by = $actorId;
}
}
});
static::updating(function ($model) {
$actorId = static::resolveActorId();
if ($actorId && $model->isFillable('updated_by')) {
$model->updated_by = $actorId;
}
});
static::deleting(function ($model) {
$actorId = static::resolveActorId();
if ($actorId && $model->isFillable('deleted_by')) {
$model->deleted_by = $actorId;
$model->saveQuietly();
}
});
static::created(function ($model) {
$model->logAuditEvent('created', null, $model->toAuditSnapshot());
});
static::updated(function ($model) {
$dirty = $model->getChanges();
$excluded = $model->getAuditExcludedFields();
$changed = array_diff_key($dirty, array_flip($excluded));
if (empty($changed)) {
return;
}
$before = [];
$after = [];
foreach ($changed as $key => $value) {
$before[$key] = $model->getOriginal($key);
$after[$key] = $value;
}
$model->logAuditEvent('updated', $before, $after);
});
static::deleted(function ($model) {
$model->logAuditEvent('deleted', $model->toAuditSnapshot(), null);
});
}
public function getAuditExcludedFields(): array
{
$defaults = [
'created_at', 'updated_at', 'deleted_at',
'created_by', 'updated_by', 'deleted_by',
];
$custom = property_exists($this, 'auditExclude') ? $this->auditExclude : [];
return array_merge($defaults, $custom);
}
public function getAuditTargetType(): string
{
$className = class_basename(static::class);
return Str::snake($className);
}
protected function toAuditSnapshot(): array
{
$excluded = $this->getAuditExcludedFields();
return array_diff_key($this->attributesToArray(), array_flip($excluded));
}
protected function logAuditEvent(string $action, ?array $before, ?array $after): void
{
try {
$tenantId = $this->tenant_id ?? null;
if (! $tenantId) {
return;
}
$request = request();
AuditLog::create([
'tenant_id' => $tenantId,
'target_type' => $this->getAuditTargetType(),
'target_id' => $this->getKey(),
'action' => $action,
'before' => $before,
'after' => $after,
'actor_id' => static::resolveActorId(),
'ip' => $request?->ip(),
'ua' => $request?->userAgent(),
'created_at' => now(),
]);
} catch (\Throwable $e) {
// 감사 로그 실패는 업무 흐름을 방해하지 않음
}
}
protected static function resolveActorId(): ?int
{
return auth()->id();
}
}