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:
2026-01-22 17:23:36 +09:00
parent d186a0c111
commit c8d7990313
4 changed files with 224 additions and 0 deletions

View File

@@ -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;
}
/**
* 품목들로부터 금액 합계 재계산
*/