diff --git a/cambiare_gtq/api_cambiare.py b/cambiare_gtq/api_cambiare.py index 8d36dfe..db19675 100755 --- a/cambiare_gtq/api_cambiare.py +++ b/cambiare_gtq/api_cambiare.py @@ -12,8 +12,7 @@ import datetime import re - -def crear_tipo_cambio_gtq(cambio, fecha, moneda_cod_letras='USD'): +def crear_tipo_cambio_gtq(cambio, fecha, factor_1usd_xgtq, moneda_cod_letras='USD'): '''Funcion para crear registros en custom doctype (Currency Exchange GTQ) Args: @@ -26,33 +25,61 @@ def crear_tipo_cambio_gtq(cambio, fecha, moneda_cod_letras='USD'): ''' try: - usd_to_gtq = frappe.new_doc("Currency Exchange GTQ") # Crea un nuevo registro para el doctype - usd_to_gtq.date = datetime.datetime.strptime(fecha, '%d/%m/%Y').date() # frappe.utils.nowdate() - usd_to_gtq.from_currency = moneda_cod_letras - usd_to_gtq.to_currency = 'GTQ' - usd_to_gtq.exchange_rate = float(cambio) - usd_to_gtq.for_buying = True - usd_to_gtq.for_selling = True - usd_to_gtq.save() + + if moneda_cod_letras != 'USD': + result = float(factor_1usd_xgtq) / float(cambio) + any_to_gtq = frappe.new_doc("Currency Exchange GTQ") # Crea un nuevo registro para el doctype + any_to_gtq.date = datetime.datetime.strptime(fecha, '%d/%m/%Y').date() # frappe.utils.nowdate() + any_to_gtq.from_currency = moneda_cod_letras + any_to_gtq.to_currency = 'GTQ' + any_to_gtq.exchange_rate = float(result) + any_to_gtq.for_buying = True + any_to_gtq.for_selling = True + any_to_gtq.save() + + else: + usd_to_gtq = frappe.new_doc("Currency Exchange GTQ") # Crea un nuevo registro para el doctype + usd_to_gtq.date = datetime.datetime.strptime(fecha, '%d/%m/%Y').date() # frappe.utils.nowdate() + usd_to_gtq.from_currency = moneda_cod_letras + usd_to_gtq.to_currency = 'GTQ' + usd_to_gtq.exchange_rate = float(cambio) + usd_to_gtq.for_buying = True + usd_to_gtq.for_selling = True + usd_to_gtq.save() + except: - return 'No se pudo crear tipo cambio USD to GTQ, intentar manualmente GTQ' + return _('Could not create USD to GTQ exchange rate, please try generating GTQ manually') + else: try: - gtq_to_usd = frappe.new_doc("Currency Exchange GTQ") - gtq_to_usd.date = datetime.datetime.strptime(fecha, '%d/%m/%Y').date() # frappe.utils.nowdate() - gtq_to_usd.from_currency = 'GTQ' - gtq_to_usd.to_currency = moneda_cod_letras - gtq_to_usd.exchange_rate = 1/float(cambio) - gtq_to_usd.for_buying = True - gtq_to_usd.for_selling = True - gtq_to_usd.save() + + if moneda_cod_letras != 'USD': + result = float(factor_1usd_xgtq) / float(cambio) + any_to_usd = frappe.new_doc("Currency Exchange GTQ") + any_to_usd.date = datetime.datetime.strptime(fecha, '%d/%m/%Y').date() # frappe.utils.nowdate() + any_to_usd.from_currency = 'GTQ' + any_to_usd.to_currency = moneda_cod_letras + any_to_usd.exchange_rate = 1/float(result) + any_to_usd.for_buying = True + any_to_usd.for_selling = True + any_to_usd.save() + + else: + gtq_to_usd = frappe.new_doc("Currency Exchange GTQ") + gtq_to_usd.date = datetime.datetime.strptime(fecha, '%d/%m/%Y').date() # frappe.utils.nowdate() + gtq_to_usd.from_currency = 'GTQ' + gtq_to_usd.to_currency = moneda_cod_letras + gtq_to_usd.exchange_rate = 1/float(cambio) + gtq_to_usd.for_buying = True + gtq_to_usd.for_selling = True + gtq_to_usd.save() + except: return 'No se pudo crear tipo cambio GTQ to USD, intentar manualmente GTQ' else: return 'Currency Exchange GTQ OK' - -def crear_cambio_moneda(cambio, fecha, moneda_cod_letras='USD'): +def crear_cambio_moneda(cambio, fecha, factor_1usd_xgtq, moneda_cod_letras='USD'): '''Funcion para crear registros en doctype (Currency Exchange) Args: @@ -124,8 +151,8 @@ def preparar_peticion_banguat(opt, fecha_ini=0, fecha_fin=0, moneda=2): ['VarDolar'] # Funciones para registrar el tipo de cambio consumido del webservice en el ERPNEXT - status = crear_cambio_moneda(cambio['referencia'], cambio['fecha']) - status_custom = crear_tipo_cambio_gtq(cambio['referencia'], cambio['fecha']) + status = crear_cambio_moneda(cambio['referencia'], cambio['fecha'], '7.80') + status_custom = crear_tipo_cambio_gtq(cambio['referencia'], cambio['fecha'], '7.80') return status @@ -198,8 +225,20 @@ def preparar_peticion_banguat(opt, fecha_ini=0, fecha_fin=0, moneda=2): # {'cod': 'EUR', 'mon': 24} # ] + # en_US: We prepare a default USD to GTQ query because we need it to convert other currencies to GTQ. Banguat webservice has USD as currency reference + cambio_usd = ''' + + + + + ''' + # en_US: We consult the webservice to generate a response + exchange = xmltodict.parse(consultar_a_banguat(cambio_usd)) + # en_US: We access the var value (X) from the response, this is 1 USD to X GTQ + factor_1usd_xgtq = exchange['soap:Envelope']['soap:Body']['TipoCambioDiaResponse']['TipoCambioDiaResult']['CambioDolar']['VarDolar'] + monedas = obtener_listado_monedas() - if monedas != False: # Si existen monedas + if monedas != False: # en_US: We find out if currencies exist to generate exchange records es: Averiguamos si existen monedas para generar registros de cambio. for moneda in monedas: variables = ''' @@ -210,16 +249,16 @@ def preparar_peticion_banguat(opt, fecha_ini=0, fecha_fin=0, moneda=2): '''.format(moneda['mon']) - # Convierte de la respuesta XML a diccionario + # Obtiene el cambio del dia y Convierte de la respuesta XML a diccionario cambio_dia = xmltodict.parse(consultar_a_banguat(variables)) # Accedemos al valor Var cambio = cambio_dia['soap:Envelope']['soap:Body']['VariablesResponse'] \ ['VariablesResult']['CambioDia']['Var'] # Crea registro en Currency Exchange - status = crear_cambio_moneda(cambio['venta'], cambio['fecha'], moneda_cod_letras=moneda['cod']) + status = crear_cambio_moneda(cambio['venta'], cambio['fecha'], factor_1usd_xgtq['referencia'], moneda_cod_letras=moneda['cod']) # Crea registro en Currency Exchange GTQ - status_custom_dt = crear_tipo_cambio_gtq(cambio['venta'], cambio['fecha'], moneda_cod_letras=moneda['cod']) + status_custom_dt = crear_tipo_cambio_gtq(cambio['venta'], cambio['fecha'], factor_1usd_xgtq['referencia'], moneda_cod_letras=moneda['cod']) return status else: @@ -278,7 +317,8 @@ def consultar_a_banguat(peticion): def obtener_listado_monedas(): '''Funcion encargada de obtener las monedas configuradas de la tabla hija Currency Available del doctype padre Configuracion Cambiare GTQ y las retorna - en un formato especial para ser procesadas. + en un formato especial para ser procesadas. Averigua cuales monedas desea el usuario + para generar conversiones. Args: Ninguno @@ -286,6 +326,7 @@ def obtener_listado_monedas(): Returns: Retorna un listado de monedas con el siguiente formato: monedas = [ + {'cod': 'USD', 'mon': 2} {'cod': 'MXN', 'mon': 18}, {'cod': 'HNL', 'mon': 19}, {'cod': 'SVC', 'mon': 17}, @@ -295,7 +336,8 @@ def obtener_listado_monedas(): {'cod': 'EUR', 'mon': 24} ] ''' - # Selecciona las monedas omitiendo los duplicados, como lista de diccionarios + # Selecciona las monedas disponibles que han sido seleccionadas en configuracion cambiare + # omitiendo los duplicados, como lista de diccionarios. monedas_db = frappe.db.sql('''SELECT DISTINCT moneda FROM `tabAvailable Currencies`''', as_dict=True) # Contendra las monedas @@ -303,7 +345,7 @@ def obtener_listado_monedas(): if len(monedas_db) > 0: # Si existe por lo menos un elemento for mone in monedas_db: - # Con expresion regular, separamos el string donde se encuentre un guion + # Con expresion regular, separamos el string donde se encuentre un guión x = re.split('-', mone['moneda']) # -> ['1 ', ' Quetzales ', ' GTQ'] mone_ok.append({ @@ -313,4 +355,4 @@ def obtener_listado_monedas(): return mone_ok else: - return False # Si no hay data return False + return False # Si no hay data return False \ No newline at end of file diff --git a/cambiare_gtq/cambiare_gtq/doctype/configuration_cambiare/configuration_cambiare.js b/cambiare_gtq/cambiare_gtq/doctype/configuration_cambiare/configuration_cambiare.js index d386828..420db27 100755 --- a/cambiare_gtq/cambiare_gtq/doctype/configuration_cambiare/configuration_cambiare.js +++ b/cambiare_gtq/cambiare_gtq/doctype/configuration_cambiare/configuration_cambiare.js @@ -2,68 +2,65 @@ // For license information, please see license.txt frappe.ui.form.on('Configuration Cambiare', { - refresh: function (frm) { - // console.log('Se refreso form'); - consulta_tipo_cambio_dia(frm) - - // Obtiene las monedas disponibles de la API banguat - // frappe.call({ - // method: "cambiare_gtq.api_cambiare.preparar_peticion_banguat", - // args: { - // opt: '6' - // }, - // freeze: true, - // freeze_message: __("Obteniendo y guardando monedas disponibles del Banco de Guatemala..."), - // callback: function (r) { - // if (!r.exc) { - // clearInterval(frm.page["interval"]); - // // console.log(r.message) - - // frappe.meta.get_docfield('Available Currencies', 'moneda', cur_frm.doc.name).options = r.message - // cur_frm.refresh_field('moneda'); - // } - // } - // }); - - } + refresh: function (frm) { + // console.log('Se refresco form'); + consulta_tipo_cambio_dia(frm) + // Obtiene las monedas disponibles de la API banguat + // frappe.call({ + // method: "cambiare_gtq.api_cambiare.preparar_peticion_banguat", + // args: { + // opt: '6' + // }, + // freeze: true, + // freeze_message: __("Obteniendo y guardando monedas disponibles del Banco de Guatemala..."), + // callback: function (r) { + // if (!r.exc) { + // clearInterval(frm.page["interval"]); + // // console.log(r.message) + // frappe.meta.get_docfield('Available Currencies', 'moneda', cur_frm.doc.name).options = r.message + // cur_frm.refresh_field('moneda'); + // } + // } + // }); + } }); let consulta_tipo_cambio_dia = function (frm) { - // Agrega un boton para consumir el webservice manualmente - frm.page.set_secondary_action(__("Tipo Cambio Manual"), function () { - frappe.call({ - method: "cambiare_gtq.api_cambiare.preparar_peticion_banguat", - args: { - opt: '6' - }, - freeze: true, - freeze_message: __("Consultado tipo cambio del dia de las monedas seleccionadas..."), - callback: function (r) { - if (!r.exc) { - clearInterval(frm.page["interval"]); - // frm.page.set_indicator(__('Importacion Exitosa!!'), 'blue'); - // create_reset_button(frm); - console.log(r.message) - } - } - }); - frappe.call({ - method: "cambiare_gtq.api_cambiare.preparar_peticion_banguat", - args: { - opt: '1' - }, - freeze: true, - freeze_message: __("Consultado tipo cambio del dia Dolares..."), - callback: function (r) { - if (!r.exc) { - clearInterval(frm.page["interval"]); - // frm.page.set_indicator(__('Importacion Exitosa!!'), 'blue'); - // create_reset_button(frm); - console.log(r.message) - } - } - }); - }).addClass('btn btn-primary'); + // Agrega un boton para consumir el webservice manualmente + frm.page.set_secondary_action(__("Tipo Cambio Manual"), function () { + frappe.call({ + method: "cambiare_gtq.api_cambiare.preparar_peticion_banguat", + args: { + opt: '6' + }, + freeze: true, + freeze_message: __("Consultado tipo cambio del dia de las monedas seleccionadas..."), + callback: function (r) { + if (!r.exc) { + clearInterval(frm.page["interval"]); + // frm.page.set_indicator(__('Importacion Exitosa!!'), 'blue'); + // create_reset_button(frm); + console.log(r.message) + } + } + }); + frappe.call({ + method: "cambiare_gtq.api_cambiare.preparar_peticion_banguat", + args: { + opt: '1' + }, + freeze: true, + freeze_message: __("Consultado tipo cambio del dia Dolares..."), + callback: function (r) { + if (!r.exc) { + clearInterval(frm.page["interval"]); + // frm.page.set_indicator(__('Importacion Exitosa!!'), 'blue'); + // create_reset_button(frm); + console.log(r.message) + } + } + }); + }).addClass('btn btn-primary'); } diff --git a/cambiare_gtq/fixtures/translation.json b/cambiare_gtq/fixtures/translation.json new file mode 100644 index 0000000..f3d9a3f --- /dev/null +++ b/cambiare_gtq/fixtures/translation.json @@ -0,0 +1,16 @@ +[ + { + "contributed_translation_doctype_name": null, + "docstatus": 0, + "doctype": "Translation", + "language": "es", + "modified": "2020-07-09 18:51:01.197621", + "name": "f6e51ae49e", + "parent": null, + "parentfield": null, + "parenttype": null, + "source_name": "Could not create USD to GTQ exchange rate, please try generating GTQ manually", + "status": "Saved", + "target_name": "No se pudo crear tipo cambio USD to GTQ, intentar manualmente GTQ" + } +] \ No newline at end of file diff --git a/cambiare_gtq/hooks.py b/cambiare_gtq/hooks.py index 8f8c48e..e3ff245 100755 --- a/cambiare_gtq/hooks.py +++ b/cambiare_gtq/hooks.py @@ -5,27 +5,36 @@ app_name = "cambiare_gtq" app_title = "Cambiare GTQ" app_publisher = "Si Hay Sistema" -app_description = "Cambio de moneda" +app_description = "Currency exchange API sourcing data from Guatemala's Central Bank webservice" app_icon = "octicon octicon-graph" app_color = "#27AE60" app_email = "m.monroyc22@gmail.com" app_license = "GNU General Public License v3.0" +# This needs to be enabled and bench restarted before running bench export-fixtures such that the Custom Fields listed below can be exported. +fixtures = [ + {"dt": "Translation", "filters": [ + [ + "source_name", "in", [ + "Could not create USD to GTQ exchange rate, please try generating GTQ manually", + ] + ] + ] + } +] ''' -# This needs to be enabled and bench restarted before running bench export-fixtures -such that the Custom Fields listed below can be exported. fixtures = [ - {"dt": "Custom Field", "filters": [ + {"dt": "Custom Field", "filters": [ [ "name", "in", [ "Currency Exchange-validity_date_ranges", - "Currency Exchange-valid_to", - "Currency Exchange-col_break", - "Currency Exchange-valid_from" + "Currency Exchange-valid_to", + "Currency Exchange-col_break", + "Currency Exchange-valid_from" ] ] ] - } + } ] ''' # Includes in @@ -108,33 +117,33 @@ # --------------- scheduler_events = { - # Se ejecuta cada 4 minuts - # "all": [ - # "cambiare_gtq.tasks.all" - # ], - # Se ejecuta cada dia 00:00 - "daily": [ - "cambiare_gtq.task.daily" - ], - # Se ejecuta a cada hora - "hourly": [ - "cambiare_gtq.task.hourly" - ], - # Cron linux especificacion freq - # "cron": { - # # Cada minuto - # "0/01 * * * *": [ - # "cambiare_gtq.task.test" - # ] - # }, - # Se ejecuta acada semana - "weekly": [ - "cambiare_gtq.task.weekly" - ], - # # Se ejecuta cada mes - "monthly": [ - "cambiare_gtq.task.monthly" - ] + # Se ejecuta cada 4 minuts + # "all": [ + # "cambiare_gtq.tasks.all" + # ], + # Se ejecuta cada dia 00:00 + "daily": [ + "cambiare_gtq.task.daily" + ], + # Se ejecuta a cada hora + "hourly": [ + "cambiare_gtq.task.hourly" + ], + # Cron linux especificacion freq + # "cron": { + # # Cada minuto + # "0/01 * * * *": [ + # "cambiare_gtq.task.test" + # ] + # }, + # Se ejecuta acada semana + "weekly": [ + "cambiare_gtq.task.weekly" + ], + # # Se ejecuta cada mes + "monthly": [ + "cambiare_gtq.task.monthly" + ] } # Testing