fix: [order] 수주 변환 연동 + 상세/수정 UI 개선

- 견적→수주 변환 API 연동 (createOrderFromQuote)
- 수주 상세 뷰 개선 (PhoneInput, 금액 포맷)
- 수주 수정 페이지 필드명 수정 (deliveryDate→expectedShipDate)
This commit is contained in:
2026-03-17 13:51:34 +09:00
parent 704ea3c02d
commit 6fc9d8f6b0
8 changed files with 70 additions and 50 deletions

View File

@@ -833,17 +833,17 @@ export function OrderRegistration({
<Label>
<span className="text-red-500">*</span>
</Label>
<Input
<PhoneInput
placeholder="수신처 입력"
value={form.receiverContact}
onChange={(e) => {
onChange={(value) => {
setForm((prev) => ({
...prev,
receiverContact: e.target.value,
receiverContact: value,
}));
clearFieldError("receiverContact");
}}
className={cn(fieldErrors.receiverContact && "border-red-500")}
error={!!fieldErrors.receiverContact}
/>
{fieldErrors.receiverContact && (
<p className="text-sm text-red-500">{fieldErrors.receiverContact}</p>

View File

@@ -149,7 +149,7 @@ function OrderNodeCard({ node, depth = 0 }: { node: OrderNode; depth?: number })
{statusConfig.label}
</BadgeSm>
<span className="text-sm font-medium">
{formatAmount(node.totalPrice)}
{formatAmount(node.totalPrice)}
</span>
</div>
</button>
@@ -187,10 +187,10 @@ function OrderNodeCard({ node, depth = 0 }: { node: OrderNode; depth?: number })
<TableCell className="text-center">{item.quantity}</TableCell>
<TableCell className="text-center">{item.unit}</TableCell>
<TableCell className="text-right">
{formatAmount(item.unitPrice)}
{formatAmount(item.unitPrice)}
</TableCell>
<TableCell className="text-right font-medium">
{formatAmount(item.amount ?? 0)}
{formatAmount(item.amount ?? 0)}
</TableCell>
</TableRow>
))}
@@ -515,7 +515,7 @@ export function OrderSalesDetailView({ orderId }: OrderSalesDetailViewProps) {
<div className="flex items-center gap-4 text-sm">
<span className="text-muted-foreground">:</span>
<span className="w-32 text-right">
{formatAmount(order.subtotal ?? 0)}
{formatAmount(order.subtotal ?? 0)}
</span>
</div>
<div className="flex items-center gap-4 text-sm">
@@ -525,7 +525,7 @@ export function OrderSalesDetailView({ orderId }: OrderSalesDetailViewProps) {
<div className="flex items-center gap-4 text-lg font-semibold">
<span>:</span>
<span className="w-32 text-right text-green-600">
{formatAmount(order.totalAmount ?? 0)}
{formatAmount(order.totalAmount ?? 0)}
</span>
</div>
</div>
@@ -570,10 +570,10 @@ export function OrderSalesDetailView({ orderId }: OrderSalesDetailViewProps) {
<TableCell className="text-center">{item.quantity}</TableCell>
<TableCell className="text-center">{item.unit}</TableCell>
<TableCell className="text-right">
{formatAmount(item.unitPrice)}
{formatAmount(item.unitPrice)}
</TableCell>
<TableCell className="text-right font-medium">
{formatAmount(item.amount ?? 0)}
{formatAmount(item.amount ?? 0)}
</TableCell>
</TableRow>
))}
@@ -586,7 +586,7 @@ export function OrderSalesDetailView({ orderId }: OrderSalesDetailViewProps) {
<div className="flex items-center gap-4 text-sm">
<span className="text-muted-foreground">:</span>
<span className="w-32 text-right">
{formatAmount(order.subtotal ?? 0)}
{formatAmount(order.subtotal ?? 0)}
</span>
</div>
<div className="flex items-center gap-4 text-sm">
@@ -596,7 +596,7 @@ export function OrderSalesDetailView({ orderId }: OrderSalesDetailViewProps) {
<div className="flex items-center gap-4 text-lg font-semibold">
<span>:</span>
<span className="w-32 text-right text-green-600">
{formatAmount(order.totalAmount ?? 0)}
{formatAmount(order.totalAmount ?? 0)}
</span>
</div>
</div>
@@ -783,7 +783,7 @@ export function OrderSalesDetailView({ orderId }: OrderSalesDetailViewProps) {
<div className="flex justify-between">
<span className="text-muted-foreground"></span>
<span className="font-medium text-green-600">
{formatAmount(order.totalAmount ?? 0)}
{formatAmount(order.totalAmount ?? 0)}
</span>
</div>
<div className="flex justify-between items-center">

View File

@@ -100,7 +100,7 @@ export function QuotationSelectDialog({
[{quotation.siteName}]
</span>
<span className="font-medium text-green-600">
{formatAmount(quotation.amount)}
{formatAmount(quotation.amount)}
</span>
</div>
<div className="text-xs text-muted-foreground mt-1 text-right">

View File

@@ -394,6 +394,14 @@ export interface OrderStats {
export interface CreateFromQuoteData {
deliveryDate?: string;
memo?: string;
deliveryMethodCode?: string;
options?: {
receiver?: string;
receiver_contact?: string;
shipping_address?: string;
shipping_address_detail?: string;
shipping_cost_code?: string;
};
}
// 생산지시 생성용
@@ -1010,6 +1018,8 @@ export async function createOrderFromQuote(
const apiData: Record<string, unknown> = {};
if (data?.deliveryDate) apiData.delivery_date = data.deliveryDate;
if (data?.memo) apiData.memo = data.memo;
if (data?.deliveryMethodCode) apiData.delivery_method_code = data.deliveryMethodCode;
if (data?.options) apiData.options = data.options;
const result = await executeServerAction({
url: buildApiUrl(`/api/v1/orders/from-quote/${quoteId}`),

View File

@@ -7,6 +7,7 @@ export {
getOrders,
getOrderById,
createOrder,
createOrderFromQuote,
updateOrder,
deleteOrder,
deleteOrders,