diff options
Diffstat (limited to 'lib/vendor-registration-status/service.ts')
| -rw-r--r-- | lib/vendor-registration-status/service.ts | 260 |
1 files changed, 260 insertions, 0 deletions
diff --git a/lib/vendor-registration-status/service.ts b/lib/vendor-registration-status/service.ts new file mode 100644 index 00000000..97503a13 --- /dev/null +++ b/lib/vendor-registration-status/service.ts @@ -0,0 +1,260 @@ +import { revalidateTag, unstable_cache } from "next/cache"
+import {
+ getBusinessContactsByVendorId,
+ upsertBusinessContacts,
+ getAdditionalInfoByVendorId,
+ upsertAdditionalInfo,
+ getVendorAllAdditionalData,
+ deleteBusinessContactsByVendorId,
+ deleteAdditionalInfoByVendorId,
+ type VendorBusinessContact,
+ type VendorAdditionalInfo
+} from "./repository"
+
+// 업무담당자 정보 조회
+export async function fetchBusinessContacts(vendorId: number) {
+ return unstable_cache(
+ async () => {
+ try {
+ const contacts = await getBusinessContactsByVendorId(vendorId)
+ return {
+ success: true,
+ data: contacts,
+ }
+ } catch (error) {
+ console.error("Error in fetchBusinessContacts:", error)
+ return {
+ success: false,
+ error: error instanceof Error ? error.message : "업무담당자 정보를 가져오는 중 오류가 발생했습니다.",
+ }
+ }
+ },
+ [`business-contacts-${vendorId}`],
+ {
+ revalidate: 300, // 5분 캐시
+ tags: ["business-contacts", `vendor-${vendorId}`],
+ }
+ )()
+}
+
+// 업무담당자 정보 저장
+export async function saveBusinessContacts(
+ vendorId: number,
+ contacts: Omit<VendorBusinessContact, "id" | "vendorId" | "createdAt" | "updatedAt">[]
+) {
+ try {
+ await upsertBusinessContacts(vendorId, contacts)
+
+ // 캐시 무효화
+ revalidateTag("business-contacts")
+ revalidateTag(`vendor-${vendorId}`)
+
+ return {
+ success: true,
+ message: "업무담당자 정보가 저장되었습니다.",
+ }
+ } catch (error) {
+ console.error("Error in saveBusinessContacts:", error)
+ return {
+ success: false,
+ error: error instanceof Error ? error.message : "업무담당자 정보 저장 중 오류가 발생했습니다.",
+ }
+ }
+}
+
+// 추가정보 조회
+export async function fetchAdditionalInfo(vendorId: number) {
+ return unstable_cache(
+ async () => {
+ try {
+ const additionalInfo = await getAdditionalInfoByVendorId(vendorId)
+ return {
+ success: true,
+ data: additionalInfo,
+ }
+ } catch (error) {
+ console.error("Error in fetchAdditionalInfo:", error)
+ return {
+ success: false,
+ error: error instanceof Error ? error.message : "추가정보를 가져오는 중 오류가 발생했습니다.",
+ }
+ }
+ },
+ [`additional-info-${vendorId}`],
+ {
+ revalidate: 300, // 5분 캐시
+ tags: ["additional-info", `vendor-${vendorId}`],
+ }
+ )()
+}
+
+// 추가정보 저장
+export async function saveAdditionalInfo(
+ vendorId: number,
+ info: Omit<VendorAdditionalInfo, "id" | "vendorId" | "createdAt" | "updatedAt">
+) {
+ try {
+ await upsertAdditionalInfo(vendorId, info)
+
+ // 캐시 무효화
+ revalidateTag("additional-info")
+ revalidateTag(`vendor-${vendorId}`)
+
+ return {
+ success: true,
+ message: "추가정보가 저장되었습니다.",
+ }
+ } catch (error) {
+ console.error("Error in saveAdditionalInfo:", error)
+ return {
+ success: false,
+ error: error instanceof Error ? error.message : "추가정보 저장 중 오류가 발생했습니다.",
+ }
+ }
+}
+
+// 모든 추가정보 조회 (업무담당자 + 추가정보)
+export async function fetchAllAdditionalData(vendorId: number) {
+ return unstable_cache(
+ async () => {
+ try {
+ const data = await getVendorAllAdditionalData(vendorId)
+ return {
+ success: true,
+ data,
+ }
+ } catch (error) {
+ console.error("Error in fetchAllAdditionalData:", error)
+ return {
+ success: false,
+ error: error instanceof Error ? error.message : "벤더 추가정보를 가져오는 중 오류가 발생했습니다.",
+ }
+ }
+ },
+ [`all-additional-data-${vendorId}`],
+ {
+ revalidate: 300, // 5분 캐시
+ tags: ["business-contacts", "additional-info", `vendor-${vendorId}`],
+ }
+ )()
+}
+
+// 업무담당자 + 추가정보 한 번에 저장
+export async function saveAllAdditionalData(
+ vendorId: number,
+ data: {
+ businessContacts: Omit<VendorBusinessContact, "id" | "vendorId" | "createdAt" | "updatedAt">[]
+ additionalInfo: Omit<VendorAdditionalInfo, "id" | "vendorId" | "createdAt" | "updatedAt">
+ }
+) {
+ try {
+ // 두 작업을 순차적으로 실행
+ await Promise.all([
+ upsertBusinessContacts(vendorId, data.businessContacts),
+ upsertAdditionalInfo(vendorId, data.additionalInfo)
+ ])
+
+ // 캐시 무효화
+ revalidateTag("business-contacts")
+ revalidateTag("additional-info")
+ revalidateTag(`vendor-${vendorId}`)
+
+ return {
+ success: true,
+ message: "모든 추가정보가 저장되었습니다.",
+ }
+ } catch (error) {
+ console.error("Error in saveAllAdditionalData:", error)
+ return {
+ success: false,
+ error: error instanceof Error ? error.message : "추가정보 저장 중 오류가 발생했습니다.",
+ }
+ }
+}
+
+// 업무담당자 정보 삭제
+export async function removeBusinessContacts(vendorId: number) {
+ try {
+ await deleteBusinessContactsByVendorId(vendorId)
+
+ // 캐시 무효화
+ revalidateTag("business-contacts")
+ revalidateTag(`vendor-${vendorId}`)
+
+ return {
+ success: true,
+ message: "업무담당자 정보가 삭제되었습니다.",
+ }
+ } catch (error) {
+ console.error("Error in removeBusinessContacts:", error)
+ return {
+ success: false,
+ error: error instanceof Error ? error.message : "업무담당자 정보 삭제 중 오류가 발생했습니다.",
+ }
+ }
+}
+
+// 추가정보 삭제
+export async function removeAdditionalInfo(vendorId: number) {
+ try {
+ await deleteAdditionalInfoByVendorId(vendorId)
+
+ // 캐시 무효화
+ revalidateTag("additional-info")
+ revalidateTag(`vendor-${vendorId}`)
+
+ return {
+ success: true,
+ message: "추가정보가 삭제되었습니다.",
+ }
+ } catch (error) {
+ console.error("Error in removeAdditionalInfo:", error)
+ return {
+ success: false,
+ error: error instanceof Error ? error.message : "추가정보 삭제 중 오류가 발생했습니다.",
+ }
+ }
+}
+
+// 입력 완성도 체크
+export async function checkAdditionalDataCompletion(vendorId: number) {
+ try {
+ const result = await fetchAllAdditionalData(vendorId)
+
+ if (!result.success || !result.data) {
+ return {
+ success: false,
+ error: "추가정보를 확인할 수 없습니다.",
+ }
+ }
+
+ const { businessContacts, additionalInfo } = result.data
+
+ // 필수 업무담당자 5개 타입이 모두 입력되었는지 체크
+ const requiredContactTypes = ["sales", "design", "delivery", "quality", "tax_invoice"]
+ const existingContactTypes = businessContacts.map(contact => contact.contactType)
+ const missingContactTypes = requiredContactTypes.filter(type => !existingContactTypes.includes(type))
+
+ // 업무담당자 완성도
+ const businessContactsComplete = missingContactTypes.length === 0
+
+ // 추가정보 완성도 (선택사항이므로 존재 여부만 체크)
+ const additionalInfoExists = !!additionalInfo
+
+ return {
+ success: true,
+ data: {
+ businessContactsComplete,
+ missingContactTypes,
+ additionalInfoExists,
+ totalCompletion: businessContactsComplete && additionalInfoExists
+ }
+ }
+ } catch (error) {
+ console.error("Error in checkAdditionalDataCompletion:", error)
+ return {
+ success: false,
+ error: error instanceof Error ? error.message : "완성도 확인 중 오류가 발생했습니다.",
+ }
+ }
+}
|
