Merge PR #1590 into 15.0

Signed-off-by kittiu
This commit is contained in:
OCA-git-bot
2024-03-03 07:44:11 +00:00
26 changed files with 1848 additions and 7 deletions

View File

@@ -0,0 +1,94 @@
================================
Assets - Compute Depre. in Batch
================================
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! 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/15.0/account_asset_compute_batch
: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-15-0/account-financial-tools-15-0-account_asset_compute_batch
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/webui/builds.html?repo=OCA/account-financial-tools&target_branch=15.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
This module extend existing "Compute Asset" feature by allowing to create an Compute Asset Batch (record) to track the computation.
**Table of contents**
.. contents::
:local:
Usage
=====
There are 2 ways to create "Compute Asset Batch"
1. On the Compute Assets wizards, choose "Create Batch" option,
1.1 Type in batch name and description.
1.2 Select asset profiles, to limit only some profiles to get computed.
1.3 Option to "Delay Compute Asset", will only create Batch record for user to execute it later.
2. Create Compute Asset Batch directly
2.1 Select date for depreciation
2.2 Type in batch name and descripton
2.3 Select asset profiles, to limit only some profiles to get computed.
2.4 Option to "Auto Compute" if you want to compute this batch by cron job.
2.4 Option to "Delay Post" if you want to post journal entry by cron job.
2.5 Click "Compute" button to compute asset.
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_asset_compute_batch%0Aversion:%2015.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
~~~~~~~
* Ecosoft
Contributors
~~~~~~~~~~~~
* `Ecosoft <http://ecosoft.co.th>`_:
* Kitti U. <kittiu@ecosoft.co.th>
* Pimolnat Suntian <pimolnats@ecosoft.co.th>
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/15.0/account_asset_compute_batch>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View File

@@ -0,0 +1,2 @@
from . import models
from . import wizard

View File

@@ -0,0 +1,19 @@
# Copyright 2021 Ecosoft Co., Ltd. (http://ecosoft.co.th)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
"name": "Assets - Compute Depre. in Batch",
"version": "15.0.1.0.0",
"license": "AGPL-3",
"depends": ["account_asset_management"],
"author": "Ecosoft, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/account-financial-tools",
"category": "Accounting & Finance",
"data": [
"data/service_cron.xml",
"security/account_asset_security.xml",
"security/ir.model.access.csv",
"wizard/account_asset_compute.xml",
"views/account_asset_compute_batch.xml",
],
}

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="ir_cron_auto_compute_draft_batch" model="ir.cron">
<field
name="name"
>Asset Compute Batch; Post draft batches with auto_compute set to True up to today</field>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="numbercall">-1</field>
<field
name="nextcall"
eval="(DateTime.now().replace(hour=2, minute=0) + timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S')"
/>
<field name="doall" eval="False" />
<field name="model_id" ref="model_account_asset_compute_batch" />
<field name="code">model._autocompute_draft_batches()</field>
<field name="state">code</field>
</record>
</odoo>

View File

