From 914dda5f10d1869b04523a428c3a8cd593f40555 Mon Sep 17 00:00:00 2001 From: RominaCastro Date: Mon, 7 Nov 2022 22:49:05 -0300 Subject: [PATCH 1/9] WSFEv1: Agrego metodo Consultar Actividades --- wsfev1.py | 93 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 53 insertions(+), 40 deletions(-) diff --git a/wsfev1.py b/wsfev1.py index e2adb3fcf..e5cc12a69 100644 --- a/wsfev1.py +++ b/wsfev1.py @@ -10,16 +10,16 @@ # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. -"""Módulo para obtener CAE/CAEA, código de autorización electrónico webservice -WSFEv1 de AFIP (Factura Electrónica Nacional - Proyecto Version 1 - 2.13) -Según RG 2485/08, RG 2757/2010, RG 2904/2010 y RG2926/10 (CAE anticipado), +"""M�dulo para obtener CAE/CAEA, c�digo de autorizaci�n electr�nico webservice +WSFEv1 de AFIP (Factura Electr�nica Nacional - Proyecto Version 1 - 2.13) +Seg�n RG 2485/08, RG 2757/2010, RG 2904/2010 y RG2926/10 (CAE anticipado), RG 3067/2011 (RS - Monotributo), RG 3571/2013 (Responsables inscriptos IVA), RG 3668/2014 (Factura A IVA F.8001), RG 3749/2015 (R.I. y exentos) -RG 4004-E Alquiler de inmuebles con destino casa habitación). +RG 4004-E Alquiler de inmuebles con destino casa habitaci�n). RG 4109-E Venta de bienes muebles registrables. -RG 4291/2018 Régimen especial de emisión y almacenamiento electrónico -RG 4367/2018 Régimen de Facturas de Crédito Electrónicas MiPyMEs Ley 27.440 -Más info: http://www.sistemasagiles.com.ar/trac/wiki/ProyectoWSFEv1 +RG 4291/2018 R�gimen especial de emisi�n y almacenamiento electr�nico +RG 4367/2018 R�gimen de Facturas de Cr�dito Electr�nicas MiPyMEs Ley 27.440 +M�s info: http://www.sistemasagiles.com.ar/trac/wiki/ProyectoWSFEv1 """ __author__ = "Mariano Reingart " @@ -33,8 +33,8 @@ import sys from utils import verifica, inicializar_y_capturar_excepciones, BaseWS, get_install_dir -HOMO = False # solo homologación -TYPELIB = False # usar librería de tipos (TLB) +HOMO = False # solo homologaci�n +TYPELIB = False # usar librer�a de tipos (TLB) LANZAR_EXCEPCIONES = False # valor por defecto: True #WSDL = "https://www.sistemasagiles.com.ar/simulador/wsfev1/call/soap?WSDL=None" @@ -43,7 +43,7 @@ class WSFEv1(BaseWS): - "Interfaz para el WebService de Factura Electrónica Version 1 - 2.13" + "Interfaz para el WebService de Factura Electr�nica Version 1 - 2.13" _public_methods_ = ['CrearFactura', 'AgregarIva', 'CAESolicitar', 'AgregarTributo', 'AgregarCmpAsoc', 'AgregarOpcional', 'AgregarComprador', 'AgregarPeriodoComprobantesAsociados', @@ -62,6 +62,7 @@ class WSFEv1(BaseWS): 'ParamGetTiposPaises', 'ParamGetCotizacion', 'ParamGetPtosVenta', + 'ParamGetActividades', 'AnalizarXml', 'ObtenerTagXml', 'LoadTestXML', 'SetParametros', 'SetTicketAcceso', 'GetParametro', 'EstablecerCampoFactura', 'ObtenerCampoFactura', @@ -88,7 +89,7 @@ class WSFEv1(BaseWS): # Variables globales para BaseWS: HOMO = HOMO WSDL = WSDL - Version = "%s %s" % (__version__, HOMO and 'Homologación' or '') + Version = "%s %s" % (__version__, HOMO and 'Homologaci�n' or '') Reprocesar = True # recuperar automaticamente CAE emitidos LanzarExcepciones = LANZAR_EXCEPCIONES factura = None @@ -128,7 +129,7 @@ def Dummy(self): self.AuthServerStatus = result.get('AuthServer') return True - # los siguientes métodos no están decorados para no limpiar propiedades + # los siguientes m�todos no est�n decorados para no limpiar propiedades def CrearFactura(self, concepto=1, tipo_doc=80, nro_doc="", tipo_cbte=1, punto_vta=0, cbt_desde=0, cbt_hasta=0, imp_total=0.00, imp_tot_conc=0.00, imp_neto=0.00, @@ -137,7 +138,7 @@ def CrearFactura(self, concepto=1, tipo_doc=80, nro_doc="", tipo_cbte=1, punto_v moneda_id="PES", moneda_ctz="1.0000", caea=None, fecha_hs_gen=None, **kwargs ): "Creo un objeto factura (interna)" - # Creo una factura electronica de exportación + # Creo una factura electronica de exportaci�n fact = {'tipo_doc': tipo_doc, 'nro_doc': nro_doc, 'tipo_cbte': tipo_cbte, 'punto_vta': punto_vta, 'cbt_desde': cbt_desde, 'cbt_hasta': cbt_hasta, @@ -179,7 +180,7 @@ def AgregarCmpAsoc(self, tipo=1, pto_vta=0, nro=0, cuit=None, fecha=None, **kwar return True def AgregarPeriodoComprobantesAsociados(self, fecha_desde=None, fecha_hasta=None, **kwargs): - "Agrego el perído de comprobante asociado a una factura (interna)" + "Agrego el per�do de comprobante asociado a una factura (interna)" p_cmp_asoc = { 'fecha_desde': fecha_desde, 'fecha_hasta': fecha_hasta, @@ -215,7 +216,7 @@ def AgregarComprador(self, doc_tipo=80, doc_nro=0, porcentaje=100.00, **kwarg): def ObtenerCampoFactura(self, *campos): "Obtener el valor devuelto de AFIP para un campo de factura" - # cada campo puede ser una clave string (dict) o una posición (list) + # cada campo puede ser una clave string (dict) o una posici�n (list) ret = self.factura for campo in campos: if isinstance(ret, dict) and isinstance(campo, basestring): @@ -551,7 +552,7 @@ def CompConsultar(self, tipo_cbte, punto_vta, cbte_nro, reproceso=False): @inicializar_y_capturar_excepciones def CAESolicitarX(self): - "Autorizar múltiples facturas (CAE) en una única solicitud" + "Autorizar m�ltiples facturas (CAE) en una �nica solicitud" # Ver CompTotXRequest -> cantidad maxima comprobantes (250) # verificar que hay multiples facturas: if not self.facturas: @@ -731,7 +732,7 @@ def CAEASolicitar(self, periodo, orden): @inicializar_y_capturar_excepciones def CAEAConsultar(self, periodo, orden): - "Método de consulta de CAEA" + "M�todo de consulta de CAEA" ret = self.client.FECAEAConsultar( Auth={'Token': self.Token, 'Sign': self.Sign, 'Cuit': self.Cuit}, Periodo=periodo, @@ -756,7 +757,7 @@ def CAEAConsultar(self, periodo, orden): @inicializar_y_capturar_excepciones def CAEARegInformativo(self): - "Método para informar comprobantes emitidos con CAEA" + "M�todo para informar comprobantes emitidos con CAEA" f = self.factura ret = self.client.FECAEARegInformativo( Auth={'Token': self.Token, 'Sign': self.Sign, 'Cuit': self.Cuit}, @@ -859,7 +860,7 @@ def CAEARegInformativo(self): @inicializar_y_capturar_excepciones def CAEASinMovimientoInformar(self, punto_vta, caea): - "Método para informar CAEA sin movimiento" + "M�todo para informar CAEA sin movimiento" ret = self.client.FECAEASinMovimientoInformar( Auth={'Token': self.Token, 'Sign': self.Sign, 'Cuit': self.Cuit}, PtoVta=punto_vta, @@ -881,7 +882,7 @@ def CAEASinMovimientoInformar(self, punto_vta, caea): @inicializar_y_capturar_excepciones def ParamGetTiposCbte(self, sep="|"): - "Recuperador de valores referenciales de códigos de Tipos de Comprobantes" + "Recuperador de valores referenciales de c�digos de Tipos de Comprobantes" ret = self.client.FEParamGetTiposCbte( Auth={'Token': self.Token, 'Sign': self.Sign, 'Cuit': self.Cuit}, ) @@ -891,7 +892,7 @@ def ParamGetTiposCbte(self, sep="|"): @inicializar_y_capturar_excepciones def ParamGetTiposConcepto(self, sep="|"): - "Recuperador de valores referenciales de códigos de Tipos de Conceptos" + "Recuperador de valores referenciales de c�digos de Tipos de Conceptos" ret = self.client.FEParamGetTiposConcepto( Auth={'Token': self.Token, 'Sign': self.Sign, 'Cuit': self.Cuit}, ) @@ -902,7 +903,7 @@ def ParamGetTiposConcepto(self, sep="|"): @inicializar_y_capturar_excepciones def ParamGetTiposDoc(self, sep="|"): - "Recuperador de valores referenciales de códigos de Tipos de Documentos" + "Recuperador de valores referenciales de c�digos de Tipos de Documentos" ret = self.client.FEParamGetTiposDoc( Auth={'Token': self.Token, 'Sign': self.Sign, 'Cuit': self.Cuit}, ) @@ -912,7 +913,7 @@ def ParamGetTiposDoc(self, sep="|"): @inicializar_y_capturar_excepciones def ParamGetTiposIva(self, sep="|"): - "Recuperador de valores referenciales de códigos de Tipos de Alícuotas" + "Recuperador de valores referenciales de c�digos de Tipos de Al�cuotas" ret = self.client.FEParamGetTiposIva( Auth={'Token': self.Token, 'Sign': self.Sign, 'Cuit': self.Cuit}, ) @@ -922,7 +923,7 @@ def ParamGetTiposIva(self, sep="|"): @inicializar_y_capturar_excepciones def ParamGetTiposMonedas(self, sep="|"): - "Recuperador de valores referenciales de códigos de Monedas" + "Recuperador de valores referenciales de c�digos de Monedas" ret = self.client.FEParamGetTiposMonedas( Auth={'Token': self.Token, 'Sign': self.Sign, 'Cuit': self.Cuit}, ) @@ -932,7 +933,7 @@ def ParamGetTiposMonedas(self, sep="|"): @inicializar_y_capturar_excepciones def ParamGetTiposOpcional(self, sep="|"): - "Recuperador de valores referenciales de códigos de Tipos de datos opcionales" + "Recuperador de valores referenciales de c�digos de Tipos de datos opcionales" ret = self.client.FEParamGetTiposOpcional( Auth={'Token': self.Token, 'Sign': self.Sign, 'Cuit': self.Cuit}, ) @@ -942,8 +943,8 @@ def ParamGetTiposOpcional(self, sep="|"): @inicializar_y_capturar_excepciones def ParamGetTiposTributos(self, sep="|"): - "Recuperador de valores referenciales de códigos de Tipos de Tributos" - "Este método permite consultar los tipos de tributos habilitados en este WS" + "Recuperador de valores referenciales de c�digos de Tipos de Tributos" + "Este m�todo permite consultar los tipos de tributos habilitados en este WS" ret = self.client.FEParamGetTiposTributos( Auth={'Token': self.Token, 'Sign': self.Sign, 'Cuit': self.Cuit}, ) @@ -953,8 +954,8 @@ def ParamGetTiposTributos(self, sep="|"): @inicializar_y_capturar_excepciones def ParamGetTiposPaises(self, sep="|"): - "Recuperador de valores referenciales de códigos de Paises" - "Este método permite consultar los tipos de tributos habilitados en este WS" + "Recuperador de valores referenciales de c�digos de Paises" + "Este m�todo permite consultar los tipos de tributos habilitados en este WS" ret = self.client.FEParamGetTiposPaises( Auth={'Token': self.Token, 'Sign': self.Sign, 'Cuit': self.Cuit}, ) @@ -964,7 +965,7 @@ def ParamGetTiposPaises(self, sep="|"): @inicializar_y_capturar_excepciones def ParamGetCotizacion(self, moneda_id): - "Recuperador de cotización de moneda" + "Recuperador de cotizaci�n de moneda" ret = self.client.FEParamGetCotizacion( Auth={'Token': self.Token, 'Sign': self.Sign, 'Cuit': self.Cuit}, MonId=moneda_id, @@ -983,12 +984,22 @@ def ParamGetPtosVenta(self, sep="|"): return [(u"%(Nro)s\tEmisionTipo:%(EmisionTipo)s\tBloqueado:%(Bloqueado)s\tFchBaja:%(FchBaja)s" % p['PtoVenta']).replace("\t", sep) for p in res.get('ResultGet', [])] + @inicializar_y_capturar_excepciones + def ParamGetActividades(self, sep="|"): + "Recuperador de valores referenciales de códigos de Actividades" + ret = self.client.FEParamGetActividades( + Auth={'Token': self.Token, 'Sign': self.Sign, 'Cuit': self.Cuit}, + ) + res = ret['FEParamGetActividades'] + return [(u"%(Id)s\t%(Orden)s\t%(Desc)s" % p['ActividadesTipo']).replace("\t", sep) + for p in res['ResultGet']] + def p_assert_eq(a,b): print a, a==b and '==' or '!=', b def main(): - "Función principal de pruebas (obtener CAE)" + "Funci�n principal de pruebas (obtener CAE)" import os, time DEBUG = '--debug' in sys.argv @@ -1054,12 +1065,12 @@ def main(): imp_iva = "21.00"; imp_trib = "1.00"; imp_op_ex = "0.00" fecha_cbte = fecha fecha_venc_pago = fecha_serv_desde = fecha_serv_hasta = None - # Fechas del período del servicio facturado y vencimiento de pago: + # Fechas del per�odo del servicio facturado y vencimiento de pago: if concepto > 1: fecha_venc_pago = fecha fecha_serv_desde = fecha; fecha_serv_hasta = fecha elif '--fce' in sys.argv: - # obligatorio en Factura de Crédito Electrónica MiPyMEs (FCE): + # obligatorio en Factura de Cr�dito Electr�nica MiPyMEs (FCE): fecha_venc_pago = fecha if tipo_cbte == 201 else None moneda_id = 'PES'; moneda_ctz = '1.000' @@ -1086,13 +1097,13 @@ def main(): wsfev1.EstablecerCampoFactura("caea", caea) wsfev1.EstablecerCampoFactura("fecha_hs_gen", "yyyymmddhhmiss") - # comprobantes asociados (notas de crédito / débito) + # comprobantes asociados (notas de cr�dito / d�bito) if tipo_cbte in (2, 3, 7, 8, 12, 13, 202, 203, 208, 213): tipo = 201 if tipo_cbte in (202, 203, 208, 213) else 3 pto_vta = punto_vta nro = 1 cuit = "20267565393" - # obligatorio en Factura de Crédito Electrónica MiPyMEs (FCE): + # obligatorio en Factura de Cr�dito Electr�nica MiPyMEs (FCE): fecha_cbte = fecha if tipo_cbte in (3, 202, 203, 208, 213) else None wsfev1.AgregarCmpAsoc(tipo, pto_vta, nro, cuit, fecha_cbte) @@ -1129,7 +1140,7 @@ def main(): wsfev1.AgregarOpcional(5, "02") # IVA Excepciones wsfev1.AgregarOpcional(61, "80") # Firmante Doc Tipo wsfev1.AgregarOpcional(62, "20267565393") # Firmante Doc Nro - wsfev1.AgregarOpcional(7, "01") # Carácter del Firmante + wsfev1.AgregarOpcional(7, "01") # Car�cter del Firmante # datos opcionales para RG 4004-E Alquiler de inmuebles (Ganancias) if '--rg4004' in sys.argv: wsfev1.AgregarOpcional(17, "1") # Intermediario @@ -1140,17 +1151,17 @@ def main(): wsfev1.AgregarComprador(80, "30500010912", 99.99) wsfev1.AgregarComprador(80, "30999032083", 0.01) - # datos de Factura de Crédito Electrónica MiPyMEs (FCE): + # datos de Factura de Cr�dito Electr�nica MiPyMEs (FCE): if '--fce' in sys.argv: wsfev1.AgregarOpcional(2101, "2850590940090418135201") # CBU wsfev1.AgregarOpcional(2102, "pyafipws") # alias if tipo_cbte in (203, 208, 213): - wsfev1.AgregarOpcional(22, "S") # Anulación + wsfev1.AgregarOpcional(22, "S") # Anulaci�n if '--rg4540' in sys.argv: wsfev1.AgregarPeriodoComprobantesAsociados('20200101', '20200131') - # agregar la factura creada internamente para solicitud múltiple: + # agregar la factura creada internamente para solicitud m�ltiple: if "--multiple" in sys.argv: wsfev1.AgregarFacturaX() @@ -1269,6 +1280,8 @@ def main(): print u'\n'.join(wsfev1.ParamGetTiposPaises()) print "=== Puntos de Venta ===" print u'\n'.join(wsfev1.ParamGetPtosVenta()) + print "=== Actividades ===" + print u'\n'.join(wsfev1.ParamGetActividades()) if "--cotizacion" in sys.argv: print wsfev1.ParamGetCotizacion('DOL') @@ -1333,7 +1346,7 @@ def main(): print error -# busco el directorio de instalación (global para que no cambie si usan otra dll) +# busco el directorio de instalaci�n (global para que no cambie si usan otra dll) INSTALL_DIR = WSFEv1.InstallDir = get_install_dir() From e932c2dc099f88b3cf4f969aa52af21f7c93dee7 Mon Sep 17 00:00:00 2001 From: RominaCastro Date: Mon, 7 Nov 2022 23:00:15 -0300 Subject: [PATCH 2/9] =?UTF-8?q?WSFEv1:=20Agrego=20m=C3=A9todo=20Agregar=20?= =?UTF-8?q?Actividad?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wsfev1.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/wsfev1.py b/wsfev1.py index e5cc12a69..e0555e82f 100644 --- a/wsfev1.py +++ b/wsfev1.py @@ -47,6 +47,7 @@ class WSFEv1(BaseWS): _public_methods_ = ['CrearFactura', 'AgregarIva', 'CAESolicitar', 'AgregarTributo', 'AgregarCmpAsoc', 'AgregarOpcional', 'AgregarComprador', 'AgregarPeriodoComprobantesAsociados', + 'AgregarActividad', 'CompUltimoAutorizado', 'CompConsultar', 'CAEASolicitar', 'CAEAConsultar', 'CAEARegInformativo', 'CAEASinMovimientoInformar', @@ -154,6 +155,7 @@ def CrearFactura(self, concepto=1, tipo_doc=80, nro_doc="", tipo_cbte=1, punto_v 'iva': [], 'opcionales': [], 'compradores': [], + 'actividades': [], } if fecha_serv_desde: fact['fecha_serv_desde'] = fecha_serv_desde if fecha_serv_hasta: fact['fecha_serv_hasta'] = fecha_serv_hasta @@ -214,6 +216,12 @@ def AgregarComprador(self, doc_tipo=80, doc_nro=0, porcentaje=100.00, **kwarg): self.factura['compradores'].append(comp) return True + def AgregarActividad(self, actividad_id=0, **kwarg): + "Agrego actividad a una factura (interna)" + op = { 'actividad_id': actividad_id } + self.factura['actividades'].append(op) + return True + def ObtenerCampoFactura(self, *campos): "Obtener el valor devuelto de AFIP para un campo de factura" # cada campo puede ser una clave string (dict) o una posici�n (list) @@ -300,6 +308,10 @@ def CAESolicitar(self): 'DocNro': comprador['doc_nro'], 'Porcentaje': comprador['porcentaje'], }} for comprador in f['compradores']] or None, + 'Actividades': [ + {'Actividad': { + 'Id': actividad['actividad_id'], + }} for actividad in f['actividades']] or None, } }] }) @@ -438,6 +450,10 @@ def CompConsultar(self, tipo_cbte, punto_vta, cbte_nro, reproceso=False): 'DocNro': comprador['doc_nro'], 'Porcentaje': comprador['porcentaje'], }} for comprador in f['compradores']], + 'Actividades': [ + {'Actividad': { + 'Id': actividad['actividad_id'], + }} for actividad in f['actividades']], } copia = resultget.copy() # TODO: ordenar / convertir opcionales (por ahora no se verifican) @@ -508,6 +524,11 @@ def CompConsultar(self, tipo_cbte, punto_vta, cbte_nro, reproceso=False): 'porcentaje': comp['Comprador']['Porcentaje'], } for comp in resultget.get('Compradores', [])], + 'actividades': [ + { + 'actividad_id': obs['Actividad']['Id'], + } + for obs in resultget.get('Actividades', [])], 'cae': resultget.get('CodAutorizacion'), 'resultado': resultget.get('Resultado'), 'fch_venc_cae': resultget.get('FchVto'), @@ -624,6 +645,10 @@ def CAESolicitarX(self): 'Id': opcional['opcional_id'], 'Valor': opcional['valor'], }} for opcional in f['opcionales']] or None, + 'Actividades': [ + {'Actividad': { + 'Id': actividad['actividad_id'], + }} for actividad in f['actividades']] or None, } } for f in self.facturas] }) From f4083c366f86c13683ae3966593512ef0e13eb80 Mon Sep 17 00:00:00 2001 From: RominaCastro Date: Thu, 1 Dec 2022 00:16:02 -0300 Subject: [PATCH 3/9] =?UTF-8?q?WSFEXv1:=20=20agrego=20m=C3=A9todo=20GetPar?= =?UTF-8?q?amActividades?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wsfexv1.py | 103 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 66 insertions(+), 37 deletions(-) diff --git a/wsfexv1.py b/wsfexv1.py index 34bbd051c..35b9ec79f 100644 --- a/wsfexv1.py +++ b/wsfexv1.py @@ -10,9 +10,9 @@ # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. -"""Módulo para obtener CAE, código de autorización de impresión o electrónico, -del web service WSFEXv1 de AFIP (Factura Electrónica Exportación Versión 1) -según RG2758/2010 (Registros Especiales Aduaneros) y RG3689/14 (servicios) +"""Módulo para obtener CAE, código de autorización de impresión o electrónico, +del web service WSFEXv1 de AFIP (Factura Electrónica Exportación Versión 1) +según RG2758/2010 (Registros Especiales Aduaneros) y RG3689/14 (servicios) http://www.sistemasagiles.com.ar/trac/wiki/FacturaElectronicaExportacion """ @@ -32,7 +32,7 @@ class WSFEXv1(BaseWS): - "Interfaz para el WebService de Factura Electrónica Exportación Versión 1" + "Interfaz para el WebService de Factura Electrónica Exportación Versión 1" _public_methods_ = ['CrearFactura', 'AgregarItem', 'Authorize', 'GetCMP', 'AgregarPermiso', 'AgregarCmpAsoc', 'GetParamMon', 'GetParamTipoCbte', 'GetParamTipoExpo', @@ -43,7 +43,7 @@ class WSFEXv1(BaseWS): 'GetParamPtosVenta', 'GetParamCtz', 'LoadTestXML', 'AnalizarXml', 'ObtenerTagXml', 'DebugLog', 'SetParametros', 'SetTicketAcceso', 'GetParametro', - 'GetLastCMP', 'GetLastID', + 'GetLastCMP', 'GetLastID', 'GetParamActividades' 'Dummy', 'Conectar', 'SetTicketAcceso'] _public_attrs_ = ['Token', 'Sign', 'Cuit', 'AppServerStatus', 'DbServerStatus', 'AuthServerStatus', @@ -59,7 +59,7 @@ class WSFEXv1(BaseWS): # Variables globales para BaseWS: HOMO = HOMO WSDL = WSDL - Version = "%s %s" % (__version__, HOMO and 'Homologación' or '') + Version = "%s %s" % (__version__, HOMO and 'Homologación' or '') factura = None def inicializar(self): @@ -93,7 +93,7 @@ def CrearFactura(self, tipo_cbte=19, punto_vta=1, cbte_nro=0, fecha_cbte=None, obs_comerciales="", obs_generales="", forma_pago="", incoterms="", idioma_cbte=7, incoterms_ds=None, fecha_pago=None, **kwargs): "Creo un objeto factura (interna)" - # Creo una factura electronica de exportación + # Creo una factura electronica de exportación fact = {'tipo_cbte': tipo_cbte, 'punto_vta': punto_vta, 'cbte_nro': cbte_nro, 'fecha_cbte': fecha_cbte, @@ -259,7 +259,7 @@ def GetCMP(self, tipo_cbte, punto_vta, cbte_nro): @inicializar_y_capturar_excepciones def GetLastCMP(self, tipo_cbte, punto_vta): - "Recuperar último número de comprobante emitido" + "Recuperar último número de comprobante emitido" ret = self.client.FEXGetLast_CMP( Auth={'Token': self.Token, 'Sign': self.Sign, 'Cuit': self.Cuit, 'Cbte_Tipo': tipo_cbte, @@ -275,7 +275,7 @@ def GetLastCMP(self, tipo_cbte, punto_vta): @inicializar_y_capturar_excepciones def GetLastID(self): - "Recuperar último número de transacción (ID)" + "Recuperar último número de transacción (ID)" ret = self.client.FEXGetLast_ID( Auth={'Token': self.Token, 'Sign': self.Sign, 'Cuit': self.Cuit, }) result = ret['FEXGetLast_IDResult'] @@ -346,7 +346,7 @@ def GetParamMon(self, sep="|"): @inicializar_y_capturar_excepciones def GetParamDstPais(self, sep="|"): - "Recuperador de valores referenciales de códigos de Países" + "Recuperador de valores referenciales de códigos de Países" ret = self.client.FEXGetPARAM_DST_pais( Auth={'Token': self.Token, 'Sign': self.Sign, 'Cuit': self.Cuit, }) result = ret['FEXGetPARAM_DST_paisResult'] @@ -369,7 +369,7 @@ def GetParamDstPais(self, sep="|"): @inicializar_y_capturar_excepciones def GetParamDstCUIT(self, sep="|"): - "Recuperar lista de valores referenciales de CUIT de Países" + "Recuperar lista de valores referenciales de CUIT de Países" ret = self.client.FEXGetPARAM_DST_CUIT( Auth={'Token': self.Token, 'Sign': self.Sign, 'Cuit': self.Cuit, }) result = ret['FEXGetPARAM_DST_CUITResult'] @@ -392,12 +392,12 @@ def GetParamDstCUIT(self, sep="|"): @inicializar_y_capturar_excepciones def GetParamTipoCbte(self, sep="|"): - "Recuperador de valores referenciales de códigos de Tipo de comprobantes" + "Recuperador de valores referenciales de códigos de Tipo de comprobantes" ret = self.client.FEXGetPARAM_Cbte_Tipo( Auth={'Token': self.Token, 'Sign': self.Sign, 'Cuit': self.Cuit, }) result = ret['FEXGetPARAM_Cbte_TipoResult'] self.__analizar_errores(result) - + ret = [] for u in result['FEXResultGet']: u = u['ClsFEXResponse_Cbte_Tipo'] @@ -408,7 +408,7 @@ def GetParamTipoCbte(self, sep="|"): 'vig_hasta': u.get('Cbte_vig_hasta')} except Exception, e: print e - + ret.append(r) if sep: return [("\t%(codigo)s\t%(ds)s\t%(vig_desde)s\t%(vig_hasta)s\t" @@ -418,7 +418,7 @@ def GetParamTipoCbte(self, sep="|"): @inicializar_y_capturar_excepciones def GetParamTipoExpo(self, sep="|"): - "Recuperador de valores referenciales de códigos de Tipo de exportación" + "Recuperador de valores referenciales de códigos de Tipo de exportación" ret = self.client.FEXGetPARAM_Tipo_Expo( Auth={'Token': self.Token, 'Sign': self.Sign, 'Cuit': self.Cuit, }) result = ret['FEXGetPARAM_Tipo_ExpoResult'] @@ -443,7 +443,7 @@ def GetParamTipoExpo(self, sep="|"): @inicializar_y_capturar_excepciones def GetParamIdiomas(self, sep="|"): - "Recuperar lista de valores referenciales de códigos de Idiomas" + "Recuperar lista de valores referenciales de códigos de Idiomas" ret = self.client.FEXGetPARAM_Idiomas( Auth={'Token': self.Token, 'Sign': self.Sign, 'Cuit': self.Cuit, }) result = ret['FEXGetPARAM_IdiomasResult'] @@ -492,7 +492,7 @@ def GetParamIncoterms(self, sep="|"): @inicializar_y_capturar_excepciones def GetParamCtz(self, moneda_id): - "Recuperador de cotización de moneda" + "Recuperador de cotización de moneda" ret = self.client.FEXGetPARAM_Ctz( Auth={'Token': self.Token, 'Sign': self.Sign, 'Cuit': self.Cuit}, Mon_id=moneda_id, @@ -555,6 +555,30 @@ def GetParamPtosVenta(self, sep="|"): return [(u"%(nro)s\tBloqueado:%(bloqueado)s\tFchBaja:%(baja)s" % r).replace("\t", sep) for r in ret] + @inicializar_y_capturar_excepciones + def GetParamActividades(self, sep="|"): + "Recuperar lista de valores referenciales de códigos de Idiomas" + ret = self.client.FEXGetPARAM_Actividades( + Auth={'Token': self.Token, 'Sign': self.Sign, 'Cuit': self.Cuit, }) + result = ret['FEXGetPARAM_ActividadesResult'] + self.__analizar_errores(result) + + ret = [] + for u in result.get('FEXResultGet', []): + u = u['ClsFEXResponse_ActividadTipo'] + try: + r = {'codigo': u.get('Id'), 'ds': u.get('Desc'), + 'orden': u.get('Orden'), } + except Exception, e: + print e + + ret.append(r) + if sep: + return [("\t%(codigo)s\t%(ds)s\t%(orden)s\t" + % it).replace("\t", sep) for it in ret] + else: + return ret + class WSFEX(WSFEXv1): "Wrapper para retrocompatibilidad con WSFEX" @@ -564,7 +588,7 @@ class WSFEX(WSFEXv1): def __init__(self): WSFEXv1.__init__(self) - self.Version = "%s %s WSFEXv1" % (__version__, HOMO and 'Homologación' or '') + self.Version = "%s %s WSFEXv1" % (__version__, HOMO and 'Homologación' or '') def Conectar(self, url="", proxy=""): # Ajustar URL de V0 a V1: @@ -577,7 +601,7 @@ def Conectar(self, url="", proxy=""): return WSFEXv1.Conectar(self, cache=None, wsdl=url, proxy=proxy) -# busco el directorio de instalación (global para que no cambie si usan otra dll) +# busco el directorio de instalación (global para que no cambie si usan otra dll) INSTALL_DIR = WSFEXv1.InstallDir = get_install_dir() @@ -600,9 +624,9 @@ def p_assert_eq(a,b): # win32com.server.localserver.serve([WSFEXv1._reg_clsid_]) else: - # Crear objeto interface Web Service de Factura Electrónica de Exportación + # Crear objeto interface Web Service de Factura Electrónica de Exportación wsfexv1 = WSFEXv1() - # Setear token y sing de autorización (pasos previos) + # Setear token y sing de autorización (pasos previos) # obteniendo el TA para pruebas from wsaa import WSAA @@ -612,7 +636,7 @@ def p_assert_eq(a,b): # CUIT del emisor (debe estar registrado en la AFIP) wsfexv1.Cuit = "20267565393" - # Conectar al Servicio Web de Facturación (producción u homologación) + # Conectar al Servicio Web de Facturación (producción u homologación) if "--prod" in sys.argv: wsdl = "https://servicios1.afip.gov.ar/wsfexv1/service.asmx?WSDL" else: @@ -632,28 +656,28 @@ def p_assert_eq(a,b): if "--prueba" in sys.argv: try: # Establezco los valores de la factura a autorizar: - tipo_cbte = '--nc' in sys.argv and 21 or 19 # FC/NC Expo (ver tabla de parámetros) + tipo_cbte = '--nc' in sys.argv and 21 or 19 # FC/NC Expo (ver tabla de parámetros) punto_vta = 7 - # Obtengo el último número de comprobante y le agrego 1 + # Obtengo el último número de comprobante y le agrego 1 cbte_nro = int(wsfexv1.GetLastCMP(tipo_cbte, punto_vta)) + 1 fecha_cbte = datetime.datetime.now().strftime("%Y%m%d") - tipo_expo = 2 # tipo de exportación (ver tabla de parámetros) + tipo_expo = 2 # tipo de exportación (ver tabla de parámetros) permiso_existente = (tipo_cbte not in (20, 21) and tipo_expo==1) and "S" or "" print "permiso_existente", permiso_existente - dst_cmp = 203 # país destino + dst_cmp = 203 # país destino cliente = "Joao Da Silva" cuit_pais_cliente = "50000000016" - domicilio_cliente = u"Rúa Ñ°76 km 34.5 Alagoas" + domicilio_cliente = u"Rúa Ñ°76 km 34.5 Alagoas" id_impositivo = "PJ54482221-l" - moneda_id = "DOL" # para reales, "DOL" o "PES" (ver tabla de parámetros) + moneda_id = "DOL" # para reales, "DOL" o "PES" (ver tabla de parámetros) moneda_ctz = "60.2980" # wsfexv1.GetParamCtz('DOL') <- no funciona obs_comerciales = "Observaciones comerciales" obs = "Sin observaciones" forma_pago = "30 dias" fecha_pago = fecha_cbte - incoterms = "FOB" # (ver tabla de parámetros) + incoterms = "FOB" # (ver tabla de parámetros) incoterms_ds = "Flete a Bordo" - idioma_cbte = 1 # (ver tabla de parámetros) + idioma_cbte = 1 # (ver tabla de parámetros) imp_total = "250.00" # Creo una factura (internamente, no se llama al WebService): @@ -669,9 +693,9 @@ def p_assert_eq(a,b): ds = "Producto Tipo 1 Exportacion MERCOSUR ISO 9001" qty = 2 precio = "150.00" - umed = 1 # Ver tabla de parámetros (unidades de medida) + umed = 1 # Ver tabla de parámetros (unidades de medida) bonif = "50.00" - imp_total = "250.00" # importe total final del artículo + imp_total = "250.00" # importe total final del artículo # lo agrego a la factura (internamente, no se llama al WebService): ok = wsfexv1.AgregarItem(codigo, ds, qty, umed, precio, imp_total, bonif) ok = wsfexv1.AgregarItem(codigo, ds, qty, umed, precio, imp_total, bonif) @@ -680,7 +704,7 @@ def p_assert_eq(a,b): # Agrego un permiso (ver manual para el desarrollador) if permiso_existente: id = "99999AAXX999999A" - dst = 225 # país destino de la mercaderia + dst = 225 # país destino de la mercaderia ok = wsfexv1.AgregarPermiso(id, dst) # Agrego un comprobante asociado (solo para N/C o N/D) @@ -691,12 +715,12 @@ def p_assert_eq(a,b): cbteasoc_cuit = 20111111111 wsfexv1.AgregarCmpAsoc(cbteasoc_tipo, cbteasoc_pto_vta, cbteasoc_nro, cbteasoc_cuit) - ##id = "99000000000100" # número propio de transacción - # obtengo el último ID y le adiciono 1 + ##id = "99000000000100" # número propio de transacción + # obtengo el último ID y le adiciono 1 # (advertencia: evitar overflow y almacenar!) id = long(wsfexv1.GetLastID()) + 1 - # Llamo al WebService de Autorización para obtener el CAE + # Llamo al WebService de Autorización para obtener el CAE cae = wsfexv1.Authorize(id) print "Comprobante", tipo_cbte, wsfexv1.CbteNro @@ -779,7 +803,7 @@ def p_assert_eq(a,b): print "||%(id)s||%(ds)s||%(vig_desde)s||%(vig_hasta)s||" % u umeds = dict([(u.get('id', ""),u.get('ds', "")) for u in umedidas]) - print u"=== Código Pais Destino ===" + print u"=== Código Pais Destino ===" ret = wsfexv1.GetParamDstPais(sep=False) for r in ret: print "||%(codigo)s||%(ds)s||" % r @@ -788,6 +812,11 @@ def p_assert_eq(a,b): ret = wsfexv1.GetParamDstCUIT(sep=False) for r in ret: print "||%(codigo)s||%(ds)s||" % r + + print u"=== Actividades ===" + ret = wsfexv1.GetParamActividades(sep=False) + for r in ret: + print "||%(codigo)s||%(ds)s||" % r if "--ctz" in sys.argv: print wsfexv1.GetParamCtz('DOL') From 2e4a6e7c2267c5e07ba0d6f6772764502efa7d9f Mon Sep 17 00:00:00 2001 From: RominaCastro Date: Thu, 1 Dec 2022 00:53:10 -0300 Subject: [PATCH 4/9] =?UTF-8?q?wsfexv1:=20agrego=20m=C3=A9todo=20AgregarAc?= =?UTF-8?q?tividad?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wsfexv1.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/wsfexv1.py b/wsfexv1.py index 35b9ec79f..8dbc5a3a5 100644 --- a/wsfexv1.py +++ b/wsfexv1.py @@ -34,7 +34,7 @@ class WSFEXv1(BaseWS): "Interfaz para el WebService de Factura Electrónica Exportación Versión 1" _public_methods_ = ['CrearFactura', 'AgregarItem', 'Authorize', 'GetCMP', - 'AgregarPermiso', 'AgregarCmpAsoc', + 'AgregarPermiso', 'AgregarCmpAsoc', 'AgregarActividad' 'GetParamMon', 'GetParamTipoCbte', 'GetParamTipoExpo', 'GetParamIdiomas', 'GetParamUMed', 'GetParamIncoterms', 'GetParamDstPais','GetParamDstCUIT', 'GetParamIdiomas', @@ -150,6 +150,12 @@ def AgregarCmpAsoc(self, cbte_tipo=19, cbte_punto_vta=0, cbte_nro=0, cbte_cuit=N 'cbte_nro': cbte_nro, 'cbte_cuit': cbte_cuit}) return True + def AgregarActividad(self, actividad_id=0, **kwarg): + "Agrego actividad a una factura (interna)" + act = { 'actividad_id': actividad_id } + self.factura['actividades'].append(act) + return True + @inicializar_y_capturar_excepciones def Authorize(self, id): "Autoriza la factura cargada en memoria" @@ -200,7 +206,11 @@ def Authorize(self, id): 'Pro_precio_uni': d['precio'], 'Pro_bonificacion': d['bonif'], 'Pro_total_item': d['importe'], - }} for d in f['detalles']], + }} for d in f['detalles']], + 'Actividades': f['actividades'] and [ + {'Actividad': { + 'Id': a['actividad_id'], + }} for a in f['actividades']] or None, }) result = ret['FEXAuthorizeResult'] @@ -700,7 +710,8 @@ def p_assert_eq(a,b): ok = wsfexv1.AgregarItem(codigo, ds, qty, umed, precio, imp_total, bonif) ok = wsfexv1.AgregarItem(codigo, ds, qty, umed, precio, imp_total, bonif) ok = wsfexv1.AgregarItem(codigo, ds, 0, 99, 0, -float(imp_total), 0) - + ok = wsfexv1.AgregarActividad(1234) + # Agrego un permiso (ver manual para el desarrollador) if permiso_existente: id = "99999AAXX999999A" From 403084e5f2b401b8d4cf5de44f317db9b2d1b6af Mon Sep 17 00:00:00 2001 From: RominaCastro Date: Sun, 11 Dec 2022 20:22:40 -0300 Subject: [PATCH 5/9] WSMTX: incremento version --- wsmtx.py | 66 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/wsmtx.py b/wsmtx.py index e0069c46e..98bba6bd7 100644 --- a/wsmtx.py +++ b/wsmtx.py @@ -10,15 +10,15 @@ # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. -"""Módulo para obtener código de autorización electrónico CAE/CAEA webservice -WSMTX de AFIP (Factura Electrónica Mercado Interno con codificación de -productos) según RG2904 (opción A con detalle) y RG2926/10 (CAE anticipado). +"""Módulo para obtener código de autorización electrónico CAE/CAEA webservice +WSMTX de AFIP (Factura Electrónica Mercado Interno con codificación de +productos) según RG2904 (opción A con detalle) y RG2926/10 (CAE anticipado). """ __author__ = "Mariano Reingart " __copyright__ = "Copyright (C) 2010-2015 Mariano Reingart" __license__ = "GPL 3.0" -__version__ = "1.15d" +__version__ = "1.16a" import datetime import decimal @@ -32,7 +32,7 @@ class WSMTXCA(BaseWS): - "Interfaz para el WebService de Factura Electrónica Mercado Interno WSMTXCA" + "Interfaz para el WebService de Factura Electrónica Mercado Interno WSMTXCA" _public_methods_ = ['CrearFactura', 'EstablecerCampoFactura', 'AgregarIva', 'AgregarItem', 'AgregarTributo', 'AgregarCmpAsoc', 'EstablecerCampoItem', 'AgregarOpcional', 'AgregarPeriodoComprobantesAsociados', @@ -71,7 +71,7 @@ class WSMTXCA(BaseWS): # Variables globales para BaseWS: HOMO = HOMO WSDL = WSDL - Version = "%s %s" % (__version__, HOMO and 'Homologación' or '') + Version = "%s %s" % (__version__, HOMO and 'Homologación' or '') Reprocesar = True # recuperar automaticamente CAE emitidos LanzarExcepciones = LANZAR_EXCEPCIONES factura = None @@ -117,7 +117,7 @@ def CrearFactura(self, concepto=None, tipo_doc=None, nro_doc=None, tipo_cbte=Non **kwargs ): "Creo un objeto factura (interna)" - # Creo una factura electronica de exportación + # Creo una factura electronica de exportación fact = {'tipo_doc': tipo_doc, 'nro_doc': nro_doc, 'tipo_cbte': tipo_cbte, 'punto_vta': punto_vta, 'cbt_desde': cbt_desde, 'cbt_hasta': cbt_hasta, @@ -165,7 +165,7 @@ def AgregarCmpAsoc(self, tipo=1, pto_vta=0, nro=0, cuit=None, fecha=None, **kwar return True def AgregarPeriodoComprobantesAsociados(self, fecha_desde=None, fecha_hasta=None, **kwargs): - "Agrego el perído de comprobante asociado a una factura (interna)" + "Agrego el perído de comprobante asociado a una factura (interna)" p_cmp_asoc = { 'fecha_desde': fecha_desde, 'fecha_hasta': fecha_hasta, @@ -358,7 +358,7 @@ def CAESolicitar(self): @inicializar_y_capturar_excepciones def AutorizarAjusteIVA(self): - "Envía la información del comprobante de ajuste de IVA que desea autorizar" + "Envía la información del comprobante de ajuste de IVA que desea autorizar" f = self.factura # contruyo la estructura a convertir en XML: fact = { @@ -447,7 +447,7 @@ def AutorizarAjusteIVA(self): @inicializar_y_capturar_excepciones def SolicitarCAEA(self, periodo, orden): - "Obtener un CAEA y su respectivo período de vigencia" + "Obtener un CAEA y su respectivo período de vigencia" ret = self.client.solicitarCAEA( authRequest={'token': self.Token, 'sign': self.Sign, 'cuitRepresentada': self.Cuit}, solicitudCAEA = { @@ -471,7 +471,7 @@ def SolicitarCAEA(self, periodo, orden): @inicializar_y_capturar_excepciones def ConsultarCAEA(self, periodo=None, orden=None, caea=None): - "Método de consulta de CAEA" + "Método de consulta de CAEA" if periodo and orden: anio, mes = int(periodo[0:4]), int(periodo[4:6]) if int(orden)==1: @@ -517,7 +517,7 @@ def ConsultarCAEA(self, periodo=None, orden=None, caea=None): @inicializar_y_capturar_excepciones def ConsultarCAEAEntreFechas(self, fecha_desde, fecha_hasta): - "Método de consulta de CAEA" + "Método de consulta de CAEA" ret = self.client.consultarCAEAEntreFechas( authRequest={'token': self.Token, 'sign': self.Sign, 'cuitRepresentada': self.Cuit}, @@ -534,7 +534,7 @@ def ConsultarCAEAEntreFechas(self, fecha_desde, fecha_hasta): @inicializar_y_capturar_excepciones def InformarComprobanteCAEA(self): - "Envía la información del comprobante emitido y asociado a un CAEA" + "Envía la información del comprobante emitido y asociado a un CAEA" f = self.factura # contruyo la estructura a convertir en XML: fact = { @@ -600,7 +600,7 @@ def InformarComprobanteCAEA(self): }} for dato in f['opcionales']] or None, } - # fecha de vencimiento opcional (igual al último día de vigencia del CAEA) + # fecha de vencimiento opcional (igual al último día de vigencia del CAEA) if 'fch_venc_cae' in f: fact['fechaVencimiento'] = f['fch_venc_cae'] @@ -654,7 +654,7 @@ def InformarComprobanteCAEA(self): @inicializar_y_capturar_excepciones def InformarAjusteIVACAEA(self): - "Envía la información del comprobante de ajuste de IVA emitidos" + "Envía la información del comprobante de ajuste de IVA emitidos" f = self.factura # contruyo la estructura a convertir en XML: fact = { @@ -705,7 +705,7 @@ def InformarAjusteIVACAEA(self): }} for it in f['detalles']] or None, } - # fecha de vencimiento opcional (igual al último día de vigencia del CAEA) + # fecha de vencimiento opcional (igual al último día de vigencia del CAEA) if 'fch_venc_cae' in f: fact['fechaVencimiento'] = f['fch_venc_cae'] @@ -882,7 +882,7 @@ def ConsultarComprobante(self, tipo_cbte, punto_vta, cbte_nro, reproceso=False): @inicializar_y_capturar_excepciones def ConsultarTiposComprobante(self): - "Este método permite consultar los tipos de comprobantes habilitados en este WS" + "Este método permite consultar los tipos de comprobantes habilitados en este WS" ret = self.client.consultarTiposComprobante( authRequest={'token': self.Token, 'sign': self.Sign, 'cuitRepresentada': self.Cuit}, ) @@ -899,7 +899,7 @@ def ConsultarTiposDocumento(self): @inicializar_y_capturar_excepciones def ConsultarAlicuotasIVA(self): - "Este método permite consultar los tipos de comprobantes habilitados en este WS" + "Este método permite consultar los tipos de comprobantes habilitados en este WS" ret = self.client.consultarAlicuotasIVA( authRequest={'token': self.Token, 'sign': self.Sign, 'cuitRepresentada': self.Cuit}, ) @@ -908,7 +908,7 @@ def ConsultarAlicuotasIVA(self): @inicializar_y_capturar_excepciones def ConsultarCondicionesIVA(self): - "Este método permite consultar los tipos de comprobantes habilitados en este WS" + "Este método permite consultar los tipos de comprobantes habilitados en este WS" ret = self.client.consultarCondicionesIVA( authRequest={'token': self.Token, 'sign': self.Sign, 'cuitRepresentada': self.Cuit}, ) @@ -916,7 +916,7 @@ def ConsultarCondicionesIVA(self): for p in ret['arrayCondicionesIVA']] @inicializar_y_capturar_excepciones def ConsultarMonedas(self): - "Este método permite consultar los tipos de comprobantes habilitados en este WS" + "Este método permite consultar los tipos de comprobantes habilitados en este WS" ret = self.client.consultarMonedas( authRequest={'token': self.Token, 'sign': self.Sign, 'cuitRepresentada': self.Cuit}, ) @@ -925,7 +925,7 @@ def ConsultarMonedas(self): @inicializar_y_capturar_excepciones def ConsultarUnidadesMedida(self): - "Este método permite consultar los tipos de comprobantes habilitados en este WS" + "Este método permite consultar los tipos de comprobantes habilitados en este WS" ret = self.client.consultarUnidadesMedida( authRequest={'token': self.Token, 'sign': self.Sign, 'cuitRepresentada': self.Cuit}, ) @@ -934,7 +934,7 @@ def ConsultarUnidadesMedida(self): @inicializar_y_capturar_excepciones def ConsultarTiposTributo(self): - "Este método permite consultar los tipos de comprobantes habilitados en este WS" + "Este método permite consultar los tipos de comprobantes habilitados en este WS" ret = self.client.consultarTiposTributo( authRequest={'token': self.Token, 'sign': self.Sign, 'cuitRepresentada': self.Cuit}, ) @@ -943,7 +943,7 @@ def ConsultarTiposTributo(self): @inicializar_y_capturar_excepciones def ConsultarTiposDatosAdicionales(self): - "Este método permite consultar los tipos de datos adicionales." + "Este método permite consultar los tipos de datos adicionales." ret = self.client.consultarTiposDatosAdicionales( authRequest={'token': self.Token, 'sign': self.Sign, 'cuitRepresentada': self.Cuit}, ) @@ -952,7 +952,7 @@ def ConsultarTiposDatosAdicionales(self): @inicializar_y_capturar_excepciones def ConsultarCotizacionMoneda(self, moneda_id): - "Este método permite consultar los tipos de comprobantes habilitados en este WS" + "Este método permite consultar los tipos de comprobantes habilitados en este WS" ret = self.client.consultarCotizacionMoneda( authRequest={'token': self.Token, 'sign': self.Sign, 'cuitRepresentada': self.Cuit}, codigoMoneda=moneda_id, @@ -963,7 +963,7 @@ def ConsultarCotizacionMoneda(self, moneda_id): @inicializar_y_capturar_excepciones def ConsultarPuntosVentaCAE(self, fmt="%(numeroPuntoVenta)s: bloqueado=%(bloqueado)s baja=%(fechaBaja)s"): - "Este método permite consultar los puntos de venta habilitados para CAE en este WS" + "Este método permite consultar los puntos de venta habilitados para CAE en este WS" res = self.client.consultarPuntosVentaCAE( authRequest={'token': self.Token, 'sign': self.Sign, 'cuitRepresentada': self.Cuit}, ) @@ -977,7 +977,7 @@ def ConsultarPuntosVentaCAE(self, fmt="%(numeroPuntoVenta)s: bloqueado=%(bloquea @inicializar_y_capturar_excepciones def ConsultarPuntosVentaCAEA(self, fmt="%(numeroPuntoVenta)s: bloqueado=%(bloqueado)s baja=%(fechaBaja)s"): - "Este método permite consultar los puntos de venta habilitados para CAEA en este WS" + "Este método permite consultar los puntos de venta habilitados para CAEA en este WS" res = self.client.consultarPuntosVentaCAEA( authRequest={'token': self.Token, 'sign': self.Sign, 'cuitRepresentada': self.Cuit}, ) @@ -991,7 +991,7 @@ def ConsultarPuntosVentaCAEA(self, fmt="%(numeroPuntoVenta)s: bloqueado=%(bloque @inicializar_y_capturar_excepciones def ConsultarPtosVtaCAEANoInformados(self, caea): - "Este método permite consultar que puntos de venta aún no fueron informados para un CAEA determinado." + "Este método permite consultar que puntos de venta aún no fueron informados para un CAEA determinado." ret = self.client.consultarPtosVtaCAEANoInformados( authRequest={'token': self.Token, 'sign': self.Sign, 'cuitRepresentada': self.Cuit}, CAEA=caea, @@ -1002,7 +1002,7 @@ def ConsultarPtosVtaCAEANoInformados(self, caea): def main(): - "Función principal de pruebas (obtener CAE)" + "Función principal de pruebas (obtener CAE)" import os, time DEBUG = '--debug' in sys.argv @@ -1043,7 +1043,7 @@ def main(): imp_total = "122.00"; imp_tot_conc = "0.00"; imp_neto = "100.00" imp_trib = "1.00"; imp_op_ex = "0.00"; imp_subtotal = "100.00" fecha_cbte = fecha; fecha_venc_pago = fecha - # Fechas del período del servicio facturado (solo si concepto = 1?) + # Fechas del período del servicio facturado (solo si concepto = 1?) fecha_serv_desde = fecha; fecha_serv_hasta = fecha moneda_id = 'PES'; moneda_ctz = '1.000' obs = "Observaciones Comerciales, libre" @@ -1095,11 +1095,11 @@ def main(): # ejemplo descuento (sin precio unitario) wsmtxca.AgregarItem(None, None, None, 'bonificacion', None, 99, None, None, 5, -21, -121) - # ejemplo item solo descripción: + # ejemplo item solo descripción: #wsmtxca.AgregarItem(u_mtx, cod_mtx, codigo, ds, 1, umed, # 0, 0, iva_id, 0, 0) - # datos de Factura de Crédito Electrónica MiPyMEs (FCE): + # datos de Factura de Crédito Electrónica MiPyMEs (FCE): if '--fce' in sys.argv: wsmtxca.AgregarOpcional(21, "2850590940090418135201") # CBU @@ -1157,7 +1157,7 @@ def main(): imp_total = "21.00"; imp_tot_conc = "0.00"; imp_neto = None imp_trib = "0.00"; imp_op_ex = "0.00"; imp_subtotal = "0.00" fecha_cbte = fecha; fecha_venc_pago = fecha - # Fechas del período del servicio facturado (solo si concepto = 1?) + # Fechas del período del servicio facturado (solo si concepto = 1?) fecha_serv_desde = fecha; fecha_serv_hasta = fecha moneda_id = 'PES'; moneda_ctz = '1.000' obs = "Observaciones Comerciales, libre" @@ -1255,7 +1255,7 @@ def main(): print "fch_proceso:", wsmtxca.FchProceso -# busco el directorio de instalación (global para que no cambie si usan otra dll) +# busco el directorio de instalación (global para que no cambie si usan otra dll) INSTALL_DIR = WSMTXCA.InstallDir = get_install_dir() From 46332c4f2026d9ec3f4ff08d50eacf9b276e1a9b Mon Sep 17 00:00:00 2001 From: RominaCastro Date: Sun, 11 Dec 2022 20:27:50 -0300 Subject: [PATCH 6/9] WSMTXCA: Agrego ConsultarActividadesVigentes --- wsmtx.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/wsmtx.py b/wsmtx.py index 98bba6bd7..d0ee4380f 100644 --- a/wsmtx.py +++ b/wsmtx.py @@ -49,6 +49,7 @@ class WSMTXCA(BaseWS): 'ConsultarCondicionesIVA', 'ConsultarMonedas', 'ConsultarUnidadesMedida', + 'ConsultarActividadesVigentes', 'ConsultarTiposTributo', 'ConsultarTiposDatosAdicionales', 'ConsultarCotizacionMoneda', 'ConsultarPuntosVentaCAE', @@ -999,6 +1000,14 @@ def ConsultarPtosVtaCAEANoInformados(self, caea): return [" ".join([("%s=%s" % (k, v)) for k, v in p['puntoVenta'].items()]) for p in ret['arrayPuntosVenta']] + @inicializar_y_capturar_excepciones + def ConsultarActividadesVigentes(self): + "Este método permite consultar las actividades vigentes para el contribuyente" + ret = self.client.consultarActividadesVigentes( + authRequest={'token': self.Token, 'sign': self.Sign, 'cuitRepresentada': self.Cuit}, + ) + return ["%(codigo)s: %(orden)s %(descripcion)s" % p['actividad'] + for p in ret['arrayActividades']] def main(): @@ -1220,6 +1229,7 @@ def main(): print wsmtxca.ConsultarUnidadesMedida() print wsmtxca.ConsultarTiposTributo() print wsmtxca.ConsultarTiposDatosAdicionales() + print wsmtxca.ConsultarActividadesVigentes() if "--puntosventa" in sys.argv: print wsmtxca.ConsultarPuntosVentaCAE() From e7efe73a5585e8a68171b47fea5dbb676fc09f6a Mon Sep 17 00:00:00 2001 From: RominaCastro Date: Sun, 11 Dec 2022 21:27:03 -0300 Subject: [PATCH 7/9] WSMTXCA: Agrego AgregarActividad RG5259 - RG5264/22 --- wsmtx.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/wsmtx.py b/wsmtx.py index d0ee4380f..2bf9cba85 100644 --- a/wsmtx.py +++ b/wsmtx.py @@ -35,7 +35,7 @@ class WSMTXCA(BaseWS): "Interfaz para el WebService de Factura Electrónica Mercado Interno WSMTXCA" _public_methods_ = ['CrearFactura', 'EstablecerCampoFactura', 'AgregarIva', 'AgregarItem', 'AgregarTributo', 'AgregarCmpAsoc', 'EstablecerCampoItem', 'AgregarOpcional', - 'AgregarPeriodoComprobantesAsociados', + 'AgregarPeriodoComprobantesAsociados', 'AgregarActividad' 'AutorizarComprobante', 'CAESolicitar', 'AutorizarAjusteIVA', 'SolicitarCAEA', 'ConsultarCAEA', 'ConsultarCAEAEntreFechas', 'InformarComprobanteCAEA', 'InformarAjusteIVACAEA', @@ -136,6 +136,7 @@ def CrearFactura(self, concepto=None, tipo_doc=None, nro_doc=None, tipo_cbte=Non 'iva': [], 'detalles': [], 'opcionales': [], + 'actividades': [], } if fecha_serv_desde: fact['fecha_serv_desde'] = fecha_serv_desde if fecha_serv_hasta: fact['fecha_serv_hasta'] = fecha_serv_hasta @@ -236,6 +237,12 @@ def AgregarOpcional(self, opcional_id=0, valor=None, valor2=None, self.factura['opcionales'].append(op) return True + def AgregarActividad(self, actividad_id=0, **kwarg): + "Agrego actividades a una factura (interna)" + act = { 'actividad_id': actividad_id} + self.factura['actividades'].append(act) + return True + @inicializar_y_capturar_excepciones def AutorizarComprobante(self): @@ -301,6 +308,9 @@ def AutorizarComprobante(self): 'c5': dato.get('valor5'), 'c6': dato.get('valor6'), }} for dato in f['opcionales']] or None, + 'arrayActividades': f['actividades'] and [{'actividad': { + 'codigo': dato['actividad_id'], + }} for dato in f['actividades']] or None, } ret = self.client.autorizarComprobante( @@ -1041,7 +1051,7 @@ def main(): if "--prueba" in sys.argv: ##print wsmtxca.client.help("autorizarComprobante").encode("latin1") try: - tipo_cbte = 201 + tipo_cbte = 1 punto_vta = 4000 cbte_nro = wsmtxca.ConsultarUltimoComprobanteAutorizado(tipo_cbte, punto_vta) fecha = datetime.datetime.now().strftime("%Y-%m-%d") @@ -1114,6 +1124,9 @@ def main(): if '--rg4540' in sys.argv: wsmtxca.AgregarPeriodoComprobantesAsociados('2020-01-01', '2020-01-31') + + if '--rg5259' in sys.argv: + wsmtxca.AgregarActividad(960990) print wsmtxca.factura From 45fa9913fb2117bb14388187d94a0c3097d70e42 Mon Sep 17 00:00:00 2001 From: Mariano Reingart Date: Sat, 18 Mar 2023 16:05:00 -0300 Subject: [PATCH 8/9] RG5259: skip new method for recorded tests --- wsfev1.py | 5 +++-- wsmtx.py | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/wsfev1.py b/wsfev1.py index 3bf0e8b2b..abad6385c 100644 --- a/wsfev1.py +++ b/wsfev1.py @@ -1629,8 +1629,9 @@ def main(): # print(u"\n".join(wsfev1.ParamGetTiposPaises())) print("=== Puntos de Venta ===") print(u"\n".join(wsfev1.ParamGetPtosVenta())) - print("=== Actividades ===") - print(u'\n'.join(wsfev1.ParamGetActividades())) + if '--rg5259' in sys.argv: + print("=== Actividades ===") + print(u'\n'.join(wsfev1.ParamGetActividades())) if "--cotizacion" in sys.argv: print(wsfev1.ParamGetCotizacion("DOL")) diff --git a/wsmtx.py b/wsmtx.py index 5f896be6b..d41f5bb28 100644 --- a/wsmtx.py +++ b/wsmtx.py @@ -1771,7 +1771,8 @@ def main(): print(wsmtxca.ConsultarUnidadesMedida()) print(wsmtxca.ConsultarTiposTributo()) print(wsmtxca.ConsultarTiposDatosAdicionales()) - print(wsmtxca.ConsultarActividadesVigentes()) + if '--rg5259' in sys.argv: + print(wsmtxca.ConsultarActividadesVigentes()) if "--puntosventa" in sys.argv: print(wsmtxca.ConsultarPuntosVentaCAE()) From 1fa7252f52366b176d942f815e4bc42b97b793e1 Mon Sep 17 00:00:00 2001 From: Mariano Reingart Date: Sat, 18 Mar 2023 16:17:29 -0300 Subject: [PATCH 9/9] RG5259: fix merge --- wsmtx.py | 1 + 1 file changed, 1 insertion(+) diff --git a/wsmtx.py b/wsmtx.py index d41f5bb28..3ff538685 100644 --- a/wsmtx.py +++ b/wsmtx.py @@ -225,6 +225,7 @@ def CrearFactura( "iva": [], "detalles": [], "opcionales": [], + "actividades": [], } if fecha_serv_desde: fact["fecha_serv_desde"] = fecha_serv_desde