diff --git a/src/common/common.js b/src/common/common.js index a0204047..c8dc5383 100644 --- a/src/common/common.js +++ b/src/common/common.js @@ -155,10 +155,4 @@ export const SAVE_KEY = [ 'originText', ] -export const OBJECT_PROTOTYPE = [ - fabric.Line.prototype, - fabric.Polygon.prototype, - fabric.Text.prototype, - fabric.IText.prototype, - fabric.Triangle.prototype, -] +export const OBJECT_PROTOTYPE = [fabric.Line.prototype, fabric.Polygon.prototype, fabric.Triangle.prototype] diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index af51ea74..de96d1a3 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -152,7 +152,7 @@ export default function Estimate({ params }) { {/* 주문분류 */} - 注文分類/주문분류 * + {getMessage('estimate.detail.orderType')} *
@@ -160,7 +160,7 @@ export default function Estimate({ params }) { {/* 지붕재・사양시공 최대4개*/} - 屋根材・仕様施工 / 지붕재・사양시공 + {getMessage('estimate.detail.roofCns')}
@@ -178,7 +178,7 @@ export default function Estimate({ params }) { {/* 비고 */} - 備考 /비고 + {getMessage('estimate.detail.note')}
@@ -193,9 +193,9 @@ export default function Estimate({ params }) {

{getMessage('estimate.detail.header.fileList1')}

- -
@@ -273,23 +273,23 @@ export default function Estimate({ params }) {
-
수량 (PCS)
+
{getMessage('estimate.detail.sepcialEstimateProductInfo.totPcs')}
74
-
용량 (Kw)
+
{getMessage('estimate.detail.sepcialEstimateProductInfo.vol')}
8300
-
공급가액
+
{getMessage('estimate.detail.sepcialEstimateProductInfo.netAmt')}
6,798,900
-
부가세 (10%)
+
{getMessage('estimate.detail.sepcialEstimateProductInfo.vat')}
679,890
-
총액
+
{getMessage('estimate.detail.sepcialEstimateProductInfo.totPrice')}
7,478,790
@@ -317,9 +317,9 @@ export default function Estimate({ params }) {
{getMessage('estimate.detail.sepcialEstimateProductInfo.pkgWeight')} - (모듈수량 * 수량) / 100) + {getMessage('estimate.detail.sepcialEstimateProductInfo.calcFormula1')} {getMessage('estimate.detail.sepcialEstimateProductInfo.pkgPrice')} - PKG단가(W) * PKG용량(W) + {getMessage('estimate.detail.sepcialEstimateProductInfo.calcFormula2')} diff --git a/src/components/floor-plan/modal/lineTypes/Angle.jsx b/src/components/floor-plan/modal/lineTypes/Angle.jsx index 83985016..e90f437f 100644 --- a/src/components/floor-plan/modal/lineTypes/Angle.jsx +++ b/src/components/floor-plan/modal/lineTypes/Angle.jsx @@ -19,6 +19,7 @@ export default function Angle({ props }) { className="input-origin block" value={angle1} ref={angle1Ref} + onFocus={(e) => (angle1Ref.current.value = '')} onChange={(e) => onlyNumberWithDotInputChange(e, setAngle1)} placeholder="45" /> @@ -38,6 +39,7 @@ export default function Angle({ props }) { className="input-origin block" value={length1} ref={length1Ref} + onFocus={(e) => (length1Ref.current.value = '')} onChange={(e) => onlyNumberInputChange(e, setLength1)} placeholder="3000" /> diff --git a/src/components/floor-plan/modal/lineTypes/Diagonal.jsx b/src/components/floor-plan/modal/lineTypes/Diagonal.jsx index 84c25329..23972fb5 100644 --- a/src/components/floor-plan/modal/lineTypes/Diagonal.jsx +++ b/src/components/floor-plan/modal/lineTypes/Diagonal.jsx @@ -35,6 +35,7 @@ export default function Diagonal({ props }) { className="input-origin block" value={outerLineDiagonalLength} ref={outerLineDiagonalLengthRef} + onFocus={(e) => (outerLineDiagonalLengthRef.current.value = '')} onChange={(e) => onlyNumberInputChange(e, setOuterLineDiagonalLength)} placeholder="3000" /> @@ -56,6 +57,7 @@ export default function Diagonal({ props }) { className="input-origin block" value={length1} ref={length1Ref} + onFocus={(e) => (length1Ref.current.value = '')} onChange={(e) => onlyNumberInputChange(e, setLength1)} placeholder="3000" /> diff --git a/src/components/floor-plan/modal/lineTypes/DoublePitch.jsx b/src/components/floor-plan/modal/lineTypes/DoublePitch.jsx index 5bfa5950..b34a1f3e 100644 --- a/src/components/floor-plan/modal/lineTypes/DoublePitch.jsx +++ b/src/components/floor-plan/modal/lineTypes/DoublePitch.jsx @@ -55,6 +55,7 @@ export default function DoublePitch({ props }) { className="input-origin block" value={angle1} ref={angle1Ref} + onFocus={(e) => (angle1Ref.current.value = '')} onChange={(e) => onlyNumberWithDotInputChange(e, setAngle1)} placeholder="45" /> @@ -71,6 +72,7 @@ export default function DoublePitch({ props }) { className="input-origin block" value={length1} ref={length1Ref} + onFocus={(e) => (length1Ref.current.value = '')} onChange={(e) => onlyNumberInputChange(e, setLength1)} placeholder="3000" /> @@ -128,9 +130,9 @@ export default function DoublePitch({ props }) { className="input-origin block" value={angle2} ref={angle2Ref} + onFocus={(e) => (angle2Ref.current.value = '')} onChange={(e) => { onlyNumberWithDotInputChange(e, setAngle2) - console.log(getLength2()) setLength2(getLength2()) }} placeholder="45" @@ -153,6 +155,7 @@ export default function DoublePitch({ props }) { className="input-origin block" value={length2} ref={length2Ref} + onFocus={(e) => (length2Ref.current.value = '')} onChange={(e) => onlyNumberInputChange(e, setLength2)} readOnly={true} placeholder="3000" diff --git a/src/components/floor-plan/modal/lineTypes/OuterLineWall.jsx b/src/components/floor-plan/modal/lineTypes/OuterLineWall.jsx index f469fba8..439e0748 100644 --- a/src/components/floor-plan/modal/lineTypes/OuterLineWall.jsx +++ b/src/components/floor-plan/modal/lineTypes/OuterLineWall.jsx @@ -18,6 +18,7 @@ export default function OuterLineWall({ props }) { className="input-origin block" value={length1} ref={length1Ref} + onFocus={(e) => (length1Ref.current.value = '')} onChange={(e) => onlyNumberInputChange(e, setLength1)} placeholder="3000" /> diff --git a/src/components/floor-plan/modal/lineTypes/RightAngle.jsx b/src/components/floor-plan/modal/lineTypes/RightAngle.jsx index 306a09f0..b217a867 100644 --- a/src/components/floor-plan/modal/lineTypes/RightAngle.jsx +++ b/src/components/floor-plan/modal/lineTypes/RightAngle.jsx @@ -15,6 +15,7 @@ export default function RightAngle({ props }) { className="input-origin block" value={length1} ref={length1Ref} + onFocus={(e) => (length1Ref.current.value = '')} onChange={(e) => onlyNumberInputChange(e, setLength1)} placeholder="3000" /> @@ -70,6 +71,7 @@ export default function RightAngle({ props }) { className="input-origin block" value={length2} ref={length2Ref} + onFocus={(e) => (length2Ref.current.value = '')} onChange={(e) => onlyNumberInputChange(e, setLength2)} placeholder="3000" /> diff --git a/src/components/floor-plan/modal/movement/MovementSetting.jsx b/src/components/floor-plan/modal/movement/MovementSetting.jsx index fabf813c..424a697e 100644 --- a/src/components/floor-plan/modal/movement/MovementSetting.jsx +++ b/src/components/floor-plan/modal/movement/MovementSetting.jsx @@ -4,15 +4,18 @@ import { useState } from 'react' import FlowLine from '@/components/floor-plan/modal/movement/type/FlowLine' import Updown from '@/components/floor-plan/modal/movement/type/Updown' import { usePopup } from '@/hooks/usePopup' +import { useMovementSetting } from '@/hooks/roofcover/useMovementSetting' export default function MovementSetting({ id, pos = { x: 50, y: 230 } }) { const { getMessage } = useMessage() - const { closePopup } = usePopup() - const [buttonAct, setButtonAct] = useState(1) - const buttonMenu = [ - { id: 1, name: getMessage('modal.movement.flow.line.move') }, - { id: 2, name: getMessage('modal.movement.flow.line.updown') }, - ] + const { TYPE, closePopup, buttonType, type, setType, FLOW_LINE_REF, UP_DOWN_REF, handleSave } = useMovementSetting(id) + + const flowLineProps = { + FLOW_LINE_REF, + } + const updownProps = { + UP_DOWN_REF, + } return ( @@ -25,19 +28,21 @@ export default function MovementSetting({ id, pos = { x: 50, y: 230 } }) {
- {buttonMenu.map((item) => ( - ))}
{getMessage('setting')}
- {buttonAct === 1 && } - {buttonAct === 2 && } + {type === TYPE.FLOW_LINE && } + {type === TYPE.UP_DOWN && }
- +
diff --git a/src/components/floor-plan/modal/movement/type/FlowLine.jsx b/src/components/floor-plan/modal/movement/type/FlowLine.jsx index d1bf8023..1d3dd26e 100644 --- a/src/components/floor-plan/modal/movement/type/FlowLine.jsx +++ b/src/components/floor-plan/modal/movement/type/FlowLine.jsx @@ -1,7 +1,24 @@ import { useMessage } from '@/hooks/useMessage' +import { useEffect, useState } from 'react' -export default function FlowLine({}) { +const FLOW_LINE_TYPE = { + DOWN_LEFT: 'downLeft', + UP_RIGHT: 'upRight', +} + +export default function FlowLine({ FLOW_LINE_REF }) { const { getMessage } = useMessage() + const [type, setType] = useState(FLOW_LINE_TYPE.DOWN_LEFT) + + useEffect(() => { + if (type === FLOW_LINE_TYPE.DOWN_LEFT) { + FLOW_LINE_REF.UP_RIGHT_INPUT_REF.current.value = '' + FLOW_LINE_REF.DOWN_LEFT_INPUT_REF.current.focus() + } else { + FLOW_LINE_REF.DOWN_LEFT_INPUT_REF.current.value = '' + FLOW_LINE_REF.UP_RIGHT_INPUT_REF.current.focus() + } + }, [type]) return ( <> @@ -11,14 +28,28 @@ export default function FlowLine({}) {
- + { + setType(FLOW_LINE_TYPE.DOWN_LEFT) + }} + />
- +
@@ -26,14 +57,27 @@ export default function FlowLine({}) {
- + { + setType(FLOW_LINE_TYPE.UP_RIGHT) + }} + />
- +
mm
diff --git a/src/components/floor-plan/modal/movement/type/Updown.jsx b/src/components/floor-plan/modal/movement/type/Updown.jsx index 2650ca4a..a27abf80 100644 --- a/src/components/floor-plan/modal/movement/type/Updown.jsx +++ b/src/components/floor-plan/modal/movement/type/Updown.jsx @@ -1,7 +1,24 @@ import { useMessage } from '@/hooks/useMessage' +import { useEffect, useState } from 'react' -export default function Updown({}) { +const UP_DOWN_TYPE = { + UP: 'up', + DOWN: 'down', +} + +export default function Updown({ UP_DOWN_REF }) { const { getMessage } = useMessage() + const [type, setType] = useState(UP_DOWN_TYPE.UP) + + useEffect(() => { + if (type === UP_DOWN_TYPE.UP) { + UP_DOWN_REF.DOWN_INPUT_REF.current.value = '' + UP_DOWN_REF.UP_INPUT_REF.current.focus() + } else { + UP_DOWN_REF.UP_INPUT_REF.current.value = '' + UP_DOWN_REF.DOWN_INPUT_REF.current.focus() + } + }, [type]) return ( <> @@ -11,14 +28,23 @@ export default function Updown({}) {
- + { + setType(UP_DOWN_TYPE.UP) + }} + />
- +
@@ -26,14 +52,22 @@ export default function Updown({}) {
- + { + setType(UP_DOWN_TYPE.DOWN) + }} + />
- +
mm
diff --git a/src/components/management/Stuff.jsx b/src/components/management/Stuff.jsx index 5a1bee40..999ea900 100644 --- a/src/components/management/Stuff.jsx +++ b/src/components/management/Stuff.jsx @@ -50,12 +50,11 @@ export default function Stuff() { } //물건번호 복사버튼 옆에 영역 - const onDoubleClick = (e) => { - let objectNo = e.target.innerText - if (objectNo.substring(0, 1) === 'R') { - router.push(`${pathname}/detail?objectNo=${objectNo.toString()}`, { scroll: false }) + const onDoubleClick = (data) => { + if (data.tempFlg === '0') { + router.push(`${pathname}/detail?objectNo=${data.objectNo.toString()}`, { scroll: false }) } else { - router.push(`${pathname}/tempdetail?objectNo=${objectNo.toString()}`, { scroll: false }) + router.push(`${pathname}/tempdetail?objectNo=${data.objectNo.toString()}`, { scroll: false }) } } @@ -85,20 +84,21 @@ export default function Stuff() { minWidth: 230, headerName: getMessage('stuff.gridHeader.objectNo'), cellRenderer: function (params) { - let objectNo = params.value.substring(0, 1) if (params.data.objectNo) { return ( -
- {params.value.toLocaleString()} - {objectNo === 'R' && ( - - )} +
onDoubleClick(params.data)}> + {(params.data.tempFlg === '0' && ( + <> + {params.value.toLocaleString()} + + + )) || <>{getMessage('stuff.gridData.tempObjectNo')}}
) } @@ -157,7 +157,7 @@ export default function Stuff() { } else { //T 면 임시 R은 진짜 if (event.data.objectNo) { - if (event.data.objectNo.substring(0, 1) === 'R') { + if (event.data.tempFlg === '0') { router.push(`${pathname}/detail?objectNo=${event.data.objectNo.toString()}`, { scroll: false }) } else { router.push(`${pathname}/tempdetail?objectNo=${event.data.objectNo.toString()}`, { scroll: false }) diff --git a/src/components/management/StuffDetail.jsx b/src/components/management/StuffDetail.jsx index 21dc5d17..6d3a83ee 100644 --- a/src/components/management/StuffDetail.jsx +++ b/src/components/management/StuffDetail.jsx @@ -22,12 +22,12 @@ import { floorPlanObjectState } from '@/store/floorPlanObjectAtom' export default function StuffDetail() { const setFloorPlanObjectNo = useSetRecoilState(floorPlanObjectState) //견적서 화면용 물건번호리코일 - const inputReceiveUserEl = useRef(null) //담당자ref - const inputObjectNameEl = useRef(null) //물건명ref - const inputZipNoEl = useRef(null) //우편번호ref - const inputAddressEl = useRef(null) //주소ref - const inputVerticalSnowCoverEl = useRef(null) //수직적설량ref - const inputInstallHeightEl = useRef(null) //설치높이ref + // const inputReceiveUserEl = useRef(null) //담당자ref + // const inputObjectNameEl = useRef(null) //물건명ref + // const inputZipNoEl = useRef(null) //우편번호ref + // const inputAddressEl = useRef(null) //주소ref + // const inputVerticalSnowCoverEl = useRef(null) //수직적설량ref + // const inputInstallHeightEl = useRef(null) //설치높이ref //공통코드 const { commonCode, findCommonCode } = useCommonCode() @@ -1128,9 +1128,10 @@ export default function StuffDetail() { // 수정모드일때는 PUT await promisePut({ url: apiUrl, data: params }).then((res) => { if (res.status === 201) { + setFloorPlanObjectNo({ floorPlanObjectNo: res.data.objectNo }) alert(getMessage('stuff.detail.save')) - setFloorPlanObjectNo({ floorPlanObjectNo: objectNo }) - router.refresh() + // router.refresh() + router.push(`/management/stuff/detail?objectNo=${res.data.objectNo.toString()}`) } }) } @@ -1173,16 +1174,15 @@ export default function StuffDetail() { params.saleStoreLevel = sessionState.storeLvl } //수직적설량, 설치높이 0인지 체크 - let snow = params.verticalSnowCover - let height = params.installHeight - - if (snow === '0') { - return alert(getMessage('stuff.detail.save.valierror1')) - } - if (height === '0') { - return alert(getMessage('stuff.detail.save.valierror2')) - } + // let snow = params.verticalSnowCover + // let height = params.installHeight + // if (snow === '0') { + // return alert(getMessage('stuff.detail.save.valierror1')) + // } + // if (height === '0') { + // return alert(getMessage('stuff.detail.save.valierror2')) + // } await promisePost({ url: '/api/object/save-object', data: params }).then((res) => { if (res.status === 201) { alert(getMessage('stuff.detail.tempSave.message1')) @@ -1268,7 +1268,7 @@ export default function StuffDetail() {
- +
@@ -1297,7 +1297,7 @@ export default function StuffDetail() { })} {/* 라디오끝 */}
- +
+
- +
@@ -1575,7 +1569,6 @@ export default function StuffDetail() { onKeyUp={handleKeyUp} value={form.watch('verticalSnowCover') || ''} {...register('verticalSnowCover')} - ref={inputVerticalSnowCoverEl} />
cm @@ -1623,7 +1616,6 @@ export default function StuffDetail() { onKeyUp={handleKeyUp} value={form.watch('installHeight') || ''} {...register('installHeight')} - ref={inputInstallHeightEl} />
m diff --git a/src/components/management/StuffSearchCondition.jsx b/src/components/management/StuffSearchCondition.jsx index 3e5b07f6..421f806f 100644 --- a/src/components/management/StuffSearchCondition.jsx +++ b/src/components/management/StuffSearchCondition.jsx @@ -144,6 +144,7 @@ export default function StuffSearchCondition() { }) const allList = res const favList = res.filter((row) => row.priority !== 'B') + setSchSelSaleStoreList(allList) setFavoriteStoreList(favList) setShowSaleStoreList(favList) @@ -263,6 +264,7 @@ export default function StuffSearchCondition() { onChange={(e) => { setSaleStoreName(saleStoreNameRef.current.value) }} + onKeyUp={handleByOnKeyUp} />
@@ -277,6 +279,7 @@ export default function StuffSearchCondition() { onChange={(e) => { setAddress(addressRef.current.value) }} + onKeyUp={handleByOnKeyUp} />
@@ -293,6 +296,7 @@ export default function StuffSearchCondition() { onChange={(e) => { setobjectName(objectNameRef.current.value) }} + onKeyUp={handleByOnKeyUp} />
@@ -307,6 +311,7 @@ export default function StuffSearchCondition() { onChange={(e) => { setDispCompanyName(dispCompanyNameRef.current.value) }} + onKeyUp={handleByOnKeyUp} />
@@ -363,6 +368,7 @@ export default function StuffSearchCondition() { onChange={(e) => { setReceiveUser(receiveUserRef.current.value) }} + onKeyUp={handleByOnKeyUp} /> diff --git a/src/hooks/roofcover/useMovementSetting.js b/src/hooks/roofcover/useMovementSetting.js new file mode 100644 index 00000000..355a6bf8 --- /dev/null +++ b/src/hooks/roofcover/useMovementSetting.js @@ -0,0 +1,48 @@ +import { useRecoilValue } from 'recoil' +import { canvasState } from '@/store/canvasAtom' +import { usePopup } from '@/hooks/usePopup' +import { useMessage } from '@/hooks/useMessage' +import { useRef, useState } from 'react' + +//동선이동 형 올림 내림 +export function useMovementSetting(id) { + const TYPE = { + FLOW_LINE: 'flowLine', // 동선이동 + UP_DOWN: 'updown', //형 올림내림 + } + const canvas = useRecoilValue(canvasState) + const { closePopup } = usePopup() + const { getMessage } = useMessage() + const buttonType = [ + { id: 1, name: getMessage('modal.movement.flow.line.move'), type: TYPE.FLOW_LINE }, + { id: 2, name: getMessage('modal.movement.flow.line.updown'), type: TYPE.UP_DOWN }, + ] + const [type, setType] = useState(TYPE.FLOW_LINE) + + const FLOW_LINE_REF = { + DOWN_LEFT_INPUT_REF: useRef(null), + UP_RIGHT_INPUT_REF: useRef(null), + DOWN_LEFT_RADIO_REF: useRef(null), + UP_RIGHT_RADIO_REF: useRef(null), + } + + const UP_DOWN_REF = { + UP_INPUT_REF: useRef(null), + DOWN_INPUT_REF: useRef(null), + UP_RADIO_REF: useRef(null), + DOWN_RADIO_REF: useRef(null), + } + + const handleSave = () => {} + + return { + TYPE, + closePopup, + buttonType, + type, + setType, + FLOW_LINE_REF, + UP_DOWN_REF, + handleSave, + } +} diff --git a/src/hooks/roofcover/useOuterLineWall.js b/src/hooks/roofcover/useOuterLineWall.js index 531aab48..b2244da8 100644 --- a/src/hooks/roofcover/useOuterLineWall.js +++ b/src/hooks/roofcover/useOuterLineWall.js @@ -115,6 +115,12 @@ export function useOuterLineWall(id, propertiesId) { setAngle2(0) setOuterLineDiagonalLength(0) + + const activeElem = document.activeElement + + if (activeElem) { + activeElem.blur() + } } const mouseDown = (e) => { diff --git a/src/locales/ja.json b/src/locales/ja.json index 15d927d1..019aaed4 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -519,6 +519,7 @@ "stuff.gridHeader.receiveUser": "担当者", "stuff.gridHeader.specificationConfirmDate": "仕様確認日", "stuff.gridHeader.createDatetime": "登録日", + "stuff.gridData.tempObjectNo": "一時保存物", "stuff.message.periodError": "最大1年間閲覧可能.", "stuff.addressPopup.title": "郵便番号", "stuff.addressPopup.placeholder": "郵便番号の7桁を入力してください。", @@ -735,14 +736,25 @@ "estimate.detail.receiveUser": "担当者 ", "estimate.detail.title": "案件名", "estimate.detail.remarks": "メモ", + "estimate.detail.orderType": "注文分類", + "estimate.detail.roofCns": "屋根材・仕様施工", + "estimate.detail.note": "備考", + "estimate.detail.nextSubmit": "後日資料提出", "estimate.detail.header.fileList1": "ファイル添付", "estimate.detail.fileList.btn": "ファイル選択", "estimate.detail.header.fileList2": "添付ファイル一覧", "estimate.detail.header.specialEstimate": "見積もりの具体的な", "estimate.detail.header.specialEstimateProductInfo": "製品情報", + "estimate.detail.sepcialEstimateProductInfo.totPcs": "数量 (PCS)", + "estimate.detail.sepcialEstimateProductInfo.vol": "容量 (Kw)", + "estimate.detail.sepcialEstimateProductInfo.netAmt": "供給価格", + "estimate.detail.sepcialEstimateProductInfo.vat": "付加価値税 (10%)", + "estimate.detail.sepcialEstimateProductInfo.totPrice": "総額", "estimate.detail.sepcialEstimateProductInfo.pkgUnitPrice": "住宅PKG単価 (W)", "estimate.detail.sepcialEstimateProductInfo.pkgWeight": "PKG容量 (Kw)", "estimate.detail.sepcialEstimateProductInfo.pkgPrice": "PKG金額", + "estimate.detail.sepcialEstimateProductInfo.calcFormula1": "(モジュール容量 × 数量)÷1000", + "estimate.detail.sepcialEstimateProductInfo.calcFormula2": "PKG単価 (W)×PKG容量(W)", "estimate.detail.header.showPrice": "価格表示", "estimate.detail.showPrice.btn1": "Pricing", "estimate.detail.showPrice.description": "クリックして製品の特異性を確認する", diff --git a/src/locales/ko.json b/src/locales/ko.json index 5fd49921..128d51e1 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -524,6 +524,7 @@ "stuff.gridHeader.receiveUser": "담당자", "stuff.gridHeader.specificationConfirmDate": "사양확인일", "stuff.gridHeader.createDatetime": "등록일", + "stuff.gridData.tempObjectNo": "임시저장물건", "stuff.message.periodError": "최대1년 조회 가능합니다.", "stuff.addressPopup.title": "우편번호", "stuff.addressPopup.placeholder": "우편번호의 7자리를 입력하세요.", @@ -740,14 +741,25 @@ "estimate.detail.receiveUser": "담당자", "estimate.detail.title": "안건명", "estimate.detail.remarks": "메모", + "estimate.detail.orderType": "주문분류", + "estimate.detail.roofCns": "지붕재・사양시공", + "estimate.detail.note": "비고", + "estimate.detail.nextSubmit": "후일자료제출", "estimate.detail.header.fileList1": "파일첨부", "estimate.detail.fileList.btn": "파일선택", "estimate.detail.header.fileList2": "첨부파일 목록", "estimate.detail.header.specialEstimate": "견적특이사항", "estimate.detail.header.specialEstimateProductInfo": "제품정보", + "estimate.detail.sepcialEstimateProductInfo.totPcs": "수량 (PCS)", + "estimate.detail.sepcialEstimateProductInfo.vol": "용량 (Kw)", + "estimate.detail.sepcialEstimateProductInfo.netAmt": "공급가액", + "estimate.detail.sepcialEstimateProductInfo.vat": "부가세 (10%)", + "estimate.detail.sepcialEstimateProductInfo.totPrice": "총액", "estimate.detail.sepcialEstimateProductInfo.pkgUnitPrice": "주택PKG단가 (W)", "estimate.detail.sepcialEstimateProductInfo.pkgWeight": "PKG 용량 (Kw)", "estimate.detail.sepcialEstimateProductInfo.pkgPrice": "PKG 금액", + "estimate.detail.sepcialEstimateProductInfo.calcFormula1": "(모듈수량 * 수량)÷100", + "estimate.detail.sepcialEstimateProductInfo.calcFormula2": "PKG단가(W) * PKG용량(W)", "estimate.detail.header.showPrice": "가격표시", "estimate.detail.showPrice.btn1": "Pricing", "estimate.detail.showPrice.description": "클릭하여 제품 특이사항 확인",