From 9bf5b15734cdf87a02c68b2d2a25046a0678a037 Mon Sep 17 00:00:00 2001 From: joonhoekim <26rote@gmail.com> Date: Wed, 19 Nov 2025 15:01:42 +0900 Subject: (김준회) 견적상세관리: PO 생성 요청시, 오류 발생시 PO생성 트랜잭션처리 처리 (폴백) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/rfq-last/quotation-compare-view.tsx | 90 +++++++++++++++++++++++++++++++-- 1 file changed, 85 insertions(+), 5 deletions(-) (limited to 'lib/rfq-last/quotation-compare-view.tsx') diff --git a/lib/rfq-last/quotation-compare-view.tsx b/lib/rfq-last/quotation-compare-view.tsx index 7a4fd751..40ea676c 100644 --- a/lib/rfq-last/quotation-compare-view.tsx +++ b/lib/rfq-last/quotation-compare-view.tsx @@ -72,6 +72,9 @@ export function QuotationCompareView({ data }: QuotationCompareViewProps) { const [selectedContractType, setSelectedContractType] = React.useState<"PO" | "CONTRACT" | "BIDDING" | "">(""); const [cancelReason, setCancelReason] = React.useState(""); const [isSubmitting, setIsSubmitting] = React.useState(false); + const [showErrorDialog, setShowErrorDialog] = React.useState(false); + const [errorMessage, setErrorMessage] = React.useState(""); + const [errorDetails, setErrorDetails] = React.useState(""); const router = useRouter() const [selectedGeneralContractType, setSelectedGeneralContractType] = React.useState(""); @@ -190,7 +193,7 @@ export function QuotationCompareView({ data }: QuotationCompareViewProps) { setIsSubmitting(true); try { - let result; + let result: { success: boolean; message?: string; error?: string; responseData?: string; statusCode?: number; poNumber?: string; contractNumber?: string; contractId?: number; biddingNumber?: string; biddingId?: number }; switch (selectedContractType) { case "PO": @@ -254,11 +257,37 @@ export function QuotationCompareView({ data }: QuotationCompareViewProps) { setBiddingEndDate(""); router.refresh(); } else { - throw new Error(result.error || "계약 진행 중 오류가 발생했습니다."); + // 실패 응답 처리 + const errorMsg = result.error || "계약 진행 중 오류가 발생했습니다."; + const responseData = result.responseData; + + // 'check payment terms and tax code' 메시지 확인 + const isPaymentTaxError = + errorMsg.toLowerCase().includes("check payment terms and tax code") || + (responseData && responseData.toLowerCase().includes("check payment terms and tax code")); + + if (isPaymentTaxError) { + toast.error("Please check payment terms and tax code. SAP rejected it", { + duration: 5000, + }); + } + + // 에러 dialog 표시 + setErrorMessage(errorMsg); + setErrorDetails(responseData || ""); + setShowErrorDialog(true); + + // Dialog는 닫지 않고 사용자가 다시 시도할 수 있도록 유지 + console.error("계약 생성 실패:", errorMsg); } } catch (error) { console.error("계약 생성 오류:", error); - toast.error(error instanceof Error ? error.message : "계약 진행 중 오류가 발생했습니다."); + const errorMsg = error instanceof Error ? error.message : "계약 진행 중 오류가 발생했습니다."; + toast.error(errorMsg); + + // 에러 dialog 표시 + setErrorMessage(errorMsg); + setShowErrorDialog(true); } finally { setIsSubmitting(false); } @@ -1485,7 +1514,7 @@ export function QuotationCompareView({ data }: QuotationCompareViewProps) { id="bidding-contract-type" className="w-full px-3 py-2 border rounded-md focus:outline-none focus:ring-2 focus:ring-purple-500" value={biddingContractType} - onChange={(e) => setBiddingContractType(e.target.value as any)} + onChange={(e) => setBiddingContractType(e.target.value as "unit_price" | "general" | "sale")} required > @@ -1527,7 +1556,7 @@ export function QuotationCompareView({ data }: QuotationCompareViewProps) { id="award-count" className="w-full px-3 py-2 border rounded-md focus:outline-none focus:ring-2 focus:ring-purple-500" value={awardCount} - onChange={(e) => setAwardCount(e.target.value as any)} + onChange={(e) => setAwardCount(e.target.value as "single" | "multiple")} > {awardCounts.map(type => (