Add odex25_accounting
|
|
@ -1,2 +1,2 @@
|
||||||
# odex25-standard-moduless
|
# odex25-standard-modules
|
||||||
This Repo contains general standard modules for all projects.
|
This Repo contains general standard modules for all projects.
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#################################################################################
|
||||||
|
#
|
||||||
|
# Odoo, Open Source Management Solution
|
||||||
|
# Copyright (C) 2022-today Ascetic Business Solution <www.asceticbs.com>
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Affero General Public License as
|
||||||
|
# published by the Free Software Foundation, either version 3 of the
|
||||||
|
# License, or (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
#################################################################################
|
||||||
|
from . import models
|
||||||
|
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#################################################################################
|
||||||
|
#
|
||||||
|
# Odoo, Open Source Management Solution
|
||||||
|
# Copyright (C) 2022-today Ascetic Business Solution <www.asceticbs.com>
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Affero General Public License as
|
||||||
|
# published by the Free Software Foundation, either version 3 of the
|
||||||
|
# License, or (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
#################################################################################
|
||||||
|
{
|
||||||
|
'name': "Customer duplicate validation",
|
||||||
|
'author': 'Ascetic Business Solution',
|
||||||
|
'category': 'Odex25-Accounting/Odex25-Accounting',
|
||||||
|
'summary': """Notify about duplicate while creating partner""",
|
||||||
|
'website': 'http://www.asceticbs.com',
|
||||||
|
'license': 'AGPL-3',
|
||||||
|
'description': """
|
||||||
|
""",
|
||||||
|
'version': '14.0',
|
||||||
|
'depends': ['base', 'sale'],
|
||||||
|
'data': ['security/security.xml'],
|
||||||
|
'images': ['static/description/banner.png'],
|
||||||
|
'installable': True,
|
||||||
|
'application': True,
|
||||||
|
'auto_install': False,
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#################################################################################
|
||||||
|
#
|
||||||
|
# Odoo, Open Source Management Solution
|
||||||
|
# Copyright (C) 2022-today Ascetic Business Solution <www.asceticbs.com>
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Affero General Public License as
|
||||||
|
# published by the Free Software Foundation, either version 3 of the
|
||||||
|
# License, or (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
#################################################################################
|
||||||
|
from . import res_partner
|
||||||
|
|
@ -0,0 +1,75 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#################################################################################
|
||||||
|
#
|
||||||
|
# Odoo, Open Source Management Solution
|
||||||
|
# Copyright (C) 2022-today Ascetic Business Solution <www.asceticbs.com>
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Affero General Public License as
|
||||||
|
# published by the Free Software Foundation, either version 3 of the
|
||||||
|
# License, or (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
#################################################################################
|
||||||
|
from odoo import api,fields,models,_
|
||||||
|
from odoo.exceptions import ValidationError
|
||||||
|
|
||||||
|
class ResPartner(models.Model):
|
||||||
|
_inherit="res.partner"
|
||||||
|
|
||||||
|
def get_partner_list(self,partner_objs):
|
||||||
|
partner_list = ''
|
||||||
|
for partner in partner_objs:
|
||||||
|
partner_list = partner_list + ' || ' + partner.name
|
||||||
|
return partner_list
|
||||||
|
|
||||||
|
@api.onchange('name')
|
||||||
|
def onchange_name(self):
|
||||||
|
if self.name and self.user_has_groups("abs_customer_validation.group_activate_customer_validation"):
|
||||||
|
if self.env['res.partner'].search([('name','=',self.name)]):
|
||||||
|
raise ValidationError(_('The record ' +self.name+' is already exist '))
|
||||||
|
|
||||||
|
@api.onchange('phone')
|
||||||
|
def onchange_phonenumber(self):
|
||||||
|
if self.phone and self.user_has_groups("abs_customer_validation.group_activate_customer_validation"):
|
||||||
|
partner_objs = self.env['res.partner'].search([('phone','=',self.phone)])
|
||||||
|
if self.get_partner_list(partner_objs):
|
||||||
|
raise ValidationError(_('Phone number '+str(self.phone)+' is already exist in the following records:' + '\n' + self.get_partner_list(partner_objs)))
|
||||||
|
|
||||||
|
@api.onchange('mobile')
|
||||||
|
def onchange_mobilenumber(self):
|
||||||
|
if self.mobile and self.user_has_groups("abs_customer_validation.group_activate_customer_validation"):
|
||||||
|
partner_objs = self.env['res.partner'].search([('mobile','=',self.mobile)])
|
||||||
|
if self.get_partner_list(partner_objs):
|
||||||
|
raise ValidationError(_('Mobile number '+str(self.mobile)+' is already exist in the following records:' + '\n' + self.get_partner_list(partner_objs)))
|
||||||
|
|
||||||
|
@api.onchange('fax')
|
||||||
|
def onchange_fax(self):
|
||||||
|
if self.fax and self.user_has_groups("abs_customer_validation.group_activate_customer_validation"):
|
||||||
|
partner_objs = self.env['res.partner'].search([('fax','=',self.fax)])
|
||||||
|
if self.get_partner_list(partner_objs):
|
||||||
|
raise ValidationError(_('Fax number '+str(self.fax)+' is already exist in the following records:' + '\n' + self.get_partner_list(partner_objs)))
|
||||||
|
|
||||||
|
@api.onchange('email')
|
||||||
|
def onchange_email(self):
|
||||||
|
if self.email and self.user_has_groups("abs_customer_validation.group_activate_customer_validation"):
|
||||||
|
partner_objs = self.env['res.partner'].search([('email','=',self.email)])
|
||||||
|
if self.get_partner_list(partner_objs):
|
||||||
|
raise ValidationError(_('Email number '+str(self.email)+' is already exist in the following records:' + '\n' + self.get_partner_list(partner_objs)))
|
||||||
|
|
||||||
|
@api.onchange('website')
|
||||||
|
def onchange_website(self):
|
||||||
|
if self.website and self.user_has_groups("abs_customer_validation.group_activate_customer_validation"):
|
||||||
|
website_id = "http://"+str(self.website)
|
||||||
|
partner_objs = self.env['res.partner'].search([('website','=',website_id)])
|
||||||
|
if self.get_partner_list(partner_objs):
|
||||||
|
raise ValidationError(_('Website number '+str(self.website)+' is already exist in the following records:' + '\n' + self.get_partner_list(partner_objs)))
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<openerp>
|
||||||
|
<data>
|
||||||
|
<record id="group_activate_customer_validation" model="res.groups">
|
||||||
|
<field name="name">Activate customer validation</field>
|
||||||
|
<field name="category_id" ref="base.module_category_hidden"/>
|
||||||
|
</record>
|
||||||
|
</data>
|
||||||
|
</openerp>
|
||||||
|
|
||||||
|
After Width: | Height: | Size: 51 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 97 KiB |
|
|
@ -0,0 +1,60 @@
|
||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<section class="oe_container oe_dark">
|
||||||
|
<div class="oe_row">
|
||||||
|
<div class="oe_row">
|
||||||
|
<h2 class="oe_slogan oe_span10">Notify about duplicate while creating partner</h2>
|
||||||
|
</div>
|
||||||
|
<div style="margin: 16px 8%;">
|
||||||
|
<p class='oe_mt32 text-justify' style="font-size: 15px;">
|
||||||
|
This module will help you to activate the validation on the partner. Check 'Activate customer validation' access group from the user. This validation helps to take preventive steps to stop creating the duplicate partners. Odoo will notify the user instantly with the list of records which are potentially duplicate while they are adding information (like Name, Phone, Mobile, Fax, Email, Website) on the customer. Please note, this moduel is not to stop creating duplicate partner but notify the user so they should be aware about possible duplication while creating the partner.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="oe_container">
|
||||||
|
|
||||||
|
<h2 class="oe_slogan" style="margin-top:20px;">Need help?</h2>
|
||||||
|
|
||||||
|
<div style="margin: 16px 8%;">
|
||||||
|
<p class='oe_mt32 center-block' style="font-size: 15px;">
|
||||||
|
Contact this module maintainer for any question, need support or request for the new feature : <br/>
|
||||||
|
* Riken Bhorania <i class="fa fa-whatsapp"></i> +91 9427425799, <i class="fa fa-skype fa_custom"></i> <a href="skype:riken.bhorania?chat">riken.bhorania, </a> <i class="fa fa-envelope"></i> riken.bhorania@asceticbs.com <br/>
|
||||||
|
* Bhaumin Chorera <i class="fa fa-whatsapp"></i> +91 8530000384, <i class="fa fa-skype fa_custom"></i> <a href="skype:bhaumin.chorera?chat">bhaumin.chorera, </a> <i class="fa fa-envelope"></i> bhaumin.chorera@asceticbs.com <br/>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="oe_slogan" style="margin-top:10px !important;">
|
||||||
|
<a class="btn btn-primary btn-lg mt8"
|
||||||
|
style="color: #FFFFFF !important;" href="http://www.asceticbs.com"><i
|
||||||
|
class="fa fa-envelope"></i> Website </a>
|
||||||
|
<a class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;"
|
||||||
|
href="http://www.asceticbs.com/contact-us"><i
|
||||||
|
class="fa fa-phone"></i> Contact Us </a>
|
||||||
|
<a class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;"
|
||||||
|
href="http://www.asceticbs.com/services"><i
|
||||||
|
class="fa fa-check-square"></i> Services </a>
|
||||||
|
<a class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;"
|
||||||
|
href="https://apps.odoo.com/apps/modules/browse?author=Ascetic%20Business%20Solution"><i
|
||||||
|
class="fa fa-binoculars"></i> More Apps </a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="oe_slogan" style="margin-top:10px !important;">
|
||||||
|
<img src="company-logo.png" style="width: 190px; margin-bottom: 20px;" class="center-block">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="oe_slogan" style="margin-top:10px !important;">
|
||||||
|
<a href="https://twitter.com/asceticbs" target="_blank"><i class="fa fa-2x fa-twitter" style="color:white;background: #00a0d1;width:35px;"></i></a></td>
|
||||||
|
<a href="https://www.linkedin.com/company/ascetic-business-solution-llp" target="_blank"><i class="fa fa-2x fa-linkedin" style="color:white;background: #31a3d6;width:35px;padding-left: 3px;"></i></a></td>
|
||||||
|
<a href="https://www.facebook.com/asceticbs" target="_blank"><i class="fa fa-2x fa-facebook" style="color:white;background: #3b5998;width:35px;padding-left: 8px;"></i></a></td>
|
||||||
|
<a href="https://www.youtube.com/channel/UCsozahEAndQ2whjcuDIBNZQ" target="_blank"><i class="fa fa-2x fa-youtube-play" style="color:white;background: #c53c2c;width:35px;padding-left: 3px;"></i></a></td>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
@ -0,0 +1,66 @@
|
||||||
|
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
|
||||||
|
:alt: License: AGPL-3
|
||||||
|
|
||||||
|
=========================
|
||||||
|
Import OFX Bank Statement
|
||||||
|
=========================
|
||||||
|
|
||||||
|
This module adds support for the import of bank statements in `OFX format <https://en.wikipedia.org/wiki/Open_Financial_Exchange>`_.
|
||||||
|
|
||||||
|
Bank Statements may be generated containing a subset of the OFX information (only those transaction lines that are required for the
|
||||||
|
creation of the Financial Accounting records).
|
||||||
|
|
||||||
|
Installation
|
||||||
|
============
|
||||||
|
|
||||||
|
The module requires one additional python lib:
|
||||||
|
|
||||||
|
* `ofxparse <http://pypi.python.org/pypi/ofxparse>`_
|
||||||
|
|
||||||
|
Usage
|
||||||
|
=====
|
||||||
|
|
||||||
|
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
|
||||||
|
:alt: Try me on Runbot
|
||||||
|
:target: https://runbot.odoo-community.org/runbot/174/11.0
|
||||||
|
|
||||||
|
Known issues / Roadmap
|
||||||
|
======================
|
||||||
|
|
||||||
|
* None
|
||||||
|
|
||||||
|
Bug Tracker
|
||||||
|
===========
|
||||||
|
|
||||||
|
Bugs are tracked on `GitHub Issues
|
||||||
|
<https://github.com/OCA/bank-statement-import/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.
|
||||||
|
|
||||||
|
Credits
|
||||||
|
=======
|
||||||
|
|
||||||
|
Contributors
|
||||||
|
------------
|
||||||
|
|
||||||
|
* Odoo SA
|
||||||
|
* Alexis de Lattre <alexis@via.ecp.fr>
|
||||||
|
* Laurent Mignon <laurent.mignon@acsone.eu>
|
||||||
|
* Ronald Portier <rportier@therp.nl>
|
||||||
|
* Sylvain LE GAL <https://twitter.com/legalsylvain>
|
||||||
|
* Nicolas JEUDY <https://github.com/njeudy>
|
||||||
|
|
||||||
|
Maintainer
|
||||||
|
----------
|
||||||
|
|
||||||
|
.. image:: https://odoo-community.org/logo.png
|
||||||
|
:alt: Odoo Community Association
|
||||||
|
:target: https://odoo-community.org
|
||||||
|
|
||||||
|
This module is maintained by the OCA.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
To contribute to this module, please visit https://odoo-community.org.
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
from . import models
|
||||||
|
from . import wizard
|
||||||
|
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
{
|
||||||
|
'name': 'Import Excel Bank Statement',
|
||||||
|
'license': 'AGPL-3',
|
||||||
|
'author': "Expert Co. Ltd.",
|
||||||
|
'website': "http://www.exp-sa.com",
|
||||||
|
'category': 'Odex25-Accounting/Odex25-Accounting',
|
||||||
|
'version': '0.1',
|
||||||
|
'depends': [
|
||||||
|
'odex25_account_bank_statement_import',
|
||||||
|
],
|
||||||
|
'data': [
|
||||||
|
'security/ir.model.access.csv',
|
||||||
|
'views/view_account_bank_statement_import.xml',
|
||||||
|
'views/excel_dimensions_views.xml',
|
||||||
|
'data/excel.dimensions.csv'
|
||||||
|
],
|
||||||
|
'external_dependencies': {
|
||||||
|
'python': ['xlrd'],
|
||||||
|
},
|
||||||
|
'installable': True,
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
id,name,details_only,account_number_col,account_number_row,balance_col,company_id/id,credit_col,currency_col,currency_row,date_col,date_period_col,date_period_row,debit_col,details_row,balance_end_col,balance_end_row,note_col,balance_start_col,balance_start_row,type_col,date_format,debit_sign
|
||||||
|
excel_dimensions_rajhi,Al Rajhi Bank,,10,8,6,,8,10,9,11,10,10,7,16,10,13,10,10,12,9,%d/%m/%Y,0
|
||||||
|
excel_dimensions_inma,Inma Bank,,4,5,0,,4,0,5,15,0,2,5,17,9,7,6,0,7,0,%m/%d/%Y,1
|
||||||
|
excel_dimensions_albilad,Albilad Bank,1,,,4,,3,,,0,,,2,1,,,5,,,,%d/%m/%Y,0
|
||||||
|
|
|
@ -0,0 +1,278 @@
|
||||||
|
# Translation of Odoo Server.
|
||||||
|
# This file contains the translation of the following modules:
|
||||||
|
# * account_bank_statement_import_excel
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: Odoo Server 14.0+e-20210105\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2021-05-18 03:19+0000\n"
|
||||||
|
"PO-Revision-Date: 2021-05-18 03:19+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_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_bank_statement_import_excel.excel_dimensions_view_form
|
||||||
|
msgid "%B - Full month name.\""
|
||||||
|
msgstr "%B - اسم الشهر بالكامل.\""
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_bank_statement_import_excel.excel_dimensions_view_form
|
||||||
|
msgid "%Y - Year with century.\""
|
||||||
|
msgstr "%Y - السنة كاملة بالقرن.\""
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_bank_statement_import_excel.excel_dimensions_view_form
|
||||||
|
msgid "%b - Abbreviated month name."
|
||||||
|
msgstr "%b - اسم الشهر المختصر"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_bank_statement_import_excel.excel_dimensions_view_form
|
||||||
|
msgid "%d - Day of the month [01,31].\""
|
||||||
|
msgstr "%d - اليوم من الشهر [01,31].\""
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_bank_statement_import_excel.excel_dimensions_view_form
|
||||||
|
msgid "%m - Month number [01,12].\""
|
||||||
|
msgstr "%m - رقم الشهر [01,12].\""
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_bank_statement_import_excel.excel_dimensions_view_form
|
||||||
|
msgid "%y - Year without century [00,99].\""
|
||||||
|
msgstr "%y - السنة مختصرة بدون القرن [00,99].\""
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_bank_statement_import_excel.excel_dimensions_view_form
|
||||||
|
msgid "1. %b, %B ==> Dec, December"
|
||||||
|
msgstr "1. %b, %B ==> ديسمبر"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_bank_statement_import_excel.excel_dimensions_view_form
|
||||||
|
msgid "3. %y, %Y ==> 08, 2008"
|
||||||
|
msgstr "3. %y, %Y ==> 08, 2008"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_bank_statement_import_excel.excel_dimensions_view_form
|
||||||
|
msgid "4. %d, %m ==> 05, 12"
|
||||||
|
msgstr "4. %d, %m ==> 05, 12"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.actions.act_window,name:account_bank_statement_import_excel.excel_dimensions_action
|
||||||
|
#: model_terms:ir.ui.menu,name:account_bank_statement_import_excel.bank_statement_excel_dimensions_menu_categ
|
||||||
|
msgid "Bank Statement Excel Dimensions"
|
||||||
|
msgstr "ابعاد ملف الاكسل"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model,name:account_bank_statement_import_excel.model_account_bank_statement_line
|
||||||
|
msgid "Bank Statement Line"
|
||||||
|
msgstr "بند كشف حساب المصرف"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model.fields,field_description:account_bank_statement_import_excel.field_excel_dimensions_create_uid
|
||||||
|
msgid "Created by"
|
||||||
|
msgstr "أنشئ بواسطة"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model.fields,field_description:account_bank_statement_import_excel.field_excel_dimensions_create_date
|
||||||
|
msgid "Created on"
|
||||||
|
msgstr "أنشئ في"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model.fields,field_description:account_bank_statement_import_excel.field_excel_dimensions_date_format
|
||||||
|
msgid "Date Format"
|
||||||
|
msgstr "تنسيق التاريخ"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: code:addons/account_bank_statement_import_excel/wizard/account_bank_statement_import.py:127
|
||||||
|
#, python-format
|
||||||
|
msgid "Determine excel dimension for this journal. "
|
||||||
|
msgstr "الرجاء تحديد ابعاد ملف الاكسل الخاص بدفتر اليومية. "
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model.fields,field_description:account_bank_statement_import_excel.field_excel_dimensions_display_name
|
||||||
|
msgid "Display Name"
|
||||||
|
msgstr "الاسم المعروض"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_bank_statement_import_excel.excel_dimensions_view_form
|
||||||
|
msgid "Examples"
|
||||||
|
msgstr "أمثلة"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model.fields,field_description:account_bank_statement_import_excel.field_account_journal_excel_dimension
|
||||||
|
msgid "Excel Dimension"
|
||||||
|
msgstr "أبعاد ملف الاكسل"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_bank_statement_import_excel.excel_dimensions_view_form
|
||||||
|
msgid "Excel Dimensions"
|
||||||
|
msgstr "أبعاد ملف الاكسل"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_bank_statement_import_excel.view_account_bank_statement_import_form
|
||||||
|
msgid "Excel files (xLS, XLSX)"
|
||||||
|
msgstr "ملف اكسل"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model.fields,field_description:account_bank_statement_import_excel.field_excel_dimensions_id
|
||||||
|
msgid "ID"
|
||||||
|
msgstr "المعرف"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model,name:account_bank_statement_import_excel.model_account_bank_statement_import
|
||||||
|
msgid "Import Bank Statement"
|
||||||
|
msgstr "استيراد كشف الحساب"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model,name:account_bank_statement_import_excel.model_account_journal
|
||||||
|
msgid "Journal"
|
||||||
|
msgstr "دفتر اليومية"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model.fields,field_description:account_bank_statement_import_excel.field_excel_dimensions___last_update
|
||||||
|
msgid "Last Modified on"
|
||||||
|
msgstr "آخر تعديل على"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model.fields,field_description:account_bank_statement_import_excel.field_excel_dimensions_write_uid
|
||||||
|
msgid "Last Updated by"
|
||||||
|
msgstr "آخر تعديل بواسطة"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model.fields,field_description:account_bank_statement_import_excel.field_excel_dimensions_write_date
|
||||||
|
msgid "Last Updated on"
|
||||||
|
msgstr "آخر تعديل على"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_bank_statement_import_excel.excel_dimensions_view_form
|
||||||
|
msgid "Legends for supported Date Formats"
|
||||||
|
msgstr "تنسيقات التاريخ المدعومة"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_bank_statement_import_excel.excel_dimensions_view_form
|
||||||
|
msgid "Details"
|
||||||
|
msgstr "تفاصيل المطابقة"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model.fields,field_description:account_bank_statement_import_excel.field_excel_dimensions_details_only
|
||||||
|
msgid "Details Only"
|
||||||
|
msgstr "التفاصيل فقط"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model.fields,field_description:account_bank_statement_import_excel.field_excel_dimensions_name
|
||||||
|
msgid "Name"
|
||||||
|
msgstr "الاسم"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model,name:account_bank_statement_import_excel.model_excel_dimensions
|
||||||
|
msgid "The Dimensions of the excel file used in bank statement import"
|
||||||
|
msgstr "تستخدم أبعاد ملف الاكسل عند استيراد المطابقة البنكية"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: code:addons/account_bank_statement_import_excel/wizard/account_bank_statement_import.py:136
|
||||||
|
#, python-format
|
||||||
|
msgid "The following problem occurred during import. The file might not be valid.\n"
|
||||||
|
"\n"
|
||||||
|
" %s"
|
||||||
|
msgstr "لا يمكن استيراد الملف نسبا لظهور المشكلة ادناه.\n"
|
||||||
|
"\n"
|
||||||
|
" %s"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model.fields,field_description:account_bank_statement_import_excel.field_excel_dimensions_account_number_col
|
||||||
|
msgid "account number column"
|
||||||
|
msgstr "عمود رقم الحساب"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model.fields,field_description:account_bank_statement_import_excel.field_excel_dimensions_account_number_row
|
||||||
|
msgid "account number row"
|
||||||
|
msgstr "صف رقم الحساب"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model.fields,field_description:account_bank_statement_import_excel.field_excel_dimensions_balance_col
|
||||||
|
msgid "balance column"
|
||||||
|
msgstr "عمود الرصيد"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model.fields,field_description:account_bank_statement_import_excel.field_excel_dimensions_company_id
|
||||||
|
msgid "company"
|
||||||
|
msgstr "الشركة"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model.fields,field_description:account_bank_statement_import_excel.field_excel_dimensions_credit_col
|
||||||
|
msgid "credit column"
|
||||||
|
msgstr "عمود الدائن"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model.fields,field_description:account_bank_statement_import_excel.field_excel_dimensions_currency_col
|
||||||
|
msgid "currency column"
|
||||||
|
msgstr "عمود العملة"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model.fields,field_description:account_bank_statement_import_excel.field_excel_dimensions_currency_row
|
||||||
|
msgid "currency row"
|
||||||
|
msgstr "صف العملة"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model.fields,field_description:account_bank_statement_import_excel.field_excel_dimensions_date_col
|
||||||
|
msgid "date column"
|
||||||
|
msgstr "عمود التاريخ"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model.fields,field_description:account_bank_statement_import_excel.field_excel_dimensions_date_period_col
|
||||||
|
msgid "date period column"
|
||||||
|
msgstr "عمود تاريخ الفترة"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model.fields,field_description:account_bank_statement_import_excel.field_excel_dimensions_date_period_row
|
||||||
|
msgid "date period row"
|
||||||
|
msgstr "صف تاريخ الفترة"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model.fields,field_description:account_bank_statement_import_excel.field_excel_dimensions_debit_col
|
||||||
|
msgid "debit column"
|
||||||
|
msgstr "عمود المدين"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model.fields,field_description:account_bank_statement_import_excel.field_excel_dimensions_details_row
|
||||||
|
msgid "details row"
|
||||||
|
msgstr "صف التفاصيل"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model.fields,field_description:account_bank_statement_import_excel.field_excel_dimensions_balance_end_col
|
||||||
|
msgid "ending balance column"
|
||||||
|
msgstr "عمود الرصيد الختامي"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model.fields,field_description:account_bank_statement_import_excel.field_excel_dimensions_balance_end_row
|
||||||
|
msgid "ending balance row"
|
||||||
|
msgstr "صف الرصيد الختامي"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model.fields,field_description:account_bank_statement_import_excel.field_excel_dimensions_note_col
|
||||||
|
msgid "note column"
|
||||||
|
msgstr "عمود الملاحظات"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model.fields,field_description:account_bank_statement_import_excel.field_excel_dimensions_balance_start_col
|
||||||
|
msgid "starting balance column"
|
||||||
|
msgstr "عمود الرصيد الإفتتاحي"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model.fields,field_description:account_bank_statement_import_excel.field_excel_dimensions_balance_start_row
|
||||||
|
msgid "starting balance row"
|
||||||
|
msgstr "صف الرصيد الإفتتاحي"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model.fields,field_description:account_bank_statement_import_excel.field_excel_dimensions_type_col
|
||||||
|
msgid "type column"
|
||||||
|
msgstr "عمود النوع"
|
||||||
|
|
||||||
|
#. module: account_bank_statement_import_excel
|
||||||
|
#: model_terms:ir.model.fields,field_description:account_bank_statement_import_excel.field_excel_dimensions_debit_sign
|
||||||
|
msgid "Revert Debit Sign"
|
||||||
|
msgstr "عكس اشارة المدين"
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
from . import excel_dimensions
|
||||||
|
|
@ -0,0 +1,57 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from odoo import fields, models
|
||||||
|
|
||||||
|
|
||||||
|
class ExcelDimensions(models.Model):
|
||||||
|
_name = 'excel.dimensions'
|
||||||
|
_description = 'The Dimensions of the excel file used in bank statement import'
|
||||||
|
|
||||||
|
name = fields.Char(string='Name')
|
||||||
|
|
||||||
|
company_id = fields.Many2one(comodel_name='res.company', string='Company')
|
||||||
|
|
||||||
|
details_only = fields.Boolean()
|
||||||
|
|
||||||
|
account_number_row = fields.Integer(string='Account Number Row')
|
||||||
|
account_number_col = fields.Integer(string='Account Number Column')
|
||||||
|
|
||||||
|
currency_row = fields.Integer(string='Currency Row')
|
||||||
|
currency_col = fields.Integer(string='Currency Column')
|
||||||
|
|
||||||
|
balance_start_row = fields.Integer(string='Starting Balance Row')
|
||||||
|
balance_start_col = fields.Integer(string='Starting BalanceColumn')
|
||||||
|
|
||||||
|
balance_end_row = fields.Integer(string='Ending Balance Row')
|
||||||
|
balance_end_col = fields.Integer(string='Ending Balance Column')
|
||||||
|
|
||||||
|
date_period_row = fields.Integer(string='Date Period Row')
|
||||||
|
date_period_col = fields.Integer(string='Date Period Column')
|
||||||
|
|
||||||
|
details_row = fields.Integer(string='Details Row')
|
||||||
|
|
||||||
|
debit_col = fields.Integer(string='Debit Column')
|
||||||
|
|
||||||
|
credit_col = fields.Integer(string='Credit Column')
|
||||||
|
|
||||||
|
balance_col = fields.Integer(string='Balance Column')
|
||||||
|
|
||||||
|
type_col = fields.Integer(string='Type Column')
|
||||||
|
|
||||||
|
note_col = fields.Integer(string='Note Column')
|
||||||
|
|
||||||
|
date_col = fields.Integer(string='Date Column')
|
||||||
|
date_format = fields.Char()
|
||||||
|
|
||||||
|
debit_sign = fields.Boolean('Revert Debit Sign')
|
||||||
|
|
||||||
|
|
||||||
|
class AccountJournal(models.Model):
|
||||||
|
_inherit = 'account.journal'
|
||||||
|
|
||||||
|
excel_dimension = fields.Many2one('excel.dimensions')
|
||||||
|
|
||||||
|
def _get_bank_statements_available_import_formats(self):
|
||||||
|
rslt = super(AccountJournal, self)._get_bank_statements_available_import_formats()
|
||||||
|
rslt.append('XLS')
|
||||||
|
return rslt
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||||
|
access_excel_dimension,excel.dimensions,model_excel_dimensions,account.group_account_readonly,1,0,0,0
|
||||||
|
access_excel_dimension_manager,excel.dimensions,model_excel_dimensions,account.group_account_manager,1,1,1,1
|
||||||
|
|
After Width: | Height: | Size: 32 KiB |
|
|
@ -0,0 +1,22 @@
|
||||||
|
@media (min-width: 768px){
|
||||||
|
.rtl .navbar-right{
|
||||||
|
float: left !important;
|
||||||
|
}
|
||||||
|
.rtl .navbar-right .dropdown .dropdown-menu{
|
||||||
|
right: auto !important;
|
||||||
|
left: 0 !important;
|
||||||
|
}
|
||||||
|
.rtl .navbar-left{
|
||||||
|
float: right !important;
|
||||||
|
}
|
||||||
|
.rtl .navbar-left .dropdown .dropdown-menu{
|
||||||
|
left: auto !important;
|
||||||
|
right: 0 !important;
|
||||||
|
}
|
||||||
|
.navbar-nav.navbar-right:last-child{
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
|
.rtl .pull-left{
|
||||||
|
float: right !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
from . import test_import_bank_statement
|
||||||
|
|
@ -0,0 +1,86 @@
|
||||||
|
from odoo.tests.common import TransactionCase
|
||||||
|
from odoo.modules.module import get_module_resource
|
||||||
|
import base64
|
||||||
|
|
||||||
|
|
||||||
|
class TestOfxFile(TransactionCase):
|
||||||
|
"""Tests for import bank statement ofx file format
|
||||||
|
(account.bank.statement.import)
|
||||||
|
"""
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(TestOfxFile, self).setUp()
|
||||||
|
self.absi_model = self.env['account.bank.statement.import']
|
||||||
|
self.abs_model = self.env['account.bank.statement']
|
||||||
|
self.j_model = self.env['account.journal']
|
||||||
|
self.absl_model = self.env['account.bank.statement.line']
|
||||||
|
cur = self.env.ref('base.USD')
|
||||||
|
self.env.ref('base.main_company').currency_id = cur.id
|
||||||
|
bank = self.env['res.partner.bank'].create({
|
||||||
|
'acc_number': '123456',
|
||||||
|
'partner_id': self.env.ref('base.main_partner').id,
|
||||||
|
'company_id': self.env.ref('base.main_company').id,
|
||||||
|
'bank_id': self.env.ref('base.res_bank_1').id,
|
||||||
|
})
|
||||||
|
self.env['account.journal'].create({
|
||||||
|
'name': 'Bank Journal TEST OFX',
|
||||||
|
'code': 'BNK12',
|
||||||
|
'type': 'bank',
|
||||||
|
'bank_account_id': bank.id,
|
||||||
|
})
|
||||||
|
|
||||||
|
bank_iban_ofx = self.env['res.partner.bank'].create({
|
||||||
|
'acc_number': 'FR7630001007941234567890185',
|
||||||
|
'partner_id': self.env.ref('base.main_partner').id,
|
||||||
|
'company_id': self.env.ref('base.main_company').id,
|
||||||
|
'bank_id': self.env.ref('base.res_bank_1').id,
|
||||||
|
})
|
||||||
|
|
||||||
|
self.env['account.journal'].create({
|
||||||
|
'name': 'FR7630001007941234567890185',
|
||||||
|
'code': 'BNK13',
|
||||||
|
'type': 'bank',
|
||||||
|
'bank_account_id': bank_iban_ofx.id,
|
||||||
|
})
|
||||||
|
|
||||||
|
def test_wrong_ofx_file_import(self):
|
||||||
|
ofx_file_path = get_module_resource(
|
||||||
|
'account_bank_statement_import_excel',
|
||||||
|
'tests/test_ofx_file/', 'test_ofx_wrong.ofx')
|
||||||
|
ofx_file_wrong = base64.b64encode(open(ofx_file_path, 'rb').read())
|
||||||
|
bank_statement = self.absi_model.create(
|
||||||
|
dict(data_file=ofx_file_wrong))
|
||||||
|
self.assertFalse(bank_statement._check_ofx(data_file=ofx_file_wrong))
|
||||||
|
|
||||||
|
def test_ofx_file_import(self):
|
||||||
|
ofx_file_path = get_module_resource(
|
||||||
|
'account_bank_statement_import_excel',
|
||||||
|
'tests/test_ofx_file/', 'test_ofx.ofx')
|
||||||
|
ofx_file = base64.b64encode(open(ofx_file_path, 'rb').read())
|
||||||
|
bank_statement = self.absi_model.create(
|
||||||
|
dict(data_file=ofx_file))
|
||||||
|
bank_statement.import_file()
|
||||||
|
bank_st_record = self.abs_model.search(
|
||||||
|
[('name', 'like', '123456')])[0]
|
||||||
|
self.assertEqual(bank_st_record.balance_start, 2516.56)
|
||||||
|
self.assertEqual(bank_st_record.balance_end_real, 2156.56)
|
||||||
|
|
||||||
|
line = self.absl_model.search([
|
||||||
|
('name', '=', 'Agrolait'),
|
||||||
|
('statement_id', '=', bank_st_record.id)])[0]
|
||||||
|
self.assertEquals(line.ref, '219378')
|
||||||
|
self.assertEquals(line.date, '2013-08-24')
|
||||||
|
|
||||||
|
def test_check_journal_bank_account(self):
|
||||||
|
ofx_file_path = get_module_resource(
|
||||||
|
'account_bank_statement_import_excel',
|
||||||
|
'tests/test_ofx_file/', 'test_ofx_iban.ofx')
|
||||||
|
ofx_file = base64.b64encode(open(ofx_file_path, 'rb').read())
|
||||||
|
bank_st = self.absi_model.create(
|
||||||
|
dict(data_file=ofx_file))
|
||||||
|
journal_iban_ofx = self.j_model.search([
|
||||||
|
('name', '=', 'FR7630001007941234567890185')])
|
||||||
|
res = bank_st._check_journal_bank_account(journal_iban_ofx,
|
||||||
|
'12345678901')
|
||||||
|
self.assertTrue(res)
|
||||||
|
bank_st.with_context(journal_id=journal_iban_ofx.id).import_file()
|
||||||
|
|
@ -0,0 +1,100 @@
|
||||||
|
<?xml version="1.0" encoding="ASCII"?>
|
||||||
|
<?OFX OFXHEADER="200" VERSION="211" SECURITY="NONE" OLDFILEUID="NONE" NEWFILEUID="NONE"?>
|
||||||
|
<OFX>
|
||||||
|
<SIGNONMSGSRSV1>
|
||||||
|
<SONRS>
|
||||||
|
<STATUS>
|
||||||
|
<CODE>0</CODE>
|
||||||
|
<SEVERITY>INFO</SEVERITY>
|
||||||
|
</STATUS>
|
||||||
|
<DTSERVER>20130831165153.000[-8:PST]</DTSERVER>
|
||||||
|
<LANGUAGE>ENG</LANGUAGE>
|
||||||
|
</SONRS>
|
||||||
|
</SIGNONMSGSRSV1>
|
||||||
|
<BANKMSGSRSV1>
|
||||||
|
<STMTTRNRS>
|
||||||
|
<TRNUID>0</TRNUID>
|
||||||
|
<STATUS>
|
||||||
|
<CODE>0</CODE>
|
||||||
|
<SEVERITY>INFO</SEVERITY>
|
||||||
|
</STATUS>
|
||||||
|
<STMTRS>
|
||||||
|
<CURDEF>USD</CURDEF>
|
||||||
|
<BANKACCTFROM>
|
||||||
|
<BANKID>000000123</BANKID>
|
||||||
|
<ACCTID>123456</ACCTID>
|
||||||
|
<ACCTTYPE>CHECKING</ACCTTYPE>
|
||||||
|
</BANKACCTFROM>
|
||||||
|
<BANKTRANLIST>
|
||||||
|
<DTSTART>20130801</DTSTART>
|
||||||
|
<DTEND>20130831165153.000[-8:PST]</DTEND>
|
||||||
|
<STMTTRN>
|
||||||
|
<TRNTYPE>POS</TRNTYPE>
|
||||||
|
<DTPOSTED>20130824080000</DTPOSTED>
|
||||||
|
<TRNAMT>-80</TRNAMT>
|
||||||
|
<FITID>219378</FITID>
|
||||||
|
<NAME>Agrolait</NAME>
|
||||||
|
</STMTTRN>
|
||||||
|
</BANKTRANLIST>
|
||||||
|
<BANKTRANLIST>
|
||||||
|
<DTSTART>20130801</DTSTART>
|
||||||
|
<DTEND>20130831165153.000[-8:PST]</DTEND>
|
||||||
|
<STMTTRN>
|
||||||
|
<TRNTYPE>POS</TRNTYPE>
|
||||||
|
<DTPOSTED>20130824080000</DTPOSTED>
|
||||||
|
<TRNAMT>-90</TRNAMT>
|
||||||
|
<FITID>219379</FITID>
|
||||||
|
<NAME>China Export</NAME>
|
||||||
|
</STMTTRN>
|
||||||
|
</BANKTRANLIST>
|
||||||
|
<BANKTRANLIST>
|
||||||
|
<DTSTART>20130801</DTSTART>
|
||||||
|
<DTEND>20130831165153.000[-8:PST]</DTEND>
|
||||||
|
<STMTTRN>
|
||||||
|
<TRNTYPE>POS</TRNTYPE>
|
||||||
|
<DTPOSTED>20130824080000</DTPOSTED>
|
||||||
|
<TRNAMT>-100</TRNAMT>
|
||||||
|
<FITID>219380</FITID>
|
||||||
|
<NAME>Axelor Scuba</NAME>
|
||||||
|
</STMTTRN>
|
||||||
|
</BANKTRANLIST>
|
||||||
|
<BANKTRANLIST>
|
||||||
|
<DTSTART>20130801</DTSTART>
|
||||||
|
<DTEND>20130831165153.000[-8:PST]</DTEND>
|
||||||
|
<STMTTRN>
|
||||||
|
<TRNTYPE>POS</TRNTYPE>
|
||||||
|
<DTPOSTED>20130824080000</DTPOSTED>
|
||||||
|
<TRNAMT>-90</TRNAMT>
|
||||||
|
<FITID>219381</FITID>
|
||||||
|
<NAME>China Scuba</NAME>
|
||||||
|
</STMTTRN>
|
||||||
|
</BANKTRANLIST>
|
||||||
|
<LEDGERBAL>
|
||||||
|
<BALAMT>2156.56</BALAMT>
|
||||||
|
<DTASOF>20130831165153</DTASOF>
|
||||||
|
</LEDGERBAL>
|
||||||
|
</STMTRS>
|
||||||
|
</STMTTRNRS>
|
||||||
|
</BANKMSGSRSV1>
|
||||||
|
<CREDITCARDMSGSRSV1>
|
||||||
|
<CCSTMTTRNRS>
|
||||||
|
<TRNUID>0</TRNUID>
|
||||||
|
<STATUS>
|
||||||
|
<CODE>0</CODE>
|
||||||
|
<SEVERITY>INFO</SEVERITY>
|
||||||
|
</STATUS>
|
||||||
|
<CCSTMTRS>
|
||||||
|
<CURDEF>USD</CURDEF>
|
||||||
|
<CCACCTFROM>
|
||||||
|
<ACCTID>123412341234</ACCTID>
|
||||||
|
</CCACCTFROM>
|
||||||
|
<BANKTRANLIST>
|
||||||
|
</BANKTRANLIST>
|
||||||
|
<LEDGERBAL>
|
||||||
|
<BALAMT>-562.00</BALAMT>
|
||||||
|
<DTASOF>20130831165153</DTASOF>
|
||||||
|
</LEDGERBAL>
|
||||||
|
</CCSTMTRS>
|
||||||
|
</CCSTMTTRNRS>
|
||||||
|
</CREDITCARDMSGSRSV1>
|
||||||
|
</OFX>
|
||||||
|
|
@ -0,0 +1,101 @@
|
||||||
|
<?xml version="1.0" encoding="ASCII"?>
|
||||||
|
<?OFX OFXHEADER="200" VERSION="211" SECURITY="NONE" OLDFILEUID="NONE" NEWFILEUID="NONE"?>
|
||||||
|
<OFX>
|
||||||
|
<SIGNONMSGSRSV1>
|
||||||
|
<SONRS>
|
||||||
|
<STATUS>
|
||||||
|
<CODE>0</CODE>
|
||||||
|
<SEVERITY>INFO</SEVERITY>
|
||||||
|
</STATUS>
|
||||||
|
<DTSERVER>20130831165153.000[-8:PST]</DTSERVER>
|
||||||
|
<LANGUAGE>ENG</LANGUAGE>
|
||||||
|
</SONRS>
|
||||||
|
</SIGNONMSGSRSV1>
|
||||||
|
<BANKMSGSRSV1>
|
||||||
|
<STMTTRNRS>
|
||||||
|
<TRNUID>0</TRNUID>
|
||||||
|
<STATUS>
|
||||||
|
<CODE>0</CODE>
|
||||||
|
<SEVERITY>INFO</SEVERITY>
|
||||||
|
</STATUS>
|
||||||
|
<STMTRS>
|
||||||
|
<CURDEF>USD</CURDEF>
|
||||||
|
<BANKACCTFROM>
|
||||||
|
<BANKID>30001</BANKID>
|
||||||
|
<BRANCHID>00794</BRANCHID>
|
||||||
|
<ACCTID>12345678901</ACCTID>
|
||||||
|
<ACCTTYPE>CHECKING</ACCTTYPE>
|
||||||
|
</BANKACCTFROM>
|
||||||
|
<BANKTRANLIST>
|
||||||
|
<DTSTART>20130801</DTSTART>
|
||||||
|
<DTEND>20130831165153.000[-8:PST]</DTEND>
|
||||||
|
<STMTTRN>
|
||||||
|
<TRNTYPE>POS</TRNTYPE>
|
||||||
|
<DTPOSTED>20130824080000</DTPOSTED>
|
||||||
|
<TRNAMT>-80</TRNAMT>
|
||||||
|
<FITID>219378</FITID>
|
||||||
|
<NAME>Agrolait</NAME>
|
||||||
|
</STMTTRN>
|
||||||
|
</BANKTRANLIST>
|
||||||
|
<BANKTRANLIST>
|
||||||
|
<DTSTART>20130801</DTSTART>
|
||||||
|
<DTEND>20130831165153.000[-8:PST]</DTEND>
|
||||||
|
<STMTTRN>
|
||||||
|
<TRNTYPE>POS</TRNTYPE>
|
||||||
|
<DTPOSTED>20130824080000</DTPOSTED>
|
||||||
|
<TRNAMT>-90</TRNAMT>
|
||||||
|
<FITID>219379</FITID>
|
||||||
|
<NAME>China Export</NAME>
|
||||||
|
</STMTTRN>
|
||||||
|
</BANKTRANLIST>
|
||||||
|
<BANKTRANLIST>
|
||||||
|
<DTSTART>20130801</DTSTART>
|
||||||
|
<DTEND>20130831165153.000[-8:PST]</DTEND>
|
||||||
|
<STMTTRN>
|
||||||
|
<TRNTYPE>POS</TRNTYPE>
|
||||||
|
<DTPOSTED>20130824080000</DTPOSTED>
|
||||||
|
<TRNAMT>-100</TRNAMT>
|
||||||
|
<FITID>219380</FITID>
|
||||||
|
<NAME>Axelor Scuba</NAME>
|
||||||
|
</STMTTRN>
|
||||||
|
</BANKTRANLIST>
|
||||||
|
<BANKTRANLIST>
|
||||||
|
<DTSTART>20130801</DTSTART>
|
||||||
|
<DTEND>20130831165153.000[-8:PST]</DTEND>
|
||||||
|
<STMTTRN>
|
||||||
|
<TRNTYPE>POS</TRNTYPE>
|
||||||
|
<DTPOSTED>20130824080000</DTPOSTED>
|
||||||
|
<TRNAMT>-90</TRNAMT>
|
||||||
|
<FITID>219381</FITID>
|
||||||
|
<NAME>China Scuba</NAME>
|
||||||
|
</STMTTRN>
|
||||||
|
</BANKTRANLIST>
|
||||||
|
<LEDGERBAL>
|
||||||
|
<BALAMT>2156.56</BALAMT>
|
||||||
|
<DTASOF>20130831165153</DTASOF>
|
||||||
|
</LEDGERBAL>
|
||||||
|
</STMTRS>
|
||||||
|
</STMTTRNRS>
|
||||||
|
</BANKMSGSRSV1>
|
||||||
|
<CREDITCARDMSGSRSV1>
|
||||||
|
<CCSTMTTRNRS>
|
||||||
|
<TRNUID>0</TRNUID>
|
||||||
|
<STATUS>
|
||||||
|
<CODE>0</CODE>
|
||||||
|
<SEVERITY>INFO</SEVERITY>
|
||||||
|
</STATUS>
|
||||||
|
<CCSTMTRS>
|
||||||
|
<CURDEF>USD</CURDEF>
|
||||||
|
<CCACCTFROM>
|
||||||
|
<ACCTID>123412341234</ACCTID>
|
||||||
|
</CCACCTFROM>
|
||||||
|
<BANKTRANLIST>
|
||||||
|
</BANKTRANLIST>
|
||||||
|
<LEDGERBAL>
|
||||||
|
<BALAMT>-562.00</BALAMT>
|
||||||
|
<DTASOF>20130831165153</DTASOF>
|
||||||
|
</LEDGERBAL>
|
||||||
|
</CCSTMTRS>
|
||||||
|
</CCSTMTTRNRS>
|
||||||
|
</CREDITCARDMSGSRSV1>
|
||||||
|
</OFX>
|
||||||
|
|
@ -0,0 +1,100 @@
|
||||||
|
<?xml version="1.0" encoding="ASCII"?>
|
||||||
|
<?OFX OFXHEADER="200" VERSION="211" SECURITY="NONE" OLDFILEUID="NONE" NEWFILEUID="NONE"?>
|
||||||
|
<OFX>
|
||||||
|
<SIGNONMSGSRSV1>
|
||||||
|
<SONRS>
|
||||||
|
<STATUS>
|
||||||
|
<CODE>0</CODE>
|
||||||
|
<SEVERITY>INFO</SEVERITY>
|
||||||
|
</STATUS>
|
||||||
|
<DTSERVER>20130831165153.000[-8:PST]</DTSERVER>
|
||||||
|
<LANGUAGE>ENG</LANGUAGE>
|
||||||
|
</SONRS>
|
||||||
|
</SIGNONMSGSRSV1>
|
||||||
|
<BANKMSGSRSV1>
|
||||||
|
<STMTTRNRS>
|
||||||
|
<TRNUID>0</TRNUID>
|
||||||
|
<STATUS>
|
||||||
|
<CODE>0</CODE>
|
||||||
|
<SEVERITY>INFO</SEVERITY>
|
||||||
|
</STATUS>
|
||||||
|
<STMTRS>
|
||||||
|
<!-- <CURDEF>USD</CURDEF>
|
||||||
|
<BANKACCTFROM>
|
||||||
|
<BANKID>000000123</BANKID>
|
||||||
|
<ACCTID>123456</ACCTID>
|
||||||
|
<ACCTTYPE>CHECKING</ACCTTYPE>
|
||||||
|
</BANKACCTFROM> -->
|
||||||
|
<BANKTRANLIST>
|
||||||
|
<DTSTART>20130801</DTSTART>
|
||||||
|
<DTEND>20130831165153.000[-8:PST]</DTEND>
|
||||||
|
<STMTTRN>
|
||||||
|
<TRNTYPE>POS</TRNTYPE>
|
||||||
|
<DTPOSTED>20130824080000</DTPOSTED>
|
||||||
|
<TRNAMT>-80</TRNAMT>
|
||||||
|
<FITID>219378</FITID>
|
||||||
|
<NAME>Agrolait</NAME>
|
||||||
|
</STMTTRN>
|
||||||
|
</BANKTRANLIST>
|
||||||
|
<BANKTRANLIST>
|
||||||
|
<DTSTART>20130801</DTSTART>
|
||||||
|
<DTEND>20130831165153.000[-8:PST]</DTEND>
|
||||||
|
<STMTTRN>
|
||||||
|
<TRNTYPE>POS</TRNTYPE>
|
||||||
|
<!-- <DTPOSTED>20130824080000</DTPOSTED>
|
||||||
|
<TRNAMT>-90</TRNAMT>
|
||||||
|
<FITID>219379</FITID> -->
|
||||||
|
<NAME>China Export</NAME>
|
||||||
|
</STMTTRN>
|
||||||
|
</BANKTRANLIST>
|
||||||
|
<BANKTRANLIST>
|
||||||
|
<DTSTART>20130801</DTSTART>
|
||||||
|
<DTEND>20130831165153.000[-8:PST]</DTEND>
|
||||||
|
<STMTTRN>
|
||||||
|
<TRNTYPE>POS</TRNTYPE>
|
||||||
|
<DTPOSTED>20130824080000</DTPOSTED>
|
||||||
|
<TRNAMT>-100</TRNAMT>
|
||||||
|
<FITID>219380</FITID>
|
||||||
|
<NAME>Axelor Scuba</NAME>
|
||||||
|
</STMTTRN>
|
||||||
|
</BANKTRANLIST>
|
||||||
|
<BANKTRANLIST>
|
||||||
|
<DTSTART>20130801</DTSTART>
|
||||||
|
<DTEND>20130831165153.000[-8:PST]</DTEND>
|
||||||
|
<STMTTRN>
|
||||||
|
<TRNTYPE>POS</TRNTYPE>
|
||||||
|
<DTPOSTED>20130824080000</DTPOSTED>
|
||||||
|
<TRNAMT>-90</TRNAMT>
|
||||||
|
<FITID>219381</FITID>
|
||||||
|
<NAME>China Scuba</NAME>
|
||||||
|
</STMTTRN>
|
||||||
|
</BANKTRANLIST>
|
||||||
|
<LEDGERBAL>
|
||||||
|
<BALAMT>2156.56</BALAMT>
|
||||||
|
<DTASOF>20130831165153</DTASOF>
|
||||||
|
</LEDGERBAL>
|
||||||
|
</STMTRS>
|
||||||
|
</STMTTRNRS>
|
||||||
|
</BANKMSGSRSV1>
|
||||||
|
<CREDITCARDMSGSRSV1>
|
||||||
|
<CCSTMTTRNRS>
|
||||||
|
<TRNUID>0</TRNUID>
|
||||||
|
<STATUS>
|
||||||
|
<CODE>0</CODE>
|
||||||
|
<SEVERITY>INFO</SEVERITY>
|
||||||
|
</STATUS>
|
||||||
|
<CCSTMTRS>
|
||||||
|
<CURDEF>USD</CURDEF>
|
||||||
|
<CCACCTFROM>
|
||||||
|
<ACCTID>123412341234</ACCTID>
|
||||||
|
</CCACCTFROM>
|
||||||
|
<BANKTRANLIST>
|
||||||
|
</BANKTRANLIST>
|
||||||
|
<LEDGERBAL>
|
||||||
|
<BALAMT>-562.00</BALAMT>
|
||||||
|
<DTASOF>20130831165153</DTASOF>
|
||||||
|
</LEDGERBAL>
|
||||||
|
</CCSTMTRS>
|
||||||
|
</CCSTMTTRNRS>
|
||||||
|
</CREDITCARDMSGSRSV1>
|
||||||
|
</OFX>
|
||||||
|
|
@ -0,0 +1,133 @@
|
||||||
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
|
<odoo>
|
||||||
|
<data>
|
||||||
|
<!-- excel.dimensions form view -->
|
||||||
|
<record id="excel_dimensions_view_form" model="ir.ui.view">
|
||||||
|
<field name="name">excel.dimensions.view.form</field>
|
||||||
|
<field name="model">excel.dimensions</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<form string="Excel Dimensions">
|
||||||
|
<sheet>
|
||||||
|
<div class="oe_title">
|
||||||
|
<h1>
|
||||||
|
<field name="name" attrs="{'readonly':False}"/>
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
<group>
|
||||||
|
<group>
|
||||||
|
<field name="company_id"/>
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
<group>
|
||||||
|
<group>
|
||||||
|
<field name="debit_sign"/>
|
||||||
|
</group>
|
||||||
|
<group>
|
||||||
|
<field name="details_only"/>
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
<group attrs="{'invisible':[('details_only','=',True)]}">
|
||||||
|
<group>
|
||||||
|
<field name="account_number_row"/>
|
||||||
|
<field name="account_number_col"/>
|
||||||
|
</group>
|
||||||
|
<group>
|
||||||
|
<field name="currency_row"/>
|
||||||
|
<field name="currency_col"/>
|
||||||
|
</group>
|
||||||
|
<group>
|
||||||
|
<field name="date_period_row"/>
|
||||||
|
<field name="date_period_col"/>
|
||||||
|
</group>
|
||||||
|
<group>
|
||||||
|
<field name="balance_start_row"/>
|
||||||
|
<field name="balance_start_col"/>
|
||||||
|
</group>
|
||||||
|
<group>
|
||||||
|
<field name="balance_end_row"/>
|
||||||
|
<field name="balance_end_col"/>
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
<group string="Details">
|
||||||
|
<group>
|
||||||
|
<field name="details_row"/>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<group>
|
||||||
|
<field name="debit_col"/>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<group>
|
||||||
|
<field name="credit_col"/>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<group>
|
||||||
|
<field name="balance_col"/>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<group>
|
||||||
|
<field name="type_col"/>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<group>
|
||||||
|
<field name="note_col"/>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<group>
|
||||||
|
<field name="date_col"/>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<group>
|
||||||
|
<field name="date_format"/>
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<group string="Legends for supported Date Formats">
|
||||||
|
<div>%b - Abbreviated month name.</div>
|
||||||
|
<div>%B - Full month name."</div>
|
||||||
|
<div>%d - Day of the month [01,31]."</div>
|
||||||
|
<div>%y - Year without century [00,99]."</div>
|
||||||
|
<div>%Y - Year with century."</div>
|
||||||
|
<div>%m - Month number [01,12]."</div>
|
||||||
|
</group>
|
||||||
|
<group string="Examples">
|
||||||
|
<div>1. %b, %B ==> Dec, December</div>
|
||||||
|
<div>3. %y, %Y ==> 08, 2008</div>
|
||||||
|
<div>4. %d, %m ==> 05, 12</div>
|
||||||
|
</group>
|
||||||
|
</sheet>
|
||||||
|
</form>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<!-- excel.dimensions action window -->
|
||||||
|
<record id="excel_dimensions_action" model="ir.actions.act_window">
|
||||||
|
<field name="name">Bank Statement Excel Dimensions</field>
|
||||||
|
<field name="type">ir.actions.act_window</field>
|
||||||
|
<field name="res_model">excel.dimensions</field>
|
||||||
|
<field name="view_mode">tree,form</field>
|
||||||
|
<field name="help" type="html">
|
||||||
|
<p class="oe_view_nocontent_create">
|
||||||
|
<!-- Add Text Here -->
|
||||||
|
</p><p>
|
||||||
|
<!-- More details about what a user can do with this object will be OK -->
|
||||||
|
</p>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<!-- This Menu Item Must have a parent -->
|
||||||
|
<menuitem id="bank_statement_excel_dimensions_menu_categ" action="excel_dimensions_action" name="Bank Statement Excel Dimensions" parent="account.account_management_menu"/>
|
||||||
|
|
||||||
|
<record model="ir.ui.view" id="account_journal_form">
|
||||||
|
<field name="name">account.journal.form</field>
|
||||||
|
<field name="model">account.journal</field>
|
||||||
|
<field name="inherit_id" ref="account.view_account_journal_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<field name="type" position="after">
|
||||||
|
<field name="excel_dimension" attrs="{'invisible':[('type','!=', 'bank')],
|
||||||
|
'required':[('type','=', 'bank')]}"/>
|
||||||
|
</field>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
</data>
|
||||||
|
</odoo>
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<record id="view_account_bank_statement_import_form" model="ir.ui.view">
|
||||||
|
<field name="model">account.bank.statement.import</field>
|
||||||
|
<field name="inherit_id" ref="odex25_account_bank_statement_import.odex25_account_bank_statement_import_view"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//ul[@id='statement_format']" position="inside">
|
||||||
|
<li>Excel files (XLS, XLSX)</li>
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
from . import account_bank_statement_import
|
||||||
|
|
@ -0,0 +1,278 @@
|
||||||
|
import logging
|
||||||
|
import re
|
||||||
|
from odoo import api, models, _
|
||||||
|
from odoo.exceptions import UserError
|
||||||
|
from odoo.addons.base_iban.models.res_partner_bank import _map_iban_template
|
||||||
|
from odoo.addons.base_iban.models.res_partner_bank import validate_iban
|
||||||
|
from odoo.tools import float_compare, float_round, float_repr
|
||||||
|
|
||||||
|
from datetime import date, datetime, timedelta
|
||||||
|
|
||||||
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
try:
|
||||||
|
import xlrd
|
||||||
|
except ImportError:
|
||||||
|
_logger.debug("xlrd not found.")
|
||||||
|
|
||||||
|
|
||||||
|
class AccountBankStatementImport(models.TransientModel):
|
||||||
|
_inherit = 'account.bank.statement.import'
|
||||||
|
|
||||||
|
def _check_journal_bank_account(self, journal, account_number):
|
||||||
|
return journal.bank_account_id.sanitized_acc_number == account_number
|
||||||
|
|
||||||
|
res = super(
|
||||||
|
AccountBankStatementImport, self
|
||||||
|
)._check_journal_bank_account(journal, account_number)
|
||||||
|
if not res:
|
||||||
|
e_acc_num = journal.bank_account_id.sanitized_acc_number
|
||||||
|
e_acc_num = e_acc_num.replace(" ", "")
|
||||||
|
validate_iban(e_acc_num)
|
||||||
|
country_code = e_acc_num[:2].lower()
|
||||||
|
iban_template = _map_iban_template[country_code].replace(
|
||||||
|
" ", "")
|
||||||
|
e_acc_num = "".join(
|
||||||
|
[c for c, t in zip(e_acc_num, iban_template) if t == "C"])
|
||||||
|
res = (e_acc_num == account_number)
|
||||||
|
return res
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _check_excel(self, data_file):
|
||||||
|
try:
|
||||||
|
excel = xlrd.open_workbook(file_contents=data_file)
|
||||||
|
except Exception as e:
|
||||||
|
_logger.debug(e)
|
||||||
|
return False
|
||||||
|
return excel
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _prepare_ofx_transaction_line(self, transaction):
|
||||||
|
# Since ofxparse doesn't provide account numbers,
|
||||||
|
# we cannot provide the key 'bank_account_id',
|
||||||
|
# nor the key 'account_number'
|
||||||
|
# If you read odoo10/addons/account_bank_statement_import/
|
||||||
|
# account_bank_statement_import.py, it's the only 2 keys
|
||||||
|
# we can provide to match a partner.
|
||||||
|
vals = {
|
||||||
|
'date': transaction.date,
|
||||||
|
'name': transaction.payee + (
|
||||||
|
transaction.memo and ': ' + transaction.memo or ''),
|
||||||
|
'ref': transaction.id,
|
||||||
|
'amount': float(transaction.amount),
|
||||||
|
'unique_import_id': transaction.id,
|
||||||
|
}
|
||||||
|
return vals
|
||||||
|
|
||||||
|
def _get_excel_data(self, excel_file, excel_conf):
|
||||||
|
xl_sheet = excel_file.sheet_by_index(0)
|
||||||
|
journal = self.env['account.journal'].browse(self.env.context.get('journal_id', []))
|
||||||
|
currency = journal.currency_id.name
|
||||||
|
|
||||||
|
account_number = not excel_conf.details_only and \
|
||||||
|
xl_sheet.cell(excel_conf.account_number_row, excel_conf.account_number_col).value or \
|
||||||
|
journal.bank_account_id.acc_number
|
||||||
|
# got to fix currency problem but for now gonna use company currency
|
||||||
|
|
||||||
|
start = not excel_conf.details_only and \
|
||||||
|
xl_sheet.cell(excel_conf.balance_start_row, excel_conf.balance_start_col).value or 0
|
||||||
|
|
||||||
|
balance_start = isinstance(start, str) and float(re.sub('[^.\-\d]', '', start.split()[0])) or start
|
||||||
|
|
||||||
|
end = not excel_conf.details_only and \
|
||||||
|
xl_sheet.cell(excel_conf.balance_end_row, excel_conf.balance_end_col).value or 0
|
||||||
|
|
||||||
|
balance_end = isinstance(start, str) and float(re.sub('[^.\-\d]', '', end.split()[0])) or end
|
||||||
|
|
||||||
|
lines = []
|
||||||
|
|
||||||
|
details_row = excel_conf.details_row
|
||||||
|
total_amt = 0.0
|
||||||
|
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
debit = float(xl_sheet.cell(details_row, excel_conf.debit_col).value or 0)
|
||||||
|
credit = float(xl_sheet.cell(details_row, excel_conf.credit_col).value or 0)
|
||||||
|
# balance = float(xl_sheet.cell(details_row, excel_conf.balance_col).value or 0)
|
||||||
|
|
||||||
|
type = xl_sheet.cell(details_row, excel_conf.type_col).value
|
||||||
|
note = xl_sheet.cell(details_row, excel_conf.note_col).value
|
||||||
|
date = xl_sheet.cell(details_row, excel_conf.date_col).value
|
||||||
|
date = datetime.strptime(date, excel_conf.date_format or "%d/%m/%Y")
|
||||||
|
amount = credit and credit or (excel_conf.debit_sign and -1 * debit or debit)
|
||||||
|
total_amt += amount
|
||||||
|
lines.append({'amount': amount,
|
||||||
|
# 'balance': balance,
|
||||||
|
'payment_ref': type + ' ' + note,
|
||||||
|
'date': date})
|
||||||
|
details_row += 1
|
||||||
|
except:
|
||||||
|
break
|
||||||
|
vals_bank_statement = {
|
||||||
|
'name': account_number,
|
||||||
|
'transactions': lines,
|
||||||
|
'balance_start': balance_start,
|
||||||
|
'balance_end_real': balance_end,
|
||||||
|
}
|
||||||
|
return (currency, account_number, [vals_bank_statement])
|
||||||
|
|
||||||
|
def _parse_file(self, data_file):
|
||||||
|
excel = self._check_excel(data_file)
|
||||||
|
if not excel:
|
||||||
|
return super(AccountBankStatementImport, self)._parse_file(
|
||||||
|
data_file)
|
||||||
|
|
||||||
|
transactions = []
|
||||||
|
total_amt = 0.00
|
||||||
|
try:
|
||||||
|
journal = self.env['account.journal'].browse(self.env.context.get('journal_id', []))
|
||||||
|
if not journal.excel_dimension:
|
||||||
|
raise UserError(_("Determine excel dimension for this journal. "))
|
||||||
|
excel_data = self._get_excel_data(excel, journal.excel_dimension)
|
||||||
|
return excel_data
|
||||||
|
# for transaction in ofx.account.statement.transactions:
|
||||||
|
# vals = self._prepare_ofx_transaction_line(transaction)
|
||||||
|
# if vals:
|
||||||
|
# transactions.append(vals)
|
||||||
|
# total_amt += vals['amount']
|
||||||
|
except Exception as e:
|
||||||
|
raise UserError(_(
|
||||||
|
"The following problem occurred during import. "
|
||||||
|
"The file might not be valid.\n\n %s") % e)
|
||||||
|
|
||||||
|
# balance = float(ofx.account.statement.balance)
|
||||||
|
# vals_bank_statement = {
|
||||||
|
# 'name': ofx.account.number,
|
||||||
|
# 'transactions': transactions,
|
||||||
|
# 'balance_start': balance - total_amt,
|
||||||
|
# 'balance_end_real': balance,
|
||||||
|
# }
|
||||||
|
return ofx.account.statement.currency, ofx.account.number, [vals_bank_statement]
|
||||||
|
|
||||||
|
|
||||||
|
class AccountBankStatementLine(models.Model):
|
||||||
|
_inherit = "account.bank.statement.line"
|
||||||
|
|
||||||
|
def get_reconciliation_proposition(self, excluded_ids=None):
|
||||||
|
""" Returns move lines that constitute the best guess to reconcile a statement line
|
||||||
|
Note: it only looks for move lines in the same currency as the statement line.
|
||||||
|
"""
|
||||||
|
self.ensure_one()
|
||||||
|
if not excluded_ids:
|
||||||
|
excluded_ids = []
|
||||||
|
amount = self.amount_currency or self.amount
|
||||||
|
company_currency = self.journal_id.company_id.currency_id
|
||||||
|
st_line_currency = self.currency_id or self.journal_id.currency_id
|
||||||
|
currency = (st_line_currency and st_line_currency !=
|
||||||
|
company_currency) and st_line_currency.id or False
|
||||||
|
precision = st_line_currency and st_line_currency.decimal_places or company_currency.decimal_places
|
||||||
|
params = {'company_id': self.env.user.company_id.id,
|
||||||
|
'account_payable_receivable': (self.journal_id.default_credit_account_id.id, self.journal_id.default_debit_account_id.id),
|
||||||
|
'amount': float_repr(float_round(amount, precision_digits=precision), precision_digits=precision),
|
||||||
|
'partner_id': self.partner_id.id,
|
||||||
|
'excluded_ids': tuple(excluded_ids),
|
||||||
|
'ref': self.name,
|
||||||
|
}
|
||||||
|
# Look for structured communication match
|
||||||
|
if self.name:
|
||||||
|
add_to_select = ", CASE WHEN aml.ref = %(ref)s THEN 1 ELSE 2 END as temp_field_order "
|
||||||
|
add_to_from = " JOIN account_move m ON m.id = aml.move_id "
|
||||||
|
select_clause, from_clause, where_clause = self._get_common_sql_query(
|
||||||
|
overlook_partner=True, excluded_ids=excluded_ids, split=True)
|
||||||
|
sql_query = select_clause + add_to_select + from_clause + add_to_from + where_clause
|
||||||
|
sql_query += " AND (aml.ref= %(ref)s or m.name = %(ref)s) \
|
||||||
|
ORDER BY temp_field_order, date_maturity desc, aml.id desc"
|
||||||
|
self.env.cr.execute(sql_query, params)
|
||||||
|
results = self.env.cr.fetchone()
|
||||||
|
if results:
|
||||||
|
return self.env['account.move.line'].browse(results[0])
|
||||||
|
|
||||||
|
# Look for a single move line with the same amount
|
||||||
|
field = currency and 'amount_residual_currency' or 'amount_residual'
|
||||||
|
liquidity_field = currency and 'amount_currency' or amount > 0 and 'aml.debit' or 'aml.credit'
|
||||||
|
liquidity_amt_clause = currency and '%(amount)s::numeric' or 'abs(%(amount)s::numeric)'
|
||||||
|
sql_query = self._get_common_sql_query(excluded_ids=excluded_ids) + \
|
||||||
|
" AND (" + field + " = %(amount)s::numeric OR (acc.internal_type = 'liquidity' AND " + liquidity_field + " = " + liquidity_amt_clause + ")) \
|
||||||
|
ORDER BY date_maturity desc, aml.id desc LIMIT 1"
|
||||||
|
self.env.cr.execute(sql_query, params)
|
||||||
|
results = self.env.cr.fetchone()
|
||||||
|
if results:
|
||||||
|
return self.env['account.move.line'].browse(results[0])
|
||||||
|
|
||||||
|
return self.env['account.move.line']
|
||||||
|
|
||||||
|
def auto_reconcile(self):
|
||||||
|
""" Try to automatically reconcile the statement.line ; return the counterpart journal entry/ies if the automatic reconciliation succeeded, False otherwise.
|
||||||
|
TODO : this method could be greatly improved and made extensible
|
||||||
|
"""
|
||||||
|
self.ensure_one()
|
||||||
|
match_recs = self.env['account.move.line']
|
||||||
|
|
||||||
|
amount = self.amount_currency or self.amount
|
||||||
|
company_currency = self.journal_id.company_id.currency_id
|
||||||
|
st_line_currency = self.currency_id or self.journal_id.currency_id
|
||||||
|
currency = (st_line_currency and st_line_currency !=
|
||||||
|
company_currency) and st_line_currency.id or False
|
||||||
|
precision = st_line_currency and st_line_currency.decimal_places or company_currency.decimal_places
|
||||||
|
params = {'company_id': self.env.user.company_id.id,
|
||||||
|
'account_payable_receivable': (self.journal_id.default_credit_account_id.id, self.journal_id.default_debit_account_id.id),
|
||||||
|
'amount': float_round(amount, precision_digits=precision),
|
||||||
|
'partner_id': self.partner_id.id,
|
||||||
|
'ref': self.name,
|
||||||
|
}
|
||||||
|
field = currency and 'amount_residual_currency' or 'amount_residual'
|
||||||
|
liquidity_field = currency and 'amount_currency' or amount > 0 and 'aml.debit' or 'aml.credit'
|
||||||
|
# Look for structured communication match
|
||||||
|
if self.name:
|
||||||
|
sql_query = self._get_common_sql_query() + " AND aml.ref = %(ref)s AND (" + field + \
|
||||||
|
" = %(amount)s OR (acc.internal_type = 'liquidity' AND " + liquidity_field + " = %(amount)s)) \
|
||||||
|
ORDER BY date_maturity asc, aml.id asc"
|
||||||
|
self.env.cr.execute(sql_query, params)
|
||||||
|
match_recs = self.env.cr.dictfetchall()
|
||||||
|
if len(match_recs) > 1:
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Look for a single move line with the same partner, the same amount
|
||||||
|
if not match_recs:
|
||||||
|
if self.partner_id:
|
||||||
|
sql_query = self._get_common_sql_query(
|
||||||
|
) + " AND (" + field + " = %(amount)s OR (acc.internal_type = 'liquidity' AND " + liquidity_field + " = %(amount)s)) \
|
||||||
|
ORDER BY date_maturity asc, aml.id asc"
|
||||||
|
self.env.cr.execute(sql_query, params)
|
||||||
|
match_recs = self.env.cr.dictfetchall()
|
||||||
|
if len(match_recs) > 1:
|
||||||
|
return False
|
||||||
|
|
||||||
|
if not match_recs:
|
||||||
|
return False
|
||||||
|
|
||||||
|
match_recs = self.env['account.move.line'].browse([aml.get('id') for aml in match_recs])
|
||||||
|
# Now reconcile
|
||||||
|
counterpart_aml_dicts = []
|
||||||
|
payment_aml_rec = self.env['account.move.line']
|
||||||
|
for aml in match_recs:
|
||||||
|
if aml.account_id.internal_type == 'liquidity':
|
||||||
|
payment_aml_rec = (payment_aml_rec | aml)
|
||||||
|
else:
|
||||||
|
amount = aml.currency_id and aml.amount_residual_currency or aml.amount_residual
|
||||||
|
counterpart_aml_dicts.append({
|
||||||
|
'name': aml.name if aml.name != '/' else aml.move_id.name,
|
||||||
|
'debit': amount < 0 and -amount or 0,
|
||||||
|
'credit': amount > 0 and amount or 0,
|
||||||
|
'move_line': aml
|
||||||
|
})
|
||||||
|
|
||||||
|
try:
|
||||||
|
with self._cr.savepoint():
|
||||||
|
counterpart = self.process_reconciliation(
|
||||||
|
counterpart_aml_dicts=counterpart_aml_dicts,
|
||||||
|
payment_aml_rec=payment_aml_rec)
|
||||||
|
return counterpart
|
||||||
|
except UserError:
|
||||||
|
# A configuration / business logic error that makes it impossible to auto-reconcile should not be raised
|
||||||
|
# since automatic reconciliation is just an amenity and the user will get the same exception when manually
|
||||||
|
# reconciling. Other types of exception are (hopefully) programmation errors and should cause a stacktrace.
|
||||||
|
self.invalidate_cache()
|
||||||
|
self.env['account.move'].invalidate_cache()
|
||||||
|
self.env['account.move.line'].invalidate_cache()
|
||||||
|
return False
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from . import models
|
||||||
|
from . import reports
|
||||||
|
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
{
|
||||||
|
'name': "Custom Budget",
|
||||||
|
'description': """
|
||||||
|
Add new features to budget :
|
||||||
|
- Budget Increase/Decrease & Transfer operation.
|
||||||
|
- Budget Confirmation.
|
||||||
|
""",
|
||||||
|
'author': "Expert Co. Ltd.",
|
||||||
|
'website': "http://www.exp-sa.com",
|
||||||
|
'category': 'Odex25-Accounting/Odex25-Accounting',
|
||||||
|
# any module necessary for this one to work correctly
|
||||||
|
'depends': ['base','odex25_account_budget', 'odex25_account_reports', 'report_xlsx'],
|
||||||
|
# always loaded
|
||||||
|
'data': [
|
||||||
|
'data/budget_operation_data.xml',
|
||||||
|
'security/budget_groups.xml',
|
||||||
|
'security/ir.model.access.csv',
|
||||||
|
'views/account_budget_views.xml',
|
||||||
|
'views/budget_operations_view.xml',
|
||||||
|
'views/budget_confirmation_view.xml',
|
||||||
|
'views/menus.xml',
|
||||||
|
'reports/reports.xml'
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<data noupdate="0">
|
||||||
|
<record id="sequence_budget_operations" model="ir.sequence">
|
||||||
|
<field name="name">Budget Operation Sequence</field>
|
||||||
|
<field name="code">budget_operation.seq</field>
|
||||||
|
<field name="prefix">BO/%(range_year)s/</field>
|
||||||
|
<field eval="1" name="number_next"/>
|
||||||
|
<field eval="1" name="number_increment"/>
|
||||||
|
<field eval="True" name="use_date_range"/>
|
||||||
|
<field eval="False" name="company_id"/>
|
||||||
|
<field name="padding">6</field>
|
||||||
|
</record>
|
||||||
|
</data>
|
||||||
|
</odoo>
|
||||||
|
|
@ -0,0 +1,797 @@
|
||||||
|
# Translation of Odoo Server.
|
||||||
|
# This file contains the translation of the following modules:
|
||||||
|
# * account_budget_custom
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: Odoo Server 14.0+e-20210105\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2021-05-30 05:25+0000\n"
|
||||||
|
"PO-Revision-Date: 2021-05-30 05:25+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_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__account_id
|
||||||
|
msgid "Account"
|
||||||
|
msgstr "البند"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget_lines__percentage
|
||||||
|
msgid "Achievement"
|
||||||
|
msgstr "الإنجاز"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__message_needaction
|
||||||
|
msgid "Action Needed"
|
||||||
|
msgstr "إجراء مطلوب"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/models/budget_confirmation.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "All lines should have accounts"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__total_amount
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__amount
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__amount
|
||||||
|
msgid "Amount"
|
||||||
|
msgstr "مبلغ"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_confirmation_form
|
||||||
|
msgid "Approve"
|
||||||
|
msgstr "موافقة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__message_attachment_count
|
||||||
|
msgid "Attachment Count"
|
||||||
|
msgstr "عدد المرفقات"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__beneficiary_id
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_confirmation_search
|
||||||
|
msgid "Beneficiary"
|
||||||
|
msgstr "المستفيد"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model,name:account_budget_custom.model_crossovered_budget
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__from_crossovered_budget_id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__to_crossovered_budget_id
|
||||||
|
msgid "Budget"
|
||||||
|
msgstr "الموازنة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model,name:account_budget_custom.model_budget_confirmation
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__confirmation_id
|
||||||
|
msgid "Budget Confirmation"
|
||||||
|
msgstr "تصديق الموازنة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model,name:account_budget_custom.model_budget_confirmation_line
|
||||||
|
msgid "Budget Confirmation details"
|
||||||
|
msgstr "تفاصيل تصديق الموازنة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.actions.act_window,name:account_budget_custom.action_budget_confirmation_form
|
||||||
|
#: model:ir.ui.menu,name:account_budget_custom.menu_budget_confirmation
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_confirmation_form
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_confirmation_tree
|
||||||
|
msgid "Budget Confirmations"
|
||||||
|
msgstr "التحقق من الارتباط"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.crossovered_budget_view_form
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_crossovered_budget_line_tree
|
||||||
|
msgid "Budget Confirmed Amount"
|
||||||
|
msgstr "مبلغ الموازنة المصدق"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model,name:account_budget_custom.model_crossovered_budget_lines
|
||||||
|
msgid "Budget Line"
|
||||||
|
msgstr "خط الموازنة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/reports/budget_report_xlsx.py:0
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_crossovered_budget_line_graph
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_crossovered_budget_line_pivot
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_crossovered_budget_line_tree
|
||||||
|
#, python-format
|
||||||
|
msgid "Budget Lines"
|
||||||
|
msgstr "خطوط الموازنة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.actions.act_window,name:account_budget_custom.open_budget_operations
|
||||||
|
#: model:ir.ui.menu,name:account_budget_custom.menu_budget_operations_form
|
||||||
|
msgid "Budget Operation"
|
||||||
|
msgstr "عمليات الموازنة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.ui.menu,name:account_budget_custom.menu_budget_operations
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations_search
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations_tree
|
||||||
|
msgid "Budget Operations"
|
||||||
|
msgstr "عمليات الموازنة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__from_budget_post_id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__to_budget_post_id
|
||||||
|
msgid "Budget Post"
|
||||||
|
msgstr "البند"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.actions.report,name:account_budget_custom.action_report_budget_xlsx
|
||||||
|
msgid "Budget XLSX"
|
||||||
|
msgstr "الموازنة (اكسل)"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.ui.menu,name:account_budget_custom.main_budgets_menu
|
||||||
|
msgid "Budgets"
|
||||||
|
msgstr "الموازنات"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields.selection,name:account_budget_custom.selection__budget_confirmation__state__cancel
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_confirmation_form
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr "إلغاء"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_confirmation_form
|
||||||
|
msgid "Check Budget"
|
||||||
|
msgstr "التحقق من الارتباط"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__company_id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__company_id
|
||||||
|
msgid "Company"
|
||||||
|
msgstr "مؤسسة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_crossovered_budget_lines__percentage
|
||||||
|
msgid ""
|
||||||
|
"Comparison between practical and theoretical amount. This measure tells you "
|
||||||
|
"if you are below or over budget."
|
||||||
|
msgstr ""
|
||||||
|
"المقارنة بين القيمة الفعلية والنظرية. تحدد نسبة الانحراف في الإيرادات أو "
|
||||||
|
"المصروفات في الموازنة."
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations
|
||||||
|
msgid "Confirm"
|
||||||
|
msgstr "تأكيد"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget_lines__budget_confirm_amount
|
||||||
|
msgid "Confirmation Amount"
|
||||||
|
msgstr "مبلغ التصديق"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields.selection,name:account_budget_custom.selection__budget_operations__state__confirmed
|
||||||
|
msgid "Confirmed"
|
||||||
|
msgstr "مؤكد"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__analytic_account_id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__analytic_account_id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__budget_line_id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__from_budget_line_id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__to_budget_line_id
|
||||||
|
msgid "Cost Center"
|
||||||
|
msgstr "مركز التكلفة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__create_uid
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__create_uid
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__create_uid
|
||||||
|
msgid "Created by"
|
||||||
|
msgstr "أنشئ بواسطة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__create_date
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__create_date
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__create_date
|
||||||
|
msgid "Created on"
|
||||||
|
msgstr "أنشئ في"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__currency_id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__currency_id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__currency_id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget__currency_id
|
||||||
|
msgid "Currency"
|
||||||
|
msgstr "العملة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__date
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__date
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__date
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_confirmation_search
|
||||||
|
msgid "Date"
|
||||||
|
msgstr "التاريخ"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields.selection,name:account_budget_custom.selection__budget_operations__operation_type__decrease
|
||||||
|
msgid "Decrease"
|
||||||
|
msgstr "تخفيض"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__department_id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__department_id
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_confirmation_search
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations_search
|
||||||
|
msgid "Department"
|
||||||
|
msgstr "القسم"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__description
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__description
|
||||||
|
msgid "Description"
|
||||||
|
msgstr "الوصف"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__lines_ids
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_confirmation_form
|
||||||
|
msgid "Details"
|
||||||
|
msgstr "تفاصيل المطابقة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget_lines__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_report_account_budget_custom_budget_report__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_report_account_budget_custom_budget_xslx_report__display_name
|
||||||
|
msgid "Display Name"
|
||||||
|
msgstr "الاسم المعروض"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__res_id
|
||||||
|
msgid "Document ID"
|
||||||
|
msgstr "معرف المستند"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields.selection,name:account_budget_custom.selection__budget_confirmation__state__draft
|
||||||
|
#: model:ir.model.fields.selection,name:account_budget_custom.selection__budget_operations__state__draft
|
||||||
|
msgid "Draft"
|
||||||
|
msgstr "مسودة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__message_follower_ids
|
||||||
|
msgid "Followers"
|
||||||
|
msgstr "المتابعون"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__message_channel_ids
|
||||||
|
msgid "Followers (Channels)"
|
||||||
|
msgstr "المتابعون (القنوات)"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__message_partner_ids
|
||||||
|
msgid "Followers (Partners)"
|
||||||
|
msgstr "المتابعون (الشركاء)"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations
|
||||||
|
msgid "From"
|
||||||
|
msgstr "من"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations_search
|
||||||
|
msgid "From Budget"
|
||||||
|
msgstr "من موازنة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations_search
|
||||||
|
msgid "From Cost Center"
|
||||||
|
msgstr "من مركز التكلفة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget__id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget_lines__id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_report_account_budget_custom_budget_report__id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_report_account_budget_custom_budget_xslx_report__id
|
||||||
|
msgid "ID"
|
||||||
|
msgstr "المُعرف"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_confirmation__message_needaction
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_confirmation__message_unread
|
||||||
|
msgid "If checked, new messages require your attention."
|
||||||
|
msgstr "إذا كان محددًا، فهناك رسائل جديدة تحتاج لرؤيتها."
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_confirmation__message_has_error
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_confirmation__message_has_sms_error
|
||||||
|
msgid "If checked, some messages have a delivery error."
|
||||||
|
msgstr "إذا كان محددًا، فقد حدث خطأ في تسليم بعض الرسائل."
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields.selection,name:account_budget_custom.selection__budget_operations__operation_type__increase
|
||||||
|
msgid "Increase"
|
||||||
|
msgstr "تعزيز"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__message_is_follower
|
||||||
|
msgid "Is Follower"
|
||||||
|
msgstr "متابع"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget_lines____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_report_account_budget_custom_budget_report____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_report_account_budget_custom_budget_xslx_report____last_update
|
||||||
|
msgid "Last Modified on"
|
||||||
|
msgstr "آخر تعديل في"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__write_uid
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__write_uid
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__write_uid
|
||||||
|
msgid "Last Updated by"
|
||||||
|
msgstr "آخر تحديث بواسطة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__write_date
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__write_date
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__write_date
|
||||||
|
msgid "Last Updated on"
|
||||||
|
msgstr "آخر تحديث في"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__message_main_attachment_id
|
||||||
|
msgid "Main Attachment"
|
||||||
|
msgstr "المرفق الرئيسي"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__message_has_error
|
||||||
|
msgid "Message Delivery error"
|
||||||
|
msgstr "خطأ في تسليم الرسائل"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__message_ids
|
||||||
|
msgid "Messages"
|
||||||
|
msgstr "الرسائل"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__name
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__name
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_confirmation_search
|
||||||
|
msgid "Name"
|
||||||
|
msgstr "الاسم"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__new_balance
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_confirmation_line__new_balance
|
||||||
|
msgid "New Balance"
|
||||||
|
msgstr "المبلغ بعد الخصم"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/models/budget_confirmation.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "No budget for "
|
||||||
|
msgstr "لا يوجد موازنة ل "
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/models/budget_confirmation.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "No enough budget for "
|
||||||
|
msgstr "متبقي الموازنة لا يغطي "
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__message_needaction_counter
|
||||||
|
msgid "Number of Actions"
|
||||||
|
msgstr "عدد الإجراءات"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__message_has_error_counter
|
||||||
|
msgid "Number of errors"
|
||||||
|
msgstr "عدد الاخطاء"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_confirmation__message_needaction_counter
|
||||||
|
msgid "Number of messages which requires an action"
|
||||||
|
msgstr "عدد الرسائل التي تتطلب إجراء"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_confirmation__message_has_error_counter
|
||||||
|
msgid "Number of messages with delivery error"
|
||||||
|
msgstr "عدد الرسائل الحادث بها خطأ في التسليم"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_confirmation__message_unread_counter
|
||||||
|
msgid "Number of unread messages"
|
||||||
|
msgstr "عدد الرسائل الجديدة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__operation_type
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations_search
|
||||||
|
msgid "Operation Type"
|
||||||
|
msgstr "نوع العملية"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget_lines__practical_amount
|
||||||
|
msgid "Practical Amount"
|
||||||
|
msgstr "المبلغ الفعلي"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget_lines__provide
|
||||||
|
msgid "Provide"
|
||||||
|
msgstr "الدعومات"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.crossovered_budget_view_form
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_crossovered_budget_line_tree
|
||||||
|
msgid "Provided Amount"
|
||||||
|
msgstr "مبلغ الدعم"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget_lines__pull_out
|
||||||
|
msgid "Pull Out"
|
||||||
|
msgstr "المبلغ المحجوز/التخصيص"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.crossovered_budget_view_form
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_crossovered_budget_line_tree
|
||||||
|
msgid "Pull Out Amount"
|
||||||
|
msgstr "مبلغ السحب"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__ref
|
||||||
|
msgid "Reference"
|
||||||
|
msgstr "المرجع"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__res_model
|
||||||
|
msgid "Related Document Model Name"
|
||||||
|
msgstr "اسم كائن المستند المرتبط"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__remain
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget_lines__remain
|
||||||
|
msgid "Remain"
|
||||||
|
msgstr "المبلغ المتبقي"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.crossovered_budget_view_form
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_crossovered_budget_line_tree
|
||||||
|
msgid "Remain Amount"
|
||||||
|
msgstr "المبلغ المتاح"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_confirmation_line__remain
|
||||||
|
msgid "Remain in services budget for this cost center"
|
||||||
|
msgstr "المبلغ قبل الخصم لهذه الخدمات على هذه المراكز"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.ui.menu,name:account_budget_custom.budget_reporting_menu
|
||||||
|
msgid "Reports"
|
||||||
|
msgstr "التقارير"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__user_id
|
||||||
|
msgid "Request user"
|
||||||
|
msgstr "المستخدم الطالب"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__from_reserved
|
||||||
|
msgid "Reserve?"
|
||||||
|
msgstr "محجوز؟"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget_lines__reserved_amount
|
||||||
|
msgid "Reserved Amount"
|
||||||
|
msgstr "المبلغ المحجوز"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget__reserved_percent
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget_lines__reserved_percent
|
||||||
|
msgid "Reserved Percent"
|
||||||
|
msgstr "نسبة الحجز"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.crossovered_budget_view_form
|
||||||
|
msgid "Reserved Percent %"
|
||||||
|
msgstr "نسبة المحجوز %"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__message_has_sms_error
|
||||||
|
msgid "SMS Delivery error"
|
||||||
|
msgstr "خطأ في تسليم الرسائل القصيرة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/reports/budget_report_xlsx.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "Sorry, No data to Print"
|
||||||
|
msgstr "لا يوجد بيانات ليتم طباعتها"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_confirmation_search
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations_search
|
||||||
|
msgid "State"
|
||||||
|
msgstr "المحافظة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__state
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__state
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__state
|
||||||
|
msgid "Status"
|
||||||
|
msgstr "الحالة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget_lines__theoritical_amount
|
||||||
|
msgid "Theoretical Amount"
|
||||||
|
msgstr "القيمة النظرية"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations
|
||||||
|
msgid "To"
|
||||||
|
msgstr "ألى"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations_search
|
||||||
|
msgid "To Budget"
|
||||||
|
msgstr "إلى موازنة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations_search
|
||||||
|
msgid "To Cost Center"
|
||||||
|
msgstr "إلى مركز التكلفة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations
|
||||||
|
msgid "To Draft"
|
||||||
|
msgstr "الرجوع الي مبدئي"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_confirmation__total_amount
|
||||||
|
msgid "Total amount"
|
||||||
|
msgstr "إجمالي المبلغ"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_confirmation_line__amount
|
||||||
|
msgid "Total amount in services request line"
|
||||||
|
msgstr "المبلغ"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields.selection,name:account_budget_custom.selection__budget_operations__operation_type__transfer
|
||||||
|
#: model:ir.model.fields.selection,name:account_budget_custom.selection__budget_operations__type__transfer
|
||||||
|
msgid "Transfer"
|
||||||
|
msgstr "تحويل"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_confirmation_search
|
||||||
|
msgid "Type"
|
||||||
|
msgstr "النوع"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields.selection,name:account_budget_custom.selection__budget_operations__type__unlock
|
||||||
|
msgid "Unlock"
|
||||||
|
msgstr "إعادة الفتح"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__message_unread
|
||||||
|
msgid "Unread Messages"
|
||||||
|
msgstr "الرسائل الجديدة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__message_unread_counter
|
||||||
|
msgid "Unread Messages Counter"
|
||||||
|
msgstr "عدد الرسائل الجديدة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields.selection,name:account_budget_custom.selection__budget_confirmation__state__confirmed
|
||||||
|
msgid "Waiting Financial Controller"
|
||||||
|
msgstr "في إنتظار المدير المالي"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields.selection,name:account_budget_custom.selection__budget_confirmation__state__done
|
||||||
|
msgid "Waiting Payment"
|
||||||
|
msgstr "في إنتظار الدفع"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__website_message_ids
|
||||||
|
msgid "Website Messages"
|
||||||
|
msgstr "رسائل الموقع"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_confirmation__website_message_ids
|
||||||
|
msgid "Website communication history"
|
||||||
|
msgstr "سجل تواصل الموقع"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/models/account_budget.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "You can not take more than the remaining amount"
|
||||||
|
msgstr "لا يمكن أخذ أكثر من المبلغ المتبقي"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/models/account_budget.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "You can not take more than the reserved amount."
|
||||||
|
msgstr "لا يمكن أخذ اكثر من المبلغ المحجوز"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/models/budget_confirmation.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "You cannot copy a budget confirmation ."
|
||||||
|
msgstr "لا يمكن نسخ تصديق الموازنة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/models/budget_confirmation.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "You cannot delete a budget confirmation not in cancel state."
|
||||||
|
msgstr "لا يمكن حذف تصديق موازنة غير ملغى"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_confirmation_search
|
||||||
|
msgid "budget.confirmation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model,name:account_budget_custom.model_budget_operations
|
||||||
|
msgid "budget.operations"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/models/account_budget.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "remaining"
|
||||||
|
msgstr "المتبقى"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model,name:account_budget_custom.model_report_account_budget_custom_budget_report
|
||||||
|
msgid "report.account_budget_custom.budget_report"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model,name:account_budget_custom.model_report_account_budget_custom_budget_xslx_report
|
||||||
|
msgid "report.account_budget_custom.budget_xslx_report"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations_search
|
||||||
|
msgid "state"
|
||||||
|
msgstr "الحالة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__type
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__type
|
||||||
|
msgid "type"
|
||||||
|
msgstr "النوع"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/reports/budget_report_xlsx.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "الإنجاز"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/reports/budget_report_xlsx.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "المبلغ الفعلى"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/reports/budget_report_xlsx.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "المبلغ المخطط"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/reports/budget_report_xlsx.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "المبلغ النظرية"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/reports/budget_report_xlsx.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "المـوازنـة"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/reports/budget_report_xlsx.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "الموازنات"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/reports/budget_report_xlsx.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "تاريخ الإنتهاء"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/reports/budget_report_xlsx.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "تاريخ البدء"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/reports/budget_report_xlsx.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "وضع المـوازنـة"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__exceed_budget
|
||||||
|
msgid "Allow Exceed Budget"
|
||||||
|
msgstr "السماح بتخطي الموازنة"
|
||||||
|
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model,name:account_budget_custom.model_report_account_budget_custom_budget_report
|
||||||
|
msgid "Budget Report"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:res.groups,name:account_budget_custom.group_budget_user
|
||||||
|
msgid "Budget User"
|
||||||
|
msgstr "مسستخدم الموازنة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:res.groups,name:account_budget_custom.group_manager_budget
|
||||||
|
msgid "Manager of Budget"
|
||||||
|
msgstr "مدير الموازنة"
|
||||||
|
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.reject_wizard
|
||||||
|
msgid "Close"
|
||||||
|
msgstr "إلغاء"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_reject_wizard__origin
|
||||||
|
msgid "Origin"
|
||||||
|
msgstr "المصدر"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_reject_wizard__origin_name
|
||||||
|
msgid "Origin Name"
|
||||||
|
msgstr "الإسم المصدر"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.reject_wizard
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_confirmation_form
|
||||||
|
msgid "Reject"
|
||||||
|
msgstr "رفض"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__reject_reason
|
||||||
|
msgid "Reject Reason"
|
||||||
|
msgstr "سبب الرفض"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_reject_wizard__reject_reason
|
||||||
|
msgid "Reject Reson"
|
||||||
|
msgstr "سبب الرفض"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_confirmation_search
|
||||||
|
msgid "budget.confirmation"
|
||||||
|
msgstr "تصديق الموازنة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.reject_wizard
|
||||||
|
msgid "or"
|
||||||
|
msgstr "أو"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model,name:account_budget_custom.model_reject_wizard
|
||||||
|
msgid "reject.wizard"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,992 @@
|
||||||
|
# Translation of Odoo Server.
|
||||||
|
# This file contains the translation of the following modules:
|
||||||
|
# * account_budget_custom
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: Odoo Server 14.0\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2024-05-08 11:11+0000\n"
|
||||||
|
"PO-Revision-Date: 2024-05-08 11:11+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_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__account_id
|
||||||
|
msgid "Account"
|
||||||
|
msgstr "الحساب"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget_lines__percentage
|
||||||
|
msgid "Achievement"
|
||||||
|
msgstr "نسبة الصرف"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__message_needaction
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__message_needaction
|
||||||
|
msgid "Action Needed"
|
||||||
|
msgstr "إجراء مطلوب"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__activity_ids
|
||||||
|
msgid "Activities"
|
||||||
|
msgstr "الأنشطة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__activity_exception_decoration
|
||||||
|
msgid "Activity Exception Decoration"
|
||||||
|
msgstr "ترتيب استثناء النشاط"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__activity_state
|
||||||
|
msgid "Activity State"
|
||||||
|
msgstr "حالة النشاط"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__activity_type_icon
|
||||||
|
msgid "Activity Type Icon"
|
||||||
|
msgstr "أيقونة نوع النشاط"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/models/budget_confirmation.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "All lines should have accounts"
|
||||||
|
msgstr "يجب أن تحتوي جميع الأسطر على حسابات"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__exceed_budget
|
||||||
|
msgid "Allow Exceed Budget"
|
||||||
|
msgstr "السماح بتخطي الموازنة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__total_amount
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__amount
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__amount
|
||||||
|
msgid "Amount"
|
||||||
|
msgstr "مبلغ"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_confirmation_form
|
||||||
|
msgid "Approve"
|
||||||
|
msgstr "موافقة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__message_attachment_count
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__message_attachment_count
|
||||||
|
msgid "Attachment Count"
|
||||||
|
msgstr "عدد المرفقات"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__beneficiary_id
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_confirmation_search
|
||||||
|
msgid "Beneficiary"
|
||||||
|
msgstr "المستفيد"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model,name:account_budget_custom.model_crossovered_budget
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__from_crossovered_budget_id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__to_crossovered_budget_id
|
||||||
|
msgid "Budget"
|
||||||
|
msgstr "الموازنة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model,name:account_budget_custom.model_budget_confirmation
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__confirmation_id
|
||||||
|
msgid "Budget Confirmation"
|
||||||
|
msgstr "تعميد الموازنة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model,name:account_budget_custom.model_budget_confirmation_line
|
||||||
|
msgid "Budget Confirmation details"
|
||||||
|
msgstr "تفاصيل تصديق الموازنة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.actions.act_window,name:account_budget_custom.action_budget_confirmation_form
|
||||||
|
#: model:ir.ui.menu,name:account_budget_custom.menu_budget_confirmation
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_confirmation_form
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_confirmation_tree
|
||||||
|
msgid "Budget Confirmations"
|
||||||
|
msgstr "تحقق الموازنة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields.selection,name:account_budget_custom.selection__budget_confirmation__state__bdgt_dep_mngr
|
||||||
|
#: model:res.groups,name:account_budget_custom.group_department_manager_budget
|
||||||
|
msgid "Budget Department Manager"
|
||||||
|
msgstr "مدير إدارة الميزانية"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields.selection,name:account_budget_custom.selection__budget_confirmation__state__confirmed
|
||||||
|
#: model:res.groups,name:account_budget_custom.group_manager_budget
|
||||||
|
msgid "Budget Executive Director"
|
||||||
|
msgstr "المدير التنفيذي للإدارة المالية"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model,name:account_budget_custom.model_crossovered_budget_lines
|
||||||
|
msgid "Budget Line"
|
||||||
|
msgstr "بند الموازنة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/reports/budget_report_xlsx.py:0
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_crossovered_budget_line_graph
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_crossovered_budget_line_pivot
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_crossovered_budget_line_tree
|
||||||
|
#, python-format
|
||||||
|
msgid "Budget Lines"
|
||||||
|
msgstr "خطوط الموازنة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields.selection,name:account_budget_custom.selection__budget_confirmation__state__draft
|
||||||
|
msgid "Budget Officer "
|
||||||
|
msgstr "موظف الميزانية "
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.actions.act_window,name:account_budget_custom.open_budget_operations
|
||||||
|
#: model:ir.ui.menu,name:account_budget_custom.menu_budget_operations_form
|
||||||
|
msgid "Budget Operation"
|
||||||
|
msgstr "عمليات الموازنة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model,name:account_budget_custom.model_budget_operations
|
||||||
|
#: model:ir.ui.menu,name:account_budget_custom.menu_budget_operations
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations_search
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations_transfer_tree
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations_tree
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations_unlock_tree
|
||||||
|
msgid "Budget Operations"
|
||||||
|
msgstr "عمليات الموازنة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__from_budget_post_id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__to_budget_post_id
|
||||||
|
msgid "Budget Post"
|
||||||
|
msgstr "البند"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model,name:account_budget_custom.model_report_account_budget_custom_budget_report
|
||||||
|
msgid "Budget Report"
|
||||||
|
msgstr "تقرير الموازنة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.actions.act_window,name:account_budget_custom.open_budget_operations_transfer
|
||||||
|
msgid "Budget Transfer"
|
||||||
|
msgstr "مناقله بين الموازنات"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.actions.act_window,name:account_budget_custom.open_budget_unlock_restriction
|
||||||
|
#: model:ir.ui.menu,name:account_budget_custom.menu_budget_unlock_restriction_form
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations_unlock_restriction
|
||||||
|
msgid "Budget Unlock Restriction"
|
||||||
|
msgstr "إلغاء حجز الموازنة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:res.groups,name:account_budget_custom.group_budget_user
|
||||||
|
msgid "Budget User"
|
||||||
|
msgstr "مسستخدم الموازنة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.actions.report,name:account_budget_custom.action_report_budget_xlsx
|
||||||
|
msgid "Budget XLSX"
|
||||||
|
msgstr "الموازنة (اكسل)"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model,name:account_budget_custom.model_report_account_budget_custom_budget_xslx_report
|
||||||
|
msgid "Budget XLSX Report"
|
||||||
|
msgstr "تقرير الموازنة (اكسل)"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model,name:account_budget_custom.model_account_budget_post
|
||||||
|
msgid "Budgetary Position"
|
||||||
|
msgstr "بند الموازنة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.ui.menu,name:account_budget_custom.main_budgets_menu
|
||||||
|
msgid "Budgets"
|
||||||
|
msgstr "الموازنات"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields.selection,name:account_budget_custom.selection__budget_confirmation__state__cancel
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr "إلغاء"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.reject_wizard
|
||||||
|
msgid "Close"
|
||||||
|
msgstr "إلغاء"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__company_id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__company_id
|
||||||
|
msgid "Company"
|
||||||
|
msgstr "المؤسسة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_crossovered_budget_lines__percentage
|
||||||
|
msgid ""
|
||||||
|
"Comparison between practical and theoretical amount. This measure tells you "
|
||||||
|
"if you are below or over budget."
|
||||||
|
msgstr ""
|
||||||
|
"المقارنة بين القيمة الفعلية والنظرية. تحدد نسبة الانحراف في الإيرادات أو "
|
||||||
|
"المصروفات في الموازنة."
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations_unlock_restriction
|
||||||
|
msgid "Confirm"
|
||||||
|
msgstr "تأكيد"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget_lines__confirm
|
||||||
|
msgid "Confirm Amount"
|
||||||
|
msgstr "المبلغ المصدق"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget_lines__budget_confirm_amount
|
||||||
|
msgid "Confirmation Amount"
|
||||||
|
msgstr "مبلغ التصديق"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields.selection,name:account_budget_custom.selection__budget_operations__state__confirmed
|
||||||
|
msgid "Confirmed"
|
||||||
|
msgstr "مؤكد"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__analytic_account_id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__analytic_account_id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__budget_line_id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__from_budget_line_id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__to_budget_line_id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget_lines__to_operation_ids
|
||||||
|
msgid "Cost Center"
|
||||||
|
msgstr "الحساب التحليلي (بند الموازنة)"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__create_uid
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__create_uid
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__create_uid
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_reject_wizard__create_uid
|
||||||
|
msgid "Created by"
|
||||||
|
msgstr "أنشئ بواسطة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__create_date
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__create_date
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__create_date
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_reject_wizard__create_date
|
||||||
|
msgid "Created on"
|
||||||
|
msgstr "أنشئ في"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__currency_id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__currency_id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__currency_id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget__currency_id
|
||||||
|
msgid "Currency"
|
||||||
|
msgstr "العملة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__date
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__date
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__date
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_confirmation_search
|
||||||
|
msgid "Date"
|
||||||
|
msgstr "التاريخ"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields.selection,name:account_budget_custom.selection__budget_operations__operation_type__decrease
|
||||||
|
msgid "Decrease"
|
||||||
|
msgstr "تخفيض"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__department_id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__department_id
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_confirmation_search
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations_search
|
||||||
|
msgid "Department"
|
||||||
|
msgstr "القسم"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__description
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__description
|
||||||
|
msgid "Description"
|
||||||
|
msgstr "الوصف"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__lines_ids
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_confirmation_form
|
||||||
|
msgid "Details"
|
||||||
|
msgstr "تفاصيل المطابقة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_reject_wizard__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_report_account_budget_custom_budget_report__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_report_account_budget_custom_budget_xslx_report__display_name
|
||||||
|
msgid "Display Name"
|
||||||
|
msgstr "الاسم المعروض"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__res_id
|
||||||
|
msgid "Document ID"
|
||||||
|
msgstr "معرف المستند"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields.selection,name:account_budget_custom.selection__budget_confirmation__state__done
|
||||||
|
msgid "Done"
|
||||||
|
msgstr "تم التعميد"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields.selection,name:account_budget_custom.selection__budget_operations__state__draft
|
||||||
|
msgid "Draft"
|
||||||
|
msgstr "موظف الميزانية"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget_lines__final_amount
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.crossovered_budget_view_form
|
||||||
|
msgid "Final Amount"
|
||||||
|
msgstr "المبلغ النهائي"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__message_follower_ids
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__message_follower_ids
|
||||||
|
msgid "Followers"
|
||||||
|
msgstr "المتابعون"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__message_channel_ids
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__message_channel_ids
|
||||||
|
msgid "Followers (Channels)"
|
||||||
|
msgstr "المتابعون (القنوات)"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__message_partner_ids
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__message_partner_ids
|
||||||
|
msgid "Followers (Partners)"
|
||||||
|
msgstr "المتابعون (الشركاء)"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_operations__activity_type_icon
|
||||||
|
msgid "Font awesome icon e.g. fa-tasks"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations
|
||||||
|
msgid "From"
|
||||||
|
msgstr "من"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations_search
|
||||||
|
msgid "From Budget"
|
||||||
|
msgstr "من موازنة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations_search
|
||||||
|
msgid "From Cost Center"
|
||||||
|
msgstr "من الحساب التحليلي (بند الموازنة)"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget_lines__from_operation_ids
|
||||||
|
msgid "From Operation"
|
||||||
|
msgstr "من العملية"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_reject_wizard__id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_report_account_budget_custom_budget_report__id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_report_account_budget_custom_budget_xslx_report__id
|
||||||
|
msgid "ID"
|
||||||
|
msgstr "المرجع"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__activity_exception_icon
|
||||||
|
msgid "Icon"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_operations__activity_exception_icon
|
||||||
|
msgid "Icon to indicate an exception activity."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_confirmation__message_needaction
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_confirmation__message_unread
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_operations__message_needaction
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_operations__message_unread
|
||||||
|
msgid "If checked, new messages require your attention."
|
||||||
|
msgstr "إذا كان محددًا، فهناك رسائل جديدة تحتاج لرؤيتها."
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_confirmation__message_has_error
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_confirmation__message_has_sms_error
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_operations__message_has_error
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_operations__message_has_sms_error
|
||||||
|
msgid "If checked, some messages have a delivery error."
|
||||||
|
msgstr "إذا كان محددًا، فقد حدث خطأ في تسليم بعض الرسائل."
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields.selection,name:account_budget_custom.selection__budget_operations__operation_type__increase
|
||||||
|
msgid "Increase"
|
||||||
|
msgstr "تعزيز"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__message_is_follower
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__message_is_follower
|
||||||
|
msgid "Is Follower"
|
||||||
|
msgstr "متابع"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget_lines__is_transfered
|
||||||
|
msgid "Is Transfered"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_reject_wizard____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_report_account_budget_custom_budget_report____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_report_account_budget_custom_budget_xslx_report____last_update
|
||||||
|
msgid "Last Modified on"
|
||||||
|
msgstr "آخر تعديل في"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__write_uid
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__write_uid
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__write_uid
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_reject_wizard__write_uid
|
||||||
|
msgid "Last Updated by"
|
||||||
|
msgstr "آخر تحديث بواسطة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__write_date
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__write_date
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__write_date
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_reject_wizard__write_date
|
||||||
|
msgid "Last Updated on"
|
||||||
|
msgstr "آخر تحديث في"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__message_main_attachment_id
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__message_main_attachment_id
|
||||||
|
msgid "Main Attachment"
|
||||||
|
msgstr "المرفق الرئيسي"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__message_has_error
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__message_has_error
|
||||||
|
msgid "Message Delivery error"
|
||||||
|
msgstr "خطأ في تسليم الرسائل"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__message_ids
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__message_ids
|
||||||
|
msgid "Messages"
|
||||||
|
msgstr "الرسائل"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__my_activity_date_deadline
|
||||||
|
msgid "My Activity Deadline"
|
||||||
|
msgstr "نهاية الوقت المعين للنشاط"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__name
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__name
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_confirmation_search
|
||||||
|
msgid "Name"
|
||||||
|
msgstr "الاسم"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__new_balance
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_confirmation_line__new_balance
|
||||||
|
msgid "New Balance"
|
||||||
|
msgstr "المبلغ بعد الخصم"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__activity_date_deadline
|
||||||
|
msgid "Next Activity Deadline"
|
||||||
|
msgstr "الموعد النهائي للنشاط التالي"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__activity_summary
|
||||||
|
msgid "Next Activity Summary"
|
||||||
|
msgstr "ملخص النشاط التالي"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__activity_type_id
|
||||||
|
msgid "Next Activity Type"
|
||||||
|
msgstr "نوع النشاط التالي"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/models/budget_confirmation.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "No budget for "
|
||||||
|
msgstr "لا يوجد موازنة ل "
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/models/budget_confirmation.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "No enough budget for "
|
||||||
|
msgstr "متبقي الموازنة لا يغطي "
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__message_needaction_counter
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__message_needaction_counter
|
||||||
|
msgid "Number of Actions"
|
||||||
|
msgstr "عدد الإجراءات"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__message_has_error_counter
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__message_has_error_counter
|
||||||
|
msgid "Number of errors"
|
||||||
|
msgstr "عدد الاخطاء"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_confirmation__message_needaction_counter
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_operations__message_needaction_counter
|
||||||
|
msgid "Number of messages which requires an action"
|
||||||
|
msgstr "عدد الرسائل التي تتطلب إجراء"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_confirmation__message_has_error_counter
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_operations__message_has_error_counter
|
||||||
|
msgid "Number of messages with delivery error"
|
||||||
|
msgstr "عدد الرسائل الحادث بها خطأ في التسليم"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_confirmation__message_unread_counter
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_operations__message_unread_counter
|
||||||
|
msgid "Number of unread messages"
|
||||||
|
msgstr "عدد الرسائل الجديدة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__operation_type
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations_search
|
||||||
|
msgid "Operation Type"
|
||||||
|
msgstr "نوع العملية"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_reject_wizard__origin
|
||||||
|
msgid "Origin"
|
||||||
|
msgstr "المصدر"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_reject_wizard__origin_name
|
||||||
|
msgid "Origin Name"
|
||||||
|
msgstr "الإسم المصدر"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget_lines__practical_amount
|
||||||
|
msgid "Practical Amount"
|
||||||
|
msgstr "المبلغ الفعلي"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget_lines__provide
|
||||||
|
msgid "Provide"
|
||||||
|
msgstr "الدعومات"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.crossovered_budget_view_form
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_crossovered_budget_line_tree
|
||||||
|
msgid "Provided Amount"
|
||||||
|
msgstr "مبلغ الدعم"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget_lines__pull_out
|
||||||
|
msgid "Pull Out"
|
||||||
|
msgstr "تخفيض"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.crossovered_budget_view_form
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_crossovered_budget_line_tree
|
||||||
|
msgid "Pull Out Amount"
|
||||||
|
msgstr "مبلغ السحب"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget_lines__purchase_remain
|
||||||
|
msgid "Purchase Remain"
|
||||||
|
msgstr "المتبقي من التعميد"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__purchase_remind
|
||||||
|
msgid "Purchase Remind"
|
||||||
|
msgstr "المتبقي من التعميد"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields.selection,name:account_budget_custom.selection__budget_confirmation__type__purchase_request
|
||||||
|
msgid "Purchase Request"
|
||||||
|
msgstr "طلب شراء"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields.selection,name:account_budget_custom.selection__budget_confirmation__type__purchase_order
|
||||||
|
msgid "Purchase Requisition"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__reason
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__reason
|
||||||
|
msgid "Reason/Justification"
|
||||||
|
msgstr "السببظ المبرر"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__ref
|
||||||
|
msgid "Reference"
|
||||||
|
msgstr "المرجع"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.reject_wizard
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_confirmation_form
|
||||||
|
msgid "Reject"
|
||||||
|
msgstr "رفض"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__reject_reason
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_reject_wizard__reject_reason
|
||||||
|
msgid "Reject Reason"
|
||||||
|
msgstr "سبب الرفض"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__res_model
|
||||||
|
msgid "Related Document Model Name"
|
||||||
|
msgstr "اسم كائن المستند المرتبط"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__remain
|
||||||
|
msgid "Remain"
|
||||||
|
msgstr "الباقي"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.crossovered_budget_view_form
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_crossovered_budget_line_tree
|
||||||
|
msgid "Remain Amount"
|
||||||
|
msgstr "المبلغ المتاح"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_confirmation_line__remain
|
||||||
|
msgid "Remain in services budget for this cost center"
|
||||||
|
msgstr "المبلغ قبل الخصم لهذه الخدمات على هذه المراكز"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget_lines__remain
|
||||||
|
msgid "Remain of Christening"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.ui.menu,name:account_budget_custom.budget_reporting_menu
|
||||||
|
msgid "Reports"
|
||||||
|
msgstr "التقارير"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__user_id
|
||||||
|
msgid "Request user"
|
||||||
|
msgstr "المستخدم الطالب"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget_lines__reserve
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.crossovered_budget_view_form
|
||||||
|
msgid "Reserve Amount"
|
||||||
|
msgstr "المبلغ المحجوز"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__from_reserved
|
||||||
|
msgid "Reserve?"
|
||||||
|
msgstr "محجوز؟"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget_lines__reserved_amount
|
||||||
|
msgid "Reserved Amount"
|
||||||
|
msgstr "المبلغ المحجوز"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget__reserved_percent
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget_lines__reserved_percent
|
||||||
|
msgid "Reserved Percent"
|
||||||
|
msgstr "نسبة الحجز"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.crossovered_budget_view_form
|
||||||
|
msgid "Reserved Percent %"
|
||||||
|
msgstr "نسبة المحجوز %"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__activity_user_id
|
||||||
|
msgid "Responsible User"
|
||||||
|
msgstr "المستخدم المسؤول"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__message_has_sms_error
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__message_has_sms_error
|
||||||
|
msgid "SMS Delivery error"
|
||||||
|
msgstr "خطأ في تسليم الرسائل القصيرة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/models/budget_confirmation.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "Sorry This object have no field named Selection Reason"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/reports/budget_report_xlsx.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "Sorry, No data to Print"
|
||||||
|
msgstr "لا يوجد بيانات ليتم طباعتها"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/models/budget_confirmation.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "Specify Reject Reason"
|
||||||
|
msgstr "تحديد سبب الرفض"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_confirmation_search
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations_search
|
||||||
|
msgid "State"
|
||||||
|
msgstr "الحالة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__state
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation_line__state
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__state
|
||||||
|
msgid "Status"
|
||||||
|
msgstr "الحالة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_operations__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 ""
|
||||||
|
"الحالة على أساس الأنشطة\n"
|
||||||
|
"المتأخرة: تاريخ الاستحقاق مر\n"
|
||||||
|
"اليوم: تاريخ النشاط هو اليوم\n"
|
||||||
|
"المخطط: الأنشطة المستقبلية."
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget_lines__theoritical_amount
|
||||||
|
msgid "Theoretical Amount"
|
||||||
|
msgstr "القيمة النظرية"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/models/account_budget.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "This position can not be deleted"
|
||||||
|
msgstr "لا يمكن حذف مركز موازنة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations
|
||||||
|
msgid "To"
|
||||||
|
msgstr "ألى"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations_search
|
||||||
|
msgid "To Budget"
|
||||||
|
msgstr "إلى موازنة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations_search
|
||||||
|
msgid "To Cost Center"
|
||||||
|
msgstr "إلى الحساب التحليلي"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations_unlock_restriction
|
||||||
|
msgid "To Draft"
|
||||||
|
msgstr "الرجوع الي مبدئي"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_confirmation__total_amount
|
||||||
|
msgid "Total amount"
|
||||||
|
msgstr "إجمالي المبلغ"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_confirmation_line__amount
|
||||||
|
msgid "Total amount in services request line"
|
||||||
|
msgstr "المبلغ"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields.selection,name:account_budget_custom.selection__budget_operations__operation_type__transfer
|
||||||
|
#: model:ir.model.fields.selection,name:account_budget_custom.selection__budget_operations__type__transfer
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.crossovered_budget_view_form
|
||||||
|
msgid "Transfer"
|
||||||
|
msgstr "تحويل"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_confirmation_search
|
||||||
|
msgid "Type"
|
||||||
|
msgstr "النوع"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_operations__activity_exception_decoration
|
||||||
|
msgid "Type of the exception activity on record."
|
||||||
|
msgstr "نوع النشاط الاستثنائي المسجل."
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields.selection,name:account_budget_custom.selection__budget_operations__type__unlock
|
||||||
|
msgid "Unlock"
|
||||||
|
msgstr "إعادة الفتح"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__message_unread
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__message_unread
|
||||||
|
msgid "Unread Messages"
|
||||||
|
msgstr "الرسائل الجديدة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__message_unread_counter
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__message_unread_counter
|
||||||
|
msgid "Unread Messages Counter"
|
||||||
|
msgstr "عدد الرسائل الجديدة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__website_message_ids
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__website_message_ids
|
||||||
|
msgid "Website Messages"
|
||||||
|
msgstr "رسائل الموقع"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_confirmation__website_message_ids
|
||||||
|
#: model:ir.model.fields,help:account_budget_custom.field_budget_operations__website_message_ids
|
||||||
|
msgid "Website communication history"
|
||||||
|
msgstr "سجل تواصل الموقع"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_crossovered_budget_lines__year_end
|
||||||
|
msgid "Year End"
|
||||||
|
msgstr "نهاية السنة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/models/budget_operations.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "You can transfer to approved budget only"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/models/account_budget.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "You can not delete budget not in draft state"
|
||||||
|
msgstr "لا يمكن حذف موازنة ليست في مرحلة مسودة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/models/account_budget.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "You can not take more than the remaining amount"
|
||||||
|
msgstr "لا يمكن أخذ أكثر من المبلغ المتبقي"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/models/account_budget.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "You can not take more than the remaining amount.."
|
||||||
|
msgstr "لا يمكن أخذ أكثر من المبلغ المتبقي"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/models/account_budget.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "You can not take more than the reserved amount."
|
||||||
|
msgstr "لا يمكن أخذ اكثر من المبلغ المحجوز"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/models/budget_confirmation.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "You cannot copy a budget confirmation ."
|
||||||
|
msgstr "لا يمكن نسخ تصديق الموازنة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/models/budget_confirmation.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "You cannot delete a budget confirmation not in cancel state."
|
||||||
|
msgstr "لا يمكن حذف تصديق موازنة غير ملغى"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_confirmation_search
|
||||||
|
msgid "budget.confirmation"
|
||||||
|
msgstr "تعميد الموازنة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.reject_wizard
|
||||||
|
msgid "or"
|
||||||
|
msgstr "أو"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model,name:account_budget_custom.model_reject_wizard
|
||||||
|
msgid "reject.wizard"
|
||||||
|
msgstr "رفض المعالج"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/models/account_budget.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "remaining"
|
||||||
|
msgstr "المتبقى"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_budget_custom.view_budget_operations_search
|
||||||
|
msgid "state"
|
||||||
|
msgstr "الحالة"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_confirmation__type
|
||||||
|
#: model:ir.model.fields,field_description:account_budget_custom.field_budget_operations__type
|
||||||
|
msgid "type"
|
||||||
|
msgstr "النوع"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/reports/budget_report_xlsx.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "الإنجاز"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/reports/budget_report_xlsx.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "المبلغ الفعلى"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/reports/budget_report_xlsx.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "المبلغ المخطط"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/reports/budget_report_xlsx.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "المبلغ النظرية"
|
||||||
|
msgstr "المبلغ النظري"
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/reports/budget_report_xlsx.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "المـوازنـة"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/reports/budget_report_xlsx.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "الموازنات"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/reports/budget_report_xlsx.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "تاريخ الإنتهاء"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/reports/budget_report_xlsx.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "تاريخ البدء"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_budget_custom
|
||||||
|
#: code:addons/account_budget_custom/reports/budget_report_xlsx.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "وضع المـوازنـة"
|
||||||
|
msgstr ""
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from . import account_budget
|
||||||
|
from . import budget_operations
|
||||||
|
from . import budget_confirmation
|
||||||
|
|
@ -0,0 +1,234 @@
|
||||||
|
from odoo import api, fields, models, _
|
||||||
|
from odoo.exceptions import UserError, ValidationError
|
||||||
|
|
||||||
|
|
||||||
|
class AccountBudgetPost(models.Model):
|
||||||
|
_inherit = "account.budget.post"
|
||||||
|
|
||||||
|
def unlink(self):
|
||||||
|
raise ValidationError(_('This position can not be deleted'))
|
||||||
|
# return super(AccountBudgetPost, self).unlink()
|
||||||
|
|
||||||
|
|
||||||
|
class CrossoveredBudget(models.Model):
|
||||||
|
_inherit = "crossovered.budget"
|
||||||
|
_order = "create_date desc"
|
||||||
|
|
||||||
|
reserved_percent = fields.Float(string='Reserved Percent')
|
||||||
|
currency_id = fields.Many2one('res.currency', string='Currency',
|
||||||
|
readonly=True, required=True,
|
||||||
|
default=lambda self: self.env.user.company_id.currency_id.id)
|
||||||
|
|
||||||
|
def unlink(self):
|
||||||
|
for budget in self:
|
||||||
|
if budget.state not in 'draft':
|
||||||
|
raise UserError(_('You can not delete budget not in draft state'))
|
||||||
|
return super(CrossoveredBudget, self).unlink()
|
||||||
|
|
||||||
|
|
||||||
|
class CrossoveredBudgetLines(models.Model):
|
||||||
|
_inherit = "crossovered.budget.lines"
|
||||||
|
|
||||||
|
reserved_percent = fields.Float(related='crossovered_budget_id.reserved_percent', string='Reserved Percent')
|
||||||
|
reserved_amount = fields.Float(string='Reserved Amount', readonly=True, compute='_compute_reserved_amount')
|
||||||
|
# pull_out = fields.Float(string='Pull Out', compute='_compute_operations_amount', store=True, tracking=True)
|
||||||
|
pull_out = fields.Monetary(string='Pull Out')
|
||||||
|
|
||||||
|
provide = fields.Float(string='Provide', compute='_compute_operations_amount', store=True)
|
||||||
|
remain = fields.Float(string='Remain of Christening', compute='_compute_operations_amount')
|
||||||
|
budget_confirm_amount = fields.Float(string='Confirmation Amount', compute='_compute_operations_amount')
|
||||||
|
purchase_remain = fields.Float(store=True)
|
||||||
|
practical_amount = fields.Float(compute='_compute_practical_amount', string='Practical Amount', digits=0,
|
||||||
|
store=False)
|
||||||
|
theoritical_amount = fields.Float(compute='_compute_theoritical_amount', string='Theoretical Amount', digits=0,
|
||||||
|
store=True)
|
||||||
|
percentage = fields.Float(compute='_compute_percentage', string='Achievement', store=False, digits=(16, 4))
|
||||||
|
from_operation_ids = fields.One2many('budget.operations', 'from_budget_line_id', string='From Operation')
|
||||||
|
to_operation_ids = fields.One2many('budget.operations', 'to_budget_line_id', string='Cost Center')
|
||||||
|
reserve = fields.Float(string='Last Reserve Amount')
|
||||||
|
confirm = fields.Float(string='Confirm Amount')
|
||||||
|
year_end = fields.Boolean(compute="get_year_end")
|
||||||
|
is_transfered = fields.Boolean(default=False)
|
||||||
|
final_amount = fields.Float(compute='_compute_final_amount')
|
||||||
|
|
||||||
|
@api.depends('planned_amount', 'pull_out', 'provide')
|
||||||
|
def _compute_final_amount(self):
|
||||||
|
for line in self:
|
||||||
|
line.final_amount = line.planned_amount + line.provide - line.pull_out
|
||||||
|
|
||||||
|
def get_year_end(self):
|
||||||
|
for rec in self:
|
||||||
|
date = fields.Date.today()
|
||||||
|
if rec.crossovered_budget_id.date_to <= date and rec.purchase_remain > 0:
|
||||||
|
rec.year_end = True
|
||||||
|
else:
|
||||||
|
rec.year_end = False
|
||||||
|
|
||||||
|
def transfer_budget_action(self):
|
||||||
|
formview_ref = self.env.ref('account_budget_custom.view_budget_operations', False)
|
||||||
|
return {
|
||||||
|
'name': ("Budget Transfer"),
|
||||||
|
'view_mode': ' form',
|
||||||
|
'view_id': False,
|
||||||
|
'view_type': 'form',
|
||||||
|
'res_model': 'budget.operations',
|
||||||
|
'type': 'ir.actions.act_window',
|
||||||
|
'target': 'new',
|
||||||
|
'views': [(formview_ref and formview_ref.id or False, 'form')],
|
||||||
|
'context': {
|
||||||
|
'default_operation_type': 'transfer',
|
||||||
|
'default_from_budget_post_id': self.general_budget_id.id,
|
||||||
|
'default_from_crossovered_budget_id': self.crossovered_budget_id.id,
|
||||||
|
'default_from_budget_line_id': self.id,
|
||||||
|
'default_purchase_remind': self.purchase_remain,
|
||||||
|
'default_date': fields.Date.today(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@api.depends('from_operation_ids', 'to_operation_ids')
|
||||||
|
def _compute_operations_amount(self):
|
||||||
|
if not self.ids: return
|
||||||
|
for line in self:
|
||||||
|
pull_out = provide = budget_confirm_amount = purchase_remind = reserve_amount = 0.0
|
||||||
|
date_to = self.env.context.get('wizard_date_to') or line.date_to
|
||||||
|
date_from = self.env.context.get(
|
||||||
|
'wizard_date_from') or line.date_from
|
||||||
|
|
||||||
|
if line.analytic_account_id.id:
|
||||||
|
if 'reserved' not in self.env.context:
|
||||||
|
self.env.cr.execute("""
|
||||||
|
SELECT SUM(amount)
|
||||||
|
FROM budget_operations
|
||||||
|
WHERE from_budget_line_id=%s
|
||||||
|
AND (date between %s AND %s)
|
||||||
|
AND state='confirmed'""",
|
||||||
|
(line._origin.id, date_from, date_to,))
|
||||||
|
pull_out = self.env.cr.fetchone()[0] or 0.0
|
||||||
|
|
||||||
|
if 'reserved' in self.env.context:
|
||||||
|
self.env.cr.execute("""
|
||||||
|
SELECT SUM(amount)
|
||||||
|
FROM budget_operations
|
||||||
|
WHERE from_budget_line_id=%s
|
||||||
|
AND (date between %s AND %s)
|
||||||
|
AND state='confirmed'
|
||||||
|
AND from_reserved=%s""",
|
||||||
|
(line._origin.id, date_from, date_to, self.env.context['reserved']))
|
||||||
|
pull_out = self.env.cr.fetchone()[0] or 0.0
|
||||||
|
|
||||||
|
self.env.cr.execute("""
|
||||||
|
SELECT SUM(amount)
|
||||||
|
FROM budget_operations
|
||||||
|
WHERE to_budget_line_id=%s
|
||||||
|
AND (date between %s AND %s)
|
||||||
|
AND state='confirmed'""",
|
||||||
|
(line._origin.id, date_from, date_to,))
|
||||||
|
provide = self.env.cr.fetchone()[0] or 0.0
|
||||||
|
|
||||||
|
self.env.cr.execute("""
|
||||||
|
SELECT SUM(purchase_remind)
|
||||||
|
FROM budget_operations
|
||||||
|
WHERE to_budget_line_id=%s
|
||||||
|
AND (date between %s AND %s)
|
||||||
|
AND state='confirmed'""",
|
||||||
|
(line._origin.id, date_from, date_to,))
|
||||||
|
reserve_amount = self.env.cr.fetchone()[0] or 0.0
|
||||||
|
|
||||||
|
self.env.cr.execute("""
|
||||||
|
SELECT SUM(amount)
|
||||||
|
FROM budget_confirmation_line
|
||||||
|
WHERE budget_line_id=%s
|
||||||
|
AND (date between %s AND %s)
|
||||||
|
AND state='done'""",
|
||||||
|
(line._origin.id, date_from, date_to,))
|
||||||
|
budget_confirm_amount = self.env.cr.fetchone()[0] or 0.0
|
||||||
|
|
||||||
|
line.provide = provide
|
||||||
|
line.budget_confirm_amount = budget_confirm_amount
|
||||||
|
# line.remain = line.planned_amount + provide + line.pull_out - line.practical_amount + line.reserve + line.purchase_remain
|
||||||
|
line.remain = line.final_amount - line.practical_amount
|
||||||
|
|
||||||
|
@api.depends('analytic_account_id', 'planned_amount', 'practical_amount')
|
||||||
|
def name_get(self):
|
||||||
|
result = []
|
||||||
|
|
||||||
|
for line in self:
|
||||||
|
name = ''
|
||||||
|
name += line.analytic_account_id and line.analytic_account_id.name or '' + ' ' + _('remaining') + ' '
|
||||||
|
|
||||||
|
# check if reserved is needed
|
||||||
|
if self.env.context.get('reserved', False):
|
||||||
|
name += str(line.reserved_amount)
|
||||||
|
|
||||||
|
if not self.env.context.get('reserved', False):
|
||||||
|
name += str(line.remain)
|
||||||
|
|
||||||
|
result.append((line.id, name))
|
||||||
|
return result
|
||||||
|
|
||||||
|
# @api.depends('crossovered_budget_id.reserved_percent')
|
||||||
|
def _compute_reserved_amount(self):
|
||||||
|
for line in self:
|
||||||
|
reserved_amount = line.crossovered_budget_id.reserved_percent * \
|
||||||
|
line.planned_amount / 100.0
|
||||||
|
if reserved_amount:
|
||||||
|
reserved_amount -= line.with_context({'reserved': True}).pull_out
|
||||||
|
line.reserved_amount = reserved_amount
|
||||||
|
|
||||||
|
def _compute_practical_amount(self):
|
||||||
|
for line in self:
|
||||||
|
result = 0.0
|
||||||
|
acc_ids = line.general_budget_id.account_ids.ids
|
||||||
|
date_to = self.env.context.get('wizard_date_to') or line.date_to
|
||||||
|
date_from = self.env.context.get(
|
||||||
|
'wizard_date_from') or line.date_from
|
||||||
|
if line.analytic_account_id.id:
|
||||||
|
analytic_ids = self.env['account.analytic.account'].search(
|
||||||
|
['|', ('id', '=', line.analytic_account_id.id),
|
||||||
|
('parent_id', 'child_of', line.analytic_account_id.id)])
|
||||||
|
self.env.cr.execute(
|
||||||
|
"""
|
||||||
|
SELECT SUM(amount)
|
||||||
|
FROM account_analytic_line
|
||||||
|
WHERE account_id IN %s
|
||||||
|
AND (date between %s AND %s)
|
||||||
|
AND general_account_id=ANY(%s)""",
|
||||||
|
(tuple(analytic_ids.ids), date_from, date_to, acc_ids,))
|
||||||
|
result = self.env.cr.fetchone()[0] or 0.0
|
||||||
|
line.practical_amount = result
|
||||||
|
else:
|
||||||
|
|
||||||
|
aml_obj = self.env['account.move.line']
|
||||||
|
domain = [('account_id', 'in',
|
||||||
|
line.general_budget_id.account_ids.ids),
|
||||||
|
('date', '>=', date_from),
|
||||||
|
('date', '<=', date_to),
|
||||||
|
('move_id.state', '=', 'posted')
|
||||||
|
]
|
||||||
|
where_query = aml_obj._where_calc(domain)
|
||||||
|
aml_obj._apply_ir_rules(where_query, 'read')
|
||||||
|
from_clause, where_clause, where_clause_params = where_query.get_sql()
|
||||||
|
select = "SELECT sum(credit)-sum(debit) from " + from_clause + " where " + where_clause
|
||||||
|
|
||||||
|
self.env.cr.execute(select, where_clause_params)
|
||||||
|
line.practical_amount = self.env.cr.fetchone()[0] or 0.0
|
||||||
|
|
||||||
|
def _check_amount(self, amount=0, purchase_remind=0, transfer=False):
|
||||||
|
for obj in self:
|
||||||
|
if self.from_operation_ids.operation_type=='transfer' and self.from_operation_ids.purchase_remind>obj.final_amount:
|
||||||
|
raise ValidationError(_('''You can not take more than the remaining amount..'''))
|
||||||
|
# if obj.purchase_remain>
|
||||||
|
|
||||||
|
reserved_amount = obj.crossovered_budget_id.reserved_percent * \
|
||||||
|
obj.planned_amount / 100.0
|
||||||
|
if obj.with_context({'reserved': True}).pull_out > reserved_amount:
|
||||||
|
raise ValidationError(
|
||||||
|
_('''You can not take more than the reserved amount.'''))
|
||||||
|
if obj.planned_amount < 0:
|
||||||
|
if transfer and obj.purchase_remain != purchase_remind:
|
||||||
|
raise ValidationError(_('''You can not take more than the remaining amount..'''))
|
||||||
|
else:
|
||||||
|
|
||||||
|
if abs(obj.remain) < amount or obj.purchase_remain < purchase_remind:
|
||||||
|
raise ValidationError(
|
||||||
|
_('''You can not take more than the remaining amount'''))
|
||||||
|
|
@ -0,0 +1,248 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# Expert Co. Ltd.
|
||||||
|
# Copyright (C) 2018 (<http://www.exp-sa.com/>).
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
|
||||||
|
from odoo import api, fields, models, _
|
||||||
|
from odoo.exceptions import Warning, ValidationError
|
||||||
|
|
||||||
|
|
||||||
|
class BudgetConfirmation(models.Model):
|
||||||
|
_name = 'budget.confirmation'
|
||||||
|
_inherit = ['mail.thread']
|
||||||
|
_description = 'Budget Confirmation'
|
||||||
|
_order = "create_date desc"
|
||||||
|
|
||||||
|
name = fields.Char(string='Name')
|
||||||
|
|
||||||
|
date = fields.Date(string='Date', required=True)
|
||||||
|
|
||||||
|
beneficiary_id = fields.Many2one(comodel_name='res.partner',
|
||||||
|
required=False, string='Beneficiary')
|
||||||
|
|
||||||
|
department_id = fields.Many2one(
|
||||||
|
comodel_name='hr.department', string='Department')
|
||||||
|
|
||||||
|
analytic_account_id = fields.Many2one(
|
||||||
|
comodel_name='account.analytic.account',
|
||||||
|
string='Cost Center')
|
||||||
|
|
||||||
|
type = fields.Selection(string='type', selection=[('purchase.order', 'Purchase Requisition'), ('purchase.request', 'Purchase Request')])
|
||||||
|
|
||||||
|
ref = fields.Char(string='Reference')
|
||||||
|
|
||||||
|
res_model = fields.Char(
|
||||||
|
'Related Document Model Name')
|
||||||
|
res_id = fields.Integer('Document ID')
|
||||||
|
|
||||||
|
description = fields.Text(string='Description')
|
||||||
|
|
||||||
|
total_amount = fields.Monetary(
|
||||||
|
string='Amount',
|
||||||
|
help="Total amount")
|
||||||
|
|
||||||
|
state = fields.Selection(
|
||||||
|
[('draft', 'Budget Officer '),
|
||||||
|
('bdgt_dep_mngr', 'Budget Department Manager'),
|
||||||
|
('confirmed', 'Budget Executive Director'),
|
||||||
|
('done', 'Done'),
|
||||||
|
('cancel', 'Cancel')],
|
||||||
|
default='draft', string='Status', readonly=True, tracking=True)
|
||||||
|
|
||||||
|
lines_ids = fields.One2many(comodel_name='budget.confirmation.line',
|
||||||
|
inverse_name='confirmation_id', string='Details', required=True)
|
||||||
|
|
||||||
|
user_id = fields.Many2one(comodel_name='res.users', string='Request user',
|
||||||
|
required=False, default=lambda self: self.env.user)
|
||||||
|
|
||||||
|
company_id = fields.Many2one(string='Company', comodel_name='res.company',
|
||||||
|
default=lambda self: self.env.user.company_id)
|
||||||
|
|
||||||
|
currency_id = fields.Many2one(
|
||||||
|
'res.currency', string='Currency', required=True, readonly=True,
|
||||||
|
states={'draft': [('readonly', False)]},
|
||||||
|
default=lambda self: self.env.user.company_id.currency_id.id)
|
||||||
|
|
||||||
|
exceed_budget = fields.Boolean(default=False, string='Allow Exceed Budget')
|
||||||
|
reject_reason = fields.Char('Reject Reason')
|
||||||
|
|
||||||
|
|
||||||
|
def reject(self):
|
||||||
|
action_name = _('Specify Reject Reason')
|
||||||
|
return {
|
||||||
|
'type': 'ir.actions.act_window',
|
||||||
|
'name': action_name,
|
||||||
|
'res_model': 'reject.wizard',
|
||||||
|
'view_type': 'form',
|
||||||
|
'view_mode': 'form',
|
||||||
|
'target': 'new',
|
||||||
|
'context': {'default_origin': self.id, 'default_origin_name': self._name}
|
||||||
|
}
|
||||||
|
|
||||||
|
def confirm(self):
|
||||||
|
"""
|
||||||
|
change state to confirm and check budget
|
||||||
|
"""
|
||||||
|
for rec in self:
|
||||||
|
for line in rec.lines_ids:
|
||||||
|
line.sudo().check_budget()
|
||||||
|
|
||||||
|
self.write({'state': 'confirmed'})
|
||||||
|
|
||||||
|
def done(self):
|
||||||
|
"""
|
||||||
|
change state to done and do specific action depend on operation type
|
||||||
|
"""
|
||||||
|
self.write({'state': 'done'})
|
||||||
|
|
||||||
|
|
||||||
|
def bdgt_dep_mngr(self):
|
||||||
|
"""
|
||||||
|
change state to bdgt_dep_mngr and do specific action depend on operation type
|
||||||
|
"""
|
||||||
|
self.write({'state': 'bdgt_dep_mngr'})
|
||||||
|
|
||||||
|
def cancel(self):
|
||||||
|
"""
|
||||||
|
change state to cancel
|
||||||
|
"""
|
||||||
|
self.write({'state': 'cancel'})
|
||||||
|
|
||||||
|
def to_draft(self):
|
||||||
|
"""
|
||||||
|
change state to draft
|
||||||
|
"""
|
||||||
|
self.write({'state': 'draft'})
|
||||||
|
|
||||||
|
def unlink(self):
|
||||||
|
"""
|
||||||
|
Delete budget confirmation, but they must be in cancel state.
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
for rec in self:
|
||||||
|
if rec.state != 'cancel':
|
||||||
|
raise ValidationError(
|
||||||
|
_('You cannot delete a budget confirmation not in cancel state.'))
|
||||||
|
return super(BudgetConfirmation, self).unlink()
|
||||||
|
|
||||||
|
def copy(self):
|
||||||
|
"""
|
||||||
|
prevent copy of budget confirmation.
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
raise ValidationError(
|
||||||
|
_('You cannot copy a budget confirmation .'))
|
||||||
|
|
||||||
|
|
||||||
|
class BudgetConfirmationLine(models.Model):
|
||||||
|
_name = 'budget.confirmation.line'
|
||||||
|
_description = 'Budget Confirmation details'
|
||||||
|
|
||||||
|
confirmation_id = fields.Many2one(
|
||||||
|
comodel_name='budget.confirmation',
|
||||||
|
string='Budget Confirmation',
|
||||||
|
ondelete='cascade', index=True
|
||||||
|
)
|
||||||
|
account_id = fields.Many2one(
|
||||||
|
comodel_name='account.account',
|
||||||
|
string='Account'
|
||||||
|
)
|
||||||
|
amount = fields.Float(
|
||||||
|
string='Amount',
|
||||||
|
digits='Product Price',
|
||||||
|
help="Total amount in services request line"
|
||||||
|
)
|
||||||
|
remain = fields.Float(
|
||||||
|
string='Remain',
|
||||||
|
digits='Product Price',
|
||||||
|
help="Remain in services budget for this cost center"
|
||||||
|
)
|
||||||
|
new_balance = fields.Float(
|
||||||
|
string='New Balance',
|
||||||
|
digits='Product Price',
|
||||||
|
help="New Balance"
|
||||||
|
)
|
||||||
|
analytic_account_id = fields.Many2one(
|
||||||
|
comodel_name='account.analytic.account',
|
||||||
|
string='Cost Center',
|
||||||
|
required=True
|
||||||
|
)
|
||||||
|
date = fields.Date(
|
||||||
|
related='confirmation_id.date',
|
||||||
|
string='Date', store=True,
|
||||||
|
readonly=True, related_sudo=False
|
||||||
|
)
|
||||||
|
state = fields.Selection(
|
||||||
|
default='draft', string='Status',
|
||||||
|
readonly=True, related='confirmation_id.state',
|
||||||
|
store=True, related_sudo=False
|
||||||
|
)
|
||||||
|
budget_line_id = fields.Many2one(
|
||||||
|
comodel_name='crossovered.budget.lines',
|
||||||
|
string='Cost Center'
|
||||||
|
)
|
||||||
|
company_id = fields.Many2one(
|
||||||
|
comodel_name='res.company', string='Company',
|
||||||
|
related='confirmation_id.company_id', store=True,
|
||||||
|
readonly=True, related_sudo=False
|
||||||
|
)
|
||||||
|
currency_id = fields.Many2one(
|
||||||
|
comodel_name='res.currency',
|
||||||
|
related='confirmation_id.currency_id',
|
||||||
|
store=True, related_sudo=False
|
||||||
|
)
|
||||||
|
description = fields.Text(
|
||||||
|
string='Description'
|
||||||
|
)
|
||||||
|
|
||||||
|
def check_budget(self):
|
||||||
|
"""
|
||||||
|
check the available budget for given service and analytic amount
|
||||||
|
in defined period of time
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
self.ensure_one()
|
||||||
|
if not self.account_id:
|
||||||
|
raise ValidationError(_('''All lines should have accounts'''))
|
||||||
|
analytic_account_id = self.analytic_account_id
|
||||||
|
date = self.date
|
||||||
|
date = fields.Date.from_string(date)
|
||||||
|
budget_post = self.env['account.budget.post'].search([]).filtered(lambda x: self.account_id in x.account_ids)
|
||||||
|
|
||||||
|
budget_lines = analytic_account_id.crossovered_budget_line.filtered(
|
||||||
|
lambda x: x.general_budget_id in budget_post and
|
||||||
|
x.crossovered_budget_id.state == 'done' and
|
||||||
|
x.date_from <= date <= x.date_to)
|
||||||
|
|
||||||
|
if budget_lines:
|
||||||
|
remain = abs(budget_lines[0].remain)
|
||||||
|
if remain >= self.confirmation_id.total_amount:
|
||||||
|
return True
|
||||||
|
|
||||||
|
name = self.account_id.name
|
||||||
|
if not budget_lines:
|
||||||
|
raise ValidationError(_('''No budget for ''') + name)
|
||||||
|
if not self.confirmation_id.exceed_budget:
|
||||||
|
raise ValidationError(_('''No enough budget for ''') + name)
|
||||||
|
else:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class RejectWizard(models.TransientModel):
|
||||||
|
_name = 'reject.wizard'
|
||||||
|
|
||||||
|
origin = fields.Integer('')
|
||||||
|
reject_reason = fields.Text(string='Reject Reason')
|
||||||
|
origin_name = fields.Char('')
|
||||||
|
|
||||||
|
def action_reject(self):
|
||||||
|
origin_rec = self.env[self.origin_name].sudo().browse(self.origin)
|
||||||
|
if dict(self._fields).get('reject_reason') is None:
|
||||||
|
raise ValidationError(_('Sorry This object have no field named Selection Reason'))
|
||||||
|
else:
|
||||||
|
origin_rec.write({'reject_reason': self.reject_reason})
|
||||||
|
return origin_rec.with_context({'reject_reason': self.reject_reason}).cancel()
|
||||||
|
|
@ -0,0 +1,142 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# Expert Co. Ltd.
|
||||||
|
# Copyright (C) 2018 (<http://www.exp-sa.com/>).
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
from odoo import api, fields, models, _
|
||||||
|
from odoo.exceptions import ValidationError
|
||||||
|
|
||||||
|
|
||||||
|
class BudgetOperations(models.Model):
|
||||||
|
"""
|
||||||
|
this model used to make operations on budget
|
||||||
|
"""
|
||||||
|
_name = 'budget.operations'
|
||||||
|
_description = 'Budget Operations'
|
||||||
|
_inherit = ['mail.thread', 'mail.activity.mixin']
|
||||||
|
|
||||||
|
name = fields.Char(string='Name', default='/')
|
||||||
|
department_id = fields.Many2one(comodel_name='hr.department', string='Department')
|
||||||
|
from_crossovered_budget_id = fields.Many2one(comodel_name='crossovered.budget', string='Budget', tracking=True)
|
||||||
|
from_budget_line_id = fields.Many2one(comodel_name='crossovered.budget.lines', string='Cost Center', tracking=True)
|
||||||
|
to_crossovered_budget_id = fields.Many2one(comodel_name='crossovered.budget', string='Budget', tracking=True)
|
||||||
|
to_budget_line_id = fields.Many2one(comodel_name='crossovered.budget.lines', string='Cost Center', tracking=True)
|
||||||
|
amount = fields.Monetary(string='Amount', tracking=True)
|
||||||
|
currency_id = fields.Many2one(comodel_name='res.currency', string='Currency', readonly=True, required=True,
|
||||||
|
default=lambda self: self.env.user.company_id.currency_id.id)
|
||||||
|
state = fields.Selection(selection=[('draft', 'Draft'), ('confirmed', 'Confirmed')],
|
||||||
|
default='draft', string='Status', readonly=True, tracking=True)
|
||||||
|
type = fields.Selection(selection=[('unlock', 'Unlock'), ('transfer', 'Transfer')], default='transfer',
|
||||||
|
string='type', readonly=True, tracking=True)
|
||||||
|
date = fields.Date()
|
||||||
|
from_reserved = fields.Boolean(string='Reserve?', tracking=True)
|
||||||
|
from_budget_post_id = fields.Many2one(comodel_name='account.budget.post', string='Budget Post', tracking=True)
|
||||||
|
to_budget_post_id = fields.Many2one(comodel_name='account.budget.post', string='Budget Post', tracking=True)
|
||||||
|
operation_type = fields.Selection(
|
||||||
|
selection=[('transfer', 'Transfer'), ('increase', 'Increase'), ('decrease', 'Decrease')],
|
||||||
|
default='transfer', string='Operation Type', required=True, tracking=True)
|
||||||
|
purchase_remind = fields.Monetary(string='Purchase Remind', tracking=True)
|
||||||
|
|
||||||
|
@api.onchange('from_crossovered_budget_id', 'operation_type')
|
||||||
|
def get_budget_domain_year(self):
|
||||||
|
for rec in self:
|
||||||
|
domain = [('id', '=', False)]
|
||||||
|
if rec.operation_type == 'transfer' and rec.from_crossovered_budget_id:
|
||||||
|
date_to = rec.from_crossovered_budget_id.date_to
|
||||||
|
record = rec.env['crossovered.budget'].sudo().search([('date_to', '>', str(date_to))])
|
||||||
|
if record:
|
||||||
|
domain = [('id', 'in', record.mapped('crossovered_budget_line.general_budget_id').ids)]
|
||||||
|
else:
|
||||||
|
domain = [('id', 'in', rec.env['account.budget.post'].sudo().search([]).ids)]
|
||||||
|
return {'domain': {'to_budget_post_id': domain}}
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def create(self, values):
|
||||||
|
sequence_code = 'budget_operation.seq'
|
||||||
|
values['name'] = self.env['ir.sequence'].with_context(
|
||||||
|
ir_sequence_date=values['date']).next_by_code(sequence_code)
|
||||||
|
return super(BudgetOperations, self).create(values)
|
||||||
|
|
||||||
|
@api.onchange('operation_type')
|
||||||
|
def _onchange_operation_type(self):
|
||||||
|
if self.operation_type == 'increase':
|
||||||
|
self.from_crossovered_budget_id = False
|
||||||
|
self.from_budget_line_id = False
|
||||||
|
self.from_budget_post_id = False
|
||||||
|
self.from_reserved = False
|
||||||
|
|
||||||
|
@api.onchange('from_budget_post_id')
|
||||||
|
def _onchange_from_budget_post(self):
|
||||||
|
domain = [('id', 'in', [])]
|
||||||
|
if self.from_budget_post_id:
|
||||||
|
budget_line_obj = self.env['crossovered.budget.lines']
|
||||||
|
budget_line = budget_line_obj.read_group([('general_budget_id', '=', self.from_budget_post_id.id)],
|
||||||
|
['crossovered_budget_id'], ['crossovered_budget_id'])
|
||||||
|
domain = [('id', 'in', [bl['crossovered_budget_id'][0] for bl in budget_line])]
|
||||||
|
self.from_crossovered_budget_id = False
|
||||||
|
self.from_budget_line_id = False
|
||||||
|
return {'domain': {'from_crossovered_budget_id': domain}}
|
||||||
|
|
||||||
|
@api.onchange('to_budget_post_id')
|
||||||
|
def _onchange_to_budget_post(self):
|
||||||
|
domain = [('id', 'in', [])]
|
||||||
|
if self.to_budget_post_id:
|
||||||
|
budget_line_obj = self.env['crossovered.budget.lines']
|
||||||
|
search_domain = [('general_budget_id', '=', self.to_budget_post_id.id)]
|
||||||
|
if self.operation_type == 'transfer' and self.from_crossovered_budget_id:
|
||||||
|
search_domain += [('date_to', '>', str(self.from_crossovered_budget_id.date_to))]
|
||||||
|
budget_line = budget_line_obj.search(search_domain)
|
||||||
|
domain = [('id', 'in', budget_line.mapped('crossovered_budget_id').ids)]
|
||||||
|
self.to_crossovered_budget_id = False
|
||||||
|
self.to_budget_line_id = False
|
||||||
|
return {'domain': {'to_crossovered_budget_id': domain}}
|
||||||
|
|
||||||
|
@api.onchange('from_crossovered_budget_id')
|
||||||
|
def _onchange_from_crossovered_budget(self):
|
||||||
|
return {
|
||||||
|
'domain': {
|
||||||
|
'from_budget_line_id':
|
||||||
|
[('crossovered_budget_id', '=', self.from_crossovered_budget_id.id),
|
||||||
|
('general_budget_id', 'in', [self.from_budget_post_id.id])]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@api.onchange('to_crossovered_budget_id')
|
||||||
|
def _onchange_to_crossovered_budget(self):
|
||||||
|
return {
|
||||||
|
'domain': {
|
||||||
|
'to_budget_line_id':
|
||||||
|
[('crossovered_budget_id', '=', self.to_crossovered_budget_id.id),
|
||||||
|
('general_budget_id', 'in', [self.to_budget_post_id.id])]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def to_draft(self):
|
||||||
|
self.state = 'draft'
|
||||||
|
|
||||||
|
def confirm(self):
|
||||||
|
"""
|
||||||
|
"""
|
||||||
|
if self.date and self.to_crossovered_budget_id:
|
||||||
|
|
||||||
|
budget_start_date = self.to_crossovered_budget_id.date_from
|
||||||
|
budget_end_date = self.to_crossovered_budget_id.date_to
|
||||||
|
|
||||||
|
|
||||||
|
if self.date < budget_start_date or self.date > budget_end_date:
|
||||||
|
raise ValidationError(_('The operation date must be within the budget duration.'))
|
||||||
|
if self.to_crossovered_budget_id and self.to_crossovered_budget_id.state != 'done':
|
||||||
|
raise ValidationError(
|
||||||
|
_('You can transfer to approved budget only'))
|
||||||
|
self.to_budget_line_id.pull_out = self.purchase_remind
|
||||||
|
transfer = True if self.operation_type == 'transfer' else False
|
||||||
|
self.from_budget_line_id._check_amount(self.amount, self.purchase_remind, transfer)
|
||||||
|
# self.from_budget_line_id.is_transfered = True
|
||||||
|
if self.type == 'unlock':
|
||||||
|
self.from_reserved = True
|
||||||
|
self.to_crossovered_budget_id = self.from_crossovered_budget_id.id
|
||||||
|
self.to_budget_line_id = self.from_budget_line_id.id
|
||||||
|
self.state = 'confirmed'
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
from . import budget_report_xlsx
|
||||||
|
|
@ -0,0 +1,111 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
from odoo import models, api, _
|
||||||
|
from odoo.exceptions import ValidationError
|
||||||
|
|
||||||
|
|
||||||
|
class ReportSponsorPdf(models.AbstractModel):
|
||||||
|
_name = 'report.account_budget_custom.budget_report'
|
||||||
|
_description = 'Budget Report'
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def get_report_values(self, docids, data=None):
|
||||||
|
docs = []
|
||||||
|
title = _("Budget Lines")
|
||||||
|
release_date = datetime.now().date()
|
||||||
|
seq = self.env['ir.actions.report'].get_report_sequence('account_budget_custom.budget_report')['seq']
|
||||||
|
|
||||||
|
lines = self.env['crossovered.budget.lines'].search([('id', 'in', data['records'])])
|
||||||
|
for i in lines:
|
||||||
|
docs.append({
|
||||||
|
'crossovered_budget_id': i.crossovered_budget_id.id,
|
||||||
|
'general_budget_id': i.general_budget_id.id,
|
||||||
|
'date_from': datetime.strptime(i.date_from, '%Y-%m-%d %H:%M:%S').date(),
|
||||||
|
'date_to': datetime.strptime(i.date_to, '%Y-%m-%d %H:%M:%S').date(),
|
||||||
|
'planned_amount': i.planned_amount,
|
||||||
|
'practical_amount': i.practical_amount,
|
||||||
|
'theoritical_amount': i.theoritical_amount,
|
||||||
|
'percentage': i.percentage
|
||||||
|
})
|
||||||
|
|
||||||
|
if docs:
|
||||||
|
return {
|
||||||
|
'doc_ids': docids,
|
||||||
|
'doc_model': self.env['crossovered.budget.lines'],
|
||||||
|
'date': release_date,
|
||||||
|
'seq': seq,
|
||||||
|
'title': title,
|
||||||
|
'docs': docs,
|
||||||
|
}
|
||||||
|
else:
|
||||||
|
raise ValidationError(_("Sorry, No data to Print"))
|
||||||
|
|
||||||
|
def get_result(self, data=None):
|
||||||
|
res = []
|
||||||
|
labels = [
|
||||||
|
[_("المـوازنـة"), _("وضع المـوازنـة"), _("تاريخ البدء"), _("تاريخ الإنتهاء"), _("المبلغ المخطط"),
|
||||||
|
_("المبلغ الفعلى"), _("المبلغ النظرية"), _("الإنجاز")]]
|
||||||
|
|
||||||
|
budget_lines = self.env['crossovered.budget.lines'].search([])
|
||||||
|
for i in budget_lines:
|
||||||
|
res.append({
|
||||||
|
'crossovered_budget_id': i.crossovered_budget_id.name,
|
||||||
|
'general_budget_id': i.general_budget_id.name,
|
||||||
|
'date_from': i.date_from,
|
||||||
|
'date_to': i.date_to,
|
||||||
|
'planned_amount': i.planned_amount,
|
||||||
|
'practical_amount': i.practical_amount,
|
||||||
|
'theoritical_amount': i.theoritical_amount,
|
||||||
|
'percentage': i.percentage,
|
||||||
|
'labels': labels
|
||||||
|
})
|
||||||
|
return res
|
||||||
|
|
||||||
|
|
||||||
|
class InstitutionXlsxReport(models.AbstractModel):
|
||||||
|
_name = 'report.account_budget_custom.budget_xslx_report'
|
||||||
|
_inherit = 'report.report_xlsx.abstract'
|
||||||
|
_description = 'Budget XLSX Report'
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def generate_xlsx_report(self, workbook, data, objs):
|
||||||
|
docs = self.env['report.account_budget_custom.budget_report'].get_result(data)
|
||||||
|
if docs:
|
||||||
|
title = _("الموازنات")
|
||||||
|
sheet = workbook.add_worksheet('الموازنات')
|
||||||
|
sheet.right_to_left()
|
||||||
|
format1 = workbook.add_format(
|
||||||
|
{'bottom': True, 'right': True, 'left': True, 'top': True, 'align': 'center', })
|
||||||
|
format2 = workbook.add_format(
|
||||||
|
{'font_size': 14, 'bottom': True, 'right': True, 'left': True, 'top': True, 'align': 'center',
|
||||||
|
'bold': True})
|
||||||
|
format5 = workbook.add_format(
|
||||||
|
{'font_size': 14, 'bottom': True, 'right': True, 'left': True, 'top': True, 'align': 'center',
|
||||||
|
'bold': True, 'fg_color': '#dcdcdc'})
|
||||||
|
format2.set_align('center')
|
||||||
|
sheet.set_column('C:L', 15)
|
||||||
|
row = 10
|
||||||
|
i, n, c = 1, 1, 1
|
||||||
|
for line in docs:
|
||||||
|
clm = 2
|
||||||
|
for le in line['labels'][0]:
|
||||||
|
if i > 1:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
clm += 1
|
||||||
|
sheet.write(row, clm, le, format5)
|
||||||
|
c += 1
|
||||||
|
i += 1
|
||||||
|
row += 1
|
||||||
|
clm = 2
|
||||||
|
sheet.write(row, clm + 1, line['crossovered_budget_id'], format1)
|
||||||
|
sheet.write(row, clm + 2, line['general_budget_id'], format1)
|
||||||
|
sheet.write(row, clm + 3, line['date_from'], format1)
|
||||||
|
sheet.write(row, clm + 4, line['date_to'], format1)
|
||||||
|
sheet.write(row, clm + 5, line['planned_amount'], format1)
|
||||||
|
sheet.write(row, clm + 6, line['practical_amount'], format1)
|
||||||
|
sheet.write(row, clm + 7, line['theoritical_amount'], format1)
|
||||||
|
sheet.write(row, clm + 8, line['percentage'], format1)
|
||||||
|
|
||||||
|
n += 1
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<report id="action_report_budget_xlsx"
|
||||||
|
model="crossovered.budget.lines"
|
||||||
|
name="account_budget_custom.budget_xslx_report"
|
||||||
|
file="account_budget_custom.budget_xslx_report"
|
||||||
|
string="Budget XLSX"
|
||||||
|
report_type="xlsx"
|
||||||
|
menu="True"/>
|
||||||
|
</odoo>
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<odoo>
|
||||||
|
<data>
|
||||||
|
<record id="group_budget_user" model="res.groups">
|
||||||
|
<field name="name">Budget User</field>
|
||||||
|
<field name="category_id" ref="base.module_category_accounting_and_finance"/>
|
||||||
|
<field name="implied_ids" eval="[(4, ref('analytic.group_analytic_accounting')),
|
||||||
|
(4, ref('account.group_account_user'))]"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="group_department_manager_budget" model="res.groups">
|
||||||
|
<field name="name">Budget Department Manager</field>
|
||||||
|
<field name="category_id" ref="base.module_category_accounting_and_finance"/>
|
||||||
|
<field name="implied_ids" eval="[(4, ref('account_budget_custom.group_budget_user'))]"/>
|
||||||
|
|
||||||
|
<!-- <field name="implied_ids" eval="[(4, ref('analytic.group_analytic_accounting')),(4, ref('account.group_account_user'))]"/> -->
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="group_manager_budget" model="res.groups">
|
||||||
|
<field name="name">Budget Executive Director</field>
|
||||||
|
<field name="category_id" ref="base.module_category_accounting_and_finance"/>
|
||||||
|
<field name="implied_ids" eval="[(4, ref('account_budget_custom.group_budget_user'))]"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</data>
|
||||||
|
</odoo>
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||||
|
access_account_budget_confirmation,account.budget.confirmation,model_budget_confirmation,account.group_account_readonly,1,0,0,0
|
||||||
|
access_account_budget_confirmation_accountant,account.budget.confirmation accountant,model_budget_confirmation,account.group_account_user,1,1,1,1
|
||||||
|
access_account_budget_confirmation_line,account.budget.confirmation.line,model_budget_confirmation_line,account.group_account_readonly,1,0,0,0
|
||||||
|
access_account_budget_confirmation_line_accountant,account.budget.confirmation.line accountant,model_budget_confirmation_line,account.group_account_user,1,1,1,1
|
||||||
|
access_account_budget_operation,account.budget.operation,model_budget_operations,account.group_account_readonly,1,0,0,0
|
||||||
|
access_account_budget_operation_accountant,account.budget.operation accountant,model_budget_operations,account.group_account_user,1,1,1,1
|
||||||
|
|
||||||
|
access_reject_wizard_user,reject.wizard group_account_user,model_reject_wizard,account.group_account_user,1,1,1,1
|
||||||
|
|
After Width: | Height: | Size: 32 KiB |
|
|
@ -0,0 +1,22 @@
|
||||||
|
@media (min-width: 768px){
|
||||||
|
.rtl .navbar-right{
|
||||||
|
float: left !important;
|
||||||
|
}
|
||||||
|
.rtl .navbar-right .dropdown .dropdown-menu{
|
||||||
|
right: auto !important;
|
||||||
|
left: 0 !important;
|
||||||
|
}
|
||||||
|
.rtl .navbar-left{
|
||||||
|
float: right !important;
|
||||||
|
}
|
||||||
|
.rtl .navbar-left .dropdown .dropdown-menu{
|
||||||
|
left: auto !important;
|
||||||
|
right: 0 !important;
|
||||||
|
}
|
||||||
|
.navbar-nav.navbar-right:last-child{
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
|
.rtl .pull-left{
|
||||||
|
float: right !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,114 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<record model="ir.ui.view" id="crossovered_budget_view_form">
|
||||||
|
<field name="name">crossovered.budget.view.inherit.form</field>
|
||||||
|
<field name="model">crossovered.budget</field>
|
||||||
|
<field name="inherit_id" ref="odex25_account_budget.crossovered_budget_view_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//field[@name='user_id']" position="after">
|
||||||
|
<field name="reserved_percent" string="Reserved Percent %" invisible="1"/>
|
||||||
|
</xpath>
|
||||||
|
<xpath expr="//field[@name='company_id']" position="after">
|
||||||
|
<field name="currency_id" attrs="{'readonly':True}"/>
|
||||||
|
</xpath>
|
||||||
|
<xpath expr="//field[@name='user_id']" position="attributes">
|
||||||
|
<attribute name="attrs">{'required':True}</attribute>
|
||||||
|
</xpath>
|
||||||
|
<xpath expr="//field[@name='company_id']" position="attributes">
|
||||||
|
<attribute name="attrs">{'required':True}</attribute>
|
||||||
|
</xpath>
|
||||||
|
<xpath expr="//field[@name='crossovered_budget_line']/tree/field[@name='date_from']" position="attributes">
|
||||||
|
<attribute name="invisible">1</attribute>
|
||||||
|
</xpath>
|
||||||
|
<xpath expr="//field[@name='crossovered_budget_line']/tree/field[@name='date_to']" position="attributes">
|
||||||
|
<attribute name="invisible">1</attribute>
|
||||||
|
</xpath>
|
||||||
|
<xpath expr="//field[@name='crossovered_budget_line']/tree/field[@name='paid_date']" position="replace"/>
|
||||||
|
<xpath expr="//field[@name='crossovered_budget_line']/tree/field[@name='planned_amount']" position="after">
|
||||||
|
<field name="provide" readonly="1" sum="Provided Amount" widget="monetary"/>
|
||||||
|
|
||||||
|
<field name="pull_out" readonly="1" sum="Pull Out Amount" widget="monetary"/>
|
||||||
|
<field name="final_amount" readonly="1" sum="Final Amount" widget="monetary"/>
|
||||||
|
|
||||||
|
<field name="reserve" readonly="1" sum="Reserve Amount" widget="monetary"/>
|
||||||
|
|
||||||
|
<!--field name="reserved_amount" readonly="1" sum="Reserved Amount" widget="monetary"/-->
|
||||||
|
</xpath>
|
||||||
|
<xpath expr="//field[@name='crossovered_budget_line']/tree/field[@name='theoritical_amount']"
|
||||||
|
position="after">
|
||||||
|
<field name="purchase_remain" widget="monetary"/>
|
||||||
|
<field name="remain" readonly="1" sum="Remain Amount" widget="monetary"/>
|
||||||
|
</xpath>
|
||||||
|
<xpath expr="//field[@name='crossovered_budget_line']/tree/field[@name='percentage']" position="after">
|
||||||
|
<button
|
||||||
|
name="transfer_budget_action"
|
||||||
|
type="object"
|
||||||
|
string="Transfer"
|
||||||
|
class="oe_highlight" attrs="{'invisible':[('year_end', '=',False)]}"
|
||||||
|
/>
|
||||||
|
<field name="crossovered_budget_state" invisible="1"/>
|
||||||
|
<field name="year_end" invisible="1"/>
|
||||||
|
</xpath>
|
||||||
|
|
||||||
|
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="view_crossovered_budget_line_pivot" model="ir.ui.view">
|
||||||
|
<field name="name">crossovered.budget.lines.pivot</field>
|
||||||
|
<field name="model">crossovered.budget.lines</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<pivot string="Budget Lines" disable_linking="False">
|
||||||
|
<field name="crossovered_budget_id" type="row"/>
|
||||||
|
<field name="analytic_account_id" groups="analytic.group_analytic_accounting" type="row"/>
|
||||||
|
<field name="date_from" type="col"/>
|
||||||
|
<field name="date_to" type="col"/>
|
||||||
|
<field name="planned_amount" type="measure"/>
|
||||||
|
<field name="practical_amount" type="measure"/>
|
||||||
|
<field name="theoritical_amount" type="measure"/>
|
||||||
|
<field name="percentage" type="measure"/>
|
||||||
|
</pivot>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="view_crossovered_budget_line_graph" model="ir.ui.view">
|
||||||
|
<field name="name">crossovered.budget.lines.graph</field>
|
||||||
|
<field name="model">crossovered.budget.lines</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<graph string="Budget Lines">
|
||||||
|
<field name="crossovered_budget_id"/>
|
||||||
|
<field name="analytic_account_id" groups="analytic.group_analytic_accounting" type="row"/>
|
||||||
|
<field name="planned_amount" type="measure"/>
|
||||||
|
<field name="practical_amount" type="measure"/>
|
||||||
|
</graph>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="ir.ui.view" id="view_crossovered_budget_line_tree">
|
||||||
|
<field name="name">crossovered.budget.line.tree</field>
|
||||||
|
<field name="model">crossovered.budget.lines</field>
|
||||||
|
<field name="inherit_id" ref="odex25_account_budget.view_crossovered_budget_line_tree"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//tree" position="replace">
|
||||||
|
<tree string="Budget Lines">
|
||||||
|
<field name="crossovered_budget_id" invisible="1"/>
|
||||||
|
<field name="general_budget_id"/>
|
||||||
|
<field name="analytic_account_id" groups="analytic.group_analytic_accounting"/>
|
||||||
|
<field name="date_from"/>
|
||||||
|
<field name="date_to"/>
|
||||||
|
<field name="paid_date" groups="base.group_no_one"/>
|
||||||
|
<field name="planned_amount" widget="monetary"/>
|
||||||
|
<field name="provide" readonly="1" sum="Provided Amount" widget="monetary"/>
|
||||||
|
<field name="pull_out" readonly="1" sum="Pull Out Amount" widget="monetary"/>
|
||||||
|
<field name="practical_amount" widget="monetary"/>
|
||||||
|
<field name="remain" readonly="1" sum="Remain Amount" widget="monetary"/>
|
||||||
|
<field name="percentage"/>
|
||||||
|
</tree>
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="ir.actions.act_window" id="odex25_account_budget.act_crossovered_budget_lines_view">
|
||||||
|
<field name="view_mode">tree,form,graph,pivot</field>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
||||||
|
|
@ -0,0 +1,148 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<!-- Reject Reason wizard-->
|
||||||
|
<record id="reject_wizard" model="ir.ui.view">
|
||||||
|
<field name="name">Reject Reason</field>
|
||||||
|
<field name="model">reject.wizard</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<form>
|
||||||
|
<field name="origin" invisible="1"/>
|
||||||
|
<field name="reject_reason" required="1"/>
|
||||||
|
<footer>
|
||||||
|
<div>
|
||||||
|
<button name="action_reject" string="Reject" type="object" default_focus="1"
|
||||||
|
class="oe_highlight"/>
|
||||||
|
or
|
||||||
|
<button string="Close" class="oe_link" special="cancel"/>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
</form>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
<!--
|
||||||
|
Budget Confirmations
|
||||||
|
-->
|
||||||
|
<record id="view_budget_confirmation_search" model="ir.ui.view">
|
||||||
|
<field name="name">budget.confirmation.search</field>
|
||||||
|
<field name="model">budget.confirmation</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<search string="budget.confirmation">
|
||||||
|
<field name="name" filter_domain="[('name','ilike',self)]" string="Name"/>
|
||||||
|
<field name="date"/>
|
||||||
|
<field name="type"/>
|
||||||
|
<field name="beneficiary_id"/>
|
||||||
|
<field name="department_id"/>
|
||||||
|
<field name="total_amount"/>
|
||||||
|
<field name="state"/>
|
||||||
|
<separator/>
|
||||||
|
<filter name="type" string="Type" domain="[]" context="{'group_by': 'type'}"/>
|
||||||
|
<filter name="date" string="Date" domain="[]" context="{'group_by': 'date'}"/>
|
||||||
|
<filter name="beneficiary" string="Beneficiary" domain="[]" context="{'group_by': 'beneficiary_id'}"/>
|
||||||
|
<filter name="department" string="Department" domain="[]" context="{'group_by': 'department_id'}"/>
|
||||||
|
<filter name="state" string="State" domain="[]" context="{'group_by': 'state'}"/>
|
||||||
|
</search>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="view_budget_confirmation_tree" model="ir.ui.view">
|
||||||
|
<field name="name">budget.confirmation.tree</field>
|
||||||
|
<field name="model">budget.confirmation</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<tree string="Budget Confirmations" create="0" delete="0">
|
||||||
|
<field name="name"/>
|
||||||
|
<field name="date"/>
|
||||||
|
<field name="date"/>
|
||||||
|
<field name="beneficiary_id"/>
|
||||||
|
<field name="department_id"/>
|
||||||
|
<field name="total_amount"/>
|
||||||
|
<field name="state"/>
|
||||||
|
</tree>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="ir.ui.view" id="view_budget_confirmation_form">
|
||||||
|
<field name="name">budget.confirmation.form</field>
|
||||||
|
<field name="model">budget.confirmation</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<form string="Budget Confirmations" create="0" delete="0">
|
||||||
|
<header>
|
||||||
|
<button name="bdgt_dep_mngr" states="draft" string="Approve" type="object" class="oe_highlight"
|
||||||
|
groups="account_budget_custom.group_budget_user"/>
|
||||||
|
|
||||||
|
<button name="reject" states="draft" string="Reject" type="object" class="oe_highlight"
|
||||||
|
groups="account_budget_custom.group_budget_user"/>
|
||||||
|
|
||||||
|
<button name="confirm" states="bdgt_dep_mngr" string="Approve" type="object" class="oe_highlight"
|
||||||
|
groups="account_budget_custom.group_department_manager_budget"/>
|
||||||
|
|
||||||
|
<button name="reject" states="bdgt_dep_mngr" string="Reject" type="object" class="oe_highlight"
|
||||||
|
groups="account_budget_custom.group_department_manager_budget"/>
|
||||||
|
|
||||||
|
<button name="done" states="confirmed" string="Approve" type="object" class="oe_highlight"
|
||||||
|
groups="account_budget_custom.group_manager_budget,account_budget_custom.group_department_manager_budget"/>
|
||||||
|
|
||||||
|
<field name="state" widget="statusbar" statusbar_visible="draft,bdgt_dep_mngr,confirmed,done"/>
|
||||||
|
</header>
|
||||||
|
<sheet>
|
||||||
|
<div class="oe_title">
|
||||||
|
<h1>
|
||||||
|
<field name="name" readonly="1"/>
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
<group>
|
||||||
|
<group>
|
||||||
|
<field name="date" readonly="1"/>
|
||||||
|
<field name="beneficiary_id" options="{'no_create': True, 'no_open': True}"
|
||||||
|
readonly="1"/>
|
||||||
|
<field name="department_id" options="{'no_create': True, 'no_open': True}"
|
||||||
|
readonly="1"/>
|
||||||
|
<field name="exceed_budget" groups="account_budget_custom.group_manager_budget"/>
|
||||||
|
<field name="analytic_account_id" invisible="1"/>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<group>
|
||||||
|
<field name="type"/>
|
||||||
|
<field name="ref" attrs="{'readonly':[('type','!=','purchase.order')]}"/>
|
||||||
|
<field name="description" attrs="{'readonly':[('type','!=','purchase.order')]}"/>
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
<notebook>
|
||||||
|
<page string="Details">
|
||||||
|
<group>
|
||||||
|
<field name="total_amount" readonly="1"/>
|
||||||
|
</group>
|
||||||
|
<field name="lines_ids" readonly="1"
|
||||||
|
options="{'no_create': True, 'no_open': True}">
|
||||||
|
<tree editable="top">
|
||||||
|
<field name="account_id"/>
|
||||||
|
<field name="analytic_account_id"/>
|
||||||
|
<field name="remain"/>
|
||||||
|
|
||||||
|
<field name="amount"/>
|
||||||
|
<field name="new_balance"/>
|
||||||
|
<field name="description"/>
|
||||||
|
</tree>
|
||||||
|
</field>
|
||||||
|
</page>
|
||||||
|
</notebook>
|
||||||
|
|
||||||
|
|
||||||
|
</sheet>
|
||||||
|
|
||||||
|
<div class="oe_chatter">
|
||||||
|
<field name="message_follower_ids" widget="mail_followers" groups="base.group_user"/>
|
||||||
|
<field name="message_ids" widget="mail_thread"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</form>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="action_budget_confirmation_form" model="ir.actions.act_window">
|
||||||
|
<field name="name">Budget Confirmations</field>
|
||||||
|
<field name="res_model">budget.confirmation</field>
|
||||||
|
<field name="view_mode">tree,kanban,form</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
|
|
@ -0,0 +1,315 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<record id="view_budget_operations_search" model="ir.ui.view">
|
||||||
|
<field name="name">budget.operations.search</field>
|
||||||
|
<field name="model">budget.operations</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<search string="Budget Operations">
|
||||||
|
<field name="state" filter_domain="[('state','ilike',self)]" string="state"/>
|
||||||
|
<field name="department_id"/>
|
||||||
|
<field name="from_crossovered_budget_id"/>
|
||||||
|
<field name="from_budget_line_id"/>
|
||||||
|
<field name="to_crossovered_budget_id"/>
|
||||||
|
<field name="to_budget_line_id"/>
|
||||||
|
<separator/>
|
||||||
|
<filter name="state" string="State" context="{'group_by': 'state'}"/>
|
||||||
|
<filter name="department" string="Department" context="{'group_by': 'department_id'}"/>
|
||||||
|
<filter name="operation_type" string="Operation Type" context="{'group_by': 'operation_type'}"/>
|
||||||
|
<filter name="from_budget" string="From Budget" context="{'group_by': 'from_crossovered_budget_id'}"/>
|
||||||
|
<filter name="from_cost_center" string="From Cost Center"
|
||||||
|
context="{'group_by': 'from_budget_line_id'}"/>
|
||||||
|
<filter name="to_budget" string="To Budget" context="{'group_by': 'to_crossovered_budget_id'}"/>
|
||||||
|
<filter name="to_cost_center" string="To Cost Center" context="{'group_by': 'to_budget_line_id'}"/>
|
||||||
|
|
||||||
|
</search>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="view_budget_operations_tree" model="ir.ui.view">
|
||||||
|
<field name="name">budget.operations.tree</field>
|
||||||
|
<field name="model">budget.operations</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<tree string="Budget Operations">
|
||||||
|
<field name="name"/>
|
||||||
|
<field name="date"/>
|
||||||
|
<field name="operation_type"/>
|
||||||
|
<field name="department_id"/>
|
||||||
|
<field name="amount"/>
|
||||||
|
</tree>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="ir.ui.view" id="view_budget_operations">
|
||||||
|
<field name="name">budget.operations.form</field>
|
||||||
|
<field name="model">budget.operations</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<form string="Budget Operations">
|
||||||
|
<header>
|
||||||
|
<button name="confirm" string="Confirm" type="object" states="draft"/>
|
||||||
|
<button name="to_draft" string="To Draft" type="object" states="confirmed"/>
|
||||||
|
<field name="state" widget="statusbar" statusbar_visible="draft,confirmed"/>
|
||||||
|
</header>
|
||||||
|
<sheet>
|
||||||
|
<field name="type" invisible="1"/>
|
||||||
|
<group>
|
||||||
|
<group>
|
||||||
|
<field name="operation_type" attrs="{'readonly':[('state','!=','draft')]}"/>
|
||||||
|
<field name="department_id"
|
||||||
|
attrs="{'readonly':[('state','!=','draft')]}"
|
||||||
|
options="{'no_open': True, 'no_create': True}"/>
|
||||||
|
</group>
|
||||||
|
<group>
|
||||||
|
<field name="date" attrs="{'readonly':[('state','!=','draft')]}" required="1"/>
|
||||||
|
<field name="amount" attrs="{'readonly':[('state','!=','draft')],'invisible':[('operation_type','=','transfer')]}"/>
|
||||||
|
<field name="purchase_remind" attrs="{'readonly':[('state','!=','draft')]}"/>
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
<group>
|
||||||
|
<group string="From">
|
||||||
|
<field name="from_budget_post_id"
|
||||||
|
attrs="{'readonly':['|',('operation_type','=','increase'),('state','!=','draft')],
|
||||||
|
'required':[('operation_type','!=','increase')]}"/>
|
||||||
|
<field name="from_crossovered_budget_id"
|
||||||
|
attrs="{'readonly':['|',('state','!=','draft'),('operation_type','=','increase')],
|
||||||
|
'required':[('operation_type','!=','increase')]}"
|
||||||
|
domain="[('state','=','done')]"
|
||||||
|
options="{'no_open': True, 'no_create': True}"/>
|
||||||
|
<field name="from_reserved"
|
||||||
|
attrs="{'readonly':['|',('state','!=','draft'), ('operation_type','!=','transfer')]}"/>
|
||||||
|
<field name="from_budget_line_id"
|
||||||
|
attrs="{'readonly':['|',('state','!=','draft'),('operation_type','=','increase')],
|
||||||
|
'required':[('operation_type','!=','increase')]}"
|
||||||
|
domain="[('crossovered_budget_id','=',from_crossovered_budget_id)]"
|
||||||
|
options="{'no_open': True, 'no_create': True}"
|
||||||
|
context="{'reserved':from_reserved}"/>
|
||||||
|
</group>
|
||||||
|
<group string="To">
|
||||||
|
<field name="to_budget_post_id" class="oe_inline"
|
||||||
|
attrs="{'readonly':['|',('state','!=','draft'),('operation_type','=','decrease')],
|
||||||
|
'required':[('operation_type','!=','decrease')]}"/>
|
||||||
|
<field name="to_crossovered_budget_id"
|
||||||
|
attrs="{'readonly':['|',('state','!=','draft'),('operation_type','=','decrease')],
|
||||||
|
'required':[('operation_type','!=','decrease')]}"
|
||||||
|
domain="[('state','=','done')]"
|
||||||
|
options="{'no_open': True, 'no_create': True}"/>
|
||||||
|
<field name="to_budget_line_id"
|
||||||
|
attrs="{'readonly':['|',('state','!=','draft'),('operation_type','=','decrease')],
|
||||||
|
'required':[('operation_type','!=','decrease')]}"
|
||||||
|
domain="[('crossovered_budget_id','=',to_crossovered_budget_id)]"
|
||||||
|
options="{'no_open': True, 'no_create': True}"/>
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
</sheet>
|
||||||
|
<div class="oe_chatter">
|
||||||
|
<field name="message_follower_ids" widget="mail_followers" />
|
||||||
|
<field name="activity_ids" widget="mail_activity" />
|
||||||
|
<field name="message_ids" widget="mail_thread" />
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="open_budget_operations" model="ir.actions.act_window">
|
||||||
|
<field name="name">Budget Operation</field>
|
||||||
|
<field name="res_model">budget.operations</field>
|
||||||
|
<field name="view_mode">tree,kanban,form</field>
|
||||||
|
<field name="view_id" ref="view_budget_operations_tree"/>
|
||||||
|
<field name="search_view_id" ref="view_budget_operations_search"/>
|
||||||
|
<field name="domain">[('type','=','transfer')]</field>
|
||||||
|
<field name="context">{'default_type':'transfer'}</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="ir.actions.act_window.view" id="open_budget_operations_tree">
|
||||||
|
<field eval="1" name="sequence"/>
|
||||||
|
<field name="view_mode">tree</field>
|
||||||
|
<field name="view_id" ref="view_budget_operations_tree"/>
|
||||||
|
<field name="act_window_id" ref="open_budget_operations"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="ir.actions.act_window.view" id="open_budget_operations_form">
|
||||||
|
<field eval="2" name="sequence"/>
|
||||||
|
<field name="view_mode">form</field>
|
||||||
|
<field name="view_id" ref="view_budget_operations"/>
|
||||||
|
<field name="act_window_id" ref="open_budget_operations"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="view_budget_operations_transfer_tree" model="ir.ui.view">
|
||||||
|
<field name="name">budget.operations.tree</field>
|
||||||
|
<field name="model">budget.operations</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<tree string="Budget Operations">
|
||||||
|
<field name="name"/>
|
||||||
|
<field name="date"/>
|
||||||
|
<field name="operation_type"/>
|
||||||
|
<field name="department_id"/>
|
||||||
|
<field name="amount"/>
|
||||||
|
</tree>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="view_budget_operations_unlock_tree" model="ir.ui.view">
|
||||||
|
<field name="name">budget.unlock.tree</field>
|
||||||
|
<field name="model">budget.operations</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<tree string="Budget Operations">
|
||||||
|
<field name="name"/>
|
||||||
|
<field name="department_id"/>
|
||||||
|
<field name="from_crossovered_budget_id"/>
|
||||||
|
<field name="from_budget_line_id"/>
|
||||||
|
<field name="amount"/>
|
||||||
|
</tree>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="ir.ui.view" id="view_budget_operations_unlock_restriction">
|
||||||
|
<field name="name">budget.unlock.form</field>
|
||||||
|
<field name="model">budget.operations</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<form string="Budget Unlock Restriction">
|
||||||
|
<header>
|
||||||
|
<button name="confirm" string="Confirm" type="object" states="draft"/>
|
||||||
|
<button name="to_draft" string="To Draft" type="object" states="confirmed"/>
|
||||||
|
<field name="state" widget="statusbar" statusbar_visible="draft,confirmed"/>
|
||||||
|
</header>
|
||||||
|
<field name="type" invisible="1"/>
|
||||||
|
<sheet>
|
||||||
|
<group>
|
||||||
|
<group>
|
||||||
|
<field name="department_id" attrs="{'readonly':[('state','!=','draft')]}"
|
||||||
|
options="{'no_open': True, 'no_create': True}"/>
|
||||||
|
<field name="date" attrs="{'readonly':[('state','!=','draft')]}" required="1"/>
|
||||||
|
<field name="amount" attrs="{'readonly':[('state','!=','draft')]}"/>
|
||||||
|
</group>
|
||||||
|
<group>
|
||||||
|
<field name="from_crossovered_budget_id" attrs="{'readonly':[('state','!=','draft')]}"
|
||||||
|
domain="[('state','=','done')]"
|
||||||
|
options="{'no_open': True, 'no_create': True}"/>
|
||||||
|
<field name="from_budget_line_id" attrs="{'readonly':[('state','!=','draft')]}"
|
||||||
|
domain="[('crossovered_budget_id','=',from_crossovered_budget_id)]"
|
||||||
|
options="{'no_open': True, 'no_create': True}" context="{'reserved':True}"/>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
</group>
|
||||||
|
</sheet>
|
||||||
|
</form>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="open_budget_operations_transfer" model="ir.actions.act_window">
|
||||||
|
<field name="name">Budget Transfer</field>
|
||||||
|
<field name="res_model">budget.operations</field>
|
||||||
|
<field name="view_mode">tree,kanban,form</field>
|
||||||
|
<field name="view_id" ref="view_budget_operations_transfer_tree"/>
|
||||||
|
<field name="search_view_id" ref="view_budget_operations_search"/>
|
||||||
|
<field name="domain">[('type','=','transfer')]</field>
|
||||||
|
<field name="context">{'default_type':'transfer'}</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<record id="open_budget_unlock_restriction" model="ir.actions.act_window">
|
||||||
|
<field name="name">Budget Unlock Restriction</field>
|
||||||
|
<field name="res_model">budget.operations</field>
|
||||||
|
<field name="view_mode">tree,kanban,form</field>
|
||||||
|
<field name="view_id" ref="view_budget_operations_transfer_tree"/>
|
||||||
|
<field name="search_view_id" ref="view_budget_operations_search"/>
|
||||||
|
<field name="domain">[('type','=','unlock')]</field>
|
||||||
|
<field name="context">{'default_type':'unlock','reserved':True}</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="ir.actions.act_window.view" id="open_budget_unlock_restriction_tree">
|
||||||
|
<field eval="1" name="sequence"/>
|
||||||
|
<field name="view_mode">tree</field>
|
||||||
|
<field name="view_id" ref="view_budget_operations_unlock_tree"/>
|
||||||
|
<field name="act_window_id" ref="open_budget_unlock_restriction"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="ir.actions.act_window.view" id="open_budget_unlock_restriction_form">
|
||||||
|
<field eval="2" name="sequence"/>
|
||||||
|
<field name="view_mode">form</field>
|
||||||
|
<field name="view_id" ref="view_budget_operations_unlock_restriction"/>
|
||||||
|
<field name="act_window_id" ref="open_budget_unlock_restriction"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<!--
|
||||||
|
<record id="view_budget_operations_unlock_tree" model="ir.ui.view">
|
||||||
|
<field name="name">budget.unlock.tree</field>
|
||||||
|
<field name="model">budget.operations</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<tree string="Budget Operations">
|
||||||
|
<field name="name"/>
|
||||||
|
<field name="department_id"/>
|
||||||
|
<field name="from_initiative_id" />
|
||||||
|
<field name="from_crossovered_budget_id" />
|
||||||
|
<field name="from_budget_line_id" />
|
||||||
|
|
||||||
|
<field name="amount" />
|
||||||
|
</tree>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="ir.ui.view" id="view_budget_operations_unlock_restriction">
|
||||||
|
<field name="name">budget.unlock.form</field>
|
||||||
|
<field name="model">budget.operations</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<form string="Budget Unlock Restriction">
|
||||||
|
<header>
|
||||||
|
<button name="confirm" string="Confirm" type="object" states="draft"/>
|
||||||
|
<button name="to_draft" string="To Draft" type="object" states="confirmed"/>
|
||||||
|
<field name="state" widget="statusbar" statusbar_visible="draft,confirmed"/>
|
||||||
|
</header>
|
||||||
|
<field name="type" invisible="1"/>
|
||||||
|
<sheet>
|
||||||
|
<group>
|
||||||
|
<group>
|
||||||
|
<field name="department_id" attrs="{'readonly':[('state','!=','draft')]}" options="{'no_open': True, 'no_create': True}"/>
|
||||||
|
<field name="date" attrs="{'readonly':[('state','!=','draft')]}" required="1"/>
|
||||||
|
<field name="amount" attrs="{'readonly':[('state','!=','draft')]}"/>
|
||||||
|
</group>
|
||||||
|
<group>
|
||||||
|
<field name="from_initiative_id" attrs="{'readonly':[('state','!=','draft')]}" domain="[('department_id','=',department_id)]" options="{'no_open': True, 'no_create': True}"/>
|
||||||
|
<field name="from_crossovered_budget_id" attrs="{'readonly':[('state','!=','draft')]}" domain="[('initiative_id','=',from_initiative_id),('state','=','done')]" options="{'no_open': True, 'no_create': True}"/>
|
||||||
|
<field name="from_budget_line_id" attrs="{'readonly':[('state','!=','draft')]}" domain="[('crossovered_budget_id','=',from_crossovered_budget_id)]" options="{'no_open': True, 'no_create': True}" context="{'reserved':True}"/>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
</group>
|
||||||
|
</sheet>
|
||||||
|
</form>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<record id="open_budget_unlock_restriction" model="ir.actions.act_window">
|
||||||
|
<field name="name">Budget Unlock Restriction</field>
|
||||||
|
<field name="res_model">budget.operations</field>
|
||||||
|
<field name="view_mode">tree,kanban,form</field>
|
||||||
|
<field name="view_id" ref="view_budget_operations_tree"/>
|
||||||
|
<field name="search_view_id" ref="view_budget_operations_search"/>
|
||||||
|
<field name="domain">[('type','=','unlock')]</field>
|
||||||
|
<field name="context">{'default_type':'unlock','reserved':True}</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="ir.actions.act_window.view" id="open_budget_unlock_restriction_tree">
|
||||||
|
<field eval="1" name="sequence"/>
|
||||||
|
<field name="view_mode">tree</field>
|
||||||
|
<field name="view_id" ref="view_budget_operations_unlock_tree"/>
|
||||||
|
<field name="act_window_id" ref="open_budget_unlock_restriction"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="ir.actions.act_window.view" id="open_budget_unlock_restriction_form">
|
||||||
|
<field eval="2" name="sequence"/>
|
||||||
|
<field name="view_mode">form</field>
|
||||||
|
<field name="view_id" ref="view_budget_operations_unlock_restriction"/>
|
||||||
|
<field name="act_window_id" ref="open_budget_unlock_restriction"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<menuitem action="open_budget_unlock_restriction" id="menu_budget_unlock_restriction_form" parent="menu_budget_operations" groups="initiative_management.group_initiative_manager"/>
|
||||||
|
|
||||||
|
-->
|
||||||
|
|
||||||
|
</odoo>
|
||||||
|
|
@ -0,0 +1,57 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<odoo>
|
||||||
|
<data>
|
||||||
|
<record id="main_budgets_menu" model="ir.ui.menu">
|
||||||
|
<field name="name">Budgets</field>
|
||||||
|
<field name="sequence">10</field>
|
||||||
|
<field name="parent_id" ref="odex25_account_accountant.menu_accounting"/>
|
||||||
|
</record>
|
||||||
|
<record id="odex25_account_budget.menu_act_crossovered_budget_view" model="ir.ui.menu">
|
||||||
|
<field name="sequence">1</field>
|
||||||
|
<field name="parent_id" ref="main_budgets_menu"/>
|
||||||
|
</record>
|
||||||
|
<menuitem action="action_budget_confirmation_form" id="menu_budget_confirmation"
|
||||||
|
parent="main_budgets_menu" sequence="5"/>
|
||||||
|
|
||||||
|
<record id="odex25_account_budget.menu_budget_post_form" model="ir.ui.menu">
|
||||||
|
<field name="sequence">6</field>
|
||||||
|
<field name="parent_id" ref="main_budgets_menu"/>
|
||||||
|
</record>
|
||||||
|
<record id="account.account_analytic_def_account" model="ir.ui.menu">
|
||||||
|
<field name="sequence">7</field>
|
||||||
|
<field name="parent_id" ref="main_budgets_menu"/>
|
||||||
|
</record>
|
||||||
|
<record id="account.account_analytic_group_menu" model="ir.ui.menu">
|
||||||
|
<field name="sequence">8</field>
|
||||||
|
<field name="parent_id" ref="main_budgets_menu"/>
|
||||||
|
</record>
|
||||||
|
<record id="account.account_analytic_tag_menu" model="ir.ui.menu">
|
||||||
|
<field name="sequence">9</field>
|
||||||
|
<field name="parent_id" ref="main_budgets_menu"/>
|
||||||
|
</record>
|
||||||
|
<record id="account.menu_analytic_default_list" model="ir.ui.menu">
|
||||||
|
<field name="sequence">10</field>
|
||||||
|
<field name="parent_id" ref="main_budgets_menu"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<menuitem id="menu_budget_operations" parent="main_budgets_menu"
|
||||||
|
name="Budget Operations" groups="account_budget_custom.group_manager_budget" sequence="20"/>
|
||||||
|
<menuitem action="open_budget_operations" id="menu_budget_operations_form" groups="account_budget_custom.group_manager_budget"
|
||||||
|
parent="menu_budget_operations"/>
|
||||||
|
|
||||||
|
<menuitem action="open_budget_unlock_restriction" id="menu_budget_unlock_restriction_form"
|
||||||
|
parent="menu_budget_operations" groups="account_budget_custom.group_manager_budget"/>
|
||||||
|
|
||||||
|
<menuitem id="budget_reporting_menu"
|
||||||
|
name="Reports"
|
||||||
|
parent="main_budgets_menu"
|
||||||
|
sequence="30"/>
|
||||||
|
<record id="odex25_account_reports.menu_action_report_account_analytic" model="ir.ui.menu">
|
||||||
|
<field name="parent_id" ref="account_budget_custom.budget_reporting_menu"/>
|
||||||
|
</record>
|
||||||
|
<record id="odex25_account_budget.menu_act_crossovered_budget_lines_view" model="ir.ui.menu">
|
||||||
|
<field name="parent_id" ref="account_budget_custom.budget_reporting_menu"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</data>
|
||||||
|
</odoo>
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from . import models
|
||||||
|
from . import reports
|
||||||
|
|
@ -0,0 +1,36 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
{
|
||||||
|
'name': "Hierarchy Chart Of Accounts",
|
||||||
|
|
||||||
|
'summary': """
|
||||||
|
Hierarchy Chart Of Accounts""",
|
||||||
|
|
||||||
|
'description': """
|
||||||
|
Add Hierarchy Chart Of Accounts
|
||||||
|
to odoo because the chart of accounts in standard odoo
|
||||||
|
is flat .
|
||||||
|
so we add Hierarchy to odoo using parent
|
||||||
|
""",
|
||||||
|
|
||||||
|
'author': "Expert Co. Ltd.",
|
||||||
|
'website': "http://www.exp-sa.com",
|
||||||
|
'category': 'Odex25-Accounting/Odex25-Accounting',
|
||||||
|
'version': '1.0',
|
||||||
|
|
||||||
|
# any module necessary for this one to work correctly
|
||||||
|
'depends': ['account', 'odex25_account_reports'],
|
||||||
|
|
||||||
|
# always loaded
|
||||||
|
'data': [
|
||||||
|
'data/data_account_type.xml',
|
||||||
|
# 'data/account.account.csv',
|
||||||
|
'security/account_security.xml',
|
||||||
|
'security/ir.model.access.csv',
|
||||||
|
'views/account_account_view.xml',
|
||||||
|
'views/res_config_settings_views.xml',
|
||||||
|
'reports/account_report_coa.xml',
|
||||||
|
],
|
||||||
|
|
||||||
|
# 'qweb': ["static/src/xml/hierarchical_chart_templates.xml"],
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,221 @@
|
||||||
|
id,code,name,user_type_id/id,parent_id/id,reconcile
|
||||||
|
account_account_46_6c73eb66,0,Company,account_chart_of_accounts.data_account_type_view,,
|
||||||
|
account_account_47_d78e0779,1,Assets,account_chart_of_accounts.data_account_type_view,account_account_46_6c73eb66,
|
||||||
|
account_account_65_c1509b94,11,Current Assets,account_chart_of_accounts.data_account_type_view,account_account_47_d78e0779,
|
||||||
|
account_account_66_fd62e5ad,111,Cash in Banks and Funds,account_chart_of_accounts.data_account_type_view,account_account_65_c1509b94,
|
||||||
|
account_account_53_7cb227ec,1111,Cash in Current Accounts,account_chart_of_accounts.data_account_type_view,account_account_66_fd62e5ad,
|
||||||
|
account_account_57_cf9662ed,111101,Al Rajhi Bank,account.data_account_type_liquidity,account_account_53_7cb227ec,
|
||||||
|
account_account_40_5f61e45d,111102,Al-Inma Bank,account.data_account_type_liquidity,account_account_53_7cb227ec,
|
||||||
|
account_account_54_5a374538,111103,AL-Bilad Bank,account.data_account_type_liquidity,account_account_53_7cb227ec,
|
||||||
|
account_account_38_0ebb4933,111104,Account pending payments receipt -Cashs,account.data_account_type_current_assets,account_account_53_7cb227ec,True
|
||||||
|
account_account_39_10b7ab87,111105, Account outstanding payments receivable- cash,account.data_account_type_current_assets,account_account_53_7cb227ec,True
|
||||||
|
account_account_41_6e9068fc,111106,Account pending payments receipt Banks,account.data_account_type_current_assets,account_account_53_7cb227ec,True
|
||||||
|
account_account_42_b1f5d19c,111107,Account outstanding payments receivable - banks,account.data_account_type_current_assets,account_account_53_7cb227ec,True
|
||||||
|
1_configurable_chart_template_liquidity_transfer,111108,Transfers Account,account.data_account_type_current_assets,account_account_53_7cb227ec,True
|
||||||
|
account_account_36_e0178b31,111109,Bank Reconciliation Account,account.data_account_type_current_liabilities,account_account_53_7cb227ec,
|
||||||
|
account_account_67_33fdff22,1112,Cash in Boxes,account_chart_of_accounts.data_account_type_view,account_account_66_fd62e5ad,
|
||||||
|
account_account_68_19de836b,1113,Betty Cash Account,account_chart_of_accounts.data_account_type_view,account_account_66_fd62e5ad,
|
||||||
|
account_account_37_0a66304e,111401,Cash Boxes,account.data_account_type_liquidity,account_account_67_33fdff22,
|
||||||
|
account_account_48_45d5d5e3,111501,Employee cash covenant account,account.data_account_type_liquidity,account_account_68_19de836b,
|
||||||
|
account_account_138_f7b94056,111502,Other Betty Cash,account.data_account_type_liquidity,account_account_68_19de836b,
|
||||||
|
account_account_69_d82bbacb,112,Accounts Receivable,account_chart_of_accounts.data_account_type_view,account_account_65_c1509b94,
|
||||||
|
account_account_70_677ecbdd,1121,Receivable,account_chart_of_accounts.data_account_type_view,account_account_69_d82bbacb,
|
||||||
|
1_current_assets,112103,Employee loans and advances,account.data_account_type_current_assets,account_account_70_677ecbdd,
|
||||||
|
1_pos_receivable,112104,Receipts / Receivable,account.data_account_type_receivable,account_account_70_677ecbdd,True
|
||||||
|
account_account_71_60f68e70,113,Taxes,account_chart_of_accounts.data_account_type_view,account_account_65_c1509b94,
|
||||||
|
account_account_72_e218ef68,1131,VAT purchases,account_chart_of_accounts.data_account_type_view,account_account_71_60f68e70,
|
||||||
|
1_tax_paid,113101,VAT purchases,account.data_account_type_current_assets,account_account_72_e218ef68,
|
||||||
|
account_account_74_b59bda8f,114,Advance Payments,account_chart_of_accounts.data_account_type_view,account_account_65_c1509b94,
|
||||||
|
account_account_75_f2e13aa2,1141,Expenses Paid in Advance,account_chart_of_accounts.data_account_type_view,account_account_74_b59bda8f,
|
||||||
|
1_prepayments,114101,Prepaid Expenses,account.data_account_type_prepayments,account_account_75_f2e13aa2,
|
||||||
|
account_account_76_700e1cbe,115,Stores,account_chart_of_accounts.data_account_type_view,account_account_65_c1509b94,
|
||||||
|
account_account_77_edae9703,1151,Goods and Tools Store,account_chart_of_accounts.data_account_type_view,account_account_76_700e1cbe,
|
||||||
|
1_stock_valuation,115101,The main store,account.data_account_type_current_assets,account_account_77_edae9703,
|
||||||
|
1_stock_in,115102,Goods on the way,account.data_account_type_current_assets,account_account_77_edae9703,True
|
||||||
|
1_stock_out,115103,store under inspection,account.data_account_type_current_assets,account_account_77_edae9703,True
|
||||||
|
account_account_78_321e9deb,12,Non-Current Assets,account_chart_of_accounts.data_account_type_view,account_account_47_d78e0779,
|
||||||
|
account_account_79_07629e73,121,Fixed Assets,account_chart_of_accounts.data_account_type_view,account_account_78_321e9deb,
|
||||||
|
account_account_80_4600c70f,1211,The Cars,account_chart_of_accounts.data_account_type_view,account_account_79_07629e73,
|
||||||
|
account_account_62_286d2c1a,121101,The Cars,account.data_account_type_fixed_assets,account_account_80_4600c70f,
|
||||||
|
account_account_81_bfa28ebc,1212,The Furniture,account_chart_of_accounts.data_account_type_view,account_account_79_07629e73,
|
||||||
|
1_fixed_assets,121201,The Furniture,account.data_account_type_fixed_assets,account_account_81_bfa28ebc,
|
||||||
|
account_account_82_a15be3d4,1213,Computers and electronic devices,account_chart_of_accounts.data_account_type_view,account_account_79_07629e73,
|
||||||
|
account_account_253_4ec9623d,121301,Computers,account.data_account_type_fixed_assets,account_account_82_a15be3d4,
|
||||||
|
account_account_83_33cae736,122,Other Assets,account_chart_of_accounts.data_account_type_view,account_account_78_321e9deb,
|
||||||
|
account_account_84_6702a9d9,1221,Electronic Systems,account_chart_of_accounts.data_account_type_view,account_account_83_33cae736,
|
||||||
|
1_non_current_assets,122101,Website,account.data_account_type_non_current_assets,account_account_84_6702a9d9,
|
||||||
|
account_account_85_2e9b74d6,2,Liabilities and Equity,account_chart_of_accounts.data_account_type_view,account_account_46_6c73eb66,
|
||||||
|
account_account_86_8a06bf9e,21,Current Liabilities,account_chart_of_accounts.data_account_type_view,account_account_85_2e9b74d6,
|
||||||
|
account_account_87_2c3cce44,211,Short Term Commitments,account_chart_of_accounts.data_account_type_view,account_account_86_8a06bf9e,
|
||||||
|
account_account_88_817af232,2111,short term loans,account_chart_of_accounts.data_account_type_view,account_account_87_2c3cce44,
|
||||||
|
account_account_228_bd7c63be,211101,Short Term Loans,account.data_account_type_current_liabilities,account_account_88_817af232,
|
||||||
|
account_account_90_300bdcda,2112,Short Term Payment Papers,account_chart_of_accounts.data_account_type_view,account_account_87_2c3cce44,
|
||||||
|
1_current_liabilities,211201,Bills of exchange and checks,account.data_account_type_current_liabilities,account_account_90_300bdcda,
|
||||||
|
account_account_89_47fb493d,212,long-term commitments,account_chart_of_accounts.data_account_type_view,account_account_86_8a06bf9e,
|
||||||
|
account_account_91_9e465d19,2121,long term loans,account_chart_of_accounts.data_account_type_view,account_account_89_47fb493d,
|
||||||
|
account_account_230_35218190,212102,long term loans,account.data_account_type_non_current_liabilities,account_account_91_9e465d19,
|
||||||
|
account_account_92_e4127fde,2122,long-term bills of exchange,account_chart_of_accounts.data_account_type_view,account_account_89_47fb493d,
|
||||||
|
account_account_229_84ec3052,212201,long-term bills of exchange,account.data_account_type_non_current_liabilities,account_account_92_e4127fde,
|
||||||
|
account_account_93_01f44a26,213,creditors,account_chart_of_accounts.data_account_type_view,account_account_86_8a06bf9e,
|
||||||
|
account_account_94_65ac12f8,2131,trade creditors,account_chart_of_accounts.data_account_type_view,account_account_93_01f44a26,
|
||||||
|
1_receivable,213101,external suppliers,account.data_account_type_receivable,account_account_94_65ac12f8,True
|
||||||
|
1_payable,213102,Creditors/ Payments,account.data_account_type_payable,account_account_94_65ac12f8,True
|
||||||
|
account_account_95_8382072a,214,accrued expenses,account_chart_of_accounts.data_account_type_view,account_account_86_8a06bf9e,
|
||||||
|
account_account_96_d28f20a5,2141,accrued expenses,account_chart_of_accounts.data_account_type_view,account_account_95_8382072a,
|
||||||
|
1_to_receive_pay,214101,Salary and wages due,account.data_account_type_current_liabilities,account_account_96_d28f20a5,True
|
||||||
|
account_account_232_f7b879b7,214103,Eligible social security,account.data_account_type_current_liabilities,account_account_96_d28f20a5,
|
||||||
|
account_account_231_809292f4,214104,Payments made by clients,account.data_account_type_current_liabilities,account_account_96_d28f20a5,
|
||||||
|
account_account_97_4f194535,215,Zakat provision,account_chart_of_accounts.data_account_type_view,account_account_86_8a06bf9e,
|
||||||
|
account_account_98_8c546453,2151,Zakat provision,account_chart_of_accounts.data_account_type_view,account_account_97_4f194535,
|
||||||
|
account_account_233_ecae933a,215101,Zakat provision,account.data_account_type_current_liabilities,account_account_98_8c546453,
|
||||||
|
account_account_99_5d369744,22,Non-current obligations,account_chart_of_accounts.data_account_type_view,account_account_85_2e9b74d6,
|
||||||
|
account_account_100_f1248c0d,221,credit related parties,account_chart_of_accounts.data_account_type_view,account_account_99_5d369744,
|
||||||
|
account_account_101_58c25bee,2211,Accounts payable to related parties,account_chart_of_accounts.data_account_type_view,account_account_100_f1248c0d,
|
||||||
|
account_account_234_497027d0,221101,Partners Drawing Accounts,account.data_account_type_equity,account_account_101_58c25bee,
|
||||||
|
account_account_235_ae73fe3e,221102,Short term loan to related parties,account.data_account_type_equity,account_account_101_58c25bee,
|
||||||
|
account_account_236_df111e8d,221103,Other creditor related parties,account.data_account_type_equity,account_account_101_58c25bee,
|
||||||
|
account_account_102_b02675b1,222,Other credit balances,account_chart_of_accounts.data_account_type_view,account_account_99_5d369744,
|
||||||
|
account_account_103_b0e622d6,2221,Other creditors,account_chart_of_accounts.data_account_type_view,account_account_102_b02675b1,
|
||||||
|
account_account_238_d62e16f2,222101,temporary investments,account.data_account_type_equity,account_account_103_b0e622d6,
|
||||||
|
account_account_237_9013bc14,222102,Other creditors,account.data_account_type_equity,account_account_103_b0e622d6,
|
||||||
|
account_account_104_c6b44665,223,Taxes,account_chart_of_accounts.data_account_type_view,account_account_99_5d369744,
|
||||||
|
account_account_105_8dc905d4,2231,Sales Tax VAT,account_chart_of_accounts.data_account_type_view,account_account_104_c6b44665,
|
||||||
|
1_tax_receivable,223101,Sales Tax,account.data_account_type_current_assets,account_account_105_8dc905d4,
|
||||||
|
account_account_240_91f4b7d8,223102,VAT due,account.data_account_type_current_liabilities,account_account_105_8dc905d4,
|
||||||
|
account_account_106_5ef42f61,224,Allotments,account_chart_of_accounts.data_account_type_view,account_account_99_5d369744,
|
||||||
|
account_account_107_2f46d77a,2241,Provision for employee obligations,account_chart_of_accounts.data_account_type_view,account_account_106_5ef42f61,
|
||||||
|
account_account_241_49ec34fc,224101,Holidays allotted,account.data_account_type_non_current_liabilities,account_account_107_2f46d77a,
|
||||||
|
account_account_242_7ea4fe8a,224102,custom travel tickets,account.data_account_type_non_current_liabilities,account_account_107_2f46d77a,
|
||||||
|
account_account_243_6a7f90de,224103,Provision for end of severance pay,account.data_account_type_non_current_liabilities,account_account_107_2f46d77a,
|
||||||
|
account_account_108_d4c7ec75,2242,other allowances,account_chart_of_accounts.data_account_type_view,account_account_106_5ef42f61,
|
||||||
|
account_account_244_bbf0c0e8,224201,"Provision for doubtful debts, receivables from individuals",account.data_account_type_current_liabilities,account_account_108_d4c7ec75,
|
||||||
|
account_account_245_695a09b6,224202,"Provision for doubtful debts, receivables from companies",account.data_account_type_current_liabilities,account_account_108_d4c7ec75,
|
||||||
|
account_account_109_df598a12,23,Property rights,account_chart_of_accounts.data_account_type_view,account_account_85_2e9b74d6,
|
||||||
|
account_account_110_f75b7972,231,Equity,account_chart_of_accounts.data_account_type_view,account_account_109_df598a12,
|
||||||
|
account_account_111_98161560,2311,capital,account_chart_of_accounts.data_account_type_view,account_account_110_f75b7972,
|
||||||
|
account_account_246_ebe9ecda,231101,capital,account.data_account_type_equity,account_account_111_98161560,
|
||||||
|
account_account_247_5989bf9a,231102,financing for investment,account.data_account_type_equity,account_account_111_98161560,
|
||||||
|
account_account_112_d0561224,232,Reserve ,account_chart_of_accounts.data_account_type_view,account_account_109_df598a12,
|
||||||
|
account_account_113_706a1cf7,2321,Regular Reserve,account_chart_of_accounts.data_account_type_view,account_account_112_d0561224,
|
||||||
|
account_account_248_45083bfd,232101,Regular Reserve,account.data_account_type_equity,account_account_113_706a1cf7,
|
||||||
|
account_account_249_027afc8a,232102,Capital Losses,account.data_account_type_equity,account_account_113_706a1cf7,
|
||||||
|
account_account_114_7b2e99ad,233,Profits and Losses,account_chart_of_accounts.data_account_type_view,account_account_109_df598a12,
|
||||||
|
account_account_115_a082702d,2331,profits and losses,account_chart_of_accounts.data_account_type_view,account_account_114_7b2e99ad,
|
||||||
|
account_account_43_73a28584,233101,"Profits, losses, and residuals",account.data_unaffected_earnings,account_account_115_a082702d,
|
||||||
|
account_account_252_a8e1f749,233102,Profits and Losses,account.data_unaffected_earnings,account_account_115_a082702d,
|
||||||
|
1_tax_received,291001,Tax Received,account.data_account_type_current_liabilities,account_account_105_8dc905d4,
|
||||||
|
1_tax_payable,291002,Tax Payable,account.data_account_type_current_liabilities,account_account_105_8dc905d4,
|
||||||
|
account_account_116_1c1c95fe,3,expenses,account_chart_of_accounts.data_account_type_view,account_account_46_6c73eb66,
|
||||||
|
account_account_117_d7566a08,31,General and administrative expenses,account_chart_of_accounts.data_account_type_view,account_account_116_1c1c95fe,
|
||||||
|
account_account_118_d6b23c93,311,Administrative expenses,account_chart_of_accounts.data_account_type_view,account_account_117_d7566a08,
|
||||||
|
account_account_119_2b115ffc,3111,Salaries and Wages,account_chart_of_accounts.data_account_type_view,account_account_118_d6b23c93,
|
||||||
|
account_account_147_dedc9baf,311101,basic salary,account.data_account_type_expenses,account_account_119_2b115ffc,
|
||||||
|
account_account_148_990325eb,311102,housing allowance,account.data_account_type_expenses,account_account_119_2b115ffc,
|
||||||
|
account_account_149_eb24deb1,311103,transportation allowance,account.data_account_type_expenses,account_account_119_2b115ffc,
|
||||||
|
account_account_150_c160aa0a,311104,call exchange,account.data_account_type_expenses,account_account_119_2b115ffc,
|
||||||
|
account_account_151_873e0227,311105,work nature allowance,account.data_account_type_expenses,account_account_119_2b115ffc,
|
||||||
|
account_account_152_a8c2a986,311106,cost of living allowance,account.data_account_type_expenses,account_account_119_2b115ffc,
|
||||||
|
account_account_153_3915aabb,311107,expatriate allowance,account.data_account_type_expenses,account_account_119_2b115ffc,
|
||||||
|
account_account_154_4001295f,311108,assignment allowance,account.data_account_type_expenses,account_account_119_2b115ffc,
|
||||||
|
account_account_120_1ab280d4,3112,Other staff costs,account_chart_of_accounts.data_account_type_view,account_account_118_d6b23c93,
|
||||||
|
account_account_155_b3c93c17,311201,medical expenses,account.data_account_type_expenses,account_account_120_1ab280d4,
|
||||||
|
account_account_156_31ee8d22,311202,medical insurance,account.data_account_type_expenses,account_account_120_1ab280d4,
|
||||||
|
account_account_157_fef6b222,311203,Staff residence,account.data_account_type_expenses,account_account_120_1ab280d4,
|
||||||
|
account_account_158_99631784,311204,Exit and return visa,account.data_account_type_expenses,account_account_120_1ab280d4,
|
||||||
|
account_account_159_774ebe76,311205,Iqama renewal fee,account.data_account_type_expenses,account_account_120_1ab280d4,
|
||||||
|
account_account_160_3d3e87b0,311206,Work permit fees,account.data_account_type_expenses,account_account_120_1ab280d4,
|
||||||
|
account_account_161_f7f5b49d,311207,Service office expenses,account.data_account_type_expenses,account_account_120_1ab280d4,
|
||||||
|
account_account_162_e6634720,311208,Sponsorship Transfer Fee,account.data_account_type_expenses,account_account_120_1ab280d4,
|
||||||
|
account_account_163_76059d0a,311209,Training and seminars,account.data_account_type_expenses,account_account_120_1ab280d4,
|
||||||
|
account_account_164_e1271be0,311210,Recruitment expenses,account.data_account_type_expenses,account_account_120_1ab280d4,
|
||||||
|
account_account_166_d3ad0634,311211,Recruitment office fees,account.data_account_type_expenses,account_account_120_1ab280d4,
|
||||||
|
account_account_165_f11a2e81,311212,Social Security,account.data_account_type_expenses,account_account_120_1ab280d4,
|
||||||
|
account_account_167_2fe30391,311213,Work visit visa,account.data_account_type_expenses,account_account_120_1ab280d4,
|
||||||
|
account_account_168_65e0166b,311214,"Licenses of the Council of Engineers, Professionals and Technicians",account.data_account_type_expenses,account_account_120_1ab280d4,
|
||||||
|
account_account_169_789f90f9,311215,End of service gratuity,account.data_account_type_expenses,account_account_120_1ab280d4,
|
||||||
|
account_account_170_e6a057ef,311216,Transportation and travel expenses,account.data_account_type_expenses,account_account_120_1ab280d4,
|
||||||
|
account_account_171_8d5cdbab,311217,Staff salary transfer fee,account.data_account_type_expenses,account_account_120_1ab280d4,
|
||||||
|
account_account_121_1994bb54,3113,"Rewards, incentives and points",account_chart_of_accounts.data_account_type_view,account_account_118_d6b23c93,
|
||||||
|
account_account_172_fb45ff01,311301,Sales bonuses and commissions,account.data_account_type_expenses,account_account_121_1994bb54,
|
||||||
|
account_account_173_f6e7779f,311302,temporary wages,account.data_account_type_expenses,account_account_121_1994bb54,
|
||||||
|
account_account_122_905dc364,3114,Other allowances,account_chart_of_accounts.data_account_type_view,account_account_118_d6b23c93,
|
||||||
|
account_account_174_5e896e98,311401,Travel ticket exchange,account.data_account_type_expenses,account_account_122_905dc364,
|
||||||
|
account_account_175_f67e7e81,311402,Alternate warning period,account.data_account_type_expenses,account_account_122_905dc364,
|
||||||
|
account_account_176_12f13a3c,311403,education allowance,account.data_account_type_expenses,account_account_122_905dc364,
|
||||||
|
account_account_177_bbddfa7d,311404,Vacation allowance,account.data_account_type_expenses,account_account_122_905dc364,
|
||||||
|
account_account_123_b5c2a7c4,3115,Licensing fees and government subscriptions,account_chart_of_accounts.data_account_type_view,account_account_118_d6b23c93,
|
||||||
|
account_account_178_c0d3ac34,311501,business account fees,account.data_account_type_expenses,account_account_123_b5c2a7c4,
|
||||||
|
account_account_179_b917cbdb,311502,Municipal license fees,account.data_account_type_expenses,account_account_123_b5c2a7c4,
|
||||||
|
account_account_181_d936559d,311503,Chamber of Commerce subscription,account.data_account_type_expenses,account_account_123_b5c2a7c4,
|
||||||
|
account_account_124_6a434946,312,General expenses,account_chart_of_accounts.data_account_type_view,account_account_117_d7566a08,
|
||||||
|
account_account_125_582bd695,3121,Service charges,account_chart_of_accounts.data_account_type_view,account_account_124_6a434946,
|
||||||
|
account_account_60_ad170c1f,312101,Rents,account.data_account_type_expenses,account_account_125_582bd695,
|
||||||
|
account_account_183_1f5b24c7,312102,Water,account.data_account_type_expenses,account_account_125_582bd695,
|
||||||
|
account_account_184_9b55bddb,312103,Electricity,account.data_account_type_expenses,account_account_125_582bd695,
|
||||||
|
account_account_185_70877cd7,312104,Gasoline and motor oil,account.data_account_type_expenses,account_account_125_582bd695,
|
||||||
|
account_account_186_ffa5322f,312105,Advertising,account.data_account_type_expenses,account_account_125_582bd695,
|
||||||
|
account_account_187_a091e945,312106,Technical and information expenses,account.data_account_type_expenses,account_account_125_582bd695,
|
||||||
|
account_account_188_2a5ed1ce,312108,Building Maintenance,account.data_account_type_expenses,account_account_125_582bd695,
|
||||||
|
account_account_189_4c385ed9,312109,Computer and electronic equipment maintenance,account.data_account_type_expenses,account_account_125_582bd695,
|
||||||
|
account_account_190_57672b84,312110,government services,account.data_account_type_expenses,account_account_125_582bd695,
|
||||||
|
account_account_191_7ee8b51f,312111,Recruitment visas,account.data_account_type_expenses,account_account_125_582bd695,
|
||||||
|
account_account_192_0a5aca1d,312112,office equipment maintenance,account.data_account_type_expenses,account_account_125_582bd695,
|
||||||
|
account_account_193_e00db8e6,312113,Real estate services for the office,account.data_account_type_expenses,account_account_125_582bd695,
|
||||||
|
account_account_194_4ee836b4,312114,Marketing services expenses,account.data_account_type_expenses,account_account_125_582bd695,
|
||||||
|
1_cost_of_goods_sold,312115,Cost of Goods Sold,account.data_account_type_direct_costs,account_account_125_582bd695,
|
||||||
|
account_account_126_f124c559,3122,Communications and mail,account_chart_of_accounts.data_account_type_view,account_account_124_6a434946,
|
||||||
|
account_account_196_b1eb2c3f,312201,Phone charges and mobile bills,account.data_account_type_expenses,account_account_126_f124c559,
|
||||||
|
account_account_197_7f0a6829,312202,Postage and subscription,account.data_account_type_expenses,account_account_126_f124c559,
|
||||||
|
account_account_127_d924497a,3123,Service office supplies,account_chart_of_accounts.data_account_type_view,account_account_124_6a434946,
|
||||||
|
account_account_195_edc46352,312301,Publications,account.data_account_type_expenses,account_account_127_d924497a,
|
||||||
|
account_account_198_5ff20305,312302,Stationery and office supplies,account.data_account_type_expenses,account_account_127_d924497a,
|
||||||
|
account_account_199_3b1547e0,312303,Buffet supplies,account.data_account_type_expenses,account_account_127_d924497a,
|
||||||
|
account_account_128_385d1617,3124,Miscellaneous other expenses,account_chart_of_accounts.data_account_type_view,account_account_124_6a434946,
|
||||||
|
account_account_61_6ff47f77,312401,municipal licenses,account.data_account_type_expenses,account_account_128_385d1617,
|
||||||
|
account_account_200_a6c1aca0,312402,Gifts,account.data_account_type_expenses,account_account_128_385d1617,
|
||||||
|
account_account_201_0dcfd64a,312403,Travel ticket expenses,account.data_account_type_expenses,account_account_128_385d1617,
|
||||||
|
account_account_202_3dca95a3,312404,Hotel accommodation expenses,account.data_account_type_expenses,account_account_128_385d1617,
|
||||||
|
account_account_203_e45c14d8,312405,Shipping and unloading expenses,account.data_account_type_expenses,account_account_128_385d1617,
|
||||||
|
account_account_204_288f3450,312406,Newspaper and magazine ads,account.data_account_type_expenses,account_account_128_385d1617,
|
||||||
|
account_account_205_7694c361,312407,Radio and TV advertisements,account.data_account_type_expenses,account_account_128_385d1617,
|
||||||
|
account_account_206_5240d494,312408,Internet subscription,account.data_account_type_expenses,account_account_128_385d1617,
|
||||||
|
account_account_207_6adc039e,312409,Consulting and technical support fees,account.data_account_type_expenses,account_account_128_385d1617,
|
||||||
|
account_account_208_1172372f,312410,Legalization fees,account.data_account_type_expenses,account_account_128_385d1617,
|
||||||
|
account_account_209_70eb8c65,312411,Subscription and exhibitions,account.data_account_type_expenses,account_account_128_385d1617,
|
||||||
|
account_account_210_9b3cf9f5,312412,Miscellaneous administrative expenses,account.data_account_type_expenses,account_account_128_385d1617,
|
||||||
|
account_account_211_506f7a3f,312413,Paying fines and violations,account.data_account_type_expenses,account_account_128_385d1617,
|
||||||
|
account_account_212_7f1f952d,312414,Transfer fees,account.data_account_type_expenses,account_account_128_385d1617,
|
||||||
|
account_account_213_1e8ca1f9,312415,Bank fees and commissions,account.data_account_type_expenses,account_account_128_385d1617,
|
||||||
|
account_account_214_57a204fb,312416,Sales discounts,account.data_account_type_expenses,account_account_128_385d1617,
|
||||||
|
account_account_215_da6e9471,312417,Shipping and delivery costs,account.data_account_type_expenses,account_account_128_385d1617,
|
||||||
|
account_account_216_5c90146a,312418,Service costs,account.data_account_type_expenses,account_account_128_385d1617,
|
||||||
|
account_account_217_053ee245,312419,Rental commissions,account.data_account_type_expenses,account_account_128_385d1617,
|
||||||
|
account_account_218_ae6ead8f,312420,Leisure activities and outings,account.data_account_type_expenses,account_account_128_385d1617,
|
||||||
|
account_account_219_b9c9750a,312421,Hospitality and petty cash,account.data_account_type_expenses,account_account_128_385d1617,
|
||||||
|
account_account_220_fa538654,312422,Investment profit expense,account.data_account_type_expenses,account_account_128_385d1617,
|
||||||
|
account_account_221_c6efd4e2,312423,Advocacy and legal advice fees,account.data_account_type_expenses,account_account_128_385d1617,
|
||||||
|
account_account_222_cb49e83e,312424,Legal reference fees,account.data_account_type_expenses,account_account_128_385d1617,
|
||||||
|
account_account_223_a475086d,312425,Declaration of zakat and income,account.data_account_type_expenses,account_account_128_385d1617,
|
||||||
|
account_account_224_73e56a71,312426,Fine for late payment of value added tax,account.data_account_type_expenses,account_account_128_385d1617,
|
||||||
|
account_account_225_f8e78964,312427,Doubtful debts,account.data_account_type_expenses,account_account_128_385d1617,
|
||||||
|
account_account_226_8aaded69,312428,Other subscription fees,account.data_account_type_expenses,account_account_128_385d1617,
|
||||||
|
account_account_227_3243e5b0,312429,Banking service fees,account.data_account_type_expenses,account_account_128_385d1617,
|
||||||
|
1_expense,312430,Expenses,account.data_account_type_expenses,account_account_128_385d1617,
|
||||||
|
1_expense_rent,312431,office rentals,account.data_account_type_expenses,account_account_128_385d1617,
|
||||||
|
account_account_129_c20e9be3,313,depreciation,account_chart_of_accounts.data_account_type_view,account_account_117_d7566a08,
|
||||||
|
account_account_130_23ffe55c,3131,Depreciation expense,account_chart_of_accounts.data_account_type_view,account_account_129_c20e9be3,
|
||||||
|
account_account_64_da01c863,313101,Depreciation expense,account.data_account_type_depreciation,account_account_130_23ffe55c,
|
||||||
|
account_account_131_dee3e8df,4,Revenues,account_chart_of_accounts.data_account_type_view,account_account_46_6c73eb66,
|
||||||
|
account_account_132_ddaf24b2,41,Sales revenue,account_chart_of_accounts.data_account_type_view,account_account_131_dee3e8df,
|
||||||
|
account_account_133_eab09a57,411,The sales,account_chart_of_accounts.data_account_type_view,account_account_132_ddaf24b2,
|
||||||
|
account_account_134_aa3d1407,4111,cash sales,account_chart_of_accounts.data_account_type_view,account_account_133_eab09a57,
|
||||||
|
account_account_140_b53efa48,411101,Returns purchases,account.data_account_type_revenue,account_account_134_aa3d1407,
|
||||||
|
1_income,411102,Cash proceeds from sales of services,account.data_account_type_revenue,account_account_134_aa3d1407,
|
||||||
|
account_account_135_70e50462,42,Other revenue,account_chart_of_accounts.data_account_type_view,account_account_131_dee3e8df,
|
||||||
|
account_account_136_2b41da3a,421,Other sales,account_chart_of_accounts.data_account_type_view,account_account_135_70e50462,
|
||||||
|
account_account_137_0b886e4d,4211,Revenue other than activity,account_chart_of_accounts.data_account_type_view,account_account_136_2b41da3a,
|
||||||
|
account_account_141_24dc93b6,421101,Purchase Discounts,account.data_account_type_other_income,account_account_137_0b886e4d,
|
||||||
|
account_account_142_f225ed68,421102,commission income,account.data_account_type_other_income,account_account_137_0b886e4d,
|
||||||
|
account_account_143_61ad26e9,421103,rental income,account.data_account_type_other_income,account_account_137_0b886e4d,
|
||||||
|
account_account_145_6bd6176a,421104,Employee discounts,account.data_account_type_other_income,account_account_137_0b886e4d,
|
||||||
|
account_account_146_9eeddf1a,421105,governmental support,account.data_account_type_other_income,account_account_137_0b886e4d,
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<data noupdate="1">
|
||||||
|
<!-- account.account.type -->
|
||||||
|
<record model="account.account.type" id="data_account_type_view">
|
||||||
|
<field name="name">View</field>
|
||||||
|
<field name="type">view</field>
|
||||||
|
<field name="internal_group">view</field>
|
||||||
|
</record>
|
||||||
|
</data>
|
||||||
|
</odoo>
|
||||||
|
|
@ -0,0 +1,185 @@
|
||||||
|
# Translation of Odoo Server.
|
||||||
|
# This file contains the translation of the following modules:
|
||||||
|
# * account_chart_of_accounts
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: Odoo Server 14.0+e-20210105\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2021-05-26 05:04+0000\n"
|
||||||
|
"PO-Revision-Date: 2021-05-26 05:04+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_chart_of_accounts
|
||||||
|
#: model:ir.model,name:account_chart_of_accounts.model_account_account
|
||||||
|
msgid "Account"
|
||||||
|
msgstr "حساب"
|
||||||
|
|
||||||
|
#. module: account_chart_of_accounts
|
||||||
|
#: model:ir.model,name:account_chart_of_accounts.model_account_account_type
|
||||||
|
msgid "Account Type"
|
||||||
|
msgstr "نوع الحساب"
|
||||||
|
|
||||||
|
#. module: account_chart_of_accounts
|
||||||
|
#: model:ir.model.fields,field_description:account_chart_of_accounts.field_account_account__auto_code
|
||||||
|
msgid "Auto Code"
|
||||||
|
msgstr "الكود التلقائي"
|
||||||
|
|
||||||
|
#. module: account_chart_of_accounts
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_chart_of_accounts.res_config_settings_view_form
|
||||||
|
msgid "Auto Coding"
|
||||||
|
msgstr "الترميز التلقائي"
|
||||||
|
|
||||||
|
#. module: account_chart_of_accounts
|
||||||
|
#: model:ir.model.fields,field_description:account_chart_of_accounts.field_account_account__automticAccountsCodes
|
||||||
|
#: model:ir.model.fields,field_description:account_chart_of_accounts.field_res_company__automticAccountsCodes
|
||||||
|
#: model:ir.model.fields,field_description:account_chart_of_accounts.field_res_config_settings__automticAccountsCodes
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_chart_of_accounts.res_config_settings_view_form
|
||||||
|
msgid "Automaticly Generate Accounts Codes"
|
||||||
|
msgstr "إنشاء كود الحسابات تلقائياً"
|
||||||
|
|
||||||
|
#. module: account_chart_of_accounts
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_chart_of_accounts.res_config_settings_view_form
|
||||||
|
msgid "Chart of Account"
|
||||||
|
msgstr "الشجرة المحاسبية"
|
||||||
|
|
||||||
|
#. module: account_chart_of_accounts
|
||||||
|
#: model:ir.model.fields,field_description:account_chart_of_accounts.field_res_company__chart_account_padding
|
||||||
|
#: model:ir.model.fields,field_description:account_chart_of_accounts.field_res_config_settings__chart_account_padding
|
||||||
|
msgid "Chart of accounts Padding"
|
||||||
|
msgstr "الخانات المحفوظة في شجرة الحسابات"
|
||||||
|
|
||||||
|
#. module: account_chart_of_accounts
|
||||||
|
#: model:ir.model.fields,field_description:account_chart_of_accounts.field_res_company__chart_account_length
|
||||||
|
#: model:ir.model.fields,field_description:account_chart_of_accounts.field_res_config_settings__chart_account_length
|
||||||
|
msgid "Chart of accounts length"
|
||||||
|
msgstr "طول شجرة الحسابات"
|
||||||
|
|
||||||
|
#. module: account_chart_of_accounts
|
||||||
|
#: model:ir.model.fields,field_description:account_chart_of_accounts.field_account_account__child_ids
|
||||||
|
msgid "Child Accounts"
|
||||||
|
msgstr "الحسابات الفرعية"
|
||||||
|
|
||||||
|
#. module: account_chart_of_accounts
|
||||||
|
#: model:ir.model,name:account_chart_of_accounts.model_res_company
|
||||||
|
msgid "Companies"
|
||||||
|
msgstr "شركات"
|
||||||
|
|
||||||
|
#. module: account_chart_of_accounts
|
||||||
|
#: model:ir.model,name:account_chart_of_accounts.model_res_config_settings
|
||||||
|
msgid "Config Settings"
|
||||||
|
msgstr "ضبط الاعدادات"
|
||||||
|
|
||||||
|
#. module: account_chart_of_accounts
|
||||||
|
#: model:ir.model.fields,field_description:account_chart_of_accounts.field_account_account__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_chart_of_accounts.field_account_account_type__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_chart_of_accounts.field_res_company__display_name
|
||||||
|
#: model:ir.model.fields,field_description:account_chart_of_accounts.field_res_config_settings__display_name
|
||||||
|
msgid "Display Name"
|
||||||
|
msgstr "الاسم المعروض"
|
||||||
|
|
||||||
|
#. module: account_chart_of_accounts
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_chart_of_accounts.res_config_settings_view_form
|
||||||
|
msgid "Fixed Length"
|
||||||
|
msgstr "طول ثابت"
|
||||||
|
|
||||||
|
#. module: account_chart_of_accounts
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_chart_of_accounts.view_account_search
|
||||||
|
msgid "Hierarchical Chart"
|
||||||
|
msgstr "هيكل شجرة الحسابات"
|
||||||
|
|
||||||
|
#. module: account_chart_of_accounts
|
||||||
|
#: model:ir.model.fields,field_description:account_chart_of_accounts.field_account_account__id
|
||||||
|
#: model:ir.model.fields,field_description:account_chart_of_accounts.field_account_account_type__id
|
||||||
|
#: model:ir.model.fields,field_description:account_chart_of_accounts.field_res_company__id
|
||||||
|
#: model:ir.model.fields,field_description:account_chart_of_accounts.field_res_config_settings__id
|
||||||
|
msgid "ID"
|
||||||
|
msgstr "المُعرف"
|
||||||
|
|
||||||
|
#. module: account_chart_of_accounts
|
||||||
|
#: model:ir.model.fields,field_description:account_chart_of_accounts.field_account_account_type__internal_group
|
||||||
|
msgid "Internal Group"
|
||||||
|
msgstr "مجموعة داخلية"
|
||||||
|
|
||||||
|
#. module: account_chart_of_accounts
|
||||||
|
#: model:ir.model.fields,field_description:account_chart_of_accounts.field_account_account____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_chart_of_accounts.field_account_account_type____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_chart_of_accounts.field_res_company____last_update
|
||||||
|
#: model:ir.model.fields,field_description:account_chart_of_accounts.field_res_config_settings____last_update
|
||||||
|
msgid "Last Modified on"
|
||||||
|
msgstr "آخر تعديل في"
|
||||||
|
|
||||||
|
#. module: account_chart_of_accounts
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_chart_of_accounts.res_config_settings_view_form
|
||||||
|
msgid "Length"
|
||||||
|
msgstr "طول الشجرة"
|
||||||
|
|
||||||
|
#. module: account_chart_of_accounts
|
||||||
|
#: model:ir.model.fields,field_description:account_chart_of_accounts.field_account_account__level
|
||||||
|
msgid "Level"
|
||||||
|
msgstr "المستوى"
|
||||||
|
|
||||||
|
#. module: account_chart_of_accounts
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_chart_of_accounts.res_config_settings_view_form
|
||||||
|
msgid "Padding"
|
||||||
|
msgstr "عدد الخانات"
|
||||||
|
|
||||||
|
#. module: account_chart_of_accounts
|
||||||
|
#: model:ir.model.fields,field_description:account_chart_of_accounts.field_account_account__parent_id
|
||||||
|
msgid "Parent"
|
||||||
|
msgstr "الأصل"
|
||||||
|
|
||||||
|
#. module: account_chart_of_accounts
|
||||||
|
#: model:ir.model.fields,field_description:account_chart_of_accounts.field_account_account__parent_path
|
||||||
|
msgid "Parent Path"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_chart_of_accounts
|
||||||
|
#: model:ir.model.fields,help:account_chart_of_accounts.field_account_account_type__internal_group
|
||||||
|
msgid ""
|
||||||
|
"The 'Internal Group' is used to filter accounts based on the internal group "
|
||||||
|
"set on the account type."
|
||||||
|
msgstr ""
|
||||||
|
"خيار 'المجموعة الداخلية' يُستخدم لتصنيف الحسابات حسب المجموعة الداخلية "
|
||||||
|
"المُختارة في نوع الحساب."
|
||||||
|
|
||||||
|
#. module: account_chart_of_accounts
|
||||||
|
#: model:ir.model.fields,help:account_chart_of_accounts.field_account_account_type__type
|
||||||
|
msgid ""
|
||||||
|
"The 'Internal Type' is used for features available on different types of "
|
||||||
|
"accounts: liquidity type is for cash or bank accounts, payable/receivable is"
|
||||||
|
" for vendor/customer accounts."
|
||||||
|
msgstr ""
|
||||||
|
"يُستخدم 'النوع الداخلي' للخصائص المتاحة على الأنواع المختلفة للحسابات: النوع"
|
||||||
|
" الجاري للحسابات النقدية أو البنكية, والدائنة أو المدينة لحسابات "
|
||||||
|
"المورد/العميل."
|
||||||
|
|
||||||
|
#. module: account_chart_of_accounts
|
||||||
|
#: code:addons/account_chart_of_accounts/models/account_account.py:0
|
||||||
|
#, python-format
|
||||||
|
msgid "This account level is greater than the chart of account length."
|
||||||
|
msgstr "هذا الحساب في مستوى اكبر من طول شجرة الحسابات"
|
||||||
|
|
||||||
|
#. module: account_chart_of_accounts
|
||||||
|
#: model:ir.model.fields,field_description:account_chart_of_accounts.field_account_account_type__type
|
||||||
|
msgid "Type"
|
||||||
|
msgstr "النوع"
|
||||||
|
|
||||||
|
#. module: account_chart_of_accounts
|
||||||
|
#: model:ir.model.fields,field_description:account_chart_of_accounts.field_res_company__useFiexedTree
|
||||||
|
#: model:ir.model.fields,field_description:account_chart_of_accounts.field_res_config_settings__useFiexedTree
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_chart_of_accounts.res_config_settings_view_form
|
||||||
|
msgid "Use Fixed Length Chart of accounts"
|
||||||
|
msgstr "إستخدام شجرة حسابات محددة الطول"
|
||||||
|
|
||||||
|
#. module: account_chart_of_accounts
|
||||||
|
#: model:account.account.type,name:account_chart_of_accounts.data_account_type_view
|
||||||
|
#: model:ir.model.fields.selection,name:account_chart_of_accounts.selection__account_account_type__internal_group__view
|
||||||
|
#: model:ir.model.fields.selection,name:account_chart_of_accounts.selection__account_account_type__type__view
|
||||||
|
msgid "View"
|
||||||
|
msgstr "إجمالي"
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from . import account_account
|
||||||
|
from . import account_journal
|
||||||
|
from . import res_config_settings
|
||||||
|
from . import base
|
||||||
|
|
@ -0,0 +1,147 @@
|
||||||
|
from odoo import fields, models, api, _
|
||||||
|
from odoo.exceptions import UserError
|
||||||
|
|
||||||
|
|
||||||
|
class AccountAccountType(models.Model):
|
||||||
|
_inherit = "account.account.type"
|
||||||
|
|
||||||
|
type = fields.Selection(
|
||||||
|
selection_add=[('view', 'View')],
|
||||||
|
ondelete={'view': 'set default'}
|
||||||
|
|
||||||
|
)
|
||||||
|
internal_group = fields.Selection(
|
||||||
|
selection_add=[('view', 'View')],
|
||||||
|
ondelete={'view': lambda recs: recs.write({'internal_group': 'off_balance'})}
|
||||||
|
)
|
||||||
|
|
||||||
|
class AccountAccountTemplate(models.Model):
|
||||||
|
_inherit = "account.account.template"
|
||||||
|
_parent_name = "parent_id"
|
||||||
|
_parent_store = True
|
||||||
|
|
||||||
|
parent_id = fields.Many2one(
|
||||||
|
comodel_name='account.account.template',
|
||||||
|
domain=[('internal_type', '=', 'view')]
|
||||||
|
)
|
||||||
|
parent_path = fields.Char(
|
||||||
|
index=True
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class AccountChartTemplate(models.Model):
|
||||||
|
_inherit = "account.chart.template"
|
||||||
|
|
||||||
|
def generate_account(self, tax_template_ref, acc_template_ref, code_digits, company):
|
||||||
|
temp_model = self.env['account.account.template']
|
||||||
|
acc_model = self.env['account.account']
|
||||||
|
res = super(AccountChartTemplate, self).generate_account(tax_template_ref, acc_template_ref, code_digits, company)
|
||||||
|
for temp, acc in res.items():
|
||||||
|
parent = temp_model.browse(temp).parent_id.id
|
||||||
|
if parent:
|
||||||
|
acc_model.browse(acc).write({'parent_id':res[parent]})
|
||||||
|
return res
|
||||||
|
|
||||||
|
|
||||||
|
class AccountAccount(models.Model):
|
||||||
|
_inherit = "account.account"
|
||||||
|
_parent_name = "parent_id"
|
||||||
|
_parent_store = True
|
||||||
|
|
||||||
|
parent_id = fields.Many2one(
|
||||||
|
comodel_name='account.account',
|
||||||
|
domain=[('internal_type', '=', 'view')]
|
||||||
|
)
|
||||||
|
parent_path = fields.Char(
|
||||||
|
index=True
|
||||||
|
)
|
||||||
|
child_ids = fields.One2many(
|
||||||
|
'account.account', 'parent_id', 'Child Accounts'
|
||||||
|
)
|
||||||
|
auto_code = fields.Char(
|
||||||
|
compute='_get_code', default='0',
|
||||||
|
store=True, size=64, index=True
|
||||||
|
)
|
||||||
|
level = fields.Integer(
|
||||||
|
compute="_get_level", store=True, string='Level'
|
||||||
|
)
|
||||||
|
automticAccountsCodes = fields.Boolean(
|
||||||
|
related='company_id.automticAccountsCodes',
|
||||||
|
)
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _name_search(self, name='', args=None, operator='ilike', limit=100, name_get_uid=None):
|
||||||
|
if args is None: args = []
|
||||||
|
domain = args
|
||||||
|
if not self.env.context.get('show_view'):
|
||||||
|
domain += [('internal_type', '!=', 'view')]
|
||||||
|
return super(AccountAccount, self)._name_search(name, domain, operator ,limit ,name_get_uid)
|
||||||
|
|
||||||
|
@api.depends('parent_id')
|
||||||
|
def _get_level(self):
|
||||||
|
"""
|
||||||
|
Make the level of the record based on it's parent if not give it
|
||||||
|
a zero level cuse it is the first parent account.
|
||||||
|
"""
|
||||||
|
for rec in self:
|
||||||
|
level = 0
|
||||||
|
if rec.parent_id:
|
||||||
|
level = rec.parent_id.level + 1
|
||||||
|
if rec.company_id.useFiexedTree and rec.company_id.chart_account_length:
|
||||||
|
if level > rec.company_id.chart_account_length:
|
||||||
|
raise UserError(
|
||||||
|
_('''This account level is greater than the chart of account length.'''))
|
||||||
|
rec.level = level
|
||||||
|
|
||||||
|
@api.depends('parent_id', 'code', 'parent_id.code')
|
||||||
|
def _get_code(self):
|
||||||
|
"""
|
||||||
|
make the code of the record based on it's parent if not give it
|
||||||
|
a zero code cuse it is the first parent account.
|
||||||
|
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
for rec in self:
|
||||||
|
if not rec.company_id.automticAccountsCodes and rec.code:
|
||||||
|
rec.auto_code = rec.code
|
||||||
|
continue
|
||||||
|
|
||||||
|
code = str(0)
|
||||||
|
rec_id = rec.id
|
||||||
|
try:
|
||||||
|
rec_id = self._origin.id
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
if rec.parent_id:
|
||||||
|
default_padding = self.env.user.company_id.chart_account_padding
|
||||||
|
|
||||||
|
# if the account in the first level padding is not used
|
||||||
|
if rec.internal_type == 'view':
|
||||||
|
default_padding = False
|
||||||
|
|
||||||
|
# not to check childs to don't make any serial problems
|
||||||
|
parent_code = rec.parent_id.read(['code'])
|
||||||
|
parent_code = parent_code[0]['code']
|
||||||
|
# if the parent_code is zero make it a null string
|
||||||
|
# to don't interupt computation
|
||||||
|
parent_code = int(parent_code) != 0 and str(parent_code) or ''
|
||||||
|
max_siblings_code = False
|
||||||
|
|
||||||
|
siblings = self.search([
|
||||||
|
('parent_id', '=', rec.parent_id.id),
|
||||||
|
type(rec_id) == int and ('id', '!=', rec_id) or (1, '=', 1)
|
||||||
|
])
|
||||||
|
|
||||||
|
siblings = [x.read(['code'])[0]['code']
|
||||||
|
for x in siblings]
|
||||||
|
if siblings:
|
||||||
|
max_siblings_code = max([int(x) for x in siblings])
|
||||||
|
|
||||||
|
if not max_siblings_code:
|
||||||
|
code = parent_code + \
|
||||||
|
str(1).zfill(default_padding)
|
||||||
|
if max_siblings_code:
|
||||||
|
code = str(max_siblings_code + 1)
|
||||||
|
rec.write({'code': code, 'auto_code': code})
|
||||||
|
#if rec.child_ids:
|
||||||
|
# rec.child_ids._get_code(code)
|
||||||
|
|
@ -0,0 +1,92 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from odoo import api, fields, models, _
|
||||||
|
from odoo.exceptions import UserError
|
||||||
|
|
||||||
|
|
||||||
|
class AccountJournal(models.Model):
|
||||||
|
_inherit = "account.journal"
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _fill_missing_values(self, vals):
|
||||||
|
|
||||||
|
journal_type = vals.get('type')
|
||||||
|
|
||||||
|
# 'type' field is required.
|
||||||
|
if not journal_type:
|
||||||
|
return
|
||||||
|
|
||||||
|
# === Fill missing company ===
|
||||||
|
company = self.env['res.company'].browse(vals['company_id']) if vals.get('company_id') else self.env.company
|
||||||
|
vals['company_id'] = company.id
|
||||||
|
|
||||||
|
'''parent_id = company.parent_bank_cash_account_id.id
|
||||||
|
if not parent_id:
|
||||||
|
raise UserError(_("Default parent account for bank & cash accounts should be configure in accounting setting."))'''
|
||||||
|
|
||||||
|
# Don't get the digits on 'chart_template_id' since the chart template could be a custom one.
|
||||||
|
random_account = self.env['account.account'].search([('company_id', '=', company.id)], limit=1)
|
||||||
|
digits = len(random_account.code) if random_account else 6
|
||||||
|
|
||||||
|
liquidity_type = self.env.ref('account.data_account_type_liquidity')
|
||||||
|
current_assets_type = self.env.ref('account.data_account_type_current_assets')
|
||||||
|
|
||||||
|
if journal_type in ('bank', 'cash'):
|
||||||
|
has_liquidity_accounts = vals.get('default_account_id')
|
||||||
|
has_payment_accounts = vals.get('payment_debit_account_id') or vals.get('payment_credit_account_id')
|
||||||
|
has_profit_account = vals.get('profit_account_id')
|
||||||
|
has_loss_account = vals.get('loss_account_id')
|
||||||
|
|
||||||
|
if journal_type == 'bank':
|
||||||
|
liquidity_account_prefix = company.bank_account_code_prefix or ''
|
||||||
|
else:
|
||||||
|
liquidity_account_prefix = company.cash_account_code_prefix or company.bank_account_code_prefix or ''
|
||||||
|
|
||||||
|
parent = self.env['account.account'].search([('code', '=', liquidity_account_prefix)], limit=1)
|
||||||
|
if not parent:
|
||||||
|
raise UserError(
|
||||||
|
_("Can not find account with code (%s).") % (liquidity_account_prefix,))
|
||||||
|
|
||||||
|
# === Fill missing name ===
|
||||||
|
vals['name'] = vals.get('name') or vals.get('bank_acc_number')
|
||||||
|
|
||||||
|
# === Fill missing code ===
|
||||||
|
if 'code' not in vals:
|
||||||
|
vals['code'] = self.get_next_bank_cash_default_code(journal_type, company)
|
||||||
|
if not vals['code']:
|
||||||
|
raise UserError(_("Cannot generate an unused journal code. Please fill the 'Shortcode' field."))
|
||||||
|
|
||||||
|
# === Fill missing accounts ===
|
||||||
|
if not has_liquidity_accounts:
|
||||||
|
default_account_code = self.env['account.account']._search_new_account_code(company, digits,
|
||||||
|
liquidity_account_prefix)
|
||||||
|
default_account_vals = self._prepare_liquidity_account_vals(company, default_account_code, vals)
|
||||||
|
default_account_vals['parent_id'] = parent.id
|
||||||
|
vals['default_account_id'] = self.env['account.account'].create(default_account_vals).id
|
||||||
|
if not has_payment_accounts:
|
||||||
|
vals['payment_debit_account_id'] = self.env['account.account'].create({
|
||||||
|
'name': _("Outstanding Receipts"),
|
||||||
|
'code': self.env['account.account']._search_new_account_code(company, digits,
|
||||||
|
liquidity_account_prefix),
|
||||||
|
'reconcile': True,
|
||||||
|
'user_type_id': current_assets_type.id,
|
||||||
|
'company_id': company.id,
|
||||||
|
'parent_id': parent.id,
|
||||||
|
}).id
|
||||||
|
vals['payment_credit_account_id'] = self.env['account.account'].create({
|
||||||
|
'name': _("Outstanding Payments"),
|
||||||
|
'code': self.env['account.account']._search_new_account_code(company, digits,
|
||||||
|
liquidity_account_prefix),
|
||||||
|
'reconcile': True,
|
||||||
|
'user_type_id': current_assets_type.id,
|
||||||
|
'company_id': company.id,
|
||||||
|
'parent_id': parent.id,
|
||||||
|
}).id
|
||||||
|
if journal_type == 'cash' and not has_profit_account:
|
||||||
|
vals['profit_account_id'] = company.default_cash_difference_income_account_id.id
|
||||||
|
if journal_type == 'cash' and not has_loss_account:
|
||||||
|
vals['loss_account_id'] = company.default_cash_difference_expense_account_id.id
|
||||||
|
|
||||||
|
# === Fill missing refund_sequence ===
|
||||||
|
if 'refund_sequence' not in vals:
|
||||||
|
vals['refund_sequence'] = vals['type'] in ('sale', 'purchase')
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
from odoo import models, fields, api, _
|
||||||
|
|
||||||
|
|
||||||
|
class Base(models.AbstractModel):
|
||||||
|
_inherit = 'base'
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def search_panel_select_range(self, field_name, **kwargs):
|
||||||
|
kwargs.update({
|
||||||
|
'limit': 1000,
|
||||||
|
})
|
||||||
|
return super(Base, self).search_panel_select_range(field_name, **kwargs)
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# Expert Co. Ltd.
|
||||||
|
# Copyright (C) 2021 (<http://www.exp-sa.com/>).
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
from odoo import fields, models, api, _
|
||||||
|
|
||||||
|
|
||||||
|
class ResCompany(models.Model):
|
||||||
|
_inherit = 'res.company'
|
||||||
|
|
||||||
|
chart_account_length = fields.Integer(
|
||||||
|
string='Chart of accounts length'
|
||||||
|
)
|
||||||
|
chart_account_padding = fields.Integer(
|
||||||
|
string='Chart of accounts Padding'
|
||||||
|
)
|
||||||
|
useFiexedTree = fields.Boolean(
|
||||||
|
string='Use Fixed Length Chart of accounts'
|
||||||
|
)
|
||||||
|
automticAccountsCodes = fields.Boolean(
|
||||||
|
string='Automaticly Generate Accounts Codes'
|
||||||
|
)
|
||||||
|
parent_bank_cash_account_id = fields.Many2one('account.account')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def setting_chart_of_accounts_action(self):
|
||||||
|
""" Called by the 'Chart of Accounts' button of the setup bar."""
|
||||||
|
company = self.env.company
|
||||||
|
company.sudo().set_onboarding_step_done('account_setup_coa_state')
|
||||||
|
|
||||||
|
# If an opening move has already been posted, we open the tree view showing all the accounts
|
||||||
|
if company.opening_move_posted():
|
||||||
|
return 'account.action_account_form'
|
||||||
|
|
||||||
|
# Otherwise, we create the opening move
|
||||||
|
company.create_op_move_if_non_existant()
|
||||||
|
|
||||||
|
# Then, we open will open a custom tree view allowing to edit opening balances of the account
|
||||||
|
view_id = self.env.ref('account.init_accounts_tree').id
|
||||||
|
# Hide the current year earnings account as it is automatically computed
|
||||||
|
domain = [('user_type_id', 'not in', [self.env.ref('account.data_unaffected_earnings').id,
|
||||||
|
self.env.ref('account_chart_of_accounts.data_account_type_view').id]),
|
||||||
|
('company_id', '=', company.id)]
|
||||||
|
return {
|
||||||
|
'type': 'ir.actions.act_window',
|
||||||
|
'name': _('Chart of Accounts'),
|
||||||
|
'res_model': 'account.account',
|
||||||
|
'view_mode': 'tree',
|
||||||
|
'limit': 99999999,
|
||||||
|
'search_view_id': self.env.ref('account.view_account_search').id,
|
||||||
|
'views': [[view_id, 'list']],
|
||||||
|
'domain': domain,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class ResConfigSettings(models.TransientModel):
|
||||||
|
_inherit = 'res.config.settings'
|
||||||
|
|
||||||
|
chart_account_length = fields.Integer(
|
||||||
|
related='company_id.chart_account_length',
|
||||||
|
readonly=False
|
||||||
|
)
|
||||||
|
chart_account_padding = fields.Integer(
|
||||||
|
related='company_id.chart_account_padding',
|
||||||
|
readonly=False
|
||||||
|
)
|
||||||
|
useFiexedTree = fields.Boolean(
|
||||||
|
related='company_id.useFiexedTree',
|
||||||
|
readonly=False
|
||||||
|
)
|
||||||
|
automticAccountsCodes = fields.Boolean(
|
||||||
|
related='company_id.automticAccountsCodes',
|
||||||
|
readonly=False
|
||||||
|
)
|
||||||
|
bank_account_code_prefix = fields.Char(
|
||||||
|
string='Bank Prefix',
|
||||||
|
related='company_id.bank_account_code_prefix',
|
||||||
|
readonly=False
|
||||||
|
)
|
||||||
|
cash_account_code_prefix = fields.Char(
|
||||||
|
string='Cash Prefix',
|
||||||
|
related='company_id.cash_account_code_prefix',
|
||||||
|
readonly=False
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from . import account_report_coa
|
||||||
|
|
@ -0,0 +1,366 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import io
|
||||||
|
from copy import deepcopy
|
||||||
|
from collections import defaultdict
|
||||||
|
from odoo import models, fields, api, _
|
||||||
|
from odoo.tools.misc import xlsxwriter, formatLang
|
||||||
|
|
||||||
|
|
||||||
|
class AccountChartOfAccountReport(models.AbstractModel):
|
||||||
|
_inherit = "account.coa.report"
|
||||||
|
|
||||||
|
filter_full_hierarchy = True
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def format_value(self, amount, currency=False, blank_if_zero=False):
|
||||||
|
''' Format amount to have a monetary display (with a currency symbol).
|
||||||
|
E.g: 1000 => 1000.0 $
|
||||||
|
|
||||||
|
:param amount: A number.
|
||||||
|
:param currency: An optional res.currency record.
|
||||||
|
:param blank_if_zero: An optional flag forcing the string to be empty if amount is zero.
|
||||||
|
:return: The formatted amount as a string.
|
||||||
|
'''
|
||||||
|
currency_id = currency or self.env.company.currency_id
|
||||||
|
if currency_id.is_zero(amount):
|
||||||
|
amount = abs(amount)
|
||||||
|
|
||||||
|
if self.env.context.get('no_format'):
|
||||||
|
return amount
|
||||||
|
return formatLang(self.env, amount, currency_obj=currency_id)
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _init_filter_full_hierarchy(self, options, previous_options=None):
|
||||||
|
if previous_options and 'full_hierarchy' in previous_options:
|
||||||
|
options['full_hierarchy'] = previous_options['full_hierarchy']
|
||||||
|
else:
|
||||||
|
options['full_hierarchy'] = self.filter_full_hierarchy
|
||||||
|
|
||||||
|
# Create codes path in the hierarchy based on account.
|
||||||
|
def get_parent_account_codes(self, account):
|
||||||
|
# A code is tuple(id, name)
|
||||||
|
codes = []
|
||||||
|
if account.parent_id:
|
||||||
|
parent = account.parent_id
|
||||||
|
while parent:
|
||||||
|
codes.append((parent.id, '%s %s' % (parent.code, parent.name)))
|
||||||
|
parent = parent.parent_id
|
||||||
|
else:
|
||||||
|
codes.append((0, _('(No Parent)')))
|
||||||
|
return list(reversed(codes))
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _create_full_hierarchy(self, lines, options):
|
||||||
|
"""Compute the hierarchy based on account parents when the option is activated.
|
||||||
|
|
||||||
|
The option is available only when there are account.group for the company.
|
||||||
|
It should be called when before returning the lines to the client/templater.
|
||||||
|
The lines are the result of _get_lines(). If there is a hierarchy, it is left
|
||||||
|
untouched, only the lines related to an account.account are put in a hierarchy
|
||||||
|
according to the account.group's and their prefixes.
|
||||||
|
"""
|
||||||
|
unfold_all = self.env.context.get('print_mode') and len(options.get('unfolded_lines')) == 0 or options.get('unfold_all')
|
||||||
|
|
||||||
|
def add_to_hierarchy(lines, key, level, parent_id, hierarchy):
|
||||||
|
val_dict = hierarchy[key]
|
||||||
|
unfolded = val_dict['id'] in options.get('unfolded_lines') or unfold_all
|
||||||
|
# add the group totals
|
||||||
|
lines.append({
|
||||||
|
'id': val_dict['id'],
|
||||||
|
'name': val_dict['name'],
|
||||||
|
'title_hover': val_dict['name'],
|
||||||
|
'unfoldable': True,
|
||||||
|
'unfolded': unfolded,
|
||||||
|
'level': level,
|
||||||
|
'parent_id': parent_id,
|
||||||
|
'columns': [{'name': self.format_value(c) if isinstance(c, (int, float)) else c, 'no_format_name': c} for c in val_dict['totals']],
|
||||||
|
'name_class': 'o_account_report_name_ellipsis top-vertical-align'
|
||||||
|
})
|
||||||
|
if not self._context.get('print_mode') or unfolded:
|
||||||
|
# add every direct child group recursively
|
||||||
|
for child in val_dict['children_codes']:
|
||||||
|
add_to_hierarchy(lines, child, level + 1, val_dict['id'], hierarchy)
|
||||||
|
# add all the lines that are in this group but not in one of this group's children groups
|
||||||
|
for l in val_dict['lines']:
|
||||||
|
l['level'] = level + 1
|
||||||
|
l['parent_id'] = val_dict['id']
|
||||||
|
lines.extend(val_dict['lines'])
|
||||||
|
|
||||||
|
def compute_full_hierarchy(lines, level, parent_id):
|
||||||
|
# put every line in each of its parents (from less global to more global) and compute the totals
|
||||||
|
hierarchy = defaultdict(lambda: {'totals': [None] * len(lines[0]['columns']), 'lines': [], 'children_codes': set(), 'name': '', 'parent_id': None, 'id': ''})
|
||||||
|
for line in lines:
|
||||||
|
account = self.env['account.account'].browse(line.get('account_id', self._get_caret_option_target_id(line.get('id'))))
|
||||||
|
codes = self.get_parent_account_codes(account) # id, name
|
||||||
|
for code in codes:
|
||||||
|
hierarchy[code[0]]['id'] = 'hierarchy_' + str(code[0])
|
||||||
|
hierarchy[code[0]]['name'] = code[1]
|
||||||
|
for i, column in enumerate(line['columns']):
|
||||||
|
if 'no_format_name' in column:
|
||||||
|
no_format = column['no_format_name']
|
||||||
|
elif 'no_format' in column:
|
||||||
|
no_format = column['no_format']
|
||||||
|
else:
|
||||||
|
no_format = None
|
||||||
|
if isinstance(no_format, (int, float)):
|
||||||
|
if hierarchy[code[0]]['totals'][i] is None:
|
||||||
|
hierarchy[code[0]]['totals'][i] = no_format
|
||||||
|
else:
|
||||||
|
hierarchy[code[0]]['totals'][i] += no_format
|
||||||
|
for code, child in zip(codes[:-1], codes[1:]):
|
||||||
|
hierarchy[code[0]]['children_codes'].add(child[0])
|
||||||
|
hierarchy[child[0]]['parent_id'] = hierarchy[code[0]]['id']
|
||||||
|
hierarchy[codes[-1][0]]['lines'] += [line]
|
||||||
|
# compute the tree-like structure by starting at the roots (being account without parents)
|
||||||
|
hierarchy_lines = []
|
||||||
|
for root in [k for k, v in hierarchy.items() if not v['parent_id']]:
|
||||||
|
add_to_hierarchy(hierarchy_lines, root, level, parent_id, hierarchy)
|
||||||
|
return hierarchy_lines
|
||||||
|
|
||||||
|
new_lines = []
|
||||||
|
account_lines = []
|
||||||
|
current_level = 0
|
||||||
|
parent_id = 'root'
|
||||||
|
for line in lines:
|
||||||
|
if not (line.get('caret_options') == 'account.account' or line.get('account_id')):
|
||||||
|
# make the hierarchy with the lines we gathered, append it to the new lines and restart the gathering
|
||||||
|
if account_lines:
|
||||||
|
new_lines.extend(compute_full_hierarchy(account_lines, current_level + 1, parent_id))
|
||||||
|
account_lines = []
|
||||||
|
new_lines.append(line)
|
||||||
|
current_level = line['level']
|
||||||
|
parent_id = line['id']
|
||||||
|
else:
|
||||||
|
# gather all the lines we can create a hierarchy on
|
||||||
|
account_lines.append(line)
|
||||||
|
# do it one last time for the gathered lines remaining
|
||||||
|
if account_lines:
|
||||||
|
new_lines.extend(compute_full_hierarchy(account_lines, current_level + 1, parent_id))
|
||||||
|
return new_lines
|
||||||
|
|
||||||
|
|
||||||
|
def get_html(self, options, line_id=None, additional_context=None):
|
||||||
|
'''
|
||||||
|
return the html value of report, or html value of unfolded line
|
||||||
|
* if line_id is set, the template used will be the line_template
|
||||||
|
otherwise it uses the main_template. Reason is for efficiency, when unfolding a line in the report
|
||||||
|
we don't want to reload all lines, just get the one we unfolded.
|
||||||
|
'''
|
||||||
|
# Prevent inconsistency between options and context.
|
||||||
|
self = self.with_context(self._set_context(options))
|
||||||
|
|
||||||
|
templates = self._get_templates()
|
||||||
|
report_manager = self._get_report_manager(options)
|
||||||
|
|
||||||
|
render_values = {
|
||||||
|
'report': {
|
||||||
|
'name': self._get_report_name(),
|
||||||
|
'summary': report_manager.summary,
|
||||||
|
'company_name': self.env.company.name,
|
||||||
|
},
|
||||||
|
'options': options,
|
||||||
|
'context': self.env.context,
|
||||||
|
'model': self,
|
||||||
|
}
|
||||||
|
if additional_context:
|
||||||
|
render_values.update(additional_context)
|
||||||
|
|
||||||
|
# Create lines/headers.
|
||||||
|
if line_id:
|
||||||
|
headers = options['headers']
|
||||||
|
lines = self._get_lines(options, line_id=line_id)
|
||||||
|
template = templates['line_template']
|
||||||
|
else:
|
||||||
|
headers, lines = self._get_table(options)
|
||||||
|
options['headers'] = headers
|
||||||
|
template = templates['main_template']
|
||||||
|
if options.get('hierarchy'):
|
||||||
|
|
||||||
|
lines = self._create_hierarchy(lines, options)
|
||||||
|
if options.get('full_hierarchy'):
|
||||||
|
account_ids = [l['id'] for l in lines if type(l['id']) == int]
|
||||||
|
extended_accounts = self.env['account.account'].search([('id', 'not in', account_ids),
|
||||||
|
('child_ids','=', False)])
|
||||||
|
no_col = len(lines[0]['columns'])
|
||||||
|
|
||||||
|
for acc in extended_accounts:
|
||||||
|
name = '%s %s' % (acc.code, acc.name)
|
||||||
|
lines.insert(0,{
|
||||||
|
'id': acc.id,
|
||||||
|
'name': name,
|
||||||
|
'title_hover': name,
|
||||||
|
'columns': [ {'name': self.format_value(0), 'class': 'number', 'no_format_name': 0.0}] * no_col,
|
||||||
|
'unfoldable': False,
|
||||||
|
#'level': acc.level,
|
||||||
|
'caret_options': 'account.account',
|
||||||
|
'class': 'o_account_searchable_line o_account_coa_column_contrast'
|
||||||
|
})
|
||||||
|
|
||||||
|
lines = self._create_full_hierarchy(lines, options)
|
||||||
|
|
||||||
|
lines = sorted(lines, key=lambda i: i['name'].split()[0])
|
||||||
|
if options.get('selected_column'):
|
||||||
|
lines = self._sort_lines(lines, options)
|
||||||
|
render_values['lines'] = {'columns_header': headers, 'lines': lines}
|
||||||
|
|
||||||
|
# Manage footnotes.
|
||||||
|
footnotes_to_render = []
|
||||||
|
if self.env.context.get('print_mode', False):
|
||||||
|
# we are in print mode, so compute footnote number and include them in lines values, otherwise, let the js compute the number correctly as
|
||||||
|
# we don't know all the visible lines.
|
||||||
|
footnotes = dict([(str(f.line), f) for f in report_manager.footnotes_ids])
|
||||||
|
number = 0
|
||||||
|
for line in lines:
|
||||||
|
f = footnotes.get(str(line.get('id')))
|
||||||
|
if f:
|
||||||
|
number += 1
|
||||||
|
line['footnote'] = str(number)
|
||||||
|
footnotes_to_render.append({'id': f.id, 'number': number, 'text': f.text})
|
||||||
|
|
||||||
|
# Render.
|
||||||
|
html = self.env.ref(template)._render(render_values)
|
||||||
|
if self.env.context.get('print_mode', False):
|
||||||
|
for k,v in self._replace_class().items():
|
||||||
|
html = html.replace(k, v)
|
||||||
|
# append footnote as well
|
||||||
|
html = html.replace(b'<div class="js_account_report_footnotes"></div>', self.get_html_footnotes(footnotes_to_render))
|
||||||
|
return html
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _get_columns(self, options):
|
||||||
|
header1 = [
|
||||||
|
{'name': '', 'style': 'width:40%'},
|
||||||
|
{'name': _('Initial Balance'), 'class': 'number', 'colspan': 2},
|
||||||
|
] + [
|
||||||
|
{'name': period['string'], 'class': 'number', 'colspan': 2}
|
||||||
|
for period in reversed(options['comparison'].get('periods', []))
|
||||||
|
] + [
|
||||||
|
{'name': options['date']['string'], 'class': 'number', 'colspan': 2},
|
||||||
|
{'name': _('Total'), 'class': 'number', 'colspan': 2},
|
||||||
|
]
|
||||||
|
header2 = [
|
||||||
|
{'name': '', 'style': 'width:40%'},
|
||||||
|
{'name': _('Debit'), 'width': 15, 'class': 'number o_account_coa_column_contrast'},
|
||||||
|
{'name': _('Credit'), 'width': 15, 'class': 'number o_account_coa_column_contrast'},
|
||||||
|
]
|
||||||
|
if options.get('comparison') and options['comparison'].get('periods'):
|
||||||
|
header2 += [
|
||||||
|
{'name': _('Debit'), 'width': 15, 'class': 'number o_account_coa_column_contrast'},
|
||||||
|
{'name': _('Credit'), 'width': 15, 'class': 'number o_account_coa_column_contrast'},
|
||||||
|
] * len(options['comparison']['periods'])
|
||||||
|
header2 += [
|
||||||
|
{'name': _('Debit'), 'width': 15, 'class': 'number o_account_coa_column_contrast'},
|
||||||
|
{'name': _('Credit'), 'width': 15, 'class': 'number o_account_coa_column_contrast'},
|
||||||
|
{'name': _('Debit'), 'width': 15, 'class': 'number o_account_coa_column_contrast'},
|
||||||
|
{'name': _('Credit'), 'width': 15, 'class': 'number o_account_coa_column_contrast'},
|
||||||
|
]
|
||||||
|
return [header1, header2]
|
||||||
|
|
||||||
|
def get_xlsx(self, options, response=None):
|
||||||
|
output = io.BytesIO()
|
||||||
|
workbook = xlsxwriter.Workbook(output, {'in_memory': True})
|
||||||
|
sheet = workbook.add_worksheet(self._get_report_name()[:31])
|
||||||
|
|
||||||
|
date_default_col1_style = workbook.add_format({'font_name': 'Arial', 'font_size': 12, 'font_color': '#666666', 'indent': 2, 'num_format': 'yyyy-mm-dd'})
|
||||||
|
date_default_style = workbook.add_format({'font_name': 'Arial', 'font_size': 12, 'font_color': '#666666', 'num_format': 'yyyy-mm-dd'})
|
||||||
|
title_style = workbook.add_format({'font_name': 'Arial', 'bold': True, 'bottom': 2})
|
||||||
|
level_0_style = workbook.add_format({'font_name': 'Arial', 'bold': True, 'font_size': 13, 'bottom': 6, 'font_color': '#666666'})
|
||||||
|
level_1_style = workbook.add_format({'font_name': 'Arial', 'bold': True, 'font_size': 13, 'bottom': 1, 'font_color': '#666666'})
|
||||||
|
level_2_col1_style = workbook.add_format({'font_name': 'Arial', 'bold': True, 'font_size': 12, 'font_color': '#666666', 'indent': 1})
|
||||||
|
level_2_col1_total_style = workbook.add_format({'font_name': 'Arial', 'bold': True, 'font_size': 12, 'font_color': '#666666'})
|
||||||
|
level_2_style = workbook.add_format({'font_name': 'Arial', 'bold': True, 'font_size': 12, 'font_color': '#666666'})
|
||||||
|
level_3_col1_style = workbook.add_format({'font_name': 'Arial', 'bold': True, 'font_size': 12, 'font_color': '#666666', 'indent': 2})
|
||||||
|
level_3_col1_total_style = workbook.add_format({'font_name': 'Arial', 'bold': True, 'font_size': 12, 'font_color': '#666666', 'indent': 1})
|
||||||
|
level_3_style = workbook.add_format({'font_name': 'Arial', 'bold': True,'font_size': 12, 'font_color': '#666666'})
|
||||||
|
|
||||||
|
#Set the first column width to 50
|
||||||
|
sheet.set_column(0, 0, 50)
|
||||||
|
|
||||||
|
y_offset = 0
|
||||||
|
headers, lines = self._get_table(options)
|
||||||
|
|
||||||
|
# Add headers.
|
||||||
|
for header in headers:
|
||||||
|
x_offset = 0
|
||||||
|
for column in header:
|
||||||
|
column_name_formated = column.get('name', '').replace('<br/>', ' ').replace(' ', ' ')
|
||||||
|
colspan = column.get('colspan', 1)
|
||||||
|
if column.get('width'):
|
||||||
|
sheet.set_column(y_offset, x_offset, column.get('width'))
|
||||||
|
if colspan == 1:
|
||||||
|
sheet.write(y_offset, x_offset, column_name_formated, title_style)
|
||||||
|
else:
|
||||||
|
sheet.merge_range(y_offset, x_offset, y_offset, x_offset + colspan - 1, column_name_formated, title_style)
|
||||||
|
x_offset += colspan
|
||||||
|
y_offset += 1
|
||||||
|
|
||||||
|
if options.get('hierarchy'):
|
||||||
|
lines = self._create_hierarchy(lines, options)
|
||||||
|
if options.get('full_hierarchy'):
|
||||||
|
account_ids = [l['id'] for l in lines if type(l['id']) == int]
|
||||||
|
extended_accounts = self.env['account.account'].search(
|
||||||
|
[('id', 'not in', account_ids), ('child_ids', '=', False)])
|
||||||
|
no_col = len(lines[0]['columns'])
|
||||||
|
for acc in extended_accounts:
|
||||||
|
name = '%s %s' % (acc.code, acc.name)
|
||||||
|
lines.insert(0, {
|
||||||
|
'id': acc.id,
|
||||||
|
'name': name,
|
||||||
|
'title_hover': name,
|
||||||
|
'columns': [{'name': self.format_value(0), 'class': 'number', 'no_format_name': 0.0}] * no_col,
|
||||||
|
'unfoldable': False,
|
||||||
|
# 'level': acc.level,
|
||||||
|
'caret_options': 'account.account',
|
||||||
|
'class': 'o_account_searchable_line o_account_coa_column_contrast'
|
||||||
|
})
|
||||||
|
|
||||||
|
lines = self._create_full_hierarchy(lines, options)
|
||||||
|
lines = sorted(lines, key=lambda i: i['name'].split()[0])
|
||||||
|
if options.get('selected_column'):
|
||||||
|
lines = self._sort_lines(lines, options)
|
||||||
|
|
||||||
|
# Add lines.
|
||||||
|
for y in range(0, len(lines)):
|
||||||
|
level = lines[y].get('level')
|
||||||
|
if lines[y].get('caret_options'):
|
||||||
|
style = workbook.add_format({'font_name': 'Arial', 'font_size': 12, 'font_color': '#666666'})
|
||||||
|
col1_style = workbook.add_format({'font_name': 'Arial', 'font_size': 12, 'font_color': '#666666', 'indent': level - 1})
|
||||||
|
elif level == 0:
|
||||||
|
y_offset += 1
|
||||||
|
style = level_0_style
|
||||||
|
col1_style = style
|
||||||
|
elif level == 1:
|
||||||
|
style = level_1_style
|
||||||
|
col1_style = style
|
||||||
|
elif level == 2:
|
||||||
|
style = level_2_style
|
||||||
|
col1_style = 'total' in lines[y].get('class', '').split(' ') and level_2_col1_total_style or level_2_col1_style
|
||||||
|
elif level == 3:
|
||||||
|
style = level_3_style
|
||||||
|
col1_style = 'total' in lines[y].get('class', '').split(' ') and level_3_col1_total_style or level_3_col1_style
|
||||||
|
else:
|
||||||
|
style = workbook.add_format({'font_name': 'Arial', 'font_size': 12, 'font_color': '#666666', 'bold': True,})
|
||||||
|
col1_style = workbook.add_format({'font_name': 'Arial', 'font_size': 12, 'font_color': '#666666', 'bold': True,'indent': level - 1})
|
||||||
|
|
||||||
|
#write the first column, with a specific style to manage the indentation
|
||||||
|
cell_type, cell_value = self._get_cell_type_value(lines[y])
|
||||||
|
if cell_type == 'date':
|
||||||
|
sheet.write_datetime(y + y_offset, 0, cell_value, date_default_col1_style)
|
||||||
|
else:
|
||||||
|
sheet.write(y + y_offset, 0, cell_value, col1_style)
|
||||||
|
|
||||||
|
#write all the remaining cells
|
||||||
|
for x in range(1, len(lines[y]['columns']) + 1):
|
||||||
|
cell_type, cell_value = self._get_cell_type_value(lines[y]['columns'][x - 1])
|
||||||
|
if cell_type == 'date':
|
||||||
|
sheet.write_datetime(y + y_offset, x + lines[y].get('colspan', 1) - 1, cell_value, date_default_style)
|
||||||
|
else:
|
||||||
|
sheet.write(y + y_offset, x + lines[y].get('colspan', 1) - 1, cell_value, style)
|
||||||
|
|
||||||
|
workbook.close()
|
||||||
|
output.seek(0)
|
||||||
|
generated_file = output.read()
|
||||||
|
output.close()
|
||||||
|
|
||||||
|
return generated_file
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<data>
|
||||||
|
<template id="search_template_extra_options" inherit_id="odex25_account_reports.search_template_extra_options">
|
||||||
|
<div class="dropdown-menu o_filter_menu" position="inside">
|
||||||
|
<a role="menuitem" class="dropdown-item js_account_report_bool_filter"
|
||||||
|
t-if="options.get('full_hierarchy') != None" title="Full Hierarchy" data-filter="full_hierarchy">
|
||||||
|
Show Full Hierarchy
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</data>
|
||||||
|
</odoo>
|
||||||
|
|
@ -0,0 +1,40 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<data noupdate="0">
|
||||||
|
<record model="ir.module.category" id="control_accounts_category">
|
||||||
|
<field name="name">Control Chart of Account</field>
|
||||||
|
<field name="description">Control chart of account.</field>
|
||||||
|
</record>
|
||||||
|
<record id="group_chart_of_account_readony" model="res.groups">
|
||||||
|
<field name="name">Readonly</field>
|
||||||
|
<field name="category_id" ref="control_accounts_category"/>
|
||||||
|
<field name="menu_access" eval="[(4, ref('odex25_account_accountant.menu_accounting'))]"/>
|
||||||
|
</record>
|
||||||
|
<record id="group_chart_of_account_full" model="res.groups">
|
||||||
|
<field name="name">Full Control</field>
|
||||||
|
<field name="category_id" ref="control_accounts_category"/>
|
||||||
|
</record>
|
||||||
|
<record id="group_chart_of_account_deprecated" model="res.groups">
|
||||||
|
<field name="name">Deprecated</field>
|
||||||
|
<field name="category_id" ref="control_accounts_category"/>
|
||||||
|
</record>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
<data noupdate="1">
|
||||||
|
<record id="account_readonly_comp_rule" model="ir.rule">
|
||||||
|
<field name="name">Account Readonly multi-company</field>
|
||||||
|
<field name="model_id" ref="model_account_account"/>
|
||||||
|
<field name="domain_force">['|',('company_id','=',False),('company_id', 'in', company_ids)]</field>
|
||||||
|
</record>
|
||||||
|
<record id="account_full_comp_rule" model="ir.rule">
|
||||||
|
<field name="name">Account Full Control multi-company</field>
|
||||||
|
<field name="model_id" ref="model_account_account"/>
|
||||||
|
<field name="domain_force">['|',('company_id','=',False),('company_id', 'in', company_ids)]</field>
|
||||||
|
</record>
|
||||||
|
<record id="account_deprecated_comp_rule" model="ir.rule">
|
||||||
|
<field name="name">Account Deprecated multi-company</field>
|
||||||
|
<field name="model_id" ref="model_account_account"/>
|
||||||
|
<field name="domain_force">['|',('company_id','=',False),('company_id', 'in', company_ids)]</field>
|
||||||
|
</record>
|
||||||
|
</data>
|
||||||
|
</odoo>
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||||
|
access_account_account_readonly,account.account.readonly,model_account_account,group_chart_of_account_readony,1,0,0,0
|
||||||
|
access_account_account_full,account.account.full,model_account_account,group_chart_of_account_full,1,1,1,1
|
||||||
|
access_account_account_deprecated,account.account.deprecated,model_account_account,group_chart_of_account_deprecated,1,1,0,0
|
||||||
|
|
After Width: | Height: | Size: 32 KiB |
|
|
@ -0,0 +1,30 @@
|
||||||
|
.o_search_panel.account_root {
|
||||||
|
flex: 0 0 250px;
|
||||||
|
padding: 6px;
|
||||||
|
scrollbar-width: thin;
|
||||||
|
.o_search_panel_section_header {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.list-group-item span.o_search_panel_label_title {
|
||||||
|
display: contents;
|
||||||
|
}
|
||||||
|
.o_search_panel_category_value {
|
||||||
|
header {
|
||||||
|
margin-left: 0;
|
||||||
|
padding-left: 0;
|
||||||
|
}
|
||||||
|
.o_search_panel_category_value .o_toggle_fold {
|
||||||
|
width: 0.3rem;
|
||||||
|
margin-right: 3px !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.o_search_panel_label {
|
||||||
|
justify-content: normal !important;
|
||||||
|
}
|
||||||
|
&::-webkit-scrollbar {
|
||||||
|
width: 4px;
|
||||||
|
}
|
||||||
|
&::-webkit-scrollbar-thumb {
|
||||||
|
background: lightgray;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,75 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<data>
|
||||||
|
<record id="view_account_form" model="ir.ui.view">
|
||||||
|
<field name="name">account.account.form</field>
|
||||||
|
<field name="model">account.account</field>
|
||||||
|
<field name="inherit_id" ref="account.view_account_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<field name="user_type_id" position="after">
|
||||||
|
<field name="parent_id" context="{'show_view':True}"/>
|
||||||
|
<field name="level" required="1" readonly="0"/>
|
||||||
|
<field name="automticAccountsCodes" invisible="1"/>
|
||||||
|
<field name="auto_code" invisible="1"/>
|
||||||
|
</field>
|
||||||
|
<field name="deprecated" position="attributes">
|
||||||
|
<attribute name="groups">account_chart_of_accounts.group_chart_of_account_deprecated</attribute>
|
||||||
|
</field>
|
||||||
|
<div class="oe_inline oe_edit_only" position="replace">
|
||||||
|
<h1 class="oe_inline oe_edit_only">
|
||||||
|
<field name="code" placeholder="code" force_save="1"
|
||||||
|
attrs="{'readonly':[('automticAccountsCodes','=',True)]}"/> -
|
||||||
|
<field name="name" placeholder="name"/>
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="view_account_list" model="ir.ui.view">
|
||||||
|
<field name="name">account.account.list</field>
|
||||||
|
<field name="model">account.account</field>
|
||||||
|
<field name="inherit_id" ref="account.view_account_list"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
|
||||||
|
<xpath expr="//tree" position="attributes">
|
||||||
|
<attribute name="decoration-bf">internal_type=='view'</attribute>
|
||||||
|
</xpath>
|
||||||
|
<field name="code" position="before">
|
||||||
|
<field name="automticAccountsCodes" invisible="1"/>
|
||||||
|
<field name="auto_code" invisible="1"/>
|
||||||
|
</field>
|
||||||
|
<xpath expr="//field[@name='code']" position="attributes">
|
||||||
|
<attribute name="attrs">{'readonly':[('automticAccountsCodes','=',True)]}</attribute>
|
||||||
|
<attribute name="force_save">1</attribute>
|
||||||
|
</xpath>
|
||||||
|
<field name="user_type_id" position="after">
|
||||||
|
<field name="parent_id" context="{'show_view':True}"/>
|
||||||
|
<field name="level"/>
|
||||||
|
</field>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="view_account_search" model="ir.ui.view">
|
||||||
|
<field name="name">account.account.search</field>
|
||||||
|
<field name="model">account.account</field>
|
||||||
|
<field name="inherit_id" ref="account.view_account_search"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<field name="name" position="after">
|
||||||
|
<field name="user_type_id"/>
|
||||||
|
<field name="level"/>
|
||||||
|
</field>
|
||||||
|
<field name="root_id" position="replace">
|
||||||
|
<field name="parent_id" string="Hierarchical Chart" icon="fa-filter"/>
|
||||||
|
</field>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
|
||||||
|
<template id="assets_backend" name="account assets" inherit_id="web.assets_backend">
|
||||||
|
<xpath expr="." position="inside">
|
||||||
|
<link rel="stylesheet" type="text/scss"
|
||||||
|
href="/account_chart_of_accounts/static/src/scss/account_searchpanel.scss"/>
|
||||||
|
</xpath>
|
||||||
|
</template>
|
||||||
|
</data>
|
||||||
|
</odoo>
|
||||||
|
|
@ -0,0 +1,74 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<record id="res_config_settings_view_form" model="ir.ui.view">
|
||||||
|
<field name="name">res.config.settings.view.form.inherit.account_chart_of_accounts</field>
|
||||||
|
<field name="model">res.config.settings</field>
|
||||||
|
<field name="inherit_id" ref="account.res_config_settings_view_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//field[@name='has_chart_of_accounts']" position="after">
|
||||||
|
<h2>Chart of Account</h2>
|
||||||
|
<div class="row mt16 o_settings_container" name="main_chart_of_account_setting_container">
|
||||||
|
<div class="col-12 col-lg-6 o_setting_box" id="chart_length">
|
||||||
|
<div class="o_setting_left_pane">
|
||||||
|
<field name="useFiexedTree"/>
|
||||||
|
</div>
|
||||||
|
<div class="o_setting_right_pane">
|
||||||
|
<label string="Fixed Length" for="useFiexedTree"/>
|
||||||
|
<div class="text-muted">
|
||||||
|
Use Fixed Length Chart of accounts
|
||||||
|
</div>
|
||||||
|
<div class="content-group" attrs="{'invisible': [('useFiexedTree', '=', False)]}">
|
||||||
|
<div class="row mt8">
|
||||||
|
<label string="Length" for="chart_account_length"
|
||||||
|
class="col-lg-3 o_light_label"/>
|
||||||
|
<field name="chart_account_length"
|
||||||
|
attrs="{'required':[('useFiexedTree','=',True)]}"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="o_setting_left_pane">
|
||||||
|
<field name="automticAccountsCodes"/>
|
||||||
|
</div>
|
||||||
|
<div class="o_setting_right_pane">
|
||||||
|
<label string="Auto Coding" for="automticAccountsCodes"/>
|
||||||
|
<div class="text-muted">
|
||||||
|
Automaticly Generate Accounts Codes
|
||||||
|
</div>
|
||||||
|
<div class="content-group" attrs="{'invisible': [('automticAccountsCodes', '=', False)]}">
|
||||||
|
<div class="row mt8">
|
||||||
|
<label string="Padding" for="chart_account_padding"
|
||||||
|
class="col-lg-3 o_light_label"/>
|
||||||
|
<field name="chart_account_padding"
|
||||||
|
attrs="{'required':[('automticAccountsCodes','=',True)]}"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-12 col-lg-6 o_setting_box" id="chart_autocodes">
|
||||||
|
<div class="o_setting_left_pane" modifiers="{}"/>
|
||||||
|
<div class="o_setting_right_pane" modifiers="{}">
|
||||||
|
<span class="o_form_label" modifiers="{}">
|
||||||
|
Prefix of bank & cash accounts
|
||||||
|
</span>
|
||||||
|
<span class="fa fa-lg fa-building-o" title="Values set here are company-specific." aria-label="Values set here are company-specific." role="img" invisible="1" modifiers="{'invisible':true}"/>
|
||||||
|
<div class="text-muted" modifiers="{}">
|
||||||
|
Default Prefix for Bank & Cash Accounts
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="content-group" modifiers="{}">
|
||||||
|
<div class="row mt16" modifiers="{}">
|
||||||
|
<label for="bank_account_code_prefix" class="col-lg-3 o_light_label"/>
|
||||||
|
<field name="bank_account_code_prefix"/>
|
||||||
|
</div>
|
||||||
|
<div class="row mt16" modifiers="{}">
|
||||||
|
<label for="cash_account_code_prefix" class="col-lg-3 o_light_label"/>
|
||||||
|
<field name="cash_account_code_prefix"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from . import models
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
{
|
||||||
|
'name': "Account Configuration",
|
||||||
|
|
||||||
|
'summary': """
|
||||||
|
""",
|
||||||
|
'description': """
|
||||||
|
""",
|
||||||
|
'author': "Expert Co. Ltd.",
|
||||||
|
'website': "http://www.exp-sa.com",
|
||||||
|
'category': 'Odex25-Accounting/Odex25-Accounting',
|
||||||
|
'version': '1.0',
|
||||||
|
'depends': ['account', 'purchase'],
|
||||||
|
'data': [
|
||||||
|
'views/res_config_settings_views.xml',
|
||||||
|
],
|
||||||
|
'auto_install': True,
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,101 @@
|
||||||
|
# Translation of Odoo Server.
|
||||||
|
# This file contains the translation of the following modules:
|
||||||
|
# * account_configuration
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: Odoo Server 14.0\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2022-07-28 13:49+0000\n"
|
||||||
|
"PO-Revision-Date: 2022-07-28 13:49+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_configuration
|
||||||
|
#: model:ir.model.fields,field_description:account_configuration.field_res_config_settings__module_odex25_account_invoice_extract
|
||||||
|
msgid "Bill Digitalization"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_configuration
|
||||||
|
#: model:ir.model.fields,field_description:account_configuration.field_res_config_settings__module_odex25_account_budget
|
||||||
|
msgid "Budget Management"
|
||||||
|
msgstr "إدارة الموازنات"
|
||||||
|
|
||||||
|
#. module: account_configuration
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_configuration.res_config_settings_view_form
|
||||||
|
msgid "Check budget of Vendor Bill"
|
||||||
|
msgstr "فحص الموازنات للموردين"
|
||||||
|
|
||||||
|
#. module: account_configuration
|
||||||
|
#: model:ir.model,name:account_configuration.model_res_config_settings
|
||||||
|
msgid "Config Settings"
|
||||||
|
msgstr "ضبط الاعدادات"
|
||||||
|
|
||||||
|
#. module: account_configuration
|
||||||
|
#: model:ir.model.fields,field_description:account_configuration.field_res_config_settings__display_name
|
||||||
|
msgid "Display Name"
|
||||||
|
msgstr "الاسم المعروض"
|
||||||
|
|
||||||
|
#. module: account_configuration
|
||||||
|
#: model:ir.model.fields,field_description:account_configuration.field_res_config_settings__module_odex25_account_reports
|
||||||
|
msgid "Dynamic Reports"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_configuration
|
||||||
|
#: model:ir.model.fields,field_description:account_configuration.field_res_config_settings__id
|
||||||
|
msgid "ID"
|
||||||
|
msgstr "المُعرف"
|
||||||
|
|
||||||
|
#. module: account_configuration
|
||||||
|
#: model:ir.model.fields,field_description:account_configuration.field_res_config_settings__module_odex25_account_bank_statement_import_qif
|
||||||
|
msgid "Import .qif files"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_configuration
|
||||||
|
#: model:ir.model.fields,field_description:account_configuration.field_res_config_settings__module_odex25_account_bank_statement_import_csv
|
||||||
|
msgid "Import in .csv format"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_configuration
|
||||||
|
#: model:ir.model.fields,field_description:account_configuration.field_res_config_settings__module_odex25_account_bank_statement_import_ofx
|
||||||
|
msgid "Import in .ofx format"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_configuration
|
||||||
|
#: model:ir.model.fields,field_description:account_configuration.field_res_config_settings__module_odex25_account_bank_statement_import_camt
|
||||||
|
msgid "Import in CAMT.053 format"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_configuration
|
||||||
|
#: model:ir.model.fields,field_description:account_configuration.field_res_config_settings____last_update
|
||||||
|
msgid "Last Modified on"
|
||||||
|
msgstr "آخر تعديل في"
|
||||||
|
|
||||||
|
#. module: account_configuration
|
||||||
|
#: model:ir.model.fields,field_description:account_configuration.field_res_config_settings__module_odex25_account_accountant
|
||||||
|
msgid "Odex25 Accounting"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_configuration
|
||||||
|
#: model:ir.model.fields,help:account_configuration.field_res_config_settings__module_odex25_account_batch_payment
|
||||||
|
msgid ""
|
||||||
|
"This allows you grouping payments into a single batch and eases the reconciliation process.\n"
|
||||||
|
"-This installs the account_batch_payment module."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_configuration
|
||||||
|
#: model:ir.model.fields,field_description:account_configuration.field_res_config_settings__module_odex25_account_batch_payment
|
||||||
|
msgid "Use batch payments"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: account_configuration
|
||||||
|
#: model:ir.model.fields,field_description:account_configuration.field_res_config_settings__module_exp_budget_check
|
||||||
|
#: model_terms:ir.ui.view,arch_db:account_configuration.res_config_settings_view_form
|
||||||
|
msgid "Vendor Bill Budget"
|
||||||
|
msgstr "فحص الموازنات للموردين"
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from . import res_config_settings
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from odoo import api, fields, models, _
|
||||||
|
|
||||||
|
|
||||||
|
class ResConfigSettings(models.TransientModel):
|
||||||
|
_inherit = 'res.config.settings'
|
||||||
|
|
||||||
|
module_odex25_account_accountant = fields.Boolean(string='Accounting')
|
||||||
|
module_odex25_account_budget = fields.Boolean(string='Budget Management')
|
||||||
|
module_odex25_account_reports = fields.Boolean("Dynamic Reports")
|
||||||
|
module_odex25_account_batch_payment = fields.Boolean(string='Use batch payments',
|
||||||
|
help='This allows you grouping payments into a single batch and eases the reconciliation process.\n'
|
||||||
|
'-This installs the account_batch_payment module.')
|
||||||
|
module_odex25_account_bank_statement_import_qif = fields.Boolean("Import .qif files")
|
||||||
|
module_odex25_account_bank_statement_import_ofx = fields.Boolean("Import in .ofx format")
|
||||||
|
module_odex25_account_bank_statement_import_csv = fields.Boolean("Import in .csv format")
|
||||||
|
module_odex25_account_bank_statement_import_camt = fields.Boolean("Import in CAMT.053 format")
|
||||||
|
module_odex25_account_invoice_extract = fields.Boolean(string="Bill Digitalization")
|
||||||
|
module_exp_budget_check = fields.Boolean(string='Vendor Bill Budget')
|
||||||
|
module_odex25_account_3way_match = fields.Boolean(string="3-way matching: purchases, receptions and bills")
|
||||||
|
|
||||||
|
@api.onchange('module_odex25_account_budget')
|
||||||
|
def onchange_module_account_budget(self):
|
||||||
|
if self.module_account_budget:
|
||||||
|
self.group_analytic_accounting = True
|
||||||
|
After Width: | Height: | Size: 32 KiB |
|
|
@ -0,0 +1,111 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<record id="res_config_settings_view_form" model="ir.ui.view">
|
||||||
|
<field name="name">res.config.settings.view.form.inherit.account</field>
|
||||||
|
<field name="model">res.config.settings</field>
|
||||||
|
<field name="priority" eval="40"/>
|
||||||
|
<field name="inherit_id" ref="account.res_config_settings_view_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
|
||||||
|
<field name="module_account_budget" position="replace">
|
||||||
|
<field name="module_odex25_account_budget" widget="upgrade_boolean"/>
|
||||||
|
</field>
|
||||||
|
<label for="module_account_budget" position="replace">
|
||||||
|
<label for="module_odex25_account_budget"/>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<field name="module_account_reports" position="replace">
|
||||||
|
<field name="module_odex25_account_reports" widget="upgrade_boolean"/>
|
||||||
|
</field>
|
||||||
|
<label for="module_account_reports" position="replace">
|
||||||
|
<label for="module_odex25_account_reports"/>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<field name="module_account_batch_payment" position="replace">
|
||||||
|
<field name="module_odex25_account_batch_payment" widget="upgrade_boolean"/>
|
||||||
|
</field>
|
||||||
|
<label for="module_account_batch_payment" position="replace">
|
||||||
|
<label for="module_odex25_account_batch_payment"/>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<field name="module_account_bank_statement_import_qif" position="replace">
|
||||||
|
<field name="module_odex25_account_bank_statement_import_qif" widget="upgrade_boolean"/>
|
||||||
|
</field>
|
||||||
|
<label for="module_account_bank_statement_import_qif" position="replace">
|
||||||
|
<label for="module_odex25_account_bank_statement_import_qif"/>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<field name="module_account_bank_statement_import_ofx" position="replace">
|
||||||
|
<field name="module_odex25_account_bank_statement_import_ofx" widget="upgrade_boolean"/>
|
||||||
|
</field>
|
||||||
|
<label for="module_account_bank_statement_import_ofx" position="replace">
|
||||||
|
<label for="module_odex25_account_bank_statement_import_ofx"/>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<field name="module_account_bank_statement_import_csv" position="replace">
|
||||||
|
<field name="module_odex25_account_bank_statement_import_csv" widget="upgrade_boolean"/>
|
||||||
|
</field>
|
||||||
|
<label for="module_account_bank_statement_import_csv" position="replace">
|
||||||
|
<label for="module_odex25_account_bank_statement_import_csv"/>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<field name="module_account_bank_statement_import_camt" position="replace">
|
||||||
|
<field name="module_odex25_account_bank_statement_import_camt" widget="upgrade_boolean"/>
|
||||||
|
</field>
|
||||||
|
<label for="module_account_bank_statement_import_camt" position="replace">
|
||||||
|
<label for="module_odex25_account_bank_statement_import_camt"/>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<field name="module_account_invoice_extract" position="replace">
|
||||||
|
<field name="module_odex25_account_invoice_extract" widget="upgrade_boolean"/>
|
||||||
|
</field>
|
||||||
|
<label for="module_account_invoice_extract" position="replace">
|
||||||
|
<label for="module_odex25_account_invoice_extract"/>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<div id="msg_invoice_extract" position="replace"/>
|
||||||
|
|
||||||
|
<div id="monitor_product_margins" position="after">
|
||||||
|
<div class="col-12 col-lg-6 o_setting_box" id="exp_budget_check">
|
||||||
|
<div class="o_setting_left_pane">
|
||||||
|
<field name="module_exp_budget_check" widget="upgrade_boolean"/>
|
||||||
|
</div>
|
||||||
|
<div class="o_setting_right_pane">
|
||||||
|
<label for="module_exp_budget_check" string="Vendor Bill Budget"/>
|
||||||
|
<div class="text-muted">
|
||||||
|
Check budget of Vendor Bill
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
<record id="purchase_custom_setting" model="ir.ui.view">
|
||||||
|
<field name="name">purchase.custom.setting</field>
|
||||||
|
<field name="model">res.config.settings</field>
|
||||||
|
<field name="inherit_id" ref="purchase.res_config_settings_view_form_purchase"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//div[@id='three_way_matching']" position="replace">
|
||||||
|
<div class="col-12 col-lg-6 o_setting_box"
|
||||||
|
id="three_way_matching"
|
||||||
|
title="If enabled, activates 3-way matching on vendor bills : the items must be received in order to pay the invoice.">
|
||||||
|
<div class="o_setting_left_pane">
|
||||||
|
<field name="module_odex25_account_3way_match" string="3-way matching"
|
||||||
|
widget="upgrade_boolean"/>
|
||||||
|
</div>
|
||||||
|
<div class="o_setting_right_pane">
|
||||||
|
<label for="module_odex25_account_3way_match"/>
|
||||||
|
<a href="https://www.odoo.com/documentation/14.0/applications/inventory_and_mrp/purchase/manage_deals/control_bills.html"
|
||||||
|
title="Documentation" class="o_doc_link" target="_blank"></a>
|
||||||
|
<div class="text-muted">
|
||||||
|
Make sure you only pay bills for which you received the goods you ordered
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
||||||
|
|
@ -0,0 +1,161 @@
|
||||||
|
=========================
|
||||||
|
Account Financial Reports
|
||||||
|
=========================
|
||||||
|
|
||||||
|
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
!! 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--reporting-lightgray.png?logo=github
|
||||||
|
:target: https://github.com/OCA/account-financial-reporting/tree/14.0/account_financial_report
|
||||||
|
:alt: OCA/account-financial-reporting
|
||||||
|
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
|
||||||
|
:target: https://translation.odoo-community.org/projects/account-financial-reporting-14-0/account-financial-reporting-14-0-account_financial_report
|
||||||
|
:alt: Translate me on Weblate
|
||||||
|
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
|
||||||
|
:target: https://runbot.odoo-community.org/runbot/91/14.0
|
||||||
|
:alt: Try me on Runbot
|
||||||
|
|
||||||
|
|badge1| |badge2| |badge3| |badge4| |badge5|
|
||||||
|
|
||||||
|
This module adds a set of financial reports. They are accessible under
|
||||||
|
Invoicing / Reporting / OCA accounting reports.
|
||||||
|
|
||||||
|
- General ledger
|
||||||
|
- Trial Balance
|
||||||
|
- Open Items
|
||||||
|
- Aged Partner Balance
|
||||||
|
- VAT Report
|
||||||
|
- Journal Ledger
|
||||||
|
|
||||||
|
Currently General ledger, Trial Balance and Open Items are fully compatible with a foreign
|
||||||
|
currency set up in account in order to display balances. Moreover, any foreign
|
||||||
|
currency used in account move lines is properly shown.
|
||||||
|
|
||||||
|
In case that in an account has not been configured a second currency foreign
|
||||||
|
currency balances are not available.
|
||||||
|
|
||||||
|
**Table of contents**
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:local:
|
||||||
|
|
||||||
|
Known issues / Roadmap
|
||||||
|
======================
|
||||||
|
|
||||||
|
* 'VAT Report' is valid only for cases where it's met that for each
|
||||||
|
Tax defined: all the "Account tags" of all the
|
||||||
|
'Repartition for Invoices' or 'Repartition for Credit Notes'
|
||||||
|
are different.
|
||||||
|
* It would be nice to have in reports a column indicating the
|
||||||
|
state of the entries when the option "All Entries" is selected
|
||||||
|
in "Target Moves" field in a wizard
|
||||||
|
|
||||||
|
Changelog
|
||||||
|
=========
|
||||||
|
|
||||||
|
11.0.2.5.0 (2019-04-26)
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
* In the Trial Balance you have an option to hide parent hierarchy levels
|
||||||
|
|
||||||
|
11.0.2.4.1 (2019-01-08)
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
* Handle better multicompany behaviour
|
||||||
|
* Improve how title appears in the reports
|
||||||
|
* Improve performance in General Ledger
|
||||||
|
|
||||||
|
|
||||||
|
11.0.2.3.1 (2018-11-29)
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
* In the Trial Balance you can apply a filter by hierarchy levels
|
||||||
|
* In the General Ledger you can apply a filter by Analytic Tag
|
||||||
|
* In the Journal Ledger the field 'Journal' is now optional
|
||||||
|
|
||||||
|
Bug Tracker
|
||||||
|
===========
|
||||||
|
|
||||||
|
Bugs are tracked on `GitHub Issues <https://github.com/OCA/account-financial-reporting/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-reporting/issues/new?body=module:%20account_financial_report%0Aversion:%2014.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
|
||||||
|
~~~~~~~
|
||||||
|
|
||||||
|
* Camptocamp SA
|
||||||
|
* initOS GmbH
|
||||||
|
* redCOR AG
|
||||||
|
* ForgeFlow
|
||||||
|
|
||||||
|
Contributors
|
||||||
|
~~~~~~~~~~~~
|
||||||
|
|
||||||
|
* Jordi Ballester <jordi.ballester@forgeflow.com>
|
||||||
|
* Yannick Vaucher <yannick.vaucher@camptocamp.com>
|
||||||
|
* Simone Orsi <simone.orsi@abstract.com>
|
||||||
|
* Leonardo Pistone <leonardo.pistone@camptocamp.com>
|
||||||
|
* Damien Crier <damien.crier@camptocamp.com>
|
||||||
|
* Andrea Stirpe <a.stirpe@onestein.nl>
|
||||||
|
* Thomas Rehn <thomas.rehn@initos.com>
|
||||||
|
* Andrea Gallina <4everamd@gmail.com>
|
||||||
|
* Robert Rottermann <robert@redcor.ch>
|
||||||
|
* Ciro Urselli <c.urselli@apuliasoftware.it>
|
||||||
|
* Francesco Apruzzese <opencode@e-ware.org>
|
||||||
|
* Lorenzo Battistini <https://github.com/eLBati>
|
||||||
|
* Julien Coux <julien.coux@camptocamp.com>
|
||||||
|
* Akim Juillerat <akim.juillerat@camptocamp.com>
|
||||||
|
* Alexis de Lattre <alexis@via.ecp.fr>
|
||||||
|
* Mihai Fekete <feketemihai@gmail.com>
|
||||||
|
* Miquel Raïch <miquel.raich@forgeflow.com>
|
||||||
|
* Joan Sisquella <joan.sisquella@forgeflow.com>
|
||||||
|
* `Tecnativa <https://www.tecnativa.com>`__:
|
||||||
|
|
||||||
|
* Pedro M. Baeza
|
||||||
|
* Sergio Teruel
|
||||||
|
* Ernesto Tejeda
|
||||||
|
* João Marques
|
||||||
|
* Alexandre D. Díaz
|
||||||
|
|
||||||
|
* `Sygel <https://www.sygel.es>`__:
|
||||||
|
|
||||||
|
* Harald Panten
|
||||||
|
* Valentin Vinagre
|
||||||
|
|
||||||
|
* Lois Rilo <lois.rilo@forgeflow.com>
|
||||||
|
* Saran Lim. <saranl@ecosoft.co.th>
|
||||||
|
* Omar Castiñeira <omar@comunitea.com>
|
||||||
|
|
||||||
|
Much of the work in this module was done at a sprint in Sorrento, Italy in
|
||||||
|
April 2016.
|
||||||
|
|
||||||
|
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-reporting <https://github.com/OCA/account-financial-reporting/tree/14.0/account_financial_report>`_ project on GitHub.
|
||||||
|
|
||||||
|
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
# Author: Damien Crier
|
||||||
|
# Copyright 2016 Camptocamp SA
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
||||||
|
|
||||||
|
from . import models
|
||||||
|
from . import report
|
||||||
|
from . import wizard
|
||||||
|
|
@ -0,0 +1,52 @@
|
||||||
|
# Author: Damien Crier
|
||||||
|
# Author: Julien Coux
|
||||||
|
# Copyright 2016 Camptocamp SA
|
||||||
|
# Copyright 2020 ForgeFlow S.L. (https://www.forgeflow.com)
|
||||||
|
# Copyright 2021 Tecnativa - João Marques
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
||||||
|
{
|
||||||
|
"name": "Account Financial Reports",
|
||||||
|
"version": "14.0.2.2.1",
|
||||||
|
'category': 'Odex25-Accounting/Odex25-Accounting',
|
||||||
|
"summary": "OCA Financial Reports",
|
||||||
|
"author": "Camptocamp SA,"
|
||||||
|
"initOS GmbH,"
|
||||||
|
"redCOR AG,"
|
||||||
|
"ForgeFlow,"
|
||||||
|
"Odoo Community Association (OCA)",
|
||||||
|
"website": "https://github.com/OCA/account-financial-reporting",
|
||||||
|
"depends": ["account", "date_range",
|
||||||
|
"report_xlsx",
|
||||||
|
"account_chart_of_accounts", "send_report_by_email", "odex25_account_budget"],
|
||||||
|
"data": [
|
||||||
|
"security/ir.model.access.csv",
|
||||||
|
"wizard/aged_partner_balance_wizard_view.xml",
|
||||||
|
"wizard/general_ledger_wizard_view.xml",
|
||||||
|
"wizard/journal_ledger_wizard_view.xml",
|
||||||
|
"wizard/open_items_wizard_view.xml",
|
||||||
|
"wizard/trial_balance_wizard_view.xml",
|
||||||
|
"wizard/vat_report_wizard_view.xml",
|
||||||
|
"menuitems.xml",
|
||||||
|
"reports.xml",
|
||||||
|
"report/templates/layouts.xml",
|
||||||
|
"report/templates/aged_partner_balance.xml",
|
||||||
|
"report/templates/general_ledger.xml",
|
||||||
|
"report/templates/journal_ledger.xml",
|
||||||
|
"report/templates/open_items.xml",
|
||||||
|
"report/templates/trial_balance.xml",
|
||||||
|
"report/templates/vat_report.xml",
|
||||||
|
"view/account_view.xml",
|
||||||
|
"view/report_template.xml",
|
||||||
|
"view/report_general_ledger.xml",
|
||||||
|
"view/report_journal_ledger.xml",
|
||||||
|
"view/report_trial_balance.xml",
|
||||||
|
"view/report_open_items.xml",
|
||||||
|
"view/report_aged_partner_balance.xml",
|
||||||
|
"view/report_vat_report.xml",
|
||||||
|
],
|
||||||
|
"qweb": ["static/src/xml/report.xml"],
|
||||||
|
"installable": True,
|
||||||
|
"application": True,
|
||||||
|
"auto_install": False,
|
||||||
|
"license": "AGPL-3",
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,45 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<odoo>
|
||||||
|
<menuitem
|
||||||
|
parent="account.menu_finance_reports"
|
||||||
|
id="menu_oca_reports"
|
||||||
|
name="OCA accounting reports"
|
||||||
|
groups="account.group_account_manager,account.group_account_user"
|
||||||
|
/>
|
||||||
|
<menuitem
|
||||||
|
parent="menu_oca_reports"
|
||||||
|
action="action_general_ledger_wizard"
|
||||||
|
id="menu_general_ledger_wizard"
|
||||||
|
sequence="10"
|
||||||
|
/>
|
||||||
|
<menuitem
|
||||||
|
parent="menu_oca_reports"
|
||||||
|
action="action_journal_ledger_wizard"
|
||||||
|
id="menu_journal_ledger_wizard"
|
||||||
|
sequence="15"
|
||||||
|
/>
|
||||||
|
<menuitem
|
||||||
|
parent="menu_oca_reports"
|
||||||
|
action="action_trial_balance_wizard"
|
||||||
|
id="menu_trial_balance_wizard"
|
||||||
|
sequence="20"
|
||||||
|
/>
|
||||||
|
<menuitem
|
||||||
|
parent="menu_oca_reports"
|
||||||
|
action="action_open_items_wizard"
|
||||||
|
id="menu_open_items_wizard"
|
||||||
|
sequence="30"
|
||||||
|
/>
|
||||||
|
<menuitem
|
||||||
|
parent="menu_oca_reports"
|
||||||
|
action="action_aged_partner_balance_wizard"
|
||||||
|
id="menu_aged_partner_balance_wizard"
|
||||||
|
sequence="40"
|
||||||
|
/>
|
||||||
|
<menuitem
|
||||||
|
parent="menu_oca_reports"
|
||||||
|
action="action_vat_report_wizard"
|
||||||
|
id="menu_vat_report_wizard"
|
||||||
|
sequence="50"
|
||||||
|
/>
|
||||||
|
</odoo>
|
||||||