commit f800728f890dc6dffede476fc91f0e96d923fab0 Author: Jorge E. Gomez Date: Wed Jun 2 19:32:37 2021 -0500 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7aa4f3b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +firma_factura.png diff --git a/README.md b/README.md new file mode 100644 index 0000000..8e8f11f --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +# Modificar vistas Odoo v14 + +Estos programas modifican las vistas de Odoo (modelo `ir.ui.view`), +utilizando las propiedades de herencia entre vistas para ocultar campos, +o añadir restricciones sobre los mismos. + +Aplica también para la modificación de formatos impresos PDF. + diff --git a/_firma_factura.png b/_firma_factura.png new file mode 100644 index 0000000..3d0a95c Binary files /dev/null and b/_firma_factura.png differ diff --git a/account.move-agofer_e_invoice.py b/account.move-agofer_e_invoice.py new file mode 100755 index 0000000..04e1737 --- /dev/null +++ b/account.move-agofer_e_invoice.py @@ -0,0 +1,176 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +"""Modifica el formato QWeb de facturas y devoluciones.""" +import os +import sys +import base64 +import erppeek + +def stringifyImage(archivo): + """Convierte archivo en el mismo directorio a una cadena en base64.""" + with open(os.path.join(__location__, archivo), 'rb') as f: + img = base64.b64encode(f.read()).decode('ascii') + return img + +def use_local_resources(): + """Facilita usar recursos en el mismo directorio del script.""" + global __location__ + __location__ = os.path.realpath( + os.path.join(os.getcwd(), os.path.dirname(__file__))) + +def replace_extid(objeto, modelo, nuevo_extid): + """Reemplaza el id externo de un objeto.""" + if objeto._external_id == nuevo_extid: + return + id_extid = odoo.model('ir.model.data').get( + [('model', '=', modelo), ('res_id', '=', objeto.id)]) + if id_extid: + try: + id_extid.unlink() + except: + xt, xc, tb = sys.exc_info() + xm = ''.join(erppeek.format_exception(xt, xc, tb, chain=False)) + print('### Error\n' + (xm.strip())) + try: + objeto._set_external_id(nuevo_extid) + print('{} (#{}) -> {}'.format(objeto.name, objeto.id, nuevo_extid)) + except: + xt, xc, tb = sys.exc_info() + xm = ''.join(erppeek.format_exception(xt, xc, tb, chain=False)) + print('### Error\n' + (xm.strip())) + return + +def main(): + odoo = erppeek.Client.from_config('Odoo14_6c60') + context = {'lang':'es_CO'} + + """Por ahora, desactivar (manualmente) + account_extended.report_invoice_document_agofer. + """ + + views = odoo.model('ir.ui.view') + baseid = 'account.report_invoice_document' + viewname = 'report.invoice.factura_o_devolucion_agofer' + viewextid = 'agofer_view.factura_o_devolucion' + + reports = odoo.model('ir.actions.report') + repextid = 'account.account_invoices' + + papers = odoo.model('report.paperformat') + papextid = 'agofer_paper.factura_carta' + papextid_base = 'base.paperformat_us' + + attachments = odoo.model('ir.attachment') + attextid_ff = 'agofer_adjunto.firma_factura' + attextid_iw = 'agofer_adjunto.icono_whatsapp' + + vista_base = views.get(baseid) + assert vista_base.name == 'report_invoice_document' + reporte = open(os.path.join(__location__, + 'factura_o_devolucion_v14.xml')).read() + + formato_carta = papers.get(papextid_base) + + destino_arch = """ + + + {} + + + """.format(viewname,baseid,reporte) + + viewvalues = { + 'active': True, + 'inherit_id': vista_base.id, + 'mode': 'extension', + 'name': viewname, + 'priority': 15, + 'type': 'qweb', + } + repvalues = { + 'name': 'Factura/Devolución', + 'attachment': False, + 'attachment_use': False, + 'report_type': 'qweb-html', + } + papvalues = { + 'name': 'Tamaño carta para factura', + 'dpi': 120, + 'format': 'Letter', + 'header_line': False, + 'header_spacing': 33, + 'margin_bottom': 17, + 'margin_left': 7, + 'margin_right': 7, + 'margin_top': 43, + 'orientation': 'Portrait', + 'page_height': 0, + 'page_width': 0, + } + attvalues_ff = { + 'datas': stringifyImage('firma_factura.png'), + 'store_fname': 'firma_factura.png', + 'db_datas': False, + 'description': False, + 'index_content': 'image', + 'mimetype': 'image/png', + 'name': 'firma_factura.png', + 'res_id': 0, + 'res_model': 'ir.ui.view', + 'type': 'binary', + } + attvalues_iw = { + 'datas': stringifyImage('WhatsApp_Number.png'), + 'store_fname': 'WhatsApp_Number.png', + 'db_datas': False, + 'description': False, + 'index_content': 'image', + 'mimetype': 'image/png', + 'name': 'WhatsApp_Number.png', + 'res_id': 0, + 'res_model': 'ir.ui.view', + 'type': 'binary', + } + + adjunto_ff = attachments.get(attextid_ff) + if adjunto_ff: + adjunto_ff.write(attvalues_ff) + else: + adjunto_ff = attachments.create(attvalues_ff) + adjunto_ff._set_external_id(attextid_ff) + #destino_arch = destino_arch.replace('firmaurl', adjunto_ff.website_url) + viewvalues['arch'] = destino_arch + + adjunto_iw = attachments.get(attextid_iw) + if adjunto_iw: + adjunto_iw.write(attvalues_iw) + else: + adjunto_iw = attachments.create(attvalues_iw) + adjunto_iw._set_external_id(attextid_iw) + viewvalues['arch'] = destino_arch + + destino_vista = views.get(viewextid) + if destino_vista: + destino_vista.write(viewvalues) + else: + destino_vista = views.create(viewvalues) + destino_vista._set_external_id(viewextid) + + paper = papers.get(papextid) + if paper: + paper.write(papvalues) + else: + paper = papers.create(papvalues) + paper._set_external_id(papextid) + repvalues['paperformat_id'] = paper.id + + # Asegurarse que el nombre de la Cedula de Ciudadania este abreviado: + # cc_extid = 'partner_extended_co.partner_co_document_type_CC' + # odoo.model('res.document.type').get(cc_extid).name = 'CC' + + reports.get(repextid).write(repvalues) + +if __name__ == "__main__": + use_local_resources() + main() + diff --git a/factura_o_devolucion_v14.xml b/factura_o_devolucion_v14.xml new file mode 100644 index 0000000..1e28b6d --- /dev/null +++ b/factura_o_devolucion_v14.xml @@ -0,0 +1,441 @@ + + + + + + Factura electrónica de venta + Factura borrador + Factura anulada + + Devolución + Devolución borrador + Devolución anulada + + Devolución de proveedor + + Soporte en adquisición efectuada a no-obligados a facturar + Factura de proveedor + + + +
+
+
+
+
+

