#!/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