UBL-Support email_attach

develop
Andreas Osim 2025-02-25 10:11:24 +01:00
parent 8f63a88ec2
commit 89161015b1
19 changed files with 906 additions and 0 deletions

View File

@ -0,0 +1,89 @@
====================================
Account Invoice UBL Email Attachment
====================================
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fedi-lightgray.png?logo=github
:target: https://github.com/OCA/edi/tree/11.0/account_invoice_ubl_email_attachment
:alt: OCA/edi
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/edi-11-0/edi-11-0-account_invoice_ubl_email_attachment
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/226/11.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
With module `Account Invoice UBL`, when sending an invoice by mail, only the PDF file is attached to the email and the UBL (XML) file is embedded inside the PDF.
Some accounting software cannot read the embedded XML from a PDF, so the import is only possible by manually generating the XML file.
With this module, when sending an invoice by mail, also the UBL file is automatically included, so that 2 attachments (PDF and XML) are present in the invoice mail.
**Table of contents**
.. contents::
:local:
Configuration
=============
- Go to menu *Invoicing > Configuration > Settings > Invoicing*, under *Electronic Invoices*.
- Check the value of *Include UBL XML in Invoice Email*, set to `True` if you want to include
the UBL XML in the attachments when sending the invoice by email.
Usage
=====
In the invoice form click on button `Send & Print`.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/edi/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
`feedback <https://github.com/OCA/edi/issues/new?body=module:%20account_invoice_ubl_email_attachment%0Aversion:%2011.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* Onestein
Contributors
~~~~~~~~~~~~
* Andrea Stirpe <a.stirpe@onestein.nl>
Maintainers
~~~~~~~~~~~
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
This module is part of the `OCA/edi <https://github.com/OCA/edi/tree/11.0/account_invoice_ubl_email_attachment>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View File

@ -0,0 +1,3 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from . import models

View File

@ -0,0 +1,19 @@
# Copyright 2019 Onestein (<https://www.onestein.eu>)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
{
'name': 'Account Invoice UBL Email Attachment',
'summary': 'Automatically adds the UBL file to the email.',
'version': '11.0.1.0.1',
'category': 'Accounting & Finance',
'author': 'Onestein, Odoo Community Association (OCA)',
'website': 'https://github.com/OCA/edi/',
'license': 'AGPL-3',
'depends': [
'account_invoice_ubl'
],
'data': [
'views/res_config_settings.xml',
],
'installable': True,
}

View File

@ -0,0 +1,52 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_invoice_ubl_email_attachment
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: account_invoice_ubl_email_attachment
#: model:ir.model,name:account_invoice_ubl_email_attachment.model_res_company
msgid "Companies"
msgstr ""
#. module: account_invoice_ubl_email_attachment
#: model:ir.model,name:account_invoice_ubl_email_attachment.model_mail_template
msgid "Email Templates"
msgstr ""
#. module: account_invoice_ubl_email_attachment
#: model:ir.model.fields,help:account_invoice_ubl_email_attachment.field_res_company_include_ubl_attachment_in_invoice_email
#: model:ir.model.fields,help:account_invoice_ubl_email_attachment.field_res_config_settings_include_ubl_attachment_in_invoice_email
msgid "If active, the UBL Invoice XML file will be included in the attachments when sending the invoice by email."
msgstr ""
#. module: account_invoice_ubl_email_attachment
#: model:ir.model.fields,field_description:account_invoice_ubl_email_attachment.field_res_company_include_ubl_attachment_in_invoice_email
#: model:ir.model.fields,field_description:account_invoice_ubl_email_attachment.field_res_config_settings_include_ubl_attachment_in_invoice_email
msgid "Include UBL XML in Invoice Email"
msgstr ""
#. module: account_invoice_ubl_email_attachment
#: model:ir.ui.view,arch_db:account_invoice_ubl_email_attachment.view_account_config_settings
msgid "Include the UBL XML in the attachments when sending the invoice by email."
msgstr ""
#. module: account_invoice_ubl_email_attachment
#: model:ir.model,name:account_invoice_ubl_email_attachment.model_account_invoice
msgid "Invoice"
msgstr ""
#. module: account_invoice_ubl_email_attachment
#: model:ir.model,name:account_invoice_ubl_email_attachment.model_res_config_settings
msgid "res.config.settings"
msgstr ""

View File