@@ -0,0 +1,518 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_asset_compute_batch
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.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_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__message_needaction
msgid "Action Needed"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__activity_ids
msgid "Activities"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__activity_exception_decoration
msgid "Activity Exception Decoration"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__activity_state
msgid "Activity State"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__activity_type_icon
msgid "Activity Type Icon"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,help:account_asset_compute_batch.field_account_asset_compute_batch__date_end
msgid "All depreciation lines prior to this date will be computed"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch_profile_report__amount
msgid "Amount"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model,name:account_asset_compute_batch.model_account_asset
msgid "Asset"
msgstr ""
#. module: account_asset_compute_batch
#: code:addons/account_asset_compute_batch/wizard/account_asset_compute.py:0
#: model_terms:ir.ui.view,arch_db:account_asset_compute_batch.search_account_asset_compute_batch_filter
#: model_terms:ir.ui.view,arch_db:account_asset_compute_batch.view_account_asset_compute_batch_form
#: model_terms:ir.ui.view,arch_db:account_asset_compute_batch.view_account_asset_compute_batch_tree
#, python-format
msgid "Asset Compute Batch"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.actions.server,name:account_asset_compute_batch.ir_cron_auto_compute_draft_batch_ir_actions_server
#: model:ir.cron,cron_name:account_asset_compute_batch.ir_cron_auto_compute_draft_batch
#: model:ir.cron,name:account_asset_compute_batch.ir_cron_auto_compute_draft_batch
msgid ""
"Asset Compute Batch; Post draft batches with auto_compute set to True up to "
"today"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch_profile_report__profile_id
msgid "Asset Profile"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model,name:account_asset_compute_batch.model_account_asset_line
msgid "Asset depreciation table line"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__message_attachment_count
msgid "Attachment Count"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__auto_compute
msgid "Auto Compute"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,help:account_asset_compute_batch.field_account_asset_compute_batch__auto_compute
msgid "Auto compute draft batches with 'Date' up to today, by cron job"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute__batch_name
msgid "Batch Name"
msgstr ""
#. module: account_asset_compute_batch
#: model_terms:ir.ui.view,arch_db:account_asset_compute_batch.search_account_asset_compute_batch_filter
msgid "Batch Number"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.constraint,message:account_asset_compute_batch.constraint_account_asset_compute_batch_name_uniq
msgid "Batch name must be unique!"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__company_id
msgid "Company"
msgstr ""
#. module: account_asset_compute_batch
#: model_terms:ir.ui.view,arch_db:account_asset_compute_batch.view_account_asset_compute_batch_form
msgid "Compute"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.actions.act_window,name:account_asset_compute_batch.account_asset_compute_batch_action
#: model:ir.ui.menu,name:account_asset_compute_batch.account_asset_compute_batch_menu
msgid "Compute Asset Batch"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model,name:account_asset_compute_batch.model_account_asset_compute
msgid "Compute Assets"
msgstr ""
#. module: account_asset_compute_batch
#: code:addons/account_asset_compute_batch/models/account_asset_compute_batch.py:0
#, python-format
msgid "Compute Assets errors"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch_profile_report__compute_batch_id
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_move_line__compute_batch_id
msgid "Compute Batch"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model,name:account_asset_compute_batch.model_account_asset_compute_batch
msgid "Compute Depreciation Batch"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields.selection,name:account_asset_compute_batch.selection__account_asset_compute_batch__state__computed
msgid "Computed"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute__use_batch
msgid "Create Batch"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__create_uid
msgid "Created by"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__create_date
msgid "Created on"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__currency_id
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch_profile_report__currency_id
msgid "Currency"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,help:account_asset_compute_batch.field_account_asset_compute_batch__delay_post
msgid ""
"Dalay account posting of newly created journaly entries, by setting "
"auto_post=True, to be posted by cron job"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__date_end
msgid "Date"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute__delay_compute
msgid "Delay Compute Asset"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__delay_post
msgid "Delay Posting"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__depre_amount
msgid "Depreciation Amount"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model,name:account_asset_compute_batch.model_account_asset_compute_batch_profile_report
msgid "Depreciation Amount by Profile"
msgstr ""
#. module: account_asset_compute_batch
#: model_terms:ir.ui.view,arch_db:account_asset_compute_batch.view_account_asset_compute_batch_form
msgid "Depreciation By Profile"
msgstr ""
#. module: account_asset_compute_batch
#: model_terms:ir.ui.view,arch_db:account_asset_compute_batch.view_account_asset_compute_batch_form
msgid "Depreciations"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute__description
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__description
msgid "Description"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset__display_name
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute__display_name
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__display_name
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch_profile_report__display_name
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_line__display_name
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_move__display_name
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_move_line__display_name
msgid "Display Name"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields.selection,name:account_asset_compute_batch.selection__account_asset_compute_batch__state__draft
msgid "Draft"
msgstr ""
#. module: account_asset_compute_batch
#: code:addons/account_asset_compute_batch/models/account_asset_compute_batch.py:0
#, python-format
msgid ""
"Error while processing batches '%s': \n"
"\n"
"%s"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields.selection,name:account_asset_compute_batch.selection__account_asset_compute_batch__state__exception
#: model_terms:ir.ui.view,arch_db:account_asset_compute_batch.view_account_asset_compute_batch_form
msgid "Exception"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__note
msgid "Exception Error"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__message_follower_ids
msgid "Followers"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__message_channel_ids
msgid "Followers (Channels)"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__message_partner_ids
msgid "Followers (Partners)"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,help:account_asset_compute_batch.field_account_asset_compute_batch__activity_type_icon
msgid "Font awesome icon e.g. fa-tasks"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset__id
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute__id
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__id
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch_profile_report__id
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_line__id
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_move__id
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_move_line__id
msgid "ID"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__activity_exception_icon
msgid "Icon"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,help:account_asset_compute_batch.field_account_asset_compute_batch__activity_exception_icon
msgid "Icon to indicate an exception activity."
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,help:account_asset_compute_batch.field_account_asset_compute__batch_name
msgid "If batch name is specified, computation will be tracked by a batch"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,help:account_asset_compute_batch.field_account_asset_compute_batch__message_needaction
#: model:ir.model.fields,help:account_asset_compute_batch.field_account_asset_compute_batch__message_unread
msgid "If checked, new messages require your attention."
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,help:account_asset_compute_batch.field_account_asset_compute_batch__message_has_error
#: model:ir.model.fields,help:account_asset_compute_batch.field_account_asset_compute_batch__message_has_sms_error
msgid "If checked, some messages have a delivery error."
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__message_is_follower
msgid "Is Follower"
msgstr ""
#. module: account_asset_compute_batch
#: code:addons/account_asset_compute_batch/models/account_asset_compute_batch.py:0
#: model_terms:ir.ui.view,arch_db:account_asset_compute_batch.view_account_asset_compute_batch_form
#, python-format
msgid "Journal Entries"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model,name:account_asset_compute_batch.model_account_move
msgid "Journal Entry"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model,name:account_asset_compute_batch.model_account_move_line
msgid "Journal Item"
msgstr ""
#. module: account_asset_compute_batch
#: code:addons/account_asset_compute_batch/models/account_asset_compute_batch.py:0
#, python-format
msgid "Journal Items"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset____last_update
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute____last_update
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch____last_update
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch_profile_report____last_update
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_line____last_update
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_move____last_update
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_move_line____last_update
msgid "Last Modified on"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__write_uid
msgid "Last Updated by"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__write_date
msgid "Last Updated on"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__message_main_attachment_id
msgid "Main Attachment"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__message_has_error
msgid "Message Delivery error"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__message_ids
msgid "Messages"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__move_line_ids
msgid "Move Line"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__my_activity_date_deadline
msgid "My Activity Deadline"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__name
msgid "Name"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__activity_date_deadline
msgid "Next Activity Deadline"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__activity_summary
msgid "Next Activity Summary"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__activity_type_id
msgid "Next Activity Type"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__message_needaction_counter
msgid "Number of Actions"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__message_has_error_counter
msgid "Number of errors"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,help:account_asset_compute_batch.field_account_asset_compute_batch__message_needaction_counter
msgid "Number of messages which requires an action"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,help:account_asset_compute_batch.field_account_asset_compute_batch__message_has_error_counter
msgid "Number of messages with delivery error"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,help:account_asset_compute_batch.field_account_asset_compute_batch__message_unread_counter
msgid "Number of unread messages"
msgstr ""
#. module: account_asset_compute_batch
#: code:addons/account_asset_compute_batch/models/account_asset_compute_batch.py:0
#, python-format
msgid "Only draft batch can be deleted!"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__profile_report
msgid "Profile Report"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute__profile_ids
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__profile_ids
msgid "Profiles"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__activity_user_id
msgid "Responsible User"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__message_has_sms_error
msgid "SMS Delivery error"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,help:account_asset_compute_batch.field_account_asset_compute_batch__profile_ids
msgid "Selected asset to run depreciation. Run all profiles if left blank."
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__state
msgid "State"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,help:account_asset_compute_batch.field_account_asset_compute_batch__activity_state
msgid ""
"Status based on activities\n"
"Overdue: Due date is already passed\n"
"Today: Activity date is today\n"
"Planned: Future activities."
msgstr ""
#. module: account_asset_compute_batch
#: model_terms:ir.ui.view,arch_db:account_asset_compute_batch.view_account_asset_compute_batch_tree
msgid "Total"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,help:account_asset_compute_batch.field_account_asset_compute_batch__activity_exception_decoration
msgid "Type of the exception activity on record."
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__message_unread
msgid "Unread Messages"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__message_unread_counter
msgid "Unread Messages Counter"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,help:account_asset_compute_batch.field_account_asset_compute__use_batch
msgid "Use batch opton"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,field_description:account_asset_compute_batch.field_account_asset_compute_batch__website_message_ids
msgid "Website Messages"
msgstr ""
#. module: account_asset_compute_batch
#: model:ir.model.fields,help:account_asset_compute_batch.field_account_asset_compute_batch__website_message_ids
msgid "Website communication history"
msgstr ""

