diff --git a/backend/main.go b/backend/main.go index b8f7248..b68d0b4 100644 --- a/backend/main.go +++ b/backend/main.go @@ -15,12 +15,12 @@ import ( ) // DEV -var connection string = "root:superuser@tcp(localhost:3306)/iips" -var connectionPops string = "root:superuser@tcp(localhost:3306)/pops" +// var connection string = "root:superuser@tcp(localhost:3306)/iips" +// var connectionPops string = "root:superuser@tcp(localhost:3306)/pops" // SERVER -// var connection string = "iips:iipsuser@tcp(192.168.7.100:3306)/iips" -// var connectionPops string = "pops:Pops2023!@tcp(192.168.76.10:3306)/pops" +var connection string = "iips:iipsuser@tcp(192.168.7.100:3306)/iips" +var connectionPops string = "pops:Pops2023!@tcp(192.168.76.10:3306)/pops" func main() { err := godotenv.Load() @@ -46,13 +46,13 @@ func connect() { router.Use(cors.Default()) //DEV - router.Use(cors.New(cors.Config{ - AllowOrigins: []string{"http://localhost:5173"}, - AllowMethods: []string{"GET", "POST"}, - AllowHeaders: []string{"Origin", "OCBO-Token"}, - ExposeHeaders: []string{"Content-Length"}, - AllowCredentials: true, - })) + // router.Use(cors.New(cors.Config{ + // AllowOrigins: []string{"http://localhost:5173"}, + // AllowMethods: []string{"GET", "POST"}, + // AllowHeaders: []string{"Origin", "OCBO-Token"}, + // ExposeHeaders: []string{"Content-Length"}, + // AllowCredentials: true, + // })) //SERVER // router.Use(cors.New(cors.Config{ @@ -856,6 +856,40 @@ func connect() { "result3": array3, }) + case "get-printdetailsfees-bldgadditional": + var result2, result3, result4 string + array := []string{} + array2 := []string{} + array3 := []string{} + array4 := []string{} + + results, err := db.Query(`SELECT IFNULL(ref.accountdescription, '') AS result, IFNULL(ref.accountcode, '') AS result2, IFNULL(op.amount, '') AS result3, IFNULL(op.numUnits, 0) AS result4 + FROM occupancy o JOIN building_orderofpayment op ON o.occupancyid = op.occupancyid JOIN ref_bldgcomputationsheet ref ON op.ref_bldgcomputationsheetid = ref.ref_bldgcomputationsheetid + WHERE op.is_approve = 1 AND op.for_approval = 1 AND op.is_paid = 0 AND op.popstransmitted = 0 AND op.is_delete <> 1 AND op.occupancyid = ?`, data) + if err != nil { + c.AbortWithError(http.StatusBadRequest, err) + c.String(http.StatusBadRequest, err.Error()) + return + } + for results.Next() { + err = results.Scan(&result, &result2, &result3, &result4) + if err != nil { + c.AbortWithError(http.StatusBadRequest, err) + c.String(http.StatusBadRequest, err.Error()) + return + } + array = append(array, result) + array2 = append(array2, result2) + array3 = append(array3, result3) + array4 = append(array4, result4) + } + c.JSON(http.StatusOK, gin.H{ + "result": array, + "result2": array2, + "result3": array3, + "result4": array4, + }) + case "get-printdetailsfees-electrical": var result2, result3 string array := []string{} @@ -1031,7 +1065,7 @@ func connect() { "result9": array9, }) - case "check-bldgadditional-approval": + case "check-bldgadditional-approval": err := db.QueryRow("SELECT COUNT(building_orderofpaymentid) AS result FROM building_orderofpayment WHERE occupancyid = (SELECT occupancyid FROM occupancy WHERE controlNo = ?) AND for_approval = 1 AND is_approve = 0 AND popstransmitted = 0 AND is_paid = 0 AND is_delete = 0", data).Scan(&result) if err != nil { c.AbortWithError(http.StatusBadRequest, err) @@ -1042,7 +1076,7 @@ func connect() { "result": result, }) - case "check-bldgadditional-printing": + case "check-bldgadditional-printing": err := db.QueryRow("SELECT COUNT(building_orderofpaymentid) AS result FROM building_orderofpayment WHERE occupancyid = (SELECT occupancyid FROM occupancy WHERE controlNo = ?) AND for_approval = 1 AND is_approve = 1 AND popstransmitted = 0 AND is_paid = 0 AND is_delete = 0", data).Scan(&result) if err != nil { c.AbortWithError(http.StatusBadRequest, err) @@ -1052,6 +1086,7 @@ func connect() { c.JSON(http.StatusOK, gin.H{ "result": result, }) + } }) @@ -1091,6 +1126,16 @@ func connect() { "result": result, }) + case "check-approval": + err := db.QueryRow("SELECT IFNULL(is_approve, 0) AS result FROM occupancydocflowtxn WHERE remarks = ? AND occupancyreceivingid = (SELECT occupancyid FROM occupancy WHERE controlNo = ?)", data, data2).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, + }) } }) @@ -1281,53 +1326,6 @@ func connect() { } }) - // router.POST("/api/update-docflow-bldgadditional", middleware.TokenChecker(), func(c *gin.Context) { - // type UpdateDocflowData struct { - // Data string `json:"data"` - // Data2 string `json:"data2"` - // } - // var updateDocflowData UpdateDocflowData - // if err := c.ShouldBindJSON(&updateDocflowData); 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") - - // dbpost, err := db.Prepare("UPDATE occupancydocflowtxn SET is_approve = 1 WHERE remarks = ? AND occupancyreceivingid = (SELECT occupancyid FROM occupancy WHERE controlNo = ?)") - // if err != nil { - // c.AbortWithError(http.StatusInternalServerError, err) - // c.String(http.StatusInternalServerError, "Internal Server Error") - // return - // } - // defer dbpost.Close() - - // exec, err := dbpost.Exec(updateDocflowData.Data, updateDocflowData.Data2) - // if err != nil { - // c.AbortWithError(http.StatusInternalServerError, err) - // c.String(http.StatusInternalServerError, "Internal Server Error") - // return - // } - - // affect, err := exec.RowsAffected() - // if err != nil { - // c.AbortWithError(http.StatusInternalServerError, err) - // c.String(http.StatusInternalServerError, "Internal Server Error") - // return - // } - - // if affect > 0 { - // c.String(http.StatusOK, "Success on Updating Docflow on Electrical") - // } else { - // c.String(http.StatusInternalServerError, "Failed on Updating Docflow on Electrical") - // } - // }) - router.POST("/api/update-docflow-electrical", middleware.TokenChecker(), func(c *gin.Context) { type UpdateDocflowData struct { Data string `json:"data"` @@ -1597,7 +1595,7 @@ func connect() { } }) - router.POST("/api/update-opapproved-bldgadditional", middleware.TokenChecker(), func(c *gin.Context) { + router.POST("/api/update-opapproved-bldgadditional", middleware.TokenChecker(), func(c *gin.Context) { type UpdateOpData struct { Data int `json:"data"` } diff --git a/biome.jsonc b/biome.jsonc new file mode 100644 index 0000000..dc21802 --- /dev/null +++ b/biome.jsonc @@ -0,0 +1,22 @@ +{ + "formatter": { + "semicolons": "asNeeded", + "indentStyle": "space", + "lineWidth": 500, + "bracketSpacing": true, + "quoteStyle": "single", + "trailingCommas": "es5", + "quoteProperties": "preserve" + }, + "javascript": { + "formatter": { + "quoteStyle": "single", + "lineWidth": 500 + } + }, + "json": { + "formatter": { + "enabled": false + } + } +} \ No newline at end of file diff --git a/package.json b/package.json index 6675e54..19a5b49 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "@fontsource-variable/roboto": "^5.2.8", "@kobalte/core": "^0.13.11", "@solidjs-use/integrations": "^2.3.0", - "@solidjs/router": "^0.15.3", + "@solidjs/router": "^0.15.4", "consola": "^3.4.2", "crypto-js": "^4.2.0", "dayjs": "^1.11.19", @@ -26,18 +26,19 @@ "openssl-nodejs": "^1.0.5", "pica": "^9.0.1", "qrcode": "^1.5.4", - "sharp": "^0.34.4", + "sharp": "^0.34.5", "solid-icons": "^1.1.0", "solid-js": "^1.9.10", "solidjs-use": "^2.3.0" }, "devDependencies": { + "@biomejs/biome": "2.3.5", "@nanostores/solid": "^1.1.1", "@types/crypto-js": "^4.2.2", - "@types/node": "^24.10.0", + "@types/node": "^24.10.1", "sass-embedded": "^1.93.3", "typescript": "~5.8.3", - "vite": "^7.2.0", + "vite": "^7.2.2", "vite-plugin-compression2": "^2.3.1", "vite-plugin-solid": "^2.11.10" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0f106bf..abb431b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,8 +18,8 @@ importers: specifier: ^2.3.0 version: 2.3.0(qrcode@1.5.4)(sortablejs@1.15.6) '@solidjs/router': - specifier: ^0.15.3 - version: 0.15.3(solid-js@1.9.10) + specifier: ^0.15.4 + version: 0.15.4(solid-js@1.9.10) consola: specifier: ^3.4.2 version: 3.4.2 @@ -60,8 +60,8 @@ importers: specifier: ^1.5.4 version: 1.5.4 sharp: - specifier: ^0.34.4 - version: 0.34.4 + specifier: ^0.34.5 + version: 0.34.5 solid-icons: specifier: ^1.1.0 version: 1.1.0(solid-js@1.9.10) @@ -72,6 +72,9 @@ importers: specifier: ^2.3.0 version: 2.3.0 devDependencies: + '@biomejs/biome': + specifier: 2.3.5 + version: 2.3.5 '@nanostores/solid': specifier: ^1.1.1 version: 1.1.1(nanostores@1.0.1)(solid-js@1.9.10) @@ -79,8 +82,8 @@ importers: specifier: ^4.2.2 version: 4.2.2 '@types/node': - specifier: ^24.10.0 - version: 24.10.0 + specifier: ^24.10.1 + version: 24.10.1 sass-embedded: specifier: ^1.93.3 version: 1.93.3 @@ -88,14 +91,14 @@ importers: specifier: ~5.8.3 version: 5.8.3 vite: - specifier: ^7.2.0 - version: 7.2.0(@types/node@24.10.0)(sass-embedded@1.93.3)(sass@1.93.3) + specifier: ^7.2.2 + version: 7.2.2(@types/node@24.10.1)(sass-embedded@1.93.3)(sass@1.93.3) vite-plugin-compression2: specifier: ^2.3.1 version: 2.3.1(rollup@4.52.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(solid-js@1.9.10)(vite@7.2.0(@types/node@24.10.0)(sass-embedded@1.93.3)(sass@1.93.3)) + version: 2.11.10(solid-js@1.9.10)(vite@7.2.2(@types/node@24.10.1)(sass-embedded@1.93.3)(sass@1.93.3)) packages: @@ -184,6 +187,59 @@ packages: resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} engines: {node: '>=6.9.0'} + '@biomejs/biome@2.3.5': + resolution: {integrity: sha512-HvLhNlIlBIbAV77VysRIBEwp55oM/QAjQEin74QQX9Xb259/XP/D5AGGnZMOyF1el4zcvlNYYR3AyTMUV3ILhg==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@2.3.5': + resolution: {integrity: sha512-fLdTur8cJU33HxHUUsii3GLx/TR0BsfQx8FkeqIiW33cGMtUD56fAtrh+2Fx1uhiCsVZlFh6iLKUU3pniZREQw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@2.3.5': + resolution: {integrity: sha512-qpT8XDqeUlzrOW8zb4k3tjhT7rmvVRumhi2657I2aGcY4B+Ft5fNwDdZGACzn8zj7/K1fdWjgwYE3i2mSZ+vOA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@2.3.5': + resolution: {integrity: sha512-eGUG7+hcLgGnMNl1KHVZUYxahYAhC462jF/wQolqu4qso2MSk32Q+QrpN7eN4jAHAg7FUMIo897muIhK4hXhqg==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-arm64@2.3.5': + resolution: {integrity: sha512-u/pybjTBPGBHB66ku4pK1gj+Dxgx7/+Z0jAriZISPX1ocTO8aHh8x8e7Kb1rB4Ms0nA/SzjtNOVJ4exVavQBCw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-x64-musl@2.3.5': + resolution: {integrity: sha512-awVuycTPpVTH/+WDVnEEYSf6nbCBHf/4wB3lquwT7puhNg8R4XvonWNZzUsfHZrCkjkLhFH/vCZK5jHatD9FEg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-linux-x64@2.3.5': + resolution: {integrity: sha512-XrIVi9YAW6ye0CGQ+yax0gLfx+BFOtKaNX74n+xHWla6Cl6huUmcKNO7HPx7BiKnJUzrxXY1qYlm7xMvi08X4g==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-win32-arm64@2.3.5': + resolution: {integrity: sha512-DlBiMlBZZ9eIq4H7RimDSGsYcOtfOIfZOaI5CqsWiSlbTfqbPVfWtCf92wNzx8GNMbu1s7/g3ZZESr6+GwM/SA==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@2.3.5': + resolution: {integrity: sha512-nUmR8gb6yvrKhtRgzwo/gDimPwnO5a4sCydf8ZS2kHIJhEmSmk+STsusr1LHTuM//wXppBawvSQi2xFXJCdgKQ==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + '@bufbuild/protobuf@2.9.0': resolution: {integrity: sha512-rnJenoStJ8nvmt9Gzye8nkYd6V22xUAnu4086ER7h1zJ508vStko4pMvDeQ446ilDTFpV5wnoc5YS7XvMwwMqA==} @@ -192,8 +248,8 @@ packages: peerDependencies: solid-js: ^1.8 - '@emnapi/runtime@1.5.0': - resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} + '@emnapi/runtime@1.7.0': + resolution: {integrity: sha512-oAYoQnCYaQZKVS53Fq23ceWMRxq5EhQsE0x0RdQ55jT7wagMu5k+fS39v1fiSLrtrLQlXwVINenqhLMtTrV/1Q==} '@esbuild/aix-ppc64@0.25.10': resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} @@ -367,124 +423,135 @@ packages: resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} engines: {node: '>=18'} - '@img/sharp-darwin-arm64@0.34.4': - resolution: {integrity: sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==} + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.34.4': - resolution: {integrity: sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==} + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.2.3': - resolution: {integrity: sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==} + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.2.3': - resolution: {integrity: sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==} + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.2.3': - resolution: {integrity: sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==} + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linux-arm@1.2.3': - resolution: {integrity: sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==} + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-ppc64@1.2.3': - resolution: {integrity: sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==} + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] - '@img/sharp-libvips-linux-s390x@1.2.3': - resolution: {integrity: sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==} + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] - '@img/sharp-libvips-linux-x64@1.2.3': - resolution: {integrity: sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==} + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] - '@img/sharp-libvips-linuxmusl-arm64@1.2.3': - resolution: {integrity: sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==} + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linuxmusl-x64@1.2.3': - resolution: {integrity: sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==} + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] - '@img/sharp-linux-arm64@0.34.4': - resolution: {integrity: sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==} + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linux-arm@0.34.4': - resolution: {integrity: sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==} + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - '@img/sharp-linux-ppc64@0.34.4': - resolution: {integrity: sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==} + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] - '@img/sharp-linux-s390x@0.34.4': - resolution: {integrity: sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==} + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - '@img/sharp-linux-x64@0.34.4': - resolution: {integrity: sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==} + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.34.4': - resolution: {integrity: sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==} + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-x64@0.34.4': - resolution: {integrity: sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==} + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-wasm32@0.34.4': - resolution: {integrity: sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==} + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-win32-arm64@0.34.4': - resolution: {integrity: sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==} + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [win32] - '@img/sharp-win32-ia32@0.34.4': - resolution: {integrity: sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==} + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.34.4': - resolution: {integrity: sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==} + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] @@ -940,8 +1007,8 @@ packages: '@solidjs-use/solid-to-vue@2.3.0': resolution: {integrity: sha512-I2onRwzdYl2eq20M3hcTkVIeYq4hNoBpHvRJB9yzoyXRDSyp7R2glIbvdBzpsXqnTvX7HJhB2KePfxYXFvyJxw==} - '@solidjs/router@0.15.3': - resolution: {integrity: sha512-iEbW8UKok2Oio7o6Y4VTzLj+KFCmQPGEpm1fS3xixwFBdclFVBvaQVeibl1jys4cujfAK5Kn6+uG2uBm3lxOMw==} + '@solidjs/router@0.15.4': + resolution: {integrity: sha512-WOpgg9a9T638cR+5FGbFi/IV4l2FpmBs1GpIMSPa0Ce9vyJN7Wts+X2PqMf9IYn0zUj2MlSJtm1gp7/HI/n5TQ==} peerDependencies: solid-js: ^1.8.6 @@ -972,8 +1039,8 @@ packages: '@types/node@16.9.1': resolution: {integrity: sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==} - '@types/node@24.10.0': - resolution: {integrity: sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==} + '@types/node@24.10.1': + resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==} '@types/pako@2.0.4': resolution: {integrity: sha512-VWDCbrLeVXJM9fihYodcLiIv0ku+AlOa/TQ1SvYOaBuyrSKgEcro95LJyIsJ4vSo6BXIxOKxiJAat04CmST9Fw==} @@ -1120,8 +1187,8 @@ packages: engines: {node: '>=0.10'} hasBin: true - detect-libc@2.1.0: - resolution: {integrity: sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} dijkstrajs@1.0.3: @@ -1588,8 +1655,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} hasBin: true @@ -1606,8 +1673,8 @@ packages: set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - sharp@0.34.4: - resolution: {integrity: sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==} + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} simple-xml-to-json@1.2.3: @@ -1748,8 +1815,8 @@ packages: '@testing-library/jest-dom': optional: true - vite@7.2.0: - resolution: {integrity: sha512-C/Naxf8H0pBx1PA4BdpT+c/5wdqI9ILMdwjSMILw7tVIh3JsxzZqdeTLmmdaoh5MYUEOyBnM9K3o0DzoZ/fe+w==} + vite@7.2.2: + resolution: {integrity: sha512-BxAKBWmIbrDgrokdGZH1IgkIk/5mMHDreLDmCJ0qpyJaAteP8NvMhkwr/ZCQNqNH97bw/dANTE9PDzqwJghfMQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -1949,6 +2016,41 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 + '@biomejs/biome@2.3.5': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 2.3.5 + '@biomejs/cli-darwin-x64': 2.3.5 + '@biomejs/cli-linux-arm64': 2.3.5 + '@biomejs/cli-linux-arm64-musl': 2.3.5 + '@biomejs/cli-linux-x64': 2.3.5 + '@biomejs/cli-linux-x64-musl': 2.3.5 + '@biomejs/cli-win32-arm64': 2.3.5 + '@biomejs/cli-win32-x64': 2.3.5 + + '@biomejs/cli-darwin-arm64@2.3.5': + optional: true + + '@biomejs/cli-darwin-x64@2.3.5': + optional: true + + '@biomejs/cli-linux-arm64-musl@2.3.5': + optional: true + + '@biomejs/cli-linux-arm64@2.3.5': + optional: true + + '@biomejs/cli-linux-x64-musl@2.3.5': + optional: true + + '@biomejs/cli-linux-x64@2.3.5': + optional: true + + '@biomejs/cli-win32-arm64@2.3.5': + optional: true + + '@biomejs/cli-win32-x64@2.3.5': + optional: true + '@bufbuild/protobuf@2.9.0': {} '@corvu/utils@0.4.2(solid-js@1.9.10)': @@ -1956,7 +2058,7 @@ snapshots: '@floating-ui/dom': 1.7.4 solid-js: 1.9.10 - '@emnapi/runtime@1.5.0': + '@emnapi/runtime@1.7.0': dependencies: tslib: 2.8.1 optional: true @@ -2054,90 +2156,98 @@ snapshots: '@img/colour@1.0.0': {} - '@img/sharp-darwin-arm64@0.34.4': + '@img/sharp-darwin-arm64@0.34.5': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.2.3 + '@img/sharp-libvips-darwin-arm64': 1.2.4 optional: true - '@img/sharp-darwin-x64@0.34.4': + '@img/sharp-darwin-x64@0.34.5': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.2.3 + '@img/sharp-libvips-darwin-x64': 1.2.4 optional: true - '@img/sharp-libvips-darwin-arm64@1.2.3': + '@img/sharp-libvips-darwin-arm64@1.2.4': optional: true - '@img/sharp-libvips-darwin-x64@1.2.3': + '@img/sharp-libvips-darwin-x64@1.2.4': optional: true - '@img/sharp-libvips-linux-arm64@1.2.3': + '@img/sharp-libvips-linux-arm64@1.2.4': optional: true - '@img/sharp-libvips-linux-arm@1.2.3': + '@img/sharp-libvips-linux-arm@1.2.4': optional: true - '@img/sharp-libvips-linux-ppc64@1.2.3': + '@img/sharp-libvips-linux-ppc64@1.2.4': optional: true - '@img/sharp-libvips-linux-s390x@1.2.3': + '@img/sharp-libvips-linux-riscv64@1.2.4': optional: true - '@img/sharp-libvips-linux-x64@1.2.3': + '@img/sharp-libvips-linux-s390x@1.2.4': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.2.3': + '@img/sharp-libvips-linux-x64@1.2.4': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.2.3': + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': optional: true - '@img/sharp-linux-arm64@0.34.4': + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true + + '@img/sharp-linux-arm64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.2.3 + '@img/sharp-libvips-linux-arm64': 1.2.4 optional: true - '@img/sharp-linux-arm@0.34.4': + '@img/sharp-linux-arm@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.2.3 + '@img/sharp-libvips-linux-arm': 1.2.4 optional: true - '@img/sharp-linux-ppc64@0.34.4': + '@img/sharp-linux-ppc64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-ppc64': 1.2.3 + '@img/sharp-libvips-linux-ppc64': 1.2.4 optional: true - '@img/sharp-linux-s390x@0.34.4': + '@img/sharp-linux-riscv64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.2.3 + '@img/sharp-libvips-linux-riscv64': 1.2.4 optional: true - '@img/sharp-linux-x64@0.34.4': + '@img/sharp-linux-s390x@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.2.3 + '@img/sharp-libvips-linux-s390x': 1.2.4 optional: true - '@img/sharp-linuxmusl-arm64@0.34.4': + '@img/sharp-linux-x64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 + '@img/sharp-libvips-linux-x64': 1.2.4 optional: true - '@img/sharp-linuxmusl-x64@0.34.4': + '@img/sharp-linuxmusl-arm64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.2.3 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 optional: true - '@img/sharp-wasm32@0.34.4': + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true + + '@img/sharp-wasm32@0.34.5': dependencies: - '@emnapi/runtime': 1.5.0 + '@emnapi/runtime': 1.7.0 optional: true - '@img/sharp-win32-arm64@0.34.4': + '@img/sharp-win32-arm64@0.34.5': optional: true - '@img/sharp-win32-ia32@0.34.4': + '@img/sharp-win32-ia32@0.34.5': optional: true - '@img/sharp-win32-x64@0.34.4': + '@img/sharp-win32-x64@0.34.5': optional: true '@internationalized/date@3.9.0': @@ -2590,7 +2700,7 @@ snapshots: '@solidjs-use/solid-to-vue@2.3.0': {} - '@solidjs/router@0.15.3(solid-js@1.9.10)': + '@solidjs/router@0.15.4(solid-js@1.9.10)': dependencies: solid-js: 1.9.10 @@ -2627,7 +2737,7 @@ snapshots: '@types/node@16.9.1': {} - '@types/node@24.10.0': + '@types/node@24.10.1': dependencies: undici-types: 7.16.0 @@ -2765,7 +2875,7 @@ snapshots: detect-libc@1.0.3: optional: true - detect-libc@2.1.0: {} + detect-libc@2.1.2: {} dijkstrajs@1.0.3: {} @@ -3240,7 +3350,7 @@ snapshots: semver@6.3.1: {} - semver@7.7.2: {} + semver@7.7.3: {} seroval-plugins@1.3.3(seroval@1.3.2): dependencies: @@ -3250,34 +3360,36 @@ snapshots: set-blocking@2.0.0: {} - sharp@0.34.4: + sharp@0.34.5: dependencies: '@img/colour': 1.0.0 - detect-libc: 2.1.0 - semver: 7.7.2 + detect-libc: 2.1.2 + semver: 7.7.3 optionalDependencies: - '@img/sharp-darwin-arm64': 0.34.4 - '@img/sharp-darwin-x64': 0.34.4 - '@img/sharp-libvips-darwin-arm64': 1.2.3 - '@img/sharp-libvips-darwin-x64': 1.2.3 - '@img/sharp-libvips-linux-arm': 1.2.3 - '@img/sharp-libvips-linux-arm64': 1.2.3 - '@img/sharp-libvips-linux-ppc64': 1.2.3 - '@img/sharp-libvips-linux-s390x': 1.2.3 - '@img/sharp-libvips-linux-x64': 1.2.3 - '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 - '@img/sharp-libvips-linuxmusl-x64': 1.2.3 - '@img/sharp-linux-arm': 0.34.4 - '@img/sharp-linux-arm64': 0.34.4 - '@img/sharp-linux-ppc64': 0.34.4 - '@img/sharp-linux-s390x': 0.34.4 - '@img/sharp-linux-x64': 0.34.4 - '@img/sharp-linuxmusl-arm64': 0.34.4 - '@img/sharp-linuxmusl-x64': 0.34.4 - '@img/sharp-wasm32': 0.34.4 - '@img/sharp-win32-arm64': 0.34.4 - '@img/sharp-win32-ia32': 0.34.4 - '@img/sharp-win32-x64': 0.34.4 + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-ia32': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 simple-xml-to-json@1.2.3: {} @@ -3412,7 +3524,7 @@ snapshots: transitivePeerDependencies: - rollup - vite-plugin-solid@2.11.10(solid-js@1.9.10)(vite@7.2.0(@types/node@24.10.0)(sass-embedded@1.93.3)(sass@1.93.3)): + vite-plugin-solid@2.11.10(solid-js@1.9.10)(vite@7.2.2(@types/node@24.10.1)(sass-embedded@1.93.3)(sass@1.93.3)): dependencies: '@babel/core': 7.28.4 '@types/babel__core': 7.20.5 @@ -3420,12 +3532,12 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.9.10 solid-refresh: 0.6.3(solid-js@1.9.10) - vite: 7.2.0(@types/node@24.10.0)(sass-embedded@1.93.3)(sass@1.93.3) - vitefu: 1.1.1(vite@7.2.0(@types/node@24.10.0)(sass-embedded@1.93.3)(sass@1.93.3)) + vite: 7.2.2(@types/node@24.10.1)(sass-embedded@1.93.3)(sass@1.93.3) + vitefu: 1.1.1(vite@7.2.2(@types/node@24.10.1)(sass-embedded@1.93.3)(sass@1.93.3)) transitivePeerDependencies: - supports-color - vite@7.2.0(@types/node@24.10.0)(sass-embedded@1.93.3)(sass@1.93.3): + vite@7.2.2(@types/node@24.10.1)(sass-embedded@1.93.3)(sass@1.93.3): dependencies: esbuild: 0.25.10 fdir: 6.5.0(picomatch@4.0.3) @@ -3434,14 +3546,14 @@ snapshots: rollup: 4.52.1 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.10.0 + '@types/node': 24.10.1 fsevents: 2.3.3 sass: 1.93.3 sass-embedded: 1.93.3 - vitefu@1.1.1(vite@7.2.0(@types/node@24.10.0)(sass-embedded@1.93.3)(sass@1.93.3)): + vitefu@1.1.1(vite@7.2.2(@types/node@24.10.1)(sass-embedded@1.93.3)(sass@1.93.3)): optionalDependencies: - vite: 7.2.0(@types/node@24.10.0)(sass-embedded@1.93.3)(sass@1.93.3) + vite: 7.2.2(@types/node@24.10.1)(sass-embedded@1.93.3)(sass@1.93.3) webworkify@1.5.0: {} diff --git a/src/pages/AssessorPage/Assessor.tsx b/src/pages/AssessorPage/Assessor.tsx index b96efb1..bea34cc 100644 --- a/src/pages/AssessorPage/Assessor.tsx +++ b/src/pages/AssessorPage/Assessor.tsx @@ -8,7 +8,7 @@ import { checkConnection, createPdfOccupancy, createPdfElectrical } from '../../ import { FaSolidThumbsUp } from 'solid-icons/fa' import { _employeeName, _employeeId } from '../../stores/employee' import { useNavigate } from '@solidjs/router' -import { _applicationNo, _date, _optn, _name, _location, _type, _assessor, _feeList, _codeList, _amountList, _signatureAssessor, _signatureApprover, _assessorid, _approvedDate, _assessedDate, _units, _totalUnits, _floorArea } from '../../stores/pdfinfo' +import { _applicationNo, _date, _optn, _name, _location, _type, _assessor, _feeList, _codeList, _amountList, _signatureAssessor, _signatureApprover, _assessorid, _approvedDate, _assessedDate, _units, _totalUnits, _floorArea, _additional, _additionalFeeList, _additionalAmountList, _additionalCodeList, _additionalUnitList } from '../../stores/pdfinfo' import { VsRefresh } from 'solid-icons/vs' import { getApi, getApiMulti, postApi } from '../../utils/functions' @@ -90,6 +90,22 @@ export default () => { _feeList.set(feeList) _codeList.set(accountCodeList) _amountList.set(amountList) + + _additional.set(false) + + if (division === 'occupancy' && bldgadditional) { + const response = await getApiMulti('get-printdetailsfees-bldgadditional', id) + const feeList = response.result + const accountCodeList = response.result2 + const amountList = response.result3 + const unitList = response.result4 + + _additional.set(true) + _additionalFeeList.set(feeList) + _additionalCodeList.set(accountCodeList) + _additionalAmountList.set(amountList) + _additionalUnitList.set(unitList) + } } // const calculateAmounts = () => { @@ -142,6 +158,10 @@ export default () => { // if (division === 'occupancy') op = await getApiMulti('get-opdetails-occupancy', applicationNo) // if (division === 'electrical') op = await getApiMulti('get-opdetails-electrical', applicationNo) + const additionalResult = await getApi('check-bldgadditional-printing', applicationNo) + bldgadditional = additionalResult > 0 + console.log('additionalResult', additionalResult) + const op = await getApiMulti(`get-opdetails-${division}`, applicationNo) setLocation(op.result[0]) @@ -227,9 +247,6 @@ export default () => { await setNewStatus(division, 'FOR ELECTRICAL OFFICIAL RECEIPT VALIDATION', '98', 'ELECORVALIDATE', 0) await updateDocflow(division, application, 'FOR ELECTRICAL ORDER OF PAYMENT PRINTING') } else if (division === 'occupancy') { - const additionalResult = await getApi('check-bldgadditional-approval', application) - bldgadditional = additionalResult > 0 - await setNewStatus(division, 'OCCUPANCY ORDER OF PAYMENT PRINTED', '173', 'OCCOPPRINTED', 1) await setNewStatus(division, 'OCCUPANCY ORDER OF PAYMENT RELEASED', '174', 'OCCOPRELEASED', 1) await setNewStatus(division, 'ORDER OF PAYMENT RELEASE FOR BUREAU OF FIRE', '24', 'OCOOPRELEASE', 0) @@ -242,14 +259,19 @@ export default () => { postTransaction(application) setPrintedApplication(application) setPrinted(true) + if (division === 'electrical') { createPdfElectrical() - } else createPdfOccupancy() + } else if (division === 'occupancy') { + createPdfOccupancy() + } else console.log('building') } } const updateOp = async (division: string) => { - const post = await postApi(`update-opprinted-${division}`, { data: parseInt(applicationId().toString()) }) + const post = await postApi(`update-opprinted-${division}`, { + data: parseInt(applicationId().toString()), + }) return post } @@ -258,12 +280,23 @@ export default () => { const formattedDate = dayjs(today).format('YYYY-MM-DD HH:mm:ss') const statusid = parseInt(applicationId().toString()) - const post = await postApi(`post-newstatus-${division}`, { data: statusid, data2: formattedDate, data3: status, data4: tag, data5: tagword, data6: parseInt(approved.toString()), data7: parseInt(employeeId().toString()) }) + const post = await postApi(`post-newstatus-${division}`, { + data: statusid, + data2: formattedDate, + data3: status, + data4: tag, + data5: tagword, + data6: parseInt(approved.toString()), + data7: parseInt(employeeId().toString()), + }) return post } const updateDocflow = async (division: string, application: string, status: string) => { - await postApi(`update-docflow-${division}`, { data: status, data2: application }) + await postApi(`update-docflow-${division}`, { + data: status, + data2: application, + }) } const getSignatureImage = async (id: number) => { @@ -296,7 +329,11 @@ export default () => { const today = new Date() const formatedDate = dayjs(today).format('YYYY-MM-DD HH:mm:ss') - await postApi('post-esigntransaction', { data: parseInt(id), data2: application, data3: formatedDate }) + await postApi('post-esigntransaction', { + data: parseInt(id), + data2: application, + data3: formatedDate, + }) } const getApprovedDate = async (id: number, application: string) => { @@ -348,6 +385,7 @@ export default () => { createEffect(async () => { if (filter() !== '') { + console.log('empty') if (isBuilding()) await getListForPrinting('building') if (isOccupancy()) await getListForPrinting('occupancy') if (isElectrical()) await getListForPrinting('electrical') @@ -411,9 +449,11 @@ export default () => { {/*

