diff --git a/src/app/[locale]/(protected)/sales/order-management-sales/[id]/page.tsx b/src/app/[locale]/(protected)/sales/order-management-sales/[id]/page.tsx
index 8bc53653..a897ca5d 100644
--- a/src/app/[locale]/(protected)/sales/order-management-sales/[id]/page.tsx
+++ b/src/app/[locale]/(protected)/sales/order-management-sales/[id]/page.tsx
@@ -149,6 +149,9 @@ export default function OrderDetailPage() {
const [isConfirming, setIsConfirming] = useState(false);
const [isRevertDialogOpen, setIsRevertDialogOpen] = useState(false);
const [isReverting, setIsReverting] = useState(false);
+ const [revertReason, setRevertReason] = useState("");
+ const [isForceReverting, setIsForceReverting] = useState(false);
+ const isDev = process.env.NODE_ENV !== 'production';
const [isRevertConfirmDialogOpen, setIsRevertConfirmDialogOpen] = useState(false);
const [isRevertingConfirm, setIsRevertingConfirm] = useState(false);
const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false);
@@ -322,6 +325,7 @@ export default function OrderDetailPage() {
// 생산지시 되돌리기
const handleRevertProduction = () => {
+ setRevertReason("");
setIsRevertDialogOpen(true);
};
@@ -329,7 +333,9 @@ export default function OrderDetailPage() {
if (order) {
setIsReverting(true);
try {
- const result = await revertProductionOrder(order.id);
+ const result = await revertProductionOrder(order.id, {
+ reason: revertReason || undefined,
+ });
if (result.success && result.data) {
setOrder(result.data.order);
const { deletedCounts } = result.data;
@@ -349,6 +355,28 @@ export default function OrderDetailPage() {
}
};
+ // 생산지시 완전삭제 (force=true, 개발환경 전용)
+ const handleForceRevertProduction = async () => {
+ if (order) {
+ setIsForceReverting(true);
+ try {
+ const result = await revertProductionOrder(order.id, { force: true });
+ if (result.success && result.data) {
+ setOrder(result.data.order);
+ toast.success("생산지시가 완전삭제되었습니다. (물리 삭제)");
+ setIsRevertDialogOpen(false);
+ } else {
+ toast.error(result.error || "완전삭제에 실패했습니다.");
+ }
+ } catch (error) {
+ console.error("Error force reverting production order:", error);
+ toast.error("완전삭제 중 오류가 발생했습니다.");
+ } finally {
+ setIsForceReverting(false);
+ }
+ }
+ };
+
// 수주확정 되돌리기
const handleRevertConfirmation = () => {
setIsRevertConfirmDialogOpen(true);
@@ -1046,6 +1074,17 @@ export default function OrderDetailPage() {
+ {/* 되돌리기 사유 */}
+
+
+
+
{/* 확인 안내 */}
@@ -1054,21 +1093,32 @@ export default function OrderDetailPage() {
-
+
-
+
+ {isDev && (
+
+ )}
+
+
diff --git a/src/app/[locale]/(protected)/sales/order-management-sales/page.tsx b/src/app/[locale]/(protected)/sales/order-management-sales/page.tsx
index 2927336e..fd4c57e5 100644
--- a/src/app/[locale]/(protected)/sales/order-management-sales/page.tsx
+++ b/src/app/[locale]/(protected)/sales/order-management-sales/page.tsx
@@ -162,6 +162,9 @@ function OrderListContent() {
// 삭제 확인 다이얼로그 state (다중 선택 삭제 지원)
const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false);
const [deleteTargetIds, setDeleteTargetIds] = useState([]);
+ const [isForceDeleteDialogOpen, setIsForceDeleteDialogOpen] = useState(false);
+ const [isForceDeleting, setIsForceDeleting] = useState(false);
+ const isDev = process.env.NODE_ENV !== 'production';
// 모바일 인피니티 스크롤 state
const [mobileDisplayCount, setMobileDisplayCount] = useState(20);
@@ -433,6 +436,33 @@ function OrderListContent() {
}
};
+ // 완전삭제 (force=true, 개발환경 전용)
+ const handleForceDelete = async () => {
+ const selectedIds = Array.from(selectedItems);
+ if (selectedIds.length === 0) return;
+ setIsForceDeleting(true);
+ try {
+ const result = await deleteOrders(selectedIds, { force: true });
+ if (result.success) {
+ setOrders(orders.filter((o) => !selectedIds.includes(o.id)));
+ setSelectedItems(new Set());
+ toast.success(`${result.deletedCount ?? selectedIds.length}개의 수주가 완전삭제되었습니다.`);
+ const statsResult = await getOrderStats();
+ if (statsResult.success && statsResult.data) {
+ setApiStats(statsResult.data);
+ }
+ } else {
+ toast.error(result.error || "완전삭제에 실패했습니다.");
+ }
+ } catch (error) {
+ console.error("Error force deleting orders:", error);
+ toast.error("완전삭제 중 오류가 발생했습니다.");
+ } finally {
+ setIsForceDeleting(false);
+ setIsForceDeleteDialogOpen(false);
+ }
+ };
+
// 체크박스 선택
const toggleSelection = (id: string) => {
const newSelection = new Set(selectedItems);
@@ -716,6 +746,18 @@ function OrderListContent() {
});
},
+ selectionActions: isDev ? () => (
+
+ ) : undefined,
+
headerActions: () => (