From 8a19a6fa336768d8b6712752c9d713360067ecb0 Mon Sep 17 00:00:00 2001
From: dujinkim <dujin.kim@dtsolution.co.kr>
Date: Mon, 8 Dec 2025 08:45:20 +0000
Subject: (최겸) 구매 피드백 수정, 안전담당자, pq항목 내 첨부, 내외자 구분,
 도로명주소 api 반영(운영기준)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 lib/compliance/table/red-flag-managers-dialog.tsx | 149 +++++++++++++++-------
 1 file changed, 104 insertions(+), 45 deletions(-)

(limited to 'lib/compliance/table/red-flag-managers-dialog.tsx')

diff --git a/lib/compliance/table/red-flag-managers-dialog.tsx b/lib/compliance/table/red-flag-managers-dialog.tsx
index 08244f9e..79076989 100644
--- a/lib/compliance/table/red-flag-managers-dialog.tsx
+++ b/lib/compliance/table/red-flag-managers-dialog.tsx
@@ -21,7 +21,13 @@ import {
   updateRedFlagManagers 
 } from "@/lib/compliance/services";
 
-export function RedFlagManagersDialog() {
+type ManagerDialogMode = "redflag" | "hse";
+
+interface RedFlagManagersDialogProps {
+  mode?: ManagerDialogMode;
+}
+
+export function RedFlagManagersDialog({ mode = "redflag" }: RedFlagManagersDialogProps) {
   const [open, setOpen] = React.useState(false);
   const [isLoading, setIsLoading] = React.useState(false);
   const [isFetching, setIsFetching] = React.useState(false);
@@ -31,6 +37,7 @@ export function RedFlagManagersDialog() {
   const [managerId, setManagerId] = React.useState<number | null>(null);
   const [purchasingManager, setPurchasingManager] = React.useState<UserSelectItem[]>([]);
   const [complianceManager, setComplianceManager] = React.useState<UserSelectItem[]>([]);
+  const [hseManager, setHseManager] = React.useState<UserSelectItem[]>([]);
 
   // 다이얼로그 열릴 때 현재 담당자 정보 가져오기
   React.useEffect(() => {
@@ -79,6 +86,22 @@ export function RedFlagManagersDialog() {
             domain: cm.domain,
           }]);
         }
+
+        // 안전(HSE) 담당자 설정
+        if (managers.hseManager) {
+          // eslint-disable-next-line @typescript-eslint/no-explicit-any
+          const hm: any = managers.hseManager;
+          setHseManager([{
+            id: hm.id,
+            name: hm.name,
+            email: hm.email,
+            epId: hm.epId,
+            deptCode: hm.deptCode,
+            deptName: hm.deptName,
+            imageUrl: hm.imageUrl,
+            domain: hm.domain,
+          }]);
+        }
       }
     } catch (error) {
       console.error("Error loading red flag managers:", error);
@@ -96,12 +119,22 @@ export function RedFlagManagersDialog() {
 
     setIsLoading(true);
     try {
-      await updateRedFlagManagers(managerId, {
-        purchasingManagerId: purchasingManager[0]?.id || null,
-        complianceManagerId: complianceManager[0]?.id || null,
-      });
+      const payload: {
+        purchasingManagerId?: number | null;
+        complianceManagerId?: number | null;
+        hseManagerId?: number | null;
+      } = {};
 
-      toast.success("레드플래그 담당자가 저장되었습니다.");
+      if (mode === "redflag") {
+        payload.purchasingManagerId = purchasingManager[0]?.id || null;
+        payload.complianceManagerId = complianceManager[0]?.id || null;
+      } else if (mode === "hse") {
+        payload.hseManagerId = hseManager[0]?.id || null;
+      }
+
+      await updateRedFlagManagers(managerId, payload);
+
+      toast.success("담당자 설정이 저장되었습니다.");
       setOpen(false);
       router.refresh();
     } catch (error) {
@@ -117,17 +150,19 @@ export function RedFlagManagersDialog() {
       <DialogTrigger asChild>
         <Button variant="outline" size="sm">
           <AlertCircle className="mr-2 h-4 w-4 text-red-600" />
-          레드플래그 담당자
+          {mode === "hse" ? "안전(HSE) 담당자" : "레드플래그 담당자"}
         </Button>
       </DialogTrigger>
       <DialogContent className="sm:max-w-[600px]">
         <DialogHeader>
           <DialogTitle className="flex items-center gap-2">
             <AlertCircle className="h-5 w-5 text-red-600" />
-            레드플래그 담당자 관리
+            {mode === "hse" ? "안전(HSE) 담당자 관리" : "레드플래그 담당자 관리"}
           </DialogTitle>
           <DialogDescription>
-            레드플래그 발생 시 알림을 받을 담당자를 지정합니다.
+            {mode === "hse"
+              ? "PQ 제출 및 안전 관련 알림을 받을 담당자를 지정합니다."
+              : "레드플래그 발생 시 알림을 받을 담당자를 지정합니다."}
           </DialogDescription>
         </DialogHeader>
 
@@ -139,43 +174,67 @@ export function RedFlagManagersDialog() {
           </div>
         ) : (
           <div className="space-y-6 py-4">
-            {/* 구매기획 담당자 */}
-            <div className="space-y-2">
-              <Label htmlFor="purchasing-manager" className="flex items-center gap-2">
-                <Users className="h-4 w-4" />
-                구매기획 담당자
-              </Label>
-              <UserSelector
-                selectedUsers={purchasingManager}
-                onUsersChange={setPurchasingManager}
-                singleSelect={true}
-                placeholder="구매기획 담당자를 검색하세요..."
-                domainFilter={{ type: "exclude", domains: ["partners"] }}
-                closeOnSelect={true}
-              />
-              <p className="text-xs text-muted-foreground">
-                레드플래그 발생 시 알림을 받을 구매기획 담당자를 지정합니다.
-              </p>
-            </div>
+            {mode === "redflag" && (
+              <>
+                {/* 구매기획 담당자 */}
+                <div className="space-y-2">
+                  <Label htmlFor="purchasing-manager" className="flex items-center gap-2">
+                    <Users className="h-4 w-4" />
+                    구매기획 담당자
+                  </Label>
+                  <UserSelector
+                    selectedUsers={purchasingManager}
+                    onUsersChange={setPurchasingManager}
+                    singleSelect={true}
+                    placeholder="구매기획 담당자를 검색하세요..."
+                    domainFilter={{ type: "exclude", domains: ["partners"] }}
+                    closeOnSelect={true}
+                  />
+                  <p className="text-xs text-muted-foreground">
+                    레드플래그 발생 시 알림을 받을 구매기획 담당자를 지정합니다.
+                  </p>
+                </div>
 
-            {/* 준법 담당자 */}
-            <div className="space-y-2">
-              <Label htmlFor="compliance-manager" className="flex items-center gap-2">
-                <Users className="h-4 w-4" />
-                준법 담당자
-              </Label>
-              <UserSelector
-                selectedUsers={complianceManager}
-                onUsersChange={setComplianceManager}
-                singleSelect={true}
-                placeholder="준법 담당자를 검색하세요..."
-                domainFilter={{ type: "exclude", domains: ["partners"] }}
-                closeOnSelect={true}
-              />
-              <p className="text-xs text-muted-foreground">
-                레드플래그 발생 시 알림을 받을 준법 담당자를 지정합니다.
-              </p>
-            </div>
+                {/* 준법 담당자 */}
+                <div className="space-y-2">
+                  <Label htmlFor="compliance-manager" className="flex items-center gap-2">
+                    <Users className="h-4 w-4" />
+                    준법 담당자
+                  </Label>
+                  <UserSelector
+                    selectedUsers={complianceManager}
+                    onUsersChange={setComplianceManager}
+                    singleSelect={true}
+                    placeholder="준법 담당자를 검색하세요..."
+                    domainFilter={{ type: "exclude", domains: ["partners"] }}
+                    closeOnSelect={true}
+                  />
+                  <p className="text-xs text-muted-foreground">
+                    레드플래그 발생 시 알림을 받을 준법 담당자를 지정합니다.
+                  </p>
+                </div>
+              </>
+            )}
+
+            {mode === "hse" && (
+              <div className="space-y-2">
+                <Label htmlFor="hse-manager" className="flex items-center gap-2">
+                  <Users className="h-4 w-4" />
+                  안전(HSE) 담당자
+                </Label>
+                <UserSelector
+                  selectedUsers={hseManager}
+                  onUsersChange={setHseManager}
+                  singleSelect={true}
+                  placeholder="안전(HSE) 담당자를 검색하세요..."
+                  domainFilter={{ type: "exclude", domains: ["partners"] }}
+                  closeOnSelect={true}
+                />
+                <p className="text-xs text-muted-foreground">
+                  PQ 제출 및 안전 관련 알림을 받을 담당자를 지정합니다.
+                </p>
+              </div>
+            )}
           </div>
         )}
 
-- 
cgit v1.2.3

