ocbo-esign/src/pages/AssessorPage/Assessor.tsx

445 lines
16 KiB
TypeScript

import './Assessor.sass'
import { Logo, Page, Row, Padding, ModalButton, Button, Clickable, Link, Modal, Column, Box } from '../../components'
import { FiLogOut } from 'solid-icons/fi'
import { Tabs } from '@kobalte/core/tabs'
import { ofetch } from 'ofetch'
import { onMount, createSignal, Show } from 'solid-js'
import dayjs from 'dayjs'
import { checkConnection, createPdf } from '../../utils/functions'
import { FaSolidThumbsUp } from 'solid-icons/fa'
import { _employeeName, _employeeId } from '../../stores/employee'
import { useNavigate } from '@solidjs/router'
const API = import.meta.env.VITE_BACKEND
const PESO = import.meta.env.VITE_PESO
export default () => {
const navigate = useNavigate()
const [totalOp, setTotalOp] = createSignal(0)
const [assessor, setAssessor] = createSignal('')
const [dateOp, setDateOp] = createSignal('')
const [location, setLocation] = createSignal('')
const [type, setType] = createSignal('')
const [applicationId, setApplicationId] = createSignal(0)
// const [assessorId, setAssessorId] = createSignal(0)
// const [gflgu, setGflgu] = createSignal<number[]>([])
// const [gfdpwh, setGfdpwh] = createSignal<number[]>([])
// const [tfbo, setTfbo] = createSignal<number[]>([])
// const [descriptionList, setDescriptionList] = createSignal<string[]>([])
// const [amountList, setAmountList] = createSignal<string[]>([])
// const [dateOpList, setDateOpList] = createSignal<string[]>([])
const [applicationList, setApplicationList] = createSignal<string[]>([])
const [nameList, setNameList] = createSignal<string[]>([])
const [errorMessage, setErrorMessage] = createSignal('')
const [connected, setConnected] = createSignal(true)
const [printed, setPrinted] = createSignal(false)
const [printedApplication, setPrintedApplication] = createSignal('')
const [isBuilding, setIsBuilding] = createSignal(false)
const [isOccupancy, setIsOccupancy] = createSignal(false)
const [isElectrical, setIsElectrical] = createSignal(false)
const [employeeId, setEmployeeId] = createSignal(0)
const [employeeName, setEmployeeName] = createSignal('')
const checkAccess = async (access: string) => {
try {
const response = await ofetch(`${API}check-access/${access}/${employeeId()}`)
const result = response.result
if (result > 0) return true
else return false
} catch {
return false
}
}
// const calculateAmounts = () => {
// const amounts: string[] = amountList()
// let gflguList: number[] = []
// let gfdpwhList: number[] = []
// let tfboList: number[] = []
// for (let i = 0; i < amounts.length; i++) {
// const gflgu = parseFloat(amounts[i]) * 0.8
// const gfdpwh = parseFloat(amounts[i]) * 0.05
// const tfbo = parseFloat(amounts[i]) * 0.15
// const roundedGflgu = parseFloat(gflgu.toFixed(2))
// const roundedGfdpwh = parseFloat(gfdpwh.toFixed(2))
// const roundedTfbo = parseFloat(tfbo.toFixed(2))
// gflguList.push(roundedGflgu)
// gfdpwhList.push(roundedGfdpwh)
// tfboList.push(roundedTfbo)
// }
// setGflgu(gflguList)
// setGfdpwh(gfdpwhList)
// setTfbo(tfboList)
// }
const closeNotification = async () => {
setPrinted(false)
await checkDivision()
await getListForPrinting()
}
const checkDivision = async () => {
console.log('AAAA')
const building = await checkAccess('BUILDING ORDER OF PAYMENT')
setIsBuilding(building)
const occupancy = await checkAccess('OCCUPANCY ORDER OF PAYMENT')
setIsOccupancy(occupancy)
const electrical = await checkAccess('ELECTRICAL ASSESSMENT')
setIsElectrical(electrical)
}
const getopdetails = async (applicationNo: string) => {
const op = await ofetch(API + 'get-opdetails-electrical/' + applicationNo, { parseResponse: JSON.parse })
setAssessor(op.result7[0])
setLocation(op.result5[0])
setType(op.result6[0])
setDateOp(dayjs(op.result10[0]).format('MMMM DD, YYYY'))
setApplicationId(op.result11[0])
// setAssessorId(op.result12[0])
setTotalOp(calculateTotal(op.result9))
// setDescriptionList(op.result8)
// setAmountList(op.result9)
// setDateOpList(op.result10)
// calculateAmounts()
}
const calculateTotal = (list: number[]) => {
const total = list.map((item) => parseFloat(item.toString())).reduce((acc, curr) => acc + curr, 0)
return total
}
const getListForPrinting = async () => {
console.log('BBB')
try {
const response = await ofetch(API + 'get-listopprinting-electrical', { parseResponse: JSON.parse })
setApplicationList(response.result)
setNameList(response.result2)
} catch (error) {
console.error(error)
}
}
const removeEmployee = () => {
sessionStorage.removeItem('id')
sessionStorage.removeItem('name')
}
const checkLogged = async () => {
const idStore = sessionStorage.getItem('id')
const nameStore = sessionStorage.getItem('name')
setEmployeeId(parseInt(idStore!))
setEmployeeName(nameStore!)
if (employeeId() === 0 || employeeId().toString() === 'NaN') {
removeEmployee()
navigate('/', { replace: true })
return false
}
return true
}
const printHandler = async (application: string) => {
let signed: boolean = false
let forprinting: boolean = false
let updateOrderofpayment: boolean = false
setConnected(await checkConnection())
if (connected() === false) {
setErrorMessage('No Connection on Server')
return
}
signed = await setNewStatus('ELECTRICAL ORDER OF PAYMENT PRINTED', '171', 'ELECOPPRINTED')
if (!signed) return
forprinting = await setNewStatus('FOR ELECTRICAL OFFICIAL RECEIPT VALIDATION', '98', 'ELECORVALIDATE')
if (!forprinting) return
updateOrderofpayment = await updateOp()
if (updateOrderofpayment) {
setPrintedApplication(application)
setPrinted(true)
}
}
const updateOp = async () => {
try {
await ofetch(API + 'update-opprinted-electrical', {
method: 'POST',
body: { data: parseInt(applicationId().toString()) },
})
return true
} catch {
return false
}
}
const setNewStatus = async (status: string, tag: string, tagword: string) => {
const today = new Date()
const formattedDate = dayjs(today).format('YYYY-MM-DD HH:mm:ss')
const statusid = parseInt(applicationId().toString())
try {
await ofetch(API + 'post-newstatus-electrical', {
method: 'POST',
body: { data: statusid, data2: formattedDate, data3: status, data4: tag, data5: tagword, data6: parseInt(employeeId().toString()) },
})
return true
} catch {
return false
}
}
const logout = async () => {
removeEmployee()
navigate('/')
}
onMount(async () => {
const logged = await checkLogged()
if (logged) {
await checkDivision()
await getListForPrinting()
}
})
return (
<>
<Page alignment="column">
<Padding left={4.75} right={4.75} top={0} bottom={0}>
<Row content="split">
<Link to="/">
<Row content="left" gap={2}>
<Logo size={200} />
<h1>OCBO e-Sign</h1>
</Row>
</Link>
<Row content="left" gap={1}>
<Box curved thickness={0} padding="1.25rem 2.25rem" background="#0f131d56">
<span class="name">{employeeName()}</span>
</Box>
<Clickable onClick={logout}>
<Row gap={0.5}>
<FiLogOut size={25} />
<span>Logout</span>
</Row>
</Clickable>
</Row>
</Row>
<Row content="center">
<Tabs aria-label="Main navigation" class="tabs">
<Row>
<Tabs.List class="tabs__list">
<Show when={isBuilding()}>
<Tabs.Trigger class="tabs__trigger" value="building">
Building
</Tabs.Trigger>
</Show>
<Show when={isOccupancy()}>
<Tabs.Trigger class="tabs__trigger" value="occupancy">
Occupancy
</Tabs.Trigger>
</Show>
<Show when={isElectrical()}>
<Tabs.Trigger class="tabs__trigger" value="electrical">
Electrical
</Tabs.Trigger>
</Show>
<Tabs.Indicator class="tabs__indicator" />
</Tabs.List>
</Row>
<Tabs.Content class="tabs__content" value="building">
<Row>
{/* <h2>List of Ready to Approve and Sign Building Order of Payments</h2> */}
<Box curved thickness={0} background="#602a2abf" padding="1rem 2rem">
<h2>Under Development</h2>
</Box>
</Row>
<Row>
<table class="table">
<thead>
{/* <tr>
<th>Application Number</th>
<th>Name</th>
<th style="text-align: center">Show Details</th>
</tr> */}
</thead>
<tbody></tbody>
</table>
</Row>
</Tabs.Content>
<Tabs.Content class="tabs__content" value="occupancy">
<Row>
{/* <h2>List of Ready to Approve and Sign Occupancy Order of Payments</h2> */}
<Box curved thickness={0} background="#602a2abf" padding="1rem 2rem">
<h2>Under Development</h2>
</Box>
</Row>
<Row>
<table class="table">
<thead>
{/* <tr>
<th>Application Number</th>
<th>Name</th>
<th style="text-align: center">Show Details</th>
</tr> */}
</thead>
<tbody></tbody>
</table>
</Row>
</Tabs.Content>
<Tabs.Content class="tabs__content" value="electrical">
<Row>
<Clickable onClick={() => createPdf()}>
<h2>List of Ready to Print in Electrical Order of Payments</h2>
</Clickable>
</Row>
<Row>
<table class="table">
<thead>
<tr>
<th>Application Number</th>
<th>Name</th>
<th style="text-align: center">Show Details</th>
</tr>
</thead>
<tbody>
{applicationList().map((item, index) => (
<tr>
<td>{item}</td>
<td>{nameList()[index]}</td>
<td>
<ModalButton
class="modal"
label="Show Details"
design="bo-link"
background="#121e2acc"
color="#ffffffec"
function={async () => {
await getopdetails(item)
}}
>
<Padding top={0} left={2} right={2} bottom={0}>
<span class="modal__application-number">{item}</span>
<Padding top={1} left={0} right={0} bottom={0}>
<section class="modal__row">
<span class="modal__row__label">Name of Applicant:</span>
<span class="modal__row__detail">{nameList()[index]}</span>
</section>
<section class="modal__row">
<span class="modal__row__label">Location:</span>
<span class="modal__row__detail">{location()}</span>
</section>
<section class="modal__row">
<span class="modal__row__label">Type:</span>
<span class="modal__row__detail">{type().toUpperCase()}</span>
</section>
<section class="modal__row">
<span class="modal__row__label">Assessed By:</span>
<span class="modal__row__detail">{assessor()}</span>
</section>
<section class="modal__row">
<span class="modal__row__label">Date Assessed:</span>
<span class="modal__row__detail">{dateOp().toUpperCase()}</span>
</section>
<section class="modal__row">
<span class="modal__row__label">Total Fee:</span>
<span class="modal__row__detail__price">
{PESO} {totalOp().toFixed(2)}
</span>
</section>
</Padding>
<Row padding="2rem 0 0 0">
<Button wide label="Print" edges="curved" design="bo-primary" onClick={() => printHandler(item)}></Button>
<span class="modal__cancel">Click anywhere to cancel</span>
</Row>
</Padding>
</ModalButton>
</td>
</tr>
))}
</tbody>
</table>
</Row>
</Tabs.Content>
</Tabs>
</Row>
</Padding>
</Page>
<div onClick={closeNotification}>
<Modal trigger={printed()} background="#123220ff" color="#cdfbe1f0" opacity={0.8}>
<Padding top={1} bottom={1} left={2} right={2}>
<Column>
<Row gap={4}>
<FaSolidThumbsUp size={75} />
<Box curved thickness={3} color="#cdfbe1f0" padding="1rem">
<span class="approval">Printed</span>
</Box>
</Row>
<Row padding="2rem 0 0 0">
<h2>{printedApplication()}</h2>
</Row>
<Row>
<span class="close-text">Click anywhere to proceed</span>
</Row>
</Column>
</Padding>
</Modal>
</div>
<div onClick={() => setConnected(true)}>
<Modal trigger={connected() === false} background="#562020ff" color="#ffebebe6" opacity={0.8}>
<Padding top={1} bottom={1} left={4} right={4}>
<Column>
<Row>
<Box curved thickness={3} color="#ffebebe6" padding="1rem">
<h2>Connection Error</h2>
</Box>
</Row>
<Row>
<h3>{errorMessage()}</h3>
</Row>
<Row>
<span class="close-text">Click anywhere to close</span>
</Row>
</Column>
</Padding>
</Modal>
</div>
</>
)
}