@ -0,0 +1,62 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_invoice_ubl_email_attachment
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-01 15:01+0000\n"
"PO-Revision-Date: 2019-05-01 17:03+0200\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.2.1\n"
#. module: account_invoice_ubl_email_attachment
#: model:ir.model,name:account_invoice_ubl_email_attachment.model_res_company
#, fuzzy
msgid "Companies"
msgstr "Bedrijf"
#. module: account_invoice_ubl_email_attachment
#: model:ir.model,name:account_invoice_ubl_email_attachment.model_mail_template
msgid "Email Templates"
msgstr "E-mail-sjablonen"
#. module: account_invoice_ubl_email_attachment
#: model:ir.model.fields,help:account_invoice_ubl_email_attachment.field_res_company_include_ubl_attachment_in_invoice_email
#: model:ir.model.fields,help:account_invoice_ubl_email_attachment.field_res_config_settings_include_ubl_attachment_in_invoice_email
msgid ""
"If active, the UBL Invoice XML file will be included in the attachments when "
"sending the invoice by email."
msgstr ""
"Wanneer actief, wordt het UBL factuur XML bestand toegevoegd aan de bijlages "
"bij het versturen van de factuur per e-mail."
#. module: account_invoice_ubl_email_attachment
#: model:ir.model.fields,field_description:account_invoice_ubl_email_attachment.field_res_company_include_ubl_attachment_in_invoice_email
#: model:ir.model.fields,field_description:account_invoice_ubl_email_attachment.field_res_config_settings_include_ubl_attachment_in_invoice_email
msgid "Include UBL XML in Invoice Email"
msgstr "Voeg UBL XML toe aan factuur e-mail"
#. module: account_invoice_ubl_email_attachment
#: model:ir.ui.view,arch_db:account_invoice_ubl_email_attachment.view_account_config_settings
msgid ""
"Include the UBL XML in the attachments when sending the invoice by email."
msgstr ""
"Voeg de UBL XML toe aan de bijlages bij het versturen van factuur per e-mail."
#. module: account_invoice_ubl_email_attachment
#: model:ir.model,name:account_invoice_ubl_email_attachment.model_account_invoice
msgid "Invoice"
msgstr "Factuur"
#. module: account_invoice_ubl_email_attachment
#: model:ir.model,name:account_invoice_ubl_email_attachment.model_res_config_settings
msgid "res.config.settings"
msgstr "res.config.settings"

View File

@ -0,0 +1,6 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from . import account_invoice
from . import mail_template
from . import res_company
from . import res_config_settings

View File

@ -0,0 +1,35 @@
# Copyright 2019 Onestein (<https://www.onestein.eu>)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
import base64
from odoo import models
class AccountInvoice(models.Model):
_inherit = 'account.invoice'
def action_invoice_sent(self):
action = super(AccountInvoice, self).action_invoice_sent()
if self.company_id.include_ubl_attachment_in_invoice_email:
action['context']['attach_ubl_xml_file'] = True
return action
def _generate_email_ubl_attachment(self):
self.ensure_one()
attachments = self.env['ir.attachment']
if self.type not in ('out_invoice', 'out_refund'):
return attachments
if self.state not in ('open', 'paid'):
return attachments
version = self.get_ubl_version()
ubl_filename = self.get_ubl_filename(version=version)
xml_string = self.generate_ubl_xml_string(version=version)
return self.env['ir.attachment'].with_context({}).create({
'name': ubl_filename,
'res_model': str(self._name),
'res_id': self.id,
'datas': base64.b64encode(xml_string),
'datas_fname': ubl_filename,
'type': 'binary',
})

View File

@ -0,0 +1,36 @@
# Copyright 2019 Onestein (<https://www.onestein.eu>)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import api, models
class MailTemplate(models.Model):
_inherit = 'mail.template'
@api.multi
def generate_email(self, res_ids, fields=None):
res = super(MailTemplate, self).generate_email(res_ids, fields)
if not self.env.context.get('attach_ubl_xml_file'):
return res
for res_id, template in self.get_email_template(res_ids).items():
invoice = self.env['account.invoice'].browse(res_id)
version = invoice.get_ubl_version()
ubl_filename = invoice.get_ubl_filename(version=version)
ubl_attachments = self.env['ir.attachment'].search([
('res_model', '=', 'account.invoice'),
('res_id', '=', res_id),
('datas_fname', '=', ubl_filename)
], order='create_date desc', limit=1)
if not ubl_attachments:
ubl_attachments = invoice._generate_email_ubl_attachment()
if len(ubl_attachments) == 1 and template.report_name:
report_name = self.render_template(
template.report_name, template.model, res_id)
ext = '.xml'
if not report_name.endswith(ext):
report_name += ext
attachments = [(report_name, ubl_attachments.datas)]
else:
attachments = [(a.name, a.datas) for a in ubl_attachments]
res[res_id]['attachments'] += attachments
return res

