Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[14.0][ADD] account_budget_oca_analytic_tag #58

Open
wants to merge 3 commits into
base: 14.0
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions .copier-answers.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,10 @@ odoo_version: 14.0
org_name: Odoo Community Association (OCA)
org_slug: OCA
rebel_module_groups: []
repo_description: 'TODO: add repo description.'
repo_name: account-budgeting
repo_description: You'll find modules that manage budgeting.
repo_name: Odoo Budgeting
repo_slug: account-budgeting
repo_website: https://github.com/OCA/account-budgeting
travis_apt_packages: []
travis_apt_sources: []

4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@

<!-- /!\ do not modify above this line -->

# account-budgeting
# Odoo Budgeting

TODO: add repo description.
You'll find modules that manage budgeting.

<!-- /!\ do not modify below this line -->

Expand Down
24 changes: 24 additions & 0 deletions account_budget_oca_analytic_tag/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
.. image:: https://img.shields.io/badge/licence-LGPL--3-blue.svg
:target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html
:alt: License: LGPL-3

===============================
OSI Account Budget Analytic Tag
===============================

This module allows you to select an analytic tag on the budget line and report the consumed budget using that tag.

Usage
=====

No special usage instructions

Credits
=======

* Maxime Chambreuil <[email protected]>

Contributors
------------

* Open Source Integrators <http://www.opensourceintegrators.com>
3 changes: 3 additions & 0 deletions account_budget_oca_analytic_tag/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).

from . import models
20 changes: 20 additions & 0 deletions account_budget_oca_analytic_tag/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Copyright (c) 2021 Open Source Integrators
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

{
"name": "OSI Account Budget OCA Analytic Tag",
"version": "14.0.1.0.0",
"license": "AGPL-3",
"summary": "This module allows you to select an analytic tag on the budget"
" line and report the consumed budget using that tag.",
"author": "Open Source Integrators, Odoo Community Association (OCA)",
"maintainer": "Open Source Integrators",
"website": "https://github.com/OCA/account-budgeting",
"category": "Accounting",
"depends": ["account_budget_oca"],
"data": [
"views/account_budget_views.xml",
],
"installable": True,
"maintainers": ["max3903"],
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_budget_analytic_tag
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0+e-20211202\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-12-23 19:57+0000\n"
"PO-Revision-Date: 2021-12-23 19:57+0000\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_budget_analytic_tag
#: model:ir.model.fields,field_description:account_budget_analytic_tag.field_crossovered_budget_lines__analytic_tag_id
msgid "Analytic Tag"
msgstr ""

#. module: account_budget_analytic_tag
#: model:ir.model,name:account_budget_analytic_tag.model_crossovered_budget_lines
msgid "Budget Line"
msgstr ""

#. module: account_budget_analytic_tag
#: model:ir.model.fields,field_description:account_budget_analytic_tag.field_crossovered_budget_lines__display_name
msgid "Display Name"
msgstr ""

#. module: account_budget_analytic_tag
#: model:ir.model.fields,field_description:account_budget_analytic_tag.field_crossovered_budget_lines__id
msgid "ID"
msgstr ""

#. module: account_budget_analytic_tag
#: model:ir.model.fields,field_description:account_budget_analytic_tag.field_crossovered_budget_lines____last_update
msgid "Last Modified on"
msgstr ""

#. module: account_budget_analytic_tag
#: code:addons/account_budget_analytic_tag/models/account_budget.py:0
#, python-format
msgid ""
"You have to enter at least a budgetary position or analytic account or "
"analytic tag on a budget line."
msgstr ""
51 changes: 51 additions & 0 deletions account_budget_oca_analytic_tag/i18n/es.po
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_budget_analytic_tag
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0+e-20211202\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-12-23 19:57+0000\n"
"PO-Revision-Date: 2021-12-23 19:57+0000\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_budget_analytic_tag
#: model:ir.model.fields,field_description:account_budget_analytic_tag.field_crossovered_budget_lines__analytic_tag_id
msgid "Analytic Tag"
msgstr "Etiqueta analítica"

#. module: account_budget_analytic_tag
#: model:ir.model,name:account_budget_analytic_tag.model_crossovered_budget_lines
msgid "Budget Line"
msgstr "Línea de presupuesto"

#. module: account_budget_analytic_tag
#: model:ir.model.fields,field_description:account_budget_analytic_tag.field_crossovered_budget_lines__display_name
msgid "Display Name"
msgstr "Nombre"

#. module: account_budget_analytic_tag
#: model:ir.model.fields,field_description:account_budget_analytic_tag.field_crossovered_budget_lines__id
msgid "ID"
msgstr ""

#. module: account_budget_analytic_tag
#: model:ir.model.fields,field_description:account_budget_analytic_tag.field_crossovered_budget_lines____last_update
msgid "Last Modified on"
msgstr "Ultima modificación el"

#. module: account_budget_analytic_tag
#: code:addons/account_budget_analytic_tag/models/account_budget.py:0
#, python-format
msgid ""
"You have to enter at least a budgetary position or analytic account or "
"analytic tag on a budget line."
msgstr ""
"Deben entrar por lo menos una posicion presupuestarial, cuenta analítica o etiqueta "
"analítica en una línea de presupuesto."
3 changes: 3 additions & 0 deletions account_budget_oca_analytic_tag/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).

