Error en algunas facturas al imprimir

Buenas a todos los presente,

Solo sucede con algunas de las facturas, la mayoría están bien y la función de impresión se hace limpia y correctamente, pero en unas pocas me ha surgido este error no logro ver a que se debe, al parecer es un campo en la data del Tercero que no esta en su sitio ó no corresponde al mismo.

Traceback (most recent call last):
  File "/site-packages/genshi/template/eval.py", line 318, in lookup_attr
    val = getattr(obj, key)
AttributeError: 'NoneType' object has no attribute 'type_string'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/site-packages/genshi/template/eval.py", line 324, in lookup_attr
    val = obj[key]
TypeError: 'NoneType' object is not subscriptable

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/site-packages/trytond/wsgi.py", line 109, in dispatch_request
    return endpoint(request, **request.view_args)
  File "/site-packages/trytond/protocols/dispatcher.py", line 48, in rpc
    request, database_name, *request.rpc_params)
  File "/site-packages/trytond/wsgi.py", line 77, in auth_required
    return wrapped(*args, **kwargs)
  File "/site-packages/trytond/protocols/wrappers.py", line 131, in wrapper
    return func(request, pool, *args, **kwargs)
  File "/site-packages/trytond/protocols/dispatcher.py", line 181, in _dispatch
    result = rpc.result(meth(*c_args, **c_kwargs))
  File "/site-packages/trytond/modules/account_invoice/invoice.py", line 2570, in execute
    result = super(InvoiceReport, cls).execute(ids, data)
  File "/site-packages/trytond/report/report.py", line 204, in execute
    oext, content = cls._execute(records, data, action_report)
  File "/site-packages/trytond/modules/account_invoice/invoice.py", line 2546, in _execute
    result = super(InvoiceReport, cls)._execute(records, data, action)
  File "/site-packages/trytond/report/report.py", line 212, in _execute
    return cls.convert(action, cls.render(action, report_context))
  File "/site-packages/trytond/modules/account_invoice/invoice.py", line 2563, in render
    return super().render(*args, **kwargs)
  File "/site-packages/trytond/report/report.py", line 314, in render
    data = rel_report(**report_context).render()
  File "/site-packages/relatorio/templates/base.py", line 35, in render
    self.events, method=method, encoding=encoding, out=out)
  File "/site-packages/relatorio/templates/opendocument.py", line 1179, in __call__
    self.xml_serializer(writer(stream)), encoding=encoding, out=writer)
  File "/site-packages/genshi/output.py", line 58, in encode
    for chunk in iterator:
  File "/site-packages/genshi/output.py", line 241, in __call__
    for kind, data, pos in stream:
  File "/site-packages/genshi/output.py", line 671, in __call__
    for kind, data, pos in stream:
  File "/site-packages/genshi/output.py", line 776, in __call__
    for kind, data, pos in chain(stream, [(None, None, None)]):
  File "/site-packages/genshi/output.py", line 596, in __call__
    for ev in stream:
  File "/site-packages/relatorio/templates/opendocument.py", line 1071, in __call__
    for kind, data, pos in stream:
  File "/site-packages/genshi/core.py", line 292, in _ensure
    for event in stream:
  File "/site-packages/genshi/filters/i18n.py", line 691, in __call__
    for kind, data, pos in stream:
  File "/site-packages/genshi/template/base.py", line 638, in _include
    for event in stream:
  File "/site-packages/genshi/template/markup.py", line 327, in _match
    for event in stream:
  File "/site-packages/genshi/template/base.py", line 598, in _flatten
    result = _eval_expr(data, ctxt, vars)
  File "/site-packages/genshi/template/base.py", line 289, in _eval_expr
    retval = expr.evaluate(ctxt)
  File "/site-packages/genshi/template/eval.py", line 178, in evaluate
    return eval(self.code, _globals, {'__data__': data})
  File "<string>", line 1, in <Expression '__relatorio_escape_invalid_chars(invoice.party_tax_identifier.type_string)'>
  File "/site-packages/genshi/template/eval.py", line 326, in lookup_attr
    val = cls.undefined(key, owner=obj)
  File "/site-packages/genshi/template/eval.py", line 414, in undefined
    raise UndefinedError(key, owner=owner)
