cfdi-descarga/source/sat/util.py

158 lines
3.5 KiB
Python

#!/usr/bin/env python3
import getpass
import uuid
from datetime import datetime
from pathlib import Path
from .cfdi_cert import SATCertificate
from .sat_web import SATWebService
from settings import log
def today():
return datetime.today()
def validate_date(year, month, day):
try:
datetime(year, month, day, 0, 0, 0)
result = True
except ValueError:
result = False
return result
def is_dir(path):
return Path(path).is_dir()
def join(*paths):
return Path(paths[0]).joinpath(*paths[1:])
def _validate_fiel_args(args):
fiel_path = args.fiel_dir
fiel_name = args.fiel_nombre
if not fiel_path:
msg = 'El directorio con la FIEL es requerido'
log.error(msg)
return False, {}
if not is_dir(fiel_path):
msg = f'La ruta no existe o no es un directorio. \nRuta: {fiel_path}'
log.error(msg)
return False, {}
path_cer = join(fiel_path, f'{fiel_name}.cer')
path_key = join(fiel_path, f'{fiel_name}.key')
path_enc = join(fiel_path, f'{fiel_name}.enc')
if not path_cer.is_file():
msg = f'No se encontró el archivo CER. \nRuta: {path_cer}'
log.error(msg)
return False, {}
if not path_key.is_file():
msg = f'No se encontró el archivo KEY. \nRuta: {path_cer}'
log.error(msg)
return False, {}
data = {
'path_cer': path_cer,
'path_key': path_key,
'path_enc': path_enc,
}
return True, data
def fiel_validar(args):
result, data = _validate_fiel_args(args)
if not result:
return
password = getpass.getpass('Introduce la contraseña del archivo KEY: ')
if not password:
msg = 'La contraseña es requerida para validar la FIEL'
log.error(msg)
return
cer = data['path_cer'].read_bytes()
key = data['path_key'].read_bytes()
cert = SATCertificate(cer, key, password)
if cert.error:
msg = f'{cert.error}\n\nNo podrás conectarte el SAT.'
log.error(msg)
return
if not cert.is_fiel:
msg = 'El certificado no es FIEL'
log.error(msg)
return
data['path_enc'].write_bytes(cert.key_enc)
msg = 'Los datos del certificado son:'
log.info(msg)
log.info(f'\n{cert}')
msg = 'Ya puedes descargar del SAT'
log.info(msg)
return
def base_datos():
db.create_tables()
return
def _validate_download_args(args):
result, data = _validate_fiel_args(args)
if not result:
return False, {}
if not data['path_enc'].is_file():
msg = f"No se encontró la FIEL encriptada. \nRuta: {data['path_enc']}"
log.error(msg)
return False, {}
cer = data['path_cer'].read_bytes()
key = data['path_enc'].read_bytes()
cert = SATCertificate(cer, key)
if not cert.is_valid_time:
msg = 'La FIEL no es vigente'
log.error(msg)
return False, {}
data['cert'] = cert
data['type'] = args.type
data['year'] = args.year
data['month'] = args.month
data['day'] = args.day
if data['day']:
if not validate_date(data['year'], data['month'], data['day']):
msg = 'Fecha inválida'
log.error(msg)
return False, {}
return True, data
def sat_download(args):
result, data = _validate_download_args(args)
if not result:
return
sat = SATWebService(data['cert'])
if sat.is_authenticate:
sat.download(data)
else:
log.error(sat.error)
return