View File

@@ -0,0 +1,4 @@
from . import account_asset
from . import account_asset_line
from . import account_move
from . import account_asset_compute_batch

View File

@@ -0,0 +1,16 @@
# Copyright 2021 Ecosoft Co., Ltd. (http://ecosoft.co.th)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import models
class AccountAsset(models.Model):
_inherit = "account.asset"
def _get_asset_line_domain(self, date_end):
domain = super()._get_asset_line_domain(date_end)
if self.env.context.get("compute_profile_ids"):
domain.append(
("asset_id.profile_id", "in", self.env.context["compute_profile_ids"])
)
return domain

View File

@@ -0,0 +1,244 @@
# Copyright 2021 Ecosoft Co., Ltd. (http://ecosoft.co.th)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import logging
from sys import exc_info
from traceback import format_exception
from odoo import _, api, fields, models
from odoo.exceptions import ValidationError
_logger = logging.getLogger(__name__)
class AssetComputeBatch(models.Model):
_name = "account.asset.compute.batch"
_inherit = ["mail.thread", "mail.activity.mixin"]
_description = "Compute Depreciation Batch"
_check_company_auto = True
name = fields.Char(
required=True,
readonly=True,
states={"draft": [("readonly", False)]},
)
description = fields.Char(
required=True,
readonly=True,
states={"draft": [("readonly", False)]},
)
date_end = fields.Date(
string="Date",
required=True,
default=fields.Date.today,
readonly=True,
states={"draft": [("readonly", False)]},
help="All depreciation lines prior to this date will be computed",
)
note = fields.Text(string="Exception Error")
profile_ids = fields.Many2many(
comodel_name="account.asset.profile",
string="Profiles",
readonly=True,
states={"draft": [("readonly", False)]},
help="Selected asset to run depreciation. Run all profiles if left blank.",
)
company_id = fields.Many2one(
comodel_name="res.company",
string="Company",
readonly=True,
default=lambda self: self.env.company,
)
delay_post = fields.Boolean(
string="Delay Posting",
readonly=True,
states={"draft": [("readonly", False)]},
help="Dalay account posting of newly created journaly entries, "
"by setting auto_post=True, to be posted by cron job",
)
auto_compute = fields.Boolean(
readonly=True,
states={"draft": [("readonly", False)]},
help="Auto compute draft batches with 'Date' up to today, by cron job",
)
move_line_ids = fields.One2many(
comodel_name="account.move.line",
inverse_name="compute_batch_id",
readonly=True,
)
state = fields.Selection(
selection=[
("draft", "Draft"),
("computed", "Computed"),
("exception", "Exception"),
],
default="draft",
tracking=True,
index=True,
required=True,
readonly=True,
)
profile_report = fields.One2many(
comodel_name="account.asset.compute.batch.profile.report",
inverse_name="compute_batch_id",
)
currency_id = fields.Many2one(
comodel_name="res.currency",
default=lambda self: self.env.company.currency_id,
)
depre_amount = fields.Monetary(
string="Depreciation Amount",
compute="_compute_depre_amount",
)
_sql_constraints = [
("name_uniq", "UNIQUE(name)", "Batch name must be unique!"),
]
@api.depends("state")
def _compute_depre_amount(self):
res = self.env["account.move.line"].read_group(
[("compute_batch_id", "in", self.ids)],
["compute_batch_id", "debit"],
["compute_batch_id"],
)
res = {x["compute_batch_id"][0]: x["debit"] for x in res}
for rec in self:
rec.depre_amount = res.get(rec.id)
def unlink(self):
if self.filtered(lambda l: l.state != "draft"):
raise ValidationError(_("Only draft batch can be deleted!"))
return super().unlink()
def action_compute(self):
for batch in self:
assets = self.env["account.asset"].search([("state", "=", "open")])
created_move_ids, error_log = assets.with_context(
compute_batch_id=batch.id,
compute_profile_ids=batch.profile_ids.ids,
delay_post=batch.delay_post,
)._compute_entries(self.date_end, check_triggers=True)
if error_log:
batch.note = _("Compute Assets errors") + ":\n" + error_log
batch.state = "exception"
else:
batch.state = "computed"
def open_move_lines(self):
self.ensure_one()
action = {
"name": _("Journal Items"),
"view_type": "tree",
"view_mode": "list,form",
"res_model": "account.move.line",
"type": "ir.actions.act_window",
"context": {"search_default_group_by_account": True},
"domain": [("id", "in", self.move_line_ids.ids)],
}
return action
def open_moves(self):
self.ensure_one()
action = {
"name": _("Journal Entries"),
"view_type": "tree",
"view_mode": "list,form",
"res_model": "account.move",
"type": "ir.actions.act_window",
"context": {},
"domain": [("id", "in", self.move_line_ids.mapped("move_id").ids)],
}
return action
@api.model
def _autocompute_draft_batches(self):
"""This method is called from a cron job.
It is used to auto compute account.asset.compute.batch with auto_compute=True
"""
records = self.search(
[
("state", "=", "draft"),
("date_end", "<=", fields.Date.context_today(self)),
("auto_compute", "=", True),
]
)
for ids in self.env.cr.split_for_in_conditions(records.ids, size=1000):
batches = self.browse(ids)
try:
with self.env.cr.savepoint():
batches.action_compute()
except Exception:
exc_info()[0]
tb = "".join(format_exception(*exc_info()))
batch_ref = ", ".join(batches.mapped("name"))
error_msg = _(
"Error while processing batches %(batch_ref)s: \n\n%(tb)s"
) % {"batch_ref": batch_ref, "tb": tb}
_logger.error("%s, %s", self._name, error_msg)
class AccountAssetComputeBatchProfileReport(models.Model):
_name = "account.asset.compute.batch.profile.report"
_description = "Depreciation Amount by Profile"
_auto = False
_order = "profile_id desc"
compute_batch_id = fields.Many2one(
comodel_name="account.asset.compute.batch",
readonly=True,
)
profile_id = fields.Many2one(
string="Asset Profile",
comodel_name="account.asset.profile",
readonly=True,
)
currency_id = fields.Many2one(
comodel_name="res.currency",
readonly=True,
)
amount = fields.Monetary(
readonly=True,
)
@property
def _table_query(self):
return "%s %s %s %s" % (
self._select(),
self._from(),
self._where(),
self._group_by(),
)
@api.model
def _select(self):
return """
SELECT
min(ml.id) as id,
compute_batch_id,
p.id as profile_id,
currency_id,
sum(debit) as amount
"""
@api.model
def _from(self):
return """
FROM account_move_line ml
JOIN account_asset a on a.id = ml.asset_id
JOIN account_asset_profile p on p.id = a.profile_id
"""
@api.model
def _where(self):
return """
WHERE
compute_batch_id IS NOT NULL
"""
@api.model
def _group_by(self):
return """
GROUP BY
compute_batch_id,
p.id,
currency_id
"""

