[ADD] AVANCE VALIDACIONES EN REGISTRO DE PASAJES Y DOCUMENTOS

parent 1055001d
...@@ -28,15 +28,31 @@ ...@@ -28,15 +28,31 @@
"@angular/cli": "^18.2.1", "@angular/cli": "^18.2.1",
"@angular/compiler-cli": "^18.2.0", "@angular/compiler-cli": "^18.2.0",
"@types/jasmine": "~5.1.0", "@types/jasmine": "~5.1.0",
"autoprefixer": "^10.4.20",
"jasmine-core": "~5.2.0", "jasmine-core": "~5.2.0",
"karma": "~6.4.0", "karma": "~6.4.0",
"karma-chrome-launcher": "~3.2.0", "karma-chrome-launcher": "~3.2.0",
"karma-coverage": "~2.2.0", "karma-coverage": "~2.2.0",
"karma-jasmine": "~5.1.0", "karma-jasmine": "~5.1.0",
"karma-jasmine-html-reporter": "~2.1.0", "karma-jasmine-html-reporter": "~2.1.0",
"postcss": "^8.4.47",
"tailwindcss": "^3.4.11",
"typescript": "~5.5.2" "typescript": "~5.5.2"
} }
}, },
"node_modules/@alloc/quick-lru": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
"integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@ampproject/remapping": { "node_modules/@ampproject/remapping": {
"version": "2.3.0", "version": "2.3.0",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
...@@ -196,6 +212,35 @@ ...@@ -196,6 +212,35 @@
} }
} }
}, },
"node_modules/@angular-devkit/build-angular/node_modules/postcss": {
"version": "8.4.41",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz",
"integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==",
"dev": true,
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/postcss"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"dependencies": {
"nanoid": "^3.3.7",
"picocolors": "^1.0.1",
"source-map-js": "^1.2.0"
},
"engines": {
"node": "^10 || ^12 || >=14"
}
},
"node_modules/@angular-devkit/build-angular/node_modules/tslib": { "node_modules/@angular-devkit/build-angular/node_modules/tslib": {
"version": "2.6.3", "version": "2.6.3",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz",
...@@ -4940,6 +4985,13 @@ ...@@ -4940,6 +4985,13 @@
"node": ">=4" "node": ">=4"
} }
}, },
"node_modules/any-promise": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
"integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
"dev": true,
"license": "MIT"
},
"node_modules/anymatch": { "node_modules/anymatch": {
"version": "3.1.3", "version": "3.1.3",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
...@@ -4967,6 +5019,13 @@ ...@@ -4967,6 +5019,13 @@
"url": "https://github.com/sponsors/jonschlinkert" "url": "https://github.com/sponsors/jonschlinkert"
} }
}, },
"node_modules/arg": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
"integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
"dev": true,
"license": "MIT"
},
"node_modules/argparse": { "node_modules/argparse": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
...@@ -5187,9 +5246,9 @@ ...@@ -5187,9 +5246,9 @@
} }
}, },
"node_modules/body-parser": { "node_modules/body-parser": {
"version": "1.20.2", "version": "1.20.3",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
"integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
...@@ -5201,7 +5260,7 @@ ...@@ -5201,7 +5260,7 @@
"http-errors": "2.0.0", "http-errors": "2.0.0",
"iconv-lite": "0.4.24", "iconv-lite": "0.4.24",
"on-finished": "2.4.1", "on-finished": "2.4.1",
"qs": "6.11.0", "qs": "6.13.0",
"raw-body": "2.5.2", "raw-body": "2.5.2",
"type-is": "~1.6.18", "type-is": "~1.6.18",
"unpipe": "1.0.0" "unpipe": "1.0.0"
...@@ -5469,6 +5528,16 @@ ...@@ -5469,6 +5528,16 @@
"node": ">=6" "node": ">=6"
} }
}, },
"node_modules/camelcase-css": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
"integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 6"
}
},
"node_modules/caniuse-lite": { "node_modules/caniuse-lite": {
"version": "1.0.30001653", "version": "1.0.30001653",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001653.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001653.tgz",
...@@ -6453,6 +6522,20 @@ ...@@ -6453,6 +6522,20 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/didyoumean": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
"integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
"dev": true,
"license": "Apache-2.0"
},
"node_modules/dlv": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
"integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
"dev": true,
"license": "MIT"
},
"node_modules/dns-packet": { "node_modules/dns-packet": {
"version": "5.6.1", "version": "5.6.1",
"resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz",
...@@ -6986,38 +7069,38 @@ ...@@ -6986,38 +7069,38 @@
"license": "Apache-2.0" "license": "Apache-2.0"
}, },
"node_modules/express": { "node_modules/express": {
"version": "4.19.2", "version": "4.21.0",
"resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz",
"integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"accepts": "~1.3.8", "accepts": "~1.3.8",
"array-flatten": "1.1.1", "array-flatten": "1.1.1",
"body-parser": "1.20.2", "body-parser": "1.20.3",
"content-disposition": "0.5.4", "content-disposition": "0.5.4",
"content-type": "~1.0.4", "content-type": "~1.0.4",
"cookie": "0.6.0", "cookie": "0.6.0",
"cookie-signature": "1.0.6", "cookie-signature": "1.0.6",
"debug": "2.6.9", "debug": "2.6.9",
"depd": "2.0.0", "depd": "2.0.0",
"encodeurl": "~1.0.2", "encodeurl": "~2.0.0",
"escape-html": "~1.0.3", "escape-html": "~1.0.3",
"etag": "~1.8.1", "etag": "~1.8.1",
"finalhandler": "1.2.0", "finalhandler": "1.3.1",
"fresh": "0.5.2", "fresh": "0.5.2",
"http-errors": "2.0.0", "http-errors": "2.0.0",
"merge-descriptors": "1.0.1", "merge-descriptors": "1.0.3",
"methods": "~1.1.2", "methods": "~1.1.2",
"on-finished": "2.4.1", "on-finished": "2.4.1",
"parseurl": "~1.3.3", "parseurl": "~1.3.3",
"path-to-regexp": "0.1.7", "path-to-regexp": "0.1.10",
"proxy-addr": "~2.0.7", "proxy-addr": "~2.0.7",
"qs": "6.11.0", "qs": "6.13.0",
"range-parser": "~1.2.1", "range-parser": "~1.2.1",
"safe-buffer": "5.2.1", "safe-buffer": "5.2.1",
"send": "0.18.0", "send": "0.19.0",
"serve-static": "1.15.0", "serve-static": "1.16.2",
"setprototypeof": "1.2.0", "setprototypeof": "1.2.0",
"statuses": "2.0.1", "statuses": "2.0.1",
"type-is": "~1.6.18", "type-is": "~1.6.18",
...@@ -7048,15 +7131,25 @@ ...@@ -7048,15 +7131,25 @@
"ms": "2.0.0" "ms": "2.0.0"
} }
}, },
"node_modules/express/node_modules/encodeurl": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
"integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/express/node_modules/finalhandler": { "node_modules/express/node_modules/finalhandler": {
"version": "1.2.0", "version": "1.3.1",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
"integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"debug": "2.6.9", "debug": "2.6.9",
"encodeurl": "~1.0.2", "encodeurl": "~2.0.0",
"escape-html": "~1.0.3", "escape-html": "~1.0.3",
"on-finished": "2.4.1", "on-finished": "2.4.1",
"parseurl": "~1.3.3", "parseurl": "~1.3.3",
...@@ -9063,6 +9156,16 @@ ...@@ -9063,6 +9156,16 @@
} }
} }
}, },
"node_modules/lilconfig": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
"integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
}
},
"node_modules/lines-and-columns": { "node_modules/lines-and-columns": {
"version": "1.2.4", "version": "1.2.4",
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
...@@ -9561,11 +9664,14 @@ ...@@ -9561,11 +9664,14 @@
} }
}, },
"node_modules/merge-descriptors": { "node_modules/merge-descriptors": {
"version": "1.0.1", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
"integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
"dev": true, "dev": true,
"license": "MIT" "license": "MIT",
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
}, },
"node_modules/merge-stream": { "node_modules/merge-stream": {
"version": "2.0.0", "version": "2.0.0",
...@@ -9990,6 +10096,18 @@ ...@@ -9990,6 +10096,18 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0" "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
} }
}, },
"node_modules/mz": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
"integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"any-promise": "^1.0.0",
"object-assign": "^4.0.1",
"thenify-all": "^1.0.0"
}
},
"node_modules/nanoid": { "node_modules/nanoid": {
"version": "3.3.7", "version": "3.3.7",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
...@@ -10420,6 +10538,16 @@ ...@@ -10420,6 +10538,16 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/object-hash": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
"integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 6"
}
},
"node_modules/object-inspect": { "node_modules/object-inspect": {
"version": "1.13.2", "version": "1.13.2",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz",
...@@ -10952,9 +11080,9 @@ ...@@ -10952,9 +11080,9 @@
"license": "ISC" "license": "ISC"
}, },
"node_modules/path-to-regexp": { "node_modules/path-to-regexp": {
"version": "0.1.7", "version": "0.1.10",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz",
"integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==",
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
...@@ -10972,9 +11100,9 @@ ...@@ -10972,9 +11100,9 @@
} }
}, },
"node_modules/picocolors": { "node_modules/picocolors": {
"version": "1.0.1", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz",
"integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==",
"dev": true, "dev": true,
"license": "ISC" "license": "ISC"
}, },
...@@ -11002,6 +11130,16 @@ ...@@ -11002,6 +11130,16 @@
"node": ">=6" "node": ">=6"
} }
}, },
"node_modules/pirates": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
"integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 6"
}
},
"node_modules/piscina": { "node_modules/piscina": {
"version": "4.6.1", "version": "4.6.1",
"resolved": "https://registry.npmjs.org/piscina/-/piscina-4.6.1.tgz", "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.6.1.tgz",
...@@ -11029,9 +11167,9 @@ ...@@ -11029,9 +11167,9 @@
} }
}, },
"node_modules/postcss": { "node_modules/postcss": {
"version": "8.4.41", "version": "8.4.47",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
"integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
"dev": true, "dev": true,
"funding": [ "funding": [
{ {
...@@ -11050,13 +11188,100 @@ ...@@ -11050,13 +11188,100 @@
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"nanoid": "^3.3.7", "nanoid": "^3.3.7",
"picocolors": "^1.0.1", "picocolors": "^1.1.0",
"source-map-js": "^1.2.0" "source-map-js": "^1.2.1"
}, },
"engines": { "engines": {
"node": "^10 || ^12 || >=14" "node": "^10 || ^12 || >=14"
} }
}, },
"node_modules/postcss-import": {
"version": "15.1.0",
"resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
"integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
"dev": true,
"license": "MIT",
"dependencies": {
"postcss-value-parser": "^4.0.0",
"read-cache": "^1.0.0",
"resolve": "^1.1.7"
},
"engines": {
"node": ">=14.0.0"
},
"peerDependencies": {
"postcss": "^8.0.0"
}
},
"node_modules/postcss-js": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
"integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
"dev": true,
"license": "MIT",
"dependencies": {
"camelcase-css": "^2.0.1"
},
"engines": {
"node": "^12 || ^14 || >= 16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
"peerDependencies": {
"postcss": "^8.4.21"
}
},
"node_modules/postcss-load-config": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
"integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
"dev": true,
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"dependencies": {
"lilconfig": "^3.0.0",
"yaml": "^2.3.4"
},
"engines": {
"node": ">= 14"
},
"peerDependencies": {
"postcss": ">=8.0.9",
"ts-node": ">=9.0.0"
},
"peerDependenciesMeta": {
"postcss": {
"optional": true
},
"ts-node": {
"optional": true
}
}
},
"node_modules/postcss-load-config/node_modules/lilconfig": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz",
"integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=14"
},
"funding": {
"url": "https://github.com/sponsors/antonk52"
}
},
"node_modules/postcss-loader": { "node_modules/postcss-loader": {
"version": "8.1.1", "version": "8.1.1",
"resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz",
...@@ -11159,6 +11384,32 @@ ...@@ -11159,6 +11384,32 @@
"postcss": "^8.1.0" "postcss": "^8.1.0"
} }
}, },
"node_modules/postcss-nested": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
"integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
"dev": true,
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"dependencies": {
"postcss-selector-parser": "^6.1.1"
},
"engines": {
"node": ">=12.0"
},
"peerDependencies": {
"postcss": "^8.2.14"
}
},
"node_modules/postcss-selector-parser": { "node_modules/postcss-selector-parser": {
"version": "6.1.2", "version": "6.1.2",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
...@@ -11274,13 +11525,13 @@ ...@@ -11274,13 +11525,13 @@
} }
}, },
"node_modules/qs": { "node_modules/qs": {
"version": "6.11.0", "version": "6.13.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
"integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
"dev": true, "dev": true,
"license": "BSD-3-Clause", "license": "BSD-3-Clause",
"dependencies": { "dependencies": {
"side-channel": "^1.0.4" "side-channel": "^1.0.6"
}, },
"engines": { "engines": {
"node": ">=0.6" "node": ">=0.6"
...@@ -11346,6 +11597,26 @@ ...@@ -11346,6 +11597,26 @@
"node": ">= 0.8" "node": ">= 0.8"
} }
}, },
"node_modules/read-cache": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
"integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
"dev": true,
"license": "MIT",
"dependencies": {
"pify": "^2.3.0"
}
},
"node_modules/read-cache/node_modules/pify": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/readable-stream": { "node_modules/readable-stream": {
"version": "3.6.2", "version": "3.6.2",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
...@@ -11887,9 +12158,9 @@ ...@@ -11887,9 +12158,9 @@
} }
}, },
"node_modules/send": { "node_modules/send": {
"version": "0.18.0", "version": "0.19.0",
"resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
"integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
...@@ -12045,21 +12316,31 @@ ...@@ -12045,21 +12316,31 @@
"license": "ISC" "license": "ISC"
}, },
"node_modules/serve-static": { "node_modules/serve-static": {
"version": "1.15.0", "version": "1.16.2",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
"integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"encodeurl": "~1.0.2", "encodeurl": "~2.0.0",
"escape-html": "~1.0.3", "escape-html": "~1.0.3",
"parseurl": "~1.3.3", "parseurl": "~1.3.3",
"send": "0.18.0" "send": "0.19.0"
}, },
"engines": { "engines": {
"node": ">= 0.8.0" "node": ">= 0.8.0"
} }
}, },
"node_modules/serve-static/node_modules/encodeurl": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
"integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/set-function-length": { "node_modules/set-function-length": {
"version": "1.2.2", "version": "1.2.2",
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
...@@ -12332,9 +12613,9 @@ ...@@ -12332,9 +12613,9 @@
} }
}, },
"node_modules/source-map-js": { "node_modules/source-map-js": {
"version": "1.2.0", "version": "1.2.1",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
"integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
"dev": true, "dev": true,
"license": "BSD-3-Clause", "license": "BSD-3-Clause",
"engines": { "engines": {
...@@ -12636,6 +12917,86 @@ ...@@ -12636,6 +12917,86 @@
"node": ">=6" "node": ">=6"
} }
}, },
"node_modules/sucrase": {
"version": "3.35.0",
"resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
"integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.2",
"commander": "^4.0.0",
"glob": "^10.3.10",
"lines-and-columns": "^1.1.6",
"mz": "^2.7.0",
"pirates": "^4.0.1",
"ts-interface-checker": "^0.1.9"
},
"bin": {
"sucrase": "bin/sucrase",
"sucrase-node": "bin/sucrase-node"
},
"engines": {
"node": ">=16 || 14 >=14.17"
}
},
"node_modules/sucrase/node_modules/brace-expansion": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
"dev": true,
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
}
},
"node_modules/sucrase/node_modules/commander": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
"integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 6"
}
},
"node_modules/sucrase/node_modules/glob": {
"version": "10.4.5",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
"integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
"dev": true,
"license": "ISC",
"dependencies": {
"foreground-child": "^3.1.0",
"jackspeak": "^3.1.2",
"minimatch": "^9.0.4",
"minipass": "^7.1.2",
"package-json-from-dist": "^1.0.0",
"path-scurry": "^1.11.1"
},
"bin": {
"glob": "dist/esm/bin.mjs"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/sucrase/node_modules/minimatch": {
"version": "9.0.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
"dev": true,
"license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.1"
},
"engines": {
"node": ">=16 || 14 >=14.17"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/supports-color": { "node_modules/supports-color": {
"version": "5.5.0", "version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
...@@ -12672,6 +13033,57 @@ ...@@ -12672,6 +13033,57 @@
"node": ">=0.10" "node": ">=0.10"
} }
}, },
"node_modules/tailwindcss": {
"version": "3.4.11",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.11.tgz",
"integrity": "sha512-qhEuBcLemjSJk5ajccN9xJFtM/h0AVCPaA6C92jNP+M2J8kX+eMJHI7R2HFKUvvAsMpcfLILMCFYSeDwpMmlUg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@alloc/quick-lru": "^5.2.0",
"arg": "^5.0.2",
"chokidar": "^3.5.3",
"didyoumean": "^1.2.2",
"dlv": "^1.1.3",
"fast-glob": "^3.3.0",
"glob-parent": "^6.0.2",
"is-glob": "^4.0.3",
"jiti": "^1.21.0",
"lilconfig": "^2.1.0",
"micromatch": "^4.0.5",
"normalize-path": "^3.0.0",
"object-hash": "^3.0.0",
"picocolors": "^1.0.0",
"postcss": "^8.4.23",
"postcss-import": "^15.1.0",
"postcss-js": "^4.0.1",
"postcss-load-config": "^4.0.1",
"postcss-nested": "^6.0.1",
"postcss-selector-parser": "^6.0.11",
"resolve": "^1.22.2",
"sucrase": "^3.32.0"
},
"bin": {
"tailwind": "lib/cli.js",
"tailwindcss": "lib/cli.js"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/tailwindcss/node_modules/glob-parent": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
"integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
"dev": true,
"license": "ISC",
"dependencies": {
"is-glob": "^4.0.3"
},
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/tapable": { "node_modules/tapable": {
"version": "2.2.1", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
...@@ -12863,6 +13275,29 @@ ...@@ -12863,6 +13275,29 @@
"url": "https://opencollective.com/webpack" "url": "https://opencollective.com/webpack"
} }
}, },
"node_modules/thenify": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
"integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
"dev": true,
"license": "MIT",
"dependencies": {
"any-promise": "^1.0.0"
}
},
"node_modules/thenify-all": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
"integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
"dev": true,
"license": "MIT",
"dependencies": {
"thenify": ">= 3.1.0 < 4"
},
"engines": {
"node": ">=0.8"
}
},
"node_modules/thingies": { "node_modules/thingies": {
"version": "1.21.0", "version": "1.21.0",
"resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz",
...@@ -12956,6 +13391,13 @@ ...@@ -12956,6 +13391,13 @@
"tree-kill": "cli.js" "tree-kill": "cli.js"
} }
}, },
"node_modules/ts-interface-checker": {
"version": "0.1.13",
"resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
"integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
"dev": true,
"license": "Apache-2.0"
},
"node_modules/tslib": { "node_modules/tslib": {
"version": "2.7.0", "version": "2.7.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz",
...@@ -14403,6 +14845,19 @@ ...@@ -14403,6 +14845,19 @@
"dev": true, "dev": true,
"license": "ISC" "license": "ISC"
}, },
"node_modules/yaml": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz",
"integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==",
"dev": true,
"license": "ISC",
"bin": {
"yaml": "bin.mjs"
},
"engines": {
"node": ">= 14"
}
},
"node_modules/yargs": { "node_modules/yargs": {
"version": "17.7.2", "version": "17.7.2",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
......
...@@ -30,12 +30,15 @@ ...@@ -30,12 +30,15 @@
"@angular/cli": "^18.2.1", "@angular/cli": "^18.2.1",
"@angular/compiler-cli": "^18.2.0", "@angular/compiler-cli": "^18.2.0",
"@types/jasmine": "~5.1.0", "@types/jasmine": "~5.1.0",
"autoprefixer": "^10.4.20",
"jasmine-core": "~5.2.0", "jasmine-core": "~5.2.0",
"karma": "~6.4.0", "karma": "~6.4.0",
"karma-chrome-launcher": "~3.2.0", "karma-chrome-launcher": "~3.2.0",
"karma-coverage": "~2.2.0", "karma-coverage": "~2.2.0",
"karma-jasmine": "~5.1.0", "karma-jasmine": "~5.1.0",
"karma-jasmine-html-reporter": "~2.1.0", "karma-jasmine-html-reporter": "~2.1.0",
"postcss": "^8.4.47",
"tailwindcss": "^3.4.11",
"typescript": "~5.5.2" "typescript": "~5.5.2"
} }
} }
...@@ -43,6 +43,11 @@ ...@@ -43,6 +43,11 @@
opacity: 0; /* El objetivo es que la opacidad llegue a 0 (completamente transparente) */ opacity: 0; /* El objetivo es que la opacidad llegue a 0 (completamente transparente) */
} }
.mdc-button__label{
display: flex !important;
align-items: center !important;
}
mat-label { mat-label {
opacity: 1; /* Por defecto, el label será completamente visible */ opacity: 1; /* Por defecto, el label será completamente visible */
} }
......
...@@ -11,305 +11,313 @@ ...@@ -11,305 +11,313 @@
</div> </div>
</div> </div>
<div class="body"> <div class="body flex flex-col items-center text-[13px] md:text-[18px] relative mx-2 my-10 md:mx-0">
<!---------------------------------------------------------------------- SECCION DATOS PERSONALES ---------------------------------------------------------------------->
<div class="div-datosGenerales divisionGeneral" [formGroup]="datos_personal">
<mat-card appearance="outlined" class="mt-4 flex flex-col gap-2.5 text-[#222] !shadow-xl w-[90vw] md:w-[75vw]">
<mat-card appearance="outlined" class="titulo-Principal"> <mat-card-header class="flex flex-col items-center w-full ">
<mat-card-content>DATOS PRINCIPALES</mat-card-content> <label class="text-[1.1em] font-bold mb-4">
</mat-card> DATOS PERSONALES
</label>
<div style="display: flex;"> </mat-card-header>
<div style="width: 100%"> <!-- <mat-card-content>DATOS PRINCIPALES</mat-card-content> -->
<label style="font-weight: bold; font-size: 1.2rem; font-family: 'inherit'">TÉCNICO : </label> <mat-card-content class="w-full">
<mat-form-field appearance="outline" floatLabel="always"> <div class="mt-10">
<mat-label>Técnico responsable</mat-label> <div style="display: flex;width: 100% ; justify-content: space-between" [formGroup]="datos_personal">
<mat-select formControlName="tecnicoPersonal" placeholder="TECNICOS" (selectionChange)="onEventTecnico($event)" required> <mat-form-field style="width: 20rem" appearance="outline" floatLabel="always">
<mat-option *ngFor="let option of this.personal_list" [value]="option?.codper"> <mat-label>Técnico responsable</mat-label>
{{option?.personal}} <mat-select formControlName="tecnicoPersonal" placeholder="[Seleccionar técnico]" (selectionChange)="onEventTecnico($event)" required>
</mat-option> <mat-option *ngFor="let option of this.personal_list" [value]="option?.codper">
</mat-select> {{option?.personal}}
</mat-form-field> </mat-option>
</div> </mat-select>
<div style="width: 100%"> </mat-form-field>
<label style="font-weight: bold; font-size: 1.2rem; font-family: 'inherit'">FECHAS : </label> <mat-form-field style="width: 20rem" appearance="outline" floatLabel="always">
<mat-form-field> <mat-label>Área designada</mat-label>
<mat-date-range-input [formGroup]="range" [rangePicker]="picker"> <input formControlName="areaPersonal" matInput placeholder="[Área designada]" value="" readonly>
<input matStartDate formControlName="fechaInicio" placeholder="Fecha inicial"> </mat-form-field>
<input matEndDate formControlName="fechaFin" placeholder="Fecha Fin"> <mat-form-field style="width: 20rem" appearance="outline" floatLabel="always">
</mat-date-range-input> <mat-label>Sede afectada : </mat-label>
<mat-datepicker-toggle matIconSuffix [for]="picker"></mat-datepicker-toggle> <mat-select formControlName="sedePersonal" placeholder="[Seleccionar sede]" required>
<mat-date-range-picker #picker></mat-date-range-picker> <mat-option *ngFor="let option of this.sede_list" [value]="option?.codlocal">
{{option?.deslocal}}
</mat-option>
</mat-select>
</mat-form-field>
<!-- <mat-form-field [formGroup]="datos_fechaTrabajo" style="width: 20rem" appearance="outline" floatLabel="always"> -->
<mat-form-field style="width: 20rem" appearance="outline" floatLabel="always">
<mat-label>Rango de fechas : </mat-label>
<mat-date-range-input [rangePicker]="picker">
<input matStartDate formControlName="minFechaTrabajo" placeholder="Fecha inicial" readonly >
<input matEndDate formControlName="maxFechaTrabajo" placeholder="Fecha Fin" readonly>
</mat-date-range-input>
<mat-datepicker-toggle matIconSuffix [for]="picker" [disabled]="datos_personal.controls['minFechaTrabajo'].disabled"></mat-datepicker-toggle>
<mat-date-range-picker #picker></mat-date-range-picker>
</mat-form-field>
</div>
<!---------------------------------------------------------------------- SECCION DATOS PERSONALES ---------------------------------------------------------------------->
<!---------------------------------------------------------------------- SECCION PASAJE ---------------------------------------------------------------------->
<div style="width: 100%; display: flex;justify-content: flex-start">
<div style="margin : 0 20px 0 0">
<mat-form-field [formGroup]="datos_pasajeAcumulado" style="width: 20rem" appearance="outline" floatLabel="always">
<mat-label>Pasaje designado : </mat-label>
<input matInput formControlName="pasajeTotal" placeholder="Calculo final del pasaje" value="" readonly>
</mat-form-field>
</div>
<div>
<div class="grid gap-4 grid-cols-2">
@if (range.controls.fechaInicio.hasError('matStartDateInvalid')) { <mat-label class="text-[1.1em] font-bold mb-4" style="display: flex;align-items: center;margin: unset">LISTADO DE PASAJES <mat-icon>attach_money</mat-icon> </mat-label>
<mat-error>Invalid start date</mat-error> <button mat-raised-button [ngStyle]="{'visibility': activarPasajes ? 'visible' : 'hidden'}" [disabled]="!activarPasajes" (click)="onEventoNuevoPasaje($event)">
}
@if (range.controls.fechaFin.hasError('matEndDateInvalid')) {
<mat-error>Invalid end date</mat-error>
}
</mat-form-field>
</div>
</div>
<div style="display: flex;">
<div style="width: 100%;">
<label style="font-weight: bold; font-size: 1.2rem; font-family: 'inherit'">SEDE : </label>
<mat-form-field style="width: 20rem">
<mat-label>Sede afectada : </mat-label>
<mat-select formControlName="sedePersonal" placeholder="SEDES" required>
<mat-option *ngFor="let option of this.sede_list" [value]="option?.codlocal">
{{option?.deslocal}}
</mat-option>
</mat-select>
</mat-form-field>
<br>
<label style="font-weight: bold; font-size: 1.2rem; font-family: 'inherit'">ÁREA : </label>
<mat-form-field>
<mat-label>Área designada</mat-label>
<input formControlName="areaPersonal" matInput placeholder="Área designada" value="" readonly>
</mat-form-field>
</div>
<div style="width: 100%; display: flex;justify-content: flex-start">
<div style="margin : 0 20px 0 0">
<label style="font-weight: bold; font-size: 1.2rem; font-family: 'inherit'">PASAJE(Soles) : </label>
<br>
<mat-form-field>
<mat-label>Pásaje designado</mat-label>
<input formControlName="pasajePersonal" matInput placeholder="Calculo final del pasaje" value="">
</mat-form-field>
</div>
<div>
<div style="display: flex ; width:100%;">
<h6 class="panel-title" id="panel-title-tabla-asistencia">LISTADO DE PASAJES<mat-icon class="mat-icon-small">attach_money</mat-icon></h6>
<button mat-fab >
<mat-icon>add</mat-icon> <mat-icon>add</mat-icon>
Agregar pasaje <b>Agregar pasaje</b>
</button> </button>
</div>
<div>
<table mat-table [dataSource]="dataSource" class="mat-elevation-z8">
<ng-container matColumnDef="lugarOrigen">
<th mat-header-cell *matHeaderCellDef> LUGAR DE ORIGEN </th>
<td mat-cell *matCellDef="let element">
<ng-container *ngIf="element.isNew; else displayOrigen">
<mat-form-field [formGroup]="datos_lugarOrigen" style="width: 20rem" appearance="outline" floatLabel="always">
<mat-select formControlName="lugarOrigen{{element.index}}" placeholder="[Seleccionar de origen]" required>
<mat-option *ngFor="let option of this.sede_list" [value]="option?.codlocal">
{{option?.deslocal}}
</mat-option>
</mat-select>
</mat-form-field>
</ng-container>
<ng-template #displayOrigen>
{{element.lugarOrigen}}
</ng-template>
</td>
</ng-container>
<ng-container matColumnDef="lugarDestino">
<th mat-header-cell *matHeaderCellDef> LUGAR DESTINO </th>
<td mat-cell *matCellDef="let element">
<ng-container *ngIf="element.isNew; else displayOrigen">
<!--<mat-form-field [formGroup]="datos_personal" style="width: 20rem" appearance="outline">
<input matInput placeholder="[Lugar de Destino]" formControlName="lugarDestinoPasaje" readonly>
</mat-form-field>-->
<mat-form-field style="width: 20rem" appearance="outline">
<input matInput placeholder="[Lugar de Destino]" [value]="lugarDestinoPasaje" readonly>
</mat-form-field>
</ng-container>
<ng-template #displayOrigen>
{{element.lugarDestino}}
</ng-template>
</td>
</ng-container>
<ng-container matColumnDef="monto">
<th mat-header-cell *matHeaderCellDef> MONTO </th>
<td mat-cell *matCellDef="let element">
<ng-container *ngIf="element.isNew; else displayOrigen">
<!-- <input [(ngModel)]="element.monto" placeholder="Monto"> -->
<mat-form-field [formGroup]="datos_pasajeAcumulado" style="width: 10rem" appearance="outline">
<input matInput formControlName="montoPasaje{{element.index}}" soloNumeros placeholder="[Monto]" value="">
</mat-form-field>
</ng-container>
<ng-template #displayOrigen>
{{element.monto}}
</ng-template>
</td>
</ng-container>
<ng-container matColumnDef="fecha">
<th mat-header-cell *matHeaderCellDef> FECHA </th>
<td mat-cell *matCellDef="let element">
<ng-container *ngIf="element.isNew; else displayOrigen">
<mat-form-field [formGroup]="datos_fechaPasaje" style="width: 10rem" appearance="outline">
<input matInput [matDatepicker]="fechaPasaje" formControlName="fechaPasaje{{element.index}}" [min]="minFechaLimite" [max]="maxFechaLimite">
<mat-hint>DD/MM/YYYY</mat-hint>
<mat-datepicker-toggle matIconSuffix [for]="fechaPasaje"></mat-datepicker-toggle>
<mat-datepicker #fechaPasaje></mat-datepicker>
</mat-form-field>
</ng-container>
<ng-template #displayOrigen>
{{formatoFecha(element.fecha)}}
</ng-template>
</td>
</ng-container>
<ng-container matColumnDef="accion">
<th mat-header-cell *matHeaderCellDef> ACCIÓN </th>
<td mat-cell *matCellDef="let element">
<ng-container *ngIf="element.isNew; else displayOrigen">
<button mat-icon-button (click)="onEventoConfirmarPasaje($event, element)">
<mat-icon>check_circle</mat-icon>
</button>
<button mat-icon-button (click)="onEventoCancelarPasaje($event, element)">
<mat-icon>cancel</mat-icon>
</button>
</ng-container>
<ng-template #displayOrigen>
<button mat-icon-button (click)="onEventoEditarPasaje($event, element)">
<mat-icon>edit</mat-icon>
</button>
<button mat-icon-button (click)="onEventoEliminarPasaje($event, element)">
<mat-icon>delete</mat-icon>
</button>
</ng-template>
</td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="columnasPasaje"></tr>
<tr mat-row *matRowDef="let row; columns: columnasPasaje;"></tr>
</table>
</div>
</div>
<!---------------------------------------------------------------------- SECCION PASAJE ---------------------------------------------------------------------->
</div> </div>
<div> </div>
<table mat-table [dataSource]="dataSource" class="mat-elevation-z8"> </mat-card-content>
<ng-container matColumnDef="lugarOrigen"> </mat-card>
<th mat-header-cell *matHeaderCellDef> LUGAR DE ORIGEN </th>
<td mat-cell *matCellDef="let element"> {{element.lugarOrigen}} </td>
</ng-container>
<ng-container matColumnDef="lugarDestino">
<th mat-header-cell *matHeaderCellDef> LUGAR DESTINO </th>
<td mat-cell *matCellDef="let element"> {{element.lugarDestino}} </td>
</ng-container>
<ng-container matColumnDef="monto">
<th mat-header-cell *matHeaderCellDef> MONTO </th>
<td mat-cell *matCellDef="let element"> {{element.monto}} </td>
</ng-container>
<ng-container matColumnDef="fecha"> <!---------------------------------------------------------------------- SERVICIOS PRESTADOS ---------------------------------------------------------------------->
<th mat-header-cell *matHeaderCellDef> FECHA </th> <mat-card appearance="outlined" class="mt-4 flex flex-col gap-2.5 text-[#222] !shadow-xl w-[90vw] md:w-[75vw]">
<td mat-cell *matCellDef="let element"> {{element.fecha}} </td> <mat-card-header class="flex flex-col items-center w-full ">
</ng-container> <label class="text-[1.1em] font-bold mb-4">
SERVICIOS PRESTADOS
</label>
</mat-card-header>
<mat-card-content class="w-full">
<div class="div-serviocisPrestados divisionGeneral" [formGroup]="datos_servicio">
<div class="servicio-descripcion">
<div style="display: flex;align-items: center">
<mat-form-field style="width: 20rem" appearance="outline" floatLabel="always">
<mat-label>Listado de Requerimientos</mat-label>
<input type="text" placeholder="Buscar requerimiento" matInput #inputBusqueda formControlName="selectedOption" [matAutocomplete]="auto" maxlength="9"
(input)="onBusquedaRequerimiento($event)">
<mat-autocomplete #auto="matAutocomplete" (optionSelected)="onEventSeleccion($event)" >
<mat-option *ngFor="let option of filteredOptions" [value]="option.codigo">
{{ option.numero }}
</mat-option>
</mat-autocomplete>
</mat-form-field>
<div class="contenedorRequerimiento" *ngFor="let card of cards" style="display: flex">
<mat-card>
<mat-card-content>
<mat-card-subtitle style="font-size: 1rem;font-weight: bold;align-content: center">{{ card.titulo }}</mat-card-subtitle>
<div class="contenedor-botones">
<button mat-fab aria-label="Eliminar" matTooltip="Eliminar" matTooltipPosition="above" (click)="deleteRequerimiento(card.id)">
<mat-icon class="mat-icon-small">delete</mat-icon>
</button>
</div>
<div class="contenedor-botones">
<button mat-fab aria-label="Información" matTooltip="Información" matTooltipPosition="above" (click)="infoRequerimiento(card.codigo)">
<mat-icon class="mat-icon-small">info</mat-icon>
</button>
</div>
</mat-card-content>
</mat-card>
<br>
</div>
<br>
<mat-label [ngClass]="{'fade-out': isFading}" [innerText]="labelText"></mat-label>
<ng-container matColumnDef="accion">
<th mat-header-cell *matHeaderCellDef> ACCIÓN </th>
<td mat-cell *matCellDef="let element"> {{element.lugarDestino}} </td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="columnasPasaje"></tr>
<tr mat-row *matRowDef="let row; columns: columnasPasaje;"></tr>
</table>
</div> </div>
</div>
</div>
</div>
</div>
<div class="div-serviocisPrestados divisionGeneral" [formGroup]="datos_servicio"> <br>
<mat-card appearance="outlined" class="titulo-Principal"> <mat-form-field class="example-full-width">
<mat-card-content>SERVICIOS PRESTADOS</mat-card-content> <mat-label>DESCRIPCIÓN DEL PROBLEMA : </mat-label>
</mat-card> <textarea matInput placeholder="Breve descripciòn sobrel los problemas encontrados en la sede" formControlName="descripcionServicio"></textarea>
</mat-form-field>
<div class="servicio-descripcion"> <br>
<div style="display: flex;align-items: center"> <mat-form-field class="example-full-width">
<label style="font-weight: bold; font-size: 1.2rem; font-family: 'inherit' ; padding: 0 10px">REQUERIMIENTOS : </label> <mat-label>CAUSA : </mat-label>
<mat-form-field class="divRequerimientos"> <textarea matInput placeholder="Breve descripciòn sobre las causas del problema" formControlName="causaServicio"></textarea>
<mat-label>Listado de Requerimientos</mat-label>
<input
type="text"
placeholder="Buscar requerimiento"
matInput
#inputBusqueda
formControlName="selectedOption"
[matAutocomplete]="auto"
(input)="onBusquedaRequerimiento($event)"
>
<mat-autocomplete #auto="matAutocomplete" (optionSelected)="onEventSeleccion($event)" >
<mat-option *ngFor="let option of filteredOptions" [value]="option.codigo">
{{ option.numero }}
</mat-option>
</mat-autocomplete>
</mat-form-field> </mat-form-field>
<div class="contenedorRequerimiento" *ngFor="let card of cards"> </div>
<mat-card >
<mat-card-content> <div class="grid grid-flow-col md:grid-cols-2 gap-5">
<div class="contenedor-general-botones"> <!--<label>EVIDENCIA DEL PROBLEMA</label> -->
<mat-card-subtitle style="font-size: 1rem;font-weight: bold;align-content: center">{{ card.titulo }}</mat-card-subtitle> <div class="grid grid-cols-3 md:grid-cols-1 gap-2.5 pb-2 border-b md:border-b-0 border-b-red-950/50">
<div class="contenedor-botones"> <b class="md:text-[0.7em] text-[1em] text-black/60">PROBLEMAS :</b>
<button mat-fab aria-label="Eliminar" matTooltip="Eliminar" matTooltipPosition="above" (click)="deleteRequerimiento(card.id)"> <button mat-fab extended
<mat-icon class="mat-icon-small">delete</mat-icon> [color]="botonesEvidencia.botonProblema.estado ? 'success' : 'blue'"
</button> (click)="file1.click()">
</div> {{ botonesEvidencia.botonProblema.texto }}
<div class="contenedor-botones"> <ng-container *ngIf="botonesEvidencia.botonProblema.estado; else elseTemplate">
<button mat-fab aria-label="Información" matTooltip="Información" matTooltipPosition="above" (click)="infoRequerimiento(card.codigo)"> <mat-icon class="font-size: 48px; height: 48px; width: 48px">arrow_upload_ready</mat-icon>
<mat-icon class="mat-icon-small">info</mat-icon> </ng-container>
</button> <ng-template #elseTemplate>
</div> <mat-icon class="font-size: 48px; height: 48px; width: 48px">file_open</mat-icon>
</div> </ng-template>
</mat-card-content> </button>
</mat-card> <input id="botonProblema" #file1 type="file" class="hidden" (change)="onEventoDocumentos($event)">
<br>
</div> </div>
<br>
<mat-label [ngClass]="{'fade-out': isFading}" [innerText]="labelText"></mat-label>
<div class="grid grid-cols-3 md:grid-cols-1 gap-2.5 pb-2 border-b md:border-b-0 border-b-red-950/50">
<b class="md:text-[0.7em] text-[1em] text-black/60">SOLUCIONES : </b>
<button mat-fab extended
[color]="botonesEvidencia.botonSolucion.estado ? 'success' : 'blue'"
(click)="file2.click()">
{{ botonesEvidencia.botonSolucion.texto }}
<ng-container *ngIf="botonesEvidencia.botonSolucion.estado; else elseTemplate">
<mat-icon>arrow_upload_ready</mat-icon>
</ng-container>
<ng-template #elseTemplate>
<mat-icon>file_open</mat-icon>
</ng-template>
</button>
<input id="botonSolucion" #file2 type="file" class="hidden" (change)="onEventoDocumentos($event)">
</div>
</div> </div>
<br> </div>
</mat-card-content>
<mat-form-field class="example-full-width"> </mat-card>
<mat-label>DESCRIPCIÓN DEL PROBLEMA : </mat-label>
<textarea matInput placeholder="Breve descripciòn sobrel los problemas encontrados en la sede" formControlName="descripcionServicio"></textarea>
<mat-card appearance="outlined" class="mt-4 flex flex-col gap-2.5 text-[#222] !shadow-xl w-[90vw] md:w-[75vw]">
<mat-card-header class="flex flex-col items-center w-full ">
<label class="text-[1.1em] font-bold mb-4">
TRABAJOS PRESTADOS
</label>
</mat-card-header>
<mat-card-content class="w-full">
<div class="div-trabajosPrestados divisionGeneral" [formGroup]="datos_trabajo">
<label style="font-weight: bold; font-size: 1.2rem; font-family: 'inherit'">TIPO DE TRABAJO : </label>
<mat-form-field class="select-tipoTrabajo">
<mat-label>Seleccionar tipo de trabajo</mat-label>
<mat-select formControlName="tipoTrabajo">
@for (tipoT of listTipoTrabajo; track tipoT) {
<mat-option [value]="tipoT.value">{{tipoT.viewValue}}</mat-option>
}
</mat-select>
</mat-form-field> </mat-form-field>
<br> <br>
<mat-form-field class="example-full-width"> <mat-form-field class="example-full-width">
<mat-label>CAUSA : </mat-label> <mat-label>DESCRIPCIÓN DEL TRABAJO : </mat-label>
<textarea matInput placeholder="Breve descripciòn sobre las causas del problema" formControlName="causaServicio"></textarea> <textarea matInput placeholder="Breve descripciòn del trabajo realizado" formControlName="descripcionTrabajo"></textarea>
</mat-form-field> </mat-form-field>
</div> </div>
</mat-card-content>
<input style="display: none" type="file" name="file" id="file"> </mat-card>
<input style="display: none" type="file" name="fila2" id="file2">
<div class="servicio-evidencia" style="margin: 20px 0;">
<div class="example-button-row" style=" display: flex; width:100%;justify-content: center">
<div class="example-flex-container" style="display: flex; width: 50%;justify-content: space-between" >
<div class="example-button-container">
<button mat-fab extended >
<mat-icon>upload_file</mat-icon>
EVIDENCIA DEL PROBLEMA
</button>
</div>
<div class="example-button-container">
<button mat-fab extended >
<mat-icon>upload_file</mat-icon>
EVIDENCIA DE LA SOLUCIÓN
</button>
</div>
</div>
</div>
</div>
</div>
<br>
<div class="div-trabajosPrestados divisionGeneral" [formGroup]="datos_trabajo">
<mat-card appearance="outlined" class="titulo-Principal">
<mat-card-content>TRABAJOS PRESTADOS</mat-card-content>
</mat-card>
<div class="div-trabajosPrestados">
<label style="font-weight: bold; font-size: 1.2rem; font-family: 'inherit'">TIPO DE TRABAJO : </label>
<mat-form-field class="select-tipoTrabajo">
<mat-label>Seleccionar tipo de trabajo</mat-label>
<mat-select formControlName="tipoTrabajo">
@for (tipoT of listTipoTrabajo; track tipoT) {
<mat-option [value]="tipoT.value">{{tipoT.viewValue}}</mat-option>
}
</mat-select>
</mat-form-field>
<br>
<mat-form-field class="example-full-width">
<mat-label>DESCRIPCIÓN DEL TRABAJO : </mat-label>
<textarea matInput placeholder="Breve descripciòn del trabajo realizado" formControlName="descripcionTrabajo"></textarea>
</mat-form-field>
</div>
</div>
<mat-card appearance="outlined" class="titulo-Principal">
<mat-card-content>MATERIAL SOBRANTE</mat-card-content>
</mat-card>
<mat-label> ¿ Se encontro material para devolver al almacen ? : </mat-label>
<mat-button-toggle-group aria-label="Existe material sobrante" >
<mat-button-toggle value="1">SI</mat-button-toggle>
<mat-button-toggle value="2">NO</mat-button-toggle>
</mat-button-toggle-group>
<!-- <h4>MATERIAL SOBRANTE</h4> --> <!-- <h4>MATERIAL SOBRANTE</h4> -->
<div class="div-MaterialSobrante divisionGeneral" [formGroup]="datos_material"> <!--<div class="div-MaterialSobrante divisionGeneral" [formGroup]="datos_material">
</div> -->
<mat-card appearance="outlined" class="titulo-Principal">
<mat-card-content>MATERIAL SOBRANTE</mat-card-content>
</mat-card>
<mat-label> ¿ Se encontro material para devolver al almacen ? : </mat-label>
<mat-button-toggle-group formControlName="materialSobrante" aria-label="Existe material sobrante" >
<mat-button-toggle value="1">SI</mat-button-toggle>
<mat-button-toggle value="2">NO</mat-button-toggle>
</mat-button-toggle-group>
</div>
</div> </div>
<!-- <h4>TÉCNICO :</h4>
<mat-form-field>
<mat-label>Favorite food</mat-label>
<mat-select name="food">
@for (food of foods; track food) {
<mat-option [value]="food.value">{{food.viewValue}}</mat-option>
}
</mat-select>
</mat-form-field>
<h4>FECHAS : </h4>
<mat-form-field>
<mat-label>Enter a date range</mat-label>
<mat-date-range-input [formGroup]="range" [rangePicker]="picker">
<input matStartDate formControlName="start" placeholder="Start date">
<input matEndDate formControlName="end" placeholder="End date">
</mat-date-range-input>
<mat-hint>MM/DD/YYYY – MM/DD/YYYY</mat-hint>
<mat-datepicker-toggle matIconSuffix [for]="picker"></mat-datepicker-toggle>
<mat-date-range-picker #picker></mat-date-range-picker>
@if (range.controls.start.hasError('matStartDateInvalid')) {
<mat-error>Invalid start date</mat-error>
}
@if (range.controls.end.hasError('matEndDateInvalid')) {
<mat-error>Invalid end date</mat-error>
}
</mat-form-field>
<h4>SEDE :</h4>
<mat-form-field>
<mat-label>Favorite food</mat-label>
<mat-select name="food">
@for (food of foods; track food) {
<mat-option [value]="food.value">{{food.viewValue}}</mat-option>
}
</mat-select>
</mat-form-field>
<h4>AREA </h4>
<mat-form-field>
<mat-label>Favorite food</mat-label>
<mat-select name="food">
@for (food of foods; track food) {
<mat-option [value]="food.value">{{food.viewValue}}</mat-option>
}
</mat-select>
</mat-form-field>
<h5>SERVICIOS PRESTADO </h5> -->
...@@ -3,26 +3,27 @@ import {FormControl, FormGroup, FormsModule, ReactiveFormsModule , Validators} f ...@@ -3,26 +3,27 @@ import {FormControl, FormGroup, FormsModule, ReactiveFormsModule , Validators} f
import {MatIconModule} from '@angular/material/icon'; import {MatIconModule} from '@angular/material/icon';
import {MatDividerModule} from '@angular/material/divider'; import {MatDividerModule} from '@angular/material/divider';
import {MatButtonModule} from '@angular/material/button'; import {MatButtonModule} from '@angular/material/button';
import {provideNativeDateAdapter} from '@angular/material/core'; import {provideNativeDateAdapter , MatNativeDateModule , MAT_DATE_FORMATS } from '@angular/material/core';
import {MatDatepickerModule} from '@angular/material/datepicker'; import {DateRange, MatDatepickerModule, MatDateRangeInput } from '@angular/material/datepicker';
import {MatFormFieldModule} from '@angular/material/form-field'; import {MatFormFieldModule} from '@angular/material/form-field';
import {MatInputModule} from '@angular/material/input'; import {MatInputModule} from '@angular/material/input';
import {MatSelectModule} from '@angular/material/select'; import {MatSelectModule} from '@angular/material/select';
import {MatButtonToggleModule} from '@angular/material/button-toggle'; import {MatButtonToggleModule} from '@angular/material/button-toggle';
import {MatCheckboxModule} from '@angular/material/checkbox'; import {MatCheckboxModule} from '@angular/material/checkbox';
import {ConformidadHelper} from "./helper/conformidad.helper"; import {ConformidadHelper} from "./helper/conformidad.helper";
import {NgClass, NgForOf} from "@angular/common"; import {NgClass, NgForOf, NgIf, DatePipe, AsyncPipe, NgStyle} from "@angular/common";
import {MatCardModule} from '@angular/material/card'; import {MatCard, MatCardContent, MatCardFooter, MatCardHeader, MatCardTitle , MatCardModule} from '@angular/material/card';
import {Observable,from } from 'rxjs'; import {Observable, from, min} from 'rxjs';
import {switchMap, map, startWith , debounceTime } from 'rxjs/operators'; import {switchMap, map, startWith , debounceTime } from 'rxjs/operators';
import {AsyncPipe} from '@angular/common'; //import {AsyncPipe} from '@angular/common';
import {MatAutocompleteModule} from '@angular/material/autocomplete'; import {MatAutocompleteModule} from '@angular/material/autocomplete';
import {MatTooltipModule} from '@angular/material/tooltip'; import {MatTooltipModule} from '@angular/material/tooltip';
import {MatDialog, MatDialogModule} from '@angular/material/dialog'; import {MatDialog, MatDialogModule} from '@angular/material/dialog';
import {modalRequerimientoComponent} from "./modalRequerimiento/modalRequerimiento.componente"; import {modalRequerimientoComponent} from "./modalRequerimiento/modalRequerimiento.componente";
import {MatTableModule} from '@angular/material/table'; import {MatTableModule} from '@angular/material/table';
import { MatCell, MatCellDef, MatColumnDef, MatHeaderCell, MatHeaderRow, MatHeaderRowDef, MatRow, MatRowDef, MatTable import { MatCell, MatCellDef, MatColumnDef, MatHeaderCell, MatHeaderRow, MatHeaderRowDef, MatRow, MatRowDef, MatTable } from "@angular/material/table";
} from "@angular/material/table"; import { SoloNumerosDirective } from '../../service/directivas_service/soloNumeros/solo-numeros.directive'; // Importa la directiva
import { MY_DATE_FORMATS } from "../../service/directivas_service/formatoFecha/date-format"; // Asegúrate de ajustar la ruta
interface tiposTrabajo { interface tiposTrabajo {
value: string; value: string;
...@@ -36,15 +37,19 @@ interface interRequerimientos { ...@@ -36,15 +37,19 @@ interface interRequerimientos {
} }
interface interDetallePasaje { interface interDetallePasaje {
index: number;
lugarOrigen: string; lugarOrigen: string;
lugarDestino : string; lugarDestino : string;
monto: string; monto: string;
fecha: Date; fecha: Date;
isNew: boolean;
} }
@Component({ @Component({
imports: [ imports: [
SoloNumerosDirective,
MatDatepickerModule, MatDatepickerModule,
MatNativeDateModule,
MatFormFieldModule, MatFormFieldModule,
FormsModule, FormsModule,
ReactiveFormsModule, ReactiveFormsModule,
...@@ -53,6 +58,11 @@ interface interDetallePasaje { ...@@ -53,6 +58,11 @@ interface interDetallePasaje {
MatButtonToggleModule, MatButtonToggleModule,
MatCheckboxModule, MatCheckboxModule,
NgForOf, NgForOf,
MatCard,
MatCardContent,
MatCardFooter,
MatCardHeader,
MatCardTitle,
MatCardModule, MatCardModule,
MatButtonModule, MatButtonModule,
MatDividerModule, MatDividerModule,
...@@ -71,8 +81,10 @@ interface interDetallePasaje { ...@@ -71,8 +81,10 @@ interface interDetallePasaje {
MatRowDef, MatRowDef,
MatTable, MatTable,
MatTableModule, MatTableModule,
NgIf,
NgStyle,
], ],
providers: [provideNativeDateAdapter()], providers: [provideNativeDateAdapter(),DatePipe, { provide: MAT_DATE_FORMATS, useValue: MY_DATE_FORMATS } ],
selector: 'app-conformidad', selector: 'app-conformidad',
standalone: true, standalone: true,
templateUrl: './conformidad.componente.html', templateUrl: './conformidad.componente.html',
...@@ -101,14 +113,6 @@ export class ConformidadComponent implements OnInit { ...@@ -101,14 +113,6 @@ export class ConformidadComponent implements OnInit {
]; ];
//INICIALIZACION DE LISTADO DE TIPOS DE TRABAJO //INICIALIZACION DE LISTADO DE TIPOS DE TRABAJO
// INICIALIZACION DEL RANGO DE FECHAS
readonly range = new FormGroup({
fechaInicio: new FormControl<Date | null>(null),
fechaFin: new FormControl<Date | null>(null),
})
// INICIALIZACION DEL RANGO DE FECHAS
// DATALIST // DATALIST
personal_list: any = []; personal_list: any = [];
...@@ -116,26 +120,35 @@ export class ConformidadComponent implements OnInit { ...@@ -116,26 +120,35 @@ export class ConformidadComponent implements OnInit {
filteredOptions: any[]; filteredOptions: any[];
cards: { id: number; titulo: string; codigo: string}[] = []; cards: { id: number; titulo: string; codigo: string}[] = [];
idBotones: number = 0; idBotones: number = 0;
indexPasaje : number = 0 ;
labelText: string = ''; // Texto que se muestra inicialmente labelText: string = ''; // Texto que se muestra inicialmente
isFading: boolean = false; // Controla si la animación de desvanecimiento debe activarse isFading: boolean = false; // Controla si la animación de desvanecimiento debe activarse
selectedOption: string = ''; // Variable para enlazar con el input activarPasajes : boolean = false;
lugarDestinoPasaje : string = '';
columnasPasaje: string[] = ['lugarOrigen', 'lugarDestino', 'monto', 'fecha','accion']; columnasPasaje: string[] = ['lugarOrigen', 'lugarDestino', 'monto', 'fecha','accion'];
dataSource: interDetallePasaje[] = []; dataSource: interDetallePasaje[] = [];
botonesEvidencia: any = {
botonProblema : { texto : 'EVIDENCIA DEL PROBLEMA' , estado : false},
botonSolucion : { texto : 'EVIDENCIA DE SOLUCIÓN' , estado : false}
}
minFechaLimite: Date | null = new Date(); // 10 de septiembre de 2024 (meses empiezan en 0)
maxFechaLimite: Date | null = new Date();
// DATALIST // DATALIST
// GROUPO DE FORMULARIO // GROUPO DE FORMULARIO
datos_personal = new FormGroup({ datos_personal = new FormGroup({
tecnicoPersonal : new FormControl(null ,Validators.required), tecnicoPersonal : new FormControl(null ,Validators.required),
sedePersonal : new FormControl(null,Validators.required), sedePersonal : new FormControl(null,Validators.required),
areaPersonal : new FormControl<String | null>(null ,Validators.required), areaPersonal : new FormControl<String | null>(null ,Validators.required),
pasajePersonal : new FormControl(null ,Validators.required), minFechaTrabajo : new FormControl<Date | null>(null, Validators.required),
maxFechaTrabajo : new FormControl<Date | null>(null, Validators.required),
}); });
datos_servicio = new FormGroup({ datos_servicio = new FormGroup({
requerimientoServicio : new FormControl(null ,Validators.required),
descripcionServicio : new FormControl(null ,Validators.required), descripcionServicio : new FormControl(null ,Validators.required),
causaServicio : new FormControl(null ,Validators.required), causaServicio : new FormControl(null ,Validators.required),
selectedOption : new FormControl<String | null>(null ,[Validators.maxLength(12)]), selectedOption : new FormControl<String | null>(null ,[Validators.maxLength(12)]),
...@@ -146,17 +159,23 @@ export class ConformidadComponent implements OnInit { ...@@ -146,17 +159,23 @@ export class ConformidadComponent implements OnInit {
descripcionTrabajo : new FormControl(null ,Validators.required), descripcionTrabajo : new FormControl(null ,Validators.required),
}); });
datos_material = new FormGroup({ datos_pasajeAcumulado = new FormGroup<any>({
materialSobrante : new FormControl(null ,Validators.required), pasajeTotal: new FormControl<number | null>(null, Validators.required)
}); });
datos_lugarOrigen : FormGroup = new FormGroup<any>({}) ;
datos_fechaPasaje : FormGroup = new FormGroup<any>({}) ;
// GROUPO DE FORMULARIO // GROUPO DE FORMULARIO
constructor( constructor(
private conformidadHelper: ConformidadHelper, private conformidadHelper: ConformidadHelper,
private renderer: Renderer2, private renderer: Renderer2,
private detectorChage : ChangeDetectorRef, private detectorChage : ChangeDetectorRef,
public dialog: MatDialog public dialog: MatDialog,
private datePipe: DatePipe,
) { ) {
this.filteredOptions = []; this.filteredOptions = [];
renderer.setStyle(document.body, 'background', 'var(--light-theme-bg)'); renderer.setStyle(document.body, 'background', 'var(--light-theme-bg)');
...@@ -176,11 +195,15 @@ export class ConformidadComponent implements OnInit { ...@@ -176,11 +195,15 @@ export class ConformidadComponent implements OnInit {
return this.datos_trabajo.controls; return this.datos_trabajo.controls;
} }
accesoDM(){ //ACCESOS RAPIDOS A GRUPOS DE FORMULARIOS
return this.datos_material.controls;
formatoFecha(fecha: Date): string {
return this.datePipe.transform(fecha, 'dd/MM/yyyy') || '';
} }
//ACCESOS RAPIDOS A GRUPOS DE FORMULARIOS formatoFechaDate(fecha: Date): string {
return this.datePipe.transform(fecha, 'yyyy/MM/dd') || '';
}
async ngOnInit(): Promise<void> { async ngOnInit(): Promise<void> {
...@@ -194,9 +217,109 @@ export class ConformidadComponent implements OnInit { ...@@ -194,9 +217,109 @@ export class ConformidadComponent implements OnInit {
this.personal_list = personal; this.personal_list = personal;
this.sede_list = sede; this.sede_list = sede;
this.dataSource = [{ lugarOrigen: 'Lima', lugarDestino: 'Cusco', monto: 'S/. 100.00', fecha: new Date() }]; this.dataSource = [];
this.activarPasajes = false;
this.habilitarSeccionPersonal(true);
// Detecta cambios en el formulario de Datos Personal exceptuando 'lugarDestinoPasaje' para desbloquear el boton de 'Agregar Pasaje'
this.datos_personal.valueChanges.subscribe(value => {
const controlesInvalidos = Object.keys(this.datos_personal.controls)
.filter(controlName => this.datos_personal.get(controlName)?.invalid);
console.log('Controles inválidos con errores:', controlesInvalidos);
this.activarPasajes = controlesInvalidos.length === 0 ? true : false;
// En caso ya existan registros en la tabla de pasajes , se limpiará el listado y las filas existentes.
if(this.dataSource.length > 0 && !this.activarPasajes){
this.dataSource = [];
this.indexPasaje = 0;
this.datos_pasajeAcumulado.reset();
this.datos_fechaPasaje.reset();
this.datos_lugarOrigen.reset();
}
/*const tecnicoPersonal = this.datos_personal.get('tecnicoPersonal')?.value;
const sedePersonal = this.datos_personal.get('sedePersonal')?.value;
const areaPersonal = this.datos_personal.get('areaPersonal')?.value;
if(tecnicoPersonal && sedePersonal && areaPersonal){
this.datos_personal.get('lugarDestinoPasaje')?.setErrors({'incorrect': false});
}else{
this.datos_personal.get('lugarDestinoPasaje')?.setErrors({'incorrect': true});
}*/
});
// Sincronizar el valor de 'sedePersonal' con los selects la tabla de pasaje
this.datos_personal.get('sedePersonal')?.valueChanges.subscribe((value) => {
this.lugarDestinoPasaje = this.sede_list.find((item: any) => item.codlocal === value)?.deslocal || '';
});
//Sincroniza todos los inputs de monto de pasaje con el total de pasajes
this.datos_pasajeAcumulado.valueChanges.subscribe(values => {
const inputControls = Object.keys(values).filter(key => key.includes('montoPasaje'));
const sum : number = (inputControls.reduce((acc, key) => acc + (Number(values[key]) || 0), 0) ) || 0;
this.datos_pasajeAcumulado.get('pasajeTotal')?.setValue(sum, { emitEvent: false });
});
//Condicionar a todos los controladores de Lugar de Origen para que si se escoge el mismo lugar que el lugar de origen salga una advertencia
this.datos_lugarOrigen.valueChanges.subscribe(value => {
const lugarDestino = this.datos_personal.get('sedePersonal')?.value;
if(lugarDestino) {
const inputControls = Object.keys(value);
inputControls.forEach((idlugar) => {
const lugarOrigen = value[idlugar];
if (lugarOrigen) {
if (lugarOrigen === lugarDestino) {
this.datos_lugarOrigen.get(idlugar)?.setErrors({'incorrect': true});
}
}else{
this.datos_lugarOrigen.get(idlugar)?.setErrors({'incorrect': false});
}
});
}else{
this.datos_personal.get('sedePersonal')?.setErrors({'incorrect': true});
}
});
/*this.datos_fechaTrabajo.get('maxFechaTrabajo')?.valueChanges.subscribe((value) => {
let minFecha : any = this.datos_fechaTrabajo.get('minFechaTrabajo')?.value;*/
this.datos_personal.get('maxFechaTrabajo')?.valueChanges.subscribe((value) => {
let minFecha : any = this.datos_personal.get('minFechaTrabajo')?.value;
let maxFecha : any = value;
if( minFecha && maxFecha ){
this.minFechaLimite = new Date(minFecha);
this.maxFechaLimite = new Date(maxFecha);
//Obtener todos los formControNames dentro del formGroup datos_fechaPasaje
const inputControls = Object.keys(this.datos_fechaPasaje.controls);
//Iterar sobre cada formControlName
inputControls.forEach((key) => {
let fechaPasaje = this.datos_fechaPasaje.get(key)?.value;
if(fechaPasaje){
let fechaPasajeDate = new Date(fechaPasaje);
if(fechaPasajeDate >= (this.minFechaLimite || new Date()) && fechaPasajeDate <= (this.maxFechaLimite|| new Date()) ){
this.datos_fechaPasaje.get(key)?.setErrors({'incorrect': false});
}else{
this.datos_fechaPasaje.get(key)?.setErrors({'incorrect': true});
this.datos_fechaPasaje.get(key)?.setValue('');
}
}
});
}
});
} }
//AL SELECCIONAR UN REQUERIMIENTO
onEventSeleccion(event : any){ onEventSeleccion(event : any){
const valor = event.option.value; const valor = event.option.value;
...@@ -210,7 +333,7 @@ export class ConformidadComponent implements OnInit { ...@@ -210,7 +333,7 @@ export class ConformidadComponent implements OnInit {
}, 2000); // 2000 ms = 2 segundos }, 2000); // 2000 ms = 2 segundos
}else{ }else{
this.cards.push({ titulo: `Requerimiento ${valor}`, id: this.idBotones++ , codigo: valor }); this.cards.push({ titulo: `RQ N°${valor}`, id: this.idBotones++ , codigo: valor });
this.labelText = ''; this.labelText = '';
} }
this.datos_servicio.get('selectedOption')?.setValue(''); this.datos_servicio.get('selectedOption')?.setValue('');
...@@ -220,10 +343,46 @@ export class ConformidadComponent implements OnInit { ...@@ -220,10 +343,46 @@ export class ConformidadComponent implements OnInit {
} }
//AL SELECCIONAR INFORMACION DE UN REQUERIMIENTO
async infoRequerimiento(valor: any){
const requerimientoInfo = await this.conformidadHelper.listadoGeneralHorizon({accion: 3, nroRequerimiento: valor, sede: ''});
const dialogRef = this.dialog.open(modalRequerimientoComponent,{
width: '300rem',
data: { requerimientoInfo }
});
dialogRef.afterClosed().subscribe(result => {
console.log(`Dialog result: ${result}`);
});
}
//ELIMINAR REQUERIMIENTO SELECCIONADO
deleteRequerimiento(valor : any){
this.cards = this.cards.filter((item) => item.id !== valor);
}
//AL SUBIR UN ARCHIVO EN LOS BOTONES DE DOCUMENTOS
onEventoDocumentos(event: any){
const file = event?.target?.files[0] || null;
const nameFile = file?.name.replaceAll(' ', '_').toUpperCase() || null;
const elementId = event.target.getAttribute('id');
const botonMap = this.botonesEvidencia[elementId];
console.log(botonMap);
if(botonMap) {
if(file){
botonMap.estado = true;
botonMap.texto = nameFile;
}else{
botonMap.estado = false;
botonMap.texto = elementId === 'botonProblema' ? 'EVIDENCIA DEL PROBLEMA' : 'EVIDENCIA DE SOLUCIÓN';
}
}
}
//AL SELECCIONAR UN TECNICO, MOSTRAR AUTOMATICAMENTE SU AREA
onEventTecnico(event: any) { // IMPRIMER EL ÁREA DEL TÉCNICO AL SELECCIONARLO onEventTecnico(event: any) { // IMPRIMER EL ÁREA DEL TÉCNICO AL SELECCIONARLO
const areaControl = this.accesoDP().areaPersonal; const areaControl = this.accesoDP().areaPersonal;
const codigoPer = event.value; const codigoPer = event.value;
const personal_list = this.personal_list; const personal_list = this.personal_list;
const personal_datos = personal_list.find((item: any) => item.codper === codigoPer); const personal_datos = personal_list.find((item: any) => item.codper === codigoPer);
...@@ -233,10 +392,11 @@ export class ConformidadComponent implements OnInit { ...@@ -233,10 +392,11 @@ export class ConformidadComponent implements OnInit {
}else{ }else{
areaControl.setValue('Sin Cargo'); areaControl.setValue('Sin Cargo');
} }
areaControl.updateValueAndValidity(); areaControl.updateValueAndValidity();
} }
//REALIZAR UNA BUSQUEDA DE REQUERIMIENTO
async onBusquedaRequerimiento(event: any) { async onBusquedaRequerimiento(event: any) {
const codigoSede = this.accesoDP().sedePersonal.value; const codigoSede = this.accesoDP().sedePersonal.value;
const busquedaReq = event.target.value; const busquedaReq = event.target.value;
...@@ -257,20 +417,93 @@ export class ConformidadComponent implements OnInit { ...@@ -257,20 +417,93 @@ export class ConformidadComponent implements OnInit {
this.filteredOptions = mapeoResultado; this.filteredOptions = mapeoResultado;
} }
deleteRequerimiento(valor : any){ //AL SELECCIONAR LA OPCIÓN DE NUEVO PASAJE
this.cards = this.cards.filter((item) => item.id !== valor); onEventoNuevoPasaje(event : any){
const NuevaFila : interDetallePasaje = {
index: this.indexPasaje++,
lugarOrigen: '',
lugarDestino: '',
monto: '',
fecha: new Date(),
isNew: true
};
this.datos_pasajeAcumulado.addControl('montoPasaje'+NuevaFila.index, new FormControl<number | null>(null,[Validators.maxLength(12)]));
this.datos_fechaPasaje.addControl('fechaPasaje'+NuevaFila.index, new FormControl<Date | null>(null,[Validators.maxLength(12)]));
this.datos_lugarOrigen.addControl('lugarOrigen'+NuevaFila.index, new FormControl<String | null>(null ,[Validators.maxLength(12)]));
this.dataSource = [...this.dataSource,NuevaFila];
this.activarPasajes = false;
this.habilitarSeccionPersonal(false);
} }
async infoRequerimiento(valor: any){ onEventoConfirmarPasaje(event: any, elemento: any){
const requerimientoInfo = await this.conformidadHelper.listadoGeneralHorizon({accion: 3, nroRequerimiento: valor, sede: ''}); const lugarOrigen = this.datos_lugarOrigen.get(`lugarOrigen${elemento.index}`)?.value;
const lugarDestino = this.datos_personal.get('sedePersonal')?.value || '';
const pasaje = this.datos_pasajeAcumulado.get(`montoPasaje${elemento.index}`)?.value;
const fechaPasaje = this.datos_fechaPasaje.get(`fechaPasaje${elemento.index}`)?.value;
const dialogRef = this.dialog.open(modalRequerimientoComponent,{ //VALIDAR LOS VALORES OBTENIDOS ANTES DE REALIZAR UN REGISTRO
width: '300rem',
data: { requerimientoInfo }
}); // Agregar los datos recogidos de la fila para agregarlos en dataSource y actualizar la tabla
dialogRef.afterClosed().subscribe(result => { const index = this.dataSource.findIndex((item) => item.index === elemento.index);
console.log(`Dialog result: ${result}`); this.dataSource[index] = {
}); index: elemento.index,
lugarOrigen: this.sede_list.find((item: any) => item.codlocal === lugarOrigen)?.deslocal || '' ,
lugarDestino: this.sede_list.find((item: any) => item.codlocal === lugarDestino)?.deslocal || '' ,
monto: pasaje,
fecha: fechaPasaje,
isNew: false
};
console.log(this.dataSource , 'DATASOURCE');
console.log(lugarOrigen , lugarDestino, pasaje, fechaPasaje)
this.dataSource = [...this.dataSource];
this.activarPasajes = true;
this.habilitarSeccionPersonal(true);
}
onEventoCancelarPasaje(event: any, elemento: any){
this.dataSource = this.dataSource.filter((item) => item.index !== elemento.index);
this.datos_pasajeAcumulado.removeControl('montoPasaje'+elemento.index);
this.datos_fechaPasaje.removeControl('fechaPasaje'+elemento.index);
this.datos_lugarOrigen.removeControl('lugarOrigen'+elemento.index);
this.habilitarSeccionPersonal(true);
this.activarPasajes = true
}
onMaterialSobrante(event: any){
const materialSobrante = event.target.value;
console.log(materialSobrante);
}
onEventoEditarPasaje(event: any, elemento: any){
}
onEventoEliminarPasaje(event: any, elemento: any){
}
habilitarSeccionPersonal(datos: boolean){
if(datos){
this.datos_personal.get('tecnicoPersonal')?.enable({ emitEvent: false });
this.datos_personal.get('sedePersonal')?.enable({ emitEvent: false });
this.datos_personal.get('areaPersonal')?.enable({ emitEvent: false });
this.datos_personal.get('maxFechaTrabajo')?.enable({ emitEvent: false });
this.datos_personal.get('minFechaTrabajo')?.enable({ emitEvent: false });
}else{
this.datos_personal.get('tecnicoPersonal')?.disable({ emitEvent: false });
this.datos_personal.get('sedePersonal')?.disable({ emitEvent: false });
this.datos_personal.get('areaPersonal')?.disable({ emitEvent: false });
this.datos_personal.get('maxFechaTrabajo')?.disable({ emitEvent: false });
this.datos_personal.get('minFechaTrabajo')?.disable({ emitEvent: false });
}
} }
} }
......
...@@ -17,25 +17,6 @@ export class ConformidadHelper { ...@@ -17,25 +17,6 @@ export class ConformidadHelper {
} }
} }
/*async cargarSede(){
const respuesta = await this.ConformidadService.listadoGeneralHorizon({accion: 1});
if(respuesta?.status){
return respuesta.data;
}else{
return [];
}
}
async cargarRequerimientos(json : any){
const respuesta = await this.ConformidadService.listadoRequerimientos(json);
if (respuesta?.status) {
return respuesta.data;
}else{
return [];
}
}*/
async listadoGeneralHorizon(json: any){ async listadoGeneralHorizon(json: any){
const respuesta = await this.ConformidadService.listadoGeneralHorizon(json); const respuesta = await this.ConformidadService.listadoGeneralHorizon(json);
if (respuesta?.status) { if (respuesta?.status) {
......
import { MatDateFormats } from '@angular/material/core';
export const MY_DATE_FORMATS: MatDateFormats = {
parse: {
dateInput: 'DD/MM/YYYY',
},
display: {
dateInput: 'DD/MM/YYYY',
monthYearLabel: 'MMM YYYY',
dateA11yLabel: 'DD/MM/YYYY',
monthYearA11yLabel: 'MMMM YYYY',
},
};
/*import { SoloNumerosDirective } from './solo-numeros.directive';
describe('SoloNumerosDirective', () => {
it('should create an instance', () => {
const directive = new SoloNumerosDirective();
expect(directive).toBeTruthy();
});
});
*/
import { Directive ,HostListener } from '@angular/core';
@Directive({
selector: '[soloNumeros]',
standalone: true
})
export class SoloNumerosDirective {
//constructor() { }
@HostListener('keypress', ['$event'])
onKeyPress(event: KeyboardEvent) {
const charCode = event.key;
// Permitir solo números (0-9)
if (!/^[0-9]$/.test(charCode)) {
event.preventDefault();
}
}
}
/* You can add global styles to this file, and also import other style files */ @tailwind base;
@tailwind components;
@tailwind utilities;
html, body { height: 100%; } html, body { height: 100%; }
body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; } body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; }
.mat-mdc-form-field .mdc-notched-outline__notch {
border-right: 0px !important;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment