Add odex25_accounting

This commit is contained in:
expert 2024-06-24 13:54:07 +03:00
parent 3a3f834c54
commit c68ed1d372
1644 changed files with 364471 additions and 1 deletions

View File

@ -1,2 +1,2 @@
# odex25-standard-moduless
# odex25-standard-modules
This Repo contains general standard modules for all projects.

View File

@ -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

View File

@ -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,
}

View File

@ -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

View File

@ -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)))

View File

@ -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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

View File

@ -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>

View File

@ -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.

View File

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

View File

@ -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,
}

View File

@ -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
1 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
2 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
3 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
4 excel_dimensions_albilad Albilad Bank 1 4 3 0 2 1 5 %d/%m/%Y 0

View File

@ -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 ==&gt; Dec, December"
msgstr "1. %b, %B ==&gt; ديسمبر"
#. 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 ==&gt; 08, 2008"
msgstr "3. %y, %Y ==&gt; 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 ==&gt; 05, 12"
msgstr "4. %d, %m ==&gt; 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 "عكس اشارة المدين"

View File

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

View File

@ -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

View File

@ -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
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_excel_dimension excel.dimensions model_excel_dimensions account.group_account_readonly 1 0 0 0
3 access_excel_dimension_manager excel.dimensions model_excel_dimensions account.group_account_manager 1 1 1 1

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

@ -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;
}
}

View File

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

View File

@ -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()

View 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>

View File

@ -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>

View 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>

View File

@ -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 ==&gt; Dec, December</div>
<div>3. %y, %Y ==&gt; 08, 2008</div>
<div>4. %d, %m ==&gt; 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>

View File

@ -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>

View File

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

View File

@ -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

View File

@ -0,0 +1,5 @@
# -*- coding: utf-8 -*-
from . import models
from . import reports

View File

@ -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'
],
}

View File

@ -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>

View File

@ -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 ""

View File

@ -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 ""

View File

@ -0,0 +1,5 @@
# -*- coding: utf-8 -*-
from . import account_budget
from . import budget_operations
from . import budget_confirmation

View File

@ -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'''))

View File

@ -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()

View File

@ -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'

View File

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

View File

@ -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

View File

@ -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>

View File

@ -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>

View File

@ -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
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_account_budget_confirmation account.budget.confirmation model_budget_confirmation account.group_account_readonly 1 0 0 0
3 access_account_budget_confirmation_accountant account.budget.confirmation accountant model_budget_confirmation account.group_account_user 1 1 1 1
4 access_account_budget_confirmation_line account.budget.confirmation.line model_budget_confirmation_line account.group_account_readonly 1 0 0 0
5 access_account_budget_confirmation_line_accountant account.budget.confirmation.line accountant model_budget_confirmation_line account.group_account_user 1 1 1 1
6 access_account_budget_operation account.budget.operation model_budget_operations account.group_account_readonly 1 0 0 0
7 access_account_budget_operation_accountant account.budget.operation accountant model_budget_operations account.group_account_user 1 1 1 1
8 access_reject_wizard_user reject.wizard group_account_user model_reject_wizard account.group_account_user 1 1 1 1

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

@ -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;
}
}

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
from . import models
from . import reports

View File

@ -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"],
}

View File

@ -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,
1 id code name user_type_id/id parent_id/id reconcile
2 account_account_46_6c73eb66 0 Company account_chart_of_accounts.data_account_type_view
3 account_account_47_d78e0779 1 Assets account_chart_of_accounts.data_account_type_view account_account_46_6c73eb66
4 account_account_65_c1509b94 11 Current Assets account_chart_of_accounts.data_account_type_view account_account_47_d78e0779
5 account_account_66_fd62e5ad 111 Cash in Banks and Funds account_chart_of_accounts.data_account_type_view account_account_65_c1509b94
6 account_account_53_7cb227ec 1111 Cash in Current Accounts account_chart_of_accounts.data_account_type_view account_account_66_fd62e5ad
7 account_account_57_cf9662ed 111101 Al Rajhi Bank account.data_account_type_liquidity account_account_53_7cb227ec
8 account_account_40_5f61e45d 111102 Al-Inma Bank account.data_account_type_liquidity account_account_53_7cb227ec
9 account_account_54_5a374538 111103 AL-Bilad Bank account.data_account_type_liquidity account_account_53_7cb227ec
10 account_account_38_0ebb4933 111104 Account pending payments receipt -Cashs account.data_account_type_current_assets account_account_53_7cb227ec True
11 account_account_39_10b7ab87 111105 Account outstanding payments receivable- cash account.data_account_type_current_assets account_account_53_7cb227ec True
12 account_account_41_6e9068fc 111106 Account pending payments receipt Banks account.data_account_type_current_assets account_account_53_7cb227ec True
13 account_account_42_b1f5d19c 111107 Account outstanding payments receivable - banks account.data_account_type_current_assets account_account_53_7cb227ec True
14 1_configurable_chart_template_liquidity_transfer 111108 Transfers Account account.data_account_type_current_assets account_account_53_7cb227ec True
15 account_account_36_e0178b31 111109 Bank Reconciliation Account account.data_account_type_current_liabilities account_account_53_7cb227ec
16 account_account_67_33fdff22 1112 Cash in Boxes account_chart_of_accounts.data_account_type_view account_account_66_fd62e5ad
17 account_account_68_19de836b 1113 Betty Cash Account account_chart_of_accounts.data_account_type_view account_account_66_fd62e5ad
18 account_account_37_0a66304e 111401 Cash Boxes account.data_account_type_liquidity account_account_67_33fdff22
19 account_account_48_45d5d5e3 111501 Employee cash covenant account account.data_account_type_liquidity account_account_68_19de836b
20 account_account_138_f7b94056 111502 Other Betty Cash account.data_account_type_liquidity account_account_68_19de836b
21 account_account_69_d82bbacb 112 Accounts Receivable account_chart_of_accounts.data_account_type_view account_account_65_c1509b94
22 account_account_70_677ecbdd 1121 Receivable account_chart_of_accounts.data_account_type_view account_account_69_d82bbacb
23 1_current_assets 112103 Employee loans and advances account.data_account_type_current_assets account_account_70_677ecbdd
24 1_pos_receivable 112104 Receipts / Receivable account.data_account_type_receivable account_account_70_677ecbdd True
25 account_account_71_60f68e70 113 Taxes account_chart_of_accounts.data_account_type_view account_account_65_c1509b94
26 account_account_72_e218ef68 1131 VAT purchases account_chart_of_accounts.data_account_type_view account_account_71_60f68e70
27 1_tax_paid 113101 VAT purchases account.data_account_type_current_assets account_account_72_e218ef68
28 account_account_74_b59bda8f 114 Advance Payments account_chart_of_accounts.data_account_type_view account_account_65_c1509b94
29 account_account_75_f2e13aa2 1141 Expenses Paid in Advance account_chart_of_accounts.data_account_type_view account_account_74_b59bda8f
30 1_prepayments 114101 Prepaid Expenses account.data_account_type_prepayments account_account_75_f2e13aa2
31 account_account_76_700e1cbe 115 Stores account_chart_of_accounts.data_account_type_view account_account_65_c1509b94
32 account_account_77_edae9703 1151 Goods and Tools Store account_chart_of_accounts.data_account_type_view account_account_76_700e1cbe
33 1_stock_valuation 115101 The main store account.data_account_type_current_assets account_account_77_edae9703
34 1_stock_in 115102 Goods on the way account.data_account_type_current_assets account_account_77_edae9703 True
35 1_stock_out 115103 store under inspection account.data_account_type_current_assets account_account_77_edae9703 True
36 account_account_78_321e9deb 12 Non-Current Assets account_chart_of_accounts.data_account_type_view account_account_47_d78e0779
37 account_account_79_07629e73 121 Fixed Assets account_chart_of_accounts.data_account_type_view account_account_78_321e9deb
38 account_account_80_4600c70f 1211 The Cars account_chart_of_accounts.data_account_type_view account_account_79_07629e73
39 account_account_62_286d2c1a 121101 The Cars account.data_account_type_fixed_assets account_account_80_4600c70f
40 account_account_81_bfa28ebc 1212 The Furniture account_chart_of_accounts.data_account_type_view account_account_79_07629e73
41 1_fixed_assets 121201 The Furniture account.data_account_type_fixed_assets account_account_81_bfa28ebc
42 account_account_82_a15be3d4 1213 Computers and electronic devices account_chart_of_accounts.data_account_type_view account_account_79_07629e73
43 account_account_253_4ec9623d 121301 Computers account.data_account_type_fixed_assets account_account_82_a15be3d4
44 account_account_83_33cae736 122 Other Assets account_chart_of_accounts.data_account_type_view account_account_78_321e9deb
45 account_account_84_6702a9d9 1221 Electronic Systems account_chart_of_accounts.data_account_type_view account_account_83_33cae736
46 1_non_current_assets 122101 Website account.data_account_type_non_current_assets account_account_84_6702a9d9
47 account_account_85_2e9b74d6 2 Liabilities and Equity account_chart_of_accounts.data_account_type_view account_account_46_6c73eb66
48 account_account_86_8a06bf9e 21 Current Liabilities account_chart_of_accounts.data_account_type_view account_account_85_2e9b74d6
49 account_account_87_2c3cce44 211 Short Term Commitments account_chart_of_accounts.data_account_type_view account_account_86_8a06bf9e
50 account_account_88_817af232 2111 short term loans account_chart_of_accounts.data_account_type_view account_account_87_2c3cce44
51 account_account_228_bd7c63be 211101 Short Term Loans account.data_account_type_current_liabilities account_account_88_817af232
52 account_account_90_300bdcda 2112 Short Term Payment Papers account_chart_of_accounts.data_account_type_view account_account_87_2c3cce44
53 1_current_liabilities 211201 Bills of exchange and checks account.data_account_type_current_liabilities account_account_90_300bdcda
54 account_account_89_47fb493d 212 long-term commitments account_chart_of_accounts.data_account_type_view account_account_86_8a06bf9e
55 account_account_91_9e465d19 2121 long term loans account_chart_of_accounts.data_account_type_view account_account_89_47fb493d
56 account_account_230_35218190 212102 long term loans account.data_account_type_non_current_liabilities account_account_91_9e465d19
57 account_account_92_e4127fde 2122 long-term bills of exchange account_chart_of_accounts.data_account_type_view account_account_89_47fb493d
58 account_account_229_84ec3052 212201 long-term bills of exchange account.data_account_type_non_current_liabilities account_account_92_e4127fde
59 account_account_93_01f44a26 213 creditors account_chart_of_accounts.data_account_type_view account_account_86_8a06bf9e
60 account_account_94_65ac12f8 2131 trade creditors account_chart_of_accounts.data_account_type_view account_account_93_01f44a26
61 1_receivable 213101 external suppliers account.data_account_type_receivable account_account_94_65ac12f8 True
62 1_payable 213102 Creditors/ Payments account.data_account_type_payable account_account_94_65ac12f8 True
63 account_account_95_8382072a 214 accrued expenses account_chart_of_accounts.data_account_type_view account_account_86_8a06bf9e
64 account_account_96_d28f20a5 2141 accrued expenses account_chart_of_accounts.data_account_type_view account_account_95_8382072a
65 1_to_receive_pay 214101 Salary and wages due account.data_account_type_current_liabilities account_account_96_d28f20a5 True
66 account_account_232_f7b879b7 214103 Eligible social security account.data_account_type_current_liabilities account_account_96_d28f20a5
67 account_account_231_809292f4 214104 Payments made by clients account.data_account_type_current_liabilities account_account_96_d28f20a5
68 account_account_97_4f194535 215 Zakat provision account_chart_of_accounts.data_account_type_view account_account_86_8a06bf9e
69 account_account_98_8c546453 2151 Zakat provision account_chart_of_accounts.data_account_type_view account_account_97_4f194535
70 account_account_233_ecae933a 215101 Zakat provision account.data_account_type_current_liabilities account_account_98_8c546453
71 account_account_99_5d369744 22 Non-current obligations account_chart_of_accounts.data_account_type_view account_account_85_2e9b74d6
72 account_account_100_f1248c0d 221 credit related parties account_chart_of_accounts.data_account_type_view account_account_99_5d369744
73 account_account_101_58c25bee 2211 Accounts payable to related parties account_chart_of_accounts.data_account_type_view account_account_100_f1248c0d
74 account_account_234_497027d0 221101 Partners Drawing Accounts account.data_account_type_equity account_account_101_58c25bee
75 account_account_235_ae73fe3e 221102 Short term loan to related parties account.data_account_type_equity account_account_101_58c25bee
76 account_account_236_df111e8d 221103 Other creditor related parties account.data_account_type_equity account_account_101_58c25bee
77 account_account_102_b02675b1 222 Other credit balances account_chart_of_accounts.data_account_type_view account_account_99_5d369744
78 account_account_103_b0e622d6 2221 Other creditors account_chart_of_accounts.data_account_type_view account_account_102_b02675b1
79 account_account_238_d62e16f2 222101 temporary investments account.data_account_type_equity account_account_103_b0e622d6
80 account_account_237_9013bc14 222102 Other creditors account.data_account_type_equity account_account_103_b0e622d6
81 account_account_104_c6b44665 223 Taxes account_chart_of_accounts.data_account_type_view account_account_99_5d369744
82 account_account_105_8dc905d4 2231 Sales Tax VAT account_chart_of_accounts.data_account_type_view account_account_104_c6b44665
83 1_tax_receivable 223101 Sales Tax account.data_account_type_current_assets account_account_105_8dc905d4
84 account_account_240_91f4b7d8 223102 VAT due account.data_account_type_current_liabilities account_account_105_8dc905d4
85 account_account_106_5ef42f61 224 Allotments account_chart_of_accounts.data_account_type_view account_account_99_5d369744
86 account_account_107_2f46d77a 2241 Provision for employee obligations account_chart_of_accounts.data_account_type_view account_account_106_5ef42f61
87 account_account_241_49ec34fc 224101 Holidays allotted account.data_account_type_non_current_liabilities account_account_107_2f46d77a
88 account_account_242_7ea4fe8a 224102 custom travel tickets account.data_account_type_non_current_liabilities account_account_107_2f46d77a
89 account_account_243_6a7f90de 224103 Provision for end of severance pay account.data_account_type_non_current_liabilities account_account_107_2f46d77a
90 account_account_108_d4c7ec75 2242 other allowances account_chart_of_accounts.data_account_type_view account_account_106_5ef42f61
91 account_account_244_bbf0c0e8 224201 Provision for doubtful debts, receivables from individuals account.data_account_type_current_liabilities account_account_108_d4c7ec75
92 account_account_245_695a09b6 224202 Provision for doubtful debts, receivables from companies account.data_account_type_current_liabilities account_account_108_d4c7ec75
93 account_account_109_df598a12 23 Property rights account_chart_of_accounts.data_account_type_view account_account_85_2e9b74d6
94 account_account_110_f75b7972 231 Equity account_chart_of_accounts.data_account_type_view account_account_109_df598a12
95 account_account_111_98161560 2311 capital account_chart_of_accounts.data_account_type_view account_account_110_f75b7972
96 account_account_246_ebe9ecda 231101 capital account.data_account_type_equity account_account_111_98161560
97 account_account_247_5989bf9a 231102 financing for investment account.data_account_type_equity account_account_111_98161560
98 account_account_112_d0561224 232 Reserve account_chart_of_accounts.data_account_type_view account_account_109_df598a12
99 account_account_113_706a1cf7 2321 Regular Reserve account_chart_of_accounts.data_account_type_view account_account_112_d0561224
100 account_account_248_45083bfd 232101 Regular Reserve account.data_account_type_equity account_account_113_706a1cf7
101 account_account_249_027afc8a 232102 Capital Losses account.data_account_type_equity account_account_113_706a1cf7
102 account_account_114_7b2e99ad 233 Profits and Losses account_chart_of_accounts.data_account_type_view account_account_109_df598a12
103 account_account_115_a082702d 2331 profits and losses account_chart_of_accounts.data_account_type_view account_account_114_7b2e99ad
104 account_account_43_73a28584 233101 Profits, losses, and residuals account.data_unaffected_earnings account_account_115_a082702d
105 account_account_252_a8e1f749 233102 Profits and Losses account.data_unaffected_earnings account_account_115_a082702d
106 1_tax_received 291001 Tax Received account.data_account_type_current_liabilities account_account_105_8dc905d4
107 1_tax_payable 291002 Tax Payable account.data_account_type_current_liabilities account_account_105_8dc905d4
108 account_account_116_1c1c95fe 3 expenses account_chart_of_accounts.data_account_type_view account_account_46_6c73eb66
109 account_account_117_d7566a08 31 General and administrative expenses account_chart_of_accounts.data_account_type_view account_account_116_1c1c95fe
110 account_account_118_d6b23c93 311 Administrative expenses account_chart_of_accounts.data_account_type_view account_account_117_d7566a08
111 account_account_119_2b115ffc 3111 Salaries and Wages account_chart_of_accounts.data_account_type_view account_account_118_d6b23c93
112 account_account_147_dedc9baf 311101 basic salary account.data_account_type_expenses account_account_119_2b115ffc
113 account_account_148_990325eb 311102 housing allowance account.data_account_type_expenses account_account_119_2b115ffc
114 account_account_149_eb24deb1 311103 transportation allowance account.data_account_type_expenses account_account_119_2b115ffc
115 account_account_150_c160aa0a 311104 call exchange account.data_account_type_expenses account_account_119_2b115ffc
116 account_account_151_873e0227 311105 work nature allowance account.data_account_type_expenses account_account_119_2b115ffc
117 account_account_152_a8c2a986 311106 cost of living allowance account.data_account_type_expenses account_account_119_2b115ffc
118 account_account_153_3915aabb 311107 expatriate allowance account.data_account_type_expenses account_account_119_2b115ffc
119 account_account_154_4001295f 311108 assignment allowance account.data_account_type_expenses account_account_119_2b115ffc
120 account_account_120_1ab280d4 3112 Other staff costs account_chart_of_accounts.data_account_type_view account_account_118_d6b23c93
121 account_account_155_b3c93c17 311201 medical expenses account.data_account_type_expenses account_account_120_1ab280d4
122 account_account_156_31ee8d22 311202 medical insurance account.data_account_type_expenses account_account_120_1ab280d4
123 account_account_157_fef6b222 311203 Staff residence account.data_account_type_expenses account_account_120_1ab280d4
124 account_account_158_99631784 311204 Exit and return visa account.data_account_type_expenses account_account_120_1ab280d4
125 account_account_159_774ebe76 311205 Iqama renewal fee account.data_account_type_expenses account_account_120_1ab280d4
126 account_account_160_3d3e87b0 311206 Work permit fees account.data_account_type_expenses account_account_120_1ab280d4
127 account_account_161_f7f5b49d 311207 Service office expenses account.data_account_type_expenses account_account_120_1ab280d4
128 account_account_162_e6634720 311208 Sponsorship Transfer Fee account.data_account_type_expenses account_account_120_1ab280d4
129 account_account_163_76059d0a 311209 Training and seminars account.data_account_type_expenses account_account_120_1ab280d4
130 account_account_164_e1271be0 311210 Recruitment expenses account.data_account_type_expenses account_account_120_1ab280d4
131 account_account_166_d3ad0634 311211 Recruitment office fees account.data_account_type_expenses account_account_120_1ab280d4
132 account_account_165_f11a2e81 311212 Social Security account.data_account_type_expenses account_account_120_1ab280d4
133 account_account_167_2fe30391 311213 Work visit visa account.data_account_type_expenses account_account_120_1ab280d4
134 account_account_168_65e0166b 311214 Licenses of the Council of Engineers, Professionals and Technicians account.data_account_type_expenses account_account_120_1ab280d4
135 account_account_169_789f90f9 311215 End of service gratuity account.data_account_type_expenses account_account_120_1ab280d4
136 account_account_170_e6a057ef 311216 Transportation and travel expenses account.data_account_type_expenses account_account_120_1ab280d4
137 account_account_171_8d5cdbab 311217 Staff salary transfer fee account.data_account_type_expenses account_account_120_1ab280d4
138 account_account_121_1994bb54 3113 Rewards, incentives and points account_chart_of_accounts.data_account_type_view account_account_118_d6b23c93
139 account_account_172_fb45ff01 311301 Sales bonuses and commissions account.data_account_type_expenses account_account_121_1994bb54
140 account_account_173_f6e7779f 311302 temporary wages account.data_account_type_expenses account_account_121_1994bb54
141 account_account_122_905dc364 3114 Other allowances account_chart_of_accounts.data_account_type_view account_account_118_d6b23c93
142 account_account_174_5e896e98 311401 Travel ticket exchange account.data_account_type_expenses account_account_122_905dc364
143 account_account_175_f67e7e81 311402 Alternate warning period account.data_account_type_expenses account_account_122_905dc364
144 account_account_176_12f13a3c 311403 education allowance account.data_account_type_expenses account_account_122_905dc364
145 account_account_177_bbddfa7d 311404 Vacation allowance account.data_account_type_expenses account_account_122_905dc364
146 account_account_123_b5c2a7c4 3115 Licensing fees and government subscriptions account_chart_of_accounts.data_account_type_view account_account_118_d6b23c93
147 account_account_178_c0d3ac34 311501 business account fees account.data_account_type_expenses account_account_123_b5c2a7c4
148 account_account_179_b917cbdb 311502 Municipal license fees account.data_account_type_expenses account_account_123_b5c2a7c4
149 account_account_181_d936559d 311503 Chamber of Commerce subscription account.data_account_type_expenses account_account_123_b5c2a7c4
150 account_account_124_6a434946 312 General expenses account_chart_of_accounts.data_account_type_view account_account_117_d7566a08
151 account_account_125_582bd695 3121 Service charges account_chart_of_accounts.data_account_type_view account_account_124_6a434946
152 account_account_60_ad170c1f 312101 Rents account.data_account_type_expenses account_account_125_582bd695
153 account_account_183_1f5b24c7 312102 Water account.data_account_type_expenses account_account_125_582bd695
154 account_account_184_9b55bddb 312103 Electricity account.data_account_type_expenses account_account_125_582bd695
155 account_account_185_70877cd7 312104 Gasoline and motor oil account.data_account_type_expenses account_account_125_582bd695
156 account_account_186_ffa5322f 312105 Advertising account.data_account_type_expenses account_account_125_582bd695
157 account_account_187_a091e945 312106 Technical and information expenses account.data_account_type_expenses account_account_125_582bd695
158 account_account_188_2a5ed1ce 312108 Building Maintenance account.data_account_type_expenses account_account_125_582bd695
159 account_account_189_4c385ed9 312109 Computer and electronic equipment maintenance account.data_account_type_expenses account_account_125_582bd695
160 account_account_190_57672b84 312110 government services account.data_account_type_expenses account_account_125_582bd695
161 account_account_191_7ee8b51f 312111 Recruitment visas account.data_account_type_expenses account_account_125_582bd695
162 account_account_192_0a5aca1d 312112 office equipment maintenance account.data_account_type_expenses account_account_125_582bd695
163 account_account_193_e00db8e6 312113 Real estate services for the office account.data_account_type_expenses account_account_125_582bd695
164 account_account_194_4ee836b4 312114 Marketing services expenses account.data_account_type_expenses account_account_125_582bd695
165 1_cost_of_goods_sold 312115 Cost of Goods Sold account.data_account_type_direct_costs account_account_125_582bd695
166 account_account_126_f124c559 3122 Communications and mail account_chart_of_accounts.data_account_type_view account_account_124_6a434946
167 account_account_196_b1eb2c3f 312201 Phone charges and mobile bills account.data_account_type_expenses account_account_126_f124c559
168 account_account_197_7f0a6829 312202 Postage and subscription account.data_account_type_expenses account_account_126_f124c559
169 account_account_127_d924497a 3123 Service office supplies account_chart_of_accounts.data_account_type_view account_account_124_6a434946
170 account_account_195_edc46352 312301 Publications account.data_account_type_expenses account_account_127_d924497a
171 account_account_198_5ff20305 312302 Stationery and office supplies account.data_account_type_expenses account_account_127_d924497a
172 account_account_199_3b1547e0 312303 Buffet supplies account.data_account_type_expenses account_account_127_d924497a
173 account_account_128_385d1617 3124 Miscellaneous other expenses account_chart_of_accounts.data_account_type_view account_account_124_6a434946
174 account_account_61_6ff47f77 312401 municipal licenses account.data_account_type_expenses account_account_128_385d1617
175 account_account_200_a6c1aca0 312402 Gifts account.data_account_type_expenses account_account_128_385d1617
176 account_account_201_0dcfd64a 312403 Travel ticket expenses account.data_account_type_expenses account_account_128_385d1617
177 account_account_202_3dca95a3 312404 Hotel accommodation expenses account.data_account_type_expenses account_account_128_385d1617
178 account_account_203_e45c14d8 312405 Shipping and unloading expenses account.data_account_type_expenses account_account_128_385d1617
179 account_account_204_288f3450 312406 Newspaper and magazine ads account.data_account_type_expenses account_account_128_385d1617
180 account_account_205_7694c361 312407 Radio and TV advertisements account.data_account_type_expenses account_account_128_385d1617
181 account_account_206_5240d494 312408 Internet subscription account.data_account_type_expenses account_account_128_385d1617
182 account_account_207_6adc039e 312409 Consulting and technical support fees account.data_account_type_expenses account_account_128_385d1617
183 account_account_208_1172372f 312410 Legalization fees account.data_account_type_expenses account_account_128_385d1617
184 account_account_209_70eb8c65 312411 Subscription and exhibitions account.data_account_type_expenses account_account_128_385d1617
185 account_account_210_9b3cf9f5 312412 Miscellaneous administrative expenses account.data_account_type_expenses account_account_128_385d1617
186 account_account_211_506f7a3f 312413 Paying fines and violations account.data_account_type_expenses account_account_128_385d1617
187 account_account_212_7f1f952d 312414 Transfer fees account.data_account_type_expenses account_account_128_385d1617
188 account_account_213_1e8ca1f9 312415 Bank fees and commissions account.data_account_type_expenses account_account_128_385d1617
189 account_account_214_57a204fb 312416 Sales discounts account.data_account_type_expenses account_account_128_385d1617
190 account_account_215_da6e9471 312417 Shipping and delivery costs account.data_account_type_expenses account_account_128_385d1617
191 account_account_216_5c90146a 312418 Service costs account.data_account_type_expenses account_account_128_385d1617
192 account_account_217_053ee245 312419 Rental commissions account.data_account_type_expenses account_account_128_385d1617
193 account_account_218_ae6ead8f 312420 Leisure activities and outings account.data_account_type_expenses account_account_128_385d1617
194 account_account_219_b9c9750a 312421 Hospitality and petty cash account.data_account_type_expenses account_account_128_385d1617
195 account_account_220_fa538654 312422 Investment profit expense account.data_account_type_expenses account_account_128_385d1617
196 account_account_221_c6efd4e2 312423 Advocacy and legal advice fees account.data_account_type_expenses account_account_128_385d1617
197 account_account_222_cb49e83e 312424 Legal reference fees account.data_account_type_expenses account_account_128_385d1617
198 account_account_223_a475086d 312425 Declaration of zakat and income account.data_account_type_expenses account_account_128_385d1617
199 account_account_224_73e56a71 312426 Fine for late payment of value added tax account.data_account_type_expenses account_account_128_385d1617
200 account_account_225_f8e78964 312427 Doubtful debts account.data_account_type_expenses account_account_128_385d1617
201 account_account_226_8aaded69 312428 Other subscription fees account.data_account_type_expenses account_account_128_385d1617
202 account_account_227_3243e5b0 312429 Banking service fees account.data_account_type_expenses account_account_128_385d1617
203 1_expense 312430 Expenses account.data_account_type_expenses account_account_128_385d1617
204 1_expense_rent 312431 office rentals account.data_account_type_expenses account_account_128_385d1617
205 account_account_129_c20e9be3 313 depreciation account_chart_of_accounts.data_account_type_view account_account_117_d7566a08
206 account_account_130_23ffe55c 3131 Depreciation expense account_chart_of_accounts.data_account_type_view account_account_129_c20e9be3
207 account_account_64_da01c863 313101 Depreciation expense account.data_account_type_depreciation account_account_130_23ffe55c
208 account_account_131_dee3e8df 4 Revenues account_chart_of_accounts.data_account_type_view account_account_46_6c73eb66
209 account_account_132_ddaf24b2 41 Sales revenue account_chart_of_accounts.data_account_type_view account_account_131_dee3e8df
210 account_account_133_eab09a57 411 The sales account_chart_of_accounts.data_account_type_view account_account_132_ddaf24b2
211 account_account_134_aa3d1407 4111 cash sales account_chart_of_accounts.data_account_type_view account_account_133_eab09a57
212 account_account_140_b53efa48 411101 Returns purchases account.data_account_type_revenue account_account_134_aa3d1407
213 1_income 411102 Cash proceeds from sales of services account.data_account_type_revenue account_account_134_aa3d1407
214 account_account_135_70e50462 42 Other revenue account_chart_of_accounts.data_account_type_view account_account_131_dee3e8df
215 account_account_136_2b41da3a 421 Other sales account_chart_of_accounts.data_account_type_view account_account_135_70e50462
216 account_account_137_0b886e4d 4211 Revenue other than activity account_chart_of_accounts.data_account_type_view account_account_136_2b41da3a
217 account_account_141_24dc93b6 421101 Purchase Discounts account.data_account_type_other_income account_account_137_0b886e4d
218 account_account_142_f225ed68 421102 commission income account.data_account_type_other_income account_account_137_0b886e4d
219 account_account_143_61ad26e9 421103 rental income account.data_account_type_other_income account_account_137_0b886e4d
220 account_account_145_6bd6176a 421104 Employee discounts account.data_account_type_other_income account_account_137_0b886e4d
221 account_account_146_9eeddf1a 421105 governmental support account.data_account_type_other_income account_account_137_0b886e4d

View File

@ -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>

View File

@ -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 "إجمالي"

View File

@ -0,0 +1,6 @@
# -*- coding: utf-8 -*-
from . import account_account
from . import account_journal
from . import res_config_settings
from . import base

View File

@ -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)

View File

@ -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')

View File

@ -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)

View File

@ -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
)

View File

@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import account_report_coa

View File

@ -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('&nbsp;', ' ')
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

View 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>

View File

@ -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>

View File

@ -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
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_account_account_readonly account.account.readonly model_account_account group_chart_of_account_readony 1 0 0 0
3 access_account_account_full account.account.full model_account_account group_chart_of_account_full 1 1 1 1
4 access_account_account_deprecated account.account.deprecated model_account_account group_chart_of_account_deprecated 1 1 0 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

@ -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;
}
}

View File

@ -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>

View File

@ -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 &amp; 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 &amp; 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>

View File

@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import models

View File

@ -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,
}

View File

@ -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 "فحص الموازنات للموردين"

View File

@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import res_config_settings

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

@ -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>

View File

@ -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.

View File

@ -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

View File

@ -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",
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -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>

Some files were not shown because too many files have changed in this diff Show More