View File

@@ -0,0 +1,16 @@
# Copyright 2021 Ecosoft Co., Ltd. (http://ecosoft.co.th)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import models
class AccountAssetLine(models.Model):
_inherit = "account.asset.line"
def _setup_move_line_data(self, depreciation_date, account, ml_type, move):
move_line_data = super()._setup_move_line_data(
depreciation_date, account, ml_type, move
)
if self.env.context.get("compute_batch_id"):
move_line_data["compute_batch_id"] = self.env.context["compute_batch_id"]
return move_line_data

View File

@@ -0,0 +1,25 @@
# Copyright 2021 Ecosoft Co., Ltd. (http://ecosoft.co.th)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
class AccountMove(models.Model):
_inherit = "account.move"
def action_post(self):
if self.env.context.get("delay_post"):
self.write({"auto_post": True})
return False
return super().action_post()
class AccountMoveLine(models.Model):
_inherit = "account.move.line"
compute_batch_id = fields.Many2one(
comodel_name="account.asset.compute.batch",
index=True,
ondelete="set null",
readonly=True,
)

View File

@@ -0,0 +1,4 @@
* `Ecosoft <http://ecosoft.co.th>`_:
* Kitti U. <kittiu@ecosoft.co.th>
* Pimolnat Suntian <pimolnats@ecosoft.co.th>

