diff --git a/backend/main.go b/backend/main.go index ce29a3a..0963b78 100644 --- a/backend/main.go +++ b/backend/main.go @@ -1453,6 +1453,19 @@ func connect() { "result": result, }) + case "check-statuspops-local": + var resultInt, resultCount int + err := dbpop.QueryRow(`SELECT COUNT(OrderPayId) AS resultInt, COUNT(AFNum) AS resultCount FROM orderpaydetail WHERE oprefid = ?`, data).Scan(&resultInt, &resultCount) + if err != nil { + c.AbortWithError(http.StatusBadRequest, err) + c.String(http.StatusBadRequest, err.Error()) + return + } + c.JSON(http.StatusOK, gin.H{ + "result": resultInt, + "result2": resultCount, + }) + } }) @@ -2322,6 +2335,50 @@ func connect() { } }) + // router.POST("/api/return-approval-electrical", middleware.TokenChecker(), func(c *gin.Context) { + // type returnApprovalData struct { + // Data string `json:"data"` //electricalNo + // } + // var returnapprovalData returnApprovalData + // if err := c.ShouldBindJSON(&returnapprovalData); err != nil { + // c.String(http.StatusBadRequest, "Invalid request body") + // return + // } + + // c.Writer.Header().Set("X-XSS-Protection", "1; mode=block") + // c.Writer.Header().Set("X-Content-Type-Options", "nosniff") + // c.Writer.Header().Set("X-DNS-Prefetch-Control", "off") + // c.Writer.Header().Set("X-Frame-Options", "DENY") + // c.Writer.Header().Set("X-Download-Options", "noopen") + // c.Writer.Header().Set("Referrer-Policy", "no-referrer") + // c.Writer.Header().Set("Content-Security-Policy", "default-src 'self'; img-src 'self';") + // c.Writer.Header().Set("X-Server", "OCBO Server") + + // dbpost, err := db.Prepare("INSERT INTO esign_lock (esign_lockid, referenceNo, lock_code) VALUES (NULL, ?, ?)") + // if err != nil { + // c.AbortWithError(http.StatusInternalServerError, err) + // c.String(http.StatusInternalServerError, "Internal Server Error") + // return + // } + // defer dbpost.Close() + + // exec, err := dbpost.Exec(returnapprovalData.Data) + // if err != nil { + // panic(err.Error()) + // } + + // affect, err := exec.RowsAffected() + // if err != nil { + // panic(err.Error()) + // } + + // if affect > 0 { + // c.String(http.StatusOK, "Success on Saving Lock Data") + // } else { + // c.String(http.StatusInternalServerError, "Failed on Saving Lock Data") + // } + // }) + router.DELETE("/api/delete-orderofpayment-electrical", middleware.TokenChecker(), func(c *gin.Context) { type DeleteOP struct { Data int `json:"data"` @@ -2455,8 +2512,8 @@ func connect() { c.Writer.Header().Set("Content-Security-Policy", "default-src 'self'; img-src 'self';") c.Writer.Header().Set("X-Server", "OCBO Server") - var resultCount int - checkErr := dbpop.QueryRow("SELECT COUNT(AFNum) AS resultCount FROM orderpaydetail WHERE OPRefId = ?", deleteOpLocal.Data).Scan(&resultCount) + var resultId, resultCount int + checkErr := dbpop.QueryRow("SELECT COUNT(OrderPayId) AS resultId, COUNT(AFNum) AS resultCount FROM orderpaydetail WHERE OPRefId = ?", deleteOpLocal.Data).Scan(&resultId, &resultCount) if checkErr != nil { c.AbortWithError(http.StatusInternalServerError, checkErr) c.String(http.StatusInternalServerError, "Internal Server Error") @@ -2464,33 +2521,36 @@ func connect() { } if resultCount > 0 { - c.String(http.StatusBadRequest, "Error! Payment already exist.") + c.String(http.StatusForbidden, "Error! Payment already exist.") return } - dbpost, err := dbpop.Prepare("DELETE FROM orderpaydetail WHERE OPRefId = ?") - if err != nil { - c.AbortWithError(http.StatusInternalServerError, err) - c.String(http.StatusInternalServerError, "Internal Server Error") - return - } - defer dbpost.Close() + if resultId > 0 { + dbpost, err := dbpop.Prepare("DELETE FROM orderpaydetail WHERE OPRefId = ?") + if err != nil { + c.AbortWithError(http.StatusInternalServerError, err) + c.String(http.StatusInternalServerError, "Internal Server Error") + return + } + defer dbpost.Close() - exec, err := dbpost.Exec(deleteOpLocal.Data) - if err != nil { - panic(err.Error()) + exec, err := dbpost.Exec(deleteOpLocal.Data) + if err != nil { + panic(err.Error()) + } + + affect, err := exec.RowsAffected() + if err != nil { + panic(err.Error()) + } + + if affect > 0 { + c.String(http.StatusOK, "Success on Deleting POPS Local") + } else { + c.String(http.StatusInternalServerError, "Failed on Deleting POPS Local") + } } - affect, err := exec.RowsAffected() - if err != nil { - panic(err.Error()) - } - - if affect > 0 { - c.String(http.StatusOK, "Success on Deleting POPS Local") - } else { - c.String(http.StatusInternalServerError, "Failed on Deleting POPS Local") - } }) router.DELETE("/api/delete-esigntransactions", func(c *gin.Context) { diff --git a/src/pages/AssessorPage/Assessor.sass b/src/pages/AssessorPage/Assessor.sass index 894a243..06478a6 100644 --- a/src/pages/AssessorPage/Assessor.sass +++ b/src/pages/AssessorPage/Assessor.sass @@ -79,4 +79,4 @@ opacity: 0.6 &__button - padding: 1rem 0 0 0 + padding: 1rem 0 0 0 \ No newline at end of file diff --git a/src/pages/AssessorPage/Assessor.tsx b/src/pages/AssessorPage/Assessor.tsx index 193cd6f..a2f685a 100644 --- a/src/pages/AssessorPage/Assessor.tsx +++ b/src/pages/AssessorPage/Assessor.tsx @@ -33,6 +33,7 @@ import { _units, } from '../../stores/pdfinfo.ts' import { checkConnection, createPdfElectrical, createPdfOccupancy, getApi, getApiMulti, getDateTime, postApi, saveNewName, saveNewPassword, securePassword, statusPopsApi, voidPopsApi } from '../../utils/functions/index.ts' +import { AiOutlineLoading3Quarters } from 'solid-icons/ai' import './Assessor.sass' const PESO = import.meta.env.VITE_PESO @@ -82,6 +83,7 @@ export default () => { const [selectedType, setSelectedType] = createSignal('Print') const [voidError, setVoidError] = createSignal(false) + const [isLoading, setIsLoading] = createSignal(false) let bldgadditional = false @@ -246,6 +248,8 @@ export default () => { } const getListForPrinting = async (division: string) => { + setIsLoading(true) + try { let response: any @@ -283,6 +287,8 @@ export default () => { } catch (error) { console.error(error) } + + setIsLoading(false) } const removeEmployee = () => { @@ -506,6 +512,11 @@ export default () => { return true } + const checkStatusPopsLocal = async (application: string) => { + const response = await getApi('check-statuspops-local', application) + return response + } + const statusPopsOp = async (application: string) => { const response = await statusPopsApi(application) return response @@ -866,87 +877,98 @@ export default () => { - - - - - - - - - - {applicationListElectrical().map((item: string, index: number) => ( + + + + + Downloading Data + + + + + +
Application NumberNameShow Details
+ - - - - + + + - ))} - -
{item}{nameListElectrical()[index]} - { - await getopdetails('electrical', item) - }} - > - - {item} - - - - - - - - - - - - - - - - - - - - - - - Click anywhere to cancel - - - - Application NumberNameShow Details
+ + + {applicationListElectrical().map((item: string, index: number) => ( + + {item} + {nameListElectrical()[index]} + + + { + await getopdetails('electrical', item) + }} + > + + {item} + + + + + + + + + + + + + + + + + + + + + + + Click anywhere to cancel + + + + + + ))} + + +
diff --git a/src/pages/MainPage/Main.sass b/src/pages/MainPage/Main.sass index e97fdbd..8552c3d 100644 --- a/src/pages/MainPage/Main.sass +++ b/src/pages/MainPage/Main.sass @@ -112,4 +112,3 @@ h1 &__error color: #c85656 - diff --git a/src/pages/MainPage/Main.tsx b/src/pages/MainPage/Main.tsx index 7216bd6..7bbb492 100644 --- a/src/pages/MainPage/Main.tsx +++ b/src/pages/MainPage/Main.tsx @@ -7,12 +7,14 @@ import { VsRefresh } from 'solid-icons/vs' import { createEffect, createSignal, onMount } from 'solid-js' import { Show } from 'solid-js/web' import { Box, Button, Clickable, Column, Input, Link, Logo, Modal, ModalButton, Padding, Page, Row } from '../../components/' -import { checkConnection, deleteApi, getApi, getApiMulti, getDateTime, lockData, postApi, saveNewName, saveNewPassword, securePassword, voidPopsApi } from '../../utils/functions' +import { checkConnection, deleteApi, getApi, getApiMulti, getDateTime, lockData, postApi, saveNewName, saveNewPassword, securePassword, voidPopsApi, voidApi, statusPopsApi } from '../../utils/functions' +import { AiOutlineLoading3Quarters } from 'solid-icons/ai' import './Main.sass' const PESO = import.meta.env.VITE_PESO const ID = sessionStorage.getItem('id')! const PUBLICIP = import.meta.env.VITE_PUBLICIP +const BACKEND = import.meta.env.VITE_BACKEND export default () => { const navigate = useNavigate() @@ -59,6 +61,7 @@ export default () => { const [configNotification, setConfigNotification] = createSignal(false) const [isIncomplete, setIsIncomplete] = createSignal(false) + const [isLoading, setIsLoading] = createSignal(false) let bldgadditional = false @@ -73,15 +76,19 @@ export default () => { } const getListForApprovalElectrical = async () => { + // setIsLoading(true) const responseE = await getApiMulti('get-listopapproval-electrical') setApplicationListElectrical(responseE.result) setNameListElectrical(responseE.result2) + // setIsLoading(false) } const getListForApprovalOccupancy = async () => { + // setIsLoading(true) const responseO = await getApiMulti('get-listopapproval-occupancy') setApplicationListOccupancy(responseO.result) setNameListOccupancy(responseO.result2) + // setIsLoading(false) } const load = async (division: string) => { @@ -90,6 +97,7 @@ export default () => { setErrorMessage('Could not gather list of applications') return } + setIsLoading(true) await getPassword() @@ -101,6 +109,7 @@ export default () => { } else { await getListForApproval() } + setIsLoading(false) } const getopdetails = async (division: string, applicationNo: string) => { @@ -148,6 +157,9 @@ export default () => { let forprinting: boolean = false let updateOrderofpayment: boolean = false + let popsExist: boolean = false + let popsPaid: boolean = false + setConnected(await checkConnection()) if (connected() === false) { setErrorMessage('No Connection on Server') @@ -155,7 +167,35 @@ export default () => { } if (division === 'electrical') { - await voidPopsOp(application) + // const isPaid = BACKEND.includes('localhost') ? await checkStatusPopsLocal(application) : await statusPopsOp(application) + // let isPaid + + if (BACKEND.includes('localhost')) { + const status = await checkStatusPopsLocal(application) + if (status.result > 0) popsExist = true + if (status.result2 > 0) popsPaid = true + } else { + const status = await await statusPopsOp(application) + if (status.message === 'Success') popsExist = true + if (status.pops_paid === true) popsPaid = true + } + + if (popsExist) { + if (popsPaid) { + setPostError(true) + setErrorMessage('Application Already Paid') + return + } else { + const voidOP = BACKEND.includes('localhost') ? await voidPopsOpLocal(application) : await voidPopsOp(application) + + if (!voidOP) { + setPostError(true) + setErrorMessage('POPS Record found but failed to void') + return + } + } + } + await postPops(division, application) const popsResult = await checkPops(application) const lockResult = await lockOpData(division, application) @@ -216,6 +256,37 @@ export default () => { } } + const approveElectrical = async (division: string, application: string) => { + let signed: boolean = false + let forprinting: boolean = false + let updateOrderofpayment: boolean = false + + await postPops(division, application) + const popsResult = await checkPops(application) + const lockResult = await lockOpData(division, application) + + if (popsResult && lockResult) { + signed = await setNewStatus(division, 'ELECTRICAL ORDER OF PAYMENT APPROVED AND SIGNED', '170', 'ELECOPAPPROVEDSIGNED', 1) + updateDocflow(division, application, 'FOR ELECTRICAL ORDER OF PAYMENT APPROVAL') + if (!signed) return + + forprinting = await setNewStatus(division, 'FOR ELECTRICAL ORDER OF PAYMENT PRINTING', '95', 'ELECOPPRINT', 0) + if (!forprinting) return + + updateOrderofpayment = await updateOp(division) + + if (updateOrderofpayment) { + postTransaction() + setApprovedApplication(application) + setApproved(true) + } + } else { + setPostError(true) + setErrorMessage('Error on posting on POPS Server, please try again') + return + } + } + const lockOpData = async (division: string, application: string) => { const dataToLock = await getApi(`get-opdata-${division}`, application) const lockedData = await lockData(dataToLock) @@ -230,6 +301,21 @@ export default () => { return true } + const voidPopsOpLocal = async (application: string) => { + const response = await voidApi('void-op-local', { data: application }) + return response + } + + const checkStatusPopsLocal = async (application: string) => { + const response = await getApiMulti('check-statuspops-local', application) + return response + } + + const statusPopsOp = async (application: string) => { + const response = await statusPopsApi(application) + return response + } + const returnAssessment = async (division: string, application: string) => { const id = await getApplicationById(division, application) setApplicationId(id) @@ -680,107 +766,117 @@ export default () => { - - - - - - - - - - {applicationListElectrical().map((item: string, index: number) => ( + + + + + Downloading Data + + + + +
Application NumberNameShow Details
+ - - - - + + + - ))} - -
{item}{nameListElectrical()[index]} - { - await getopdetails('electrical', item) - }} - > - - - {item} - - - - -

Signing Error

-
-

Missing Data Detected

-
- -
- - Some required information is missing from the application details - Please return to Assessment to complete the required fields - -
-
- -
Application NumberNameShow Details
+ + + {applicationListElectrical().map((item: string, index: number) => ( + + {item} + {nameListElectrical()[index]} + + + { + await getopdetails('electrical', item) + }} + > + + + {item} + + + + +

Signing Error

+
+

Missing Data Detected

+
+ +
+ + Some required information is missing from the application details + Please return to Assessment to complete the required fields + +
+
+ +