Compare commits
4 commits
f07bb72625
...
fe9e010622
| Author | SHA1 | Date | |
|---|---|---|---|
| fe9e010622 | |||
| eeb13bcc56 | |||
| 094dd08707 | |||
| 2ee284b3e6 |
4 changed files with 124 additions and 34 deletions
|
|
@ -40,7 +40,7 @@ func getCORSConfig(env string) cors.Config {
|
||||||
}
|
}
|
||||||
case "prod":
|
case "prod":
|
||||||
return cors.Config{
|
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"},
|
AllowMethods: []string{"GET", "POST", "OPTIONS", "DELETE"},
|
||||||
// AllowHeaders: []string{"Origin", "OCBO-Token", "Content-Length", "Content-Type", "X-Server", "Authorization"},
|
// AllowHeaders: []string{"Origin", "OCBO-Token", "Content-Length", "Content-Type", "X-Server", "Authorization"},
|
||||||
AllowHeaders: []string{"*"},
|
AllowHeaders: []string{"*"},
|
||||||
|
|
@ -1492,7 +1492,18 @@ func connect() {
|
||||||
})
|
})
|
||||||
|
|
||||||
case "check-esigntransaction":
|
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 {
|
if err != nil {
|
||||||
c.AbortWithError(http.StatusBadRequest, err)
|
c.AbortWithError(http.StatusBadRequest, err)
|
||||||
c.String(http.StatusBadRequest, err.Error())
|
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("Content-Security-Policy", "default-src 'self'; img-src 'self';")
|
||||||
c.Writer.Header().Set("X-Server", "OCBO Server")
|
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 {
|
if err != nil {
|
||||||
c.AbortWithError(http.StatusInternalServerError, err)
|
c.AbortWithError(http.StatusInternalServerError, err)
|
||||||
c.String(http.StatusInternalServerError, "Internal Server Error")
|
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")
|
router.Run(":4320")
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -190,6 +190,7 @@ export default () => {
|
||||||
|
|
||||||
const closeNotification = async () => {
|
const closeNotification = async () => {
|
||||||
setPrinted(false)
|
setPrinted(false)
|
||||||
|
setVoidNotification(false)
|
||||||
await checkDivision()
|
await checkDivision()
|
||||||
if (isBuilding()) await getListForPrinting('building')
|
if (isBuilding()) await getListForPrinting('building')
|
||||||
if (isOccupancy()) await getListForPrinting('occupancy')
|
if (isOccupancy()) await getListForPrinting('occupancy')
|
||||||
|
|
@ -394,7 +395,7 @@ export default () => {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
setLoadingText('Processing for Re-approval')
|
setLoadingText('Processing for Re-approval Status')
|
||||||
if (division === 'electrical') {
|
if (division === 'electrical') {
|
||||||
await setNewStatus(division, 'ELECTRICAL ORDER OF PAYMENT VOIDED', '173', 'ELECOPVOIDED', 1)
|
await setNewStatus(division, 'ELECTRICAL ORDER OF PAYMENT VOIDED', '173', 'ELECOPVOIDED', 1)
|
||||||
await setNewStatus(division, 'FOR ELECTRICAL ORDER OF PAYMENT APPROVAL', '94', 'ELECOPAPPROVE', 0)
|
await setNewStatus(division, 'FOR ELECTRICAL ORDER OF PAYMENT APPROVAL', '94', 'ELECOPAPPROVE', 0)
|
||||||
|
|
@ -403,28 +404,28 @@ export default () => {
|
||||||
if (checkOpPrinting) {
|
if (checkOpPrinting) {
|
||||||
await updateDocflow(division, application, 'FOR ELECTRICAL ORDER OF PAYMENT PRINTING')
|
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')
|
const checkOrValidation = await checkDocflow(division, application, 'FOR ELECTRICAL OFFICIAL RECEIPT VALIDATION')
|
||||||
if (checkOrValidation) {
|
if (checkOrValidation) {
|
||||||
await updateDocflow(division, application, 'FOR ELECTRICAL OFFICIAL RECEIPT VALIDATION')
|
await updateDocflow(division, application, 'FOR ELECTRICAL OFFICIAL RECEIPT VALIDATION')
|
||||||
}
|
}
|
||||||
// await updateDocflow(division, application, 'FOR ELECTRICAL OFFICIAL RECEIPT VALIDATION')
|
// await updateDocflow(division, application, 'FOR ELECTRICAL OFFICIAL RECEIPT VALIDATION')
|
||||||
await updateOpForApproval(division, application)
|
await updateOpForApproval(division, application)
|
||||||
setLoadingText('Processing for Re-approval')
|
setLoadingText('Clearing transactions and locked data')
|
||||||
await clearEsignTransactions(application)
|
await clearEsignTransactions(application)
|
||||||
|
await clearEsignLock(application)
|
||||||
} else if (division === 'occupancy') {
|
} else if (division === 'occupancy') {
|
||||||
await setNewStatus(division, 'OCCUPANCY ORDER OF PAYMENT VOIDED', '174', 'OCCOPVOIDED', 1)
|
await setNewStatus(division, 'OCCUPANCY ORDER OF PAYMENT VOIDED', '174', 'OCCOPVOIDED', 1)
|
||||||
//UNFINISH
|
//UNFINISH
|
||||||
await updateDocflow(division, application, 'APPROVED FOR PRINTING OF BUREAU OF FIRE AND ORDER OF PAYMENT')
|
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)
|
const successVoid = BACKEND.includes('localhost') ? await voidPopsOpLocal(application) : await voidPopsOp(application)
|
||||||
if (successVoid) {
|
if (successVoid) {
|
||||||
await postTransaction(application)
|
await postTransaction(application)
|
||||||
setIsLoading(false)
|
|
||||||
setPrintedApplication(application)
|
setPrintedApplication(application)
|
||||||
setVoidNotification(true)
|
setVoidNotification(true)
|
||||||
|
setIsLoading(false)
|
||||||
} else {
|
} else {
|
||||||
setIsLoading(false)
|
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 () => {
|
const saveConfig = async () => {
|
||||||
if (configNewName() !== '') await saveNewName(parseInt(employeeId().toString()), configNewName())
|
if (configNewName() !== '') await saveNewName(parseInt(employeeId().toString()), configNewName())
|
||||||
if (configNewPassword() !== '') await saveNewPassword(parseInt(employeeId().toString()), configNewEncPassword())
|
if (configNewPassword() !== '') await saveNewPassword(parseInt(employeeId().toString()), configNewEncPassword())
|
||||||
|
|
@ -1173,7 +1186,7 @@ export default () => {
|
||||||
</Modal>
|
</Modal>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div onClick={() => setVoidNotification(false)}>
|
<div onClick={closeNotification}>
|
||||||
<Modal trigger={voidNotification() === true} background="#123220ff" color="#cdfbe1f0" opacity={0.8}>
|
<Modal trigger={voidNotification() === true} background="#123220ff" color="#cdfbe1f0" opacity={0.8}>
|
||||||
<Padding top={1} bottom={1} left={2} right={2}>
|
<Padding top={1} bottom={1} left={2} right={2}>
|
||||||
<Column>
|
<Column>
|
||||||
|
|
|
||||||
|
|
@ -40,6 +40,12 @@
|
||||||
@extend .modal-tooltip__subinfo
|
@extend .modal-tooltip__subinfo
|
||||||
padding: 0 0 .55rem 4.45rem
|
padding: 0 0 .55rem 4.45rem
|
||||||
|
|
||||||
|
&__nextline
|
||||||
|
padding: 0 0 0 4.95rem
|
||||||
|
|
||||||
|
&__bold
|
||||||
|
font-weight: 700
|
||||||
|
|
||||||
&__category
|
&__category
|
||||||
padding: 0.15rem 0.55rem
|
padding: 0.15rem 0.55rem
|
||||||
border-radius: 0.5rem
|
border-radius: 0.5rem
|
||||||
|
|
@ -68,3 +74,11 @@
|
||||||
&__note-info
|
&__note-info
|
||||||
padding: 0 0 0.25rem 0
|
padding: 0 0 0.25rem 0
|
||||||
font-size: 0.75rem
|
font-size: 0.75rem
|
||||||
|
|
||||||
|
.modal-h3
|
||||||
|
margin: 0
|
||||||
|
|
||||||
|
.modal-h5
|
||||||
|
@extend .modal-h3
|
||||||
|
padding: 0.25rem 0 0.5rem 0
|
||||||
|
opacity: 0.8
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import { useNavigate } from '@solidjs/router'
|
import { useNavigate } from '@solidjs/router'
|
||||||
import { IoChevronBack } from 'solid-icons/io'
|
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 { Show } from 'solid-js/web'
|
||||||
import { Box, Button, Column, Combobox, Display, Input, Link, Logo, Modal, Padding, Page, Radio, Row, Clickable } from '../../components'
|
import { Box, Button, Column, Combobox, Display, Input, Link, Logo, Modal, Padding, Page, Radio, Row, Clickable } from '../../components'
|
||||||
import { _employeeId, _employeeName } from '../../stores/employee'
|
import { _employeeId, _employeeName } from '../../stores/employee'
|
||||||
|
|
@ -77,11 +77,21 @@ export default () => {
|
||||||
sessionStorage.setItem('name', _employeeName.get())
|
sessionStorage.setItem('name', _employeeName.get())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const closeChangesNotification = () => {
|
||||||
|
setOpenChanges(false)
|
||||||
|
sessionStorage.setItem('auto_open_changes', 'false')
|
||||||
|
}
|
||||||
|
|
||||||
createEffect(() => {
|
createEffect(() => {
|
||||||
if (role() === 'Approver') setName(APPROVERNAME)
|
if (role() === 'Approver') setName(APPROVERNAME)
|
||||||
else if (role() !== 'Approver' && name() === APPROVERNAME) setName('')
|
else if (role() !== 'Approver' && name() === APPROVERNAME) setName('')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
onMount(() => {
|
||||||
|
const auto = sessionStorage.getItem('auto_open_changes')
|
||||||
|
if (!auto) setOpenChanges(true)
|
||||||
|
})
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Page alignment="column">
|
<Page alignment="column">
|
||||||
|
|
@ -272,64 +282,62 @@ export default () => {
|
||||||
</Modal>
|
</Modal>
|
||||||
</div>*/}
|
</div>*/}
|
||||||
|
|
||||||
<div onClick={() => setOpenChanges(false)}>
|
<div onClick={closeChangesNotification}>
|
||||||
<Modal trigger={openChanges()} background="#252525ff" color="#dfe7fbf0" opacity={0.8} width="35rem">
|
<Modal trigger={openChanges()} background="#252525ff" color="#dfe7fbf0" opacity={0.8} width="37rem">
|
||||||
|
<h3 class="modal-h3">Changelog</h3>
|
||||||
|
<h5 class="modal-h5">Latest update: March 30, 2026</h5>
|
||||||
<Padding top={1} bottom={1} left={1.5} right={1.5}>
|
<Padding top={1} bottom={1} left={1.5} right={1.5}>
|
||||||
<section class="modal-tooltip">
|
<section class="modal-tooltip">
|
||||||
<div class="modal-tooltip__group">
|
<div class="modal-tooltip__group">
|
||||||
<span class="modal-tooltip__title">Login</span>
|
<span class="modal-tooltip__title">Login</span>
|
||||||
<Row content="left" gap={0.5}>
|
<Row content="left" gap={0.5}>
|
||||||
<span class="modal-tooltip__category__red">Removed</span>
|
<span class="modal-tooltip__category__red">Removal</span>
|
||||||
<span class="modal-tooltip__info">Removed version selection of encryption.</span>
|
<span class="modal-tooltip__info">Removed version selection of encryption.</span>
|
||||||
</Row>
|
</Row>
|
||||||
|
|
||||||
<span class="modal-tooltip__subinfo">* All active users are using version 2.</span>
|
<span class="modal-tooltip__subinfo">* All active users are already using version 2; selection is no longer needed.</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="modal-tooltip__group">
|
<div class="modal-tooltip__group">
|
||||||
<span class="modal-tooltip__title">Both Printing and Approval</span>
|
<span class="modal-tooltip__title">Both Printing and Approval</span>
|
||||||
<Row content="left" gap={0.5}>
|
<Row content="left" gap={0.5}>
|
||||||
<span class="modal-tooltip__category__yellow">Info</span>
|
<span class="modal-tooltip__category__yellow">Explain</span>
|
||||||
<span class="modal-tooltip__info">Loading</span>
|
<span class="modal-tooltip__info">Loading</span>
|
||||||
</Row>
|
</Row>
|
||||||
<span class="modal-tooltip__subinfo">* Clicking too fast lead to .</span>
|
<span class="modal-tooltip__subinfo">* To prevent double entry and incomplete transactions.</span>
|
||||||
<span class="modal-tooltip__subinfo__last">* Use this if the original order of payment is lost.</span>
|
<span class="modal-tooltip__subinfo">* Clicking on another application while background processes are still actively running</span>
|
||||||
|
<span class="modal-tooltip__subinfo modal-tooltip__nextline">was the main cause of transaction problems.</span>
|
||||||
|
<span class="modal-tooltip__subinfo__last">* Adding loading screen was the fix.</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="modal-tooltip__group">
|
<div class="modal-tooltip__group">
|
||||||
<span class="modal-tooltip__title">Printing</span>
|
<span class="modal-tooltip__title">Printing</span>
|
||||||
<Row content="left" gap={0.5}>
|
<Row content="left" gap={0.5}>
|
||||||
<span class="modal-tooltip__category__yellow">Info</span>
|
<span class="modal-tooltip__category__yellow">Explain</span>
|
||||||
<span class="modal-tooltip__info">Reprint (No Change)</span>
|
<span class="modal-tooltip__info">Reprint (No Change)</span>
|
||||||
</Row>
|
</Row>
|
||||||
<span class="modal-tooltip__subinfo">* Reprints a duplicate of the order of payment without any changes to its data.</span>
|
<span class="modal-tooltip__subinfo">* Reprints a duplicate of Order of Payment without any changes to its data.</span>
|
||||||
<span class="modal-tooltip__subinfo__last">* Use this if the original order of payment is lost.</span>
|
|
||||||
|
<span class="modal-tooltip__subinfo__last modal-tooltip__bold">* Use this if the original Order of Payment is lost or you want to print an extra copy.</span>
|
||||||
|
|
||||||
<Row content="left" gap={0.5}>
|
<Row content="left" gap={0.5}>
|
||||||
<span class="modal-tooltip__category__green">New</span>
|
<span class="modal-tooltip__category__green">New</span>
|
||||||
<span class="modal-tooltip__info">Void (Back to Approval)</span>
|
<span class="modal-tooltip__info">Void (Back to Approval)</span>
|
||||||
</Row>
|
</Row>
|
||||||
<span class="modal-tooltip__subinfo">* Returns the application back to approval.</span>
|
<span class="modal-tooltip__subinfo">* Returns the application back to approval.</span>
|
||||||
<span class="modal-tooltip__subinfo">* Deletes the existing order of payment to make room for the newly generated one.</span>
|
<span class="modal-tooltip__subinfo">* All listed applications are unpaid and can be safely re-approved.</span>
|
||||||
<span class="modal-tooltip__subinfo">* All applications listed are unpaid and safe to remove.</span>
|
<span class="modal-tooltip__subinfo modal-tooltip__bold">* Use this if duplicate values occur or there is any mistake in its data.</span>
|
||||||
<span class="modal-tooltip__subinfo">* Use this if duplicate values occur or there is any mistake in its data.</span>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="modal-tooltip__group">
|
<div class="modal-tooltip__group">
|
||||||
<span class="modal-tooltip__title">Approval</span>
|
<span class="modal-tooltip__title">Approval</span>
|
||||||
<Row content="left" gap={0.5}>
|
|
||||||
<span class="modal-tooltip__category__yellow">Info</span>
|
|
||||||
<span class="modal-tooltip__info">Data Lock</span>
|
|
||||||
</Row>
|
|
||||||
<span class="modal-tooltip__subinfo">* To avoid .</span>
|
|
||||||
<span class="modal-tooltip__subinfo">* Use this if the original order of payment is lost.</span>
|
|
||||||
|
|
||||||
<Row content="left" gap={0.5}>
|
<Row content="left" gap={0.5}>
|
||||||
<span class="modal-tooltip__category__green">New</span>
|
<span class="modal-tooltip__category__green">New</span>
|
||||||
<span class="modal-tooltip__info">Data Lock</span>
|
<span class="modal-tooltip__info">Order of Payment Data Lock</span>
|
||||||
</Row>
|
</Row>
|
||||||
<span class="modal-tooltip__subinfo">* To avoid .</span>
|
<span class="modal-tooltip__subinfo">* An encrypted copy of the Order of Payment is created when approved.</span>
|
||||||
<span class="modal-tooltip__subinfo">* Use this if the original order of payment is lost.</span>
|
<span class="modal-tooltip__subinfo">* Protection against alteration of data after approval.</span>
|
||||||
|
<span class="modal-tooltip__subinfo">* If the Order of Payment is voided and re-approved, locked data will be overridden.</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Row>
|
<Row>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue