견적서

This commit is contained in:
basssy 2024-11-18 08:43:55 +09:00
parent f1bede7bd3
commit 7ffe95b73e
2 changed files with 143 additions and 55 deletions

View File

@ -20,6 +20,7 @@ import ProductFeaturesPop from './popup/ProductFeaturesPop'
import { v4 as uuidv4 } from 'uuid'
export default function Estimate({ params }) {
const fixedKey = 'itemKey'
const [itemChangeYn, setItemChangeYn] = useState(false)
const { session } = useContext(SessionContext)
const [objectNo, setObjectNo] = useState('') //
@ -304,8 +305,70 @@ export default function Estimate({ params }) {
setSelection(newSelection)
}
//
const onChangeAmount = (value, dispOrder, index) => {
//itemChangeFlg = 1, partAdd = 0
let amount = value
amount = Number(value.replaceAll(',', ''))
if (isNaN(amount)) {
amount = 0
} else {
amount = amount.toLocaleString()
}
let updateList = []
let updates = {}
updates.amount = amount
updates.itemChangeFlg = '1'
updates.partAdd = '0'
updates.saleTotPrice = (Number(value.replaceAll(',', '')) * state.itemList[index].salePrice).toLocaleString()
updateList = state.itemList.map((item) => {
if (item.dispOrder === dispOrder) {
return { ...item, ...updates }
} else {
return item
}
})
setState({
itemList: updateList,
})
setItemChangeYn(true)
}
//
const onChangeSalePrice = (value, dispOrder, index) => {
//itemChangeFlg, partAdd
let salePrice
salePrice = Number(value.replaceAll(',', ''))
if (isNaN(salePrice)) {
salePrice = 0
} else {
salePrice = salePrice.toLocaleString()
}
let updateList = []
let updates = {}
updates.salePrice = salePrice
updates.saleTotPrice = (Number(value.replaceAll(',', '')) * state.itemList[index].amount).toLocaleString()
updateList = state.itemList.map((item) => {
if (item.dispOrder === dispOrder) {
return { ...item, ...updates }
} else {
return item
}
})
setState({
itemList: updateList,
})
setItemChangeYn(true)
}
//
const onChangeDisplayItem = (itemId, dispOrder) => {
const onChangeDisplayItem = (itemId, dispOrder, index) => {
const param = {
itemId: itemId,
}
@ -333,17 +396,37 @@ export default function Estimate({ params }) {
updates.specialNoteCd = res.spnAttrCds
updates.itemGroup = res.itemGroup
updates.delFlg = '0' // 0
updates.saleTotPrice = res.salePrice * state.itemList[index].amount
//104671
let bomList = res.itemBomList
updateList = state.itemList.map((item) => {
if (item.dispOrder === dispOrder) {
return { ...item, ...updates }
} else if (item.paDispOrder === dispOrder) {
return { ...item, delFlg: '1' }
} else {
return item
}
})
setState({
itemList: updateList,
})
//paDispOrder
if (bomList) {
bomList.map((bomItem, index) => {
let newItemDispOrder = Math.max(...state.itemList.map((item) => item.dispOrder))
bomItem.dispOrder = index + 1 + newItemDispOrder
bomItem.delFlg = '0'
bomItem.objectNo = objectNo
bomItem.planNo = planNo
})
setState({
itemList: [...updateList, ...bomList],
})
} else {
setState({
itemList: updateList,
})
}
setItemChangeYn(true)
})
@ -358,6 +441,9 @@ export default function Estimate({ params }) {
if (row2 === row.dispOrder) {
delList.push({ ...row })
}
if (row2 === row.paDispOrder) {
delList.push({ ...row })
}
})
})
@ -390,14 +476,16 @@ export default function Estimate({ params }) {
useEffect(() => {
if (itemChangeYn) {
// console.log(' ', itemChangeYn)
console.log('아이템상태가져오기::::::::::', state.itemList)
}
console.log('아이템 상태 가져오기::::::::::', state.itemList)
// console.log(' ::::::', itemList)
//delFlg 0 ..
setItemChangeYn(false)
// false ..
setItemChangeYn(false)
// settingToalInfo(state.itemList)
}
}, [itemChangeYn])
// const settingToalInfo = (itemList) => {}
return (
<div className="sub-content estimate">
<div className="sub-content-inner">
@ -588,10 +676,10 @@ export default function Estimate({ params }) {
<>
<div className={`form-flex-wrap ${style}`} key={uuidv4()}>
<div className="input-wrap mr5" style={{ width: '610px' }} key={`roof${index}`}>
<input type="text" className="input-light" defaultValue={roofList} readOnly />
<input type="text" className="input-light" value={roofList} readOnly />
</div>
<div className="input-wrap" style={{ width: '200px' }}>
<input type="text" className="input-light" defaultValue={constructSpecificationMulti[index]} readOnly />
<input type="text" className="input-light" value={constructSpecificationMulti[index]} readOnly />
</div>
</div>
</>
@ -880,7 +968,7 @@ export default function Estimate({ params }) {
type="button"
onClick={() => {
addItem()
setItemChangeYn(true)
// setItemChangeYn(true)
}}
>
<span className="plus"></span>
@ -926,16 +1014,17 @@ export default function Estimate({ params }) {
</thead>
<tbody>
{state?.itemList.length > 0 &&
state.itemList.map((item) => {
state.itemList.map((item, index) => {
if (item.delFlg === '0') {
return (
<>
<tr key={uuidv4()}>
<tr key={fixedKey}>
<td className="al-c">
<div className="d-check-box light no-text">
<input
type="checkbox"
id={item?.dispOrder}
disabled={item?.paDispOrder ? true : false}
onChange={() => onChangeSelect(item.dispOrder)}
checked={selection.has(item.dispOrder) ? true : false}
/>
@ -955,13 +1044,13 @@ export default function Estimate({ params }) {
options={displayItemList}
onChange={(e) => {
if (isObjectNotEmpty(e)) {
onChangeDisplayItem(e.itemId, item.dispOrder)
onChangeDisplayItem(e.itemId, item.dispOrder, index)
}
}}
getOptionLabel={(x) => x.itemName}
getOptionValue={(x) => x.itemId}
isClearable={true}
isDisabled={false}
isClearable={false}
isDisabled={item?.paDispOrder ? true : false}
value={displayItemList.filter(function (option) {
return option.itemId === item.itemId
})}
@ -997,11 +1086,10 @@ export default function Estimate({ params }) {
<input
type="text"
className="input-light al-r"
defaultValue={convertNumberToPriceDecimal(item?.amount)}
value={item?.amount}
disabled={item.itemId === '' ? true : item?.paDispOrder ? true : false}
onChange={(e) => {
//onChangeDisplayItem
//itemChangeFlg = 1, partAdd = 0
console.log('수량변경::::::::', e.target.value)
onChangeAmount(e.target.value, item.dispOrder, index)
}}
/>
</div>
@ -1013,12 +1101,22 @@ export default function Estimate({ params }) {
<input
type="text"
className="input-light al-r"
value={convertNumberToPriceDecimal(item?.salePrice)}
disabled={state?.estimateType === 'YJSS' ? (item.pkgMaterialFlg === '1' ? false : true) : false}
value={item?.salePrice}
disabled={
state?.estimateType === 'YJSS'
? item?.paDispOrder
? true
: item.pkgMaterialFlg === '1'
? false
: true
: item.itemdId === ''
? true
: item?.paDispOrder
? true
: false
}
onChange={(e) => {
//onChangeDisplayItem
//itemChangeFlg, partAdd
console.log('단가변경:::::::', e.target.value)
onChangeSalePrice(e.target.value, item.dispOrder, index)
}}
/>
</div>
@ -1027,7 +1125,7 @@ export default function Estimate({ params }) {
</div> */}
</div>
</td>
<td className="al-r">{convertNumberToPriceDecimal(item?.saleTotPrice)}</td>
<td className="al-r">{item?.saleTotPrice}</td>
</tr>
</>
)

View File

@ -82,7 +82,9 @@ export const useEstimateController = (planNo) => {
}
const addItem = () => {
const newItemDispOrder = Math.max(...state.itemList.map((item) => item.dispOrder)) + 1
// const newItemDispOrder = (Math.max(...state.itemList.map((item) => item.dispOrder)) / 100 + 1) * 100
let newItemDispOrder = Math.max(...state.itemList.map((item) => item.dispOrder))
newItemDispOrder = (Math.floor(newItemDispOrder / 100) + 1) * 100
setState({
itemList: [
...state.itemList,
@ -96,8 +98,8 @@ export const useEstimateController = (planNo) => {
amount: '', //수량
unitPrice: '0',
unit: '', //단위
salePrice: '0', //단가
saleTotPrice: '0', //금액(부가세별도)
salePrice: '', //단가
saleTotPrice: '', //금액(부가세별도)
itemChangeFlg: '1', //추가시 체인지플래그 1로
partAdd: '1', //NEW 체인지 플래그
delFlg: '0', //삭제 플래그 0 삭제하면 1
@ -143,18 +145,18 @@ export const useEstimateController = (planNo) => {
// console.log('첨부파일:::::', estimateData.fileList)
//첨부파일을 첨부안했는데
//아이템 fileUploadFlg가1(첨부파일 필수)이 1개라도 있는데 후일 자료 제출(fileFlg) 체크안했으면(0) alert 저장안돼
// if (estimateData.fileList.length < 1) {
// if (estimateData.itemList.length > 1) {
// estimateData.itemList.map((row) => {
// if (row.fileUploadFlg === '1') {
// if (estimateData.fileFlg === '0') {
// alert(getMessage('estimate.detail.save.requiredMsg'))
// flag = false
// }
// }
// })
// }
// }
if (estimateData.fileList.length < 1) {
if (estimateData.itemList.length > 1) {
estimateData.itemList.map((row) => {
if (row.fileUploadFlg === '1') {
if (estimateData.fileFlg === '0') {
alert(getMessage('estimate.detail.save.requiredMsg'))
flag = false
}
}
})
}
}
if (flag) {
//1. 첨부파일 저장시작
@ -184,24 +186,12 @@ export const useEstimateController = (planNo) => {
console.log('최종 정보::;', estimateData)
console.log('최종 남은 아이템정보:::', estimateData.itemList)
//2. 상세데이터 저장
return
// return
await promisePost({ url: `${ESTIMATE_API_ENDPOINT}/save-estimate`, data: estimateData }).then((res) => {
if (res) {
alert(getMessage('estimate.detail.save.alertMsg'))
}
})
// try {
// const result = await promisePost({
// url: ESTIMATE_API_ENDPOINT,
// data: estimateData,
// })
// alert(getMessage('estimate.detail.save.alertMsg'))
// return result
// } catch (error) {
// console.error('Failed to submit estimate:', error)
// throw error
// }
}
}