feat: 수주확정 시 매출 자동 생성 기능 구현
- updateStatus 메서드에서 CONFIRMED 전환 시 매출 자동 생성 - sales_recognition = 'on_order_confirm' 설정된 수주만 해당 - createSaleFromOrder() 메서드 추가 (수주→매출 변환) - generateSaleNumber() 메서드 추가 (SAL-YYYYMM-NNNN 형식) - 생성된 매출은 order.sale_id에 자동 연결 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -275,11 +275,66 @@ public function updateStatus(int $id, string $status)
|
||||
// 상태 전환 규칙 검증
|
||||
$this->validateStatusTransition($order->status_code, $status);
|
||||
|
||||
$order->status_code = $status;
|
||||
$order->updated_by = $userId;
|
||||
$order->save();
|
||||
return DB::transaction(function () use ($order, $status, $userId) {
|
||||
$createdSale = null;
|
||||
|
||||
return $order->load(['client:id,name', 'items']);
|
||||
// 수주확정 시 매출 자동 생성 (sales_recognition = on_order_confirm인 경우)
|
||||
if ($status === Order::STATUS_CONFIRMED && $order->shouldCreateSaleOnConfirm()) {
|
||||
$createdSale = $this->createSaleFromOrder($order, $userId);
|
||||
$order->sale_id = $createdSale->id;
|
||||
}
|
||||
|
||||
$order->status_code = $status;
|
||||
$order->updated_by = $userId;
|
||||
$order->save();
|
||||
|
||||
$result = $order->load(['client:id,name', 'items']);
|
||||
|
||||
// 매출이 생성된 경우 응답에 포함
|
||||
if ($createdSale) {
|
||||
$result->setAttribute('created_sale', $createdSale);
|
||||
}
|
||||
|
||||
return $result;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 수주에서 매출 생성
|
||||
*/
|
||||
private function createSaleFromOrder(Order $order, int $userId): Sale
|
||||
{
|
||||
$saleNumber = $this->generateSaleNumber($order->tenant_id);
|
||||
|
||||
$sale = Sale::createFromOrder($order, $saleNumber);
|
||||
$sale->created_by = $userId;
|
||||
$sale->save();
|
||||
|
||||
return $sale;
|
||||
}
|
||||
|
||||
/**
|
||||
* 매출번호 자동 생성
|
||||
*/
|
||||
private function generateSaleNumber(int $tenantId): string
|
||||
{
|
||||
$prefix = 'SAL';
|
||||
$yearMonth = now()->format('Ym');
|
||||
|
||||
// 해당 월 기준 마지막 번호 조회
|
||||
$lastNo = Sale::withoutGlobalScopes()
|
||||
->where('tenant_id', $tenantId)
|
||||
->where('sale_number', 'like', "{$prefix}-{$yearMonth}-%")
|
||||
->orderByDesc('sale_number')
|
||||
->value('sale_number');
|
||||
|
||||
if ($lastNo) {
|
||||
$seq = (int) substr($lastNo, -4) + 1;
|
||||
} else {
|
||||
$seq = 1;
|
||||
}
|
||||
|
||||
return sprintf('%s-%s-%04d', $prefix, $yearMonth, $seq);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user