Compare commits

..

4 commits

6 changed files with 118 additions and 74 deletions

View file

@ -36,7 +36,7 @@ require (
go.uber.org/mock v0.6.0 // indirect
golang.org/x/arch v0.24.0 // indirect
golang.org/x/crypto v0.48.0 // indirect
golang.org/x/net v0.50.0 // indirect
golang.org/x/net v0.51.0 // indirect
golang.org/x/sys v0.41.0 // indirect
golang.org/x/text v0.34.0 // indirect
google.golang.org/protobuf v1.36.11 // indirect

View file

@ -80,8 +80,8 @@ golang.org/x/arch v0.24.0 h1:qlJ3M9upxvFfwRM51tTg3Yl+8CP9vCC1E7vlFpgv99Y=
golang.org/x/arch v0.24.0/go.mod h1:dNHoOeKiyja7GTvF9NJS1l3Z2yntpQNzgrjh1cU103A=
golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts=
golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos=
golang.org/x/net v0.50.0 h1:ucWh9eiCGyDR3vtzso0WMQinm2Dnt8cFMuQa9K33J60=
golang.org/x/net v0.50.0/go.mod h1:UgoSli3F/pBgdJBHCTc+tp3gmrU4XswgGRgtnwWTfyM=
golang.org/x/net v0.51.0 h1:94R/GTO7mt3/4wIKpcR5gkGmRLOuE/2hNGeWq/GBIFo=
golang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k=
golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=

View file

@ -30,9 +30,10 @@ func getCORSConfig(env string) cors.Config {
switch env {
case "dev":
return cors.Config{
AllowOrigins: []string{"http://localhost:5173"},
AllowMethods: []string{"GET", "POST", "OPTIONS", "DELETE"},
AllowHeaders: []string{"Origin", "OCBO-Token", "Content-Length", "Content-Type", "X-Server"},
AllowOrigins: []string{"http://localhost:5173"},
AllowMethods: []string{"GET", "POST", "OPTIONS", "DELETE"},
// AllowHeaders: []string{"Origin", "OCBO-Token", "Content-Length", "Content-Type", "X-Server", "Authorization"},
AllowHeaders: []string{"*"},
ExposeHeaders: []string{"Content-Length"},
AllowCredentials: true,
}
@ -2492,5 +2493,49 @@ func connect() {
}
})
router.DELETE("/api/delete-esigntransactions", func(c *gin.Context) {
type DeleteOPLocal struct {
Data string `json:"data"`
}
var deleteOpLocal DeleteOPLocal
if err := c.ShouldBindJSON(&deleteOpLocal); 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 := dbpop.Prepare("DELETE FROM esign_transactions 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(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 eSign Transactions")
} else {
c.String(http.StatusInternalServerError, "Failed on Deleting eSign Transactions")
}
})
router.Run(":4320")
}

View file

@ -23,7 +23,7 @@
"jsencrypt": "^3.5.4",
"jspdf": "^3.0.4",
"jspdf-barcode": "^1.0.2",
"nanostores": "^1.1.0",
"nanostores": "^1.1.1",
"ofetch": "^1.5.1",
"openssl-nodejs": "^1.0.5",
"pica": "^9.0.1",
@ -37,7 +37,7 @@
"@biomejs/biome": "^2.4.4",
"@nanostores/solid": "^1.1.1",
"@types/crypto-js": "^4.2.2",
"@types/node": "^24.10.13",
"@types/node": "^24.10.15",
"sass-embedded": "^1.97.3",
"typescript": "~5.8.3",
"vite": "^7.3.1",

44
pnpm-lock.yaml generated
View file

