diff --git a/resources/views/finance/journal-entries.blade.php b/resources/views/finance/journal-entries.blade.php index 96a5f6cc..e695a65f 100644 --- a/resources/views/finance/journal-entries.blade.php +++ b/resources/views/finance/journal-entries.blade.php @@ -59,6 +59,7 @@ const Calendar = createIcon('calendar'); const CreditCard = createIcon('credit-card'); const Lock = createIcon('lock'); +const Copy = createIcon('copy'); const CSRF_TOKEN = document.querySelector('meta[name="csrf-token"]')?.getAttribute('content'); @@ -1463,6 +1464,9 @@ className="p-1 text-stone-300 group-hover:text-emerald-500 hover:bg-emerald-50 r const [existingEntryNo, setExistingEntryNo] = useState(''); const [showAddPartnerModal, setShowAddPartnerModal] = useState(false); const [addPartnerLineIndex, setAddPartnerLineIndex] = useState(null); + const [isCopyMode, setIsCopyMode] = useState(false); + const [showCopyDialog, setShowCopyDialog] = useState(false); + const [copyDate, setCopyDate] = useState(getKoreanDate()); const getDefaultLines = () => [ { key: Date.now(), dc_type: 'debit', account_code: '', account_name: '', trading_partner_id: null, trading_partner_name: '', debit_amount: 0, credit_amount: 0, description: '' }, @@ -1481,8 +1485,8 @@ className="p-1 text-stone-300 group-hover:text-emerald-500 hover:bg-emerald-50 r }; useEffect(() => { - if (!isEditMode) fetchPreviewEntryNo(entryDate); - }, [entryDate]); + if (!isEditMode || isCopyMode) fetchPreviewEntryNo(entryDate); + }, [entryDate, isCopyMode]); // 수정 모드: 기존 전표 로드 useEffect(() => { @@ -1558,8 +1562,8 @@ className="p-1 text-stone-300 group-hover:text-emerald-500 hover:bg-emerald-50 r })), }; - const url = isEditMode ? `/finance/journal-entries/${entryId}` : '/finance/journal-entries/store'; - const method = isEditMode ? 'PUT' : 'POST'; + const url = (isEditMode && !isCopyMode) ? `/finance/journal-entries/${entryId}` : '/finance/journal-entries/store'; + const method = (isEditMode && !isCopyMode) ? 'PUT' : 'POST'; const res = await fetch(url, { method, headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', 'X-CSRF-TOKEN': CSRF_TOKEN }, @@ -1579,7 +1583,7 @@ className="p-1 text-stone-300 group-hover:text-emerald-500 hover:bg-emerald-50 r const data = await res.json(); if (data.success) { - notify(data.message || (isEditMode ? '전표가 수정되었습니다.' : '전표가 저장되었습니다.'), 'success'); + notify(data.message || (isCopyMode ? '전표가 복사되었습니다.' : isEditMode ? '전표가 수정되었습니다.' : '전표가 저장되었습니다.'), 'success'); onSaved(); } else { notify(data.message || '저장 실패', 'error'); @@ -1609,13 +1613,25 @@ className="p-1 text-stone-300 group-hover:text-emerald-500 hover:bg-emerald-50 r } }; + const handleCopyClick = () => { + setShowCopyDialog(true); + setCopyDate(getKoreanDate()); + }; + + const confirmCopy = () => { + setIsCopyMode(true); + setShowCopyDialog(false); + setEntryDate(copyDate); + fetchPreviewEntryNo(copyDate); + }; + return (