물건 & 견적서 수정

This commit is contained in:
basssy 2025-01-13 14:36:00 +09:00
parent fe203f2905
commit 4b7294d2d4
9 changed files with 174 additions and 23 deletions

View File

@ -28,11 +28,12 @@ export default function MainPage() {
const [searchForm, setSearchForm] = useRecoilState(searchState) const [searchForm, setSearchForm] = useRecoilState(searchState)
const { qcastState } = useContext(QcastContext) const { qcastState, setIsGlobalLoading } = useContext(QcastContext)
// //
const handleByOnKeyUp = (e) => { const handleByOnKeyUp = (e) => {
if (e.key === 'Enter') { if (e.key === 'Enter') {
setIsGlobalLoading(true)
// //
if (searchRadioType === 'object') { if (searchRadioType === 'object') {
setStuffSearch({ setStuffSearch({
@ -55,6 +56,7 @@ export default function MainPage() {
// //
const handleOnSubmit = () => { const handleOnSubmit = () => {
setIsGlobalLoading(true)
if (searchRadioType === 'object') { if (searchRadioType === 'object') {
setStuffSearch({ setStuffSearch({
...stuffSearch, ...stuffSearch,

View File

@ -7,12 +7,16 @@ import Search from '@/components/community/Search'
import Pagination from '@/components/community/Pagination' import Pagination from '@/components/community/Pagination'
import Table from '@/components/community/Table' import Table from '@/components/community/Table'
import { useContext } from 'react'
import { useEffect, useState } from 'react' import { useEffect, useState } from 'react'
import { useResetRecoilState, useRecoilValue, useRecoilState } from 'recoil' import { useResetRecoilState, useRecoilValue, useRecoilState } from 'recoil'
import { useMessage } from '@/hooks/useMessage' import { useMessage } from '@/hooks/useMessage'
import { searchState } from '@/store/boardAtom' import { searchState } from '@/store/boardAtom'
import { QcastContext } from '@/app/QcastProvider'
export default function Faq() { export default function Faq() {
const { getMessage } = useMessage() const { getMessage } = useMessage()
const resetSearch = useResetRecoilState(searchState) const resetSearch = useResetRecoilState(searchState)
@ -21,10 +25,14 @@ export default function Faq() {
const search = useRecoilValue(searchState) const search = useRecoilValue(searchState)
const [searchForm, setSearchForm] = useRecoilState(searchState) const [searchForm, setSearchForm] = useRecoilState(searchState)
const { setIsGlobalLoading } = useContext(QcastContext)
useEffect(() => { useEffect(() => {
if (search.mainFlag === 'N') { if (search.mainFlag === 'N') {
resetSearch() resetSearch()
} else { } else {
// FAQ
setIsGlobalLoading(false)
setSearchForm({ ...searchForm, mainFlag: 'N' }) setSearchForm({ ...searchForm, mainFlag: 'N' })
} }
setIsInitialized(true) setIsInitialized(true)

View File

@ -294,6 +294,7 @@ export default function Estimate({}) {
const originReset = () => { const originReset = () => {
setOriginFiles([]) setOriginFiles([])
estimateContextState.resetFlag = 'N'
} }
// //
const returnOriginFile = (no) => { const returnOriginFile = (no) => {
@ -894,6 +895,7 @@ export default function Estimate({}) {
} }
} }
}) })
// console.log('itemList::', itemList)
let pkgAsp = estimateContextState.pkgAsp ? Number(estimateContextState.pkgAsp.replaceAll(',', '')) : 0 let pkgAsp = estimateContextState.pkgAsp ? Number(estimateContextState.pkgAsp.replaceAll(',', '')) : 0
totals.pkgTotPrice = pkgAsp * totals.totVolKw * 1000 totals.pkgTotPrice = pkgAsp * totals.totVolKw * 1000

View File

@ -3,9 +3,9 @@ import { useState } from 'react'
import { useMessage } from '@/hooks/useMessage' import { useMessage } from '@/hooks/useMessage'
import { useAxios } from '@/hooks/useAxios' import { useAxios } from '@/hooks/useAxios'
import { useRecoilValue } from 'recoil' import { useRecoilValue } from 'recoil'
import { floorPlanObjectState } from '@/store/floorPlanObjectAtom' import { floorPlanObjectState, estimateState } from '@/store/floorPlanObjectAtom'
export default function DocDownOptionPop({ planNo, setEstimatePopupOpen }) { export default function DocDownOptionPop({ planNo, setEstimatePopupOpen, docDownPopLockFlg }) {
const { getMessage } = useMessage() const { getMessage } = useMessage()
const { promisePost } = useAxios() const { promisePost } = useAxios()
@ -22,6 +22,7 @@ export default function DocDownOptionPop({ planNo, setEstimatePopupOpen }) {
// recoil // recoil
const objectRecoil = useRecoilValue(floorPlanObjectState) const objectRecoil = useRecoilValue(floorPlanObjectState)
const estimateRecoilState = useRecoilValue(estimateState)
// //
const handleFileDown = async () => { const handleFileDown = async () => {
@ -82,6 +83,9 @@ export default function DocDownOptionPop({ planNo, setEstimatePopupOpen }) {
link.click() link.click()
link.remove() link.remove()
window.URL.revokeObjectURL(fileUrl) window.URL.revokeObjectURL(fileUrl)
// lockFlg = 1 !
estimateRecoilState.lockFlg = '1'
docDownPopLockFlg()
} }
}) })
.catch((error) => { .catch((error) => {

View File

@ -85,7 +85,11 @@ export default function CanvasMenu(props) {
const selectedRoofMaterial = useRecoilValue(selectedRoofMaterialSelector) const selectedRoofMaterial = useRecoilValue(selectedRoofMaterialSelector)
// //
const [buttonStyle, setButtonStyle] = useState('') const [buttonStyle1, setButtonStyle1] = useState('') //
const [buttonStyle2, setButtonStyle2] = useState('') //
const [buttonStyle3, setButtonStyle3] = useState('') //
const [buttonStyle4, setButtonStyle4] = useState('') //
const [buttonStyle5, setButtonStyle5] = useState('') //
// //
const { objectNo, pid } = floorPlanState const { objectNo, pid } = floorPlanState
@ -256,22 +260,19 @@ export default function CanvasMenu(props) {
// //
const handleEstimateReset = () => { const handleEstimateReset = () => {
swalFire({ swalFire({
// , . ?
//
text: getMessage('estimate.detail.reset.confirmMsg'), text: getMessage('estimate.detail.reset.confirmMsg'),
type: 'confirm', type: 'confirm',
confirmFn: async () => { confirmFn: async () => {
setIsGlobalLoading(true)
const params = { const params = {
objectNo: objectNo, objectNo: objectNo,
planNo: pid, planNo: pid,
userId: sessionState.userId, userId: sessionState.userId,
} }
//
try { try {
await promisePost({ url: '/api/estimate/reset-estimate', data: params }).then((res) => { await promisePost({ url: '/api/estimate/reset-estimate', data: params }).then((res) => {
setIsGlobalLoading(true)
if (res.status === 201) { if (res.status === 201) {
swalFire({ text: getMessage('estimate.detail.copy.alertMsg'), type: 'alert' }) swalFire({ text: getMessage('estimate.detail.reset.alertMsg'), type: 'alert' })
fetchSetting(objectNo, pid, 'R') fetchSetting(objectNo, pid, 'R')
} }
}) })
@ -281,7 +282,7 @@ export default function CanvasMenu(props) {
} }
}, },
denyFn: () => { denyFn: () => {
console.log('초기화하지 않음. 변경일시 갱신안함') setIsGlobalLoading(false)
}, },
}) })
} }
@ -314,12 +315,112 @@ export default function CanvasMenu(props) {
if (isObjectNotEmpty(estimateRecoilState)) { if (isObjectNotEmpty(estimateRecoilState)) {
if (estimateRecoilState?.createUser === 'T01') { if (estimateRecoilState?.createUser === 'T01') {
if (sessionState.userId !== 'T01') { if (sessionState.userId !== 'T01') {
setButtonStyle('none') setButtonStyle1('none')
setButtonStyle2('none')
setButtonStyle3('none')
setButtonStyle4('none')
setButtonStyle5('none')
}
} else {
if (estimateRecoilState?.tempFlg === '1') {
setButtonStyle1('none')
setButtonStyle2('')
setButtonStyle3('none')
setButtonStyle4('none')
setButtonStyle5('none')
} else {
if (estimateRecoilState?.tempFlg === '0' && estimateRecoilState?.lockFlg === '0') {
setButtonStyle1('')
setButtonStyle2('')
setButtonStyle3('')
setButtonStyle4('')
setButtonStyle5('')
} else {
setButtonStyle1('')
setButtonStyle2('none')
setButtonStyle3('none')
setButtonStyle4('')
setButtonStyle5('')
}
} }
} }
} }
}, [estimateRecoilState]) }, [estimateRecoilState])
/**
* 견적서 잠금 / 해제
* lockFlg : 0 잠금해제상태 / 1 잠금상태
* --보낼때--
* 0잠금해제는 1잠금으로
* 1잠금 문서는 0 잠금해제로
*/
const handleEstimateLockController = (estimateRecoilState) => {
swalFire({
text: estimateRecoilState.lockFlg === '0' ? getMessage('estimate.detail.lock.alertMsg') : getMessage('estimate.detail.unlock.alertMsg'),
type: 'confirm',
confirmFn: async () => {
setIsGlobalLoading(true)
const params = {
objectNo: estimateRecoilState.objectNo,
planNo: estimateRecoilState.planNo,
lockFlg: estimateRecoilState.lockFlg === '0' ? '1' : '0',
userId: sessionState.userId,
}
try {
await promisePost({ url: '/api/estimate/save-estimate-lock', data: params }).then((res) => {
if (res.status === 201) {
estimateRecoilState.lockFlg = estimateRecoilState.lockFlg === '0' ? '1' : '0'
if (estimateRecoilState?.createUser === 'T01') {
if (sessionState.userId !== 'T01') {
setButtonStyle1('none')
setButtonStyle2('none')
setButtonStyle3('none')
setButtonStyle4('none')
setButtonStyle5('none')
}
} else {
if (estimateRecoilState?.tempFlg === '1') {
setButtonStyle1('none')
setButtonStyle2('')
setButtonStyle3('none')
setButtonStyle4('none')
setButtonStyle5('none')
} else {
if (estimateRecoilState?.tempFlg === '0' && estimateRecoilState?.lockFlg === '0') {
setButtonStyle1('')
setButtonStyle2('')
setButtonStyle3('')
setButtonStyle4('')
setButtonStyle5('')
} else {
setButtonStyle1('')
setButtonStyle2('none')
setButtonStyle3('none')
setButtonStyle4('')
setButtonStyle5('')
}
}
}
}
setIsGlobalLoading(false)
})
} catch (error) {
setIsGlobalLoading(false)
console.log('error::::::::::::', e.response.data.message)
}
},
})
}
//
const docDownPopLockFlg = () => {
setButtonStyle1('')
setButtonStyle2('none')
setButtonStyle3('none')
setButtonStyle4('')
setButtonStyle5('')
}
return ( return (
<div className={`canvas-menu-wrap ${[2, 3, 4].some((num) => num === menuNumber) ? 'active' : ''}`}> <div className={`canvas-menu-wrap ${[2, 3, 4].some((num) => num === menuNumber) ? 'active' : ''}`}>
<div className="canvas-menu-inner"> <div className="canvas-menu-inner">
@ -406,16 +507,17 @@ export default function CanvasMenu(props) {
{menuNumber === 5 && ( {menuNumber === 5 && (
<> <>
<div className="ico-btn-from"> <div className="ico-btn-from">
<button className="btn-frame gray ico-flx" onClick={() => setEstimatePopupOpen(true)}> <button type="button" style={{ display: buttonStyle1 }} className="btn-frame gray ico-flx" onClick={() => setEstimatePopupOpen(true)}>
<span className="ico ico01"></span> <span className="ico ico01"></span>
<span className="name">{getMessage('plan.menu.estimate.docDown')}</span> <span className="name">{getMessage('plan.menu.estimate.docDown')}</span>
</button> </button>
<button style={{ display: buttonStyle }} className="btn-frame gray ico-flx" onClick={handleEstimateSubmit}> <button type="button" style={{ display: buttonStyle2 }} className="btn-frame gray ico-flx" onClick={handleEstimateSubmit}>
<span className="ico ico02"></span> <span className="ico ico02"></span>
<span className="name">{getMessage('plan.menu.estimate.save')}</span> <span className="name">{getMessage('plan.menu.estimate.save')}</span>
</button> </button>
<button <button
style={{ display: buttonStyle }} type="button"
style={{ display: buttonStyle3 }}
className="btn-frame gray ico-flx" className="btn-frame gray ico-flx"
onClick={() => { onClick={() => {
handleEstimateReset() handleEstimateReset()
@ -427,6 +529,8 @@ export default function CanvasMenu(props) {
{estimateRecoilState?.docNo !== null && (sessionState.storeId === 'T01' || sessionState.storeLvl === '1') && ( {estimateRecoilState?.docNo !== null && (sessionState.storeId === 'T01' || sessionState.storeLvl === '1') && (
<button <button
type="button"
style={{ display: buttonStyle4 }}
className="btn-frame gray ico-flx" className="btn-frame gray ico-flx"
onClick={() => { onClick={() => {
setEstimateCopyPopupOpen(true) setEstimateCopyPopupOpen(true)
@ -436,9 +540,20 @@ export default function CanvasMenu(props) {
<span className="name">{getMessage('plan.menu.estimate.copy')}</span> <span className="name">{getMessage('plan.menu.estimate.copy')}</span>
</button> </button>
)} )}
<button style={{ display: buttonStyle }} className="btn-frame gray ico-flx"> <button
type="button"
style={{ display: buttonStyle5 }}
className="btn-frame gray ico-flx"
onClick={() => {
//
alert('작업중입니다')
// handleEstimateLockController(estimateRecoilState)
}}
>
<span className="ico ico05"></span> <span className="ico ico05"></span>
<span className="name">{getMessage('plan.menu.estimate.unLock')}</span> <span className="name">
{estimateRecoilState?.lockFlg === '1' ? getMessage('plan.menu.estimate.unLock') : getMessage('plan.menu.estimate.lock')}
</span>
</button> </button>
</div> </div>
</> </>
@ -463,7 +578,9 @@ export default function CanvasMenu(props) {
{[2, 3, 4].some((num) => num === menuNumber) && <MenuDepth01 />} {[2, 3, 4].some((num) => num === menuNumber) && <MenuDepth01 />}
</div> </div>
{/* 견적서(menuNumber=== 5) 상세화면인경우 문서다운로드 팝업 */} {/* 견적서(menuNumber=== 5) 상세화면인경우 문서다운로드 팝업 */}
{estimatePopupOpen && <DocDownOptionPop planNo={estimateRecoilState?.planNo} setEstimatePopupOpen={setEstimatePopupOpen} />} {estimatePopupOpen && (
<DocDownOptionPop planNo={estimateRecoilState?.planNo} setEstimatePopupOpen={setEstimatePopupOpen} docDownPopLockFlg={docDownPopLockFlg} />
)}
{/* 견적서(menuNumber ===5)복사 팝업 */} {/* 견적서(menuNumber ===5)복사 팝업 */}
{estimateCopyPopupOpen && <EstimateCopyPop planNo={estimateRecoilState?.planNo} setEstimateCopyPopupOpen={setEstimateCopyPopupOpen} />} {estimateCopyPopupOpen && <EstimateCopyPop planNo={estimateRecoilState?.planNo} setEstimateCopyPopupOpen={setEstimateCopyPopupOpen} />}
</div> </div>

View File

@ -282,7 +282,7 @@ export default function StuffDetail() {
onClick={() => { onClick={() => {
//mid:5(), /pid: //mid:5(), /pid:
setFloorPlanObjectNo({ floorPlanObjectNo: params.data.objectNo }) setFloorPlanObjectNo({ floorPlanObjectNo: params.data.objectNo })
// router.push(`/floor-plan/estimate/5/${params.data.planNo}`) setIsGlobalLoading(true)
router.push(`/floor-plan/estimate/5?pid=${params.data.planNo}&objectNo=${params.data.objectNo}`) router.push(`/floor-plan/estimate/5?pid=${params.data.planNo}&objectNo=${params.data.objectNo}`)
}} }}
> >
@ -1492,6 +1492,7 @@ export default function StuffDetail() {
// //
const getCellDoubleClicked = (params) => { const getCellDoubleClicked = (params) => {
if (params?.column?.colId !== 'estimateDate') { if (params?.column?.colId !== 'estimateDate') {
setIsGlobalLoading(true)
if (params?.data?.planNo && params?.data?.objectNo) { if (params?.data?.planNo && params?.data?.objectNo) {
let objectNo = params?.data?.objectNo let objectNo = params?.data?.objectNo
let planNo = params?.data?.planNo let planNo = params?.data?.planNo

View File

@ -61,6 +61,8 @@ export const useEstimateController = (planNo) => {
res.data.originFiles = [] res.data.originFiles = []
res.data.originFile = [] res.data.originFile = []
res.data.resetFlag = 'Y' res.data.resetFlag = 'Y'
} else {
res.data.resetFlag = 'N'
} }
if (res.data.itemList.length > 0) { if (res.data.itemList.length > 0) {
res.data.itemList.map((item) => { res.data.itemList.map((item) => {
@ -160,16 +162,19 @@ export const useEstimateController = (planNo) => {
let itemFlg = true let itemFlg = true
if (estimateData?.charger === null || estimateData?.charger?.trim().length === 0) { if (estimateData?.charger === null || estimateData?.charger?.trim().length === 0) {
flag = false flag = false
setIsGlobalLoading(false)
return alert(getMessage('estimate.detail.save.requiredCharger')) return alert(getMessage('estimate.detail.save.requiredCharger'))
} }
if (estimateData?.objectName === null || estimateData?.objectName?.trim().length === 0) { if (estimateData?.objectName === null || estimateData?.objectName?.trim().length === 0) {
flag = false flag = false
setIsGlobalLoading(false)
return alert(getMessage('estimate.detail.save.requiredObjectName')) return alert(getMessage('estimate.detail.save.requiredObjectName'))
} }
if (isNaN(Date.parse(estimateData.estimateDate))) { if (isNaN(Date.parse(estimateData.estimateDate))) {
flag = false flag = false
setIsGlobalLoading(false)
return alert(getMessage('estimate.detail.save.requiredEstimateDate')) return alert(getMessage('estimate.detail.save.requiredEstimateDate'))
} }
@ -177,6 +182,7 @@ export const useEstimateController = (planNo) => {
let pkgAsp = estimateData.pkgAsp let pkgAsp = estimateData.pkgAsp
if (pkgAsp === '0') { if (pkgAsp === '0') {
flag = false flag = false
setIsGlobalLoading(false)
return alert(getMessage('estimate.detail.save.requiredPkgAsp')) return alert(getMessage('estimate.detail.save.requiredPkgAsp'))
} }
} }
@ -204,6 +210,7 @@ export const useEstimateController = (planNo) => {
if (fileFlg) { if (fileFlg) {
if (estimateData.fileFlg === '0') { if (estimateData.fileFlg === '0') {
fileFlg = false fileFlg = false
setIsGlobalLoading(false)
return alert(getMessage('estimate.detail.save.requiredFileUpload')) return alert(getMessage('estimate.detail.save.requiredFileUpload'))
} }
} }
@ -221,6 +228,7 @@ export const useEstimateController = (planNo) => {
if (item.addFlg) { if (item.addFlg) {
if (item.itemId === '') { if (item.itemId === '') {
itemFlg = false itemFlg = false
setIsGlobalLoading(false)
return alert(getMessage('estimate.detail.save.requiredItemId')) return alert(getMessage('estimate.detail.save.requiredItemId'))
} }
} }
@ -236,6 +244,7 @@ export const useEstimateController = (planNo) => {
if (item.amount < 1) { if (item.amount < 1) {
itemFlg = false itemFlg = false
setIsGlobalLoading(false)
return alert(getMessage('estimate.detail.save.requiredAmount')) return alert(getMessage('estimate.detail.save.requiredAmount'))
} }
@ -247,6 +256,7 @@ export const useEstimateController = (planNo) => {
if (item.openFlg !== '1') { if (item.openFlg !== '1') {
if (item.salePrice < 1) { if (item.salePrice < 1) {
itemFlg = false itemFlg = false
setIsGlobalLoading(false)
return alert(getMessage('estimate.detail.save.requiredSalePrice')) return alert(getMessage('estimate.detail.save.requiredSalePrice'))
} }
} }
@ -257,6 +267,7 @@ export const useEstimateController = (planNo) => {
if (item.pkgMaterialFlg === '1') { if (item.pkgMaterialFlg === '1') {
if (isNaN(item.salePrice)) { if (isNaN(item.salePrice)) {
itemFlg = false itemFlg = false
setIsGlobalLoading(false)
return alert(getMessage('estimate.detail.save.requiredSalePrice')) return alert(getMessage('estimate.detail.save.requiredSalePrice'))
} }
} }
@ -274,6 +285,7 @@ export const useEstimateController = (planNo) => {
} }
}) })
if (delCnt === estimateData.itemList.length) { if (delCnt === estimateData.itemList.length) {
setIsGlobalLoading(false)
return alert(getMessage('estimate.detail.save.requiredItem')) return alert(getMessage('estimate.detail.save.requiredItem'))
} }
} }
@ -292,6 +304,7 @@ export const useEstimateController = (planNo) => {
await post({ url: '/api/file/fileUpload', data: formData }).then((res) => { await post({ url: '/api/file/fileUpload', data: formData }).then((res) => {
setFileList(res) setFileList(res)
setIsGlobalLoading(false)
}) })
} else { } else {
setFileList([]) setFileList([])
@ -360,15 +373,12 @@ export const useEstimateController = (planNo) => {
} }
//2. 상세데이터 저장 //2. 상세데이터 저장
// return
try { try {
setIsGlobalLoading(true)
await promisePost({ url: `${ESTIMATE_API_ENDPOINT}/save-estimate`, data: estimateData }).then((res) => { await promisePost({ url: `${ESTIMATE_API_ENDPOINT}/save-estimate`, data: estimateData }).then((res) => {
setIsGlobalLoading(true)
if (res.status === 201) { if (res.status === 201) {
estimateData.newFileList = [] estimateData.newFileList = []
//알럿창 변경
swalFire({ text: getMessage('estimate.detail.save.alertMsg'), type: 'alert' }) swalFire({ text: getMessage('estimate.detail.save.alertMsg'), type: 'alert' })
// alert(getMessage('estimate.detail.save.alertMsg'))
fetchSetting(objectRecoil.floorPlanObjectNo, estimateData.planNo) fetchSetting(objectRecoil.floorPlanObjectNo, estimateData.planNo)
} }
}) })
@ -401,7 +411,6 @@ export const useEstimateController = (planNo) => {
userId: session.userId, userId: session.userId,
} }
// return
await promisePost({ url: '/api/estimate/save-estimate-copy', data: params }).then((res) => { await promisePost({ url: '/api/estimate/save-estimate-copy', data: params }).then((res) => {
if (res.status === 201) { if (res.status === 201) {
if (isObjectNotEmpty(res.data)) { if (isObjectNotEmpty(res.data)) {

View File

@ -168,6 +168,7 @@
"plan.menu.estimate.reset": "初期化", "plan.menu.estimate.reset": "初期化",
"plan.menu.estimate.copy": "見積書のコピー", "plan.menu.estimate.copy": "見積書のコピー",
"plan.menu.estimate.unLock": "ロック解除", "plan.menu.estimate.unLock": "ロック解除",
"plan.menu.estimate.lock": "ロック",
"plan.menu.simulation": "発展シミュレーション", "plan.menu.simulation": "発展シミュレーション",
"plan.menu.simulation.excel": "Excel", "plan.menu.simulation.excel": "Excel",
"plan.menu.simulation.pdf": "PDF", "plan.menu.simulation.pdf": "PDF",
@ -931,7 +932,10 @@
"estimate.detail.save.requiredItemId": "製品を選択してください.", "estimate.detail.save.requiredItemId": "製品を選択してください.",
"estimate.detail.save.requiredAmount": "数量は0より大きい値を入力してください.", "estimate.detail.save.requiredAmount": "数量は0より大きい値を入力してください.",
"estimate.detail.save.requiredSalePrice": "単価は0より大きい値を入力してください.", "estimate.detail.save.requiredSalePrice": "単価は0より大きい値を入力してください.",
"estimate.detail.reset.alertMsg": "初期化されました.",
"estimate.detail.reset.confirmMsg": "保存した見積書情報が初期化され、図面情報が反映されます。本当に初期化しますか?", "estimate.detail.reset.confirmMsg": "保存した見積書情報が初期化され、図面情報が反映されます。本当に初期化しますか?",
"estimate.detail.lock.alertMsg": "見積書を[ロック]すると、変更できません。見積もりを編集するには、ロックを解除してください.",
"estimate.detail.unlock.alertMsg": "見積書を修正して保存",
"estimate.detail.alert.delFile": "添付ファイルを完全に削除するには[保存]ボタンをクリックしてください", "estimate.detail.alert.delFile": "添付ファイルを完全に削除するには[保存]ボタンをクリックしてください",
"estimate.detail.alert.selectDelItem": "削除する商品を選択してください.", "estimate.detail.alert.selectDelItem": "削除する商品を選択してください.",
"simulator.title.sub1": "物件番号", "simulator.title.sub1": "物件番号",

View File

@ -172,6 +172,7 @@
"plan.menu.estimate.reset": "초기화", "plan.menu.estimate.reset": "초기화",
"plan.menu.estimate.copy": "견적서 복사", "plan.menu.estimate.copy": "견적서 복사",
"plan.menu.estimate.unLock": "잠금 해제", "plan.menu.estimate.unLock": "잠금 해제",
"plan.menu.estimate.lock": "잠금",
"plan.menu.simulation": "발전 시뮬레이션", "plan.menu.simulation": "발전 시뮬레이션",
"plan.menu.simulation.excel": "Excel", "plan.menu.simulation.excel": "Excel",
"plan.menu.simulation.pdf": "PDF", "plan.menu.simulation.pdf": "PDF",
@ -940,7 +941,10 @@
"estimate.detail.save.requiredItemId": "제품을 선택해주세요.", "estimate.detail.save.requiredItemId": "제품을 선택해주세요.",
"estimate.detail.save.requiredAmount": "수량은 0보다 큰값을 입력해주세요.", "estimate.detail.save.requiredAmount": "수량은 0보다 큰값을 입력해주세요.",
"estimate.detail.save.requiredSalePrice": "단가는 0보다 큰값을 입력해주세요.", "estimate.detail.save.requiredSalePrice": "단가는 0보다 큰값을 입력해주세요.",
"estimate.detail.reset.alertMsg": "초기화 되었습니다.",
"estimate.detail.reset.confirmMsg": "수기 변경(저장)한 견적 정보가 초기화되고, 최근 저장된 도면정보가 반영됩니다. 정말로 초기화하시겠습니까?", "estimate.detail.reset.confirmMsg": "수기 변경(저장)한 견적 정보가 초기화되고, 최근 저장된 도면정보가 반영됩니다. 정말로 초기화하시겠습니까?",
"estimate.detail.lock.alertMsg": "견적서를 [잠금]하면, 수정할 수 없습니다. 견적서를 수정하려면 잠금해제를 하십시오",
"estimate.detail.unlock.alertMsg": "견적서를 수정하고, 저장하십시오",
"estimate.detail.alert.delFile": "첨부파일을 완전히 삭제하려면 [저장]버튼을 클릭하십시오.", "estimate.detail.alert.delFile": "첨부파일을 완전히 삭제하려면 [저장]버튼을 클릭하십시오.",
"estimate.detail.alert.selectDelItem": "삭제할 제품을 선택하세요.", "estimate.detail.alert.selectDelItem": "삭제할 제품을 선택하세요.",
"simulator.title.sub1": "물건번호", "simulator.title.sub1": "물건번호",