summaryrefslogtreecommitdiff
path: root/lib/bidding/detail
diff options
context:
space:
mode:
Diffstat (limited to 'lib/bidding/detail')
-rw-r--r--lib/bidding/detail/service.ts30
-rw-r--r--lib/bidding/detail/table/bidding-invitation-dialog.tsx2
2 files changed, 30 insertions, 2 deletions
diff --git a/lib/bidding/detail/service.ts b/lib/bidding/detail/service.ts
index 9fb3d87f..645ebeac 100644
--- a/lib/bidding/detail/service.ts
+++ b/lib/bidding/detail/service.ts
@@ -1158,6 +1158,23 @@ export async function deleteAwardDocument(documentId: number, biddingId: number,
export async function awardBidding(biddingId: number, selectionReason: string, userId: string) {
try {
const userName = await getUserNameById(userId)
+
+ // 입찰 정보 조회 (contractType 포함)
+ const biddingInfo = await db
+ .select({
+ contractType: biddings.contractType,
+ status: biddings.status
+ })
+ .from(biddings)
+ .where(eq(biddings.id, biddingId))
+ .limit(1)
+
+ if (biddingInfo.length === 0) {
+ return { success: false, error: '입찰 정보를 찾을 수 없습니다.' }
+ }
+
+ const bidding = biddingInfo[0]
+
// 낙찰된 업체들 조회 (isWinner가 true인 업체들)
const awardedCompanies = await db
.select({
@@ -1170,11 +1187,22 @@ export async function awardBidding(biddingId: number, selectionReason: string, u
eq(biddingCompanies.biddingId, biddingId),
eq(biddingCompanies.isWinner, true)
))
-
+
if (awardedCompanies.length === 0) {
return { success: false, error: '낙찰된 업체가 없습니다. 먼저 발주비율을 산정해주세요.' }
}
+ // 일반/매각 입찰의 경우 비율 합계 100% 검증
+ const contractType = bidding.contractType
+ if (contractType === 'general' || contractType === 'sale') {
+ const totalRatio = awardedCompanies.reduce((sum, company) =>
+ sum + (Number(company.awardRatio) || 0), 0)
+
+ if (totalRatio !== 100) {
+ return { success: false, error: `일반/매각 입찰의 경우 비율 합계가 100%여야 합니다. 현재 합계: ${totalRatio}%` }
+ }
+ }
+
// 최종입찰가 계산 (낙찰된 업체의 견적금액 * 발주비율의 합)
let finalBidPrice = 0
for (const company of awardedCompanies) {
diff --git a/lib/bidding/detail/table/bidding-invitation-dialog.tsx b/lib/bidding/detail/table/bidding-invitation-dialog.tsx
index 48b235f9..cd79850a 100644
--- a/lib/bidding/detail/table/bidding-invitation-dialog.tsx
+++ b/lib/bidding/detail/table/bidding-invitation-dialog.tsx
@@ -666,7 +666,7 @@ export function BiddingInvitationDialog({
{isGeneratingPdfs ? (
<>
<RefreshCw className="w-4 h-4 mr-2 animate-spin" />
- 계약서 생성중... ({Math.round(pdfGenerationProgress)}%)
+ 입찰 초대중... ({Math.round(pdfGenerationProgress)}%)
</>
) : isPending ? (
<>