diff --git a/backend/main.go b/backend/main.go index 6db3fb2..3184c27 100644 --- a/backend/main.go +++ b/backend/main.go @@ -40,7 +40,7 @@ func getCORSConfig(env string) cors.Config { } case "prod": return cors.Config{ - AllowOrigins: []string{"https://ocboapps.davaocity.gov.ph", "https://esign.patalcala.com", "http://localhost:8080", "http://192.168.7.183"}, + AllowOrigins: []string{"https://ocboapps.davaocity.gov.ph", "https://esign.patalcala.com"}, AllowMethods: []string{"GET", "POST", "OPTIONS", "DELETE"}, // AllowHeaders: []string{"Origin", "OCBO-Token", "Content-Length", "Content-Type", "X-Server", "Authorization"}, AllowHeaders: []string{"*"}, @@ -1492,7 +1492,18 @@ func connect() { }) case "check-esigntransaction": - err := db.QueryRow("SELECT COUNT(esign_transactionsid) FROM esign_transactions WHERE referenceNo = ?", data).Scan(&result) + err := db.QueryRow("SELECT COUNT(esign_transactionsid) AS result FROM esign_transactions WHERE referenceNo = ?", data).Scan(&result) + if err != nil { + c.AbortWithError(http.StatusBadRequest, err) + c.String(http.StatusBadRequest, err.Error()) + return + } + c.JSON(http.StatusOK, gin.H{ + "result": result, + }) + + case "check-esignlock": + err := db.QueryRow("SELECT COUNT(esign_lockid) AS result FROM esign_lock WHERE referenceNo = ?", data).Scan(&result) if err != nil { c.AbortWithError(http.StatusBadRequest, err) c.String(http.StatusBadRequest, err.Error()) @@ -2707,7 +2718,7 @@ func connect() { c.Writer.Header().Set("Content-Security-Policy", "default-src 'self'; img-src 'self';") c.Writer.Header().Set("X-Server", "OCBO Server") - dbpost, err := dbpop.Prepare("DELETE FROM esign_transactions WHERE referenceNo = ?") + dbpost, err := db.Prepare("DELETE FROM esign_transactions WHERE referenceNo = ?") if err != nil { c.AbortWithError(http.StatusInternalServerError, err) c.String(http.StatusInternalServerError, "Internal Server Error") @@ -2732,5 +2743,49 @@ func connect() { } }) + router.DELETE("/api/delete-esignlock", middleware.TokenChecker(), func(c *gin.Context) { + type DeleteLock struct { + Data string `json:"data"` + } + var deleteLock DeleteLock + if err := c.ShouldBindJSON(&deleteLock); 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("DELETE FROM esign_lock WHERE referenceNo = ?") + if err != nil { + c.AbortWithError(http.StatusInternalServerError, err) + c.String(http.StatusInternalServerError, "Internal Server Error") + return + } + defer dbpost.Close() + + exec, err := dbpost.Exec(deleteLock.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 eSign Lock") + } else { + c.String(http.StatusInternalServerError, "Failed on Deleting eSign Lock") + } + }) + router.Run(":4320") } diff --git a/src/pages/AssessorPage/Assessor.tsx b/src/pages/AssessorPage/Assessor.tsx index 1b9145d..bc17281 100644 --- a/src/pages/AssessorPage/Assessor.tsx +++ b/src/pages/AssessorPage/Assessor.tsx @@ -190,6 +190,7 @@ export default () => { const closeNotification = async () => { setPrinted(false) + setVoidNotification(false) await checkDivision() if (isBuilding()) await getListForPrinting('building') if (isOccupancy()) await getListForPrinting('occupancy') @@ -394,7 +395,7 @@ export default () => { return } - setLoadingText('Processing for Re-approval') + setLoadingText('Processing for Re-approval Status') if (division === 'electrical') { await setNewStatus(division, 'ELECTRICAL ORDER OF PAYMENT VOIDED', '173', 'ELECOPVOIDED', 1) await setNewStatus(division, 'FOR ELECTRICAL ORDER OF PAYMENT APPROVAL', '94', 'ELECOPAPPROVE', 0) @@ -403,28 +404,28 @@ export default () => { if (checkOpPrinting) { await updateDocflow(division, application, 'FOR ELECTRICAL ORDER OF PAYMENT PRINTING') } - - setLoadingText('Processing for Re-approval') const checkOrValidation = await checkDocflow(division, application, 'FOR ELECTRICAL OFFICIAL RECEIPT VALIDATION') if (checkOrValidation) { await updateDocflow(division, application, 'FOR ELECTRICAL OFFICIAL RECEIPT VALIDATION') } // await updateDocflow(division, application, 'FOR ELECTRICAL OFFICIAL RECEIPT VALIDATION') await updateOpForApproval(division, application) - setLoadingText('Processing for Re-approval') + setLoadingText('Clearing transactions and locked data') await clearEsignTransactions(application) + await clearEsignLock(application) } else if (division === 'occupancy') { await setNewStatus(division, 'OCCUPANCY ORDER OF PAYMENT VOIDED', '174', 'OCCOPVOIDED', 1) //UNFINISH await updateDocflow(division, application, 'APPROVED FOR PRINTING OF BUREAU OF FIRE AND ORDER OF PAYMENT') } + setLoadingText('Voiding POPS record') const successVoid = BACKEND.includes('localhost') ? await voidPopsOpLocal(application) : await voidPopsOp(application) if (successVoid) { await postTransaction(application) - setIsLoading(false) setPrintedApplication(application) setVoidNotification(true) + setIsLoading(false) } else { setIsLoading(false) } @@ -584,6 +585,18 @@ export default () => { } } + const clearEsignLock = async (application: string) => { + let deleteLock + const check = await getApi('check-esignlock', application) + + if (parseInt(check) > 0) { + deleteLock = await deleteApi('delete-esignlock', { data: application }) + return deleteLock + } else { + return 0 + } + } + const saveConfig = async () => { if (configNewName() !== '') await saveNewName(parseInt(employeeId().toString()), configNewName()) if (configNewPassword() !== '') await saveNewPassword(parseInt(employeeId().toString()), configNewEncPassword()) @@ -1173,7 +1186,7 @@ export default () => { -
setVoidNotification(false)}> +
diff --git a/src/pages/LoginPage/Login.sass b/src/pages/LoginPage/Login.sass index baa895a..70eaee7 100644 --- a/src/pages/LoginPage/Login.sass +++ b/src/pages/LoginPage/Login.sass @@ -39,6 +39,12 @@ &__last @extend .modal-tooltip__subinfo padding: 0 0 .55rem 4.45rem + + &__nextline + padding: 0 0 0 4.95rem + + &__bold + font-weight: 700 &__category padding: 0.15rem 0.55rem @@ -68,3 +74,11 @@ &__note-info padding: 0 0 0.25rem 0 font-size: 0.75rem + +.modal-h3 + margin: 0 + +.modal-h5 + @extend .modal-h3 + padding: 0.25rem 0 0.5rem 0 + opacity: 0.8 diff --git a/src/pages/LoginPage/Login.tsx b/src/pages/LoginPage/Login.tsx index 367976e..4bcc6c4 100644 --- a/src/pages/LoginPage/Login.tsx +++ b/src/pages/LoginPage/Login.tsx @@ -1,6 +1,6 @@ import { useNavigate } from '@solidjs/router' import { IoChevronBack } from 'solid-icons/io' -import { createEffect, createSignal } from 'solid-js' +import { createEffect, createSignal, onMount } from 'solid-js' import { Show } from 'solid-js/web' import { Box, Button, Column, Combobox, Display, Input, Link, Logo, Modal, Padding, Page, Radio, Row, Clickable } from '../../components' import { _employeeId, _employeeName } from '../../stores/employee' @@ -77,11 +77,21 @@ export default () => { sessionStorage.setItem('name', _employeeName.get()) } + const closeChangesNotification = () => { + setOpenChanges(false) + sessionStorage.setItem('auto_open_changes', 'false') + } + createEffect(() => { if (role() === 'Approver') setName(APPROVERNAME) else if (role() !== 'Approver' && name() === APPROVERNAME) setName('') }) + onMount(() => { + const auto = sessionStorage.getItem('auto_open_changes') + if (!auto) setOpenChanges(true) + }) + return ( <> @@ -272,64 +282,62 @@ export default () => {
*/} -
setOpenChanges(false)}> - +
+ + +