View File

@@ -0,0 +1 @@
This module extend existing "Compute Asset" feature by allowing to create an Compute Asset Batch (record) to track the computation.

View File

@@ -0,0 +1,14 @@
There are 2 ways to create "Compute Asset Batch"
1. On the Compute Assets wizards, choose "Create Batch" option,
1.1 Type in batch name and description.
1.2 Select asset profiles, to limit only some profiles to get computed.
1.3 Option to "Delay Compute Asset", will only create Batch record for user to execute it later.
2. Create Compute Asset Batch directly
2.1 Select date for depreciation
2.2 Type in batch name and descripton
2.3 Select asset profiles, to limit only some profiles to get computed.
2.4 Option to "Auto Compute" if you want to compute this batch by cron job.
2.4 Option to "Delay Post" if you want to post journal entry by cron job.
2.5 Click "Compute" button to compute asset.

View File

@@ -0,0 +1,10 @@
<odoo noupdate="1">
<record id="account_asset_compute_batch_multi_company_rule" model="ir.rule">
<field name="name">Asset Compute Batch multi-company</field>
<field name="model_id" ref="model_account_asset_compute_batch" />
<field eval="True" name="global" />
<field
name="domain_force"
>['|', ('company_id', '=', False), ('company_id', 'in', company_ids)]</field>
</record>
</odoo>

View File