List of Ready to Approve and Sign Building Order of Payments

*/} - -

Under Development

-
+ + +

Under Development

+
+
@@ -502,7 +542,10 @@ export default () => { @@ -590,7 +633,10 @@ export default () => { diff --git a/src/pages/MainPage/Main.tsx b/src/pages/MainPage/Main.tsx index f327c6d..727e2c4 100644 --- a/src/pages/MainPage/Main.tsx +++ b/src/pages/MainPage/Main.tsx @@ -64,23 +64,15 @@ export default () => { } const getListForApprovalElectrical = async () => { - try { - const responseE = await getApiMulti('get-listopapproval-electrical') - setApplicationListElectrical(responseE.result) - setNameListElectrical(responseE.result2) - } catch (error) { - console.error(error) - } + const responseE = await getApiMulti('get-listopapproval-electrical') + setApplicationListElectrical(responseE.result) + setNameListElectrical(responseE.result2) } const getListForApprovalOccupancy = async () => { - try { - const responseO = await getApiMulti('get-listopapproval-occupancy') - setApplicationListOccupancy(responseO.result) - setNameListOccupancy(responseO.result2) - } catch (error) { - console.error(error) - } + const responseO = await getApiMulti('get-listopapproval-occupancy') + setApplicationListOccupancy(responseO.result) + setNameListOccupancy(responseO.result2) } const load = async (division: string) => { @@ -114,7 +106,7 @@ export default () => { const total = calculateTotal(op.result4) const formattedTotal = new Intl.NumberFormat('en-US', { minimumFractionDigits: 2, - // maximumFractionDigits: 2, + maximumFractionDigits: 2, }).format(total) setTotalOp(formattedTotal) setDateOp(dayjs(op.result5[0]).format('MMMM DD, YYYY')) @@ -159,7 +151,10 @@ export default () => { signed = await setNewStatus(division, 'OCCUPANCY ORDER OF PAYMENT APPROVED AND SIGNED', '172', 'OCCOPAPPROVEDSIGNED', 1) updateDocflow(division, application, 'FOR OCCUPANCY RECOMMENDING APPROVAL') - if (bldgadditional) updateDocflow(division, application, 'FOR ADDITIONAL ORDER OF PAYMENT RECOMMENDING APPROVAL') + if (bldgadditional) { + const neededToUpdate = await checkApproval(application, 'FOR ADDITIONAL ORDER OF PAYMENT RECOMMENDING APPROVAL') + if (!neededToUpdate) updateDocflow(division, application, 'FOR ADDITIONAL ORDER OF PAYMENT RECOMMENDING APPROVAL') + } if (!signed) return forprinting = await setNewStatus(division, 'APPROVED FOR PRINTING OF BUREAU OF FIRE AND ORDER OF PAYMENT', '23', 'OCORDEROFPAYMENT', 0) @@ -305,6 +300,11 @@ export default () => { } } + const checkApproval = async (application: string, status: string) => { + const response = await getApi('check-approval', status, application) + return response + } + const logout = async () => { removeEmployee() navigate('/') @@ -362,9 +362,11 @@ export default () => { {/*

List of Ready to Approve and Sign Building Order of Payments

*/} - -

Under Development

-
+ + +

Under Development

+
+
@@ -382,7 +384,7 @@ export default () => {
-

List of Ready to Approve and Sign Occupancy Order of Payments

+

List of Ready to Approve and Sign in Occupancy Order of Payments

diff --git a/src/stores/pdfinfo.ts b/src/stores/pdfinfo.ts index fcd7360..85842fc 100644 --- a/src/stores/pdfinfo.ts +++ b/src/stores/pdfinfo.ts @@ -25,3 +25,7 @@ export const _totalUnits = atom(0) export const _floorArea = atom(0) export const _additional = atom(false) +export const _additionalFeeList = atom([]) +export const _additionalCodeList = atom([]) +export const _additionalAmountList = atom([]) +export const _additionalUnitList = atom([]) diff --git a/src/utils/functions/createPdf.ts b/src/utils/functions/createPdfElectrical.ts similarity index 99% rename from src/utils/functions/createPdf.ts rename to src/utils/functions/createPdfElectrical.ts index bbcc978..e511453 100644 --- a/src/utils/functions/createPdf.ts +++ b/src/utils/functions/createPdfElectrical.ts @@ -27,7 +27,7 @@ export default async () => { const doc = new jsPDF({ orientation: 'p', unit: 'mm', - format: [215.9, 279.4], + format: 'letter', }) const arial = @@ -215,10 +215,13 @@ export default async () => { doc.line(156, newYPosition, 170, newYPosition) + doc.setFont('arial', 'normal') + doc.text(`${PESO}`, 156, newYPosition + 4) + doc.setFont('arial-bold', 'bold') doc.text('Total :', 146, newYPosition + 4) const totalAmount = AMOUNTS.reduce((sum, amount) => sum + parseFloat(amount), 0) - doc.text(`${PESO} ${totalAmount.toLocaleString('en-US', { minimumFractionDigits: 2 })}`, 156, newYPosition + 4) + doc.text(`${totalAmount.toLocaleString('en-US', { minimumFractionDigits: 2 })}`, 159, newYPosition + 4) doc.text('Assessed By :', 16, newYPosition + 12) doc.text('Approved By :', 142, newYPosition + 12) diff --git a/src/utils/functions/createPdfOccupancy.ts b/src/utils/functions/createPdfOccupancy.ts index b9d057c..384d728 100644 --- a/src/utils/functions/createPdfOccupancy.ts +++ b/src/utils/functions/createPdfOccupancy.ts @@ -1,7 +1,7 @@ import jsPDF from 'jspdf' // @ts-ignore import jspdfBarcode from 'jspdf-barcode' -import { _optn, _applicationNo, _date, _name, _type, _location, _assessor, _feeList, _codeList, _amountList, _signatureAssessor, _signatureApprover, _assessorid, _approvedDate, _assessedDate, _units, _totalUnits, _floorArea } from '../../stores/pdfinfo' +import { _optn, _applicationNo, _date, _name, _type, _location, _assessor, _feeList, _codeList, _amountList, _signatureAssessor, _signatureApprover, _assessorid, _approvedDate, _assessedDate, _units, _totalUnits, _floorArea, _additional, _additionalAmountList, _additionalCodeList, _additionalFeeList, _additionalUnitList } from '../../stores/pdfinfo' import dayjs from 'dayjs' // @ts-ignore import QRCode from 'qrcode' @@ -29,10 +29,17 @@ export default async () => { const MULTIPLIED = AMOUNTS.map((amount) => parseInt(amount) * UNITS) + const ADDTLFEES = _additionalFeeList.get() + const ADDTLAMOUNTS = _additionalAmountList.get() + const ADDTLCODES = _additionalCodeList.get() + const ADDTLUNITS = _additionalUnitList.get() + + const ADDTLMULTIPLIED = ADDTLAMOUNTS.map((amount, index) => parseInt(amount) * ADDTLUNITS[index]) + const doc = new jsPDF({ orientation: 'p', unit: 'mm', - format: [215.9, 279.4], + format: 'letter', }) const arial = @@ -265,5 +272,181 @@ export default async () => { doc.setFontSize(6) doc.text('Officer-in-Charge', 154, newYPosition + 37) + if (_additional.get()) { + doc.addPage('letter') + + jspdfBarcode(doc, APPLICATION, { + fontSize: 32, + textColor: '#000000', + x: pageWidth - 35, + y: 38, + textOptions: { align: 'center' }, + }) + + doc.setFont('arial', 'normal') + doc.setFontSize(9) + doc.text(republicText, republicTextX, 14) + doc.setFont('arial-bold', 'bold') + doc.setFontSize(10) + doc.text(officeText, officeTextX, 19) + doc.setFont('arial', 'normal') + doc.setFontSize(9) + doc.text(cityText, cityTextX, 24) + + doc.addImage(lungsod, 'PNG', 14, 8, 18, 18, 'lungsod', 'NONE', 0) + doc.addImage(ocbo, 'PNG', pageWidth - 34, 8, 18, 18, 'ocbo', 'NONE', 0) + + const opText = 'ORDER OF PAYMENT' + const opTextWidth = getTextWidth(opText, 8.75) + const opTextX = (pageWidth - opTextWidth) / 2 + doc.setFont('arial-bold', 'bold') + doc.setFontSize(9) + doc.text(opText, opTextX, 34) + + const divisionText = 'BUILDING ADDITIONAL PERMIT' + const divisionTextWidth = getTextWidth(divisionText, 7.25) + const divisionTextX = (pageWidth - divisionTextWidth) / 2 + doc.setFont('arial', 'normal') + doc.setFontSize(8) + doc.text(divisionText, divisionTextX, 38) + + const optnText = 'OPTN:' + const optnTextX = 16 + doc.setFont('arial-bold', 'bold') + doc.setFontSize(8) + doc.text(optnText, optnTextX, 38) + + const optnContentX = 25 + doc.setFontSize(8) + doc.text(OPTN, optnContentX, 38) + + const toText = `TO: The City Treasurer's Office` + const toTextX = 16 + doc.setFont('arial', 'normal') + doc.setFontSize(8) + doc.text(toText, toTextX, 46) + + doc.text('Please accept payment for fee specified herunder', 16, 50) + + doc.text('Application No. :', pageWidth - 60, 46) + + doc.setFont('arial-bold', 'bold') + doc.text(APPLICATION, pageWidth - 38, 46) + + doc.setFont('arial', 'normal') + doc.text('Approved Date :', pageWidth - 60, 50) + + doc.setFont('arial-bold', 'bold') + doc.text(DATE, pageWidth - 38, 50) + + doc.setFont('arial', 'normal') + doc.text('Name of Applicant :', 23.4, 58) + + doc.setFont('arial-bold', 'bold') + doc.text(NAME, 50, 58) + + doc.setFont('arial', 'normal') + doc.text('Location of Construction :', 16, 62) + + doc.setFont('arial-bold', 'bold') + doc.text(LOCATION, 50, 62) + + doc.setFont('arial', 'normal') + doc.text('Type of Use :', 31.2, 66) + + doc.setFont('arial-bold', 'bold') + doc.text(TYPE, 50, 66) + + doc.text('ACCOUNT DESCRIPTION', 16, 74) + doc.text('ACCOUNT CODE', getTextWidth('ACCOUNT DESCRIPTION', 8) + 40, 74) + doc.text('AMOUNT', getTextWidth('ACCOUNT DESCRIPTION', 8) + getTextWidth('ACCOUNT CODE', 8) + 65, 74) + doc.text('UNIT', getTextWidth('ACCOUNT DESCRIPTION', 8) + getTextWidth('ACCOUNT CODE', 8) + 82, 74) + + doc.setFont('arial', 'normal') + + let yPosition = 82 + ADDTLFEES.forEach((fee) => { + doc.text(fee, 16, yPosition) + yPosition += 4 + }) + + yPosition = 82 + ADDTLCODES.forEach((code) => { + doc.text(code, 76, yPosition) + yPosition += 4 + }) + + yPosition = 82 + ADDTLAMOUNTS.forEach((amount) => { + doc.text(`${PESO} ${parseInt(amount).toLocaleString('en-US', { minimumFractionDigits: 2 })}`, 122, yPosition) + yPosition += 4 + }) + + yPosition = 82 + ADDTLAMOUNTS.forEach(() => { + doc.text(`x${UNITS}`, 140, yPosition) + yPosition += 4 + }) + + yPosition = 82 + ADDTLAMOUNTS.forEach(() => { + doc.text('=', 148, yPosition) + yPosition += 4 + }) + + yPosition = 82 + ADDTLMULTIPLIED.forEach((amount) => { + doc.text(`${PESO} ${parseInt(amount.toString()).toLocaleString('en-US', { minimumFractionDigits: 2 })}`, 156, yPosition) + yPosition += 4 + }) + + let newYPosition = yPosition + + doc.line(156, newYPosition, 170, newYPosition) + + doc.setFont('arial', 'normal') + doc.text(`${PESO}`, 156, newYPosition + 4) + + doc.setFont('arial-bold', 'bold') + doc.text('Total :', 146, newYPosition + 4) + const totalAmount = ADDTLMULTIPLIED.reduce((sum, amount) => sum + parseFloat(amount.toString()), 0) + doc.text(`${totalAmount.toLocaleString('en-US', { minimumFractionDigits: 2 })}`, 159, newYPosition + 4) + + doc.text('No. of Units:', 16, newYPosition + 4) + doc.text(TOTALUNITS.toString(), 34, newYPosition + 4) + doc.text('Actual Floor Area:', 16, newYPosition + 8) + doc.text(FLOORAREA.toLocaleString('en-US', { minimumFractionDigits: 2 }), 42, newYPosition + 8) + + doc.text('Assessed By :', 16, newYPosition + 16) + doc.text('Approved By :', 142, newYPosition + 16) + + doc.text(ASSESSOR, 16, newYPosition + 34) + doc.text(APPROVER, 142, newYPosition + 34) + + doc.addImage(assessorQr, 'PNG', 16, newYPosition + 18, 14, 14, 'assessorQr', 'NONE', 0) + doc.addImage(_signatureAssessor.get(), 'PNG', 30, newYPosition + 18, 10, 5.9, 'signatureAssessor', 'NONE', 0) + doc.setFont('arial', 'normal') + doc.setFontSize(4) + doc.text('Digitally signed by :', 30, newYPosition + 26) + doc.text(ASSESSOR, 30, newYPosition + 28) + doc.text('Date: ' + dayjs(_assessedDate.get()).format('YYYY-MM-DD HH:mm:ss'), 30, newYPosition + 30) + + doc.addImage(approverQr, 'PNG', 142, newYPosition + 18, 14, 14, 'approverQr', 'NONE', 0) + doc.addImage(_signatureApprover.get(), 'PNG', 156, newYPosition + 18, 41.4, 5.9, 'signatureApprover', 'NONE', 0) + doc.text('Digitally signed by :', 156, newYPosition + 26) + doc.text(APPROVER, 156, newYPosition + 28) + doc.text('Date: ' + dayjs(_approvedDate.get()).format('YYYY-MM-DD HH:mm:ss'), 156, newYPosition + 30) + + doc.setFont('arial-bold', 'bold') + doc.setFontSize(7) + doc.text('Please use the OPTN when paying online.', 16, newYPosition + 44) + const note = doc.splitTextToSize('Note: The 72 Hours Transaction Policy of the City Mayor, shall commence upon submission of the Bureau of Fire Protection clearance/certificate and other requirement stated in the notice to comply to be issued by this office.', newYPosition + 50) + doc.text(note, 16, newYPosition + 48) + + doc.setFont('arial', 'normal') + doc.setFontSize(6) + doc.text('Officer-in-Charge', 154, newYPosition + 37) + } + doc.save(`OP-${APPLICATION}.pdf`) } diff --git a/src/utils/functions/index.ts b/src/utils/functions/index.ts index 65794fc..090badd 100644 --- a/src/utils/functions/index.ts +++ b/src/utils/functions/index.ts @@ -1,5 +1,6 @@ export { default as checkConnection } from './checkConnection' -export { default as createPdf } from './createPdf' +export { default as createPdfElectrical } from './createPdfElectrical' +export { default as createPdfOccupancy } from './createPdfOccupancy' export { default as postApi } from './postApi' export { default as getApi } from './getApi' export { default as getApiMulti } from './getApiMulti'