genshi.template.eval.UndefinedError: None has no member named "type_string"

Fault: None has no member named "type_string"

Gracias por sus comentarios y sugerencias

Salads @eleazar, es posible que los terceros de esas facturas que tienen error no tienen asignado un tipo de identificador y/o identificador, y en el documento .fodt o .odt que usas quizas lo tienes como requerido…

Buenas te falta aclarar en algunos clientes cual es su identificador de impuestos. Y en el reporte tiene como requisito el mismo

Agradecido a ambos esa es la respuesta correcta, falta el identificador de algunos proveedores y eso se exige en la factura al imprimir. en mi caso e RIF (Registro de Información Fiscal) de la empresa

Después de algunos días dándole vueltas al asunto, me surge la duda de porque el sistema no coloca un string en blanco en vez de lanzar ese error? quizás algo mas sutil seria un aviso de que falta y permitir que la factura se pueda imprimir con el valor en blanco del identificador ó en su defecto con un texto de falta identificador.

No se si es un bug ó duplicidad de data, políticas de sistema, pero la lógica no me ayuda mucho. Si ya se há modificado el Tercero se inlcuiyó el dato faltante, no entiendo porque NO es posible la impresión de la factura, esto me genera una duda existencial, ya que eso significa que la data para la impresión no se genera buscando en la tabla de terceros sino de otra para las facturas, de ser así que puedo hacer para reparar el daño y poder imprimir dichas facturas sin recurrir a la forma manual.

saludos @eleazar que error te esta mostrando ahora?

I think you are just a victim of the archive of the report of posted invoice. When an invoice is posted, Tryton archives the report result and deliver it for any further print request. This is to ensure to always return the exact same invoice over time (as required by most legislation).

1 Like

El mismo error inicial, no esta el identificador.

Eso es el deber ser, siempre y cuando todos los datos exigidos en la factura sean validados como existentes, en caso contrario se esperaría un no se puede continuar hasta tener el dato faltante, quizás un texto haciendo referencia al campo necesario para poder validar e imprimir, otra opción sería colocar un texto en esa factura en el lugar donde se requiere el dato indicando que es necesario actualizar la data del Tercero permitiendo la impresión, pero hasta ahora solo arroja un error de sistema que no deja imprimir la factura, esto para un usuario común y silvestre eso es hablarle en idioma wayú o en binario.

The error you got comes from your customization. The standard invoice report tests that there is a party_tax_identifier before using it.

Saludos @eleazar como dijo @ced es posible que el problema sea la información del reporte que ya esta guardada, por lo que deberas ejecutar el siguiente comando en tu base de datos:

UPDATE account_invoice SET invoice_report_cache=NULL;

prueba y a la espera de saber los resultados …

Gracias por estar atentos @joseagrc @ced , he realizado tal como indicas el:

psql -U postgres base_de_datos

una vez alli ejecuto el comando tal como lo describes y obtengo esto:

UPDATE account_invoice SET invoice_report_cache=NULL;
UPDATE 185

Pero al reiniciar el postgresql y tryton aun sigo obteniendo como resultado:

