feat(sat): add SAT authentication and download services (Phase 3)

- Add sat-auth.service.ts for SAML token authentication with SAT
  using FIEL credentials and SOAP protocol
- Add sat-download.service.ts with full download workflow:
  - Request CFDI download (emitted/received)
  - Verify request status with polling support
  - Download ZIP packages when ready
  - Helper functions for status checking
- Install fast-xml-parser and adm-zip dependencies

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Consultoria AS
2026-01-25 00:49:02 +00:00
parent a64aa11548
commit 56e6e27ab3
4 changed files with 605 additions and 0 deletions

35
pnpm-lock.yaml generated
View File

@@ -26,6 +26,9 @@ importers:
'@prisma/client':
specifier: ^5.22.0
version: 5.22.0(prisma@5.22.0)
adm-zip:
specifier: ^0.5.16
version: 0.5.16
bcryptjs:
specifier: ^2.4.3
version: 2.4.3
@@ -41,6 +44,9 @@ importers:
express:
specifier: ^4.21.0
version: 4.22.1
fast-xml-parser:
specifier: ^5.3.3
version: 5.3.3
helmet:
specifier: ^8.0.0
version: 8.1.0
@@ -54,6 +60,9 @@ importers:
specifier: ^3.23.0
version: 3.25.76
devDependencies:
'@types/adm-zip':
specifier: ^0.5.7
version: 0.5.7
'@types/bcryptjs':
specifier: ^2.4.6
version: 2.4.6
@@ -958,6 +967,9 @@ packages:
resolution: {integrity: sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==}
engines: {node: '>=12'}
'@types/adm-zip@0.5.7':
resolution: {integrity: sha512-DNEs/QvmyRLurdQPChqq0Md4zGvPwHerAJYWk9l2jCbD1VPpnzRJorOdiq4zsw09NFbYnhfsoEhWtxIzXpn2yw==}
'@types/bcryptjs@2.4.6':
resolution: {integrity: sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==}
@@ -1052,6 +1064,10 @@ packages:
resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
engines: {node: '>= 0.6'}
adm-zip@0.5.16:
resolution: {integrity: sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==}
engines: {node: '>=12.0'}
any-promise@1.3.0:
resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
@@ -1424,6 +1440,10 @@ packages:
resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
engines: {node: '>=8.6.0'}
fast-xml-parser@5.3.3:
resolution: {integrity: sha512-2O3dkPAAC6JavuMm8+4+pgTk+5hoAs+CjZ+sWcQLkX9+/tHRuTkQh/Oaifr8qDmZ8iEHb771Ea6G8CdwkrgvYA==}
hasBin: true
fastq@1.20.1:
resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==}
@@ -2112,6 +2132,9 @@ packages:
string_decoder@1.3.0:
resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
strnum@2.1.2:
resolution: {integrity: sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==}
styled-jsx@5.1.1:
resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==}
engines: {node: '>= 12.0.0'}
@@ -2977,6 +3000,10 @@ snapshots:
'@tanstack/table-core@8.21.3': {}
'@types/adm-zip@0.5.7':
dependencies:
'@types/node': 22.19.7
'@types/bcryptjs@2.4.6': {}
'@types/body-parser@1.19.6':
@@ -3079,6 +3106,8 @@ snapshots:
mime-types: 2.1.35
negotiator: 0.6.3
adm-zip@0.5.16: {}
any-promise@1.3.0: {}
anymatch@3.1.3:
@@ -3520,6 +3549,10 @@ snapshots:
merge2: 1.4.1
micromatch: 4.0.8
fast-xml-parser@5.3.3:
dependencies:
strnum: 2.1.2
fastq@1.20.1:
dependencies:
reusify: 1.1.0
@@ -4185,6 +4218,8 @@ snapshots:
dependencies:
safe-buffer: 5.2.1
strnum@2.1.2: {}
styled-jsx@5.1.1(react@18.3.1):
dependencies:
client-only: 0.0.1