from . import account_budget
73 changes: 73 additions & 0 deletions account_budget_oca_analytic_tag/models/account_budget.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
# Copyright (c) 2021 Open Source Integrators
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from odoo import _, api, fields, models
from odoo.exceptions import ValidationError


class CrossoveredBudgetLines(models.Model):
_inherit = "crossovered.budget.lines"

analytic_tag_id = fields.Many2one("account.analytic.tag", string="Analytic Tag")

def _compute_practical_amount(self):
"""Overwrite this method for to count practical_amount based on
analytic_tag_id on move line."""
for line in self:
acc_ids = line.general_budget_id.account_ids.ids
date_to = line.date_to
date_from = line.date_from
if line.analytic_account_id.id:
self.env.cr.execute(

Check warning on line 21 in account_budget_oca_analytic_tag/models/account_budget.py

View check run for this annotation

Codecov / codecov/patch

account_budget_oca_analytic_tag/models/account_budget.py#L16-L21

Added lines #L16 - L21 were not covered by tests
"""
SELECT SUM(amount)
FROM account_analytic_line
WHERE account_id=%s
AND (date between %s
AND %s)
AND general_account_id=ANY(%s)""",
(line.analytic_account_id.id, date_from, date_to, acc_ids),
)
result = self.env.cr.fetchone()[0] or 0.0

Check warning on line 31 in account_budget_oca_analytic_tag/models/account_budget.py

View check run for this annotation

Codecov / codecov/patch

account_budget_oca_analytic_tag/models/account_budget.py#L31

Added line #L31 was not covered by tests

elif line.general_budget_id.account_ids:
self.env.cr.execute(

Check warning on line 34 in account_budget_oca_analytic_tag/models/account_budget.py

View check run for this annotation

Codecov / codecov/patch

account_budget_oca_analytic_tag/models/account_budget.py#L33-L34

Added lines #L33 - L34 were not covered by tests
"""
SELECT SUM(credit) - SUM(debit)
FROM account_move_line aml
LEFT JOIN account_move am ON aml.move_id = am.id
LEFT JOIN
account_analytic_tag_account_move_line_rel aat
ON aat.account_move_line_id = aml.id
WHERE state=%s
AND account_id in %s
AND (aml.date between %s
AND %s)
AND aat.account_analytic_tag_id=%s""",
(
"posted",
tuple(line.general_budget_id.account_ids.ids),
date_from,
date_to,
line.analytic_tag_id.id or 0.0,
),
)
result = self.env.cr.fetchone()[0]

Check warning on line 55 in account_budget_oca_analytic_tag/models/account_budget.py

View check run for this annotation

Codecov / codecov/patch

account_budget_oca_analytic_tag/models/account_budget.py#L55

Added line #L55 was not covered by tests
else:
result = 0.0
line.practical_amount = result

Check warning on line 58 in account_budget_oca_analytic_tag/models/account_budget.py

View check run for this annotation

Codecov / codecov/patch

account_budget_oca_analytic_tag/models/account_budget.py#L57-L58

Added lines #L57 - L58 were not covered by tests