@ -48,8 +48,8 @@ importers:
specifier: ^1.0.2
version: 1.0.2(jspdf@3.0.4)
nanostores:
specifier: ^1.1.0
version: 1.1.0
specifier: ^1.1.1
version: 1.1.1
ofetch:
specifier: ^1.5.1
version: 1.5.1
@ -80,13 +80,13 @@ importers:
version: 2.4.4
'@nanostores/solid':
specifier: ^1.1.1
version: 1.1.1(nanostores@1.1.0)(solid-js@1.9.11)
version: 1.1.1(nanostores@1.1.1)(solid-js@1.9.11)
'@types/crypto-js':
specifier: ^4.2.2
version: 4.2.2
'@types/node':
specifier: ^24.10.13
version: 24.10.13
specifier: ^24.10.15
version: 24.10.15
sass-embedded:
specifier: ^1.97.3
version: 1.97.3
@ -95,13 +95,13 @@ importers:
version: 5.8.3
vite:
specifier: ^7.3.1
version: 7.3.1(@types/node@24.10.13)(sass-embedded@1.97.3)(sass@1.97.3)
version: 7.3.1(@types/node@24.10.15)(sass-embedded@1.97.3)(sass@1.97.3)
vite-plugin-compression2:
specifier: ^2.4.0
version: 2.4.0(rollup@4.52.1)
vite-plugin-solid:
specifier: ^2.11.10
version: 2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@24.10.13)(sass-embedded@1.97.3)(sass@1.97.3))
version: 2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@24.10.15)(sass-embedded@1.97.3)(sass@1.97.3))
packages:
@ -1084,8 +1084,8 @@ packages:
'@types/node@16.9.1':
resolution: {integrity: sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==}
'@types/node@24.10.13':
resolution: {integrity: sha512-oH72nZRfDv9lADUBSo104Aq7gPHpQZc4BTx38r9xf9pg5LfP6EzSyH2n7qFmmxRQXh7YlUXODcYsg6PuTDSxGg==}
'@types/node@24.10.15':
resolution: {integrity: sha512-BgjLoRuSr0MTI5wA6gMw9Xy0sFudAaUuvrnjgGx9wZ522fYYLA5SYJ+1Y30vTcJEG+DRCyDHx/gzQVfofYzSdg==}
'@types/pako@2.0.4':
resolution: {integrity: sha512-VWDCbrLeVXJM9fihYodcLiIv0ku+AlOa/TQ1SvYOaBuyrSKgEcro95LJyIsJ4vSo6BXIxOKxiJAat04CmST9Fw==}
@ -1405,8 +1405,8 @@ packages:
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
nanostores@1.1.0:
resolution: {integrity: sha512-yJBmDJr18xy47dbNVlHcgdPrulSn1nhSE6Ns9vTG+Nx9VPT6iV1MD6aQFp/t52zpf82FhLLTXAXr30NuCnxvwA==}
nanostores@1.1.1:
resolution: {integrity: sha512-EYJqS25r2iBeTtGQCHidXl1VfZ1jXM7Q04zXJOrMlxVVmD0ptxJaNux92n1mJ7c5lN3zTq12MhH/8x59nP+qmg==}
engines: {node: ^20.0.0 || >=22.0.0}
node-addon-api@7.1.1:
@ -2510,9 +2510,9 @@ snapshots:
'@solid-primitives/utils': 6.3.2(solid-js@1.9.11)
solid-js: 1.9.11
'@nanostores/solid@1.1.1(nanostores@1.1.0)(solid-js@1.9.11)':
'@nanostores/solid@1.1.1(nanostores@1.1.1)(solid-js@1.9.11)':
dependencies:
nanostores: 1.1.0
nanostores: 1.1.1
solid-js: 1.9.11
'@parcel/watcher-android-arm64@2.5.4':
@ -2762,7 +2762,7 @@ snapshots:
'@types/node@16.9.1': {}
'@types/node@24.10.13':
'@types/node@24.10.15':
dependencies:
undici-types: 7.16.0
@ -3093,7 +3093,7 @@ snapshots:
nanoid@3.3.11: {}
nanostores@1.1.0: {}
nanostores@1.1.1: {}
node-addon-api@7.1.1:
optional: true
@ -3516,7 +3516,7 @@ snapshots:
transitivePeerDependencies:
- rollup
vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@24.10.13)(sass-embedded@1.97.3)(sass@1.97.3)):
vite-plugin-solid@2.11.10(solid-js@1.9.11)(vite@7.3.1(@types/node@24.10.15)(sass-embedded@1.97.3)(sass@1.97.3)):
dependencies:
'@babel/core': 7.28.4
'@types/babel__core': 7.20.5
@ -3524,12 +3524,12 @@ snapshots:
merge-anything: 5.1.7
solid-js: 1.9.11
solid-refresh: 0.6.3(solid-js@1.9.11)
vite: 7.3.1(@types/node@24.10.13)(sass-embedded@1.97.3)(sass@1.97.3)
vitefu: 1.1.1(vite@7.3.1(@types/node@24.10.13)(sass-embedded@1.97.3)(sass@1.97.3))
vite: 7.3.1(@types/node@24.10.15)(sass-embedded@1.97.3)(sass@1.97.3)
vitefu: 1.1.1(vite@7.3.1(@types/node@24.10.15)(sass-embedded@1.97.3)(sass@1.97.3))
transitivePeerDependencies:
- supports-color
vite@7.3.1(@types/node@24.10.13)(sass-embedded@1.97.3)(sass@1.97.3):
vite@7.3.1(@types/node@24.10.15)(sass-embedded@1.97.3)(sass@1.97.3):
dependencies:
esbuild: 0.27.2
fdir: 6.5.0(picomatch@4.0.3)
@ -3538,14 +3538,14 @@ snapshots:
rollup: 4.52.1
tinyglobby: 0.2.15
optionalDependencies:
'@types/node': 24.10.13
'@types/node': 24.10.15
fsevents: 2.3.3
sass: 1.97.3
sass-embedded: 1.97.3
vitefu@1.1.1(vite@7.3.1(@types/node@24.10.13)(sass-embedded@1.97.3)(sass@1.97.3)):
vitefu@1.1.1(vite@7.3.1(@types/node@24.10.15)(sass-embedded@1.97.3)(sass@1.97.3)):
optionalDependencies:
vite: 7.3.1(@types/node@24.10.13)(sass-embedded@1.97.3)(sass@1.97.3)
vite: 7.3.1(@types/node@24.10.15)(sass-embedded@1.97.3)(sass@1.97.3)
webworkify@1.5.0: {}

