mirror of
https://github.com/OCA/account-financial-tools.git
synced 2025-02-02 12:47:26 +02:00
[ADD] account_cash_basis_group_base_line: add module
account: Compacting the creation of Journal Lines for CABA base lines. Main - Creation of Cash Basis (CABA) Journal Entries can lead to the creation of a huge number of lines that are not quite useful and its creations can lead to a lengthy process of creation of payment when several invoices with a huge amount of invoice lines involved or to a lengthy process of cancelation of payment because of reversion of the CABA, in case of l10n_mx, many users have opted for using l10n_mx_edi_avoid_reversal_entry, and then this causes a lengthy process of deletions of CABA entries. Justification - CABA Entry is divided into two parts when it is created - Tax Part: The part that deals with the taxes themselves (this PR does not mess with them). - Base Part: The part of the base of the taxes (what this PR is all about) So far the Base Part has been using a Brigde/Order account that does not have any financial use other than providing the source for computing the base of the amount of taxes due. In the financial statements, the value of the account used is always zero. So providing a huge amount of details on this account has proved, in the wild, of no use. Scenario - - Configure Tax based on payment. - Configure the tax base account in the Tax. - Have four invoices, each one with one hundred invoice lines, each line is a different product or a different account. (4 invoices x 100 lines = 400 lines to be used as a tax base) - Make three partial payments to each invoice. (3 payments x 4 invoices = 12 payments) Before this change - - Check the CABA entry created: Chances are that each CABA Journal Entry will end up having: -- 1 Entry line per tax collected. -- 1 Entry line per tax to be collected. -- 200 Entry lines for the base (100 lines in debit, 100 lines in credit) That is a **whopping 2424 lines** for CABA entries where 2400 are only base lines. And let us say that I have made a mistake on all the 12 payment (I am that dumb). Reversal Method will clone your 2424 lines so now there are 2424 additional lines. And remember I have to fix my payments and that creates again 2424 additional lines. So **I end up with 2424 x 3 = 7272 lines.** This only for 3 invoices and 4 payment, for payments canceled and their corrections. After this change - - Check the CABA entry created: -- 1 Entry line per tax collected. -- 1 Entry line per tax to be collected. -- 2 Entry lines for the base, one debit, one credit. Chances are that this could be increased but the algorithm tries only to group by a set of keys. So with the same steps, payments reversals and corrections, I could end up with 12 payment x 4 lines x 3 steps = **144 lines down from 7272 lines.**
This commit is contained in:
82
account_cash_basis_group_base_line/README.rst
Normal file
82
account_cash_basis_group_base_line/README.rst
Normal file
@@ -0,0 +1,82 @@
|
||||
===============================
|
||||
Tax Cash Basis Group Base Lines
|
||||
===============================
|
||||
|
||||
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!! 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%2Faccount--financial--tools-lightgray.png?logo=github
|
||||
:target: https://github.com/OCA/account-financial-tools/tree/13.0/account_cash_basis_group_base_line
|
||||
:alt: OCA/account-financial-tools
|
||||
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
|
||||
:target: https://translation.odoo-community.org/projects/account-financial-tools-13.0/account-financial-tools-13.0-account_cash_basis_group_base_line
|
||||
:alt: Translate me on Weblate
|
||||
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
|
||||
:target: https://runbot.odoo-community.org/runbot/92/13.0
|
||||
:alt: Try me on Runbot
|
||||
|
||||
|badge1| |badge2| |badge3| |badge4| |badge5|
|
||||
|
||||
This module compact the creation of Journal Lines for Cash Basis base lines.
|
||||
|
||||
Instead of creating two base lines per line with cash basis tax, let us group
|
||||
the creation lines so that there are fewer lines in the Cash Basis Journal Entry.
|
||||
|
||||
**Table of contents**
|
||||
|
||||
.. contents::
|
||||
:local:
|
||||
|
||||
Usage
|
||||
=====
|
||||
|
||||
Just Install the module. No extra configuration is needed.
|
||||
|
||||
Bug Tracker
|
||||
===========
|
||||
|
||||
Bugs are tracked on `GitHub Issues <https://github.com/OCA/account-financial-tools/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/account-financial-tools/issues/new?body=module:%20account_cash_basis_group_base_line%0Aversion:%2013.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
|
||||
~~~~~~~
|
||||
|
||||
* Vauxoo
|
||||
|
||||
Contributors
|
||||
~~~~~~~~~~~~
|
||||
|
||||
* Humberto Arocha <hbto@vauxoo.com>
|
||||
* Gabriela Mogollón <gmogollon@vauxoo.com>
|
||||
|
||||
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/account-financial-tools <https://github.com/OCA/account-financial-tools/tree/13.0/account_cash_basis_group_base_line>`_ project on GitHub.
|
||||
|
||||
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
|
||||
1
account_cash_basis_group_base_line/__init__.py
Normal file
1
account_cash_basis_group_base_line/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from . import models
|
||||
13
account_cash_basis_group_base_line/__manifest__.py
Normal file
13
account_cash_basis_group_base_line/__manifest__.py
Normal file
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"name": "Tax Cash Basis Group Base Lines",
|
||||
"version": "13.0.0.0.1",
|
||||
"summary": "Compacting the creation of Journal Lines for CABA base lines.",
|
||||
"sequence": 5,
|
||||
"category": "Accounting",
|
||||
"depends": ["account"],
|
||||
"author": "Vauxoo, Odoo Community Association (OCA)",
|
||||
"license": "AGPL-3",
|
||||
"data": [],
|
||||
"installable": True,
|
||||
"auto_install": False,
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * account_cash_basis_group_base_line
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 13.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_cash_basis_group_base_line
|
||||
#: model:ir.model,name:account_cash_basis_group_base_line.model_account_partial_reconcile
|
||||
msgid "Partial Reconcile"
|
||||
msgstr ""
|
||||
|
||||
1
account_cash_basis_group_base_line/models/__init__.py
Normal file
1
account_cash_basis_group_base_line/models/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from . import account_move
|
||||
54
account_cash_basis_group_base_line/models/account_move.py
Normal file
54
account_cash_basis_group_base_line/models/account_move.py
Normal file
@@ -0,0 +1,54 @@
|
||||
from odoo import models
|
||||
|
||||
|
||||
class AccountPartialReconcile(models.Model):
|
||||
_inherit = "account.partial.reconcile"
|
||||
|
||||
def _get_tax_cash_basis_base_key(self, tax, move, line):
|
||||
account_id = self._get_tax_cash_basis_base_account(line, tax)
|
||||
tax_rep_lines = (
|
||||
tax.refund_repartition_line_ids
|
||||
if line.move_id.type in ("in_refund", "out_refund")
|
||||
else tax.invoice_repartition_line_ids
|
||||
)
|
||||
original_base_tags = tax_rep_lines.filtered(
|
||||
lambda x: x.repartition_type == "base"
|
||||
).tag_ids
|
||||
base_tags = tuple(line._convert_tags_for_cash_basis(original_base_tags).ids)
|
||||
return (
|
||||
move.id,
|
||||
account_id.id,
|
||||
tax.id,
|
||||
line.tax_repartition_line_id.id,
|
||||
base_tags,
|
||||
line.currency_id.id,
|
||||
line.partner_id.id,
|
||||
line.move_id.type,
|
||||
)
|
||||
|
||||
def _get_tax_cash_basis_base_common_vals(self, key, new_move):
|
||||
self.ensure_one()
|
||||
# pylint: disable=W0612
|
||||
(
|
||||
move,
|
||||
account_id,
|
||||
tax_id,
|
||||
tax_repartition_line_id,
|
||||
base_tags,
|
||||
currency_id,
|
||||
partner_id,
|
||||
move_type,
|
||||
) = key
|
||||
move = self.env["account.move"].browse(move)
|
||||
return {
|
||||
"name": move.name,
|
||||
"account_id": account_id,
|
||||
"journal_id": new_move.journal_id.id,
|
||||
"tax_exigible": True,
|
||||
"tax_ids": [(6, 0, [tax_id])],
|
||||
"tag_ids": [(6, 0, base_tags)],
|
||||
"move_id": new_move.id,
|
||||
"currency_id": currency_id,
|
||||
"partner_id": partner_id,
|
||||
"tax_repartition_line_id": tax_repartition_line_id,
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
* Humberto Arocha <hbto@vauxoo.com>
|
||||
* Gabriela Mogollón <gmogollon@vauxoo.com>
|
||||
@@ -0,0 +1,4 @@
|
||||
This module compact the creation of Journal Lines for Cash Basis base lines.
|
||||
|
||||
Instead of creating two base lines per line with cash basis tax, let us group
|
||||
the creation lines so that there are fewer lines in the Cash Basis Journal Entry.
|
||||
1
account_cash_basis_group_base_line/readme/USAGE.rst
Normal file
1
account_cash_basis_group_base_line/readme/USAGE.rst
Normal file
@@ -0,0 +1 @@
|
||||
Just Install the module. No extra configuration is needed.
|
||||
BIN
account_cash_basis_group_base_line/static/description/icon.png
Normal file
BIN
account_cash_basis_group_base_line/static/description/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 9.2 KiB |
427
account_cash_basis_group_base_line/static/description/index.html
Normal file
427
account_cash_basis_group_base_line/static/description/index.html
Normal file
@@ -0,0 +1,427 @@
|
||||
<?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>Tax Cash Basis Group Base Lines</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="tax-cash-basis-group-base-lines">
|
||||
<h1 class="title">Tax Cash Basis Group Base Lines</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/account-financial-tools/tree/13.0/account_cash_basis_group_base_line"><img alt="OCA/account-financial-tools" src="https://img.shields.io/badge/github-OCA%2Faccount--financial--tools-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/account-financial-tools-13.0/account-financial-tools-13.0-account_cash_basis_group_base_line"><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/92/13.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
|
||||
<p>This module compact the creation of Journal Lines for Cash Basis base lines.</p>
|
||||
<p>Instead of creating two base lines per line with cash basis tax, let us group
|
||||
the creation lines so that there are fewer lines in the Cash Basis Journal Entry.</p>
|
||||
<p><strong>Table of contents</strong></p>
|
||||
<div class="contents local topic" id="contents">
|
||||
<ul class="simple">
|
||||
<li><a class="reference internal" href="#usage" id="id1">Usage</a></li>
|
||||
<li><a class="reference internal" href="#bug-tracker" id="id2">Bug Tracker</a></li>
|
||||
<li><a class="reference internal" href="#credits" id="id3">Credits</a><ul>
|
||||
<li><a class="reference internal" href="#authors" id="id4">Authors</a></li>
|
||||
<li><a class="reference internal" href="#contributors" id="id5">Contributors</a></li>
|
||||
<li><a class="reference internal" href="#maintainers" id="id6">Maintainers</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="usage">
|
||||
<h1><a class="toc-backref" href="#id1">Usage</a></h1>
|
||||
<p>Just Install the module. No extra configuration is needed.</p>
|
||||
</div>
|
||||
<div class="section" id="bug-tracker">
|
||||
<h1><a class="toc-backref" href="#id2">Bug Tracker</a></h1>
|
||||
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/account-financial-tools/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/account-financial-tools/issues/new?body=module:%20account_cash_basis_group_base_line%0Aversion:%2013.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="#id3">Credits</a></h1>
|
||||
<div class="section" id="authors">
|
||||
<h2><a class="toc-backref" href="#id4">Authors</a></h2>
|
||||
<ul class="simple">
|
||||
<li>Vauxoo</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="contributors">
|
||||
<h2><a class="toc-backref" href="#id5">Contributors</a></h2>
|
||||
<ul class="simple">
|
||||
<li>Humberto Arocha <<a class="reference external" href="mailto:hbto@vauxoo.com">hbto@vauxoo.com</a>></li>
|
||||
<li>Gabriela Mogollón <<a class="reference external" href="mailto:gmogollon@vauxoo.com">gmogollon@vauxoo.com</a>></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="maintainers">
|
||||
<h2><a class="toc-backref" href="#id6">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/account-financial-tools/tree/13.0/account_cash_basis_group_base_line">OCA/account-financial-tools</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>
|
||||
1
account_cash_basis_group_base_line/tests/__init__.py
Normal file
1
account_cash_basis_group_base_line/tests/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from . import test_reconciliation
|
||||
214
account_cash_basis_group_base_line/tests/test_reconciliation.py
Normal file
214
account_cash_basis_group_base_line/tests/test_reconciliation.py
Normal file
@@ -0,0 +1,214 @@
|
||||
from odoo.addons.account.tests.test_reconciliation import TestReconciliation
|
||||
|
||||
|
||||
class TestAccountReconciliationPartial(TestReconciliation):
|
||||
|
||||
"""Tests for Account Reconciliation Partial"""
|
||||
|
||||
def __init__(self, methodName="runTest"):
|
||||
super(TestAccountReconciliationPartial, self).__init__(methodName)
|
||||
# Skip original test from inherited class
|
||||
custom_attributes = set(dir(TestAccountReconciliationPartial)) - set(
|
||||
dir(TestReconciliation)
|
||||
)
|
||||
custom_test_methods = [
|
||||
name
|
||||
for name in custom_attributes
|
||||
if name.startswith("test_") and callable(getattr(self, name))
|
||||
]
|
||||
|
||||
if methodName not in custom_test_methods:
|
||||
method = getattr(self, methodName)
|
||||
method.__dict__["__unittest_skip__"] = True
|
||||
method.__dict__[
|
||||
"__unittest_skip_why__"
|
||||
] = "Test executed from original module"
|
||||
|
||||
def setUp(self):
|
||||
super(TestAccountReconciliationPartial, self).setUp()
|
||||
self.env.ref("base.main_company").write(
|
||||
{
|
||||
"tax_exigibility": True,
|
||||
"tax_cash_basis_journal_id": self.cash_basis_journal.id,
|
||||
}
|
||||
)
|
||||
|
||||
def test_reconciliation_cash_basis(self):
|
||||
# Simulates an expense made up by 2 lines
|
||||
# one is subject to a cash basis tax
|
||||
# the other is not subject to tax
|
||||
|
||||
aml_obj = self.env["account.move.line"].with_context(check_move_validity=False)
|
||||
|
||||
# Purchase
|
||||
purchase_move = self.env["account.move"].create(
|
||||
{"name": "purchase", "journal_id": self.purchase_journal.id}
|
||||
)
|
||||
|
||||
purchase_payable_line0 = aml_obj.create(
|
||||
{
|
||||
"account_id": self.account_rsa.id,
|
||||
"credit": 1350,
|
||||
"move_id": purchase_move.id,
|
||||
}
|
||||
)
|
||||
purchase_payable_line1 = aml_obj.create(
|
||||
{
|
||||
"account_id": self.account_rsa.id,
|
||||
"credit": 450,
|
||||
"move_id": purchase_move.id,
|
||||
}
|
||||
)
|
||||
aml_obj.create(
|
||||
{
|
||||
"name": "expenseTaxed_0",
|
||||
"account_id": self.expense_account.id,
|
||||
"debit": 1000,
|
||||
"move_id": purchase_move.id,
|
||||
"tax_ids": [(4, self.tax_cash_basis.id, False)],
|
||||
"tax_exigible": False,
|
||||
}
|
||||
)
|
||||
aml_obj.create(
|
||||
{
|
||||
"name": "expenseTaxed_1",
|
||||
"account_id": self.expense_account.id,
|
||||
"debit": 300,
|
||||
"move_id": purchase_move.id,
|
||||
"tax_ids": [(4, self.tax_cash_basis.id, False)],
|
||||
"tax_exigible": False,
|
||||
}
|
||||
)
|
||||
aml_obj.create(
|
||||
{
|
||||
"name": "expenseTaxed_2",
|
||||
"account_id": self.expense_account.id,
|
||||
"debit": 200,
|
||||
"move_id": purchase_move.id,
|
||||
"tax_ids": [(4, self.tax_cash_basis.id, False)],
|
||||
"tax_exigible": False,
|
||||
}
|
||||
)
|
||||
tax_line = aml_obj.create(
|
||||
{
|
||||
"name": "TaxLine",
|
||||
"account_id": self.tax_waiting_account.id,
|
||||
"debit": 300,
|
||||
"move_id": purchase_move.id,
|
||||
"tax_line_id": self.tax_cash_basis.id,
|
||||
"tax_exigible": False,
|
||||
"tax_repartition_line_id": (
|
||||
self.tax_cash_basis.invoice_repartition_line_ids.filtered(
|
||||
lambda x: x.repartition_type == "tax"
|
||||
).id
|
||||
),
|
||||
"tax_base_amount": 1500,
|
||||
}
|
||||
)
|
||||
purchase_move.post()
|
||||
|
||||
# Payment Move
|
||||
payment_move = self.env["account.move"].create(
|
||||
{"name": "payment", "journal_id": self.bank_journal_euro.id}
|
||||
)
|
||||
payment_payable_line = aml_obj.create(
|
||||
{
|
||||
"account_id": self.account_rsa.id,
|
||||
"debit": 1800,
|
||||
"move_id": payment_move.id,
|
||||
}
|
||||
)
|
||||
aml_obj.create(
|
||||
{
|
||||
"account_id": self.account_euro.id,
|
||||
"credit": 1800,
|
||||
"move_id": payment_move.id,
|
||||
}
|
||||
)
|
||||
payment_move.post()
|
||||
|
||||
to_reconcile = (
|
||||
(purchase_move + payment_move)
|
||||
.mapped("line_ids")
|
||||
.filtered(lambda l: l.account_id.internal_type == "payable")
|
||||
)
|
||||
to_reconcile.reconcile()
|
||||
|
||||
apr_ids = to_reconcile.matched_debit_ids | to_reconcile.matched_credit_ids
|
||||
cash_basis_moves = self.env["account.move"].search(
|
||||
[("tax_cash_basis_rec_id", "in", apr_ids.ids)],
|
||||
)
|
||||
|
||||
self.assertEqual(len(cash_basis_moves), 2, "There should be Two CABA Entries")
|
||||
self.assertTrue(cash_basis_moves.exists())
|
||||
|
||||
# check reconciliation in Payable account
|
||||
self.assertTrue(purchase_payable_line0.full_reconcile_id.exists())
|
||||
self.assertEqual(
|
||||
purchase_payable_line0.full_reconcile_id.reconciled_line_ids,
|
||||
purchase_payable_line0 + purchase_payable_line1 + payment_payable_line,
|
||||
)
|
||||
|
||||
cash_basis_aml_ids = cash_basis_moves.mapped("line_ids")
|
||||
# check reconciliation in the tax waiting account
|
||||
self.assertTrue(tax_line.full_reconcile_id.exists())
|
||||
self.assertEqual(
|
||||
tax_line.full_reconcile_id.reconciled_line_ids,
|
||||
cash_basis_aml_ids.filtered(
|
||||
lambda l: l.account_id == self.tax_waiting_account
|
||||
)
|
||||
+ tax_line,
|
||||
)
|
||||
|
||||
self.assertEqual(len(cash_basis_aml_ids), 8, "There should 8 lines not 16")
|
||||
|
||||
# check amounts
|
||||
cash_basis_move1 = cash_basis_moves.filtered(lambda m: m.amount_total == 1350)
|
||||
cash_basis_move2 = cash_basis_moves.filtered(lambda m: m.amount_total == 450)
|
||||
|
||||
self.assertTrue(cash_basis_move1.exists())
|
||||
self.assertTrue(cash_basis_move2.exists())
|
||||
|
||||
# For first move
|
||||
move_lines = cash_basis_move1.line_ids
|
||||
base_amount_tax_lines = move_lines.filtered(
|
||||
lambda l: l.account_id == self.tax_base_amount_account
|
||||
)
|
||||
self.assertEqual(len(base_amount_tax_lines), 2, "There should be 2 lines not 6")
|
||||
self.assertAlmostEqual(sum(base_amount_tax_lines.mapped("credit")), 1125)
|
||||
self.assertAlmostEqual(sum(base_amount_tax_lines.mapped("debit")), 1125)
|
||||
|
||||
self.assertAlmostEqual(
|
||||
(move_lines - base_amount_tax_lines)
|
||||
.filtered(lambda l: l.account_id == self.tax_waiting_account)
|
||||
.credit,
|
||||
225,
|
||||
)
|
||||
self.assertAlmostEqual(
|
||||
(move_lines - base_amount_tax_lines)
|
||||
.filtered(lambda l: l.account_id == self.tax_final_account)
|
||||
.debit,
|
||||
225,
|
||||
)
|
||||
|
||||
# For second move
|
||||
move_lines = cash_basis_move2.line_ids
|
||||
base_amount_tax_lines = move_lines.filtered(
|
||||
lambda l: l.account_id == self.tax_base_amount_account
|
||||
)
|
||||
self.assertEqual(len(base_amount_tax_lines), 2, "There should be 2 lines not 6")
|
||||
self.assertAlmostEqual(sum(base_amount_tax_lines.mapped("credit")), 375)
|
||||
self.assertAlmostEqual(sum(base_amount_tax_lines.mapped("debit")), 375)
|
||||
|
||||
self.assertAlmostEqual(
|
||||
(move_lines - base_amount_tax_lines)
|
||||
.filtered(lambda l: l.account_id == self.tax_waiting_account)
|
||||
.credit,
|
||||
75,
|
||||
)
|
||||
self.assertAlmostEqual(
|
||||
(move_lines - base_amount_tax_lines)
|
||||
.filtered(lambda l: l.account_id == self.tax_final_account)
|
||||
.debit,
|
||||
75,
|
||||
)
|
||||
Reference in New Issue
Block a user