@@ -0,0 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_account_asset_compute_batch_invoice,account.asset.compute.batch,model_account_asset_compute_batch,account.group_account_invoice,1,1,1,1
access_account_asset_compute_batch_profile_report,access_account_asset_compute_batch_profile_report,model_account_asset_compute_batch_profile_report,base.group_user,1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_account_asset_compute_batch_invoice account.asset.compute.batch model_account_asset_compute_batch account.group_account_invoice 1 1 1 1
3 access_account_asset_compute_batch_profile_report access_account_asset_compute_batch_profile_report model_account_asset_compute_batch_profile_report base.group_user 1 0 0 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@@ -0,0 +1,447 @@
<?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: http://docutils.sourceforge.net/" />
<title>Assets - Compute Depre. in Batch</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="assets-compute-depre-in-batch">
<h1 class="title">Assets - Compute Depre. in Batch</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/15.0/account_asset_compute_batch"><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-15-0/account-financial-tools-15-0-account_asset_compute_batch"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runboat.odoo-community.org/webui/builds.html?repo=OCA/account-financial-tools&amp;target_branch=15.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>This module extend existing “Compute Asset” feature by allowing to create an Compute Asset Batch (record) to track the computation.</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>There are 2 ways to create “Compute Asset Batch”</p>
<ol class="arabic simple">
<li><dl class="first docutils">
<dt>On the Compute Assets wizards, choose “Create Batch” option,</dt>
<dd>1.1 Type in batch name and description.
1.2 Select asset profiles, to limit only some profiles to get computed.
1.3 Option to “Delay Compute Asset”, will only create Batch record for user to execute it later.</dd>
</dl>
</li>
<li><dl class="first docutils">
<dt>Create Compute Asset Batch directly</dt>
<dd>2.1 Select date for depreciation
2.2 Type in batch name and descripton
2.3 Select asset profiles, to limit only some profiles to get computed.
2.4 Option to “Auto Compute” if you want to compute this batch by cron job.
2.4 Option to “Delay Post” if you want to post journal entry by cron job.
2.5 Click “Compute” button to compute asset.</dd>
</dl>
</li>
</ol>
</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_asset_compute_batch%0Aversion:%2015.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>Ecosoft</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#id5">Contributors</a></h2>
<ul class="simple">
<li><a class="reference external" href="http://ecosoft.co.th">Ecosoft</a>:<ul>
<li>Kitti U. &lt;<a class="reference external" href="mailto:kittiu&#64;ecosoft.co.th">kittiu&#64;ecosoft.co.th</a>&gt;</li>
<li>Pimolnat Suntian &lt;<a class="reference external" href="mailto:pimolnats&#64;ecosoft.co.th">pimolnats&#64;ecosoft.co.th</a>&gt;</li>
</ul>
</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/15.0/account_asset_compute_batch">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>

View File

@@ -0,0 +1 @@
from . import test_account_asset_compute_batch

View File

@@ -0,0 +1,165 @@
# Copyright 2021 Ecosoft Co., Ltd. (http://ecosoft.co.th)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import time
from freezegun import freeze_time
from odoo.tests import tagged
from odoo.tests.common import Form
from odoo.addons.account_asset_management.tests.test_account_asset_management import (
TestAssetManagement,
)
@tagged("post_install", "-at_install")
class TestAssetComputeBatch(TestAssetManagement):
@classmethod
def setUpClass(cls):
super().setUpClass()
# Create 3 assets from 2 profiles
cls.ict0 = cls.asset_model.create(
{
"state": "draft",
"method_time": "year",
"method_number": 3,
"method_period": "year",
"name": "Laptop",
"code": "PI00101",
"purchase_value": 1500.0,
"profile_id": cls.ict3Y.id,
"date_start": time.strftime("2000-01-01"),
}
)
cls.ict1 = cls.asset_model.create(
{
"state": "draft",
"method_time": "year",
"method_number": 3,
"method_period": "year",
"name": "Monitor",
"code": "PI00102",
"purchase_value": 2100.0,
"profile_id": cls.ict3Y.id,
"date_start": time.strftime("2000-01-01"),
}
)
# 2nd asset
cls.vehicle0 = cls.asset_model.create(
{
"state": "draft",
"method_time": "year",
"method_number": 5,
"method_period": "year",
"name": "CEO's Car",
"purchase_value": 12000.0,
"salvage_value": 2000.0,
"profile_id": cls.car5y.id,
"date_start": time.strftime("2000-01-01"),
}
)
def _create_compute_wizard(self, use_batch=False, delay_compute=False):
with Form(self.env["account.asset.compute"]) as f:
f.batch_name = "Test Batch"
f.description = "Compute asset with 2 profiles"
f.profile_ids.add(self.ict3Y)
f.profile_ids.add(self.car5y)
f.use_batch = use_batch
f.delay_compute = delay_compute
wiz = f.save()
return wiz
@freeze_time("2000-12-31")
def test_01_asset_compute_batch_normal(self):
# Confirm 3 assets
self.ict0.validate()
self.assertEqual(self.ict0.depreciation_line_ids[1].amount, 500)
self.ict1.validate()
self.assertEqual(self.ict1.depreciation_line_ids[1].amount, 700)
self.vehicle0.validate()
self.assertEqual(self.vehicle0.depreciation_line_ids[1].amount, 2000)
# Compute Asset, no delay
wiz = self._create_compute_wizard(use_batch=True)
res = wiz.asset_compute()
batch = self.env["account.asset.compute.batch"].browse(res["res_id"])
self.assertEqual(batch.state, "computed")
self.assertEqual(batch.depre_amount, 3200)
# Test summary amount by profile
batch.invalidate_cache()
self.assertEqual(
{x.profile_id: x.amount for x in batch.profile_report},
{self.ict3Y: 1200, self.car5y: 2000},
)
# Test view moves
# 3 account.move
res = batch.open_moves()
self.assertEqual(len(res["domain"][0][2]), 3)
# 6 account.move.line
res = batch.open_move_lines()
self.assertEqual(len(res["domain"][0][2]), 6)
@freeze_time("2000-12-31")
def test_02_asset_compute_batch_delay_compute(self):
# Confirm 2 assets
self.ict0.validate()
self.assertEqual(self.ict0.depreciation_line_ids[1].amount, 500)
self.vehicle0.validate()
self.assertEqual(self.vehicle0.depreciation_line_ids[1].amount, 2000)
# Compute Asset, with delay
wiz = self._create_compute_wizard(use_batch=True, delay_compute=True)
res = wiz.asset_compute()
batch = self.env["account.asset.compute.batch"].browse(res["res_id"])
self.assertEqual(batch.state, "draft")
self.assertEqual(batch.depre_amount, 0)
# Batch is still draft, require to click compute
batch.action_compute()
self.assertEqual(batch.state, "computed")
self.assertEqual(batch.depre_amount, 2500)
@freeze_time("2000-12-31")
def test_03_asset_compute_batch_delay_compute_delay_post(self):
# Confirm 2 assets
self.ict0.validate()
self.assertEqual(self.ict0.depreciation_line_ids[1].amount, 500)
self.vehicle0.validate()
self.assertEqual(self.vehicle0.depreciation_line_ids[1].amount, 2000)
# Compute Asset, with delay
wiz = self._create_compute_wizard(use_batch=True, delay_compute=True)
res = wiz.asset_compute()
batch = self.env["account.asset.compute.batch"].browse(res["res_id"])
self.assertEqual(batch.state, "draft")
self.assertEqual(batch.depre_amount, 0)
batch.delay_post = True
# Batch is still draft, require to click compute
batch.action_compute()
self.assertEqual(batch.state, "computed")
self.assertEqual(batch.depre_amount, 2500)
# All account.move is flag as auto_post = True, and state in draft
self.assertTrue(all(batch.move_line_ids.mapped("move_id.auto_post")))
self.assertTrue(
all(
state == "draft"
for state in batch.move_line_ids.mapped("move_id.state")
)
)
@freeze_time("2000-12-31")
def test_04_asset_compute_batch_auto_compute(self):
# Confirm 2 assets
self.ict0.validate()
self.assertEqual(self.ict0.depreciation_line_ids[1].amount, 500)
self.vehicle0.validate()
self.assertEqual(self.vehicle0.depreciation_line_ids[1].amount, 2000)
# Compute Asset, with delay
wiz = self._create_compute_wizard(use_batch=True, delay_compute=True)
res = wiz.asset_compute()
batch = self.env["account.asset.compute.batch"].browse(res["res_id"])
self.assertEqual(batch.state, "draft")
self.assertEqual(batch.depre_amount, 0)
batch.auto_compute = True
# Batch will be posted by cron job
batch._autocompute_draft_batches()
self.assertEqual(batch.state, "computed")
self.assertEqual(batch.depre_amount, 2500)

