Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 24 additions & 1 deletion utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,30 @@
print("para soporte de JSON debe instalar simplejson")
json = None

import httplib2
try:
import httplib2

# corregir temas de negociacion de SSL en algunas versiones de ubuntu:
from pysimplesoap.client import SoapClient
import platform

monkey_patch = sys.version_info < (3, ) or httplib2._build_ssl_context.__module__ != "httplib2"
needs_patch = platform.system() == 'Linux' or sys.version_info > (3, 10)
if needs_patch and not monkey_patch:
_build_ssl_context = httplib2._build_ssl_context

def _build_ssl_context_new(*args, **kwargs):
context = _build_ssl_context(*args, **kwargs)
# fix ssl.SSLError: [SSL: DH_KEY_TOO_SMALL] dh key too small
# alternative: context.set_ciphers("DEFAULT@SECLEVEL=1")
context.set_ciphers("AES128-SHA")
return context

httplib2._build_ssl_context = _build_ssl_context_new

except ImportError as mnfe:
if "httplib2" in str(mnfe):
print("para soporte de WebClient debe instalar httplib2")

DEBUG = False

Expand Down
61 changes: 59 additions & 2 deletions wsfev1.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@
class WSFEv1(BaseWS):
"Interfaz para el WebService de Factura Electr�nica Version 1 - 2.10"
_public_methods_ = ['CrearFactura', 'AgregarIva', 'CAESolicitar',
'AgregarTributo', 'AgregarCmpAsoc', 'AgregarOpcional',
'AgregarTributo', 'AgregarCmpAsoc',
"AgregarPeriodoComprobantesAsociados", 'AgregarOpcional',
'AgregarComprador',
'CompUltimoAutorizado', 'CompConsultar',
'CAEASolicitar', 'CAEAConsultar', 'CAEARegInformativo',
Expand Down Expand Up @@ -134,7 +135,7 @@ def CrearFactura(self, concepto=1, tipo_doc=80, nro_doc="", tipo_cbte=1, punto_v
cbt_desde=0, cbt_hasta=0, imp_total=0.00, imp_tot_conc=0.00, imp_neto=0.00,
imp_iva=0.00, imp_trib=0.00, imp_op_ex=0.00, fecha_cbte="", fecha_venc_pago=None,
fecha_serv_desde=None, fecha_serv_hasta=None, #--
moneda_id="PES", moneda_ctz="1.0000", caea=None, fecha_hs_gen=None, **kwargs
moneda_id="PES", moneda_ctz="1.0000", cond_iva_receptor=1, act_codigos=[], caea=None, fecha_hs_gen=None, **kwargs
):

"Creo un objeto factura (interna)"
Expand All @@ -148,6 +149,8 @@ def CrearFactura(self, concepto=1, tipo_doc=80, nro_doc="", tipo_cbte=1, punto_v
'fecha_cbte': fecha_cbte,
'fecha_venc_pago': fecha_venc_pago,
'moneda_id': moneda_id, 'moneda_ctz': moneda_ctz,
'cond_iva_receptor': cond_iva_receptor,
'act_codigos': act_codigos,
'concepto': concepto, 'fecha_hs_gen': fecha_hs_gen,
'cbtes_asoc': [],
'tributos': [],
Expand All @@ -171,6 +174,17 @@ def EstablecerCampoFactura(self, campo, valor):
return True
else:
return False

def AgregarPeriodoComprobantesAsociados(
self, fecha_desde=None, fecha_hasta=None, **kwargs
):
"Agrego el perído de comprobante asociado a una factura (interna)"
p_cmp_asoc = {
"fecha_desde": fecha_desde,
"fecha_hasta": fecha_hasta,
}
self.factura["periodo_cbtes_asoc"] = p_cmp_asoc
return True

def AgregarCmpAsoc(self, tipo=1, pto_vta=0, nro=0, cuit=None, fecha=None, **kwarg):
"Agrego un comprobante asociado a una factura (interna)"
Expand Down Expand Up @@ -254,6 +268,13 @@ def CAESolicitar(self):
'FchVtoPago': f.get('fecha_venc_pago'),
'MonId': f['moneda_id'],
'MonCotiz': f['moneda_ctz'],
'CondicionIVAReceptorId': f['cond_iva_receptor'],
"PeriodoAsoc": {
"FchDesde": f["periodo_cbtes_asoc"].get("fecha_desde"),
"FchHasta": f["periodo_cbtes_asoc"].get("fecha_hasta"),
}
if "periodo_cbtes_asoc" in f
else None,
'CbtesAsoc': f['cbtes_asoc'] and [
{'CbteAsoc': {
'Tipo': cbte_asoc['tipo'],
Expand Down Expand Up @@ -290,6 +311,12 @@ def CAESolicitar(self):
'DocNro': comprador['doc_nro'],
'Porcentaje': comprador['porcentaje'],
}} for comprador in f['compradores']] or None,
**({'Actividades': [
{'Actividad': {
'Id': actividad_id,
}}
for actividad_id in f['act_codigos']
]} if f['act_codigos'] else {})
}
}]
})
Expand Down Expand Up @@ -392,6 +419,7 @@ def CompConsultar(self, tipo_cbte, punto_vta, cbte_nro, reproceso=False):
'FchVtoPago': f.get('fecha_venc_pago'),
'MonId': f['moneda_id'],
'MonCotiz': float(f['moneda_ctz']),
'CondicionIVAReceptorId': f['cond_iva_receptor'],
'CbtesAsoc': [
{'CbteAsoc': {
'Tipo': cbte_asoc['tipo'],
Expand Down Expand Up @@ -428,6 +456,12 @@ 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_id,
}}
for actividad_id in f['act_codigos']
]} if f['act_codigos'] else {})
}
verifica(verificaciones, resultget.copy(), difs)
if difs:
Expand Down Expand Up @@ -455,6 +489,10 @@ def CompConsultar(self, tipo_cbte, punto_vta, cbte_nro, reproceso=False):
'fecha_venc_pago': resultget.get('FchVtoPago'),
'moneda_id': resultget.get('MonId'),
'moneda_ctz': resultget.get('MonCotiz'),
'cond_iva_receptor': resultget.get('CondicionIVAReceptorId'),
'act_codigos': [
actividad['Actividad']['Id']
for actividad in resultget.get('Actividades', [])],
'cbtes_asoc': [
{
'tipo': cbte_asoc['CbteAsoc']['Tipo'],
Expand Down Expand Up @@ -574,6 +612,7 @@ def CAESolicitarX(self):
'FchVtoPago': f.get('fecha_venc_pago'),
'MonId': f['moneda_id'],
'MonCotiz': f['moneda_ctz'],
'CondicionIVAReceptorId': f['cond_iva_receptor'],
'CbtesAsoc': [
{'CbteAsoc': {
'Tipo': cbte_asoc['tipo'],
Expand Down Expand Up @@ -604,6 +643,12 @@ def CAESolicitarX(self):
'Id': opcional['opcional_id'],
'Valor': opcional['valor'],
}} for opcional in f['opcionales']] or None,
**({'Actividades': [
{'Actividad': {
'Id': actividad_id,
}}
for actividad_id in f['act_codigos']
]} if f['act_codigos'] else {})
}
} for f in self.facturas]
})
Expand Down Expand Up @@ -763,6 +808,7 @@ def CAEARegInformativo(self):
'FchVtoPago': f.get('fecha_venc_pago'),
'MonId': f['moneda_id'],
'MonCotiz': f['moneda_ctz'],
'CondicionIVAReceptorId': f['cond_iva_receptor'],
'CbtesAsoc': [
{'CbteAsoc': {
'Tipo': cbte_asoc['tipo'],
Expand Down Expand Up @@ -798,6 +844,12 @@ def CAEARegInformativo(self):
}} for opcional in f['opcionales']] or None,
'CAEA': f['caea'],
'CbteFchHsGen': f.get('fecha_hs_gen'),
**({'Actividades': [
{'Actividad': {
'Id': actividad_id,
}}
for actividad_id in f['act_codigos']
]} if f['act_codigos'] else {})
}
}]
})
Expand Down Expand Up @@ -1122,6 +1174,9 @@ def main():
wsfev1.AgregarComprador(80, "30500010912", 99.99)
wsfev1.AgregarComprador(80, "30999032083", 0.01)

act_codes = [883101, 883102]
wsfev1.EstablecerCampoFactura("act_codigos", act_codes)

# datos de Factura de Crédito Electrónica MiPyMEs (FCE):
if '--fce' in sys.argv:
wsfev1.AgregarOpcional(2101, "2850590940090418135201") # CBU
Expand Down Expand Up @@ -1220,8 +1275,10 @@ def main():
p_assert_eq(wsfev1.ObtenerTagXml('CbteFch'), wsfev1.FechaCbte)
p_assert_eq(wsfev1.ObtenerTagXml('MonId'), "PES")
p_assert_eq(wsfev1.ObtenerTagXml('MonCotiz'), "1")
p_assert_eq(wsfev1.ObtenerTagXml('CondicionIVAReceptorId'), "1")
p_assert_eq(wsfev1.ObtenerTagXml('DocTipo'), "80")
p_assert_eq(wsfev1.ObtenerTagXml('DocNro'), "30500010912")
p_assert_eq(wsfev1.ObtenerTagXml('Actividades', 'Actividad', 0, 'Id'), "883101")

if "--parametros" in sys.argv:
import codecs
Expand Down