View File

@ -0,0 +1,14 @@
# Copyright 2019 Onestein (<https://www.onestein.eu>)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import fields, models
class ResCompany(models.Model):
_inherit = 'res.company'
include_ubl_attachment_in_invoice_email = fields.Boolean(
string='Include UBL XML in Invoice Email',
help="If active, the UBL Invoice XML file will be included "
"in the attachments when sending the invoice by email."
)

View File

@ -0,0 +1,13 @@
# Copyright 2019 Onestein (<https://www.onestein.eu>)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import fields, models
class ResConfigSettings(models.TransientModel):
_inherit = 'res.config.settings'
include_ubl_attachment_in_invoice_email = fields.Boolean(
related='company_id.include_ubl_attachment_in_invoice_email',
readonly=False
)

View File

@ -0,0 +1,3 @@
- Go to menu *Invoicing > Configuration > Settings > Invoicing*, under *Electronic Invoices*.
- Check the value of *Include UBL XML in Invoice Email*, set to `True` if you want to include
the UBL XML in the attachments when sending the invoice by email.

View File

@ -0,0 +1 @@
* Andrea Stirpe <a.stirpe@onestein.nl>

View File

@ -0,0 +1,5 @@
With module `Account Invoice UBL`, when sending an invoice by mail, only the PDF file is attached to the email and the UBL (XML) file is embedded inside the PDF.
Some accounting software cannot read the embedded XML from a PDF, so the import is only possible by manually generating the XML file.
With this module, when sending an invoice by mail, also the UBL file is automatically included, so that 2 attachments (PDF and XML) are present in the invoice mail.

View File

@ -0,0 +1 @@
In the invoice form click on button `Send & Print`.

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@ -0,0 +1,435 @@
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
<title>Account Invoice UBL Email Attachment</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: grey; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="account-invoice-ubl-email-attachment">
<h1 class="title">Account Invoice UBL Email Attachment</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/edi/tree/11.0/account_invoice_ubl_email_attachment"><img alt="OCA/edi" src="https://img.shields.io/badge/github-OCA%2Fedi-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/edi-11-0/edi-11-0-account_invoice_ubl_email_attachment"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/226/11.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p>With module <cite>Account Invoice UBL</cite>, when sending an invoice by mail, only the PDF file is attached to the email and the UBL (XML) file is embedded inside the PDF.</p>
<p>Some accounting software cannot read the embedded XML from a PDF, so the import is only possible by manually generating the XML file.</p>
<p>With this module, when sending an invoice by mail, also the UBL file is automatically included, so that 2 attachments (PDF and XML) are present in the invoice mail.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#configuration" id="id1">Configuration</a></li>
<li><a class="reference internal" href="#usage" id="id2">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id3">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id4">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id5">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id6">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id7">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="configuration">
<h1><a class="toc-backref" href="#id1">Configuration</a></h1>
<ul class="simple">
<li>Go to menu <em>Invoicing &gt; Configuration &gt; Settings &gt; Invoicing</em>, under <em>Electronic Invoices</em>.</li>
<li>Check the value of <em>Include UBL XML in Invoice Email</em>, set to <cite>True</cite> if you want to include
the UBL XML in the attachments when sending the invoice by email.</li>
</ul>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#id2">Usage</a></h1>
<p>In the invoice form click on button <cite>Send &amp; Print</cite>.</p>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id3">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/edi/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/edi/issues/new?body=module:%20account_invoice_ubl_email_attachment%0Aversion:%2011.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#id4">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id5">Authors</a></h2>
<ul class="simple">
<li>Onestein</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#id6">Contributors</a></h2>
<ul class="simple">
<li>Andrea Stirpe &lt;<a class="reference external" href="mailto:a.stirpe&#64;onestein.nl">a.stirpe&#64;onestein.nl</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id7">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/edi/tree/11.0/account_invoice_ubl_email_attachment">OCA/edi</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,3 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from . import test_ubl_email_attachment