View File

@@ -0,0 +1,147 @@
<odoo>
<record id="view_account_asset_compute_batch_form" model="ir.ui.view">
<field name="name">account.asset.compute.batch.form</field>
<field name="model">account.asset.compute.batch</field>
<field name="priority">10</field>
<field name="arch" type="xml">
<form string="Asset Compute Batch">
<header>
<button
name="action_compute"
states="draft"
type="object"
string="Compute"
class="oe_highlight"
/>
<field
name="state"
widget="statusbar"
statusbar_visible="draft,computed"
/>
</header>
<sheet>
<div class="oe_button_box" name="button_box">
<button
name="open_moves"
icon="fa-bars"
class="oe_stat_button"
string="Journal Entries"
type="object"
/>
<button
name="open_move_lines"
icon="fa-bars"
class="oe_stat_button"
string="Depreciations"
type="object"
/>
</div>
<div class="oe_title">
<h1>
<field name="name" />
</h1>
</div>
<group name="main_group">
<group>
<field name="description" />
<field name="date_end" />
<field name="auto_compute" />
<field name="delay_post" />
</group>
<group>
<field
name="company_id"
groups="base.group_multi_company"
/>
<field name="profile_ids" widget="many2many_tags">
<tree>
<field name="name" />
</tree>
</field>
</group>
</group>
<notebook>
<page string="Depreciation By Profile" name="profile_report">
<field name="profile_report" readonly="1">
<tree>
<field name="profile_id" />
<field name="currency_id" invisible="1" />
<field name="amount" />
</tree>
</field>
<group class="oe_subtotal_footer oe_right">
<field name="currency_id" invisible="1" />
<div class="oe_subtotal_footer_separator oe_inline">
<label for="depre_amount" />
</div>
<field
name="depre_amount"
nolabel="1"
class="oe_subtotal_footer_separator"
/>
</group>
</page>
<page string="Exception" name="exception" states="exception">
<field name="note" readonly="1" />
</page>
</notebook>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" />
<field name="activity_ids" />
<field name="message_ids" />
</div>
</form>
</field>
</record>
<record id="view_account_asset_compute_batch_tree" model="ir.ui.view">
<field name="name">account.asset.compute.batch.tree</field>
<field name="model">account.asset.compute.batch</field>
<field name="arch" type="xml">
<tree>
<field name="name" />
<field name="description" />
<field name="date_end" />
<field name="profile_ids" widget="many2many_tags" optional="hide" />
<field name="depre_amount" sum="Total" />
<field
name="state"
widget="badge"
decoration-info="state == 'draft'"
decoration-success="state == 'computed'"
decoration-danger="state == 'exception'"
/>
<field name="company_id" groups="base.group_multi_company" />
</tree>
</field>
</record>
<record model="ir.ui.view" id="search_account_asset_compute_batch_filter">
<field name="name">search.account.asset.compute.batch.filter</field>
<field name="model">account.asset.compute.batch</field>
<field name="arch" type="xml">
<search string="Asset Compute Batch">
<field
name="name"
string="Batch Number"
filter_domain="[('name', 'ilike', self)]"
/>
</search>
</field>
</record>
<record id="account_asset_compute_batch_action" model="ir.actions.act_window">
<field name="name">Compute Asset Batch</field>
<field name="res_model">account.asset.compute.batch</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="view_account_asset_compute_batch_tree" />
<field name="search_view_id" ref="search_account_asset_compute_batch_filter" />
</record>
<menuitem
id="account_asset_compute_batch_menu"
action="account_asset_compute_batch_action"
parent="account_asset_management.menu_finance_assets"
sequence="200"
/>
</odoo>