+ + + +

+
+
+

+ Fecha: + + +

+

+ Fecha de vencimiento: + +

+
+
+

+ Condición de pago: + +

+

+ + Términos de negociación: + + : + + + +

+
+
+
+
+
+
+ + +
+
+ +
+
+
+
+ + +
+

+

+ +
+
+
+
+

+ +   + + + + + + – + + + +

+
+
+
+
+
+
Dirección:
+
Dirección de facturación:
+
+
+

+ +

+ +

+ , + +

+

+ + +

+

+ + +

+
+
+
+
+
+
+ Dirección de envío: +
+
+ Dirección de recepción: +
+

+ +

+ +

+ , + +

+

+ + +

+

+ +

+ +
+
+
+
+
+
+
+

+ Agofer S.A.S. NIT 800.216.499–1 : +

+
    +
  • + + Autorretenedor Res. №0010 1994-02-11 +
  • +
  • + + Gran contribuyente Res.DIAN №9061 2020-12-10 +
  • +
  • + + Régimen Común y Agente Retenedor de IVA +
  • +
  • + + Actividad Económica CIIU 4752 +
  • + + +
  • + + +
  • +
    +
    +
+ WhatsApp 310 674 4444 +
+
+ + +
+
+ Peso teórico total: +

+ + kg +

+
+
+ Source: +

+

+
+ Customer Code: +

+

+
+ Reference: +

+

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DescriptionQuantityUnit Price + Disc.% + Taxes + Amount + Total Price +
+ + + + + + + + + + + + + + + + + + + + +
+ Subtotal + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Subtotal + +
+ + + + on + + + + +
Total + +
+ Paid on + + +
Amount Due + +
+
+
+
+
+
+
+

+ + Ésta es una representación gráfica + de la factura electrónica, que para todos sus + efectos cumple con lo dispuesto en el + Art. 774 del Código de Comercio, y en el + Decreto 2242 de 2015. + + + Esta factura cumple, para todos sus + efectos, con lo dispuesto en el + Art. 774 del Código de Comercio. + + Las mercancías viajan por cuenta y riesgo del comprador + salvo estipulación al contrario en esta misma factura. + Solo se aceptan devoluciones dentro de los + diez días calendario siguientes a la recepción de + la mercancía, conforme al Art. 2 de la + Ley 1231 de 2008, y no se aceptan reclamos + después de diez días de recibida la factura. + Esta factura causará intereses moratorios a la tasa + máxima permitida por la ley, a partir de la fecha de + vencimiento. + Se hace constar que la firma de una persona distinta al + comprador indica que dicha persona se encuentra + autorizada expresamente por el comprador para recibir + la mercancía y firmar el documento como dependiente + suyo, acorde al Art. 640 del Código de Comercio. + Firmada la presente, el cliente autoriza a ser + consultado y reportado en bases de datos y + centrales de riesgos, y confirma la autorización + dada a Agofer para almacenar y tratar sus datos + personales según la Ley 1581 de 2012. + La celebración del presente contrato se realiza + únicamente en las jurisdicciones donde Agofer está + matriculado ante cámara de comercio. Todo + material es entregado al cliente en las instalaciones + de Agofer. La actividad de transporte de mercancías no + es ejecutada por Agofer: es asumida por el cliente a + través de terceros no vinculados a la Compañía. + Este documento es prueba de la negociación + realizada entre el cliente y Agofer S.A.S. en la + jurisdicción de . + El cierre de esta venta es realizado únicamente por el + personal autorizado en nuestra sucursal en dicha ciudad. +

+
+
+
+

+ Please use the following communication for your payment : +

+

+ +

+

+ +

+

+ +

+

+ Incoterm: - +

+
+

+ Scan me with your banking app.

+ +

+
+
+
+