Traceback (most recent call last):
File “/site-packages/genshi/template/eval.py”, line 318, in lookup_attr
val = getattr(obj, key)
AttributeError: ‘NoneType’ object has no attribute ‘type_string’

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File “/site-packages/genshi/template/eval.py”, line 324, in lookup_attr
val = obj[key]
TypeError: ‘NoneType’ object is not subscriptable

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File “/site-packages/trytond/wsgi.py”, line 110, in dispatch_request
return endpoint(request, **request.view_args)
File “/site-packages/trytond/protocols/dispatcher.py”, line 47, in rpc
return methods.get(request.rpc_method, _dispatch)(
File “/site-packages/trytond/wsgi.py”, line 77, in auth_required
return wrapped(*args, **kwargs)
File “/site-packages/trytond/protocols/wrappers.py”, line 131, in wrapper
return func(request, pool, *args, **kwargs)
File “/site-packages/trytond/protocols/dispatcher.py”, line 181, in _dispatch
result = rpc.result(meth(*c_args, **c_kwargs))
File “/site-packages/trytond/modules/account_invoice/invoice.py”, line 2570, in execute
result = super(InvoiceReport, cls).execute(ids, data)
File “/site-packages/trytond/report/report.py”, line 204, in execute
oext, content = cls._execute(records, data, action_report)
File “/site-packages/trytond/modules/account_invoice/invoice.py”, line 2546, in _execute
result = super(InvoiceReport, cls)._execute(records, data, action)
File “/site-packages/trytond/report/report.py”, line 212, in _execute
return cls.convert(action, cls.render(action, report_context))
File “/site-packages/trytond/modules/account_invoice/invoice.py”, line 2563, in render
return super().render(*args, **kwargs)
File “/site-packages/trytond/report/report.py”, line 314, in render
data = rel_report(**report_context).render()
File “/site-packages/relatorio/templates/base.py”, line 34, in render
return self.serializer(
File “/site-packages/relatorio/templates/opendocument.py”, line 1178, in call
output_encode(
File “/site-packages/genshi/output.py”, line 58, in encode
for chunk in iterator:
File “/site-packages/genshi/output.py”, line 241, in call
for kind, data, pos in stream:
File “/site-packages/genshi/output.py”, line 671, in call
for kind, data, pos in stream:
File “/site-packages/genshi/output.py”, line 776, in call
for kind, data, pos in chain(stream, [(None, None, None)]):
File “/site-packages/genshi/output.py”, line 596, in call
for ev in stream:
File “/site-packages/relatorio/templates/opendocument.py”, line 1071, in call
for kind, data, pos in stream:
File “/site-packages/genshi/core.py”, line 292, in _ensure
for event in stream:
File “/site-packages/genshi/filters/i18n.py”, line 691, in call
for kind, data, pos in stream:
File “/site-packages/genshi/template/base.py”, line 638, in _include
for event in stream:
File “/site-packages/genshi/template/markup.py”, line 327, in _match
for event in stream:
File “/site-packages/genshi/template/base.py”, line 598, in _flatten
result = _eval_expr(data, ctxt, vars)
File “/site-packages/genshi/template/base.py”, line 289, in _eval_expr
retval = expr.evaluate(ctxt)
File “/site-packages/genshi/template/eval.py”, line 178, in evaluate
return eval(self.code, _globals, {‘data’: data})
File “”, line 1, in <Expression ‘__relatorio_escape_invalid_chars(invoice.party_tax_identifier.type_string)’>
File “/site-packages/genshi/template/eval.py”, line 326, in lookup_attr
val = cls.undefined(key, owner=obj)
File “/site-packages/genshi/template/eval.py”, line 414, in undefined
raise UndefinedError(key, owner=owner)
genshi.template.eval.UndefinedError: None has no member named “type_string”

Fault: None has no member named “type_string”

Of course you still have error on your buggy template. Fix the template in order to not use party_tax_identifier if there are none.

By the way I hope it is not a production database because you just cleared the cache of all posted invoices.

El update era para que no mostrará la factura “guardada” y contabilizada, sino que generará un nuevo PDF desde la base de datos.

Lo que debes hacer es ir al reporte y quitar esa variable que viene en None para que no salga más el error, o poner un if para asegurarte que tenga valor tal como lo siguiente CED arriba .

He aprendido de los errores, antes de hacer cualquier movimiento hago un backup :grin: eso me ha salvado muchas horas de trabajo ja ja ja ja ja.

Totalmente de acuerdo, error de mi parte, buscando en el formato de ODT me percate de que omiti el IF y no hacia la validación necesaria, ahora si esta resuelto.

Mi Error:

if test="invoice.party_tax_identifier"
/if
<invoice.party_tax_identifier.type_string>RIF: <invoice.party_tax_identifier.code>

Lo correcto:

if test="invoice.party_tax_identifier"
<invoice.party_tax_identifier.type_string>RIF: <invoice.party_tax_identifier.code>
/if

Deje fuera del IF la validación.

Disculpas a todos por mi gran error, agradecido por la paciencia y amabilidad al responder, como dijo Cédrik fue mi personalización quien dejo fuera la validación, una vez corregido el error se muestran todas las factura con ó sin el identificador fiscal.

que bueno @eleazar que lo hayas solucionado el inconveniente, por eso te comente en mi primer mensaje que el error era en el documento .fodt o .odt …

sigue bien!!