First upload
This commit is contained in:
42
.gitignore
vendored
Normal file
42
.gitignore
vendored
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
# Dependencias
|
||||||
|
node_modules/
|
||||||
|
jspm_packages/
|
||||||
|
|
||||||
|
# Compilación y Distribución
|
||||||
|
dist/
|
||||||
|
lib-cov/
|
||||||
|
coverage/
|
||||||
|
*.lcov
|
||||||
|
.cache/
|
||||||
|
.parcel-cache/
|
||||||
|
.turbo/
|
||||||
|
|
||||||
|
# Logs
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
lerna-debug.log*
|
||||||
|
|
||||||
|
# Entornos (Variables sensibles)
|
||||||
|
.env
|
||||||
|
.env.local
|
||||||
|
.env.development.local
|
||||||
|
.env.test.local
|
||||||
|
.env.production.local
|
||||||
|
|
||||||
|
# Editores y Sistema
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
.vscode/
|
||||||
|
!.vscode/extensions.json
|
||||||
|
.idea/
|
||||||
|
*.suo
|
||||||
|
*.ntvs*
|
||||||
|
*.njsproj
|
||||||
|
*.sln
|
||||||
|
*.sw?
|
||||||
|
|
||||||
|
# Tests y herramientas
|
||||||
|
.nyc_output
|
||||||
|
.eslintcache
|
||||||
|
.stylelintcache
|
||||||
475
bun.lock
Normal file
475
bun.lock
Normal file
@@ -0,0 +1,475 @@
|
|||||||
|
{
|
||||||
|
"lockfileVersion": 1,
|
||||||
|
"configVersion": 1,
|
||||||
|
"workspaces": {
|
||||||
|
"": {
|
||||||
|
"name": "sigpro",
|
||||||
|
"dependencies": {
|
||||||
|
"@tailwindcss/vite": "^4.2.1",
|
||||||
|
"ag-grid-community": "^35.1.0",
|
||||||
|
"ag-grid-enterprise": "^35.1.0",
|
||||||
|
"fast-xml-parser": "^5.5.3",
|
||||||
|
"hono": "^4.12.7",
|
||||||
|
"mariadb": "^3.5.2",
|
||||||
|
"nodemailer": "^8.0.2",
|
||||||
|
"sharp": "^0.34.5",
|
||||||
|
"sigpro": "^1.0.9",
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@iconify/json": "^2.2.443",
|
||||||
|
"@iconify/tailwind4": "^1.2.1",
|
||||||
|
"concurrently": "^9.2.1",
|
||||||
|
"daisyui": "^5.5.19",
|
||||||
|
"tailwindcss": "^4.2.1",
|
||||||
|
"vite": "^8.0.0",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"packages": {
|
||||||
|
"@antfu/install-pkg": ["@antfu/install-pkg@1.1.0", "", { "dependencies": { "package-manager-detector": "^1.3.0", "tinyexec": "^1.0.1" } }, "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ=="],
|
||||||
|
|
||||||
|
"@cyberalien/svg-utils": ["@cyberalien/svg-utils@1.1.5", "", { "dependencies": { "@iconify/types": "^2.0.0" } }, "sha512-U/80ApAyEV4xdIFDcV/g56CFy9Niccmuxte64XtRIRxHiMttOQppYjms7xX2OHAgh6nCGX43jqfHoBvZcTj9mQ=="],
|
||||||
|
|
||||||
|
"@emnapi/core": ["@emnapi/core@1.9.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.0", "tslib": "^2.4.0" } }, "sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w=="],
|
||||||
|
|
||||||
|
"@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="],
|
||||||
|
|
||||||
|
"@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg=="],
|
||||||
|
|
||||||
|
"@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="],
|
||||||
|
|
||||||
|
"@esbuild/android-arm": ["@esbuild/android-arm@0.21.5", "", { "os": "android", "cpu": "arm" }, "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg=="],
|
||||||
|
|
||||||
|
"@esbuild/android-arm64": ["@esbuild/android-arm64@0.21.5", "", { "os": "android", "cpu": "arm64" }, "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A=="],
|
||||||
|
|
||||||
|
"@esbuild/android-x64": ["@esbuild/android-x64@0.21.5", "", { "os": "android", "cpu": "x64" }, "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA=="],
|
||||||
|
|
||||||
|
"@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.21.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ=="],
|
||||||
|
|
||||||
|
"@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.21.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw=="],
|
||||||
|
|
||||||
|
"@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.21.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g=="],
|
||||||
|
|
||||||
|
"@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.21.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ=="],
|
||||||
|
|
||||||
|
"@esbuild/linux-arm": ["@esbuild/linux-arm@0.21.5", "", { "os": "linux", "cpu": "arm" }, "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA=="],
|
||||||
|
|
||||||
|
"@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.21.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q=="],
|
||||||
|
|
||||||
|
"@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.21.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg=="],
|
||||||
|
|
||||||
|
"@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg=="],
|
||||||
|
|
||||||
|
"@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg=="],
|
||||||
|
|
||||||
|
"@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.21.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w=="],
|
||||||
|
|
||||||
|
"@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA=="],
|
||||||
|
|
||||||
|
"@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.21.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A=="],
|
||||||
|
|
||||||
|
"@esbuild/linux-x64": ["@esbuild/linux-x64@0.21.5", "", { "os": "linux", "cpu": "x64" }, "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ=="],
|
||||||
|
|
||||||
|
"@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.21.5", "", { "os": "none", "cpu": "x64" }, "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg=="],
|
||||||
|
|
||||||
|
"@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.21.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow=="],
|
||||||
|
|
||||||
|
"@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.21.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg=="],
|
||||||
|
|
||||||
|
"@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.21.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A=="],
|
||||||
|
|
||||||
|
"@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.21.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA=="],
|
||||||
|
|
||||||
|
"@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw=="],
|
||||||
|
|
||||||
|
"@iconify/json": ["@iconify/json@2.2.443", "", { "dependencies": { "@iconify/types": "*", "pathe": "^2.0.3" } }, "sha512-xyDqw1FeuNWPhYj+Sp2I1kyD6J5U5s8GxEW+dgIY1/Vl0b65t+PlRVCxEBtx73CanfDUPrSEHbxKQJwzXrcV/w=="],
|
||||||
|
|
||||||
|
"@iconify/tailwind4": ["@iconify/tailwind4@1.2.1", "", { "dependencies": { "@iconify/tools": "^5.0.2", "@iconify/types": "^2.0.0", "@iconify/utils": "^3.1.0" }, "peerDependencies": { "tailwindcss": ">= 4.0.0" } }, "sha512-Hd7k8y7uzT3hk8ltw0jGku0r0wA8sc3d2iMvVTYv/9tMxBb+frZtWZGD9hDMU3EYuE+lMn58wi2lS8R2ZbwFcQ=="],
|
||||||
|
|
||||||
|
"@iconify/tools": ["@iconify/tools@5.0.3", "", { "dependencies": { "@cyberalien/svg-utils": "^1.1.1", "@iconify/types": "^2.0.0", "@iconify/utils": "^3.1.0", "fflate": "^0.8.2", "modern-tar": "^0.7.3", "pathe": "^2.0.3", "svgo": "^4.0.0" } }, "sha512-W5nbH5fNv20TvU49Al19Foos/ViAnmppbCNV9ieGl6/dRMDRzxeFol6peXX/NAgaOytQwZZxTTJRq/Kxd4eWsA=="],
|
||||||
|
|
||||||
|
"@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="],
|
||||||
|
|
||||||
|
"@iconify/utils": ["@iconify/utils@3.1.0", "", { "dependencies": { "@antfu/install-pkg": "^1.1.0", "@iconify/types": "^2.0.0", "mlly": "^1.8.0" } }, "sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw=="],
|
||||||
|
|
||||||
|
"@img/colour": ["@img/colour@1.1.0", "", {}, "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ=="],
|
||||||
|
|
||||||
|
"@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="],
|
||||||
|
|
||||||
|
"@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.4" }, "os": "darwin", "cpu": "x64" }, "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw=="],
|
||||||
|
|
||||||
|
"@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g=="],
|
||||||
|
|
||||||
|
"@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg=="],
|
||||||
|
|
||||||
|
"@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A=="],
|
||||||
|
|
||||||
|
"@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw=="],
|
||||||
|
|
||||||
|
"@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.2.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA=="],
|
||||||
|
|
||||||
|
"@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.2.4", "", { "os": "linux", "cpu": "none" }, "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA=="],
|
||||||
|
|
||||||
|
"@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.2.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ=="],
|
||||||
|
|
||||||
|
"@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw=="],
|
||||||
|
|
||||||
|
"@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw=="],
|
||||||
|
|
||||||
|
"@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg=="],
|
||||||
|
|
||||||
|
"@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.2.4" }, "os": "linux", "cpu": "arm" }, "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw=="],
|
||||||
|
|
||||||
|
"@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg=="],
|
||||||
|
|
||||||
|
"@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.2.4" }, "os": "linux", "cpu": "ppc64" }, "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA=="],
|
||||||
|
|
||||||
|
"@img/sharp-linux-riscv64": ["@img/sharp-linux-riscv64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.2.4" }, "os": "linux", "cpu": "none" }, "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw=="],
|
||||||
|
|
||||||
|
"@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.2.4" }, "os": "linux", "cpu": "s390x" }, "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg=="],
|
||||||
|
|
||||||
|
"@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ=="],
|
||||||
|
|
||||||
|
"@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg=="],
|
||||||
|
|
||||||
|
"@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q=="],
|
||||||
|
|
||||||
|
"@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.5", "", { "dependencies": { "@emnapi/runtime": "^1.7.0" }, "cpu": "none" }, "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw=="],
|
||||||
|
|
||||||
|
"@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.34.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g=="],
|
||||||
|
|
||||||
|
"@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg=="],
|
||||||
|
|
||||||
|
"@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="],
|
||||||
|
|
||||||
|
"@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],
|
||||||
|
|
||||||
|
"@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="],
|
||||||
|
|
||||||
|
"@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
|
||||||
|
|
||||||
|
"@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
|
||||||
|
|
||||||
|
"@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
|
||||||
|
|
||||||
|
"@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.1", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" } }, "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A=="],
|
||||||
|
|
||||||
|
"@oxc-project/runtime": ["@oxc-project/runtime@0.115.0", "", {}, "sha512-Rg8Wlt5dCbXhQnsXPrkOjL1DTSvXLgb2R/KYfnf1/K+R0k6UMLEmbQXPM+kwrWqSmWA2t0B1EtHy2/3zikQpvQ=="],
|
||||||
|
|
||||||
|
"@oxc-project/types": ["@oxc-project/types@0.115.0", "", {}, "sha512-4n91DKnebUS4yjUHl2g3/b2T+IUdCfmoZGhmwsovZCDaJSs+QkVAM+0AqqTxHSsHfeiMuueT75cZaZcT/m0pSw=="],
|
||||||
|
|
||||||
|
"@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-rc.9", "", { "os": "android", "cpu": "arm64" }, "sha512-lcJL0bN5hpgJfSIz/8PIf02irmyL43P+j1pTCfbD1DbLkmGRuFIA4DD3B3ZOvGqG0XiVvRznbKtN0COQVaKUTg=="],
|
||||||
|
|
||||||
|
"@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-rc.9", "", { "os": "darwin", "cpu": "arm64" }, "sha512-J7Zk3kLYFsLtuH6U+F4pS2sYVzac0qkjcO5QxHS7OS7yZu2LRs+IXo+uvJ/mvpyUljDJ3LROZPoQfgBIpCMhdQ=="],
|
||||||
|
|
||||||
|
"@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-rc.9", "", { "os": "darwin", "cpu": "x64" }, "sha512-iwtmmghy8nhfRGeNAIltcNXzD0QMNaaA5U/NyZc1Ia4bxrzFByNMDoppoC+hl7cDiUq5/1CnFthpT9n+UtfFyg=="],
|
||||||
|
|
||||||
|
"@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-rc.9", "", { "os": "freebsd", "cpu": "x64" }, "sha512-DLFYI78SCiZr5VvdEplsVC2Vx53lnA4/Ga5C65iyldMVaErr86aiqCoNBLl92PXPfDtUYjUh+xFFor40ueNs4Q=="],
|
||||||
|
|
||||||
|
"@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.9", "", { "os": "linux", "cpu": "arm" }, "sha512-CsjTmTwd0Hri6iTw/DRMK7kOZ7FwAkrO4h8YWKoX/kcj833e4coqo2wzIFywtch/8Eb5enQ/lwLM7w6JX1W5RQ=="],
|
||||||
|
|
||||||
|
"@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-rc.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-2x9O2JbSPxpxMDhP9Z74mahAStibTlrBMW0520+epJH5sac7/LwZW5Bmg/E6CXuEF53JJFW509uP+lSedaUNxg=="],
|
||||||
|
|
||||||
|
"@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-rc.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-JA1QRW31ogheAIRhIg9tjMfsYbglXXYGNPLdPEYrwFxdbkQCAzvpSCSHCDWNl4hTtrol8WeboCSEpjdZK8qrCg=="],
|
||||||
|
|
||||||
|
"@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.9", "", { "os": "linux", "cpu": "ppc64" }, "sha512-aOKU9dJheda8Kj8Y3w9gnt9QFOO+qKPAl8SWd7JPHP+Cu0EuDAE5wokQubLzIDQWg2myXq2XhTpOVS07qqvT+w=="],
|
||||||
|
|
||||||
|
"@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.0.0-rc.9", "", { "os": "linux", "cpu": "s390x" }, "sha512-OalO94fqj7IWRn3VdXWty75jC5dk4C197AWEuMhIpvVv2lw9fiPhud0+bW2ctCxb3YoBZor71QHbY+9/WToadA=="],
|
||||||
|
|
||||||
|
"@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-rc.9", "", { "os": "linux", "cpu": "x64" }, "sha512-cVEl1vZtBsBZna3YMjGXNvnYYrOJ7RzuWvZU0ffvJUexWkukMaDuGhUXn0rjnV0ptzGVkvc+vW9Yqy6h8YX4pg=="],
|
||||||
|
|
||||||
|
"@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-rc.9", "", { "os": "linux", "cpu": "x64" }, "sha512-UzYnKCIIc4heAKgI4PZ3dfBGUZefGCJ1TPDuLHoCzgrMYPb5Rv6TLFuYtyM4rWyHM7hymNdsg5ik2C+UD9VDbA=="],
|
||||||
|
|
||||||
|
"@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.0-rc.9", "", { "os": "none", "cpu": "arm64" }, "sha512-+6zoiF+RRyf5cdlFQP7nm58mq7+/2PFaY2DNQeD4B87N36JzfF/l9mdBkkmTvSYcYPE8tMh/o3cRlsx1ldLfog=="],
|
||||||
|
|
||||||
|
"@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-rc.9", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.1.1" }, "cpu": "none" }, "sha512-rgFN6sA/dyebil3YTlL2evvi/M+ivhfnyxec7AccTpRPccno/rPoNlqybEZQBkcbZu8Hy+eqNJCqfBR8P7Pg8g=="],
|
||||||
|
|
||||||
|
"@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-rc.9", "", { "os": "win32", "cpu": "arm64" }, "sha512-lHVNUG/8nlF1IQk1C0Ci574qKYyty2goMiPlRqkC5R+3LkXDkL5Dhx8ytbxq35m+pkHVIvIxviD+TWLdfeuadA=="],
|
||||||
|
|
||||||
|
"@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-rc.9", "", { "os": "win32", "cpu": "x64" }, "sha512-G0oA4+w1iY5AGi5HcDTxWsoxF509hrFIPB2rduV5aDqS9FtDg1CAfa7V34qImbjfhIcA8C+RekocJZA96EarwQ=="],
|
||||||
|
|
||||||
|
"@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.9", "", {}, "sha512-w6oiRWgEBl04QkFZgmW+jnU1EC9b57Oihi2ot3HNWIQRqgHp5PnYDia5iZ5FF7rpa4EQdiqMDXjlqKGXBhsoXw=="],
|
||||||
|
|
||||||
|
"@tailwindcss/node": ["@tailwindcss/node@4.2.1", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.19.0", "jiti": "^2.6.1", "lightningcss": "1.31.1", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.2.1" } }, "sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide": ["@tailwindcss/oxide@4.2.1", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.2.1", "@tailwindcss/oxide-darwin-arm64": "4.2.1", "@tailwindcss/oxide-darwin-x64": "4.2.1", "@tailwindcss/oxide-freebsd-x64": "4.2.1", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.1", "@tailwindcss/oxide-linux-arm64-gnu": "4.2.1", "@tailwindcss/oxide-linux-arm64-musl": "4.2.1", "@tailwindcss/oxide-linux-x64-gnu": "4.2.1", "@tailwindcss/oxide-linux-x64-musl": "4.2.1", "@tailwindcss/oxide-wasm32-wasi": "4.2.1", "@tailwindcss/oxide-win32-arm64-msvc": "4.2.1", "@tailwindcss/oxide-win32-x64-msvc": "4.2.1" } }, "sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.2.1", "", { "os": "android", "cpu": "arm64" }, "sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.2.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.2.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.2.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.2.1", "", { "os": "linux", "cpu": "arm" }, "sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.2.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.2.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.2.1", "", { "os": "linux", "cpu": "x64" }, "sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.2.1", "", { "os": "linux", "cpu": "x64" }, "sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.2.1", "", { "dependencies": { "@emnapi/core": "^1.8.1", "@emnapi/runtime": "^1.8.1", "@emnapi/wasi-threads": "^1.1.0", "@napi-rs/wasm-runtime": "^1.1.1", "@tybys/wasm-util": "^0.10.1", "tslib": "^2.8.1" }, "cpu": "none" }, "sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.2.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.2.1", "", { "os": "win32", "cpu": "x64" }, "sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ=="],
|
||||||
|
|
||||||
|
"@tailwindcss/vite": ["@tailwindcss/vite@4.2.1", "", { "dependencies": { "@tailwindcss/node": "4.2.1", "@tailwindcss/oxide": "4.2.1", "tailwindcss": "4.2.1" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" } }, "sha512-TBf2sJjYeb28jD2U/OhwdW0bbOsxkWPwQ7SrqGf9sVcoYwZj7rkXljroBO9wKBut9XnmQLXanuDUeqQK0lGg/w=="],
|
||||||
|
|
||||||
|
"@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="],
|
||||||
|
|
||||||
|
"@types/geojson": ["@types/geojson@7946.0.16", "", {}, "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg=="],
|
||||||
|
|
||||||
|
"@types/node": ["@types/node@25.4.0", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-9wLpoeWuBlcbBpOY3XmzSTG3oscB6xjBEEtn+pYXTfhyXhIxC5FsBer2KTopBlvKEiW9l13po9fq+SJY/5lkhw=="],
|
||||||
|
|
||||||
|
"acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="],
|
||||||
|
|
||||||
|
"ag-charts-community": ["ag-charts-community@13.1.0", "", { "dependencies": { "ag-charts-core": "13.1.0", "ag-charts-locale": "13.1.0", "ag-charts-types": "13.1.0" } }, "sha512-w+uFTjxlAoTq1+8tgUORtB/zr9jm38ibXzbbWnkBP9Dep9yahi5a1jZL7yExAX35uq3g9QtjTh0Oj/QPDBQ9Ew=="],
|
||||||
|
|
||||||
|
"ag-charts-core": ["ag-charts-core@13.1.0", "", { "dependencies": { "ag-charts-types": "13.1.0" } }, "sha512-mLHJZ8oU5CPeLRURescdISCtMsiiA/m4d1iBr6aQBEgiTVogRMGpFpsYNtQiYtoW2sRh+62I9sN8fhC3JQjX/g=="],
|
||||||
|
|
||||||
|
"ag-charts-enterprise": ["ag-charts-enterprise@13.1.0", "", { "dependencies": { "ag-charts-community": "13.1.0", "ag-charts-core": "13.1.0" } }, "sha512-WyKIqvkOdtdvEJxq76hjTacXTCpIR2lq1JDMYc5MtoHYtiVt1KHApsxS0nbutp/CxGKRgdOqJtxUF+3r33pgPw=="],
|
||||||
|
|
||||||
|
"ag-charts-locale": ["ag-charts-locale@13.1.0", "", {}, "sha512-mPgJnVsOI4Cf17CAlRh8BvLz19e165sdQJeUXNaB7M+DPB+pxODOcfx4oqZlR4Wc8Zu++TGb/2ueHa/aeV2qeQ=="],
|
||||||
|
|
||||||
|
"ag-charts-types": ["ag-charts-types@13.1.0", "", {}, "sha512-DytRM3CXli+Y013SC1Mr8lQBrhVTACK+11ilDHOhwUM0sRpmGuR51XFGcBKOliW1Vas1AycP31Cm3Pp0jx3hqw=="],
|
||||||
|
|
||||||
|
"ag-grid-community": ["ag-grid-community@35.1.0", "", { "dependencies": { "ag-charts-types": "13.1.0" } }, "sha512-yWFQfRNjv3KUBkHHzFdDOYGjPcDMU0B8Up4qG651diFlGRUGEGVs94SK73niWvk1FDZdpV9oWrwq3f30/qAoVg=="],
|
||||||
|
|
||||||
|
"ag-grid-enterprise": ["ag-grid-enterprise@35.1.0", "", { "dependencies": { "ag-grid-community": "35.1.0" }, "optionalDependencies": { "ag-charts-community": "13.1.0", "ag-charts-enterprise": "13.1.0" } }, "sha512-Zhod3fpgWa9KE0JNFkkkb8/3Qv66UR9KF3wFyCz++wQUtQm5wdExul4UA8wm1ukvBmD6QyBLQ5Cs9zDnIEb0uQ=="],
|
||||||
|
|
||||||
|
"ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
|
||||||
|
|
||||||
|
"ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||||
|
|
||||||
|
"boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="],
|
||||||
|
|
||||||
|
"chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
|
||||||
|
|
||||||
|
"cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="],
|
||||||
|
|
||||||
|
"color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
|
||||||
|
|
||||||
|
"color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
|
||||||
|
|
||||||
|
"commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="],
|
||||||
|
|
||||||
|
"concurrently": ["concurrently@9.2.1", "", { "dependencies": { "chalk": "4.1.2", "rxjs": "7.8.2", "shell-quote": "1.8.3", "supports-color": "8.1.1", "tree-kill": "1.2.2", "yargs": "17.7.2" }, "bin": { "conc": "dist/bin/concurrently.js", "concurrently": "dist/bin/concurrently.js" } }, "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng=="],
|
||||||
|
|
||||||
|
"confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="],
|
||||||
|
|
||||||
|
"css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="],
|
||||||
|
|
||||||
|
"css-tree": ["css-tree@3.1.0", "", { "dependencies": { "mdn-data": "2.12.2", "source-map-js": "^1.0.1" } }, "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w=="],
|
||||||
|
|
||||||
|
"css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="],
|
||||||
|
|
||||||
|
"csso": ["csso@5.0.5", "", { "dependencies": { "css-tree": "~2.2.0" } }, "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ=="],
|
||||||
|
|
||||||
|
"daisyui": ["daisyui@5.5.19", "", {}, "sha512-pbFAkl1VCEh/MPCeclKL61I/MqRIFFhNU7yiXoDDRapXN4/qNCoMxeCCswyxEEhqL5eiTTfwHvucFtOE71C9sA=="],
|
||||||
|
|
||||||
|
"denque": ["denque@2.1.0", "", {}, "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw=="],
|
||||||
|
|
||||||
|
"detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
|
||||||
|
|
||||||
|
"dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="],
|
||||||
|
|
||||||
|
"domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="],
|
||||||
|
|
||||||
|
"domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="],
|
||||||
|
|
||||||
|
"domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="],
|
||||||
|
|
||||||
|
"emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
|
||||||
|
|
||||||
|
"enhanced-resolve": ["enhanced-resolve@5.20.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.0" } }, "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA=="],
|
||||||
|
|
||||||
|
"entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="],
|
||||||
|
|
||||||
|
"esbuild": ["esbuild@0.21.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.21.5", "@esbuild/android-arm": "0.21.5", "@esbuild/android-arm64": "0.21.5", "@esbuild/android-x64": "0.21.5", "@esbuild/darwin-arm64": "0.21.5", "@esbuild/darwin-x64": "0.21.5", "@esbuild/freebsd-arm64": "0.21.5", "@esbuild/freebsd-x64": "0.21.5", "@esbuild/linux-arm": "0.21.5", "@esbuild/linux-arm64": "0.21.5", "@esbuild/linux-ia32": "0.21.5", "@esbuild/linux-loong64": "0.21.5", "@esbuild/linux-mips64el": "0.21.5", "@esbuild/linux-ppc64": "0.21.5", "@esbuild/linux-riscv64": "0.21.5", "@esbuild/linux-s390x": "0.21.5", "@esbuild/linux-x64": "0.21.5", "@esbuild/netbsd-x64": "0.21.5", "@esbuild/openbsd-x64": "0.21.5", "@esbuild/sunos-x64": "0.21.5", "@esbuild/win32-arm64": "0.21.5", "@esbuild/win32-ia32": "0.21.5", "@esbuild/win32-x64": "0.21.5" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw=="],
|
||||||
|
|
||||||
|
"escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
|
||||||
|
|
||||||
|
"fast-xml-builder": ["fast-xml-builder@1.1.2", "", { "dependencies": { "path-expression-matcher": "^1.1.3" } }, "sha512-NJAmiuVaJEjVa7TjLZKlYd7RqmzOC91EtPFXHvlTcqBVo50Qh7XV5IwvXi1c7NRz2Q/majGX9YLcwJtWgHjtkA=="],
|
||||||
|
|
||||||
|
"fast-xml-parser": ["fast-xml-parser@5.5.3", "", { "dependencies": { "fast-xml-builder": "^1.1.2", "path-expression-matcher": "^1.1.3", "strnum": "^2.1.2" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-Ymnuefk6VzAhT3SxLzVUw+nMio/wB1NGypHkgetwtXcK1JfryaHk4DWQFGVwQ9XgzyS5iRZ7C2ZGI4AMsdMZ6A=="],
|
||||||
|
|
||||||
|
"fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
|
||||||
|
|
||||||
|
"fflate": ["fflate@0.8.2", "", {}, "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A=="],
|
||||||
|
|
||||||
|
"fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
|
||||||
|
|
||||||
|
"get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="],
|
||||||
|
|
||||||
|
"graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
|
||||||
|
|
||||||
|
"has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
|
||||||
|
|
||||||
|
"hono": ["hono@4.12.7", "", {}, "sha512-jq9l1DM0zVIvsm3lv9Nw9nlJnMNPOcAtsbsgiUhWcFzPE99Gvo6yRTlszSLLYacMeQ6quHD6hMfId8crVHvexw=="],
|
||||||
|
|
||||||
|
"iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="],
|
||||||
|
|
||||||
|
"is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
|
||||||
|
|
||||||
|
"jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="],
|
||||||
|
|
||||||
|
"lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="],
|
||||||
|
|
||||||
|
"lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="],
|
||||||
|
|
||||||
|
"lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="],
|
||||||
|
|
||||||
|
"lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.32.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="],
|
||||||
|
|
||||||
|
"lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.32.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="],
|
||||||
|
|
||||||
|
"lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="],
|
||||||
|
|
||||||
|
"lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="],
|
||||||
|
|
||||||
|
"lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="],
|
||||||
|
|
||||||
|
"lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="],
|
||||||
|
|
||||||
|
"lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="],
|
||||||
|
|
||||||
|
"lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.32.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="],
|
||||||
|
|
||||||
|
"lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="],
|
||||||
|
|
||||||
|
"lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
|
||||||
|
|
||||||
|
"magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
|
||||||
|
|
||||||
|
"mariadb": ["mariadb@3.5.2", "", { "dependencies": { "@types/geojson": "^7946.0.16", "@types/node": ">=18", "denque": "^2.1.0", "iconv-lite": "^0.7.2", "lru-cache": "^10.4.3" } }, "sha512-9rztrI4nouxAY/82a+RlzzZ5ie2vxu2eYclkBvTy1ATXH1B9cnvZ0O71Pzsy/mlfDb5P3HhOg0JzQKkDRhctyA=="],
|
||||||
|
|
||||||
|
"mdn-data": ["mdn-data@2.12.2", "", {}, "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA=="],
|
||||||
|
|
||||||
|
"mlly": ["mlly@1.8.0", "", { "dependencies": { "acorn": "^8.15.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.1" } }, "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g=="],
|
||||||
|
|
||||||
|
"modern-tar": ["modern-tar@0.7.5", "", {}, "sha512-YTefgdpKKFgoTDbEUqXqgUJct2OG6/4hs4XWLsxcHkDLj/x/V8WmKIRppPnXP5feQ7d1vuYWSp3qKkxfwaFaxA=="],
|
||||||
|
|
||||||
|
"nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
|
||||||
|
|
||||||
|
"nodemailer": ["nodemailer@8.0.2", "", {}, "sha512-zbj002pZAIkWQFxyAaqoxvn+zoIwRnS40hgjqTXudKOOJkiFFgBeNqjgD3/YCR12sZnrghWYBY+yP1ZucdDRpw=="],
|
||||||
|
|
||||||
|
"nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="],
|
||||||
|
|
||||||
|
"package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="],
|
||||||
|
|
||||||
|
"path-expression-matcher": ["path-expression-matcher@1.1.3", "", {}, "sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ=="],
|
||||||
|
|
||||||
|
"pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="],
|
||||||
|
|
||||||
|
"picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
|
||||||
|
|
||||||
|
"picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="],
|
||||||
|
|
||||||
|
"pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="],
|
||||||
|
|
||||||
|
"postcss": ["postcss@8.5.8", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg=="],
|
||||||
|
|
||||||
|
"require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="],
|
||||||
|
|
||||||
|
"rolldown": ["rolldown@1.0.0-rc.9", "", { "dependencies": { "@oxc-project/types": "=0.115.0", "@rolldown/pluginutils": "1.0.0-rc.9" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-rc.9", "@rolldown/binding-darwin-arm64": "1.0.0-rc.9", "@rolldown/binding-darwin-x64": "1.0.0-rc.9", "@rolldown/binding-freebsd-x64": "1.0.0-rc.9", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.9", "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.9", "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.9", "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.9", "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.9", "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.9", "@rolldown/binding-linux-x64-musl": "1.0.0-rc.9", "@rolldown/binding-openharmony-arm64": "1.0.0-rc.9", "@rolldown/binding-wasm32-wasi": "1.0.0-rc.9", "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.9", "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.9" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-9EbgWge7ZH+yqb4d2EnELAntgPTWbfL8ajiTW+SyhJEC4qhBbkCKbqFV4Ge4zmu5ziQuVbWxb/XwLZ+RIO7E8Q=="],
|
||||||
|
|
||||||
|
"rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="],
|
||||||
|
|
||||||
|
"safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
|
||||||
|
|
||||||
|
"sax": ["sax@1.4.4", "", {}, "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw=="],
|
||||||
|
|
||||||
|
"semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
|
||||||
|
|
||||||
|
"sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@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" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="],
|
||||||
|
|
||||||
|
"shell-quote": ["shell-quote@1.8.3", "", {}, "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw=="],
|
||||||
|
|
||||||
|
"sigpro": ["sigpro@1.0.9", "", {}, "sha512-Vq+7OH0qCsku8P0hK511NXeWY8yrsn1cgTgs7tuv9jHp3PiSBQ1b3oWn3XSSDzUpiLVawF3tTRRbo2/63CKQog=="],
|
||||||
|
|
||||||
|
"source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
|
||||||
|
|
||||||
|
"string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
|
||||||
|
|
||||||
|
"strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
|
||||||
|
|
||||||
|
"strnum": ["strnum@2.2.0", "", {}, "sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg=="],
|
||||||
|
|
||||||
|
"supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="],
|
||||||
|
|
||||||
|
"svgo": ["svgo@4.0.0", "", { "dependencies": { "commander": "^11.1.0", "css-select": "^5.1.0", "css-tree": "^3.0.1", "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.1.1", "sax": "^1.4.1" }, "bin": "./bin/svgo.js" }, "sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw=="],
|
||||||
|
|
||||||
|
"tailwindcss": ["tailwindcss@4.2.1", "", {}, "sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw=="],
|
||||||
|
|
||||||
|
"tapable": ["tapable@2.3.0", "", {}, "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg=="],
|
||||||
|
|
||||||
|
"tinyexec": ["tinyexec@1.0.2", "", {}, "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg=="],
|
||||||
|
|
||||||
|
"tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="],
|
||||||
|
|
||||||
|
"tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="],
|
||||||
|
|
||||||
|
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
|
||||||
|
|
||||||
|
"ufo": ["ufo@1.6.3", "", {}, "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q=="],
|
||||||
|
|
||||||
|
"undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="],
|
||||||
|
|
||||||
|
"vite": ["vite@8.0.0", "", { "dependencies": { "@oxc-project/runtime": "0.115.0", "lightningcss": "^1.32.0", "picomatch": "^4.0.3", "postcss": "^8.5.8", "rolldown": "1.0.0-rc.9", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.0.0-alpha.31", "esbuild": "^0.27.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-fPGaRNj9Zytaf8LEiBhY7Z6ijnFKdzU/+mL8EFBaKr7Vw1/FWcTBAMW0wLPJAGMPX38ZPVCVgLceWiEqeoqL2Q=="],
|
||||||
|
|
||||||
|
"wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
|
||||||
|
|
||||||
|
"y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="],
|
||||||
|
|
||||||
|
"yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="],
|
||||||
|
|
||||||
|
"yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="],
|
||||||
|
|
||||||
|
"@tailwindcss/node/lightningcss": ["lightningcss@1.31.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.31.1", "lightningcss-darwin-arm64": "1.31.1", "lightningcss-darwin-x64": "1.31.1", "lightningcss-freebsd-x64": "1.31.1", "lightningcss-linux-arm-gnueabihf": "1.31.1", "lightningcss-linux-arm64-gnu": "1.31.1", "lightningcss-linux-arm64-musl": "1.31.1", "lightningcss-linux-x64-gnu": "1.31.1", "lightningcss-linux-x64-musl": "1.31.1", "lightningcss-win32-arm64-msvc": "1.31.1", "lightningcss-win32-x64-msvc": "1.31.1" } }, "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.9.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.1", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" }, "bundled": true }, "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="],
|
||||||
|
|
||||||
|
"@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
|
||||||
|
|
||||||
|
"chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
|
||||||
|
|
||||||
|
"csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="],
|
||||||
|
|
||||||
|
"@tailwindcss/node/lightningcss/lightningcss-android-arm64": ["lightningcss-android-arm64@1.31.1", "", { "os": "android", "cpu": "arm64" }, "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg=="],
|
||||||
|
|
||||||
|
"@tailwindcss/node/lightningcss/lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.31.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg=="],
|
||||||
|
|
||||||
|
"@tailwindcss/node/lightningcss/lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.31.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA=="],
|
||||||
|
|
||||||
|
"@tailwindcss/node/lightningcss/lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.31.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A=="],
|
||||||
|
|
||||||
|
"@tailwindcss/node/lightningcss/lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.31.1", "", { "os": "linux", "cpu": "arm" }, "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g=="],
|
||||||
|
|
||||||
|
"@tailwindcss/node/lightningcss/lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.31.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg=="],
|
||||||
|
|
||||||
|
"@tailwindcss/node/lightningcss/lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.31.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg=="],
|
||||||
|
|
||||||
|
"@tailwindcss/node/lightningcss/lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.31.1", "", { "os": "linux", "cpu": "x64" }, "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA=="],
|
||||||
|
|
||||||
|
"@tailwindcss/node/lightningcss/lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.31.1", "", { "os": "linux", "cpu": "x64" }, "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA=="],
|
||||||
|
|
||||||
|
"@tailwindcss/node/lightningcss/lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.31.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w=="],
|
||||||
|
|
||||||
|
"@tailwindcss/node/lightningcss/lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.31.1", "", { "os": "win32", "cpu": "x64" }, "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw=="],
|
||||||
|
|
||||||
|
"csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="],
|
||||||
|
}
|
||||||
|
}
|
||||||
14
index.html
Normal file
14
index.html
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<!doctype html>
|
||||||
|
|
||||||
|
<html lang="en" data-theme="light">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>svelte</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="app"></div>
|
||||||
|
<script type="module" src="/src/main.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
35
package.json
Normal file
35
package.json
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
{
|
||||||
|
"name": "sigpro",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"kill": "pkill -9 bun && pkill -9 node || true",
|
||||||
|
"del": "rm node_modules/.vite/deps -r",
|
||||||
|
"gen:schema": "bun run server/scripts/generate-schema.js",
|
||||||
|
"dev": "vite",
|
||||||
|
"dev:server": "bun gen:schema && bun --watch server/index.js",
|
||||||
|
"start": "concurrently \"bun dev\" \"bun dev:srv\"",
|
||||||
|
"build": "vite build",
|
||||||
|
"build:server": "bun build ./server/index.js --target bun --outdir ./dist-server",
|
||||||
|
"preview": "vite preview"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@tailwindcss/vite": "^4.2.1",
|
||||||
|
"ag-grid-community": "^35.1.0",
|
||||||
|
"ag-grid-enterprise": "^35.1.0",
|
||||||
|
"fast-xml-parser": "^5.5.3",
|
||||||
|
"hono": "^4.12.7",
|
||||||
|
"mariadb": "^3.5.2",
|
||||||
|
"nodemailer": "^8.0.2",
|
||||||
|
"sharp": "^0.34.5",
|
||||||
|
"sigpro": "^1.0.9"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@iconify/json": "^2.2.443",
|
||||||
|
"@iconify/tailwind4": "^1.2.1",
|
||||||
|
"concurrently": "^9.2.1",
|
||||||
|
"daisyui": "^5.5.19",
|
||||||
|
"tailwindcss": "^4.2.1",
|
||||||
|
"vite": "^8.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
public/geist.woff2
Normal file
BIN
public/geist.woff2
Normal file
Binary file not shown.
BIN
public/jakarta.woff2
Normal file
BIN
public/jakarta.woff2
Normal file
Binary file not shown.
52
server/actions/db.actions.js
Normal file
52
server/actions/db.actions.js
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
/**
|
||||||
|
* Acciones base para operaciones CRUD y búsquedas
|
||||||
|
*/
|
||||||
|
export const actions = {
|
||||||
|
/**
|
||||||
|
* Inserta o actualiza un registro y devuelve el objeto completo actualizado
|
||||||
|
*/
|
||||||
|
_set: async (db, { table, view, data }) => {
|
||||||
|
// Si el id viene vacío o es 0, lo eliminamos para que MariaDB genere uno nuevo (AUTO_INCREMENT)
|
||||||
|
if (!data.id) delete data.id;
|
||||||
|
|
||||||
|
const result = await db.upsert(table, data);
|
||||||
|
|
||||||
|
// Normalizamos la respuesta del driver de MariaDB
|
||||||
|
const res = Array.isArray(result) ? result[0] : result;
|
||||||
|
|
||||||
|
// Obtenemos el ID: o bien el que ya venía en data, o el nuevo generado por el insert
|
||||||
|
const idToFetch = data.id || res?.insertId;
|
||||||
|
|
||||||
|
if (!idToFetch) throw new Error("No se pudo determinar el ID del registro");
|
||||||
|
|
||||||
|
// Devolvemos el registro fresco (útil si usamos una 'view' con campos calculados)
|
||||||
|
return db.one(view || table, { id: idToFetch });
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Elimina un registro por ID
|
||||||
|
*/
|
||||||
|
_del: async (db, { table, id }) => {
|
||||||
|
if (!id) throw new Error("ID requerido para eliminar");
|
||||||
|
return db.delete(table, { id });
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Obtiene todos los clientes (compatibilidad con ClientesOld)
|
||||||
|
*/
|
||||||
|
Clientes: async (db) => {
|
||||||
|
return db.select('ClientesOld');
|
||||||
|
},
|
||||||
|
Recibos: async (db) => {
|
||||||
|
return db.select('Recibos');
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Búsqueda avanzada usando parámetros nombrados (raw query)
|
||||||
|
*/
|
||||||
|
Search: async (db, { text }) => {
|
||||||
|
const query = 'SELECT * FROM ClientesOld WHERE Cliente LIKE :term OR NIF LIKE :term';
|
||||||
|
const params = { term: `%${text}%` };
|
||||||
|
return db.raw(query, params);
|
||||||
|
}
|
||||||
|
};
|
||||||
138
server/actions/soap.actions.js
Normal file
138
server/actions/soap.actions.js
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
import schemaDataRaw from '../lib/schema.json' assert { type: 'json' };
|
||||||
|
|
||||||
|
// El schema se usa para validar qué columnas existen realmente en la DB
|
||||||
|
const schemaData = schemaDataRaw;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Formatea fechas a estándar ISO (YYYY-MM-DD) para MariaDB
|
||||||
|
*/
|
||||||
|
const fmt = (d) =>
|
||||||
|
(d instanceof Date && !isNaN(d.getTime()) ? d.toISOString().split('T')[0] : null);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filtra y limpia las columnas según el schema.json
|
||||||
|
*/
|
||||||
|
const filterColumns = (tableName, rowData) => {
|
||||||
|
const schema = schemaData[tableName];
|
||||||
|
if (!schema) return rowData;
|
||||||
|
|
||||||
|
return Object.keys(rowData).reduce((cleanRow, col) => {
|
||||||
|
const colDef = schema[col];
|
||||||
|
if (!colDef) return cleanRow; // Si la columna no existe en el JSON, se ignora
|
||||||
|
|
||||||
|
let val = rowData[col];
|
||||||
|
const type = colDef.type || ''; // Usamos el campo 'type' generado por tu script anterior
|
||||||
|
|
||||||
|
if (val != null) {
|
||||||
|
// Lógica de fechas
|
||||||
|
if (type.includes('date')) {
|
||||||
|
try {
|
||||||
|
const s = val.toString().trim();
|
||||||
|
const isISO = val instanceof Date || s.includes('T');
|
||||||
|
|
||||||
|
val = isISO ? fmt(new Date(val)) :
|
||||||
|
/^\d{8}$/.test(s) ? `${s.slice(4, 8)}-${s.slice(2, 4)}-${s.slice(0, 2)}` :
|
||||||
|
s.includes('.') ? s.split('.').reverse().join('-') : s.slice(0, 10);
|
||||||
|
} catch {
|
||||||
|
val = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Lógica de texto: trim y recorte por seguridad según definición
|
||||||
|
else if (type === 'text' && typeof val === 'string') {
|
||||||
|
val = val.trim().slice(0, 255);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cleanRow[col] = val;
|
||||||
|
return cleanRow;
|
||||||
|
}, {});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Orquestador para guardar datos transformados de SOAP a DB
|
||||||
|
*/
|
||||||
|
const saveSoap = async (db, raw, config) => {
|
||||||
|
if (!raw || !raw.length) return 0;
|
||||||
|
|
||||||
|
const rawArray = Array.isArray(raw) ? raw : [raw];
|
||||||
|
|
||||||
|
for (const [table, transform] of Object.entries(config)) {
|
||||||
|
const data = rawArray.flatMap(item => {
|
||||||
|
const res = transform ? transform(item) : item;
|
||||||
|
if (!res) return [];
|
||||||
|
|
||||||
|
return Array.isArray(res)
|
||||||
|
? res.map(sub => filterColumns(table, sub))
|
||||||
|
: [filterColumns(table, res)];
|
||||||
|
});
|
||||||
|
|
||||||
|
if (data.length) {
|
||||||
|
await db.upsert(table, data, true); // true para INSERT IGNORE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rawArray.length;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Acciones exportables para el motor TRX
|
||||||
|
* Estas funciones son llamadas dinámicamente según el nombre del servicio SOAP
|
||||||
|
*/
|
||||||
|
export const actions = {
|
||||||
|
DescargaCompletaRecibos: async (db, { data }) => {
|
||||||
|
const raw = data.ListaRecibos?.ReciboAmpliado || data || [];
|
||||||
|
const total = await saveSoap(db, raw, { 'Recibos': null, 'RecibosEstados': null });
|
||||||
|
return { totalProcesado: total };
|
||||||
|
},
|
||||||
|
|
||||||
|
DescargaCartera: async (db, { data }) => {
|
||||||
|
const raw = data.DatosCartera?.Cartera || data || [];
|
||||||
|
const total = await saveSoap(db, raw, { 'Cartera': null });
|
||||||
|
return { totalProcesado: total };
|
||||||
|
},
|
||||||
|
|
||||||
|
DescargaSiniestros: async (db, { data }) => {
|
||||||
|
const raw = data.ListaSiniestros?.SiniestroAmpliado || data || [];
|
||||||
|
const total = await saveSoap(db, raw, { 'Siniestros': null, 'SiniestrosEstados': null });
|
||||||
|
return { totalProcesado: total };
|
||||||
|
},
|
||||||
|
|
||||||
|
ConsultaAgendaTramitacion: async (db, { data }) => {
|
||||||
|
const raw = data.Datos?.DatosTramitacionResponse || data || [];
|
||||||
|
const total = await saveSoap(db, raw, { 'SiniestrosTramites': null });
|
||||||
|
return { totalProcesado: total };
|
||||||
|
},
|
||||||
|
|
||||||
|
DescargaPolizas: async (db, { data }) => {
|
||||||
|
const raw = data.ListaPolizas?.Poliza || data || [];
|
||||||
|
const total = await saveSoap(db, raw, {
|
||||||
|
'Polizas': i => ({
|
||||||
|
...i.DatosGenerales,
|
||||||
|
Riesgo: [
|
||||||
|
i.DatosAccidentes?.NombreAsegurado,
|
||||||
|
i.DatosAutos?.CodigoModelo && `${i.DatosAutos.CodigoModelo} ${i.DatosAutos.Matricula || ''}`.trim(),
|
||||||
|
i.DatosMultirriesgos?.SituacionRiesgo
|
||||||
|
].filter(Boolean).join(' | ')
|
||||||
|
}),
|
||||||
|
'PolizasDetalle': i => i.DatosGenerales
|
||||||
|
? { ...i.DatosGenerales.DatosTomador, ...i.DatosGenerales, CodigoPoliza: i.DatosGenerales.CodigoPoliza, CodigoSuplemento: i.DatosGenerales.CodigoSuplemento }
|
||||||
|
: null,
|
||||||
|
'PolizasAutos': i => i.DatosAutos?.CodigoModelo
|
||||||
|
? { ...i.DatosAutos, CodigoPoliza: i.DatosGenerales.CodigoPoliza, CodigoSuplemento: i.DatosGenerales.CodigoSuplemento }
|
||||||
|
: null,
|
||||||
|
'PolizasAutosConductor': i => {
|
||||||
|
const { CodigoPoliza, CodigoSuplemento } = i.DatosGenerales || {};
|
||||||
|
const { DatosConductor: hab, DatosConductorOcasional: oca } = i.DatosAutos || {};
|
||||||
|
return [
|
||||||
|
hab?.Nombre ? { ...hab, CodigoPoliza, CodigoSuplemento, TipoConductor: 'Habitual' } : null,
|
||||||
|
oca?.Nombre ? { ...oca, CodigoPoliza, CodigoSuplemento, TipoConductor: 'Ocasional' } : null
|
||||||
|
].filter(Boolean);
|
||||||
|
},
|
||||||
|
'PolizasMultirriesgos': i => i.DatosMultirriesgos
|
||||||
|
? { ...i.DatosMultirriesgos, CodigoPoliza: i.DatosGenerales.CodigoPoliza, CodigoSuplemento: i.DatosGenerales.CodigoSuplemento }
|
||||||
|
: null,
|
||||||
|
'PolizasAccidentes': i => i.DatosAccidentes
|
||||||
|
? { ...i.DatosAccidentes, CodigoPoliza: i.DatosGenerales.CodigoPoliza, CodigoSuplemento: i.DatosGenerales.CodigoSuplemento }
|
||||||
|
: null
|
||||||
|
});
|
||||||
|
return { totalProcesado: total };
|
||||||
|
}
|
||||||
|
};
|
||||||
74
server/api/auth.js
Normal file
74
server/api/auth.js
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
import { Hono } from 'hono'
|
||||||
|
import { sign } from 'hono/jwt'
|
||||||
|
import { pool } from '../services/db.service.js'
|
||||||
|
|
||||||
|
const auth = new Hono()
|
||||||
|
|
||||||
|
// Configuración externa
|
||||||
|
const SYNO_BASE = 'http://192.168.1.100:5000/webapi/auth.cgi'
|
||||||
|
const JWT_SECRET = process.env.JWT_SECRET || 'cambia_esto_en_el_env'
|
||||||
|
|
||||||
|
auth.post('/login', async (c) => {
|
||||||
|
const { username, password } = await c.req.json().catch(() => ({}))
|
||||||
|
|
||||||
|
if (!username || !password) {
|
||||||
|
return c.json({ success: false, message: 'Faltan credenciales' }, 400)
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 1. Preparar parámetros para el NAS Synology
|
||||||
|
const params = new URLSearchParams({
|
||||||
|
api: 'SYNO.API.Auth',
|
||||||
|
version: '6',
|
||||||
|
method: 'login',
|
||||||
|
account: username,
|
||||||
|
passwd: password,
|
||||||
|
format: 'sid'
|
||||||
|
})
|
||||||
|
|
||||||
|
// 2. Petición al NAS usando el fetch nativo
|
||||||
|
const response = await fetch(`${SYNO_BASE}?${params.toString()}`)
|
||||||
|
const data = await response.json()
|
||||||
|
|
||||||
|
if (data.success && data.data) {
|
||||||
|
// 3. Generar JWT (expiración en 8 horas)
|
||||||
|
const payload = {
|
||||||
|
username,
|
||||||
|
sid: data.data.sid,
|
||||||
|
exp: Math.floor(Date.now() / 1000) + (60 * 60 * 8)
|
||||||
|
}
|
||||||
|
|
||||||
|
const token = await sign(payload, JWT_SECRET)
|
||||||
|
|
||||||
|
// 4. Asegurar el usuario en la base de datos (MariaDB)
|
||||||
|
try {
|
||||||
|
await pool.query('INSERT IGNORE INTO Usuarios (Usuario) VALUES (?)', [username])
|
||||||
|
} catch (dbError) {
|
||||||
|
console.error('Error al registrar usuario en DB:', dbError)
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.json({
|
||||||
|
success: true,
|
||||||
|
token,
|
||||||
|
data: {
|
||||||
|
user: { username }
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error de autenticación del NAS
|
||||||
|
return c.json({
|
||||||
|
success: false,
|
||||||
|
message: `Error de autenticación (Código: ${data.error?.code || 'unknown'})`
|
||||||
|
}, 401)
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error crítico en Auth:', error)
|
||||||
|
return c.json({
|
||||||
|
success: false,
|
||||||
|
message: 'NAS Unreachable / Internal Error'
|
||||||
|
}, 500)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
export default auth
|
||||||
132
server/api/db.js
Normal file
132
server/api/db.js
Normal file
@@ -0,0 +1,132 @@
|
|||||||
|
import { Hono } from 'hono'
|
||||||
|
import { jwt } from 'hono/jwt'
|
||||||
|
import { db, trx } from '../services/db.service.js'
|
||||||
|
import { actions } from '../actions/db.actions.js'
|
||||||
|
import sharp from 'sharp'
|
||||||
|
import path from 'path'
|
||||||
|
import mime from 'mime-types'
|
||||||
|
|
||||||
|
const api = new Hono()
|
||||||
|
|
||||||
|
const JWT_SECRET = process.env.JWT_SECRET || 'tu_clave_secreta'
|
||||||
|
|
||||||
|
// --- MIDDLEWARE AUTH CON BYPASS ---
|
||||||
|
// api.use('/*', async (c, next) => {
|
||||||
|
// if (process.env.DISABLE_AUTH === 'true') {
|
||||||
|
// c.set('jwtPayload', { username: 'TEST_USER', role: 'admin' })
|
||||||
|
// return await next()
|
||||||
|
// }
|
||||||
|
// const jwtMiddleware = jwt({ secret: JWT_SECRET, alg: 'HS256' })
|
||||||
|
// return jwtMiddleware(c, next)
|
||||||
|
// })
|
||||||
|
|
||||||
|
// --- RUTA PARA TRANSACCIONES (TRX) ---
|
||||||
|
api.on(['GET', 'POST'], '/', async (c) => {
|
||||||
|
const body = c.req.method === 'POST' ? await c.req.json().catch(() => ({})) : {}
|
||||||
|
const query = c.req.query()
|
||||||
|
const postData = { ...query, ...body }
|
||||||
|
|
||||||
|
if (Object.keys(postData).length === 0) {
|
||||||
|
return c.json({ success: false, error: 'No data provided' }, 400)
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const data = await trx(postData, actions)
|
||||||
|
// Manejo de BigInt para evitar errores en JSON.stringify
|
||||||
|
const cleanData = JSON.parse(JSON.stringify(data, (_, v) => typeof v === 'bigint' ? v.toString() : v))
|
||||||
|
return c.json({ success: true, data: cleanData })
|
||||||
|
} catch (error) {
|
||||||
|
return c.json({ success: false, error: error.message }, 500)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// --- RUTA FICHAR ---
|
||||||
|
api.on(['GET', 'POST'], '/fichar/:query', async (c) => {
|
||||||
|
const payload = c.get('jwtPayload')
|
||||||
|
const user = payload?.username || 'ANONYMOUS'
|
||||||
|
const queryType = c.req.param('query')
|
||||||
|
|
||||||
|
try {
|
||||||
|
const ret = queryType === 'nuevo'
|
||||||
|
? await db.raw('CALL RegistrarFichaje(:user)', { user })
|
||||||
|
: await db.raw('SELECT Fecha, Tipo, Duracion FROM UsuariosFichajes WHERE Usuario = :user ORDER BY id DESC LIMIT 1', { user })
|
||||||
|
|
||||||
|
return c.json({ success: true, data: ret })
|
||||||
|
} catch (error) {
|
||||||
|
return c.json({ success: false, error: error.message }, 500)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// --- RUTA DE SUBIDA (UPLOAD) ---
|
||||||
|
api.post('/upload', async (c) => {
|
||||||
|
try {
|
||||||
|
const body = await c.req.parseBody()
|
||||||
|
const file = body.file
|
||||||
|
if (!file) throw new Error('No se ha enviado ningún archivo')
|
||||||
|
|
||||||
|
const arrayBuffer = await file.arrayBuffer()
|
||||||
|
let finalBuffer = Buffer.from(arrayBuffer)
|
||||||
|
const isImg = file.type.startsWith('image/')
|
||||||
|
|
||||||
|
if (isImg) {
|
||||||
|
finalBuffer = await sharp(finalBuffer)
|
||||||
|
.resize(1024, null, { withoutEnlargement: true })
|
||||||
|
.jpeg({ quality: 75 })
|
||||||
|
.toBuffer()
|
||||||
|
}
|
||||||
|
|
||||||
|
const res = await db.insert('Documentos', {
|
||||||
|
CodigoPoliza: body.CodigoPoliza || null,
|
||||||
|
CodigoRecibo: body.CodigoRecibo ? BigInt(body.CodigoRecibo) : null,
|
||||||
|
CodigoSiniestro: body.CodigoSiniestro ? BigInt(body.CodigoSiniestro) : null,
|
||||||
|
NIF: body.NIF || null,
|
||||||
|
Nombre: file.name,
|
||||||
|
Extension: isImg ? '.jpg' : path.extname(file.name).toLowerCase(),
|
||||||
|
Archivo: finalBuffer
|
||||||
|
})
|
||||||
|
|
||||||
|
const insertId = Array.isArray(res) ? res[0].insertId : res?.insertId
|
||||||
|
return c.json({ success: true, id: insertId?.toString() })
|
||||||
|
} catch (err) {
|
||||||
|
return c.json({ success: false, error: err.message }, 500)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// --- RUTA DE DESCARGA ---
|
||||||
|
api.get('/download', async (c) => {
|
||||||
|
try {
|
||||||
|
const { id, CodigoPoliza, CodigoRecibo, CodigoSiniestro, NIF, download } = c.req.query()
|
||||||
|
const filtros = Object.fromEntries(
|
||||||
|
Object.entries({ id, CodigoPoliza, CodigoRecibo, CodigoSiniestro, NIF })
|
||||||
|
.filter(([_, v]) => v)
|
||||||
|
)
|
||||||
|
|
||||||
|
if (Object.keys(filtros).length === 0) return c.json({ success: false, error: 'Faltan parámetros' }, 400)
|
||||||
|
|
||||||
|
const docs = await db.select('Documentos', filtros)
|
||||||
|
if (!docs.length) return c.json({ success: false, error: 'Sin resultados' }, 404)
|
||||||
|
|
||||||
|
if (id) {
|
||||||
|
const doc = docs[0]
|
||||||
|
const contentType = mime.lookup(doc.Extension) || 'application/octet-stream'
|
||||||
|
c.header('Content-Type', contentType)
|
||||||
|
c.header('Content-Disposition', `${download === 'true' ? 'attachment' : 'inline'}; filename="${doc.Nombre}"`)
|
||||||
|
|
||||||
|
return c.body(doc.Archivo)
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.json(docs.map((doc) => {
|
||||||
|
const { Archivo, ...info } = doc
|
||||||
|
return {
|
||||||
|
...info,
|
||||||
|
id: info.id.toString(),
|
||||||
|
url: `/api/db/download?id=${info.id}`,
|
||||||
|
urlDownload: `/api/db/download?id=${info.id}&download=true`
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
} catch (err) {
|
||||||
|
return c.json({ success: false, error: err.message }, 500)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
export default api
|
||||||
33
server/api/mail.js
Normal file
33
server/api/mail.js
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
import { Hono } from 'hono'
|
||||||
|
import { send } from '../services/mail.service.js'
|
||||||
|
|
||||||
|
const mail = new Hono()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Endpoint para envío de correo
|
||||||
|
* Soporta GET (para pruebas rápidas) y POST (para producción)
|
||||||
|
*/
|
||||||
|
mail.on(['GET', 'POST'], '/', async (c) => {
|
||||||
|
try {
|
||||||
|
// Llamamos al servicio de correo
|
||||||
|
// Nota: Aquí podrías extraer to, subject y html de c.req.json() o c.req.query()
|
||||||
|
await send(
|
||||||
|
'natxocc@natxocc.com',
|
||||||
|
'Prueba desde Hono',
|
||||||
|
'<h1>Este es un correo de prueba</h1>'
|
||||||
|
)
|
||||||
|
|
||||||
|
return c.json({
|
||||||
|
success: true,
|
||||||
|
message: 'Email enviado correctamente'
|
||||||
|
})
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error en ruta mail:', error)
|
||||||
|
return c.json({
|
||||||
|
success: false,
|
||||||
|
error: error.message
|
||||||
|
}, 500)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
export default mail
|
||||||
61
server/api/soap.js
Normal file
61
server/api/soap.js
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
import { Hono } from 'hono'
|
||||||
|
import { soapCall } from '../services/soap2.service.js'
|
||||||
|
|
||||||
|
const api = new Hono()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Endpoint simplificado: /api/soap/12345/Polizas
|
||||||
|
* El servicio soapCall se encarga de traducir "Polizas" a "DescargaPolizas"
|
||||||
|
*/
|
||||||
|
api.get('/:CodigoMediador/:alias', async (c) => {
|
||||||
|
const params = c.req.param() // Contiene CodigoMediador y alias
|
||||||
|
const query = c.req.query()
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Pasamos params directamente porque soapCall ya sabe buscar el 'alias'
|
||||||
|
const result = await soapCall(params, query)
|
||||||
|
|
||||||
|
return c.json({
|
||||||
|
success: true,
|
||||||
|
data: result
|
||||||
|
})
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`[Router Error] ${params.alias}:`, error.message)
|
||||||
|
return c.json({
|
||||||
|
success: false,
|
||||||
|
message: error.message || 'Error en el servicio externo SOAP'
|
||||||
|
}, 500)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
export default api
|
||||||
|
/*
|
||||||
|
import { Hono } from 'hono'
|
||||||
|
import { soapCall } from '../services/soap2.service.js'
|
||||||
|
|
||||||
|
const api = new Hono()
|
||||||
|
|
||||||
|
api.get('/:CodigoMediador/:service/:method', async (c) => {
|
||||||
|
const params = c.req.param()
|
||||||
|
const query = c.req.query()
|
||||||
|
|
||||||
|
try {
|
||||||
|
const result = await soapCall(params, query)
|
||||||
|
|
||||||
|
return c.json({
|
||||||
|
success: true,
|
||||||
|
message: false,
|
||||||
|
data: result
|
||||||
|
})
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`Error en llamada SOAP ${params.service}/${params.method}:`, error)
|
||||||
|
|
||||||
|
return c.json({
|
||||||
|
success: false,
|
||||||
|
message: error.message || 'Error en el servicio externo SOAP'
|
||||||
|
}, 500)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
export default api
|
||||||
|
*/
|
||||||
41
server/index.js
Normal file
41
server/index.js
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
import { Hono } from 'hono'
|
||||||
|
import { logger } from 'hono/logger'
|
||||||
|
import { cors } from 'hono/cors'
|
||||||
|
import { jwt } from 'hono/jwt'
|
||||||
|
|
||||||
|
// Importación de APIs (Rutas)
|
||||||
|
import auth from './api/auth'
|
||||||
|
import db from './api/db'
|
||||||
|
import mail from './api/mail'
|
||||||
|
import soap from './api/soap'
|
||||||
|
|
||||||
|
const app = new Hono()
|
||||||
|
|
||||||
|
// --- Middlewares Globales ---
|
||||||
|
app.use('*', logger())
|
||||||
|
app.use('*', cors())
|
||||||
|
|
||||||
|
// --- Gestión de Errores Global ---
|
||||||
|
app.onError((err, c) => {
|
||||||
|
console.error(`[Global Error]: ${err.message}`)
|
||||||
|
const status = err.name === 'JwtTokenInvalid' ? 401 : 500
|
||||||
|
return c.json({
|
||||||
|
success: false,
|
||||||
|
message: err.message || 'Internal Server Error'
|
||||||
|
}, status)
|
||||||
|
})
|
||||||
|
|
||||||
|
// --- Registro de Rutas ---
|
||||||
|
// Nota: La protección JWT ya la pusimos dentro de api/db.ts y api/soap.ts
|
||||||
|
// para permitir que auth y mail (quizás) sean públicos.
|
||||||
|
app.route('/api/auth', auth)
|
||||||
|
app.route('/api/db', db)
|
||||||
|
app.route('/api/mail', mail)
|
||||||
|
app.route('/api/soap', soap)
|
||||||
|
|
||||||
|
// --- Servidor Bun ---
|
||||||
|
export default {
|
||||||
|
port: 3000,
|
||||||
|
fetch: app.fetch,
|
||||||
|
idleTimeout: 120,
|
||||||
|
}
|
||||||
458
server/lib/schema.json
Normal file
458
server/lib/schema.json
Normal file
@@ -0,0 +1,458 @@
|
|||||||
|
{
|
||||||
|
"Cartera": {
|
||||||
|
"CodigoPoliza": { "field": "CodigoPoliza", "header": "CODIGOPOLIZA", "type": "text", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"CodigoRecibo": { "field": "CodigoRecibo", "header": "CODIGORECIBO", "type": "text", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"CodigoGestor": { "field": "CodigoGestor", "header": "CODIGOGESTOR", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Contenido": { "field": "Contenido", "header": "CONTENIDO", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Continente": { "field": "Continente", "header": "CONTINENTE", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaEfecto": { "field": "FechaEfecto", "header": "FECHAEFECTO", "type": "date", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaVencimiento": { "field": "FechaVencimiento", "header": "FECHAVENCIMIENTO", "type": "date", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FormaPago": { "field": "FormaPago", "header": "FORMAPAGO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ImporteBonificacion": { "field": "ImporteBonificacion", "header": "IMPORTEBONIFICACION", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ImporteComision": { "field": "ImporteComision", "header": "IMPORTECOMISION", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ImporteImpuestos": { "field": "ImporteImpuestos", "header": "IMPORTEIMPUESTOS", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ImporteLiquido": { "field": "ImporteLiquido", "header": "IMPORTELIQUIDO", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ImporteNeto": { "field": "ImporteNeto", "header": "IMPORTENETO", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ImporteTotalRecibo": { "field": "ImporteTotalRecibo", "header": "IMPORTETOTALRECIBO", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"NombreTomador": { "field": "NombreTomador", "header": "NOMBRETOMADOR", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"RCGeneral": { "field": "RCGeneral", "header": "RCGENERAL", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"SubcodigoMediador": { "field": "SubcodigoMediador", "header": "SUBCODIGOMEDIADOR", "type": "text", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"Chat": {
|
||||||
|
"id": { "field": "id", "header": "ID", "type": "numeric", "hide": true, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"De": { "field": "De", "header": "DE", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Para": { "field": "Para", "header": "PARA", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Mensaje": { "field": "Mensaje", "header": "MENSAJE", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaMensaje": { "field": "FechaMensaje", "header": "FECHAMENSAJE", "type": "datetime", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Leido": { "field": "Leido", "header": "LEIDO", "type": "boolean", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Editado": { "field": "Editado", "header": "EDITADO", "type": "boolean", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Eliminado": { "field": "Eliminado", "header": "ELIMINADO", "type": "boolean", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"Clientes": {
|
||||||
|
"id": { "field": "id", "header": "ID", "type": "numeric", "hide": true, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"Documento": { "field": "Documento", "header": "DOCUMENTO", "type": "text", "hide": false, "virt": false, "key": "UK", "editable": true },
|
||||||
|
"Nombre": { "field": "Nombre", "header": "NOMBRE", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Apellidos": { "field": "Apellidos", "header": "APELLIDOS", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Cliente": { "field": "Cliente", "header": "CLIENTE", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Grupo": { "field": "Grupo", "header": "GRUPO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaNacimiento": { "field": "FechaNacimiento", "header": "FECHANACIMIENTO", "type": "date", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaCarnet": { "field": "FechaCarnet", "header": "FECHACARNET", "type": "date", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"EstadoCivil": { "field": "EstadoCivil", "header": "ESTADOCIVIL", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Profesion": { "field": "Profesion", "header": "PROFESION", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Hijos": { "field": "Hijos", "header": "HIJOS", "type": "text", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"ClientesCorreos": {
|
||||||
|
"Documento": { "field": "Documento", "header": "DOCUMENTO", "type": "text", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"Correo": { "field": "Correo", "header": "CORREO", "type": "text", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"Tipo": { "field": "Tipo", "header": "TIPO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"ClientesDirecciones": {
|
||||||
|
"Documento": { "field": "Documento", "header": "DOCUMENTO", "type": "text", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"Domicilio": { "field": "Domicilio", "header": "DOMICILIO", "type": "text", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"CodigoPostal": { "field": "CodigoPostal", "header": "CODIGOPOSTAL", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Localidad": { "field": "Localidad", "header": "LOCALIDAD", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Provincia": { "field": "Provincia", "header": "PROVINCIA", "type": "text", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"ClientesOld": {
|
||||||
|
"id": { "field": "id", "header": "ID", "type": "numeric", "hide": true, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"Mediador": { "field": "Mediador", "header": "MEDIADOR", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"NIF": { "field": "NIF", "header": "NIF", "type": "text", "hide": false, "virt": false, "key": "FK", "editable": true },
|
||||||
|
"Cliente": { "field": "Cliente", "header": "CLIENTE", "type": "text", "hide": false, "virt": false, "key": "FK", "editable": true },
|
||||||
|
"Grupo": { "field": "Grupo", "header": "GRUPO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Correo": { "field": "Correo", "header": "CORREO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Correo2": { "field": "Correo2", "header": "CORREO2", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Fijo": { "field": "Fijo", "header": "FIJO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Movil": { "field": "Movil", "header": "MOVIL", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Movil2": { "field": "Movil2", "header": "MOVIL2", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"CP": { "field": "CP", "header": "CP", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Direccion": { "field": "Direccion", "header": "DIRECCION", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Poblacion": { "field": "Poblacion", "header": "POBLACION", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Provincia": { "field": "Provincia", "header": "PROVINCIA", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Banco": { "field": "Banco", "header": "BANCO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaNacimiento": { "field": "FechaNacimiento", "header": "FECHANACIMIENTO", "type": "date", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaCarnet": { "field": "FechaCarnet", "header": "FECHACARNET", "type": "date", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"EstadoCivil": { "field": "EstadoCivil", "header": "ESTADOCIVIL", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Profesion": { "field": "Profesion", "header": "PROFESION", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Hijos": { "field": "Hijos", "header": "HIJOS", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Promo": { "field": "Promo", "header": "PROMO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaPromo": { "field": "FechaPromo", "header": "FECHAPROMO", "type": "date", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaBienvenida": { "field": "FechaBienvenida", "header": "FECHABIENVENIDA", "type": "date", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"NoMolestar": { "field": "NoMolestar", "header": "NOMOLESTAR", "type": "boolean", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Notas": { "field": "Notas", "header": "NOTAS", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaRegistro": { "field": "FechaRegistro", "header": "FECHAREGISTRO", "type": "datetime", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"SM": { "field": "SM", "header": "SM", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"upd": { "field": "upd", "header": "UPD", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Activo": { "field": "Activo", "header": "ACTIVO", "type": "boolean", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"MP": { "field": "MP", "header": "MP", "type": "text", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"ClientesTelefonos": {
|
||||||
|
"Documento": { "field": "Documento", "header": "DOCUMENTO", "type": "text", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"Telefono": { "field": "Telefono", "header": "TELEFONO", "type": "text", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"Tipo": { "field": "Tipo", "header": "TIPO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"Colaboradores": {
|
||||||
|
"SM": { "field": "SM", "header": "SM", "type": "text", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"CodigoMediador": { "field": "CodigoMediador", "header": "CODIGOMEDIADOR", "type": "numeric", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"CIF": { "field": "CIF", "header": "CIF", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Nombre": { "field": "Nombre", "header": "NOMBRE", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ResponsableRecibos": { "field": "ResponsableRecibos", "header": "RESPONSABLERECIBOS", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ResponsableSiniestros": { "field": "ResponsableSiniestros", "header": "RESPONSABLESINIESTROS", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ResponsablePolizas": { "field": "ResponsablePolizas", "header": "RESPONSABLEPOLIZAS", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Cartera": { "field": "Cartera", "header": "CARTERA", "type": "boolean", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Recibos": { "field": "Recibos", "header": "RECIBOS", "type": "boolean", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Pro": { "field": "Pro", "header": "PRO", "type": "boolean", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Activo": { "field": "Activo", "header": "ACTIVO", "type": "boolean", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Porc": { "field": "Porc", "header": "PORC", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Fact": { "field": "Fact", "header": "FACT", "type": "boolean", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"IRPF": { "field": "IRPF", "header": "IRPF", "type": "boolean", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Banco": { "field": "Banco", "header": "BANCO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Correo": { "field": "Correo", "header": "CORREO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Movil": { "field": "Movil", "header": "MOVIL", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Fijo": { "field": "Fijo", "header": "FIJO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Direccion": { "field": "Direccion", "header": "DIRECCION", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"CP": { "field": "CP", "header": "CP", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Notas": { "field": "Notas", "header": "NOTAS", "type": "text", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"Contactos": {
|
||||||
|
"Empresa": { "field": "Empresa", "header": "EMPRESA", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Seccion": { "field": "Seccion", "header": "SECCION", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Departamento": { "field": "Departamento", "header": "DEPARTAMENTO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Nombre": { "field": "Nombre", "header": "NOMBRE", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Fijo": { "field": "Fijo", "header": "FIJO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Movil": { "field": "Movil", "header": "MOVIL", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Fax": { "field": "Fax", "header": "FAX", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Correo": { "field": "Correo", "header": "CORREO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Correo2": { "field": "Correo2", "header": "CORREO2", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"CodigoMediador": { "field": "CodigoMediador", "header": "CODIGOMEDIADOR", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Notas": { "field": "Notas", "header": "NOTAS", "type": "text", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"Correos": {
|
||||||
|
"id": { "field": "id", "header": "ID", "type": "numeric", "hide": true, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"id_config": { "field": "id_config", "header": "ID CONFIG", "type": "numeric", "hide": true, "virt": false, "key": "FK", "editable": false },
|
||||||
|
"Asunto": { "field": "Asunto", "header": "ASUNTO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Cuerpo": { "field": "Cuerpo", "header": "CUERPO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaProgramada": { "field": "FechaProgramada", "header": "FECHAPROGRAMADA", "type": "datetime", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Estado": { "field": "Estado", "header": "ESTADO", "type": "select", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"CorreosConfig": {
|
||||||
|
"id": { "field": "id", "header": "ID", "type": "numeric", "hide": true, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"Nombre": { "field": "Nombre", "header": "NOMBRE", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Frecuencia": { "field": "Frecuencia", "header": "FRECUENCIA", "type": "select", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"DiaSemana": { "field": "DiaSemana", "header": "DIASEMANA", "type": "boolean", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"DiaMes": { "field": "DiaMes", "header": "DIAMES", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"HoraEnvio": { "field": "HoraEnvio", "header": "HORAENVIO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Cron": { "field": "Cron", "header": "CRON", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"id_plantilla": { "field": "id_plantilla", "header": "ID PLANTILLA", "type": "numeric", "hide": true, "virt": false, "key": "FK", "editable": false },
|
||||||
|
"Activo": { "field": "Activo", "header": "ACTIVO", "type": "boolean", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"CorreosDestinatarios": {
|
||||||
|
"id": { "field": "id", "header": "ID", "type": "numeric", "hide": true, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"id_correo": { "field": "id_correo", "header": "ID CORREO", "type": "numeric", "hide": true, "virt": false, "key": "FK", "editable": false },
|
||||||
|
"id_cliente": { "field": "id_cliente", "header": "ID CLIENTE", "type": "numeric", "hide": true, "virt": false, "key": false, "editable": false },
|
||||||
|
"EmailDestino": { "field": "EmailDestino", "header": "EMAILDESTINO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaEnviado": { "field": "FechaEnviado", "header": "FECHAENVIADO", "type": "datetime", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ErrorLog": { "field": "ErrorLog", "header": "ERRORLOG", "type": "text", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"CorreosPlantillas": {
|
||||||
|
"id": { "field": "id", "header": "ID", "type": "numeric", "hide": true, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"Nombre": { "field": "Nombre", "header": "NOMBRE", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"AsuntoBase": { "field": "AsuntoBase", "header": "ASUNTOBASE", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ContenidoHtml": { "field": "ContenidoHtml", "header": "CONTENIDOHTML", "type": "text", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"Documentos": {
|
||||||
|
"id": { "field": "id", "header": "ID", "type": "numeric", "hide": true, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"CodigoPoliza": { "field": "CodigoPoliza", "header": "CODIGOPOLIZA", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"CodigoRecibo": { "field": "CodigoRecibo", "header": "CODIGORECIBO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"CodigoSiniestro": { "field": "CodigoSiniestro", "header": "CODIGOSINIESTRO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"NIF": { "field": "NIF", "header": "NIF", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaRegistro": { "field": "FechaRegistro", "header": "FECHAREGISTRO", "type": "datetime", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Nombre": { "field": "Nombre", "header": "NOMBRE", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Extension": { "field": "Extension", "header": "EXTENSION", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Archivo": { "field": "Archivo", "header": "ARCHIVO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"Empresas": {
|
||||||
|
"Empresa": { "field": "Empresa", "header": "EMPRESA", "type": "text", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"CIF": { "field": "CIF", "header": "CIF", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Direccion": { "field": "Direccion", "header": "DIRECCION", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Notas": { "field": "Notas", "header": "NOTAS", "type": "text", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"Etiquetas": {
|
||||||
|
"id": { "field": "id", "header": "ID", "type": "numeric", "hide": true, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"Etiqueta": { "field": "Etiqueta", "header": "ETIQUETA", "type": "text", "hide": false, "virt": false, "key": "FK", "editable": true },
|
||||||
|
"Tabla": { "field": "Tabla", "header": "TABLA", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Nombre": { "field": "Nombre", "header": "NOMBRE", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Color": { "field": "Color", "header": "COLOR", "type": "text", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"Grupos": {
|
||||||
|
"Grupo": { "field": "Grupo", "header": "GRUPO", "type": "text", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"CodigoMediador": { "field": "CodigoMediador", "header": "CODIGOMEDIADOR", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Detalle": { "field": "Detalle", "header": "DETALLE", "type": "text", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"Liquidaciones": {
|
||||||
|
"id": { "field": "id", "header": "ID", "type": "numeric", "hide": true, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"CodigoMediador": { "field": "CodigoMediador", "header": "CODIGOMEDIADOR", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"CodigoPoliza": { "field": "CodigoPoliza", "header": "CODIGOPOLIZA", "type": "text", "hide": false, "virt": false, "key": "FK", "editable": true },
|
||||||
|
"CodigoRecibo": { "field": "CodigoRecibo", "header": "CODIGORECIBO", "type": "text", "hide": false, "virt": false, "key": "FK", "editable": true },
|
||||||
|
"FechaRegistro": { "field": "FechaRegistro", "header": "FECHAREGISTRO", "type": "date", "hide": false, "virt": false, "key": "FK", "editable": true },
|
||||||
|
"FechaEfecto": { "field": "FechaEfecto", "header": "FECHAEFECTO", "type": "date", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Detalle": { "field": "Detalle", "header": "DETALLE", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"NumLiq": { "field": "NumLiq", "header": "NUMLIQ", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"id_cuenta_Origen": { "field": "id_cuenta_Origen", "header": "ID CUENTA ORIGEN", "type": "numeric", "hide": true, "virt": false, "key": "FK", "editable": false },
|
||||||
|
"id_cuenta_Destino": { "field": "id_cuenta_Destino", "header": "ID CUENTA DESTINO", "type": "numeric", "hide": true, "virt": false, "key": "FK", "editable": false },
|
||||||
|
"Importe": { "field": "Importe", "header": "IMPORTE", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Usuario": { "field": "Usuario", "header": "USUARIO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Validado": { "field": "Validado", "header": "VALIDADO", "type": "boolean", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Liquidado": { "field": "Liquidado", "header": "LIQUIDADO", "type": "boolean", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"LiquidacionesCuentas": {
|
||||||
|
"id": { "field": "id", "header": "ID", "type": "numeric", "hide": true, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"CodigoMediador": { "field": "CodigoMediador", "header": "CODIGOMEDIADOR", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Cuenta": { "field": "Cuenta", "header": "CUENTA", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Activo": { "field": "Activo", "header": "ACTIVO", "type": "boolean", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Tipo": { "field": "Tipo", "header": "TIPO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"LiquidacionesMovimientos": {
|
||||||
|
"id": { "field": "id", "header": "ID", "type": "numeric", "hide": true, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"id_liquidacion": { "field": "id_liquidacion", "header": "ID LIQUIDACION", "type": "numeric", "hide": true, "virt": false, "key": "FK", "editable": false },
|
||||||
|
"id_cuenta": { "field": "id_cuenta", "header": "ID CUENTA", "type": "numeric", "hide": true, "virt": false, "key": "FK", "editable": false },
|
||||||
|
"Importe": { "field": "Importe", "header": "IMPORTE", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Accion": { "field": "Accion", "header": "ACCION", "type": "select", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"CodigoPoliza": { "field": "CodigoPoliza", "header": "CODIGOPOLIZA", "type": "text", "hide": false, "virt": false, "key": "FK", "editable": true },
|
||||||
|
"CodigoRecibo": { "field": "CodigoRecibo", "header": "CODIGORECIBO", "type": "text", "hide": false, "virt": false, "key": "FK", "editable": true },
|
||||||
|
"Detalle": { "field": "Detalle", "header": "DETALLE", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaRegistro": { "field": "FechaRegistro", "header": "FECHAREGISTRO", "type": "datetime", "hide": false, "virt": false, "key": "FK", "editable": true }
|
||||||
|
},
|
||||||
|
"Mediadores": {
|
||||||
|
"CodigoMediador": { "field": "CodigoMediador", "header": "CODIGOMEDIADOR", "type": "numeric", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"Descripcion": { "field": "Descripcion", "header": "DESCRIPCION", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Domicilio": { "field": "Domicilio", "header": "DOMICILIO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"CodigoPostal": { "field": "CodigoPostal", "header": "CODIGOPOSTAL", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Localidad": { "field": "Localidad", "header": "LOCALIDAD", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Provincia": { "field": "Provincia", "header": "PROVINCIA", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Correo": { "field": "Correo", "header": "CORREO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Telefono": { "field": "Telefono", "header": "TELEFONO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Whatsapp": { "field": "Whatsapp", "header": "WHATSAPP", "type": "text", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"Oportunidades": {
|
||||||
|
"id": { "field": "id", "header": "ID", "type": "numeric", "hide": true, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"id_cliente": { "field": "id_cliente", "header": "ID CLIENTE", "type": "numeric", "hide": true, "virt": false, "key": "FK", "editable": false },
|
||||||
|
"id_estado": { "field": "id_estado", "header": "ID ESTADO", "type": "numeric", "hide": true, "virt": false, "key": "FK", "editable": false },
|
||||||
|
"id_usuario": { "field": "id_usuario", "header": "ID USUARIO", "type": "numeric", "hide": true, "virt": false, "key": "FK", "editable": false },
|
||||||
|
"Empresa": { "field": "Empresa", "header": "EMPRESA", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaVencimiento": { "field": "FechaVencimiento", "header": "FECHAVENCIMIENTO", "type": "date", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Riesgo": { "field": "Riesgo", "header": "RIESGO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Importe": { "field": "Importe", "header": "IMPORTE", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Pago": { "field": "Pago", "header": "PAGO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaCreacion": { "field": "FechaCreacion", "header": "FECHACREACION", "type": "datetime", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"UltimaActualizacion": { "field": "UltimaActualizacion", "header": "ULTIMAACTUALIZACION", "type": "datetime", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"OportunidadesSeguimiento": {
|
||||||
|
"id": { "field": "id", "header": "ID", "type": "numeric", "hide": true, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"id_oportunidad": { "field": "id_oportunidad", "header": "ID OPORTUNIDAD", "type": "numeric", "hide": true, "virt": false, "key": "FK", "editable": false },
|
||||||
|
"id_usuario": { "field": "id_usuario", "header": "ID USUARIO", "type": "numeric", "hide": true, "virt": false, "key": "FK", "editable": false },
|
||||||
|
"id_responsable": { "field": "id_responsable", "header": "ID RESPONSABLE", "type": "numeric", "hide": true, "virt": false, "key": false, "editable": false },
|
||||||
|
"id_estado_ant": { "field": "id_estado_ant", "header": "ID ESTADO ANT", "type": "numeric", "hide": true, "virt": false, "key": "FK", "editable": false },
|
||||||
|
"id_estado_act": { "field": "id_estado_act", "header": "ID ESTADO ACT", "type": "numeric", "hide": true, "virt": false, "key": "FK", "editable": false },
|
||||||
|
"Fecha": { "field": "Fecha", "header": "FECHA", "type": "date", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Accion": { "field": "Accion", "header": "ACCION", "type": "text", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"Polizas": {
|
||||||
|
"CodigoPoliza": { "field": "CodigoPoliza", "header": "CODIGOPOLIZA", "type": "text", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"CodigoMediador": { "field": "CodigoMediador", "header": "CODIGOMEDIADOR", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaAlta": { "field": "FechaAlta", "header": "FECHAALTA", "type": "date", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaBaja": { "field": "FechaBaja", "header": "FECHABAJA", "type": "date", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Riesgo": { "field": "Riesgo", "header": "RIESGO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Ramo": { "field": "Ramo", "header": "RAMO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Modalidad": { "field": "Modalidad", "header": "MODALIDAD", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"GestorCobroInicial": { "field": "GestorCobroInicial", "header": "GESTORCOBROINICIAL", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"VigorSucursal": { "field": "VigorSucursal", "header": "VIGORSUCURSAL", "type": "boolean", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"PolizasAccidentes": {
|
||||||
|
"CodigoPoliza": { "field": "CodigoPoliza", "header": "CODIGOPOLIZA", "type": "text", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"CodigoSuplemento": { "field": "CodigoSuplemento", "header": "CODIGOSUPLEMENTO", "type": "numeric", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"DocumentoAsegurado": { "field": "DocumentoAsegurado", "header": "DOCUMENTOASEGURADO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaNacimientoAsegurado": { "field": "FechaNacimientoAsegurado", "header": "FECHANACIMIENTOASEGURADO", "type": "date", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ImporteIncapacidadTemporal": { "field": "ImporteIncapacidadTemporal", "header": "IMPORTEINCAPACIDADTEMPORAL", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ImporteInvalidezPorAccidente": { "field": "ImporteInvalidezPorAccidente", "header": "IMPORTEINVALIDEZPORACCIDENTE", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ImporteInvalidezPorInfarto": { "field": "ImporteInvalidezPorInfarto", "header": "IMPORTEINVALIDEZPORINFARTO", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ImporteMuertePorInfarto": { "field": "ImporteMuertePorInfarto", "header": "IMPORTEMUERTEPORINFARTO", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Invalidez": { "field": "Invalidez", "header": "INVALIDEZ", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Muerte": { "field": "Muerte", "header": "MUERTE", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"NombreAsegurado": { "field": "NombreAsegurado", "header": "NOMBREASEGURADO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"NumeroAsegurados": { "field": "NumeroAsegurados", "header": "NUMEROASEGURADOS", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"TipoInvalidez": { "field": "TipoInvalidez", "header": "TIPOINVALIDEZ", "type": "text", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"PolizasAutos": {
|
||||||
|
"CodigoPoliza": { "field": "CodigoPoliza", "header": "CODIGOPOLIZA", "type": "text", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"CodigoSuplemento": { "field": "CodigoSuplemento", "header": "CODIGOSUPLEMENTO", "type": "numeric", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"BonusDP": { "field": "BonusDP", "header": "BONUSDP", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"BonusRC": { "field": "BonusRC", "header": "BONUSRC", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"CodigoModelo": { "field": "CodigoModelo", "header": "CODIGOMODELO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"CodigoModeloBase7": { "field": "CodigoModeloBase7", "header": "CODIGOMODELOBASE7", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Matricula": { "field": "Matricula", "header": "MATRICULA", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Remolque": { "field": "Remolque", "header": "REMOLQUE", "type": "boolean", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"PolizasAutosConductor": {
|
||||||
|
"CodigoPoliza": { "field": "CodigoPoliza", "header": "CODIGOPOLIZA", "type": "text", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"CodigoSuplemento": { "field": "CodigoSuplemento", "header": "CODIGOSUPLEMENTO", "type": "text", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"Documento": { "field": "Documento", "header": "DOCUMENTO", "type": "text", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"TipoConductor": { "field": "TipoConductor", "header": "TIPOCONDUCTOR", "type": "text", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"FechaCarnet": { "field": "FechaCarnet", "header": "FECHACARNET", "type": "date", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaNacimiento": { "field": "FechaNacimiento", "header": "FECHANACIMIENTO", "type": "date", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Nombre": { "field": "Nombre", "header": "NOMBRE", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Sexo": { "field": "Sexo", "header": "SEXO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"PolizasDetalle": {
|
||||||
|
"CodigoPoliza": { "field": "CodigoPoliza", "header": "CODIGOPOLIZA", "type": "text", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"CodigoSuplemento": { "field": "CodigoSuplemento", "header": "CODIGOSUPLEMENTO", "type": "text", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"CodigoRecibo": { "field": "CodigoRecibo", "header": "CODIGORECIBO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"CodigoRiesgo": { "field": "CodigoRiesgo", "header": "CODIGORIESGO", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"DatosBancarios": { "field": "DatosBancarios", "header": "DATOSBANCARIOS", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Nombre": { "field": "Nombre", "header": "NOMBRE", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Apellidos": { "field": "Apellidos", "header": "APELLIDOS", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Documento": { "field": "Documento", "header": "DOCUMENTO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Domicilio": { "field": "Domicilio", "header": "DOMICILIO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Localidad": { "field": "Localidad", "header": "LOCALIDAD", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"CodigoPostal": { "field": "CodigoPostal", "header": "CODIGOPOSTAL", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Provincia": { "field": "Provincia", "header": "PROVINCIA", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaEfectoSuplemento": { "field": "FechaEfectoSuplemento", "header": "FECHAEFECTOSUPLEMENTO", "type": "date", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaEquipo": { "field": "FechaEquipo", "header": "FECHAEQUIPO", "type": "date", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaVencimientoSuplemento": { "field": "FechaVencimientoSuplemento", "header": "FECHAVENCIMIENTOSUPLEMENTO", "type": "date", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FormaPago": { "field": "FormaPago", "header": "FORMAPAGO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"GestorCobro": { "field": "GestorCobro", "header": "GESTORCOBRO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ImporteBonificacionAnualSuplemento": { "field": "ImporteBonificacionAnualSuplemento", "header": "IMPORTEBONIFICACIONANUALSUPLEMENTO", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ImporteBonificacionRecibo": { "field": "ImporteBonificacionRecibo", "header": "IMPORTEBONIFICACIONRECIBO", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ImporteComisionAnualSuplemento": { "field": "ImporteComisionAnualSuplemento", "header": "IMPORTECOMISIONANUALSUPLEMENTO", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ImporteComisionRecibo": { "field": "ImporteComisionRecibo", "header": "IMPORTECOMISIONRECIBO", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ImporteImpuestosAnualSuplemento": { "field": "ImporteImpuestosAnualSuplemento", "header": "IMPORTEIMPUESTOSANUALSUPLEMENTO", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ImporteImpuestosRecibo": { "field": "ImporteImpuestosRecibo", "header": "IMPORTEIMPUESTOSRECIBO", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ImporteLiquidoAnualSuplemento": { "field": "ImporteLiquidoAnualSuplemento", "header": "IMPORTELIQUIDOANUALSUPLEMENTO", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ImporteLiquidoRecibo": { "field": "ImporteLiquidoRecibo", "header": "IMPORTELIQUIDORECIBO", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ImporteNetoAnualSuplemento": { "field": "ImporteNetoAnualSuplemento", "header": "IMPORTENETOANUALSUPLEMENTO", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ImporteNetoRecibo": { "field": "ImporteNetoRecibo", "header": "IMPORTENETORECIBO", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ImporteTotalAnualSuplemento": { "field": "ImporteTotalAnualSuplemento", "header": "IMPORTETOTALANUALSUPLEMENTO", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ImporteTotalRecibo": { "field": "ImporteTotalRecibo", "header": "IMPORTETOTALRECIBO", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ImporteNeto": { "field": "ImporteNeto", "header": "IMPORTENETO", "type": "numeric", "hide": false, "virt": true, "key": false, "editable": false },
|
||||||
|
"TipoInformacion": { "field": "TipoInformacion", "header": "TIPOINFORMACION", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"SubCodigoMediador": { "field": "SubCodigoMediador", "header": "SUBCODIGOMEDIADOR", "type": "text", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"PolizasMultirriesgos": {
|
||||||
|
"CodigoPoliza": { "field": "CodigoPoliza", "header": "CODIGOPOLIZA", "type": "text", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"CodigoSuplemento": { "field": "CodigoSuplemento", "header": "CODIGOSUPLEMENTO", "type": "text", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"DocumentoAsegurado": { "field": "DocumentoAsegurado", "header": "DOCUMENTOASEGURADO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ImporteContenido": { "field": "ImporteContenido", "header": "IMPORTECONTENIDO", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ImporteContinente": { "field": "ImporteContinente", "header": "IMPORTECONTINENTE", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ImporteRC": { "field": "ImporteRC", "header": "IMPORTERC", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"NombreAsegurado": { "field": "NombreAsegurado", "header": "NOMBREASEGURADO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"SituacionRiesgo": { "field": "SituacionRiesgo", "header": "SITUACIONRIESGO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"Recibos": {
|
||||||
|
"CodigoPoliza": { "field": "CodigoPoliza", "header": "CODIGOPOLIZA", "type": "text", "hide": false, "virt": false, "key": "FK", "editable": true },
|
||||||
|
"CodigoRecibo": { "field": "CodigoRecibo", "header": "CODIGORECIBO", "type": "text", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"CodigoEmpresa": { "field": "CodigoEmpresa", "header": "CODIGOEMPRESA", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaEfecto": { "field": "FechaEfecto", "header": "FECHAEFECTO", "type": "date", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Importe": { "field": "Importe", "header": "IMPORTE", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"RecibosEstados": {
|
||||||
|
"CodigoRecibo": { "field": "CodigoRecibo", "header": "CODIGORECIBO", "type": "text", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"Situacion": { "field": "Situacion", "header": "SITUACION", "type": "date", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"Estado": { "field": "Estado", "header": "ESTADO", "type": "text", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"NombreTomador": { "field": "NombreTomador", "header": "NOMBRETOMADOR", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"AutoLiquidacion": { "field": "AutoLiquidacion", "header": "AUTOLIQUIDACION", "type": "boolean", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"CodigoGestor": { "field": "CodigoGestor", "header": "CODIGOGESTOR", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"CodigoMediador": { "field": "CodigoMediador", "header": "CODIGOMEDIADOR", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"CodigoRiesgo": { "field": "CodigoRiesgo", "header": "CODIGORIESGO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"DescripcionGestor": { "field": "DescripcionGestor", "header": "DESCRIPCIONGESTOR", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Divisa": { "field": "Divisa", "header": "DIVISA", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaVencimiento": { "field": "FechaVencimiento", "header": "FECHAVENCIMIENTO", "type": "date", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FormaPago": { "field": "FormaPago", "header": "FORMAPAGO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ImporteBonificacion": { "field": "ImporteBonificacion", "header": "IMPORTEBONIFICACION", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ImporteComision": { "field": "ImporteComision", "header": "IMPORTECOMISION", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ImporteIRPF": { "field": "ImporteIRPF", "header": "IMPORTEIRPF", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ImporteImpuestos": { "field": "ImporteImpuestos", "header": "IMPORTEIMPUESTOS", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"ImporteNeto": { "field": "ImporteNeto", "header": "IMPORTENETO", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"SubCodigoMediador": { "field": "SubCodigoMediador", "header": "SUBCODIGOMEDIADOR", "type": "text", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"Siniestros": {
|
||||||
|
"CodigoSiniestro": { "field": "CodigoSiniestro", "header": "CODIGOSINIESTRO", "type": "text", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"CodigoPoliza": { "field": "CodigoPoliza", "header": "CODIGOPOLIZA", "type": "text", "hide": false, "virt": false, "key": "FK", "editable": true },
|
||||||
|
"CodigoMediador": { "field": "CodigoMediador", "header": "CODIGOMEDIADOR", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"CodigoEmpresa": { "field": "CodigoEmpresa", "header": "CODIGOEMPRESA", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"CodigoSuplemento": { "field": "CodigoSuplemento", "header": "CODIGOSUPLEMENTO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Descripcion": { "field": "Descripcion", "header": "DESCRIPCION", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaOcurrencia": { "field": "FechaOcurrencia", "header": "FECHAOCURRENCIA", "type": "date", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaDenuncia": { "field": "FechaDenuncia", "header": "FECHADENUNCIA", "type": "date", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaTerminacion": { "field": "FechaTerminacion", "header": "FECHATERMINACION", "type": "date", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"SiniestrosEstados": {
|
||||||
|
"CodigoSiniestro": { "field": "CodigoSiniestro", "header": "CODIGOSINIESTRO", "type": "text", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"Estado": { "field": "Estado", "header": "ESTADO", "type": "text", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"TipoMovimiento": { "field": "TipoMovimiento", "header": "TIPOMOVIMIENTO", "type": "text", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"ClaveConsecuencia": { "field": "ClaveConsecuencia", "header": "CLAVECONSECUENCIA", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"CodigoActividad": { "field": "CodigoActividad", "header": "CODIGOACTIVIDAD", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"CodigoPostal": { "field": "CodigoPostal", "header": "CODIGOPOSTAL", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"CodigoSucursalTramitadora": { "field": "CodigoSucursalTramitadora", "header": "CODIGOSUCURSALTRAMITADORA", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"DescripcionClaveConsecuencia": { "field": "DescripcionClaveConsecuencia", "header": "DESCRIPCIONCLAVECONSECUENCIA", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaInformacion": { "field": "FechaInformacion", "header": "FECHAINFORMACION", "type": "date", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaReapertura": { "field": "FechaReapertura", "header": "FECHAREAPERTURA", "type": "date", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaTerminacion": { "field": "FechaTerminacion", "header": "FECHATERMINACION", "type": "date", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Hora": { "field": "Hora", "header": "HORA", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Localidad": { "field": "Localidad", "header": "LOCALIDAD", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Lugar": { "field": "Lugar", "header": "LUGAR", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"NombreTomador": { "field": "NombreTomador", "header": "NOMBRETOMADOR", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Observaciones": { "field": "Observaciones", "header": "OBSERVACIONES", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Situacion": { "field": "Situacion", "header": "SITUACION", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"SubCodigoMediador": { "field": "SubCodigoMediador", "header": "SUBCODIGOMEDIADOR", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Tramitador": { "field": "Tramitador", "header": "TRAMITADOR", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Usuario": { "field": "Usuario", "header": "USUARIO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"SiniestrosTramites": {
|
||||||
|
"CodigoSiniestro": { "field": "CodigoSiniestro", "header": "CODIGOSINIESTRO", "type": "text", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"FechaInicio": { "field": "FechaInicio", "header": "FECHAINICIO", "type": "datetime", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"Observaciones": { "field": "Observaciones", "header": "OBSERVACIONES", "type": "text", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"CodigoPoliza": { "field": "CodigoPoliza", "header": "CODIGOPOLIZA", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"CodigoExpediente": { "field": "CodigoExpediente", "header": "CODIGOEXPEDIENTE", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"TipoTramite": { "field": "TipoTramite", "header": "TIPOTRAMITE", "type": "text", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"Usuarios": {
|
||||||
|
"Usuario": { "field": "Usuario", "header": "USUARIO", "type": "text", "hide": false, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"Nombre": { "field": "Nombre", "header": "NOMBRE", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Correo": { "field": "Correo", "header": "CORREO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Activo": { "field": "Activo", "header": "ACTIVO", "type": "boolean", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Suplente": { "field": "Suplente", "header": "SUPLENTE", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaInicio": { "field": "FechaInicio", "header": "FECHAINICIO", "type": "date", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaFinal": { "field": "FechaFinal", "header": "FECHAFINAL", "type": "date", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"UsuariosFichajes": {
|
||||||
|
"id": { "field": "id", "header": "ID", "type": "numeric", "hide": true, "virt": false, "key": "PK", "editable": false },
|
||||||
|
"Usuario": { "field": "Usuario", "header": "USUARIO", "type": "text", "hide": false, "virt": false, "key": "FK", "editable": true },
|
||||||
|
"Fecha": { "field": "Fecha", "header": "FECHA", "type": "datetime", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Tipo": { "field": "Tipo", "header": "TIPO", "type": "select", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Duracion": { "field": "Duracion", "header": "DURACION", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"vClientes": {
|
||||||
|
"Nombre": { "field": "Nombre", "header": "NOMBRE", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Apellidos": { "field": "Apellidos", "header": "APELLIDOS", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Documento": { "field": "Documento", "header": "DOCUMENTO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Domicilio": { "field": "Domicilio", "header": "DOMICILIO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Localidad": { "field": "Localidad", "header": "LOCALIDAD", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"CodigoPostal": { "field": "CodigoPostal", "header": "CODIGOPOSTAL", "type": "numeric", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Provincia": { "field": "Provincia", "header": "PROVINCIA", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaCarnet": { "field": "FechaCarnet", "header": "FECHACARNET", "type": "date", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaNacimiento": { "field": "FechaNacimiento", "header": "FECHANACIMIENTO", "type": "date", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"vClientesCorreos": {
|
||||||
|
"Documento": { "field": "Documento", "header": "DOCUMENTO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Correo2": { "field": "Correo2", "header": "CORREO2", "type": "text", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
},
|
||||||
|
"vRecibos": {
|
||||||
|
"CodigoRecibo": { "field": "CodigoRecibo", "header": "CODIGORECIBO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"CodigoEmpresa": { "field": "CodigoEmpresa", "header": "CODIGOEMPRESA", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"CodigoPoliza": { "field": "CodigoPoliza", "header": "CODIGOPOLIZA", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaEfecto": { "field": "FechaEfecto", "header": "FECHAEFECTO", "type": "date", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Situacion": { "field": "Situacion", "header": "SITUACION", "type": "date", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"Estado": { "field": "Estado", "header": "ESTADO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FechaVencimiento": { "field": "FechaVencimiento", "header": "FECHAVENCIMIENTO", "type": "date", "hide": false, "virt": false, "key": false, "editable": true },
|
||||||
|
"FormaPago": { "field": "FormaPago", "header": "FORMAPAGO", "type": "text", "hide": false, "virt": false, "key": false, "editable": true }
|
||||||
|
}
|
||||||
|
}
|
||||||
74
server/scripts/generate-schema.js
Normal file
74
server/scripts/generate-schema.js
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
import { pool } from '../services/db.service';
|
||||||
|
import { resolve } from 'node:path';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Genera el esquema de la base de datos automáticamente
|
||||||
|
*/
|
||||||
|
async function generateSchema() {
|
||||||
|
try {
|
||||||
|
const rows = await pool.query(`
|
||||||
|
SELECT
|
||||||
|
TABLE_NAME as t,
|
||||||
|
COLUMN_NAME as f,
|
||||||
|
DATA_TYPE as T,
|
||||||
|
COLUMN_TYPE as fT,
|
||||||
|
EXTRA as e,
|
||||||
|
COLUMN_KEY as k
|
||||||
|
FROM information_schema.columns
|
||||||
|
WHERE table_schema = DATABASE()
|
||||||
|
ORDER BY TABLE_NAME, ORDINAL_POSITION
|
||||||
|
`);
|
||||||
|
|
||||||
|
const data = rows.reduce((acc, { t, f, T, fT, e, k }) => {
|
||||||
|
if (!acc[t]) acc[t] = {};
|
||||||
|
|
||||||
|
// Mapeo de tipos
|
||||||
|
let type = 'text';
|
||||||
|
|
||||||
|
if (['int', 'decimal', 'float', 'double'].includes(T)) {
|
||||||
|
type = 'numeric';
|
||||||
|
} else if (['date', 'datetime', 'timestamp'].includes(T)) {
|
||||||
|
type = T === 'date' ? 'date' : 'datetime';
|
||||||
|
} else if (T === 'tinyint' && fT.includes('(1)')) {
|
||||||
|
type = 'boolean';
|
||||||
|
} else if (T === 'enum') {
|
||||||
|
type = 'select';
|
||||||
|
}
|
||||||
|
|
||||||
|
const hide = f.startsWith('id') || f === 'password' || f === 'token';
|
||||||
|
const virt = e.toLowerCase().includes('generated');
|
||||||
|
const key = k === 'PRI' ? 'PK' : k === 'UNI' ? 'UK' : k === 'MUL' ? 'FK' : false;
|
||||||
|
|
||||||
|
acc[t][f] = {
|
||||||
|
field: f,
|
||||||
|
header: f.replace(/_/g, ' ').toUpperCase(),
|
||||||
|
type,
|
||||||
|
hide,
|
||||||
|
virt,
|
||||||
|
key,
|
||||||
|
editable: !(hide || key === 'PK' || virt)
|
||||||
|
};
|
||||||
|
|
||||||
|
return acc;
|
||||||
|
}, {});
|
||||||
|
|
||||||
|
const outPath = resolve('./server/lib/schema.json');
|
||||||
|
|
||||||
|
// JSON compacto para ahorrar bytes pero manteniendo legibilidad por tabla
|
||||||
|
const json = JSON.stringify(data, null, 2)
|
||||||
|
.replace(/\{\n\s+"field":[\s\S]+?\n\s+\}/g, m => m.replace(/\s*\n\s*/g, ' '));
|
||||||
|
|
||||||
|
await Bun.write(outPath, json);
|
||||||
|
|
||||||
|
console.log(`✅ Esquema generado: ${outPath}`);
|
||||||
|
console.log(`📊 Tablas: ${Object.keys(data).length}`);
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
console.error('❌ Error:', error);
|
||||||
|
} finally {
|
||||||
|
await pool.end();
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
generateSchema();
|
||||||
135
server/services/db.service.js
Normal file
135
server/services/db.service.js
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
// import mariadb from 'mariadb';
|
||||||
|
import * as mariadb from 'mariadb';
|
||||||
|
|
||||||
|
// Fix para BigInt en la serialización JSON (necesario para IDs grandes en MariaDB)
|
||||||
|
BigInt.prototype.toJSON = function () {
|
||||||
|
return this.toString();
|
||||||
|
};
|
||||||
|
|
||||||
|
// Configuración del Pool
|
||||||
|
export const pool = mariadb.createPool({
|
||||||
|
host: process.env.DB_HOST,
|
||||||
|
user: process.env.DB_USER,
|
||||||
|
password: process.env.DB_PASSWORD,
|
||||||
|
database: 'Reale',
|
||||||
|
connectionLimit: 20,
|
||||||
|
timezone: 'Z',
|
||||||
|
insertIdAsNumber: true
|
||||||
|
});
|
||||||
|
|
||||||
|
// Helper para escapar identificadores (tablas/columnas)
|
||||||
|
const b = (id) => `\`${id.replace(/`/g, '``')}\``;
|
||||||
|
|
||||||
|
export class Database {
|
||||||
|
constructor(connector) {
|
||||||
|
/** @type {mariadb.Pool | mariadb.PoolConnection} */
|
||||||
|
this.connector = connector;
|
||||||
|
}
|
||||||
|
|
||||||
|
async insert(table, data) {
|
||||||
|
const rows = Array.isArray(data) ? data : [data];
|
||||||
|
if (!rows.length) return null;
|
||||||
|
const fields = Object.keys(rows[0]);
|
||||||
|
const query = `INSERT INTO ${b(table)} (${fields.map(b).join(',')}) VALUES (${fields.map(() => '?').join(',')})`;
|
||||||
|
return this.connector.batch(query, rows.map(r => fields.map(f => r[f])));
|
||||||
|
}
|
||||||
|
|
||||||
|
async update(table, data, where) {
|
||||||
|
const fields = Object.keys(data);
|
||||||
|
const wFields = Object.keys(where);
|
||||||
|
const query = `UPDATE ${b(table)} SET ${fields.map(f => `${b(f)}=?`).join(',')} WHERE ${wFields.map(f => `${b(f)}=?`).join(' AND ')}`;
|
||||||
|
return this.connector.query(query, [...fields.map(f => data[f]), ...wFields.map(f => where[f])]);
|
||||||
|
}
|
||||||
|
|
||||||
|
async upsert(table, data, ignore = false) {
|
||||||
|
const rows = Array.isArray(data) ? data : [data];
|
||||||
|
if (!rows.length) return null;
|
||||||
|
const fields = Object.keys(rows[0]);
|
||||||
|
const set = fields.filter(f => f !== 'id').map(f => `${b(f)}=VALUES(${b(f)})`).join(',');
|
||||||
|
const query = `INSERT ${ignore ? 'IGNORE' : ''} INTO ${b(table)} (${fields.map(b).join(',')}) VALUES (${fields.map(() => '?').join(',')}) ON DUPLICATE KEY UPDATE ${set}`;
|
||||||
|
return this.connector.batch(query, rows.map(r => fields.map(f => r[f])));
|
||||||
|
}
|
||||||
|
|
||||||
|
async delete(table, where) {
|
||||||
|
const keys = Object.keys(where);
|
||||||
|
if (!keys.length) throw new Error('Delete requiere condiciones');
|
||||||
|
return this.connector.query(`DELETE FROM ${b(table)} WHERE ${keys.map(k => `${b(k)}=?`).join(' AND ')}`, keys.map(k => where[k]));
|
||||||
|
}
|
||||||
|
|
||||||
|
async select(table, where = {}, opts = { limit: 5000, order: null }) {
|
||||||
|
const keys = Object.keys(where);
|
||||||
|
let sqlStr = `SELECT * FROM ${b(table)}`;
|
||||||
|
if (keys.length) sqlStr += ` WHERE ${keys.map(k => `${b(k)}=?`).join(' AND ')}`;
|
||||||
|
if (opts.order) sqlStr += ` ORDER BY ${b(opts.order)}`;
|
||||||
|
return this.connector.query(sqlStr + ` LIMIT ${opts.limit}`, keys.map(k => where[k]));
|
||||||
|
}
|
||||||
|
|
||||||
|
async one(table, where) {
|
||||||
|
const res = await this.select(table, where, { limit: 1 });
|
||||||
|
return res[0] || null;
|
||||||
|
}
|
||||||
|
|
||||||
|
async count(table, where = {}) {
|
||||||
|
const keys = Object.keys(where);
|
||||||
|
let sqlStr = `SELECT COUNT(*) as total FROM ${b(table)}`;
|
||||||
|
if (keys.length) sqlStr += ` WHERE ${keys.map(k => `${b(k)}=?`).join(' AND ')}`;
|
||||||
|
const res = await this.connector.query(sqlStr, keys.map(k => where[k]));
|
||||||
|
return Number(res[0].total);
|
||||||
|
}
|
||||||
|
|
||||||
|
async search(table, fields, term, limit = 1000) {
|
||||||
|
if (!fields.length || !term) return [];
|
||||||
|
const where = fields.map(f => `${b(f)} LIKE ?`).join(' OR ');
|
||||||
|
return this.connector.query(`SELECT * FROM ${b(table)} WHERE ${where} LIMIT ${limit}`, fields.map(() => `%${term}%`));
|
||||||
|
}
|
||||||
|
|
||||||
|
async unique(table, fields, where = {}) {
|
||||||
|
const f = Array.isArray(fields) ? fields.map(b).join(',') : b(fields);
|
||||||
|
const keys = Object.keys(where);
|
||||||
|
let sqlStr = `SELECT DISTINCT ${f} FROM ${b(table)}`;
|
||||||
|
if (keys.length) sqlStr += ` WHERE ${keys.map(k => `${b(k)}=?`).join(' AND ')}`;
|
||||||
|
const sort = Array.isArray(fields) ? b(fields[0]) : f;
|
||||||
|
return this.connector.query(sqlStr + ` ORDER BY ${sort} ASC`, keys.map(k => where[k]));
|
||||||
|
}
|
||||||
|
|
||||||
|
async raw(query, data = {}) {
|
||||||
|
const params = [];
|
||||||
|
const sqlStr = query.replace(/:(\w+)/g, (_, key) => {
|
||||||
|
params.push(data[key]);
|
||||||
|
return '?';
|
||||||
|
});
|
||||||
|
return this.connector.query(sqlStr, params);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lógica de Transacciones
|
||||||
|
*/
|
||||||
|
export const trx = async (opts, actions) => {
|
||||||
|
const tasks = Array.isArray(opts) ? opts : [opts];
|
||||||
|
const conn = await pool.getConnection();
|
||||||
|
try {
|
||||||
|
await conn.beginTransaction();
|
||||||
|
const transactionDb = new Database(conn);
|
||||||
|
const results = {};
|
||||||
|
|
||||||
|
for (const item of tasks) {
|
||||||
|
if (typeof actions[item.action] !== 'function') {
|
||||||
|
throw new Error(`Acción ${item.action} no existe`);
|
||||||
|
}
|
||||||
|
results[item.action] = await actions[item.action](transactionDb, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
await conn.commit();
|
||||||
|
return results;
|
||||||
|
} catch (err) {
|
||||||
|
console.error('Error en la transacción:', err);
|
||||||
|
await conn.rollback();
|
||||||
|
throw err;
|
||||||
|
} finally {
|
||||||
|
if (conn) conn.release();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Exportamos la instancia principal vinculada al Pool
|
||||||
|
export const db = new Database(pool);
|
||||||
47
server/services/mail.service.js
Normal file
47
server/services/mail.service.js
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
import nodemailer from 'nodemailer';
|
||||||
|
|
||||||
|
// Configuración del transportador
|
||||||
|
const transporter = nodemailer.createTransport({
|
||||||
|
host: process.env.db, // Nota: Asegúrate de que esta variable sea el host SMTP (ej. smtp.tuproveedor.com)
|
||||||
|
port: 587,
|
||||||
|
secure: false, // true para 465, false para otros puertos
|
||||||
|
auth: {
|
||||||
|
user: "natxocc",
|
||||||
|
pass: "Ncc629406731.",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Envía un correo electrónico
|
||||||
|
* @param {string} to - Destinatario
|
||||||
|
* @param {string} subject - Asunto
|
||||||
|
* @param {string} html - Cuerpo en HTML
|
||||||
|
* @param {Object|null} file - Opcional: { filename, content, contentType }
|
||||||
|
*/
|
||||||
|
export const send = async (to, subject, html, file = null) => {
|
||||||
|
|
||||||
|
const mailOptions = {
|
||||||
|
from: '"Natxocc" <natxocc@natxocc.com>',
|
||||||
|
to,
|
||||||
|
subject,
|
||||||
|
html,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Si pasas un archivo (ej: buffer de Sharp), lo añadimos como attachment
|
||||||
|
if (file) {
|
||||||
|
mailOptions.attachments = [
|
||||||
|
{
|
||||||
|
filename: file.filename,
|
||||||
|
content: file.content,
|
||||||
|
contentType: file.contentType || 'image/jpeg'
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
await transporter.sendMail(mailOptions);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error enviando email:', error);
|
||||||
|
throw error; // Re-lanzamos para que la ruta de Hono capture el error
|
||||||
|
}
|
||||||
|
};
|
||||||
112
server/services/soap.service.js
Normal file
112
server/services/soap.service.js
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
import * as soap from 'soap';
|
||||||
|
import { HttpClient } from 'soap';
|
||||||
|
import { trx } from './db.service.js';
|
||||||
|
import { actions } from '../actions/soap.actions.js';
|
||||||
|
|
||||||
|
// --- Helpers de Fecha ---
|
||||||
|
const fmt = (d) => (!isNaN(d.getTime()) ? d.toLocaleDateString('sv-SE') : null);
|
||||||
|
|
||||||
|
const getFirstMonth = (m = 0) => {
|
||||||
|
const now = new Date();
|
||||||
|
return fmt(new Date(now.getFullYear(), now.getMonth() + m, 1));
|
||||||
|
};
|
||||||
|
|
||||||
|
const getDate = (d = 0) => {
|
||||||
|
const t = new Date();
|
||||||
|
t.setDate(t.getDate() + d);
|
||||||
|
return fmt(t);
|
||||||
|
};
|
||||||
|
|
||||||
|
const SOAP_SERVICES = {
|
||||||
|
DescargaPolizas: "https://lba.realeonline.net/Reale.B2b.Services.Multitarificadores.IisHost/DescargaPolizas.svc?wsdl",
|
||||||
|
LiquidacionMediador: "https://lba.realeonline.net/Reale.B2b.Services.Multitarificadores.IisHost/LiquidacionMediador.svc?wsdl",
|
||||||
|
DescargaSiniestros: "https://lba.realeonline.net/Reale.B2b.Services.Multitarificadores.IisHost/DescargaSiniestros.svc?wsdl",
|
||||||
|
DescargaCompletaRecibos: "https://lba.realeonline.net/Reale.B2b.Services.Multitarificadores.IisHost/DescargaCompletaRecibos.svc?wsdl",
|
||||||
|
DescargaCartera: "https://lba.realeonline.net/Reale.B2b.Services.Multitarificadores.IisHost/DescargaCartera.svc?wsdl",
|
||||||
|
ConsultaPolizas: "https://lba.realeonline.net/Reale.B2b.Services.Multitarificadores.IisHost/ConsultaPolizas.svc?wsdl",
|
||||||
|
ConsultaRecibos: "https://lba.realeonline.net/Reale.B2b.Services.Multitarificadores.IisHost/ConsultaRecibos.svc?wsdl",
|
||||||
|
ConsultaAgendaTramitacion: "https://lba.realeonline.net/Reale.B2b.Services.Multitarificadores.IisHost/ConsultaAgendaTramitacion.svc?wsdl",
|
||||||
|
TramitacionSiniestro: "https://lba.realeonline.net/Reale.B2b.Services.Multitarificadores.IisHost/TramitacionSiniestro.svc?wsdl",
|
||||||
|
};
|
||||||
|
|
||||||
|
export const soapCall = async (params, query, save = true) => {
|
||||||
|
const { CodigoMediador, service, method } = params;
|
||||||
|
const url = SOAP_SERVICES[service];
|
||||||
|
|
||||||
|
if (!url) throw new Error(`Servicio SOAP '${service}' no encontrado`);
|
||||||
|
|
||||||
|
// --- Identificador desde ENV o Query ---
|
||||||
|
const Identificador = query.Identificador || process.env[`SOAP_${CodigoMediador}`];
|
||||||
|
if (!Identificador) throw new Error(`Identificador no configurado para mediador ${CodigoMediador}`);
|
||||||
|
|
||||||
|
// --- Normalización de Argumentos ---
|
||||||
|
const Mediador = query.Mediador || CodigoMediador;
|
||||||
|
const CodigoPoliza = query.CodigoPoliza || "0";
|
||||||
|
const CodigoSiniestro = query.CodigoSiniestro || "0";
|
||||||
|
const CodigoExpediente = query.CodigoExpediente || "0";
|
||||||
|
const Observaciones = query.Observaciones || "";
|
||||||
|
const CodigoRecibo = query.CodigoRecibo || "0";
|
||||||
|
const CodigoSuplemento = query.CodigoSuplemento || "1000";
|
||||||
|
const Clave = query.Clave || "10000";
|
||||||
|
const Empresa = query.Empresa || "4";
|
||||||
|
const CodigoEmpresa = query.CodigoEmpresa || Empresa;
|
||||||
|
const Plataforma = query.Plataforma || "10000";
|
||||||
|
const CodigoRamo = query.CodigoRamo || "0";
|
||||||
|
const FechaFinal = query.FechaFinal || getDate();
|
||||||
|
const FechaRenovacion = query.FechaRenovacion || getFirstMonth(-1);
|
||||||
|
const FechaInicial = query.FechaInicial || getFirstMonth(-1);
|
||||||
|
const FechaLiquidacion = query.FechaLiquidacion || getDate();
|
||||||
|
|
||||||
|
const HEADER = `<int:Plataforma xmlns:int="http://reale.net/wcf/internalServices">${Plataforma}</int:Plataforma><int:Identificador xmlns:int="http://reale.net/wcf/internalServices">${Identificador}</int:Identificador>`;
|
||||||
|
|
||||||
|
// --- Diccionario de Configuración ---
|
||||||
|
const SOAP_CONFIG = {
|
||||||
|
DescargaPolizas: { Descargar: { args: { Clave, CodigoRamo, Empresa, FechaFinal, FechaInicial, Identificador, Plataforma, TipoSuplemento1: "NP", TipoSuplemento2: "AN", TipoSuplemento3: "RE", TipoSuplemento4: "SP" }, header: null } },
|
||||||
|
LiquidacionMediador: {
|
||||||
|
Consulta: { args: { CodigoMediador, Empresa, FechaLiquidacion }, header: HEADER },
|
||||||
|
ObtenerFechasLiquidacion: { args: { CodigoMediador, Empresa }, header: HEADER }
|
||||||
|
},
|
||||||
|
DescargaSiniestros: { Descargar: { args: { AceptarCicos: true, AceptarSdm: true, Clave, CodigoRamo, Empresa, FechaFinal, FechaInicial, Identificador, IncluirAperturas: true, IncluirAperturasCicos: true, IncluirAperturasSdm: true, IncluirPagosImdemnizacion: true, IncluirTerminados: true, Plataforma }, header: HEADER } },
|
||||||
|
DescargaCompletaRecibos: { DescargarNew: { args: { Clave, CodigoRamo, Empresa, FechaFinal, FechaInicial, Identificador, Plataforma, IncluirAnulados: true, IncluirCobrados: true, IncluirDevueltos: true, IncluirNuevos: true }, header: null } },
|
||||||
|
DescargaCartera: {
|
||||||
|
DescargarCartera: { args: { CodigoMediador, Empresa, FechaRenovacion, Identificador, Plataforma }, header: null },
|
||||||
|
ObtenerListaRamos: { args: { Empresa }, header: null },
|
||||||
|
ObtenerListaRenovaciones: { args: { Empresa, Mediador }, header: null }
|
||||||
|
},
|
||||||
|
ConsultaPolizas: {
|
||||||
|
ConsultarPoliza: { args: { CodigoPoliza, CodigoRamo, CodigoSuplemento, Empresa, Identificador, Plataforma }, header: null },
|
||||||
|
ObtenerListaPolizasMediador: { args: { CodigoMediador, Empresa, Identificador }, header: null },
|
||||||
|
ObtenerListaSuplementosPoliza: { args: { CodigoPoliza, CodigoRamo, Empresa, Identificador }, header: null }
|
||||||
|
},
|
||||||
|
ConsultaRecibos: {
|
||||||
|
ConsultarRecibo: { args: { CodigoPoliza, CodigoRamo, CodigoRecibo, CodigoSuplemento, Empresa, Identificador, Plataforma }, header: null },
|
||||||
|
ObtenerListaRecibosPoliza: { args: { CodigoPoliza, CodigoRamo, Empresa, Identificador }, header: null }
|
||||||
|
},
|
||||||
|
ConsultaAgendaTramitacion: { ConsultaTramitacion: { args: { Datos: { CodigoExpediente, CodigoPoliza, CodigoSiniestro, Empresa } }, header: HEADER } },
|
||||||
|
TramitacionSiniestro: { InsertarTramite: { args: { CodigoEmpresa, CodigoExpediente, CodigoSiniestro, Identificador, Observaciones, Plataforma }, header: null } }
|
||||||
|
};
|
||||||
|
|
||||||
|
const config = SOAP_CONFIG[service]?.[method];
|
||||||
|
if (!config) throw new Error(`Método '${method}' no configurado para el servicio '${service}'`);
|
||||||
|
|
||||||
|
try {
|
||||||
|
const client = await soap.createClientAsync(url, {
|
||||||
|
httpClient: new HttpClient(),
|
||||||
|
request: { timeout: 120000 }
|
||||||
|
});
|
||||||
|
|
||||||
|
if (config.header) client.addSoapHeader(config.header);
|
||||||
|
|
||||||
|
const methodName = `${method}Async`;
|
||||||
|
const [result] = await client[methodName](config.args);
|
||||||
|
|
||||||
|
if (save) {
|
||||||
|
await trx({ action: service, data: result }, actions);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`[SOAP ERROR] ${service}/${method}:`, error.message);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
};
|
||||||
151
server/services/soap2.service.js
Normal file
151
server/services/soap2.service.js
Normal file
@@ -0,0 +1,151 @@
|
|||||||
|
import { XMLParser } from "fast-xml-parser";
|
||||||
|
import { trx } from "./db.service.js";
|
||||||
|
import { actions } from "../actions/soap.actions.js";
|
||||||
|
|
||||||
|
const parser = new XMLParser({
|
||||||
|
removeNSPrefix: true,
|
||||||
|
ignoreAttributes: false,
|
||||||
|
parseTagValue: true,
|
||||||
|
trimValues: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
const ALIAS_MAP = {
|
||||||
|
Polizas: { service: "DescargaPolizas", method: "Descargar" },
|
||||||
|
Recibos: { service: "DescargaCompletaRecibos", method: "Descargar" },
|
||||||
|
Siniestros: { service: "DescargaSiniestros", method: "Descargar" },
|
||||||
|
Cartera: { service: "DescargaCartera", method: "DescargarCartera" },
|
||||||
|
TramiteSiniestro: { service: "ConsultaAgendaTramitacion", method: "ConsultaTramitacion" },
|
||||||
|
Poliza: { service: "ConsultaPolizas", method: "ConsultarPoliza" },
|
||||||
|
Recibo: { service: "ConsultaRecibos", method: "ConsultarRecibo" },
|
||||||
|
Siniestro: { service: "ConsultaSiniestros", method: "ConsultarSiniestro" },
|
||||||
|
};
|
||||||
|
|
||||||
|
const cleanNil = (obj) => {
|
||||||
|
if (obj !== null && typeof obj === "object") {
|
||||||
|
if (obj["@_nil"] === "true" || obj["@_nil"] === true) return null;
|
||||||
|
if (Array.isArray(obj)) return obj.map(cleanNil);
|
||||||
|
const newObj = {};
|
||||||
|
for (const [key, value] of Object.entries(obj)) {
|
||||||
|
newObj[key] = cleanNil(value);
|
||||||
|
}
|
||||||
|
return newObj;
|
||||||
|
}
|
||||||
|
return obj;
|
||||||
|
};
|
||||||
|
|
||||||
|
const fmt = (d) => (!isNaN(d.getTime()) ? d.toLocaleDateString("sv-SE") : null);
|
||||||
|
const getFirstMonth = (m = 0) => {
|
||||||
|
const now = new Date();
|
||||||
|
return fmt(new Date(now.getFullYear(), now.getMonth() + m, 1));
|
||||||
|
};
|
||||||
|
const getDate = (d = 0) => {
|
||||||
|
const t = new Date();
|
||||||
|
t.setDate(t.getDate() + d);
|
||||||
|
return fmt(t);
|
||||||
|
};
|
||||||
|
|
||||||
|
const getXmlBody = (service, method, q) => {
|
||||||
|
const templates = {
|
||||||
|
DescargaPolizas: `<des:DescargarPolizasRequest><des:Clave>${q.Clave}</des:Clave><des:CodigoRamo>${q.CodigoRamo}</des:CodigoRamo><des:Empresa>${q.Empresa}</des:Empresa><des:FechaFinal>${q.FechaFinal}</des:FechaFinal><des:FechaInicial>${q.FechaInicial}</des:FechaInicial><des:Identificador>${q.Identificador}</des:Identificador><des:Plataforma>${q.Plataforma}</des:Plataforma><des:TipoSuplemento1>NP</des:TipoSuplemento1><des:TipoSuplemento2>AN</des:TipoSuplemento2><des:TipoSuplemento3>RE</des:TipoSuplemento3><des:TipoSuplemento4>SP</des:TipoSuplemento4></des:DescargarPolizasRequest>`,
|
||||||
|
DescargaSiniestros: `<des:DescargarSiniestrosRequest><des:AceptarCicos>true</des:AceptarCicos><des:AceptarSdm>true</des:AceptarSdm><des:Clave>${q.Clave}</des:Clave><des:CodigoRamo>${q.CodigoRamo}</des:CodigoRamo><des:Empresa>${q.Empresa}</des:Empresa><des:FechaFinal>${q.FechaFinal}</des:FechaFinal><des:FechaInicial>${q.FechaInicial}</des:FechaInicial><des:Identificador>${q.Identificador}</des:Identificador><des:IncluirAperturas>true</des:IncluirAperturas><des:Plataforma>${q.Plataforma}</des:Plataforma></des:DescargarSiniestrosRequest>`,
|
||||||
|
DescargaCompletaRecibos: `<des:DescargaCompletaRecibosRequest><des:Clave>${q.Clave}</des:Clave><des:Empresa>${q.Empresa}</des:Empresa><des:FechaFinal>${q.FechaFinal}</des:FechaFinal><des:FechaInicial>${q.FechaInicial}</des:FechaInicial><des:Identificador>${q.Identificador}</des:Identificador><des:IncluirAnulados>true</des:IncluirAnulados><des:IncluirCobrados>true</des:IncluirCobrados><des:IncluirDevueltos>true</des:IncluirDevueltos><des:IncluirNuevos>true</des:IncluirNuevos></des:DescargaCompletaRecibosRequest>`,
|
||||||
|
DescargaCartera: `<des:DescargarCarteraRequest><des:CodigoMediador>${q.CodigoMediador}</des:CodigoMediador><des:Empresa>${q.Empresa}</des:Empresa><des:FechaRenovacion>${q.FechaRenovacion}</des:FechaRenovacion><des:Identificador>${q.Identificador}</des:Identificador><des:Plataforma>${q.Plataforma}</des:Plataforma></des:DescargarCarteraRequest>`,
|
||||||
|
ConsultaAgendaTramitacion: `<int:ConsultaTramitacionRequest xmlns:int="http://reale.net/wcf/internalServices"><int:Datos><int:CodigoExpediente>${q.CodigoExpediente}</int:CodigoExpediente><int:CodigoPoliza>${q.CodigoPoliza}</int:CodigoPoliza><int:CodigoSiniestro>${q.CodigoSiniestro}</int:CodigoSiniestro><int:Empresa>${q.Empresa}</int:Empresa></int:Datos></int:ConsultaTramitacionRequest>`,
|
||||||
|
ConsultaPolizas: `<des:ConsultarPolizaRequest><des:CodigoPoliza>${q.CodigoPoliza}</des:CodigoPoliza><des:CodigoRamo>${q.CodigoRamo}</des:CodigoRamo><des:CodigoSuplemento>${q.CodigoSuplemento || 0}</des:CodigoSuplemento><des:Empresa>${q.Empresa}</des:Empresa><des:Identificador>${q.Identificador}</des:Identificador><des:Plataforma>${q.Plataforma}</des:Plataforma></des:ConsultarPolizaRequest>`,
|
||||||
|
ConsultaRecibos: `<des:ConsultarReciboRequest><des:CodigoPoliza>${q.CodigoPoliza}</des:CodigoPoliza><des:CodigoRamo>${q.CodigoRamo}</des:CodigoRamo><des:CodigoRecibo>${q.CodigoRecibo || 0}</des:CodigoRecibo><des:CodigoSuplemento>${q.CodigoSuplemento || 0}</des:CodigoSuplemento><des:Empresa>${q.Empresa}</des:Empresa><des:Identificador>${q.Identificador}</des:Identificador><des:Plataforma>${q.Plataforma}</des:Plataforma></des:ConsultarReciboRequest>`,
|
||||||
|
ConsultaSiniestros: `<des:ConsultarSiniestroRequest><des:CodigoPoliza>${q.CodigoPoliza}</des:CodigoPoliza><des:CodigoRamo>${q.CodigoRamo}</des:CodigoRamo><des:CodigoSiniestro>${q.CodigoSiniestro}</des:CodigoSiniestro><des:CodigoSuplemento>${q.CodigoSuplemento || 0}</des:CodigoSuplemento><des:Empresa>${q.Empresa}</des:Empresa><des:Identificador>${q.Identificador}</des:Identificador><des:Plataforma>${q.Plataforma}</des:Plataforma></des:ConsultarSiniestroRequest>`,
|
||||||
|
};
|
||||||
|
return templates[service] || `<des:${method}Request><des:Identificador>${q.Identificador}</des:Identificador></des:${method}Request>`;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const soapCall = async (params, query, save = true) => {
|
||||||
|
const { CodigoMediador, alias } = params;
|
||||||
|
const target = ALIAS_MAP[alias] || { service: params.service, method: params.method };
|
||||||
|
const { service, method } = target;
|
||||||
|
|
||||||
|
if (!service) throw new Error(`Servicio o Alias '${alias || params.service}' no definido`);
|
||||||
|
|
||||||
|
const url = `https://lba.realeonline.net/Reale.B2b.Services.Multitarificadores.IisHost/${service}.svc`;
|
||||||
|
const Identificador = query.Identificador || process.env[`SOAP_${CodigoMediador}`];
|
||||||
|
if (!Identificador) throw new Error(`Identificador no configurado para ${CodigoMediador}`);
|
||||||
|
|
||||||
|
const q = {
|
||||||
|
...query,
|
||||||
|
Identificador,
|
||||||
|
CodigoMediador,
|
||||||
|
Clave: query.Clave || "10000",
|
||||||
|
Empresa: query.Empresa || "4",
|
||||||
|
Plataforma: query.Plataforma || "10000",
|
||||||
|
CodigoRamo: query.CodigoRamo || "0",
|
||||||
|
CodigoSuplemento: query.CodigoSuplemento || "0",
|
||||||
|
CodigoPoliza: query.CodigoPoliza || "0",
|
||||||
|
CodigoSiniestro: query.CodigoSiniestro || "0",
|
||||||
|
CodigoExpediente: query.CodigoExpediente || "0",
|
||||||
|
FechaFinal: query.FechaFinal || getDate(),
|
||||||
|
FechaInicial: query.FechaInicial || (alias === "Cartera" ? getFirstMonth(0) : getFirstMonth(-1)),
|
||||||
|
FechaRenovacion: query.FechaRenovacion || getFirstMonth(1),
|
||||||
|
};
|
||||||
|
|
||||||
|
let nsBase = "http://reale.net/B2b/Multitarificadores";
|
||||||
|
let nsName = service;
|
||||||
|
let contract = `I${service}`;
|
||||||
|
let actMethod = method;
|
||||||
|
let soapHeader = "";
|
||||||
|
|
||||||
|
if (service === "DescargaCartera") {
|
||||||
|
nsName = "DescargaFicheros";
|
||||||
|
contract = "IDescargaCartera";
|
||||||
|
}
|
||||||
|
else if (service === "ConsultaPolizas") {
|
||||||
|
nsName = "ConsultaPolizas";
|
||||||
|
contract = "IConsultaPolizas";
|
||||||
|
}
|
||||||
|
else if (service === "DescargaCompletaRecibos" && method === "Descargar") {
|
||||||
|
actMethod = "DescargarNew";
|
||||||
|
}
|
||||||
|
else if (service === "ConsultaAgendaTramitacion") {
|
||||||
|
nsBase = "http://reale.net/wcf/internalServices";
|
||||||
|
nsName = "";
|
||||||
|
contract = "IAgendaTramitacion";
|
||||||
|
actMethod = "ConsultaTramitacion";
|
||||||
|
soapHeader = `<int:Plataforma xmlns:int="http://reale.net/wcf/internalServices">${q.Plataforma}</int:Plataforma><int:Identificador xmlns:int="http://reale.net/wcf/internalServices">${q.Identificador}</int:Identificador>`;
|
||||||
|
}
|
||||||
|
|
||||||
|
const fullNs = nsName ? `${nsBase}/${nsName}` : nsBase;
|
||||||
|
const soapAction = `"${fullNs}/${contract}/${actMethod}"`.replace(/([^:])\/\//g, "$1/");
|
||||||
|
|
||||||
|
const soapEnvelope = `
|
||||||
|
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
|
||||||
|
xmlns:des="http://reale.net/B2b/Multitarificadores/${nsName || "DescargaFicheros"}"
|
||||||
|
xmlns:int="http://reale.net/wcf/internalServices">
|
||||||
|
<soapenv:Header>${soapHeader}</soapenv:Header>
|
||||||
|
<soapenv:Body>${getXmlBody(service, method, q)}</soapenv:Body>
|
||||||
|
</soapenv:Envelope>`.trim();
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await fetch(url, {
|
||||||
|
method: "POST",
|
||||||
|
headers: { "Content-Type": "text/xml;charset=UTF-8", "SOAPAction": soapAction },
|
||||||
|
body: soapEnvelope,
|
||||||
|
});
|
||||||
|
|
||||||
|
const xmlData = await response.text();
|
||||||
|
const rawJson = parser.parse(xmlData);
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
const fault = rawJson.Envelope?.Body?.Fault?.faultstring;
|
||||||
|
throw new Error(typeof fault === "object" ? JSON.stringify(fault) : fault || `Error ${response.status}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const resultBody = rawJson.Envelope?.Body;
|
||||||
|
const responseName = Object.keys(resultBody || {})[0];
|
||||||
|
const result = cleanNil(resultBody?.[responseName] || {});
|
||||||
|
|
||||||
|
// CUIDADO DA ERROR CUANDO USAS /Poliza /Siniestro /Recibo porque no hay un action para ellos
|
||||||
|
if (save) await trx({ action: service, data: result }, actions);
|
||||||
|
return result;
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`[SOAP ERROR] ${service}/${method}:`, error.message);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
};
|
||||||
136
src/App.js
Normal file
136
src/App.js
Normal file
@@ -0,0 +1,136 @@
|
|||||||
|
import { html, $ } from "sigpro";
|
||||||
|
import { isDark } from "./store.js";
|
||||||
|
import { routes } from 'virtual:sigpro-routes';
|
||||||
|
import "@components/Drawer.js";
|
||||||
|
import "@components/Menu.js";
|
||||||
|
import "@components/Button.js";
|
||||||
|
|
||||||
|
|
||||||
|
// --- COMPONENTE: BUSCADOR ---
|
||||||
|
const SearchBar = (buscar) => html`
|
||||||
|
<label class="floating-label">
|
||||||
|
<span>Buscar</span>
|
||||||
|
<label class="input">
|
||||||
|
<input type="text" class="input" :value="${buscar}" @input=${(e) => buscar(e.target.value)} placeholder="Buscar..." />
|
||||||
|
<span ?hidden=${() => buscar().length === 0} class="btn btn-sm btn-ghost icon-[lucide--x]" @click=${() => buscar("")}></span>
|
||||||
|
<span class="icon-[lucide--search]"></span>
|
||||||
|
</label>
|
||||||
|
</label>
|
||||||
|
`;
|
||||||
|
|
||||||
|
// --- COMPONENTE: MENU USUARIO ---
|
||||||
|
const UserMenu = () => html`
|
||||||
|
<div class="dropdown dropdown-end">
|
||||||
|
<div tabindex="0" role="button" class="btn btn-ghost btn-circle avatar">
|
||||||
|
<div class="w-8 rounded-full flex items-center justify-center">
|
||||||
|
<span class="icon-[lucide--user] size-5"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<ul tabindex="0" class="dropdown-content menu bg-base-100 rounded-box z-100 w-52 p-2 shadow-2xl mt-3 border border-base-300">
|
||||||
|
<li class="menu-title"><span>Cuenta</span></li>
|
||||||
|
<li>
|
||||||
|
<a href="#/profile">
|
||||||
|
<span class="icon-[lucide--user-cog] size-4"></span>
|
||||||
|
Perfil
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="#/settings">
|
||||||
|
<span class="icon-[lucide--settings] size-4"></span>
|
||||||
|
Ajustes
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<div class="divider my-0"></div>
|
||||||
|
<li>
|
||||||
|
<a class="text-error">
|
||||||
|
<span class="icon-[lucide--log-out] size-4"></span>
|
||||||
|
Salir
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default function App() {
|
||||||
|
const openMenu = $(false);
|
||||||
|
const buscar = $("");
|
||||||
|
|
||||||
|
// Array de configuración (Data)
|
||||||
|
const menuConfig = [
|
||||||
|
{ label: "Panel Principal", icon: "icon-[lucide--home]", href: "#/", active: true },
|
||||||
|
{ label: "Perfil", href: "#/profile", icon: "icon-[lucide--user]" },
|
||||||
|
|
||||||
|
{
|
||||||
|
label: "Clientes",
|
||||||
|
icon: "icon-[lucide--database]",
|
||||||
|
open: false,
|
||||||
|
sub: [
|
||||||
|
{ label: "Clientes Activos", icon: "icon-[lucide--users]", href: "#/users", onClick: (i) => console.log("Users", i) },
|
||||||
|
{ label: "Todos", icon: "icon-[lucide--shield-check]", href: "#/roles" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Pólizas",
|
||||||
|
icon: "icon-[lucide--database]",
|
||||||
|
open: false,
|
||||||
|
sub: [
|
||||||
|
{ label: "Nueva Producción", icon: "icon-[lucide--users]", href: "#/users" },
|
||||||
|
{ label: "Anulaciones", icon: "icon-[lucide--shield-check]", href: "#/roles" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Recibos",
|
||||||
|
icon: "icon-[lucide--settings]",
|
||||||
|
sub: [
|
||||||
|
{ label: "Recibos Pendientes", icon: "icon-[lucide--user-circle]", href: "#/profile" },
|
||||||
|
{ label: "Seguridad", icon: "icon-[lucide--lock]", href: "#/security" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Comercial",
|
||||||
|
icon: "icon-[lucide--settings]",
|
||||||
|
sub: [
|
||||||
|
{ label: "Oportunidades", icon: "icon-[lucide--user-circle]", href: "#/profile" },
|
||||||
|
{ label: "Seguimiento", icon: "icon-[lucide--user-circle]", href: "#/profile" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Siniestros",
|
||||||
|
icon: "icon-[lucide--settings]",
|
||||||
|
sub: [
|
||||||
|
{ label: "Nuevos Siniestros", icon: "icon-[lucide--user-circle]", href: "#/profile" },
|
||||||
|
{ label: "Siniestros en curso", icon: "icon-[lucide--lock]", href: "#/security" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{ label: "Acerca de", icon: "icon-[lucide--info]", href: "#/about" },
|
||||||
|
];
|
||||||
|
|
||||||
|
return html`
|
||||||
|
<div data-theme="${() => (isDark() ? "dark" : "light")}" class="min-h-screen bg-base-100 text-base-content transition-colors duration-300">
|
||||||
|
<header class="navbar bg-base-200 justify-between shadow-xl px-4">
|
||||||
|
<div class="flex items-center gap-2">
|
||||||
|
<button class="btn btn-ghost" @click=${() => openMenu(!openMenu())}>
|
||||||
|
<span class="icon-[lucide--menu] size-5"></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
${SearchBar(buscar)}
|
||||||
|
|
||||||
|
<div class="flex items-center gap-2">
|
||||||
|
<button class="btn btn-ghost" @click=${() => isDark(!isDark())}>
|
||||||
|
<span class="${() => (isDark() ? "icon-[lucide--moon]" : "icon-[lucide--sun]")}"></span>
|
||||||
|
</button>
|
||||||
|
${UserMenu()}
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<c-drawer .open=${openMenu} @change=${(e) => openMenu(false)}>
|
||||||
|
<c-menu cls="menu-lg" .items=${menuConfig} @select=${() => openMenu(false)}></c-menu>
|
||||||
|
</c-drawer>
|
||||||
|
|
||||||
|
<main class="p-4 flex flex-col gap-4 mx-auto w-full">
|
||||||
|
<div class="p-4 bg-base-100 rounded-box shadow-sm">${$.router(routes)}</div>
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
}
|
||||||
38
src/app.css
Normal file
38
src/app.css
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
@import "tailwindcss";
|
||||||
|
@plugin "@iconify/tailwind4";
|
||||||
|
@plugin "daisyui" {
|
||||||
|
themes:
|
||||||
|
light --default,
|
||||||
|
dark --prefersdark;
|
||||||
|
include:
|
||||||
|
alert, avatar, badge, button, card, checkbox, collapse, drawer, dropdown, fab, fieldset, loading, indicator, input, kbd, label, list, menu, modal,
|
||||||
|
navbar, radio, range, select, skeleton, tab, textarea, toast, toggle, tooltip, validator, rating, mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "Plus Jakarta Sans";
|
||||||
|
src: url("/jakarta.woff2") format("woff2");
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: normal;
|
||||||
|
font-display: swap;
|
||||||
|
}
|
||||||
|
|
||||||
|
:root {
|
||||||
|
font-size: 14px;
|
||||||
|
/* font-family: "Plus Jakarta Sans", ui-sans-serif, system-ui, sans-serif; */
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-ghost {
|
||||||
|
border-color: transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.floating-label > span {
|
||||||
|
font-size: 1.1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility input {
|
||||||
|
@apply transition-all duration-300 ease-in-out outline-none shrink appearance-none items-center;
|
||||||
|
&:hover {
|
||||||
|
background-color: var(--color-base-300);
|
||||||
|
}
|
||||||
|
}
|
||||||
142
src/components/AgGrid.js
Normal file
142
src/components/AgGrid.js
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
import {
|
||||||
|
createGrid,
|
||||||
|
ModuleRegistry,
|
||||||
|
ValidationModule,
|
||||||
|
ColumnAutoSizeModule,
|
||||||
|
CellStyleModule,
|
||||||
|
QuickFilterModule,
|
||||||
|
RowSelectionModule,
|
||||||
|
TextEditorModule,
|
||||||
|
ClientSideRowModelModule,
|
||||||
|
themeQuartz,
|
||||||
|
iconSetQuartzLight,
|
||||||
|
} from "ag-grid-community";
|
||||||
|
|
||||||
|
import {
|
||||||
|
MultiFilterModule,
|
||||||
|
CellSelectionModule,
|
||||||
|
PivotModule,
|
||||||
|
MasterDetailModule,
|
||||||
|
SideBarModule,
|
||||||
|
ColumnsToolPanelModule,
|
||||||
|
ColumnMenuModule,
|
||||||
|
StatusBarModule,
|
||||||
|
ExcelExportModule,
|
||||||
|
ClipboardModule,
|
||||||
|
} from "ag-grid-enterprise";
|
||||||
|
|
||||||
|
import { $ } from "sigpro";
|
||||||
|
import { isDark } from "../store.js";
|
||||||
|
|
||||||
|
// ✅ Registro de módulos (UNA VEZ, fuera del componente)
|
||||||
|
ModuleRegistry.registerModules([
|
||||||
|
ValidationModule,
|
||||||
|
ColumnAutoSizeModule,
|
||||||
|
CellStyleModule,
|
||||||
|
QuickFilterModule,
|
||||||
|
RowSelectionModule,
|
||||||
|
TextEditorModule,
|
||||||
|
ClientSideRowModelModule,
|
||||||
|
MultiFilterModule,
|
||||||
|
CellSelectionModule,
|
||||||
|
PivotModule,
|
||||||
|
MasterDetailModule,
|
||||||
|
SideBarModule,
|
||||||
|
ColumnsToolPanelModule,
|
||||||
|
ColumnMenuModule,
|
||||||
|
StatusBarModule,
|
||||||
|
ExcelExportModule,
|
||||||
|
ClipboardModule,
|
||||||
|
]);
|
||||||
|
|
||||||
|
const getTheme = (isDark) =>
|
||||||
|
themeQuartz.withPart(iconSetQuartzLight).withParams({
|
||||||
|
browserColorScheme: isDark ? "dark" : "light",
|
||||||
|
backgroundColor: isDark ? "#121212" : "#FDFDFD",
|
||||||
|
foregroundColor: isDark ? "#E0E0E0" : "#181D1F",
|
||||||
|
accentColor: isDark ? "#4FAAFF" : "#004B9C",
|
||||||
|
headerBackgroundColor: isDark ? "#2A2A2A" : "#EEB111",
|
||||||
|
headerTextColor: isDark ? "#4FAAFF" : "#004B9C",
|
||||||
|
borderRadius: 4,
|
||||||
|
columnBorder: false,
|
||||||
|
headerFontSize: 14,
|
||||||
|
headerFontWeight: 600,
|
||||||
|
listItemHeight: 20,
|
||||||
|
iconSize: 14,
|
||||||
|
spacing: 3,
|
||||||
|
wrapperBorderRadius: 4,
|
||||||
|
});
|
||||||
|
|
||||||
|
$.component(
|
||||||
|
"c-grid",
|
||||||
|
(props, { onUnmount }) => {
|
||||||
|
let gridApi = null;
|
||||||
|
|
||||||
|
// ✅ Crear contenedor específico para este grid
|
||||||
|
const container = document.createElement("div");
|
||||||
|
container.style.height = "100%";
|
||||||
|
|
||||||
|
const gridContainer = document.createElement("div");
|
||||||
|
gridContainer.style.height = "100%";
|
||||||
|
container.appendChild(gridContainer);
|
||||||
|
|
||||||
|
// Theme observer
|
||||||
|
const currentTheme = $(document.querySelector("[data-theme]")?.getAttribute("data-theme") || "light");
|
||||||
|
const observer = new MutationObserver(() => {
|
||||||
|
const theme = document.querySelector("[data-theme]")?.getAttribute("data-theme");
|
||||||
|
if (theme !== currentTheme()) currentTheme(theme);
|
||||||
|
});
|
||||||
|
|
||||||
|
observer.observe(document.documentElement, {
|
||||||
|
attributes: true,
|
||||||
|
subtree: true,
|
||||||
|
attributeFilter: ["data-theme"],
|
||||||
|
});
|
||||||
|
|
||||||
|
// ✅ LIMPIEZA COMPLETA
|
||||||
|
onUnmount(() => {
|
||||||
|
observer.disconnect();
|
||||||
|
|
||||||
|
// 1. Destruir el grid
|
||||||
|
if (gridApi) {
|
||||||
|
gridApi.destroy();
|
||||||
|
gridApi = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. Eliminar el contenedor del DOM
|
||||||
|
if (gridContainer.parentNode) {
|
||||||
|
gridContainer.parentNode.removeChild(gridContainer);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. Limpiar referencias
|
||||||
|
container.innerHTML = "";
|
||||||
|
});
|
||||||
|
|
||||||
|
// Efecto para tema y creación inicial
|
||||||
|
$.effect(() => {
|
||||||
|
const dark = isDark();
|
||||||
|
const agTheme = getTheme(dark);
|
||||||
|
|
||||||
|
if (!gridApi) {
|
||||||
|
gridApi = createGrid(gridContainer, {
|
||||||
|
...(props.options?.() || {}),
|
||||||
|
theme: agTheme,
|
||||||
|
rowData: props.data?.() || [],
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
gridApi.setGridOption("theme", agTheme);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Efecto para datos
|
||||||
|
$.effect(() => {
|
||||||
|
const data = props.data?.();
|
||||||
|
if (gridApi && Array.isArray(data)) {
|
||||||
|
gridApi.setGridOption("rowData", data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return container;
|
||||||
|
},
|
||||||
|
["data", "options"],
|
||||||
|
);
|
||||||
31
src/components/Button.js
Normal file
31
src/components/Button.js
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
import { $, html } from "sigpro";
|
||||||
|
|
||||||
|
$.component(
|
||||||
|
"c-button",
|
||||||
|
(props, { emit, slot }) => {
|
||||||
|
const spinner = () => html`
|
||||||
|
<span .class="${() => `loading loading-spinner loading-xs ${props.loading() ? "" : "hidden"}`}"></span>
|
||||||
|
`;
|
||||||
|
|
||||||
|
return html`
|
||||||
|
<div class="${props.tooltip() ? "tooltip" : ""}" data-tip=${() => props.tooltip() ?? ""}>
|
||||||
|
<button
|
||||||
|
class="${() => `btn ${props.cls() ?? ""} ${props.badge() ? "indicator" : ""}`}"
|
||||||
|
?disabled=${props.loading}
|
||||||
|
@click=${(e) => {
|
||||||
|
e.stopPropagation();
|
||||||
|
if (!props.loading()) emit("click", e);
|
||||||
|
}}>
|
||||||
|
${spinner} ${slot()}
|
||||||
|
${() =>
|
||||||
|
props.badge()
|
||||||
|
? html`
|
||||||
|
<span class="indicator-item badge badge-secondary">${props.badge()}</span>
|
||||||
|
`
|
||||||
|
: null}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
},
|
||||||
|
["cls", "loading", "badge", "tooltip"],
|
||||||
|
);
|
||||||
26
src/components/Card.js
Normal file
26
src/components/Card.js
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
import { $, html } from "sigpro";
|
||||||
|
|
||||||
|
$.component(
|
||||||
|
"c-card",
|
||||||
|
(props, host) => {
|
||||||
|
return html`
|
||||||
|
<div class="${() => `card bg-base-100 shadow-sm ${props.class || ""}`}">
|
||||||
|
${() =>
|
||||||
|
props.img
|
||||||
|
? html`
|
||||||
|
<figure>
|
||||||
|
<img src="${props.img}" alt="${props.alt || "Card image"}" />
|
||||||
|
</figure>
|
||||||
|
`
|
||||||
|
: null}
|
||||||
|
|
||||||
|
<div class="card-body">
|
||||||
|
<h2 class="card-title">${host.slot("title")}</h2>
|
||||||
|
<div class="card-content">${host.slot("body")}</div>
|
||||||
|
<div class="card-actions justify-end">${host.slot("actions")}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
},
|
||||||
|
["img", "alt", "class"],
|
||||||
|
);
|
||||||
27
src/components/Checkbox.js
Normal file
27
src/components/Checkbox.js
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
import { $ html } from "sigpro";
|
||||||
|
|
||||||
|
$.component(
|
||||||
|
"c-check",
|
||||||
|
(props, host) => {
|
||||||
|
return html`
|
||||||
|
<label class="label cursor-pointer flex gap-2">
|
||||||
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
@change="${(e) => {
|
||||||
|
e.stopPropagation();
|
||||||
|
emit("change", e.target.checked);
|
||||||
|
}}"
|
||||||
|
.checked="${() => props.checked()}"
|
||||||
|
.disabled="${() => props.disabled()}"
|
||||||
|
class="${cls(props.toggle ? "toggle" : "checkbox")}" />
|
||||||
|
${() =>
|
||||||
|
props.label
|
||||||
|
? html`
|
||||||
|
<span class="label-text">${props.label}</span>
|
||||||
|
`
|
||||||
|
: ""}
|
||||||
|
</label>
|
||||||
|
`;
|
||||||
|
},
|
||||||
|
["checked", "label", "class", "disabled", "toggle"],
|
||||||
|
);
|
||||||
65
src/components/ColorPicker.js
Normal file
65
src/components/ColorPicker.js
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
import { $, html } from "sigpro";
|
||||||
|
|
||||||
|
const p1 = ["#000", "#1A1A1A", "#333", "#4D4D4D", "#666", "#808080", "#B3B3B3", "#FFF"];
|
||||||
|
const p2 = ["#450a0a", "#7f1d1d", "#991b1b", "#b91c1c", "#dc2626", "#ef4444", "#f87171", "#fca5a5"];
|
||||||
|
const p3 = ["#431407", "#7c2d12", "#9a3412", "#c2410c", "#ea580c", "#f97316", "#fb923c", "#ffedd5"];
|
||||||
|
const p4 = ["#713f12", "#a16207", "#ca8a04", "#eab308", "#facc15", "#fde047", "#fef08a", "#fff9c4"];
|
||||||
|
const p5 = ["#064e3b", "#065f46", "#059669", "#10b981", "#34d399", "#4ade80", "#84cc16", "#d9f99d"];
|
||||||
|
const p6 = ["#082f49", "#075985", "#0284c7", "#0ea5e9", "#38bdf8", "#7dd3fc", "#22d3ee", "#cffafe"];
|
||||||
|
const p7 = ["#1e1b4b", "#312e81", "#4338ca", "#4f46e5", "#6366f1", "#818cf8", "#a5b4fc", "#e0e7ff"];
|
||||||
|
const p8 = ["#2e1065", "#4c1d95", "#6d28d9", "#7c3aed", "#8b5cf6", "#a855f7", "#d946ef", "#fae8ff"];
|
||||||
|
|
||||||
|
const palette = [...p1, ...p2, ...p3, ...p4, ...p5, ...p6, ...p7, ...p8];
|
||||||
|
|
||||||
|
$.component(
|
||||||
|
"c-colorpicker",
|
||||||
|
(props, { emit }) => {
|
||||||
|
const handleSelect = (c) => {
|
||||||
|
if (typeof props.color === "function") props.color(c);
|
||||||
|
emit("select", c);
|
||||||
|
};
|
||||||
|
|
||||||
|
const getColor = () => props.color() ?? "#000000";
|
||||||
|
|
||||||
|
return html`
|
||||||
|
<div class="card bg-base-200 border-base-300 w-fit border p-2 shadow-sm select-none">
|
||||||
|
<div class="grid grid-cols-8 gap-0.5">
|
||||||
|
${() =>
|
||||||
|
palette.map(
|
||||||
|
(c) => html`
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
.style=${`background-color: ${c}`}
|
||||||
|
.class=${() => {
|
||||||
|
const active = getColor() === c;
|
||||||
|
return `size-5 rounded-xs cursor-pointer transition-all hover:scale-125 hover:z-10 active:scale-90 outline-none border border-black/5 ${
|
||||||
|
active ? "ring-2 ring-offset-1 ring-primary z-10 scale-110" : ""
|
||||||
|
}`;
|
||||||
|
}}
|
||||||
|
@click=${() => handleSelect(c)}></button>
|
||||||
|
`,
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex items-center gap-1 mt-2">
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
class="input input-bordered input-xs h-6 px-1 font-mono text-[10px] w-full"
|
||||||
|
.value=${props.color}
|
||||||
|
@input=${(e) => handleSelect(e.target.value)} />
|
||||||
|
|
||||||
|
<div class="tooltip" data-tip="Copiar">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
class="btn btn-xs btn-square border border-base-content/20 shadow-inner"
|
||||||
|
.style=${() => `background-color: ${getColor()}`}
|
||||||
|
@click=${() => navigator.clipboard.writeText(getColor())}>
|
||||||
|
<span class="icon-[lucide--copy] text-white mix-blend-difference"></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
},
|
||||||
|
["color"],
|
||||||
|
);
|
||||||
168
src/components/DatePicker.js
Normal file
168
src/components/DatePicker.js
Normal file
@@ -0,0 +1,168 @@
|
|||||||
|
import { $, html } from "sigpro";
|
||||||
|
|
||||||
|
$.component(
|
||||||
|
"c-datepicker",
|
||||||
|
(props, { emit }) => {
|
||||||
|
const viewDate = $(new Date());
|
||||||
|
const hoveredDate = $(null);
|
||||||
|
const todayISO = new Date().toLocaleDateString("en-CA");
|
||||||
|
|
||||||
|
const toISOLocal = (date) => {
|
||||||
|
if (!date) return null;
|
||||||
|
return date.toISOString().split("T")[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
// Función unificada para navegar tiempo
|
||||||
|
const navigate = (type, offset) => {
|
||||||
|
hoveredDate(null);
|
||||||
|
const d = viewDate();
|
||||||
|
if (type === "month") {
|
||||||
|
viewDate(new Date(d.getFullYear(), d.getMonth() + offset, 1));
|
||||||
|
} else if (type === "year") {
|
||||||
|
viewDate(new Date(d.getFullYear() + offset, d.getMonth(), 1));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const selectDate = (dateObj) => {
|
||||||
|
const isoDate = toISOLocal(dateObj);
|
||||||
|
const isRange = props.range() === "true" || props.range() === true;
|
||||||
|
const currentVal = typeof props.value === "function" ? props.value() : props.value;
|
||||||
|
|
||||||
|
let result;
|
||||||
|
if (!isRange) {
|
||||||
|
result = isoDate;
|
||||||
|
} else {
|
||||||
|
const s = currentVal?.start || null;
|
||||||
|
const e = currentVal?.end || null;
|
||||||
|
if (!s || (s && e)) {
|
||||||
|
result = { start: isoDate, end: null };
|
||||||
|
} else {
|
||||||
|
result = isoDate < s ? { start: isoDate, end: s } : { start: s, end: isoDate };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof props.value === "function") {
|
||||||
|
props.value(isRange ? { ...result } : result);
|
||||||
|
}
|
||||||
|
emit("change", result);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleGridClick = (e) => {
|
||||||
|
const btn = e.target.closest("button[data-date]");
|
||||||
|
if (!btn) return;
|
||||||
|
selectDate(new Date(btn.getAttribute("data-date")));
|
||||||
|
};
|
||||||
|
|
||||||
|
const days = $(() => {
|
||||||
|
const d = viewDate();
|
||||||
|
const year = d.getFullYear();
|
||||||
|
const month = d.getMonth();
|
||||||
|
const firstDay = new Date(year, month, 1).getDay();
|
||||||
|
const offset = firstDay === 0 ? 6 : firstDay - 1;
|
||||||
|
const total = new Date(year, month + 1, 0).getDate();
|
||||||
|
let grid = Array(offset).fill(null);
|
||||||
|
for (let i = 1; i <= total; i++) grid.push(new Date(year, month, i));
|
||||||
|
return grid;
|
||||||
|
});
|
||||||
|
|
||||||
|
const getWeekNumber = (d) => {
|
||||||
|
const t = new Date(d.valueOf());
|
||||||
|
t.setDate(t.getDate() - ((d.getDay() + 6) % 7) + 3);
|
||||||
|
const firstThurs = t.valueOf();
|
||||||
|
t.setMonth(0, 1);
|
||||||
|
if (t.getDay() !== 4) t.setMonth(0, 1 + ((4 - t.getDay() + 7) % 7));
|
||||||
|
return 1 + Math.ceil((firstThurs - t.getTime()) / 604800000);
|
||||||
|
};
|
||||||
|
|
||||||
|
return html`
|
||||||
|
<div class="card bg-base-100 shadow-xl border border-base-300 w-80 p-4 pb-6 rounded-box select-none">
|
||||||
|
<div class="flex justify-between items-center mb-4 gap-1">
|
||||||
|
<div class="flex gap-0.5">
|
||||||
|
<button type="button" class="btn btn-ghost btn-xs px-1" @click=${() => navigate("year", -1)}>
|
||||||
|
<span class="icon-[lucide--chevrons-left] w-4 h-4 opacity-50"></span>
|
||||||
|
</button>
|
||||||
|
<button type="button" class="btn btn-ghost btn-xs px-1" @click=${() => navigate("month", -1)}>
|
||||||
|
<span class="icon-[lucide--chevron-left] w-4 h-4"></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<span class="text-xs font-bold capitalize flex-1 text-center">
|
||||||
|
${() => viewDate().toLocaleString("es-ES", { month: "long" }).toUpperCase()}
|
||||||
|
<span class="opacity-50 ml-1">${() => viewDate().getFullYear()}</span>
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<div class="flex gap-0.5">
|
||||||
|
<button type="button" class="btn btn-ghost btn-xs px-1" @click=${() => navigate("month", 1)}>
|
||||||
|
<span class="icon-[lucide--chevron-right] w-4 h-4"></span>
|
||||||
|
</button>
|
||||||
|
<button type="button" class="btn btn-ghost btn-xs px-1" @click=${() => navigate("year", 1)}>
|
||||||
|
<span class="icon-[lucide--chevrons-right] w-4 h-4 opacity-50"></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="grid grid-cols-8 gap-1 px-1" @click=${handleGridClick}>
|
||||||
|
<div class="flex items-center justify-center text-[10px] opacity-40 font-bold uppercase"></div>
|
||||||
|
${() =>
|
||||||
|
["L", "M", "X", "J", "V", "S", "D"].map(
|
||||||
|
(l) => html`
|
||||||
|
<div class="flex items-center justify-center text-[10px] opacity-40 font-bold uppercase">${l}</div>
|
||||||
|
`,
|
||||||
|
)}
|
||||||
|
${() =>
|
||||||
|
days().map((date, i) => {
|
||||||
|
const isFirstCol = i % 7 === 0;
|
||||||
|
const iso = date ? toISOLocal(date) : null;
|
||||||
|
|
||||||
|
const btnClass = () => {
|
||||||
|
if (!date) return "";
|
||||||
|
const val = typeof props.value === "function" ? props.value() : props.value;
|
||||||
|
const isR = props.range() === "true" || props.range() === true;
|
||||||
|
const sDate = isR ? val?.start : typeof val === "string" ? val : val?.start;
|
||||||
|
const eDate = isR ? val?.end : null;
|
||||||
|
const hDate = hoveredDate();
|
||||||
|
|
||||||
|
const isSel = iso === sDate || iso === eDate;
|
||||||
|
const tEnd = eDate || hDate;
|
||||||
|
const inRange = isR && sDate && tEnd && !isSel && ((iso > sDate && iso < tEnd) || (iso < sDate && iso > tEnd));
|
||||||
|
|
||||||
|
return `btn btn-xs p-0 aspect-square min-h-0 h-auto font-normal rounded-md relative
|
||||||
|
${isSel ? "btn-primary !text-primary-content shadow-md" : "btn-ghost"}
|
||||||
|
${inRange ? "!bg-primary/20 !text-base-content" : ""}`;
|
||||||
|
};
|
||||||
|
|
||||||
|
return html`
|
||||||
|
${isFirstCol
|
||||||
|
? html`
|
||||||
|
<div class="flex items-center justify-center text-[10px] opacity-30 italic bg-base-200/50 rounded-md aspect-square">
|
||||||
|
${date ? getWeekNumber(date) : days()[i + 6] ? getWeekNumber(days()[i + 6]) : ""}
|
||||||
|
</div>
|
||||||
|
`
|
||||||
|
: ""}
|
||||||
|
${date
|
||||||
|
? html`
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
class="${btnClass}"
|
||||||
|
data-date="${date.toISOString()}"
|
||||||
|
@mouseenter=${() => hoveredDate(iso)}
|
||||||
|
@mouseleave=${() => hoveredDate(null)}>
|
||||||
|
${iso === todayISO
|
||||||
|
? html`
|
||||||
|
<span class="absolute -inset-px border-2 border-primary/60 rounded-md pointer-events-none"></span>
|
||||||
|
`
|
||||||
|
: ""}
|
||||||
|
<span class="relative z-10 pointer-events-none">${date.getDate()}</span>
|
||||||
|
</button>
|
||||||
|
`
|
||||||
|
: html`
|
||||||
|
<div class="aspect-square"></div>
|
||||||
|
`}
|
||||||
|
`;
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
},
|
||||||
|
["range", "value"],
|
||||||
|
);
|
||||||
37
src/components/Dialog.js
Normal file
37
src/components/Dialog.js
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
import { $, html } from "sigpro";
|
||||||
|
|
||||||
|
$.component(
|
||||||
|
"c-dialog",
|
||||||
|
(props, { slot, emit }) => {
|
||||||
|
return html`
|
||||||
|
<dialog
|
||||||
|
.class=${() => `modal ${props.open() ? "modal-open" : ""}`}
|
||||||
|
.open=${props.open}
|
||||||
|
@close=${(e) => {
|
||||||
|
if (typeof props.open === "function") props.open(false);
|
||||||
|
emit("close", e);
|
||||||
|
}}>
|
||||||
|
<div class="modal-box">
|
||||||
|
<div class="flex flex-col gap-4">${slot()}</div>
|
||||||
|
|
||||||
|
<div class="modal-action">
|
||||||
|
<form method="dialog" @submit=${() => props.open(false)}>
|
||||||
|
${slot("buttons")}
|
||||||
|
${() =>
|
||||||
|
!slot("buttons").length
|
||||||
|
? html`
|
||||||
|
<button class="btn">Cerrar</button>
|
||||||
|
`
|
||||||
|
: ""}
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form method="dialog" class="modal-backdrop" @submit=${() => props.open(false)}>
|
||||||
|
<button>close</button>
|
||||||
|
</form>
|
||||||
|
</dialog>
|
||||||
|
`;
|
||||||
|
},
|
||||||
|
["open"],
|
||||||
|
);
|
||||||
31
src/components/Drawer.js
Normal file
31
src/components/Drawer.js
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
import { $, html } from "sigpro";
|
||||||
|
|
||||||
|
$.component(
|
||||||
|
"c-drawer",
|
||||||
|
(props, { emit, slot }) => {
|
||||||
|
const id = `drawer-${Math.random().toString(36).substring(2, 9)}`;
|
||||||
|
|
||||||
|
return html`
|
||||||
|
<div class="drawer">
|
||||||
|
<input
|
||||||
|
id="${id}"
|
||||||
|
type="checkbox"
|
||||||
|
class="drawer-toggle"
|
||||||
|
.checked=${props.open}
|
||||||
|
@change=${(e) => {
|
||||||
|
const isChecked = e.target.checked;
|
||||||
|
if (typeof props.open === "function") props.open(isChecked);
|
||||||
|
emit("change", isChecked);
|
||||||
|
}} />
|
||||||
|
|
||||||
|
<div class="drawer-content">${slot("content")}</div>
|
||||||
|
|
||||||
|
<div class="drawer-side z-999">
|
||||||
|
<label for="${id}" aria-label="close sidebar" class="drawer-overlay"></label>
|
||||||
|
<div class="bg-base-200 min-h-full w-80">${slot()}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
},
|
||||||
|
["open"],
|
||||||
|
);
|
||||||
20
src/components/Dropdown.js
Normal file
20
src/components/Dropdown.js
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
import { $, html } from "sigpro";
|
||||||
|
|
||||||
|
$.component(
|
||||||
|
"c-dropdown",
|
||||||
|
(props, { slot }) => {
|
||||||
|
// Generamos un ID único para el anclaje nativo
|
||||||
|
const id = props.id ?? `pop-${Math.random().toString(36).slice(2, 7)}`;
|
||||||
|
|
||||||
|
return html`
|
||||||
|
<div class="inline-block">
|
||||||
|
<button class="btn" popovertarget="${id}" style="anchor-name: --${id}">${slot("trigger")}</button>
|
||||||
|
|
||||||
|
<div popover id="${id}" style="position-anchor: --${id}" class="dropdown menu bg-base-100 rounded-box shadow-sm border border-base-300">
|
||||||
|
${slot()}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
},
|
||||||
|
["id"],
|
||||||
|
);
|
||||||
37
src/components/Fab.js
Normal file
37
src/components/Fab.js
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
import { $, html } from "sigpro";
|
||||||
|
|
||||||
|
$.component(
|
||||||
|
"c-fab",
|
||||||
|
(props, { emit }) => {
|
||||||
|
const handleClick = (e, item) => {
|
||||||
|
if (item.onclick) item.onclick(e);
|
||||||
|
emit("select", item);
|
||||||
|
if (document.activeElement instanceof HTMLElement) document.activeElement.blur();
|
||||||
|
};
|
||||||
|
|
||||||
|
return html`
|
||||||
|
<div class="dropdown dropdown-top dropdown-end fixed bottom-6 right-6 z-100">
|
||||||
|
<div tabindex="0" role="button" .class=${() => `btn btn-lg btn-circle btn-primary shadow-2xl ${props.cls() ?? ""}`}>
|
||||||
|
<span class="${() => props["main-icon"]() || "icon-[lucide--plus]"} w-6 h-6"></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<ul tabindex="0" class="dropdown-content menu mb-4 p-0 flex flex-col gap-3 items-center">
|
||||||
|
${() =>
|
||||||
|
(props.actions() || []).map(
|
||||||
|
(item) => html`
|
||||||
|
<li class="p-0">
|
||||||
|
<button
|
||||||
|
.class=${() => `btn btn-circle shadow-lg ${item.cls || "btn-secondary"}`}
|
||||||
|
@click=${(e) => handleClick(e, item)}
|
||||||
|
.title=${item.label}>
|
||||||
|
<span class="${item.icon} w-5 h-5"></span>
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
`,
|
||||||
|
)}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
},
|
||||||
|
["main-icon", "actions", "cls"],
|
||||||
|
);
|
||||||
26
src/components/Input.js
Normal file
26
src/components/Input.js
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
import { $, html } from "sigpro";
|
||||||
|
|
||||||
|
$.component(
|
||||||
|
"c-input",
|
||||||
|
(props, { slot, emit }) => {
|
||||||
|
return html`
|
||||||
|
<div class="${props.tooltip() ? "tooltip" : ""}" data-tip=${() => props.tooltip() ?? ""}>
|
||||||
|
<label class="floating-label">
|
||||||
|
<span>${() => props.label() ?? ""}</span>
|
||||||
|
<label class=${() => `input ${props.cls() ?? ""}`}>
|
||||||
|
<input
|
||||||
|
type=${() => props.type() ?? "text"}
|
||||||
|
class="input"
|
||||||
|
:value=${props.value}
|
||||||
|
placeholder=${() => props.place() ?? props.label() ?? ""}
|
||||||
|
@input=${(e) => emit("input", e.target.value)}
|
||||||
|
@change=${(e) => emit("change", e.target.value)} />
|
||||||
|
<span>${slot("icon-action")}</span>
|
||||||
|
<span class=${() => props.icon() ?? ""}></span>
|
||||||
|
</label>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
},
|
||||||
|
["label", "value", "icon", "tooltip", "cls", "place", "type"],
|
||||||
|
);
|
||||||
17
src/components/InputClear.js
Normal file
17
src/components/InputClear.js
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
import { $, html } from "sigpro";
|
||||||
|
|
||||||
|
$.component(
|
||||||
|
"c-input-clear",
|
||||||
|
(props) => {
|
||||||
|
return html`
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
class="btn btn-ghost btn-xs btn-circle opacity-50 hover:opacity-100"
|
||||||
|
?hidden=${() => !props.value() || props.value().length === 0}
|
||||||
|
@click=${() => props.value("")}>
|
||||||
|
<span class="icon-[lucide--x] size-4"></span>
|
||||||
|
</button>
|
||||||
|
`;
|
||||||
|
},
|
||||||
|
["value"],
|
||||||
|
);
|
||||||
13
src/components/InputView.js
Normal file
13
src/components/InputView.js
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import { $, html } from "sigpro";
|
||||||
|
|
||||||
|
$.component(
|
||||||
|
"c-input-view",
|
||||||
|
(props) => {
|
||||||
|
return html`
|
||||||
|
<button type="button" class="btn btn-ghost btn-xs btn-circle opacity-50 hover:opacity-100" @click=${() => props.show(!props.show())}>
|
||||||
|
<span class="${() => (props.show() ? "icon-[lucide--eye-off]" : "icon-[lucide--eye]")} size-4"></span>
|
||||||
|
</button>
|
||||||
|
`;
|
||||||
|
},
|
||||||
|
["show"],
|
||||||
|
);
|
||||||
39
src/components/Loading.js
Normal file
39
src/components/Loading.js
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
export const loading = (show = true, msg = "Cargando...") => {
|
||||||
|
const body = document.body;
|
||||||
|
|
||||||
|
if (!show) {
|
||||||
|
if (loadingEl) {
|
||||||
|
loadingEl.classList.replace("opacity-100", "opacity-0");
|
||||||
|
body.style.removeProperty("overflow"); // Restaurar scroll
|
||||||
|
|
||||||
|
const elToRemove = loadingEl; // Captura para el closure
|
||||||
|
elToRemove.addEventListener("transitionend", () => {
|
||||||
|
if (elToRemove === loadingEl) { // Solo si sigue siendo el actual
|
||||||
|
elToRemove.remove();
|
||||||
|
loadingEl = null;
|
||||||
|
}
|
||||||
|
}, { once: true }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (loadingEl?.isConnected) {
|
||||||
|
loadingEl.querySelector(".loading-text").textContent = msg;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
body.style.overflow = "hidden"; // Bloquear scroll
|
||||||
|
|
||||||
|
loadingEl = html`
|
||||||
|
<div class="fixed inset-0 z-9999 flex items-center justify-center bg-base-300/40 backdrop-blur-md transition-opacity duration-300 opacity-0 pointer-events-auto select-none">
|
||||||
|
<div class="flex flex-col items-center gap-4">
|
||||||
|
<span class="loading loading-spinner loading-lg text-primary"></span>
|
||||||
|
<span class="loading-text font-bold text-lg text-base-content">${msg}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`.firstElementChild;
|
||||||
|
|
||||||
|
body.appendChild(loadingEl);
|
||||||
|
requestAnimationFrame(() => loadingEl.classList.replace("opacity-0", "opacity-100"));
|
||||||
|
};
|
||||||
57
src/components/Menu.js
Normal file
57
src/components/Menu.js
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
import { $, html } from "sigpro";
|
||||||
|
|
||||||
|
$.component(
|
||||||
|
"c-menu",
|
||||||
|
(props, { emit }) => {
|
||||||
|
const getItems = () => props.items() || [];
|
||||||
|
|
||||||
|
const renderItems = (data) => {
|
||||||
|
return data.map((item) => {
|
||||||
|
const hasChildren = item.sub && item.sub.length > 0;
|
||||||
|
const content = html`
|
||||||
|
${item.icon
|
||||||
|
? html`
|
||||||
|
<span class="${item.icon} h-4 w-4"></span>
|
||||||
|
`
|
||||||
|
: ""}
|
||||||
|
<span>${item.label}</span>
|
||||||
|
`;
|
||||||
|
|
||||||
|
if (hasChildren) {
|
||||||
|
return html`
|
||||||
|
<li>
|
||||||
|
<details .open="${!!item.open}">
|
||||||
|
<summary>${content}</summary>
|
||||||
|
<ul>
|
||||||
|
${renderItems(item.sub)}
|
||||||
|
</ul>
|
||||||
|
</details>
|
||||||
|
</li>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
return html`
|
||||||
|
<li>
|
||||||
|
<a
|
||||||
|
href="${item.href || "#"}"
|
||||||
|
.class=${item.active ? "active" : ""}
|
||||||
|
@click="${(e) => {
|
||||||
|
if (!item.href || item.href === "#") e.preventDefault();
|
||||||
|
if (item.onClick) item.onClick(item);
|
||||||
|
emit("select", item);
|
||||||
|
}}">
|
||||||
|
${content}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
`;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return html`
|
||||||
|
<ul .class=${() => `menu bg-base-200 rounded-box w-full ${props.cls() ?? ""}`}>
|
||||||
|
${() => renderItems(getItems())}
|
||||||
|
</ul>
|
||||||
|
`;
|
||||||
|
},
|
||||||
|
["items", "cls"],
|
||||||
|
);
|
||||||
28
src/components/Radio.js
Normal file
28
src/components/Radio.js
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
import { $.component, html } from "sigpro";
|
||||||
|
|
||||||
|
$.component(
|
||||||
|
"c-radio",
|
||||||
|
(props, { emit }) => {
|
||||||
|
return html`
|
||||||
|
<label class="label cursor-pointer flex justify-start gap-4">
|
||||||
|
<input
|
||||||
|
type="radio"
|
||||||
|
.name=${props.name}
|
||||||
|
.value=${props.value}
|
||||||
|
.class=${() => `radio ${props.cls() ?? ""}`}
|
||||||
|
.disabled=${props.disabled}
|
||||||
|
.checked=${props.checked}
|
||||||
|
@change=${(e) => {
|
||||||
|
if (e.target.checked) emit("change", props.value());
|
||||||
|
}} />
|
||||||
|
${() =>
|
||||||
|
props.label()
|
||||||
|
? html`
|
||||||
|
<span class="label-text">${props.label}</span>
|
||||||
|
`
|
||||||
|
: ""}
|
||||||
|
</label>
|
||||||
|
`;
|
||||||
|
},
|
||||||
|
["checked", "name", "label", "cls", "disabled", "value"],
|
||||||
|
);
|
||||||
24
src/components/Range.js
Normal file
24
src/components/Range.js
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
import { $, html } from "sigpro";
|
||||||
|
|
||||||
|
$.component(
|
||||||
|
"c-range",
|
||||||
|
(props, { emit }) => {
|
||||||
|
return html`
|
||||||
|
<input
|
||||||
|
type="range"
|
||||||
|
.min=${() => props.min() ?? 0}
|
||||||
|
.max=${() => props.max() ?? 100}
|
||||||
|
.step=${() => props.step() ?? 1}
|
||||||
|
.value=${props.value}
|
||||||
|
.class=${() => `range ${props.cls() ?? ""}`}
|
||||||
|
@input=${(e) => {
|
||||||
|
const val = e.target.value;
|
||||||
|
if (typeof props.value === "function") props.value(val);
|
||||||
|
|
||||||
|
emit("input", val);
|
||||||
|
emit("change", val);
|
||||||
|
}} />
|
||||||
|
`;
|
||||||
|
},
|
||||||
|
["cls", "value", "min", "max", "step"],
|
||||||
|
);
|
||||||
34
src/components/Rating.js
Normal file
34
src/components/Rating.js
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
import { $, html } from "sigpro";
|
||||||
|
|
||||||
|
$.component(
|
||||||
|
"c-rating",
|
||||||
|
(props, { emit }) => {
|
||||||
|
const count = () => parseInt(props.count() ?? 5);
|
||||||
|
|
||||||
|
const getVal = () => {
|
||||||
|
const v = props.value();
|
||||||
|
return v === false || v == null ? 0 : Number(v);
|
||||||
|
};
|
||||||
|
|
||||||
|
return html`
|
||||||
|
<div .class=${() => `rating ${props.mask() ?? ""}`}>
|
||||||
|
${() =>
|
||||||
|
Array.from({ length: count() }).map((_, i) => {
|
||||||
|
const radioValue = i + 1;
|
||||||
|
return html`
|
||||||
|
<input
|
||||||
|
type="radio"
|
||||||
|
.name=${props.name}
|
||||||
|
.class=${() => `mask ${props.mask() ?? "mask-star"}`}
|
||||||
|
.checked=${() => getVal() === radioValue}
|
||||||
|
@change=${() => {
|
||||||
|
if (typeof props.value === "function") props.value(radioValue);
|
||||||
|
emit("change", radioValue);
|
||||||
|
}} />
|
||||||
|
`;
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
},
|
||||||
|
["value", "count", "name", "mask"],
|
||||||
|
);
|
||||||
38
src/components/Tab.js
Normal file
38
src/components/Tab.js
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
import { $, html } from "sigpro";
|
||||||
|
|
||||||
|
$.component(
|
||||||
|
"c-tab",
|
||||||
|
(props, { emit, slot }) => {
|
||||||
|
const groupName = `tab-group-${Math.random().toString(36).substring(2, 9)}`;
|
||||||
|
const items = () => props.items() || [];
|
||||||
|
|
||||||
|
return html`
|
||||||
|
<div .class=${() => `tabs ${props.class() ?? "tabs-lifted"}`}>
|
||||||
|
${() =>
|
||||||
|
items().map(
|
||||||
|
(item) => html`
|
||||||
|
<input
|
||||||
|
type="radio"
|
||||||
|
name="${groupName}"
|
||||||
|
class="tab"
|
||||||
|
aria-label="${item.label}"
|
||||||
|
.checked=${() => props.value() === item.value}
|
||||||
|
@change=${() => {
|
||||||
|
if (typeof props.value === "function") props.value(item.value);
|
||||||
|
emit("change", item.value);
|
||||||
|
}} />
|
||||||
|
<div class="tab-content bg-base-100 border-base-300 p-6">
|
||||||
|
${item.icon
|
||||||
|
? html`
|
||||||
|
<span class="${item.icon} mr-2"></span>
|
||||||
|
`
|
||||||
|
: ""}
|
||||||
|
${slot(item.label)}
|
||||||
|
</div>
|
||||||
|
`,
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
},
|
||||||
|
["items", "value", "class"],
|
||||||
|
);
|
||||||
49
src/components/Toast.js
Normal file
49
src/components/Toast.js
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
import { html } from "sigpro";
|
||||||
|
|
||||||
|
let container = null;
|
||||||
|
|
||||||
|
export const toast = (msg, type = "alert-success", ms = 3500) => {
|
||||||
|
if (!container || !container.isConnected) {
|
||||||
|
container = document.createElement("div");
|
||||||
|
container.className = "fixed top-0 right-0 z-9999 p-6 flex flex-col gap-4 pointer-events-none items-end";
|
||||||
|
document.body.appendChild(container);
|
||||||
|
}
|
||||||
|
|
||||||
|
const close = (n) => {
|
||||||
|
if (!n || n._c) return;
|
||||||
|
n._c = 1;
|
||||||
|
Object.assign(n.style, { transform: "translateX(100%)", opacity: 0 });
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
Object.assign(n.style, { maxHeight: "0px", marginBottom: "-1rem", marginTop: "0px", padding: "0px" });
|
||||||
|
}, 100);
|
||||||
|
|
||||||
|
n.addEventListener("transitionend", (e) => {
|
||||||
|
if (["max-height", "opacity"].includes(e.propertyName)) {
|
||||||
|
n.remove();
|
||||||
|
if (!container.hasChildNodes()) (container.remove(), (container = null));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const el = html`
|
||||||
|
<div
|
||||||
|
class="card bg-base-100 shadow-xl border border-base-200 w-80 sm:w-96 overflow-hidden transition-all duration-500 ease-in-out transform translate-x-full opacity-0 pointer-events-auto"
|
||||||
|
style="max-height:200px">
|
||||||
|
<div class="card-body p-1">
|
||||||
|
<div role="alert" class="${`alert ${type} alert-soft border-none p-2`}">
|
||||||
|
<div class="flex items-center justify-between w-full gap-2">
|
||||||
|
<span class="font-medium text-sm">${msg}</span>
|
||||||
|
<button class="btn btn-ghost btn-xs btn-circle" @click="${(e) => close(e.target.closest(".card"))}">
|
||||||
|
<span class="icon-[lucide--circle-x] w-5 h-5"></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`.firstElementChild;
|
||||||
|
|
||||||
|
container.appendChild(el);
|
||||||
|
requestAnimationFrame(() => requestAnimationFrame(() => el.classList.remove("translate-x-full", "opacity-0")));
|
||||||
|
setTimeout(() => close(el), ms);
|
||||||
|
};
|
||||||
14
src/main.js
Normal file
14
src/main.js
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import App from "./App.js";
|
||||||
|
import "./app.css";
|
||||||
|
const root = document.getElementById("app");
|
||||||
|
root.appendChild(App());
|
||||||
|
|
||||||
|
if (import.meta.hot) {
|
||||||
|
import.meta.hot.accept("./App.js", (newModule) => {
|
||||||
|
if (newModule) {
|
||||||
|
root.innerHTML = "";
|
||||||
|
root.appendChild(newModule.default());
|
||||||
|
console.log("🚀 SigPro: App re-renderizada");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
18
src/pages/index.js
Normal file
18
src/pages/index.js
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
import { html, $ } from "sigpro";
|
||||||
|
import "@components/Button";
|
||||||
|
import "@components/Input";
|
||||||
|
import "@components/DatePicker";
|
||||||
|
import "@components/ColorPicker";
|
||||||
|
|
||||||
|
// ✅ Envuelve todo con $.page
|
||||||
|
export default $.page(() => {
|
||||||
|
const label = $("MiLabel");
|
||||||
|
const loading = $(false);
|
||||||
|
const miValor = $("");
|
||||||
|
const miReserva = $({ start: "2026-03-20", end: "2026-03-25" });
|
||||||
|
const miColor = $("#6366f1");
|
||||||
|
|
||||||
|
return html`
|
||||||
|
|
||||||
|
`;
|
||||||
|
});
|
||||||
4
src/store.js
Normal file
4
src/store.js
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
import { $ } from "sigpro";
|
||||||
|
|
||||||
|
// Estado global compartido
|
||||||
|
export const isDark = $(false);
|
||||||
83
vite-plugin-sigpro.js
Normal file
83
vite-plugin-sigpro.js
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
import fs from 'fs';
|
||||||
|
import path from 'path';
|
||||||
|
|
||||||
|
export default function sigproRouter() {
|
||||||
|
const virtualModuleId = 'virtual:sigpro-routes';
|
||||||
|
const resolvedVirtualModuleId = '\0' + virtualModuleId;
|
||||||
|
|
||||||
|
function getFiles(dir) {
|
||||||
|
let results = [];
|
||||||
|
if (!fs.existsSync(dir)) return results;
|
||||||
|
const list = fs.readdirSync(dir);
|
||||||
|
list.forEach(file => {
|
||||||
|
const fullPath = path.resolve(dir, file);
|
||||||
|
const stat = fs.statSync(fullPath);
|
||||||
|
if (stat && stat.isDirectory()) {
|
||||||
|
results = results.concat(getFiles(fullPath));
|
||||||
|
} else if (file.endsWith('.js')) {
|
||||||
|
results.push(fullPath);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
name: 'sigpro-router',
|
||||||
|
resolveId(id) {
|
||||||
|
if (id === virtualModuleId) return resolvedVirtualModuleId;
|
||||||
|
},
|
||||||
|
load(id) {
|
||||||
|
if (id === resolvedVirtualModuleId) {
|
||||||
|
const pagesDir = path.resolve(process.cwd(), 'src/pages');
|
||||||
|
let files = getFiles(pagesDir);
|
||||||
|
|
||||||
|
files = files.sort((a, b) => {
|
||||||
|
const aDyn = a.includes('[');
|
||||||
|
const bDyn = b.includes('[');
|
||||||
|
if (aDyn !== bDyn) return aDyn ? 1 : -1;
|
||||||
|
return a.length - b.length;
|
||||||
|
});
|
||||||
|
|
||||||
|
let imports = '';
|
||||||
|
let routeArray = 'export const routes = [\n';
|
||||||
|
|
||||||
|
console.log('\n🚀 [SigPro Router] Mapa de rutas generado:');
|
||||||
|
|
||||||
|
files.forEach((fullPath, i) => {
|
||||||
|
const relativePath = path.relative(pagesDir, fullPath).replace(/\\/g, '/');
|
||||||
|
const fileName = relativePath.replace('.js', '');
|
||||||
|
const varName = `Page_${i}`;
|
||||||
|
|
||||||
|
let urlPath = '/' + fileName.toLowerCase();
|
||||||
|
if (urlPath.endsWith('/index')) urlPath = urlPath.replace('/index', '') || '/';
|
||||||
|
|
||||||
|
const isDynamic = urlPath.includes('[') && urlPath.includes(']');
|
||||||
|
let finalPathValue = `'${urlPath}'`;
|
||||||
|
let paramName = null;
|
||||||
|
|
||||||
|
if (isDynamic) {
|
||||||
|
// Extraemos el nombre del parámetro (ej: de [id] extraemos 'id')
|
||||||
|
const match = urlPath.match(/\[([^\]]+)\]/);
|
||||||
|
paramName = match ? match[1] : 'id';
|
||||||
|
|
||||||
|
// CORRECCIÓN: Usamos Grupos Nombrados de JS (?<nombre>...)
|
||||||
|
// Esto permite que el router haga path.match(regex).groups
|
||||||
|
const regexStr = urlPath
|
||||||
|
.replace(/\//g, '\\/')
|
||||||
|
.replace(/\[([^\]]+)\]/, '(?<$1>[^/]+)'); // Reemplaza [id] por (?<id>[^/]+)
|
||||||
|
|
||||||
|
finalPathValue = `new RegExp("^${regexStr}$")`;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(` ${isDynamic ? '🔗' : '📄'} ${urlPath.padEnd(20)} -> ${relativePath}`);
|
||||||
|
|
||||||
|
imports += `import ${varName} from './src/pages/${relativePath}';\n`;
|
||||||
|
routeArray += ` { path: ${finalPathValue}, component: ${varName}, isDynamic: ${isDynamic}, paramName: ${paramName ? `'${paramName}'` : 'null'} },\n`;
|
||||||
|
});
|
||||||
|
|
||||||
|
routeArray += '];';
|
||||||
|
return `${imports}\n${routeArray}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
67
vite.config.js
Normal file
67
vite.config.js
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
import { defineConfig } from "vite";
|
||||||
|
import tailwindcss from "@tailwindcss/vite";
|
||||||
|
import { sigproRouter } from 'sigpro';
|
||||||
|
import { resolve } from "path";
|
||||||
|
import path from "node:path";
|
||||||
|
|
||||||
|
const dev = process.env.NODE_ENV === "development";
|
||||||
|
const createAgGridLib = {
|
||||||
|
lib: {
|
||||||
|
entry: resolve(__dirname, "src/components/aggrid-lib.js"),
|
||||||
|
name: "AgGridBundle",
|
||||||
|
fileName: "aggrid",
|
||||||
|
formats: ["es"],
|
||||||
|
},
|
||||||
|
outDir: "dist/lib",
|
||||||
|
};
|
||||||
|
|
||||||
|
export default defineConfig({
|
||||||
|
plugins: [ sigproRouter(),tailwindcss()],
|
||||||
|
base: dev ? "/absproxy/5173/" : "/",
|
||||||
|
resolve: {
|
||||||
|
alias: {
|
||||||
|
"@components": path.resolve(__dirname, "src/components/"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
server: {
|
||||||
|
allowedHosts: true,
|
||||||
|
port: 5173,
|
||||||
|
},
|
||||||
|
build: {
|
||||||
|
chunkSizeWarningLimit: 1500,
|
||||||
|
rollupOptions: {
|
||||||
|
output: {
|
||||||
|
// 2. Controla dónde van los archivos JS
|
||||||
|
chunkFileNames: "assets/js/[name]-[hash].js",
|
||||||
|
entryFileNames: "assets/js/[name]-[hash].js",
|
||||||
|
|
||||||
|
// 3. Controla dónde van los archivos CSS y otros assets
|
||||||
|
assetFileNames: (assetInfo) => {
|
||||||
|
const name = assetInfo.name ?? "";
|
||||||
|
if (name.endsWith(".css")) {
|
||||||
|
return "assets/css/[name]-[hash][extname]";
|
||||||
|
}
|
||||||
|
return "assets/[name]-[hash][extname]";
|
||||||
|
},
|
||||||
|
|
||||||
|
// 4. Estrategia de separación manual (Manual Chunks)
|
||||||
|
// Esto separa las librerías pesadas de tu código de SigPro
|
||||||
|
manualChunks(id) {
|
||||||
|
if (id.includes("node_modules")) {
|
||||||
|
return "vendor"; // Todo lo externo va a vendor.js
|
||||||
|
}
|
||||||
|
// Si quieres separar tu motor SigPro del resto de la App:
|
||||||
|
if (id.includes("sigpro.js")) {
|
||||||
|
return "sigpro-core";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// ...createAgGridLib
|
||||||
|
},
|
||||||
|
optimizeDeps: {
|
||||||
|
include: ["ag-grid-community", "ag-grid-enterprise"],
|
||||||
|
// Esto evita que Vite intente buscar dependencias nuevas en cada cambio
|
||||||
|
force: false,
|
||||||
|
},
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user