@api.constrains("general_budget_id", "analytic_account_id", "analytic_tag_id")
def _must_have_analytical_or_budgetary_or_both(self):
for record in self:
if (
not record.analytic_account_id
and not record.general_budget_id
and not record.analytic_tag_id
):
raise ValidationError(

Check warning on line 68 in account_budget_oca_analytic_tag/models/account_budget.py

View check run for this annotation

Codecov / codecov/patch

account_budget_oca_analytic_tag/models/account_budget.py#L68

Added line #L68 was not covered by tests
_(
"You have to enter at least a budgetary position or analytic account"
" or analytic tag on a budget line."
)
)
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions account_budget_oca_analytic_tag/tests/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Copyright (C) 2022 Open Source Integrators (https://www.opensourceintegrators.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from . import test_account_budget_oca_analytic_tag
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
# Copyright (C) 2022 Open Source Integrators (https://www.opensourceintegrators.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from odoo.tests import common


class TestBudgetAnalyticTag(common.TransactionCase):
def setUp(self):
super(TestBudgetAnalyticTag, self).setUp()

self.budget_position_obj = self.env["account.budget.post"]
self.exp_account_type = self.env.ref("account.data_account_type_expenses")
self.company_id = self.env.ref("base.main_company")
self.analytic_account_id = self.env.ref("analytic.analytic_agrolait")
self.user_id = self.env.ref("base.user_admin")
self.partner_id = self.env.ref("base.res_partner_2")
self.product_id = self.env.ref("product.product_product_8")
self.budget_position_id = self.test_create_budget_position()

def test_create_budget_position(self):
account_ids = (
self.env["account.account"]
.search(
[
("company_id", "=", self.company_id.id),
("user_type_id", "=", self.exp_account_type.id),
]
)
.ids
)
self.account_budget_post_purchase0 = self.env["account.budget.post"].create(
{"name": "Purchases", "account_ids": [(6, None, account_ids)]}
)
return self.budget_position_obj.create(
{
"name": "Budget Position",
"company_id": self.company_id.id,
"account_ids": [(6, 0, account_ids)],
}
)

def test_budget_creation(self):
budget_id = self.env["crossovered.budget"].create(
{
"name": "Budget 2022",
"creating_user_id": self.user_id.id,
"company_id": self.company_id.id,
"date_from": "2022-01-01",
"date_to": "2022-06-30",
"crossovered_budget_line_ids": [
(
0,
0,
{
"general_budget_id": self.budget_position_id.id,
"analytic_account_id": self.analytic_account_id.id,
"date_from": "2022-01-01",
"date_to": "2022-06-30",
"planned_amount": 10000.00,
},
)
],
}
)
# Add line to budget
line_id = self.env["crossovered.budget.lines"].create(
{
"crossovered_budget_id": budget_id.id,
"date_from": "2022-01-01",
"date_to": "2022-06-30",
"general_budget_id": self.budget_position_id.id,
"planned_amount": 30000.0,
}
)
# Modify budget line
line_id.write(
{
"general_budget_id": self.account_budget_post_purchase0.id,
"planned_amount": 25000.0,
}
)
budget_id.action_budget_confirm()
budget_id.action_budget_validate()
41 changes: 41 additions & 0 deletions account_budget_oca_analytic_tag/views/account_budget_views.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<odoo>

<record
id="crossovered_budget_view_form_inherit_account_budget_analytic_tag"
model="ir.ui.view"
>
<field name="name">crossovered.budget.view.form.inherit.analytic_tag</field>
<field name="model">crossovered.budget</field>
<field
name="inherit_id"
ref="account_budget_oca.crossovered_budget_view_form"
/>
<field name="arch" type="xml">
<xpath
expr="//page//tree//field[@name='analytic_account_id']"
position="attributes"
>
<attribute name="required">0</attribute>
</xpath>
<xpath
expr="//page//form//field[@name='analytic_account_id']"
position="attributes"
>
<attribute name="required">0</attribute>
</xpath>
<xpath
expr="//page//tree//field[@name='analytic_account_id']"
position="after"
>
<field name="analytic_tag_id" />
</xpath>
<xpath
expr="//page//form//field[@name='analytic_account_id']"
position="after"
>
<field name="analytic_tag_id" />
</xpath>
</field>
</record>

</odoo>
6 changes: 6 additions & 0 deletions setup/account_budget_oca_analytic_tag/setup.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import setuptools

setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)