feat: 수주(Order) ↔ 매출(Sale) 연동 스키마 구현
- sales 테이블: order_id, shipment_id, source_type 컬럼 추가 - orders 테이블: sales_recognition, sale_id 컬럼 추가 - Sale 모델: order(), shipment() 관계 및 createFromOrder/Shipment 팩토리 메서드 - Order 모델: sale(), sales() 관계 및 shouldCreateSaleOnConfirm/Shipment 헬퍼 - 매출 인식 시점: 수주확정 시 / 출하완료 시 / 수동 선택 가능 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -5,11 +5,13 @@
|
||||
use App\Models\Items\Item;
|
||||
use App\Models\Production\WorkOrder;
|
||||
use App\Models\Quote\Quote;
|
||||
use App\Models\Tenants\Sale;
|
||||
use App\Models\Tenants\Shipment;
|
||||
use App\Traits\BelongsToTenant;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use Illuminate\Database\Eloquent\Relations\HasOne;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
|
||||
/**
|
||||
@@ -75,6 +77,19 @@ class Order extends Model
|
||||
|
||||
public const TYPE_PURCHASE = 'PURCHASE'; // 발주
|
||||
|
||||
// 매출 인식 시점
|
||||
public const SALES_ON_ORDER_CONFIRM = 'on_order_confirm'; // 수주확정 시
|
||||
|
||||
public const SALES_ON_SHIPMENT = 'on_shipment'; // 출하완료 시
|
||||
|
||||
public const SALES_MANUAL = 'manual'; // 수동 등록
|
||||
|
||||
public const SALES_RECOGNITION_TYPES = [
|
||||
self::SALES_ON_ORDER_CONFIRM => '수주확정 시',
|
||||
self::SALES_ON_SHIPMENT => '출하완료 시',
|
||||
self::SALES_MANUAL => '수동 등록',
|
||||
];
|
||||
|
||||
protected $table = 'orders';
|
||||
|
||||
protected $fillable = [
|
||||
@@ -105,6 +120,9 @@ class Order extends Model
|
||||
'remarks',
|
||||
'note',
|
||||
'options',
|
||||
// 매출 연동
|
||||
'sales_recognition',
|
||||
'sale_id',
|
||||
// 감사
|
||||
'created_by',
|
||||
'updated_by',
|
||||
@@ -198,6 +216,46 @@ public function shipments(): HasMany
|
||||
return $this->hasMany(Shipment::class, 'order_id');
|
||||
}
|
||||
|
||||
/**
|
||||
* 연결된 매출
|
||||
*/
|
||||
public function sale(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(Sale::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* 이 수주에서 생성된 모든 매출 (출하별 포함)
|
||||
*/
|
||||
public function sales(): HasMany
|
||||
{
|
||||
return $this->hasMany(Sale::class, 'order_id');
|
||||
}
|
||||
|
||||
/**
|
||||
* 매출 인식 시점 라벨
|
||||
*/
|
||||
public function getSalesRecognitionLabelAttribute(): string
|
||||
{
|
||||
return self::SALES_RECOGNITION_TYPES[$this->sales_recognition] ?? '출하완료 시';
|
||||
}
|
||||
|
||||
/**
|
||||
* 수주확정 시 매출 생성 여부
|
||||
*/
|
||||
public function shouldCreateSaleOnConfirm(): bool
|
||||
{
|
||||
return $this->sales_recognition === self::SALES_ON_ORDER_CONFIRM;
|
||||
}
|
||||
|
||||
/**
|
||||
* 출하완료 시 매출 생성 여부
|
||||
*/
|
||||
public function shouldCreateSaleOnShipment(): bool
|
||||
{
|
||||
return $this->sales_recognition === self::SALES_ON_SHIPMENT;
|
||||
}
|
||||
|
||||
/**
|
||||
* 품목들로부터 금액 합계 재계산
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user