View File

@@ -0,0 +1 @@
from . import account_asset_compute

View File

@@ -0,0 +1,40 @@
# Copyright 2021 Ecosoft Co., Ltd. (http://ecosoft.co.th)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import _, fields, models
class AccountAssetCompute(models.TransientModel):
_inherit = "account.asset.compute"
use_batch = fields.Boolean(string="Create Batch", help="Use batch opton")
batch_name = fields.Char(
help="If batch name is specified, computation will be tracked by a batch",
)
description = fields.Char()
profile_ids = fields.Many2many(
comodel_name="account.asset.profile",
string="Profiles",
)
delay_compute = fields.Boolean(string="Delay Compute Asset")
def asset_compute(self):
if self.use_batch:
vals = {
"date_end": self.date_end,
"name": self.batch_name,
"description": self.description,
"profile_ids": [(4, x.id) for x in self.profile_ids],
}
batch = self.env["account.asset.compute.batch"].create(vals)
if not self.delay_compute:
batch.action_compute()
return {
"name": _("Asset Compute Batch"),
"type": "ir.actions.act_window",
"view_type": "form",
"view_mode": "form",
"res_model": "account.asset.compute.batch",
"res_id": batch.id,
}
return super().asset_compute()

View File

@@ -0,0 +1,41 @@
<odoo>
<record id="account_asset_compute_view_form" model="ir.ui.view">
<field name="name">account.asset.compute</field>
<field name="model">account.asset.compute</field>
<field
name="inherit_id"
ref="account_asset_management.account_asset_compute_view_form"
/>
<field name="arch" type="xml">
<group position="after">
<group>
<group>
<field name="use_batch" widget="boolean_toggle" />
<field
name="batch_name"
attrs="{'invisible': [('use_batch', '=', False)], 'required': [('use_batch', '=', True)]}"
/>
<field
name="description"
attrs="{'invisible': [('use_batch', '=', False)], 'required': [('use_batch', '=', True)]}"
/>
<field
name="delay_compute"
attrs="{'invisible': [('use_batch', '=', False)]}"
/>
</group>
<group>
<field
name="profile_ids"
attrs="{'invisible': [('use_batch', '=', False)]}"
>
<tree>
<field name="name" />
</tree>
</field>
</group>
</group>
</group>
</field>
</record>
</odoo>

View File

@@ -1215,6 +1215,15 @@ class AccountAsset(models.Model):
"""use this method to customise the name of the accounting entry"""
return (self.code or str(self.id)) + "/" + str(seq)
def _get_asset_line_domain(self, date_end):
return [
("asset_id", "in", self.ids),
("type", "=", "depreciate"),
("init_entry", "=", False),
("line_date", "<=", date_end),
("move_check", "=", False),
]
def _compute_entries(self, date_end, check_triggers=False):
# TODO : add ir_cron job calling this method to
# generate periodical accounting entries
@@ -1230,13 +1239,7 @@ class AccountAsset(models.Model):
asset.compute_depreciation_board()
depreciations = self.env["account.asset.line"].search(
[
("asset_id", "in", self.ids),
("type", "=", "depreciate"),
("init_entry", "=", False),
("line_date", "<=", date_end),
("move_check", "=", False),
],
self._get_asset_line_domain(date_end),
order="line_date",
)
for depreciation in depreciations:

View File

@@ -0,0 +1 @@
../../../../account_asset_compute_batch

View File

@@ -0,0 +1,6 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)