View file

@ -1,12 +1,12 @@
import { Tabs } from '@kobalte/core/tabs';
import { useNavigate } from '@solidjs/router';
import dayjs from 'dayjs';
import { FaSolidThumbsUp } from 'solid-icons/fa';
import { FiLogOut } from 'solid-icons/fi';
import { VsRefresh } from 'solid-icons/vs';
import { createEffect, createSignal, onMount } from 'solid-js';
import { Show } from 'solid-js/web';
import { Box, Button, Clickable, Column, Combobox, Input, Link, Logo, Modal, ModalButton, Padding, Page, Row } from '../../components/index.ts';
import { Tabs } from '@kobalte/core/tabs'
import { useNavigate } from '@solidjs/router'
import dayjs from 'dayjs'
import { FaSolidThumbsUp, FaSolidUserGear } from 'solid-icons/fa'
import { FiLogOut } from 'solid-icons/fi'
import { VsRefresh } from 'solid-icons/vs'
import { createEffect, createSignal, onMount } from 'solid-js'
import { Show } from 'solid-js/web'
import { Box, Button, Clickable, Column, Combobox, Input, Link, Logo, Modal, ModalButton, Padding, Page, Row } from '../../components/index.ts'
import {
_additional,
_additionalAmountList,
@ -31,10 +31,9 @@ import {
_totalUnits,
_type,
_units,
} from '../../stores/pdfinfo.ts';
import { checkConnection, createPdfElectrical, createPdfOccupancy, getApi, getApiMulti, postApi, statusPopsApi, voidPopsApi, saveNewName, saveNewPassword, securePassword, getDateTime } from '../../utils/functions/index.ts';
import './Assessor.sass';
import { FaSolidUserGear } from 'solid-icons/fa'
} from '../../stores/pdfinfo.ts'
import { checkConnection, createPdfElectrical, createPdfOccupancy, getApi, getApiMulti, getDateTime, postApi, saveNewName, saveNewPassword, securePassword, statusPopsApi, voidPopsApi } from '../../utils/functions/index.ts'
import './Assessor.sass'
const PESO = import.meta.env.VITE_PESO
@ -79,7 +78,7 @@ export default () => {
const [filter, setFilter] = createSignal('')
const listType = ['Print', 'Reprint (No Change)', 'Void and Reprint']
const listType = ['Print', 'Reprint (No Change)', 'Void and Reapprove']
const [selectedType, setSelectedType] = createSignal('Print')
const [voidError, setVoidError] = createSignal(false)
@ -348,13 +347,19 @@ export default () => {
return
}
if (selectedType().includes("Void")) {
if (selectedType().includes('Void')) {
// Return to ASSESSMENT
// TODO:
// Set current status (for validation) to 1, is_approve = 1
// Clear order of payment as long as not Paid
// Clear esign_transactions
const status = await statusPopsOp(application)
const message = status.message
if (message.includes('No record')) {
setVoidError(true)
setErrorMessage("No record found on Pops")
setErrorMessage('No record found on Pops')
return
} else {
const pops_paid = message.pops_paid
@ -362,7 +367,7 @@ export default () => {
if (pops_paid || epay_paid) {
setVoidError(true)
setErrorMessage("Already Paid")
setErrorMessage('Already Paid')
return
}
}
@ -525,7 +530,6 @@ export default () => {
setConfigError('')
encryptNewPassword()
}
} else {
setConfigError('Invalid Password')
setConfigNewEncPassword('')
@ -590,13 +594,12 @@ export default () => {
createEffect(() => {
if (configPassword() !== '') {
checkCurrentPassword();
} else checkCurrentPassword();
checkCurrentPassword()
} else checkCurrentPassword()
if (configNewPassword() !== '') {
encryptNewPassword()
} else encryptNewPassword()
})
return (
@ -613,9 +616,7 @@ export default () => {
<Row content="left" gap={1.75}>
<Box curved thickness={0} padding="1.25rem 2.25rem" background="#0f131d56">
<span class="profile">
{employeeName()}
</span>
<span class="profile">{employeeName()}</span>
</Box>
<Clickable onClick={() => setOpenConfig(true)}>
<Row gap={0.25}>
@ -664,7 +665,6 @@ export default () => {
<Row content="split">
<Input value={filter()} onChange={setFilter} placeholder="Filter Application Number" />
<Row>
{/* <Combobox options={listType} value={selectedType()} onChange={setSelectedType} placeholder="Select Type" width='200px' /> */}
<Button label="Refresh Data" edges="curved" design="bo-primary" icon={VsRefresh} onClick={refresh}></Button>
</Row>
@ -859,7 +859,7 @@ export default () => {
<Input value={filter()} onChange={setFilter} placeholder="Filter Application Number" />
<Row gap={0.5}>
{/* <AiOutlineQuestionCircle size={24}/> */}
<Combobox options={listType} value={selectedType()} onChange={setSelectedType} placeholder="Select Type" width='250px' />
<Combobox options={listType} value={selectedType()} onChange={setSelectedType} placeholder="Select Type" width="250px" />
<Button label="Refresh Data" edges="curved" design="bo-primary" icon={VsRefresh} onClick={refresh}></Button>
</Row>
</Row>
@ -1020,25 +1020,24 @@ export default () => {
</Modal>
</div>
<Modal trigger={openConfig()} background="#16212c" color="#ffffffed" opacity={0.8} width='30rem'>
<Modal trigger={openConfig()} background="#16212c" color="#ffffffed" opacity={0.8} width="30rem">
<Padding top={1} bottom={1} left={4} right={4}>
<section class='config'>
<div class='config__row'>
<section class="config">
<div class="config__row">
Name:
<span>{employeeName()}</span>
</div>
<div class='config__edit'>
<span class='config__edit__title'>Change Displayed Name</span>
<Input value={configNewName()} onChange={setConfigNewName} placeholder='Enter new name' />
<span class='config__edit__info'>Leave blank to remain unchanged.</span>
<div class="config__edit">
<span class="config__edit__title">Change Displayed Name</span>
<Input value={configNewName()} onChange={setConfigNewName} placeholder="Enter new name" />
<span class="config__edit__info">Leave blank to remain unchanged.</span>
</div>
<div class='config__edit'>
<span class='config__edit__title'>Change Password</span>
<Input isPassword value={configPassword()} onChange={setConfigPassword} placeholder='Enter current password' />
<Input isPassword value={configNewPassword()} onChange={setConfigNewPassword} placeholder='Enter new password' />
<div class="config__edit">
<span class="config__edit__title">Change Password</span>
<Input isPassword value={configPassword()} onChange={setConfigPassword} placeholder="Enter current password" />
<Input isPassword value={configNewPassword()} onChange={setConfigNewPassword} placeholder="Enter new password" />
<Show when={configNewPassword().length !== 0}>
<span style="padding: 1.75rem 0 0 0">Current Encrypted Password:</span>
@ -1051,18 +1050,18 @@ export default () => {
<Show when={configError() !== ''}>
<span class="required-config">{configError()}</span>
<Button label='Cancel' edges='curved' design='bo-danger' onClick={() => setOpenConfig(false)} wide />
<Button label="Cancel" edges="curved" design="bo-danger" onClick={() => setOpenConfig(false)} wide />
</Show>
<div class='config__button'>
<div class="config__button">
<Show when={configError() === ''}>
<Button label='Confirm' edges='curved' design='bo-primary' onClick={saveConfig} wide />
<Button label='Cancel' edges='curved' design='bo-danger' onClick={() => setOpenConfig(false)} wide />
<Button label="Confirm" edges="curved" design="bo-primary" onClick={saveConfig} wide />
<Button label="Cancel" edges="curved" design="bo-danger" onClick={() => setOpenConfig(false)} wide />
</Show>
</div>
</section>
</Padding>
</Modal >
</Modal>
<div onClick={closeConfig}>
<Modal trigger={configNotification() === true} background="#123220ff" color="#cdfbe1f0" opacity={0.8}>
@ -1079,7 +1078,7 @@ export default () => {
</Row>
</Column>
</Padding>
</Modal >
</Modal>
</div>
</>
)