From a8133a15e43f996749d2d0c2c3bfa18885b4b93c Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Sat, 30 Sep 2017 00:22:55 -0500 Subject: [PATCH] Soporte para diferentes emisores --- source/app/controllers/util.py | 17 +++++++ source/app/models/main.py | 86 +++++++++++++++++++++++++++------ source/app/settings.py | 11 ++--- source/db/rfc.db | Bin 0 -> 12288 bytes 4 files changed, 94 insertions(+), 20 deletions(-) create mode 100644 source/db/rfc.db diff --git a/source/app/controllers/util.py b/source/app/controllers/util.py index 69bd10d..f6b7857 100644 --- a/source/app/controllers/util.py +++ b/source/app/controllers/util.py @@ -81,3 +81,20 @@ def clean(values): return values +def parse_con(values): + data = values.split('|') + try: + con = {'type': data[0]} + if con['type'] == 'sqlite': + con['name'] = data[1] + else: + if data[1]: + con['host'] = data[1] + if data[2]: + con['port'] = data[2] + con['name'] = data[3] + con['user'] = data[4] + con['password'] = data[5] + return con + except IndexError: + return {} diff --git a/source/app/models/main.py b/source/app/models/main.py index 3df5117..243aa39 100644 --- a/source/app/models/main.py +++ b/source/app/models/main.py @@ -13,21 +13,37 @@ if __name__ == '__main__': from controllers import util -from conf import DATABASE, __version__ -from settings import log, PATH_CP +from settings import log, VERSION, PATH_CP, COMPANIES -database = DATABASE +database_proxy = Proxy() class BaseModel(Model): class Meta: - database = database + database = database_proxy -def conectar(): - global database - database.connect() - log.info('Conectado a la BD...') - return +def conectar(opt): + db = { + 'sqlite': SqliteDatabase, + 'postgres': PostgresqlDatabase, + 'mysql': MySQLDatabase, + } + db_type = opt.pop('type') + db_name = opt.pop('name') + if not db_type in db: + log.error('Tipo de base de datos no soportado') + return False + + database = db[db_type](db_name, **opt) + try: + database_proxy.initialize(database) + database_proxy.connect() + log.info('Conectado a la BD...') + return True + except OperationalError as e: + log.error('Error al intentar conectar a la base de datos') + log.error(e) + return False class Configuracion(BaseModel): @@ -464,7 +480,7 @@ def get_cp(cp): def _init_values(): data = ( - {'key': 'version', 'value': __version__}, + {'key': 'version', 'value': VERSION}, {'key': 'rfc_publico', 'value': 'XAXX010101000'}, {'key': 'rfc_extranjero', 'value': 'XEXX010101000'}, ) @@ -478,7 +494,16 @@ def _init_values(): def _crear_tablas(): - conectar() + rfc = input('Introduce el RFC: ').strip().upper() + if not rfc: + msg = 'El RFC es requerido' + log.error(msg) + return + + opt = _get_con(rfc) + if not conectar(opt): + return + tablas = [Addendas, Categorias, Certificado, CondicionesPago, Configuracion, Emisor, Facturas, FacturasDetalle, FacturasImpuestos, Folios, Productos, SATAduanas, SATFormaPago, SATImpuestos, SATMonedas, SATRegimenes, @@ -488,7 +513,7 @@ def _crear_tablas(): Productos.impuestos.get_through_model(), Productos.tags.get_through_model(), ] - database.create_tables(tablas, True) + database_proxy.create_tables(tablas, True) log.info('Tablas creadas correctamente...') return @@ -549,11 +574,37 @@ def _cambiar_contraseña(): return +def _agregar_rfc(): + rfc = input('Introduce el nuevo RFC: ').strip().upper() + if not rfc: + msg = 'El RFC es requerido' + log.error(msg) + return + + datos = input('Introduce los datos de conexión: ').strip() + if not datos: + msg = 'Los datos de conexión son requeridos' + log.error(msg) + return + + opt = util.parse_con(datos) + if not opt: + log.error('Datos de conexión incompletos') + return + + if conectar(opt): + log.info('RFC agregado correctamente...') + else: + log.error('No se pudo agregar el RFC') + return + + CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) help_create_tables = 'Crea las tablas en la base de datos' -help_migrate_db = 'Migra las tables en la base de datos' +help_migrate_db = 'Migra las tablas en la base de datos' help_superuser = 'Crea un nuevo super usuario' help_change_pass = 'Cambia la contraseña a un usuario' +help_rfc = 'Agrega un nuevo RFC' @click.command(context_settings=CONTEXT_SETTINGS) @click.option('-bd', '--iniciar-bd',help=help_create_tables, @@ -564,7 +615,8 @@ help_change_pass = 'Cambia la contraseña a un usuario' is_flag=True, default=False) @click.option('-cc', '--cambiar-contraseña', help=help_change_pass, is_flag=True, default=False) -def main(iniciar_bd, migrar_bd, nuevo_superusuario, cambiar_contraseña): +@click.option('-rfc', '--rfc', help=help_rfc, is_flag=True, default=False) +def main(iniciar_bd, migrar_bd, nuevo_superusuario, cambiar_contraseña, rfc): opt = locals() if opt['iniciar_bd']: @@ -581,6 +633,12 @@ def main(iniciar_bd, migrar_bd, nuevo_superusuario, cambiar_contraseña): if opt['cambiar_contraseña']: _cambiar_contraseña() + sys.exit(0) + + if opt['rfc']: + _agregar_rfc() + sys.exit(0) + return diff --git a/source/app/settings.py b/source/app/settings.py index 7d06624..733cd7b 100644 --- a/source/app/settings.py +++ b/source/app/settings.py @@ -7,18 +7,17 @@ from mako.lookup import TemplateLookup from logbook import Logger, StreamHandler, RotatingFileHandler logbook.set_datetime_format('local') -from conf import DEBUG +DEBUG = True +VERSION = '0.1.0' +EMAIL_SUPPORT = ('soporte@empresalibre.net',) BASE_DIR = os.path.abspath(os.path.dirname(__file__)) PATH_STATIC = os.path.abspath(os.path.join(BASE_DIR, '..')) PATH_TEMPLATES = os.path.abspath(os.path.join(BASE_DIR, '..', 'templates')) -EMAIL_SUPPORT = ('soporte@empresalibre.net',) -#~ WITH_LOGIN = True - -DB_CP = 'cp.db' -PATH_CP = os.path.abspath(os.path.join(BASE_DIR, '..', 'db', DB_CP)) +PATH_CP = os.path.abspath(os.path.join(BASE_DIR, '..', 'db', 'cp.db')) +COMPANIES = os.path.abspath(os.path.join(BASE_DIR, '..', 'db', 'rfc.db')) template_lookup = TemplateLookup(directories=[PATH_TEMPLATES], input_encoding='utf-8', diff --git a/source/db/rfc.db b/source/db/rfc.db new file mode 100644 index 0000000000000000000000000000000000000000..fcca9d5a68448096d9cb48952e74042a297641fa GIT binary patch literal 12288 zcmeI#K}*9h6u|MM6Lp2r9fV$UTtNi!ELbInu{vFC!JXPVI~Z&&ZdJVc0sRnu3y(Ho z2NCuG9REPxOI}(^em%X1NwjE6HLusJqEQ#3FQgP#N(mu4+u0^N%>H1zHc9?k?^<@m z*~wSW`xcIu3NQ6OcRffQ0R#|0009ILKmY**5I_Kde<$!Jk9^;kAETytT9#F@DmOMb zH?a;At&;FM(ki#LTn*fAzMjwWZlWI(HNI