View File

@ -0,0 +1,103 @@
# Copyright 2019 Onestein (<https://www.onestein.eu>)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo.tools import mute_logger
from odoo.tests.common import HttpCase
class TestUblInvoiceEmailAttachment(HttpCase):
def setUp(self):
super(TestUblInvoiceEmailAttachment, self).setUp()
partner = self.env.ref('base.res_partner_3')
product = self.env.ref('product.product_product_5')
acc_type_revenue = self.env.ref('account.data_account_type_revenue')
account = self.env['account.account'].search([
('user_type_id', '=', acc_type_revenue.id)
], limit=1)
invoice_line_data = [(0, 0, {
'product_id': product.id,
'quantity': 10.0,
'account_id': account.id,
'name': 'product test',
'price_unit': 100.00,
})]
self.invoice = self.env['account.invoice'].create({
'name': 'Test Customer Invoice',
'partner_id': partner.id,
'invoice_line_ids': invoice_line_data,
})
self.invoice.action_invoice_open()
action_invoice_sent = self.invoice.action_invoice_sent()
template_id = action_invoice_sent['context']['default_template_id']
self.composer_ctx = dict(
default_res_id=self.invoice.id,
default_use_template=bool(template_id),
default_composition_mode='comment',
mark_invoice_as_sent=True,
force_email=True
)
self.composer_vals = {
'attachment_ids': [],
'model': 'account.invoice',
'record_name': False,
'template_id': template_id,
}
def test_01_config(self):
"""Test configuration."""
company = self.env.user.company_id
conf = self.env['res.config.settings'].create({
'include_ubl_attachment_in_invoice_email': True
})
conf.set_values()
self.assertTrue(company.include_ubl_attachment_in_invoice_email)
conf.write({
'include_ubl_attachment_in_invoice_email': False
})
conf.set_values()
self.assertFalse(company.include_ubl_attachment_in_invoice_email)
@mute_logger("odoo.addons.base_ubl_payment.models.ubl")
def test_02_ubl_invoice_email_no_attachment(self):
conf = self.env['res.config.settings'].create({
'include_ubl_attachment_in_invoice_email': False
})
conf.set_values()
composer = self.env['mail.compose.message'].with_context(
self.composer_ctx).create(self.composer_vals)
self.assertFalse(composer.attachment_ids)
composer.onchange_template_id_wrapper()
self.assertTrue(composer.attachment_ids)
self.assertEqual(len(composer.attachment_ids), 1)
@mute_logger("odoo.addons.base_ubl_payment.models.ubl")
def test_03_ubl_invoice_email_no_attachment(self):
conf = self.env['res.config.settings'].create({
'include_ubl_attachment_in_invoice_email': True
})
conf.set_values()
composer = self.env['mail.compose.message'].with_context(
self.composer_ctx).create(self.composer_vals)
self.assertFalse(composer.attachment_ids)
composer.onchange_template_id_wrapper()
self.assertTrue(composer.attachment_ids)
self.assertEqual(len(composer.attachment_ids), 1)
@mute_logger("odoo.addons.base_ubl_payment.models.ubl")
def test_04_ubl_invoice_email_with_attachment(self):
conf = self.env['res.config.settings'].create({
'include_ubl_attachment_in_invoice_email': True
})
conf.set_values()
self.composer_ctx.update(attach_ubl_xml_file=True)
composer = self.env['mail.compose.message'].with_context(
self.composer_ctx).create(self.composer_vals)
self.assertFalse(composer.attachment_ids)
composer.onchange_template_id_wrapper()
self.assertTrue(composer.attachment_ids)
self.assertEqual(len(composer.attachment_ids), 2)

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2019 Onestein (<https://www.onestein.eu>)
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="view_account_config_settings" model="ir.ui.view">
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="account_e-invoice_generate.view_account_config_settings"/>
<field name="arch" type="xml">
<xpath expr="//div[@id='e-invoices']">
<div class="o_setting_left_pane">
<field name="include_ubl_attachment_in_invoice_email"/>
</div>
<div class="o_setting_right_pane">
<label for="include_ubl_attachment_in_invoice_email"/>
<div class="text-muted">
Include the UBL XML in the attachments when sending the invoice by email.
</div>
</div>
</xpath>
</field>
</record>
</odoo>