fix: [order] 수주 변환 연동 + 상세/수정 UI 개선
- 견적→수주 변환 API 연동 (createOrderFromQuote) - 수주 상세 뷰 개선 (PhoneInput, 금액 포맷) - 수주 수정 페이지 필드명 수정 (deliveryDate→expectedShipDate)
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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}`),
|
||||
|
||||
@@ -7,6 +7,7 @@ export {
|
||||
getOrders,
|
||||
getOrderById,
|
||||
createOrder,
|
||||
createOrderFromQuote,
|
||||
updateOrder,
|
||||
deleteOrder,
|
||||
deleteOrders,
|
||||
|
||||
Reference in New Issue
Block a user