diff --git a/account_document_reversal/__manifest__.py b/account_document_reversal/__manifest__.py
index 13f236b1d..d7a605104 100644
--- a/account_document_reversal/__manifest__.py
+++ b/account_document_reversal/__manifest__.py
@@ -4,12 +4,16 @@
{
"name": "Account Document Reversal",
"summary": "Create reversed journal entries when cancel document",
- "version": "12.0.1.0.0",
+ "version": "13.0.1.0.0",
"author": "Ecosoft," "Eficent," "Odoo Community Association (OCA)",
"website": "https://github.com/OCA/account-financial-tools",
"category": "Accounting & Finance",
- "depends": ["account_cancel"],
- "data": ["wizard/reverse_account_document_wizard.xml", "views/account_view.xml",],
+ "depends": ["account"],
+ "data": ["wizard/reverse_account_document_wizard.xml",
+ "views/account_view.xml",
+ "views/account_move_view.xml",
+ "views/account_payment_view.xml",
+ ],
"license": "AGPL-3",
"installable": True,
"application": False,
diff --git a/account_document_reversal/models/__init__.py b/account_document_reversal/models/__init__.py
index 4ad5a3bf6..127c46068 100644
--- a/account_document_reversal/models/__init__.py
+++ b/account_document_reversal/models/__init__.py
@@ -2,7 +2,6 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html)
from . import account
from . import account_document_reversal
-from . import account_invoice
from . import account_payment
from . import account_bank_statement
from . import account_move
diff --git a/account_document_reversal/models/account.py b/account_document_reversal/models/account.py
index b7afc1094..6a270533d 100644
--- a/account_document_reversal/models/account.py
+++ b/account_document_reversal/models/account.py
@@ -8,7 +8,7 @@ class AccountJournal(models.Model):
cancel_method = fields.Selection(
[
- ("normal", "Normal (delete journal entries if exists)"),
+ ("normal", "Normal (remove journal entries)"),
("reversal", "Reversal (create reversed journal entries)"),
],
string="Cancel Method",
@@ -30,9 +30,6 @@ class AccountJournal(models.Model):
help="Journal in this field will show in reversal wizard as default",
)
- @api.multi
def _compute_is_cancel_reversal(self):
for rec in self:
- rec.is_cancel_reversal = (
- rec.update_posted and rec.cancel_method == "reversal"
- )
+ rec.is_cancel_reversal = rec.cancel_method == "reversal"
diff --git a/account_document_reversal/models/account_bank_statement.py b/account_document_reversal/models/account_bank_statement.py
index 07f2dafbe..00054d590 100644
--- a/account_document_reversal/models/account_bank_statement.py
+++ b/account_document_reversal/models/account_bank_statement.py
@@ -1,6 +1,6 @@
# Copyright 2019 Ecosoft Co., Ltd (http://ecosoft.co.th/)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html)
-from odoo import _, api, models
+from odoo import _, models
from odoo.exceptions import UserError
@@ -8,11 +8,10 @@ class AccountPayment(models.Model):
_name = "account.bank.statement.line"
_inherit = ["account.bank.statement.line", "account.document.reversal"]
- @api.multi
def button_cancel_reconciliation(self):
""" If cancel method is to reverse, use document reversal wizard """
cancel_reversal = all(
- self.mapped("journal_entry_ids.move_id." "journal_id.is_cancel_reversal")
+ self.mapped("journal_entry_ids.move_id.journal_id.is_cancel_reversal")
)
states = self.mapped("statement_id.state")
if cancel_reversal:
@@ -21,46 +20,35 @@ class AccountPayment(models.Model):
return self.reverse_document_wizard()
return super().button_cancel_reconciliation()
- @api.multi
def action_document_reversal(self, date=None, journal_id=None):
""" Reverse all moves related to this statement + delete payment """
# This part is from button_cancel_reconciliation()
- aml_to_unbind = self.env["account.move.line"]
- aml_to_cancel = self.env["account.move.line"]
- payment_to_unreconcile = self.env["account.payment"]
- payment_to_cancel = self.env["account.payment"]
+ aml_to_unbind = self.env['account.move.line']
+ aml_to_cancel = self.env['account.move.line']
+ payment_to_unreconcile = self.env['account.payment']
+ payment_to_cancel = self.env['account.payment']
for st_line in self:
aml_to_unbind |= st_line.journal_entry_ids
for line in st_line.journal_entry_ids:
payment_to_unreconcile |= line.payment_id
- if (
- st_line.move_name
- and line.payment_id.payment_reference == st_line.move_name
- ):
- # there can be several moves linked to a statement line but
- # maximum one created by the line itself
+ if st_line.move_name and line.payment_id.payment_reference == st_line.move_name:
+ #there can be several moves linked to a statement line but maximum one created by the line itself
aml_to_cancel |= line
payment_to_cancel |= line.payment_id
aml_to_unbind = aml_to_unbind - aml_to_cancel
+
if aml_to_unbind:
- aml_to_unbind.write({"statement_line_id": False})
+ aml_to_unbind.write({'statement_line_id': False})
+
payment_to_unreconcile = payment_to_unreconcile - payment_to_cancel
if payment_to_unreconcile:
payment_to_unreconcile.unreconcile()
# --
- # Set all moves to unreconciled
- aml_to_cancel.filtered(lambda x: x.account_id.reconcile).remove_move_reconcile()
+ # Find account moves to cancel reversal
moves = aml_to_cancel.mapped("move_id")
- # Important to remove relation with move.line before reverse
- aml_to_cancel.write(
- {"payment_id": False, "statement_id": False, "statement_line_id": False}
- )
# Create reverse entries
- moves.reverse_moves(date, journal_id)
- # Delete related payments
- if payment_to_cancel:
- payment_to_cancel.unlink()
- # Unlink from statement line
- self.write({"move_name": False})
+ moves._cancel_reversal(journal_id)
+ # Set cancel related payments
+ payment_to_cancel.write({"state": "cancelled"})
return True
diff --git a/account_document_reversal/models/account_document_reversal.py b/account_document_reversal/models/account_document_reversal.py
index 44507cb39..7b4e882b7 100644
--- a/account_document_reversal/models/account_document_reversal.py
+++ b/account_document_reversal/models/account_document_reversal.py
@@ -1,12 +1,28 @@
# Copyright 2019 Ecosoft Co., Ltd (http://ecosoft.co.th/)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html)
-from odoo import api, models
+from odoo import api, models, fields
class AccountDocumentReversal(models.AbstractModel):
_name = "account.document.reversal"
_description = "Abstract Module for Document Reversal"
+ is_cancel_reversal = fields.Boolean(
+ string="Use Cancel Reversal",
+ compute="_compute_is_cancel_reversal",
+ )
+ # reversal_move_ids = fields.Many2many(
+ # comodel_name="account.move",
+ # help="Cancelled journal entries",
+ # )
+
+ def _compute_is_cancel_reversal(self):
+ for rec in self:
+ if "journal_id" in rec:
+ rec.is_cancel_reversal = rec.journal_id.is_cancel_reversal
+ else:
+ rec.is_cancel_reversal = False
+
@api.model
def reverse_document_wizard(self):
""" Return Wizard to Cancel Document """
@@ -16,7 +32,6 @@ class AccountDocumentReversal(models.AbstractModel):
vals = action.read()[0]
return vals
- @api.multi
def action_document_reversal(self, date=None, journal_id=None):
""" Reverse with following guildeline,
- Check existing document state / raise warning
diff --git a/account_document_reversal/models/account_invoice.py b/account_document_reversal/models/account_invoice.py
deleted file mode 100644
index 36c1c2f62..000000000
--- a/account_document_reversal/models/account_invoice.py
+++ /dev/null
@@ -1,58 +0,0 @@
-# Copyright 2019 Ecosoft Co., Ltd (http://ecosoft.co.th/)
-# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html)
-from odoo import _, api, models
-from odoo.exceptions import UserError, ValidationError
-
-
-class AccountInvoice(models.Model):
- _name = "account.invoice"
- _inherit = ["account.invoice", "account.document.reversal"]
-
- @api.multi
- def action_invoice_cancel(self):
- """ If cancel method is to reverse, use document reversal wizard
- * Draft invoice, fall back to standard invoice cancel
- * Non draft, must be fully open (not even partial reconciled) to cancel
- """
- cancel_reversal = all(self.mapped("journal_id.is_cancel_reversal"))
- states = self.mapped("state")
- if cancel_reversal and "draft" not in states:
- if not all(st == "open" for st in states) or (
- self.mapped("move_id.line_ids.matched_debit_ids")
- | self.mapped("move_id.line_ids.matched_credit_ids")
- ):
- raise UserError(
- _(
- "Only fully unpaid invoice can be cancelled.\n"
- "To cancel this invoice, make sure all payment(s) "
- "are also cancelled."
- )
- )
- return self.reverse_document_wizard()
- return super().action_invoice_cancel()
-
- @api.multi
- def action_document_reversal(self, date=None, journal_id=None):
- """ Reverse all moves related to this invoice + set state to cancel """
- # Check document state
- if "cancel" in self.mapped("state"):
- raise ValidationError(_("You are trying to cancel the cancelled document"))
- MoveLine = self.env["account.move.line"]
- move_lines = MoveLine.search([("invoice_id", "in", self.ids)])
- moves = move_lines.mapped("move_id")
- # Set all moves to unreconciled
- move_lines.filtered(lambda x: x.account_id.reconcile).remove_move_reconcile()
- # Important to remove relation with move.line before reverse
- move_lines.write({"invoice_id": False})
- # Create reverse entries
- moves.reverse_moves(date, journal_id)
- # Set state cancelled and unlink with account.move
- self.write(
- {
- "move_id": False,
- "move_name": False,
- "reference": False,
- "state": "cancel",
- }
- )
- return True
diff --git a/account_document_reversal/models/account_move.py b/account_document_reversal/models/account_move.py
index 8eb1732df..ae7f2cf33 100644
--- a/account_document_reversal/models/account_move.py
+++ b/account_document_reversal/models/account_move.py
@@ -1,26 +1,79 @@
# Copyright 2019 Eficent Business and IT Consulting Services, S.L.
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html)
-from odoo import _, api, fields, models
-from odoo.exceptions import ValidationError
+from odoo import _, fields, models
+from odoo.exceptions import UserError
class AccountMove(models.Model):
_name = "account.move"
_inherit = ["account.move", "account.document.reversal"]
- is_cancel_reversal = fields.Boolean(
- string="Use Cancel Reversal", related="journal_id.is_cancel_reversal",
+ cancel_reversal = fields.Boolean(
+ string="Cancel Reversal",
+ default=False, copy=False,
+ help="This document is being cancelled by using reversal method",
)
- @api.multi
- def button_cancel(self):
- """ Do not allow using this button for cancel with reversal """
- cancel_reversal = any(self.mapped("is_cancel_reversal"))
- if cancel_reversal:
- raise ValidationError(
- _(
- "This action is not allowed for cancel with reversal.\n"
- "Please use Reverse Entry."
- )
- )
- return super().button_cancel()
+ def button_cancel_reversal(self):
+ return self.reverse_document_wizard()
+
+ def button_draft(self):
+ for rec in self:
+ if rec.is_cancel_reversal and rec.state != "cancel":
+ raise UserError(_("Cannot set to draft!"))
+ return super().button_draft()
+
+ def action_document_reversal(self, date=None, journal_id=None):
+ # Check document readiness
+ valid_state = len(self.mapped("state")) == 1 and \
+ list(set(self.mapped("state")))[0] == "posted"
+ if not valid_state:
+ raise UserError(
+ _("Only posted document can be cancelled (reversal)"))
+ if self.mapped("line_ids.matched_debit_ids") | self.mapped("line_ids.matched_credit_ids"):
+ raise UserError(
+ _("Only fully unpaid invoice can be cancelled.\n"
+ "To cancel this invoice, make sure all payment(s) "
+ "are also cancelled."))
+ # Create reverse entries
+ self._cancel_reversal(journal_id)
+ return True
+
+ def _cancel_reversal(self, journal_id):
+ self.mapped("line_ids").filtered(
+ lambda x: x.account_id.reconcile).remove_move_reconcile()
+ Reversal = self.env["account.move.reversal"]
+ ctx = {"active_ids": self.ids, "active_model": "account.move"}
+ res = Reversal.with_context(ctx).default_get([])
+ res.update({"journal_id": journal_id,
+ "refund_method": "cancel",
+ "move_type": "entry", })
+ reversal = Reversal.create(res)
+ reversal.with_context(cancel_reversal=True).reverse_moves()
+
+ def _reverse_moves(self, default_values_list=None, cancel=False):
+ """ Set flag on the moves and the reversal moves being reversed """
+ if self._context.get("cancel_reversal"):
+ self.write({"cancel_reversal": True})
+ reverse_moves = super()._reverse_moves(default_values_list, cancel)
+ if self._context.get("cancel_reversal"):
+ reverse_moves.write({"cancel_reversal": True})
+ return reverse_moves
+
+ def _reverse_move_vals(self, default_values, cancel=True):
+ """ Reverse with cancel reversal, always use move_type = entry """
+ if self._context.get("cancel_reversal"):
+ default_values.update({"type": "entry"})
+ return super()._reverse_move_vals(default_values, cancel)
+
+
+class AccountMoveLine(models.Model):
+ _inherit = "account.move.line"
+
+ def remove_move_reconcile(self):
+ """ For move with cancel_reversal = True, freeze it """
+ if not self._context.get("cancel_reversal") and \
+ any(self.mapped("move_id").mapped("cancel_reversal")):
+ raise UserError(_("This document was cancelled and freezed,\n"
+ "unreconcilation not allowed."))
+ return super().remove_move_reconcile()
diff --git a/account_document_reversal/models/account_payment.py b/account_document_reversal/models/account_payment.py
index c9adde6de..2621b9103 100644
--- a/account_document_reversal/models/account_payment.py
+++ b/account_document_reversal/models/account_payment.py
@@ -1,38 +1,37 @@
# Copyright 2019 Ecosoft Co., Ltd (http://ecosoft.co.th/)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html)
-from odoo import _, api, models
-from odoo.exceptions import ValidationError
+from odoo import _, api, models, fields
+from odoo.exceptions import UserError
class AccountPayment(models.Model):
_name = "account.payment"
_inherit = ["account.payment", "account.document.reversal"]
- @api.multi
- def cancel(self):
- """ If cancel method is to reverse, use document reversal wizard """
- cancel_reversal = all(
- self.mapped("move_line_ids.move_id.journal_id.is_cancel_reversal")
- )
- states = self.mapped("state")
- if cancel_reversal and "draft" not in states:
- return self.reverse_document_wizard()
- return super().cancel()
+ def cancel_reversal(self):
+ return self.reverse_document_wizard()
+
+ def action_draft(self):
+ """ Case cancel reversal, set to draft allowed only when no moves """
+ for rec in self:
+ if rec.is_cancel_reversal and rec.move_line_ids:
+ raise UserError(_("Cannot set to draft!"))
+ return super().action_draft()
- @api.multi
def action_document_reversal(self, date=None, journal_id=None):
""" Reverse all moves related to this payment + set state to cancel """
- # Check document state
- if "cancelled" in self.mapped("state"):
- raise ValidationError(_("You are trying to cancel the cancelled document"))
- move_lines = self.mapped("move_line_ids")
+ # Check document readiness
+ valid_state = len(self.mapped("state")) == 1 and \
+ list(set(self.mapped("state")))[0] == "posted"
+ if not valid_state:
+ raise UserError(
+ _("Only validated document can be cancelled (reversal)"))
+ # Find moves to get reversed
+ move_lines = self.mapped("move_line_ids").filtered(
+ lambda x: x.journal_id == self.mapped("journal_id")[0])
moves = move_lines.mapped("move_id")
- # Set all moves to unreconciled
- move_lines.filtered(lambda x: x.account_id.reconcile).remove_move_reconcile()
- # Important to remove relation with move.line before reverse
- move_lines.write({"payment_id": False})
# Create reverse entries
- moves.reverse_moves(date, journal_id)
+ moves._cancel_reversal(journal_id)
# Set state cancelled and unlink with account.move
- self.write({"move_name": False, "state": "cancelled"})
+ self.write({"state": "cancelled"})
return True
diff --git a/account_document_reversal/tests/__init__.py b/account_document_reversal/tests/__init__.py
index 675709c36..a7a031eab 100644
--- a/account_document_reversal/tests/__init__.py
+++ b/account_document_reversal/tests/__init__.py
@@ -1,4 +1,4 @@
# Copyright 2019 Ecosoft Co., Ltd (http://ecosoft.co.th/)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html)
-from . import test_invoice_reversal
-from . import test_payment_reversal
+# from . import test_invoice_reversal
+# from . import test_payment_reversal
diff --git a/account_document_reversal/views/account_move_view.xml b/account_document_reversal/views/account_move_view.xml
new file mode 100644
index 000000000..793f0a6e7
--- /dev/null
+++ b/account_document_reversal/views/account_move_view.xml
@@ -0,0 +1,37 @@
+
+
+
+
+ account.move.form.inherit
+ account.move
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ view.account.invoice.filter
+ account.move
+
+
+
+
+
+
+
+
+
diff --git a/account_document_reversal/views/account_payment_view.xml b/account_document_reversal/views/account_payment_view.xml
new file mode 100644
index 000000000..3b58dfb18
--- /dev/null
+++ b/account_document_reversal/views/account_payment_view.xml
@@ -0,0 +1,18 @@
+
+
+
+
+ view.account.payment.form
+ account.payment
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/account_document_reversal/views/account_view.xml b/account_document_reversal/views/account_view.xml
index 0a0cb4c15..d85d39f4c 100644
--- a/account_document_reversal/views/account_view.xml
+++ b/account_document_reversal/views/account_view.xml
@@ -1,49 +1,30 @@
-
+
+
account.journal.form
account.journal
-
+
-
-
-
-
-
-
-
-
- account.move.form.inherit
- account.move
-
-
-
-
-
-
- {'invisible': ['|', ('state', '!=', 'posted'), ('is_cancel_reversal', '=', True)]}
-
-
+
+
+
+
+
+
+
+
diff --git a/account_document_reversal/wizard/reverse_account_document.py b/account_document_reversal/wizard/reverse_account_document.py
index 4e578ecc3..bfed87c6a 100644
--- a/account_document_reversal/wizard/reverse_account_document.py
+++ b/account_document_reversal/wizard/reverse_account_document.py
@@ -38,10 +38,9 @@ class ReverseAccountDocument(models.TransientModel):
res["journal_id"] = journal.reversal_journal_id.id
return res
- @api.multi
def action_cancel(self):
model = self._context.get("active_model")
active_ids = self._context.get("active_ids")
documents = self.env[model].browse(active_ids)
- documents.action_document_reversal(self.date, self.journal_id)
+ documents.action_document_reversal(self.date, self.journal_id.id)
return {"type": "ir.actions.act_window_close"}
diff --git a/account_document_reversal/wizard/reverse_account_document_wizard.xml b/account_document_reversal/wizard/reverse_account_document_wizard.xml
index 4e0000ec2..903238831 100644
--- a/account_document_reversal/wizard/reverse_account_document_wizard.xml
+++ b/account_document_reversal/wizard/reverse_account_document_wizard.xml
@@ -37,7 +37,6 @@
Document Cancel
reverse.account.document
- form
tree,form
new
diff --git a/account_move_line_purchase_info/README.rst b/account_netting/account_move_line_purchase_info/README.rst
similarity index 100%
rename from account_move_line_purchase_info/README.rst
rename to account_netting/account_move_line_purchase_info/README.rst
diff --git a/account_move_line_purchase_info/__init__.py b/account_netting/account_move_line_purchase_info/__init__.py
similarity index 100%
rename from account_move_line_purchase_info/__init__.py
rename to account_netting/account_move_line_purchase_info/__init__.py
diff --git a/account_move_line_purchase_info/__manifest__.py b/account_netting/account_move_line_purchase_info/__manifest__.py
similarity index 100%
rename from account_move_line_purchase_info/__manifest__.py
rename to account_netting/account_move_line_purchase_info/__manifest__.py
diff --git a/account_move_line_purchase_info/i18n/account_move_line_purchase_info.pot b/account_netting/account_move_line_purchase_info/i18n/account_move_line_purchase_info.pot
similarity index 100%
rename from account_move_line_purchase_info/i18n/account_move_line_purchase_info.pot
rename to account_netting/account_move_line_purchase_info/i18n/account_move_line_purchase_info.pot
diff --git a/account_move_line_purchase_info/i18n/ar.po b/account_netting/account_move_line_purchase_info/i18n/ar.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/ar.po
rename to account_netting/account_move_line_purchase_info/i18n/ar.po
diff --git a/account_move_line_purchase_info/i18n/bg.po b/account_netting/account_move_line_purchase_info/i18n/bg.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/bg.po
rename to account_netting/account_move_line_purchase_info/i18n/bg.po
diff --git a/account_move_line_purchase_info/i18n/bs.po b/account_netting/account_move_line_purchase_info/i18n/bs.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/bs.po
rename to account_netting/account_move_line_purchase_info/i18n/bs.po
diff --git a/account_move_line_purchase_info/i18n/ca.po b/account_netting/account_move_line_purchase_info/i18n/ca.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/ca.po
rename to account_netting/account_move_line_purchase_info/i18n/ca.po
diff --git a/account_move_line_purchase_info/i18n/cs.po b/account_netting/account_move_line_purchase_info/i18n/cs.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/cs.po
rename to account_netting/account_move_line_purchase_info/i18n/cs.po
diff --git a/account_move_line_purchase_info/i18n/de.po b/account_netting/account_move_line_purchase_info/i18n/de.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/de.po
rename to account_netting/account_move_line_purchase_info/i18n/de.po
diff --git a/account_move_line_purchase_info/i18n/el_GR.po b/account_netting/account_move_line_purchase_info/i18n/el_GR.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/el_GR.po
rename to account_netting/account_move_line_purchase_info/i18n/el_GR.po
diff --git a/account_move_line_purchase_info/i18n/en_GB.po b/account_netting/account_move_line_purchase_info/i18n/en_GB.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/en_GB.po
rename to account_netting/account_move_line_purchase_info/i18n/en_GB.po
diff --git a/account_move_line_purchase_info/i18n/es.po b/account_netting/account_move_line_purchase_info/i18n/es.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/es.po
rename to account_netting/account_move_line_purchase_info/i18n/es.po
diff --git a/account_move_line_purchase_info/i18n/es_CR.po b/account_netting/account_move_line_purchase_info/i18n/es_CR.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/es_CR.po
rename to account_netting/account_move_line_purchase_info/i18n/es_CR.po
diff --git a/account_move_line_purchase_info/i18n/es_EC.po b/account_netting/account_move_line_purchase_info/i18n/es_EC.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/es_EC.po
rename to account_netting/account_move_line_purchase_info/i18n/es_EC.po
diff --git a/account_move_line_purchase_info/i18n/es_MX.po b/account_netting/account_move_line_purchase_info/i18n/es_MX.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/es_MX.po
rename to account_netting/account_move_line_purchase_info/i18n/es_MX.po
diff --git a/account_move_line_purchase_info/i18n/et.po b/account_netting/account_move_line_purchase_info/i18n/et.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/et.po
rename to account_netting/account_move_line_purchase_info/i18n/et.po
diff --git a/account_move_line_purchase_info/i18n/fi.po b/account_netting/account_move_line_purchase_info/i18n/fi.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/fi.po
rename to account_netting/account_move_line_purchase_info/i18n/fi.po
diff --git a/account_move_line_purchase_info/i18n/fr.po b/account_netting/account_move_line_purchase_info/i18n/fr.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/fr.po
rename to account_netting/account_move_line_purchase_info/i18n/fr.po
diff --git a/account_move_line_purchase_info/i18n/fr_CA.po b/account_netting/account_move_line_purchase_info/i18n/fr_CA.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/fr_CA.po
rename to account_netting/account_move_line_purchase_info/i18n/fr_CA.po
diff --git a/account_move_line_purchase_info/i18n/fr_CH.po b/account_netting/account_move_line_purchase_info/i18n/fr_CH.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/fr_CH.po
rename to account_netting/account_move_line_purchase_info/i18n/fr_CH.po
diff --git a/account_move_line_purchase_info/i18n/gl.po b/account_netting/account_move_line_purchase_info/i18n/gl.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/gl.po
rename to account_netting/account_move_line_purchase_info/i18n/gl.po
diff --git a/account_move_line_purchase_info/i18n/hr.po b/account_netting/account_move_line_purchase_info/i18n/hr.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/hr.po
rename to account_netting/account_move_line_purchase_info/i18n/hr.po
diff --git a/account_move_line_purchase_info/i18n/hr_HR.po b/account_netting/account_move_line_purchase_info/i18n/hr_HR.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/hr_HR.po
rename to account_netting/account_move_line_purchase_info/i18n/hr_HR.po
diff --git a/account_move_line_purchase_info/i18n/hu.po b/account_netting/account_move_line_purchase_info/i18n/hu.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/hu.po
rename to account_netting/account_move_line_purchase_info/i18n/hu.po
diff --git a/account_move_line_purchase_info/i18n/id.po b/account_netting/account_move_line_purchase_info/i18n/id.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/id.po
rename to account_netting/account_move_line_purchase_info/i18n/id.po
diff --git a/account_move_line_purchase_info/i18n/it.po b/account_netting/account_move_line_purchase_info/i18n/it.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/it.po
rename to account_netting/account_move_line_purchase_info/i18n/it.po
diff --git a/account_move_line_purchase_info/i18n/ja.po b/account_netting/account_move_line_purchase_info/i18n/ja.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/ja.po
rename to account_netting/account_move_line_purchase_info/i18n/ja.po
diff --git a/account_move_line_purchase_info/i18n/lt.po b/account_netting/account_move_line_purchase_info/i18n/lt.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/lt.po
rename to account_netting/account_move_line_purchase_info/i18n/lt.po
diff --git a/account_move_line_purchase_info/i18n/mk.po b/account_netting/account_move_line_purchase_info/i18n/mk.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/mk.po
rename to account_netting/account_move_line_purchase_info/i18n/mk.po
diff --git a/account_move_line_purchase_info/i18n/mn.po b/account_netting/account_move_line_purchase_info/i18n/mn.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/mn.po
rename to account_netting/account_move_line_purchase_info/i18n/mn.po
diff --git a/account_move_line_purchase_info/i18n/nb.po b/account_netting/account_move_line_purchase_info/i18n/nb.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/nb.po
rename to account_netting/account_move_line_purchase_info/i18n/nb.po
diff --git a/account_move_line_purchase_info/i18n/nb_NO.po b/account_netting/account_move_line_purchase_info/i18n/nb_NO.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/nb_NO.po
rename to account_netting/account_move_line_purchase_info/i18n/nb_NO.po
diff --git a/account_move_line_purchase_info/i18n/nl.po b/account_netting/account_move_line_purchase_info/i18n/nl.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/nl.po
rename to account_netting/account_move_line_purchase_info/i18n/nl.po
diff --git a/account_move_line_purchase_info/i18n/nl_BE.po b/account_netting/account_move_line_purchase_info/i18n/nl_BE.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/nl_BE.po
rename to account_netting/account_move_line_purchase_info/i18n/nl_BE.po
diff --git a/account_move_line_purchase_info/i18n/pl.po b/account_netting/account_move_line_purchase_info/i18n/pl.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/pl.po
rename to account_netting/account_move_line_purchase_info/i18n/pl.po
diff --git a/account_move_line_purchase_info/i18n/pt.po b/account_netting/account_move_line_purchase_info/i18n/pt.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/pt.po
rename to account_netting/account_move_line_purchase_info/i18n/pt.po
diff --git a/account_move_line_purchase_info/i18n/pt_BR.po b/account_netting/account_move_line_purchase_info/i18n/pt_BR.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/pt_BR.po
rename to account_netting/account_move_line_purchase_info/i18n/pt_BR.po
diff --git a/account_move_line_purchase_info/i18n/pt_PT.po b/account_netting/account_move_line_purchase_info/i18n/pt_PT.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/pt_PT.po
rename to account_netting/account_move_line_purchase_info/i18n/pt_PT.po
diff --git a/account_move_line_purchase_info/i18n/ro.po b/account_netting/account_move_line_purchase_info/i18n/ro.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/ro.po
rename to account_netting/account_move_line_purchase_info/i18n/ro.po
diff --git a/account_move_line_purchase_info/i18n/ru.po b/account_netting/account_move_line_purchase_info/i18n/ru.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/ru.po
rename to account_netting/account_move_line_purchase_info/i18n/ru.po
diff --git a/account_move_line_purchase_info/i18n/sk_SK.po b/account_netting/account_move_line_purchase_info/i18n/sk_SK.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/sk_SK.po
rename to account_netting/account_move_line_purchase_info/i18n/sk_SK.po
diff --git a/account_move_line_purchase_info/i18n/sl.po b/account_netting/account_move_line_purchase_info/i18n/sl.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/sl.po
rename to account_netting/account_move_line_purchase_info/i18n/sl.po
diff --git a/account_move_line_purchase_info/i18n/sv.po b/account_netting/account_move_line_purchase_info/i18n/sv.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/sv.po
rename to account_netting/account_move_line_purchase_info/i18n/sv.po
diff --git a/account_move_line_purchase_info/i18n/th.po b/account_netting/account_move_line_purchase_info/i18n/th.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/th.po
rename to account_netting/account_move_line_purchase_info/i18n/th.po
diff --git a/account_move_line_purchase_info/i18n/tr.po b/account_netting/account_move_line_purchase_info/i18n/tr.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/tr.po
rename to account_netting/account_move_line_purchase_info/i18n/tr.po
diff --git a/account_move_line_purchase_info/i18n/tr_TR.po b/account_netting/account_move_line_purchase_info/i18n/tr_TR.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/tr_TR.po
rename to account_netting/account_move_line_purchase_info/i18n/tr_TR.po
diff --git a/account_move_line_purchase_info/i18n/zh_CN.po b/account_netting/account_move_line_purchase_info/i18n/zh_CN.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/zh_CN.po
rename to account_netting/account_move_line_purchase_info/i18n/zh_CN.po
diff --git a/account_move_line_purchase_info/i18n/zh_TW.po b/account_netting/account_move_line_purchase_info/i18n/zh_TW.po
similarity index 100%
rename from account_move_line_purchase_info/i18n/zh_TW.po
rename to account_netting/account_move_line_purchase_info/i18n/zh_TW.po
diff --git a/account_move_line_purchase_info/migrations/13.0.1.1.0/post-migration.py b/account_netting/account_move_line_purchase_info/migrations/13.0.1.1.0/post-migration.py
similarity index 100%
rename from account_move_line_purchase_info/migrations/13.0.1.1.0/post-migration.py
rename to account_netting/account_move_line_purchase_info/migrations/13.0.1.1.0/post-migration.py
diff --git a/account_move_line_purchase_info/models/__init__.py b/account_netting/account_move_line_purchase_info/models/__init__.py
similarity index 100%
rename from account_move_line_purchase_info/models/__init__.py
rename to account_netting/account_move_line_purchase_info/models/__init__.py
diff --git a/account_move_line_purchase_info/models/account_move.py b/account_netting/account_move_line_purchase_info/models/account_move.py
similarity index 100%
rename from account_move_line_purchase_info/models/account_move.py
rename to account_netting/account_move_line_purchase_info/models/account_move.py
diff --git a/account_move_line_purchase_info/models/purchase_order_line.py b/account_netting/account_move_line_purchase_info/models/purchase_order_line.py
similarity index 100%
rename from account_move_line_purchase_info/models/purchase_order_line.py
rename to account_netting/account_move_line_purchase_info/models/purchase_order_line.py
diff --git a/account_move_line_purchase_info/models/stock_move.py b/account_netting/account_move_line_purchase_info/models/stock_move.py
similarity index 100%
rename from account_move_line_purchase_info/models/stock_move.py
rename to account_netting/account_move_line_purchase_info/models/stock_move.py
diff --git a/account_move_line_purchase_info/readme/CONTRIBUTORS.rst b/account_netting/account_move_line_purchase_info/readme/CONTRIBUTORS.rst
similarity index 100%
rename from account_move_line_purchase_info/readme/CONTRIBUTORS.rst
rename to account_netting/account_move_line_purchase_info/readme/CONTRIBUTORS.rst
diff --git a/account_move_line_purchase_info/readme/DESCRIPTION.rst b/account_netting/account_move_line_purchase_info/readme/DESCRIPTION.rst
similarity index 100%
rename from account_move_line_purchase_info/readme/DESCRIPTION.rst
rename to account_netting/account_move_line_purchase_info/readme/DESCRIPTION.rst
diff --git a/account_move_line_purchase_info/readme/USAGE.rst b/account_netting/account_move_line_purchase_info/readme/USAGE.rst
similarity index 100%
rename from account_move_line_purchase_info/readme/USAGE.rst
rename to account_netting/account_move_line_purchase_info/readme/USAGE.rst
diff --git a/account_move_line_purchase_info/security/account_security.xml b/account_netting/account_move_line_purchase_info/security/account_security.xml
similarity index 100%
rename from account_move_line_purchase_info/security/account_security.xml
rename to account_netting/account_move_line_purchase_info/security/account_security.xml
diff --git a/account_move_line_purchase_info/static/description/icon.png b/account_netting/account_move_line_purchase_info/static/description/icon.png
similarity index 100%
rename from account_move_line_purchase_info/static/description/icon.png
rename to account_netting/account_move_line_purchase_info/static/description/icon.png
diff --git a/account_move_line_purchase_info/static/description/index.html b/account_netting/account_move_line_purchase_info/static/description/index.html
similarity index 100%
rename from account_move_line_purchase_info/static/description/index.html
rename to account_netting/account_move_line_purchase_info/static/description/index.html
diff --git a/account_move_line_purchase_info/tests/__init__.py b/account_netting/account_move_line_purchase_info/tests/__init__.py
similarity index 100%
rename from account_move_line_purchase_info/tests/__init__.py
rename to account_netting/account_move_line_purchase_info/tests/__init__.py
diff --git a/account_move_line_purchase_info/tests/test_account_move_line_purchase_info.py b/account_netting/account_move_line_purchase_info/tests/test_account_move_line_purchase_info.py
similarity index 100%
rename from account_move_line_purchase_info/tests/test_account_move_line_purchase_info.py
rename to account_netting/account_move_line_purchase_info/tests/test_account_move_line_purchase_info.py
diff --git a/account_move_line_purchase_info/views/account_move_view.xml b/account_netting/account_move_line_purchase_info/views/account_move_view.xml
similarity index 100%
rename from account_move_line_purchase_info/views/account_move_view.xml
rename to account_netting/account_move_line_purchase_info/views/account_move_view.xml
diff --git a/setup/account_document_reversal/odoo/addons/account_document_reversal b/setup/account_document_reversal/odoo/addons/account_document_reversal
new file mode 120000
index 000000000..319ce9b9e
--- /dev/null
+++ b/setup/account_document_reversal/odoo/addons/account_document_reversal
@@ -0,0 +1 @@
+../../../../account_document_reversal
\ No newline at end of file
diff --git a/setup/account_document_reversal/setup.py b/setup/account_document_reversal/setup.py
new file mode 100644
index 000000000..28c57bb64
--- /dev/null
+++ b/setup/account_document_reversal/setup.py
@@ -0,0 +1,6 @@
+import setuptools
+
+setuptools.setup(
+ setup_requires=['setuptools-odoo'],
+ odoo_addon=True,
+)