diff --git a/README.md b/README.md
index 8b10e6960..6864725ce 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,2 @@
-# odex25-standard-moduless
+# odex25-standard-modules
This Repo contains general standard modules for all projects.
diff --git a/odex25_transactions/.idea/inspectionProfiles/Project_Default.xml b/odex25_transactions/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 000000000..480ffc0b0
--- /dev/null
+++ b/odex25_transactions/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/.idea/inspectionProfiles/profiles_settings.xml b/odex25_transactions/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 000000000..105ce2da2
--- /dev/null
+++ b/odex25_transactions/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/.idea/modules.xml b/odex25_transactions/.idea/modules.xml
new file mode 100644
index 000000000..a57643433
--- /dev/null
+++ b/odex25_transactions/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/.idea/odex25_transactions.iml b/odex25_transactions/.idea/odex25_transactions.iml
new file mode 100644
index 000000000..d0876a78d
--- /dev/null
+++ b/odex25_transactions/.idea/odex25_transactions.iml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/README.rst b/odex25_transactions/README.rst
new file mode 100644
index 000000000..d64cf9a56
--- /dev/null
+++ b/odex25_transactions/README.rst
@@ -0,0 +1,4 @@
+*pip install arabic-reshaper
+*pip install python-bidi
+pip install python-barcode
+
diff --git a/odex25_transactions/cm_entity_sync_odex/__init__.py b/odex25_transactions/cm_entity_sync_odex/__init__.py
new file mode 100644
index 000000000..3e0935305
--- /dev/null
+++ b/odex25_transactions/cm_entity_sync_odex/__init__.py
@@ -0,0 +1,4 @@
+#-*- coding: utf-8 -*-
+from . import models
+from . import wizards
+from . import controllers
diff --git a/odex25_transactions/cm_entity_sync_odex/__manifest__.py b/odex25_transactions/cm_entity_sync_odex/__manifest__.py
new file mode 100644
index 000000000..186e57b1a
--- /dev/null
+++ b/odex25_transactions/cm_entity_sync_odex/__manifest__.py
@@ -0,0 +1,41 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# Odex - Communications Management System.
+# Copyright (C) 2020 Expert Co. Ltd. ().
+#
+##############################################################################
+{
+ 'name' : 'C.M. Entity Sync',
+ 'version' : '0.1',
+ 'sequence' : 4,
+ 'author' : 'Expert Co. Ltd.',
+ 'category' : 'Odex25-Transactions/Odex25-Transactions',
+ 'summary' : 'Correspondence Management, Entity Sync',
+ 'description' : """
+Odex - Correspondence Management, Entity Syncronization
+========================================================
+
+Intercompanies entity syncronization
+ """,
+ 'website': 'http://www.exp-sa.com',
+ 'depends': ['exp_transaction_documents'],
+ 'data': [
+ 'security/ir.model.access.csv',
+ # data
+ 'data/data.xml',
+ # views
+ 'views/entity_view.xml',
+ 'views/settings_view.xml',
+ # wizards
+ 'wizards/inter_entity_wizard.xml',
+ # actions amd menus
+ 'views/actions_and_menus.xml',
+ ],
+ 'qweb' : [
+ ],
+ 'installable': True,
+ 'auto_install': False,
+ 'application': False,
+}
+
diff --git a/odex25_transactions/cm_entity_sync_odex/controllers/__init__.py b/odex25_transactions/cm_entity_sync_odex/controllers/__init__.py
new file mode 100644
index 000000000..398e67254
--- /dev/null
+++ b/odex25_transactions/cm_entity_sync_odex/controllers/__init__.py
@@ -0,0 +1,2 @@
+#-*- coding: utf-8 -*-
+from . import sync
diff --git a/odex25_transactions/cm_entity_sync_odex/controllers/sync.py b/odex25_transactions/cm_entity_sync_odex/controllers/sync.py
new file mode 100644
index 000000000..e4b270a1c
--- /dev/null
+++ b/odex25_transactions/cm_entity_sync_odex/controllers/sync.py
@@ -0,0 +1,312 @@
+#-*- coding: utf-8 -*-
+import logging
+import datetime
+import base64
+from odoo import http
+from odoo.http import request
+from odoo import models, api, fields, _,exceptions,SUPERUSER_ID
+
+
+_logger = logging.getLogger(__name__)
+
+
+class Sync(http.Controller):
+ @http.route('/cm/sync/broadcast', type='json', auth='public', methods=['POST'])
+ def add_new(self, **kw):
+ keys = [
+ 'url',
+ 'name',
+ 'code',
+ 'key',
+ 'auth',
+ ]
+ for k in keys:
+ if not kw.get(k, False):
+ return {
+ 'error': 'Bad Request 1',
+ }
+ inter_entity = request.env['cm.inter_entity'].sudo()
+ if not inter_entity.authenticate(kw.get('auth', '')):
+ return {
+ 'error': 'Bad Request 2',
+ 'req': kw,
+ }
+ data = {
+ 'url': kw.get('url', ''),
+ 'name': kw.get('name', ''),
+ 'code': kw.get('code', ''),
+ 'uuid': kw.get('key', ''),
+ }
+ entities = inter_entity.add_new(data)
+ return {
+ 'success': True,
+ 'entities': entities,
+ }
+
+ @http.route('/cm/sync/update_from', type='json', auth='public', methods=['POST'])
+ def update_from(self, **kw):
+ keys = [
+ 'key',
+ 'auth',
+ ]
+ for k in keys:
+ if not kw.get(k, False):
+ return {
+ 'error': 'Bad Request 1',
+ }
+ inter_entity = request.env['cm.inter_entity'].sudo()
+ if not inter_entity.authenticate(kw.get('auth', '')):
+ return {
+ 'error': 'Bad Request 2',
+ 'req': kw,
+ }
+ return {
+ 'success': True,
+ 'entities': inter_entity.get_entities()
+ }
+ data = {
+ 'url': kw.get('url', ''),
+ 'name': kw.get('name', ''),
+ 'code': kw.get('code', ''),
+ 'uuid': kw.get('key', ''),
+ }
+ entities = inter_entity.add_new(data)
+ return {
+ 'success': True,
+ 'entities': entities,
+ }
+
+ @http.route('/cm/sync/new_key', type='json', auth='public', methods=['POST'])
+ def new_key(self, **kw):
+ keys = [
+ 'old',
+ 'key',
+ 'auth',
+ ]
+ for k in keys:
+ if not kw.get(k, False):
+ return {
+ 'error': 'Bad Request 1',
+ }
+ inter_entity = request.env['cm.inter_entity'].sudo()
+ if not inter_entity.authenticate(kw.get('auth', '')):
+ return {
+ 'error': 'Bad Request 2',
+ }
+ old = inter_entity.search([('uuid', '=', kw.get('old'))], limit=1)
+ if len(old):
+ data = {
+ 'uuid': kw.get('key'),
+ 'code': kw.get('key').split('-')[0],
+ }
+ old.write(data)
+ return {
+ 'success': True,
+ }
+
+ @http.route('/cm/sync/update_entity', type='json', auth='public', methods=['POST'])
+ def update_entity(self, **kw):
+ keys = [
+ 'data',
+ 'auth',
+ ]
+ for k in keys:
+ if not kw.get(k, False):
+ return {
+ 'error': 'Bad Request 1',
+ }
+ inter_entity = request.env['cm.inter_entity'].sudo()
+ inter_entity_set = request.env['cm.inter_entity.sync'].sudo()
+ if not inter_entity.authenticate(kw.get('auth', '')):
+ return {
+ 'error': 'Bad Request 2',
+ }
+ data = kw['data']
+ key = data['key']
+ entity = inter_entity.search([('uuid', '=', key)], limit=1)
+ ecode = data['details']['code']
+ is_new = data['details'].get('is_new', False)
+ if len(entity):
+ en = request.env['cm.entity'].sudo().search(
+ [('inter_entity_code', '=', ecode), ('inter_entity_id', '=', entity.id)])
+ if len(en):
+ d = data['details']['data']
+ d['broadcasted'] = True
+ en.write(d)
+ elif is_new:
+ d = data['details']['data']
+ dd = {
+ 'name': d.get('name', ''),
+ # 'code': d.get('code', ''),
+ 'type': 'external',
+ 'is_inter_entity': True,
+ 'inter_entity_code': d.get('inter_entity_code', ''),
+ 'inter_entity_id': entity.id,
+ }
+ request.env['cm.entity'].sudo().create(dd)
+ else:
+ return {
+ 'error': 'No Record'
+ }
+ return {
+ 'success': True,
+ }
+
+ @http.route('/cm/sync/push_new', type='json', auth='public', methods=['POST'])
+ def push_new(self, **kw):
+ keys = [
+ 'data',
+ 'auth',
+ ]
+ for k in keys:
+ if not kw.get(k, False):
+ return {
+ 'error': 'Bad Request 1',
+ }
+ inter_entity = request.env['cm.inter_entity'].sudo()
+ if not inter_entity.authenticate(kw.get('auth', '')):
+ return {
+ 'error': 'Bad Request 2',
+ }
+ data = kw['data']
+ key = data['key']
+ entity = inter_entity.search([('uuid', '=', key)], limit=1)
+
+ if len(entity):
+
+ d = data['data']
+ dd = {
+ 'name': d.get('name', ''),
+ # 'code': d.get('code', ''),
+ 'type': 'external',
+ 'is_inter_entity': True,
+ 'inter_entity_code': d.get('inter_entity_code', ''),
+ 'inter_entity_id': entity.id,
+ }
+ try:
+ request.env['cm.entity'].sudo().with_context(
+ broacasted=True).create(dd)
+ return {
+ 'success': True,
+ }
+ except Exception as e:
+ return {
+ 'error': 'No Record'
+ }
+ else:
+ return {
+ 'error': 'No Record'
+ }
+ return {
+ 'success': True,
+ }
+
+ @http.route('/cm/sync/send_transaction', type='json', auth='public', methods=['POST'])
+ def send_transaction(self, **kw):
+ keys = [
+ 'data',
+ 'code',
+ 'key',
+ 'auth',
+ ]
+ for k in keys:
+ if not kw.get(k, False):
+ return {
+ 'error': 'Bad Request 1',
+ }
+ inter_entity = request.env['cm.inter_entity'].sudo()
+ Entity = request.env['cm.entity'].sudo()
+ if not inter_entity.authenticate(kw.get('auth', '')):
+ return {
+ 'error': 'Bad Request 2',
+ }
+ data = kw['data']
+ code = kw['code']
+ key = kw['key']
+ auth = kw['auth']
+ from_id = data['from_id']
+ ie = inter_entity.search([('uuid', '=', auth)], limit=1)
+ extie = inter_entity.search([('uuid', '=', key)], limit=1)
+ setting = inter_entity.get_settings()
+ if not len(ie) or not len(extie):
+ return {
+ 'error': 'No Record 1'
+ }
+ if not from_id:
+ from_id = Entity.search([('is_master_entity', '=', True),
+ ('type', '=', 'external'), ('inter_entity_id', '=', extie.id)], limit=1)
+ if not len(from_id):
+ return {
+ 'error': 'No Record 2'
+ }
+ else:
+ from_id = Entity.search([('inter_entity_code', '=', from_id), (
+ 'type', '=', 'external'), ('inter_entity_id', '=', extie.id)], limit=1)
+ if not len(from_id):
+ return {
+ 'error': 'No Record 3'
+ }
+ entity = Entity.search([('inter_entity_code', '=', code),('type', '=', 'unit')], limit=1)
+ if len(entity) > 0 and len(from_id) > 0:
+ Incoming = request.env['incoming.transaction'].sudo()
+ d = data
+ d['from_id'] = from_id.id
+ d['inter_entity_id'] = extie.id
+ d['important_id'] = setting.important_id.id
+ d['subject_type_id'] = setting.subject_type_id.id
+ if len(entity.secretary_id):
+ d['employee_id'] = entity.secretary_id.id
+ d['preparation_id'] = entity.id
+ else:
+ d['employee_id'] = setting.employee_id.id
+ d['preparation_id'] = setting.id
+ d['to_ids'] = [(4, entity.id), ]
+ # if entity.body:
+ # d['body'] = entity.body
+ d['due_date'] = fields.date.today()
+ attachment_rule_ids = d.get('attachment_rule_ids')
+ d.pop('attachment_rule_ids')
+ inc = Incoming.create(d)
+ for attachment in attachment_rule_ids:
+ attachement_rule = request.env['cm.attachment.rule'].sudo().create({
+ 'employee_id': entity.secretary_id.id if len(entity.secretary_id) else setting.employee_id.id,
+ 'entity_id': entity.id,
+ 'file_save': attachment['file_save'],
+ 'attachment_filename': attachment['attachment_filename'],
+ 'incoming_transaction_id': inc.id if inc.id else False,
+ 'date': attachment['date'],
+ 'description': attachment['description'],
+ })
+ attachment_data = {
+ 'name': attachment['attachment_filename'],
+ 'datas_fname': attachment['attachment_filename'],
+ 'datas': attachment['file_save'],
+ 'res_model': 'cm.attachment.rule',
+ 'res_id': attachement_rule.id,
+ }
+ request.env['ir.attachment'].sudo().create(attachment_data)
+ inc.preparation_id = inc.entity_id
+ # notification system and mailing
+ employee = inc.from_id
+ subj = _('Message Has been send !')
+ msg = _(u'{} ← {}.{}').format(employee and employee.name or '#',
+ u' / '.join([k.name for k in inc.to_ids]),
+ u'رابط المعاملة ' % (inc.get_url()))
+ partner_ids = []
+ for partner in inc.to_ids:
+ if partner.type == 'unit':
+ partner_ids.append(partner.secretary_id.user_id.partner_id.id)
+ elif partner.type == 'employee':
+ partner_ids.append(partner.user_id.partner_id.id)
+ # thread_obj = request.env['mail.thread']
+ # thread_obj.message_post(type="notification", subject=subj, body=msg,
+ # partner_ids=partner_ids,
+ # subtype="mail.mt_comment")
+ # inc.send_message(template='exp_transaction_documents.incoming_notify_send_send_email')
+ else:
+ return {
+ 'error': 'No Record 4'
+ }
+ return {
+ 'success': True,
+ }
\ No newline at end of file
diff --git a/odex25_transactions/cm_entity_sync_odex/data/data.xml b/odex25_transactions/cm_entity_sync_odex/data/data.xml
new file mode 100644
index 000000000..41e3ed549
--- /dev/null
+++ b/odex25_transactions/cm_entity_sync_odex/data/data.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+ Inter-Entities Seq
+ cm.inter.entity
+
+
+ 6
+
+
+
diff --git a/odex25_transactions/cm_entity_sync_odex/i18n/ar_SY.po b/odex25_transactions/cm_entity_sync_odex/i18n/ar_SY.po
new file mode 100644
index 000000000..522c0331c
--- /dev/null
+++ b/odex25_transactions/cm_entity_sync_odex/i18n/ar_SY.po
@@ -0,0 +1,345 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * cm_entity_sync_odex
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 11.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-05-16 03:24+0000\n"
+"PO-Revision-Date: 2020-05-16 03:24+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: cm_entity_sync_odex
+#: model:ir.model.fields,help:cm_entity_sync_odex.field_cm_entity_is_inter_entity
+#: model:ir.model.fields,help:cm_entity_sync_odex.field_cm_entity_is_master_entity
+msgid "\n"
+" If checked, this entity will be syncronized by other entities in the group.\n"
+" "
+msgstr "\n"
+" اذا تمّ اختياره، سيتم مشاركة المؤسسة مع بقية المؤسسات في المجموعة.\n"
+" "
+
+#. module: cm_entity_sync_odex
+#: code:addons/cm_entity_sync_odex/models/entity.py:278
+#: code:addons/cm_entity_sync_odex/models/entity.py:280
+#, python-format
+msgid "Access Error"
+msgstr "ليس لديك صلاحية !"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_sync_activated
+#: model:ir.ui.view,arch_db:cm_entity_sync_odex.view_cm_sync_config
+msgid "Activate Syncronization"
+msgstr "تفعيل نظام المزامنة"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_wizard_broadcast
+msgid "Broadcast"
+msgstr "مزامنة"
+
+#. module: cm_entity_sync_odex
+#: code:addons/cm_entity_sync_odex/wizards/wizards.py:34
+#, python-format
+msgid "Broadcast Error !Error While Broadcast new Server, please check server key and url."
+msgstr "خطا في المزامنة ! خطا عند مزامنة مخدم الجديد , الرجاء التأكد من عنوان الويب او مفتاح المخدم."
+
+#. module: cm_entity_sync_odex
+#: model:ir.ui.view,arch_db:cm_entity_sync_odex.view_cm_inter_entity_update_wizard
+#: model:ir.ui.view,arch_db:cm_entity_sync_odex.view_cm_inter_entity_wizard
+msgid "Cancel"
+msgstr "إلغاء"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_code
+msgid "Code"
+msgstr "رمز"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_create_uid
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_sync_create_uid
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_update_wizard_create_uid
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_wizard_create_uid
+msgid "Created by"
+msgstr "أنشئ بواسطة"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_create_date
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_sync_create_date
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_update_wizard_create_date
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_wizard_create_date
+msgid "Created on"
+msgstr "أنشئ في"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_sync_server_id
+msgid "Current Server"
+msgstr "السيرفر (النظام) الحالي"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_sync_employee_id
+msgid "Default Created By"
+msgstr "مدخل المعاملة الافتراضي"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_sync_important_id
+msgid "Default Important Degree"
+msgstr "درجة الأهمية الافتراضية"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_sync_subject_type_id
+msgid "Default Transaction Type"
+msgstr "نوع المعاملة الافتراضي"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_name
+msgid "Description"
+msgstr "الوصف"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_display_name
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_sync_display_name
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_update_wizard_display_name
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_wizard_display_name
+msgid "Display Name"
+msgstr "الاسم المعروض"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_update_wizard_document_id
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_wizard_document_id
+msgid "Document"
+msgstr "مستند"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_sync_entities
+msgid "Entities"
+msgstr "العناوين و الجهات"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model,name:cm_entity_sync_odex.model_cm_inter_entity_sync
+msgid "Entity Syncronization"
+msgstr "الوحدات المتزامنه"
+
+#. module: cm_entity_sync_odex
+#: model:ir.ui.view,arch_db:cm_entity_sync_odex.view_cm_inter_entity_wizard
+msgid "Generate"
+msgstr "توليــد"
+
+#. module: cm_entity_sync_odex
+#: model:ir.ui.view,arch_db:cm_entity_sync_odex.view_cm_sync_config
+msgid "Generate Key"
+msgstr "توليد مفتاح مزامنة"
+
+#. module: cm_entity_sync_odex
+#: code:addons/cm_entity_sync_odex/models/settings.py:36
+#, python-format
+msgid "Generate new Key"
+msgstr "توليد مفتاح مزامنة جديدة"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_id
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_sync_id
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_update_wizard_id
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_wizard_id
+msgid "ID"
+msgstr "المعرف"
+
+#. module: cm_entity_sync_odex
+#: model:ir.ui.view,arch_db:cm_entity_sync_odex.view_cm_sync_config
+msgid "Inter Entities"
+msgstr "المؤسسات المتزامنة"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_incoming_transaction_inter_entity_id
+msgid "Inter Entity"
+msgstr "مؤسسة متزامنة"
+
+#. module: cm_entity_sync_odex
+#: model:ir.actions.act_window,name:cm_entity_sync_odex.cm_inter_entity_sync_action
+#: model:ir.ui.menu,name:cm_entity_sync_odex.cm_inter_entity_sync_menu
+msgid "Inter Entity Sync"
+msgstr "إعدادات المؤسسات المتزامنة"
+
+#. module: cm_entity_sync_odex
+#: model:ir.ui.view,arch_db:cm_entity_sync_odex.cm_inter_entity_tree
+msgid "Inter-Entities"
+msgstr "المؤسسات المتزامنة"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_entity_inter_entity_code
+msgid "Inter-Entities Code"
+msgstr "رمز التزامن"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_entity_inter_entity_id
+msgid "Inter-Entities Ref"
+msgstr "مرجع المؤسسة المتزامنة"
+
+#. module: cm_entity_sync_odex
+#: model:ir.ui.view,arch_db:cm_entity_sync_odex.cm_inter_entity_form
+msgid "Inter-Entity"
+msgstr "مؤسسة متزامنة"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_entity_is_inter_entity
+msgid "Is Inter-Entity ?"
+msgstr "مؤسسة متزامنة ؟"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_entity_is_master_entity
+msgid "Is Master-Entity ?"
+msgstr "مؤسسة متزمنة رئيسية ؟"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity___last_update
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_sync___last_update
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_update_wizard___last_update
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_wizard___last_update
+msgid "Last Modified on"
+msgstr "آخر تعديل في"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_sync_write_uid
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_update_wizard_write_uid
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_wizard_write_uid
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_write_uid
+msgid "Last Updated by"
+msgstr "آخر تحديث بواسطة"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_sync_write_date
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_update_wizard_write_date
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_wizard_write_date
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_write_date
+msgid "Last Updated on"
+msgstr "آخر تحديث في"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_update_wizard_primary_id
+msgid "Main Server"
+msgstr "الخادم الرئيسي"
+
+#. module: cm_entity_sync_odex
+#: code:addons/cm_entity_sync_odex/controllers/sync.py:290
+#, python-format
+msgid "Message Has been send !"
+msgstr "تم ارسال الرساله"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_uuid
+msgid "Secret Key"
+msgstr "الرمز السري"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_wizard_server_key
+msgid "Server Key"
+msgstr "مفتاح التزامن للسيرفر"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_url
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_wizard_server_url
+msgid "Server URL"
+msgstr "رابط السيرفر"
+
+#. module: cm_entity_sync_odex
+#: code:addons/cm_entity_sync_odex/models/entity.py:165
+#: code:addons/cm_entity_sync_odex/models/entity.py:266
+#: code:addons/cm_entity_sync_odex/models/entity.py:294
+#, python-format
+msgid "Sync Error Cannot Syncronize new key to Server {}, URL \"{}\""
+msgstr "مشكلة في التزامن , غير قادر على مزامنة المفتاح الجديد Server {}, URL \"{}\""
+
+#. module: cm_entity_sync_odex
+#: code:addons/cm_entity_sync_odex/models/entity.py:242
+#, python-format
+msgid "Sync Error Cannot send Transaction to server {}"
+msgstr "مشكلة تزامن , لا يمكن ارسال المعاملة لمخدم {}"
+
+#. module: cm_entity_sync_odex
+#: code:addons/cm_entity_sync_odex/models/entity.py:150
+#, python-format
+msgid "Sync ErrorCannot Syncronize new key to Server {}, URL \"{}\""
+msgstr "مشكلة في التزامن , غير قادر على مزامنة المفتاح الجديد Server {}, URL \"{}\""
+
+#. module: cm_entity_sync_odex
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_sync_sync_key
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_wizard_key
+msgid "Sync Key"
+msgstr "مفتاح التزامن"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_incoming_transaction_syncronized
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_outgoing_transaction_syncronized
+msgid "Syncronized ?"
+msgstr "متزامن ؟"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model,name:cm_entity_sync_odex.model_cm_entity
+msgid "Transactions Contacts"
+msgstr "Transactions Contacts"
+
+#. module: cm_entity_sync_odex
+#: model:ir.ui.view,arch_db:cm_entity_sync_odex.view_cm_inter_entity_update_wizard
+msgid "Update"
+msgstr "تحديث الخوادم"
+
+#. module: cm_entity_sync_odex
+#: code:addons/cm_entity_sync_odex/models/settings.py:63
+#: model:ir.ui.view,arch_db:cm_entity_sync_odex.view_cm_sync_config
+#, python-format
+msgid "Update From ..."
+msgstr "تحديث من ..."
+
+#. module: cm_entity_sync_odex
+#: model:ir.model.fields,field_description:cm_entity_sync_odex.field_cm_inter_entity_update_wizard_server_id
+msgid "Update Server"
+msgstr "خادم التحديث"
+
+#. module: cm_entity_sync_odex
+#: code:addons/cm_entity_sync_odex/models/entity.py:280
+#, python-format
+msgid "You cannot change syncronized entity data !"
+msgstr "لا يمكنك تعديل بيانات المؤسسات المتزامنة !"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model,name:cm_entity_sync_odex.model_cm_inter_entity_update_wizard
+msgid "cm.inter.entity.update.wizard"
+msgstr "cm.inter.entity.update.wizard"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model,name:cm_entity_sync_odex.model_cm_inter_entity_wizard
+msgid "cm.inter.entity.wizard"
+msgstr "cm.inter.entity.wizard"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model,name:cm_entity_sync_odex.model_cm_inter_entity
+msgid "cm.inter_entity"
+msgstr "cm.inter_entity"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model,name:cm_entity_sync_odex.model_incoming_transaction
+msgid "incoming Transaction"
+msgstr "معاملات الوارد الخارجي"
+
+#. module: cm_entity_sync_odex
+#: model:ir.ui.view,arch_db:cm_entity_sync_odex.view_cm_inter_entity_update_wizard
+#: model:ir.ui.view,arch_db:cm_entity_sync_odex.view_cm_inter_entity_wizard
+msgid "or"
+msgstr "أو"
+
+#. module: cm_entity_sync_odex
+#: model:ir.model,name:cm_entity_sync_odex.model_outgoing_transaction
+msgid "outgoing Transaction"
+msgstr "معاملات الصادر الخارجي"
+
+#. module: cm_entity_sync_odex
+#: code:addons/cm_entity_sync_odex/controllers/sync.py:291
+#, python-format
+msgid "{} ← {}.{}"
+msgstr "{} ← {}.{}"
+
diff --git a/odex25_transactions/cm_entity_sync_odex/models/__init__.py b/odex25_transactions/cm_entity_sync_odex/models/__init__.py
new file mode 100644
index 000000000..da014f8d0
--- /dev/null
+++ b/odex25_transactions/cm_entity_sync_odex/models/__init__.py
@@ -0,0 +1,4 @@
+#-*- coding: utf-8 -*-
+from . import entity
+from . import settings
+from . import outgoing
diff --git a/odex25_transactions/cm_entity_sync_odex/models/entity.py b/odex25_transactions/cm_entity_sync_odex/models/entity.py
new file mode 100644
index 000000000..44d966d86
--- /dev/null
+++ b/odex25_transactions/cm_entity_sync_odex/models/entity.py
@@ -0,0 +1,448 @@
+#-*- coding: utf-8 -*-
+import logging
+import uuid
+import requests
+# from odoo import _, api, exceptions, fields, models
+from odoo import models, api, fields,_
+from odoo.exceptions import Warning,AccessError
+
+
+
+_logger = logging.getLogger(__name__)
+
+
+class EntityMatrix(models.Model):
+ _name = 'cm.inter_entity'
+
+ code = fields.Char(string='Code')
+ name = fields.Char(string='Description')
+ url = fields.Char(string='Server URL')
+ uuid = fields.Char(string='Secret Key')
+
+ @api.model
+ def generate_key(self):
+ key = uuid.uuid4()
+ return str(key)
+
+ @api.model
+ def broadcast(self, key=None, url=None, new_key=None):
+ if url.endswith('/'):
+ url = u'{}{}'.format(url[:-1], '/cm/sync/broadcast')
+ else:
+ url = u'{}{}'.format(url, '/cm/sync/broadcast')
+ code = new_key.split('-')[0]
+ company_name = self.env.user.company_id.name
+ new_url = self.env['ir.config_parameter'].sudo(
+ ).get_param('web.base.url')
+ new_url = new_url.replace('http://', 'http://')
+ data = {
+ 'code': code,
+ 'name': company_name,
+ 'url': new_url,
+ 'key': new_key,
+ 'auth': key,
+ }
+ try:
+ json = {
+ 'jsonrpc': '2.0',
+ 'method': 'call',
+ 'id': None,
+ 'params': data,
+ }
+ result = requests.post(url, json=json)
+ r = result.json()
+ if 'success' not in r.get('result', {}):
+ _logger.error(r)
+ return False
+ entities = r.get('result', {}).get('entities', [])
+ handle = []
+ cm_entity = self.env['cm.entity'].sudo()
+ for e in entities:
+ ie = self.sudo().create(e)
+ if len(e.get('entities', [])):
+ for ce in e.get('entities', []):
+ O = ce.copy()
+ O['inter_entity_id'] = ie.id
+ cm_entity.create(O)
+ T = {
+ 'name': ie.name,
+ 'inter_entity_code': e['uuid'].split('-')[0],
+ 'type': 'external',
+ 'is_inter_entity': True,
+ 'is_master_entity': True,
+ 'inter_entity_id': ie.id,
+ }
+ cm_entity.with_context(broadcasted=True).create(T)
+ handle.append((4, ie.id))
+ if handle:
+ sync = self.env['cm.inter_entity.sync'].sudo()
+ setting = sync.search([], limit=1)
+ setting.write({
+ 'entities': handle,
+ })
+
+ except Exception as e:
+ _logger.error(e)
+ return False
+ return True
+
+ @api.model
+ def add_new(self, arch):
+ sync = self.env['cm.inter_entity.sync'].sudo()
+ setting = sync.search([], limit=1)
+ entities = self.sudo().get_entities()
+ entity = self.sudo().create(arch)
+ T = {
+ 'name': arch['name'],
+ 'inter_entity_code': arch['uuid'].split('-')[0],
+ 'type': 'external',
+ 'is_inter_entity': True,
+ 'is_master_entity': True,
+ 'inter_entity_id': entity.id,
+ }
+ self.env['cm.entity'].sudo().with_context(broadcasted=True).create(T)
+ setting.write({
+ 'entities': [(4, entity.id)],
+ })
+ return entities
+
+ @api.model
+ def wrap_jsonrpc(self, data):
+ return {
+ 'jsonrpc': '2.0',
+ 'method': 'call',
+ 'id': None,
+ 'params': data,
+ }
+
+ @api.model
+ def post(self, url, data):
+ result = requests.post(url, json=data)
+
+ return result
+
+ @api.model
+ def is_success(self, result):
+ r = result.json() or {}
+ return 'success' in r.get('result', {})
+
+ @api.model
+ def get_settings(self):
+ sync = self.env['cm.inter_entity.sync'].sudo()
+ setting = sync.search([], limit=1)
+ return setting
+
+ @api.model
+ def sync_new_key(self, key):
+ sync = self.env['cm.inter_entity.sync'].sudo()
+ setting = sync.search([], limit=1)
+ SUBURL = u'/cm/sync/new_key'
+
+ for e in setting.entities.filtered(lambda k: k.uuid != setting.sync_key):
+ data = self.wrap_jsonrpc({
+ 'key': key,
+ 'old': setting.sync_key,
+ 'auth': e.uuid,
+ })
+ url = u'{}{}'.format(e.url, SUBURL)
+ result = self.post(url, data)
+ if not self.is_success(result):
+ raise Warning(_('Sync Error'u'Cannot Syncronize new key to Server {}, URL "{}"').format(e.name, e.url))
+ return True
+
+ @api.model
+ def update_from(self, server):
+ setting = self.sudo().get_settings()
+ SUBURL = u'/cm/sync/update_from'
+
+ data = self.wrap_jsonrpc({
+ 'auth': server.uuid,
+ 'key': setting.sync_key,
+ })
+ url = u'{}{}'.format(server.url, SUBURL)
+ result = self.post(url, data)
+ if not self.is_success(result):
+ raise Warning(_('Sync Error Cannot Syncronize new key to Server {}, URL "{}"').format(server.name, server.url))
+ try:
+ r = result.json()
+ entities = r.get('result', {}).get('entities', [])
+ handle = []
+ cm_entity = self.env['cm.entity'].sudo()
+ for e in entities:
+ exists = setting.entities.filtered(lambda k: k.uuid == e['uuid'])
+ if len(exists):
+ exists.write(e)
+ continue
+ ie = self.sudo().create(e)
+ if len(e.get('entities', [])):
+ for ce in e.get('entities', []):
+ O = ce.copy()
+ O['inter_entity_id'] = ie.id
+ cm_entity.create(O)
+ try:
+ T = {
+ 'name': ie.name,
+ 'inter_entity_code': e['uuid'].split('-')[0],
+ 'type': 'external',
+ 'is_inter_entity': True,
+ 'is_master_entity': True,
+ 'inter_entity_id': ie.id,
+ }
+ cm_entity.with_context(broadcasted=True).create(T)
+ except Exception as e:
+ _logger.error(e)
+ handle.append((4, ie.id))
+ if handle:
+ sync = self.env['cm.inter_entity.sync'].sudo()
+ setting = sync.search([], limit=1)
+ setting.write({
+ 'entities': handle,
+ })
+ except Exception as ee:
+ _logger.error(ee)
+ return False
+ return True
+
+ @api.model
+ def send_transaction(self, trasaction, instance, to_send):
+ setting = self.sudo().get_settings()
+ SUBURL = u'/cm/sync/send_transaction'
+ for e in to_send:
+ # trasaction['to_ids'] = e.inter_entity_code
+ from_id = False
+ K = instance.employee_id
+ K = K.parent_id
+ if K.is_inter_entity:
+ from_id = K
+ # while True:
+ # if not len(K.parent_id):
+ # break
+ # K = K.parent_id
+ # if K.is_inter_entity:
+ # _logger.warning(
+ # '----ccxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccc---------sendtransaction %s',
+ # K.is_inter_entity)
+ # from_id = K
+ # break
+ if from_id:
+ trasaction['from_id'] = from_id.inter_entity_code
+ else:
+ trasaction['from_id'] = False
+ data = self.wrap_jsonrpc({
+ 'data': trasaction,
+ 'key': setting.sync_key,
+ 'code': e.inter_entity_code,
+ 'auth': e.sudo().inter_entity_id.uuid,
+ })
+ url = u'{}{}'.format(e.sudo().inter_entity_id.url, SUBURL)
+ result = self.post(url, data)
+ # 'http://localhost:8069/cm/sync/send_transaction'
+ if not self.is_success(result):
+ _logger.error(result.json())
+ raise Warning(_('Sync Error Cannot send Transaction to server {}').format(e.name))
+
+ @api.model
+ def sync(self, entities):
+ raise NotImplementedError('Not NotImplemented !')
+
+ @api.model
+ def activate(self, arch):
+ raise NotImplementedError('Not NotImplemented !')
+
+ @api.model
+ def push_new(self, vals):
+ """here we have bug"""
+ setting = self.sudo().get_settings()
+ SUBURL = u'/cm/sync/push_new'
+ for e in setting.entities.filtered(lambda k:
+ k.uuid != setting.sync_key):
+ data = self.wrap_jsonrpc({
+ 'data': vals,
+ 'auth': e.uuid,
+ })
+ url = u'{}{}'.format(e.url, SUBURL)
+ result = self.post(url, data)
+ if not self.is_success(result):
+ raise Warning(_('Sync Error Cannot Syncronize new key to Server {}, URL "{}"').format(e.name, e.url))
+ return True
+
+ @api.model
+ def clone(self, entity):
+ raise NotImplementedError('Not NotImplemented !')
+
+ @api.model
+ def update(self, vals):
+ setting = self.sudo().get_settings()
+ if vals['key'] != setting.sync_key:
+ if not vals.get('broadcasted', False) and not vals.get('dont_appear_in_send', False):
+ e = AccessError(_('Access Error'))
+ e.args = (
+ _('Access Error'), _('You cannot change syncronized entity data !'))
+ raise e
+ else:
+ return True
+ SUBURL = u'/cm/sync/update_entity'
+ for e in setting.entities.filtered(lambda k:
+ k.uuid != setting.sync_key):
+ data = self.wrap_jsonrpc({
+ 'data': vals,
+ 'auth': e.uuid,
+ })
+ url = u'{}{}'.format(e.url, SUBURL)
+ result = self.post(url, data)
+ if not self.is_success(result):
+ raise Warning(_('Sync Error Cannot Syncronize new key to Server {}, URL "{}"').format(e.name, e.url))
+ return True
+
+ @api.model
+ def remove(self, vals):
+ raise NotImplementedError('Not NotImplemented !')
+
+ @api.model
+ def get_cm_entities(self, e):
+ entity = self.env['cm.entity'].sudo()
+ entities = entity.search(
+ [('is_inter_entity', '=', True), ('inter_entity_id', '=', e.id)])
+ result = []
+ for ce in entities:
+ result.append({
+ 'inter_entity_code': ce.inter_entity_code,
+ 'name': ce.name,
+ 'code': ce.code,
+ 'type': 'external',
+ 'is_inter_entity': True,
+ })
+ return result
+
+ @api.model
+ def get_entities(self):
+ sync = self.env['cm.inter_entity.sync'].sudo()
+ setting = sync.search([], limit=1)
+ data = []
+ for e in setting.entities:
+ if e.id == setting.server_id.id:
+ cm_entities = self.sudo().get_cm_entities(e)
+ data.append({
+ 'name': e.name,
+ 'code': e.code,
+ 'uuid': e.uuid,
+ 'url': e.url,
+ 'entities': cm_entities,
+ })
+ return data
+
+ @api.model
+ def authenticate(self, key):
+ # add by Fatima 7/5/2020 for clean older code
+ """to check key of entity before sync using in controller method receive key and return true if right key"""
+ sync = self.env['cm.inter_entity.sync'].sudo()
+ setting = sync.search([], limit=1)
+ try:
+ if setting.sync_key == key.strip():
+ return True
+ except Exception as e:
+ return False
+ return False
+
+
+class Entity(models.Model):
+ _inherit = 'cm.entity'
+
+ inter_entity_id = fields.Many2one('cm.inter_entity', string='Inter-Entities Ref')
+ inter_entity_code = fields.Char(
+ string='Inter-Entities Code')
+ is_inter_entity = fields.Boolean(string='Is Inter-Entity ?', help='''
+ If checked, this entity will be syncronized by other entities in the group.
+ ''')
+ is_master_entity = fields.Boolean(string='Is Master-Entity ?', help='''
+ If checked, this entity will be syncronized by other entities in the group.
+ ''')
+
+ @api.model
+ def name_search(self, name='', args=None, operator='ilike', limit=100):
+ args = args or []
+ if not (name == '' and operator == 'ilike'):
+ search = self.env['cm.inter_entity'].sudo().search([('name', 'ilike', name)])
+ if len(search):
+ args += ['|', ('inter_entity_id', 'in', search.ids)]
+ return super(Entity, self).name_search(name=name, args=args, operator=operator, limit=limit)
+
+ def name_get(self):
+ result = []
+ for r in self:
+ if r.is_inter_entity:
+ if r.type == 'external':
+ result.append((r.id, u'{} \u21E6 {}'.format(
+ r.inter_entity_id.name or u'**', r.name)))
+ continue
+ result.append((r.id, r.name))
+ return result
+
+ @api.model
+ def create(self, vals):
+ setting = self.env['cm.inter_entity'].sudo().get_settings()
+ if vals.get('type', False) == 'unit' and vals.get('is_inter_entity', False):
+ if not vals.get('inter_entity_code', False):
+ vals['inter_entity_id'] = setting.server_id.id
+ vals['inter_entity_code'] = u'{}-{}'.format(setting.sync_key.split('-')[0] if setting.sync_key else False,
+ self.env['ir.sequence'].sudo().next_by_code('cm.inter.entity'))
+ obj = super(Entity, self).create(vals)
+ IE = self.env['cm.inter_entity'].sudo()
+ if vals.get('type', False) == 'unit' and vals.get('is_inter_entity', False):
+ if not self.env.context.get('broadcasted', False):
+ IE.push_new({
+ 'data': vals,
+ 'key': setting.sync_key,
+ })
+ return obj
+
+ # def unlink(self, cr, uid, ids, context=None):
+ # return super(Entity, self).unlink(cr, uid, ids, context=context)
+
+ def write(self, vals):
+ data = {}
+ values = vals.copy()
+ is_inter_entity = False
+ setting = self.env['cm.inter_entity'].sudo().get_settings()
+ if vals.get('is_inter_entity', False):
+ values['inter_entity_id'] = setting.server_id.id
+ values['inter_entity_code'] = u'{}-{}'.format(setting.sync_key.split(
+ '-')[0], self.env['ir.sequence'].sudo().next_by_code('cm.inter.entity'))
+ vals['inter_entity_id'] = values['inter_entity_id']
+ vals['inter_entity_code'] = values['inter_entity_code']
+ is_inter_entity = True
+ for r in self:
+ if r.is_inter_entity:
+ data = {
+ 'details': {'code': r.inter_entity_code, 'data': vals},
+ 'key': r.inter_entity_id.uuid,
+ 'broadcasted': vals.get('broadcasted', False)
+ }
+ if not is_inter_entity:
+ data['details']['remove'] = True
+ elif is_inter_entity:
+ vals1 = r.read([])
+ vals1 = vals1[0]
+ lister = [
+ 'name', 'inter_entity_code',
+ 'is_inter_entity',
+ ]
+ vals2, vals3 = {}, {}
+ for l in lister:
+ if l in vals1:
+ vals2[l] = vals1[l]
+ if l in vals:
+ vals3[l] = vals[l]
+ vals2.update(vals3)
+ if vals2:
+ code = vals2.get('inter_entity_code', r.inter_entity_code)
+ data = {
+ 'details': {'code': code, 'data': vals2, 'is_new': True},
+ 'key': setting.sync_key,
+ 'broadcasted': vals.get('broadcasted', False)
+ }
+ u = super(Entity, self).write(values)
+ if data:
+ IE = self.env['cm.inter_entity'].sudo()
+ IE.update(data)
+ return u
diff --git a/odex25_transactions/cm_entity_sync_odex/models/outgoing.py b/odex25_transactions/cm_entity_sync_odex/models/outgoing.py
new file mode 100644
index 000000000..2b77fc85e
--- /dev/null
+++ b/odex25_transactions/cm_entity_sync_odex/models/outgoing.py
@@ -0,0 +1,60 @@
+#-*- coding: utf-8 -*-
+
+import logging
+import base64
+from odoo import api, models, fields, _, exceptions
+
+
+_logger = logging.getLogger(__name__)
+
+
+class Transaction(models.Model):
+ _inherit = 'outgoing.transaction'
+
+ syncronized = fields.Boolean(string='Syncronized ?')
+
+
+ def action_draft(self):
+ super(Transaction, self).action_draft()
+ to_send = []
+ inter_entity = self.env['cm.inter_entity'].sudo()
+ for r in self:
+ r.write({
+ 'syncronized': True,
+ })
+ for e in r.to_ids:
+ if e.is_inter_entity:
+ to_send.append(e)
+ attachment_rule_data = []
+ for attachment in r.attachment_rule_ids:
+ attachment_rule_data.append({
+ 'id': attachment.id if attachment else '',
+ 'file_save': attachment.file_save.decode('utf-8') if attachment.file_save else '',
+ 'attachment_filename': u"".join(u'%s'%attachment.attachment_filename) if attachment.attachment_filename else '',
+ 'outgoing_id': False,
+ 'incoming_transaction_id': r.id if r else False,
+ 'internal_id': False,
+ 'date': attachment.date if attachment.date else '',
+ 'description': attachment.description if attachment.description else '',
+ })
+ if len(to_send):
+ trasaction = {
+ # 'out_date': r.out_date,
+ 'to_ids': None,
+ 'type': 'new',
+ 'subject': r.subject,
+ 'incoming_number': r.name,
+ 'incoming_date': r.transaction_date,
+ 'syncronized': True,
+ 'body': r.body,
+ 'attachment_rule_ids': attachment_rule_data,
+ }
+ inter_entity.send_transaction(trasaction, r, to_send)
+
+
+class Incoming(models.Model):
+ _inherit = 'incoming.transaction'
+
+ syncronized = fields.Boolean(string='Syncronized ?')
+ inter_entity_id = fields.Many2one('cm.inter_entity', string='Inter Entity')
+
diff --git a/odex25_transactions/cm_entity_sync_odex/models/settings.py b/odex25_transactions/cm_entity_sync_odex/models/settings.py
new file mode 100644
index 000000000..aa24733d5
--- /dev/null
+++ b/odex25_transactions/cm_entity_sync_odex/models/settings.py
@@ -0,0 +1,79 @@
+#-*- coding: utf-8 -*-
+'''Doc'''
+import logging
+from odoo import api, models, fields, _
+
+
+_logger = logging.getLogger(__name__)
+
+
+class Sync(models.Model):
+ '''Doc'''
+ _name = 'cm.inter_entity.sync'
+ _description = 'Entity Syncronization'
+
+ activated = fields.Boolean(string='Activate Syncronization')
+ sync_key = fields.Char(string='Sync Key', related='server_id.uuid')
+ server_id = fields.Many2one('cm.inter_entity', string='Current Server', store=True)
+ entities = fields.Many2many(
+ 'cm.inter_entity', 'inter_entity_sync_rel', 'sync_id', 'inter_entity_id')
+
+ important_id = fields.Many2one(
+ 'cm.transaction.important', string='Default Important Degree')
+ subject_type_id = fields.Many2one(
+ 'cm.subject.type', string='Default Transaction Type')
+ employee_id = fields.Many2one(
+ 'cm.entity', string='Default Created By')
+
+ def generate_key(self):
+ '''Doc'''
+ inter_entity = self.env['cm.inter_entity'].sudo()
+ for rec in self:
+ # if not len(rec.entities.filtered(lambda k: k.uuid != rec.sync_key)):
+ # first time
+ return {
+ 'name': _('Generate new Key'),
+ 'view_type': 'form',
+ 'view_mode': 'form',
+ 'res_id': False,
+ 'res_model': 'cm.inter.entity.wizard',
+ 'target': 'new',
+ 'type': 'ir.actions.act_window',
+ 'context': {
+ 'default_document_id': rec.id,
+ 'default_broadcast': True,
+ },
+ }
+ # k = inter_entity.generate_key()
+ # synced = inter_entity.sync_new_key(k)
+ # print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>synced",synced)
+ # if synced:
+ # rec.write({
+ # 'sync_key': k,
+ # })
+
+ def update_from(self):
+ '''Doc'''
+ inter_entity = self.env['cm.inter_entity'].sudo()
+ for rec in self:
+ if len(rec.entities.filtered(lambda k: k.uuid != rec.sync_key)):
+ # first time
+ return {
+ 'name': _('Update From ...'),
+ 'view_type': 'form',
+ 'view_mode': 'form',
+ 'res_id': False,
+ 'res_model': 'cm.inter.entity.update.wizard',
+ 'target': 'new',
+ 'type': 'ir.actions.act_window',
+ 'context': {
+ 'default_document_id': rec.id,
+ 'default_broadcast': True,
+ },
+ }
+ k = inter_entity.generate_key()
+ synced = inter_entity.sync_new_key(k)
+ if synced:
+ rec.write({
+ 'sync_key': k,
+ })
diff --git a/odex25_transactions/cm_entity_sync_odex/security/ir.model.access.csv b/odex25_transactions/cm_entity_sync_odex/security/ir.model.access.csv
new file mode 100644
index 000000000..1283e91b3
--- /dev/null
+++ b/odex25_transactions/cm_entity_sync_odex/security/ir.model.access.csv
@@ -0,0 +1,6 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_inter_objects_manager,access_outgoing_inter_objects_manager,model_cm_inter_entity,exp_transaction_documents.group_cm_employee_group,1,1,1,1
+access_inter_objects_reviewer,access_outgoing_inter_objects_reviewer_manager,model_cm_inter_entity,exp_transaction_documents.group_cm_user,1,1,1,1
+access_inter_objects_unit_manager,access_outgoing_inter_objects_unit_manager,model_cm_inter_entity,exp_transaction_documents.group_cm_reviewer,1,1,1,1
+access_inter_objects_dep,access_outgoing_inter_objects_dep,model_cm_inter_entity,exp_transaction_documents.group_cm_department_manager,1,1,1,1
+access_outgoing_inter_objects_exe,access_outgoing_inter_objects_exe,model_cm_inter_entity,exp_transaction_documents.group_cm_executive_manager,1,1,1,1
diff --git a/odex25_transactions/cm_entity_sync_odex/static/description/icon.png b/odex25_transactions/cm_entity_sync_odex/static/description/icon.png
new file mode 100644
index 000000000..4141f52da
Binary files /dev/null and b/odex25_transactions/cm_entity_sync_odex/static/description/icon.png differ
diff --git a/odex25_transactions/cm_entity_sync_odex/views/actions_and_menus.xml b/odex25_transactions/cm_entity_sync_odex/views/actions_and_menus.xml
new file mode 100644
index 000000000..200d2dcec
--- /dev/null
+++ b/odex25_transactions/cm_entity_sync_odex/views/actions_and_menus.xml
@@ -0,0 +1,15 @@
+
+
+
+ Inter Entity Sync
+ cm.inter_entity.sync
+ form
+
+
+
+
+
+
+
+
diff --git a/odex25_transactions/cm_entity_sync_odex/views/entity_view.xml b/odex25_transactions/cm_entity_sync_odex/views/entity_view.xml
new file mode 100644
index 000000000..ea700e527
--- /dev/null
+++ b/odex25_transactions/cm_entity_sync_odex/views/entity_view.xml
@@ -0,0 +1,60 @@
+
+
+
+
+ cm.inter_entity.tree
+ cm.inter_entity
+
+
+
+
+
+
+
+
+
+
+
+ cm.inter_entity.form
+ cm.inter_entity
+
+
+
+
+
+
+ cm.entity.form
+ cm.entity
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/odex25_transactions/cm_entity_sync_odex/views/settings_view.xml b/odex25_transactions/cm_entity_sync_odex/views/settings_view.xml
new file mode 100644
index 000000000..8172eda88
--- /dev/null
+++ b/odex25_transactions/cm_entity_sync_odex/views/settings_view.xml
@@ -0,0 +1,36 @@
+
+
+
+ CM Settings Ext
+ cm.inter_entity.sync
+
+
+
+
+
+
diff --git a/odex25_transactions/cm_entity_sync_odex/wizards/__init__.py b/odex25_transactions/cm_entity_sync_odex/wizards/__init__.py
new file mode 100644
index 000000000..55b0421ed
--- /dev/null
+++ b/odex25_transactions/cm_entity_sync_odex/wizards/__init__.py
@@ -0,0 +1,2 @@
+#-*- coding: utf-8 -*-
+from . import wizards
diff --git a/odex25_transactions/cm_entity_sync_odex/wizards/inter_entity_wizard.xml b/odex25_transactions/cm_entity_sync_odex/wizards/inter_entity_wizard.xml
new file mode 100644
index 000000000..833b287d2
--- /dev/null
+++ b/odex25_transactions/cm_entity_sync_odex/wizards/inter_entity_wizard.xml
@@ -0,0 +1,53 @@
+
+
+
+ CM - Inter entity Wizard
+ cm.inter.entity.wizard
+
+
+
+
+
+
+ CM - Inter entity Update Wizard
+ cm.inter.entity.update.wizard
+
+
+
+
+
+
diff --git a/odex25_transactions/cm_entity_sync_odex/wizards/wizards.py b/odex25_transactions/cm_entity_sync_odex/wizards/wizards.py
new file mode 100644
index 000000000..4cf9dabf4
--- /dev/null
+++ b/odex25_transactions/cm_entity_sync_odex/wizards/wizards.py
@@ -0,0 +1,72 @@
+# -*- coding: utf-8 -*-
+from odoo import api, models, fields, _, exceptions
+
+import logging
+
+_logger = logging.getLogger(__name__)
+
+
+class AddNew(models.TransientModel):
+ _name = 'cm.inter.entity.wizard'
+
+ document_id = fields.Many2one('cm.inter_entity.sync', string='Document')
+ broadcast = fields.Boolean(string='Broadcast')
+ key = fields.Char(string='Sync Key')
+ server_url = fields.Char('Server URL')
+ server_key = fields.Char(string='Server Key')
+
+ def generate(self):
+ inter_entity = self.env['cm.inter_entity'].sudo()
+ for rec in self:
+ K = inter_entity.generate_key()
+ rec.key = K
+ company_code = K.split('-')[0]
+ company_name = self.env.user.company_id.name
+ company_url = self.env['ir.config_parameter'].sudo(
+ ).get_param('web.base.url')
+ # company_url = company_url.replace('http://', 'https://')
+ synced = inter_entity.sync_new_key(K)
+ if synced:
+ rec.document_id.write({
+ 'sync_key': K,
+ })
+ if rec.broadcast:
+ url = rec.server_url
+ key = rec.server_key
+ added = inter_entity.broadcast(url=url, key=key, new_key=K)
+ if not added:
+ raise exceptions.Warning(_('Broadcast Error !'
+ u'Error While Broadcast new Server, please check server key and url.'))
+ data = {
+ 'name': company_name,
+ 'code': company_code,
+ 'url': company_url,
+ 'uuid': K,
+ }
+ if len(rec.document_id.server_id):
+ rec.document_id.server_id.write({
+ 'uuid': K,
+ 'code': company_code,
+ 'name': company_name,
+ 'url': company_url,
+ })
+ else:
+ entity = inter_entity.create(data)
+ rec.document_id.write({
+ 'server_id': entity.id,
+ 'entities': [(4, entity.id)]
+ })
+
+
+class Update(models.TransientModel):
+ _name = 'cm.inter.entity.update.wizard'
+
+ document_id = fields.Many2one('cm.inter_entity.sync', string='Document')
+ primary_id = fields.Many2one('cm.inter_entity', string='Main Server', related='document_id.server_id', store=True)
+ server_id = fields.Many2one('cm.inter_entity', string='Update Server')
+
+ def update(self):
+ for r in self:
+
+ setting = r.document_id
+ r.primary_id.sudo().update_from(r.server_id)
diff --git a/odex25_transactions/cm_odex_barcode/__init__.py b/odex25_transactions/cm_odex_barcode/__init__.py
new file mode 100644
index 000000000..f5ba686bc
--- /dev/null
+++ b/odex25_transactions/cm_odex_barcode/__init__.py
@@ -0,0 +1,2 @@
+# -*- coding: utf-8 -*-
+from . import models
\ No newline at end of file
diff --git a/odex25_transactions/cm_odex_barcode/__manifest__.py b/odex25_transactions/cm_odex_barcode/__manifest__.py
new file mode 100644
index 000000000..88ba084aa
--- /dev/null
+++ b/odex25_transactions/cm_odex_barcode/__manifest__.py
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# Odex - Communications Management System.
+# Copyright (C) 2018 Expert Co. Ltd. ().
+#
+##############################################################################
+{
+ 'name': 'Communications Management Barcodes Reports',
+ 'version': '0.1',
+ 'sequence': 4,
+ 'author': 'Expert Co. Ltd.',
+ 'category': 'Odex25-Transactions/Odex25-Transactions',
+ 'summary': 'Correspondence Management System',
+ 'description': """
+Odex - Communications Management Reports
+========================================
+ """,
+ 'website': 'http://www.exp-sa.com',
+ 'depends': ['exp_transaction_documents'],
+ 'data': [
+ 'reports/barcodes.xml',
+ 'reports/extend_transaction_detail_report.xml',
+ 'views/transactions_views.xml',
+ 'views/assets.xml',
+ ],
+ 'qweb': [
+ ],
+ 'installable': True,
+ 'auto_install': False,
+ 'application': False,
+}
diff --git a/odex25_transactions/cm_odex_barcode/i18n/ar_SY.po b/odex25_transactions/cm_odex_barcode/i18n/ar_SY.po
new file mode 100644
index 000000000..9426c5699
--- /dev/null
+++ b/odex25_transactions/cm_odex_barcode/i18n/ar_SY.po
@@ -0,0 +1,106 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * cm_odex_barcode
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 11.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-07-13 09:32+0000\n"
+"PO-Revision-Date: 2020-07-13 09:32+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: cm_odex_barcode
+#: model:ir.ui.view,arch_db:cm_odex_barcode.extend_tran_header
+#: model:ir.ui.view,arch_db:cm_odex_barcode.report_transaction_barcode
+msgid "Attachment: "
+msgstr "المرفقات: "
+
+#. module: cm_odex_barcode
+#: model:ir.ui.view,arch_db:cm_odex_barcode.report_transaction_barcode
+msgid "Date: "
+msgstr "التاريخ: "
+
+#. module: cm_odex_barcode
+#: model:ir.ui.view,arch_db:cm_odex_barcode.report_transaction_barcode
+msgid "Reference: "
+msgstr "المرجع: "
+
+#. module: cm_odex_barcode
+#: model:ir.ui.view,arch_db:cm_odex_barcode.extend_tran_header
+msgid "Reference: "
+msgstr "المرجع: "
+
+#. module: cm_odex_barcode
+#: model:ir.ui.view,arch_db:cm_odex_barcode.extend_tran_header
+msgid "\n"
+" Date: "
+msgstr "\n"
+" التاريخ: "
+
+#. module: cm_odex_barcode
+#: model:ir.model.fields,field_description:cm_odex_barcode.field_incoming_transaction_binary_barcode
+#: model:ir.model.fields,field_description:cm_odex_barcode.field_internal_transaction_binary_barcode
+#: model:ir.model.fields,field_description:cm_odex_barcode.field_outgoing_transaction_binary_barcode
+#: model:ir.model.fields,field_description:cm_odex_barcode.field_transaction_transaction_binary_barcode
+msgid "Barcode"
+msgstr "باركود"
+
+#. module: cm_odex_barcode
+#. openerp-web
+#: code:addons/cm_odex_barcode/static/src/js/cm_odex_barcode.js:47
+#, python-format
+msgid "Could not display the selected image."
+msgstr "Could not display the selected image."
+
+#. module: cm_odex_barcode
+#. openerp-web
+#: code:addons/cm_odex_barcode/static/src/js/cm_odex_barcode.js:47
+#, python-format
+msgid "Image"
+msgstr "Image"
+
+#. module: cm_odex_barcode
+#: model:ir.actions.report,name:cm_odex_barcode.act_transaction_in_barcode
+msgid "Incoming Transaction Barcode"
+msgstr "باركود المعاملات الورادة"
+
+#. module: cm_odex_barcode
+#: model:ir.actions.report,name:cm_odex_barcode.act_transaction_internal_barcode
+msgid "Internal Transaction Barcode"
+msgstr "باركود المعاملات الداخلية"
+
+#. module: cm_odex_barcode
+#: model:ir.ui.view,arch_db:cm_odex_barcode.extend_tran_header
+#: model:ir.ui.view,arch_db:cm_odex_barcode.report_transaction_barcode
+msgid "Number:"
+msgstr "رقم المعاملة:"
+
+#. module: cm_odex_barcode
+#: model:ir.actions.report,name:cm_odex_barcode.act_transaction_out_barcode
+msgid "Outgoing Transaction Barcode"
+msgstr "باركود المعاملات الصادره"
+
+#. module: cm_odex_barcode
+#: model:ir.ui.view,arch_db:cm_odex_barcode.form_incoming_barcode_print_button
+#: model:ir.ui.view,arch_db:cm_odex_barcode.form_internal_barcode_print_button
+#: model:ir.ui.view,arch_db:cm_odex_barcode.form_outgoing_barcode_print_button
+msgid "Print Barcode"
+msgstr "طباعة الباركود"
+
+#. module: cm_odex_barcode
+#: model:ir.ui.view,arch_db:cm_odex_barcode.form_incoming_barcode_print_button
+#: model:ir.ui.view,arch_db:cm_odex_barcode.form_internal_barcode_print_button
+#: model:ir.ui.view,arch_db:cm_odex_barcode.form_outgoing_barcode_print_button
+msgid "Review Barcode"
+msgstr "مراجعة الباركود"
+
+#. module: cm_odex_barcode
+#: model:ir.model,name:cm_odex_barcode.model_transaction_transaction
+msgid "for common attribute between transaction"
+msgstr "for common attribute between transaction"
diff --git a/odex25_transactions/cm_odex_barcode/models/__init__.py b/odex25_transactions/cm_odex_barcode/models/__init__.py
new file mode 100644
index 000000000..693be0a74
--- /dev/null
+++ b/odex25_transactions/cm_odex_barcode/models/__init__.py
@@ -0,0 +1,2 @@
+from . import barcode
+from . import arabic_reshaper
\ No newline at end of file
diff --git a/odex25_transactions/cm_odex_barcode/models/arabic_reshaper.py b/odex25_transactions/cm_odex_barcode/models/arabic_reshaper.py
new file mode 100644
index 000000000..a7f3a4165
--- /dev/null
+++ b/odex25_transactions/cm_odex_barcode/models/arabic_reshaper.py
@@ -0,0 +1,359 @@
+# -*- coding: utf-8 -*-
+
+# This work is licensed under the GNU Public License (GPL).
+# To view a copy of this license, visit http://www.gnu.org/copyleft/gpl.html
+
+# Written by Abdullah Diab (mpcabd)
+# Email: mpcabd@gmail.com
+# Website: http://mpcabd.xyz
+
+# Ported and tweaked from Java to Python, from Better Arabic Reshaper
+# [https://github.com/agawish/Better-Arabic-Reshaper/]
+
+# Usage:
+# Install python-bidi [https://github.com/MeirKriheli/python-bidi], can be
+# installed from pip `pip install python-bidi`.
+
+# import arabic_reshaper
+# from bidi.algorithm import get_display
+# reshaped_text = arabic_reshaper.reshape(u'اللغة العربية رائعة')
+# bidi_text = get_display(reshaped_text)
+# Now you can pass `bidi_text` to any function that handles
+# displaying/printing of the text, like writing it to PIL Image or passing
+# it to a PDF generating method.
+
+import re
+
+DEFINED_CHARACTERS_ORGINAL_ALF_UPPER_MDD = u'\u0622'
+DEFINED_CHARACTERS_ORGINAL_ALF_UPPER_HAMAZA = u'\u0623'
+DEFINED_CHARACTERS_ORGINAL_ALF_LOWER_HAMAZA = u'\u0625'
+DEFINED_CHARACTERS_ORGINAL_ALF = u'\u0627'
+DEFINED_CHARACTERS_ORGINAL_LAM = u'\u0644'
+
+LAM_ALEF_GLYPHS = [
+ [u'\u0622', u'\uFEF6', u'\uFEF5'],
+ [u'\u0623', u'\uFEF8', u'\uFEF7'],
+ [u'\u0627', u'\uFEFC', u'\uFEFB'],
+ [u'\u0625', u'\uFEFA', u'\uFEF9']
+]
+
+HARAKAT = [
+ u'\u0600', u'\u0601', u'\u0602', u'\u0603', u'\u0606', u'\u0607', u'\u0608', u'\u0609',
+ u'\u060A', u'\u060B', u'\u060D', u'\u060E', u'\u0610', u'\u0611', u'\u0612', u'\u0613',
+ u'\u0614', u'\u0615', u'\u0616', u'\u0617', u'\u0618', u'\u0619', u'\u061A', u'\u061B',
+ u'\u061E', u'\u061F', u'\u0621', u'\u063B', u'\u063C', u'\u063D', u'\u063E', u'\u063F',
+ u'\u0640', u'\u064B', u'\u064C', u'\u064D', u'\u064E', u'\u064F', u'\u0650', u'\u0651',
+ u'\u0652', u'\u0653', u'\u0654', u'\u0655', u'\u0656', u'\u0657', u'\u0658', u'\u0659',
+ u'\u065A', u'\u065B', u'\u065C', u'\u065D', u'\u065E', u'\u0660', u'\u066A', u'\u066B',
+ u'\u066C', u'\u066F', u'\u0670', u'\u0672', u'\u06D4', u'\u06D5', u'\u06D6', u'\u06D7',
+ u'\u06D8', u'\u06D9', u'\u06DA', u'\u06DB', u'\u06DC', u'\u06DF', u'\u06E0', u'\u06E1',
+ u'\u06E2', u'\u06E3', u'\u06E4', u'\u06E5', u'\u06E6', u'\u06E7', u'\u06E8', u'\u06E9',
+ u'\u06EA', u'\u06EB', u'\u06EC', u'\u06ED', u'\u06EE', u'\u06EF', u'\u06D6', u'\u06D7',
+ u'\u06D8', u'\u06D9', u'\u06DA', u'\u06DB', u'\u06DC', u'\u06DD', u'\u06DE', u'\u06DF',
+ u'\u06F0', u'\u06FD', u'\uFE70', u'\uFE71', u'\uFE72', u'\uFE73', u'\uFE74', u'\uFE75',
+ u'\uFE76', u'\uFE77', u'\uFE78', u'\uFE79', u'\uFE7A', u'\uFE7B', u'\uFE7C', u'\uFE7D',
+ u'\uFE7E', u'\uFE7F', u'\uFC5E', u'\uFC5F', u'\uFC60', u'\uFC61', u'\uFC62', u'\uFC63'
+]
+
+ARABIC_GLYPHS = {
+ u'\u0622': [u'\u0622', u'\uFE81', u'\uFE81', u'\uFE82', u'\uFE82', 2],
+ u'\u0623': [u'\u0623', u'\uFE83', u'\uFE83', u'\uFE84', u'\uFE84', 2],
+ u'\u0624': [u'\u0624', u'\uFE85', u'\uFE85', u'\uFE86', u'\uFE86', 2],
+ u'\u0625': [u'\u0625', u'\uFE87', u'\uFE87', u'\uFE88', u'\uFE88', 2],
+ u'\u0626': [u'\u0626', u'\uFE89', u'\uFE8B', u'\uFE8C', u'\uFE8A', 4],
+ u'\u0627': [u'\u0627', u'\u0627', u'\u0627', u'\uFE8E', u'\uFE8E', 2],
+ u'\u0628': [u'\u0628', u'\uFE8F', u'\uFE91', u'\uFE92', u'\uFE90', 4],
+ u'\u0629': [u'\u0629', u'\uFE93', u'\uFE93', u'\uFE94', u'\uFE94', 2],
+ u'\u062A': [u'\u062A', u'\uFE95', u'\uFE97', u'\uFE98', u'\uFE96', 4],
+ u'\u062B': [u'\u062B', u'\uFE99', u'\uFE9B', u'\uFE9C', u'\uFE9A', 4],
+ u'\u062C': [u'\u062C', u'\uFE9D', u'\uFE9F', u'\uFEA0', u'\uFE9E', 4],
+ u'\u062D': [u'\u062D', u'\uFEA1', u'\uFEA3', u'\uFEA4', u'\uFEA2', 4],
+ u'\u062E': [u'\u062E', u'\uFEA5', u'\uFEA7', u'\uFEA8', u'\uFEA6', 4],
+ u'\u062F': [u'\u062F', u'\uFEA9', u'\uFEA9', u'\uFEAA', u'\uFEAA', 2],
+ u'\u0630': [u'\u0630', u'\uFEAB', u'\uFEAB', u'\uFEAC', u'\uFEAC', 2],
+ u'\u0631': [u'\u0631', u'\uFEAD', u'\uFEAD', u'\uFEAE', u'\uFEAE', 2],
+ u'\u0632': [u'\u0632', u'\uFEAF', u'\uFEAF', u'\uFEB0', u'\uFEB0', 2],
+ u'\u0633': [u'\u0633', u'\uFEB1', u'\uFEB3', u'\uFEB4', u'\uFEB2', 4],
+ u'\u0634': [u'\u0634', u'\uFEB5', u'\uFEB7', u'\uFEB8', u'\uFEB6', 4],
+ u'\u0635': [u'\u0635', u'\uFEB9', u'\uFEBB', u'\uFEBC', u'\uFEBA', 4],
+ u'\u0636': [u'\u0636', u'\uFEBD', u'\uFEBF', u'\uFEC0', u'\uFEBE', 4],
+ u'\u0637': [u'\u0637', u'\uFEC1', u'\uFEC3', u'\uFEC4', u'\uFEC2', 4],
+ u'\u0638': [u'\u0638', u'\uFEC5', u'\uFEC7', u'\uFEC8', u'\uFEC6', 4],
+ u'\u0639': [u'\u0639', u'\uFEC9', u'\uFECB', u'\uFECC', u'\uFECA', 4],
+ u'\u063A': [u'\u063A', u'\uFECD', u'\uFECF', u'\uFED0', u'\uFECE', 4],
+ u'\u0641': [u'\u0641', u'\uFED1', u'\uFED3', u'\uFED4', u'\uFED2', 4],
+ u'\u0642': [u'\u0642', u'\uFED5', u'\uFED7', u'\uFED8', u'\uFED6', 4],
+ u'\u0643': [u'\u0643', u'\uFED9', u'\uFEDB', u'\uFEDC', u'\uFEDA', 4],
+ u'\u0644': [u'\u0644', u'\uFEDD', u'\uFEDF', u'\uFEE0', u'\uFEDE', 4],
+ u'\u0645': [u'\u0645', u'\uFEE1', u'\uFEE3', u'\uFEE4', u'\uFEE2', 4],
+ u'\u0646': [u'\u0646', u'\uFEE5', u'\uFEE7', u'\uFEE8', u'\uFEE6', 4],
+ u'\u0647': [u'\u0647', u'\uFEE9', u'\uFEEB', u'\uFEEC', u'\uFEEA', 4],
+ u'\u0648': [u'\u0648', u'\uFEED', u'\uFEED', u'\uFEEE', u'\uFEEE', 2],
+ u'\u0649': [u'\u0649', u'\uFEEF', u'\uFEEF', u'\uFEF0', u'\uFEF0', 2],
+ u'\u0671': [u'\u0671', u'\u0671', u'\u0671', u'\uFB51', u'\uFB51', 2],
+ u'\u064A': [u'\u064A', u'\uFEF1', u'\uFEF3', u'\uFEF4', u'\uFEF2', 4],
+ u'\u066E': [u'\u066E', u'\uFBE4', u'\uFBE8', u'\uFBE9', u'\uFBE5', 4],
+ u'\u06AA': [u'\u06AA', u'\uFB8E', u'\uFB90', u'\uFB91', u'\uFB8F', 4],
+ u'\u06C1': [u'\u06C1', u'\uFBA6', u'\uFBA8', u'\uFBA9', u'\uFBA7', 4],
+ u'\u06E4': [u'\u06E4', u'\u06E4', u'\u06E4', u'\u06E4', u'\uFEEE', 2],
+ u'\u067E': [u'\u067E', u'\uFB56', u'\uFB58', u'\uFB59', u'\uFB57', 4],
+ u'\u0698': [u'\u0698', u'\uFB8A', u'\uFB8A', u'\uFB8A', u'\uFB8B', 2],
+ u'\u06AF': [u'\u06AF', u'\uFB92', u'\uFB94', u'\uFB95', u'\uFB93', 4],
+ u'\u0686': [u'\u0686', u'\uFB7A', u'\uFB7C', u'\uFB7D', u'\uFB7B', 4],
+ u'\u06A9': [u'\u06A9', u'\uFB8E', u'\uFB90', u'\uFB91', u'\uFB8F', 4],
+ u'\u06CC': [u'\u06CC', u'\uFEEF', u'\uFEF3', u'\uFEF4', u'\uFEF0', 4]
+}
+
+ARABIC_GLYPHS_LIST = [
+ [u'\u0622', u'\uFE81', u'\uFE81', u'\uFE82', u'\uFE82', 2],
+ [u'\u0623', u'\uFE83', u'\uFE83', u'\uFE84', u'\uFE84', 2],
+ [u'\u0624', u'\uFE85', u'\uFE85', u'\uFE86', u'\uFE86', 2],
+ [u'\u0625', u'\uFE87', u'\uFE87', u'\uFE88', u'\uFE88', 2],
+ [u'\u0626', u'\uFE89', u'\uFE8B', u'\uFE8C', u'\uFE8A', 4],
+ [u'\u0627', u'\u0627', u'\u0627', u'\uFE8E', u'\uFE8E', 2],
+ [u'\u0628', u'\uFE8F', u'\uFE91', u'\uFE92', u'\uFE90', 4],
+ [u'\u0629', u'\uFE93', u'\uFE93', u'\uFE94', u'\uFE94', 2],
+ [u'\u062A', u'\uFE95', u'\uFE97', u'\uFE98', u'\uFE96', 4],
+ [u'\u062B', u'\uFE99', u'\uFE9B', u'\uFE9C', u'\uFE9A', 4],
+ [u'\u062C', u'\uFE9D', u'\uFE9F', u'\uFEA0', u'\uFE9E', 4],
+ [u'\u062D', u'\uFEA1', u'\uFEA3', u'\uFEA4', u'\uFEA2', 4],
+ [u'\u062E', u'\uFEA5', u'\uFEA7', u'\uFEA8', u'\uFEA6', 4],
+ [u'\u062F', u'\uFEA9', u'\uFEA9', u'\uFEAA', u'\uFEAA', 2],
+ [u'\u0630', u'\uFEAB', u'\uFEAB', u'\uFEAC', u'\uFEAC', 2],
+ [u'\u0631', u'\uFEAD', u'\uFEAD', u'\uFEAE', u'\uFEAE', 2],
+ [u'\u0632', u'\uFEAF', u'\uFEAF', u'\uFEB0', u'\uFEB0', 2],
+ [u'\u0633', u'\uFEB1', u'\uFEB3', u'\uFEB4', u'\uFEB2', 4],
+ [u'\u0634', u'\uFEB5', u'\uFEB7', u'\uFEB8', u'\uFEB6', 4],
+ [u'\u0635', u'\uFEB9', u'\uFEBB', u'\uFEBC', u'\uFEBA', 4],
+ [u'\u0636', u'\uFEBD', u'\uFEBF', u'\uFEC0', u'\uFEBE', 4],
+ [u'\u0637', u'\uFEC1', u'\uFEC3', u'\uFEC4', u'\uFEC2', 4],
+ [u'\u0638', u'\uFEC5', u'\uFEC7', u'\uFEC8', u'\uFEC6', 4],
+ [u'\u0639', u'\uFEC9', u'\uFECB', u'\uFECC', u'\uFECA', 4],
+ [u'\u063A', u'\uFECD', u'\uFECF', u'\uFED0', u'\uFECE', 4],
+ [u'\u0641', u'\uFED1', u'\uFED3', u'\uFED4', u'\uFED2', 4],
+ [u'\u0642', u'\uFED5', u'\uFED7', u'\uFED8', u'\uFED6', 4],
+ [u'\u0643', u'\uFED9', u'\uFEDB', u'\uFEDC', u'\uFEDA', 4],
+ [u'\u0644', u'\uFEDD', u'\uFEDF', u'\uFEE0', u'\uFEDE', 4],
+ [u'\u0645', u'\uFEE1', u'\uFEE3', u'\uFEE4', u'\uFEE2', 4],
+ [u'\u0646', u'\uFEE5', u'\uFEE7', u'\uFEE8', u'\uFEE6', 4],
+ [u'\u0647', u'\uFEE9', u'\uFEEB', u'\uFEEC', u'\uFEEA', 4],
+ [u'\u0648', u'\uFEED', u'\uFEED', u'\uFEEE', u'\uFEEE', 2],
+ [u'\u0649', u'\uFEEF', u'\uFEEF', u'\uFEF0', u'\uFEF0', 2],
+ [u'\u0671', u'\u0671', u'\u0671', u'\uFB51', u'\uFB51', 2],
+ [u'\u064A', u'\uFEF1', u'\uFEF3', u'\uFEF4', u'\uFEF2', 4],
+ [u'\u066E', u'\uFBE4', u'\uFBE8', u'\uFBE9', u'\uFBE5', 4],
+ [u'\u06AA', u'\uFB8E', u'\uFB90', u'\uFB91', u'\uFB8F', 4],
+ [u'\u06C1', u'\uFBA6', u'\uFBA8', u'\uFBA9', u'\uFBA7', 4],
+ [u'\u067E', u'\uFB56', u'\uFB58', u'\uFB59', u'\uFB57', 4],
+ [u'\u0698', u'\uFB8A', u'\uFB8A', u'\uFB8A', u'\uFB8B', 2],
+ [u'\u06AF', u'\uFB92', u'\uFB94', u'\uFB95', u'\uFB93', 4],
+ [u'\u0686', u'\uFB7A', u'\uFB7C', u'\uFB7D', u'\uFB7B', 4],
+ [u'\u06A9', u'\uFB8E', u'\uFB90', u'\uFB91', u'\uFB8F', 4],
+ [u'\u06CC', u'\uFEEF', u'\uFEF3', u'\uFEF4', u'\uFEF0', 4]
+]
+
+
+def get_reshaped_glyph(target, location):
+ if target in ARABIC_GLYPHS:
+ return ARABIC_GLYPHS[target][location]
+ else:
+ return target
+
+
+def get_glyph_type(target):
+ if target in ARABIC_GLYPHS:
+ return ARABIC_GLYPHS[target][5]
+ else:
+ return 2
+
+
+def is_haraka(target):
+ return target in HARAKAT
+
+
+def replace_jalalah(unshaped_word):
+ return re.sub(u'^\u0627\u0644\u0644\u0647$', u'\uFDF2', unshaped_word)
+
+
+def replace_lam_alef(unshaped_word):
+ list_word = list(unshaped_word)
+ letter_before = u''
+ for i in range(len(unshaped_word)):
+ if not is_haraka(unshaped_word[i]) and unshaped_word[i] != DEFINED_CHARACTERS_ORGINAL_LAM:
+ letter_before = unshaped_word[i]
+
+ if unshaped_word[i] == DEFINED_CHARACTERS_ORGINAL_LAM:
+ candidate_lam = unshaped_word[i]
+ lam_position = i
+ haraka_position = i + 1
+
+ while haraka_position < len(unshaped_word) and is_haraka(unshaped_word[haraka_position]):
+ haraka_position += 1
+
+ if haraka_position < len(unshaped_word):
+ if lam_position > 0 and get_glyph_type(letter_before) > 2:
+ lam_alef = get_lam_alef(
+ list_word[haraka_position], candidate_lam, False)
+ else:
+ lam_alef = get_lam_alef(
+ list_word[haraka_position], candidate_lam, True)
+ if lam_alef != '':
+ list_word[lam_position] = lam_alef
+ list_word[haraka_position] = u' '
+
+ return u''.join(list_word).replace(u' ', u'')
+
+
+def get_lam_alef(candidate_alef, candidate_lam, is_end_of_word):
+ shift_rate = 1
+ reshaped_lam_alef = u''
+ if is_end_of_word:
+ shift_rate += 1
+
+ if DEFINED_CHARACTERS_ORGINAL_LAM == candidate_lam:
+ if DEFINED_CHARACTERS_ORGINAL_ALF_UPPER_MDD == candidate_alef:
+ reshaped_lam_alef = LAM_ALEF_GLYPHS[0][shift_rate]
+
+ if DEFINED_CHARACTERS_ORGINAL_ALF_UPPER_HAMAZA == candidate_alef:
+ reshaped_lam_alef = LAM_ALEF_GLYPHS[1][shift_rate]
+
+ if DEFINED_CHARACTERS_ORGINAL_ALF == candidate_alef:
+ reshaped_lam_alef = LAM_ALEF_GLYPHS[2][shift_rate]
+
+ if DEFINED_CHARACTERS_ORGINAL_ALF_LOWER_HAMAZA == candidate_alef:
+ reshaped_lam_alef = LAM_ALEF_GLYPHS[3][shift_rate]
+
+ return reshaped_lam_alef
+
+
+class DecomposedWord(object):
+
+ def __init__(self, word):
+ self.stripped_harakat = []
+ self.harakat_positions = []
+ self.stripped_regular_letters = []
+ self.letters_position = []
+
+ for i in range(len(word)):
+ c = word[i]
+ if is_haraka(c):
+ self.harakat_positions.append(i)
+ self.stripped_harakat.append(c)
+ else:
+ self.letters_position.append(i)
+ self.stripped_regular_letters.append(c)
+
+ def reconstruct_word(self, reshaped_word):
+ l = list(u'\0' * (len(self.stripped_harakat) + len(reshaped_word)))
+ for i in range(len(self.letters_position)):
+ l[self.letters_position[i]] = reshaped_word[i]
+ for i in range(len(self.harakat_positions)):
+ l[self.harakat_positions[i]] = self.stripped_harakat[i]
+ return u''.join(l)
+
+
+def get_reshaped_word(unshaped_word):
+ unshaped_word = replace_jalalah(unshaped_word)
+ unshaped_word = replace_lam_alef(unshaped_word)
+ decomposed_word = DecomposedWord(unshaped_word)
+ result = u''
+ if decomposed_word.stripped_regular_letters:
+ result = reshape_it(u''.join(decomposed_word.stripped_regular_letters))
+ return decomposed_word.reconstruct_word(result)
+
+
+def reshape_it(unshaped_word):
+ if not unshaped_word:
+ return u''
+ if len(unshaped_word) == 1:
+ return get_reshaped_glyph(unshaped_word[0], 1)
+ reshaped_word = []
+ for i in range(len(unshaped_word)):
+ before = False
+ after = False
+ if i == 0:
+ after = get_glyph_type(unshaped_word[i]) == 4
+ elif i == len(unshaped_word) - 1:
+ before = get_glyph_type(unshaped_word[i - 1]) == 4
+ else:
+ after = get_glyph_type(unshaped_word[i]) == 4
+ before = get_glyph_type(unshaped_word[i - 1]) == 4
+ if after and before:
+ reshaped_word.append(get_reshaped_glyph(unshaped_word[i], 3))
+ elif after and not before:
+ reshaped_word.append(get_reshaped_glyph(unshaped_word[i], 2))
+ elif not after and before:
+ reshaped_word.append(get_reshaped_glyph(unshaped_word[i], 4))
+ elif not after and not before:
+ reshaped_word.append(get_reshaped_glyph(unshaped_word[i], 1))
+
+ return u''.join(reshaped_word)
+
+
+def is_arabic_character(target):
+ return target in ARABIC_GLYPHS or target in HARAKAT
+
+
+def get_words(sentence):
+ if sentence:
+ return re.split('\\s', sentence)
+ return []
+
+
+def has_arabic_letters(word):
+ for c in word:
+ if is_arabic_character(c):
+ return True
+ return False
+
+
+def is_arabic_word(word):
+ for c in word:
+ if not is_arabic_character(c):
+ return False
+ return True
+
+
+def get_words_from_mixed_word(word):
+ temp_word = u''
+ words = []
+ for c in word:
+ if is_arabic_character(c):
+ if temp_word and not is_arabic_word(temp_word):
+ words.append(temp_word)
+ temp_word = c
+ else:
+ temp_word += c
+ else:
+ if temp_word and is_arabic_word(temp_word):
+ words.append(temp_word)
+ temp_word = c
+ else:
+ temp_word += c
+ if temp_word:
+ words.append(temp_word)
+ return words
+
+
+def reshape(text):
+ if text:
+ lines = re.split('\\r?\\n', text)
+ for i in range(len(lines)):
+ lines[i] = reshape_sentence(lines[i])
+ return u'\n'.join(lines)
+ return u''
+
+
+def reshape_sentence(sentence):
+ words = get_words(sentence)
+ for i in range(len(words)):
+ word = words[i]
+ if has_arabic_letters(word):
+ if is_arabic_word(word):
+ words[i] = get_reshaped_word(word)
+ else:
+ mixed_words = get_words_from_mixed_word(word)
+ for j in range(len(mixed_words)):
+ mixed_words[j] = get_reshaped_word(mixed_words[j])
+ words[i] = u''.join(mixed_words)
+ return u' '.join(words)
diff --git a/odex25_transactions/cm_odex_barcode/models/barcode.py b/odex25_transactions/cm_odex_barcode/models/barcode.py
new file mode 100644
index 000000000..2a4d46df5
--- /dev/null
+++ b/odex25_transactions/cm_odex_barcode/models/barcode.py
@@ -0,0 +1,132 @@
+# -*- coding: utf-8 -*-
+
+# import sys
+#
+# # reload(sys)
+# # sys.setdefaultencoding("utf-8")
+import base64
+import os
+from odoo.exceptions import ValidationError
+
+# import barcode as barcode
+from PIL import Image
+from PIL import ImageDraw
+from PIL import ImageFont
+from io import BytesIO
+from pathlib import Path
+from odoo.modules.module import get_module_resource
+
+
+from lxml import etree
+
+import arabic_reshaper
+from bidi.algorithm import get_display
+from odoo import models, api, fields
+from odoo.tools.translate import _
+
+
+# from odoo.osv.orm import setup_modifiers
+
+
+class Transaction(models.Model):
+ _inherit = 'transaction.transaction'
+
+ binary_barcode = fields.Binary(string='Barcode', attachment=True)
+
+ @api.constrains('ean13', 'name', 'transaction_date', 'type')
+ def binary_compute_constraint(self):
+ fonts = [os.path.dirname(__file__) + '/img/KacstOffice.ttf',
+ os.path.dirname(__file__) + '/img/amiri-regular.ttf']
+ img = Image.new("RGBA", (500, 420), "white")
+ draw = ImageDraw.Draw(img)
+ number_word = "الرقم : "
+ number_word_reshaped = arabic_reshaper.reshape(
+ u'' + number_word)
+ number_word_artext = get_display(number_word_reshaped)
+ draw.text((220, 20),
+ number_word_artext, "black",
+ font=ImageFont.truetype(fonts[1], 18))
+
+ number_value = self.name
+ number_value_reshaped = arabic_reshaper.reshape(
+ u'' + number_value if number_value else '')
+ number_value_artext = get_display(number_value_reshaped)
+ draw.text((80, 20),
+ number_value_artext, "black",
+ font=ImageFont.truetype(fonts[1], 18))
+ #
+ date_hijri = "التاريخ : "
+ date_hijri_reshaped = arabic_reshaper.reshape(
+ u'' + date_hijri)
+ date_hijri_artext = get_display(date_hijri_reshaped)
+ draw.text((211, 40),
+ date_hijri_artext, "black",
+ font=ImageFont.truetype(fonts[1], 18))
+
+ date_hijri_value = self.transaction_date_hijri
+ date_hijri_value_reshaped = arabic_reshaper.reshape(
+ u'' + date_hijri_value if date_hijri_value else '')
+ date_hijri_artext = get_display(date_hijri_value_reshaped)
+ draw.text((120, 40),
+ date_hijri_artext.replace('-', '/'), "black",
+ font=ImageFont.truetype(fonts[1], 18))
+
+ date_m = "الموافق : "
+ date_m_reshaped = arabic_reshaper.reshape(
+ u'' + date_m)
+ date_m_artext = get_display(date_m_reshaped)
+ draw.text((210, 65),
+ date_m_artext, "black",
+ font=ImageFont.truetype(fonts[1], 18))
+
+ date_m_value = self.transaction_date
+ date_m_value_reshaped = arabic_reshaper.reshape(
+ u'' + str(date_m_value) if date_m_value else '')
+ date_m_value_artext = get_display(date_m_value_reshaped)
+ draw.text((120, 65),
+ date_m_value_artext.replace('-', '/'), "black",
+ font=ImageFont.truetype(fonts[1], 18))
+
+ attach_m = "المرفقات : "
+ attach_m_reshaped = arabic_reshaper.reshape(
+ u'' + attach_m)
+ date_m_artext = get_display(attach_m_reshaped)
+ draw.text((200, 85),
+ date_m_artext, "black",
+ font=ImageFont.truetype(fonts[1], 18))
+
+ attach_m_value = str(self.attachment_num) if self.attachment_num else '0'
+ attach_m_value_reshaped = arabic_reshaper.reshape(
+ u'' + attach_m_value)
+ attach_mvalue_artext = get_display(attach_m_value_reshaped)
+ draw.text((180, 85),
+ attach_mvalue_artext, "black",
+ font=ImageFont.truetype(fonts[1], 18))
+ # barcode_symbology = options.get('symbology', 'Code128')
+ barcode = self.env['ir.actions.report'].barcode('Code11', self.name, width=250, height=100,
+ humanreadable=0)
+
+
+
+ barcode_buffer = BytesIO(barcode)
+ barcode_image_file = Image.open(barcode_buffer)
+ ImageDraw.Draw(img)
+ buffered = BytesIO()
+ img.paste(barcode_image_file, (20, 110))
+ img.save(buffered, format="png")
+ img_str = base64.b64encode(buffered.getvalue())
+ self.binary_barcode = img_str
+
+
+class AttachmentInherit(models.Model):
+ _inherit = 'ir.attachment'
+
+ # @api.constrains('vals_list')
+ # def create(self, vals_list):
+ # print("***********")
+ # res = super(AttachmentInherit, self).create(vals_list)
+ # print(res.mimetype)
+ # if res.mimetype == 'text/html':
+ # raise ValidationError(_('You cannot inset a html File'))
+ #
+ # return res
diff --git a/odex25_transactions/cm_odex_barcode/models/bidi/__init__.py b/odex25_transactions/cm_odex_barcode/models/bidi/__init__.py
new file mode 100644
index 000000000..149e17fb3
--- /dev/null
+++ b/odex25_transactions/cm_odex_barcode/models/bidi/__init__.py
@@ -0,0 +1,86 @@
+#!/usr/bin/env python
+# This file is part of python-bidi
+#
+# python-bidi is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser 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 Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program. If not, see .
+
+# Copyright (C) 2008-2010 Yaacov Zamir ,
+# Copyright (C) 2010-2015 Meir kriheli .
+
+"""
+Implementation of Unicode Bidirectional Algorithm
+http://www.unicode.org/unicode/reports/tr9/
+"""
+
+VERSION = '0.4.0'
+
+
+def main():
+ """Will be used to create the console script"""
+
+ import optparse
+ import sys
+ import codecs
+ import locale
+ import six
+ from .algorithm import get_display
+
+ parser = optparse.OptionParser()
+
+ parser.add_option('-e', '--encoding',
+ dest='encoding',
+ default='utf-8',
+ type='string',
+ help='Text encoding (default: utf-8)')
+
+ parser.add_option('-u', '--upper-is-rtl',
+ dest='upper_is_rtl',
+ default=False,
+ action='store_true',
+ help="Treat upper case chars as strong 'R' "
+ 'for debugging (default: False).')
+
+ parser.add_option('-d', '--debug',
+ dest='debug',
+ default=False,
+ action='store_true',
+ help="Output to stderr steps taken with the algorithm")
+
+ parser.add_option('-b', '--base-dir',
+ dest='base_dir',
+ default=None,
+ type='string',
+ help="Override base direction [L|R]")
+
+ options, rest = parser.parse_args()
+
+ if options.base_dir and options.base_dir not in 'LR':
+ parser.error('option -b can be L or R')
+
+ # allow unicode in sys.stdout.write
+ if six.PY2:
+ sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout)
+
+ if rest:
+ lines = rest
+ else:
+ lines = sys.stdin
+
+ for line in lines:
+ display = get_display(line, options.encoding, options.upper_is_rtl,
+ options.base_dir, options.debug)
+ # adjust the encoding as unicode, to match the output encoding
+ if not isinstance(display, six.text_type):
+ display = display.decode(options.encoding)
+
+ six.print_(display, end='')
diff --git a/odex25_transactions/cm_odex_barcode/models/bidi/algorithm.py b/odex25_transactions/cm_odex_barcode/models/bidi/algorithm.py
new file mode 100644
index 000000000..bb7cb74ad
--- /dev/null
+++ b/odex25_transactions/cm_odex_barcode/models/bidi/algorithm.py
@@ -0,0 +1,658 @@
+# This file is part of python-bidi
+#
+# python-bidi is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser 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 Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program. If not, see .
+
+# Copyright (C) 2008-2010 Yaacov Zamir ,
+# Copyright (C) 2010-2015 Meir kriheli .
+"bidirectional alogrithm implementation"
+import sys
+
+import inspect
+from collections import deque
+from unicodedata import bidirectional, mirrored
+import six
+
+from .mirror import MIRRORED
+
+
+# Some definitions
+PARAGRAPH_LEVELS = {'L': 0, 'AL': 1, 'R': 1}
+EXPLICIT_LEVEL_LIMIT = 62
+
+
+def _LEAST_GREATER_ODD(x):
+ return (x + 1) | 1
+
+
+def _LEAST_GREATER_EVEN(x):
+ return (x + 2) & ~1
+
+
+X2_X5_MAPPINGS = {
+ 'RLE': (_LEAST_GREATER_ODD, 'N'),
+ 'LRE': (_LEAST_GREATER_EVEN, 'N'),
+ 'RLO': (_LEAST_GREATER_ODD, 'R'),
+ 'LRO': (_LEAST_GREATER_EVEN, 'L'),
+}
+
+# Added 'B' so X6 won't execute in that case and X8 will run it's course
+X6_IGNORED = list(X2_X5_MAPPINGS.keys()) + ['BN', 'PDF', 'B']
+X9_REMOVED = list(X2_X5_MAPPINGS.keys()) + ['BN', 'PDF']
+
+
+def _embedding_direction(x):
+ return ('L', 'R')[x % 2]
+
+
+_IS_UCS2 = sys.maxunicode == 65535
+_SURROGATE_MIN, _SURROGATE_MAX = 55296, 56319 # D800, DBFF
+
+
+def debug_storage(storage, base_info=False, chars=True, runs=False):
+ "Display debug information for the storage"
+
+ import codecs
+ import locale
+ import sys
+
+ if six.PY2:
+ stderr = codecs.getwriter(locale.getpreferredencoding())(sys.stderr)
+ else:
+ stderr = sys.stderr
+
+ caller = inspect.stack()[1][3]
+ stderr.write('in %s\n' % caller)
+
+ if base_info:
+ stderr.write(u' base level : %d\n' % storage['base_level'])
+ stderr.write(u' base dir : %s\n' % storage['base_dir'])
+
+ if runs:
+ stderr.write(u' runs : %s\n' % list(storage['runs']))
+
+ if chars:
+ output = u' Chars : '
+ for _ch in storage['chars']:
+ if _ch != '\n':
+ output += _ch['ch']
+ else:
+ output += 'C'
+ stderr.write(output + u'\n')
+
+ output = u' Res. levels : %s\n' % u''.join(
+ [six.text_type(_ch['level']) for _ch in storage['chars']])
+ stderr.write(output)
+
+ _types = [_ch['type'].ljust(3) for _ch in storage['chars']]
+
+ for i in range(3):
+ if i:
+ output = u' %s\n'
+ else:
+ output = u' Res. types : %s\n'
+ stderr.write(output % u''.join([_t[i] for _t in _types]))
+
+
+def get_base_level(text, upper_is_rtl=False):
+ """Get the paragraph base embedding level. Returns 0 for LTR,
+ 1 for RTL.
+
+ `text` a unicode object.
+
+ Set `upper_is_rtl` to True to treat upper case chars as strong 'R'
+ for debugging (default: False).
+
+ """
+
+ base_level = None
+
+ prev_surrogate = False
+ # P2
+ for _ch in text:
+ # surrogate in case of ucs2
+ if _IS_UCS2 and (_SURROGATE_MIN <= ord(_ch) <= _SURROGATE_MAX):
+ prev_surrogate = _ch
+ continue
+ elif prev_surrogate:
+ _ch = prev_surrogate + _ch
+ prev_surrogate = False
+
+ # treat upper as RTL ?
+ if upper_is_rtl and _ch.isupper():
+ base_level = 1
+ break
+
+ bidi_type = bidirectional(_ch)
+
+ if bidi_type in ('AL', 'R'):
+ base_level = 1
+ break
+
+ elif bidi_type == 'L':
+ base_level = 0
+ break
+
+ # P3
+ if base_level is None:
+ base_level = 0
+
+ return base_level
+
+
+def get_embedding_levels(text, storage, upper_is_rtl=False, debug=False):
+ """Get the paragraph base embedding level and direction,
+ set the storage to the array of chars"""
+
+ prev_surrogate = False
+ base_level = storage['base_level']
+
+ # preset the storage's chars
+ for _ch in text:
+ if _IS_UCS2 and (_SURROGATE_MIN <= ord(_ch) <= _SURROGATE_MAX):
+ prev_surrogate = _ch
+ continue
+ elif prev_surrogate:
+ _ch = prev_surrogate + _ch
+ prev_surrogate = False
+
+ if upper_is_rtl and _ch.isupper():
+ bidi_type = 'R'
+ else:
+ bidi_type = bidirectional(_ch)
+
+ storage['chars'].append({
+ 'ch': _ch,
+ 'level': base_level,
+ 'type': bidi_type,
+ 'orig': bidi_type
+ })
+ if debug:
+ debug_storage(storage, base_info=True)
+
+
+def explicit_embed_and_overrides(storage, debug=False):
+ """Apply X1 to X9 rules of the unicode algorithm.
+
+ See http://unicode.org/reports/tr9/#Explicit_Levels_and_Directions
+
+ """
+ overflow_counter = almost_overflow_counter = 0
+ directional_override = 'N'
+ levels = deque()
+
+ # X1
+ embedding_level = storage['base_level']
+
+ for _ch in storage['chars']:
+ bidi_type = _ch['type']
+
+ level_func, override = X2_X5_MAPPINGS.get(bidi_type, (None, None))
+
+ if level_func:
+ # So this is X2 to X5
+ # if we've past EXPLICIT_LEVEL_LIMIT, note it and do nothing
+
+ if overflow_counter != 0:
+ overflow_counter += 1
+ continue
+
+ new_level = level_func(embedding_level)
+ if new_level < EXPLICIT_LEVEL_LIMIT:
+ levels.append((embedding_level, directional_override))
+ embedding_level, directional_override = new_level, override
+
+ elif embedding_level == EXPLICIT_LEVEL_LIMIT - 2:
+ # The new level is invalid, but a valid level can still be
+ # achieved if this level is 60 and we encounter an RLE or
+ # RLO further on. So record that we 'almost' overflowed.
+ almost_overflow_counter += 1
+
+ else:
+ overflow_counter += 1
+ else:
+ # X6
+ if bidi_type not in X6_IGNORED:
+ _ch['level'] = embedding_level
+ if directional_override != 'N':
+ _ch['type'] = directional_override
+
+ # X7
+ elif bidi_type == 'PDF':
+ if overflow_counter:
+ overflow_counter -= 1
+ elif almost_overflow_counter and \
+ embedding_level != EXPLICIT_LEVEL_LIMIT - 1:
+ almost_overflow_counter -= 1
+ elif levels:
+ embedding_level, directional_override = levels.pop()
+
+ # X8
+ elif bidi_type == 'B':
+ levels.clear()
+ overflow_counter = almost_overflow_counter = 0
+ embedding_level = _ch['level'] = storage['base_level']
+ directional_override = 'N'
+
+ # Removes the explicit embeds and overrides of types
+ # RLE, LRE, RLO, LRO, PDF, and BN. Adjusts extended chars
+ # next and prev as well
+
+ # Applies X9. See http://unicode.org/reports/tr9/#X9
+ storage['chars'] = [_ch for _ch in storage['chars']
+ if _ch['type'] not in X9_REMOVED]
+
+ calc_level_runs(storage)
+
+ if debug:
+ debug_storage(storage, runs=True)
+
+
+def calc_level_runs(storage):
+ """Split the storage to run of char types at the same level.
+
+ Applies X10. See http://unicode.org/reports/tr9/#X10
+ """
+ # run level depends on the higher of the two levels on either side of
+ # the boundary If the higher level is odd, the type is R; otherwise,
+ # it is L
+
+ storage['runs'].clear()
+ chars = storage['chars']
+
+ # empty string ?
+ if not chars:
+ return
+
+ def calc_level_run(b_l, b_r):
+ return ['L', 'R'][max(b_l, b_r) % 2]
+
+ first_char = chars[0]
+
+ sor = calc_level_run(storage['base_level'], first_char['level'])
+ eor = None
+
+ run_start = run_length = 0
+
+ prev_level, prev_type = first_char['level'], first_char['type']
+
+ for _ch in chars:
+ curr_level, curr_type = _ch['level'], _ch['type']
+
+ if curr_level == prev_level:
+ run_length += 1
+ else:
+ eor = calc_level_run(prev_level, curr_level)
+ storage['runs'].append({'sor': sor, 'eor': eor, 'start': run_start,
+ 'type': prev_type, 'length': run_length})
+ sor = eor
+ run_start += run_length
+ run_length = 1
+
+ prev_level, prev_type = curr_level, curr_type
+
+ # for the last char/runlevel
+ eor = calc_level_run(curr_level, storage['base_level'])
+ storage['runs'].append({'sor': sor, 'eor': eor, 'start': run_start,
+ 'type': curr_type, 'length': run_length})
+
+
+def resolve_weak_types(storage, debug=False):
+ """Reslove weak type rules W1 - W3.
+
+ See: http://unicode.org/reports/tr9/#Resolving_Weak_Types
+
+ """
+
+ for run in storage['runs']:
+ prev_strong = prev_type = run['sor']
+ start, length = run['start'], run['length']
+ chars = storage['chars'][start:start + length]
+ for _ch in chars:
+ # W1. Examine each nonspacing mark (NSM) in the level run, and
+ # change the type of the NSM to the type of the previous character.
+ # If the NSM is at the start of the level run, it will get the type
+ # of sor.
+ bidi_type = _ch['type']
+
+ if bidi_type == 'NSM':
+ _ch['type'] = bidi_type = prev_type
+
+ # W2. Search backward from each instance of a European number until
+ # the first strong type (R, L, AL, or sor) is found. If an AL is
+ # found, change the type of the European number to Arabic number.
+ if bidi_type == 'EN' and prev_strong == 'AL':
+ _ch['type'] = 'AN'
+
+ # update prev_strong if needed
+ if bidi_type in ('R', 'L', 'AL'):
+ prev_strong = bidi_type
+
+ prev_type = _ch['type']
+
+ # W3. Change all ALs to R
+ for _ch in chars:
+ if _ch['type'] == 'AL':
+ _ch['type'] = 'R'
+
+ # W4. A single European separator between two European numbers changes
+ # to a European number. A single common separator between two numbers of
+ # the same type changes to that type.
+ for idx in range(1, len(chars) - 1):
+ bidi_type = chars[idx]['type']
+ prev_type = chars[idx - 1]['type']
+ next_type = chars[idx + 1]['type']
+
+ if bidi_type == 'ES' and (prev_type == next_type == 'EN'):
+ chars[idx]['type'] = 'EN'
+
+ if bidi_type == 'CS' and prev_type == next_type and \
+ prev_type in ('AN', 'EN'):
+ chars[idx]['type'] = prev_type
+
+ # W5. A sequence of European terminators adjacent to European numbers
+ # changes to all European numbers.
+ for idx in range(len(chars)):
+ if chars[idx]['type'] == 'EN':
+ for et_idx in range(idx - 1, -1, -1):
+ if chars[et_idx]['type'] == 'ET':
+ chars[et_idx]['type'] = 'EN'
+ else:
+ break
+ for et_idx in range(idx + 1, len(chars)):
+ if chars[et_idx]['type'] == 'ET':
+ chars[et_idx]['type'] = 'EN'
+ else:
+ break
+
+ # W6. Otherwise, separators and terminators change to Other Neutral.
+ for _ch in chars:
+ if _ch['type'] in ('ET', 'ES', 'CS'):
+ _ch['type'] = 'ON'
+
+ # W7. Search backward from each instance of a European number until the
+ # first strong type (R, L, or sor) is found. If an L is found, then
+ # change the type of the European number to L.
+ prev_strong = run['sor']
+ for _ch in chars:
+ if _ch['type'] == 'EN' and prev_strong == 'L':
+ _ch['type'] = 'L'
+
+ if _ch['type'] in ('L', 'R'):
+ prev_strong = _ch['type']
+
+ if debug:
+ debug_storage(storage, runs=True)
+
+
+def resolve_neutral_types(storage, debug):
+ """Resolving neutral types. Implements N1 and N2
+
+ See: http://unicode.org/reports/tr9/#Resolving_Neutral_Types
+
+ """
+
+ for run in storage['runs']:
+ start, length = run['start'], run['length']
+ # use sor and eor
+ chars = [{'type': run['sor']}] + storage['chars'][start:start + length] + \
+ [{'type': run['eor']}]
+ total_chars = len(chars)
+
+ seq_start = None
+ for idx in range(total_chars):
+ _ch = chars[idx]
+ if _ch['type'] in ('B', 'S', 'WS', 'ON'):
+ # N1. A sequence of neutrals takes the direction of the
+ # surrounding strong text if the text on both sides has the same
+ # direction. European and Arabic numbers act as if they were R
+ # in terms of their influence on neutrals. Start-of-level-run
+ # (sor) and end-of-level-run (eor) are used at level run
+ # boundaries.
+ if seq_start is None:
+ seq_start = idx
+ prev_bidi_type = chars[idx - 1]['type']
+ else:
+ if seq_start is not None:
+ next_bidi_type = chars[idx]['type']
+
+ if prev_bidi_type in ('AN', 'EN'):
+ prev_bidi_type = 'R'
+
+ if next_bidi_type in ('AN', 'EN'):
+ next_bidi_type = 'R'
+
+ for seq_idx in range(seq_start, idx):
+ if prev_bidi_type == next_bidi_type:
+ chars[seq_idx]['type'] = prev_bidi_type
+ else:
+ # N2. Any remaining neutrals take the embedding
+ # direction. The embedding direction for the given
+ # neutral character is derived from its embedding
+ # level: L if the character is set to an even level,
+ # and R if the level is odd.
+ chars[seq_idx]['type'] = \
+ _embedding_direction(chars[seq_idx]['level'])
+
+ seq_start = None
+
+ if debug:
+ debug_storage(storage)
+
+
+def resolve_implicit_levels(storage, debug):
+ """Resolving implicit levels (I1, I2)
+
+ See: http://unicode.org/reports/tr9/#Resolving_Implicit_Levels
+
+ """
+ for run in storage['runs']:
+ start, length = run['start'], run['length']
+ chars = storage['chars'][start:start + length]
+
+ for _ch in chars:
+ # only those types are allowed at this stage
+ assert _ch['type'] in ('L', 'R', 'EN', 'AN'), \
+ '%s not allowed here' % _ch['type']
+
+ if _embedding_direction(_ch['level']) == 'L':
+ # I1. For all characters with an even (left-to-right) embedding
+ # direction, those of type R go up one level and those of type
+ # AN or EN go up two levels.
+ if _ch['type'] == 'R':
+ _ch['level'] += 1
+ elif _ch['type'] != 'L':
+ _ch['level'] += 2
+ else:
+ # I2. For all characters with an odd (right-to-left) embedding
+ # direction, those of type L, EN or AN go up one level.
+ if _ch['type'] != 'R':
+ _ch['level'] += 1
+
+ if debug:
+ debug_storage(storage, runs=True)
+
+
+def reverse_contiguous_sequence(chars, line_start, line_end, highest_level,
+ lowest_odd_level):
+ """L2. From the highest level found in the text to the lowest odd
+ level on each line, including intermediate levels not actually
+ present in the text, reverse any contiguous sequence of characters
+ that are at that level or higher.
+
+ """
+ for level in range(highest_level, lowest_odd_level - 1, -1):
+ _start = _end = None
+
+ for run_idx in range(line_start, line_end + 1):
+ run_ch = chars[run_idx]
+
+ if run_ch['level'] >= level:
+ if _start is None:
+ _start = _end = run_idx
+ else:
+ _end = run_idx
+ else:
+ if _end:
+ chars[_start:+_end + 1] = \
+ reversed(chars[_start:+_end + 1])
+ _start = _end = None
+
+ # anything remaining ?
+ if _start is not None:
+ chars[_start:+_end + 1] = \
+ reversed(chars[_start:+_end + 1])
+
+
+def reorder_resolved_levels(storage, debug):
+ """L1 and L2 rules"""
+
+ # Applies L1.
+
+ should_reset = True
+ chars = storage['chars']
+
+ for _ch in chars[::-1]:
+ # L1. On each line, reset the embedding level of the following
+ # characters to the paragraph embedding level:
+ if _ch['orig'] in ('B', 'S'):
+ # 1. Segment separators,
+ # 2. Paragraph separators,
+ _ch['level'] = storage['base_level']
+ should_reset = True
+ elif should_reset and _ch['orig'] in ('BN', 'WS'):
+ # 3. Any sequence of whitespace characters preceding a segment
+ # separator or paragraph separator
+ # 4. Any sequence of white space characters at the end of the
+ # line.
+ _ch['level'] = storage['base_level']
+ else:
+ should_reset = False
+
+ max_len = len(chars)
+
+ # L2 should be per line
+ # Calculates highest level and loweset odd level on the fly.
+
+ line_start = line_end = 0
+ highest_level = 0
+ lowest_odd_level = EXPLICIT_LEVEL_LIMIT
+
+ for idx in range(max_len):
+ _ch = chars[idx]
+
+ # calc the levels
+ char_level = _ch['level']
+ if char_level > highest_level:
+ highest_level = char_level
+
+ if char_level % 2 and char_level < lowest_odd_level:
+ lowest_odd_level = char_level
+
+ if _ch['orig'] == 'B' or idx == max_len - 1:
+ line_end = idx
+ # omit line breaks
+ if _ch['orig'] == 'B':
+ line_end -= 1
+
+ reverse_contiguous_sequence(chars, line_start, line_end,
+ highest_level, lowest_odd_level)
+
+ # reset for next line run
+ line_start = idx + 1
+ highest_level = 0
+ lowest_odd_level = EXPLICIT_LEVEL_LIMIT
+
+ if debug:
+ debug_storage(storage)
+
+
+def apply_mirroring(storage, debug):
+ """Applies L4: mirroring
+
+ See: http://unicode.org/reports/tr9/#L4
+
+ """
+ # L4. A character is depicted by a mirrored glyph if and only if (a) the
+ # resolved directionality of that character is R, and (b) the
+ # Bidi_Mirrored property value of that character is true.
+ for _ch in storage['chars']:
+ unichar = _ch['ch']
+ if mirrored(unichar) and \
+ _embedding_direction(_ch['level']) == 'R':
+ _ch['ch'] = MIRRORED.get(unichar, unichar)
+
+ if debug:
+ debug_storage(storage)
+
+
+def get_empty_storage():
+ """Return an empty storage skeleton, usable for testing"""
+ return {
+ 'base_level': None,
+ 'base_dir': None,
+ 'chars': [],
+ 'runs': deque(),
+ }
+
+
+def get_display(unicode_or_str, encoding='utf-8', upper_is_rtl=False,
+ base_dir=None, debug=False):
+ """Accepts unicode or string. In case it's a string, `encoding`
+ is needed as it works on unicode ones (default:"utf-8").
+
+ Set `upper_is_rtl` to True to treat upper case chars as strong 'R'
+ for debugging (default: False).
+
+ Set `base_dir` to 'L' or 'R' to override the calculated base_level.
+
+ Set `debug` to True to display (using sys.stderr) the steps taken with the
+ algorithm.
+
+ Returns the display layout, either as unicode or `encoding` encoded
+ string.
+
+ """
+ storage = get_empty_storage()
+
+ # utf-8 ? we need unicode
+ if isinstance(unicode_or_str, six.text_type):
+ text = unicode_or_str
+ decoded = False
+ else:
+ text = unicode_or_str.decode(encoding)
+ decoded = True
+
+ if base_dir is None:
+ base_level = get_base_level(text, upper_is_rtl)
+ else:
+ base_level = PARAGRAPH_LEVELS[base_dir]
+
+ storage['base_level'] = base_level
+ storage['base_dir'] = ('L', 'R')[base_level]
+
+ get_embedding_levels(text, storage, upper_is_rtl, debug)
+ explicit_embed_and_overrides(storage, debug)
+ resolve_weak_types(storage, debug)
+ resolve_neutral_types(storage, debug)
+ resolve_implicit_levels(storage, debug)
+ reorder_resolved_levels(storage, debug)
+ apply_mirroring(storage, debug)
+
+ chars = storage['chars']
+ display = u''.join([_ch['ch'] for _ch in chars])
+
+ if decoded:
+ return display.encode(encoding)
+ else:
+ return display
diff --git a/odex25_transactions/cm_odex_barcode/models/bidi/mirror.py b/odex25_transactions/cm_odex_barcode/models/bidi/mirror.py
new file mode 100644
index 000000000..0e70765ca
--- /dev/null
+++ b/odex25_transactions/cm_odex_barcode/models/bidi/mirror.py
@@ -0,0 +1,388 @@
+# This file is part of python-bidi
+#
+# python-bidi is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser 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 Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program. If not, see .
+
+# Copyright (C) 2008-2010 Yaacov Zamir ,
+# Copyright (C) 2010-2015 Meir kriheli .
+"""Mirrored chars"""
+
+# Can't seem to get this data from python's unicode data, so this is imported
+# from http://www.unicode.org/Public/UNIDATA/BidiMirroring.txt
+MIRRORED = {
+ u'\u0028': u'\u0029', # LEFT PARENTHESIS
+ u'\u0029': u'\u0028', # RIGHT PARENTHESIS
+ u'\u003C': u'\u003E', # LESS-THAN SIGN
+ u'\u003E': u'\u003C', # GREATER-THAN SIGN
+ u'\u005B': u'\u005D', # LEFT SQUARE BRACKET
+ u'\u005D': u'\u005B', # RIGHT SQUARE BRACKET
+ u'\u007B': u'\u007D', # LEFT CURLY BRACKET
+ u'\u007D': u'\u007B', # RIGHT CURLY BRACKET
+ u'\u00AB': u'\u00BB', # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ u'\u00BB': u'\u00AB', # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ u'\u0F3A': u'\u0F3B', # TIBETAN MARK GUG RTAGS GYON
+ u'\u0F3B': u'\u0F3A', # TIBETAN MARK GUG RTAGS GYAS
+ u'\u0F3C': u'\u0F3D', # TIBETAN MARK ANG KHANG GYON
+ u'\u0F3D': u'\u0F3C', # TIBETAN MARK ANG KHANG GYAS
+ u'\u169B': u'\u169C', # OGHAM FEATHER MARK
+ u'\u169C': u'\u169B', # OGHAM REVERSED FEATHER MARK
+ u'\u2039': u'\u203A', # SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ u'\u203A': u'\u2039', # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+ u'\u2045': u'\u2046', # LEFT SQUARE BRACKET WITH QUILL
+ u'\u2046': u'\u2045', # RIGHT SQUARE BRACKET WITH QUILL
+ u'\u207D': u'\u207E', # SUPERSCRIPT LEFT PARENTHESIS
+ u'\u207E': u'\u207D', # SUPERSCRIPT RIGHT PARENTHESIS
+ u'\u208D': u'\u208E', # SUBSCRIPT LEFT PARENTHESIS
+ u'\u208E': u'\u208D', # SUBSCRIPT RIGHT PARENTHESIS
+ u'\u2208': u'\u220B', # ELEMENT OF
+ u'\u2209': u'\u220C', # NOT AN ELEMENT OF
+ u'\u220A': u'\u220D', # SMALL ELEMENT OF
+ u'\u220B': u'\u2208', # CONTAINS AS MEMBER
+ u'\u220C': u'\u2209', # DOES NOT CONTAIN AS MEMBER
+ u'\u220D': u'\u220A', # SMALL CONTAINS AS MEMBER
+ u'\u2215': u'\u29F5', # DIVISION SLASH
+ u'\u223C': u'\u223D', # TILDE OPERATOR
+ u'\u223D': u'\u223C', # REVERSED TILDE
+ u'\u2243': u'\u22CD', # ASYMPTOTICALLY EQUAL TO
+ u'\u2252': u'\u2253', # APPROXIMATELY EQUAL TO OR THE IMAGE OF
+ u'\u2253': u'\u2252', # IMAGE OF OR APPROXIMATELY EQUAL TO
+ u'\u2254': u'\u2255', # COLON EQUALS
+ u'\u2255': u'\u2254', # EQUALS COLON
+ u'\u2264': u'\u2265', # LESS-THAN OR EQUAL TO
+ u'\u2265': u'\u2264', # GREATER-THAN OR EQUAL TO
+ u'\u2266': u'\u2267', # LESS-THAN OVER EQUAL TO
+ u'\u2267': u'\u2266', # GREATER-THAN OVER EQUAL TO
+ u'\u2268': u'\u2269', # [BEST FIT] LESS-THAN BUT NOT EQUAL TO
+ u'\u2269': u'\u2268', # [BEST FIT] GREATER-THAN BUT NOT EQUAL TO
+ u'\u226A': u'\u226B', # MUCH LESS-THAN
+ u'\u226B': u'\u226A', # MUCH GREATER-THAN
+ u'\u226E': u'\u226F', # [BEST FIT] NOT LESS-THAN
+ u'\u226F': u'\u226E', # [BEST FIT] NOT GREATER-THAN
+ u'\u2270': u'\u2271', # [BEST FIT] NEITHER LESS-THAN NOR EQUAL TO
+ u'\u2271': u'\u2270', # [BEST FIT] NEITHER GREATER-THAN NOR EQUAL TO
+ u'\u2272': u'\u2273', # [BEST FIT] LESS-THAN OR EQUIVALENT TO
+ u'\u2273': u'\u2272', # [BEST FIT] GREATER-THAN OR EQUIVALENT TO
+ u'\u2274': u'\u2275', # [BEST FIT] NEITHER LESS-THAN NOR EQUIVALENT TO
+ u'\u2275': u'\u2274', # [BEST FIT] NEITHER GREATER-THAN NOR EQUIVALENT TO
+ u'\u2276': u'\u2277', # LESS-THAN OR GREATER-THAN
+ u'\u2277': u'\u2276', # GREATER-THAN OR LESS-THAN
+ u'\u2278': u'\u2279', # [BEST FIT] NEITHER LESS-THAN NOR GREATER-THAN
+ u'\u2279': u'\u2278', # [BEST FIT] NEITHER GREATER-THAN NOR LESS-THAN
+ u'\u227A': u'\u227B', # PRECEDES
+ u'\u227B': u'\u227A', # SUCCEEDS
+ u'\u227C': u'\u227D', # PRECEDES OR EQUAL TO
+ u'\u227D': u'\u227C', # SUCCEEDS OR EQUAL TO
+ u'\u227E': u'\u227F', # [BEST FIT] PRECEDES OR EQUIVALENT TO
+ u'\u227F': u'\u227E', # [BEST FIT] SUCCEEDS OR EQUIVALENT TO
+ u'\u2280': u'\u2281', # [BEST FIT] DOES NOT PRECEDE
+ u'\u2281': u'\u2280', # [BEST FIT] DOES NOT SUCCEED
+ u'\u2282': u'\u2283', # SUBSET OF
+ u'\u2283': u'\u2282', # SUPERSET OF
+ u'\u2284': u'\u2285', # [BEST FIT] NOT A SUBSET OF
+ u'\u2285': u'\u2284', # [BEST FIT] NOT A SUPERSET OF
+ u'\u2286': u'\u2287', # SUBSET OF OR EQUAL TO
+ u'\u2287': u'\u2286', # SUPERSET OF OR EQUAL TO
+ u'\u2288': u'\u2289', # [BEST FIT] NEITHER A SUBSET OF NOR EQUAL TO
+ u'\u2289': u'\u2288', # [BEST FIT] NEITHER A SUPERSET OF NOR EQUAL TO
+ u'\u228A': u'\u228B', # [BEST FIT] SUBSET OF WITH NOT EQUAL TO
+ u'\u228B': u'\u228A', # [BEST FIT] SUPERSET OF WITH NOT EQUAL TO
+ u'\u228F': u'\u2290', # SQUARE IMAGE OF
+ u'\u2290': u'\u228F', # SQUARE ORIGINAL OF
+ u'\u2291': u'\u2292', # SQUARE IMAGE OF OR EQUAL TO
+ u'\u2292': u'\u2291', # SQUARE ORIGINAL OF OR EQUAL TO
+ u'\u2298': u'\u29B8', # CIRCLED DIVISION SLASH
+ u'\u22A2': u'\u22A3', # RIGHT TACK
+ u'\u22A3': u'\u22A2', # LEFT TACK
+ u'\u22A6': u'\u2ADE', # ASSERTION
+ u'\u22A8': u'\u2AE4', # TRUE
+ u'\u22A9': u'\u2AE3', # FORCES
+ u'\u22AB': u'\u2AE5', # DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+ u'\u22B0': u'\u22B1', # PRECEDES UNDER RELATION
+ u'\u22B1': u'\u22B0', # SUCCEEDS UNDER RELATION
+ u'\u22B2': u'\u22B3', # NORMAL SUBGROUP OF
+ u'\u22B3': u'\u22B2', # CONTAINS AS NORMAL SUBGROUP
+ u'\u22B4': u'\u22B5', # NORMAL SUBGROUP OF OR EQUAL TO
+ u'\u22B5': u'\u22B4', # CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+ u'\u22B6': u'\u22B7', # ORIGINAL OF
+ u'\u22B7': u'\u22B6', # IMAGE OF
+ u'\u22C9': u'\u22CA', # LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+ u'\u22CA': u'\u22C9', # RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+ u'\u22CB': u'\u22CC', # LEFT SEMIDIRECT PRODUCT
+ u'\u22CC': u'\u22CB', # RIGHT SEMIDIRECT PRODUCT
+ u'\u22CD': u'\u2243', # REVERSED TILDE EQUALS
+ u'\u22D0': u'\u22D1', # DOUBLE SUBSET
+ u'\u22D1': u'\u22D0', # DOUBLE SUPERSET
+ u'\u22D6': u'\u22D7', # LESS-THAN WITH DOT
+ u'\u22D7': u'\u22D6', # GREATER-THAN WITH DOT
+ u'\u22D8': u'\u22D9', # VERY MUCH LESS-THAN
+ u'\u22D9': u'\u22D8', # VERY MUCH GREATER-THAN
+ u'\u22DA': u'\u22DB', # LESS-THAN EQUAL TO OR GREATER-THAN
+ u'\u22DB': u'\u22DA', # GREATER-THAN EQUAL TO OR LESS-THAN
+ u'\u22DC': u'\u22DD', # EQUAL TO OR LESS-THAN
+ u'\u22DD': u'\u22DC', # EQUAL TO OR GREATER-THAN
+ u'\u22DE': u'\u22DF', # EQUAL TO OR PRECEDES
+ u'\u22DF': u'\u22DE', # EQUAL TO OR SUCCEEDS
+ u'\u22E0': u'\u22E1', # [BEST FIT] DOES NOT PRECEDE OR EQUAL
+ u'\u22E1': u'\u22E0', # [BEST FIT] DOES NOT SUCCEED OR EQUAL
+ u'\u22E2': u'\u22E3', # [BEST FIT] NOT SQUARE IMAGE OF OR EQUAL TO
+ u'\u22E3': u'\u22E2', # [BEST FIT] NOT SQUARE ORIGINAL OF OR EQUAL TO
+ u'\u22E4': u'\u22E5', # [BEST FIT] SQUARE IMAGE OF OR NOT EQUAL TO
+ u'\u22E5': u'\u22E4', # [BEST FIT] SQUARE ORIGINAL OF OR NOT EQUAL TO
+ u'\u22E6': u'\u22E7', # [BEST FIT] LESS-THAN BUT NOT EQUIVALENT TO
+ u'\u22E7': u'\u22E6', # [BEST FIT] GREATER-THAN BUT NOT EQUIVALENT TO
+ u'\u22E8': u'\u22E9', # [BEST FIT] PRECEDES BUT NOT EQUIVALENT TO
+ u'\u22E9': u'\u22E8', # [BEST FIT] SUCCEEDS BUT NOT EQUIVALENT TO
+ u'\u22EA': u'\u22EB', # [BEST FIT] NOT NORMAL SUBGROUP OF
+ u'\u22EB': u'\u22EA', # [BEST FIT] DOES NOT CONTAIN AS NORMAL SUBGROUP
+ u'\u22EC': u'\u22ED', # [BEST FIT] NOT NORMAL SUBGROUP OF OR EQUAL TO
+ # [BEST FIT] DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+ u'\u22ED': u'\u22EC',
+ u'\u22F0': u'\u22F1', # UP RIGHT DIAGONAL ELLIPSIS
+ u'\u22F1': u'\u22F0', # DOWN RIGHT DIAGONAL ELLIPSIS
+ u'\u22F2': u'\u22FA', # ELEMENT OF WITH LONG HORIZONTAL STROKE
+ u'\u22F3': u'\u22FB', # ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+ u'\u22F4': u'\u22FC', # SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+ u'\u22F6': u'\u22FD', # ELEMENT OF WITH OVERBAR
+ u'\u22F7': u'\u22FE', # SMALL ELEMENT OF WITH OVERBAR
+ u'\u22FA': u'\u22F2', # CONTAINS WITH LONG HORIZONTAL STROKE
+ u'\u22FB': u'\u22F3', # CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+ u'\u22FC': u'\u22F4', # SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+ u'\u22FD': u'\u22F6', # CONTAINS WITH OVERBAR
+ u'\u22FE': u'\u22F7', # SMALL CONTAINS WITH OVERBAR
+ u'\u2308': u'\u2309', # LEFT CEILING
+ u'\u2309': u'\u2308', # RIGHT CEILING
+ u'\u230A': u'\u230B', # LEFT FLOOR
+ u'\u230B': u'\u230A', # RIGHT FLOOR
+ u'\u2329': u'\u232A', # LEFT-POINTING ANGLE BRACKET
+ u'\u232A': u'\u2329', # RIGHT-POINTING ANGLE BRACKET
+ u'\u2768': u'\u2769', # MEDIUM LEFT PARENTHESIS ORNAMENT
+ u'\u2769': u'\u2768', # MEDIUM RIGHT PARENTHESIS ORNAMENT
+ u'\u276A': u'\u276B', # MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
+ u'\u276B': u'\u276A', # MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
+ u'\u276C': u'\u276D', # MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
+ u'\u276D': u'\u276C', # MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
+ u'\u276E': u'\u276F', # HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
+ u'\u276F': u'\u276E', # HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
+ u'\u2770': u'\u2771', # HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
+ u'\u2771': u'\u2770', # HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
+ u'\u2772': u'\u2773', # LIGHT LEFT TORTOISE SHELL BRACKET
+ u'\u2773': u'\u2772', # LIGHT RIGHT TORTOISE SHELL BRACKET
+ u'\u2774': u'\u2775', # MEDIUM LEFT CURLY BRACKET ORNAMENT
+ u'\u2775': u'\u2774', # MEDIUM RIGHT CURLY BRACKET ORNAMENT
+ u'\u27C3': u'\u27C4', # OPEN SUBSET
+ u'\u27C4': u'\u27C3', # OPEN SUPERSET
+ u'\u27C5': u'\u27C6', # LEFT S-SHAPED BAG DELIMITER
+ u'\u27C6': u'\u27C5', # RIGHT S-SHAPED BAG DELIMITER
+ u'\u27C8': u'\u27C9', # REVERSE SOLIDUS PRECEDING SUBSET
+ u'\u27C9': u'\u27C8', # SUPERSET PRECEDING SOLIDUS
+ u'\u27D5': u'\u27D6', # LEFT OUTER JOIN
+ u'\u27D6': u'\u27D5', # RIGHT OUTER JOIN
+ u'\u27DD': u'\u27DE', # LONG RIGHT TACK
+ u'\u27DE': u'\u27DD', # LONG LEFT TACK
+ u'\u27E2': u'\u27E3', # WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK
+ u'\u27E3': u'\u27E2', # WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK
+ u'\u27E4': u'\u27E5', # WHITE SQUARE WITH LEFTWARDS TICK
+ u'\u27E5': u'\u27E4', # WHITE SQUARE WITH RIGHTWARDS TICK
+ u'\u27E6': u'\u27E7', # MATHEMATICAL LEFT WHITE SQUARE BRACKET
+ u'\u27E7': u'\u27E6', # MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+ u'\u27E8': u'\u27E9', # MATHEMATICAL LEFT ANGLE BRACKET
+ u'\u27E9': u'\u27E8', # MATHEMATICAL RIGHT ANGLE BRACKET
+ u'\u27EA': u'\u27EB', # MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+ u'\u27EB': u'\u27EA', # MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+ u'\u27EC': u'\u27ED', # MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET
+ u'\u27ED': u'\u27EC', # MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET
+ u'\u27EE': u'\u27EF', # MATHEMATICAL LEFT FLATTENED PARENTHESIS
+ u'\u27EF': u'\u27EE', # MATHEMATICAL RIGHT FLATTENED PARENTHESIS
+ u'\u2983': u'\u2984', # LEFT WHITE CURLY BRACKET
+ u'\u2984': u'\u2983', # RIGHT WHITE CURLY BRACKET
+ u'\u2985': u'\u2986', # LEFT WHITE PARENTHESIS
+ u'\u2986': u'\u2985', # RIGHT WHITE PARENTHESIS
+ u'\u2987': u'\u2988', # Z NOTATION LEFT IMAGE BRACKET
+ u'\u2988': u'\u2987', # Z NOTATION RIGHT IMAGE BRACKET
+ u'\u2989': u'\u298A', # Z NOTATION LEFT BINDING BRACKET
+ u'\u298A': u'\u2989', # Z NOTATION RIGHT BINDING BRACKET
+ u'\u298B': u'\u298C', # LEFT SQUARE BRACKET WITH UNDERBAR
+ u'\u298C': u'\u298B', # RIGHT SQUARE BRACKET WITH UNDERBAR
+ u'\u298D': u'\u2990', # LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+ u'\u298E': u'\u298F', # RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+ u'\u298F': u'\u298E', # LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+ u'\u2990': u'\u298D', # RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+ u'\u2991': u'\u2992', # LEFT ANGLE BRACKET WITH DOT
+ u'\u2992': u'\u2991', # RIGHT ANGLE BRACKET WITH DOT
+ u'\u2993': u'\u2994', # LEFT ARC LESS-THAN BRACKET
+ u'\u2994': u'\u2993', # RIGHT ARC GREATER-THAN BRACKET
+ u'\u2995': u'\u2996', # DOUBLE LEFT ARC GREATER-THAN BRACKET
+ u'\u2996': u'\u2995', # DOUBLE RIGHT ARC LESS-THAN BRACKET
+ u'\u2997': u'\u2998', # LEFT BLACK TORTOISE SHELL BRACKET
+ u'\u2998': u'\u2997', # RIGHT BLACK TORTOISE SHELL BRACKET
+ u'\u29B8': u'\u2298', # CIRCLED REVERSE SOLIDUS
+ u'\u29C0': u'\u29C1', # CIRCLED LESS-THAN
+ u'\u29C1': u'\u29C0', # CIRCLED GREATER-THAN
+ u'\u29C4': u'\u29C5', # SQUARED RISING DIAGONAL SLASH
+ u'\u29C5': u'\u29C4', # SQUARED FALLING DIAGONAL SLASH
+ u'\u29CF': u'\u29D0', # LEFT TRIANGLE BESIDE VERTICAL BAR
+ u'\u29D0': u'\u29CF', # VERTICAL BAR BESIDE RIGHT TRIANGLE
+ u'\u29D1': u'\u29D2', # BOWTIE WITH LEFT HALF BLACK
+ u'\u29D2': u'\u29D1', # BOWTIE WITH RIGHT HALF BLACK
+ u'\u29D4': u'\u29D5', # TIMES WITH LEFT HALF BLACK
+ u'\u29D5': u'\u29D4', # TIMES WITH RIGHT HALF BLACK
+ u'\u29D8': u'\u29D9', # LEFT WIGGLY FENCE
+ u'\u29D9': u'\u29D8', # RIGHT WIGGLY FENCE
+ u'\u29DA': u'\u29DB', # LEFT DOUBLE WIGGLY FENCE
+ u'\u29DB': u'\u29DA', # RIGHT DOUBLE WIGGLY FENCE
+ u'\u29F5': u'\u2215', # REVERSE SOLIDUS OPERATOR
+ u'\u29F8': u'\u29F9', # BIG SOLIDUS
+ u'\u29F9': u'\u29F8', # BIG REVERSE SOLIDUS
+ u'\u29FC': u'\u29FD', # LEFT-POINTING CURVED ANGLE BRACKET
+ u'\u29FD': u'\u29FC', # RIGHT-POINTING CURVED ANGLE BRACKET
+ u'\u2A2B': u'\u2A2C', # MINUS SIGN WITH FALLING DOTS
+ u'\u2A2C': u'\u2A2B', # MINUS SIGN WITH RISING DOTS
+ u'\u2A2D': u'\u2A2E', # PLUS SIGN IN LEFT HALF CIRCLE
+ u'\u2A2E': u'\u2A2D', # PLUS SIGN IN RIGHT HALF CIRCLE
+ u'\u2A34': u'\u2A35', # MULTIPLICATION SIGN IN LEFT HALF CIRCLE
+ u'\u2A35': u'\u2A34', # MULTIPLICATION SIGN IN RIGHT HALF CIRCLE
+ u'\u2A3C': u'\u2A3D', # INTERIOR PRODUCT
+ u'\u2A3D': u'\u2A3C', # RIGHTHAND INTERIOR PRODUCT
+ u'\u2A64': u'\u2A65', # Z NOTATION DOMAIN ANTIRESTRICTION
+ u'\u2A65': u'\u2A64', # Z NOTATION RANGE ANTIRESTRICTION
+ u'\u2A79': u'\u2A7A', # LESS-THAN WITH CIRCLE INSIDE
+ u'\u2A7A': u'\u2A79', # GREATER-THAN WITH CIRCLE INSIDE
+ u'\u2A7D': u'\u2A7E', # LESS-THAN OR SLANTED EQUAL TO
+ u'\u2A7E': u'\u2A7D', # GREATER-THAN OR SLANTED EQUAL TO
+ u'\u2A7F': u'\u2A80', # LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+ u'\u2A80': u'\u2A7F', # GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+ u'\u2A81': u'\u2A82', # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+ u'\u2A82': u'\u2A81', # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+ u'\u2A83': u'\u2A84', # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT
+ u'\u2A84': u'\u2A83', # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT
+ u'\u2A8B': u'\u2A8C', # LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
+ u'\u2A8C': u'\u2A8B', # GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
+ u'\u2A91': u'\u2A92', # LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL
+ u'\u2A92': u'\u2A91', # GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL
+ # LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL
+ u'\u2A93': u'\u2A94',
+ # GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL
+ u'\u2A94': u'\u2A93',
+ u'\u2A95': u'\u2A96', # SLANTED EQUAL TO OR LESS-THAN
+ u'\u2A96': u'\u2A95', # SLANTED EQUAL TO OR GREATER-THAN
+ u'\u2A97': u'\u2A98', # SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE
+ u'\u2A98': u'\u2A97', # SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE
+ u'\u2A99': u'\u2A9A', # DOUBLE-LINE EQUAL TO OR LESS-THAN
+ u'\u2A9A': u'\u2A99', # DOUBLE-LINE EQUAL TO OR GREATER-THAN
+ u'\u2A9B': u'\u2A9C', # DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN
+ u'\u2A9C': u'\u2A9B', # DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN
+ u'\u2AA1': u'\u2AA2', # DOUBLE NESTED LESS-THAN
+ u'\u2AA2': u'\u2AA1', # DOUBLE NESTED GREATER-THAN
+ u'\u2AA6': u'\u2AA7', # LESS-THAN CLOSED BY CURVE
+ u'\u2AA7': u'\u2AA6', # GREATER-THAN CLOSED BY CURVE
+ u'\u2AA8': u'\u2AA9', # LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+ u'\u2AA9': u'\u2AA8', # GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+ u'\u2AAA': u'\u2AAB', # SMALLER THAN
+ u'\u2AAB': u'\u2AAA', # LARGER THAN
+ u'\u2AAC': u'\u2AAD', # SMALLER THAN OR EQUAL TO
+ u'\u2AAD': u'\u2AAC', # LARGER THAN OR EQUAL TO
+ u'\u2AAF': u'\u2AB0', # PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+ u'\u2AB0': u'\u2AAF', # SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+ u'\u2AB3': u'\u2AB4', # PRECEDES ABOVE EQUALS SIGN
+ u'\u2AB4': u'\u2AB3', # SUCCEEDS ABOVE EQUALS SIGN
+ u'\u2ABB': u'\u2ABC', # DOUBLE PRECEDES
+ u'\u2ABC': u'\u2ABB', # DOUBLE SUCCEEDS
+ u'\u2ABD': u'\u2ABE', # SUBSET WITH DOT
+ u'\u2ABE': u'\u2ABD', # SUPERSET WITH DOT
+ u'\u2ABF': u'\u2AC0', # SUBSET WITH PLUS SIGN BELOW
+ u'\u2AC0': u'\u2ABF', # SUPERSET WITH PLUS SIGN BELOW
+ u'\u2AC1': u'\u2AC2', # SUBSET WITH MULTIPLICATION SIGN BELOW
+ u'\u2AC2': u'\u2AC1', # SUPERSET WITH MULTIPLICATION SIGN BELOW
+ u'\u2AC3': u'\u2AC4', # SUBSET OF OR EQUAL TO WITH DOT ABOVE
+ u'\u2AC4': u'\u2AC3', # SUPERSET OF OR EQUAL TO WITH DOT ABOVE
+ u'\u2AC5': u'\u2AC6', # SUBSET OF ABOVE EQUALS SIGN
+ u'\u2AC6': u'\u2AC5', # SUPERSET OF ABOVE EQUALS SIGN
+ u'\u2ACD': u'\u2ACE', # SQUARE LEFT OPEN BOX OPERATOR
+ u'\u2ACE': u'\u2ACD', # SQUARE RIGHT OPEN BOX OPERATOR
+ u'\u2ACF': u'\u2AD0', # CLOSED SUBSET
+ u'\u2AD0': u'\u2ACF', # CLOSED SUPERSET
+ u'\u2AD1': u'\u2AD2', # CLOSED SUBSET OR EQUAL TO
+ u'\u2AD2': u'\u2AD1', # CLOSED SUPERSET OR EQUAL TO
+ u'\u2AD3': u'\u2AD4', # SUBSET ABOVE SUPERSET
+ u'\u2AD4': u'\u2AD3', # SUPERSET ABOVE SUBSET
+ u'\u2AD5': u'\u2AD6', # SUBSET ABOVE SUBSET
+ u'\u2AD6': u'\u2AD5', # SUPERSET ABOVE SUPERSET
+ u'\u2ADE': u'\u22A6', # SHORT LEFT TACK
+ u'\u2AE3': u'\u22A9', # DOUBLE VERTICAL BAR LEFT TURNSTILE
+ u'\u2AE4': u'\u22A8', # VERTICAL BAR DOUBLE LEFT TURNSTILE
+ u'\u2AE5': u'\u22AB', # DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE
+ u'\u2AEC': u'\u2AED', # DOUBLE STROKE NOT SIGN
+ u'\u2AED': u'\u2AEC', # REVERSED DOUBLE STROKE NOT SIGN
+ u'\u2AF7': u'\u2AF8', # TRIPLE NESTED LESS-THAN
+ u'\u2AF8': u'\u2AF7', # TRIPLE NESTED GREATER-THAN
+ u'\u2AF9': u'\u2AFA', # DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO
+ u'\u2AFA': u'\u2AF9', # DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO
+ u'\u2E02': u'\u2E03', # LEFT SUBSTITUTION BRACKET
+ u'\u2E03': u'\u2E02', # RIGHT SUBSTITUTION BRACKET
+ u'\u2E04': u'\u2E05', # LEFT DOTTED SUBSTITUTION BRACKET
+ u'\u2E05': u'\u2E04', # RIGHT DOTTED SUBSTITUTION BRACKET
+ u'\u2E09': u'\u2E0A', # LEFT TRANSPOSITION BRACKET
+ u'\u2E0A': u'\u2E09', # RIGHT TRANSPOSITION BRACKET
+ u'\u2E0C': u'\u2E0D', # LEFT RAISED OMISSION BRACKET
+ u'\u2E0D': u'\u2E0C', # RIGHT RAISED OMISSION BRACKET
+ u'\u2E1C': u'\u2E1D', # LEFT LOW PARAPHRASE BRACKET
+ u'\u2E1D': u'\u2E1C', # RIGHT LOW PARAPHRASE BRACKET
+ u'\u2E20': u'\u2E21', # LEFT VERTICAL BAR WITH QUILL
+ u'\u2E21': u'\u2E20', # RIGHT VERTICAL BAR WITH QUILL
+ u'\u2E22': u'\u2E23', # TOP LEFT HALF BRACKET
+ u'\u2E23': u'\u2E22', # TOP RIGHT HALF BRACKET
+ u'\u2E24': u'\u2E25', # BOTTOM LEFT HALF BRACKET
+ u'\u2E25': u'\u2E24', # BOTTOM RIGHT HALF BRACKET
+ u'\u2E26': u'\u2E27', # LEFT SIDEWAYS U BRACKET
+ u'\u2E27': u'\u2E26', # RIGHT SIDEWAYS U BRACKET
+ u'\u2E28': u'\u2E29', # LEFT DOUBLE PARENTHESIS
+ u'\u2E29': u'\u2E28', # RIGHT DOUBLE PARENTHESIS
+ u'\u3008': u'\u3009', # LEFT ANGLE BRACKET
+ u'\u3009': u'\u3008', # RIGHT ANGLE BRACKET
+ u'\u300A': u'\u300B', # LEFT DOUBLE ANGLE BRACKET
+ u'\u300B': u'\u300A', # RIGHT DOUBLE ANGLE BRACKET
+ u'\u300C': u'\u300D', # [BEST FIT] LEFT CORNER BRACKET
+ u'\u300D': u'\u300C', # [BEST FIT] RIGHT CORNER BRACKET
+ u'\u300E': u'\u300F', # [BEST FIT] LEFT WHITE CORNER BRACKET
+ u'\u300F': u'\u300E', # [BEST FIT] RIGHT WHITE CORNER BRACKET
+ u'\u3010': u'\u3011', # LEFT BLACK LENTICULAR BRACKET
+ u'\u3011': u'\u3010', # RIGHT BLACK LENTICULAR BRACKET
+ u'\u3014': u'\u3015', # LEFT TORTOISE SHELL BRACKET
+ u'\u3015': u'\u3014', # RIGHT TORTOISE SHELL BRACKET
+ u'\u3016': u'\u3017', # LEFT WHITE LENTICULAR BRACKET
+ u'\u3017': u'\u3016', # RIGHT WHITE LENTICULAR BRACKET
+ u'\u3018': u'\u3019', # LEFT WHITE TORTOISE SHELL BRACKET
+ u'\u3019': u'\u3018', # RIGHT WHITE TORTOISE SHELL BRACKET
+ u'\u301A': u'\u301B', # LEFT WHITE SQUARE BRACKET
+ u'\u301B': u'\u301A', # RIGHT WHITE SQUARE BRACKET
+ u'\uFE59': u'\uFE5A', # SMALL LEFT PARENTHESIS
+ u'\uFE5A': u'\uFE59', # SMALL RIGHT PARENTHESIS
+ u'\uFE5B': u'\uFE5C', # SMALL LEFT CURLY BRACKET
+ u'\uFE5C': u'\uFE5B', # SMALL RIGHT CURLY BRACKET
+ u'\uFE5D': u'\uFE5E', # SMALL LEFT TORTOISE SHELL BRACKET
+ u'\uFE5E': u'\uFE5D', # SMALL RIGHT TORTOISE SHELL BRACKET
+ u'\uFE64': u'\uFE65', # SMALL LESS-THAN SIGN
+ u'\uFE65': u'\uFE64', # SMALL GREATER-THAN SIGN
+ u'\uFF08': u'\uFF09', # FULLWIDTH LEFT PARENTHESIS
+ u'\uFF09': u'\uFF08', # FULLWIDTH RIGHT PARENTHESIS
+ u'\uFF1C': u'\uFF1E', # FULLWIDTH LESS-THAN SIGN
+ u'\uFF1E': u'\uFF1C', # FULLWIDTH GREATER-THAN SIGN
+ u'\uFF3B': u'\uFF3D', # FULLWIDTH LEFT SQUARE BRACKET
+ u'\uFF3D': u'\uFF3B', # FULLWIDTH RIGHT SQUARE BRACKET
+ u'\uFF5B': u'\uFF5D', # FULLWIDTH LEFT CURLY BRACKET
+ u'\uFF5D': u'\uFF5B', # FULLWIDTH RIGHT CURLY BRACKET
+ u'\uFF5F': u'\uFF60', # FULLWIDTH LEFT WHITE PARENTHESIS
+ u'\uFF60': u'\uFF5F', # FULLWIDTH RIGHT WHITE PARENTHESIS
+ u'\uFF62': u'\uFF63', # [BEST FIT] HALFWIDTH LEFT CORNER BRACKET
+ u'\uFF63': u'\uFF62', # [BEST FIT] HALFWIDTH RIGHT CORNER BRACKET
+}
diff --git a/odex25_transactions/cm_odex_barcode/models/img/ArmWrestler.ttf b/odex25_transactions/cm_odex_barcode/models/img/ArmWrestler.ttf
new file mode 100644
index 000000000..494e13ce5
Binary files /dev/null and b/odex25_transactions/cm_odex_barcode/models/img/ArmWrestler.ttf differ
diff --git a/odex25_transactions/cm_odex_barcode/models/img/KacstOffice.ttf b/odex25_transactions/cm_odex_barcode/models/img/KacstOffice.ttf
new file mode 100644
index 000000000..0fec9ae1d
Binary files /dev/null and b/odex25_transactions/cm_odex_barcode/models/img/KacstOffice.ttf differ
diff --git a/odex25_transactions/cm_odex_barcode/models/img/amiri-regular.ttf b/odex25_transactions/cm_odex_barcode/models/img/amiri-regular.ttf
new file mode 100644
index 000000000..a6df4284d
Binary files /dev/null and b/odex25_transactions/cm_odex_barcode/models/img/amiri-regular.ttf differ
diff --git a/odex25_transactions/cm_odex_barcode/models/img/ar_bold.otf b/odex25_transactions/cm_odex_barcode/models/img/ar_bold.otf
new file mode 100644
index 000000000..c2f99c30d
Binary files /dev/null and b/odex25_transactions/cm_odex_barcode/models/img/ar_bold.otf differ
diff --git a/odex25_transactions/cm_odex_barcode/reports/barcodes.xml b/odex25_transactions/cm_odex_barcode/reports/barcodes.xml
new file mode 100644
index 000000000..a96f4775d
--- /dev/null
+++ b/odex25_transactions/cm_odex_barcode/reports/barcodes.xml
@@ -0,0 +1,251 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Date:
+
+
+
+
+
+ / /
+
+
+
+ Reference:
+
+
+
+
+
+ Attachment:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ European A4 Transactions
+
+ A4
+ Portrait
+ 5
+ 28
+ 7
+ 7
+
+ 35
+ 90
+
+
+
+ Outgoing Transaction Barcode
+ outgoing.transaction
+ qweb-pdf
+ cm_odex_barcode.report_outgoing_transaction_barcode
+
+
+
+
+
+ Incoming Transaction Barcode
+ incoming.transaction
+ qweb-pdf
+ cm_odex_barcode.report_incoming_transaction_barcode
+
+
+
+
+
+ Internal Transaction Barcode
+ internal.transaction
+ qweb-pdf
+ cm_odex_barcode.report_internal_transaction_barcode
+
+
+
+
+
diff --git a/odex25_transactions/cm_odex_barcode/reports/extend_transaction_detail_report.xml b/odex25_transactions/cm_odex_barcode/reports/extend_transaction_detail_report.xml
new file mode 100644
index 000000000..6ec1028df
--- /dev/null
+++ b/odex25_transactions/cm_odex_barcode/reports/extend_transaction_detail_report.xml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/cm_odex_barcode/static/src/js/cm_odex_barcode.js b/odex25_transactions/cm_odex_barcode/static/src/js/cm_odex_barcode.js
new file mode 100644
index 000000000..10ae5bd36
--- /dev/null
+++ b/odex25_transactions/cm_odex_barcode/static/src/js/cm_odex_barcode.js
@@ -0,0 +1,51 @@
+odoo.cm_odex_barcode = function (instance) {
+ 'use strict';
+ var _t = instance.web._t,
+ _lt = instance.web._lt;
+ var QWeb = instance.web.qweb;
+ console.log(">>>>>>>>>>>>>>>>>>>>>>>",QWeb)
+ instance.web.form.FieldBinaryImage.include({
+ render_value: function () {
+ var self = this;
+ var url;
+ if (this.get('value') && !instance.web.form.is_bin_size(this.get('value'))) {
+ url = 'data:image/png;base64,' + this.get('value');
+ } else if (this.get('value')) {
+ var id = JSON.stringify(this.view.datarecord.id || null);
+ var field = this.name;
+ if (this.options.preview_image)
+ field = this.options.preview_image;
+ url = this.session.url('/web/binary/image', {
+ model: this.view.dataset.model,
+ id: id,
+ field: field,
+ t: (new Date().getTime()),
+ });
+ } else {
+ url = this.placeholder;
+ }
+ var $img = $(QWeb.render("FieldBinaryImage-img", {widget: this, url: url}));
+ $($img).click(function (e) {
+ if (self.view.get("actual_mode") == "view") {
+ var $button = $(".oe_form_button_edit");
+ console.log($img[0].src)
+ window.location.href=$img[0].src
+ e.stopPropagation();
+ }
+ });
+ this.$el.find('> img').remove();
+ this.$el.prepend($img);
+ $img.load(function () {
+ if (!self.options.size)
+ return;
+ $img.css("max-width", "" + self.options.size[0] + "px");
+ $img.css("max-height", "" + self.options.size[1] + "px");
+ });
+ $img.on('error', function () {
+ self.on_clear();
+ $img.attr('src', self.placeholder);
+ instance.webclient.notification.warn(_t("Image"), _t("Could not display the selected image."));
+ });
+ },
+ });
+};
diff --git a/odex25_transactions/cm_odex_barcode/views/assets.xml b/odex25_transactions/cm_odex_barcode/views/assets.xml
new file mode 100644
index 000000000..4ec3d327c
--- /dev/null
+++ b/odex25_transactions/cm_odex_barcode/views/assets.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/odex25_transactions/cm_odex_barcode/views/transactions_views.xml b/odex25_transactions/cm_odex_barcode/views/transactions_views.xml
new file mode 100644
index 000000000..20fa81b6e
--- /dev/null
+++ b/odex25_transactions/cm_odex_barcode/views/transactions_views.xml
@@ -0,0 +1,71 @@
+
+
+
+
+ print internal barcode
+ internal.transaction
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ print barcode
+ outgoing.transaction
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ print incoming barcode
+ incoming.transaction
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/exp_cm_mail_odex/__init__.py b/odex25_transactions/exp_cm_mail_odex/__init__.py
new file mode 100644
index 000000000..ea2812e04
--- /dev/null
+++ b/odex25_transactions/exp_cm_mail_odex/__init__.py
@@ -0,0 +1,2 @@
+#-*- coding: utf-8 -*-
+from . import models
diff --git a/odex25_transactions/exp_cm_mail_odex/__manifest__.py b/odex25_transactions/exp_cm_mail_odex/__manifest__.py
new file mode 100644
index 000000000..052225cef
--- /dev/null
+++ b/odex25_transactions/exp_cm_mail_odex/__manifest__.py
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# Odex - Communications Management System.
+# Copyright (C) 2017 Expert Co. Ltd. ().
+#
+##############################################################################
+{
+ 'name': 'Correspondence Traking (Mailing)',
+ 'version': '0.1',
+ 'sequence': 20,
+ 'author': 'Expert Co. Ltd.',
+ 'category': 'Odex25-Transactions/Odex25-Transactions',
+ 'summary': 'Mailing <> Correspondence Traking',
+ 'description': """
+Odex - Communications Management System - Link with Email
+==========================================================
+
+* Import Transactions from email.
+ """,
+ 'website': 'http://www.exp-sa.com',
+ 'depends': ['base', 'base_odex', 'mail','exp_transaction_documents'],
+ 'data': [
+ 'views/actions_and_menus.xml',
+ ],
+ 'qweb': [
+ ],
+ 'external_dependencies': {},
+ 'installable': True,
+ 'auto_install': False,
+ 'application': False,
+}
diff --git a/odex25_transactions/exp_cm_mail_odex/i18n/ar_SY.po b/odex25_transactions/exp_cm_mail_odex/i18n/ar_SY.po
new file mode 100644
index 000000000..a9042855f
--- /dev/null
+++ b/odex25_transactions/exp_cm_mail_odex/i18n/ar_SY.po
@@ -0,0 +1,98 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * exp_cm_mail_odex
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 11.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2019-09-22 13:13+0000\n"
+"PO-Revision-Date: 2019-09-22 13:13+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: exp_cm_mail_odex
+#: model:ir.model.fields,help:exp_cm_mail_odex.field_cm_subject_type_default_value_email
+#: model:ir.model.fields,help:exp_cm_mail_odex.field_cm_transaction_important_default_value_email
+msgid "Check if you will used in email."
+msgstr "حدد إذا كانت القيمه الافتراضية المستخدمه في معاملات البريد الالكتروني"
+
+#. module: exp_cm_mail_odex
+#: model:ir.actions.act_window,help:exp_cm_mail_odex.cm_transaction_internal_in_mail__list_action
+msgid "Create the first Internal Transaction"
+msgstr "إنشاء معامله داخلية جديده"
+
+#. module: exp_cm_mail_odex
+#: model:ir.model.fields,field_description:exp_cm_mail_odex.field_cm_subject_type_default_value_email
+#: model:ir.model.fields,field_description:exp_cm_mail_odex.field_cm_transaction_important_default_value_email
+msgid "Default value in email"
+msgstr "القيمة الافتراضية للبريد الالكتروني"
+
+#. module: exp_cm_mail_odex
+#: code:addons/exp_cm_mail_odex/models/extend_transaction.py:11
+#: selection:incoming.transaction,source:0
+#: selection:internal.transaction,source:0
+#: selection:outgoing.transaction,source:0
+#: selection:transaction.transaction,source:0
+#, python-format
+msgid "Email"
+msgstr "البريد الالكتروني"
+
+#. module: exp_cm_mail_odex
+#: model:ir.actions.act_window,name:exp_cm_mail_odex.cm_transaction_internal_in_mail__list_action
+#: model:ir.ui.menu,name:exp_cm_mail_odex.cm_transaction_internal_in_menu
+msgid "Email Internal Transactions"
+msgstr "معاملات البريد الالكتروني"
+
+#. module: exp_cm_mail_odex
+#: code:addons/exp_cm_mail_odex/models/extend_transaction.py:10
+#: selection:incoming.transaction,source:0
+#: selection:internal.transaction,source:0
+#: selection:outgoing.transaction,source:0
+#: selection:transaction.transaction,source:0
+#, python-format
+msgid "Manual"
+msgstr "يدوي"
+
+#. module: exp_cm_mail_odex
+#: code:addons/exp_cm_mail_odex/models/extend_transaction.py:12
+#: selection:incoming.transaction,source:0
+#: selection:internal.transaction,source:0
+#: selection:outgoing.transaction,source:0
+#: selection:transaction.transaction,source:0
+#, python-format
+msgid "System"
+msgstr "تلقائي"
+
+#. module: exp_cm_mail_odex
+#: model:ir.model.fields,field_description:exp_cm_mail_odex.field_incoming_transaction_source
+#: model:ir.model.fields,field_description:exp_cm_mail_odex.field_internal_transaction_source
+#: model:ir.model.fields,field_description:exp_cm_mail_odex.field_outgoing_transaction_source
+#: model:ir.model.fields,field_description:exp_cm_mail_odex.field_transaction_transaction_source
+msgid "Transaction Source"
+msgstr "مصدر المعامله"
+
+#. module: exp_cm_mail_odex
+#: model:ir.model,name:exp_cm_mail_odex.model_cm_subject_type
+msgid "cm.subject.type"
+msgstr "cm.subject.type"
+
+#. module: exp_cm_mail_odex
+#: model:ir.model,name:exp_cm_mail_odex.model_cm_transaction_important
+msgid "cm.transaction.important"
+msgstr "cm.transaction.important"
+
+#. module: exp_cm_mail_odex
+#: model:ir.model,name:exp_cm_mail_odex.model_transaction_transaction
+msgid "for common attribute between transaction"
+msgstr "for common attribute between transaction"
+
+#. module: exp_cm_mail_odex
+#: model:ir.model,name:exp_cm_mail_odex.model_internal_transaction
+msgid "internal Transaction"
+msgstr "المعاملات الداخلية"
+
diff --git a/odex25_transactions/exp_cm_mail_odex/models/__init__.py b/odex25_transactions/exp_cm_mail_odex/models/__init__.py
new file mode 100644
index 000000000..9a4dae86c
--- /dev/null
+++ b/odex25_transactions/exp_cm_mail_odex/models/__init__.py
@@ -0,0 +1,3 @@
+#-*- coding: utf-8 -*-
+from . import extend_related
+from . import extend_transaction
diff --git a/odex25_transactions/exp_cm_mail_odex/models/extend_related.py b/odex25_transactions/exp_cm_mail_odex/models/extend_related.py
new file mode 100644
index 000000000..6088288fc
--- /dev/null
+++ b/odex25_transactions/exp_cm_mail_odex/models/extend_related.py
@@ -0,0 +1,14 @@
+#-*- coding: utf-8 -*-
+from odoo import models, fields
+
+
+class SubjectType(models.Model):
+ _inherit = 'cm.subject.type'
+
+ default_value_email = fields.Boolean(string='Default value in email', help='Check if you will used in email.', default=False)
+
+
+class ImportantDegree(models.Model):
+ _inherit = 'cm.transaction.important'
+
+ default_value_email = fields.Boolean(string='Default value in email', help='Check if you will used in email.', default=False)
diff --git a/odex25_transactions/exp_cm_mail_odex/models/extend_transaction.py b/odex25_transactions/exp_cm_mail_odex/models/extend_transaction.py
new file mode 100644
index 000000000..4452f80e9
--- /dev/null
+++ b/odex25_transactions/exp_cm_mail_odex/models/extend_transaction.py
@@ -0,0 +1,83 @@
+#-*- coding: utf-8 -*-
+from odoo import api, models, fields,_
+from email import utils
+
+
+class Transaction(models.Model):
+ _inherit = 'transaction.transaction'
+
+ source = fields.Selection(string='Transaction Source', selection=[
+ ('manual', _('Manual')),
+ ('email', _('Email')),
+ ('auto', _('System')),
+ ], default='manual')
+
+ @api.returns('cm.entity')
+ def get_entity_by_email(self, emailaddr):
+ """
+ return cm.entity using email address
+
+ :param emailaddr: entity email
+
+ :return: cm.entity: object
+ """
+ Entity = self.env['cm.entity']
+ Partner = self.env['res.partner']
+ User = self.env['res.users']
+ email = utils.parseaddr(emailaddr)[1]
+ print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>email",email)
+ partners = Partner.search([('email', '=ilike', email)])
+ # return first entity in this range
+ if not len(partners):
+ return Entity # empty entity
+ users = User.search([('partner_id', 'in', partners.ids)])
+ entities = Entity.search([('partner_id', 'in', partners.ids)])
+ if not len(entities) and len(users):
+ entities = Entity.search([('user_id', 'in', users.ids)])
+ return len(entities) and entities[0] or Entity
+
+
+class IncomingTransaction(models.Model):
+ _inherit = 'internal.transaction'
+
+ @api.model
+ def message_new(self, msg_dict, custom_values=None):
+ """
+ Overrides mail_thread message_new that is called by the mailgateway through message_process.
+ This override updates the document according to the email.
+
+ :param msg_dict: a map containing the email details and
+ attachments. See ``message_process`` and
+ ``mail.message.parse`` for details.
+
+ :param custom_values: optional dictionary of additional
+ field values to pass to create()
+ when creating the new thread record.
+ Be careful, these values may override
+ any other values coming from the message.
+
+ :return: the id of the newly created thread object
+ """
+ print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>hello iam custom")
+ context = self.env.context
+ data = {}
+ if isinstance(custom_values, dict):
+ data = custom_values.copy()
+ model = context.get('thread_model') or self._name
+ model_pool = self.env[model]
+ fields = model_pool.with_context(**context).fields_get()
+ if 'subject' in fields and not data.get('name'):
+ data['subject'] = msg_dict.get('subject', '')
+ if 'body' in fields and not data.get('name'):
+ data['body'] = msg_dict.get('body', '')
+ email_from = msg_dict.get('email_from', '')
+ if email_from:
+ entity = self.get_entity_by_email(email_from)
+ if len(entity):
+ # data['to_ids'] = [(4, entity.id)]
+ data['employee_id'] = entity.id
+ data['state'] = 'draft'
+ data['source'] = 'email'
+ res_id = model_pool.with_context(**context).create(data)
+ res_id.fetch_sequence(data={}, now=True)
+ return res_id.id
diff --git a/odex25_transactions/exp_cm_mail_odex/views/actions_and_menus.xml b/odex25_transactions/exp_cm_mail_odex/views/actions_and_menus.xml
new file mode 100644
index 000000000..79e79ade4
--- /dev/null
+++ b/odex25_transactions/exp_cm_mail_odex/views/actions_and_menus.xml
@@ -0,0 +1,32 @@
+
+
+
+
+ Email Internal Transactions
+ internal.transaction
+ [('source','=','email'),('employee_id.user_id', '=', uid),('state', 'not in', ['closed'])]
+ tree,form
+
+ Create the first Internal Transaction
+
+
+
+ {'search_default_favorite': 1,'search_default_unread': 1}
+
+
+
+
+
+ cm.subject.type.form
+ cm.subject.type
+
+
+
+
+
+
+
+
+
+
diff --git a/odex25_transactions/exp_late_mail_reminder/__init__.py b/odex25_transactions/exp_late_mail_reminder/__init__.py
new file mode 100644
index 000000000..94fcc3199
--- /dev/null
+++ b/odex25_transactions/exp_late_mail_reminder/__init__.py
@@ -0,0 +1,4 @@
+# -*- coding: utf-8 -*-
+from . import models
+from . import controllers
+
diff --git a/odex25_transactions/exp_late_mail_reminder/__manifest__.py b/odex25_transactions/exp_late_mail_reminder/__manifest__.py
new file mode 100644
index 000000000..5bb5afc99
--- /dev/null
+++ b/odex25_transactions/exp_late_mail_reminder/__manifest__.py
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# Odex - Communications Management System.
+# Copyright (C) 2019 Expert Co. Ltd. ().
+#
+##############################################################################
+{
+ 'name': 'Late Mail Reminder',
+ 'version': '1.0',
+ 'sequence': 10,
+ 'author': "Expert Co. Ltd. - Sudan team",
+ 'category': 'Odex25-Transactions/Odex25-Transactions',
+ 'summary': 'mail reminder',
+ 'description': """
+Late Mail Reminder
+========================================
+extend for stander landed costs to change work flow and to add new field""",
+ 'website': 'http://www.exp-sa.com',
+ 'depends': ['fetchmail'],
+ 'data': [
+ 'data/late_email_data.xml',
+ 'data/mail_data.xml',
+ 'views/late_mail_reminder_views.xml',
+ 'views/assets.xml',
+
+ ],
+ 'qweb' : [
+ # 'static/src/xml/notification_dialog.xml',
+ ],
+ 'installable': True,
+ 'auto_install': False,
+ 'application': True,
+}
diff --git a/odex25_transactions/exp_late_mail_reminder/controllers/__init__.py b/odex25_transactions/exp_late_mail_reminder/controllers/__init__.py
new file mode 100644
index 000000000..deec4a8b8
--- /dev/null
+++ b/odex25_transactions/exp_late_mail_reminder/controllers/__init__.py
@@ -0,0 +1 @@
+from . import main
\ No newline at end of file
diff --git a/odex25_transactions/exp_late_mail_reminder/controllers/main.py b/odex25_transactions/exp_late_mail_reminder/controllers/main.py
new file mode 100644
index 000000000..39883edac
--- /dev/null
+++ b/odex25_transactions/exp_late_mail_reminder/controllers/main.py
@@ -0,0 +1,44 @@
+# -*- encoding: utf-8 -*-
+from odoo import http
+from odoo.http import request
+from odoo import SUPERUSER_ID
+
+
+class ReminderPopupAlert(http.Controller):
+
+ @http.route('/reminder/notifications', type='json', auth="user")
+ def load_messages_alert(self, **kw):
+ cr, uid = request.cr, SUPERUSER_ID
+ cr.execute(
+ """select mail_message_id from mail_message_res_partner_needaction_rel where res_partner_id = """ + str(
+ request.env.user.partner_id.id))
+ Messages_ids = []
+ for line in cr.fetchall():
+ s = request.env['mail.message'].browse(line[0])
+ for li in s:
+ for x in li.notification_ids:
+ if x.res_partner_id.id == request.env.user.partner_id.id and x.is_read == False:
+ Messages_ids.append(line[0])
+ list_item = []
+ Messages = http.request.env['mail.message'].search([('id', 'in', Messages_ids)], order='date asc')
+ base_url = http.request.env['ir.config_parameter'].sudo().get_param('web.base.url')
+ for message in Messages:
+ action_id = ''
+ if message.model:
+ reminder_line_ids = http.request.env['late.email.reminder.line'].sudo().search(
+ [('model_id', '=', message.model)])
+ # for reminder_line_id in reminder_line_ids:
+ # for group in reminder_line_id.group_ids:
+ # if request.env.user.id in group.users.ids:
+ # # if reminder_line_id.menu_id.action:
+ # action_id = reminder_line_id.menu_id.action.id
+ item = {
+ 'subject': message.body,
+ 'id': message.id,
+ 'res_id': message.res_id,
+ 'res_model': message.model,
+ 'base_url': base_url,
+ # 'action_id' : action_id,
+ }
+ list_item.append(item)
+ return list_item
diff --git a/odex25_transactions/exp_late_mail_reminder/data/late_email_data.xml b/odex25_transactions/exp_late_mail_reminder/data/late_email_data.xml
new file mode 100644
index 000000000..43d6d1434
--- /dev/null
+++ b/odex25_transactions/exp_late_mail_reminder/data/late_email_data.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+ 5
+
+
+
diff --git a/odex25_transactions/exp_late_mail_reminder/data/mail_data.xml b/odex25_transactions/exp_late_mail_reminder/data/mail_data.xml
new file mode 100644
index 000000000..99466527b
--- /dev/null
+++ b/odex25_transactions/exp_late_mail_reminder/data/mail_data.xml
@@ -0,0 +1,15 @@
+
+
+
+ Late Email Reminder
+ True
+ 1
+ days
+ -1
+
+
+ code
+ model.action_send_late_email()
+
+
+
diff --git a/odex25_transactions/exp_late_mail_reminder/models/__init__.py b/odex25_transactions/exp_late_mail_reminder/models/__init__.py
new file mode 100644
index 000000000..89ee3f099
--- /dev/null
+++ b/odex25_transactions/exp_late_mail_reminder/models/__init__.py
@@ -0,0 +1,2 @@
+# -*- coding: utf-8 -*-
+from . import late_mail_remainder
diff --git a/odex25_transactions/exp_late_mail_reminder/models/late_mail_remainder.py b/odex25_transactions/exp_late_mail_reminder/models/late_mail_remainder.py
new file mode 100644
index 000000000..1c36a5e95
--- /dev/null
+++ b/odex25_transactions/exp_late_mail_reminder/models/late_mail_remainder.py
@@ -0,0 +1,106 @@
+# -*- coding: utf-8 -*-
+from datetime import date, datetime, timedelta
+import logging
+from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT as DATE_FORMAT
+from odoo.tools import DEFAULT_SERVER_DATE_FORMAT as DATE
+from odoo import models, fields, api, _
+
+_logger = logging.getLogger(__name__)
+
+
+class LateEmailReminder(models.Model):
+ _name = 'late.email.reminder'
+ _order = 'create_date desc'
+
+ number_of_days = fields.Integer(string='Number Of Days')
+ line_ids = fields.One2many('late.email.reminder.line', 'late_email_id', string='Lines')
+
+
+ def execute(self):
+ return {
+ 'type': 'ir.actions.client',
+ 'tag': 'reload',
+ }
+
+
+ def send_message(self, template=None, rec=None, model_name='', email='', partner_ids=[]):
+ if not template:
+ return
+ if not template:
+ return
+ template.write({'email_to': email,
+ })
+ mail_id = template.with_context(lang=self.env.user.lang).send_mail(
+ rec.id, force_send=True, raise_exception=False)
+ email = self.env['mail.mail'].browse(mail_id)
+ if email:
+ email.mail_message_id.partner_ids = [(6, 0, partner_ids)]
+ email.mail_message_id.needaction_partner_ids = [(6, 0, partner_ids)]
+ return True
+
+ def get_user_email(self, line):
+ # for line in line_ids:
+ user_ids = self.env['res.groups'].search([('id', 'in', line.group_ids.ids)])
+ user_email = []
+ partner_ids = []
+ for user in user_ids:
+ for rec in user.users:
+ partner_ids.append(rec.partner_id.id)
+ user_email.append(rec.partner_id.email)
+ user_email = list(set(user_email))
+ emails = ''
+ for email in user_email:
+ emails += email + ','
+ return emails,partner_ids
+
+ def action_send_late_email(self):
+ late_record = self.env['late.email.reminder'].search([], limit=1)
+ if late_record.line_ids:
+ states = ['cancel']
+ for line in late_record.line_ids:
+ print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
+ user_email,partner_ids = self.get_user_email(line)
+ for state in line.record_state_ids:
+ states.append(state.name)
+ model_name = line.model_id.model
+ record = self.env[model_name].search([('state', 'not in', states)])
+ for rec in record:
+ order_date = rec.mapped(line.order_date.name)
+ last_date = ''
+ if order_date[0]:
+ if len(order_date[0]) > 10:
+ last_date = datetime.strptime(order_date[0], DATE_FORMAT).date()
+ else:
+ last_date = datetime.strptime(order_date[0], DATE).date()
+ end_date = last_date + timedelta(days=self.number_of_days)
+ date_now = date.today()
+ if end_date < date_now:
+ mail_id = self.send_message(line.template_id, rec, model_name, user_email,partner_ids)
+
+
+class LateEmailReminderLine(models.Model):
+ _name = "late.email.reminder.line"
+
+ model_id = fields.Many2one('ir.model', string='Model')
+ order_date = fields.Many2one('ir.model.fields', string='Order Date')
+ record_state_ids = fields.Many2many('late.email.state', string='States')
+ template_id = fields.Many2one('mail.template', string='Template')
+ late_email_id = fields.Many2one('late.email.reminder', string='Late Email')
+ group_ids = fields.Many2many('res.groups', string='Groups')
+
+ @api.onchange('model_id')
+ def onchange_model_id(self):
+ domain = {}
+ self.order_date = False
+ domain = {'order_date': [('id', 'in', self.env['ir.model.fields'].search([('model_id', '=', self.model_id.id),
+ '|', ('ttype', '=', 'date'),
+ ('ttype', '=', 'datetime')]).ids)],
+ 'template_id': [('id', 'in', self.env['mail.template'].search([('model_id', '=', self.model_id.id)]).ids)]
+ }
+ return {'domain': domain}
+
+
+class LateEmailState(models.Model):
+ _name = 'late.email.state'
+
+ name = fields.Char(string='name of state')
diff --git a/odex25_transactions/exp_late_mail_reminder/static/description/icon.png b/odex25_transactions/exp_late_mail_reminder/static/description/icon.png
new file mode 100644
index 000000000..9c55b53ed
Binary files /dev/null and b/odex25_transactions/exp_late_mail_reminder/static/description/icon.png differ
diff --git a/odex25_transactions/exp_late_mail_reminder/static/description/icon1.png b/odex25_transactions/exp_late_mail_reminder/static/description/icon1.png
new file mode 100644
index 000000000..1e35b3045
Binary files /dev/null and b/odex25_transactions/exp_late_mail_reminder/static/description/icon1.png differ
diff --git a/odex25_transactions/exp_late_mail_reminder/static/src/css/fonts/FSAlbertArabic-ExtraBold.ttf b/odex25_transactions/exp_late_mail_reminder/static/src/css/fonts/FSAlbertArabic-ExtraBold.ttf
new file mode 100644
index 000000000..75bd90eca
Binary files /dev/null and b/odex25_transactions/exp_late_mail_reminder/static/src/css/fonts/FSAlbertArabic-ExtraBold.ttf differ
diff --git a/odex25_transactions/exp_late_mail_reminder/static/src/css/fonts/FSAlbertArabic-Regular.ttf b/odex25_transactions/exp_late_mail_reminder/static/src/css/fonts/FSAlbertArabic-Regular.ttf
new file mode 100644
index 000000000..4de5ce02c
Binary files /dev/null and b/odex25_transactions/exp_late_mail_reminder/static/src/css/fonts/FSAlbertArabic-Regular.ttf differ
diff --git a/odex25_transactions/exp_late_mail_reminder/static/src/css/fonts/fsalbert light italic.otf b/odex25_transactions/exp_late_mail_reminder/static/src/css/fonts/fsalbert light italic.otf
new file mode 100644
index 000000000..d0a2d345c
Binary files /dev/null and b/odex25_transactions/exp_late_mail_reminder/static/src/css/fonts/fsalbert light italic.otf differ
diff --git a/odex25_transactions/exp_late_mail_reminder/static/src/css/fonts/fsalbert light.otf b/odex25_transactions/exp_late_mail_reminder/static/src/css/fonts/fsalbert light.otf
new file mode 100644
index 000000000..c42c69e83
Binary files /dev/null and b/odex25_transactions/exp_late_mail_reminder/static/src/css/fonts/fsalbert light.otf differ
diff --git a/odex25_transactions/exp_late_mail_reminder/static/src/css/fonts/fsalbert regular.otf b/odex25_transactions/exp_late_mail_reminder/static/src/css/fonts/fsalbert regular.otf
new file mode 100644
index 000000000..5c943df1b
Binary files /dev/null and b/odex25_transactions/exp_late_mail_reminder/static/src/css/fonts/fsalbert regular.otf differ
diff --git a/odex25_transactions/exp_late_mail_reminder/static/src/css/fonts/fsalbert thin italic.otf b/odex25_transactions/exp_late_mail_reminder/static/src/css/fonts/fsalbert thin italic.otf
new file mode 100644
index 000000000..5faedfe56
Binary files /dev/null and b/odex25_transactions/exp_late_mail_reminder/static/src/css/fonts/fsalbert thin italic.otf differ
diff --git a/odex25_transactions/exp_late_mail_reminder/static/src/css/fonts/fsalbert thin.otf b/odex25_transactions/exp_late_mail_reminder/static/src/css/fonts/fsalbert thin.otf
new file mode 100644
index 000000000..4346fdb0f
Binary files /dev/null and b/odex25_transactions/exp_late_mail_reminder/static/src/css/fonts/fsalbert thin.otf differ
diff --git a/odex25_transactions/exp_late_mail_reminder/static/src/css/fonts/fsalbert-bold.otf b/odex25_transactions/exp_late_mail_reminder/static/src/css/fonts/fsalbert-bold.otf
new file mode 100644
index 000000000..4ac3a7057
Binary files /dev/null and b/odex25_transactions/exp_late_mail_reminder/static/src/css/fonts/fsalbert-bold.otf differ
diff --git a/odex25_transactions/exp_late_mail_reminder/static/src/css/fonts/fsalbert-extrabold.otf b/odex25_transactions/exp_late_mail_reminder/static/src/css/fonts/fsalbert-extrabold.otf
new file mode 100644
index 000000000..e18d6fb02
Binary files /dev/null and b/odex25_transactions/exp_late_mail_reminder/static/src/css/fonts/fsalbert-extrabold.otf differ
diff --git a/odex25_transactions/exp_late_mail_reminder/static/src/css/fonts/fsalbert-italic.otf b/odex25_transactions/exp_late_mail_reminder/static/src/css/fonts/fsalbert-italic.otf
new file mode 100644
index 000000000..d8f06d5a0
Binary files /dev/null and b/odex25_transactions/exp_late_mail_reminder/static/src/css/fonts/fsalbert-italic.otf differ
diff --git a/odex25_transactions/exp_late_mail_reminder/static/src/css/fonts/fsalbertitalic.png b/odex25_transactions/exp_late_mail_reminder/static/src/css/fonts/fsalbertitalic.png
new file mode 100644
index 000000000..5b88ed30a
Binary files /dev/null and b/odex25_transactions/exp_late_mail_reminder/static/src/css/fonts/fsalbertitalic.png differ
diff --git a/odex25_transactions/exp_late_mail_reminder/static/src/css/style.css b/odex25_transactions/exp_late_mail_reminder/static/src/css/style.css
new file mode 100644
index 000000000..6664051e4
--- /dev/null
+++ b/odex25_transactions/exp_late_mail_reminder/static/src/css/style.css
@@ -0,0 +1,247 @@
+.circle{
+ position: fixed;
+ top: 5.5%;
+ left: 1%;
+ z-index:99;
+ height: 30%;
+ width: 20%;
+ color:black;
+ }
+
+.footer{
+ color: black;
+ margin-top: 400;
+ background-color: white;
+
+}
+
+.button_div{
+ background: #1c9980;
+ width : 50px;
+ height: 50px;
+ color:white;
+}
+
+.notifier-container{
+ background: #fff;
+ height: 100%;
+ width: 400px;
+ position: absolute;
+ top: 0;
+ right: 0;
+ box-shadow: 0 8px 14px 0 rgba(0, 0, 0, 0.38);
+ border-left: 1px solid #eee;
+ z-index: 100;
+ transform: translateX(400px);
+ transition: all .5s ease-in-out;
+ overflow: scroll;
+}
+.notifier-container h3{
+ border-bottom: 1px solid #1c9980;
+ padding: 20px 10px 5px 10px;
+}
+.notifier-container .notifier-body{
+ padding: 0 10px;
+}
+.notifier-container .notifier-body .alert{
+ margin-bottom: 5px;
+ background-color: #3E5D7F;
+ color: white;
+}
+.notifier-container .notifier-body ul{
+ padding: 0;
+}
+.notifier-container .notifier-body ul li a:nth-child(1){
+ color: #000;
+ font-weight: bold;
+}
+.notifier-container .notifier-body ul li a:nth-child(2){
+ float: right;
+}
+.notifier-overlayer{
+ display: none;
+ background: #00000061;
+ height: 100vh;
+ width: 100%;
+ position: absolute;
+ top: 0;
+ right: 0;
+ z-index: 99;
+}
+.notifier-button{
+ position: fixed;
+ text-align: center;
+ width: 100%;
+ bottom: -100px;
+ right: 45%;
+ z-index: 99;
+ transition: all .5s ease-in-out;
+}
+
+.containers {
+ display: flex;
+ height: 100%;
+ justify-content: center;
+ align-items: center;
+ width:210px;
+ margin-right: 0px;
+}
+
+.rectangle {
+ /* display: flex;
+ text-align: center; */
+ justify-content: flex-start;
+ /* position: relative; */
+ width: 50px;
+ height: 55px;
+ background: #3E5D7F;
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ border-radius: 50%;
+ color: white;
+ opacity: 0;
+ overflow: hidden;
+ cursor: pointer;
+}
+.rectangle.animate{
+ -webkit-animation: scale-in .4s ease-out forwards, expand .45s .35s ease-out forwards;
+ animation: scale-in .4s ease-out forwards, expand .45s .35s ease-out forwards;
+}
+.rectangle.animate-out{
+ -webkit-animation: scale-out .3s ease-in forwards, expand-out .35s .25s ease-in forwards;
+ animation: scale-out .3s ease-in forwards, expand-out .35s .25s ease-in forwards;
+}
+.notification-text .badge{
+ background-color: #f51212;
+ font-size: 14px;
+ margin: 5px;
+ margin-top: 10px;
+}
+.notification-text {
+ display: flex;
+ align-items: center;
+ padding: 0 14px;
+ font-family: 'Arial', sans-serif;
+ font-size: 14px;
+ margin: 5px;
+ margin-top: 10px;
+}
+.notification-text.animate{
+ -webkit-animation: fade-in .65s ease-in forwards;
+ animation: fade-in .65s ease-in forwards;
+}
+.notification-text.animate-out{
+ -webkit-animation: fade-out .65s ease-out backwards;
+ animation: fade-out .65s ease-out backwards;
+}
+
+
+@-webkit-keyframes scale-in {
+ 100% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ opacity: 1;
+ }
+}
+
+@keyframes scale-in {
+ 100% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ opacity: 1;
+ }
+}
+@-webkit-keyframes expand {
+ 50% {
+ width: 350px;
+ border-radius: 6px;
+ }
+ 100% {
+ width: 300px;
+ border-radius: 4px;
+ box-shadow: 0px 1px 3px 0px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 3px 3px -1px rgba(0, 0, 0, 0.12);
+ }
+}
+@keyframes expand {
+ 50% {
+ width: 350px;
+ border-radius: 6px;
+ }
+ 100% {
+ width: 300px;
+ border-radius: 4px;
+ box-shadow: 0px 1px 3px 0px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 3px 3px -1px rgba(0, 0, 0, 0.12);
+ }
+}
+@-webkit-keyframes fade-in {
+ 0% {
+ opacity: 0;
+ }
+ 100% {
+ opacity: .8;
+ }
+}
+@keyframes fade-in {
+ 0% {
+ opacity: 0;
+ }
+ 100% {
+ opacity: .8;
+ }
+}
+
+@-webkit-keyframes scale-out {
+ 100% {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ opacity: 0;
+ }
+}
+
+@keyframes scale-out {
+ 100% {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ opacity: 0;
+ }
+}
+@-webkit-keyframes expand-out {
+ 50% {
+ width: 350px;
+ border-radius: 6px;
+ box-shadow: 0px 1px 3px 0px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 3px 3px -1px rgba(0, 0, 0, 0.12);
+ }
+ 100% {
+ width: 50px;
+ border-radius: 50%;
+ box-shadow: none;
+ }
+}
+@keyframes expand-out {
+ 50% {
+ width: 350px;
+ border-radius: 6px;
+ box-shadow: none;
+ }
+ 100% {
+ width: 50px;
+ border-radius: 50%;
+ }
+}
+@-webkit-keyframes fade-out {
+ 0% {
+ opacity: 1;
+ }
+ 100% {
+ opacity: 0;
+ }
+}
+@keyframes fade-out {
+ 0% {
+ opacity: 1;
+ }
+ 100% {
+ opacity: 0;
+ }
+}
+
diff --git a/odex25_transactions/exp_late_mail_reminder/static/src/js/notification_popup.js b/odex25_transactions/exp_late_mail_reminder/static/src/js/notification_popup.js
new file mode 100644
index 000000000..f9679a10f
--- /dev/null
+++ b/odex25_transactions/exp_late_mail_reminder/static/src/js/notification_popup.js
@@ -0,0 +1,147 @@
+odoo.define('exp_late_mail_reminder.notification_popup', function (require) {
+ "use strict";
+//this file migrate from odoo9 to 11 written by altaher migrate by fatima 18/5/2020
+var core = require('web.core');
+var ajax = require('web.ajax');
+var QWeb = core.qweb;
+var rpc = require('web.rpc');
+var ActionManager = require('web.ActionManager');
+var Widget = require('web.Widget');
+var ControlPanelMixin = require('web.ControlPanelMixin');
+//
+ function save_hashing(url) {
+ var _id = '';
+ var p1 = /&action=\d+/g;
+ var record_id = url.match(p1);
+ if (record_id) {
+ _id = record_id[0].match(/\d+\d*/g)[0];
+ try {
+ var h = $.md5(_id.toString(), (new Date()).getFullYear().toString());
+ localStorage.setItem("navigator_token", h);
+ localStorage.setItem("navigator_token_act", _id);
+ }
+ catch (err) {
+
+ }
+ }
+ }
+
+ function save_hashing_record(url) {
+ var rec = '';
+
+ try {
+ var p1 = /#id=\d+/g;
+ var record_id = url.match(p1);
+ if (record_id) {
+ rec = record_id[0].match(/\d+\d*/g)[0];
+ var h = $.md5((new Date()).getFullYear().toString(), rec.toString());
+ localStorage.setItem("record_token", h);
+ localStorage.setItem("origin_record_id", rec);
+ }
+ }
+ catch (err) {
+ }
+ }
+ $(document).ready(function () {
+ function dragElement(elmnt) {
+ var pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0;
+ if (document.getElementById(elmnt.id + "header")) {
+ /* if present, the header is where you move the DIV from:*/
+ document.getElementById(elmnt.id + "header").onmousedown = dragMouseDown;
+ } else {
+ /* otherwise, move the DIV from anywhere inside the DIV:*/
+ elmnt.onmousedown = dragMouseDown;
+ }
+
+ function dragMouseDown(e) {
+ e = e || window.event;
+ e.preventDefault();
+ // get the mouse cursor position at startup:
+ pos3 = e.clientX;
+ pos4 = e.clientY;
+ document.onmouseup = closeDragElement;
+ // call a function whenever the cursor moves:
+ document.onmousemove = elementDrag;
+ }
+
+ function elementDrag(e) {
+ e = e || window.event;
+ e.preventDefault();
+ // calculate the new cursor position:
+ pos1 = pos3 - e.clientX;
+ pos2 = pos4 - e.clientY;
+ pos3 = e.clientX;
+ pos4 = e.clientY;
+ // set the element's new position:
+ elmnt.style.top = (elmnt.offsetTop - pos2) + "px";
+ elmnt.style.left = (elmnt.offsetLeft - pos1) + "px";
+ }
+
+ function closeDragElement() {
+ /* stop moving when mouse button is released:*/
+ document.onmouseup = null;
+ document.onmousemove = null;
+ }
+ }
+ function load_message_loader() {
+ return ajax.jsonRpc('/reminder/notifications', 'call', {})
+ .then(function (results) {
+ if (results.length > 0) {
+ var content = '';
+ var no_message = results.length
+ $('body').append('');
+ $('body').append('
');
+ $('body').append('');
+ _.each(results, function (item) {
+ $('.notifier-body').append('');
+ });
+ var alert = document.querySelectorAll('.alert')
+ $(alert).click(function (event) {
+ var id = $(event.currentTarget).data('id');
+ var MessageModel = rpc.query({
+ model: 'mail.message',
+ method: 'mark_all_as_read',
+ args:[[],[['id','=',id]]]
+ }).then(
+ function () {
+ $(event.currentTarget).hide();
+ no_message = no_message - 1;
+ $('#badge').text(no_message);
+ $(".notifier-overlayer").fadeOut();
+ $(".notifier-container").css({"transform":"translateX(400px)"});
+ if(no_message > 0){
+ $(".rectangle-text").addClass("animate");
+ $(".rectangle").addClass("animate");
+ $(".notifier-button").css({"bottom":"20px"});
+
+ }
+ }
+ );
+ console.log(id);
+ });
+ $(".rectangle").click(function(){
+ $(".notifier-overlayer").show();
+ $(".notifier-container").css({"transform":"translateX(0)"});
+ $(".notifier-button").css({"bottom":"-100px"});
+ $(".rectangle-text").removeClass("animate");
+ $(".rectangle").removeClass("animate");
+ });
+ $(".notifier-overlayer").click(function(){
+ $(".notifier-overlayer").fadeOut();
+ $(".notifier-container").css({"transform":"translateX(400px)"});
+ $(".rectangle-text").addClass("animate");
+ $(".rectangle").addClass("animate");
+ $(".notifier-button").css({"bottom":"20px"});
+ });
+
+ $(".rectangle-text").addClass("animate");
+ $(".rectangle").addClass("animate");
+ $(".notifier-button").css({"bottom":"20px"});
+ }
+ });
+ }
+
+ setTimeout(load_message_loader, 2000);
+ });
+
+});
diff --git a/odex25_transactions/exp_late_mail_reminder/static/src/xml/notification_dialog.xml b/odex25_transactions/exp_late_mail_reminder/static/src/xml/notification_dialog.xml
new file mode 100644
index 000000000..558959821
--- /dev/null
+++ b/odex25_transactions/exp_late_mail_reminder/static/src/xml/notification_dialog.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
diff --git a/odex25_transactions/exp_late_mail_reminder/views/assets.xml b/odex25_transactions/exp_late_mail_reminder/views/assets.xml
new file mode 100644
index 000000000..8c2580e75
--- /dev/null
+++ b/odex25_transactions/exp_late_mail_reminder/views/assets.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/odex25_transactions/exp_late_mail_reminder/views/late_mail_reminder_views.xml b/odex25_transactions/exp_late_mail_reminder/views/late_mail_reminder_views.xml
new file mode 100644
index 000000000..0749444d6
--- /dev/null
+++ b/odex25_transactions/exp_late_mail_reminder/views/late_mail_reminder_views.xml
@@ -0,0 +1,66 @@
+
+
+
+
+ late.mail.reminder.form
+ late.email.reminder
+
+
+
+
+
+ late Email Reminder
+ late.email.reminder
+ form
+
+ inline
+
+
+
+
diff --git a/odex25_transactions/exp_multi_level_manage/__init__.py b/odex25_transactions/exp_multi_level_manage/__init__.py
new file mode 100644
index 000000000..601ffa6a9
--- /dev/null
+++ b/odex25_transactions/exp_multi_level_manage/__init__.py
@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+from . import models
+
diff --git a/odex25_transactions/exp_multi_level_manage/__manifest__.py b/odex25_transactions/exp_multi_level_manage/__manifest__.py
new file mode 100644
index 000000000..3bc414b68
--- /dev/null
+++ b/odex25_transactions/exp_multi_level_manage/__manifest__.py
@@ -0,0 +1,30 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# Odex - Communications Management System.
+# Copyright (C) 2019 Expert Co. Ltd. ().
+#
+##############################################################################
+{
+ 'name': 'Multi-level Transaction Management',
+ 'version': '1.0',
+ 'sequence': 4,
+ 'author': 'Expert Co. Ltd.',
+ 'category': 'Odex25-Transactions/Odex25-Transactions',
+ 'summary': 'Multi-level management of transactions',
+ 'description': """
+Odex - Communications Management System
+========================================
+Multi-level management of transactions
+ """,
+ 'website': 'http://www.exp-sa.com',
+ 'depends': ['exp_transaction_documents'],
+ 'data': [
+ 'views/extend_entity.xml',
+ ],
+ 'qweb' : [
+ ],
+ 'installable': True,
+ 'auto_install': False,
+ 'application': True,
+}
diff --git a/odex25_transactions/exp_multi_level_manage/models/__init__.py b/odex25_transactions/exp_multi_level_manage/models/__init__.py
new file mode 100644
index 000000000..60f1ee6c6
--- /dev/null
+++ b/odex25_transactions/exp_multi_level_manage/models/__init__.py
@@ -0,0 +1,2 @@
+# -*- coding: utf-8 -*-
+from . import extend_entity
diff --git a/odex25_transactions/exp_multi_level_manage/models/extend_entity.py b/odex25_transactions/exp_multi_level_manage/models/extend_entity.py
new file mode 100644
index 000000000..7c6015327
--- /dev/null
+++ b/odex25_transactions/exp_multi_level_manage/models/extend_entity.py
@@ -0,0 +1,15 @@
+# -*- coding: utf-8 -*-
+
+from odoo import models, fields, api,_
+# from odoo.exceptions import Warning
+
+
+class Entity(models.Model):
+ _inherit = 'cm.entity'
+ _description = 'for mange transaction in multi level'
+
+ manager_entity = fields.Many2many(comodel_name='cm.entity', relation='manage_entity_rel', column1='manager_id',
+ column2='entity_id', string='Owners of powers')
+ need_multi_approve = fields.Boolean(string='Need Multi level Approve')
+
+
diff --git a/odex25_transactions/exp_multi_level_manage/static/description/icon.png b/odex25_transactions/exp_multi_level_manage/static/description/icon.png
new file mode 100644
index 000000000..dde8236e0
Binary files /dev/null and b/odex25_transactions/exp_multi_level_manage/static/description/icon.png differ
diff --git a/odex25_transactions/exp_multi_level_manage/views/extend_entity.xml b/odex25_transactions/exp_multi_level_manage/views/extend_entity.xml
new file mode 100644
index 000000000..7bc095802
--- /dev/null
+++ b/odex25_transactions/exp_multi_level_manage/views/extend_entity.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+ extend.transaction.form
+ cm.entity
+
+
+
+
+
+
+
+
+
+
diff --git a/odex25_transactions/exp_transaction_documents/.idea/exp_transaction.iml b/odex25_transactions/exp_transaction_documents/.idea/exp_transaction.iml
new file mode 100644
index 000000000..671160631
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/.idea/exp_transaction.iml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_documents/.idea/misc.xml b/odex25_transactions/exp_transaction_documents/.idea/misc.xml
new file mode 100644
index 000000000..65531ca99
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/.idea/misc.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_documents/.idea/modules.xml b/odex25_transactions/exp_transaction_documents/.idea/modules.xml
new file mode 100644
index 000000000..ddac9f50c
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_documents/.idea/workspace.xml b/odex25_transactions/exp_transaction_documents/.idea/workspace.xml
new file mode 100644
index 000000000..f28201f43
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/.idea/workspace.xml
@@ -0,0 +1,131 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1555402175295
+
+
+ 1555402175295
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ file://$PROJECT_DIR$/__manifest__.py
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_documents/__init__.py b/odex25_transactions/exp_transaction_documents/__init__.py
new file mode 100644
index 000000000..f2155f77c
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/__init__.py
@@ -0,0 +1,4 @@
+# -*- coding: utf-8 -*-
+from . import models
+from . import wizard
+
diff --git a/odex25_transactions/exp_transaction_documents/__manifest__.py b/odex25_transactions/exp_transaction_documents/__manifest__.py
new file mode 100644
index 000000000..2c2d47c06
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/__manifest__.py
@@ -0,0 +1,52 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# Odex - Communications Management System.
+# Copyright (C) 2019 Expert Co. Ltd. ().
+#
+##############################################################################
+{
+ 'name': 'Communications Management',
+ 'version': '1.0',
+ 'sequence': 4,
+ 'author': 'Expert Co. Ltd.',
+ 'category': 'Odex25-Transactions/Odex25-Transactions',
+ 'summary': 'Correspondence Management System',
+ 'description': """
+Odex - Communications Management System
+========================================
+Managing Communications Transcations flows
+ """,
+ 'website': 'http://www.exp-sa.com',
+ 'depends': ['base', 'base_odex', 'mail', 'html_text', 'odex_sms'],
+ 'data': [
+ 'security/groups.xml',
+ 'security/ir.model.access.csv',
+ 'email_templates/out_templates.xml',
+ 'data/cm_data.xml',
+ 'data/ir_cron.xml',
+ 'views/entity.xml',
+ 'views/configuration.xml',
+ 'views/transcation_common_view.xml',
+ 'views/internal.xml',
+ 'views/incoming.xml',
+ 'views/outgoing.xml',
+ 'reports/transaction_details_report_template.xml',
+ 'reports/receiver_transaction_report_template.xml',
+ # 'views/settings_config_view.xml',
+ 'views/actions_and_menus.xml',
+ 'wizard/reject_transaction_reson.xml',
+ 'wizard/forward_transaction.xml',
+ 'wizard/archive_transaction.xml',
+ 'wizard/transaction_reply_wizard.xml',
+ 'wizard/reopen_transaction_wizard.xml',
+ 'email_templates/internal_templates.xml',
+ 'email_templates/incoming_templates.xml',
+
+ ],
+ 'qweb': [
+ ],
+ 'installable': True,
+ 'auto_install': False,
+ 'application': True,
+}
diff --git a/odex25_transactions/exp_transaction_documents/data/cm_data.xml b/odex25_transactions/exp_transaction_documents/data/cm_data.xml
new file mode 100644
index 000000000..e51fcf509
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/data/cm_data.xml
@@ -0,0 +1,38 @@
+
+
+
+
+ Entities Seq
+ cm.entity
+
+
+ 3
+
+
+
+
+ Outgointg Transactions Seq
+ cm.transaction.out
+ %(year)s/2
+
+ 4
+
+
+
+ Incoming Transactions Seq
+ cm.transaction.in
+ %(year)s/3
+
+ 4
+
+
+
+ Internal Transactions Seq
+ cm.transaction.internal
+ %(year)s/1
+
+ 4
+
+
+
+
diff --git a/odex25_transactions/exp_transaction_documents/data/ir_cron.xml b/odex25_transactions/exp_transaction_documents/data/ir_cron.xml
new file mode 100644
index 000000000..9b1d9dee5
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/data/ir_cron.xml
@@ -0,0 +1,15 @@
+
+
+
+ تأخر المعاملات عن وقت الانتهاء
+ True
+ 1
+ days
+ -1
+
+
+ code
+ model.late_transaction_cron()
+
+
+
diff --git a/odex25_transactions/exp_transaction_documents/email_templates/incoming_templates.xml b/odex25_transactions/exp_transaction_documents/email_templates/incoming_templates.xml
new file mode 100644
index 000000000..0c1e90c1c
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/email_templates/incoming_templates.xml
@@ -0,0 +1,65 @@
+
+
+
+ Transaction Send Message
+
+ ]]>
+ ${object.get_email()|safe}
+
+
+
+ السادة الفضلاء: ${object.get_name()}
+ حفظهم الله،،
+
+ السلام عليكم ورحمة الله.
+
+
+
+ توجد معاملة خارجية واردة للمعاملة
+
+
+
+ يمكنكم الان المتابعة و تنفيذ الإجراء المطلوب
+
+
+
+
+ رقم المعاملة :
+ ${object.name}
+
+
+ موضوع المعاملة :
+ ${object.subject}
+
+
+
+ نوع المعاملة :
+ ${object.subject_type_id.name}
+
+
+ معِد المعاملة :
+ ${object.employee_id.name}
+
+
+ آخر موعد لانجاز المعاملة :
+ ${object.due_date}
+
+
+
+
+ رابط المعاملة
+
+
+ ${user.company_id.name}
+
+
+
+
+
+ ]]>
+
+
+
+
+
diff --git a/odex25_transactions/exp_transaction_documents/email_templates/internal_templates.xml b/odex25_transactions/exp_transaction_documents/email_templates/internal_templates.xml
new file mode 100644
index 000000000..fe7969d23
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/email_templates/internal_templates.xml
@@ -0,0 +1,719 @@
+
+
+
+
+
+ Unit Manager Request Message
+
+ ]]>
+ ${object.preparation_id.manager_id.user_id.partner_id.email|safe}
+ ${object.to_ids[0].name|safe}
+
+
+ ،، ${object.preparation_id.manager_id.name|safe} - السادة الفضلاء
+ حفظهم الله،،
+
+ السلام عليكم ورحمة الله.
+
+
+ توجد معاملة داخلية في انتظار اعتماد الإدارة
+
+
+
+
+ موجهة الى :
+ ${object.to_ids[0].name}
+
+
+ : موضوع المعاملة
+ ${object.subject}
+
+
+ : نوع المعاملة
+ ${object.subject_type_id.name}
+
+
+ : الإدارة المعدة
+ ${object.preparation_id.name}
+
+
+ : معِد المعاملة
+ ${object.employee_id.name}
+
+
+ : آخر موعد لإنجاز المعاملة
+ ${object.due_date}
+
+
+
+
+ رابط المعاملة
+
+
+ ${user.company_id.name}
+
+
+ ]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Transaction forward Message
+
+ ]]>
+ ${object.forward_user_id.partner_id.email|safe}
+ ${object.name|safe}
+
+
+ السادة الفضلاء: ${object.forward_user_id.name}
+ حفظهم الله،،
+
+ السلام عليكم ورحمة الله.
+
+
+
+ توجد إحالة واردة للمعاملة
+
+
+ يمكنكم الان المتابعة و تنفيذ الإجراء المطلوب
+
+
+
+
+ رقم المعاملة :
+ ${object.name}
+
+
+ موضوع المعاملة :
+ ${object.subject}
+
+
+ محالة من قِبل :
+ ${object.get_latest_forward().from_id.name}
+
+
+ الإجراء المطلوب :
+ ${object.get_latest_forward().procedure_id.name}
+
+
+ تاريخ الإحالة :
+ ${object.get_latest_forward().date}
+
+
+
+ نوع المعاملة :
+ ${object.subject_type_id.name}
+
+
+ معِد المعاملة :
+ ${object.employee_id.name}
+
+
+ آخر موعد لانجاز المعاملة :
+ ${object.due_date}
+
+
+
+
+ رابط المعاملة
+
+
+ ${user.company_id.name}
+
+
+ ]]>
+
+
+
+
+ Transaction Reply Message
+
+ ]]>
+ ${object.last_forwarded_user.partner_id.email|safe}
+ ${object.name|safe}
+
+
+ السادة الفضلاء: ${object.employee_id.name}
+ حفظهم الله،،
+
+ السلام عليكم ورحمة الله.
+
+
+ تم الرد على الإحالة للمعاملة
+
+
+ يمكنكم الان المتابعة و إكمال اللازم
+
+
+
+
+ رقم المعاملة :
+ ${object.name}
+
+
+ موضوع المعاملة :
+ ${object.subject}
+
+
+ موجه من :
+ ${object.get_latest_by_action('reply').from_id.name}
+
+
+ الإجراء المطلوب :
+ ${object.get_latest_by_action('reply').procedure_id.name}
+
+
+ الملاحظات :
+ ${object.get_latest_by_action('reply').note}
+
+
+ تاريخ الإحالة :
+ ${object.get_latest_by_action('reply').date}
+
+
+ نوع المعاملة :
+ ${object.subject_type_id.name}
+
+
+ معِد المعاملة :
+ ${object.employee_id.name}
+
+
+ آخر موعد لانجاز المعاملة :
+ ${object.due_date}
+
+
+
+
+ رابط المعاملة
+
+
+ ${user.company_id.name}
+
+
+ ]]>
+
+
+
+
+ Transaction Close Message
+
+ ]]>
+ ${object.employee_id.user_id.partner_id.email|safe}
+ ${object.name|safe}
+
+
+
+
+ السلام عليكم ورحمة الله.
+
+
+ تم حفظ المعاملة
+
+
+
+
+ رقم المعاملة :
+ ${object.name}
+
+
+ موضوع المعاملة :
+ ${object.subject}
+
+
+ مبرر الحفظ :
+ ${object.get_latest_by_action('archive').archive_type_id.name}
+
+
+ الملاحظات :
+ ${object.get_latest_by_action('archive').note}
+
+
+ تاريخ الحفظ :
+ ${object.get_latest_by_action('archive').date}
+
+
+ نوع المعاملة :
+ ${object.subject_type_id.name}
+
+
+ معِد المعاملة :
+ ${object.employee_id.name}
+
+
+ آخر موعد لانجاز المعاملة :
+ ${object.due_date}
+
+
+
+
+ رابط المعاملة
+
+
+ ${user.company_id.name}
+
+
+ ]]>
+
+
+
+
+
+ Transaction Send Message
+
+ ]]>
+ ${object.get_email()|safe}
+ ${object.name|safe}
+
+
+ السادة الفضلاء: ${object.get_name()}
+ حفظهم الله،،
+
+ السلام عليكم ورحمة الله.
+
+
+ توجد معاملة مرسلة
+
+
+ يمكنكم الان المتابعة و تنفيذ الإجراء المطلوب
+
+
+
+
+ رقم المعاملة :
+ ${object.name}
+
+
+ موضوع المعاملة :
+ ${object.subject}
+
+
+ نوع المعاملة :
+ ${object.subject_type_id.name}
+
+
+ معِد المعاملة :
+ ${object.employee_id.name}
+
+
+ آخر موعد لانجاز المعاملة :
+ ${object.due_date}
+
+
+
+
+ رابط المعاملة
+
+
+ ${user.company_id.name}
+
+
+ ]]>
+
+
+
+
+ Reopen Message
+
+ ]]>
+ ${object.employee_id.user_id.partner_id.email|safe}
+ ${object.name|safe}
+
+
+ السادة الفضلاء: ${object.employee_id.name}
+ حفظهم الله،،
+
+ السلام عليكم ورحمة الله.
+
+
+
+ تم اعادة فتح المعاملة
+
+
+
+
+ رقم المعاملة :
+ ${object.name}
+
+
+ موضوع المعاملة :
+ ${object.subject}
+
+
+ الإجراء المطلوب :
+ ${object.get_latest_by_action('reopen').procedure_id.name}
+
+
+ الملاحظات :
+ ${object.get_latest_by_action('reopen').note}
+
+
+ تاريخ اعادة فتح المعاملة :
+ ${object.get_latest_by_action('reopen').date}
+
+
+ نوع المعاملة :
+ ${object.subject_type_id.name}
+
+
+ معِد المعاملة :
+ ${object.employee_id.name}
+
+
+ آخر موعد لانجاز المعاملة :
+ ${object.due_date}
+
+
+
+
+ يمكنكم الان المتابعة و تنفيذ الإجراء المطلوب
+
+
+
+
+ رابط المعاملة
+
+
+
+ ${user.company_id.name}
+
+
+
+
+
+ ]]>
+
+
+
+
+
+ Return Message
+
+ ]]>
+ ${object.employee_id.user_id.partner_id.email|safe}
+ ${object.name|safe}
+
+
+ السادة الفضلاء: ${object.employee_id.name}
+ حفظهم الله،،
+
+ السلام عليكم ورحمة الله.
+
+
+
+ تم إرجاع المعاملة
+
+
+
+
+ رقم المعاملة :
+ ${object.name}
+
+
+ موضوع المعاملة :
+ ${object.subject}
+
+
+
+ الملاحظات :
+ ${object.get_latest_by_action('return').note}
+
+
+ تاريخ إرجاع المعاملة :
+ ${object.get_latest_by_action('return').date}
+
+
+ نوع المعاملة :
+ ${object.subject_type_id.name}
+
+
+ معِد المعاملة :
+ ${object.employee_id.name}
+
+
+ آخر موعد لانجاز المعاملة :
+ ${object.due_date}
+
+
+
+
+ يمكنكم الان المتابعة و تنفيذ الإجراء المطلوب
+
+
+
+
+ رابط المعاملة
+
+
+
+ ${user.company_id.name}
+
+
+
+
+
+ ]]>
+
+
+
+
+
+ Reject Message
+
+ ]]>
+ ${object.employee_id.user_id.partner_id.email|safe}
+ ${object.name|safe}
+
+
+ السادة الفضلاء: ${object.employee_id.name}
+ حفظهم الله،،
+
+ السلام عليكم ورحمة الله.
+
+
+
+ تم رفض المعاملة
+
+
+
+
+ رقم المعاملة :
+ ${object.name}
+
+
+ موضوع المعاملة :
+ ${object.subject}
+
+
+
+ اسباب الرفض :
+ ${object.get_latest_by_action('refuse').note}
+
+
+ تاريخ رفض المعاملة :
+ ${object.get_latest_by_action('refuse').date}
+
+
+ نوع المعاملة :
+ ${object.subject_type_id.name}
+
+
+ معِد المعاملة :
+ ${object.employee_id.name}
+
+
+ آخر موعد لانجاز المعاملة :
+ ${object.due_date}
+
+
+
+
+ يمكنكم الان المتابعة و تنفيذ الإجراء المطلوب
+
+
+
+
+ رابط المعاملة
+
+
+
+ ${user.company_id.name}
+
+
+ ]]>
+
+
+
+
+ Late Message
+
+ ]]>
+ ${object.get_email()}
+ ${object.name|safe}
+
+
+ السادة الفضلاء: ${object.employee_id.name}
+ حفظهم الله،،
+
+ السلام عليكم ورحمة الله.
+
+
+ تأخر معاملة
+
+
+
+
+ رقم المعاملة :
+ ${object.name}
+
+
+ موضوع المعاملة :
+ ${object.subject}
+
+
+ نوع المعاملة :
+ ${object.subject_type_id.name}
+
+
+ معِد المعاملة :
+ ${object.employee_id.name}
+
+
+ آخر موعد لانجاز المعاملة :
+ ${object.due_date}
+
+
+
+
+ يمكنكم الان المتابعة و تنفيذ الإجراء المطلوب
+
+
+
+ رابط المعاملة
+
+
+ ${user.company_id.name}
+
+
+ ]]>
+
+
+
+
diff --git a/odex25_transactions/exp_transaction_documents/email_templates/out_templates.xml b/odex25_transactions/exp_transaction_documents/email_templates/out_templates.xml
new file mode 100644
index 000000000..58908461f
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/email_templates/out_templates.xml
@@ -0,0 +1,249 @@
+
+
+
+
+ Unit Manager Approval Request Message
+
+
+ ]]>
+ ${object.preparation_id.manager_id.user_id.partner_id.email|safe}
+ ${object.to_ids[0].name|safe}
+
+
+ ،، ${object.preparation_id.manager_id.name} - السادة الفضلاء
+ حفظهم الله،،
+
+ السلام عليكم ورحمة الله.
+
+
+ توجد معاملة صادر جديدة في انتظار اعتماد مسئول الوحدة (${object.preparation_id.name})
+
+
+
+
+ جهة الصادر :
+ ${object.to_ids[0].name}
+
+
+ : موضوع المعاملة
+ ${object.subject}
+
+
+ : نوع المعاملة
+ ${object.subject_type_id.name}
+
+
+ : معِد المعاملة
+ ${object.employee_id.name}
+
+
+ : آخر موعد لإنجاز المعاملة
+ ${object.due_date}
+
+
+
+
+ رابط المعاملة
+
+
+ ${user.company_id.name}
+
+
+
+
+
+ ]]>
+
+
+
+
+ CEO Approval Request Message
+
+
+ ]]>
+ ${object.get_second_manager().partner_id.email|safe}
+
+ ${object.to_ids[0].name|safe}
+
+
+
+ ،، ${object.get_second_manager().name|safe} - السادة الفضلاء
+ حفظهم الله،،
+
+ السلام عليكم ورحمة الله.
+
+
+
+ توجد معاملة صادر جديدة في انتظار اعتماد الإدارة التنفيذية
+
+
+
+
+ رقم المعاملة :
+ ${object.name}
+
+
+ جهة الصادر :
+ ${object.to_ids[0].name}
+
+
+ : موضوع المعاملة
+ ${object.subject}
+
+
+ : نوع المعاملة
+ ${object.subject_type_id.name}
+
+
+ : معِد المعاملة
+ ${object.employee_id.name}
+
+
+ : الإدارة المعدّة
+ ${object.preparation_id.name}
+
+
+ : آخر موعد لإنجاز المعاملة
+ ${object.due_date}
+
+
+
+
+ رابط المعاملة
+
+
+ ${user.company_id.name}
+
+
+
+
+
+ ]]>
+
+
+
+
+ Transaction Ready for send Message
+
+
+ ]]>
+
+ ${object.preparation_id.manager_id.user_id.partner_id.email|safe},${object.employee_id.user_id.partner_id.email|safe}
+
+
+ ${object.to_ids[0].name|safe} ${object.name|safe}
+
+
+
+ ،، ${object.employee_id.name} - السادة الفضلاء
+ حفظهم الله،،
+
+ السلام عليكم ورحمة الله.
+
+
+ تم اعتماد الادارة التنفيذية لمعاملة الصادر
+
+
+ يمكنكم الان المتابعة و ترميز المعاملة كمرسل حال اكتمال اجراءات الارسال،،
+
+
+
+
+ رقم المعاملة :
+ ${object.name}
+
+
+ جهة الصادر :
+ ${object.to_ids[0].name}
+
+
+ : موضوع المعاملة
+ ${object.subject}
+
+
+ : نوع المعاملة
+ ${object.subject_type_id.name}
+
+
+ : معِد المعاملة
+ ${object.employee_id.name}
+
+
+ : آخر موعد لإنجاز المعاملة
+ ${object.due_date}
+
+
+
+
+ رابط المعاملة
+
+
+ ${user.company_id.name}
+
+
+
+
+
+ ]]>
+
+
+
+ Transaction Ready for send Message
+
+
+ ]]>
+
+ ${object.preparation_id.manager_id.user_id.partner_id.email|safe},${object.employee_id.user_id.partner_id.email|safe}
+
+ ${object.to_ids[0].name|safe} ${object.name|safe}
+
+
+ ،، ${object.employee_id.name} - السادة الفضلاء
+ حفظهم الله،،
+
+ السلام عليكم ورحمة الله.
+
+
+
+
+ رقم المعاملة :
+ ${object.name}
+
+
+ جهة الصادر :
+ ${object.to_ids[0].name}
+
+
+ : موضوع المعاملة
+ ${object.subject}
+
+
+ : نوع المعاملة
+ ${object.subject_type_id.name}
+
+
+ : معِد المعاملة
+ ${object.employee_id.name}
+
+
+
+
+
+ رابط المعاملة
+
+
+ ${user.company_id.name}
+
+
+
+
+
+ ]]>
+
+
+
+
diff --git a/odex25_transactions/exp_transaction_documents/i18n/ar_001.po b/odex25_transactions/exp_transaction_documents/i18n/ar_001.po
new file mode 100644
index 000000000..d9042794f
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/i18n/ar_001.po
@@ -0,0 +1,3441 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * exp_transaction_documents
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 14.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-04-20 14:16+0000\n"
+"PO-Revision-Date: 2024-04-20 14:16+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: exp_transaction_documents
+#: model:mail.template,body_html:exp_transaction_documents.internal_notify_close_email
+msgid ""
+"\n"
+" \n"
+" \n"
+"\n"
+"
\n"
+" السلام عليكم ورحمة الله.\n"
+"
\n"
+"
\n"
+" تم حفظ المعاملة\n"
+"
\n"
+"
\n"
+"
\n"
+" \n"
+" رقم المعاملة : \n"
+" ${object.name} \n"
+" \n"
+" \n"
+" موضوع المعاملة : \n"
+" ${object.subject} \n"
+" \n"
+" \n"
+" مبرر الحفظ : \n"
+" ${object.get_latest_by_action('archive').archive_type_id.name} \n"
+" \n"
+" \n"
+" الملاحظات : \n"
+" ${object.get_latest_by_action('archive').note} \n"
+" \n"
+" \n"
+" تاريخ الحفظ : \n"
+" ${object.get_latest_by_action('archive').date} \n"
+" \n"
+" \n"
+" نوع المعاملة : \n"
+" ${object.subject_type_id.name} \n"
+" \n"
+" \n"
+" معِد المعاملة : \n"
+" ${object.employee_id.name} \n"
+" \n"
+" \n"
+" آخر موعد لانجاز المعاملة : \n"
+" ${object.due_date} \n"
+" \n"
+"
\n"
+"
\n"
+"
\n"
+" رابط المعاملة \n"
+"
\n"
+"
\n"
+" ${user.company_id.name} \n"
+"
\n"
+"
\n"
+" \n"
+" "
+msgstr ""
+"\n"
+" \n"
+" \n"
+"\n"
+"
\n"
+" السلام عليكم ورحمة الله.\n"
+"
\n"
+"
\n"
+" تم حفظ المعاملة\n"
+"
\n"
+"
\n"
+"
\n"
+" \n"
+" رقم المعاملة : \n"
+" ${object.name} \n"
+" \n"
+" \n"
+" موضوع المعاملة : \n"
+" ${object.subject} \n"
+" \n"
+" \n"
+" مبرر الحفظ : \n"
+" ${object.get_latest_by_action('archive').archive_type_id.name} \n"
+" \n"
+" \n"
+" تاريخ الحفظ : \n"
+" ${object.get_latest_by_action('archive').date} \n"
+" \n"
+" \n"
+" نوع المعاملة : \n"
+" ${object.subject_type_id.name} \n"
+" \n"
+" \n"
+" معِد المعاملة : \n"
+" ${object.employee_id.name} \n"
+" \n"
+" \n"
+" آخر موعد لانجاز المعاملة : \n"
+" ${object.due_date} \n"
+" \n"
+"
\n"
+"
\n"
+"
\n"
+" رابط المعاملة \n"
+"
\n"
+"
\n"
+" ${user.company_id.name} \n"
+"
\n"
+"
\n"
+" \n"
+" "
+
+#. module: exp_transaction_documents
+#: model:mail.template,body_html:exp_transaction_documents.internal_notify_reply_email
+msgid ""
+"\n"
+" \n"
+" \n"
+"
السادة الفضلاء: ${object.employee_id.name}
\n"
+"
حفظهم الله،،
\n"
+"
\n"
+" السلام عليكم ورحمة الله.\n"
+"
\n"
+"
\n"
+" تم الرد على الإحالة للمعاملة\n"
+"
\n"
+"
\n"
+" يمكنكم الان المتابعة و إكمال اللازم\n"
+"
\n"
+"
\n"
+"
\n"
+" \n"
+" رقم المعاملة : \n"
+" ${object.name} \n"
+" \n"
+" \n"
+" موضوع المعاملة : \n"
+" ${object.subject} \n"
+" \n"
+" \n"
+" موجه من : \n"
+" ${object.get_latest_by_action('reply').from_id.name} \n"
+" \n"
+" \n"
+" الإجراء المطلوب : \n"
+" ${object.get_latest_by_action('reply').procedure_id.name} \n"
+" \n"
+" \n"
+" الملاحظات : \n"
+" ${object.get_latest_by_action('reply').note} \n"
+" \n"
+" \n"
+" تاريخ الإحالة : \n"
+" ${object.get_latest_by_action('reply').date} \n"
+" \n"
+" \n"
+" نوع المعاملة : \n"
+" ${object.subject_type_id.name} \n"
+" \n"
+" \n"
+" معِد المعاملة : \n"
+" ${object.employee_id.name} \n"
+" \n"
+" \n"
+" آخر موعد لانجاز المعاملة : \n"
+" ${object.due_date} \n"
+" \n"
+"
\n"
+"
\n"
+"
\n"
+" رابط المعاملة \n"
+"
\n"
+"
\n"
+" ${user.company_id.name} \n"
+"
\n"
+"
\n"
+" \n"
+" "
+msgstr ""
+"\n"
+" \n"
+" \n"
+"
السادة الفضلاء: ${object.employee_id.name}
\n"
+"
حفظهم الله،،
\n"
+"
\n"
+" السلام عليكم ورحمة الله.\n"
+"
\n"
+"
\n"
+" تم الرد على الإحالة للمعاملة\n"
+"
\n"
+"
\n"
+" يمكنكم الان المتابعة و إكمال اللازم\n"
+"
\n"
+"
\n"
+"
\n"
+" \n"
+" رقم المعاملة : \n"
+" ${object.name} \n"
+" \n"
+" \n"
+" موضوع المعاملة : \n"
+" ${object.subject} \n"
+" \n"
+" \n"
+" موجه من : \n"
+" ${object.get_latest_by_action('reply').from_id.name} \n"
+" \n"
+" \n"
+" الإجراء المطلوب : \n"
+" ${object.get_latest_by_action('reply').procedure_id.name} \n"
+" \n"
+" \n"
+" تاريخ الإحالة : \n"
+" ${object.get_latest_by_action('reply').date} \n"
+" \n"
+" \n"
+" نوع المعاملة : \n"
+" ${object.subject_type_id.name} \n"
+" \n"
+" \n"
+" معِد المعاملة : \n"
+" ${object.employee_id.name} \n"
+" \n"
+" \n"
+" آخر موعد لانجاز المعاملة : \n"
+" ${object.due_date} \n"
+" \n"
+"
\n"
+"
\n"
+"
\n"
+" رابط المعاملة \n"
+"
\n"
+"
\n"
+" ${user.company_id.name} \n"
+"
\n"
+"
\n"
+" \n"
+" "
+
+#. module: exp_transaction_documents
+#: model:mail.template,body_html:exp_transaction_documents.internal_notify_forward_email
+msgid ""
+"\n"
+" \n"
+" \n"
+"
السادة الفضلاء: ${object.forward_user_id.name}
\n"
+"
حفظهم الله،،
\n"
+"
\n"
+" السلام عليكم ورحمة الله.\n"
+"\n"
+"
\n"
+"
\n"
+" توجد إحالة واردة للمعاملة\n"
+"
\n"
+"
\n"
+" يمكنكم الان المتابعة و تنفيذ الإجراء المطلوب\n"
+"
\n"
+"
\n"
+"
\n"
+" \n"
+" رقم المعاملة : \n"
+" ${object.name} \n"
+" \n"
+" \n"
+" موضوع المعاملة : \n"
+" ${object.subject} \n"
+" \n"
+" \n"
+" محالة من قِبل : \n"
+" ${object.get_latest_forward().from_id.name} \n"
+" \n"
+" \n"
+" الإجراء المطلوب : \n"
+" ${object.get_latest_forward().procedure_id.name} \n"
+" \n"
+" \n"
+" تاريخ الإحالة : \n"
+" ${object.get_latest_forward().date} \n"
+" \n"
+"\n"
+" \n"
+" نوع المعاملة : \n"
+" ${object.subject_type_id.name} \n"
+" \n"
+" \n"
+" معِد المعاملة : \n"
+" ${object.employee_id.name} \n"
+" \n"
+" \n"
+" آخر موعد لانجاز المعاملة : \n"
+" ${object.due_date} \n"
+" \n"
+"
\n"
+"
\n"
+"
\n"
+" رابط المعاملة \n"
+"
\n"
+"
\n"
+" ${user.company_id.name} \n"
+"
\n"
+"
\n"
+" \n"
+" "
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:mail.template,body_html:exp_transaction_documents.out_ready_email
+msgid ""
+"\n"
+" \n"
+" \n"
+"
،، ${object.employee_id.name} - السادة الفضلاء
\n"
+"
حفظهم الله،،
\n"
+"
\n"
+" السلام عليكم ورحمة الله.\n"
+"
\n"
+"
\n"
+" تم اعتماد الادارة التنفيذية لمعاملة الصادر\n"
+"
\n"
+"
\n"
+" يمكنكم الان المتابعة و ترميز المعاملة كمرسل حال اكتمال اجراءات الارسال،،\n"
+"
\n"
+"
\n"
+"
\n"
+" \n"
+" رقم المعاملة : \n"
+" ${object.name} \n"
+" \n"
+" \n"
+" جهة الصادر : \n"
+" ${object.to_ids[0].name} \n"
+" \n"
+" \n"
+" : موضوع المعاملة \n"
+" ${object.subject} \n"
+" \n"
+" \n"
+" : نوع المعاملة \n"
+" ${object.subject_type_id.name} \n"
+" \n"
+" \n"
+" : معِد المعاملة \n"
+" ${object.employee_id.name} \n"
+" \n"
+" \n"
+" : آخر موعد لإنجاز المعاملة \n"
+" ${object.due_date} \n"
+" \n"
+"
\n"
+"
\n"
+"
\n"
+" رابط المعاملة \n"
+"
\n"
+"
\n"
+" ${user.company_id.name} \n"
+"\n"
+"\n"
+"
\n"
+"\n"
+"
\n"
+" \n"
+" "
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:mail.template,body_html:exp_transaction_documents.out_email
+msgid ""
+"\n"
+" \n"
+" \n"
+"
،، ${object.employee_id.name} - السادة الفضلاء
\n"
+"
حفظهم الله،،
\n"
+"
\n"
+" السلام عليكم ورحمة الله.\n"
+"
\n"
+"
\n"
+"
\n"
+" \n"
+" رقم المعاملة : \n"
+" ${object.name} \n"
+" \n"
+" \n"
+" جهة الصادر : \n"
+" ${object.to_ids[0].name} \n"
+" \n"
+" \n"
+" : موضوع المعاملة \n"
+" ${object.subject} \n"
+" \n"
+" \n"
+" : نوع المعاملة \n"
+" ${object.subject_type_id.name} \n"
+" \n"
+" \n"
+" : معِد المعاملة \n"
+" ${object.employee_id.name} \n"
+" \n"
+"\n"
+"
\n"
+"
\n"
+"
\n"
+" رابط المعاملة \n"
+"
\n"
+"
\n"
+" ${user.company_id.name} \n"
+"\n"
+"\n"
+"
\n"
+"\n"
+"
\n"
+" \n"
+" "
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:mail.template,body_html:exp_transaction_documents.out_approval2_request_email
+msgid ""
+"\n"
+" \n"
+" \n"
+"
،، ${object.get_second_manager().name|safe} - السادة الفضلاء
\n"
+"
حفظهم الله،،
\n"
+"
\n"
+" السلام عليكم ورحمة الله.\n"
+"\n"
+"
\n"
+"
\n"
+" توجد معاملة صادر جديدة في انتظار اعتماد الإدارة التنفيذية\n"
+"
\n"
+"
\n"
+"
\n"
+" \n"
+" رقم المعاملة : \n"
+" ${object.name} \n"
+" \n"
+" \n"
+" جهة الصادر : \n"
+" ${object.to_ids[0].name} \n"
+" \n"
+" \n"
+" : موضوع المعاملة \n"
+" ${object.subject} \n"
+" \n"
+" \n"
+" : نوع المعاملة \n"
+" ${object.subject_type_id.name} \n"
+" \n"
+" \n"
+" : معِد المعاملة \n"
+" ${object.employee_id.name} \n"
+" \n"
+" \n"
+" : الإدارة المعدّة \n"
+" ${object.preparation_id.name} \n"
+" \n"
+" \n"
+" : آخر موعد لإنجاز المعاملة \n"
+" ${object.due_date} \n"
+" \n"
+"
\n"
+"
\n"
+"
\n"
+" رابط المعاملة \n"
+"
\n"
+"
\n"
+" ${user.company_id.name} \n"
+"\n"
+"\n"
+"
\n"
+"\n"
+"
\n"
+" \n"
+" "
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:mail.template,body_html:exp_transaction_documents.internal_approval1_request_email
+msgid ""
+"\n"
+" \n"
+" \n"
+"
،، ${object.preparation_id.manager_id.name|safe} - السادة الفضلاء
\n"
+"
حفظهم الله،،
\n"
+"
\n"
+" السلام عليكم ورحمة الله.\n"
+"
\n"
+"
\n"
+" توجد معاملة داخلية في انتظار اعتماد الإدارة\n"
+"
\n"
+"
\n"
+"
\n"
+" \n"
+" موجهة الى : \n"
+" ${object.to_ids[0].name} \n"
+" \n"
+" \n"
+" : موضوع المعاملة \n"
+" ${object.subject} \n"
+" \n"
+" \n"
+" : نوع المعاملة \n"
+" ${object.subject_type_id.name} \n"
+" \n"
+" \n"
+" : الإدارة المعدة \n"
+" ${object.preparation_id.name} \n"
+" \n"
+" \n"
+" : معِد المعاملة \n"
+" ${object.employee_id.name} \n"
+" \n"
+" \n"
+" : آخر موعد لإنجاز المعاملة \n"
+" ${object.due_date} \n"
+" \n"
+"
\n"
+"
\n"
+"
\n"
+" رابط المعاملة \n"
+"
\n"
+"
\n"
+" ${user.company_id.name} \n"
+"
\n"
+"
\n"
+" \n"
+" "
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:mail.template,body_html:exp_transaction_documents.out_approval1_request_email
+msgid ""
+"\n"
+" \n"
+" \n"
+"
،، ${object.preparation_id.manager_id.name} - السادة الفضلاء
\n"
+"
حفظهم الله،،
\n"
+"
\n"
+" السلام عليكم ورحمة الله.\n"
+"
\n"
+"
\n"
+" توجد معاملة صادر جديدة في انتظار اعتماد مسئول الوحدة (${object.preparation_id.name})\n"
+"
\n"
+"
\n"
+"
\n"
+" \n"
+" جهة الصادر : \n"
+" ${object.to_ids[0].name} \n"
+" \n"
+" \n"
+" : موضوع المعاملة \n"
+" ${object.subject} \n"
+" \n"
+" \n"
+" : نوع المعاملة \n"
+" ${object.subject_type_id.name} \n"
+" \n"
+" \n"
+" : معِد المعاملة \n"
+" ${object.employee_id.name} \n"
+" \n"
+" \n"
+" : آخر موعد لإنجاز المعاملة \n"
+" ${object.due_date} \n"
+" \n"
+"
\n"
+"
\n"
+"
\n"
+" رابط المعاملة \n"
+"
\n"
+"
\n"
+" ${user.company_id.name} \n"
+"\n"
+"\n"
+"
\n"
+"\n"
+"
\n"
+" \n"
+" "
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:mail.template,body_html:exp_transaction_documents.incoming_notify_send_send_email
+msgid ""
+"\n"
+" \n"
+" \n"
+"
السادة الفضلاء: ${object.get_name()}
\n"
+"
حفظهم الله،،
\n"
+"
\n"
+" السلام عليكم ورحمة الله.\n"
+"\n"
+"
\n"
+"
\n"
+" توجد معاملة خارجية واردة للمعاملة\n"
+"
\n"
+"\n"
+"
\n"
+" يمكنكم الان المتابعة و تنفيذ الإجراء المطلوب\n"
+"
\n"
+"
\n"
+"
\n"
+" \n"
+" رقم المعاملة : \n"
+" ${object.name} \n"
+" \n"
+" \n"
+" موضوع المعاملة : \n"
+" ${object.subject} \n"
+" \n"
+"\n"
+" \n"
+" نوع المعاملة : \n"
+" ${object.subject_type_id.name} \n"
+" \n"
+" \n"
+" معِد المعاملة : \n"
+" ${object.employee_id.name} \n"
+" \n"
+" \n"
+" آخر موعد لانجاز المعاملة : \n"
+" ${object.due_date} \n"
+" \n"
+"
\n"
+"
\n"
+"
\n"
+" رابط المعاملة \n"
+"
\n"
+"
\n"
+" ${user.company_id.name} \n"
+"\n"
+"\n"
+"
\n"
+"\n"
+"
\n"
+" \n"
+" "
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:mail.template,body_html:exp_transaction_documents.internal_notify_send_send_email
+msgid ""
+"\n"
+" \n"
+" \n"
+"
السادة الفضلاء: ${object.get_name()}
\n"
+"
حفظهم الله،،
\n"
+"
\n"
+" السلام عليكم ورحمة الله.\n"
+"
\n"
+"
\n"
+" توجد معاملة مرسلة\n"
+"
\n"
+"
\n"
+" يمكنكم الان المتابعة و تنفيذ الإجراء المطلوب\n"
+"
\n"
+"
\n"
+"
\n"
+" \n"
+" رقم المعاملة : \n"
+" ${object.name} \n"
+" \n"
+" \n"
+" موضوع المعاملة : \n"
+" ${object.subject} \n"
+" \n"
+" \n"
+" نوع المعاملة : \n"
+" ${object.subject_type_id.name} \n"
+" \n"
+" \n"
+" معِد المعاملة : \n"
+" ${object.employee_id.name} \n"
+" \n"
+" \n"
+" آخر موعد لانجاز المعاملة : \n"
+" ${object.due_date} \n"
+" \n"
+"
\n"
+"
\n"
+"
\n"
+" رابط المعاملة \n"
+"
\n"
+"
\n"
+" ${user.company_id.name} \n"
+"
\n"
+"
\n"
+" \n"
+" "
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:mail.template,body_html:exp_transaction_documents.internal_return_transaction_email
+msgid ""
+"\n"
+" \n"
+" \n"
+"
السادة الفضلاء: ${object.employee_id.name}
\n"
+"
حفظهم الله،،
\n"
+"
\n"
+" السلام عليكم ورحمة الله.\n"
+"\n"
+"
\n"
+"
\n"
+" تم إرجاع المعاملة\n"
+"
\n"
+"
\n"
+"
\n"
+" \n"
+" رقم المعاملة : \n"
+" ${object.name} \n"
+" \n"
+" \n"
+" موضوع المعاملة : \n"
+" ${object.subject} \n"
+" \n"
+"\n"
+" \n"
+" الملاحظات : \n"
+" ${object.get_latest_by_action('return').note} \n"
+" \n"
+" \n"
+" تاريخ إرجاع المعاملة : \n"
+" ${object.get_latest_by_action('return').date} \n"
+" \n"
+" \n"
+" نوع المعاملة : \n"
+" ${object.subject_type_id.name} \n"
+" \n"
+" \n"
+" معِد المعاملة : \n"
+" ${object.employee_id.name} \n"
+" \n"
+" \n"
+" آخر موعد لانجاز المعاملة : \n"
+" ${object.due_date} \n"
+" \n"
+"
\n"
+"
\n"
+"
\n"
+" يمكنكم الان المتابعة و تنفيذ الإجراء المطلوب\n"
+"
\n"
+"
\n"
+"\n"
+"
\n"
+" رابط المعاملة \n"
+"
\n"
+"\n"
+"
\n"
+" ${user.company_id.name} \n"
+"\n"
+"\n"
+"
\n"
+"\n"
+"
\n"
+" \n"
+" "
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:mail.template,body_html:exp_transaction_documents.internal_reopen_transaction_email
+msgid ""
+"\n"
+" \n"
+" \n"
+"
السادة الفضلاء: ${object.employee_id.name}
\n"
+"
حفظهم الله،،
\n"
+"
\n"
+" السلام عليكم ورحمة الله.\n"
+"\n"
+"
\n"
+"
\n"
+" تم اعادة فتح المعاملة\n"
+"
\n"
+"
\n"
+"
\n"
+" \n"
+" رقم المعاملة : \n"
+" ${object.name} \n"
+" \n"
+" \n"
+" موضوع المعاملة : \n"
+" ${object.subject} \n"
+" \n"
+" \n"
+" الإجراء المطلوب : \n"
+" ${object.get_latest_by_action('reopen').procedure_id.name} \n"
+" \n"
+" \n"
+" الملاحظات : \n"
+" ${object.get_latest_by_action('reopen').note} \n"
+" \n"
+" \n"
+" تاريخ اعادة فتح المعاملة : \n"
+" ${object.get_latest_by_action('reopen').date} \n"
+" \n"
+" \n"
+" نوع المعاملة : \n"
+" ${object.subject_type_id.name} \n"
+" \n"
+" \n"
+" معِد المعاملة : \n"
+" ${object.employee_id.name} \n"
+" \n"
+" \n"
+" آخر موعد لانجاز المعاملة : \n"
+" ${object.due_date} \n"
+" \n"
+"
\n"
+"
\n"
+"
\n"
+" يمكنكم الان المتابعة و تنفيذ الإجراء المطلوب\n"
+"
\n"
+"
\n"
+"\n"
+"
\n"
+" رابط المعاملة \n"
+"
\n"
+"\n"
+"
\n"
+" ${user.company_id.name} \n"
+"\n"
+"\n"
+"
\n"
+"\n"
+"
\n"
+" \n"
+" "
+msgstr ""
+"\n"
+" \n"
+" \n"
+"
السادة الفضلاء: ${object.employee_id.name}
\n"
+"
حفظهم الله،،
\n"
+"
\n"
+" السلام عليكم ورحمة الله.\n"
+"\n"
+"
\n"
+"
\n"
+" تم اعادة فتح المعاملة\n"
+"
\n"
+"
\n"
+" يمكنكم الان المتابعة و تنفيذ الإجراء المطلوب\n"
+"
\n"
+"
\n"
+"
\n"
+"
\n"
+" \n"
+" رقم المعاملة : \n"
+" ${object.name} \n"
+" \n"
+" \n"
+" موضوع المعاملة : \n"
+" ${object.subject} \n"
+" \n"
+" \n"
+" نوع المعاملة : \n"
+" ${object.subject_type_id.name} \n"
+" \n"
+"
\n"
+"
\n"
+"\n"
+"
\n"
+" رابط المعاملة \n"
+"
\n"
+"\n"
+"
\n"
+" ${user.company_id.name} \n"
+"\n"
+"\n"
+"
\n"
+"\n"
+"
\n"
+" \n"
+" "
+
+#. module: exp_transaction_documents
+#: model:mail.template,body_html:exp_transaction_documents.internal_reject_transaction_email
+msgid ""
+"\n"
+" \n"
+" \n"
+"
السادة الفضلاء: ${object.employee_id.name}
\n"
+"
حفظهم الله،،
\n"
+"
\n"
+" السلام عليكم ورحمة الله.\n"
+"\n"
+"
\n"
+"
\n"
+" تم رفض المعاملة\n"
+"
\n"
+"
\n"
+"
\n"
+" \n"
+" رقم المعاملة : \n"
+" ${object.name} \n"
+" \n"
+" \n"
+" موضوع المعاملة : \n"
+" ${object.subject} \n"
+" \n"
+"\n"
+" \n"
+" اسباب الرفض : \n"
+" ${object.get_latest_by_action('refuse').note} \n"
+" \n"
+" \n"
+" تاريخ رفض المعاملة : \n"
+" ${object.get_latest_by_action('refuse').date} \n"
+" \n"
+" \n"
+" نوع المعاملة : \n"
+" ${object.subject_type_id.name} \n"
+" \n"
+" \n"
+" معِد المعاملة : \n"
+" ${object.employee_id.name} \n"
+" \n"
+" \n"
+" آخر موعد لانجاز المعاملة : \n"
+" ${object.due_date} \n"
+" \n"
+"
\n"
+"
\n"
+"
\n"
+" يمكنكم الان المتابعة و تنفيذ الإجراء المطلوب\n"
+"
\n"
+"
\n"
+"\n"
+"
\n"
+" رابط المعاملة \n"
+"
\n"
+"\n"
+"
\n"
+" ${user.company_id.name} \n"
+"
\n"
+"
\n"
+" \n"
+" "
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:mail.template,body_html:exp_transaction_documents.internal_late_transaction_email
+msgid ""
+"\n"
+" \n"
+" \n"
+"
السادة الفضلاء: ${object.employee_id.name}
\n"
+"
حفظهم الله،،
\n"
+"
\n"
+" السلام عليكم ورحمة الله.\n"
+"
\n"
+"
\n"
+" تأخر معاملة\n"
+"
\n"
+"
\n"
+"
\n"
+" \n"
+" رقم المعاملة : \n"
+" ${object.name} \n"
+" \n"
+" \n"
+" موضوع المعاملة : \n"
+" ${object.subject} \n"
+" \n"
+" \n"
+" نوع المعاملة : \n"
+" ${object.subject_type_id.name} \n"
+" \n"
+" \n"
+" معِد المعاملة : \n"
+" ${object.employee_id.name} \n"
+" \n"
+" \n"
+" آخر موعد لانجاز المعاملة : \n"
+" ${object.due_date} \n"
+" \n"
+"
\n"
+"
\n"
+"
\n"
+" يمكنكم الان المتابعة و تنفيذ الإجراء المطلوب\n"
+"
\n"
+"
\n"
+"
\n"
+" رابط المعاملة \n"
+"
\n"
+"
\n"
+" ${user.company_id.name} \n"
+"
\n"
+"
\n"
+" \n"
+" "
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,help:exp_transaction_documents.field_cm_entity__year_increment
+msgid ""
+"\n"
+" Check if you want to continue incrementing in the start of every new year.\n"
+" "
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:mail.template,subject:exp_transaction_documents.incoming_notify_send_send_email
+msgid " معاملة خارجية واردة "
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:mail.template,subject:exp_transaction_documents.internal_notify_forward_email
+msgid " إحالة واردة: معاملة داخلية بالرقم ${object.name|safe}"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:mail.template,subject:exp_transaction_documents.internal_return_transaction_email
+msgid " إرجاع المعاملة ${object.name|safe}"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:mail.template,subject:exp_transaction_documents.internal_reopen_transaction_email
+msgid " إعادة فتح المعاملة ${object.name|safe}"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:mail.template,subject:exp_transaction_documents.out_approval2_request_email
+msgid ""
+" إعتماد الإدارة التنفيذية لمعاملة صادر موجهة الى \n"
+" ${object.to_ids[0].name|safe}\n"
+" "
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:mail.template,subject:exp_transaction_documents.internal_approval1_request_email
+msgid ""
+" إعتماد الإدارة لمعاملة داخلية موجهة الى ${object.to_ids[0].name|safe}"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:mail.template,subject:exp_transaction_documents.out_approval1_request_email
+msgid " إعتماد معاملة صادر موجهة الى ${object.to_ids[0].name|safe}"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:mail.template,subject:exp_transaction_documents.out_ready_email
+msgid ""
+" تم إعتماد الإدارة التنفيذية لمعاملة صادر موجهة الى \n"
+" ${object.to_ids[0].name|safe} بالرقم ${object.name|safe}\n"
+" "
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:mail.template,subject:exp_transaction_documents.internal_notify_send_send_email
+msgid " تم ارسال المعاملة : معاملة داخلية بالرقم ${object.name|safe}"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:mail.template,subject:exp_transaction_documents.internal_notify_close_email
+msgid " حفظ المعاملة بالرقم ${object.name|safe}"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:mail.template,subject:exp_transaction_documents.internal_notify_reply_email
+msgid " رد على إحالة: معاملة داخلية بالرقم ${object.name|safe}"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:mail.template,subject:exp_transaction_documents.out_email
+msgid "${object.to_ids[0].name|safe} بالرقم ${object.name|safe}"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.actions.report,print_report_name:exp_transaction_documents.report_incoming_transaction_receive_report
+#: model:ir.actions.report,print_report_name:exp_transaction_documents.report_internal_transaction_receive_report
+#: model:ir.actions.report,print_report_name:exp_transaction_documents.report_outgoing_transaction_receive_report
+msgid "'Transaction Letter Name- %s' % (object.name)"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.actions.report,print_report_name:exp_transaction_documents.report_incoming_transaction_detail_report
+#: model:ir.actions.report,print_report_name:exp_transaction_documents.report_internal_transaction_detail_report
+#: model:ir.actions.report,print_report_name:exp_transaction_documents.report_outgoing_transaction_detail_report
+msgid "'Transaction Name- %s' % (object.name)"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_outgoing_receive_report_temp
+msgid "- Corresponding -"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_transaction_trace__action
+msgid "Action"
+msgstr "الاجراء"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__message_needaction
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__message_needaction
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__message_needaction
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__message_needaction
+msgid "Action Needed"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/configuration.py:0
+#: code:addons/exp_transaction_documents/models/incoming_transaction.py:0
+#: code:addons/exp_transaction_documents/models/internal_transaction.py:0
+#: code:addons/exp_transaction_documents/models/internal_transaction.py:0
+#: code:addons/exp_transaction_documents/models/outgoing_transaction.py:0
+#: code:addons/exp_transaction_documents/wizard/forward_trasaction.py:0
+#: code:addons/exp_transaction_documents/wizard/reopen_transaction_wizard.py:0
+#: code:addons/exp_transaction_documents/wizard/transaction_reply_wizard.py:0
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_transaction_trace__procedure_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_reopen_transaction_wizard__procedure_id
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__cm_transaction_trace__action__action
+#, python-format
+msgid "Action Taken"
+msgstr "الاجراء المطلوب"
+
+#. module: exp_transaction_documents
+#: model:ir.actions.server,name:exp_transaction_documents.action_add_incoming_transaction_from
+#: model:ir.actions.server,name:exp_transaction_documents.action_add_internal_transaction_from
+#: model:ir.actions.server,name:exp_transaction_documents.action_add_out_transaction_from
+msgid "Add To Favorite"
+msgstr "اضافة الى المفضلة"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_outgoing_external_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.internal_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.outgoing_external_transaction_form
+msgid "Approve"
+msgstr "موافقة"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.archive_transaction_wizard_view
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transaction_external_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.incoming_external_transaction_form
+msgid "Archive"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__archive_user_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__archive_user_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__archive_user_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__archive_user_id
+msgid "Archive Entity"
+msgstr "أرشفة"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_archive_transaction_wizard__archive_type_id
+msgid "Archive Reason"
+msgstr "سبب الأرشفة"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/transaction.py:0
+#: model:ir.ui.menu,name:exp_transaction_documents.parent_archive_tran_menu
+#, python-format
+msgid "Archive Transaction"
+msgstr "أرشفة المعاملات"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_archive_type__name
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_transaction_trace__archive_type_id
+msgid "Archive Type"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.actions.act_window,name:exp_transaction_documents.cm_archive_type_list_action
+#: model:ir.ui.menu,name:exp_transaction_documents.cm_transaction_archive_type_menu
+msgid "Archive Types"
+msgstr "مبررات الحفظ و الارشفة"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/configuration.py:0
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__cm_transaction_trace__action__archive
+#, python-format
+msgid "Archived"
+msgstr "مؤرشف"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_outgoing_external_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.internal_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.outgoing_external_transaction_form
+msgid "Are you sure you want to approve transaction ?"
+msgstr "هل تريد بالتأكيد الموافقة علي المعاملة؟"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.outgoing_external_transaction_form
+msgid "Are you sure you want to complete transaction ?"
+msgstr "هل تريد بالتأكيد استكمال علي المعاملة؟"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_outgoing_external_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transaction_external_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.internal_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.outgoing_external_transaction_form
+msgid "Are you sure you want to reopen transaction ?"
+msgstr "هل تريد بالتأكيد إعادة فتح المعاملة؟"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_outgoing_external_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.incoming_external_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.internal_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.outgoing_external_transaction_form
+msgid "Are you sure you want to restore transaction ?"
+msgstr "هل تريد بالتأكيد استعادة المعاملة؟"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_outgoing_external_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transactions_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.internal_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.outgoing_external_transaction_form
+msgid "Are you sure you want to send transaction ?"
+msgstr "هل تريد بالتأكيد إرسال المعاملة؟"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.outgoing_external_transaction_form
+msgid "Are you sure you want to send transaction by Email ?"
+msgstr "هل تريد إرسال المعاملة عبر البريد الإلكتروني؟"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_forward_transaction_wizard__att_description
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_reply_wizard__att_description
+msgid "Attach Description"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__attachment_rule_ids
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__attachment_rule_ids
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__attachment_rule_ids
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transactions_incoming_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transactions_internal_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transactions_outgoing_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_details_report_temp
+msgid "Attaches"
+msgstr "المرفقات"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__attachment_count
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__message_attachment_count
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__message_attachment_count
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__message_attachment_count
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__message_attachment_count
+msgid "Attachment Count"
+msgstr "عدد المرفقات"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment_rule__attachment_filename
+msgid "Attachment Filename"
+msgstr "اسم ملف الارفاق"
+
+#. module: exp_transaction_documents
+#: model:ir.actions.act_window,name:exp_transaction_documents.cm_attachment_type_list_action
+#: model:ir.ui.menu,name:exp_transaction_documents.cm_attachment_type_menu
+msgid "Attachment Types"
+msgstr "انواع المشفوعات"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment__type_id
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_details_report_temp
+msgid "Attachment type"
+msgstr "نوع المرفق"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__attachment_ids
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__attachment_ids
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__attachment_ids
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transactions_incoming_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transactions_internal_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transactions_outgoing_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_details_report_temp
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_outgoing_receive_report_temp
+msgid "Attachments"
+msgstr "المرفقات"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__tran_tag_unit
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__tran_tag_unit
+msgid "Business unit"
+msgstr "وحدة عمل"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_transaction_trace__cc_ids
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_forward_transaction_wizard__cc_ids
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__cc_ids
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__cc_ids
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__cc_ids
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_reply_wizard__cc_ids
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_details_report_temp
+msgid "CC To"
+msgstr "نسخة إلي"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/configuration.py:0
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__cm_transaction_trace__action__ceo_approve
+#, python-format
+msgid "CEO Approved"
+msgstr "إعتماد مدير التنفيذ"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.archive_transaction_wizard_view
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.forward_transaction_wizard_view
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.incoming_external_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.internal_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.outgoing_external_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.reopen_transaction_wizard_view
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.reply_transaction_wizard_view
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.view_reject_transaction_wizard
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.view_return_transaction_wizard
+msgid "Cancel"
+msgstr "إلغاء"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/transaction.py:0
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__incoming_transaction__state__canceled
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__internal_transaction__state__canceled
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__outgoing_transaction__state__canceled
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__transaction_transaction__state__canceled
+#, python-format
+msgid "Canceled"
+msgstr "ملغاة"
+
+#. module: exp_transaction_documents
+#: model:ir.actions.act_window,name:exp_transaction_documents.dep_outgoing_external_tran_cancelled_action
+#: model:ir.actions.act_window,name:exp_transaction_documents.outgoing_external_tran_cancelled_action
+msgid "Canceled Transaction"
+msgstr "إلغاء المعامله"
+
+#. module: exp_transaction_documents
+#: model:ir.actions.act_window,name:exp_transaction_documents.cancel_internal_tran_action
+#: model:ir.actions.act_window,name:exp_transaction_documents.dep_cancel_internal_tran_action
+#: model:ir.ui.menu,name:exp_transaction_documents.cancel_internal_tran_menu
+#: model:ir.ui.menu,name:exp_transaction_documents.dep_cancel_internal_tran_menu
+#: model:ir.ui.menu,name:exp_transaction_documents.dep_outgoing_external_tran_cancelled_menu
+#: model:ir.ui.menu,name:exp_transaction_documents.outgoing_external_tran_cancelled_menu
+msgid "Cancelled Transaction"
+msgstr "المعاملات الملغية"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,help:exp_transaction_documents.field_cm_subject_type__second_approval
+msgid "Check if this transaction type need a second (CEO) Approval."
+msgstr ""
+"تحقق مما إذا كان هذا النوع من المعاملات يحتاج إلى موافقة ثانية (من الرئيس "
+"التنفيذي)"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/transaction.py:0
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__incoming_transaction__state__closed
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__internal_transaction__state__closed
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__outgoing_transaction__state__closed
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__transaction_transaction__state__closed
+#, python-format
+msgid "Closed"
+msgstr "مغلقة"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_entity__code
+msgid "Code"
+msgstr "الكود"
+
+#. module: exp_transaction_documents
+#: model:ir.module.category,name:exp_transaction_documents.module_category_cm
+msgid "Communications Management"
+msgstr "ادارة المراسلات"
+
+#. module: exp_transaction_documents
+#: model:ir.ui.menu,name:exp_transaction_documents.cm_settings_menu
+msgid "Configuration"
+msgstr "الإعدادات"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.view_reject_transaction_wizard
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.view_return_transaction_wizard
+msgid "Confirm"
+msgstr "تأكيد"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_entity__year_increment
+msgid "Continue Increment every year?"
+msgstr "استكمال الزيادة كل عام"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_details_report_temp
+msgid "Create by"
+msgstr "أنشأ بواسطة"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.actions.act_window,help:exp_transaction_documents.cm_archive_type_list_action
+msgid "Create the first Archive Type"
+msgstr "إنشاء نوع الأرشيف الأول"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.actions.act_window,help:exp_transaction_documents.cm_attachment_type_list_action
+msgid "Create the first Attachment Type"
+msgstr "إنشاء نوع المرفق الأول"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.actions.act_window,help:exp_transaction_documents.cm_entity_list_action
+msgid "Create the first Entity"
+msgstr "إنشاء الجهة الأولي"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.actions.act_window,help:exp_transaction_documents.incoming_external_tran_action
+msgid "Create the first External Incoming Transaction"
+msgstr "أنشئ المعاملة الخارجية الأولي"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.actions.act_window,help:exp_transaction_documents.outgoing_external_tran_action
+msgid "Create the first External outgoing Transaction"
+msgstr "أنشئ المعاملة الخارجية الأولي"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.actions.act_window,help:exp_transaction_documents.cm_transaction_important_list_action
+msgid "Create the first Important Degrees"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model_terms:ir.actions.act_window,help:exp_transaction_documents.cm_job_title_list_action
+msgid "Create the first Job titles"
+msgstr "إنشاء أولى الألقاب الوظيفية"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.actions.act_window,help:exp_transaction_documents.outgoing_internal_tran_action
+msgid "Create the first Outgoing Internal Transaction"
+msgstr "إنشاء أول معاملة داخلية صادرة"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.actions.act_window,help:exp_transaction_documents.cm_procedure_list_action
+msgid "Create the first Procedures"
+msgstr "إنشاء أول الإجراءات"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.actions.act_window,help:exp_transaction_documents.cm_subject_type_list_action
+msgid "Create the first Subject Type"
+msgstr "إنشاء أول نوع للموضوع"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.actions.act_window,help:exp_transaction_documents.transaction_tag_action
+msgid "Create the first Transaction Tag"
+msgstr "إنشاء أول وسم للمعاملة"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment_rule__employee_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__employee_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__employee_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__employee_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__employee_id
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_details_report_temp
+msgid "Created By"
+msgstr "أنشأ بواسطة"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_archive_transaction_wizard__create_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_archive_type__create_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment__create_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment_rule__create_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment_type__create_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_entity__create_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_job_title__create_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_procedure__create_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_subject_type__create_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_transaction_important__create_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_transaction_trace__create_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_forward_transaction_wizard__create_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__create_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__create_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_odex_barcode__create_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__create_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_project_type__create_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_reject_reason_wizard__create_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_reopen_transaction_wizard__create_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_reply_wizard__create_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_tag__create_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__create_uid
+msgid "Created by"
+msgstr "أنشأ بواسطة"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_archive_transaction_wizard__create_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_archive_type__create_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment__create_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment_rule__create_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment_type__create_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_entity__create_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_job_title__create_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_procedure__create_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_subject_type__create_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_transaction_important__create_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_transaction_trace__create_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_forward_transaction_wizard__create_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__create_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__create_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_odex_barcode__create_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__create_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_project_type__create_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_reject_reason_wizard__create_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_reopen_transaction_wizard__create_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_reply_wizard__create_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_tag__create_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__create_date
+msgid "Created on"
+msgstr "أنشأ بتاريخ"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_archive_transaction_wizard__date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment_rule__date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_transaction_trace__date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_forward_transaction_wizard__date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_reopen_transaction_wizard__date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_reply_wizard__date
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_details_report_temp
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_outgoing_receive_report_temp
+msgid "Date"
+msgstr "التاريخ"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__due_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__due_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__due_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__due_date
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_details_report_temp
+msgid "Deadline"
+msgstr "الموعد النهائي"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_outgoing_receive_report_temp
+msgid "Departament"
+msgstr "القسم"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_entity__department_id
+msgid "Department"
+msgstr "القسم"
+
+#. module: exp_transaction_documents
+#: model:res.groups,name:exp_transaction_documents.group_cm_department_manager
+msgid "Department Manager"
+msgstr "مدير الوحدة"
+
+#. module: exp_transaction_documents
+#: model:ir.ui.menu,name:exp_transaction_documents.parent_department_tran_menu
+msgid "Department Transaction"
+msgstr "معاملات الوحدة"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment__name
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment_rule__description
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_forward_transaction_wizard__description
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_reopen_transaction_wizard__reason
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_reply_wizard__description
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_details_report_temp
+msgid "Description"
+msgstr "الوصف"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_archive_transaction_wizard__display_name
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_archive_type__display_name
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment__display_name
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment_rule__display_name
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment_type__display_name
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_entity__display_name
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_job_title__display_name
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_procedure__display_name
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_subject_type__display_name
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_transaction_important__display_name
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_transaction_trace__display_name
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_forward_transaction_wizard__display_name
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__display_name
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__display_name
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_odex_barcode__display_name
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__display_name
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_project_type__display_name
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_reject_reason_wizard__display_name
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_reopen_transaction_wizard__display_name
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_reply_wizard__display_name
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_tag__display_name
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__display_name
+msgid "Display Name"
+msgstr "الاسم المعروض"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/transaction.py:0
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__incoming_transaction__state__draft
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__internal_transaction__state__draft
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__outgoing_transaction__state__draft
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__transaction_transaction__state__draft
+#, python-format
+msgid "Draft"
+msgstr "مبدئي"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__ean13
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__ean13
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__ean13
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__ean13
+msgid "Ean13"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_entity__email
+msgid "Email"
+msgstr "البريد الﻹلكتروني"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/entity.py:0
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_entity__employee_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_forward_transaction_wizard__employee
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__cm_entity__type__employee
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__forward_transaction_wizard__forward_type__employee
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__internal_transaction__type_sender__employee
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.cm_entity_search
+#, python-format
+msgid "Employee"
+msgstr "الموظف"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_entity__employee_assignment_date
+msgid "Employee Assignment Date"
+msgstr "تاريخ تعيين الموظف"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_entity__secretary_id
+msgid "Employee in charge of transactions"
+msgstr "الموظف المسؤول عن المعاملات"
+
+#. module: exp_transaction_documents
+#: model:ir.actions.act_window,name:exp_transaction_documents.cm_entity_list_action
+#: model:ir.ui.menu,name:exp_transaction_documents.cm_entity_menu
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.cm_entity_tree
+msgid "Entities"
+msgstr "الجهات"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.cm_entity_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_outgoing_receive_report_temp
+msgid "Entity"
+msgstr "الجهة"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_entity__type
+msgid "Entity Type"
+msgstr "نوع الجهة"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_entity__establish_date
+msgid "Establish Date"
+msgstr "تاريخ التأسيس"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_entity__executive_direction
+msgid "Executive direction"
+msgstr "الاتجاه التنفيذي"
+
+#. module: exp_transaction_documents
+#: model:res.groups,name:exp_transaction_documents.group_cm_executive_manager
+msgid "Executive manager"
+msgstr "المدير التنفيذي"
+
+#. module: exp_transaction_documents
+#: model:ir.actions.act_window,name:exp_transaction_documents.external_archive_tran_action
+#: model:ir.ui.menu,name:exp_transaction_documents.external_in_department_tran_menu
+msgid "External Incoming Transaction"
+msgstr "المعاملات الخارجية الوارده"
+
+#. module: exp_transaction_documents
+#: model:ir.ui.menu,name:exp_transaction_documents.external_out_department_tran_menu
+msgid "External Outgoing Transaction"
+msgstr "المعاملات الخارجية الصادره"
+
+#. module: exp_transaction_documents
+#: model:ir.ui.menu,name:exp_transaction_documents.parent_external_tran_menu
+msgid "External Transaction"
+msgstr "المعاملات الخارجية"
+
+#. module: exp_transaction_documents
+#: model:ir.ui.menu,name:exp_transaction_documents.external_archive_tran_menu
+msgid "External Transaction Archive"
+msgstr "المعاملات الخارجية المغلقة"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/entity.py:0
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__cm_entity__type__external
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.cm_entity_search
+#, python-format
+msgid "External Unit"
+msgstr "جهات خارجية"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__is_favorite
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__is_favorite
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__is_favorite
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__is_favorite
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__incoming_transaction__is_favorite__1
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__internal_transaction__is_favorite__1
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__outgoing_transaction__is_favorite__1
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__transaction_transaction__is_favorite__1
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.view_incoming_transaction_filter
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.view_internal_transaction_filter
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.view_outgoing_transaction_filter
+msgid "Favorite"
+msgstr "مفضل"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_forward_transaction_wizard__filename
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_reply_wizard__filename
+msgid "Filename"
+msgstr "اسم الملف"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__message_follower_ids
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__message_follower_ids
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__message_follower_ids
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__message_follower_ids
+msgid "Followers"
+msgstr "المتابعون"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__message_channel_ids
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__message_channel_ids
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__message_channel_ids
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__message_channel_ids
+msgid "Followers (Channels)"
+msgstr "المتابعون"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__message_partner_ids
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__message_partner_ids
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__message_partner_ids
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__message_partner_ids
+msgid "Followers (Partners)"
+msgstr "المتابعون"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transaction_external_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.forward_transaction_wizard_view
+msgid "Forward"
+msgstr "إعادة توجيه"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_forward_transaction_wizard__forward_attachment_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_reply_wizard__attachment_id
+msgid "Forward Attachment"
+msgstr "المرفق للإعادة التوجيه"
+
+#. module: exp_transaction_documents
+#: model:ir.actions.act_window,name:exp_transaction_documents.forward_incoming_external_tran_action
+msgid "Forward External Transaction"
+msgstr "المعاملات الوارده"
+
+#. module: exp_transaction_documents
+#: model:ir.ui.menu,name:exp_transaction_documents.dep_forward_incoming_external_tran_menu
+#: model:ir.ui.menu,name:exp_transaction_documents.forward_incoming_external_tran_menu
+msgid "Forward Incoming Transaction"
+msgstr "معاملات الوارد المحاله"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/transaction.py:0
+#: model:ir.actions.act_window,name:exp_transaction_documents.dep_forward_incoming_external_tran_action
+#: model:ir.actions.act_window,name:exp_transaction_documents.dep_forward_internal_tran_action
+#: model:ir.actions.act_window,name:exp_transaction_documents.forward_internal_tran_action
+#: model:ir.ui.menu,name:exp_transaction_documents.dep_forward_internal_tran_menu
+#: model:ir.ui.menu,name:exp_transaction_documents.forward_internal_tran_menu
+#, python-format
+msgid "Forward Transaction"
+msgstr "المعاملات المحاله"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_forward_transaction_wizard__forward_type
+msgid "Forward Type"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__forward_user_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__forward_user_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__forward_user_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__forward_user_id
+msgid "Forward User"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/configuration.py:0
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__cm_transaction_trace__action__forward
+#, python-format
+msgid "Forwarded"
+msgstr "محالة"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/transaction.py:0
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__incoming_transaction__type__forward
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__internal_transaction__type__forward
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__outgoing_transaction__type__forward
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__transaction_transaction__type__forward
+#, python-format
+msgid "Forwarded Transaction"
+msgstr "إلحاقي"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__last_forwarded_user
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__last_forwarded_user
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__last_forwarded_user
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__last_forwarded_user
+msgid "Forwarded User"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_transaction_trace__from_id
+msgid "From"
+msgstr "من"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.cm_entity_search
+msgid "Group By"
+msgstr "التصنيف ب"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__to_user_have_leave
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__to_user_have_leave
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__to_user_have_leave
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__to_user_have_leave
+msgid "Have Leave?"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.module.category,description:exp_transaction_documents.module_category_cm
+msgid "Helps you manage Communication Transaction"
+msgstr "المساعدة في ادارة المعاملات"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_archive_transaction_wizard__id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_archive_type__id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment__id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment_rule__id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment_type__id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_entity__id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_job_title__id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_procedure__id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_subject_type__id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_transaction_important__id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_transaction_trace__id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_forward_transaction_wizard__id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_odex_barcode__id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_project_type__id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_reject_reason_wizard__id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_reopen_transaction_wizard__id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_reply_wizard__id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_tag__id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__id
+msgid "ID"
+msgstr "المُعرف"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,help:exp_transaction_documents.field_incoming_transaction__message_needaction
+#: model:ir.model.fields,help:exp_transaction_documents.field_incoming_transaction__message_unread
+#: model:ir.model.fields,help:exp_transaction_documents.field_internal_transaction__message_needaction
+#: model:ir.model.fields,help:exp_transaction_documents.field_internal_transaction__message_unread
+#: model:ir.model.fields,help:exp_transaction_documents.field_outgoing_transaction__message_needaction
+#: model:ir.model.fields,help:exp_transaction_documents.field_outgoing_transaction__message_unread
+#: model:ir.model.fields,help:exp_transaction_documents.field_transaction_transaction__message_needaction
+#: model:ir.model.fields,help:exp_transaction_documents.field_transaction_transaction__message_unread
+msgid "If checked, new messages require your attention."
+msgstr "في حالة الاختيار، الرسائل الجديدة تتطلب انتباهك."
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,help:exp_transaction_documents.field_incoming_transaction__message_has_error
+#: model:ir.model.fields,help:exp_transaction_documents.field_incoming_transaction__message_has_sms_error
+#: model:ir.model.fields,help:exp_transaction_documents.field_internal_transaction__message_has_error
+#: model:ir.model.fields,help:exp_transaction_documents.field_internal_transaction__message_has_sms_error
+#: model:ir.model.fields,help:exp_transaction_documents.field_outgoing_transaction__message_has_error
+#: model:ir.model.fields,help:exp_transaction_documents.field_outgoing_transaction__message_has_sms_error
+#: model:ir.model.fields,help:exp_transaction_documents.field_transaction_transaction__message_has_error
+#: model:ir.model.fields,help:exp_transaction_documents.field_transaction_transaction__message_has_sms_error
+msgid "If checked, some messages have a delivery error."
+msgstr "في حالة الاختيار، بعض الرسائل تعاني من خطأ في التسليم."
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_transaction_important__name
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__important_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__important_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__important_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__important_id
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_details_report_temp
+msgid "Important Degree"
+msgstr "درجة الأهمية"
+
+#. module: exp_transaction_documents
+#: model:ir.ui.menu,name:exp_transaction_documents.cm_transaction_important_menu
+msgid "Important Degrees"
+msgstr "درجات الاهمية"
+
+#. module: exp_transaction_documents
+#: model:ir.actions.act_window,name:exp_transaction_documents.cm_transaction_important_list_action
+msgid "Important degrees"
+msgstr "درجات الأهمية"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_archive_transaction_wizard__outgoing_transaction_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_forward_transaction_wizard__outgoing_transaction_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_reject_reason_wizard__outgoing_transaction_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_reopen_transaction_wizard__outgoing_transaction_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_reply_wizard__incoming_transaction_id
+#: model:ir.ui.menu,name:exp_transaction_documents.income_internal_tran_menu
+#: model:ir.ui.menu,name:exp_transaction_documents.parent_external_incoming_tran_menu
+msgid "Incoming"
+msgstr "الوارد"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__incoming_date
+msgid "Incoming Date"
+msgstr "تاريخ الوارد"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__incoming_date_hijri
+msgid "Incoming Date (Hijri)"
+msgstr "تاريخ الوارد (هجري)"
+
+#. module: exp_transaction_documents
+#: model:ir.actions.act_window,name:exp_transaction_documents.dep_incoming_external_tran_action
+msgid "Incoming External Transaction"
+msgstr "المعاملات الوارده"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__from_id
+msgid "Incoming From (External)"
+msgstr "المرسل (خارجي)"
+
+#. module: exp_transaction_documents
+#: model:ir.actions.act_window,name:exp_transaction_documents.incoming_internal_tran_action
+msgid "Incoming Internal Transaction"
+msgstr "المعاملات الوارده"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__incoming_number
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.view_incoming_transaction_filter
+msgid "Incoming Number"
+msgstr "رقم الوارد"
+
+#. module: exp_transaction_documents
+#: model:ir.actions.act_window,name:exp_transaction_documents.dep_incoming_internal_tran_action
+#: model:ir.actions.act_window,name:exp_transaction_documents.incoming_external_tran_action
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment__incoming_transaction_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment_rule__incoming_transaction_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_transaction_trace__incoming_transaction_id
+#: model:ir.ui.menu,name:exp_transaction_documents.dep_incoming_external_tran_menu
+#: model:ir.ui.menu,name:exp_transaction_documents.dep_incoming_internal_tran_menu
+#: model:ir.ui.menu,name:exp_transaction_documents.incoming_external_tran_menu
+#: model:ir.ui.menu,name:exp_transaction_documents.incoming_internal_tran_menu
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transaction_external_tree
+msgid "Incoming Transaction"
+msgstr "المعاملات الوارده"
+
+#. module: exp_transaction_documents
+#: model:res.groups,name:exp_transaction_documents.group_cm_user
+msgid "Incoming/Outgoing Employee"
+msgstr "موظف الصادر / الوارد "
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transactions_incoming_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transactions_internal_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transactions_outgoing_form
+msgid "Information"
+msgstr "معلومات"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_archive_transaction_wizard__internal_transaction_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_forward_transaction_wizard__internal_transaction_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_reject_reason_wizard__internal_transaction_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_reopen_transaction_wizard__internal_transaction_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_reply_wizard__internal_transaction_id
+msgid "Internal"
+msgstr "داخلي"
+
+#. module: exp_transaction_documents
+#: model:ir.actions.act_window,name:exp_transaction_documents.internal_archive_tran_action
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment__internal_transaction_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment_rule__internal_transaction_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_transaction_trace__internal_transaction_id
+#: model:ir.ui.menu,name:exp_transaction_documents.internal_department_tran_menu
+#: model:ir.ui.menu,name:exp_transaction_documents.parent_internal_tran_menu
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transaction_internal_tree
+msgid "Internal Transaction"
+msgstr "المعاملات الداخلية"
+
+#. module: exp_transaction_documents
+#: model:ir.ui.menu,name:exp_transaction_documents.internal_archive_tran_menu
+msgid "Internal Transaction Archive"
+msgstr "المعاملات الداخلية المغلقة "
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/entity.py:0
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_forward_transaction_wizard__internal_unit
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__cm_entity__type__unit
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__forward_transaction_wizard__forward_type__unit
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.cm_entity_search
+#, python-format
+msgid "Internal Unit"
+msgstr "جهة داخلية"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__message_is_follower
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__message_is_follower
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__message_is_follower
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__message_is_follower
+msgid "Is Follower"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__is_forward
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__is_forward
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__is_forward
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__is_forward
+msgid "Is Forward"
+msgstr "محالة؟"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__current_is_forward_user
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__current_is_manager
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__current_is_receive_manger
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__current_is_secret_user
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__current_is_forward_user
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__current_is_manager
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__current_is_receive_manger
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__current_is_secret_user
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__current_is_forward_user
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__current_is_manager
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__current_is_receive_manger
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__current_is_secret_user
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__current_is_forward_user
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__current_is_manager
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__current_is_receive_manger
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__current_is_secret_user
+msgid "Is Manager"
+msgstr "مدير؟"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__is_partner
+msgid "Is Partner"
+msgstr "العميل"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__is_reade
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__is_reade
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__is_reade
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__is_reade
+msgid "Is Reade?!"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_entity__is_secret
+msgid "Is Secret"
+msgstr "سرية؟"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_forward_transaction_wizard__is_secret
+msgid "Is Secret?"
+msgstr "سرية؟"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_benefits_representative__is_transaction_entity
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_external_benefits__is_transaction_entity
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_grant_benefit__is_transaction_entity
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_res_partner__is_transaction_entity
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_res_users__is_transaction_entity
+msgid "Is Transaction Entity?"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:res.groups,comment:exp_transaction_documents.group_cm_department_manager
+msgid "It has all the powers on internal transactions of the department"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:res.groups,comment:exp_transaction_documents.group_cm_reviewer
+msgid "It has all the powers on internal transactions only"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_entity__job_title_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_job_title__name
+msgid "Job Title"
+msgstr "المسمي الوظيفي"
+
+#. module: exp_transaction_documents
+#: model:ir.actions.act_window,name:exp_transaction_documents.cm_job_title_list_action
+#: model:ir.model,name:exp_transaction_documents.model_cm_job_title
+msgid "Job Titles"
+msgstr "المسميات الوظيفية"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_archive_transaction_wizard____last_update
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_archive_type____last_update
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment____last_update
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment_rule____last_update
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment_type____last_update
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_entity____last_update
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_job_title____last_update
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_procedure____last_update
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_subject_type____last_update
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_transaction_important____last_update
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_transaction_trace____last_update
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_forward_transaction_wizard____last_update
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction____last_update
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction____last_update
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_odex_barcode____last_update
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction____last_update
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_project_type____last_update
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_reject_reason_wizard____last_update
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_reopen_transaction_wizard____last_update
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_reply_wizard____last_update
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_tag____last_update
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction____last_update
+msgid "Last Modified on"
+msgstr "آخر تعديل في"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_archive_transaction_wizard__write_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_archive_type__write_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment__write_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment_rule__write_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment_type__write_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_entity__write_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_job_title__write_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_procedure__write_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_subject_type__write_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_transaction_important__write_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_transaction_trace__write_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_forward_transaction_wizard__write_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__write_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__write_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_odex_barcode__write_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__write_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_project_type__write_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_reject_reason_wizard__write_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_reopen_transaction_wizard__write_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_reply_wizard__write_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_tag__write_uid
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__write_uid
+msgid "Last Updated by"
+msgstr "آخر تحديث بواسطة"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_archive_transaction_wizard__write_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_archive_type__write_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment__write_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment_rule__write_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment_type__write_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_entity__write_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_job_title__write_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_procedure__write_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_subject_type__write_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_transaction_important__write_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_transaction_trace__write_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_forward_transaction_wizard__write_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__write_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__write_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_odex_barcode__write_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__write_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_project_type__write_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_reject_reason_wizard__write_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_reopen_transaction_wizard__write_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_reply_wizard__write_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_tag__write_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__write_date
+msgid "Last Updated on"
+msgstr "آخر تعديل في"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__message_main_attachment_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__message_main_attachment_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__message_main_attachment_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__message_main_attachment_id
+msgid "Main Attachment"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__message_has_error
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__message_has_error
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__message_has_error
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__message_has_error
+msgid "Message Delivery error"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/internal_transaction.py:0
+#, python-format
+msgid "Message Has been approved !"
+msgstr "تم اعتماد المعاملة !"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/wizard/archive_transaction.py:0
+#, python-format
+msgid "Message Has been closed !"
+msgstr "تم اغلاق المعاملة !"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/wizard/forward_trasaction.py:0
+#, python-format
+msgid "Message Has been forwarded !"
+msgstr "تمت احالة المعاملة !"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/wizard/reopen_transaction_wizard.py:0
+#, python-format
+msgid "Message Has been reopened !"
+msgstr "تم إعادة فتح المعاملة !"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/wizard/transaction_reply_wizard.py:0
+#, python-format
+msgid "Message Has been replied !"
+msgstr "تم الرد على المعاملة !"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/incoming_transaction.py:0
+#: code:addons/exp_transaction_documents/models/internal_transaction.py:0
+#: code:addons/exp_transaction_documents/models/outgoing_transaction.py:0
+#, python-format
+msgid "Message Has been send !"
+msgstr "تم ارسال المعاملة !"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__message_ids
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__message_ids
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__message_ids
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__message_ids
+msgid "Messages"
+msgstr "الرسائل"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__need_approve
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__need_approve
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__need_approve
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__need_approve
+msgid "NEED approve"
+msgstr "تحتاج لموافقة"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment_rule__name
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment_type__name
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_entity__name
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_project_type__name
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_tag__name
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_details_report_temp
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_outgoing_receive_report_temp
+msgid "Name"
+msgstr "الاسم"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__is_need_approve
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__is_need_approve
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__is_need_approve
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__is_need_approve
+msgid "Need Approve"
+msgstr "تحتاج لموافقة"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_entity__need_approve
+msgid "Need Aprove"
+msgstr "تحتاج لموافقة"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/incoming_transaction.py:0
+#: code:addons/exp_transaction_documents/models/internal_transaction.py:0
+#: code:addons/exp_transaction_documents/models/outgoing_transaction.py:0
+#, python-format
+msgid "New"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/transaction.py:0
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__incoming_transaction__type__new
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__internal_transaction__type__new
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__outgoing_transaction__type__new
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__transaction_transaction__type__new
+#, python-format
+msgid "New Transaction"
+msgstr "معاملة جديدة"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment__num_page
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_details_report_temp
+msgid "No. Pages"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__attachment_num
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__attachment_num
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__attachment_num
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__attachment_num
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_details_report_temp
+msgid "No. of Attachments"
+msgstr "عدد المرفقات"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_archive_transaction_wizard__note
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_transaction_trace__note
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_forward_transaction_wizard__note
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_reopen_transaction_wizard__note
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_reply_wizard__note
+msgid "Notes"
+msgstr "ملاحظات"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_outgoing_receive_report_temp
+msgid "Number"
+msgstr "الرقم"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__message_needaction_counter
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__message_needaction_counter
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__message_needaction_counter
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__message_needaction_counter
+msgid "Number of Actions"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__message_has_error_counter
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__message_has_error_counter
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__message_has_error_counter
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__message_has_error_counter
+msgid "Number of errors"
+msgstr "عدد الأخطاء"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,help:exp_transaction_documents.field_incoming_transaction__message_needaction_counter
+#: model:ir.model.fields,help:exp_transaction_documents.field_internal_transaction__message_needaction_counter
+#: model:ir.model.fields,help:exp_transaction_documents.field_outgoing_transaction__message_needaction_counter
+#: model:ir.model.fields,help:exp_transaction_documents.field_transaction_transaction__message_needaction_counter
+msgid "Number of messages which requires an action"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,help:exp_transaction_documents.field_incoming_transaction__message_has_error_counter
+#: model:ir.model.fields,help:exp_transaction_documents.field_internal_transaction__message_has_error_counter
+#: model:ir.model.fields,help:exp_transaction_documents.field_outgoing_transaction__message_has_error_counter
+#: model:ir.model.fields,help:exp_transaction_documents.field_transaction_transaction__message_has_error_counter
+msgid "Number of messages with delivery error"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,help:exp_transaction_documents.field_incoming_transaction__message_unread_counter
+#: model:ir.model.fields,help:exp_transaction_documents.field_internal_transaction__message_unread_counter
+#: model:ir.model.fields,help:exp_transaction_documents.field_outgoing_transaction__message_unread_counter
+#: model:ir.model.fields,help:exp_transaction_documents.field_transaction_transaction__message_unread_counter
+msgid "Number of unread messages"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_archive_transaction_wizard__incoming_transaction_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_forward_transaction_wizard__incoming_transaction_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_reject_reason_wizard__incoming_transaction_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_reopen_transaction_wizard__incoming_transaction_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_reply_wizard__outgoing_transaction_id
+#: model:ir.ui.menu,name:exp_transaction_documents.out_internal_tran_menu
+#: model:ir.ui.menu,name:exp_transaction_documents.parent_external_outgoing_tran_menu
+msgid "Outgoing"
+msgstr "الصادر"
+
+#. module: exp_transaction_documents
+#: model:ir.actions.act_window,name:exp_transaction_documents.outgoing_external_tran_action
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_outgoing_transaction_external_tree
+msgid "Outgoing External Transaction"
+msgstr "المعاملات الصادره"
+
+#. module: exp_transaction_documents
+#: model:ir.actions.act_window,name:exp_transaction_documents.outgoing_internal_tran_action
+msgid "Outgoing Internal Transaction"
+msgstr "المعاملات الصادره"
+
+#. module: exp_transaction_documents
+#: model:ir.actions.act_window,name:exp_transaction_documents.dep_outgoing_external_tran_action
+#: model:ir.actions.act_window,name:exp_transaction_documents.dep_outgoing_internal_tran_action
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment__outgoing_transaction_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment_rule__outgoing_transaction_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_transaction_trace__outgoing_transaction_id
+#: model:ir.ui.menu,name:exp_transaction_documents.dep_outgoing_external_tran_menu
+#: model:ir.ui.menu,name:exp_transaction_documents.dep_outgoing_internal_tran_menu
+#: model:ir.ui.menu,name:exp_transaction_documents.outgoing_external_tran_menu
+#: model:ir.ui.menu,name:exp_transaction_documents.outgoing_internal_tran_menu
+msgid "Outgoing Transaction"
+msgstr "المعاملات الصادره"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.custom_external_layout_standard_tran
+msgid "Page: / "
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_entity__parent_id
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.cm_entity_search
+msgid "Parent Entity"
+msgstr "القسم الرئيسي"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_entity__partner_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__partner_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__partner_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__partner_id
+msgid "Partner"
+msgstr "الشخص"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_entity__person_id
+msgid "Person ID"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_entity__person_id_issue_date
+msgid "Person ID Issue Date"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_entity__phone
+msgid "Phone"
+msgstr "الجوال"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__preparation_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__preparation_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__preparation_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__preparation_id
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_details_report_temp
+msgid "Preparation Unit"
+msgstr "الادارة المعدة"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_forward_transaction_wizard__procedure_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__procedure_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__procedure_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__procedure_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_reply_wizard__procedure_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__procedure_id
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_details_report_temp
+msgid "Procedure"
+msgstr "العملية"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_procedure__name
+msgid "Procedure Name"
+msgstr "العملية"
+
+#. module: exp_transaction_documents
+#: model:ir.actions.act_window,name:exp_transaction_documents.cm_procedure_list_action
+#: model:ir.ui.menu,name:exp_transaction_documents.cm_transaction_procedure_menu
+msgid "Procedures"
+msgstr "الاجراءات"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__processing_ids
+msgid "Process Transactions"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__processing2_ids
+msgid "Process Transactions Outgoing"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__processing_ids
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__processing2_ids
+msgid "Process Transactions incoming"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__processing_ids
+msgid "Process Transactions outgoing"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__project_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__project_id
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.view_incoming_transaction_filter
+msgid "Project"
+msgstr "المشروع"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__project_domain
+msgid "Project Domain"
+msgstr "مدي المشروع"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__sale_order_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__sale_order_id
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.view_incoming_transaction_filter
+msgid "Proposal"
+msgstr "العرض"
+
+#. module: exp_transaction_documents
+#: model:ir.actions.server,name:exp_transaction_documents.action_read_incoming_transaction_from
+#: model:ir.actions.server,name:exp_transaction_documents.action_read_internal_transaction_from
+#: model:ir.actions.server,name:exp_transaction_documents.action_read_out_transaction_from
+msgid "Read"
+msgstr "مقروء"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__reason
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__reason
+msgid "Reason"
+msgstr "السبب"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/configuration.py:0
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__cm_transaction_trace__action__receive
+#, python-format
+msgid "Received"
+msgstr "مستلمة"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__receive_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__receive_manger_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__receive_user_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__receive_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__receive_manger_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__receive_user_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__receive_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__receive_manger_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__receive_user_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__receive_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__receive_manger_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__receive_user_id
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_outgoing_receive_report_temp
+msgid "Receiver"
+msgstr "المستلم"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_outgoing_receive_report_temp
+msgid "Receiver Transaction Report"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__to_name
+msgid "Recipient"
+msgstr "المستلم"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/configuration.py:0
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__cm_transaction_trace__action__refuse
+#, python-format
+msgid "Refused"
+msgstr "مرفوضة"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_outgoing_external_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.outgoing_external_transaction_form
+msgid "Reject"
+msgstr "مرفوضة"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__reason
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_reject_reason_wizard__reason
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__reason
+msgid "Reject Reason"
+msgstr "سبب الرفض"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/transaction.py:0
+#, python-format
+msgid "Reject Transaction"
+msgstr "رفض المعامله"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__incoming_transaction_id
+msgid "Related Incoming"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transactions_incoming_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transactions_internal_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transactions_outgoing_form
+msgid "Related Info"
+msgstr "بيانات مكملة"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__outgoing_transaction_id
+msgid "Related Outgoing"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_entity__child_ids
+msgid "Related Units"
+msgstr "الوحدات الرتبطة"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_entity__user_id
+msgid "Related User"
+msgstr "المستخدم المرتبط"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,help:exp_transaction_documents.field_cm_entity__user_id
+#: model:ir.model.fields,help:exp_transaction_documents.field_incoming_transaction__receive_user_id
+#: model:ir.model.fields,help:exp_transaction_documents.field_internal_transaction__receive_user_id
+#: model:ir.model.fields,help:exp_transaction_documents.field_outgoing_transaction__receive_user_id
+#: model:ir.model.fields,help:exp_transaction_documents.field_transaction_transaction__receive_user_id
+msgid "Related user name for the resource to manage its access."
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.ui.menu,name:exp_transaction_documents.reply_internal_tran_menu
+msgid "Relying Transaction"
+msgstr "المعاملات الداخلية المردوده"
+
+#. module: exp_transaction_documents
+#: model:ir.actions.server,name:exp_transaction_documents.action_remove_incoming_transaction_from
+#: model:ir.actions.server,name:exp_transaction_documents.action_remove_internal_transaction_from
+#: model:ir.actions.server,name:exp_transaction_documents.action_remove_out_transaction_from
+msgid "Remove from Favorite"
+msgstr "الحذف من قائمة المفضلة"
+
+#. module: exp_transaction_documents
+#: model:ir.model,name:exp_transaction_documents.model_res_partner
+msgid "Renter"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_outgoing_external_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transaction_external_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.incoming_external_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.internal_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.outgoing_external_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.reopen_transaction_wizard_view
+msgid "Reopen"
+msgstr "إعادة فتح"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/transaction.py:0
+#: model:res.groups,name:exp_transaction_documents.group_reopen_transaction
+#, python-format
+msgid "Reopen Transaction"
+msgstr "إعادة فتح المعاملة"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/configuration.py:0
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__cm_transaction_trace__action__reopen
+#, python-format
+msgid "Reopened"
+msgstr "مفتوحه"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/configuration.py:0
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__cm_transaction_trace__action__reply
+#, python-format
+msgid "Replied"
+msgstr "مردوده"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/transaction.py:0
+#: code:addons/exp_transaction_documents/models/transaction.py:0
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__incoming_transaction__state__reply
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__incoming_transaction__type__reply
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__internal_transaction__state__reply
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__internal_transaction__type__reply
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__outgoing_transaction__state__reply
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__outgoing_transaction__type__reply
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__transaction_transaction__state__reply
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__transaction_transaction__type__reply
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transaction_external_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.reply_transaction_wizard_view
+#, python-format
+msgid "Reply"
+msgstr "رد"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/transaction.py:0
+#, python-format
+msgid "Reply Transaction"
+msgstr "رد المعاملة"
+
+#. module: exp_transaction_documents
+#: model:ir.ui.menu,name:exp_transaction_documents.reply_incoming_external_tran_menu
+msgid "Replying Incoming Transaction"
+msgstr "معاملات الوارد الخارجي المردوده"
+
+#. module: exp_transaction_documents
+#: model:ir.actions.act_window,name:exp_transaction_documents.reply_incoming_external_tran_action
+#: model:ir.actions.act_window,name:exp_transaction_documents.reply_internal_tran_action
+msgid "Replying Transaction"
+msgstr "المعاملات المردوده"
+
+#. module: exp_transaction_documents
+#: model:ir.ui.menu,name:exp_transaction_documents.parent_report_menu
+msgid "Reports"
+msgstr "التقارير"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_outgoing_external_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.incoming_external_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.internal_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.outgoing_external_transaction_form
+msgid "Restore"
+msgstr "استعادة"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_outgoing_external_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.outgoing_external_transaction_form
+msgid "Return"
+msgstr "إرجاع"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.view_return_transaction_wizard
+msgid "Return Reason"
+msgstr "سبب الإرجاع"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/transaction.py:0
+#, python-format
+msgid "Return Transaction"
+msgstr "إرجاع المعامله"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/configuration.py:0
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__cm_transaction_trace__action__return
+#, python-format
+msgid "Returned"
+msgstr "مرجعه"
+
+#. module: exp_transaction_documents
+#: model:res.groups,name:exp_transaction_documents.group_cm_reviewer
+msgid "Reviewer Employee"
+msgstr "صلاحية لجنة المراجعة"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/entity.py:0
+#, python-format
+msgid "Riyadh"
+msgstr "الرياض"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__message_has_sms_error
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__message_has_sms_error
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__message_has_sms_error
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__message_has_sms_error
+msgid "SMS Delivery error"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment_rule__file_save
+msgid "Save File"
+msgstr "حفظ"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.cm_entity_search
+msgid "Search Entities"
+msgstr "بحث عن الجهة"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_subject_type__second_approval
+msgid "Second Approval ?"
+msgstr "موافقة ثانية؟"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_forward_transaction_wizard__secret_reason
+msgid "Secret Description"
+msgstr "وصف سر"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__secret_reason
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__secret_reason
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__secret_reason
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__secret_reason
+msgid "Secret reason"
+msgstr "السبب السري"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/transaction.py:0
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__incoming_transaction__state__send
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__internal_transaction__state__send
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__outgoing_transaction__state__send
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__transaction_transaction__state__send
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_outgoing_external_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transactions_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.incoming_external_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.internal_transaction_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.outgoing_external_transaction_form
+#, python-format
+msgid "Send"
+msgstr "إرسال"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__send_attach
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__send_attach
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__send_attach
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__send_attach
+msgid "Send Attach"
+msgstr "إرسال مرفق"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.outgoing_external_transaction_form
+msgid "Send By email"
+msgstr "إرسال عبر البريد الإلكتروني"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__send_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__send_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__send_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__send_date
+msgid "Send Date"
+msgstr "تاريخ الإرسال"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__to_ids
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__to_ids
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__to_ids
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_details_report_temp
+msgid "Send To"
+msgstr "إرسال إلي"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/configuration.py:0
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__cm_transaction_trace__action__sent
+#, python-format
+msgid "Sent"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment_type__sequence
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_subject_type__sequence
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_project_type__sequence
+msgid "Sequence"
+msgstr "المسلسل"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_outgoing_receive_report_temp
+msgid "Signature"
+msgstr "التوقيع"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__signature
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__signature
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__signature
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__signature
+msgid "Signature image"
+msgstr "صورة التوقيع"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_entity__sketch_attachment_id
+msgid "Sketch Attachment"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__subject
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__subject
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__subject
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__subject
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_details_report_temp
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_outgoing_receive_report_temp
+msgid "Subject"
+msgstr "الموضوع"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__subject_type_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__subject_type_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__subject_type_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__subject_type_id
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.cm_subject_type_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_details_report_temp
+msgid "Subject Type"
+msgstr "نوع الموضوع"
+
+#. module: exp_transaction_documents
+#: model:ir.ui.menu,name:exp_transaction_documents.tag_entity_menu
+msgid "Tag"
+msgstr "الوسم"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_subject_type__tran_tag
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__tran_tag
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__tran_tag
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__tran_tag
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__tran_tag
+msgid "Tags"
+msgstr "اشارة"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_transaction_trace__to_id
+msgid "To"
+msgstr "إلي"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/transaction.py:0
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__incoming_transaction__state__to_approve
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__internal_transaction__state__to_approve
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__outgoing_transaction__state__to_approve
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__transaction_transaction__state__to_approve
+#, python-format
+msgid "To Approve"
+msgstr "موافقة"
+
+#. module: exp_transaction_documents
+#: model:ir.actions.act_window,name:exp_transaction_documents.outgoing_external_tran_approve_action
+msgid "To Approve External Transaction"
+msgstr "معاملات للموافقة"
+
+#. module: exp_transaction_documents
+#: model:ir.actions.act_window,name:exp_transaction_documents.dep_to_approve_internal_tran_action
+msgid "To Approve Internal Transaction"
+msgstr "معاملات للموافقة"
+
+#. module: exp_transaction_documents
+#: model:ir.actions.act_window,name:exp_transaction_documents.dep_outgoing_external_tran_approve_action
+#: model:ir.actions.act_window,name:exp_transaction_documents.to_approve_internal_tran_action
+#: model:ir.ui.menu,name:exp_transaction_documents.dep_outgoing_external_tran_approve_menu
+#: model:ir.ui.menu,name:exp_transaction_documents.outgoing_external_tran_approve_menu
+msgid "To Approve Transaction"
+msgstr "معاملات للموافقة"
+
+#. module: exp_transaction_documents
+#: model:ir.ui.menu,name:exp_transaction_documents.to_view_incoming_external_tran_menu
+msgid "To View Incoming Transaction"
+msgstr "معاملات وارد خارجي للإطلاع"
+
+#. module: exp_transaction_documents
+#: model:ir.actions.act_window,name:exp_transaction_documents.to_view_incoming_external_tran_action
+#: model:ir.ui.menu,name:exp_transaction_documents.outgoing_external_tran_view_menu
+msgid "To View Transaction"
+msgstr "معاملات للإطلاع"
+
+#. module: exp_transaction_documents
+#: model:ir.actions.act_window,name:exp_transaction_documents.outgoing_external_tran_view_action
+#: model:ir.actions.act_window,name:exp_transaction_documents.to_view_internal_tran_action
+msgid "To view Transaction"
+msgstr "معاملات للإطلاع"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__trace_ids
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__trace_ids
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__trace_ids
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transactions_incoming_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transactions_internal_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transactions_outgoing_form
+msgid "Trace Log"
+msgstr "سجل التتبع"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transactions_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.view_incoming_transaction_filter
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.view_internal_transaction_filter
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.view_outgoing_transaction_filter
+msgid "Transaction"
+msgstr "المعاملة"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__transaction_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__transaction_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__transaction_date
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__transaction_date
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_details_report_temp
+msgid "Transaction Date"
+msgstr "تاريخ المعاملة"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__transaction_date_hijri
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__transaction_date_hijri
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__transaction_date_hijri
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__transaction_date_hijri
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_details_report_temp
+msgid "Transaction Date (Hijri)"
+msgstr "تاريخ المعاملة (هجري)"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__body
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__body
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__body
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__body
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transactions_incoming_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transactions_internal_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transactions_outgoing_form
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_details_report_temp
+msgid "Transaction Details"
+msgstr "تفاصيل المعاملة"
+
+#. module: exp_transaction_documents
+#: model:res.groups,name:exp_transaction_documents.group_transaction_manager
+msgid "Transaction Manager"
+msgstr "مدير المعاملة"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__name
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__name
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__name
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__name
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.common_transactions_form
+msgid "Transaction Number"
+msgstr "رقم المعاملة"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_transaction_important__rank
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__add_rank
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__add_rank
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__add_rank
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__add_rank
+msgid "Transaction Rank"
+msgstr "رتبة المعاملة"
+
+#. module: exp_transaction_documents
+#: model:ir.actions.report,name:exp_transaction_documents.report_incoming_transaction_receive_report
+#: model:ir.actions.report,name:exp_transaction_documents.report_internal_transaction_receive_report
+#: model:ir.actions.report,name:exp_transaction_documents.report_outgoing_transaction_receive_report
+msgid "Transaction Receive Report"
+msgstr "تقرير استلام معاملة"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_details_report_temp
+msgid "Transaction Report"
+msgstr "تقرير المعاملة"
+
+#. module: exp_transaction_documents
+#: model:ir.actions.act_window,name:exp_transaction_documents.transaction_tag_action
+msgid "Transaction Tag"
+msgstr "وسم المعاملة"
+
+#. module: exp_transaction_documents
+#: model:ir.ui.menu,name:exp_transaction_documents.dep_to_approve_internal_tran_menu
+#: model:ir.ui.menu,name:exp_transaction_documents.to_approve_internal_tran_menu
+msgid "Transaction To Approve"
+msgstr "معاملات للموافقة"
+
+#. module: exp_transaction_documents
+#: model:ir.ui.menu,name:exp_transaction_documents.to_view_internal_tran_menu
+msgid "Transaction To View"
+msgstr "معاملات للإطلاع"
+
+#. module: exp_transaction_documents
+#: model:ir.model,name:exp_transaction_documents.model_cm_transaction_trace
+msgid "Transaction Trace"
+msgstr "سجل تتبع المعاملة"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_subject_type__name
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__type
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__type
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__type
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__type
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_details_report_temp
+msgid "Transaction Type"
+msgstr "نوع المعاملة"
+
+#. module: exp_transaction_documents
+#: model:ir.actions.act_window,name:exp_transaction_documents.cm_subject_type_list_action
+#: model:ir.ui.menu,name:exp_transaction_documents.cm_subject_type_menu
+msgid "Transaction Types"
+msgstr "انواع المعاملات"
+
+#. module: exp_transaction_documents
+#: model:ir.actions.report,name:exp_transaction_documents.report_incoming_transaction_detail_report
+#: model:ir.actions.report,name:exp_transaction_documents.report_internal_transaction_detail_report
+#: model:ir.actions.report,name:exp_transaction_documents.report_outgoing_transaction_detail_report
+msgid "Transaction detail Report"
+msgstr "طباعة تفاصيل المعاملة"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_subject_type__transaction_need_approve
+msgid "Transaction need approve"
+msgstr "معاملة تحتاج إلي موافقة"
+
+#. module: exp_transaction_documents
+#: model:ir.model,name:exp_transaction_documents.model_cm_entity
+msgid "Transactions Contacts"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.ui.menu,name:exp_transaction_documents.cm_root_menu
+msgid "Transactions Management"
+msgstr "ادارة المعاملات"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.cm_entity_search
+msgid "Type"
+msgstr "النوع"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__type_sender
+msgid "Type Sender"
+msgstr "نوع المرسل"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__internal_transaction__type_sender__unit
+msgid "Unit"
+msgstr "الوحدة"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_entity__unit_location
+msgid "Unit Location"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_entity__manager_id
+msgid "Unit Manager"
+msgstr "مدير الوحدة"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/configuration.py:0
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__cm_transaction_trace__action__approve
+#, python-format
+msgid "Unit Manager Approved"
+msgstr "موافقة مدير الوحدة"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_attachment_rule__entity_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__entity_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__entity_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__entity_id
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__entity_id
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_details_report_temp
+msgid "Unit Responsible"
+msgstr "مسئول الوجدة"
+
+#. module: exp_transaction_documents
+#: model:ir.actions.server,name:exp_transaction_documents.action_unread_incoming_transaction_from
+#: model:ir.actions.server,name:exp_transaction_documents.action_unread_internal_transaction_from
+#: model:ir.actions.server,name:exp_transaction_documents.action_unread_out_transaction_from
+msgid "Unread"
+msgstr "غير مقروء"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__message_unread
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__message_unread
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__message_unread
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__message_unread
+msgid "Unread Messages"
+msgstr "رسائل غير مقروءة"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__message_unread_counter
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__message_unread_counter
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__message_unread_counter
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__message_unread_counter
+msgid "Unread Messages Counter"
+msgstr " عدد الرسائل غير المقروءة"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.view_incoming_transaction_filter
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.view_internal_transaction_filter
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.view_outgoing_transaction_filter
+msgid "Unread Transaction"
+msgstr "معاملات غير مقروءة"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__secret_forward_user
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__secret_forward_user
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__secret_forward_user
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__secret_forward_user
+msgid "User"
+msgstr "المستخدم"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/entity.py:0
+#, python-format
+msgid "Validation Error Entity Code Must Be Composed from 3/2 characters"
+msgstr ".رمز الجهة الداخلية يجب ان يحتوي على حرفين او ثلاثة احرف فقط"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/entity.py:0
+#, python-format
+msgid "Validation Error Entity Code Must Be unique !"
+msgstr "رمز الجهة يجب أن يكون فريد"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/configuration.py:0
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__cm_transaction_trace__action__waite
+#, python-format
+msgid "Waiting Approve"
+msgstr "في إنتظار الموافقة"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__website_message_ids
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__website_message_ids
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__website_message_ids
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__website_message_ids
+msgid "Website Messages"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,help:exp_transaction_documents.field_incoming_transaction__website_message_ids
+#: model:ir.model.fields,help:exp_transaction_documents.field_internal_transaction__website_message_ids
+#: model:ir.model.fields,help:exp_transaction_documents.field_outgoing_transaction__website_message_ids
+#: model:ir.model.fields,help:exp_transaction_documents.field_transaction_transaction__website_message_ids
+msgid "Website communication history"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_cm_entity__dynamic_year
+msgid "Year"
+msgstr "السنة"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/entity.py:0
+#, python-format
+msgid "You cannot duplicate an entity!"
+msgstr "لا يمكنك استنساخ العناوين و الجهات"
+
+#. module: exp_transaction_documents
+#: model:ir.model,name:exp_transaction_documents.model_archive_transaction_wizard
+msgid "archive.transaction.wizard"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model,name:exp_transaction_documents.model_cm_archive_type
+msgid "cm.archive.type"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model,name:exp_transaction_documents.model_cm_attachment
+msgid "cm.attachment"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model,name:exp_transaction_documents.model_cm_attachment_rule
+msgid "cm.attachment.rule"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model,name:exp_transaction_documents.model_cm_attachment_type
+msgid "cm.attachment.type"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model,name:exp_transaction_documents.model_cm_procedure
+msgid "cm.procedure"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model,name:exp_transaction_documents.model_cm_subject_type
+msgid "cm.subject.type"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model,name:exp_transaction_documents.model_cm_transaction_important
+msgid "cm.transaction.important"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/transaction.py:0
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__incoming_transaction__state__complete
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__internal_transaction__state__complete
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__outgoing_transaction__state__complete
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__transaction_transaction__state__complete
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.outgoing_external_transaction_form
+#, python-format
+msgid "complete"
+msgstr "استكمال"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__current_user
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__current_user
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__current_user
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__current_user
+msgid "current user"
+msgstr "المستخدم الحالي"
+
+#. module: exp_transaction_documents
+#: model:ir.model,name:exp_transaction_documents.model_transaction_transaction
+msgid "for common attribute between transaction"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model,name:exp_transaction_documents.model_forward_transaction_wizard
+msgid "forward.transaction.wizard"
+msgstr "معاملة موجة"
+
+#. module: exp_transaction_documents
+#: model:ir.model,name:exp_transaction_documents.model_incoming_transaction
+msgid "incoming Transaction"
+msgstr "معاملات الوارد الخارجي"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.view_incoming_transaction_filter
+msgid "incoming transaction"
+msgstr "معاملة واردة"
+
+#. module: exp_transaction_documents
+#: model:ir.model,name:exp_transaction_documents.model_internal_transaction
+msgid "internal Transaction"
+msgstr "المعاملات الداخلية"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.view_internal_transaction_filter
+msgid "internal transaction"
+msgstr "معاملة داخلية"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.cm_entity_search
+msgid "name"
+msgstr "الاسم"
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__incoming_transaction__is_favorite__0
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__internal_transaction__is_favorite__0
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__outgoing_transaction__is_favorite__0
+#: model:ir.model.fields.selection,name:exp_transaction_documents.selection__transaction_transaction__is_favorite__0
+msgid "not"
+msgstr "ليس"
+
+#. module: exp_transaction_documents
+#: model:ir.model,name:exp_transaction_documents.model_odex_barcode
+msgid "odex.barcode"
+msgstr "باركود اودكس"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.archive_transaction_wizard_view
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.forward_transaction_wizard_view
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.reopen_transaction_wizard_view
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.reply_transaction_wizard_view
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.view_reject_transaction_wizard
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.view_return_transaction_wizard
+msgid "or"
+msgstr "او"
+
+#. module: exp_transaction_documents
+#: model:ir.model,name:exp_transaction_documents.model_outgoing_transaction
+msgid "outgoing Transaction"
+msgstr "معاملات الصادر الخارجي"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.view_outgoing_transaction_filter
+msgid "outgoing transaction"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/transaction.py:0
+#, python-format
+msgid "please make sure transaction have Process Transactions..."
+msgstr "الرجاء التأكد من ادخال المعاملات ذات الصلة"
+
+#. module: exp_transaction_documents
+#: model:ir.model,name:exp_transaction_documents.model_project_type
+msgid "project.type"
+msgstr "نوع المشروع"
+
+#. module: exp_transaction_documents
+#: model:ir.model,name:exp_transaction_documents.model_reject_reason_wizard
+msgid "reject.reason.wizard"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model,name:exp_transaction_documents.model_reopen_transaction_wizard
+msgid "reopen.transaction.wizard"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_incoming_transaction__state
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_internal_transaction__state
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_outgoing_transaction__state
+#: model:ir.model.fields,field_description:exp_transaction_documents.field_transaction_transaction__state
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.transaction_details_report_temp
+msgid "state"
+msgstr "الحالة"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.view_incoming_transaction_filter
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.view_internal_transaction_filter
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.view_outgoing_transaction_filter
+msgid "tag"
+msgstr "اشارة"
+
+#. module: exp_transaction_documents
+#: model_terms:ir.ui.view,arch_db:exp_transaction_documents.tag_view_tree
+msgid "tag_tree"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:res.groups,comment:exp_transaction_documents.group_cm_user
+msgid "the user will be able to manage transactions"
+msgstr "المستخدم سيكون قادرا على ادارة المعاملات"
+
+#. module: exp_transaction_documents
+#: model:ir.model,name:exp_transaction_documents.model_transaction_reply_wizard
+msgid "transaction.reply.wizard"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.model,name:exp_transaction_documents.model_transaction_tag
+msgid "transaction.tag"
+msgstr "اشارة المعاملة"
+
+#. module: exp_transaction_documents
+#: model:res.groups,name:exp_transaction_documents.group_cm_employee_group
+msgid "user/Employee"
+msgstr "موظف"
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/models/incoming_transaction.py:0
+#: code:addons/exp_transaction_documents/models/internal_transaction.py:0
+#: code:addons/exp_transaction_documents/models/internal_transaction.py:0
+#: code:addons/exp_transaction_documents/models/outgoing_transaction.py:0
+#: code:addons/exp_transaction_documents/wizard/forward_trasaction.py:0
+#: code:addons/exp_transaction_documents/wizard/reopen_transaction_wizard.py:0
+#: code:addons/exp_transaction_documents/wizard/transaction_reply_wizard.py:0
+#, python-format
+msgid "{} ← {}"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: code:addons/exp_transaction_documents/wizard/archive_transaction.py:0
+#, python-format
+msgid "{} ← {}. {}"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:ir.actions.server,name:exp_transaction_documents.late_transaction_mail_ir_actions_server
+#: model:ir.cron,cron_name:exp_transaction_documents.late_transaction_mail
+#: model:ir.cron,name:exp_transaction_documents.late_transaction_mail
+msgid "تأخر المعاملات عن وقت الانتهاء"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:mail.template,subject:exp_transaction_documents.internal_late_transaction_email
+msgid "تأخر المعاملة ${object.name|safe}"
+msgstr ""
+
+#. module: exp_transaction_documents
+#: model:mail.template,subject:exp_transaction_documents.internal_reject_transaction_email
+msgid "رفض المعاملة ${object.name|safe}"
+msgstr ""
diff --git a/odex25_transactions/exp_transaction_documents/models/__init__.py b/odex25_transactions/exp_transaction_documents/models/__init__.py
new file mode 100644
index 000000000..bc79bc2c2
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/models/__init__.py
@@ -0,0 +1,9 @@
+# -*- coding: utf-8 -*-
+from . import entity
+from . import configuration
+# from . import res_config_settings
+from . import transaction
+from . import internal_transaction
+from . import outgoing_transaction
+from . import incoming_transaction
+from . import tools
diff --git a/odex25_transactions/exp_transaction_documents/models/configuration.py b/odex25_transactions/exp_transaction_documents/models/configuration.py
new file mode 100644
index 000000000..de54fabc3
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/models/configuration.py
@@ -0,0 +1,119 @@
+# -*- coding: utf-8 -*-
+from odoo import models, api, fields, _
+
+TRACE_ACTIONS = [
+ ('forward', _('Forwarded')),
+ ('receive', _('Received')),
+ ('archive', _('Archived')),
+ ('approve', _('Unit Manager Approved')),
+ ('ceo_approve', _('CEO Approved')),
+ ('sent', _('Sent')),
+ ('return', _('Returned')),
+ ('action', _('Action Taken')),
+ ('refuse', _('Refused')),
+ ('reply', _('Replied')),
+ ('waite', _('Waiting Approve')),
+ ('reopen', _('Reopened')),
+]
+
+
+class SubjectType(models.Model):
+ _name = 'cm.subject.type'
+ _order = 'sequence'
+
+ name = fields.Char(string='Transaction Type')
+ sequence = fields.Integer(string='Sequence', default=5)
+ second_approval = fields.Boolean(string='Second Approval ?',
+ help='Check if this transaction type need a second (CEO) Approval.', default=True)
+ transaction_need_approve = fields.Boolean(string="Transaction need approve")
+ tran_tag = fields.Many2many(comodel_name='transaction.tag', string='Tags')
+
+
+class ImportantDegree(models.Model):
+ _name = 'cm.transaction.important'
+
+ name = fields.Char(string='Important Degree')
+ rank = fields.Integer(string='Transaction Rank')
+
+
+class Procedure(models.Model):
+ _name = 'cm.procedure'
+
+ name = fields.Char(string='Procedure Name')
+
+
+class AttachmentType(models.Model):
+ _name = 'cm.attachment.type'
+
+ sequence = fields.Integer(string='Sequence', default=1)
+ name = fields.Char(string='Name')
+
+
+class Attachment(models.Model):
+ _name = 'cm.attachment'
+
+ name = fields.Char(string='Description')
+ num_page = fields.Integer(string='No. Pages')
+ type_id = fields.Many2one('cm.attachment.type', string='Attachment type')
+ incoming_transaction_id = fields.Many2one(comodel_name='incoming.transaction', string='Incoming Transaction')
+ internal_transaction_id = fields.Many2one(comodel_name='internal.transaction', string='Internal Transaction')
+ outgoing_transaction_id = fields.Many2one(comodel_name='outgoing.transaction', string='Outgoing Transaction')
+
+
+class ArchiveType(models.Model):
+ _name = 'cm.archive.type'
+
+ name = fields.Char(string='Archive Type')
+
+
+class AttachmentRule(models.Model):
+ _name = 'cm.attachment.rule'
+
+ def _default_employee_id(self):
+ user = self.env.user
+ em = self.env['cm.entity'].search([('user_id', '=', user.id)], limit=1)
+ return len(em) and em or self.env['cm.entity']
+
+ name = fields.Char()
+ employee_id = fields.Many2one(comodel_name='cm.entity', string='Created By',
+ default=lambda self: self._default_employee_id(), readonly="True")
+ entity_id = fields.Many2one(comodel_name='cm.entity', string='Unit Responsible', related='employee_id.parent_id',
+ store=True)
+ file_save = fields.Binary('Save File')
+ attachment_filename = fields.Char(string="Attachment Filename")
+ incoming_transaction_id = fields.Many2one(comodel_name='incoming.transaction', string='Incoming Transaction')
+ internal_transaction_id = fields.Many2one(comodel_name='internal.transaction', string='Internal Transaction')
+ outgoing_transaction_id = fields.Many2one(comodel_name='outgoing.transaction', string='Outgoing Transaction')
+ date = fields.Datetime(string='Date', default=fields.Datetime.now)
+ description = fields.Char(string='Description')
+
+
+class TransactionTrace(models.Model):
+ _name = 'cm.transaction.trace'
+ _description = 'Transaction Trace'
+ _order = 'date desc'
+
+ action = fields.Selection(string='Action', selection=TRACE_ACTIONS, default='forward')
+ incoming_transaction_id = fields.Many2one(comodel_name='incoming.transaction', string='Incoming Transaction')
+ internal_transaction_id = fields.Many2one(comodel_name='internal.transaction', string='Internal Transaction')
+ outgoing_transaction_id = fields.Many2one(comodel_name='outgoing.transaction', string='Outgoing Transaction')
+ date = fields.Datetime(string='Date', default=fields.Datetime.now)
+ from_id = fields.Many2one(comodel_name='cm.entity', string='From')
+ to_id = fields.Many2one(comodel_name='cm.entity', string='To')
+ procedure_id = fields.Many2one(comodel_name='cm.procedure', string='Action Taken')
+ note = fields.Char(string='Notes')
+ archive_type_id = fields.Many2one(comodel_name='cm.archive.type', string='Archive Type')
+ cc_ids = fields.Many2many('cm.entity', string='CC To')
+
+
+class ProjectType(models.Model):
+ _name = "project.type"
+
+ name = fields.Char(string='Name')
+ sequence = fields.Integer(string='Sequence', default=1)
+
+
+class TransactionCategory(models.Model):
+ _name = 'transaction.tag'
+
+ name = fields.Char("Name")
diff --git a/odex25_transactions/exp_transaction_documents/models/entity.py b/odex25_transactions/exp_transaction_documents/models/entity.py
new file mode 100644
index 000000000..ef5acadfd
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/models/entity.py
@@ -0,0 +1,170 @@
+# -*- coding: utf-8 -*-
+import datetime
+from odoo import models, api, fields, _
+from odoo.exceptions import ValidationError, UserError
+
+
+class JobTitle(models.Model):
+ _name = 'cm.job.title'
+ _description = 'Job Titles'
+
+ name = fields.Char(string='Job Title')
+
+
+class Entity(models.Model):
+ _name = 'cm.entity'
+ _description = 'Transactions Contacts'
+ _order = 'name'
+
+ @api.model
+ def _name_search(self, name, args=None, operator='like', limit=100, name_get_uid=None):
+ args = args or []
+ domain = []
+ if name:
+ domain = ['|', ('name', operator, name), ('code', operator, name)]
+ print(domain)
+ return self._search(domain + args, limit=limit, access_rights_uid=name_get_uid)
+
+ @api.constrains('code')
+ def _check_code(self):
+ count = self.search_count([('code', '=', self.code), ('id', '!=', self.id)])
+ if self.code:
+ if count:
+ raise ValidationError(_("Validation Error Entity Code Must Be unique !"))
+ if self.type == 'unit':
+ x = ''
+ if len(self.code) == 3 or len(self.code) == 2:
+ x = 'a'
+ if self.code.isalpha() == False or x == '':
+ raise ValidationError(_("Validation Error Entity Code Must Be Composed from 3/2 characters"))
+
+ code = fields.Char(string='Code')
+ # sequence = fields.Integer(string='Sequence')
+ partner_id = fields.Many2one(comodel_name='res.partner', string='Partner', readonly=False, ondelete='cascade',
+ copy=False)
+ name = fields.Char(string='Name', store=True)
+ type = fields.Selection(string='Entity Type', selection=[('unit', _('Internal Unit')), ('employee', _('Employee')),
+ ('external', _('External Unit'))], default='unit')
+ parent_id = fields.Many2one(comodel_name='cm.entity', string='Parent Entity')
+ department_id = fields.Many2one('hr.department')
+ manager_id = fields.Many2one(comodel_name='cm.entity', string='Unit Manager')
+ secretary_id = fields.Many2one(comodel_name='cm.entity', string='Employee in charge of transactions')
+ user_id = fields.Many2one(comodel_name='res.users', string='Related User', related='employee_id.user_id')
+ # job_title_id = fields.Many2one(comodel_name='cm.job.title', string='Job Title')
+ job_title_id = fields.Many2one(comodel_name='hr.job', string='Job Title')
+ need_approve = fields.Boolean(string='Need Aprove')
+ executive_direction = fields.Boolean(string='Executive direction')
+ is_secret = fields.Boolean(string='Is Secret')
+ person_id = fields.Char(string='Person ID')
+ person_id_issue_date = fields.Date(string='Person ID Issue Date')
+ employee_assignment_date = fields.Date(string='Employee Assignment Date')
+ employee_id = fields.Many2one('hr.employee')
+ phone = fields.Char()
+ email = fields.Char()
+ child_ids = fields.Many2many(comodel_name='cm.entity', relation='employee_entity_rel', column1='employee_id',
+ column2='entity_id', string='Related Units')
+ establish_date = fields.Date(string='Establish Date')
+ unit_location = fields.Char(string='Unit Location')
+ sketch_attachment_id = fields.Many2one(comodel_name='ir.attachment', string='Sketch Attachment')
+ dynamic_year = fields.Char(string='Year', default=datetime.datetime.now().strftime('%Y'))
+ year_increment = fields.Boolean(string='Continue Increment every year?', help='''
+ Check if you want to continue incrementing in the start of every new year.
+ ''', default=True)
+
+ @api.onchange('department_id')
+ def onchange_department_id(self):
+ self.name = self.department_id.name
+
+ @api.onchange('employee_id')
+ def onchange_employee_id(self):
+ self.job_title_id = self.employee_id.job_id
+ self.name = self.employee_id.name
+ self.person_id = self.employee_id.iqama_number.iqama_id
+ self.email = self.employee_id.personal_email
+ self.phone = self.employee_id.mobile_phone
+ self.person_id_issue_date = self.employee_id.iqama_number.expiry_date
+ # self.employee_assignment_date = self.employee_id.job_id
+
+ @api.onchange('partner_id')
+ def onchange_partner_id(self):
+ self.name = self.partner_id.name
+ self.email = self.partner_id.email
+ self.phone = self.partner_id.phone
+
+ ####################################################
+ # ORM Overrides methods
+ ####################################################
+ @api.model
+ def create(self, vals):
+ if vals.get('type', False) == 'employee':
+ vals['partner_id'] = self.env['hr.employee'].search(
+ [('id', '=', vals['employee_id'])]).user_id.partner_id.id
+ if 'partner_id' not in vals:
+ print("*******************")
+ if vals.get('type', False) == 'employee':
+ user_id = vals.get('user_id', False)
+ if user_id:
+ vals['partner_id'] = self.env['res.users'].search([('id', '=', user_id)]).partner_id.id
+ else:
+ partner = self.env['res.partner'].create({
+ 'name': vals.get('name', ''),
+ 'email': vals.get('email', ''),
+ 'city': vals.get('city', _('Riyadh')),
+ 'is_company': vals.get('is_company', True),
+ 'country_id': self.env.ref('base.sa', True).id,
+ })
+ vals['partner_id'] = partner.id
+ sequence = {
+ 'employee': '01',
+ 'unit': '02',
+ 'external': '03',
+ }
+ if not vals.get('code', False):
+ seq = self.env['ir.sequence'].get('cm.entity')
+ s = u'{}-{}'.format(sequence[vals.get('type', 'employee')], seq)
+
+ if vals.get('type') == 'employee' or vals.get('type') == 'external':
+ vals['code'] = s
+ return super(Entity, self).create(vals)
+
+ def write(self, vals):
+ sequence = {
+ 'employee': '01',
+ 'unit': '02',
+ 'external': '03',
+ }
+ if not vals.get('code', False):
+ seq = self.env['ir.sequence'].get('cm.entity')
+ s = u'{}-{}'.format(sequence[vals.get('type', 'employee')], seq)
+ if vals.get('type') == 'employee' or vals.get('type') == 'external':
+ vals['code'] = s
+ return super(Entity, self).write(vals)
+
+ def copy(self, default=None):
+ raise UserError(_('You cannot duplicate an entity!'))
+
+
+class ResPartner(models.Model):
+ _inherit = 'res.partner'
+
+ is_transaction_entity = fields.Boolean('Is Transaction Entity?')
+
+ @api.model
+ def create(self, values):
+ res = super(ResPartner, self).create(values)
+ if values.get('is_transaction_entity'):
+ entity = self.env['cm.entity'].create({
+ 'name': values.get('name', ''),
+ 'partner_id': values.get('id'),
+ })
+ return res
+
+ def write(self, vals):
+ res = super(ResPartner, self).write(vals)
+ if vals.get('is_transaction_entity'):
+ if not self.env['cm.entity'].search([('partner_id', '=', self.id)]):
+ entity = self.env['cm.entity'].create({
+ 'name': self.name,
+ 'partner_id': vals.get('id'),
+ })
+ return res
diff --git a/odex25_transactions/exp_transaction_documents/models/incoming_transaction.py b/odex25_transactions/exp_transaction_documents/models/incoming_transaction.py
new file mode 100644
index 000000000..8f8c7ef07
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/models/incoming_transaction.py
@@ -0,0 +1,173 @@
+# -*- coding: utf-8 -*-
+from odoo import models, api, fields, _
+from odoo.exceptions import ValidationError
+from datetime import datetime
+from hijri_converter import convert, Hijri
+
+
+class IncomingTransaction(models.Model):
+ _name = 'incoming.transaction'
+ _inherit = ['transaction.transaction', 'mail.thread']
+ _description = 'incoming Transaction'
+
+ # due_date = fields.Date(string='Deadline', compute='compute_due_date')
+ from_id = fields.Many2one(comodel_name='cm.entity', string='Incoming From (External)')
+ partner_id = fields.Many2one('res.partner')
+ outgoing_transaction_id = fields.Many2one('outgoing.transaction', string='Related Outgoing')
+ incoming_number = fields.Char(string='Incoming Number')
+ incoming_date = fields.Date(string='Incoming Date', default=fields.Date.today)
+ incoming_date_hijri = fields.Char(string='Incoming Date (Hijri)', compute='_compute_incoming_date_hijri')
+ attachment_rule_ids = fields.One2many('cm.attachment.rule', 'incoming_transaction_id', string='Attaches')
+ attachment_ids = fields.One2many('cm.attachment', 'incoming_transaction_id', string='Attachments')
+ trace_ids = fields.One2many('cm.transaction.trace', 'incoming_transaction_id', string='Trace Log')
+ to_ids = fields.Many2many(comodel_name='cm.entity', relation='incoming_entity_rel', column1='incoming_id'
+ , column2='entity_id', string='Send To')
+ cc_ids = fields.Many2many(comodel_name='cm.entity', relation='incoming_entity_cc_rel',
+ column1='incoming_id', column2='entity_id', string='CC To')
+ tran_tag = fields.Many2many(comodel_name='transaction.tag', string='Tags')
+ tran_tag_unit = fields.Many2many(comodel_name='transaction.tag', string='Business unit',
+ relation='incoming_tag_rel',
+ column1='incoming_id'
+ , column2='name')
+ project_id = fields.Many2many('project.project')
+ sale_order_id = fields.Many2one('sale.order', 'Proposal')
+ processing_ids = fields.Many2many(comodel_name='incoming.transaction', relation='transaction_incoming_incoming_rel',
+ column1='transaction_id', column2='incoming_id',
+ string='Process Transactions incoming')
+ processing2_ids = fields.Many2many(comodel_name='outgoing.transaction',
+ relation='transaction_incoming_outgoing_rel',
+ column1='transaction_id', column2='outgoing_id',
+ string='Process Transactions Outgoing')
+ attachment_count = fields.Integer(compute='count_attachments')
+ # attachment_file = fields.Many2many(
+ # comodel_name='ir.attachment',
+ # string='')
+
+ datas = fields.Binary(string="", related='send_attach.datas')
+
+ def count_attachments(self):
+ obj_attachment = self.env['ir.attachment']
+ for record in self:
+ record.attachment_count = 0
+ attachment_ids = obj_attachment.search(
+ [('res_model', '=', 'incoming.transaction'), ('res_id', '=', record.id)])
+ first_file = []
+ if attachment_ids:
+ first_file.append(attachment_ids[0].id)
+ # print(first_file)
+ # record.attachment_file = first_file
+ record.attachment_count = len(attachment_ids)
+
+ @api.model
+ def get_url(self):
+ url = u''
+ action = self.env.ref(
+ 'exp_transaction_documents.forward_incoming_external_tran_action', False)
+ Param = self.env['ir.config_parameter'].sudo()
+ if action:
+ return u'{}/web#id={}&action={}&model=incoming.transaction'.format(
+ Param.get_param('web.base.url', self.env.user.company_id.website), self.id, action.id)
+ return url
+
+ @api.depends('incoming_date')
+ def _compute_incoming_date_hijri(self):
+ for rec in self:
+ if rec.incoming_date:
+ gregorian_date = fields.Date.from_string(rec.incoming_date)
+ hijri_date = convert.Gregorian(gregorian_date.year, gregorian_date.month, gregorian_date.day).to_hijri()
+ rec.incoming_date_hijri = hijri_date
+ else:
+ rec.incoming_date_hijri = ''
+
+ @api.depends('attachment_rule_ids')
+ def compute_attachment_num(self):
+ for r in self:
+ r.attachment_num = len(r.attachment_rule_ids)
+
+ def fetch_sequence(self):
+ '''generate transaction sequence'''
+ return self.env['ir.sequence'].next_by_code('cm.transaction.in') or _('New')
+
+ ####################################################
+ # Business methods
+ ####################################################
+
+ def action_draft(self):
+ for record in self:
+ res = super(IncomingTransaction, self).action_send()
+
+ # Check if to_ids is not empty before accessing its first element
+ if record.to_ids:
+ employee = self.current_employee()
+ to_id = record.to_ids[0].id
+
+ if record.to_ids[0].type != 'employee':
+ to_id = record.to_ids[0].secretary_id.id
+
+ record.trace_ids.create({
+ 'action': 'sent',
+ 'to_id': to_id,
+ 'from_id': employee and employee.id or False,
+ 'procedure_id': record.procedure_id.id or False,
+ 'incoming_transaction_id': record.id
+ })
+
+ partner_ids = []
+ for partner in record.to_ids:
+ if partner.type == 'unit':
+ partner_ids.append(partner.secretary_id.user_id.partner_id.id)
+ record.forward_user_id = partner.secretary_id.user_id.id
+ elif partner.type == 'employee':
+ partner_ids.append(partner.user_id.partner_id.id)
+ record.forward_user_id = partner.user_id.id
+
+ subj = _('Message Has been send !')
+ msg = _(u'{} ← {}').format(record.employee_id.name, u' / '.join([k.name for k in record.to_ids]))
+ msg = u'{}{} {}. {}'.format(msg,
+ _(u'Action Taken'), record.procedure_id.name,
+ u'رابط المعاملة ' % (
+ record.get_url()))
+
+ self.action_send_notification(subj, msg, partner_ids)
+ template = 'exp_transaction_documents.incoming_notify_send_send_email'
+ self.send_message(template=template)
+
+ return res
+
+ def action_send_forward(self):
+ template = 'exp_transaction_documents.incoming_notify_send_send_email'
+ self.send_message(template=template)
+
+ def action_reply_internal(self):
+ name = 'default_incoming_transaction_id'
+ return self.action_reply_tran(name, self)
+
+ def action_forward_incoming(self):
+ name = 'default_incoming_transaction_id'
+ return self.action_forward_tran(name, self)
+
+ def action_archive_incoming(self):
+ name = 'default_incoming_transaction_id'
+ return self.action_archive_tran(name, self)
+
+ ####################################################
+ # ORM Overrides methods
+ ####################################################
+ @api.model
+ def create(self, vals):
+ seq = self.fetch_sequence()
+ if vals['preparation_id']:
+ code = self.env['cm.entity'].browse(vals['preparation_id']).code
+ x = seq.split('/')
+ sequence = "%s/%s/%s" % (x[0], code, x[1])
+ vals['name'] = sequence
+ else:
+ vals['name'] = seq
+ vals['ean13'] = self.env['odex.barcode'].code128('IN', vals['name'], 'TR')
+ return super(IncomingTransaction, self).create(vals)
+ #
+ #
+ # def unlink(self):
+ # if self.env.uid != 1:
+ # raise ValidationError(_("You can not delete transaction....."))
+ # return super(IncomingTransaction, self).unlink()
diff --git a/odex25_transactions/exp_transaction_documents/models/internal_transaction.py b/odex25_transactions/exp_transaction_documents/models/internal_transaction.py
new file mode 100644
index 000000000..4a21812ab
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/models/internal_transaction.py
@@ -0,0 +1,212 @@
+# -*- coding: utf-8 -*-
+from datetime import datetime
+from odoo import models, api, fields, _
+
+
+class InternalTransaction(models.Model):
+ _name = 'internal.transaction'
+ _inherit = ['transaction.transaction', 'mail.thread']
+ _description = 'internal Transaction'
+
+ # due_date = fields.Date(string='Deadline', compute='_compute_due_date')
+ reason = fields.Text('Reason')
+ attachment_rule_ids = fields.One2many('cm.attachment.rule', 'internal_transaction_id', string='Attaches')
+ attachment_ids = fields.One2many('cm.attachment', 'internal_transaction_id', string='Attachments')
+ trace_ids = fields.One2many('cm.transaction.trace', 'internal_transaction_id', string='Trace Log')
+ type_sender = fields.Selection(
+ string='',
+ selection=[('unit', 'Unit'),
+ ('employee', 'Employee'),
+ ],
+ required=False, default='unit')
+
+ to_ids = fields.Many2many(comodel_name='cm.entity', relation='internal_entity_rel', column1='internal_id'
+ , column2='entity_id', string='Send To')
+ partner_id = fields.Many2one('res.partner', string='Partner', readonly=True,
+ related='to_ids.secretary_id.partner_id')
+ cc_ids = fields.Many2many(comodel_name='cm.entity', relation='internal_entity_cc_rel',
+ column1='internal_id', column2='entity_id', string='CC To')
+ project_domain = fields.Many2many('project.project', string='Project Domain')
+ processing_ids = fields.Many2many(comodel_name='internal.transaction', relation='transaction_internal_rel',
+ column1='transaction_id', column2='internal_id', string='Process Transactions')
+
+ @api.model
+ def get_url(self):
+ url = u''
+ action = self.env.ref(
+ 'exp_transaction_documents.incoming_internal_tran_action', False)
+ Param = self.env['ir.config_parameter'].sudo()
+ if action:
+ return u'{}/web#id={}&action={}&model=internal.transaction'.format(
+ Param.get_param('web.base.url', self.env.user.company_id.website), self.id, action.id)
+ return url
+
+ @api.depends('attachment_rule_ids')
+ def compute_attachment_num(self):
+ for r in self:
+ r.attachment_num = len(r.attachment_rule_ids)
+
+ def fetch_sequence(self, data=None):
+ '''generate transaction sequence'''
+ return self.env['ir.sequence'].get('cm.transaction.internal') or _('New')
+
+ ####################################################
+ # Business methods
+ ####################################################
+
+ def action_draft(self):
+ for record in self:
+ """her i need to review code for to_ids"""
+ res = super(InternalTransaction, self).action_draft()
+ sent = 'sent'
+ template = 'exp_transaction_documents.internal_notify_send_send_email'
+ if record.subject_type_id.transaction_need_approve or record.preparation_id.need_approve:
+ template = 'exp_transaction_documents.internal_approval1_request_email'
+ sent = 'waite'
+ record.trace_create_ids('internal_transaction_id', record, sent)
+ partner_ids = []
+ for partner in record.to_ids:
+ if partner.type == 'unit':
+ partner_ids.append(partner.secretary_id.user_id.partner_id.id)
+ record.forward_user_id = partner.secretary_id.user_id.id
+ elif partner.type == 'employee':
+ partner_ids.append(partner.user_id.partner_id.id)
+ record.forward_user_id = partner.user_id.id
+ if record.to_user_have_leave:
+ record.forward_user_id = record.receive_id.user_id.id
+ record.send_message(template=template)
+ subj = _('Message Has been send !')
+ msg = _(u'{} ← {}').format(record.employee_id.name, u' / '.join([k.name for k in record.to_ids]))
+ msg = u'{}{} {}. {}'.format(msg,
+ _(u'Action Taken'), record.procedure_id.name,
+ u'رابط المعاملة ' % (
+ record.get_url()))
+ company_id = self.env.user.company_id
+ if company_id.sms_active == True:
+ message = "There is a transaction that needs to " + self.procedure_id.name if self.procedure_id else ""
+ message += " with the number " + self.name
+ print(record.employee_id.employee_id.phone)
+ print(message)
+ request = company_id.send_sms(str(record.employee_id.employee_id.phone), message if message else "")
+ for rec in record:
+ rec.action_send_notification(subj, msg, partner_ids)
+ return res
+
+ def action_approve(self):
+ res = super(InternalTransaction, self).action_approve()
+ template = 'exp_transaction_documents.internal_notify_send_send_email'
+ self.send_message(template=template)
+ employee = self.current_employee()
+ to_id = self.to_ids[0].id
+ if self.to_ids[0].type != 'employee':
+ to_id = self.to_ids[0].secretary_id.id
+ self.trace_ids.create({
+ 'action': 'sent',
+ 'to_id': to_id,
+ 'from_id': employee and employee.id or False,
+ 'procedure_id': self.procedure_id.id or False,
+ 'internal_transaction_id': self.id
+ })
+ # self.trace_create_ids('internal_transaction_id', self, 'sent')
+ subj = _('Message Has been approved !')
+ msg = _(u'{} ← {}').format(self.preparation_id.manager_id.name, u' / '.join([k.name for k in self.to_ids]))
+ msg = u'{}{} {}. {}'.format(msg,
+ _(u'Action Taken'), self.procedure_id.name,
+ u'رابط المعاملة ' % (
+ self.get_url()))
+ partner_ids = [self.employee_id.user_id.partner_id.id, self.to_ids[0].user_id.partner_id.id]
+ self.action_send_notification(subj, msg, partner_ids)
+ return res
+
+ def action_reject_internal(self):
+ name = 'default_internal_transaction_id'
+ return self.action_reject(name, self)
+
+ def action_return_internal(self):
+ name = 'default_internal_transaction_id'
+ return self.action_return_tran(name, self)
+
+ def action_forward_internal(self):
+ name = 'default_internal_transaction_id'
+ return self.action_forward_tran(name, self)
+
+ def action_reply_internal(self):
+ name = 'default_internal_transaction_id'
+ return self.action_reply_tran(name, self)
+
+ def action_archive_internal(self):
+ name = 'default_internal_transaction_id'
+ return self.action_archive_tran(name, self)
+
+ def action_reopen_internal(self):
+ name = 'default_internal_transaction_id'
+ return self.action_reopen_tran(name, self)
+
+ def get_latest_forward(self):
+ for rec in self:
+ return rec.trace_ids.filtered(lambda z: z.action == 'forward')[0]
+
+ def get_latest_by_action(self, action):
+ for rec in self:
+ return rec.trace_ids.filtered(lambda z: z.action == action)[0]
+
+ def action_send_forward(self):
+ template = 'exp_transaction_documents.internal_notify_forward_email'
+ self.send_message(template=template)
+
+ def action_send_reply(self):
+ template = 'exp_transaction_documents.internal_notify_reply_email'
+ self.send_message(template=template)
+
+ def action_send_close(self):
+ template = 'exp_transaction_documents.internal_notify_close_email'
+ self.send_message(template=template)
+
+ def action_reopen_email(self):
+ template = 'exp_transaction_documents.internal_reopen_transaction_email'
+ self.send_message(template=template)
+
+ def action_reject_email(self):
+ template = 'exp_transaction_documents.internal_reject_transaction_email'
+ self.send_message(template=template)
+
+ def action_return_email(self):
+ template = 'exp_transaction_documents.internal_return_transaction_email'
+ self.send_message(template=template)
+
+ def late_transaction_cron(self):
+ templates = 'exp_transaction_documents.internal_late_transaction_email'
+ transaction_ids = self.env['internal.transaction'].search([('state', 'in', ['send', 'reply'])])
+ if transaction_ids:
+ today = fields.date.today()
+ for transaction in transaction_ids:
+ if datetime.strptime(transaction.due_date, "%Y-%m-%d") < datetime.strptime(str(today), "%Y-%m-%d"):
+ rec = transaction.trace_ids.filtered(lambda z: z.action == 'forward' or z.action == 'sent' or
+ z.action == 'reply')[0]
+ template = self.env.ref(templates, False)
+ template.write({'email_to': rec.to_id.user_id.partner_id.email,
+ 'email_cc': rec.to_id.parent_id.manager_id.user_id.partner_id.email})
+ template.with_context(lang=self.env.user.lang).send_mail(
+ transaction.id, force_send=True, raise_exception=False)
+
+ ####################################################
+ # ORM Overrides methods
+ ####################################################
+
+ @api.model
+ def create(self, vals):
+ seq = self.fetch_sequence()
+ if vals.get('preparation_id', False):
+ code = self.env['cm.entity'].browse(vals['preparation_id']).code
+ x = seq.split('/')
+ sequence = "%s/%s/%s" % (x[0], code, x[1])
+ vals['name'] = sequence
+ else:
+ vals['name'] = seq
+ return super(InternalTransaction, self).create(vals)
+
+ #
+ # def unlink(self):
+ # if self.env.uid != 1:
+ # raise ValidationError(_("You can not delete transaction....."))
+ # return super(InternalTransaction, self).unlink()
diff --git a/odex25_transactions/exp_transaction_documents/models/outgoing_transaction.py b/odex25_transactions/exp_transaction_documents/models/outgoing_transaction.py
new file mode 100644
index 000000000..2e78f1429
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/models/outgoing_transaction.py
@@ -0,0 +1,129 @@
+# -*- coding: utf-8 -*-
+from odoo import models, api, fields, _
+from odoo.exceptions import ValidationError
+
+
+class OutgoingTransaction(models.Model):
+ _name = 'outgoing.transaction'
+ _inherit = ['transaction.transaction', 'mail.thread']
+ _description = 'outgoing Transaction'
+
+ reason = fields.Text('Reason')
+ attachment_rule_ids = fields.One2many('cm.attachment.rule', 'outgoing_transaction_id', string='Attaches')
+ attachment_ids = fields.One2many('cm.attachment', 'outgoing_transaction_id', string='Attachments')
+ trace_ids = fields.One2many('cm.transaction.trace', 'outgoing_transaction_id', string='Trace Log')
+ is_partner = fields.Boolean()
+ partner_id = fields.Many2one('res.partner')
+ incoming_transaction_id = fields.Many2one('incoming.transaction', string='Related Incoming')
+ to_ids = fields.Many2many(comodel_name='cm.entity', relation='outgoing_entity_rel', column1='outgoing_id'
+ , column2='entity_id', string='Send To')
+ tran_tag = fields.Many2many(comodel_name='transaction.tag', string='Tags')
+ tran_tag_unit = fields.Many2many(comodel_name='transaction.tag', string='Business unit',
+ relation='outgoing_tag_rel',
+ column1='incoming_id'
+ , column2='name')
+ project_id = fields.Many2many('project.project')
+ sale_order_id = fields.Many2one('sale.order', 'Proposal')
+ to_name = fields.Char(string="Recipient")
+ cc_ids = fields.Many2many(comodel_name='cm.entity', relation='outgoing_entity_cc_rel',
+ column1='outgoing_id', column2='entity_id', string='CC To')
+ processing_ids = fields.Many2many(comodel_name='outgoing.transaction', relation='transaction_outgoing_outgoing_rel',
+ column1='transaction_id', column2='outgoing_id',
+ string='Process Transactions outgoing')
+ processing2_ids = fields.Many2many(comodel_name='incoming.transaction',
+ relation='transaction_outgoing_incoming_rel',
+ column1='transaction_id', column2='incoming_id',
+ string='Process Transactions incoming')
+
+ # processing_ids = fields.Many2many(comodel_name='transaction.transaction', relation='transaction_outgoing_rel',
+ # column1='transaction_id', column2='outgoing_id', string='Process Transactions')
+
+ @api.depends('attachment_rule_ids')
+ def compute_attachment_num(self):
+ for r in self:
+ r.attachment_num = len(r.attachment_rule_ids)
+
+ @api.model
+ def get_url(self):
+ url = u''
+ action = self.env.ref(
+ 'exp_transaction_documents.outgoing_external_tran_action', False)
+ Param = self.env['ir.config_parameter'].sudo()
+ if action:
+ return u'{}/web#id={}&action={}&model=outgoing.transaction'.format(
+ Param.get_param('web.base.url', self.env.user.company_id.website), self.id, action.id)
+ return url
+
+ def fetch_sequence(self, data=None):
+ """generate transaction sequence"""
+ return self.env['ir.sequence'].next_by_code('cm.transaction.out') or _('New')
+
+ ####################################################
+ # Business methods
+ ####################################################
+ #
+
+ def action_draft(self):
+ for record in self:
+ """her i need to review code for to_ids"""
+ # res = super(OutgoingTransaction, self).action_draft()
+ if record.subject_type_id.transaction_need_approve or record.preparation_id.need_approve:
+ record.state = 'to_approve'
+ else:
+ record.state = 'complete'
+ # record.trace_create_ids('outgoing_transaction_id', record, 'sent')
+ partner_ids = [record.preparation_id.manager_id.user_id.partner_id.id]
+ subj = _('Message Has been send !')
+ msg = _(u'{} ← {}').format(record.employee_id.name, u' / '.join([k.name for k in record.to_ids]))
+ msg = u'{}{} {}. {}'.format(msg,
+ _(u'Action Taken'), record.procedure_id.name,
+ u'رابط المعاملة ' % (
+ record.get_url()))
+ self.action_send_notification(subj, msg, partner_ids)
+ # return res
+
+ def action_email(self):
+ # todo#add email function here
+ company_id = self.env.user.company_id
+ if company_id.sms_active == True:
+ test = company_id.send_sms("", "Test from odex!")
+ test = test.text[:100].split("-")
+ error = company_id.get_error_response(test[1])
+ for rec in self:
+ templates = 'exp_transaction_documents.out_email'
+ template = self.env.ref(templates, False)
+ emails = rec.partner_id.email if rec.is_partner else rec.to_ids.mapped('email')
+ email_template = template.write(
+ {'email_to': emails})
+ template.with_context(lang=self.env.user.lang).send_mail(
+ rec.id, force_send=True, raise_exception=False)
+
+ def action_reject_outgoing(self):
+ name = 'default_outgoing_transaction_id'
+ return self.action_reject(name, self)
+
+ def action_return_outgoing(self):
+ name = 'default_outgoing_transaction_id'
+ return self.action_return_tran(name, self)
+
+ ####################################################
+ # ORM Overrides methods
+ ####################################################
+ @api.model
+ def create(self, vals):
+ seq = self.fetch_sequence()
+ if vals.get('preparation_id'):
+ code = self.env['cm.entity'].sudo().browse(vals['preparation_id']).code
+ x = seq.split('/')
+ sequence = "%s/%s/%s" % (x[0], code, x[1])
+ vals['name'] = sequence
+ else:
+ vals['name'] = seq
+ # vals['ean13'] = self.env['odex.barcode'].code128('OT', vals['name'], 'TR')
+ return super(OutgoingTransaction, self).create(vals)
+
+ #
+ # def unlink(self):
+ # if self.env.uid != 1:
+ # raise ValidationError(_("You can not delete transaction....."))
+ # return super(OutgoingTransaction, self).unlink()
diff --git a/odex25_transactions/exp_transaction_documents/models/res_config_settings.py b/odex25_transactions/exp_transaction_documents/models/res_config_settings.py
new file mode 100644
index 000000000..302dcb23e
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/models/res_config_settings.py
@@ -0,0 +1,46 @@
+# -*- coding: utf-8 -*-
+from odoo import api, fields, models, _
+
+
+class CMConfig(models.TransientModel):
+ _inherit = 'res.config.settings'
+
+ module_cm_hr_odex = fields.Boolean(string='Synchronization With HR ?', help='''
+ If checked, you will be able to sync employees, departments, job titles with Crosspondence Tracking System.
+ ''')
+ module_cm_mail_odex = fields.Boolean(string='Convert Email Messages to Transactions', help='''
+ If checked, you can convert emails to Incoming Transactions.
+ ''')
+ last_date_to_execute_transaction = fields.Boolean(string='Last Date To Execute Transaction', help='''
+ If checked, you add rank value to start date to get last date to execute Transaction.
+ ''')
+
+ # ir.values is not exited in odoo 11 so i use ir.config_parameter instead of ir.value 15 Apr
+ @api.model
+ def get_values(self):
+ res = super(CMConfig, self).get_values()
+ res.update(
+ last_date_to_execute_transaction=self.env['ir.config_parameter'].sudo().get_param('exp_transaction_documents.last_date_to_execute_transaction'),
+ module_cm_mail_odex=self.env['ir.config_parameter'].sudo().get_param('exp_transaction_documents.module_cm_mail_odex'),
+ module_cm_hr_odex=self.env['ir.config_parameter'].sudo().get_param('exp_transaction_documents.module_cm_hr_odex')
+ )
+ return res
+
+
+ def set_values(self):
+ super(CMConfig, self).set_values()
+ self.env['ir.config_parameter'].sudo().set_param('exp_transaction_documents.last_date_to_execute_transaction', self.last_date_to_execute_transaction)
+ self.env['ir.config_parameter'].sudo().set_param('exp_transaction_documents.module_cm_mail_odex', self.module_cm_mail_odex)
+ self.env['ir.config_parameter'].sudo().set_param('exp_transaction_documents.module_cm_hr_odex', self.module_cm_hr_odex)
+
+ @api.model
+ def create(self, vals):
+ """
+ create(vals) -> record
+ Override create to change last_date_to_execute_transaction_id value in cm.subject.type
+ """
+ res = super(CMConfig, self).create(vals)
+ if res.last_date_to_execute_transaction:
+ for rec in self.env['cm.subject.type'].search([]):
+ rec.last_date_to_execute_transaction_id = True
+ return res
diff --git a/odex25_transactions/exp_transaction_documents/models/tools.py b/odex25_transactions/exp_transaction_documents/models/tools.py
new file mode 100644
index 000000000..7300bc988
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/models/tools.py
@@ -0,0 +1,45 @@
+#-*- coding: utf-8 -*-
+
+from ..tools import generator, generator128
+from random import shuffle
+import re
+from odoo import models
+
+SHUFFLE = [str(y) for y in ([x for x in range(10)] + [1,2,3])]
+
+
+class Barcode(models.TransientModel):
+ '''
+ Generate EAN13 Barcode
+ '''
+ _name = 'odex.barcode'
+
+ def generate(self, code):
+ '''
+ Generate Ean13 code
+ '''
+ return generator128(code)
+
+
+ def ean13(self):
+ shuffle(SHUFFLE)
+ return ''.join(SHUFFLE)
+
+ def code128(self, starter, code, ender):
+ x = re.sub(r'[^\d]', '', code)
+ if len(x) < 9:
+ shuffle(SHUFFLE)
+ y = SHUFFLE[:9-len(x)]
+ x = u'{}{}'.format(x, y)
+ if len(x) > 9:
+ x = x[:9]
+ return u'{}{}{}'.format(starter, x, ender)
+
+ def to_arabic_indic(self, txt):
+ txt = unicode(txt)
+ TXTAR = u''.join([str(x) for x in range(10)]+['-'])
+ TXT = u'٠١٢٣٤٥٦٧٨٩/'
+ K = {x: y for x, y in zip(TXTAR, TXT)}
+ for k, v in K.items():
+ txt = txt.replace(k, v)
+ return txt
diff --git a/odex25_transactions/exp_transaction_documents/models/transaction.py b/odex25_transactions/exp_transaction_documents/models/transaction.py
new file mode 100644
index 000000000..281d3c337
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/models/transaction.py
@@ -0,0 +1,442 @@
+# -*- coding: utf-8 -*-
+
+from datetime import datetime, timedelta
+
+from hijri_converter import convert
+
+from odoo import models, api, fields, _
+from odoo.exceptions import ValidationError
+from odoo.tools import DEFAULT_SERVER_DATE_FORMAT
+
+TRANSACTION_STATE = [
+ ('draft', _('Draft')),
+ ('to_approve', _('To Approve')),
+ ('complete', _('complete')),
+ ('send', _('Send')),
+ ('reply', _('Reply')),
+ ('closed', _('Closed')),
+ ('canceled', _('Canceled')),
+]
+
+
+class Transaction(models.Model):
+ _name = 'transaction.transaction'
+ _inherit = ['mail.thread']
+ _description = 'for common attribute between transaction'
+
+ name = fields.Char(string='Transaction Number')
+ type = fields.Selection(string='Transaction Type', selection=[
+ ('new', _('New Transaction')),
+ ('forward', _('Forwarded Transaction')),
+ ('reply', _('Reply'))], default='new')
+ subject = fields.Char(string='Subject')
+ important_id = fields.Many2one(comodel_name='cm.transaction.important', string='Important Degree')
+ transaction_date = fields.Date(string='Transaction Date', default=fields.Date.today)
+ transaction_date_hijri = fields.Char(string='Transaction Date (Hijri)', compute='compute_hijri')
+ subject_type_id = fields.Many2one(comodel_name='cm.subject.type', string='Subject Type')
+ is_need_approve = fields.Boolean(related='subject_type_id.transaction_need_approve', string='Need Approve')
+ preparation_id = fields.Many2one(comodel_name='cm.entity', string='Preparation Unit',
+ default=lambda self: self.default_preparation_id())
+ employee_id = fields.Many2one(comodel_name='cm.entity', string='Created By',
+ default=lambda self: self.default_employee_id())
+ entity_id = fields.Many2one(comodel_name='cm.entity', string='Unit Responsible',
+ related='employee_id.parent_id', store=True)
+ procedure_id = fields.Many2one(comodel_name='cm.procedure', string='Procedure')
+ attachment_num = fields.Integer(string='No. of Attachments', compute='compute_attachment_num')
+ body = fields.Html(string='Transaction Details')
+ state = fields.Selection(selection=TRANSACTION_STATE, string='state', default='draft')
+ need_approve = fields.Boolean(related='preparation_id.need_approve', string='NEED approve', )
+ due_date = fields.Date(string='Deadline', compute='compute_due_date')
+ send_date = fields.Date(string='Send Date')
+ send_attach = fields.Many2many(
+ comodel_name='ir.attachment',
+ string='')
+ current_is_manager = fields.Boolean(string='Is Manager', compute="set_is_manager")
+ current_is_forward_user = fields.Boolean(string='Is Manager', compute="set_is_forward_user")
+ current_user = fields.Boolean("current user", compute='_default_current_user')
+ reason = fields.Text(string="Reject Reason")
+ forward_user_id = fields.Many2one(comodel_name='res.users', string='Forward User')
+ archive_user_id = fields.Many2one(comodel_name='cm.entity', string='Archive Entity')
+ last_forwarded_user = fields.Many2one(comodel_name='res.users', string='Forwarded User')
+ is_forward = fields.Boolean(string="Is Forward")
+ ean13 = fields.Char(string='Ean13', size=30)
+ receive_id = fields.Many2one(comodel_name='cm.entity', string='Receiver', compute='compute_receive_id')
+ secret_reason = fields.Text(string="Secret reason")
+ secret_forward_user = fields.Many2one(comodel_name='cm.entity', string='User')
+ current_is_secret_user = fields.Boolean(string='Is Manager', compute="set_is_secret_user")
+ receive_user_id = fields.Many2one(related='receive_id.user_id',
+ comodel_name='res.users', string='Receiver', store=True)
+ receive_manger_id = fields.Many2one(comodel_name='cm.entity', string='Receiver',
+ compute='compute_receive_manger_id')
+ current_is_receive_manger = fields.Boolean(string='Is Manager', compute="set_to_is_manager")
+ to_user_have_leave = fields.Boolean(string="Have Leave?", default=False, compute='compute_have_leave')
+ is_reade = fields.Boolean(string="Is Reade?!", default=True)
+ is_favorite = fields.Selection([
+ ('0', 'not'),
+ ('1', 'Favorite'),
+ ], size=1, string="Favorite")
+ signature = fields.Binary("Signature image")
+ tran_tag = fields.Many2many(comodel_name='transaction.tag', string='Tags')
+ add_rank = fields.Integer(string='Transaction Rank')
+
+ # @api.onchange('tran_tag')
+ # def get_subject_type(self):
+ # # self.subject_type_id = False
+ # if self.tran_tag:
+ # domain = {'subject_type_id': [
+ # ('id', 'in', self.env['cm.subject.type'].search([('tran_tag', '=', self.tran_tage.id)
+ # ]).ids)]
+ # }
+ # else:
+ # domain = {'subject_type_id': [('id', 'in', self.env['cm.subject.type'].search([]).ids)]
+ # }
+ # return {'domain': domain}
+
+ def action_read(self):
+ for rec in self:
+ rec.is_reade = True
+
+ def action_unread(self):
+ for rec in self:
+ rec.is_reade = False
+
+ def add_to_favorite(self):
+ for rec in self:
+ rec.is_favorite = '1'
+
+ def remove_from_favorite(self):
+ for rec in self:
+ rec.is_favorite = '0'
+
+ @api.constrains('type')
+ def check_process_id(self):
+ if self.type:
+ if self.type != 'new':
+ if not self.processing_ids:
+ raise ValidationError(_("please make sure transaction have Process Transactions..."))
+
+ def default_employee_id(self):
+ user = self.env.user
+ em = self.env['cm.entity'].search([('user_id', '=', user.id)], limit=1)
+ return len(em) and em or self.env['cm.entity']
+
+ def compute_receive_id(self):
+ for rec in self:
+ if rec.to_ids:
+ employee_id = rec.to_ids[0].id
+ if rec.to_ids[0].type == 'unit':
+ employee_id = rec.to_ids[0].secretary_id.id
+ rec.receive_id = employee_id
+
+ def compute_receive_manger_id(self):
+ for rec in self:
+ rec.receive_manger_id = False
+ if rec.preparation_id:
+ rec.receive_manger_id = rec.preparation_id.manager_id
+
+ def default_preparation_id(self):
+ employee = self.default_employee_id()
+ return len(employee) and employee.parent_id or self.env['cm.entity']
+
+ @api.depends('transaction_date', 'important_id', 'add_rank')
+ def compute_due_date(self):
+ self.due_date = False
+ for record in self:
+ record.due_date = False
+ if not len(record.important_id) or not record.transaction_date:
+ continue
+ rank = record.important_id.rank or 1
+ final_rank = rank + record.add_rank
+ date = datetime.strptime(str(record.transaction_date), DEFAULT_SERVER_DATE_FORMAT)
+ due = date
+ for i in range(final_rank):
+ due = due + timedelta(days=1)
+ if (due.strftime('%A') in ['vendredi', 'Friday']):
+ due = due + timedelta(days=2)
+ record.due_date = due.strftime(DEFAULT_SERVER_DATE_FORMAT)
+
+ def set_is_forward_user(self):
+ user_id = self.env['res.users'].browse(self.env.uid)
+ if self.forward_user_id.id == user_id.id:
+ self.current_is_forward_user = True
+ else:
+ self.current_is_forward_user = False
+
+ def set_is_manager(self):
+ self.current_is_manager = True
+ user_id = self.env['res.users'].browse(self.env.uid)
+ if self.receive_manger_id.user_id == user_id:
+ self.current_is_manager = True
+ else:
+ self.current_is_manager = False
+
+ def set_to_is_manager(self):
+ user_id = self.env['res.users'].browse(self.env.uid)
+ if self.receive_id.parent_id.manager_id.user_id == user_id:
+ self.current_is_receive_manger = True
+ else:
+ self.current_is_receive_manger = False
+
+ def set_is_secret_user(self):
+ user_id = self.env['res.users'].browse(self.env.uid)
+ if self.secret_forward_user.user_id == user_id:
+ self.current_is_secret_user = True
+ else:
+ self.current_is_secret_user = False
+
+ def compute_have_leave(self):
+ self.current_is_manager = False
+
+ # def compute_hijri(self):
+ # '''
+ # method for compute hijir date depend on date using odex hijri
+ # '''
+ # H = self.env['odex.hijri']
+ # for r in self:
+ # r.transaction_date_hijri = r.transaction_date and H.convert(r.transaction_date) or ''
+ @api.depends('transaction_date')
+ def compute_hijri(self):
+ for rec in self:
+ if rec.transaction_date:
+ date = datetime.strptime(str(rec.transaction_date), '%Y-%m-%d')
+ year = date.year
+ day = date.day
+ month = date.month
+ hijri_date = convert.Gregorian(year, month, day).to_hijri()
+ rec.transaction_date_hijri = hijri_date
+
+ else:
+ rec.transaction_date_hijri = False
+
+ @api.model
+ def current_employee(self):
+ employee = False
+ employees = self.env['cm.entity'].search(
+ [('user_id', '=', self.env.user.id), ('type', '=', 'employee')], limit=1)
+ if len(employees):
+ employee = employees
+ return employee
+
+ def _default_current_user(self):
+ for record in self:
+ record.current_user = False
+ if len(record.to_ids) == 1:
+ if record.employee_id.user_id == self.env.user:
+ record.update({'current_user': True})
+ else:
+ record.update({'current_user': False})
+
+ @api.model
+ def generate(self):
+ EAN = self.env['odex.barcode']
+ for r in self:
+ return EAN.generate(r.ean13)
+
+ ####################################################
+ # Business methods
+ ####################################################
+ @api.model
+ def action_draft(self):
+ for record in self:
+ if record.subject_type_id.transaction_need_approve or record.preparation_id.need_approve:
+ record.state = 'to_approve'
+ else:
+ record.action_send()
+
+ def action_send(self):
+ for record in self:
+ record.state = 'send'
+ record.send_date = datetime.today()
+ record.is_reade = False
+
+ def action_approve(self):
+ for record in self:
+ record.state = 'send'
+ record.is_reade = False
+
+ def action_cancel(self):
+ for record in self:
+ record.state = 'canceled'
+
+ def action_reopen(self):
+ for record in self:
+ record.state = 'send'
+ params = record.env.context.get('params', {})
+ model = params.get('model', False)
+ if model == 'incoming.transaction':
+ return {
+ 'type': 'ir.actions.act_window',
+ 'res_model': 'reopen.transaction.wizard',
+ 'name': _('Reopen Transaction'),
+ 'view_mode': 'form',
+ 'context': {'default_incoming_transaction_id': record.id},
+ 'target': 'new',
+ }
+
+ return {
+ 'type': 'ir.actions.act_window',
+ 'res_model': 'reopen.transaction.wizard',
+ 'name': _('Reopen Transaction'),
+ 'view_mode': 'form',
+ 'context': {'default_incoming_transaction_id': record.id},
+ 'target': 'new',
+ }
+
+ def set_to_draft(self):
+ for record in self:
+ record.state = 'draft'
+
+ def trace_create_ids(self, name, transaction, action):
+ ''' method to create log trace in transaction'''
+ employee = self.current_employee()
+ to_id = transaction.to_ids[0].id
+ if transaction.to_ids[0].type != 'employee':
+ to_id = transaction.to_ids[0].secretary_id.id
+ if transaction.subject_type_id.transaction_need_approve or transaction.preparation_id.need_approve and transaction.state == 'to_approve':
+ to_id = transaction.preparation_id.manager_id.id
+ transaction.trace_ids.create({
+ 'action': action,
+ 'to_id': to_id,
+ 'from_id': employee and employee.id or False,
+ 'procedure_id': transaction.procedure_id.id or False,
+ name: transaction.id
+ })
+
+ def action_reject(self, name, transaction):
+ form_view = self.env.ref('exp_transaction_documents.view_reject_transaction_wizard')
+ return {
+ 'name': _('Reject Transaction'),
+
+ 'view_mode': 'form',
+ 'res_id': False,
+ 'views': [(form_view.id, 'form'), ],
+ 'res_model': 'reject.reason.wizard',
+ 'target': 'new',
+ 'type': 'ir.actions.act_window',
+ 'context': {
+ name: transaction.id
+ },
+ }
+
+ def action_return_tran(self, name, transaction):
+ form_view = self.env.ref('exp_transaction_documents.view_return_transaction_wizard')
+ return {
+ 'name': _('Return Transaction'),
+
+ 'view_mode': 'form',
+ 'res_id': False,
+ 'views': [(form_view.id, 'form'), ],
+ 'res_model': 'reject.reason.wizard',
+ 'target': 'new',
+ 'type': 'ir.actions.act_window',
+ 'context': {
+ name: transaction.id
+ },
+ }
+
+ def action_forward_tran(self, name, transaction):
+ form_view = self.env.ref('exp_transaction_documents.forward_transaction_wizard_view')
+ return {
+ 'name': _('Forward Transaction'),
+
+ 'view_mode': 'form',
+ 'res_id': False,
+ 'views': [(form_view.id, 'form'), ],
+ 'res_model': 'forward.transaction.wizard',
+ 'target': 'new',
+ 'type': 'ir.actions.act_window',
+ 'context': {
+ name: transaction.id
+ },
+ }
+
+ def action_reply_tran(self, name, transaction):
+ form_view = self.env.ref('exp_transaction_documents.reply_transaction_wizard_view')
+ return {
+ 'name': _('Reply Transaction'),
+
+ 'view_mode': 'form',
+ 'res_id': False,
+ 'views': [(form_view.id, 'form'), ],
+ 'res_model': 'transaction.reply.wizard',
+ 'target': 'new',
+ 'type': 'ir.actions.act_window',
+ 'context': {
+ name: transaction.id
+ },
+ }
+
+ def action_archive_tran(self, name, transaction):
+ form_view = self.env.ref('exp_transaction_documents.archive_transaction_wizard_view')
+ return {
+ 'name': _('Archive Transaction'),
+
+ 'view_mode': 'form',
+ 'res_id': False,
+ 'views': [(form_view.id, 'form'), ],
+ 'res_model': 'archive.transaction.wizard',
+ 'target': 'new',
+ 'type': 'ir.actions.act_window',
+ 'context': {
+ name: transaction.id
+ },
+ }
+
+ def action_reopen_tran(self, name, transaction):
+ form_view = self.env.ref('exp_transaction_documents.reopen_transaction_wizard_view')
+ return {
+ 'name': _('Reopen Transaction'),
+
+ 'view_mode': 'form',
+ 'res_id': False,
+ 'views': [(form_view.id, 'form'), ],
+ 'res_model': 'reopen.transaction.wizard',
+ 'target': 'new',
+ 'type': 'ir.actions.act_window',
+ 'context': {
+ name: transaction.id
+ },
+ }
+
+ ####################################################
+ # Messaging methods
+ ####################################################
+ def get_name(self):
+ name = False
+ if self.is_forward:
+ name = self.forward_user_id.name
+ elif self.to_ids[0].type != 'employee':
+ name = self.to_ids[0].secretary_id.user_id.name
+ else:
+ name = self.receive_id.user_id.name
+ return name
+
+ def get_email(self):
+ email = False
+ if self.is_forward:
+ name = self.forward_user_id.partner_id.email
+ elif self.to_ids[0].type != 'employee':
+ email = self.to_ids[0].secretary_id.user_id.partner_id.email
+ else:
+ email = self.receive_id.user_id.partner_id.email
+ return email
+
+ def send_message(self, template=None):
+ if not template:
+ return
+ template = self.env.ref(template, False)
+ if not template:
+ return
+ for r in self:
+ template.with_context(lang=self.env.user.lang).send_mail(
+ r.id, force_send=True, raise_exception=False)
+
+ def action_send_notification(self, subj, msg, partner_ids):
+ self.ensure_one()
+ for rec in self:
+ author = self.env['res.users'].sudo().browse(self._uid)
+ author = author.id
+ if False not in partner_ids:
+ rec.message_post(type="notification", subject=subj, body=msg, author_id=author,
+ partner_ids=partner_ids,
+ subtype_xmlid="mail.mt_comment")
diff --git a/odex25_transactions/exp_transaction_documents/reports/barcodes.xml b/odex25_transactions/exp_transaction_documents/reports/barcodes.xml
new file mode 100644
index 000000000..4c8d16bd5
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/reports/barcodes.xml
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+ Date:
+
+
+
+
+
+ / /
+
+
+
+ Reference:
+
+
+
+
+
+ Attachment:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/odex25_transactions/exp_transaction_documents/reports/receiver_transaction_report_template.xml b/odex25_transactions/exp_transaction_documents/reports/receiver_transaction_report_template.xml
new file mode 100644
index 000000000..3110b5720
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/reports/receiver_transaction_report_template.xml
@@ -0,0 +1,175 @@
+
+
+
+
+
+
+
+
+
Receiver Transaction Report
+
+
+
+
+
+
+
+ Number
+
+
+
+
+
+ Date
+
+
+
+ - Corresponding -
+
+
+
+
+ / /
+
+
+ Attachments
+
+
+
+
+
+
+
+ ...
+
+ ..
+ ..
+ ..
+ ..
+
+ .......
+
+
+
+ Entity
+
+
+
+
+ ...
+
+
+ .....
+
+
+
+
+ Subject
+
+
+
+
+
+
+
+ Receiver
+
+
+
+ Name
+ ---------------------------
+ Signature
+ ---------------------------
+
+
+
+ Departament
+
+ ---------------------------
+
+ Date
+
+ ---------------------------
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ paperformat.transaction.receive.report
+
+ A4
+ Portrait
+ 59
+ 10
+ 30
+ 10
+
+ 35
+ 90
+
+
+
+
+
+
+
+
+
diff --git a/odex25_transactions/exp_transaction_documents/reports/transaction_details_report_template.xml b/odex25_transactions/exp_transaction_documents/reports/transaction_details_report_template.xml
new file mode 100644
index 000000000..0882a2e30
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/reports/transaction_details_report_template.xml
@@ -0,0 +1,290 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Transaction Report
+
+
+
+
+
+ Name
+
+ state
+
+
+
+ Transaction Type
+
+ Subject
+
+
+
+ Send To
+
+
+ CC To
+
+
+
+ Important Degree
+
+ Subject Type
+
+
+
+ Transaction Date
+
+ Transaction Date (Hijri)
+
+
+
+ Preparation Unit
+
+ Procedure
+
+
+
+ Created By
+
+ Unit Responsible
+
+
+
+ Deadline
+
+ No. of Attachments
+
+
+
+
+
+
Transaction Details
+
+
+
+
+
+
Attaches
+
+
+
+
+
+ #
+
+
+ Create by
+
+
+ Unit Responsible
+
+
+ Date
+
+
+ Description
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Attachments
+
+
+
+
+
+ #
+
+
+ Attachment type
+
+
+ No. Pages
+
+
+ Description
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ paperformat.transaction.report
+
+ A4
+ Portrait
+ 40
+ 10
+ 30
+ 10
+
+ 40
+ 90
+
+
+
+
+
+
diff --git a/odex25_transactions/exp_transaction_documents/security/groups.xml b/odex25_transactions/exp_transaction_documents/security/groups.xml
new file mode 100644
index 000000000..4f864b2ff
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/security/groups.xml
@@ -0,0 +1,82 @@
+
+
+
+ Communications Management
+ Helps you manage Communication Transaction
+ 1
+
+
+
+ user/Employee
+
+
+
+
+ Reviewer Employee
+
+ It has all the powers on internal transactions only
+
+
+
+ Department Manager
+
+ It has all the powers on internal transactions of the department
+
+
+
+ Transaction Manager
+
+
+
+
+ Incoming/Outgoing Employee
+
+ the user will be able to manage transactions
+
+
+
+ Executive manager
+
+
+
+ Reopen Transaction
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/odex25_transactions/exp_transaction_documents/security/ir.model.access.csv b/odex25_transactions/exp_transaction_documents/security/ir.model.access.csv
new file mode 100644
index 000000000..6aa0029b6
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/security/ir.model.access.csv
@@ -0,0 +1,88 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+cm_subject_type_employee,employee subject type,model_cm_subject_type,group_cm_employee_group,1,1,0,0
+cm_subject_type_out,employee_out_subject_type,model_cm_subject_type,group_cm_user,1,1,1,1
+cm_subject_type_reviwer,reviwer_subject_type,model_cm_subject_type,group_cm_reviewer,1,1,0,0
+cm_subject_type_dep_man,dep_subject_type,model_cm_subject_type,group_cm_department_manager,1,1,0,0
+cm_subject_type_exective_man,excetive_subject_type,model_cm_subject_type,group_cm_executive_manager,1,1,0,0
+cm_transaction_impo_employee,employee_transaction_impo,model_cm_transaction_important,group_cm_employee_group,1,0,0,0
+cm_transaction_impo_out,employee_out_transaction_impo,model_cm_transaction_important,group_cm_user,1,1,1,1
+cm_transaction_impo_reviwer,reviwer_transaction_impo,model_cm_transaction_important,group_cm_reviewer,1,0,0,0
+cm_transaction_impo_dep_man,dep_transaction_impo,model_cm_transaction_important,group_cm_department_manager,1,0,0,0
+cm_transaction_impo_exective_man,cm_procedure,model_cm_transaction_important,group_cm_executive_manager,1,0,0,0
+cm_procedure_employee,employee_cm_procedure,model_cm_procedure,group_cm_employee_group,1,0,0,0
+cm_procedure_out,employee_out_cm_procedure,model_cm_procedure,group_cm_user,1,1,1,1
+cm_procedure_reviwer,reviwer_cm_procedure,model_cm_procedure,group_cm_reviewer,1,0,0,0
+cm_procedure_dep_man,dep_cm_procedure,model_cm_procedure,group_cm_department_manager,1,0,0,0
+cm_procedure_exective_man,excetive_cm_procedure,model_cm_procedure,group_cm_executive_manager,1,0,0,0
+cm_attachmen_type_employee,employee_cm_attachmen_type,model_cm_attachment_type,group_cm_employee_group,1,1,1,1
+cm_attachmen_type_out,employee_out_cm_attachmen_type,model_cm_attachment_type,group_cm_user,1,1,1,1
+cm_attachmen_type_reviwer,reviwer_cm_attachmen_type,model_cm_attachment_type,group_cm_reviewer,1,1,1,1
+cm_attachmen_type_dep_man,dep_cm_attachmen_type,model_cm_attachment_type,group_cm_department_manager,1,1,1,1
+cm_attachmen_type_exective_man,excetive_cm_attachmen_type,model_cm_attachment_type,group_cm_executive_manager,1,1,1,1
+cm_attachment,employee_cm_attachmen,model_cm_attachment,group_cm_employee_group,1,1,1,1
+cm_attachmen_out,employee_out_cm_attachmen,model_cm_attachment,group_cm_user,1,1,1,1
+cm_attachmen_reviwer,reviwer_cm_attachmen,model_cm_attachment,group_cm_reviewer,1,1,1,1
+cm_attachmen_dep_man,dep_cm_attachmen,model_cm_attachment,group_cm_department_manager,1,1,1,1
+cm_attachmen_exective_man,excetive_cm_attachmen,model_cm_attachment,group_cm_executive_manager,1,1,1,1
+cm_archive_type,employee_cm_archive_type,model_cm_archive_type,group_cm_employee_group,1,0,0,0
+cm_archive_type_out,employee_out_cm_archive_type,model_cm_archive_type,group_cm_user,1,1,1,1
+cm_archive_type_reviwer,reviwer_cm_archive_type,model_cm_archive_type,group_cm_reviewer,1,0,0,0
+cm_archive_type_dep_man,dep_cm_archive_type,model_cm_archive_type,group_cm_department_manager,1,0,0,0
+cm_archive_type_exective_man,excetive_cm_archive_type,model_cm_archive_type,group_cm_executive_manager,1,0,0,0
+cm_attachment_rule,employee_cm_attachment_rule,model_cm_attachment_rule,group_cm_employee_group,1,1,1,1
+cm_attachment_rule_out,employee_out_cm_attachment_rule,model_cm_attachment_rule,group_cm_user,1,1,1,1
+cm_attachment_rule_reviwer,reviwer_cm_attachment_rule,model_cm_attachment_rule,group_cm_reviewer,1,1,1,1
+cm_attachment_rule_dep_man,dep_cm_attachment_rule,model_cm_attachment_rule,group_cm_department_manager,1,1,1,1
+cm_attachment_rule_exective_man,excetive_cm_attachment_rule,model_cm_attachment_rule,group_cm_executive_manager,1,1,1,1
+cm_attachment_rule,employee_cm_attachment_rule,model_cm_attachment_rule,group_cm_employee_group,1,1,1,1
+cm_attachment_rule_out,employee_out_cm_attachment_rule,model_cm_attachment_rule,group_cm_user,1,1,1,1
+cm_attachment_rule_reviwer,reviwer_cm_attachment_rule,model_cm_attachment_rule,group_cm_reviewer,1,1,1,1
+cm_attachment_rule_dep_man,dep_cm_attachment_rule,model_cm_attachment_rule,group_cm_department_manager,1,1,1,1
+cm_attachment_rule_exective_man,excetive_cm_attachment_rule,model_cm_attachment_rule,group_cm_executive_manager,1,1,1,1
+cm_transaction_trace,employee_cm_transaction_trace,model_cm_transaction_trace,group_cm_employee_group,1,1,1,1
+cm_transaction_trace_out,employee_out_cm_transaction_trace,model_cm_transaction_trace,group_cm_user,1,1,1,1
+cm_transaction_trace_reviwer,reviwer_cm_transaction_trace,model_cm_transaction_trace,group_cm_reviewer,1,1,1,1
+cm_transaction_trace_dep_man,dep_cm_transaction_trace,model_cm_transaction_trace,group_cm_department_manager,1,1,1,1
+cm_transaction_trace_exective_man,excetive_cm_transaction_trace,model_cm_transaction_trace,group_cm_executive_manager,1,1,1,1
+cm_job_title,employee_cm_job_title,model_cm_job_title,group_cm_employee_group,1,0,0,0
+cm_job_title_out,employee_out_cm_job_title,model_cm_job_title,group_cm_user,1,1,1,1
+cm_job_title_reviwer,reviwer_cm_job_title,model_cm_job_title,group_cm_reviewer,1,0,0,0
+cm_job_title_dep_man,dep_cm_job_title,model_cm_job_title,group_cm_department_manager,1,0,0,0
+cm_job_title_exective_man,excetive_cm_job_title,model_cm_job_title,group_cm_executive_manager,1,0,0,0
+cm_entity,employee_cm_entity,model_cm_entity,group_cm_employee_group,1,1,0,0
+cm_entity_out,employee_out_cm_entity,model_cm_entity,group_cm_user,1,1,1,1
+cm_entity_reviwer,reviwer_cm_entity,model_cm_entity,group_cm_reviewer,1,1,0,0
+cm_entity_dep_man,dep_cm_entity,model_cm_entity,group_cm_department_manager,1,1,0,0
+cm_entity_exective_man,excetive_cm_entity,model_cm_entity,group_cm_executive_manager,1,1,0,0
+internal_transaction,employee_internal_transaction,model_internal_transaction,group_cm_employee_group,1,1,1,1
+internal_transaction_out,employee_out_internal_transaction,model_internal_transaction,group_cm_user,1,1,1,1
+internal_transaction_reviwer,reviwer_internal_transaction,model_internal_transaction,group_cm_reviewer,1,1,1,1
+internal_transaction_dep_man,dep_internal_transaction,model_internal_transaction,group_cm_department_manager,1,1,1,1
+internal_transaction_exective_man,excetive_internal_transaction,model_internal_transaction,group_cm_executive_manager,1,1,1,1
+incoming_transaction,employee_incoming_transaction,model_incoming_transaction,group_cm_employee_group,0,0,0,0
+incoming_transaction_out,employee_out_incoming_transaction,model_incoming_transaction,group_cm_user,1,1,1,1
+incoming_transaction_reviwer,reviwer_incoming_transaction,model_incoming_transaction,group_cm_reviewer,1,1,1,1
+incoming_transaction_dep_man,dep_incoming_transaction,model_incoming_transaction,group_cm_department_manager,0,0,0,0
+incoming_transaction_exective_man,excetive_incoming_transaction,model_incoming_transaction,group_cm_executive_manager,1,1,1,1
+outgoing_transaction,employee_outgoing_transaction,model_outgoing_transaction,group_cm_employee_group,0,0,0,0
+outgoing_transaction_out,employee_out_outgoing_transaction,model_outgoing_transaction,group_cm_user,1,1,1,1
+outgoing_transaction_reviwer,reviwer_outgoing_transaction,model_outgoing_transaction,group_cm_reviewer,1,1,1,1
+outgoing_transaction_dep_man,dep_outgoing_transaction,model_outgoing_transaction,group_cm_department_manager,0,0,0,0
+outgoing_transaction_exective_man,excetive_outgoing_transaction,model_outgoing_transaction,group_cm_executive_manager,1,1,1,1
+cm_project_type,employee_cm_project_type,model_project_type,group_cm_employee_group,1,0,0,0
+cm_project_type_out,employee_out_project_type,model_project_type,group_cm_user,1,1,1,1
+cm_project_type_reviwer,reviwer_project_type,model_project_type,group_cm_reviewer,1,0,0,0
+cm_project_type_dep_man,dep_project_type,model_project_type,group_cm_department_manager,1,0,0,0
+cm_project_type_exective_man,excetive_project_type,model_project_type,group_cm_executive_manager,1,0,0,0
+cm_transaction_category,employee_cm_transaction_category,model_transaction_tag,group_cm_employee_group,1,0,0,0
+cm_transaction_category_out,employee_out_transaction_category,model_transaction_tag,group_cm_user,1,1,1,1
+cm_transaction_category_reviwer,reviwer_transaction_category,model_transaction_tag,group_cm_reviewer,1,0,0,0
+cm_transaction_category_dep_man,dep_transaction_category,model_transaction_tag,group_cm_department_manager,1,0,0,0
+cm_transaction_category_exective_man,excetive_transaction_category,model_transaction_tag,group_cm_executive_manager,1,0,0,0
+access_transaction_transaction,transaction_transaction,model_transaction_transaction,,1,1,1,1
+access_odex_barcode,odex_barcode,model_odex_barcode,,1,1,1,1
+access_reject_reason_wizard,access_reject_reason_wizard,model_reject_reason_wizard,base.group_user,1,1,1,1
+access_forward_transaction_wizard,access_forward_transaction_wizard,model_forward_transaction_wizard,base.group_user,1,1,1,1
+access_transaction_reply_wizard,access_transaction_reply_wizard,model_transaction_reply_wizard,base.group_user,1,1,1,1
+access_archive_transaction_wizard,access_archive_transaction_wizard,model_archive_transaction_wizard,base.group_user,1,1,1,1
+access_reopen_transaction_wizard,access_reopen_transaction_wizard,model_reopen_transaction_wizard,base.group_user,1,1,1,1
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_documents/static/description/icon.png b/odex25_transactions/exp_transaction_documents/static/description/icon.png
new file mode 100644
index 000000000..dde8236e0
Binary files /dev/null and b/odex25_transactions/exp_transaction_documents/static/description/icon.png differ
diff --git a/odex25_transactions/exp_transaction_documents/static/src/css/barcode.css b/odex25_transactions/exp_transaction_documents/static/src/css/barcode.css
new file mode 100644
index 000000000..c4b98f061
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/static/src/css/barcode.css
@@ -0,0 +1,17 @@
+.barcode-title{
+ text-align: center;
+ margin: 3px;
+ padding: 3px;
+ font-size: 2em;
+}
+.barcode-date,.barcode-barcode{
+ text-align: center;
+}
+.barcode-no{
+ font-size: 1.3em;
+ font-weight: bold;
+}
+.barcode-barcode{
+ margin: auto !important;
+ float: left !important;
+}
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_documents/tools/__init__.py b/odex25_transactions/exp_transaction_documents/tools/__init__.py
new file mode 100644
index 000000000..01409ce5d
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/tools/__init__.py
@@ -0,0 +1,11 @@
+#-*- coding: utf-8 -*-
+from . import barcode
+from .barcode import writer
+
+
+def generator(code):
+ return barcode.get('ean13', code).render()
+
+def generator128(code):
+ ean = barcode.get('code128', code, writer.SVGWriter())
+ return ean.render({})
diff --git a/odex25_transactions/exp_transaction_documents/tools/barcode/DejaVuSansMono.ttf b/odex25_transactions/exp_transaction_documents/tools/barcode/DejaVuSansMono.ttf
new file mode 100644
index 000000000..6bc854dda
Binary files /dev/null and b/odex25_transactions/exp_transaction_documents/tools/barcode/DejaVuSansMono.ttf differ
diff --git a/odex25_transactions/exp_transaction_documents/tools/barcode/__init__.py b/odex25_transactions/exp_transaction_documents/tools/barcode/__init__.py
new file mode 100644
index 000000000..40ebe59a3
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/tools/barcode/__init__.py
@@ -0,0 +1,103 @@
+# -*- coding: utf-8 -*-
+"""
+viivakoodi
+==========
+
+This package provides a simple way to create standard barcodes.
+It needs no external packages to be installed, the barcodes are
+created as SVG objects. If PIL (Python Imaging Library) is
+installed, the barcodes can also be rendered as images (all
+formats supported by PIL).
+"""
+
+__project__ = 'viivakoodi'
+__author__ = 'Thorsten Weimann, Alexander Shorin'
+__copyright__ = '2010-2013, Thorsten Weimann; 2014, Alexander Shorin'
+__author_email__ = 'kxepal@gmail.com'
+__description__ = ('Create standard barcodes with Python. No external '
+ 'modules needed (optional PIL support included).')
+__version__ = '0.8.0'
+__release__ = '{version}'.format(version=__version__)
+__license__ = 'MIT'
+__url__ = 'https://github.com/kxepal/viivakoodi'
+__classifiers__ = [
+ 'Development Status :: 4 - Beta',
+ 'Environment :: Console',
+ 'Intended Audience :: Developers',
+ 'License :: OSI Approved :: MIT License',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python',
+ 'Programming Language :: Python :: 2',
+ 'Programming Language :: Python :: 2.6',
+ 'Programming Language :: Python :: 2.7',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.3',
+ 'Programming Language :: Python :: 3.4',
+ 'Topic :: Software Development :: Libraries :: Python Modules',
+ 'Topic :: Multimedia :: Graphics',
+]
+
+
+from .errors import BarcodeNotFoundError
+from .codex import Code39, PZN, Code128
+from .ean import EAN8, EAN13, EAN14, JAN
+from .isxn import ISBN10, ISBN13, ISSN
+from .upc import UPCA
+
+try:
+ _strbase = basestring # lint:ok
+except NameError:
+ _strbase = str
+
+
+__BARCODE_MAP = dict(
+ ean8=EAN8,
+ ean13=EAN13,
+ ean=EAN13,
+ ean14=EAN14,
+ gtin=EAN14,
+ jan=JAN,
+ upc=UPCA,
+ upca=UPCA,
+ isbn=ISBN13,
+ isbn13=ISBN13,
+ gs1=ISBN13,
+ isbn10=ISBN10,
+ issn=ISSN,
+ code39=Code39,
+ pzn=PZN,
+ code128=Code128,
+)
+
+PROVIDED_BARCODES = list(__BARCODE_MAP.keys())
+PROVIDED_BARCODES.sort()
+
+
+def get(name, code=None, writer=None):
+ try:
+ barcode = __BARCODE_MAP[name.lower()]
+ except KeyError:
+ raise BarcodeNotFoundError('The barcode {0!r} you requested is not '
+ 'known.'.format(name))
+ if code is not None:
+ return barcode(code, writer)
+ else:
+ return barcode
+
+
+def get_class(name):
+ return get_barcode(name)
+
+
+def generate(name, code, writer=None, output=None, writer_options=None):
+ options = writer_options or {}
+ barcode = get_barcode(name, code, writer)
+ if isinstance(output, _strbase):
+ fullname = barcode.save(output, options)
+ return fullname
+ else:
+ barcode.write(output, options)
+
+
+get_barcode = get
+get_barcode_class = get_class
diff --git a/odex25_transactions/exp_transaction_documents/tools/barcode/base.py b/odex25_transactions/exp_transaction_documents/tools/barcode/base.py
new file mode 100644
index 000000000..f29330842
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/tools/barcode/base.py
@@ -0,0 +1,103 @@
+# -*- coding: utf-8 -*-
+"""barcode.base
+
+"""
+
+from __future__ import unicode_literals
+
+from .writer import SVGWriter
+
+
+class Barcode(object):
+
+ name = ''
+
+ raw = None
+
+ digits = 0
+
+ default_writer = SVGWriter
+
+ default_writer_options = {
+ 'module_width': 0.2,
+ 'module_height': 15.0,
+ 'quiet_zone': 6.5,
+ 'font_size': 10,
+ 'text_distance': 5.0,
+ 'background': 'white',
+ 'foreground': 'black',
+ 'write_text': True,
+ 'text': '',
+ }
+
+ def to_ascii(self):
+ code = self.build()
+ for i, line in enumerate(code):
+ code[i] = line.replace('1', 'X').replace('0', ' ')
+ return '\n'.join(code)
+
+ def __repr__(self):
+ return '<{0}({1!r})>'.format(self.__class__.__name__,
+ self.get_fullcode())
+
+ def build(self):
+ raise NotImplementedError
+
+ def get_fullcode(self):
+ """Returns the full code, encoded in the barcode.
+
+ :returns: Full human readable code.
+ :rtype: String
+ """
+ raise NotImplementedError
+
+ def save(self, filename, options=None):
+ """Renders the barcode and saves it in `filename`.
+
+ :parameters:
+ filename : String
+ Filename to save the barcode in (without filename
+ extension).
+ options : Dict
+ The same as in `self.render`.
+
+ :returns: The full filename with extension.
+ :rtype: String
+ """
+ output = self.render(options)
+ _filename = self.writer.save(filename, output)
+ return _filename
+
+ def write(self, fp, options=None):
+ """Renders the barcode and writes it to the file like object
+ `fp`.
+
+ :parameters:
+ fp : File like object
+ Object to write the raw data in.
+ options : Dict
+ The same as in `self.render`.
+ """
+ output = self.render(options)
+ if hasattr(output, 'tostring'):
+ output.save(fp, format=self.writer.format)
+ else:
+ fp.write(output)
+
+ def render(self, writer_options=None):
+ """Renders the barcode using `self.writer`.
+
+ :parameters:
+ writer_options : Dict
+ Options for `self.writer`, see writer docs for details.
+
+ :returns: Output of the writers render method.
+ """
+ options = Barcode.default_writer_options.copy()
+ options.update(writer_options or {})
+ if options['write_text']:
+ options['text'] = self.get_fullcode()
+ self.writer.set_options(options)
+ code = self.build()
+ raw = Barcode.raw = self.writer.render(code)
+ return raw
diff --git a/odex25_transactions/exp_transaction_documents/tools/barcode/charsets/__init__.py b/odex25_transactions/exp_transaction_documents/tools/barcode/charsets/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/odex25_transactions/exp_transaction_documents/tools/barcode/charsets/code128.py b/odex25_transactions/exp_transaction_documents/tools/barcode/charsets/code128.py
new file mode 100644
index 000000000..5132e29b9
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/tools/barcode/charsets/code128.py
@@ -0,0 +1,64 @@
+# -*- coding: utf-8 -*-
+
+from __future__ import unicode_literals
+
+import string
+
+# Charsets for code 128
+
+_common = (
+ ' ', '!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',',
+ '-', '.', '/',
+) + tuple(string.digits) + (
+ ':', ';', '<', '=', '>', '?', '@',
+) + tuple(string.ascii_uppercase) + (
+ '[', '\\', ']', '^', '_',
+)
+
+_charset_a = _common + (
+ '\x00', '\x01', '\x02', '\x03', '\x04', '\x05', '\x06', '\x07', '\x08',
+ '\x09', '\x0a', '\x0b', '\x0c', '\x0d', '\x0e', '\x0f', '\x10', '\x11',
+ '\x12', '\x13', '\x14', '\x15', '\x16', '\x17', '\x18', '\x19', '\x1a',
+ '\x1b', '\x1c', '\x1d', '\x1e', '\x1f', '\xf3', '\xf2', 'SHIFT', 'TO_C',
+ 'TO_B', '\xf4', '\xf1',
+)
+
+_charset_b = _common + ('`',) + tuple(string.ascii_lowercase) + (
+ '{', '|', '}', '~', '\x7f', '\xf3', '\xf2', 'SHIFT', 'TO_C', '\xf4',
+ 'TO_A', '\xf1',
+)
+
+ALL = set(_common + _charset_a + _charset_b)
+A = dict(((c, i) for i, c in enumerate(_charset_a)))
+B = dict(((c, i) for i, c in enumerate(_charset_b)))
+C = {'TO_B': 100, 'TO_A': 101, '\xf1': 102}
+
+CODES = (
+ '11011001100', '11001101100', '11001100110', '10010011000', '10010001100',
+ '10001001100', '10011001000', '10011000100', '10001100100', '11001001000',
+ '11001000100', '11000100100', '10110011100', '10011011100', '10011001110',
+ '10111001100', '10011101100', '10011100110', '11001110010', '11001011100',
+ '11001001110', '11011100100', '11001110100', '11101101110', '11101001100',
+ '11100101100', '11100100110', '11101100100', '11100110100', '11100110010',
+ '11011011000', '11011000110', '11000110110', '10100011000', '10001011000',
+ '10001000110', '10110001000', '10001101000', '10001100010', '11010001000',
+ '11000101000', '11000100010', '10110111000', '10110001110', '10001101110',
+ '10111011000', '10111000110', '10001110110', '11101110110', '11010001110',
+ '11000101110', '11011101000', '11011100010', '11011101110', '11101011000',
+ '11101000110', '11100010110', '11101101000', '11101100010', '11100011010',
+ '11101111010', '11001000010', '11110001010', '10100110000', '10100001100',
+ '10010110000', '10010000110', '10000101100', '10000100110', '10110010000',
+ '10110000100', '10011010000', '10011000010', '10000110100', '10000110010',
+ '11000010010', '11001010000', '11110111010', '11000010100', '10001111010',
+ '10100111100', '10010111100', '10010011110', '10111100100', '10011110100',
+ '10011110010', '11110100100', '11110010100', '11110010010', '11011011110',
+ '11011110110', '11110110110', '10101111000', '10100011110', '10001011110',
+ '10111101000', '10111100010', '11110101000', '11110100010', '10111011110',
+ '10111101110', '11101011110', '11110101110', '11010000100', '11010010000',
+ '11010011100',
+)
+
+STOP = '11000111010'
+
+START_CODES = {'A': 103, 'B': 104, 'C': 105}
+TO = {101: START_CODES['A'], 100: START_CODES['B'], 99: START_CODES['C']}
diff --git a/odex25_transactions/exp_transaction_documents/tools/barcode/charsets/code39.py b/odex25_transactions/exp_transaction_documents/tools/barcode/charsets/code39.py
new file mode 100644
index 000000000..4031f65f0
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/tools/barcode/charsets/code39.py
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+
+from __future__ import unicode_literals
+
+import string
+
+# Charsets for code 39
+REF = (tuple(string.digits) + tuple(string.ascii_uppercase) +
+ ('-', '.', ' ', '$', '/', '+', '%'))
+B = '1'
+E = '0'
+CODES = (
+ '101000111011101', '111010001010111', '101110001010111',
+ '111011100010101', '101000111010111', '111010001110101',
+ '101110001110101', '101000101110111', '111010001011101',
+ '101110001011101', '111010100010111', '101110100010111',
+ '111011101000101', '101011100010111', '111010111000101',
+ '101110111000101', '101010001110111', '111010100011101',
+ '101110100011101', '101011100011101', '111010101000111',
+ '101110101000111', '111011101010001', '101011101000111',
+ '111010111010001', '101110111010001', '101010111000111',
+ '111010101110001', '101110101110001', '101011101110001',
+ '111000101010111', '100011101010111', '111000111010101',
+ '100010111010111', '111000101110101', '100011101110101',
+ '100010101110111', '111000101011101', '100011101011101',
+ '100010001000101', '100010001010001', '100010100010001',
+ '101000100010001',
+)
+
+EDGE = '100010111011101'
+MIDDLE = '0'
+
+# MAP for assigning every symbol (REF) to (reference number, barcode)
+MAP = dict(zip(REF, enumerate(CODES)))
diff --git a/odex25_transactions/exp_transaction_documents/tools/barcode/charsets/ean.py b/odex25_transactions/exp_transaction_documents/tools/barcode/charsets/ean.py
new file mode 100644
index 000000000..951028a64
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/tools/barcode/charsets/ean.py
@@ -0,0 +1,17 @@
+# -*- coding: utf-8 -*-
+
+from __future__ import unicode_literals
+
+
+EDGE = '101'
+MIDDLE = '01010'
+CODES = {
+ 'A': ('0001101', '0011001', '0010011', '0111101', '0100011',
+ '0110001', '0101111', '0111011', '0110111', '0001011'),
+ 'B': ('0100111', '0110011', '0011011', '0100001', '0011101',
+ '0111001', '0000101', '0010001', '0001001', '0010111'),
+ 'C': ('1110010', '1100110', '1101100', '1000010', '1011100',
+ '1001110', '1010000', '1000100', '1001000', '1110100'),
+}
+LEFT_PATTERN = ('AAAAAA', 'AABABB', 'AABBAB', 'AABBBA', 'ABAABB',
+ 'ABBAAB', 'ABBBAA', 'ABABAB', 'ABABBA', 'ABBABA')
diff --git a/odex25_transactions/exp_transaction_documents/tools/barcode/codex.py b/odex25_transactions/exp_transaction_documents/tools/barcode/codex.py
new file mode 100644
index 000000000..56eb0a6a0
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/tools/barcode/codex.py
@@ -0,0 +1,251 @@
+# -*- coding: utf-8 -*-
+"""Module: barcode.codex
+
+:Provided barcodes: Code 39, Code 128, PZN
+"""
+
+from __future__ import unicode_literals
+
+from .base import Barcode
+from .charsets import code128, code39
+from .errors import *
+
+__docformat__ = 'restructuredtext en'
+
+# Sizes
+MIN_SIZE = 0.2
+MIN_QUIET_ZONE = 2.54
+
+
+def check_code(code, name, allowed):
+ wrong = []
+ for char in code:
+ if char not in allowed:
+ wrong.append(char)
+ if wrong:
+ raise IllegalCharacterError(
+ 'The following characters are not '
+ 'valid for {name}: {wrong}'.format(name=name,
+ wrong=', '.join(wrong)))
+
+
+class Code39(Barcode):
+ """Initializes a new Code39 instance.
+
+ :parameters:
+ code : String
+ Code 39 string without \* and checksum (added automatically if
+ `add_checksum` is True).
+ writer : barcode.writer Instance
+ The writer to render the barcode (default: SVGWriter).
+ add_checksum : Boolean
+ Add the checksum to code or not (default: True).
+ """
+
+ name = 'Code 39'
+
+ def __init__(self, code, writer=None, add_checksum=True):
+ self.code = code.upper()
+ if add_checksum:
+ self.code += self.calculate_checksum()
+ self.writer = writer or Barcode.default_writer()
+ check_code(self.code, self.name, code39.REF)
+
+ def __unicode__(self):
+ return self.code
+
+ __str__ = __unicode__
+
+ def get_fullcode(self):
+ return self.code
+
+ def calculate_checksum(self):
+ check = sum([code39.MAP[x][0] for x in self.code]) % 43
+ for k, v in code39.MAP.items():
+ if check == v[0]:
+ return k
+
+ def build(self):
+ chars = [code39.EDGE]
+ for char in self.code:
+ chars.append(code39.MAP[char][1])
+ chars.append(code39.EDGE)
+ return [code39.MIDDLE.join(chars)]
+
+ def render(self, writer_options):
+ options = dict(module_width=MIN_SIZE, quiet_zone=MIN_QUIET_ZONE)
+ options.update(writer_options or {})
+ return Barcode.render(self, options)
+
+
+class PZN(Code39):
+ """Initializes new German number for pharmaceutical products.
+
+ :parameters:
+ pzn : String
+ Code to render.
+ writer : barcode.writer Instance
+ The writer to render the barcode (default: SVGWriter).
+ """
+
+ name = 'Pharmazentralnummer'
+
+ digits = 6
+
+ def __init__(self, pzn, writer=None):
+ pzn = pzn[:self.digits]
+ if not pzn.isdigit():
+ raise IllegalCharacterError('PZN can only contain numbers.')
+ if len(pzn) != self.digits:
+ raise NumberOfDigitsError('PZN must have {0} digits, not '
+ '{1}.'.format(self.digits, len(pzn)))
+ self.pzn = pzn
+ self.pzn = '{0}{1}'.format(pzn, self.calculate_checksum())
+ Code39.__init__(self, 'PZN-{0}'.format(self.pzn), writer,
+ add_checksum=False)
+
+ def get_fullcode(self):
+ return 'PZN-{0}'.format(self.pzn)
+
+ def calculate_checksum(self):
+ sum_ = sum([int(x) * int(y) for x, y in enumerate(self.pzn, start=2)])
+ checksum = sum_ % 11
+ if checksum == 10:
+ raise BarcodeError('Checksum can not be 10 for PZN.')
+ else:
+ return checksum
+
+
+class Code128(Barcode):
+ """Initializes a new Code128 instance. The checksum is added automatically
+ when building the bars.
+
+ :parameters:
+ code : String
+ Code 128 string without checksum (added automatically).
+ writer : barcode.writer Instance
+ The writer to render the barcode (default: SVGWriter).
+ """
+
+ name = 'Code 128'
+
+ def __init__(self, code, writer=None):
+ self.code = code
+ self.writer = writer or Barcode.default_writer()
+ self._charset = 'B'
+ self._buffer = ''
+ check_code(self.code, self.name, code128.ALL)
+
+ def __unicode__(self):
+ return self.code
+
+ __str__ = __unicode__
+
+ @property
+ def encoded(self):
+ return self._build()
+
+ def get_fullcode(self):
+ return self.code
+
+ def _new_charset(self, which):
+ if which == 'A':
+ code = self._convert('TO_A')
+ elif which == 'B':
+ code = self._convert('TO_B')
+ elif which == 'C':
+ code = self._convert('TO_C')
+ self._charset = which
+ return [code]
+
+ def _maybe_switch_charset(self, pos):
+ char = self.code[pos]
+ next_ = self.code[pos:pos + 10]
+
+ def look_next():
+ digits = 0
+ for c in next_:
+ if c.isdigit():
+ digits += 1
+ else:
+ break
+ return digits > 3
+
+ codes = []
+ if self._charset == 'C' and not char.isdigit():
+ if char in code128.B:
+ codes = self._new_charset('B')
+ elif char in code128.A:
+ codes = self._new_charset('A')
+ if len(self._buffer) == 1:
+ codes.append(self._convert(self._buffer[0]))
+ self._buffer = ''
+ elif self._charset == 'B':
+ if look_next():
+ codes = self._new_charset('C')
+ elif char not in code128.B:
+ if char in code128.A:
+ codes = self._new_charset('A')
+ elif self._charset == 'A':
+ if look_next():
+ codes = self._new_charset('C')
+ elif char not in code128.A:
+ if char in code128.B:
+ codes = self._new_charset('B')
+ return codes
+
+ def _convert(self, char):
+ if self._charset == 'A':
+ return code128.A[char]
+ elif self._charset == 'B':
+ return code128.B[char]
+ elif self._charset == 'C':
+ if char in code128.C:
+ return code128.C[char]
+ elif char.isdigit():
+ self._buffer += char
+ if len(self._buffer) == 2:
+ value = int(self._buffer)
+ self._buffer = ''
+ return value
+
+ def _try_to_optimize(self, encoded):
+ if encoded[1] in code128.TO:
+ encoded[:2] = [code128.TO[encoded[1]]]
+ return encoded
+
+ def _calculate_checksum(self, encoded):
+ cs = [encoded[0]]
+ for i, code_num in enumerate(encoded[1:], start=1):
+ cs.append(i * code_num)
+ return sum(cs) % 103
+
+ def _build(self):
+ encoded = [code128.START_CODES[self._charset]]
+ for i, char in enumerate(self.code):
+ encoded.extend(self._maybe_switch_charset(i))
+ code_num = self._convert(char)
+ if code_num is not None:
+ encoded.append(code_num)
+ # Finally look in the buffer
+ if len(self._buffer) == 1:
+ encoded.extend(self._new_charset('B'))
+ encoded.append(self._convert(self._buffer[0]))
+ self._buffer = ''
+ encoded = self._try_to_optimize(encoded)
+ return encoded
+
+ def build(self):
+ encoded = self._build()
+ encoded.append(self._calculate_checksum(encoded))
+ code = ''
+ for code_num in encoded:
+ code += code128.CODES[code_num]
+ code += code128.STOP
+ code += '11'
+ return [code]
+
+ def render(self, writer_options):
+ options = dict(module_width=MIN_SIZE, quiet_zone=MIN_QUIET_ZONE)
+ options.update(writer_options or {})
+ return Barcode.render(self, options)
diff --git a/odex25_transactions/exp_transaction_documents/tools/barcode/ean.py b/odex25_transactions/exp_transaction_documents/tools/barcode/ean.py
new file mode 100644
index 000000000..82f75c8db
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/tools/barcode/ean.py
@@ -0,0 +1,196 @@
+# -*- coding: utf-8 -*-
+"""Module: barcode.ean
+
+:Provided barcodes: EAN-13, EAN-8, JAN
+"""
+
+from __future__ import unicode_literals
+
+from .base import Barcode
+from .charsets import ean as _ean
+from .errors import *
+
+# Python 3
+try:
+ reduce
+except NameError:
+ from functools import reduce
+
+
+# EAN13 Specs (all sizes in mm)
+SIZES = dict(SC0=0.27, SC1=0.297, SC2=0.33, SC3=0.363, SC4=0.396, SC5=0.445,
+ SC6=0.495, SC7=0.544, SC8=0.61, SC9=0.66)
+
+
+class EuropeanArticleNumber13(Barcode):
+ """Initializes EAN13 object.
+
+ :parameters:
+ ean : String
+ The ean number as string.
+ writer : barcode.writer Instance
+ The writer to render the barcode (default: SVGWriter).
+ """
+
+ name = 'EAN-13'
+
+ digits = 12
+
+ def __init__(self, ean, writer=None):
+ ean = ean[:self.digits]
+ if not ean.isdigit():
+ raise IllegalCharacterError('EAN code can only contain numbers.')
+ self.ean = ean
+ self.ean = '{0}{1}'.format(ean, self.calculate_checksum())
+ self.writer = writer or Barcode.default_writer()
+
+ def __unicode__(self):
+ return self.ean
+
+ __str__ = __unicode__
+
+ def get_fullcode(self):
+ return self.ean
+
+ def calculate_checksum(self):
+ """Calculates the checksum for EAN13-Code.
+
+ :returns: The checksum for `self.ean`.
+ :rtype: Integer
+ """
+ def sum_(x, y):
+ return int(x) + int(y)
+
+ evensum = reduce(sum_, self.ean[::2])
+ oddsum = reduce(sum_, self.ean[1::2])
+ return (10 - ((evensum + oddsum * 3) % 10)) % 10
+
+ def build(self):
+ """Builds the barcode pattern from `self.ean`.
+
+ :returns: The pattern as string
+ :rtype: String
+ """
+ code = _ean.EDGE[:]
+ pattern = _ean.LEFT_PATTERN[int(self.ean[0])]
+ for i, number in enumerate(self.ean[1:7]):
+ code += _ean.CODES[pattern[i]][int(number)]
+ code += _ean.MIDDLE
+ for number in self.ean[7:]:
+ code += _ean.CODES['C'][int(number)]
+ code += _ean.EDGE
+ return [code]
+
+ def to_ascii(self):
+ """Returns an ascii representation of the barcode.
+
+ :rtype: String
+ """
+ code = self.build()
+ for i, line in enumerate(code):
+ code[i] = line.replace('1', '|').replace('0', ' ')
+ return '\n'.join(code)
+
+ def render(self, writer_options=None):
+ options = dict(module_width=SIZES['SC2'])
+ options.update(writer_options or {})
+ return Barcode.render(self, options)
+
+
+class JapanArticleNumber(EuropeanArticleNumber13):
+ """Initializes JAN barcode.
+
+ :parameters:
+ jan : String
+ The jan number as string.
+ writer : barcode.writer Instance
+ The writer to render the barcode (default: SVGWriter).
+ """
+
+ name = 'JAN'
+
+ valid_country_codes = list(range(450, 460)) + list(range(490, 500))
+
+ def __init__(self, jan, writer=None):
+ if int(jan[:3]) not in JapanArticleNumber.valid_country_codes:
+ raise WrongCountryCodeError("Country code isn't between 450-460 "
+ "or 490-500.")
+ super(JapanArticleNumber, self).__init__(jan, writer)
+
+
+class EuropeanArticleNumber8(EuropeanArticleNumber13):
+ """Represents an EAN-8 barcode. See EAN13's __init__ for details.
+
+ :parameters:
+ ean : String
+ The ean number as string.
+ writer : barcode.writer Instance
+ The writer to render the barcode (default: SVGWriter).
+ """
+
+ name = 'EAN-8'
+
+ digits = 7
+
+ def calculate_checksum(self):
+ """Calculates the checksum for EAN8-Code.
+
+ :returns: The checksum for `self.ean`.
+ :rtype: Integer
+ """
+ def sum_(x, y):
+ return int(x) + int(y)
+
+ evensum = reduce(sum_, self.ean[::2])
+ oddsum = reduce(sum_, self.ean[1::2])
+ return (10 - ((evensum * 3 + oddsum) % 10)) % 10
+
+ def build(self):
+ """Builds the barcode pattern from `self.ean`.
+
+ :returns: The pattern as string
+ :rtype: String
+ """
+ code = _ean.EDGE[:]
+ for number in self.ean[:4]:
+ code += _ean.CODES['A'][int(number)]
+ code += _ean.MIDDLE
+ for number in self.ean[4:]:
+ code += _ean.CODES['C'][int(number)]
+ code += _ean.EDGE
+ return [code]
+
+
+class EuropeanArticleNumber14(EuropeanArticleNumber13):
+ """Represents an EAN-14 barcode. See EAN13's __init__ for details.
+
+ :parameters:
+ ean : String
+ The ean number as string.
+ writer : barcode.writer Instance
+ The writer to render the barcode (default: SVGWriter).
+ """
+
+ name = 'EAN-14'
+ digits = 13
+
+ def calculate_checksum(self):
+ """Calculates the checksum for EAN13-Code.
+
+ :returns: The checksum for `self.ean`.
+ :rtype: Integer
+ """
+
+ def sum_(x, y):
+ return int(x) + int(y)
+
+ evensum = reduce(sum_, self.ean[::2])
+ oddsum = reduce(sum_, self.ean[1::2])
+ return (10 - (((evensum * 3) + oddsum) % 10)) % 10
+
+
+# Shortcuts
+EAN13 = EuropeanArticleNumber13
+EAN14 = EuropeanArticleNumber14
+EAN8 = EuropeanArticleNumber8
+JAN = JapanArticleNumber
diff --git a/odex25_transactions/exp_transaction_documents/tools/barcode/errors.py b/odex25_transactions/exp_transaction_documents/tools/barcode/errors.py
new file mode 100644
index 000000000..c3579519f
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/tools/barcode/errors.py
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+"""barcode.errors
+"""
+
+from __future__ import unicode_literals
+
+__docformat__ = 'restructuredtext en'
+
+
+class BarcodeError(Exception):
+ def __init__(self, msg):
+ self.msg = msg
+
+ def __str__(self):
+ return self.msg
+
+
+class IllegalCharacterError(BarcodeError):
+ """Raised when a barcode-string contains illegal characters."""
+
+
+class BarcodeNotFoundError(BarcodeError):
+ """Raised when an unknown barcode is requested."""
+
+
+class NumberOfDigitsError(BarcodeError):
+ """Raised when the number of digits do not match."""
+
+
+class WrongCountryCodeError(BarcodeError):
+ """Raised when a JAN (Japan Article Number) don't starts with 450-459
+ or 490-499.
+ """
diff --git a/odex25_transactions/exp_transaction_documents/tools/barcode/isxn.py b/odex25_transactions/exp_transaction_documents/tools/barcode/isxn.py
new file mode 100644
index 000000000..f10432cd9
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/tools/barcode/isxn.py
@@ -0,0 +1,136 @@
+# -*- coding: utf-8 -*-
+"""Module: barcode.isxn
+
+:Provided barcodes: ISBN-13, ISBN-10, ISSN
+
+This module provides some special codes, which are no standalone barcodes.
+All codes where transformed to EAN-13 barcodes. In every case, the checksum
+is new calculated.
+
+Example::
+
+ >>> from barcode import get_barcode
+ >>> ISBN = get_barcode('isbn10')
+ >>> isbn = ISBN('0132354187')
+ >>> unicode(isbn)
+ u'0132354187'
+ >>> isbn.get_fullcode()
+ u'9780132354189'
+ >>> # Test with wrong checksum
+ >>> isbn = ISBN('0132354180')
+ >>> unicode(isbn)
+ u'0132354187'
+
+"""
+
+from __future__ import unicode_literals
+
+from .ean import EuropeanArticleNumber13
+from .errors import *
+
+__docformat__ = 'restructuredtext en'
+
+
+class InternationalStandardBookNumber13(EuropeanArticleNumber13):
+ """Initializes new ISBN-13 barcode.
+
+ :parameters:
+ isbn : String
+ The isbn number as string.
+ writer : barcode.writer Instance
+ The writer to render the barcode (default: SVGWriter).
+ """
+
+ name = 'ISBN-13'
+
+ def __init__(self, isbn, writer=None):
+ isbn = isbn.replace('-', '')
+ self.isbn13 = isbn
+ if isbn[:3] not in ('978', '979'):
+ raise WrongCountryCodeError('ISBN must start with 978 or 979.')
+ super(InternationalStandardBookNumber13, self).__init__(isbn, writer)
+
+
+class InternationalStandardBookNumber10(InternationalStandardBookNumber13):
+ """Initializes new ISBN-10 barcode. This code is rendered as EAN-13 by
+ prefixing it with 978.
+
+ :parameters:
+ isbn : String
+ The isbn number as string.
+ writer : barcode.writer Instance
+ The writer to render the barcode (default: SVGWriter).
+ """
+
+ name = 'ISBN-10'
+
+ digits = 9
+
+ def __init__(self, isbn, writer=None):
+ isbn = isbn.replace('-', '')
+ isbn = isbn[:self.digits]
+ self.isbn10 = isbn
+ self.isbn10 = '{0}{1}'.format(isbn, self._calculate_checksum())
+ super(InternationalStandardBookNumber10, self).__init__(
+ '978' + isbn, writer,
+ )
+
+ def _calculate_checksum(self):
+ tmp = sum([x * int(y) for x, y in enumerate(self.isbn10[:9],
+ start=1)]) % 11
+ if tmp == 10:
+ return 'X'
+ else:
+ return tmp
+
+ def __unicode__(self):
+ return self.isbn10
+
+ __str__ = __unicode__
+
+
+class InternationalStandardSerialNumber(EuropeanArticleNumber13):
+ """Initializes new ISSN barcode. This code is rendered as EAN-13
+ by prefixing it with 977 and adding 00 between code and checksum.
+
+ :parameters:
+ issn : String
+ The issn number as string.
+ writer : barcode.writer Instance
+ The writer to render the barcode (default: SVGWriter).
+ """
+
+ name = 'ISSN'
+
+ digits = 7
+
+ def __init__(self, issn, writer=None):
+ issn = issn.replace('-', '')
+ issn = issn[:self.digits]
+ self.issn = issn
+ self.issn = '{0}{1}'.format(issn, self._calculate_checksum())
+ super(InternationalStandardSerialNumber, self).__init__(
+ self.make_ean(), writer,
+ )
+
+ def _calculate_checksum(self):
+ tmp = 11 - sum([x * int(y) for x, y in
+ enumerate(reversed(self.issn[:7]), start=2)]) % 11
+ if tmp == 10:
+ return 'X'
+ else:
+ return tmp
+
+ def make_ean(self):
+ return '977{0}00{1}'.format(self.issn[:7], self._calculate_checksum())
+
+ def __unicode__(self):
+ return self.issn
+
+ __str__ = __unicode__
+
+
+# Shortcuts
+ISBN13 = InternationalStandardBookNumber13
+ISBN10 = InternationalStandardBookNumber10
+ISSN = InternationalStandardSerialNumber
diff --git a/odex25_transactions/exp_transaction_documents/tools/barcode/pybarcode.py b/odex25_transactions/exp_transaction_documents/tools/barcode/pybarcode.py
new file mode 100644
index 000000000..2ad697ff3
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/tools/barcode/pybarcode.py
@@ -0,0 +1,116 @@
+# -*- coding: utf-8 -*-
+
+from __future__ import print_function
+
+import os
+from argparse import ArgumentParser
+
+# import barcode
+from .writer import ImageWriter, SVGWriter
+
+# Optional PyQt4 GUI
+try:
+ from PyQt4 import QtCore
+except ImportError:
+ QtCore = None # lint:ok
+
+# No GUI available yet
+QtCore = None
+IMG_FORMATS = ('BMP', 'GIF', 'JPEG', 'MSP', 'PCX', 'PNG', 'TIFF', 'XBM')
+
+
+def open_gui(args, parser=None):
+ pass
+
+
+def list_types(args, parser=None):
+ print('\npyBarcode available barcode formats:')
+ print(', '.join(barcode.PROVIDED_BARCODES))
+ print('\n')
+ print('Available image formats')
+ print('Standard: svg')
+ if ImageWriter is not None:
+ print('PIL:', ', '.join(IMG_FORMATS))
+ else:
+ print('PIL: disabled')
+ print('\n')
+
+
+def create_barcode(args, parser):
+ args.type = args.type.upper()
+ if args.type != 'SVG' and args.type not in IMG_FORMATS:
+ parser.error('Unknown type {type}. Try list action for available '
+ 'types.'.format(type=args.type))
+ args.barcode = args.barcode.lower()
+ if args.barcode not in barcode.PROVIDED_BARCODES:
+ parser.error('Unknown barcode {bc}. Try list action for available '
+ 'barcodes.'.format(bc=args.barcode))
+ if args.type != 'SVG':
+ opts = dict(format=args.type)
+ writer = ImageWriter()
+ else:
+ opts = dict(compress=args.compress)
+ writer = SVGWriter()
+ out = os.path.normpath(os.path.abspath(args.output))
+ name = barcode.generate(args.barcode, args.code, writer, out, opts)
+ print('New barcode saved as {0}.'.format(name))
+
+
+def main():
+ msg = []
+ if ImageWriter is None:
+ msg.append('Image output disabled (PIL not found), --type option '
+ 'disabled.')
+ else:
+ msg.append('Image output enabled, use --type option to give image '
+ 'format (png, jpeg, ...).')
+ if QtCore is None:
+ msg.append('PyQt not found, gui action disabled.')
+ else:
+ msg.append('PyQt found. Use gui action to get a simple GUI.')
+ parser = ArgumentParser(
+ description=barcode.__description__,
+ epilog=' '.join(msg))
+ parser.add_argument(
+ '-v', '--version',
+ action='version',
+ version='%(prog)s ' + barcode.__release__)
+ subparsers = parser.add_subparsers(title='Actions')
+ create_parser = subparsers.add_parser(
+ 'create',
+ help='Create a barcode with the given options.')
+ create_parser.add_argument(
+ 'code',
+ help='Code to render as barcode.')
+ create_parser.add_argument(
+ 'output',
+ help='Filename for output without extension, e.g. mybarcode.')
+ create_parser.add_argument(
+ '-c', '--compress',
+ action='store_true',
+ help='Compress output, only recognized if type is svg.')
+ create_parser.add_argument(
+ '-b', '--barcode',
+ help='Barcode to use [default: %(default)s].')
+ if ImageWriter is not None:
+ create_parser.add_argument(
+ '-t', '--type',
+ help='Type of output [default: %(default)s].')
+ list_parser = subparsers.add_parser(
+ 'list', help='List available image and code types.')
+ list_parser.set_defaults(func=list_types)
+ if QtCore is not None:
+ gui_parser = subparsers.add_parser(
+ 'gui', help='Opens a simple PyQt GUI to create barcodes.')
+ gui_parser.set_defaults(func=open_gui)
+ create_parser.set_defaults(
+ barcode='code39',
+ compress=False,
+ func=create_barcode,
+ type='svg')
+ args = parser.parse_args()
+ args.func(args, parser)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/odex25_transactions/exp_transaction_documents/tools/barcode/upc.py b/odex25_transactions/exp_transaction_documents/tools/barcode/upc.py
new file mode 100644
index 000000000..70509395b
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/tools/barcode/upc.py
@@ -0,0 +1,44 @@
+# -*- coding: utf-8 -*-
+"""Module: barcode.upc
+
+:Provided barcodes: UPC-A
+"""
+
+from __future__ import unicode_literals
+
+from .ean import EuropeanArticleNumber13
+
+__docformat__ = 'restructuredtext en'
+
+
+class UniversalProductCodeA(EuropeanArticleNumber13):
+ """Initializes new UPC-A barcode. Can be rendered as EAN-13 by passing
+ `True` to the `make_ean` argument.
+
+ :parameters:
+ upc : String
+ The upc number as string.
+ writer : barcode.writer Instance
+ The writer to render the barcode (default: SVGWriter).
+ make_ean : Boolean
+ Render barcode as EAN-13 with leading 0 (default: False).
+ """
+
+ name = 'UPC-A'
+
+ digits = 11
+
+ def __init__(self, upc, writer=None, make_ean=False):
+ if make_ean:
+ UniversalProductCodeA.digits = 12
+ upc = '0' + upc
+ self.upc = upc
+ super(UniversalProductCodeA, self).__init__(upc, writer)
+
+ def __unicode__(self):
+ return self.upc
+
+ __str__ = __unicode__
+
+
+UPCA = UniversalProductCodeA
diff --git a/odex25_transactions/exp_transaction_documents/tools/barcode/writer.py b/odex25_transactions/exp_transaction_documents/tools/barcode/writer.py
new file mode 100644
index 000000000..c1dca4bb0
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/tools/barcode/writer.py
@@ -0,0 +1,303 @@
+# -*- coding: utf-8 -*-
+
+from __future__ import unicode_literals
+
+import gzip
+import os
+import xml.dom
+
+from . import __release__
+
+try:
+ import Image
+ import ImageDraw
+ import ImageFont
+except ImportError:
+ try:
+ from PIL import Image, ImageDraw, ImageFont # lint:ok
+ except ImportError:
+ import logging
+ log = logging.getLogger('barcode')
+ log.info('PIL not found. Image output disabled.')
+ Image = ImageDraw = ImageFont = None # lint:ok
+
+
+def mm2px(mm, dpi=300):
+ return (mm * dpi) / 25.4
+
+
+def pt2mm(pt):
+ return pt * 0.352777778
+
+
+def _set_attributes(element, **attributes):
+ for key, value in attributes.items():
+ element.setAttribute(key, value)
+
+
+def create_svg_object():
+ imp = xml.dom.getDOMImplementation()
+ doctype = imp.createDocumentType(
+ 'svg',
+ '-//W3C//DTD SVG 1.1//EN',
+ 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'
+ )
+ document = imp.createDocument(None, 'svg', doctype)
+ _set_attributes(document.documentElement, version='1.1',
+ xmlns='http://www.w3.org/2000/svg')
+ return document
+
+
+SIZE = '{0:.3f}mm'
+COMMENT = 'Autogenerated with viivakoodi {0}'.format(__release__)
+PATH = os.path.dirname(os.path.abspath(__file__))
+FONT = os.path.join(PATH, 'DejaVuSansMono.ttf')
+
+
+class BaseWriter(object):
+ """Baseclass for all writers.
+
+ Initializes the basic writer options. Childclasses can add more
+ attributes and can set them directly or using
+ `self.set_options(option=value)`.
+
+ :parameters:
+ initialize : Function
+ Callback for initializing the inheriting writer.
+ Is called: `callback_initialize(raw_code)`
+ paint_module : Function
+ Callback for painting one barcode module.
+ Is called: `callback_paint_module(xpos, ypos, width, color)`
+ paint_text : Function
+ Callback for painting the text under the barcode.
+ Is called: `callback_paint_text(xpos, ypos)` using `self.text`
+ as text.
+ finish : Functidef renderon
+ Callback for doing something with the completely rendered
+ output.
+ Is called: `return callback_finish()` and must return the
+ rendered output.
+ """
+
+ def __init__(self, initialize=None, paint_module=None, paint_text=None,
+ finish=None):
+ self._callbacks = dict(initialize=initialize, paint_module=paint_module,
+ paint_text=paint_text, finish=finish)
+ self.module_width = 10
+ self.module_height = 10
+ self.font_size = 10
+ self.quiet_zone = 6.5
+ self.background = 'white'
+ self.foreground = 'black'
+ self.text = ''
+ self.text_distance = 5
+ self.center_text = True
+
+ def calculate_size(self, modules_per_line, number_of_lines, dpi=300):
+ """Calculates the size of the barcode in pixel.
+
+ :parameters:
+ modules_per_line : Integer
+ Number of modules in one line.
+ number_of_lines : Integer
+ Number of lines of the barcode.
+ dpi : Integer
+ DPI to calculate.
+
+ :returns: Width and height of the barcode in pixel.
+ :rtype: Tuple
+ """
+ width = 8 * self.quiet_zone + modules_per_line * self.module_width
+ height = 2.0 + self.module_height * number_of_lines
+ if self.font_size and self.text:
+ height += pt2mm(self.font_size) / 2 + self.text_distance
+ return int(mm2px(width, dpi)), int(mm2px(height, dpi))
+
+ def save(self, filename, output):
+ """Saves the rendered output to `filename`.
+
+ :parameters:
+ filename : String
+ Filename without extension.
+ output : String
+ The rendered output.
+
+ :returns: The full filename with extension.
+ :rtype: String
+ """
+ raise NotImplementedError
+
+ def register_callback(self, action, callback):
+ """Register one of the three callbacks if not given at instance
+ creation.
+
+ :parameters:
+ action : String
+ One of 'initialize', 'paint_module', 'paint_text', 'finish'.
+ callback : Function
+ The callback function for the given action.
+ """
+ self._callbacks[action] = callback
+
+ def set_options(self, options):
+ """Sets the given options as instance attributes (only
+ if they are known).
+
+ :parameters:
+ options : Dict
+ All known instance attributes and more if the childclass
+ has defined them before this call.
+
+ :rtype: None
+ """
+ for key, val in options.items():
+ key = key.lstrip('_')
+ if hasattr(self, key):
+ setattr(self, key, val)
+
+ def render(self, code):
+ """Renders the barcode to whatever the inheriting writer provides,
+ using the registered callbacks.
+
+ :parameters:
+ code : List
+ List of strings matching the writer spec
+ (only contain 0 or 1).
+ """
+ if self._callbacks['initialize'] is not None:
+ self._callbacks['initialize'](code)
+ ypos = 1.0
+ for line in code:
+ # Left quiet zone is x startposition
+ print(line)
+ xpos = self.quiet_zone
+ for mod in line:
+ if mod == '0':
+ color = self.background
+ else:
+ color = self.foreground
+ self._callbacks['paint_module'](xpos, ypos, self.module_width * 1.5,
+ color)
+ xpos += self.module_width * 1.5
+ # Add right quiet zone to every line
+ self._callbacks['paint_module'](xpos, ypos, self.quiet_zone * 1.5,
+ self.background)
+ ypos += self.module_height
+ if self.text and self._callbacks['paint_text'] is not None:
+ ypos += self.text_distance
+ if self.center_text:
+ xpos = xpos / 2.0
+ else:
+ xpos = self.quiet_zone + 4.0
+ self._callbacks['paint_text'](xpos, ypos)
+ return self._callbacks['finish']()
+
+
+class SVGWriter(BaseWriter):
+
+ def __init__(self):
+ super(SVGWriter, self).__init__(
+ self._init, self._create_module, self._create_text, self._finish,
+ )
+ self.compress = False
+ self.dpi = 25.4
+ self._document = None
+ self._root = None
+
+
+
+ def _init(self, code):
+ width, height = self.calculate_size(len(code[0]), len(code), self.dpi)
+ print('FIRST WIDTH : {}, {}'.format(width, self.module_width))
+ self._document = create_svg_object()
+ self._root = self._document.documentElement
+ attributes = dict(width=SIZE.format(width), height=SIZE.format(height / 2.))
+ _set_attributes(self._root, **attributes)
+ self._root.appendChild(self._document.createComment(COMMENT))
+ background = self._document.createElement('rect')
+ attributes = dict(width='100%', height='100%',
+ style='fill:{0}'.format(self.background))
+ _set_attributes(background, **attributes)
+ self._root.appendChild(background)
+
+ def _create_module(self, xpos, ypos, width, color):
+ print('MOD WIDTH : {}, {}'.format(width, self.module_width))
+ element = self._document.createElement('rect')
+ attributes = dict(x=SIZE.format(xpos), y=SIZE.format(ypos),
+ width=SIZE.format(width),
+ height=SIZE.format(self.module_height - 6),
+ style='fill:{0};'.format(color))
+ _set_attributes(element, **attributes)
+ self._root.appendChild(element)
+
+ def _create_text(self, xpos, ypos):
+ element = self._document.createElement('text')
+ attributes = dict(x=SIZE.format(xpos), y=SIZE.format(ypos),
+ style='fill:{0};font-size:{1}pt;text-anchor:'
+ 'middle;'.format(self.foreground,
+ self.font_size))
+ _set_attributes(element, **attributes)
+ text_element = self._document.createTextNode(self.text)
+ element.appendChild(text_element)
+ # self._root.appendChild(element)
+
+ def _finish(self):
+ if self.compress:
+ return self._document.toxml(encoding='UTF-8')
+ else:
+ return self._document.toprettyxml(indent=4 * ' ', newl=os.linesep,
+ encoding='UTF-8')
+
+ def save(self, filename, output):
+ if self.compress:
+ _filename = '{0}.svgz'.format(filename)
+ f = gzip.open(_filename, 'wb')
+ f.write(output)
+ f.close()
+ else:
+ _filename = '{0}.svg'.format(filename)
+ with open(_filename, 'wb') as f:
+ f.write(output)
+ return _filename
+
+
+if Image is None:
+ ImageWriter = None
+else:
+ class ImageWriter(BaseWriter):
+
+ def __init__(self):
+ super(ImageWriter, self).__init__(
+ self._init, self._paint_module, self._paint_text,
+ self._finish,
+ )
+ self.format = 'PNG'
+ self.dpi = 300
+ self._image = None
+ self._draw = None
+
+ def _init(self, code):
+ size = self.calculate_size(len(code[0]), len(code), self.dpi)
+ self._image = Image.new('RGB', size, self.background)
+ self._draw = ImageDraw.Draw(self._image)
+
+ def _paint_module(self, xpos, ypos, width, color):
+ size = [(mm2px(xpos, self.dpi), mm2px(ypos, self.dpi)),
+ (mm2px(xpos + width, self.dpi),
+ mm2px(ypos + self.module_height, self.dpi))]
+ self._draw.rectangle(size, outline=color, fill=color)
+
+ def _paint_text(self, xpos, ypos):
+ font = ImageFont.truetype(FONT, self.font_size * 2)
+ width, height = font.getsize(self.text)
+ pos = (mm2px(xpos, self.dpi) - width // 2,
+ mm2px(ypos, self.dpi) - height // 4)
+ self._draw.text(pos, self.text, font=font, fill=self.foreground)
+
+ def _finish(self):
+ return self._image
+
+ def save(self, filename, output):
+ filename = '{0}.{1}'.format(filename, self.format.lower())
+ output.save(filename, self.format.upper())
+ return filename
diff --git a/odex25_transactions/exp_transaction_documents/views/actions_and_menus.xml b/odex25_transactions/exp_transaction_documents/views/actions_and_menus.xml
new file mode 100644
index 000000000..531641b14
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/views/actions_and_menus.xml
@@ -0,0 +1,622 @@
+
+
+
+
+
+
+
+
+
+
+
+ Entities
+ cm.entity
+ tree,form
+
+ Create the first Entity
+
+
+
+
+
+
+ tag_view_tree
+ transaction.tag
+
+
+
+
+
+
+
+
+
+ Transaction Tag
+ transaction.tag
+ tree
+
+ Create the first Transaction Tag
+
+
+
+
+
+
+
+
+
+ Job Titles
+ cm.job.title
+ tree,form
+
+ Create the first Job titles
+
+
+
+
+
+
+
+ Transaction Types
+ cm.subject.type
+
+ tree,form
+
+ Create the first Subject Type
+
+
+
+
+
+
+
+
+ Important degrees
+ cm.transaction.important
+
+ tree,form
+
+ Create the first Important Degrees
+
+
+
+
+
+
+
+
+ Procedures
+ cm.procedure
+
+ tree,form
+
+ Create the first Procedures
+
+
+
+
+
+
+
+
+ Archive Types
+ cm.archive.type
+
+ tree,form
+
+ Create the first Archive Type
+
+
+
+
+
+
+
+
+ Attachment Types
+ cm.attachment.type
+
+ tree,form
+
+ Create the first Attachment Type
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Incoming Internal Transaction
+ internal.transaction
+ tree,form
+ ['&',('state','=','send'),'|','|',('to_ids.secretary_id.user_id', '=', uid),
+ ('to_ids.user_id', '=',
+ uid),'|',('trace_ids.to_id.user_id','=',uid),'|',('trace_ids.to_id.secretary_id.user_id','=',uid),('receive_user_id','=',uid)]
+
+
+
+
+ {'search_default_favorite': 1,'search_default_unread': 1}
+
+
+
+
+ Replying Transaction
+ internal.transaction
+
+ tree,form
+ [('state','=','reply'),('forward_user_id','=',uid)]
+
+
+
+ {'search_default_favorite': 1,'search_default_unread': 1}
+
+
+
+
+ Outgoing Internal Transaction
+ internal.transaction
+ tree,form
+ [('state', '!=', 'closed')]
+
+ Create the first Outgoing Internal Transaction
+
+
+
+
+ {'search_default_favorite': 1}
+
+
+
+
+ To view Transaction
+ internal.transaction
+
+ tree,form
+
+ [('state','!=','draft'),'|',('trace_ids.cc_ids.user_id','=',uid),('cc_ids.user_id','=',uid)]
+
+
+
+ {'search_default_favorite': 1,'search_default_unread': 1}
+
+
+
+
+
+
+ To Approve Transaction
+ internal.transaction
+
+ tree,form
+
+ [('state','=','to_approve'),'|',('preparation_id.manager_id.user_id','=',uid),('receive_manger_id.user_id','=',uid)]
+
+
+
+
+ {'search_default_favorite': 1,'search_default_unread': 1}
+
+
+
+
+
+ Forward Transaction
+ internal.transaction
+
+ tree,form
+ [('is_forward','=',True),('last_forwarded_user','=',uid)]
+
+
+
+
+
+
+ Cancelled Transaction
+ internal.transaction
+
+ tree,form
+ [('state','=','canceled'),('employee_id.user_id','=',uid)]
+
+
+
+
+
+
+
+
+
+
+
+
+ Outgoing External Transaction
+ outgoing.transaction
+
+ tree,form
+ [('state', '!=', 'closed'),('employee_id.user_id','=',uid)]
+
+
+ Create the first External outgoing Transaction
+
+
+
+ {'search_default_favorite': 1}
+
+
+
+
+
+ To view Transaction
+ outgoing.transaction
+
+ tree,form
+
+ [('state','!=','draft'),'|',('trace_ids.cc_ids.user_id','=',uid),('cc_ids.user_id','=',uid)]
+
+
+
+ {'search_default_favorite': 1,'search_default_unread': 1}
+
+
+
+
+ To Approve External Transaction
+ outgoing.transaction
+
+ tree,form
+
+
+ [('state','=','to_approve'),'|',('preparation_id.manager_id.user_id','=',uid),('receive_manger_id.user_id','=',uid)]
+
+
+ {'search_default_favorite': 1,'search_default_unread': 1}
+
+
+
+
+
+ Canceled Transaction
+ outgoing.transaction
+
+ tree,form
+ [('state','=','canceled'),('employee_id.user_id','=',uid)]
+
+
+
+
+
+
+
+
+ Incoming Transaction
+ incoming.transaction
+
+ tree,form
+ [('state', '!=', 'closed'),('employee_id.user_id','=',uid)]
+
+ Create the first External Incoming Transaction
+
+
+
+ {'search_default_favorite': 1}
+
+
+
+
+
+ Forward External Transaction
+ incoming.transaction
+ tree,form
+ ['&',('state','=','send'),'|','|',('to_ids.secretary_id.user_id', '=', uid),
+ ('to_ids.user_id', '=',
+ uid),'|',('trace_ids.to_id.user_id','=',uid),'|',('trace_ids.to_id.secretary_id.user_id','=',uid),('receive_user_id','=',uid)]
+
+
+
+ {'search_default_favorite': 1,'search_default_unread': 1}
+
+
+
+
+ Replying Transaction
+ incoming.transaction
+
+ tree,form
+ [('state','=','reply'),('forward_user_id','=',uid)]
+
+
+ {'search_default_favorite': 1,'search_default_unread': 1}
+
+
+
+
+ To View Transaction
+ incoming.transaction
+
+ tree,form
+
+ [('state','!=','draft'),'|',('trace_ids.cc_ids.user_id','=',uid),('cc_ids.user_id','=',uid)]
+
+
+
+ {'search_default_favorite': 1,'search_default_unread': 1}
+
+
+
+
+
+
+ Internal Transaction
+ internal.transaction
+
+ tree,form
+ [('state','=','closed'),('archive_user_id.user_id','=',uid)]
+
+
+
+
+
+
+ External Incoming Transaction
+ incoming.transaction
+
+ tree,form
+ [('state','=','closed'),('archive_user_id.user_id','=',uid)]
+
+
+
+
+
+
+
+
+
+
+
+ Incoming Transaction
+ internal.transaction
+
+ tree,form
+
+ [('state','=','send'),'|','|',('to_ids.manager_id','=',uid),('to_ids.parent_id.manager_id.user_id','=',uid),('trace_ids.to_id.user_id','=',uid)]
+
+
+
+
+
+
+
+ Outgoing Transaction
+ internal.transaction
+
+ tree,form
+ [('employee_id.parent_id.manager_id.user_id','=',uid)]
+
+
+
+
+
+
+ To Approve Internal Transaction
+ internal.transaction
+
+ tree,form
+ [('state','=','to_approve'),('employee_id.parent_id.manager_id.user_id','=',uid)]
+
+
+
+
+
+
+
+
+ Forward Transaction
+ internal.transaction
+
+ tree,form
+ [('is_forward','=',True)]
+
+
+
+
+
+
+ Cancelled Transaction
+ internal.transaction
+
+ tree,form
+ [('state','=','canceled'),('employee_id.parent_id.manager_id.user_id','=',uid)]
+
+
+
+
+
+
+
+
+ Outgoing Transaction
+ outgoing.transaction
+
+ tree,form
+ [('employee_id.parent_id.manager_id.user_id','=',uid)]
+
+
+
+
+
+ To Approve Transaction
+ outgoing.transaction
+
+ tree,form
+ [('state','=','to_approve'),('employee_id.parent_id.manager_id.user_id','=',uid)]
+
+
+
+
+
+
+ Canceled Transaction
+ outgoing.transaction
+
+ tree,form
+ [('state','=','canceled'),('employee_id.parent_id.manager_id.user_id','=',uid)]
+
+
+
+
+
+
+
+ Incoming External Transaction
+ incoming.transaction
+ tree,form
+
+ [('state','=','send'),'|','|',('to_ids.manager_id','=',uid),('to_ids.parent_id.manager_id.user_id','=',uid),('trace_ids.to_id.user_id','=',uid)]
+
+
+
+
+
+
+ Forward Transaction
+ incoming.transaction
+
+ tree,form
+ [('is_forward','=',True)]
+
+
+
+
+
+
+
diff --git a/odex25_transactions/exp_transaction_documents/views/assets.xml b/odex25_transactions/exp_transaction_documents/views/assets.xml
new file mode 100644
index 000000000..4ec3d327c
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/views/assets.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/odex25_transactions/exp_transaction_documents/views/configuration.xml b/odex25_transactions/exp_transaction_documents/views/configuration.xml
new file mode 100644
index 000000000..8c18d90bb
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/views/configuration.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ cm.subject.type.tree
+ cm.subject.type
+
+
+
+
+
+
+
+
+ cm.subject.type.form
+ cm.subject.type
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/odex25_transactions/exp_transaction_documents/views/entity.xml b/odex25_transactions/exp_transaction_documents/views/entity.xml
new file mode 100644
index 000000000..fa12462a1
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/views/entity.xml
@@ -0,0 +1,104 @@
+
+
+
+
+ cm.entity.tree
+ cm.entity
+
+
+
+
+
+
+
+
+
+
+
+
+ cm.entity.form
+ cm.entity
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ cm.entity.filter
+ cm.entity
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/odex25_transactions/exp_transaction_documents/views/incoming.xml b/odex25_transactions/exp_transaction_documents/views/incoming.xml
new file mode 100644
index 000000000..b1e3dea06
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/views/incoming.xml
@@ -0,0 +1,186 @@
+
+
+
+
+
+
+ incoming.transaction.search
+ incoming.transaction
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ common.incoming.transaction.tree
+ incoming.transaction
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ common.incoming.transactions.form
+ incoming.transaction
+
+ primary
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ incoming.transaction.external.tree
+ incoming.transaction
+
+ primary
+
+
+
+ true
+
+
+
+
+
+ incoming.transaction.external.form
+ incoming.transaction
+
+ primary
+
+
+
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Read
+ ir.actions.server
+
+
+ code
+
+ if records:
+ action = records.action_read()
+
+
+
+ Unread
+ ir.actions.server
+
+
+ code
+
+ if records:
+ action = records.action_unread()
+
+
+
+ Add To Favorite
+ ir.actions.server
+
+
+ code
+
+ if records:
+ action = records.add_to_favorite()
+
+
+
+ Remove from Favorite
+ ir.actions.server
+
+
+ code
+
+ if records:
+ action = records.remove_from_favorite()
+
+
+
+
diff --git a/odex25_transactions/exp_transaction_documents/views/internal.xml b/odex25_transactions/exp_transaction_documents/views/internal.xml
new file mode 100644
index 000000000..ab48f4d1c
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/views/internal.xml
@@ -0,0 +1,222 @@
+
+
+
+
+
+ internal.transaction.search
+ internal.transaction
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ common.internal.transaction.tree
+ internal.transaction
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ internal.transaction
+
+ primary
+
+
+
+
+
+
+
+
+
+
+
+ common.internal.transaction.form
+ internal.transaction
+
+ primary
+
+
+
+
+
+
+
+
+
+
+
+
+
+ to.view.internal.transaction.form
+ internal.transaction
+ primary
+
+
+
+
+
+
+
+
+
+
+
+ transaction.internal.tree
+ internal.transaction
+
+ primary
+
+
+
+ true
+
+
+
+
+
+ internal.transaction.form
+ internal.transaction
+ primary
+
+
+
+
+ true
+ true
+
+
+
+
+
+ [('type', '=', type_sender)]
+
+
+
+
+
+
+
+
+
+
+ Read
+ ir.actions.server
+
+
+ code
+
+ if records:
+ action = records.action_read()
+
+
+
+ Unread
+ ir.actions.server
+
+
+ code
+
+ if records:
+ action = records.action_unread()
+
+
+
+ Add To Favorite
+ ir.actions.server
+
+
+ code
+
+ if records:
+ action = records.add_to_favorite()
+
+
+
+ Remove from Favorite
+ ir.actions.server
+
+
+ code
+
+ if records:
+ action = records.remove_from_favorite()
+
+
+
+
diff --git a/odex25_transactions/exp_transaction_documents/views/outgoing.xml b/odex25_transactions/exp_transaction_documents/views/outgoing.xml
new file mode 100644
index 000000000..370b868ff
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/views/outgoing.xml
@@ -0,0 +1,199 @@
+
+
+
+
+
+ outgoing.transaction.search
+ outgoing.transaction
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ outgoing.transaction.external.tree
+ outgoing.transaction
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ outgoing.transaction.external.form
+ outgoing.transaction
+
+ primary
+
+
+
+
+
+
+
+
+
+ outgoing.transaction.externals.tree
+ outgoing.transaction
+
+ primary
+
+
+
+ true
+
+
+
+
+
+ outgoing.transaction.external.form
+ outgoing.transaction
+
+ primary
+
+
+
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+ {'invisible':[('is_partner','!=',False)],'required':[('is_partner','=',False)]}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Read
+ ir.actions.server
+
+
+ code
+
+ if records:
+ action = records.action_read()
+
+
+
+ Unread
+ ir.actions.server
+
+
+ code
+
+ if records:
+ action = records.action_unread()
+
+
+
+ Add To Favorite
+ ir.actions.server
+
+
+ code
+
+ if records:
+ action = records.add_to_favorite()
+
+
+
+ Remove from Favorite
+ ir.actions.server
+
+
+ code
+
+ if records:
+ action = records.remove_from_favorite()
+
+
+
+
diff --git a/odex25_transactions/exp_transaction_documents/views/settings_config_view.xml b/odex25_transactions/exp_transaction_documents/views/settings_config_view.xml
new file mode 100644
index 000000000..44c8511f2
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/views/settings_config_view.xml
@@ -0,0 +1,56 @@
+
+
+
+ res.config.settings.view.form.inherit.cm
+ res.config.settings
+
+
+
+
+
+
CM
+
+
+
+
+
+
+
+
+ If checked, you will be able to sync employees, departments, job titles with Crosspondence Tracking System.
+
+
+
+
+
+
+
+
+
+
+
+
+ If checked, you can convert emails to Incoming Transactions.
+
+
+
+
+
+
+
+
+
+
+
+
+ If checked, you add rank value to start date to get last date to execute Transaction.
+
+
+
+
+
+
+
+
+
+
diff --git a/odex25_transactions/exp_transaction_documents/views/transcation_common_view.xml b/odex25_transactions/exp_transaction_documents/views/transcation_common_view.xml
new file mode 100644
index 000000000..cd30d870f
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/views/transcation_common_view.xml
@@ -0,0 +1,393 @@
+
+
+
+
+
+ common.transaction.form
+ transaction.transaction
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ common.transactions.internal.form
+ internal.transaction
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ common.incoming.transactions.form
+ incoming.transaction
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ common.outgoing.transaction.form
+ outgoing.transaction
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/odex25_transactions/exp_transaction_documents/wizard/__init__.py b/odex25_transactions/exp_transaction_documents/wizard/__init__.py
new file mode 100644
index 000000000..2a5dfb128
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/wizard/__init__.py
@@ -0,0 +1,7 @@
+# -*- coding: utf-8 -*-
+
+from . import reject_transaction_resons
+from . import forward_trasaction
+from . import transaction_reply_wizard
+from . import archive_transaction
+from . import reopen_transaction_wizard
diff --git a/odex25_transactions/exp_transaction_documents/wizard/archive_transaction.py b/odex25_transactions/exp_transaction_documents/wizard/archive_transaction.py
new file mode 100644
index 000000000..5686b84b3
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/wizard/archive_transaction.py
@@ -0,0 +1,47 @@
+# -*- coding: utf-8 -*-
+from odoo import api, models, fields, _
+
+
+class ArchiveTransactionWizard(models.TransientModel):
+ _name = 'archive.transaction.wizard'
+
+ note = fields.Text(string="Notes")
+ date = fields.Date(string='Date', default=fields.Date.today)
+ archive_type_id = fields.Many2one(comodel_name='cm.archive.type', string='Archive Reason')
+ internal_transaction_id = fields.Many2one('internal.transaction', string='Internal')
+ incoming_transaction_id = fields.Many2one('incoming.transaction', string='Outgoing')
+ outgoing_transaction_id = fields.Many2one('outgoing.transaction', string='Incoming')
+
+ def action_archive(self):
+ from_id = self.env['cm.entity'].search([('user_id', '=', self.env.uid)], limit=1)
+ transaction = ''
+ name = ''
+ if self.internal_transaction_id:
+ transaction = self.internal_transaction_id
+ name = 'internal_transaction_id'
+ elif self.incoming_transaction_id:
+ transaction = self.incoming_transaction_id
+ name = 'incoming_transaction_id'
+ elif self.outgoing_transaction_id:
+ transaction = self.outgoing_transaction_id
+ name = 'outgoing_transaction_id'
+ transaction.state = 'closed'
+ transaction.archive_user_id = from_id.id
+ transaction.trace_ids.create({
+ 'from_id': from_id.id,
+ 'action': 'archive',
+ 'note': self.note,
+ 'archive_type_id': self.archive_type_id.id,
+ name: transaction.id
+ })
+ close_employee = transaction.current_employee()
+ subj = _('Message Has been closed !')
+ msg = _(u'{} ← {}. {}').format(
+ close_employee and close_employee.name or '#', fields.Datetime.now(),
+ u'رابط المعاملة ' % (
+ transaction.get_url()))
+ # add mail notification
+ partner_ids = [transaction.employee_id.user_id.partner_id.id]
+ transaction.action_send_notification(subj, msg, partner_ids)
+ if self.internal_transaction_id:
+ transaction.action_send_close()
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_documents/wizard/archive_transaction.xml b/odex25_transactions/exp_transaction_documents/wizard/archive_transaction.xml
new file mode 100644
index 000000000..c1f2b126c
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/wizard/archive_transaction.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ Archive Transaction
+ archive.transaction.wizard
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_documents/wizard/forward_transaction.xml b/odex25_transactions/exp_transaction_documents/wizard/forward_transaction.xml
new file mode 100644
index 000000000..d3bc8cc36
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/wizard/forward_transaction.xml
@@ -0,0 +1,38 @@
+
+
+
+
+ Forward Transaction
+ forward.transaction.wizard
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_documents/wizard/forward_trasaction.py b/odex25_transactions/exp_transaction_documents/wizard/forward_trasaction.py
new file mode 100644
index 000000000..516938bd1
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/wizard/forward_trasaction.py
@@ -0,0 +1,94 @@
+# -*- coding: utf-8 -*-
+from odoo import api, models, fields, _
+
+
+class ForwardTransactionWizard(models.TransientModel):
+ _name = 'forward.transaction.wizard'
+
+ forward_type = fields.Selection(selection=[('unit','Internal Unit'), ('employee','Employee')],string="Forward Type",
+ required=True)
+ internal_unit = fields.Many2one('cm.entity', string='Internal Unit')
+ employee = fields.Many2one('cm.entity', string='Employee')
+ cc_ids = fields.Many2many(comodel_name='cm.entity', string='CC To')
+ note = fields.Text(string="Notes")
+ description = fields.Text(string="Description")
+ date = fields.Date(string='Date', default=fields.Date.today)
+ is_secret = fields.Boolean('Is Secret?')
+ secret_reason = fields.Text(string="Secret Description")
+ procedure_id = fields.Many2one(comodel_name='cm.procedure', string='Procedure')
+ internal_transaction_id = fields.Many2one('internal.transaction', string='Internal')
+ incoming_transaction_id = fields.Many2one('incoming.transaction', string='Outgoing')
+ outgoing_transaction_id = fields.Many2one('outgoing.transaction', string='Incoming')
+ forward_attachment_id = fields.Binary(attachment=True, string='Forward Attachment')
+ filename = fields.Char()
+ att_description = fields.Char(string='Attach Description')
+
+ def action_forward(self):
+ transaction = ''
+ name = ''
+ to_id = self.employee.id
+ if self.internal_transaction_id:
+ transaction = self.internal_transaction_id
+ name = 'internal_transaction_id'
+ elif self.incoming_transaction_id:
+ transaction = self.incoming_transaction_id
+ name = 'incoming_transaction_id'
+ elif self.outgoing_transaction_id:
+ transaction = self.outgoing_transaction_id
+ name = 'outgoing_transaction_id'
+ forward_user_id = self.employee.user_id
+ if self.forward_type != 'employee':
+ forward_user_id = self.internal_unit.secretary_id.user_id.id
+ to_id = self.internal_unit.secretary_id.id
+ transaction.forward_user_id = forward_user_id
+ transaction.last_forwarded_user = self.env.uid
+ if self.is_secret:
+ transaction.secret_reason = self.secret_reason
+ transaction.secret_forward_user = self.env['cm.entity'].search([('user_id', '=', forward_user_id.id)], limit=1)
+ employee = transaction.current_employee()
+ from_id = self.env['cm.entity'].search([('user_id', '=', self.env.uid)], limit=1)
+ transaction.is_forward = True
+ if self.forward_attachment_id:
+ transaction.attachment_rule_ids.create({
+ 'file_save': self.forward_attachment_id,
+ 'name': transaction.id,
+ 'description': self.att_description,
+ 'attachment_filename': self.filename,
+ })
+ transaction.trace_ids.create({
+ 'action': 'forward',
+ 'to_id': to_id,
+ 'from_id': from_id.id,
+ 'procedure_id': self.procedure_id.id or False,
+ 'note': self.note,
+ 'cc_ids': [(6, 0, self.cc_ids.ids)],
+ name: transaction.id
+ })
+ if self.internal_transaction_id or self.incoming_transaction_id:
+ transaction.action_send_forward()
+ '''for notification partner in cc or forward user'''
+ target = self.forward_type
+ target_name = target == 'employee' and self.employee.name or self.internal_unit.name
+ subj = _('Message Has been forwarded !')
+ msg = _(u'{} ← {}').format(
+ employee and employee.name or '#', target_name)
+ msg = u'{}{} {}. {}'.format(msg,
+ _(u'Action Taken'), self.procedure_id.name,
+ u'رابط المعاملة ' % (
+ transaction.get_url()))
+ # add mail notification
+ partner_ids = []
+ if self.forward_type == 'unit':
+ partner_ids.append(self.internal_unit.secretary_id.user_id.partner_id.id)
+ elif self.forward_type == 'employee':
+ partner_ids.append(self.employee.user_id.partner_id.id)
+ for partner in self.cc_ids:
+ if partner.type == 'unit':
+ partner_ids.append(partner.secretary_id.user_id.partner_id.id)
+ elif partner.type == 'employee':
+ partner_ids.append(partner.user_id.partner_id.id)
+ transaction.state = 'send'
+ transaction.action_send_notification(subj, msg, partner_ids)
+ if self.incoming_transaction_id:
+ if transaction.state == 'draft':
+ transaction.state = 'send'
diff --git a/odex25_transactions/exp_transaction_documents/wizard/reject_transaction_reson.xml b/odex25_transactions/exp_transaction_documents/wizard/reject_transaction_reson.xml
new file mode 100644
index 000000000..23b374b29
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/wizard/reject_transaction_reson.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+ Reject Transaction
+ reject.reason.wizard
+
+
+
+
+
+
+
+
+
+
+
+
+ return Transaction
+ reject.reason.wizard
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_documents/wizard/reject_transaction_resons.py b/odex25_transactions/exp_transaction_documents/wizard/reject_transaction_resons.py
new file mode 100644
index 000000000..4b24503b9
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/wizard/reject_transaction_resons.py
@@ -0,0 +1,61 @@
+# -*- coding: utf-8 -*-
+from odoo import api, models, fields, _
+
+
+class RejectReasonWizard(models.TransientModel):
+ _name = 'reject.reason.wizard'
+
+ reason = fields.Text(string="Reject Reason")
+ internal_transaction_id = fields.Many2one('internal.transaction', string='Internal')
+ incoming_transaction_id = fields.Many2one('incoming.transaction', string='Outgoing')
+ outgoing_transaction_id = fields.Many2one('outgoing.transaction', string='Incoming')
+
+ def action_confirm(self):
+ transaction = ''
+ name = ''
+ if self.internal_transaction_id:
+ transaction = self.internal_transaction_id
+ name = 'internal_transaction_id'
+ elif self.incoming_transaction_id:
+ transaction = self.incoming_transaction_id
+ name = 'incoming_transaction_id'
+ elif self.outgoing_transaction_id:
+ transaction = self.outgoing_transaction_id
+ name = 'outgoing_transaction_id'
+ employee = transaction.current_employee()
+ transaction.reason = self.reason
+ transaction.state = 'canceled'
+ transaction.trace_ids.create({
+ 'action': 'refuse',
+ 'to_id': transaction.employee_id.id,
+ 'from_id': employee and employee.id or False,
+ 'note': self.reason,
+ name: transaction.id
+ })
+ if self.internal_transaction_id:
+ transaction.action_reject_email()
+
+ def action_return_tran(self):
+ transaction = ''
+ name = ''
+ if self.internal_transaction_id:
+ transaction = self.internal_transaction_id
+ name = 'internal_transaction_id'
+ elif self.incoming_transaction_id:
+ transaction = self.incoming_transaction_id
+ name = 'incoming_transaction_id'
+ elif self.outgoing_transaction_id:
+ transaction = self.outgoing_transaction_id
+ name = 'outgoing_transaction_id'
+ employee = transaction.current_employee()
+ transaction.reason = self.reason
+ transaction.set_to_draft()
+ transaction.trace_ids.create({
+ 'action': 'return',
+ 'to_id': transaction.employee_id.id,
+ 'from_id': employee and employee.id or False,
+ 'note': self.reason,
+ name: transaction.id
+ })
+ if self.internal_transaction_id:
+ transaction.action_return_email()
diff --git a/odex25_transactions/exp_transaction_documents/wizard/reopen_transaction_wizard.py b/odex25_transactions/exp_transaction_documents/wizard/reopen_transaction_wizard.py
new file mode 100644
index 000000000..eec2bb758
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/wizard/reopen_transaction_wizard.py
@@ -0,0 +1,49 @@
+# -*- coding: utf-8 -*-
+from odoo import api, models, fields, _
+
+
+class ReopenTransactionWizard(models.TransientModel):
+ _name = 'reopen.transaction.wizard'
+
+ note = fields.Text(string="Notes")
+ reason = fields.Text(string="Description")
+ date = fields.Date(string='Date', default=fields.Date.today)
+ internal_transaction_id = fields.Many2one('internal.transaction', string='Internal')
+ incoming_transaction_id = fields.Many2one('incoming.transaction', string='Outgoing')
+ outgoing_transaction_id = fields.Many2one('outgoing.transaction', string='Incoming')
+ procedure_id = fields.Many2one('cm.procedure', string='Action Taken')
+
+ def action_reopen(self):
+ transaction = ''
+ name = ''
+ if self.internal_transaction_id:
+ transaction = self.internal_transaction_id
+ name = 'internal_transaction_id'
+ elif self.incoming_transaction_id:
+ transaction = self.incoming_transaction_id
+ name = 'incoming_transaction_id'
+ elif self.outgoing_transaction_id:
+ transaction = self.outgoing_transaction_id
+ name = 'outgoing_transaction_id'
+ transaction.action_reopen()
+ from_id = self.env['cm.entity'].search([('user_id', '=', self.env.uid)], limit=1)
+ transaction.trace_ids.create({
+ 'action': 'reopen',
+ 'procedure_id': self.procedure_id.id or False,
+ 'from_id': from_id.id,
+ 'note': self.note,
+ name: transaction.id
+ })
+ close_employee = transaction.current_employee()
+ subj = _('Message Has been reopened !')
+ msg = _(u'{} ← {}').format(
+ close_employee and close_employee.name or '#', fields.Datetime.now())
+ msg = u'{}{} {}. {}'.format(msg,
+ _(u'Action Taken'), self.procedure_id.name,
+ u'رابط المعاملة ' % (
+ transaction.get_url()))
+ # add mail notification
+ partner_ids = [transaction.employee_id.user_id.partner_id.id]
+ transaction.action_send_notification(subj, msg, partner_ids)
+ if self.internal_transaction_id:
+ transaction.action_reopen_email()
diff --git a/odex25_transactions/exp_transaction_documents/wizard/reopen_transaction_wizard.xml b/odex25_transactions/exp_transaction_documents/wizard/reopen_transaction_wizard.xml
new file mode 100644
index 000000000..4f9519d12
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/wizard/reopen_transaction_wizard.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ Reopen Transaction
+ reopen.transaction.wizard
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_documents/wizard/transaction_reply_wizard.py b/odex25_transactions/exp_transaction_documents/wizard/transaction_reply_wizard.py
new file mode 100644
index 000000000..bd8b4375a
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/wizard/transaction_reply_wizard.py
@@ -0,0 +1,75 @@
+# -*- coding: utf-8 -*-
+from odoo import api, models, fields, _
+
+
+class TransactionReturnWizard(models.TransientModel):
+ _name = 'transaction.reply.wizard'
+
+ cc_ids = fields.Many2many(comodel_name='cm.entity', string='CC To')
+ note = fields.Text(string="Notes")
+ description = fields.Text(string="Description")
+ date = fields.Date(string='Date', default=fields.Date.today)
+ procedure_id = fields.Many2one(comodel_name='cm.procedure', string='Procedure')
+ internal_transaction_id = fields.Many2one('internal.transaction', string='Internal')
+ incoming_transaction_id = fields.Many2one('incoming.transaction', string='Incoming')
+ outgoing_transaction_id = fields.Many2one('outgoing.transaction', string='Outgoing')
+ attachment_id = fields.Binary(attachment=True, string='Forward Attachment')
+ filename = fields.Char()
+ att_description = fields.Char(string='Attach Description')
+
+ def action_reply(self):
+ from_id = self.env['cm.entity'].search([('user_id', '=', self.env.uid)], limit=1)
+ transaction = ''
+ name = ''
+ if self.internal_transaction_id:
+ transaction = self.internal_transaction_id
+ name = 'internal_transaction_id'
+ elif self.incoming_transaction_id:
+ transaction = self.incoming_transaction_id
+ name = 'incoming_transaction_id'
+ elif self.outgoing_transaction_id:
+ transaction = self.outgoing_transaction_id
+ name = 'outgoing_transaction_id'
+ transaction_trace_obj = self.env['cm.transaction.trace']
+ transaction_id = transaction_trace_obj.search(
+ [(name, '=', transaction.id), ('action', 'not in', ('archive', 'reopen'))],
+ order="create_date desc", limit=1)
+ if transaction_id:
+ transaction.forward_user_id = transaction_id.from_id.user_id.id
+ else:
+ transaction.forward_user_id = transaction.employee_id.user_id.id
+ transaction.state = 'reply'
+ forward_entity = self.env['cm.entity'].search([('user_id', '=', transaction.forward_user_id.id)],limit=1)
+ transaction.attachment_rule_ids.create({
+ 'file_save': self.attachment_id,
+ # 'name': transaction.id,
+ 'description': self.att_description,
+ 'attachment_filename': self.filename,
+ })
+ transaction.trace_ids.create({
+ 'action': 'reply',
+ 'to_id': forward_entity.id,
+ 'from_id': from_id.id,
+ 'procedure_id': self.procedure_id.id or False,
+ 'note': self.note,
+ 'cc_ids': [(6, 0, self.cc_ids.ids)],
+ name: transaction.id
+ })
+ employee = transaction.current_employee()
+ subj = _('Message Has been replied !')
+ msg = _(u'{} ← {}').format(employee and employee.name or '#',
+ transaction.forward_user_id.name)
+ msg = u'{}{} {}. {}'.format(msg,
+ _(u'Action Taken'), self.procedure_id.name,
+ u'رابط المعاملة ' % (
+ transaction.get_url()))
+ # add mail notification
+ partner_ids = [transaction.forward_user_id.partner_id.id]
+ for partner in self.cc_ids:
+ if partner.type == 'unit':
+ partner_ids.append(partner.secretary_id.user_id.partner_id.id)
+ elif partner.type == 'employee':
+ partner_ids.append(partner.user_id.partner_id.id)
+ transaction.action_send_notification(subj, msg, partner_ids)
+ if self.internal_transaction_id:
+ transaction.action_send_reply()
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_documents/wizard/transaction_reply_wizard.xml b/odex25_transactions/exp_transaction_documents/wizard/transaction_reply_wizard.xml
new file mode 100644
index 000000000..9a852b6b2
--- /dev/null
+++ b/odex25_transactions/exp_transaction_documents/wizard/transaction_reply_wizard.xml
@@ -0,0 +1,33 @@
+
+
+
+
+ Reply Transaction
+ transaction.reply.wizard
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_holiday/__init__.py b/odex25_transactions/exp_transaction_holiday/__init__.py
new file mode 100644
index 000000000..601ffa6a9
--- /dev/null
+++ b/odex25_transactions/exp_transaction_holiday/__init__.py
@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+from . import models
+
diff --git a/odex25_transactions/exp_transaction_holiday/__manifest__.py b/odex25_transactions/exp_transaction_holiday/__manifest__.py
new file mode 100644
index 000000000..c0bbb055c
--- /dev/null
+++ b/odex25_transactions/exp_transaction_holiday/__manifest__.py
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# Odex - Communications Management System.
+# Copyright (C) 2020 Expert Co. Ltd. ().
+#
+##############################################################################
+{
+ 'name': 'Transaction Holiday Management',
+ 'version': '1.0',
+ 'sequence': 4,
+ 'author': 'Expert Co. Ltd. - Sudan Team',
+ 'category': 'Odex25-Transactions/Odex25-Transactions',
+ 'summary': 'Holiday Management',
+ 'description': """
+Odex - Communications Management System
+========================================
+dayoff & public holiday management of transactions
+ """,
+ 'website': 'http://www.exp-sa.com',
+ 'depends': ['exp_transaction_documents'],
+ 'data': [
+ 'security/groups.xml',
+ 'security/ir.model.access.csv',
+ 'views/transaction_holiday.xml',
+ ],
+ 'qweb' : [
+ ],
+ 'installable': True,
+ 'auto_install': False,
+ 'application': False,
+}
+
diff --git a/odex25_transactions/exp_transaction_holiday/i18n/ar_001.po b/odex25_transactions/exp_transaction_holiday/i18n/ar_001.po
new file mode 100644
index 000000000..7539ffbd3
--- /dev/null
+++ b/odex25_transactions/exp_transaction_holiday/i18n/ar_001.po
@@ -0,0 +1,213 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * exp_transaction_holiday
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 14.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2022-05-23 10:03+0000\n"
+"PO-Revision-Date: 2022-05-23 10:03+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: exp_transaction_holiday
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_holiday_year
+msgid "Calendar Year"
+msgstr "السنه"
+
+#. module: exp_transaction_holiday
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_holiday_create_uid
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_public_holiday_create_uid
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_weekend_holiday_create_uid
+msgid "Created by"
+msgstr "أنشئ بواسطة"
+
+#. module: exp_transaction_holiday
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_holiday_create_date
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_public_holiday_create_date
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_weekend_holiday_create_date
+msgid "Created on"
+msgstr "أنشئ في"
+
+#. module: exp_transaction_holiday
+#: code:addons/exp_transaction_holiday/models/transaction_holiday.py:56
+#, python-format
+msgid "Date from must be less than date to"
+msgstr "تاريخ البداية يجب ان يكون اقل من تاريخ النهاية"
+
+#. module: exp_transaction_holiday
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_weekend_holiday_name
+msgid "Day Off"
+msgstr "يوم العطله"
+
+#. module: exp_transaction_holiday
+#: model:ir.ui.view,arch_db:exp_transaction_holiday.view_transaction_holiday_form
+msgid "Day Off."
+msgstr "ايام العطل"
+
+#. module: exp_transaction_holiday
+#: code:addons/exp_transaction_holiday/models/transaction_holiday.py:42
+#, python-format
+msgid "Day off name must be unique in year"
+msgstr "اسم يوم العطلة يجب ان يكون فريد في السنه"
+
+#. module: exp_transaction_holiday
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_holiday_display_name
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_public_holiday_display_name
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_weekend_holiday_display_name
+msgid "Display Name"
+msgstr "الاسم المعروض"
+
+#. module: exp_transaction_holiday
+#: selection:transaction.weekend.holiday,name:0
+msgid "Friday"
+msgstr "الجمعه"
+
+#. module: exp_transaction_holiday
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_public_holiday_from_date
+msgid "From Date"
+msgstr "من تاريخ"
+
+#. module: exp_transaction_holiday
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_public_holiday_holiday_id
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_weekend_holiday_holiday_id
+msgid "Holiday"
+msgstr "الاجازات العامه"
+
+#. module: exp_transaction_holiday
+#: model:ir.ui.view,arch_db:exp_transaction_holiday.view_transaction_holiday_form
+#: model:ir.ui.view,arch_db:exp_transaction_holiday.view_transaction_holiday_tree
+msgid "Holidays"
+msgstr "الاجازات العامه"
+
+#. module: exp_transaction_holiday
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_holiday_id
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_public_holiday_id
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_weekend_holiday_id
+msgid "ID"
+msgstr "المعرف"
+
+#. module: exp_transaction_holiday
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_holiday___last_update
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_public_holiday___last_update
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_weekend_holiday___last_update
+msgid "Last Modified on"
+msgstr "آخر تعديل في"
+
+#. module: exp_transaction_holiday
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_holiday_write_uid
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_public_holiday_write_uid
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_weekend_holiday_write_uid
+msgid "Last Updated by"
+msgstr "آخر تحديث بواسطة"
+
+#. module: exp_transaction_holiday
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_holiday_write_date
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_public_holiday_write_date
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_weekend_holiday_write_date
+msgid "Last Updated on"
+msgstr "آخر تحديث في"
+
+#. module: exp_transaction_holiday
+#: selection:transaction.weekend.holiday,name:0
+msgid "Monday"
+msgstr "الاثنين"
+
+#. module: exp_transaction_holiday
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_holiday_name
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_public_holiday_name
+msgid "Name"
+msgstr "الاسم"
+
+#. module: exp_transaction_holiday
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_holiday_public_holiday_ids
+msgid "Public Holiday"
+msgstr "العطل الرسمية"
+
+#. module: exp_transaction_holiday
+#: model:ir.ui.view,arch_db:exp_transaction_holiday.view_transaction_holiday_form
+msgid "Public Holiday."
+msgstr "العطل الرسمية"
+
+#. module: exp_transaction_holiday
+#: model:ir.ui.menu,name:exp_transaction_holiday.parent_holiday_menu
+msgid "Public Holidays"
+msgstr "العطل الرسمية"
+
+#. module: exp_transaction_holiday
+#: selection:transaction.weekend.holiday,name:0
+msgid "Saturday"
+msgstr "السبت"
+
+#. module: exp_transaction_holiday
+#: selection:transaction.weekend.holiday,name:0
+msgid "Sunday"
+msgstr "الاحد"
+
+#. module: exp_transaction_holiday
+#: selection:transaction.weekend.holiday,name:0
+msgid "Thursday"
+msgstr "الخميس"
+
+#. module: exp_transaction_holiday
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_public_holiday_to_date
+msgid "To Date"
+msgstr "إلى تاريخ"
+
+#. module: exp_transaction_holiday
+#: model:ir.actions.act_window,name:exp_transaction_holiday.transaction_holiday_action
+msgid "Transaction Holiday"
+msgstr "العطل العامة"
+
+#. module: exp_transaction_holiday
+#: selection:transaction.weekend.holiday,name:0
+msgid "Tuesday"
+msgstr "الثلاثاء"
+
+#. module: exp_transaction_holiday
+#: selection:transaction.weekend.holiday,name:0
+msgid "Wednesday"
+msgstr "الاربعاء"
+
+#. module: exp_transaction_holiday
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_holiday_weekend_ids
+msgid "Weekend Days"
+msgstr "ايام العطل الرسمية"
+
+#. module: exp_transaction_holiday
+#: code:addons/exp_transaction_holiday/models/transaction_holiday.py:65
+#, python-format
+msgid "You cannot create a new holiday in the same year in the same period"
+msgstr "لا يمكنك إنشاء عطلة جديدة في نفس العام في نفس الفترة الموجوده"
+
+#. module: exp_transaction_holiday
+#: model:ir.model,name:exp_transaction_holiday.model_transaction_transaction
+msgid "for common attribute between transaction"
+msgstr "for common attribute between transaction"
+
+#. module: exp_transaction_holiday
+#: model:ir.model,name:exp_transaction_holiday.model_transaction_holiday
+msgid "transaction.holiday"
+msgstr "transaction.holiday"
+
+#. module: exp_transaction_holiday
+#: model:ir.model,name:exp_transaction_holiday.model_transaction_public_holiday
+msgid "transaction.public.holiday"
+msgstr "transaction.public.holiday"
+
+#. module: exp_transaction_holiday
+#: model:ir.model,name:exp_transaction_holiday.model_transaction_weekend_holiday
+msgid "transaction.weekend.holiday"
+msgstr "transaction.weekend.holiday"
+
+#. module: exp_transaction_holiday
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_public_holiday_holiday_id
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_weekend_holiday_holiday_id
+#: model:res.groups,name:exp_transaction_holiday.group_cm_holiday
+msgid "Holiday"
+msgstr "الاجازات العامه"
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_holiday/i18n/ar_SY.po b/odex25_transactions/exp_transaction_holiday/i18n/ar_SY.po
new file mode 100644
index 000000000..480155307
--- /dev/null
+++ b/odex25_transactions/exp_transaction_holiday/i18n/ar_SY.po
@@ -0,0 +1,213 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * exp_transaction_holiday
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 11.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-04-20 15:30+0000\n"
+"PO-Revision-Date: 2020-04-20 15:30+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: exp_transaction_holiday
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_holiday_year
+msgid "Calendar Year"
+msgstr "السنه"
+
+#. module: exp_transaction_holiday
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_holiday_create_uid
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_public_holiday_create_uid
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_weekend_holiday_create_uid
+msgid "Created by"
+msgstr "أنشئ بواسطة"
+
+#. module: exp_transaction_holiday
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_holiday_create_date
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_public_holiday_create_date
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_weekend_holiday_create_date
+msgid "Created on"
+msgstr "أنشئ في"
+
+#. module: exp_transaction_holiday
+#: code:addons/exp_transaction_holiday/models/transaction_holiday.py:56
+#, python-format
+msgid "Date from must be less than date to"
+msgstr "تاريخ البداية يجب ان يكون اقل من تاريخ النهاية"
+
+#. module: exp_transaction_holiday
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_weekend_holiday_name
+msgid "Day Off"
+msgstr "يوم العطله"
+
+#. module: exp_transaction_holiday
+#: model:ir.ui.view,arch_db:exp_transaction_holiday.view_transaction_holiday_form
+msgid "Day Off."
+msgstr "ايام العطل"
+
+#. module: exp_transaction_holiday
+#: code:addons/exp_transaction_holiday/models/transaction_holiday.py:42
+#, python-format
+msgid "Day off name must be unique in year"
+msgstr "اسم يوم العطلة يجب ان يكون فريد في السنه"
+
+#. module: exp_transaction_holiday
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_holiday_display_name
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_public_holiday_display_name
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_weekend_holiday_display_name
+msgid "Display Name"
+msgstr "الاسم المعروض"
+
+#. module: exp_transaction_holiday
+#: selection:transaction.weekend.holiday,name:0
+msgid "Friday"
+msgstr "الجمعه"
+
+#. module: exp_transaction_holiday
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_public_holiday_from_date
+msgid "From Date"
+msgstr "من تاريخ"
+
+#. module: exp_transaction_holiday
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_public_holiday_holiday_id
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_weekend_holiday_holiday_id
+msgid "Holiday"
+msgstr "الاجازات العامه"
+
+#. module: exp_transaction_holiday
+#: model:ir.ui.view,arch_db:exp_transaction_holiday.view_transaction_holiday_form
+#: model:ir.ui.view,arch_db:exp_transaction_holiday.view_transaction_holiday_tree
+msgid "Holidays"
+msgstr "الاجازات العامه"
+
+#. module: exp_transaction_holiday
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_holiday_id
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_public_holiday_id
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_weekend_holiday_id
+msgid "ID"
+msgstr "المعرف"
+
+#. module: exp_transaction_holiday
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_holiday___last_update
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_public_holiday___last_update
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_weekend_holiday___last_update
+msgid "Last Modified on"
+msgstr "آخر تعديل في"
+
+#. module: exp_transaction_holiday
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_holiday_write_uid
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_public_holiday_write_uid
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_weekend_holiday_write_uid
+msgid "Last Updated by"
+msgstr "آخر تحديث بواسطة"
+
+#. module: exp_transaction_holiday
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_holiday_write_date
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_public_holiday_write_date
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_weekend_holiday_write_date
+msgid "Last Updated on"
+msgstr "آخر تحديث في"
+
+#. module: exp_transaction_holiday
+#: selection:transaction.weekend.holiday,name:0
+msgid "Monday"
+msgstr "الاثنين"
+
+#. module: exp_transaction_holiday
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_holiday_name
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_public_holiday_name
+msgid "Name"
+msgstr "الاسم"
+
+#. module: exp_transaction_holiday
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_holiday_public_holiday_ids
+msgid "Public Holiday"
+msgstr "العطل الرسمية"
+
+#. module: exp_transaction_holiday
+#: model:ir.ui.view,arch_db:exp_transaction_holiday.view_transaction_holiday_form
+msgid "Public Holiday."
+msgstr "العطل الرسمية"
+
+#. module: exp_transaction_holiday
+#: model:ir.ui.menu,name:exp_transaction_holiday.parent_holiday_menu
+msgid "Public Holidays"
+msgstr "العطل الرسمية"
+
+#. module: exp_transaction_holiday
+#: selection:transaction.weekend.holiday,name:0
+msgid "Saturday"
+msgstr "السبت"
+
+#. module: exp_transaction_holiday
+#: selection:transaction.weekend.holiday,name:0
+msgid "Sunday"
+msgstr "الاحد"
+
+#. module: exp_transaction_holiday
+#: selection:transaction.weekend.holiday,name:0
+msgid "Thursday"
+msgstr "الخميس"
+
+#. module: exp_transaction_holiday
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_public_holiday_to_date
+msgid "To Date"
+msgstr "إلى تاريخ"
+
+#. module: exp_transaction_holiday
+#: model:ir.actions.act_window,name:exp_transaction_holiday.transaction_holiday_action
+msgid "Transaction Holiday"
+msgstr "العطل العامة"
+
+#. module: exp_transaction_holiday
+#: selection:transaction.weekend.holiday,name:0
+msgid "Tuesday"
+msgstr "الثلاثاء"
+
+#. module: exp_transaction_holiday
+#: selection:transaction.weekend.holiday,name:0
+msgid "Wednesday"
+msgstr "الاربعاء"
+
+#. module: exp_transaction_holiday
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_holiday_weekend_ids
+msgid "Weekend Days"
+msgstr "ايام العطل الرسمية"
+
+#. module: exp_transaction_holiday
+#: code:addons/exp_transaction_holiday/models/transaction_holiday.py:65
+#, python-format
+msgid "You cannot create a new holiday in the same year in the same period"
+msgstr "لا يمكنك إنشاء عطلة جديدة في نفس العام في نفس الفترة الموجوده"
+
+#. module: exp_transaction_holiday
+#: model:ir.model,name:exp_transaction_holiday.model_transaction_transaction
+msgid "for common attribute between transaction"
+msgstr "for common attribute between transaction"
+
+#. module: exp_transaction_holiday
+#: model:ir.model,name:exp_transaction_holiday.model_transaction_holiday
+msgid "transaction.holiday"
+msgstr "transaction.holiday"
+
+#. module: exp_transaction_holiday
+#: model:ir.model,name:exp_transaction_holiday.model_transaction_public_holiday
+msgid "transaction.public.holiday"
+msgstr "transaction.public.holiday"
+
+#. module: exp_transaction_holiday
+#: model:ir.model,name:exp_transaction_holiday.model_transaction_weekend_holiday
+msgid "transaction.weekend.holiday"
+msgstr "transaction.weekend.holiday"
+
+#. module: exp_transaction_holiday
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_public_holiday_holiday_id
+#: model:ir.model.fields,field_description:exp_transaction_holiday.field_transaction_weekend_holiday_holiday_id
+#: model:res.groups,name:exp_transaction_holiday.group_cm_holiday
+msgid "Holiday"
+msgstr "الاجازات العامه"
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_holiday/models/__init__.py b/odex25_transactions/exp_transaction_holiday/models/__init__.py
new file mode 100644
index 000000000..af34c1536
--- /dev/null
+++ b/odex25_transactions/exp_transaction_holiday/models/__init__.py
@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+from . import transaction_holiday
+from . import extend_trasnaction
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_holiday/models/extend_trasnaction.py b/odex25_transactions/exp_transaction_holiday/models/extend_trasnaction.py
new file mode 100644
index 000000000..b4fbcb4ad
--- /dev/null
+++ b/odex25_transactions/exp_transaction_holiday/models/extend_trasnaction.py
@@ -0,0 +1,56 @@
+# -*- coding: utf-8 -*-
+
+from datetime import datetime, timedelta
+from odoo.tools import DEFAULT_SERVER_DATE_FORMAT
+from odoo import fields , models, api
+
+
+class TransactionHoliday(models.Model):
+ _inherit = 'transaction.transaction'
+
+ @api.depends('transaction_date', 'important_id')
+ def compute_due_date(self):
+ """method for compute due date base on holiday config(add by fatima 20/4/2020)"""
+ self.due_date = False
+ for record in self:
+ if not len(record.important_id) or not record.transaction_date:
+ continue
+ rank = record.important_id.rank or 1
+ final_rank = rank + record.add_rank
+ year = fields.Date.to_string(record.transaction_date).split('-')[0]
+ holiday_id = self.env['transaction.holiday'].search([('year', '=', year)], limit=1,
+ order="create_date desc")
+ date = datetime.strptime(fields.Date.to_string(record.transaction_date), DEFAULT_SERVER_DATE_FORMAT)
+ due = date
+ number_of_plus_day = 0
+ last_day_in_day = date + timedelta(days=final_rank)
+ last_date = last_day_in_day - due
+ holiday_line_id = self.env['transaction.public.holiday'].search(
+ [('holiday_id', '=', holiday_id.id),
+ ('from_date', '<=', str(last_day_in_day).split(' ')[0]),
+ ('to_date', '>=', str(due).split(' ')[0])])
+ if holiday_line_id:
+ counter = 0
+ data_start = datetime.strptime(holiday_line_id.from_date, DEFAULT_SERVER_DATE_FORMAT)
+ end_date = datetime.strptime(holiday_line_id.to_date, DEFAULT_SERVER_DATE_FORMAT)
+ number_of_plus_day = (end_date - data_start).days
+ all_hol_day = [str(data_start + timedelta(days=x)).split(' ')[0] for x in range(number_of_plus_day + 1)]
+ for dat in all_hol_day:
+ if dat > record.transaction_date:
+ counter += 1
+ number_of_plus_day = counter
+ dt = [due + timedelta(days=x) for x in range(last_date.days + 1)]
+ for ddt in dt:
+ date_name = ddt.strftime("%A").lower()
+ weekend_id = holiday_id.weekend_ids.filtered(
+ lambda r: r.name == date_name)
+ if weekend_id:
+ number_of_plus_day += 1
+ y = holiday_id.public_holiday_ids.filtered(
+ lambda r: r.from_date <= str(ddt).split(' ')[0] <= r.to_date)
+ if weekend_id and y:
+ number_of_plus_day -= 1
+ last = final_rank + number_of_plus_day
+ for i in range(last):
+ due = due + timedelta(days=1)
+ record.due_date = due.strftime(DEFAULT_SERVER_DATE_FORMAT)
diff --git a/odex25_transactions/exp_transaction_holiday/models/transaction_holiday.py b/odex25_transactions/exp_transaction_holiday/models/transaction_holiday.py
new file mode 100644
index 000000000..9d8c7eab0
--- /dev/null
+++ b/odex25_transactions/exp_transaction_holiday/models/transaction_holiday.py
@@ -0,0 +1,65 @@
+# -*- coding: utf-8 -*-
+
+from datetime import date
+from odoo import models, fields, api, _
+from odoo.exceptions import Warning
+
+
+class TransactionHoliday(models.Model):
+ _name = 'transaction.holiday'
+ _rec_name = 'year'
+
+ year = fields.Integer(
+ "Calendar Year",
+ required=True,
+ default=date.today().year
+ )
+ name = fields.Char(string="Name")
+ weekend_ids = fields.One2many('transaction.weekend.holiday', 'holiday_id', string='Weekend Days',
+ ondelete='cascade')
+ public_holiday_ids = fields.One2many('transaction.public.holiday', 'holiday_id', string='Public Holiday',
+ ondelete='cascade')
+
+
+class TransactionWeekendHoliday(models.Model):
+ _name = 'transaction.weekend.holiday'
+
+ name = fields.Selection(selection=[('saturday', 'Saturday'),
+ ('sunday', 'Sunday'),
+ ('monday', 'Monday'),
+ ('tuesday', 'Tuesday'),
+ ('wednesday', 'Wednesday'),
+ ('thursday', 'Thursday'),
+ ('friday', 'Friday')], string='Day Off', required=True)
+ holiday_id = fields.Many2one('transaction.holiday', string='Holiday', store=True)
+
+ @api.constrains('holiday_id')
+ def check_name(self):
+ rec = self.env['transaction.weekend.holiday'].search(
+ [('holiday_id', '=', self.holiday_id.id), ('id', '!=', self.id),
+ ('name', '=', self.name)])
+ if rec:
+ raise Warning(_('Day off name must be unique in year'))
+
+
+class TransactionPublicHoliday(models.Model):
+ _name = 'transaction.public.holiday'
+
+ name = fields.Char(string="Name", required=True)
+ holiday_id = fields.Many2one('transaction.holiday', string='Holiday', store=True)
+ from_date = fields.Date(string="From Date", default=fields.date.today(), required=True)
+ to_date = fields.Date(string="To Date", default=fields.date.today(), required=True)
+
+ @api.constrains('from_date', 'to_date')
+ def check_dates(self):
+ if self.from_date > self.to_date:
+ raise Warning(_('Date from must be less than date to'))
+
+ @api.constrains('holiday_id')
+ def check_date(self):
+ rec = self.env['transaction.public.holiday'].search(
+ [('holiday_id', '=', self.holiday_id.id), ('id', '!=', self.id),
+ ('from_date', '<=', self.to_date),
+ ('to_date', '>=', self.from_date)])
+ if rec:
+ raise Warning(_('You cannot create a new holiday in the same year in the same period'))
diff --git a/odex25_transactions/exp_transaction_holiday/security/groups.xml b/odex25_transactions/exp_transaction_holiday/security/groups.xml
new file mode 100644
index 000000000..950b171eb
--- /dev/null
+++ b/odex25_transactions/exp_transaction_holiday/security/groups.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/odex25_transactions/exp_transaction_holiday/security/ir.model.access.csv b/odex25_transactions/exp_transaction_holiday/security/ir.model.access.csv
new file mode 100644
index 000000000..6934dd5a6
--- /dev/null
+++ b/odex25_transactions/exp_transaction_holiday/security/ir.model.access.csv
@@ -0,0 +1,22 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+holiday_employee,employee_holiday,exp_transaction_holiday.model_transaction_holiday,exp_transaction_documents.group_transaction_manager,1,1,1,1
+holiday_employee_line,employee_holiday,exp_transaction_holiday.model_transaction_weekend_holiday,exp_transaction_documents.group_transaction_manager,1,1,1,1
+holiday_manager_line,employee_holiday,exp_transaction_holiday.model_transaction_public_holiday,exp_transaction_documents.group_transaction_manager,1,1,1,1
+,,,,,,,
+cm_transaction_holiday,employee_cm_transaction_holiday,exp_transaction_holiday.model_transaction_holiday,exp_transaction_documents.group_cm_employee_group,1,0,0,0
+cm_transaction_holiday_out,employee_out_transaction_holiday,exp_transaction_holiday.model_transaction_holiday,exp_transaction_documents.group_cm_user,1,0,0,0
+cm_transaction_holiday_reviwer,reviwer_transaction_holiday,exp_transaction_holiday.model_transaction_holiday,exp_transaction_documents.group_cm_reviewer,1,0,0,0
+cm_transaction_holiday_dep_man,dep_transaction_holiday,exp_transaction_holiday.model_transaction_holiday,exp_transaction_documents.group_cm_department_manager,1,0,0,0
+cm_transaction_holiday_exective_man,excetive_transaction_holiday,exp_transaction_holiday.model_transaction_holiday,exp_transaction_documents.group_cm_executive_manager,1,0,0,0
+,,,,,,,
+cm_transaction_holiday_week,employee_cm_transaction_holiday_week,exp_transaction_holiday.model_transaction_weekend_holiday,exp_transaction_documents.group_cm_employee_group,1,0,0,0
+cm_transaction_holiday_week_out,employee_out_transaction_holiday_week,exp_transaction_holiday.model_transaction_weekend_holiday,exp_transaction_documents.group_cm_user,1,0,0,0
+cm_transaction_holiday_week_reviwer,reviwer_transaction_holiday_week,exp_transaction_holiday.model_transaction_weekend_holiday,exp_transaction_documents.group_cm_reviewer,1,0,0,0
+cm_transaction_holiday_week_dep_man,dep_transaction_holiday_week,exp_transaction_holiday.model_transaction_weekend_holiday,exp_transaction_documents.group_cm_department_manager,1,0,0,0
+cm_transaction_holiday_week_exective_man,excetive_transaction_holiday_week,exp_transaction_holiday.model_transaction_weekend_holiday,exp_transaction_documents.group_cm_executive_manager,1,0,0,0
+,,,,,,,
+cm_transaction_holiday_public,employee_cm_transaction_holiday_pulic,exp_transaction_holiday.model_transaction_public_holiday,exp_transaction_documents.group_cm_employee_group,1,0,0,0
+cm_transaction_holiday_public_out,employee_out_transaction_holiday_public,exp_transaction_holiday.model_transaction_public_holiday,exp_transaction_documents.group_cm_user,1,0,0,0
+cm_transaction_holiday_public_reviwer,reviwer_transaction_holiday_public,exp_transaction_holiday.model_transaction_public_holiday,exp_transaction_documents.group_cm_reviewer,1,0,0,0
+cm_transaction_holiday_public_dep_man,dep_transaction_holiday_public,exp_transaction_holiday.model_transaction_public_holiday,exp_transaction_documents.group_cm_department_manager,1,0,0,0
+cm_transaction_holiday_public_exective_man,excetive_transaction_holiday_public,exp_transaction_holiday.model_transaction_public_holiday,exp_transaction_documents.group_cm_executive_manager,1,0,0,0
diff --git a/odex25_transactions/exp_transaction_holiday/static/description/icon.png b/odex25_transactions/exp_transaction_holiday/static/description/icon.png
new file mode 100644
index 000000000..dde8236e0
Binary files /dev/null and b/odex25_transactions/exp_transaction_holiday/static/description/icon.png differ
diff --git a/odex25_transactions/exp_transaction_holiday/views/transaction_holiday.xml b/odex25_transactions/exp_transaction_holiday/views/transaction_holiday.xml
new file mode 100644
index 000000000..8c274d01c
--- /dev/null
+++ b/odex25_transactions/exp_transaction_holiday/views/transaction_holiday.xml
@@ -0,0 +1,79 @@
+
+
+
+
+ view.transaction.holiday.tree
+ transaction.holiday
+
+
+
+
+
+
+
+
+ view.transaction.holiday.form
+ transaction.holiday
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Transaction Holiday
+ ir.actions.act_window
+ transaction.holiday
+
+ tree,form
+
+
+
+
+
diff --git a/odex25_transactions/exp_transaction_leave/.idea/exp_transaction.iml b/odex25_transactions/exp_transaction_leave/.idea/exp_transaction.iml
new file mode 100644
index 000000000..671160631
--- /dev/null
+++ b/odex25_transactions/exp_transaction_leave/.idea/exp_transaction.iml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_leave/.idea/misc.xml b/odex25_transactions/exp_transaction_leave/.idea/misc.xml
new file mode 100644
index 000000000..65531ca99
--- /dev/null
+++ b/odex25_transactions/exp_transaction_leave/.idea/misc.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_leave/.idea/modules.xml b/odex25_transactions/exp_transaction_leave/.idea/modules.xml
new file mode 100644
index 000000000..ddac9f50c
--- /dev/null
+++ b/odex25_transactions/exp_transaction_leave/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_leave/.idea/workspace.xml b/odex25_transactions/exp_transaction_leave/.idea/workspace.xml
new file mode 100644
index 000000000..f28201f43
--- /dev/null
+++ b/odex25_transactions/exp_transaction_leave/.idea/workspace.xml
@@ -0,0 +1,131 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1555402175295
+
+
+ 1555402175295
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ file://$PROJECT_DIR$/__manifest__.py
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_leave/__init__.py b/odex25_transactions/exp_transaction_leave/__init__.py
new file mode 100644
index 000000000..f2155f77c
--- /dev/null
+++ b/odex25_transactions/exp_transaction_leave/__init__.py
@@ -0,0 +1,4 @@
+# -*- coding: utf-8 -*-
+from . import models
+from . import wizard
+
diff --git a/odex25_transactions/exp_transaction_leave/__manifest__.py b/odex25_transactions/exp_transaction_leave/__manifest__.py
new file mode 100644
index 000000000..ad83448da
--- /dev/null
+++ b/odex25_transactions/exp_transaction_leave/__manifest__.py
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# Odex - Communications Management System.
+# Copyright (C) 2019 Expert Co. Ltd. ().
+#
+##############################################################################
+{
+ 'name': 'leave Transaction Management',
+ 'version': '1.0',
+ 'sequence': 4,
+ 'author': 'Expert Co. Ltd.',
+ 'category': 'Odex25-Transactions/Odex25-Transactions',
+ 'summary': 'Correspondence Management System',
+ 'description': """
+Odex - Communications Management System
+========================================
+Managing Communications Transcations in emplyee holdays flows
+ """,
+ 'website': 'http://www.exp-sa.com',
+ 'depends': ['exp_transaction_documents'],
+ 'data': [
+ 'security/ir.model.access.csv',
+ 'views/leave.xml',
+ 'data/state_expired_corn.xml'
+ ],
+ 'qweb' : [
+ ],
+ 'installable': True,
+ 'auto_install': False,
+ 'application': True,
+}
diff --git a/odex25_transactions/exp_transaction_leave/data/state_expired_corn.xml b/odex25_transactions/exp_transaction_leave/data/state_expired_corn.xml
new file mode 100644
index 000000000..4e1cdccd5
--- /dev/null
+++ b/odex25_transactions/exp_transaction_leave/data/state_expired_corn.xml
@@ -0,0 +1,15 @@
+
+
+
+ التغيير التلقائى لحالة التفويض
+ True
+ 1
+ days
+ -1
+
+
+ code
+ model.action_expired()
+
+
+
diff --git a/odex25_transactions/exp_transaction_leave/i18n/ar_001.po b/odex25_transactions/exp_transaction_leave/i18n/ar_001.po
new file mode 100644
index 000000000..4e43965f7
--- /dev/null
+++ b/odex25_transactions/exp_transaction_leave/i18n/ar_001.po
@@ -0,0 +1,359 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * exp_transaction_leave
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 14.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-04-30 00:42+0000\n"
+"PO-Revision-Date: 2024-04-30 00:42+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: exp_transaction_leave
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave__message_needaction
+msgid "Action Needed"
+msgstr "الإجراء المطلوب"
+
+#. module: exp_transaction_leave
+#: code:addons/exp_transaction_leave/wizard/forward_trasaction.py:0
+#, python-format
+msgid "Action Taken"
+msgstr "الإجراء المتخذ"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave__alternative_employee_ids
+#: model_terms:ir.ui.view,arch_db:exp_transaction_leave.leave_transaction_form
+msgid "Alternative Employees"
+msgstr "الموظفون البدلاء"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave__alternative_manager_ids
+#: model_terms:ir.ui.view,arch_db:exp_transaction_leave.leave_transaction_form
+msgid "Alternative Mangers"
+msgstr "المديرين البدلاء"
+
+#. module: exp_transaction_leave
+#: model_terms:ir.ui.view,arch_db:exp_transaction_leave.leave_transaction_form
+msgid "Approve"
+msgstr "الموافقة"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields.selection,name:exp_transaction_leave.selection__employee_leave__state__approve
+msgid "Approved"
+msgstr "تمت الموافقة"
+
+#. module: exp_transaction_leave
+#: model:ir.actions.act_window,name:exp_transaction_leave.leave_approved_action
+msgid "Approved Leave "
+msgstr "التفويضات المعتمده"
+
+#. module: exp_transaction_leave
+#: model_terms:ir.ui.view,arch_db:exp_transaction_leave.leave_transaction_form
+msgid "Are you sure you want to confirm leave ?"
+msgstr "هل متأكد من تأكيد التفويض"
+
+#. module: exp_transaction_leave
+#: model_terms:ir.ui.view,arch_db:exp_transaction_leave.leave_transaction_form
+msgid "Are you sure you want to refuse leave ?"
+msgstr "هل أنت متأكد من رفض التفويض"
+
+#. module: exp_transaction_leave
+#: model_terms:ir.ui.view,arch_db:exp_transaction_leave.leave_transaction_form
+msgid "Are you sure you want to request leave ?"
+msgstr "هل أنت متأكد من طلب تفويض"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave__message_attachment_count
+msgid "Attachment Count"
+msgstr "عدد المرفقات"
+
+#. module: exp_transaction_leave
+#: model_terms:ir.actions.act_window,help:exp_transaction_leave.leave_tran_action
+msgid "Create new record"
+msgstr ""
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave__create_uid
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave_line__create_uid
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_manager_leave_line__create_uid
+msgid "Created by"
+msgstr "تم الإنشاء بواسطة"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave__create_date
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave_line__create_date
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_manager_leave_line__create_date
+msgid "Created on"
+msgstr "تم الإنشاء في"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave__display_name
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave_line__display_name
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_manager_leave_line__display_name
+msgid "Display Name"
+msgstr "اسم العرض"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields.selection,name:exp_transaction_leave.selection__employee_leave__state__draft
+msgid "Draft"
+msgstr "مسودة"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave__employee_id
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave_line__employee_id
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_manager_leave_line__employee_id
+msgid "Employee"
+msgstr "الموظف"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields.selection,name:exp_transaction_leave.selection__employee_leave__state__expired
+msgid "Expired"
+msgstr "منتهية"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave__message_follower_ids
+msgid "Followers"
+msgstr "المتابعين"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave__message_channel_ids
+msgid "Followers (Channels)"
+msgstr "المتابعين (القنوات)"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave__message_partner_ids
+msgid "Followers (Partners)"
+msgstr "المتابعين (الشركاء)"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave__from_date
+msgid "From Date"
+msgstr "من التاريخ"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave__id
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave_line__id
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_manager_leave_line__id
+msgid "ID"
+msgstr "معرف"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,help:exp_transaction_leave.field_employee_leave__message_needaction
+#: model:ir.model.fields,help:exp_transaction_leave.field_employee_leave__message_unread
+msgid "If checked, new messages require your attention."
+msgstr "إذا تم التحقق، فإن الرسائل الجديدة تتطلب انتباهك."
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,help:exp_transaction_leave.field_employee_leave__message_has_error
+#: model:ir.model.fields,help:exp_transaction_leave.field_employee_leave__message_has_sms_error
+msgid "If checked, some messages have a delivery error."
+msgstr "إذا تم التحقق، فإن بعض الرسائل تحتوي على خطأ في التسليم."
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave__message_is_follower
+msgid "Is Follower"
+msgstr "هل متابع"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave__current_is_manager
+msgid "Is Manager"
+msgstr "هل مدير"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave____last_update
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave_line____last_update
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_manager_leave_line____last_update
+msgid "Last Modified on"
+msgstr "آخر تعديل في"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave__write_uid
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave_line__write_uid
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_manager_leave_line__write_uid
+msgid "Last Updated by"
+msgstr "آخر تحديث بواسطة"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave__write_date
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave_line__write_date
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_manager_leave_line__write_date
+msgid "Last Updated on"
+msgstr "آخر تحديث في"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave_line__leave_id
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_manager_leave_line__leave_id
+#: model:ir.ui.menu,name:exp_transaction_leave.leave_tran_menu
+#: model_terms:ir.ui.view,arch_db:exp_transaction_leave.leave_transaction_form
+msgid "Leave"
+msgstr "تفويض"
+
+#. module: exp_transaction_leave
+#: model:ir.actions.act_window,name:exp_transaction_leave.leave_tran_action
+msgid "Leave Employee"
+msgstr "تفويض الموظف"
+
+#. module: exp_transaction_leave
+#: model:ir.ui.menu,name:exp_transaction_leave.parent_leave_tran_menu
+msgid "Leave Employees"
+msgstr "تفويض الموظفين"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave__message_main_attachment_id
+msgid "Main Attachment"
+msgstr "المرفق الرئيسي"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave__message_has_error
+msgid "Message Delivery error"
+msgstr "خطأ في تسليم الرسالة"
+
+#. module: exp_transaction_leave
+#: code:addons/exp_transaction_leave/wizard/forward_trasaction.py:0
+#, python-format
+msgid "Message Has been forwarded !"
+msgstr ""
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave__message_ids
+msgid "Messages"
+msgstr "الرسائل"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave__message_needaction_counter
+msgid "Number of Actions"
+msgstr "عدد الإجراءات"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave__message_has_error_counter
+msgid "Number of errors"
+msgstr "عدد الأخطاء"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,help:exp_transaction_leave.field_employee_leave__message_needaction_counter
+msgid "Number of messages which requires an action"
+msgstr ""
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,help:exp_transaction_leave.field_employee_leave__message_has_error_counter
+msgid "Number of messages with delivery error"
+msgstr "عدد الرسائل التي تحتوي على خطأ في التسليم"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,help:exp_transaction_leave.field_employee_leave__message_unread_counter
+msgid "Number of unread messages"
+msgstr "عدد الرسائل غير المقروءة"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave__reason
+msgid "Reason/Justification"
+msgstr ""
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields.selection,name:exp_transaction_leave.selection__employee_leave__state__refuse
+#: model_terms:ir.ui.view,arch_db:exp_transaction_leave.leave_transaction_form
+msgid "Refuse"
+msgstr "رفض"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields.selection,name:exp_transaction_leave.selection__employee_leave__state__request
+#: model_terms:ir.ui.view,arch_db:exp_transaction_leave.leave_transaction_form
+msgid "Request"
+msgstr "طلب"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave__message_has_sms_error
+msgid "SMS Delivery error"
+msgstr "خطأ في تسليم الرسائل القصيرة"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave__state
+msgid "State"
+msgstr "الحالة"
+
+#. module: exp_transaction_leave
+#: model:ir.actions.act_window,name:exp_transaction_leave.leave_approve_action
+msgid "TO Approve Leave "
+msgstr "تفويضات للاعتماد"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave__to_date
+msgid "To Date"
+msgstr "إلى تاريخ"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave_line__unit_id
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_manager_leave_line__unit_id
+msgid "Unit"
+msgstr "الوحدة"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave__message_unread
+msgid "Unread Messages"
+msgstr "رسائل غير مقروءة"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave__message_unread_counter
+msgid "Unread Messages Counter"
+msgstr "عداد الرسائل غير المقروءة"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,field_description:exp_transaction_leave.field_employee_leave__website_message_ids
+msgid "Website Messages"
+msgstr "رسائل الموقع الإلكتروني"
+
+#. module: exp_transaction_leave
+#: model:ir.model.fields,help:exp_transaction_leave.field_employee_leave__website_message_ids
+msgid "Website communication history"
+msgstr "تاريخ التواصل عبر الموقع الإلكتروني"
+
+#. module: exp_transaction_leave
+#: code:addons/exp_transaction_leave/models/leave.py:0
+#, python-format
+msgid "You can not create new leave for employee have leave in sam duration"
+msgstr "لايمكنك إنشاء إجازه ل موظف لديه إجازه في نفس الفتره الزمنية"
+
+#. module: exp_transaction_leave
+#: model:ir.model,name:exp_transaction_leave.model_transaction_transaction
+msgid "for common attribute between transaction"
+msgstr ""
+
+#. module: exp_transaction_leave
+#: model:ir.model,name:exp_transaction_leave.model_employee_leave
+msgid "for mange transaction in employee leave"
+msgstr ""
+
+#. module: exp_transaction_leave
+#: model:ir.model,name:exp_transaction_leave.model_employee_leave_line
+#: model:ir.model,name:exp_transaction_leave.model_manager_leave_line
+msgid "for mange transaction in employee leave line"
+msgstr ""
+
+#. module: exp_transaction_leave
+#: model:ir.model,name:exp_transaction_leave.model_forward_transaction_wizard
+msgid "forward.transaction.wizard"
+msgstr "معاملة موجة"
+
+#. module: exp_transaction_leave
+#: model_terms:ir.ui.view,arch_db:exp_transaction_leave.leave_transaction_tree
+msgid "leave"
+msgstr "تفويض"
+
+#. module: exp_transaction_leave
+#: code:addons/exp_transaction_leave/wizard/forward_trasaction.py:0
+#, python-format
+msgid "{} ← {}"
+msgstr ""
+
+#. module: exp_transaction_leave
+#: model:ir.actions.server,name:exp_transaction_leave.state_change_leave_ir_actions_server
+#: model:ir.cron,cron_name:exp_transaction_leave.state_change_leave
+#: model:ir.cron,name:exp_transaction_leave.state_change_leave
+msgid "التغيير التلقائى لحالة التفويض"
+msgstr "تغيير حالة تلقائي للتفويض"
diff --git a/odex25_transactions/exp_transaction_leave/models/__init__.py b/odex25_transactions/exp_transaction_leave/models/__init__.py
new file mode 100644
index 000000000..c6edf17fc
--- /dev/null
+++ b/odex25_transactions/exp_transaction_leave/models/__init__.py
@@ -0,0 +1,2 @@
+# -*- coding: utf-8 -*-
+from . import leave
diff --git a/odex25_transactions/exp_transaction_leave/models/leave.py b/odex25_transactions/exp_transaction_leave/models/leave.py
new file mode 100644
index 000000000..89971a7d6
--- /dev/null
+++ b/odex25_transactions/exp_transaction_leave/models/leave.py
@@ -0,0 +1,189 @@
+# -*- coding: utf-8 -*-
+
+from datetime import date
+from odoo import models, fields, api, _
+from odoo.exceptions import Warning
+
+
+class Leave(models.Model):
+ _name = 'employee.leave'
+ _inherit = ['mail.thread']
+ _rec_name = 'employee_id'
+ _description = 'for mange transaction in employee leave'
+
+ # name = fields.Char(string='Transaction Number')
+ state = fields.Selection(selection=[('draft', 'Draft'), ('request', 'Request'), ('refuse', 'Refuse'),
+ ('approve', 'Approved'), ('expired', 'Expired')], string='State',
+ default='draft')
+ from_date = fields.Date(string='From Date', default=fields.Date.today)
+ to_date = fields.Date(string='To Date')
+ employee_id = fields.Many2one(comodel_name='cm.entity', string='Employee',
+ default=lambda self: self.default_employee_id(), readonly=True)
+ alternative_employee_ids = fields.One2many('employee.leave.line', 'leave_id', string='Alternative Employees')
+ alternative_manager_ids = fields.One2many('manager.leave.line', 'leave_id', string='Alternative Mangers')
+ current_is_manager = fields.Boolean(string='Is Manager', compute="set_is_manager")
+
+ def default_employee_id(self):
+ user = self.env.user
+ em = self.env['cm.entity'].search([('user_id', '=', user.id)], limit=1)
+ return len(em) and em or self.env['cm.entity']
+
+ @api.constrains('employee_id')
+ def constrains_leave(self):
+ rec = self.env['employee.leave'].search([('employee_id', '=', self.employee_id.id), ('id', '!=', self.id),
+ ('from_date', '<=', self.to_date),
+ ('to_date', '>=', self.from_date),
+ ('state', 'in', ['request', 'approve'])])
+ if rec:
+ raise Warning(_('You can not create new leave for employee have leave in sam duration'))
+
+ def set_is_manager(self):
+ user_id = self.env['res.users'].browse(self.env.uid)
+ if self.employee_id.parent_id.manager_id.user_id == user_id:
+ self.current_is_manager = False
+ else:
+ self.current_is_manager = True
+
+ ####################################################
+ # Business methods
+ ####################################################
+ def action_request(self):
+ for rec in self:
+ rec.state = 'request'
+
+ def action_refuse(self):
+ for rec in self:
+ rec.state = 'refuse'
+
+ def action_approve(self):
+ for rec in self:
+ rec.state = 'approve'
+
+ def action_expired(self):
+ date_now = date.today()
+ leave_ids = self.env['employee.leave'].search([('to_date', '<', date_now), ('state', '=', 'approve')])
+ if leave_ids:
+ for leave in leave_ids:
+ leave.state = 'expired'
+
+
+class LeaveLine(models.Model):
+ _name = 'employee.leave.line'
+ _rec_name = 'employee_id'
+ _description = 'for mange transaction in employee leave line'
+
+ unit_id = fields.Many2one(comodel_name='cm.entity', string='Unit', domain=lambda self: self.onchange_leave_id())
+ employee_id = fields.Many2one(comodel_name='cm.entity', string='Employee',
+ domain=lambda self: self.onchange_unit_id())
+ leave_id = fields.Many2one(comodel_name='employee.leave', string="Leave")
+
+ @api.onchange('leave_id')
+ def onchange_leave_id(self):
+ domain = {}
+ if self.leave_id:
+ domain = {'unit_id': [('id', 'in', self.env['cm.entity'].search([('type', '=', 'unit'),
+ ('secretary_id', '=',
+ self.leave_id.employee_id.id)]).ids)]}
+ return {'domain': domain}
+
+ @api.onchange('unit_id')
+ def onchange_unit_id(self):
+ domain = {}
+ if self.leave_id:
+ domain = {'employee_id': [('id', 'in', self.env['cm.entity'].search([('type', '=', 'employee'),
+ ('parent_id', '=',
+ self.unit_id.id),
+ ('id', '!=',
+ self.leave_id.employee_id.id)]).ids)]}
+ return {'domain': domain}
+
+
+class MangerLeaveLine(models.Model):
+ _name = 'manager.leave.line'
+ _rec_name = 'employee_id'
+ _description = 'for mange transaction in employee leave line'
+
+ unit_id = fields.Many2one(comodel_name='cm.entity', string='Unit', domain=lambda self: self.onchange_leave_id())
+ employee_id = fields.Many2one(comodel_name='cm.entity', string='Employee',
+ domain=lambda self: self.onchange_unit_id())
+ leave_id = fields.Many2one(comodel_name='employee.leave', string="Leave")
+
+ @api.onchange('leave_id')
+ def onchange_leave_id(self):
+ domain = {}
+ if self.leave_id:
+ domain = {'unit_id': [('id', 'in', self.env['cm.entity'].search([('type', '=', 'unit'),
+ ('manager_id', '!=', False),
+ ('manager_id', '=',
+ self.leave_id.employee_id.id)]).ids)]}
+ return {'domain': domain}
+
+ @api.onchange('unit_id')
+ def onchange_unit_id(self):
+ domain = {}
+ if self.leave_id:
+ domain = {'employee_id': [('id', 'in', self.env['cm.entity'].search([('type', '=', 'employee'),
+ ('parent_id', '=',
+ self.unit_id.id),
+ ('id', '!=',
+ self.leave_id.employee_id.id)]).ids)]}
+ return {'domain': domain}
+
+
+class Transaction(models.Model):
+ _inherit = 'transaction.transaction'
+
+ def get_employee_id(self, transaction):
+ if transaction.to_ids:
+ employee_id = transaction.to_ids[0].id
+ unit_id = transaction.to_ids[0].parent_id.id
+ if transaction.to_ids[0].type == 'unit':
+ employee_id = transaction.to_ids[0].secretary_id.id
+ unit_id = transaction.to_ids[0].id
+ return employee_id, unit_id
+ else:
+ return False, False
+
+ def get_employee_leave(self, employee_id, unit_id, transaction_date, ):
+ employee_records = False
+ record = self.env['employee.leave'].search([('employee_id', '=', employee_id),
+ ('from_date', '<=', transaction_date),
+ ('to_date', '>=', transaction_date),
+ ('state', '=', 'approve')])
+ if record:
+ employee_records = self.env['employee.leave.line'].search([('leave_id', '=', record.id),
+ ('unit_id', '=',
+ unit_id)]).employee_id.id
+ return employee_records
+
+
+ def compute_receive_id(self):
+ for rec in self:
+ employee_id, unit_id = self.get_employee_id(rec)
+ rec.receive_id = employee_id
+ employee_records = self.get_employee_leave(employee_id, unit_id, rec.transaction_date)
+ if employee_records:
+ rec.receive_id = employee_records
+ rec.to_user_have_leave = True
+
+
+ def compute_receive_manger_id(self):
+ for rec in self:
+ rec.receive_manger_id = False
+ if rec.preparation_id:
+ manager_id = self.get_employee_leave(rec.preparation_id.manager_id.id, rec.preparation_id.id,
+ rec.transaction_date)
+ if manager_id:
+ rec.receive_manger_id = manager_id
+ else:
+ rec.receive_manger_id = rec.preparation_id.manager_id
+ # rec.to_manager_have_leave = True
+
+ def compute_have_leave(self):
+ for rec in self:
+ employee_id, unit_id = self.get_employee_id(rec)
+ employee_records = self.get_employee_leave(employee_id, unit_id, rec.transaction_date)
+ if employee_records:
+ rec.to_user_have_leave = True
+ else:
+ rec.to_user_have_leave = False
diff --git a/odex25_transactions/exp_transaction_leave/security/ir.model.access.csv b/odex25_transactions/exp_transaction_leave/security/ir.model.access.csv
new file mode 100644
index 000000000..4466310c5
--- /dev/null
+++ b/odex25_transactions/exp_transaction_leave/security/ir.model.access.csv
@@ -0,0 +1,18 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+leave_employee,employee_leave,exp_transaction_leave.model_employee_leave,exp_transaction_documents.group_cm_employee_group,1,1,0,0
+leave_out,employee_out_leave,exp_transaction_leave.model_employee_leave,exp_transaction_documents.group_cm_user,1,1,1,1
+leave_reviwer,reviwer_leave,exp_transaction_leave.model_employee_leave,exp_transaction_documents.group_cm_reviewer,1,1,0,0
+leave_dep_man,dep_leave,exp_transaction_leave.model_employee_leave,exp_transaction_documents.group_cm_department_manager,1,1,0,0
+leave_exective_man,excetive_leave,exp_transaction_leave.model_employee_leave,exp_transaction_documents.group_cm_executive_manager,1,1,0,0
+,,,,,,,
+leave_employee_line,employee_leave,exp_transaction_leave.model_employee_leave_line,exp_transaction_documents.group_cm_employee_group,1,1,1,1
+leave_out_line,employee_out_leave,exp_transaction_leave.model_employee_leave_line,exp_transaction_documents.group_cm_user,1,1,0,0
+leave_reviwer_line,reviwer_leave,exp_transaction_leave.model_employee_leave_line,exp_transaction_documents.group_cm_reviewer,1,1,0,0
+leave_dep_man_line,dep_leave,exp_transaction_leave.model_employee_leave_line,exp_transaction_documents.group_cm_department_manager,1,1,0,0
+leave_exective_man_line,excetive_leave,exp_transaction_leave.model_employee_leave_line,exp_transaction_documents.group_cm_executive_manager,1,1,0,0
+,,,,,,,
+leave_manager_line,employee_leave,exp_transaction_leave.model_manager_leave_line,exp_transaction_documents.group_cm_employee_group,1,1,1,1
+leave_out_line_manager,employee_out_leave,exp_transaction_leave.model_manager_leave_line,exp_transaction_documents.group_cm_user,1,1,0,0
+leave_reviwer_line_manager,reviwer_leave,exp_transaction_leave.model_manager_leave_line,exp_transaction_documents.group_cm_reviewer,1,1,0,0
+leave_dep_man_line_manager,dep_leave,exp_transaction_leave.model_manager_leave_line,exp_transaction_documents.group_cm_department_manager,1,1,0,0
+leave_exective_man_line_manger,excetive_leave,exp_transaction_leave.model_manager_leave_line,exp_transaction_documents.group_cm_executive_manager,1,1,0,0
diff --git a/odex25_transactions/exp_transaction_leave/static/description/icon.png b/odex25_transactions/exp_transaction_leave/static/description/icon.png
new file mode 100644
index 000000000..dde8236e0
Binary files /dev/null and b/odex25_transactions/exp_transaction_leave/static/description/icon.png differ
diff --git a/odex25_transactions/exp_transaction_leave/views/leave.xml b/odex25_transactions/exp_transaction_leave/views/leave.xml
new file mode 100644
index 000000000..008add853
--- /dev/null
+++ b/odex25_transactions/exp_transaction_leave/views/leave.xml
@@ -0,0 +1,105 @@
+
+
+
+
+
+ leave.transaction.tree
+ employee.leave
+
+
+
+
+
+
+
+
+
+
+
+
+ leave.transaction.form
+ employee.leave
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Leave Employee
+ employee.leave
+
+ tree,form
+
+ Create new record
+
+
+
+
+ TO Approve Leave
+ employee.leave
+
+ tree,form
+ [('state', '=', 'request'),('employee_id.parent_id.manager_id.user_id','=',uid)]
+
+
+ Approved Leave
+ employee.leave
+
+ tree,form
+ [('state', '=', 'approve'),('employee_id.user_id','=',uid)]
+
+
+
+
+
+
diff --git a/odex25_transactions/exp_transaction_leave/wizard/__init__.py b/odex25_transactions/exp_transaction_leave/wizard/__init__.py
new file mode 100644
index 000000000..d5f98735f
--- /dev/null
+++ b/odex25_transactions/exp_transaction_leave/wizard/__init__.py
@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+
+from . import forward_trasaction
diff --git a/odex25_transactions/exp_transaction_leave/wizard/forward_trasaction.py b/odex25_transactions/exp_transaction_leave/wizard/forward_trasaction.py
new file mode 100644
index 000000000..31dba9892
--- /dev/null
+++ b/odex25_transactions/exp_transaction_leave/wizard/forward_trasaction.py
@@ -0,0 +1,83 @@
+# -*- coding: utf-8 -*-
+from datetime import date
+from odoo import api, models, fields, _
+
+
+class ForwardTransactionWizard(models.TransientModel):
+ _inherit = 'forward.transaction.wizard'
+
+ def action_forward(self):
+ transaction = ''
+ name = ''
+ to_id = self.employee.id
+ unit_id = self.employee.parent_id.id
+ if self.internal_transaction_id:
+ transaction = self.internal_transaction_id
+ name = 'internal_transaction_id'
+ elif self.incoming_transaction_id:
+ transaction = self.incoming_transaction_id
+ name = 'incoming_transaction_id'
+ elif self.outgoing_transaction_id:
+ transaction = self.outgoing_transaction_id
+ name = 'outgoing_transaction_id'
+ forward_user_id = self.employee.user_id
+ if self.forward_type != 'employee':
+ forward_user_id = self.internal_unit.secretary_id.user_id.id
+ to_id = self.internal_unit.secretary_id.id
+ unit_id = self.internal_unit.id
+ transaction.forward_user_id = forward_user_id
+ leave_employee = transaction.get_employee_leave(to_id, unit_id, date.today())
+ if leave_employee:
+ forward_user_id = self.env['cm.entity'].search([('id', '=', leave_employee)]).user_id.id
+ to_id = leave_employee
+ transaction.forward_user_id = forward_user_id
+ transaction.last_forwarded_user = self.env.uid
+ if self.is_secret:
+ transaction.secret_reason = self.secret_reason
+ transaction.secret_forward_user = self.env['cm.entity'].search([('user_id', '=', forward_user_id.id)], limit=1)
+ employee = transaction.current_employee()
+ from_id = self.env['cm.entity'].search([('user_id', '=', self.env.uid)], limit=1)
+ transaction.is_forward = True
+ if self.forward_attachment_id:
+ transaction.attachment_rule_ids.create({
+ 'file_save': self.forward_attachment_id,
+ 'name': transaction.id,
+ 'description': self.att_description,
+ 'attachment_filename': self.filename,
+ })
+ transaction.trace_ids.create({
+ 'action': 'forward',
+ 'to_id': to_id,
+ 'from_id': from_id.id,
+ 'procedure_id': self.procedure_id.id or False,
+ 'note': self.note,
+ 'cc_ids': [(6, 0, self.cc_ids.ids)],
+ name: transaction.id
+ })
+ if self.internal_transaction_id or self.incoming_transaction_id:
+ transaction.action_send_forward()
+ '''for notification partner in cc or forward user'''
+ target = self.forward_type
+ target_name = target == 'employee' and self.employee.name or self.internal_unit.name
+ subj = _('Message Has been forwarded !')
+ msg = _(u'{} ← {}').format(
+ employee and employee.name or '#', target_name)
+ msg = u'{}{} {}. {}'.format(msg,
+ _(u'Action Taken'), self.procedure_id.name,
+ u'رابط المعاملة ' % (
+ transaction.get_url()))
+ # add mail notification
+ partner_ids = []
+ if self.forward_type == 'unit':
+ partner_ids.append(self.internal_unit.secretary_id.user_id.partner_id.id)
+ elif self.forward_type == 'employee':
+ partner_ids.append(self.employee.user_id.partner_id.id)
+ for partner in self.cc_ids:
+ if partner.type == 'unit':
+ partner_ids.append(partner.secretary_id.user_id.partner_id.id)
+ elif partner.type == 'employee':
+ partner_ids.append(partner.user_id.partner_id.id)
+ transaction.action_send_notification(subj, msg, partner_ids)
+ if self.incoming_transaction_id:
+ if transaction.state == 'draft':
+ transaction.state = 'send'
diff --git a/odex25_transactions/exp_transaction_report/.idea/exp_transaction.iml b/odex25_transactions/exp_transaction_report/.idea/exp_transaction.iml
new file mode 100644
index 000000000..671160631
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/.idea/exp_transaction.iml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_report/.idea/misc.xml b/odex25_transactions/exp_transaction_report/.idea/misc.xml
new file mode 100644
index 000000000..65531ca99
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/.idea/misc.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_report/.idea/modules.xml b/odex25_transactions/exp_transaction_report/.idea/modules.xml
new file mode 100644
index 000000000..ddac9f50c
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_report/.idea/workspace.xml b/odex25_transactions/exp_transaction_report/.idea/workspace.xml
new file mode 100644
index 000000000..f28201f43
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/.idea/workspace.xml
@@ -0,0 +1,131 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1555402175295
+
+
+ 1555402175295
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ file://$PROJECT_DIR$/__manifest__.py
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_report/__init__.py b/odex25_transactions/exp_transaction_report/__init__.py
new file mode 100644
index 000000000..83e278c63
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/__init__.py
@@ -0,0 +1,2 @@
+# -*- coding: utf-8 -*-
+from . import wizard
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_report/__manifest__.py b/odex25_transactions/exp_transaction_report/__manifest__.py
new file mode 100644
index 000000000..173ee2c76
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/__manifest__.py
@@ -0,0 +1,45 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# Odex - Communications Management System.
+# Copyright (C) 2019 Expert Co. Ltd. ().
+#
+##############################################################################
+{
+ 'name': 'Report Transaction Management',
+ 'version': '1.0',
+ 'sequence': 4,
+ 'author': 'Expert Co. Ltd.',
+ 'category': 'Odex25-Transactions/Odex25-Transactions',
+ 'summary': 'Correspondence Management System',
+ 'description': """
+Odex - Communications Management System
+========================================
+Managing Communications Transcations in emplyee holdays flows
+ """,
+ 'website': 'http://www.exp-sa.com',
+ 'depends': ['exp_transaction_documents', 'report_xlsx'],
+ 'data': [
+ 'security/ir.model.access.csv',
+ 'report/close_transaction_report_template.xml',
+ 'report/forward_transaction_report_template.xml',
+ 'report/incoming_transaction_report_template.xml',
+ 'report/outgoing_transaction_report_template.xml',
+ 'report/outstanding_transaction_report_template.xml',
+ 'report/late_transaction_report_template.xml',
+ 'report/achievement_transaction_report_template.xml',
+ 'wizard/transaction_common_report_view.xml',
+ 'wizard/close_transaction_view_wiz.xml',
+ 'wizard/forward_transaction_report_wiz_view.xml',
+ 'wizard/incoming_transaction_report_wiz_view.xml',
+ 'wizard/late_transaction_report_wiz.xml',
+ 'wizard/outgoing_transaction_report_wiz_view.xml',
+ 'wizard/outstanding_transaction_report_view_wiz.xml',
+ 'wizard/achievement_transaction_report_view_wiz.xml',
+ ],
+ 'qweb' : [
+ ],
+ 'installable': True,
+ 'auto_install': False,
+ 'application': True,
+}
diff --git a/odex25_transactions/exp_transaction_report/i18n/ar_001.po b/odex25_transactions/exp_transaction_report/i18n/ar_001.po
new file mode 100644
index 000000000..c045c66a0
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/i18n/ar_001.po
@@ -0,0 +1,732 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * exp_transaction_report
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 14.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-01-10 09:42+0000\n"
+"PO-Revision-Date: 2023-01-10 09:42+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: exp_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.achievement_tran_report_temp
+msgid "Achievement Report"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model:ir.actions.report,name:exp_transaction_report.achievement_transaction_complete_report
+msgid "Achievement Transaction Report"
+msgstr "تقرير الإنجاز"
+
+#. module: exp_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.achievement_tran_report_temp
+msgid "Administration/Employee"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__achievement_transaction_report_wizard__type_transact__all
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__close_transaction_report_wizard__type_transact__all
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__forward_transaction_report_wizard__type_transact__all
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__incoming_transaction_report_wizard__type_transact__all
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__late_transaction_report_wizard__type_transact__all
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__outgoing_transaction_report_wizard__type_transact__all
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__transaction_common_report__type_transact__all
+msgid "All"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.achievement_transaction_report_wizard_view
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.close_transaction_report_wizard_view
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.forward_transaction_report_wizard_view
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.incoming_transaction_report_wizard_view
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.late_transaction_report_wizard_view
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.outgoing_transaction_report_wizard_view
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.outstanding_transaction_report_wizard_view
+msgid "Cancel"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_close_transaction_report
+msgid "Cause of closure"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_forw_transaction_report
+msgid "Cause of forward"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model:ir.actions.report,name:exp_transaction_report.close_transaction_complete_report
+msgid "Close Transaction Report"
+msgstr "تقرير المعاملات المغلقه"
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/close_transaction_wiz.py:0
+#: code:addons/exp_transaction_report/wizard/close_transaction_wiz.py:0
+#, python-format
+msgid "Close Transactions Report"
+msgstr "تقرير المعاملات المغلقه"
+
+#. module: exp_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_close_transaction_report
+msgid "Closed Transaction Report"
+msgstr ""
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/close_transaction_wiz.py:0
+#, python-format
+msgid "Closing date"
+msgstr "تاريخ الإغلاق"
+
+#. module: exp_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_close_transaction_report
+msgid "Closure Date"
+msgstr ""
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/achievement_transaction_report_wiz.py:0
+#, python-format
+msgid "Compilation Report"
+msgstr "تقرير الإنجاز"
+
+#. module: exp_transaction_report
+#: model:ir.model.fields,field_description:exp_transaction_report.field_achievement_transaction_report_wizard__create_uid
+#: model:ir.model.fields,field_description:exp_transaction_report.field_close_transaction_report_wizard__create_uid
+#: model:ir.model.fields,field_description:exp_transaction_report.field_forward_transaction_report_wizard__create_uid
+#: model:ir.model.fields,field_description:exp_transaction_report.field_incoming_transaction_report_wizard__create_uid
+#: model:ir.model.fields,field_description:exp_transaction_report.field_late_transaction_report_wizard__create_uid
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outgoing_transaction_report_wizard__create_uid
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outstanding_transaction_report_wizard__create_uid
+#: model:ir.model.fields,field_description:exp_transaction_report.field_transaction_common_report__create_uid
+msgid "Created by"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model:ir.model.fields,field_description:exp_transaction_report.field_achievement_transaction_report_wizard__create_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_close_transaction_report_wizard__create_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_forward_transaction_report_wizard__create_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_incoming_transaction_report_wizard__create_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_late_transaction_report_wizard__create_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outgoing_transaction_report_wizard__create_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outstanding_transaction_report_wizard__create_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_transaction_common_report__create_date
+msgid "Created on"
+msgstr ""
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/close_transaction_wiz.py:0
+#, python-format
+msgid "Date of transaction"
+msgstr "تاريخ المعاملة"
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/achievement_transaction_report_wiz.py:0
+#, python-format
+msgid "Department/Employee"
+msgstr "الادارة/الموظف "
+
+#. module: exp_transaction_report
+#: model:ir.model.fields,field_description:exp_transaction_report.field_achievement_transaction_report_wizard__display_name
+#: model:ir.model.fields,field_description:exp_transaction_report.field_close_transaction_report_wizard__display_name
+#: model:ir.model.fields,field_description:exp_transaction_report.field_forward_transaction_report_wizard__display_name
+#: model:ir.model.fields,field_description:exp_transaction_report.field_incoming_transaction_report_wizard__display_name
+#: model:ir.model.fields,field_description:exp_transaction_report.field_late_transaction_report_wizard__display_name
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outgoing_transaction_report_wizard__display_name
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outstanding_transaction_report_wizard__display_name
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_achievement_tran_report_temp__display_name
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_achievement_transaction_xls__display_name
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_close_transaction_xls__display_name
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_outstand_transaction_report_temp__display_name
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_template_close_transaction_report__display_name
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_template_forw_transaction_report__display_name
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_template_incom_transaction_report__display_name
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_template_late_transaction_report__display_name
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_template_out_transaction_report__display_name
+#: model:ir.model.fields,field_description:exp_transaction_report.field_transaction_common_report__display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_late_transaction_report
+msgid "Due Date"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__achievement_transaction_report_wizard__type__employee
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__close_transaction_report_wizard__type__employee
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__forward_transaction_report_wizard__type__employee
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__incoming_transaction_report_wizard__type__employee
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__late_transaction_report_wizard__type__employee
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__outgoing_transaction_report_wizard__type__employee
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__outstanding_transaction_report_wizard__type__employee
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__transaction_common_report__type__employee
+msgid "Employee"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model:ir.model.fields,field_description:exp_transaction_report.field_achievement_transaction_report_wizard__end_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_close_transaction_report_wizard__end_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_forward_transaction_report_wizard__end_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_incoming_transaction_report_wizard__end_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_late_transaction_report_wizard__end_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outgoing_transaction_report_wizard__end_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outstanding_transaction_report_wizard__end_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_transaction_common_report__end_date
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.achievement_tran_report_temp
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.outstand_transaction_report_temp
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_close_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_forw_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_incom_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_out_transaction_report
+msgid "End Date"
+msgstr ""
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/achievement_transaction_report_wiz.py:0
+#: code:addons/exp_transaction_report/wizard/close_transaction_wiz.py:0
+#, python-format
+msgid "End date"
+msgstr "تاريخ الإنتهاء"
+
+#. module: exp_transaction_report
+#: model:ir.model.fields,field_description:exp_transaction_report.field_achievement_transaction_report_wizard__entity_ids
+#: model:ir.model.fields,field_description:exp_transaction_report.field_close_transaction_report_wizard__entity_ids
+#: model:ir.model.fields,field_description:exp_transaction_report.field_forward_transaction_report_wizard__entity_ids
+#: model:ir.model.fields,field_description:exp_transaction_report.field_incoming_transaction_report_wizard__entity_ids
+#: model:ir.model.fields,field_description:exp_transaction_report.field_late_transaction_report_wizard__entity_ids
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outgoing_transaction_report_wizard__entity_ids
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outstanding_transaction_report_wizard__entity_ids
+#: model:ir.model.fields,field_description:exp_transaction_report.field_transaction_common_report__entity_ids
+msgid "Entities"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model:ir.actions.report,name:exp_transaction_report.forward_transaction_complete_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_forw_transaction_report
+msgid "Forward Transaction Report"
+msgstr "تقرير المعاملات المحاله"
+
+#. module: exp_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_incom_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_late_transaction_report
+msgid "Going To"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model:ir.model.fields,field_description:exp_transaction_report.field_achievement_transaction_report_wizard__id
+#: model:ir.model.fields,field_description:exp_transaction_report.field_close_transaction_report_wizard__id
+#: model:ir.model.fields,field_description:exp_transaction_report.field_forward_transaction_report_wizard__id
+#: model:ir.model.fields,field_description:exp_transaction_report.field_incoming_transaction_report_wizard__id
+#: model:ir.model.fields,field_description:exp_transaction_report.field_late_transaction_report_wizard__id
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outgoing_transaction_report_wizard__id
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outstanding_transaction_report_wizard__id
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_achievement_tran_report_temp__id
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_achievement_transaction_xls__id
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_close_transaction_xls__id
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_outstand_transaction_report_temp__id
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_template_close_transaction_report__id
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_template_forw_transaction_report__id
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_template_incom_transaction_report__id
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_template_late_transaction_report__id
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_template_out_transaction_report__id
+#: model:ir.model.fields,field_description:exp_transaction_report.field_transaction_common_report__id
+msgid "ID"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__achievement_transaction_report_wizard__type_transact__incoming
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__close_transaction_report_wizard__type_transact__incoming
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__forward_transaction_report_wizard__type_transact__incoming
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__incoming_transaction_report_wizard__type_transact__incoming
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__late_transaction_report_wizard__type_transact__incoming
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__outstanding_transaction_report_wizard__type_transact__incoming
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__transaction_common_report__type_transact__incoming
+msgid "Incoming"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_incom_transaction_report
+msgid "Incoming From"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model:ir.actions.report,name:exp_transaction_report.incom_transaction_complete_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_incom_transaction_report
+msgid "Incoming Transaction Report"
+msgstr "تقرير المعاملات الوارده"
+
+#. module: exp_transaction_report
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__achievement_transaction_report_wizard__type_transact__internal
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__close_transaction_report_wizard__type_transact__internal
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__forward_transaction_report_wizard__type_transact__internal
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__incoming_transaction_report_wizard__type_transact__internal
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__late_transaction_report_wizard__type_transact__internal
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__outgoing_transaction_report_wizard__type_transact__internal
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__transaction_common_report__type_transact__internal
+msgid "Internal"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model:ir.model.fields,field_description:exp_transaction_report.field_achievement_transaction_report_wizard____last_update
+#: model:ir.model.fields,field_description:exp_transaction_report.field_close_transaction_report_wizard____last_update
+#: model:ir.model.fields,field_description:exp_transaction_report.field_forward_transaction_report_wizard____last_update
+#: model:ir.model.fields,field_description:exp_transaction_report.field_incoming_transaction_report_wizard____last_update
+#: model:ir.model.fields,field_description:exp_transaction_report.field_late_transaction_report_wizard____last_update
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outgoing_transaction_report_wizard____last_update
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outstanding_transaction_report_wizard____last_update
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_achievement_tran_report_temp____last_update
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_achievement_transaction_xls____last_update
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_close_transaction_xls____last_update
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_outstand_transaction_report_temp____last_update
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_template_close_transaction_report____last_update
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_template_forw_transaction_report____last_update
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_template_incom_transaction_report____last_update
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_template_late_transaction_report____last_update
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_template_out_transaction_report____last_update
+#: model:ir.model.fields,field_description:exp_transaction_report.field_transaction_common_report____last_update
+msgid "Last Modified on"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model:ir.model.fields,field_description:exp_transaction_report.field_achievement_transaction_report_wizard__write_uid
+#: model:ir.model.fields,field_description:exp_transaction_report.field_close_transaction_report_wizard__write_uid
+#: model:ir.model.fields,field_description:exp_transaction_report.field_forward_transaction_report_wizard__write_uid
+#: model:ir.model.fields,field_description:exp_transaction_report.field_incoming_transaction_report_wizard__write_uid
+#: model:ir.model.fields,field_description:exp_transaction_report.field_late_transaction_report_wizard__write_uid
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outgoing_transaction_report_wizard__write_uid
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outstanding_transaction_report_wizard__write_uid
+#: model:ir.model.fields,field_description:exp_transaction_report.field_transaction_common_report__write_uid
+msgid "Last Updated by"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model:ir.model.fields,field_description:exp_transaction_report.field_achievement_transaction_report_wizard__write_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_close_transaction_report_wizard__write_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_forward_transaction_report_wizard__write_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_incoming_transaction_report_wizard__write_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_late_transaction_report_wizard__write_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outgoing_transaction_report_wizard__write_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outstanding_transaction_report_wizard__write_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_transaction_common_report__write_date
+msgid "Last Updated on"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model:ir.actions.report,name:exp_transaction_report.late_transaction_complete_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_late_transaction_report
+msgid "Late Transaction Report"
+msgstr "تقرير المعاملات المتأخره"
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/achievement_transaction_report_wiz.py:0
+#: code:addons/exp_transaction_report/wizard/close_transaction_wiz.py:0
+#: code:addons/exp_transaction_report/wizard/forward_transaction_report_wiz.py:0
+#: code:addons/exp_transaction_report/wizard/incoming_transaction_report_wiz.py:0
+#: code:addons/exp_transaction_report/wizard/late_transaction_report_wiz.py:0
+#: code:addons/exp_transaction_report/wizard/outgoing_transaction_report_wiz.py:0
+#: code:addons/exp_transaction_report/wizard/outstanding_transaction_report_wiz.py:0
+#, python-format
+msgid "No data for your selection\n"
+msgstr "لا يوجد بيانات لهذه المرشحات !"
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/close_transaction_wiz.py:0
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_close_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_forw_transaction_report
+#, python-format
+msgid "Notes"
+msgstr "ملاحظات"
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/achievement_transaction_report_wiz.py:0
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.achievement_tran_report_temp
+#, python-format
+msgid "Number of closed transactions"
+msgstr "عدد المعاملات المغلقة"
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/achievement_transaction_report_wiz.py:0
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.achievement_tran_report_temp
+#, python-format
+msgid "Number of incoming transactions"
+msgstr "عدد المعاملات الوارده"
+
+#. module: exp_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.achievement_tran_report_temp
+msgid "Number of outgoing transactions"
+msgstr ""
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/achievement_transaction_report_wiz.py:0
+#, python-format
+msgid "Number of transactions issued"
+msgstr "عدد المعاملات الصادرة"
+
+#. module: exp_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.achievement_tran_report_temp
+msgid "Number of transactions referred from administration"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.achievement_tran_report_temp
+msgid "Number of transactions referred to administration"
+msgstr ""
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/achievement_transaction_report_wiz.py:0
+#, python-format
+msgid "Number of transactions referred to departament"
+msgstr "عدد المعاملات المحالة إلى الإدارة/الموظف"
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/achievement_transaction_report_wiz.py:0
+#, python-format
+msgid "Number of transactions transferred by departament"
+msgstr "عدد المعاملات المحالة من الادارة"
+
+#. module: exp_transaction_report
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__outgoing_transaction_report_wizard__type_transact__outgoing
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__outstanding_transaction_report_wizard__type_transact__outgoing
+msgid "Outgoing"
+msgstr " الصادره"
+
+#. module: exp_transaction_report
+#: model:ir.actions.report,name:exp_transaction_report.out_transaction_complete_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_out_transaction_report
+msgid "Outgoing Transaction Report"
+msgstr "تقرير المعاملات الصادره"
+
+#. module: exp_transaction_report
+#: model:ir.actions.report,name:exp_transaction_report.outstanding_transaction_complete_report
+msgid "Outstanding Transaction Report"
+msgstr "تقرير المعاملات المسددة"
+
+#. module: exp_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.custom_external_layout_standard_all
+msgid "Page: / "
+msgstr ""
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_achievement_transaction_report_wizard
+msgid "Print Achievement Transaction Report"
+msgstr "طباعة تقرير المعاملات المنجزه"
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_close_transaction_report_wizard
+msgid "Print Close Transaction Report"
+msgstr "طباعة تقرير المعاملات المغلقة"
+
+#. module: exp_transaction_report
+#: model:ir.actions.act_window,name:exp_transaction_report.close_transaction_report_wiz
+#: model:ir.ui.menu,name:exp_transaction_report.close_transaction_report
+msgid "Print Close transaction Report"
+msgstr "طباعة تقرير المعاملات المغلقة"
+
+#. module: exp_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.achievement_transaction_report_wizard_view
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.close_transaction_report_wizard_view
+msgid "Print Excel Report"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_forward_transaction_report_wizard
+msgid "Print Forward Transaction Report"
+msgstr "طباعة تقرير المعاملات المحاله"
+
+#. module: exp_transaction_report
+#: model:ir.actions.act_window,name:exp_transaction_report.incoming_transaction_report_wiz
+#: model:ir.ui.menu,name:exp_transaction_report.incoming_transaction_report
+msgid "Print Incoming transaction Report"
+msgstr "طباعة تقرير المعاملات الوارده"
+
+#. module: exp_transaction_report
+#: model:ir.actions.act_window,name:exp_transaction_report.outgoing_transaction_report_wiz
+#: model:ir.ui.menu,name:exp_transaction_report.outgoing_transaction_report
+msgid "Print Outgoing transaction Report"
+msgstr "طباعة تقرير المعاملات الصادره"
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_outstanding_transaction_report_wizard
+msgid "Print Outstanding Transaction Report"
+msgstr "طباعة تقرير المعاملات المسدده"
+
+#. module: exp_transaction_report
+#: model:ir.actions.act_window,name:exp_transaction_report.outstanding_transaction_report_wiz
+#: model:ir.ui.menu,name:exp_transaction_report.outstanding_transaction_report
+msgid "Print Outstanding transaction Report"
+msgstr "طباعة تقرير المعاملات المسدده"
+
+#. module: exp_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.achievement_transaction_report_wizard_view
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.close_transaction_report_wizard_view
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.forward_transaction_report_wizard_view
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.incoming_transaction_report_wizard_view
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.late_transaction_report_wizard_view
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.outgoing_transaction_report_wizard_view
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.outstanding_transaction_report_wizard_view
+msgid "Print Report"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model:ir.actions.act_window,name:exp_transaction_report.achievement_transaction_report_wiz
+#: model:ir.ui.menu,name:exp_transaction_report.achievement_transaction_report
+msgid "Print achievement transaction Report"
+msgstr "طباعة تقرير المعاملات المنجزه"
+
+#. module: exp_transaction_report
+#: model:ir.actions.act_window,name:exp_transaction_report.forward_transaction_report_wiz
+#: model:ir.ui.menu,name:exp_transaction_report.forward_transaction_report
+msgid "Print forward transaction Report"
+msgstr "طباعة تقرير المعاملات المحاله"
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_incoming_transaction_report_wizard
+msgid "Print incoming Transaction Report"
+msgstr "طباعة تقرير المعاملات الوارده"
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_late_transaction_report_wizard
+msgid "Print late Transaction Report"
+msgstr "طباعة تقرير المعاملات المتأخره"
+
+#. module: exp_transaction_report
+#: model:ir.actions.act_window,name:exp_transaction_report.late_transaction_report_wiz
+#: model:ir.ui.menu,name:exp_transaction_report.late_transaction_report
+msgid "Print late transaction Report"
+msgstr "طباعة تقرير المعاملات المتأخره"
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_outgoing_transaction_report_wizard
+msgid "Print outgoing Transaction Report"
+msgstr "طباعة تقرير المعاملات الصادره"
+
+#. module: exp_transaction_report
+#: model:ir.actions.report,name:exp_transaction_report.achievement_transaction_xls
+#: model:ir.actions.report,name:exp_transaction_report.close_transaction_xls
+msgid "Print to XLSX"
+msgstr "طباعة إكسل"
+
+#. module: exp_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.outstand_transaction_report_temp
+msgid "Process Transactions"
+msgstr ""
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/close_transaction_wiz.py:0
+#, python-format
+msgid "Reason for closure"
+msgstr "سبب الاغلاق"
+
+#. module: exp_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.outstand_transaction_report_temp
+msgid "Report outstanding Transaction"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.outstand_transaction_report_temp
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_out_transaction_report
+msgid "Send To"
+msgstr "مرسلة الي"
+
+#. module: exp_transaction_report
+#: model:ir.model.fields,field_description:exp_transaction_report.field_achievement_transaction_report_wizard__start_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_close_transaction_report_wizard__start_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_forward_transaction_report_wizard__start_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_incoming_transaction_report_wizard__start_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_late_transaction_report_wizard__start_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outgoing_transaction_report_wizard__start_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outstanding_transaction_report_wizard__start_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_transaction_common_report__start_date
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.achievement_tran_report_temp
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.outstand_transaction_report_temp
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_close_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_forw_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_incom_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_late_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_out_transaction_report
+msgid "Start Date"
+msgstr ""
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/achievement_transaction_report_wiz.py:0
+#: code:addons/exp_transaction_report/wizard/close_transaction_wiz.py:0
+#, python-format
+msgid "Start date"
+msgstr "تاريخ البدء"
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/close_transaction_wiz.py:0
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.outstand_transaction_report_temp
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_close_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_forw_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_incom_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_late_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_out_transaction_report
+#, python-format
+msgid "Subject"
+msgstr "الموضوع"
+
+#. module: exp_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_close_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_forw_transaction_report
+msgid "Transaction Classification"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_transaction_common_report
+msgid "Transaction Common Report"
+msgstr "تقرير المعامله المشترك"
+
+#. module: exp_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.outstand_transaction_report_temp
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_close_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_forw_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_incom_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_late_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_out_transaction_report
+msgid "Transaction Date"
+msgstr "تاريخ المعاملة"
+
+#. module: exp_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.outstand_transaction_report_temp
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_close_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_forw_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_incom_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_late_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_out_transaction_report
+msgid "Transaction Number"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.common_transaction_report_wizard_view
+msgid "Transaction Report"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model:ir.model.fields,field_description:exp_transaction_report.field_achievement_transaction_report_wizard__type_transact
+#: model:ir.model.fields,field_description:exp_transaction_report.field_close_transaction_report_wizard__type_transact
+#: model:ir.model.fields,field_description:exp_transaction_report.field_forward_transaction_report_wizard__type_transact
+#: model:ir.model.fields,field_description:exp_transaction_report.field_incoming_transaction_report_wizard__type_transact
+#: model:ir.model.fields,field_description:exp_transaction_report.field_late_transaction_report_wizard__type_transact
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outgoing_transaction_report_wizard__type_transact
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outstanding_transaction_report_wizard__type_transact
+#: model:ir.model.fields,field_description:exp_transaction_report.field_transaction_common_report__type_transact
+msgid "Transaction Type"
+msgstr "انواع المعاملات"
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/close_transaction_wiz.py:0
+#, python-format
+msgid "Transaction classification"
+msgstr "تصنيف المعاملة"
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/close_transaction_wiz.py:0
+#, python-format
+msgid "Transaction number"
+msgstr "رقم المعاملة"
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/close_transaction_wiz.py:0
+#: model:ir.model.fields,field_description:exp_transaction_report.field_achievement_transaction_report_wizard__type
+#: model:ir.model.fields,field_description:exp_transaction_report.field_close_transaction_report_wizard__type
+#: model:ir.model.fields,field_description:exp_transaction_report.field_forward_transaction_report_wizard__type
+#: model:ir.model.fields,field_description:exp_transaction_report.field_incoming_transaction_report_wizard__type
+#: model:ir.model.fields,field_description:exp_transaction_report.field_late_transaction_report_wizard__type
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outgoing_transaction_report_wizard__type
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outstanding_transaction_report_wizard__type
+#: model:ir.model.fields,field_description:exp_transaction_report.field_transaction_common_report__type
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.outstand_transaction_report_temp
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_close_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_forw_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_incom_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_late_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_out_transaction_report
+#, python-format
+msgid "Type"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__achievement_transaction_report_wizard__type__unit
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__close_transaction_report_wizard__type__unit
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__forward_transaction_report_wizard__type__unit
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__incoming_transaction_report_wizard__type__unit
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__late_transaction_report_wizard__type__unit
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__outgoing_transaction_report_wizard__type__unit
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__outstanding_transaction_report_wizard__type__unit
+#: model:ir.model.fields.selection,name:exp_transaction_report.selection__transaction_common_report__type__unit
+msgid "Unit"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.achievement_transaction_report_wizard_view
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.close_transaction_report_wizard_view
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.forward_transaction_report_wizard_view
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.incoming_transaction_report_wizard_view
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.late_transaction_report_wizard_view
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.outgoing_transaction_report_wizard_view
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.outstanding_transaction_report_wizard_view
+msgid "or"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_report_exp_transaction_report_achievement_tran_report_temp
+msgid "report.exp_transaction_report.achievement_tran_report_temp"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_report_exp_transaction_report_achievement_transaction_xls
+msgid "report.exp_transaction_report.achievement_transaction_xls"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_report_exp_transaction_report_close_transaction_xls
+msgid "report.exp_transaction_report.close_transaction_xls"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_report_exp_transaction_report_outstand_transaction_report_temp
+msgid "report.exp_transaction_report.outstand_transaction_report_temp"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_report_exp_transaction_report_template_close_transaction_report
+msgid "report.exp_transaction_report.template_close_transaction_report"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_report_exp_transaction_report_template_forw_transaction_report
+msgid "report.exp_transaction_report.template_forw_transaction_report"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_report_exp_transaction_report_template_incom_transaction_report
+msgid "report.exp_transaction_report.template_incom_transaction_report"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_report_exp_transaction_report_template_late_transaction_report
+msgid "report.exp_transaction_report.template_late_transaction_report"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_report_exp_transaction_report_template_out_transaction_report
+msgid "report.exp_transaction_report.template_out_transaction_report"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_forw_transaction_report
+msgid "From"
+msgstr ""
+
+#. module: exp_transaction_report
+#: model_terms:ir.ui.view,arch_db:exp_transaction_report.template_forw_transaction_report
+msgid "forward Date"
+msgstr ""
diff --git a/odex25_transactions/exp_transaction_report/i18n/ar_SY.po b/odex25_transactions/exp_transaction_report/i18n/ar_SY.po
new file mode 100644
index 000000000..635085990
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/i18n/ar_SY.po
@@ -0,0 +1,784 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * exp_transaction_report
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 11.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-07-04 08:25+0000\n"
+"PO-Revision-Date: 2020-07-04 08: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: exp_transaction_report
+#: model:ir.actions.report,name:exp_transaction_report.achievement_transaction_complete_report
+msgid "Achievement Transaction Report"
+msgstr "تقرير الإنجاز"
+
+#. module: exp_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.achievement_tran_report_temp
+msgid "Administration/Employee"
+msgstr "الإداره/الموظف"
+
+#. module: exp_transaction_report
+#: selection:achievement.transaction.report.wizard,type_transact:0
+#: selection:close.transaction.report.wizard,type_transact:0
+#: selection:forward.transaction.report.wizard,type_transact:0
+#: selection:incoming.transaction.report.wizard,type_transact:0
+#: selection:late.transaction.report.wizard,type_transact:0
+#: selection:outgoing.transaction.report.wizard,type_transact:0
+#: selection:transaction.common.report,type_transact:0
+msgid "All"
+msgstr "الكل"
+
+#. module: exp_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.achievement_transaction_report_wizard_view
+#: model:ir.ui.view,arch_db:exp_transaction_report.close_transaction_report_wizard_view
+#: model:ir.ui.view,arch_db:exp_transaction_report.forward_transaction_report_wizard_view
+#: model:ir.ui.view,arch_db:exp_transaction_report.incoming_transaction_report_wizard_view
+#: model:ir.ui.view,arch_db:exp_transaction_report.late_transaction_report_wizard_view
+#: model:ir.ui.view,arch_db:exp_transaction_report.outgoing_transaction_report_wizard_view
+#: model:ir.ui.view,arch_db:exp_transaction_report.outstanding_transaction_report_wizard_view
+msgid "Cancel"
+msgstr "إلغاء"
+
+#. module: exp_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_close_transaction_report
+msgid "Cause of closure"
+msgstr "سبب الاغلاق"
+
+#. module: exp_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_forw_transaction_report
+msgid "Cause of forward"
+msgstr "الإجراء المطلوب"
+
+#. module: exp_transaction_report
+#: model:ir.actions.report,name:exp_transaction_report.close_transaction_complete_report
+msgid "Close Transaction Report"
+msgstr "تقرير المعاملات المغلقه"
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/close_transaction_wiz.py:153
+#: code:addons/exp_transaction_report/wizard/close_transaction_wiz.py:162
+#, python-format
+msgid "Close Transactions Report"
+msgstr "تقرير المعاملات المغلقه"
+
+#. module: exp_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_close_transaction_report
+msgid "Closed Transaction Report"
+msgstr "تقرير المعاملات المغلقه"
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/close_transaction_wiz.py:180
+#, python-format
+msgid "Closing date"
+msgstr "تاريخ الإغلاق"
+
+#. module: exp_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_close_transaction_report
+msgid "Closure Date"
+msgstr "تاريخ الاغلاق"
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/achievement_transaction_report_wiz.py:159
+#, python-format
+msgid "Compilation Report"
+msgstr "تقرير الإنجاز"
+
+#. module: exp_transaction_report
+#: model:ir.model.fields,field_description:exp_transaction_report.field_achievement_transaction_report_wizard_create_uid
+#: model:ir.model.fields,field_description:exp_transaction_report.field_close_transaction_report_wizard_create_uid
+#: model:ir.model.fields,field_description:exp_transaction_report.field_forward_transaction_report_wizard_create_uid
+#: model:ir.model.fields,field_description:exp_transaction_report.field_incoming_transaction_report_wizard_create_uid
+#: model:ir.model.fields,field_description:exp_transaction_report.field_late_transaction_report_wizard_create_uid
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outgoing_transaction_report_wizard_create_uid
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outstanding_transaction_report_wizard_create_uid
+#: model:ir.model.fields,field_description:exp_transaction_report.field_transaction_common_report_create_uid
+msgid "Created by"
+msgstr "أنشئ بواسطة"
+
+#. module: exp_transaction_report
+#: model:ir.model.fields,field_description:exp_transaction_report.field_achievement_transaction_report_wizard_create_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_close_transaction_report_wizard_create_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_forward_transaction_report_wizard_create_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_incoming_transaction_report_wizard_create_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_late_transaction_report_wizard_create_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outgoing_transaction_report_wizard_create_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outstanding_transaction_report_wizard_create_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_transaction_common_report_create_date
+msgid "Created on"
+msgstr "أنشئ في"
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/close_transaction_wiz.py:172
+#, python-format
+msgid "Date of transaction"
+msgstr "تاريخ المعاملة"
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/achievement_transaction_report_wiz.py:162
+#, python-format
+msgid "Department/Employee"
+msgstr "الادارة/الموظف "
+
+#. module: exp_transaction_report
+#: model:ir.model.fields,field_description:exp_transaction_report.field_achievement_transaction_report_wizard_display_name
+#: model:ir.model.fields,field_description:exp_transaction_report.field_close_transaction_report_wizard_display_name
+#: model:ir.model.fields,field_description:exp_transaction_report.field_forward_transaction_report_wizard_display_name
+#: model:ir.model.fields,field_description:exp_transaction_report.field_incoming_transaction_report_wizard_display_name
+#: model:ir.model.fields,field_description:exp_transaction_report.field_late_transaction_report_wizard_display_name
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outgoing_transaction_report_wizard_display_name
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outstanding_transaction_report_wizard_display_name
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_achievement_tran_report_temp_display_name
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_achievement_transaction_xls_display_name
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_close_transaction_xls_display_name
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_outstand_transaction_report_temp_display_name
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_template_close_transaction_report_display_name
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_template_forw_transaction_report_display_name
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_template_incom_transaction_report_display_name
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_template_out_transaction_report_display_name
+#: model:ir.model.fields,field_description:exp_transaction_report.field_transaction_common_report_display_name
+msgid "Display Name"
+msgstr "الاسم المعروض"
+
+#. module: exp_transaction_report
+#: selection:achievement.transaction.report.wizard,type:0
+#: selection:close.transaction.report.wizard,type:0
+#: selection:forward.transaction.report.wizard,type:0
+#: selection:incoming.transaction.report.wizard,type:0
+#: selection:late.transaction.report.wizard,type:0
+#: selection:outgoing.transaction.report.wizard,type:0
+#: selection:outstanding.transaction.report.wizard,type:0
+#: selection:transaction.common.report,type:0
+msgid "Employee"
+msgstr "الموظف"
+
+#. module: exp_transaction_report
+#: model:ir.model.fields,field_description:exp_transaction_report.field_achievement_transaction_report_wizard_end_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_close_transaction_report_wizard_end_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_forward_transaction_report_wizard_end_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_incoming_transaction_report_wizard_end_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_late_transaction_report_wizard_end_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outgoing_transaction_report_wizard_end_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outstanding_transaction_report_wizard_end_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_transaction_common_report_end_date
+#: model:ir.ui.view,arch_db:exp_transaction_report.achievement_tran_report_temp
+#: model:ir.ui.view,arch_db:exp_transaction_report.outstand_transaction_report_temp
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_close_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_forw_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_incom_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_out_transaction_report
+msgid "End Date"
+msgstr "تاريخ الإنتهاء"
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/achievement_transaction_report_wiz.py:186
+#: code:addons/exp_transaction_report/wizard/close_transaction_wiz.py:199
+#, python-format
+msgid "End date"
+msgstr "تاريخ الإنتهاء"
+
+#. module: exp_transaction_report
+#: model:ir.model.fields,field_description:exp_transaction_report.field_achievement_transaction_report_wizard_entity_ids
+#: model:ir.model.fields,field_description:exp_transaction_report.field_close_transaction_report_wizard_entity_ids
+#: model:ir.model.fields,field_description:exp_transaction_report.field_forward_transaction_report_wizard_entity_ids
+#: model:ir.model.fields,field_description:exp_transaction_report.field_incoming_transaction_report_wizard_entity_ids
+#: model:ir.model.fields,field_description:exp_transaction_report.field_late_transaction_report_wizard_entity_ids
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outgoing_transaction_report_wizard_entity_ids
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outstanding_transaction_report_wizard_entity_ids
+#: model:ir.model.fields,field_description:exp_transaction_report.field_transaction_common_report_entity_ids
+msgid "Entities"
+msgstr "الوحدة/الموظف"
+
+#. module: exp_transaction_report
+#: model:ir.actions.report,name:exp_transaction_report.forward_transaction_complete_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_forw_transaction_report
+msgid "Forward Transaction Report"
+msgstr "تقرير المعاملات المحاله"
+
+#. module: exp_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_incom_transaction_report
+msgid "Going To"
+msgstr "الجهة الصادر لها"
+
+#. module: exp_transaction_report
+#: model:ir.model.fields,field_description:exp_transaction_report.field_achievement_transaction_report_wizard_id
+#: model:ir.model.fields,field_description:exp_transaction_report.field_close_transaction_report_wizard_id
+#: model:ir.model.fields,field_description:exp_transaction_report.field_forward_transaction_report_wizard_id
+#: model:ir.model.fields,field_description:exp_transaction_report.field_incoming_transaction_report_wizard_id
+#: model:ir.model.fields,field_description:exp_transaction_report.field_late_transaction_report_wizard_id
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outgoing_transaction_report_wizard_id
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outstanding_transaction_report_wizard_id
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_achievement_tran_report_temp_id
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_achievement_transaction_xls_id
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_close_transaction_xls_id
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_outstand_transaction_report_temp_id
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_template_close_transaction_report_id
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_template_forw_transaction_report_id
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_template_incom_transaction_report_id
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_template_out_transaction_report_id
+#: model:ir.model.fields,field_description:exp_transaction_report.field_transaction_common_report_id
+msgid "ID"
+msgstr "المعرف"
+
+#. module: exp_transaction_report
+#: selection:achievement.transaction.report.wizard,type_transact:0
+#: selection:close.transaction.report.wizard,type_transact:0
+#: selection:forward.transaction.report.wizard,type_transact:0
+#: selection:incoming.transaction.report.wizard,type_transact:0
+#: selection:late.transaction.report.wizard,type_transact:0
+#: selection:outstanding.transaction.report.wizard,type_transact:0
+#: selection:transaction.common.report,type_transact:0
+msgid "Incoming"
+msgstr "المعاملات الخارجية الواردة"
+
+#. module: exp_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_incom_transaction_report
+msgid "Incoming From"
+msgstr "المعاملات الوارده"
+
+#. module: exp_transaction_report
+#: model:ir.actions.report,name:exp_transaction_report.incom_transaction_complete_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_incom_transaction_report
+msgid "Incoming Transaction Report"
+msgstr "تقرير المعاملات الوارده"
+
+#. module: exp_transaction_report
+#: selection:achievement.transaction.report.wizard,type_transact:0
+#: selection:close.transaction.report.wizard,type_transact:0
+#: selection:forward.transaction.report.wizard,type_transact:0
+#: selection:incoming.transaction.report.wizard,type_transact:0
+#: selection:late.transaction.report.wizard,type_transact:0
+#: selection:outgoing.transaction.report.wizard,type_transact:0
+#: selection:transaction.common.report,type_transact:0
+msgid "Internal"
+msgstr "المعاملات الداخلية"
+
+#. module: exp_transaction_report
+#: model:ir.model.fields,field_description:exp_transaction_report.field_achievement_transaction_report_wizard___last_update
+#: model:ir.model.fields,field_description:exp_transaction_report.field_close_transaction_report_wizard___last_update
+#: model:ir.model.fields,field_description:exp_transaction_report.field_forward_transaction_report_wizard___last_update
+#: model:ir.model.fields,field_description:exp_transaction_report.field_incoming_transaction_report_wizard___last_update
+#: model:ir.model.fields,field_description:exp_transaction_report.field_late_transaction_report_wizard___last_update
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outgoing_transaction_report_wizard___last_update
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outstanding_transaction_report_wizard___last_update
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_achievement_tran_report_temp___last_update
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_achievement_transaction_xls___last_update
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_close_transaction_xls___last_update
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_outstand_transaction_report_temp___last_update
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_template_close_transaction_report___last_update
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_template_forw_transaction_report___last_update
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_template_incom_transaction_report___last_update
+#: model:ir.model.fields,field_description:exp_transaction_report.field_report_exp_transaction_report_template_out_transaction_report___last_update
+#: model:ir.model.fields,field_description:exp_transaction_report.field_transaction_common_report___last_update
+msgid "Last Modified on"
+msgstr "آخر تعديل في"
+
+#. module: exp_transaction_report
+#: model:ir.model.fields,field_description:exp_transaction_report.field_achievement_transaction_report_wizard_write_uid
+#: model:ir.model.fields,field_description:exp_transaction_report.field_close_transaction_report_wizard_write_uid
+#: model:ir.model.fields,field_description:exp_transaction_report.field_forward_transaction_report_wizard_write_uid
+#: model:ir.model.fields,field_description:exp_transaction_report.field_incoming_transaction_report_wizard_write_uid
+#: model:ir.model.fields,field_description:exp_transaction_report.field_late_transaction_report_wizard_write_uid
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outgoing_transaction_report_wizard_write_uid
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outstanding_transaction_report_wizard_write_uid
+#: model:ir.model.fields,field_description:exp_transaction_report.field_transaction_common_report_write_uid
+msgid "Last Updated by"
+msgstr "آخر تحديث بواسطة"
+
+#. module: exp_transaction_report
+#: model:ir.model.fields,field_description:exp_transaction_report.field_achievement_transaction_report_wizard_write_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_close_transaction_report_wizard_write_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_forward_transaction_report_wizard_write_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_incoming_transaction_report_wizard_write_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_late_transaction_report_wizard_write_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outgoing_transaction_report_wizard_write_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outstanding_transaction_report_wizard_write_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_transaction_common_report_write_date
+msgid "Last Updated on"
+msgstr "آخر تحديث في"
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/close_transaction_wiz.py:182
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_close_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_forw_transaction_report
+#, python-format
+msgid "Notes"
+msgstr "ملاحظات"
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/achievement_transaction_report_wiz.py:172
+#: model:ir.ui.view,arch_db:exp_transaction_report.achievement_tran_report_temp
+#, python-format
+msgid "Number of closed transactions"
+msgstr "عدد المعاملات المغلقة"
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/achievement_transaction_report_wiz.py:164
+#: model:ir.ui.view,arch_db:exp_transaction_report.achievement_tran_report_temp
+#, python-format
+msgid "Number of incoming transactions"
+msgstr "عدد المعاملات الوارده"
+
+#. module: exp_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.achievement_tran_report_temp
+msgid "Number of outgoing transactions"
+msgstr "عدد المعاملات الصادره"
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/achievement_transaction_report_wiz.py:166
+#, python-format
+msgid "Number of transactions issued"
+msgstr "عدد المعاملات الصادرة"
+
+#. module: exp_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.achievement_tran_report_temp
+msgid "Number of transactions referred from administration"
+msgstr "عدد المعاملات المحالة من الإدارة"
+
+#. module: exp_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.achievement_tran_report_temp
+msgid "Number of transactions referred to administration"
+msgstr "عدد المعاملات المحالة إلى الإدارة/الموظف"
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/achievement_transaction_report_wiz.py:170
+#, python-format
+msgid "Number of transactions referred to departament"
+msgstr "عدد المعاملات المحالة إلى الإدارة/الموظف"
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/achievement_transaction_report_wiz.py:168
+#, python-format
+msgid "Number of transactions transferred by departament"
+msgstr "عدد المعاملات المحالة من الادارة"
+
+#. module: exp_transaction_report
+#: selection:outgoing.transaction.report.wizard,type_transact:0
+#: selection:outstanding.transaction.report.wizard,type_transact:0
+msgid "Outgoing"
+msgstr "المعاملات الخارجيه الصادره"
+
+#. module: exp_transaction_report
+#: model:ir.actions.report,name:exp_transaction_report.out_transaction_complete_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_out_transaction_report
+msgid "Outgoing Transaction Report"
+msgstr "تقرير المعاملات الصادره"
+
+#. module: exp_transaction_report
+#: model:ir.actions.report,name:exp_transaction_report.outstanding_transaction_complete_report
+msgid "Outstanding Transaction Report"
+msgstr "تقرير المعاملات المسددة"
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_achievement_transaction_report_wizard
+msgid "Print Achievement Transaction Report"
+msgstr "طباعة تقرير المعاملات المنجزه"
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_close_transaction_report_wizard
+msgid "Print Close Transaction Report"
+msgstr "طباعة تقرير المعاملات المغلقة"
+
+#. module: exp_transaction_report
+#: model:ir.actions.act_window,name:exp_transaction_report.close_transaction_report_wiz
+#: model:ir.ui.menu,name:exp_transaction_report.close_transaction_report
+msgid "Print Close transaction Report"
+msgstr "طباعة تقرير المعاملات المغلقة"
+
+#. module: exp_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.achievement_transaction_report_wizard_view
+#: model:ir.ui.view,arch_db:exp_transaction_report.close_transaction_report_wizard_view
+msgid "Print Excel Report"
+msgstr "طباعة تقرير إكسل"
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_forward_transaction_report_wizard
+msgid "Print Forward Transaction Report"
+msgstr "طباعة تقرير المعاملات المحاله"
+
+#. module: exp_transaction_report
+#: model:ir.actions.act_window,name:exp_transaction_report.incoming_transaction_report_wiz
+#: model:ir.ui.menu,name:exp_transaction_report.incoming_transaction_report
+msgid "Print Incoming transaction Report"
+msgstr "طباعة تقرير المعاملات الوارده"
+
+#. module: exp_transaction_report
+#: model:ir.actions.act_window,name:exp_transaction_report.outgoing_transaction_report_wiz
+#: model:ir.ui.menu,name:exp_transaction_report.outgoing_transaction_report
+msgid "Print Outgoing transaction Report"
+msgstr "طباعة تقرير المعاملات الصادره"
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_outstanding_transaction_report_wizard
+msgid "Print Outstanding Transaction Report"
+msgstr "طباعة تقرير المعاملات المسدده"
+
+#. module: exp_transaction_report
+#: model:ir.actions.act_window,name:exp_transaction_report.outstanding_transaction_report_wiz
+#: model:ir.ui.menu,name:exp_transaction_report.outstanding_transaction_report
+msgid "Print Outstanding transaction Report"
+msgstr "طباعة تقرير المعاملات المسدده"
+
+#. module: exp_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.achievement_transaction_report_wizard_view
+#: model:ir.ui.view,arch_db:exp_transaction_report.close_transaction_report_wizard_view
+#: model:ir.ui.view,arch_db:exp_transaction_report.forward_transaction_report_wizard_view
+#: model:ir.ui.view,arch_db:exp_transaction_report.incoming_transaction_report_wizard_view
+#: model:ir.ui.view,arch_db:exp_transaction_report.late_transaction_report_wizard_view
+#: model:ir.ui.view,arch_db:exp_transaction_report.outgoing_transaction_report_wizard_view
+#: model:ir.ui.view,arch_db:exp_transaction_report.outstanding_transaction_report_wizard_view
+msgid "Print Report"
+msgstr "طباعة التقرير"
+
+#. module: exp_transaction_report
+#: model:ir.actions.act_window,name:exp_transaction_report.achievement_transaction_report_wiz
+#: model:ir.ui.menu,name:exp_transaction_report.achievement_transaction_report
+msgid "Print achievement transaction Report"
+msgstr "طباعة تقرير المعاملات المنجزه"
+
+#. module: exp_transaction_report
+#: model:ir.actions.act_window,name:exp_transaction_report.forward_transaction_report_wiz
+#: model:ir.ui.menu,name:exp_transaction_report.forward_transaction_report
+msgid "Print forward transaction Report"
+msgstr "طباعة تقرير المعاملات المحاله"
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_incoming_transaction_report_wizard
+msgid "Print incoming Transaction Report"
+msgstr "طباعة تقرير المعاملات الوارده"
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_late_transaction_report_wizard
+msgid "Print late Transaction Report"
+msgstr "طباعة تقرير المعاملات المتأخره"
+
+#. module: exp_transaction_report
+#: model:ir.actions.act_window,name:exp_transaction_report.late_transaction_report_wiz
+#: model:ir.ui.menu,name:exp_transaction_report.late_transaction_report
+msgid "Print late transaction Report"
+msgstr "طباعة تقرير المعاملات المتأخره"
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_outgoing_transaction_report_wizard
+msgid "Print outgoing Transaction Report"
+msgstr "طباعة تقرير المعاملات الصادره"
+
+#. module: exp_transaction_report
+#: model:ir.actions.report,name:exp_transaction_report.achievement_transaction_xls
+#: model:ir.actions.report,name:exp_transaction_report.close_transaction_xls
+msgid "Print to XLSX"
+msgstr "طباعة إكسل"
+
+#. module: exp_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.outstand_transaction_report_temp
+msgid "Process Transactions"
+msgstr "المعاملات ذات الصلة"
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/close_transaction_wiz.py:178
+#, python-format
+msgid "Reason for closure"
+msgstr "سبب الاغلاق"
+
+#. module: exp_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.outstand_transaction_report_temp
+msgid "Report outstanding Transaction"
+msgstr "تقرير المعاملات المسددة"
+
+#. module: exp_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.outstand_transaction_report_temp
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_out_transaction_report
+msgid "Send To"
+msgstr "الجهة الصادر إليها"
+
+#. module: exp_transaction_report
+#: model:ir.model.fields,field_description:exp_transaction_report.field_achievement_transaction_report_wizard_start_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_close_transaction_report_wizard_start_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_forward_transaction_report_wizard_start_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_incoming_transaction_report_wizard_start_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_late_transaction_report_wizard_start_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outgoing_transaction_report_wizard_start_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outstanding_transaction_report_wizard_start_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_transaction_common_report_start_date
+#: model:ir.ui.view,arch_db:exp_transaction_report.achievement_tran_report_temp
+#: model:ir.ui.view,arch_db:exp_transaction_report.outstand_transaction_report_temp
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_close_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_forw_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_incom_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_out_transaction_report
+msgid "Start Date"
+msgstr "تاريخ البدء"
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/achievement_transaction_report_wiz.py:185
+#: code:addons/exp_transaction_report/wizard/close_transaction_wiz.py:198
+#, python-format
+msgid "Start date"
+msgstr "تاريخ البدء"
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/close_transaction_wiz.py:174
+#: model:ir.ui.view,arch_db:exp_transaction_report.outstand_transaction_report_temp
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_close_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_forw_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_incom_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_out_transaction_report
+#, python-format
+msgid "Subject"
+msgstr "الموضوع"
+
+#. module: exp_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_close_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_forw_transaction_report
+msgid "Transaction Classification"
+msgstr "تصنيف المعاملة"
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_transaction_common_report
+msgid "Transaction Common Report"
+msgstr "تقرير المعامله المشترك"
+
+#. module: exp_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.outstand_transaction_report_temp
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_close_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_forw_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_incom_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_out_transaction_report
+msgid "Transaction Date"
+msgstr "تاريخ المعاملة"
+
+#. module: exp_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.outstand_transaction_report_temp
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_close_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_forw_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_incom_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_out_transaction_report
+msgid "Transaction Number"
+msgstr "رقم المعاملة"
+
+#. module: exp_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.common_transaction_report_wizard_view
+msgid "Transaction Report"
+msgstr "نقرير المعاملات"
+
+#. module: exp_transaction_report
+#: model:ir.model.fields,field_description:exp_transaction_report.field_achievement_transaction_report_wizard_type_transact
+#: model:ir.model.fields,field_description:exp_transaction_report.field_close_transaction_report_wizard_type_transact
+#: model:ir.model.fields,field_description:exp_transaction_report.field_forward_transaction_report_wizard_type_transact
+#: model:ir.model.fields,field_description:exp_transaction_report.field_incoming_transaction_report_wizard_type_transact
+#: model:ir.model.fields,field_description:exp_transaction_report.field_late_transaction_report_wizard_type_transact
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outgoing_transaction_report_wizard_type_transact
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outstanding_transaction_report_wizard_type_transact
+#: model:ir.model.fields,field_description:exp_transaction_report.field_transaction_common_report_type_transact
+msgid "Transaction Type"
+msgstr "نوع المعاملة"
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/close_transaction_wiz.py:168
+#, python-format
+msgid "Transaction classification"
+msgstr "تصنيف المعاملة"
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/close_transaction_wiz.py:170
+#, python-format
+msgid "Transaction number"
+msgstr "رقم المعاملة"
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/close_transaction_wiz.py:176
+#: model:ir.model.fields,field_description:exp_transaction_report.field_achievement_transaction_report_wizard_type
+#: model:ir.model.fields,field_description:exp_transaction_report.field_close_transaction_report_wizard_type
+#: model:ir.model.fields,field_description:exp_transaction_report.field_forward_transaction_report_wizard_type
+#: model:ir.model.fields,field_description:exp_transaction_report.field_incoming_transaction_report_wizard_type
+#: model:ir.model.fields,field_description:exp_transaction_report.field_late_transaction_report_wizard_type
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outgoing_transaction_report_wizard_type
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outstanding_transaction_report_wizard_type
+#: model:ir.model.fields,field_description:exp_transaction_report.field_transaction_common_report_type
+#: model:ir.ui.view,arch_db:exp_transaction_report.outstand_transaction_report_temp
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_close_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_forw_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_incom_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_out_transaction_report
+#, python-format
+msgid "Type"
+msgstr "النوع"
+
+#. module: exp_transaction_report
+#: selection:achievement.transaction.report.wizard,type:0
+#: selection:close.transaction.report.wizard,type:0
+#: selection:forward.transaction.report.wizard,type:0
+#: selection:incoming.transaction.report.wizard,type:0
+#: selection:late.transaction.report.wizard,type:0
+#: selection:outgoing.transaction.report.wizard,type:0
+#: selection:outstanding.transaction.report.wizard,type:0
+#: selection:transaction.common.report,type:0
+msgid "Unit"
+msgstr "الوحده"
+
+#. module: exp_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.achievement_transaction_report_wizard_view
+#: model:ir.ui.view,arch_db:exp_transaction_report.close_transaction_report_wizard_view
+#: model:ir.ui.view,arch_db:exp_transaction_report.forward_transaction_report_wizard_view
+#: model:ir.ui.view,arch_db:exp_transaction_report.incoming_transaction_report_wizard_view
+#: model:ir.ui.view,arch_db:exp_transaction_report.late_transaction_report_wizard_view
+#: model:ir.ui.view,arch_db:exp_transaction_report.outgoing_transaction_report_wizard_view
+#: model:ir.ui.view,arch_db:exp_transaction_report.outstanding_transaction_report_wizard_view
+msgid "or"
+msgstr "أو"
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_report_exp_transaction_report_achievement_tran_report_temp
+msgid "report.exp_transaction_report.achievement_tran_report_temp"
+msgstr "report.exp_transaction_report.achievement_tran_report_temp"
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_report_exp_transaction_report_achievement_transaction_xls
+msgid "report.exp_transaction_report.achievement_transaction_xls"
+msgstr "report.exp_transaction_report.achievement_transaction_xls"
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_report_exp_transaction_report_close_transaction_report
+msgid "report.exp_transaction_report.close_transaction_report"
+msgstr "report.exp_transaction_report.close_transaction_report"
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_report_exp_transaction_report_close_transaction_xls
+msgid "report.exp_transaction_report.close_transaction_xls"
+msgstr "report.exp_transaction_report.close_transaction_xls"
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_report_exp_transaction_report_outstand_transaction_report_temp
+msgid "report.exp_transaction_report.outstand_transaction_report_temp"
+msgstr "report.exp_transaction_report.outstand_transaction_report_temp"
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_report_exp_transaction_report_outstanding_transaction_report
+msgid "report.exp_transaction_report.outstanding_transaction_report"
+msgstr "report.exp_transaction_report.outstanding_transaction_report"
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_report_exp_transaction_report_template_close_transaction_report
+msgid "report.exp_transaction_report.template_close_transaction_report"
+msgstr "report.exp_transaction_report.template_close_transaction_report"
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_report_exp_transaction_report_template_forw_transaction_report
+msgid "report.exp_transaction_report.template_forw_transaction_report"
+msgstr "report.exp_transaction_report.template_forw_transaction_report"
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_report_exp_transaction_report_template_incom_transaction_report
+msgid "report.exp_transaction_report.template_incom_transaction_report"
+msgstr "report.exp_transaction_report.template_incom_transaction_report"
+
+#. module: exp_transaction_report
+#: model:ir.model,name:exp_transaction_report.model_report_exp_transaction_report_template_out_transaction_report
+msgid "report.exp_transaction_report.template_out_transaction_report"
+msgstr "report.exp_transaction_report.template_out_transaction_report"
+
+#. module: exp_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_forw_transaction_report
+msgid "From"
+msgstr "من"
+
+#. module: exp_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_forw_transaction_report
+msgid "forward Date"
+msgstr "تاريخ الإحالة"
+
+#. module: exp_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.achievement_tran_report_temp
+msgid "Achievement Report"
+msgstr "تقرير الإنجاز"
+
+#. module: exp_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.custom_external_layout_standard_all
+msgid "Page: / "
+msgstr "الصفحة: / "
+
+#. module: exp_transaction_report
+#: model:ir.actions.report,name:exp_transaction_report.late_transaction_complete_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_late_transaction_report
+msgid "Late Transaction Report"
+msgstr "تقرير المعاملات المتأخره"
+
+#. module: exp_transaction_report
+#: model:ir.model.fields,field_description:exp_transaction_report.field_achievement_transaction_report_wizard_start_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_close_transaction_report_wizard_start_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_forward_transaction_report_wizard_start_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_incoming_transaction_report_wizard_start_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_late_transaction_report_wizard_start_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outgoing_transaction_report_wizard_start_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_outstanding_transaction_report_wizard_start_date
+#: model:ir.model.fields,field_description:exp_transaction_report.field_transaction_common_report_start_date
+#: model:ir.ui.view,arch_db:exp_transaction_report.achievement_tran_report_temp
+#: model:ir.ui.view,arch_db:exp_transaction_report.outstand_transaction_report_temp
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_close_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_forw_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_incom_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_late_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_out_transaction_report
+msgid "Start Date"
+msgstr "تاريخ البدء"
+
+#. module: exp_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.outstand_transaction_report_temp
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_close_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_forw_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_incom_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_late_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_out_transaction_report
+msgid "Transaction Number"
+msgstr "رقم المعاملة"
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/close_transaction_wiz.py:179
+#: model:ir.ui.view,arch_db:exp_transaction_report.outstand_transaction_report_temp
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_close_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_forw_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_incom_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_late_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_out_transaction_report
+#, python-format
+msgid "Subject"
+msgstr "الموضوع"
+
+#. module: exp_transaction_report
+#: code:addons/exp_transaction_report/wizard/close_transaction_wiz.py:181
+#: model:ir.ui.view,arch_db:exp_transaction_report.outstand_transaction_report_temp
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_close_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_forw_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_incom_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_late_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_out_transaction_report
+#, python-format
+msgid "Type"
+msgstr "نوع المعاملة"
+
+#. module: exp_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.outstand_transaction_report_temp
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_close_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_forw_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_incom_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_late_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_out_transaction_report
+msgid "Transaction Date"
+msgstr "تاريخ المعاملة"
+
+#. module: exp_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_late_transaction_report
+msgid "Due Date"
+msgstr "تاريخ الانتهاء"
+
+#. module: exp_transaction_report
+#: model:ir.ui.view,arch_db:exp_transaction_report.template_late_transaction_report
+msgid "Going To"
+msgstr "الجهة الموجوده فيها المعامله حاليا"
diff --git a/odex25_transactions/exp_transaction_report/models/__init__.py b/odex25_transactions/exp_transaction_report/models/__init__.py
new file mode 100644
index 000000000..40a96afc6
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/models/__init__.py
@@ -0,0 +1 @@
+# -*- coding: utf-8 -*-
diff --git a/odex25_transactions/exp_transaction_report/report/achievement_transaction_report_template.xml b/odex25_transactions/exp_transaction_report/report/achievement_transaction_report_template.xml
new file mode 100644
index 000000000..f6db51f96
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/report/achievement_transaction_report_template.xml
@@ -0,0 +1,147 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Achievement Report
+
+
+
Start Date
+
+
+ End Date
+
+
+
+
+
+
+
+
+ #
+
+
+ Administration/Employee
+
+
+ Number of incoming transactions
+
+
+ Number of outgoing transactions
+
+
+ Number of transactions referred from administration
+
+
+ Number of transactions referred to administration
+
+
+ Number of closed transactions
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_report/report/close_transaction_report_template.xml b/odex25_transactions/exp_transaction_report/report/close_transaction_report_template.xml
new file mode 100644
index 000000000..9f6385731
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/report/close_transaction_report_template.xml
@@ -0,0 +1,121 @@
+
+
+
+
+
+
+
+
+
Closed Transaction Report
+
+
+
Start Date
+
+
+ End Date
+
+
+
+
+
+
+
+
+
+
+
+ #
+
+
+ Transaction Classification
+
+
+ Transaction Number
+
+
+ Transaction Date
+
+
+ Subject
+
+
+ Type
+
+
+ Cause of closure
+
+
+ Closure Date
+
+
+ Notes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_report/report/forward_transaction_report_template.xml b/odex25_transactions/exp_transaction_report/report/forward_transaction_report_template.xml
new file mode 100644
index 000000000..bce2f2a77
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/report/forward_transaction_report_template.xml
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
Forward Transaction Report
+
+
+
Start Date
+
+
+ End Date
+
+
+
+
+
+
+
+
+
+
+
+ #
+
+
+ Transaction Classification
+
+
+ Transaction Number
+
+
+ Transaction Date
+
+
+ Subject
+
+
+ Type
+
+
+ From
+
+
+ Cause of forward
+
+
+ forward Date
+
+
+ Notes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_report/report/incoming_transaction_report_template.xml b/odex25_transactions/exp_transaction_report/report/incoming_transaction_report_template.xml
new file mode 100644
index 000000000..5a9273d8f
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/report/incoming_transaction_report_template.xml
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
Incoming Transaction Report
+
+
+
Start Date
+
+
+ End Date
+
+
+
+
+
+
+
+
+
+
+
+ #
+
+
+ Transaction Number
+
+
+ Transaction Date
+
+
+ Subject
+
+
+ Type
+
+
+ Incoming From
+
+
+ Going To
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_report/report/late_transaction_report_template.xml b/odex25_transactions/exp_transaction_report/report/late_transaction_report_template.xml
new file mode 100644
index 000000000..fda631a2c
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/report/late_transaction_report_template.xml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
Late Transaction Report
+
+
+
Start Date
+
+
+
+
+
+
+
+
+
+
+
+ #
+
+
+ Transaction Number
+
+
+ Subject
+
+
+ Type
+
+
+ Transaction Date
+
+
+ Due Date
+
+
+ Going To
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_report/report/outgoing_transaction_report_template.xml b/odex25_transactions/exp_transaction_report/report/outgoing_transaction_report_template.xml
new file mode 100644
index 000000000..241f92fa4
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/report/outgoing_transaction_report_template.xml
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+
+
+
Outgoing Transaction Report
+
+
+
Start Date
+
+
+ End Date
+
+
+
+
+
+
+
+
+
+
+
+ #
+
+
+ Transaction Number
+
+
+ Transaction Date
+
+
+ Subject
+
+
+ Type
+
+
+ Send To
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_report/report/outstanding_transaction_report_template.xml b/odex25_transactions/exp_transaction_report/report/outstanding_transaction_report_template.xml
new file mode 100644
index 000000000..9adf33a16
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/report/outstanding_transaction_report_template.xml
@@ -0,0 +1,150 @@
+
+
+
+
+
+
+
+
+
Report outstanding Transaction
+
+
+
+
+
+
+
Start Date
+
+
+ End Date
+
+
+
+
+
+
+
+
+
+
+
+ #
+
+
+ Transaction Number
+
+
+ Transaction Date
+
+
+ Subject
+
+
+ Type
+
+
+ Send To
+
+
+ Process Transactions
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #
+
+
+ Transaction Number
+
+
+ Transaction Date
+
+
+ Subject
+
+
+ Type
+
+
+ Send To
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_report/security/ir.model.access.csv b/odex25_transactions/exp_transaction_report/security/ir.model.access.csv
new file mode 100644
index 000000000..5291ef146
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/security/ir.model.access.csv
@@ -0,0 +1,9 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_transaction_common_report,access_transaction_common_report,model_transaction_common_report,exp_transaction_documents.group_cm_employee_group,1,1,1,1
+access_close_transaction_report_wizard,access_close_transaction_report_wizard,model_close_transaction_report_wizard,exp_transaction_documents.group_cm_employee_group,1,1,1,1
+access_forward_transaction_report_wizard,access_forward_transaction_report_wizard,model_forward_transaction_report_wizard,exp_transaction_documents.group_cm_employee_group,1,1,1,1
+access_incoming_transaction_report_wizard,access_incoming_transaction_report_wizard,model_incoming_transaction_report_wizard,exp_transaction_documents.group_cm_employee_group,1,1,1,1
+access_late_transaction_report_wizard,access_late_transaction_report_wizard,model_late_transaction_report_wizard,exp_transaction_documents.group_cm_employee_group,1,1,1,1
+access_outgoing_transaction_report_wizard,access_outgoing_transaction_report_wizard,model_outgoing_transaction_report_wizard,exp_transaction_documents.group_cm_employee_group,1,1,1,1
+access_outstanding_transaction_report_wizard,access_outstanding_transaction_report_wizard,model_outstanding_transaction_report_wizard,exp_transaction_documents.group_cm_employee_group,1,1,1,1
+access_achievement_transaction_report_wizard,access_achievement_transaction_report_wizard,model_achievement_transaction_report_wizard,exp_transaction_documents.group_cm_employee_group,1,1,1,1
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_report/static/fonts/ae_AlMohanad.ttf b/odex25_transactions/exp_transaction_report/static/fonts/ae_AlMohanad.ttf
new file mode 100644
index 000000000..bdd7360e1
Binary files /dev/null and b/odex25_transactions/exp_transaction_report/static/fonts/ae_AlMohanad.ttf differ
diff --git a/odex25_transactions/exp_transaction_report/wizard/__init__.py b/odex25_transactions/exp_transaction_report/wizard/__init__.py
new file mode 100644
index 000000000..72b8c322d
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/wizard/__init__.py
@@ -0,0 +1,9 @@
+# -*- coding: utf-8 -*-
+from . import transaction_common_report
+from . import close_transaction_wiz
+from . import forward_transaction_report_wiz
+from . import incoming_transaction_report_wiz
+from . import late_transaction_report_wiz
+from . import outgoing_transaction_report_wiz
+from . import outstanding_transaction_report_wiz
+from . import achievement_transaction_report_wiz
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_report/wizard/achievement_transaction_report_view_wiz.xml b/odex25_transactions/exp_transaction_report/wizard/achievement_transaction_report_view_wiz.xml
new file mode 100644
index 000000000..17ab0a2aa
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/wizard/achievement_transaction_report_view_wiz.xml
@@ -0,0 +1,38 @@
+
+
+
+
+ achievement Transaction
+ achievement.transaction.report.wizard
+
+
+
+ 1
+ 0
+
+
+
+
+
+
+
+ Print achievement transaction Report
+ ir.actions.act_window
+ achievement.transaction.report.wizard
+
+ form
+
+ new
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_report/wizard/achievement_transaction_report_wiz.py b/odex25_transactions/exp_transaction_report/wizard/achievement_transaction_report_wiz.py
new file mode 100644
index 000000000..219c222bb
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/wizard/achievement_transaction_report_wiz.py
@@ -0,0 +1,193 @@
+# -*- coding: utf-8 -*-
+import collections
+import datetime
+from odoo import api, fields, models,_
+# from odoo.exceptions import ValidationError
+from odoo.exceptions import UserError
+
+
+class AchievementTransactionReportWizard(models.TransientModel):
+ _name = 'achievement.transaction.report.wizard'
+ _inherit = "transaction.common.report"
+ _description = 'Print Achievement Transaction Report'
+
+
+ def print_report(self):
+ data = {
+ 'ids': self.ids,
+ 'model': self._name,
+ 'form': {
+ 'type': self.type,
+ 'entity_ids': self.entity_ids.ids,
+ 'start_date': self.start_date,
+ 'end_date': self.end_date,
+ },
+ }
+ return self.env.ref('exp_transaction_report.achievement_transaction_complete_report').report_action(self, data=data)
+
+
+ def print_excel_report(self):
+ data = {
+ 'ids': self.ids,
+ 'model': self._name,
+ 'form': {
+ 'type': self.type,
+ 'entity_ids': self.entity_ids.ids,
+ 'start_date': self.start_date,
+ 'end_date': self.end_date,
+ },
+ }
+ return self.env.ref('exp_transaction_report.achievement_transaction_xls').report_action(self, data=data, config=False)
+
+
+class ReportAchievementTransaction(models.AbstractModel):
+ _name = 'report.exp_transaction_report.achievement_tran_report_temp'
+
+ def get_value(self, data, flag):
+ type = data['form']['type']
+ entity_ids = data['form']['entity_ids']
+ start_date = data['form']['start_date']
+ end_date = data['form']['end_date']
+ docs = []
+ x = False
+ employee_ids = ''
+ data = {'unit': [], 'total_from': {}, 'total_to': {}, 'total_transfer_from': {}, 'total_transfer_to': {},
+ 'total_closed': {}}
+ if type == 'unit':
+ employee_ids = self.env['cm.entity'].search([('parent_id', 'in', entity_ids)])
+ else:
+ employee_ids = self.env['cm.entity'].browse(entity_ids)
+ for employee in employee_ids:
+ total_from = 0
+ total_to = 0
+ transfered_from = 0
+ transfered_to = 0
+ closed = 0
+ from_ids = self.env['internal.transaction'].search(
+ [('employee_id', '=', employee.id), ('transaction_date', '>=', start_date),
+ ('transaction_date', '<=', end_date)])
+ to_ids = self.env['internal.transaction'].search(
+ [('to_ids', '=', employee.id), ('transaction_date', '>=', start_date),
+ ('transaction_date', '<=', end_date)])
+ transfer_from_ids = self.env['cm.transaction.trace'].search([('from_id', '=', employee.id),
+ ('action', '=', 'forward'),
+ ('date', '>=', start_date),
+ ('date', '<=', end_date)])
+ transfer_to_ids = self.env['cm.transaction.trace'].search([('to_id', '=', employee.id),
+ ('action', '=', 'forward'),
+ ('date', '>=', start_date),
+ ('date', '<=', end_date)])
+ closed_ids = self.env['cm.transaction.trace'].search([('from_id', '=', employee.id),
+ ('action', '=', 'archive'),
+ ('date', '>=', start_date),
+ ('date', '<=', end_date)], order="date desc")
+ total_from += len(from_ids)
+ total_to += len(to_ids)
+ transfered_from += len(transfer_from_ids)
+ transfered_to += len(transfer_to_ids)
+ y = []
+ for close in closed_ids:
+ if close.internal_transaction_id.state == 'closed':
+ t_obj = self.env['cm.transaction.trace'].search([('internal_transaction_id', '=', close.internal_transaction_id.id),
+ ('action', '=', 'archive')], order="date desc", limit=1)
+
+ if t_obj.from_id.id == employee.id:
+ if close.internal_transaction_id.id not in y:
+ y.append(close.internal_transaction_id.id)
+ closed += len(y)
+ if type == 'unit':
+ name = employee.parent_id.name
+ if employee.parent_id not in data['unit']:
+ data['unit'].append(employee.parent_id)
+ else:
+ name = employee.name
+ if employee not in data['unit']:
+ data['unit'].append(employee)
+ if name not in data['total_from']:
+ data['total_from'][name] = total_from
+ else:
+ data['total_from'][name] += total_from
+ if name not in data['total_to']:
+ data['total_to'][name] = total_to
+ else:
+ data['total_to'][name] += total_to
+ # transfer
+ if name not in data['total_transfer_from']:
+ data['total_transfer_from'][name] = transfered_from
+ else:
+ data['total_transfer_from'][name] += transfered_from
+ if name not in data['total_transfer_to']:
+ data['total_transfer_to'][name] = transfered_to
+ else:
+ data['total_transfer_to'][name] += transfered_to
+ if name not in data['total_closed']:
+ data['total_closed'][name] = closed
+ else:
+ data['total_closed'][name] += closed
+ return data
+
+ @api.model
+ def _get_report_values(self, docids, data=None):
+ final_dic = self.get_value(data, 'pdf')
+ start_date = data['form']['start_date']
+ end_date = data['form']['end_date']
+ # edit by fatma rida to make warning message if no data
+ if final_dic:
+ return {
+ 'doc_ids': data['ids'],
+ 'doc_model': data['model'],
+ 'date_start': start_date,
+ 'date_end': end_date,
+ 'data': final_dic,
+ }
+ else:
+ raise UserError(_("""No data for your selection\n"""))
+
+
+class AchievementReportXls(models.AbstractModel):
+ _name = 'report.exp_transaction_report.achievement_transaction_xls'
+ _inherit = 'report.report_xlsx.abstract'
+
+ def generate_xlsx_report(self, workbook, data, datas):
+ x = self.env['report.exp_transaction_report.template_close_transaction_report']
+ final_dic = ReportAchievementTransaction.get_value(x, data, 'excel')
+ start_date = data['form']['start_date']
+ end_date = data['form']['end_date']
+ sheet = workbook.add_worksheet(U'duration report')
+ sheet.right_to_left()
+ format2 = workbook.add_format(
+ {'font_size': 10, 'bottom': True, 'right': True, 'left': True, 'top': True, 'align': 'center',
+ 'bold': True})
+ format2.set_align('center')
+ format2.set_align('vcenter')
+
+ sheet.merge_range('D3:G3', _("Compilation Report"), format2)
+
+ sheet.write(6, 2, '#', format2)
+ sheet.write(6, 3, _("Department/Employee"), format2)
+ sheet.set_column('C:C', 10)
+ sheet.write(6, 4, _("Number of incoming transactions"), format2)
+ sheet.set_column('D:D', 20)
+ sheet.write(6, 5, _("Number of transactions issued"), format2)
+ sheet.set_column('E:E', 20)
+ sheet.write(6, 6, _("Number of transactions transferred by departament"), format2)
+ sheet.set_column('F:F', 25)
+ sheet.write(6, 7, _("Number of transactions referred to departament"), format2)
+ sheet.set_column('G:G', 25)
+ sheet.write(6, 8, _("Number of closed transactions"), format2)
+ sheet.set_column('H:H', 25)
+ row = 6
+ for index, line in enumerate(final_dic['unit']):
+ row += 1
+ sheet.write(row, 2, index + 1, format2)
+ sheet.write(row, 3, line.name, format2)
+ sheet.write(row, 4, final_dic['total_to'][line.name], format2)
+ sheet.write(row, 5, final_dic['total_from'][line.name], format2)
+ sheet.write(row, 6, final_dic['total_transfer_from'][line.name], format2)
+ sheet.write(row, 7, final_dic['total_transfer_to'][line.name], format2)
+ sheet.write(row, 8, final_dic['total_closed'][line.name], format2)
+
+ sheet.merge_range('A4:C4', _("Start date"), format2)
+ sheet.merge_range('A5:C5', _("End date"), format2)
+ sheet.write(3, 3, str(start_date)[0:10], format2)
+ sheet.write(4, 3, str(end_date)[0:10], format2)
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_report/wizard/close_transaction_view_wiz.xml b/odex25_transactions/exp_transaction_report/wizard/close_transaction_view_wiz.xml
new file mode 100644
index 000000000..4f2516d94
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/wizard/close_transaction_view_wiz.xml
@@ -0,0 +1,35 @@
+
+
+
+
+ Close Transaction
+ close.transaction.report.wizard
+
+
+
+
+
+
+
+
+ Print Close transaction Report
+ ir.actions.act_window
+ close.transaction.report.wizard
+
+ form
+
+ new
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_report/wizard/close_transaction_wiz.py b/odex25_transactions/exp_transaction_report/wizard/close_transaction_wiz.py
new file mode 100644
index 000000000..5ca5c959f
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/wizard/close_transaction_wiz.py
@@ -0,0 +1,210 @@
+# -*- coding: utf-8 -*-
+import collections
+import datetime
+
+from odoo import api,models,_
+# from odoo.exceptions import ValidationError
+from odoo.exceptions import UserError
+
+
+class CloseTransactionReportWizard(models.TransientModel):
+ _name = 'close.transaction.report.wizard'
+ _inherit = "transaction.common.report"
+ _description = 'Print Close Transaction Report'
+
+
+ def print_report(self):
+ data = {
+ 'ids': self.ids,
+ 'model': self._name,
+ 'form': {
+ 'type': self.type,
+ 'type_transact': self.type_transact,
+ 'entity_ids': self.entity_ids.ids,
+ 'start_date': self.start_date,
+ 'end_date': self.end_date,
+ },
+ }
+ return self.env.ref('exp_transaction_report.close_transaction_complete_report').report_action(self, data=data)
+
+
+ def print_excel_report(self):
+ data = {
+ 'ids': self.ids,
+ 'model': self._name,
+ 'form': {
+ 'type': self.type,
+ 'type_transact': self.type_transact,
+ 'entity_ids': self.entity_ids.ids,
+ 'start_date': self.start_date,
+ 'end_date': self.end_date,
+ },
+ }
+ return self.env.ref('exp_transaction_report.close_transaction_xls').report_action(self, data=data, config=False)
+
+
+class ReportCloseTransaction(models.AbstractModel):
+
+ _name = 'report.exp_transaction_report.template_close_transaction_report'
+
+ def set_docs_dic(self, transaction, name, flag, unit, type):
+ unit_name = unit.name
+ if type == 'unit':
+ unit_name = unit.parent_id.name
+ # rec = transaction.trace_ids.filtered(lambda z: z.action == 'archive')[0]
+ lang = self.env.user.lang
+ trans = ''
+ if name == 'Internal':
+ trans = transaction.internal_transaction_id
+ if name == 'Incoming':
+ trans = transaction.incoming_transaction_id
+ date = transaction.date
+ if lang == 'ar_SY' and name == 'Internal':
+ name = 'داخلية'
+ elif lang == 'ar_SY' and name == 'Incoming':
+ name = 'واردة'
+ if flag == 'pdf':
+ date = datetime.datetime.strptime(str(transaction.date), '%Y-%m-%d %H:%M:%S').date()
+ dic = {
+ 'classification': name,
+ 'name': trans.name,
+ 'subject': trans.subject,
+ 'type': trans.subject_type_id.name,
+ 'transaction_date': trans.transaction_date,
+ 'archive': transaction.archive_type_id.name,
+ 'date': date,
+ 'note': transaction.note,
+ 'unit': unit_name,
+ }
+ return dic
+
+ def get_value(self, data, flag):
+ type = data['form']['type']
+ type_transact = data['form']['type_transact']
+ entity_ids = data['form']['entity_ids']
+ start_date = data['form']['start_date']
+ end_date = data['form']['end_date']
+ docs = []
+ x = False
+ domain = []
+ if type == 'unit':
+ emp_ids = self.env['cm.entity'].search([('parent_id', 'in', entity_ids)]).ids
+ domain.append(('from_id', 'in', emp_ids))
+ elif type == 'employee':
+ domain.append(('from_id', 'in', entity_ids))
+ domain.extend((('action', '=', 'archive'), ('date', '>=', start_date),
+ ('date', '<=', end_date)))
+ if type_transact == 'internal':
+ x = self.env['cm.transaction.trace'].search(domain, order="date desc")
+ if x:
+ for rec in x:
+ if rec.internal_transaction_id:
+ dic = self.set_docs_dic(rec, 'Internal', flag, rec.from_id, type)
+ docs.append(dic)
+ elif type_transact == 'incoming':
+ x = self.env['cm.transaction.trace'].search(domain, order="date desc")
+ if x:
+ for rec in x:
+ if rec.incoming_transaction_id:
+ dic = self.set_docs_dic(rec, 'Incoming', flag, rec.from_id, type)
+ docs.append(dic)
+ else:
+ internal_ids = self.env['cm.transaction.trace'].search(domain, order="date desc")
+ if internal_ids:
+ for rec in internal_ids:
+ if rec.internal_transaction_id:
+ dic = self.set_docs_dic(rec, 'Internal', flag, rec.from_id, type)
+ docs.append(dic)
+ incoming_ids = self.env['cm.transaction.trace'].search(domain, order="date desc")
+ if incoming_ids:
+ for rec in incoming_ids:
+ if rec.incoming_transaction_id:
+ dic = self.set_docs_dic(rec, 'Incoming', flag, rec.from_id, type)
+ docs.append(dic)
+ final_dic = {}
+ key_list = []
+ grouped = collections.defaultdict(list)
+ for item in docs:
+ grouped[item['unit']].append(item)
+ for key, value in grouped.items():
+ final_dic[key] = list(value)
+ key_list.append(key)
+ my_key = list(dict.fromkeys(key_list))
+ return final_dic, my_key
+
+ @api.model
+ def _get_report_values(self, docids, data=None):
+ final_dic, my_key = self.get_value(data, 'pdf')
+ start_date = data['form']['start_date']
+ end_date = data['form']['end_date']
+ if my_key:
+ return {
+ 'doc_ids': data['ids'],
+ 'doc_model': data['model'],
+ 'date_start': start_date,
+ 'date_end': end_date,
+ 'group_dic': final_dic,
+ 'key': my_key,
+ }
+ else:
+ raise UserError(_("""No data for your selection\n"""))
+
+
+class CloseReportXls(models.AbstractModel):
+ _name = 'report.exp_transaction_report.close_transaction_xls'
+ _inherit = 'report.report_xlsx.abstract'
+
+ def generate_xlsx_report(self, workbook, data, datas):
+ x = self.env['report.exp_transaction_report.template_close_transaction_report']
+ final_dic, key = ReportCloseTransaction.get_value(x, data, 'excel')
+ start_date = data['form']['start_date']
+ end_date = data['form']['end_date']
+ sheet = workbook.add_worksheet(_("Close Transactions Report"))
+ sheet.right_to_left()
+ format2 = workbook.add_format(
+ {'font_size': 10, 'bottom': True, 'right': True, 'left': True, 'top': True,
+ 'align': 'center',
+ 'bold': True})
+ format2.set_align('center')
+ format2.set_align('vcenter')
+
+ sheet.merge_range('D3:G3', _("Close Transactions Report"), format2)
+ row = 6
+ for line in key:
+ sheet.write(row + 2, 2, line, format2)
+ row += 3
+ sheet.write(row, 2, '#', format2)
+ sheet.write(row, 3, _("Transaction classification"), format2)
+ sheet.set_column('C:C', 10)
+ sheet.write(row, 4, _("Transaction number"), format2)
+ sheet.set_column('D:D', 20)
+ sheet.write(row, 5, _("Date of transaction"), format2)
+ sheet.set_column('E:E', 20)
+ sheet.write(row, 6, _("Subject"), format2)
+ sheet.set_column('F:F', 25)
+ sheet.write(row, 7, _("Type"), format2)
+ sheet.set_column('G:G', 25)
+ sheet.write(row, 8, _("Reason for closure"), format2)
+ sheet.set_column('H:H', 25)
+ sheet.write(row, 9, _("Closing date"), format2)
+ sheet.set_column('I:I', 25)
+ sheet.write(row, 10, _("Notes"), format2)
+ sheet.set_column('J:J', 25)
+ z = 0
+ for x in final_dic[line]:
+ row += 1
+ z += 1
+ sheet.write(row, 2, z, format2)
+ sheet.write(row, 3, x['classification'], format2)
+ sheet.write(row, 4, x['name'], format2)
+ sheet.write(row, 5, x['transaction_date'][0:10], format2)
+ sheet.write(row, 6, x['subject'], format2)
+ sheet.write(row, 7, x['type'], format2)
+ sheet.write(row, 8, x['archive'], format2)
+ sheet.write(row, 9, x['date'][0:10], format2)
+ sheet.write(row, 10, x['note'], format2)
+
+ sheet.merge_range('A4:C4', _("Start date"), format2)
+ sheet.merge_range('A5:C5', _("End date"), format2)
+ sheet.write(3, 3, str(start_date)[0:10], format2)
+ sheet.write(4, 3, str(end_date)[0:10], format2)
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_report/wizard/forward_transaction_report_wiz.py b/odex25_transactions/exp_transaction_report/wizard/forward_transaction_report_wiz.py
new file mode 100644
index 000000000..1c574ed0d
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/wizard/forward_transaction_report_wiz.py
@@ -0,0 +1,138 @@
+# -*- coding: utf-8 -*-
+import collections
+import datetime
+
+from odoo import api, fields, models,_
+# from odoo.exceptions import ValidationError
+from odoo.exceptions import UserError
+
+
+class ForwardTransactionReportWizard(models.TransientModel):
+ _name = 'forward.transaction.report.wizard'
+ _inherit = "transaction.common.report"
+ _description = 'Print Forward Transaction Report'
+
+
+ def print_report(self):
+ data = {
+ 'ids': self.ids,
+ 'model': self._name,
+ 'form': {
+ 'type': self.type,
+ 'type_transact': self.type_transact,
+ 'entity_ids': self.entity_ids.ids,
+ 'start_date': self.start_date,
+ 'end_date': self.end_date,
+ },
+ }
+ return self.env.ref('exp_transaction_report.forward_transaction_complete_report').report_action(self, data=data)
+
+
+class ReportForwardTransaction(models.AbstractModel):
+ _name = 'report.exp_transaction_report.template_forw_transaction_report'
+
+ def set_docs_dic(self, transaction, name, flag, unit, type):
+ unit_name = unit.name
+ if type == 'unit':
+ unit_name = unit.parent_id.name
+ # rec = transaction.trace_ids.filtered(lambda z: z.action == 'archive')[0]
+ lang = self.env.user.lang
+ trans = ''
+ if name == 'Internal':
+ trans = transaction.internal_transaction_id
+ if name == 'Incoming':
+ trans = transaction.incoming_transaction_id
+ date = transaction.date
+ if flag == 'pdf':
+ date = datetime.datetime.strptime(str(transaction.date), '%Y-%m-%d %H:%M:%S').date()
+ if lang == 'ar_SY' and name == 'Internal':
+ name = 'داخلية'
+ elif lang == 'ar_SY' and name == 'Incoming':
+ name = 'واردة'
+ dic = {
+ 'classification': name,
+ 'name': trans.name,
+ 'subject': trans.subject,
+ 'type': trans.subject_type_id.name,
+ 'transaction_date': trans.transaction_date,
+ 'action': transaction.procedure_id.name,
+ 'date': date,
+ 'form': unit.name,
+ 'note': transaction.note,
+ 'unit': unit_name,
+ }
+ return dic
+
+ def get_value(self, data, flag):
+ type = data['form']['type']
+ type_transact = data['form']['type_transact']
+ entity_ids = data['form']['entity_ids']
+ start_date = data['form']['start_date']
+ end_date = data['form']['end_date']
+ docs = []
+ x = False
+ domain = []
+ if type == 'unit':
+ emp_ids = self.env['cm.entity'].search([('parent_id', 'in', entity_ids), ('type', '=', 'employee')]).ids
+ domain.append(('from_id', 'in', emp_ids))
+ elif type == 'employee':
+ domain.append(('from_id', 'in', entity_ids))
+ domain.extend((('action', 'in', ['forward', 'reply']), ('date', '>=', start_date),
+ ('date', '<=', end_date)))
+ if type_transact == 'internal':
+ x = self.env['cm.transaction.trace'].search(domain, order="date desc")
+ if x:
+ for rec in x:
+ if rec.internal_transaction_id:
+ dic = self.set_docs_dic(rec, 'Internal', flag, rec.from_id, type)
+ docs.append(dic)
+ elif type_transact == 'incoming':
+ x = self.env['cm.transaction.trace'].search(domain, order="date desc")
+ if x:
+ for rec in x:
+ if rec.incoming_transaction_id:
+ dic = self.set_docs_dic(rec, 'Incoming', flag, rec.from_id, type)
+ docs.append(dic)
+ else:
+ internal_ids = self.env['cm.transaction.trace'].search(domain, order="date desc")
+ if internal_ids:
+ for rec in internal_ids:
+ if rec.internal_transaction_id:
+ dic = self.set_docs_dic(rec, 'Internal', flag, rec.from_id, type)
+ docs.append(dic)
+ incoming_ids = self.env['cm.transaction.trace'].search(domain, order="date desc")
+ if incoming_ids:
+ for rec in incoming_ids:
+ if rec.incoming_transaction_id:
+ dic = self.set_docs_dic(rec, 'Incoming', flag, rec.from_id, type)
+ docs.append(dic)
+ final_dic = {}
+ key_list = []
+ grouped = collections.defaultdict(list)
+ for item in docs:
+ grouped[item['unit']].append(item)
+ for key, value in grouped.items():
+ final_dic[key] = list(value)
+ key_list.append(key)
+ my_key = list(dict.fromkeys(key_list))
+ return final_dic, my_key
+
+ @api.model
+ def _get_report_values(self, docids, data=None):
+ final_dic, my_key = self.get_value(data, 'pdf')
+ start_date = data['form']['start_date']
+ end_date = data['form']['end_date']
+ # edit by fatma rida to make warning message if no data
+ if my_key:
+ return {
+ 'doc_ids': data['ids'],
+ 'doc_model': data['model'],
+ 'date_start': start_date,
+ 'date_end': end_date,
+ 'group_dic': final_dic,
+ 'key': my_key,
+ }
+ else:
+ raise UserError(_("""No data for your selection\n"""))
+
+
diff --git a/odex25_transactions/exp_transaction_report/wizard/forward_transaction_report_wiz_view.xml b/odex25_transactions/exp_transaction_report/wizard/forward_transaction_report_wiz_view.xml
new file mode 100644
index 000000000..5d139727e
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/wizard/forward_transaction_report_wiz_view.xml
@@ -0,0 +1,33 @@
+
+
+
+
+ Forward Transaction
+ forward.transaction.report.wizard
+
+
+
+
+
+
+
+
+
+ Print forward transaction Report
+ ir.actions.act_window
+ forward.transaction.report.wizard
+
+ form
+
+ new
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_report/wizard/incoming_transaction_report_wiz.py b/odex25_transactions/exp_transaction_report/wizard/incoming_transaction_report_wiz.py
new file mode 100644
index 000000000..5f8a4dd7c
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/wizard/incoming_transaction_report_wiz.py
@@ -0,0 +1,157 @@
+# -*- coding: utf-8 -*-
+import datetime
+import collections
+from odoo import api, fields, models, _
+
+
+# from odoo.exceptions import ValidationError
+from odoo.exceptions import UserError
+
+
+class IncomingTransactionReportWizard(models.TransientModel):
+ _name = 'incoming.transaction.report.wizard'
+ _inherit = "transaction.common.report"
+ _description = 'Print incoming Transaction Report'
+
+
+ def print_report(self):
+ data = {
+ 'ids': self.ids,
+ 'model': self._name,
+ 'form': {
+ 'type': self.type,
+ 'type_transact': self.type_transact,
+ 'entity_ids': self.entity_ids.ids,
+ 'start_date': self.start_date,
+ 'end_date': self.end_date,
+ },
+ }
+ return self.env.ref('exp_transaction_report.incom_transaction_complete_report').report_action(self, data=data)
+
+
+class ReportIncomingTransaction(models.AbstractModel):
+ _name = 'report.exp_transaction_report.template_incom_transaction_report'
+
+ def set_docs_dic(self, transaction, uint, type, to):
+ lang = self.env.user.lang
+ if type == 'in':
+ tran = transaction.internal_transaction_id
+ date = transaction.date
+ if lang == 'ar_SY':
+ name = ' المعاملات الداخلية'
+ else:
+ name = ' Internal Transaction'
+ uint = uint + name
+ else:
+ tran = transaction
+ date = transaction.transaction_date
+ if lang == 'ar_SY':
+ name = ' المعاملات الواردة الخارجية'
+ else:
+ name = ' Incoming Transaction'
+ uint = uint + name
+ dic = {
+ 'name': tran.name,
+ 'subject': tran.subject,
+ 'type': tran.subject_type_id.name,
+ 'transaction_date': date,
+ 'form': transaction.from_id.name,
+ 'to': to,
+ 'unit': uint,
+ }
+ return dic
+
+ def get_value(self, data):
+ type = data['form']['type']
+ type_transact = data['form']['type_transact']
+ entity_ids = data['form']['entity_ids']
+ start_date = data['form']['start_date']
+ end_date = data['form']['end_date']
+ docs = []
+ x = False
+ if type_transact == 'incoming':
+ domain = []
+ employee_ids = self.env['cm.entity'].browse(entity_ids)
+ domain.extend((('transaction_date', '>=', start_date),
+ ('transaction_date', '<=', end_date), ('to_ids', 'in', employee_ids.ids)))
+ incoming_ids = self.env['incoming.transaction'].search(domain, order="transaction_date desc")
+ if incoming_ids:
+ for rec in incoming_ids:
+ name = ''
+ for emp in employee_ids:
+ for to in rec.to_ids:
+ name += to.name + ','
+ dic = self.set_docs_dic(rec, emp.name, 'out_in', name)
+ docs.append(dic)
+ elif type_transact == 'internal':
+ domain = []
+ if type == 'unit':
+ emp_ids = self.env['cm.entity'].search([('parent_id', 'in', entity_ids), ('type', '=', 'employee')]).ids
+ domain.append(('to_id', 'in', emp_ids))
+ elif type == 'employee':
+ domain.append(('to_id', 'in', entity_ids))
+ domain.extend((('action', '!=', 'archive'), ('date', '>=', start_date),
+ ('date', '<=', end_date)))
+ trace_log_ids = self.env['cm.transaction.trace'].search(domain, order="date desc")
+ if trace_log_ids:
+ for rec in trace_log_ids:
+ if rec.internal_transaction_id:
+ dic = self.set_docs_dic(rec, rec.to_id.parent_id.name, 'in', rec.to_id.name)
+ docs.append(dic)
+ else:
+ in_domain = []
+ employee_ids = self.env['cm.entity'].browse(entity_ids)
+ in_domain.extend((('transaction_date', '>=', start_date),
+ ('transaction_date', '<=', end_date), ('to_ids', 'in', employee_ids.ids)))
+ incoming_ids = self.env['incoming.transaction'].search(in_domain, order="transaction_date desc")
+ if incoming_ids:
+ for rec in incoming_ids:
+ name = ''
+ for emp in employee_ids:
+ for to in rec.to_ids:
+ name += to.name + ','
+ dic = self.set_docs_dic(rec, emp.name, 'out_in', name)
+ docs.append(dic)
+ domain = []
+ if type == 'unit':
+ emp_ids = self.env['cm.entity'].search([('parent_id', 'in', entity_ids), ('type', '=', 'employee')]).ids
+ domain.append(('to_id', 'in', emp_ids))
+ elif type == 'employee':
+ domain.append(('to_id', 'in', entity_ids))
+ domain.extend((('action', '!=', 'archive'), ('date', '>=', start_date),
+ ('date', '<=', end_date)))
+ trace_log_ids = self.env['cm.transaction.trace'].search(domain, order="date desc")
+ if trace_log_ids:
+ for rec in trace_log_ids:
+ if rec.internal_transaction_id:
+ dic = self.set_docs_dic(rec, rec.to_id.parent_id.name, 'in', rec.to_id.name)
+ docs.append(dic)
+ final_dic = {}
+ key_list = []
+ grouped = collections.defaultdict(list)
+ for item in docs:
+ grouped[item['unit']].append(item)
+ for key, value in grouped.items():
+ final_dic[key] = list(value)
+ key_list.append(key)
+ my_key = list(dict.fromkeys(key_list))
+ return final_dic, my_key
+
+ @api.model
+ def _get_report_values(self, docids, data=None):
+ final_dic, my_key = self.get_value(data)
+ start_date = data['form']['start_date']
+ end_date = data['form']['end_date']
+ # edit by fatma rida to make warning message if no data
+ if my_key:
+ return {
+ 'doc_ids': data['ids'],
+ 'doc_model': data['model'],
+ 'date_start': start_date,
+ 'date_end': end_date,
+ 'group_dic': final_dic,
+ 'key': my_key,
+ }
+ else:
+ raise UserError(_("""No data for your selection\n"""))
+
diff --git a/odex25_transactions/exp_transaction_report/wizard/incoming_transaction_report_wiz_view.xml b/odex25_transactions/exp_transaction_report/wizard/incoming_transaction_report_wiz_view.xml
new file mode 100644
index 000000000..f19737dfe
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/wizard/incoming_transaction_report_wiz_view.xml
@@ -0,0 +1,32 @@
+
+
+
+
+ incoming Transaction
+ incoming.transaction.report.wizard
+
+
+
+
+
+
+
+
+ Print Incoming transaction Report
+ ir.actions.act_window
+ incoming.transaction.report.wizard
+
+ form
+
+ new
+
+
+
+
diff --git a/odex25_transactions/exp_transaction_report/wizard/late_transaction_report_wiz.py b/odex25_transactions/exp_transaction_report/wizard/late_transaction_report_wiz.py
new file mode 100644
index 000000000..be3373982
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/wizard/late_transaction_report_wiz.py
@@ -0,0 +1,158 @@
+# -*- coding: utf-8 -*-
+
+from odoo import api, fields, models, _
+import datetime
+import collections
+
+
+# from odoo.exceptions import ValidationError
+from odoo.exceptions import UserError
+
+
+class LateTransactionReportWizard(models.TransientModel):
+ _name = 'late.transaction.report.wizard'
+ _inherit = "transaction.common.report"
+ _description = 'Print late Transaction Report'
+
+
+ def print_report(self):
+ data = {
+ 'ids': self.ids,
+ 'model': self._name,
+ 'form': {
+ 'type': self.type,
+ 'type_transact': self.type_transact,
+ 'entity_ids': self.entity_ids.ids,
+ 'start_date': self.start_date,
+ },
+ }
+ return self.env.ref('exp_transaction_report.late_transaction_complete_report').report_action(self, data=data)
+
+
+class ReportIncomingTransaction(models.AbstractModel):
+ _name = 'report.exp_transaction_report.template_late_transaction_report'
+
+ def set_docs_dic(self, transaction, type, uint, to):
+ lang = self.env.user.lang
+ if type == 'in':
+ if lang == 'ar_SY':
+ name = ' المعاملات الداخلية'
+ else:
+ name = ' Internal Transaction'
+ uint = uint + name
+ else:
+ if lang == 'ar_SY':
+ name = ' المعاملات الواردة الخارجية'
+ else:
+ name = ' Incoming Transaction'
+ uint = uint + name
+ dic = {
+ 'name': transaction.name,
+ 'subject': transaction.subject,
+ 'type': transaction.subject_type_id.name,
+ 'transaction_date': transaction.transaction_date,
+ 'due_date': transaction.due_date,
+ 'to': to,
+ 'unit': uint,
+ }
+ return dic
+
+ def get_value(self, data):
+ type = data['form']['type']
+ type_transact = data['form']['type_transact']
+ entity_ids = data['form']['entity_ids']
+ start_date = data['form']['start_date']
+ docs = []
+ x = False
+ if type_transact == 'incoming':
+ domain = []
+ employee_ids = self.env['cm.entity'].browse(entity_ids)
+ domain.extend((('transaction_date', '>=', start_date),
+ ('to_ids', 'in', employee_ids.ids), ('state', 'in', ['send', 'reply'])))
+ incoming_ids = self.env['incoming.transaction'].search(domain, order="transaction_date desc")
+ if incoming_ids:
+ today = fields.date.today()
+ for rec in incoming_ids:
+ if datetime.datetime.strptime(rec.due_date, "%Y-%m-%d") < datetime.datetime.strptime(str(today), "%Y-%m-%d"):
+ trasc = rec.trace_ids.filtered(lambda z: z.action == 'forward' or z.action == 'sent' or
+ z.action == 'reply')[0]
+ name = ''
+ for to in rec.to_ids:
+ name += to.name + ','
+ dic = self.set_docs_dic(rec, 'out_in', name, trasc.to_id.name)
+ docs.append(dic)
+ elif type_transact == 'internal':
+ domain = []
+ employee_ids = self.env['cm.entity'].browse(entity_ids)
+ domain.extend((('transaction_date', '>=', start_date),
+ ('to_ids', 'in', employee_ids.ids), ('state', 'in', ['send', 'reply'])))
+ internal_ids = self.env['internal.transaction'].search(domain, order="transaction_date desc")
+ if internal_ids:
+ today = fields.date.today()
+ for rec in internal_ids:
+ if datetime.datetime.strptime(rec.due_date, "%Y-%m-%d") < datetime.datetime.strptime(str(today), "%Y-%m-%d"):
+ trasc = rec.trace_ids.filtered(lambda z: z.action == 'forward' or z.action == 'sent' or
+ z.action == 'reply')[0]
+ name = ''
+ for to in rec.to_ids:
+ name += to.name + ','
+ dic = self.set_docs_dic(rec, 'in', name, trasc.to_id.name)
+ docs.append(dic)
+ else:
+ domain = []
+ employee_ids = self.env['cm.entity'].browse(entity_ids)
+ domain.extend((('transaction_date', '>=', start_date),
+ ('to_ids', 'in', employee_ids.ids), ('state', 'in', ['send', 'reply'])))
+ incoming_ids = self.env['incoming.transaction'].search(domain, order="transaction_date desc")
+ if incoming_ids:
+ today = fields.date.today()
+ for rec in incoming_ids:
+ if datetime.datetime.strptime(rec.due_date, "%Y-%m-%d") < datetime.datetime.strptime(str(today),
+ "%Y-%m-%d"):
+ trasc = rec.trace_ids.filtered(lambda z: z.action == 'forward' or z.action == 'sent' or
+ z.action == 'reply')[0]
+ name = ''
+ for to in rec.to_ids:
+ name += to.name + ','
+ dic = self.set_docs_dic(rec, 'out_in', name, trasc.to_id.name)
+ docs.append(dic)
+ internal_ids = self.env['internal.transaction'].search(domain, order="transaction_date desc")
+ if internal_ids:
+ today = fields.date.today()
+ for rec in internal_ids:
+ if datetime.datetime.strptime(rec.due_date, "%Y-%m-%d") < datetime.datetime.strptime(str(today),
+ "%Y-%m-%d"):
+ trasc = rec.trace_ids.filtered(lambda z: z.action == 'forward' or z.action == 'sent' or
+ z.action == 'reply')[0]
+ name = ''
+ for to in rec.to_ids:
+ name += to.name + ','
+ dic = self.set_docs_dic(rec, 'in', name, trasc.to_id.name)
+ docs.append(dic)
+ final_dic = {}
+ key_list = []
+ grouped = collections.defaultdict(list)
+ for item in docs:
+ grouped[item['unit']].append(item)
+ for key, value in grouped.items():
+ final_dic[key] = list(value)
+ key_list.append(key)
+ my_key = list(dict.fromkeys(key_list))
+ return final_dic, my_key
+
+ @api.model
+ def _get_report_values(self, docids, data=None):
+ final_dic, my_key = self.get_value(data)
+ start_date = data['form']['start_date']
+ # edit by fatma rida to make warning message if no data
+ if my_key:
+ return {
+ 'doc_ids': data['ids'],
+ 'doc_model': data['model'],
+ 'date_start': start_date,
+ 'group_dic': final_dic,
+ 'key': my_key,
+ }
+ else:
+ raise UserError(_("""No data for your selection\n"""))
+
diff --git a/odex25_transactions/exp_transaction_report/wizard/late_transaction_report_wiz.xml b/odex25_transactions/exp_transaction_report/wizard/late_transaction_report_wiz.xml
new file mode 100644
index 000000000..74f56958d
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/wizard/late_transaction_report_wiz.xml
@@ -0,0 +1,35 @@
+
+
+
+
+ late Transaction
+ late.transaction.report.wizard
+
+
+
+ 1
+
+
+
+
+
+
+
+ Print late transaction Report
+ ir.actions.act_window
+ late.transaction.report.wizard
+
+ form
+
+ new
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_report/wizard/outgoing_transaction_report_wiz.py b/odex25_transactions/exp_transaction_report/wizard/outgoing_transaction_report_wiz.py
new file mode 100644
index 000000000..582fd0740
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/wizard/outgoing_transaction_report_wiz.py
@@ -0,0 +1,137 @@
+# -*- coding: utf-8 -*-
+import collections
+import datetime
+from odoo import api, fields, models, _
+
+
+# from odoo.exceptions import ValidationError
+from odoo.exceptions import UserError
+
+
+class OutgoingTransactionReportWizard(models.TransientModel):
+ _name = 'outgoing.transaction.report.wizard'
+ _inherit = "transaction.common.report"
+ _description = 'Print outgoing Transaction Report'
+
+ type_transact = fields.Selection([('internal', 'Internal'), ('outgoing', 'Outgoing'), ('all', 'All')],
+ 'Transaction Type')
+
+
+ def print_report(self):
+ data = {
+ 'ids': self.ids,
+ 'model': self._name,
+ 'form': {
+ 'type': self.type,
+ 'type_transact': self.type_transact,
+ 'entity_ids': self.entity_ids.ids,
+ 'start_date': self.start_date,
+ 'end_date': self.end_date,
+ },
+ }
+ return self.env.ref('exp_transaction_report.out_transaction_complete_report').report_action(self, data=data)
+
+
+class ReportOutgoingTransaction(models.AbstractModel):
+ _name = 'report.exp_transaction_report.template_out_transaction_report'
+
+ def set_docs_dic(self, transaction, uint, type):
+ to_name = ''
+ if transaction.to_ids:
+ for to in transaction.to_ids:
+ to_name += to.name + ','
+ dic = {
+ 'name': transaction.name,
+ 'subject': transaction.subject,
+ 'type': transaction.subject_type_id.name,
+ 'transaction_date': transaction.transaction_date,
+ 'to': to_name,
+ 'unit': uint,
+ }
+ return dic
+
+ def get_value(self, data):
+ type = data['form']['type']
+ type_transact = data['form']['type_transact']
+ entity_ids = data['form']['entity_ids']
+ start_date = data['form']['start_date']
+ end_date = data['form']['end_date']
+ docs = []
+ domain = []
+ employee_ids = ''
+ if type == 'unit':
+ employee_ids = self.env['cm.entity'].search([('parent_id', 'in', entity_ids), ('type', '=', 'employee')])
+ else:
+ employee_ids = self.env['cm.entity'].browse(entity_ids)
+ domain.extend((('transaction_date', '>=', start_date),
+ ('transaction_date', '<=', end_date)))
+ if type_transact != 'all':
+ model_name = ''
+ if type_transact == 'internal':
+ model_name = 'internal.transaction'
+ domain.append(('state', '=', 'send'))
+ elif type_transact == 'outgoing':
+ model_name = 'outgoing.transaction'
+ transaction_ids = self.env[model_name].search(domain, order="transaction_date desc")
+ if transaction_ids:
+ for rec in transaction_ids:
+ for emp in employee_ids:
+ if rec.employee_id.id == emp.id:
+ if type == 'unit':
+ dic = self.set_docs_dic(rec, emp.parent_id.name, type)
+ docs.append(dic)
+ else:
+ dic = self.set_docs_dic(rec, emp.name, type)
+ docs.append(dic)
+ else:
+ internal_ids = self.env['internal.transaction'].search(domain, order="transaction_date desc")
+ if internal_ids:
+ for rec in internal_ids:
+ for emp in employee_ids:
+ if rec.employee_id.id == emp.id:
+ if type == 'unit':
+ dic = self.set_docs_dic(rec, emp.parent_id.name, type)
+ docs.append(dic)
+ else:
+ dic = self.set_docs_dic(rec, emp.name, type)
+ docs.append(dic)
+ outgoing_ids = self.env['outgoing.transaction'].search(domain, order="transaction_date desc")
+ if outgoing_ids:
+ for rec in outgoing_ids:
+ for emp in employee_ids:
+ if rec.employee_id.id == emp.id:
+ if type == 'unit':
+ dic = self.set_docs_dic(rec, emp.parent_id.name, type)
+ docs.append(dic)
+ else:
+ dic = self.set_docs_dic(rec, emp.name, type)
+ docs.append(dic)
+ final_dic = {}
+ key_list = []
+ grouped = collections.defaultdict(list)
+ for item in docs:
+ grouped[item['unit']].append(item)
+ for key, value in grouped.items():
+ final_dic[key] = list(value)
+ key_list.append(key)
+ my_key = list(dict.fromkeys(key_list))
+ return final_dic, my_key
+
+ @api.model
+ def _get_report_values(self, docids, data=None):
+ final_dic, my_key = self.get_value(data)
+ start_date = data['form']['start_date']
+ end_date = data['form']['end_date']
+ # edit by fatma rida to make warning message if no data
+ if my_key:
+ return {
+ 'doc_ids': data['ids'],
+ 'doc_model': data['model'],
+ 'date_start': start_date,
+ 'date_end': end_date,
+ 'group_dic': final_dic,
+ 'key': my_key,
+ }
+ else:
+ raise UserError(_("""No data for your selection\n"""))
+
diff --git a/odex25_transactions/exp_transaction_report/wizard/outgoing_transaction_report_wiz_view.xml b/odex25_transactions/exp_transaction_report/wizard/outgoing_transaction_report_wiz_view.xml
new file mode 100644
index 000000000..fdd207869
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/wizard/outgoing_transaction_report_wiz_view.xml
@@ -0,0 +1,32 @@
+
+
+
+
+ outgoing Transaction
+ outgoing.transaction.report.wizard
+
+
+
+
+
+
+
+
+ Print Outgoing transaction Report
+ ir.actions.act_window
+ outgoing.transaction.report.wizard
+
+ form
+
+ new
+
+
+
+
diff --git a/odex25_transactions/exp_transaction_report/wizard/outstanding_transaction_report_view_wiz.xml b/odex25_transactions/exp_transaction_report/wizard/outstanding_transaction_report_view_wiz.xml
new file mode 100644
index 000000000..ffa49806b
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/wizard/outstanding_transaction_report_view_wiz.xml
@@ -0,0 +1,33 @@
+
+
+
+
+ Outstanding Transaction
+ outstanding.transaction.report.wizard
+
+
+
+
+
+
+
+
+ Print Outstanding transaction Report
+ ir.actions.act_window
+ outstanding.transaction.report.wizard
+
+ form
+
+ new
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/exp_transaction_report/wizard/outstanding_transaction_report_wiz.py b/odex25_transactions/exp_transaction_report/wizard/outstanding_transaction_report_wiz.py
new file mode 100644
index 000000000..93594dbd0
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/wizard/outstanding_transaction_report_wiz.py
@@ -0,0 +1,119 @@
+# -*- coding: utf-8 -*-
+import collections
+import datetime
+from odoo import api, fields, models,_
+# from odoo.exceptions import ValidationError
+from odoo.exceptions import UserError
+
+
+class OutstandingTransactionReportWizard(models.TransientModel):
+ _name = 'outstanding.transaction.report.wizard'
+ _inherit = "transaction.common.report"
+ _description = 'Print Outstanding Transaction Report'
+
+ type_transact = fields.Selection([('outgoing', 'Outgoing'), ('incoming', 'Incoming')], 'Transaction Type')
+
+
+ def print_report(self):
+ data = {
+ 'ids': self.ids,
+ 'model': self._name,
+ 'form': {
+ 'type': self.type,
+ 'type_transact': self.type_transact,
+ 'entity_ids': self.entity_ids.ids,
+ 'start_date': self.start_date,
+ 'end_date': self.end_date,
+ },
+ }
+ return self.env.ref('exp_transaction_report.outstanding_transaction_complete_report').report_action(self, data=data)
+
+
+class ReportOutstandingTransaction(models.AbstractModel):
+ _name = 'report.exp_transaction_report.outstand_transaction_report_temp'
+
+ def set_docs_dic(self, transaction, uint, type):
+ dic = {
+ 'name': transaction.name,
+ 'subject': transaction.subject,
+ 'type': transaction.subject_type_id.name,
+ 'transaction_date': transaction.transaction_date,
+ 'to': transaction.to_ids[0].name,
+ 'processing': transaction.processing_ids,
+ 'unit': uint,
+ }
+ return dic
+
+ def get_value(self, data):
+ type = data['form']['type']
+ type_transact = data['form']['type_transact']
+ entity_ids = data['form']['entity_ids']
+ start_date = data['form']['start_date']
+ end_date = data['form']['end_date']
+ docs = []
+ domain = []
+ employee_ids = ''
+ if type == 'unit':
+ employee_ids = self.env['cm.entity'].search([('parent_id', 'in', entity_ids)])
+ else:
+ employee_ids = self.env['cm.entity'].browse(entity_ids)
+ domain.extend((('transaction_date', '>=', start_date),
+ ('transaction_date', '<=', end_date),
+ ('type', 'in', ('reply', 'forward'))
+ ))
+ search_model = ''
+ re_name = ''
+ lang = self.env.user.lang
+ if type_transact == 'outgoing':
+ search_model = self.env['outgoing.transaction']
+ domain.append(('state', '=', 'send'))
+ re_name = 'Outgoing Transactions'
+ if lang == 'ar_SY':
+ re_name = ' المعاملات الخارجية الصادره'
+ else:
+ search_model = self.env['incoming.transaction']
+ domain.append(('state', '=', 'closed'))
+ re_name = 'Incoming Transactions'
+ if lang == 'ar_SY':
+ re_name = ' المعاملات الخارجية الوارده'
+ transaction_ids = search_model.search(domain, order="transaction_date desc")
+ if transaction_ids:
+ for rec in transaction_ids:
+ for emp in employee_ids:
+ if rec.employee_id.id == emp.id:
+ if type == 'unit':
+ dic = self.set_docs_dic(rec, emp.parent_id.name, type)
+ docs.append(dic)
+ else:
+ dic = self.set_docs_dic(rec, emp.name, type)
+ docs.append(dic)
+ final_dic = {}
+ key_list = []
+ grouped = collections.defaultdict(list)
+ for item in docs:
+ grouped[item['unit']].append(item)
+ for key, value in grouped.items():
+ final_dic[key] = list(value)
+ key_list.append(key)
+ my_key = list(dict.fromkeys(key_list))
+ return final_dic, my_key, re_name
+
+ @api.model
+ def _get_report_values(self, docids, data=None):
+ final_dic, my_key, name = self.get_value(data)
+ start_date = data['form']['start_date']
+ end_date = data['form']['end_date']
+ # edit by fatma rida to make warning message if no data
+ if my_key:
+ return {
+ 'doc_ids': data['ids'],
+ 'doc_model': data['model'],
+ 'date_start': start_date,
+ 'date_end': end_date,
+ 'name': name,
+ 'group_dic': final_dic,
+ 'key': my_key,
+ }
+ else:
+ raise UserError(_("""No data for your selection\n"""))
+
diff --git a/odex25_transactions/exp_transaction_report/wizard/transaction_common_report.py b/odex25_transactions/exp_transaction_report/wizard/transaction_common_report.py
new file mode 100644
index 000000000..2fd11f080
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/wizard/transaction_common_report.py
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+
+from odoo import api, fields, models,_
+import datetime
+# from odoo.exceptions import ValidationError
+
+
+class TransactionCommonReport(models.TransientModel):
+ _name = "transaction.common.report"
+ _description = "Transaction Common Report"
+
+ type = fields.Selection(selection=[('unit', 'Unit'), ('employee', 'Employee')], string='Type', required=True)
+ type_transact = fields.Selection([('internal', 'Internal'), ('incoming', 'Incoming'), ('all', 'All')],
+ 'Transaction Type')
+ entity_ids = fields.Many2many(comodel_name='cm.entity', string='Entities', required=True)
+ start_date = fields.Date(string='Start Date', default=datetime.date.today())
+ end_date = fields.Date(string='End Date', default=datetime.date.today())
+
+ @api.onchange('type')
+ def onchange_type(self):
+ domain = {}
+ self.entity_ids = False
+ if self.type == 'employee':
+ domain = {'entity_ids': [('id', 'in', self.env['cm.entity'].search([('type', '=', 'employee')]).ids)]}
+ elif self.type == 'unit':
+ domain = {'entity_ids': [('id', 'in', self.env['cm.entity'].search([('type', '=', 'unit')]).ids)]}
+ return {'domain': domain}
diff --git a/odex25_transactions/exp_transaction_report/wizard/transaction_common_report_view.xml b/odex25_transactions/exp_transaction_report/wizard/transaction_common_report_view.xml
new file mode 100644
index 000000000..2cdddfcc0
--- /dev/null
+++ b/odex25_transactions/exp_transaction_report/wizard/transaction_common_report_view.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ Common Transaction
+ transaction.common.report
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/exp_transation_letters/__init__.py b/odex25_transactions/exp_transation_letters/__init__.py
new file mode 100644
index 000000000..601ffa6a9
--- /dev/null
+++ b/odex25_transactions/exp_transation_letters/__init__.py
@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+from . import models
+
diff --git a/odex25_transactions/exp_transation_letters/__manifest__.py b/odex25_transactions/exp_transation_letters/__manifest__.py
new file mode 100644
index 000000000..029a4648e
--- /dev/null
+++ b/odex25_transactions/exp_transation_letters/__manifest__.py
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# Odex - Communications Management System.
+# Copyright (C) 2019 Expert Co. Ltd. ().
+#
+##############################################################################
+{
+ 'name': 'Transaction Letters Managment',
+ 'version': '1.0',
+ 'sequence': 4,
+ 'author': 'Expert Co. Ltd. - Sudan Team',
+ 'category': 'Odex25-Transactions/Odex25-Transactions',
+ 'summary': 'Letters Managment',
+ 'description': """
+Letters Managment
+========================================
+ """,
+ 'website': 'http://www.exp-sa.com',
+ 'depends': ['exp_transaction_documents'],
+ 'data': [
+ 'security/groups.xml',
+ 'security/ir.model.access.csv',
+ 'views/letters_view.xml',
+ 'reports/letter_template.xml',
+ ],
+ 'qweb' : [
+ ],
+ 'installable': True,
+ 'auto_install': False,
+ 'application': False,
+}
diff --git a/odex25_transactions/exp_transation_letters/i18n/ar_001.po b/odex25_transactions/exp_transation_letters/i18n/ar_001.po
new file mode 100644
index 000000000..2c6511cfb
--- /dev/null
+++ b/odex25_transactions/exp_transation_letters/i18n/ar_001.po
@@ -0,0 +1,241 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * exp_transation_letters
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 14.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-04-30 00:36+0000\n"
+"PO-Revision-Date: 2024-04-30 00:36+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: exp_transation_letters
+#: model:ir.actions.report,print_report_name:exp_transation_letters.report_letter_action_report
+msgid "'Letter %s' % (object.name)"
+msgstr "'الخطاب %s' % (object.name)"
+
+#. module: exp_transation_letters
+#: model_terms:ir.ui.view,arch_db:exp_transation_letters.custom_external_layout_standard
+msgid "Attachment: "
+msgstr "المرفق: "
+
+#. module: exp_transation_letters
+#: model_terms:ir.ui.view,arch_db:exp_transation_letters.custom_external_layout_standard
+msgid "Reference: "
+msgstr "المرجع: "
+
+#. module: exp_transation_letters
+#: model_terms:ir.ui.view,arch_db:exp_transation_letters.custom_external_layout_standard
+msgid ""
+"\n"
+" Date: "
+msgstr ""
+"\n"
+" التاريخ: "
+
+#. module: exp_transation_letters
+#: model_terms:ir.ui.view,arch_db:exp_transation_letters.view_transaction_letters_form
+msgid "Add As Attachment to Transaction"
+msgstr "إضافة كمرفق إلى المعاملة"
+
+#. module: exp_transation_letters
+#: model:ir.model.fields,field_description:exp_transation_letters.field_letters_template__conclusion
+msgid "Conclusion"
+msgstr "الختام"
+
+#. module: exp_transation_letters
+#: model:ir.model.fields,field_description:exp_transation_letters.field_letters_letters__content
+#: model:ir.model.fields,field_description:exp_transation_letters.field_letters_template__content
+msgid "Content"
+msgstr "المحتوى"
+
+#. module: exp_transation_letters
+#: model:ir.model.fields,field_description:exp_transation_letters.field_letters_letters__create_uid
+#: model:ir.model.fields,field_description:exp_transation_letters.field_letters_template__create_uid
+msgid "Created by"
+msgstr "تم الإنشاء بواسطة"
+
+#. module: exp_transation_letters
+#: model:ir.model.fields,field_description:exp_transation_letters.field_letters_letters__create_date
+#: model:ir.model.fields,field_description:exp_transation_letters.field_letters_template__create_date
+msgid "Created on"
+msgstr "تم الإنشاء في"
+
+#. module: exp_transation_letters
+#: model:ir.model.fields,field_description:exp_transation_letters.field_letters_letters__date
+msgid "Date"
+msgstr "التاريخ"
+
+#. module: exp_transation_letters
+#: model:ir.model.fields,field_description:exp_transation_letters.field_letters_letters__display_name
+#: model:ir.model.fields,field_description:exp_transation_letters.field_letters_template__display_name
+msgid "Display Name"
+msgstr "اسم العرض"
+
+#. module: exp_transation_letters
+#: model:ir.model.fields,field_description:exp_transation_letters.field_letters_template__is_favorite
+#: model:ir.model.fields.selection,name:exp_transation_letters.selection__letters_template__is_favorite__1
+msgid "Favorite"
+msgstr "المفضلة"
+
+#. module: exp_transation_letters
+#: model:ir.model.fields,field_description:exp_transation_letters.field_letters_letters__hijir_date
+msgid "Hijir Date"
+msgstr ""
+
+#. module: exp_transation_letters
+#: model:ir.model.fields,field_description:exp_transation_letters.field_letters_letters__id
+#: model:ir.model.fields,field_description:exp_transation_letters.field_letters_template__id
+msgid "ID"
+msgstr "المعرف"
+
+#. module: exp_transation_letters
+#: model:ir.model.fields.selection,name:exp_transation_letters.selection__letters_letters__transaction_type__incoming
+msgid "Incoming"
+msgstr "وارد"
+
+#. module: exp_transation_letters
+#: model:ir.model.fields,field_description:exp_transation_letters.field_letters_letters__incoming_transaction_id
+msgid "Incoming Transaction"
+msgstr "المعاملة الواردة"
+
+#. module: exp_transation_letters
+#: model:ir.model.fields.selection,name:exp_transation_letters.selection__letters_letters__transaction_type__internal
+msgid "Internal"
+msgstr "داخلي"
+
+#. module: exp_transation_letters
+#: model:ir.model.fields,field_description:exp_transation_letters.field_letters_letters__internal_transaction_id
+msgid "Internal Transaction"
+msgstr "المعاملة الداخلية"
+
+#. module: exp_transation_letters
+#: model:ir.model.fields,field_description:exp_transation_letters.field_letters_template__introduction
+msgid "Introduction"
+msgstr "المقدمة"
+
+#. module: exp_transation_letters
+#: model:ir.model.fields,field_description:exp_transation_letters.field_letters_letters____last_update
+#: model:ir.model.fields,field_description:exp_transation_letters.field_letters_template____last_update
+msgid "Last Modified on"
+msgstr "آخر تعديل في"
+
+#. module: exp_transation_letters
+#: model:ir.model.fields,field_description:exp_transation_letters.field_letters_letters__write_uid
+#: model:ir.model.fields,field_description:exp_transation_letters.field_letters_template__write_uid
+msgid "Last Updated by"
+msgstr "تم التحديث الأخير بواسطة"
+
+#. module: exp_transation_letters
+#: model:ir.model.fields,field_description:exp_transation_letters.field_letters_letters__write_date
+#: model:ir.model.fields,field_description:exp_transation_letters.field_letters_template__write_date
+msgid "Last Updated on"
+msgstr "آخر تحديث في"
+
+#. module: exp_transation_letters
+#: model:res.groups,name:exp_transation_letters.group_cm_letter
+msgid "Letter"
+msgstr "الخطابات"
+
+#. module: exp_transation_letters
+#: model:ir.ui.menu,name:exp_transation_letters.letters_menu
+#: model_terms:ir.ui.view,arch_db:exp_transation_letters.view_transaction_letters_form
+#: model_terms:ir.ui.view,arch_db:exp_transation_letters.view_transaction_letters_tree
+msgid "Letters"
+msgstr "الخطابات"
+
+#. module: exp_transation_letters
+#: model:ir.ui.menu,name:exp_transation_letters.parent_letters_menu
+msgid "Letters Management"
+msgstr "ادارة الخطابات"
+
+#. module: exp_transation_letters
+#: model:ir.actions.act_window,name:exp_transation_letters.transaction_letters_temp_action
+#: model:ir.ui.menu,name:exp_transation_letters.letters_temp_menu
+msgid "Letters Template"
+msgstr "قوالب الخطابات"
+
+#. module: exp_transation_letters
+#: model_terms:ir.ui.view,arch_db:exp_transation_letters.view_transaction_letters_temp_form
+#: model_terms:ir.ui.view,arch_db:exp_transation_letters.view_transaction_letters_temp_tree
+msgid "Letters template"
+msgstr "قالب الخطاب"
+
+#. module: exp_transation_letters
+#: model:ir.model.fields,field_description:exp_transation_letters.field_letters_letters__name
+#: model:ir.model.fields,field_description:exp_transation_letters.field_letters_template__name
+#: model_terms:ir.ui.view,arch_db:exp_transation_letters.view_transaction_letters_temp_form
+msgid "Name"
+msgstr "الاسم"
+
+#. module: exp_transation_letters
+#: model_terms:ir.ui.view,arch_db:exp_transation_letters.custom_external_layout_standard
+msgid "Number:"
+msgstr "رقم"
+
+#. module: exp_transation_letters
+#: model:ir.model.fields.selection,name:exp_transation_letters.selection__letters_letters__transaction_type__outgoing
+msgid "Outgoing"
+msgstr "خارجية"
+
+#. module: exp_transation_letters
+#: model:ir.model.fields,field_description:exp_transation_letters.field_letters_letters__outgoing_transaction_id
+msgid "Outgoing Transaction"
+msgstr "معاملة خارجية"
+
+#. module: exp_transation_letters
+#: model_terms:ir.ui.view,arch_db:exp_transation_letters.custom_external_layout_standard
+msgid "Page: / "
+msgstr ""
+
+#. module: exp_transation_letters
+#: model:ir.actions.report,name:exp_transation_letters.report_letter_action_report
+msgid "Print letters"
+msgstr "طباعة الخطاب"
+
+#. module: exp_transation_letters
+#: model:ir.model.fields,field_description:exp_transation_letters.field_letters_letters__signature
+msgid "Signature image"
+msgstr "صورة التوقيع"
+
+#. module: exp_transation_letters
+#: model:ir.model.fields,field_description:exp_transation_letters.field_letters_letters__letter_template
+msgid "Template"
+msgstr "القالب"
+
+#. module: exp_transation_letters
+#: model:ir.actions.act_window,name:exp_transation_letters.transaction_letters_action
+msgid "Transaction Letters"
+msgstr "خطابات المعاملة"
+
+#. module: exp_transation_letters
+#: model:ir.model.fields,field_description:exp_transation_letters.field_letters_letters__transaction_type
+msgid "Transaction Type"
+msgstr "نوع المعاملة"
+
+#. module: exp_transation_letters
+#: model:ir.model.fields,field_description:exp_transation_letters.field_letters_letters__unite
+#: model:ir.model.fields,field_description:exp_transation_letters.field_letters_template__unite
+msgid "Unite"
+msgstr "وحدة"
+
+#. module: exp_transation_letters
+#: model:ir.model,name:exp_transation_letters.model_letters_letters
+msgid "letters.letters"
+msgstr ""
+
+#. module: exp_transation_letters
+#: model:ir.model,name:exp_transation_letters.model_letters_template
+msgid "letters.template"
+msgstr ""
+
+#. module: exp_transation_letters
+#: model:ir.model.fields.selection,name:exp_transation_letters.selection__letters_template__is_favorite__0
+msgid "not"
+msgstr ""
\ No newline at end of file
diff --git a/odex25_transactions/exp_transation_letters/models/__init__.py b/odex25_transactions/exp_transation_letters/models/__init__.py
new file mode 100644
index 000000000..6ec51b763
--- /dev/null
+++ b/odex25_transactions/exp_transation_letters/models/__init__.py
@@ -0,0 +1,2 @@
+# -*- coding: utf-8 -*-
+from . import letter
diff --git a/odex25_transactions/exp_transation_letters/models/letter.py b/odex25_transactions/exp_transation_letters/models/letter.py
new file mode 100644
index 000000000..7fdf560cd
--- /dev/null
+++ b/odex25_transactions/exp_transation_letters/models/letter.py
@@ -0,0 +1,114 @@
+# -*- coding: utf-8 -*-
+import base64
+from odoo import api, fields, models
+from hijri_converter import convert
+import datetime
+
+
+class Letters(models.Model):
+ _name = "letters.letters"
+
+ name = fields.Char(string="Name")
+ unite = fields.Many2one('cm.entity', string="Unite")
+ letter_template = fields.Many2one('letters.template', string='Template')
+ date = fields.Date(string="Date")
+ hijir_date = fields.Char(string="Hijir Date", compute='compute_hijri')
+ content = fields.Html(string="Content")
+ signature = fields.Binary("Signature image")
+ transaction_type = fields.Selection([('internal', 'Internal'), ('outgoing', 'Outgoing'),
+ ('incoming', 'Incoming')], default='internal', string='Transaction Type')
+ incoming_transaction_id = fields.Many2one(comodel_name='incoming.transaction', string='Incoming Transaction')
+ internal_transaction_id = fields.Many2one(comodel_name='internal.transaction', string='Internal Transaction')
+ outgoing_transaction_id = fields.Many2one(comodel_name='outgoing.transaction', string='Outgoing Transaction')
+
+ @api.onchange('transaction_type')
+ def set_value_false(self):
+ if self.transaction_type == 'internal':
+ self.incoming_transaction_id = ''
+ self.outgoing_transaction_id = ''
+ elif self.transaction_type == 'outgoing':
+ self.incoming_transaction_id = ''
+ self.internal_transaction_id = ''
+ elif self.transaction_type == 'incoming':
+ self.internal_transaction_id = ''
+ self.outgoing_transaction_id = ''
+ elif not self.transaction_type:
+ self.incoming_transaction_id = ''
+ self.internal_transaction_id = ''
+ self.outgoing_transaction_id = ''
+
+ @api.depends('date')
+ def compute_hijri(self):
+ for rec in self:
+ if rec.date:
+ date = datetime.datetime.strptime(str(rec.date), '%Y-%m-%d')
+ year = date.year
+ day = date.day
+ month = date.month
+ hijri_date = convert.Gregorian(year, month, day).to_hijri()
+ rec.hijir_date = hijri_date
+
+ else:
+ rec.hijir_date = False
+
+ @api.onchange('letter_template')
+ def get_content(self):
+ for rec in self:
+ final_content = rec.letter_template.introduction + rec.letter_template.content + rec.letter_template.conclusion
+ if final_content:
+ final_content = final_content.replace('line-height', '')
+ rec.content = final_content
+
+ def action_generate_attachment(self):
+ """ this method called from button action in view xml """
+ # generate pdf from report, use report's id as reference
+ REPORT_ID = 'exp_transation_letters.report_letter_action_report'
+ pdf = self.env.ref(REPORT_ID)._render_qweb_pdf(self.ids)
+ # pdf result is a list
+ b64_pdf = base64.b64encode(pdf[0])
+ res_model = ''
+ res_id = ''
+ if self.transaction_type == 'internal':
+ transaction = self.env['internal.transaction']
+ res_model = transaction._name
+ res_id = self.internal_transaction_id.id
+ elif self.transaction_type == "outgoing":
+ transaction = self.env['outgoing.transaction']
+ res_model = transaction._name
+ res_id = self.outgoing_transaction_id.id
+ elif self.transaction_type == "incoming":
+ transaction = self.env['incoming.transaction']
+ res_model = transaction._name
+ res_id = self.incoming_transaction_id.id
+ # save pdf as attachment
+ ATTACHMENT_NAME = "Letter"
+ return self.env['ir.attachment'].create({
+ 'name': ATTACHMENT_NAME + '.pdf',
+ 'type': 'binary',
+ 'datas': b64_pdf,
+ # 'datas_fname': ATTACHMENT_NAME + '.pdf',
+ 'store_fname': ATTACHMENT_NAME,
+ 'res_model': res_model,
+ 'res_id': res_id,
+ 'mimetype': 'application/x-pdf'
+ })
+
+ def write(self, values):
+ if values.get('content'):
+ final_content = values.get('content')
+ values['content'] = final_content.replace('line-height', '')
+ return super(Letters, self).write(values)
+
+
+class LettersTemp(models.Model):
+ _name = "letters.template"
+
+ name = fields.Char(string="Name")
+ unite = fields.Many2one('cm.entity', string="Unite")
+ introduction = fields.Html(string='Introduction')
+ conclusion = fields.Html(string="Conclusion")
+ content = fields.Html(string="Content")
+ is_favorite = fields.Selection([
+ ('0', 'not'),
+ ('1', 'Favorite'),
+ ], size=1, string="Favorite")
diff --git a/odex25_transactions/exp_transation_letters/reports/letter_template.xml b/odex25_transactions/exp_transation_letters/reports/letter_template.xml
new file mode 100644
index 000000000..03eac0df1
--- /dev/null
+++ b/odex25_transactions/exp_transation_letters/reports/letter_template.xml
@@ -0,0 +1,232 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ paperformat.letters.report
+
+ A4
+ Portrait
+ 70
+ 20
+ 30
+ 20
+
+ 50
+ 90
+
+
+
+
diff --git a/odex25_transactions/exp_transation_letters/security/groups.xml b/odex25_transactions/exp_transation_letters/security/groups.xml
new file mode 100644
index 000000000..e6b99870d
--- /dev/null
+++ b/odex25_transactions/exp_transation_letters/security/groups.xml
@@ -0,0 +1,8 @@
+
+
+
+ Letter
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/exp_transation_letters/security/ir.model.access.csv b/odex25_transactions/exp_transation_letters/security/ir.model.access.csv
new file mode 100644
index 000000000..ee34d4b28
--- /dev/null
+++ b/odex25_transactions/exp_transation_letters/security/ir.model.access.csv
@@ -0,0 +1,3 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+letter_employee,employee_letter,exp_transation_letters.model_letters_letters,exp_transation_letters.group_cm_letter,1,1,1,1
+letter_employee__temp,employee_letter,exp_transation_letters.model_letters_template,exp_transation_letters.group_cm_letter,1,1,1,1
diff --git a/odex25_transactions/exp_transation_letters/views/letters_view.xml b/odex25_transactions/exp_transation_letters/views/letters_view.xml
new file mode 100644
index 000000000..36fcc5c63
--- /dev/null
+++ b/odex25_transactions/exp_transation_letters/views/letters_view.xml
@@ -0,0 +1,115 @@
+
+
+
+
+
+ view.transaction.letters.tree
+ letters.letters
+
+
+
+
+
+
+
+
+
+ view.transaction.letters.form
+ letters.letters
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ view.transaction.letters.temp.tree
+ letters.template
+
+
+
+
+
+
+
+
+
+ view.transaction.letters.temp.form
+ letters.template
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Letters Template
+ ir.actions.act_window
+ letters.template
+
+ tree,form
+
+
+ Transaction Letters
+ ir.actions.act_window
+ letters.letters
+
+ tree,form
+
+
+
+
+
+
diff --git a/odex25_transactions/html_text/README.rst b/odex25_transactions/html_text/README.rst
new file mode 100644
index 000000000..7d9b8452e
--- /dev/null
+++ b/odex25_transactions/html_text/README.rst
@@ -0,0 +1,118 @@
+====================
+Text from HTML field
+====================
+
+.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! 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%2Fserver--tools-lightgray.png?logo=github
+ :target: https://github.com/OCA/server-tools/tree/14.0/html_text
+ :alt: OCA/server-tools
+.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
+ :target: https://translation.odoo-community.org/projects/server-tools-14-0/server-tools-14-0-html_text
+ :alt: Translate me on Weblate
+.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
+ :target: https://runbot.odoo-community.org/runbot/149/14.0
+ :alt: Try me on Runbot
+
+|badge1| |badge2| |badge3| |badge4| |badge5|
+
+This module provides some technical features that allow to extract text from
+any chunk of HTML, without HTML tags or attributes. You can chose either:
+
+* To truncate the result by amount of words or characters.
+* To append an ellipsis (or any character(s)) at the end of the result.
+
+It can be used to easily generate excerpts.
+
+**Table of contents**
+
+.. contents::
+ :local:
+
+Usage
+=====
+
+This module just adds a technical utility, but nothing for the end user.
+
+If you are a developer and need this utility for your module, see these
+examples and read the docs inside the code.
+
+Python example::
+
+ def some_method(self):
+ # Get truncated text from an HTML field. It will 40 words and 100
+ # characters at most, and will have "..." appended at the end if it
+ # gets truncated.
+ truncated_text = self.env["ir.fields.converter"].text_from_html(
+ self.html_field, 40, 100, "...")
+
+QWeb example::
+
+
+
+.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
+ :alt: Try me on Runbot
+ :target: https://runbot.odoo-community.org/runbot/149/11.0
+
+Known issues / Roadmap
+======================
+
+* An option could be added to try to respect the basic HTML tags inside the
+ excerpt (````, ````, `` ``, etc.).
+
+Bug Tracker
+===========
+
+Bugs are tracked on `GitHub 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 `_.
+
+Do not contact contributors directly about support or help with technical issues.
+
+Credits
+=======
+
+Authors
+~~~~~~~
+
+* Grupo ESOC Ingeniería de Servicios
+* Tecnativa
+* Onestein
+
+Contributors
+~~~~~~~~~~~~
+
+* Dennis Sluijk
+* `Tecnativa `_:",
+* Helly kapatel
+
+ * Jairo Llopis
+ * Vicent Cubells
+ * Víctor Martínez
+
+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/server-tools `_ project on GitHub.
+
+You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/odex25_transactions/html_text/__init__.py b/odex25_transactions/html_text/__init__.py
new file mode 100644
index 000000000..31660d6a9
--- /dev/null
+++ b/odex25_transactions/html_text/__init__.py
@@ -0,0 +1,3 @@
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+
+from . import models
diff --git a/odex25_transactions/html_text/__manifest__.py b/odex25_transactions/html_text/__manifest__.py
new file mode 100644
index 000000000..fe31f3989
--- /dev/null
+++ b/odex25_transactions/html_text/__manifest__.py
@@ -0,0 +1,19 @@
+# Copyright 2016-2017 Jairo Llopis
+# Copyright 2016 Tecnativa - Vicent Cubells
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+{
+ "name": "Text from HTML field",
+ "summary": "Generate excerpts from any HTML field",
+ "version": "14.0.1.0.0",
+ "category": "Tools",
+ "website": "https://github.com/OCA/server-tools",
+ "author": "Grupo ESOC Ingeniería de Servicios, "
+ "Tecnativa, "
+ "Onestein, "
+ "Odoo Community Association (OCA)",
+ "license": "AGPL-3",
+ "application": False,
+ "installable": True,
+ "external_dependencies": {"python": ["lxml"]},
+ "depends": ["base"],
+}
diff --git a/odex25_transactions/html_text/i18n/ca.po b/odex25_transactions/html_text/i18n/ca.po
new file mode 100644
index 000000000..b82487c21
--- /dev/null
+++ b/odex25_transactions/html_text/i18n/ca.po
@@ -0,0 +1,45 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * html_text
+#
+# Translators:
+# Marc Tormo i Bochaca , 2017
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 9.0c\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-04-19 18:00+0000\n"
+"PO-Revision-Date: 2017-04-19 18:00+0000\n"
+"Last-Translator: Marc Tormo i Bochaca , 2017\n"
+"Language-Team: Catalan (https://www.transifex.com/oca/teams/23907/ca/)\n"
+"Language: ca\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: html_text
+#: model:ir.model.fields,field_description:html_text.field_ir_fields_converter__display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: html_text
+#: model:ir.model,name:html_text.model_ir_fields_converter
+#, fuzzy
+msgid "Fields Converter"
+msgstr "ir.fields.converter"
+
+#. module: html_text
+#: model:ir.model.fields,field_description:html_text.field_ir_fields_converter__id
+msgid "ID"
+msgstr ""
+
+#. module: html_text
+#: model:ir.model.fields,field_description:html_text.field_ir_fields_converter____last_update
+msgid "Last Modified on"
+msgstr ""
+
+#. module: html_text
+#: model:ir.model.fields,field_description:html_text.field_ir_fields_converter__smart_search
+msgid "Smart Search"
+msgstr ""
diff --git a/odex25_transactions/html_text/i18n/de.po b/odex25_transactions/html_text/i18n/de.po
new file mode 100644
index 000000000..e75d5aa47
--- /dev/null
+++ b/odex25_transactions/html_text/i18n/de.po
@@ -0,0 +1,45 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * html_text
+#
+# Translators:
+# Rudolf Schnapka , 2017
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 9.0c\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-04-19 18:00+0000\n"
+"PO-Revision-Date: 2017-04-19 18:00+0000\n"
+"Last-Translator: Rudolf Schnapka , 2017\n"
+"Language-Team: German (https://www.transifex.com/oca/teams/23907/de/)\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: html_text
+#: model:ir.model.fields,field_description:html_text.field_ir_fields_converter__display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: html_text
+#: model:ir.model,name:html_text.model_ir_fields_converter
+#, fuzzy
+msgid "Fields Converter"
+msgstr "ir.fields.converter"
+
+#. module: html_text
+#: model:ir.model.fields,field_description:html_text.field_ir_fields_converter__id
+msgid "ID"
+msgstr ""
+
+#. module: html_text
+#: model:ir.model.fields,field_description:html_text.field_ir_fields_converter____last_update
+msgid "Last Modified on"
+msgstr ""
+
+#. module: html_text
+#: model:ir.model.fields,field_description:html_text.field_ir_fields_converter__smart_search
+msgid "Smart Search"
+msgstr ""
diff --git a/odex25_transactions/html_text/i18n/es.po b/odex25_transactions/html_text/i18n/es.po
new file mode 100644
index 000000000..d32bd69b4
--- /dev/null
+++ b/odex25_transactions/html_text/i18n/es.po
@@ -0,0 +1,45 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * html_text
+#
+# Translators:
+# Pedro M. Baeza , 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 9.0c\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-12-17 02:07+0000\n"
+"PO-Revision-Date: 2021-03-19 17:46+0000\n"
+"Last-Translator: Ana Suárez \n"
+"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.3.2\n"
+
+#. module: html_text
+#: model:ir.model.fields,field_description:html_text.field_ir_fields_converter__display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: html_text
+#: model:ir.model,name:html_text.model_ir_fields_converter
+msgid "Fields Converter"
+msgstr "Convertidor de Campos"
+
+#. module: html_text
+#: model:ir.model.fields,field_description:html_text.field_ir_fields_converter__id
+msgid "ID"
+msgstr ""
+
+#. module: html_text
+#: model:ir.model.fields,field_description:html_text.field_ir_fields_converter____last_update
+msgid "Last Modified on"
+msgstr ""
+
+#. module: html_text
+#: model:ir.model.fields,field_description:html_text.field_ir_fields_converter__smart_search
+msgid "Smart Search"
+msgstr ""
diff --git a/odex25_transactions/html_text/i18n/es_ES.po b/odex25_transactions/html_text/i18n/es_ES.po
new file mode 100644
index 000000000..b6e252571
--- /dev/null
+++ b/odex25_transactions/html_text/i18n/es_ES.po
@@ -0,0 +1,46 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * html_text
+#
+# Translators:
+# Fernando Lara , 2017
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 9.0c\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-02-16 10:39+0000\n"
+"PO-Revision-Date: 2017-02-16 10:39+0000\n"
+"Last-Translator: Fernando Lara , 2017\n"
+"Language-Team: Spanish (Spain) (https://www.transifex.com/oca/teams/23907/"
+"es_ES/)\n"
+"Language: es_ES\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: html_text
+#: model:ir.model.fields,field_description:html_text.field_ir_fields_converter__display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: html_text
+#: model:ir.model,name:html_text.model_ir_fields_converter
+#, fuzzy
+msgid "Fields Converter"
+msgstr "ir.documentos.conversor"
+
+#. module: html_text
+#: model:ir.model.fields,field_description:html_text.field_ir_fields_converter__id
+msgid "ID"
+msgstr ""
+
+#. module: html_text
+#: model:ir.model.fields,field_description:html_text.field_ir_fields_converter____last_update
+msgid "Last Modified on"
+msgstr ""
+
+#. module: html_text
+#: model:ir.model.fields,field_description:html_text.field_ir_fields_converter__smart_search
+msgid "Smart Search"
+msgstr ""
diff --git a/odex25_transactions/html_text/i18n/hr.po b/odex25_transactions/html_text/i18n/hr.po
new file mode 100644
index 000000000..a0cc5ac2f
--- /dev/null
+++ b/odex25_transactions/html_text/i18n/hr.po
@@ -0,0 +1,43 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * html_text
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 12.0\n"
+"Report-Msgid-Bugs-To: \n"
+"PO-Revision-Date: 2019-11-13 17:34+0000\n"
+"Last-Translator: Bole \n"
+"Language-Team: none\n"
+"Language: hr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 3.8\n"
+
+#. module: html_text
+#: model:ir.model.fields,field_description:html_text.field_ir_fields_converter__display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: html_text
+#: model:ir.model,name:html_text.model_ir_fields_converter
+msgid "Fields Converter"
+msgstr "Pretvaranje polja"
+
+#. module: html_text
+#: model:ir.model.fields,field_description:html_text.field_ir_fields_converter__id
+msgid "ID"
+msgstr ""
+
+#. module: html_text
+#: model:ir.model.fields,field_description:html_text.field_ir_fields_converter____last_update
+msgid "Last Modified on"
+msgstr ""
+
+#. module: html_text
+#: model:ir.model.fields,field_description:html_text.field_ir_fields_converter__smart_search
+msgid "Smart Search"
+msgstr ""
diff --git a/odex25_transactions/html_text/i18n/it.po b/odex25_transactions/html_text/i18n/it.po
new file mode 100644
index 000000000..1c4d41231
--- /dev/null
+++ b/odex25_transactions/html_text/i18n/it.po
@@ -0,0 +1,45 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * html_text
+#
+# Translators:
+# Paolo Valier , 2018
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 10.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-01-06 02:25+0000\n"
+"PO-Revision-Date: 2018-01-06 02:25+0000\n"
+"Last-Translator: Paolo Valier , 2018\n"
+"Language-Team: Italian (https://www.transifex.com/oca/teams/23907/it/)\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. module: html_text
+#: model:ir.model.fields,field_description:html_text.field_ir_fields_converter__display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: html_text
+#: model:ir.model,name:html_text.model_ir_fields_converter
+#, fuzzy
+msgid "Fields Converter"
+msgstr "ir.fields.converter"
+
+#. module: html_text
+#: model:ir.model.fields,field_description:html_text.field_ir_fields_converter__id
+msgid "ID"
+msgstr ""
+
+#. module: html_text
+#: model:ir.model.fields,field_description:html_text.field_ir_fields_converter____last_update
+msgid "Last Modified on"
+msgstr ""
+
+#. module: html_text
+#: model:ir.model.fields,field_description:html_text.field_ir_fields_converter__smart_search
+msgid "Smart Search"
+msgstr ""
diff --git a/odex25_transactions/html_text/i18n/tr.po b/odex25_transactions/html_text/i18n/tr.po
new file mode 100644
index 000000000..c5d8d9aa8
--- /dev/null
+++ b/odex25_transactions/html_text/i18n/tr.po
@@ -0,0 +1,45 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * html_text
+#
+# Translators:
+# Ahmet Altinisik , 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 9.0c\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-12-29 03:40+0000\n"
+"PO-Revision-Date: 2016-12-29 03:40+0000\n"
+"Last-Translator: Ahmet Altinisik , 2016\n"
+"Language-Team: Turkish (https://www.transifex.com/oca/teams/23907/tr/)\n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#. module: html_text
+#: model:ir.model.fields,field_description:html_text.field_ir_fields_converter__display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: html_text
+#: model:ir.model,name:html_text.model_ir_fields_converter
+#, fuzzy
+msgid "Fields Converter"
+msgstr "ir.fields.converter"
+
+#. module: html_text
+#: model:ir.model.fields,field_description:html_text.field_ir_fields_converter__id
+msgid "ID"
+msgstr ""
+
+#. module: html_text
+#: model:ir.model.fields,field_description:html_text.field_ir_fields_converter____last_update
+msgid "Last Modified on"
+msgstr ""
+
+#. module: html_text
+#: model:ir.model.fields,field_description:html_text.field_ir_fields_converter__smart_search
+msgid "Smart Search"
+msgstr ""
diff --git a/odex25_transactions/html_text/i18n/zh_CN.po b/odex25_transactions/html_text/i18n/zh_CN.po
new file mode 100644
index 000000000..7aea0bc70
--- /dev/null
+++ b/odex25_transactions/html_text/i18n/zh_CN.po
@@ -0,0 +1,42 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * html_text
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 12.0\n"
+"Report-Msgid-Bugs-To: \n"
+"PO-Revision-Date: 2019-08-31 06:18+0000\n"
+"Last-Translator: 黎伟杰 <674416404@qq.com>\n"
+"Language-Team: none\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Weblate 3.8\n"
+
+#. module: html_text
+#: model:ir.model.fields,field_description:html_text.field_ir_fields_converter__display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: html_text
+#: model:ir.model,name:html_text.model_ir_fields_converter
+msgid "Fields Converter"
+msgstr "字段转换器"
+
+#. module: html_text
+#: model:ir.model.fields,field_description:html_text.field_ir_fields_converter__id
+msgid "ID"
+msgstr ""
+
+#. module: html_text
+#: model:ir.model.fields,field_description:html_text.field_ir_fields_converter____last_update
+msgid "Last Modified on"
+msgstr ""
+
+#. module: html_text
+#: model:ir.model.fields,field_description:html_text.field_ir_fields_converter__smart_search
+msgid "Smart Search"
+msgstr ""
diff --git a/odex25_transactions/html_text/models/__init__.py b/odex25_transactions/html_text/models/__init__.py
new file mode 100644
index 000000000..e21238ee9
--- /dev/null
+++ b/odex25_transactions/html_text/models/__init__.py
@@ -0,0 +1,3 @@
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+
+from . import ir_fields_converter
diff --git a/odex25_transactions/html_text/models/ir_fields_converter.py b/odex25_transactions/html_text/models/ir_fields_converter.py
new file mode 100644
index 000000000..f407aeab3
--- /dev/null
+++ b/odex25_transactions/html_text/models/ir_fields_converter.py
@@ -0,0 +1,74 @@
+# Copyright 2016-2017 Jairo Llopis
+# Copyright 2016 Tecnativa - Vicent Cubells
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+
+import logging
+
+from lxml import etree, html
+
+from odoo import api, models
+
+_logger = logging.getLogger(__name__)
+
+
+class IrFieldsConverter(models.AbstractModel):
+ _inherit = "ir.fields.converter"
+
+ @api.model
+ def text_from_html(
+ self, html_content, max_words=None, max_chars=None, ellipsis="…", fail=False
+ ):
+ """Extract text from an HTML field in a generator.
+
+ :param str html_content:
+ HTML contents from where to extract the text.
+
+ :param int max_words:
+ Maximum amount of words allowed in the resulting string.
+
+ :param int max_chars:
+ Maximum amount of characters allowed in the resulting string. If
+ you apply this limit, beware that the last word could get cut in an
+ unexpected place.
+
+ :param str ellipsis:
+ Character(s) to be appended to the end of the resulting string if
+ it gets truncated after applying limits set in :param:`max_words`
+ or :param:`max_chars`. If you want nothing applied, just set an
+ empty string.
+
+ :param bool fail:
+ If ``True``, exceptions will be raised. Otherwise, an empty string
+ will be returned on failure.
+ """
+ # Parse HTML
+ try:
+ doc = html.fromstring(html_content)
+ except (TypeError, etree.XMLSyntaxError, etree.ParserError):
+ if fail:
+ raise
+ else:
+ _logger.exception("Failure parsing this HTML:\n%s", html_content)
+ return ""
+
+ # Get words
+ words = "".join(doc.xpath("//text()")).split()
+
+ # Truncate words
+ suffix = max_words and len(words) > max_words
+ if max_words:
+ words = words[:max_words]
+
+ # Get text
+ text = " ".join(words)
+
+ # Truncate text
+ suffix = suffix or max_chars and len(text) > max_chars
+ if max_chars:
+ text = text[: max_chars - (len(ellipsis) if suffix else 0)].strip()
+
+ # Append ellipsis if needed
+ if suffix:
+ text += ellipsis
+
+ return text
diff --git a/odex25_transactions/html_text/readme/CONTRIBUTORS.rst b/odex25_transactions/html_text/readme/CONTRIBUTORS.rst
new file mode 100644
index 000000000..bd6b8caf4
--- /dev/null
+++ b/odex25_transactions/html_text/readme/CONTRIBUTORS.rst
@@ -0,0 +1,7 @@
+* Dennis Sluijk
+* `Tecnativa `_:",
+* Helly kapatel
+
+ * Jairo Llopis
+ * Vicent Cubells
+ * Víctor Martínez
diff --git a/odex25_transactions/html_text/readme/DESCRIPTION.rst b/odex25_transactions/html_text/readme/DESCRIPTION.rst
new file mode 100644
index 000000000..579fd7667
--- /dev/null
+++ b/odex25_transactions/html_text/readme/DESCRIPTION.rst
@@ -0,0 +1,7 @@
+This module provides some technical features that allow to extract text from
+any chunk of HTML, without HTML tags or attributes. You can chose either:
+
+* To truncate the result by amount of words or characters.
+* To append an ellipsis (or any character(s)) at the end of the result.
+
+It can be used to easily generate excerpts.
diff --git a/odex25_transactions/html_text/readme/ROADMAP.rst b/odex25_transactions/html_text/readme/ROADMAP.rst
new file mode 100644
index 000000000..0a77fddef
--- /dev/null
+++ b/odex25_transactions/html_text/readme/ROADMAP.rst
@@ -0,0 +1,2 @@
+* An option could be added to try to respect the basic HTML tags inside the
+ excerpt (````, ````, `` ``, etc.).
diff --git a/odex25_transactions/html_text/readme/USAGE.rst b/odex25_transactions/html_text/readme/USAGE.rst
new file mode 100644
index 000000000..ae34a9b25
--- /dev/null
+++ b/odex25_transactions/html_text/readme/USAGE.rst
@@ -0,0 +1,21 @@
+This module just adds a technical utility, but nothing for the end user.
+
+If you are a developer and need this utility for your module, see these
+examples and read the docs inside the code.
+
+Python example::
+
+ def some_method(self):
+ # Get truncated text from an HTML field. It will 40 words and 100
+ # characters at most, and will have "..." appended at the end if it
+ # gets truncated.
+ truncated_text = self.env["ir.fields.converter"].text_from_html(
+ self.html_field, 40, 100, "...")
+
+QWeb example::
+
+
+
+.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
+ :alt: Try me on Runbot
+ :target: https://runbot.odoo-community.org/runbot/149/11.0
diff --git a/odex25_transactions/html_text/static/description/icon.png b/odex25_transactions/html_text/static/description/icon.png
new file mode 100644
index 000000000..3a0328b51
Binary files /dev/null and b/odex25_transactions/html_text/static/description/icon.png differ
diff --git a/odex25_transactions/html_text/static/description/index.html b/odex25_transactions/html_text/static/description/index.html
new file mode 100644
index 000000000..b626cc6ca
--- /dev/null
+++ b/odex25_transactions/html_text/static/description/index.html
@@ -0,0 +1,463 @@
+
+
+
+
+
+
+Text from HTML field
+
+
+
+
+
Text from HTML field
+
+
+
+
This module provides some technical features that allow to extract text from
+any chunk of HTML, without HTML tags or attributes. You can chose either:
+
+To truncate the result by amount of words or characters.
+To append an ellipsis (or any character(s)) at the end of the result.
+
+
It can be used to easily generate excerpts.
+
Table of contents
+
+
+
+
This module just adds a technical utility, but nothing for the end user.
+
If you are a developer and need this utility for your module, see these
+examples and read the docs inside the code.
+
Python example:
+
+def some_method(self):
+ # Get truncated text from an HTML field. It will 40 words and 100
+ # characters at most, and will have "..." appended at the end if it
+ # gets truncated.
+ truncated_text = self.env["ir.fields.converter"].text_from_html(
+ self.html_field, 40, 100, "...")
+
+
QWeb example:
+
+<t t-esc="env['ir.fields.converter'].text_from_html(doc.html_field)"/>
+
+
+
+
+
+
+An option could be added to try to respect the basic HTML tags inside the
+excerpt (<b> , <i> , <p> , etc.).
+
+
+
+
+
Bugs are tracked on GitHub 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 .
+
Do not contact contributors directly about support or help with technical issues.
+
+
+
+
+
+
+Grupo ESOC Ingeniería de Servicios
+Tecnativa
+Onestein
+
+
+
+
+
+
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.
+
This module is part of the OCA/server-tools project on GitHub.
+
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute .
+
+
+
+
+
diff --git a/odex25_transactions/html_text/tests/__init__.py b/odex25_transactions/html_text/tests/__init__.py
new file mode 100644
index 000000000..d9d2b331a
--- /dev/null
+++ b/odex25_transactions/html_text/tests/__init__.py
@@ -0,0 +1,3 @@
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+
+from . import test_extractor
diff --git a/odex25_transactions/html_text/tests/test_extractor.py b/odex25_transactions/html_text/tests/test_extractor.py
new file mode 100644
index 000000000..a99b6e8d7
--- /dev/null
+++ b/odex25_transactions/html_text/tests/test_extractor.py
@@ -0,0 +1,54 @@
+# Copyright 2016-2017 Jairo Llopis
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+
+from odoo.tests.common import TransactionCase
+from odoo.tools import mute_logger
+
+
+class ExtractorCase(TransactionCase):
+ def setUp(self):
+ super().setUp()
+ # Shortcut
+ self.text_from_html = self.env["ir.fields.converter"].text_from_html
+
+ def test_excerpts(self):
+ """Text gets correctly extracted."""
+ html = """
+
+
+
+
I'm a title
+
I'm a paragraph
+
¡Pues yo soy español!
+
+
+
+ """
+ self.assertEqual(
+ self.text_from_html(html),
+ "I'm a title I'm a paragraph ¡Pues yo soy español!",
+ )
+ self.assertEqual(
+ self.text_from_html(html, 8), "I'm a title I'm a paragraph ¡Pues yo…"
+ )
+ self.assertEqual(
+ self.text_from_html(html, 8, 31), "I'm a title I'm a paragraph ¡P…"
+ )
+ self.assertEqual(
+ self.text_from_html(html, 7, ellipsis=""),
+ "I'm a title I'm a paragraph ¡Pues",
+ )
+
+ @mute_logger("odoo.addons.html_text.models.ir_fields_converter")
+ def test_empty_html(self):
+ """Empty HTML handled correctly."""
+ self.assertEqual(self.text_from_html(""), "")
+ with self.assertRaises(Exception):
+ self.text_from_html("", fail=True)
+
+ @mute_logger("odoo.addons.html_text.models.ir_fields_converter")
+ def test_false_html(self):
+ """``False`` HTML handled correctly."""
+ self.assertEqual(self.text_from_html(False), "")
+ with self.assertRaises(Exception):
+ self.text_from_html(False, fail=True)
diff --git a/odex25_transactions/odex_sms/__init__.py b/odex25_transactions/odex_sms/__init__.py
new file mode 100644
index 000000000..9a7e03ede
--- /dev/null
+++ b/odex25_transactions/odex_sms/__init__.py
@@ -0,0 +1 @@
+from . import models
\ No newline at end of file
diff --git a/odex25_transactions/odex_sms/__manifest__.py b/odex25_transactions/odex_sms/__manifest__.py
new file mode 100644
index 000000000..afd2dfac7
--- /dev/null
+++ b/odex25_transactions/odex_sms/__manifest__.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+{
+ 'name': 'Odoo SMS Integration',
+ 'version': '1.0',
+ 'sequence': 4,
+ 'website': 'http://exp-sa.com',
+ 'license': 'GPL-3',
+ 'author': 'Expert Ltd',
+ 'category':'Odex25-Transactions/Odex25-Transactions',
+ 'summary': 'Odoo SMS Integration',
+ 'description': """
+ Odoo odex_sms Integration
+ """,
+ 'depends': ['base'],
+ 'data': ['security/ir.model.access.csv',
+ 'views/res_company_view.xml'
+ ],
+ 'installable': True,
+ 'application': True,
+}
diff --git a/odex25_transactions/odex_sms/i18n/ar_SY.po b/odex25_transactions/odex_sms/i18n/ar_SY.po
new file mode 100644
index 000000000..b301fbce4
--- /dev/null
+++ b/odex25_transactions/odex_sms/i18n/ar_SY.po
@@ -0,0 +1,226 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * odex_sms
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 11.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2022-04-07 11:16+0000\n"
+"PO-Revision-Date: 2022-04-07 11:16+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: odex_sms
+#: model:ir.ui.view,arch_db:odex_sms.grant_benefit_form
+msgid ": برجاء استخدام هذه المفاتيح لاستخدام في القالب"
+msgstr ": برجاء استخدام هذه المفاتيح لاستخدام في القالب"
+
+#. module: odex_sms
+#: selection:benefit.sms.configuration,state:0
+msgid "Approved"
+msgstr "تم الموافقة"
+
+#. module: odex_sms
+#: selection:benefit.sms.configuration,state:0
+msgid "Black List"
+msgstr "القائمة السوداء"
+
+#. module: odex_sms
+#: selection:benefit.sms.configuration,state:0
+msgid "Complete Information"
+msgstr "اكمال البيانات"
+
+#. module: odex_sms
+#: model:ir.model.fields,field_description:odex_sms.field_benefit_sms_configuration_create_uid
+msgid "Created by"
+msgstr "أنشئ بواسطة"
+
+#. module: odex_sms
+#: model:ir.model.fields,field_description:odex_sms.field_benefit_sms_configuration_create_date
+msgid "Created on"
+msgstr "أنشئ في"
+
+#. module: odex_sms
+#: model:ir.model.fields,field_description:odex_sms.field_benefit_sms_configuration_display_name
+msgid "Display Name"
+msgstr "الاسم المعروض"
+
+#. module: odex_sms
+#: selection:benefit.sms.configuration,state:0
+msgid "Draft"
+msgstr "مبدئ"
+
+#. module: odex_sms
+#: selection:benefit.sms.configuration,state:0
+msgid "Edit Information"
+msgstr "تعديل البيانات"
+
+#. module: odex_sms
+#: selection:benefit.sms.configuration,state:0
+msgid "First Refusal"
+msgstr "الرفض المبدئ"
+
+#. module: odex_sms
+#: model:ir.model.fields,field_description:odex_sms.field_benefit_sms_configuration_id
+msgid "ID"
+msgstr "المعرف"
+
+#. module: odex_sms
+#: model:ir.model.fields,field_description:odex_sms.field_benefit_sms_configuration___last_update
+msgid "Last Modified on"
+msgstr "آخر تعديل في"
+
+#. module: odex_sms
+#: model:ir.model.fields,field_description:odex_sms.field_benefit_sms_configuration_write_uid
+msgid "Last Updated by"
+msgstr "آخر تحديث بواسطة"
+
+#. module: odex_sms
+#: model:ir.model.fields,field_description:odex_sms.field_benefit_sms_configuration_write_date
+msgid "Last Updated on"
+msgstr "آخر تحديث في"
+
+#. module: odex_sms
+#: selection:benefit.sms.configuration,state:0
+msgid "Not Leaving"
+msgstr "متوفى"
+
+#. module: odex_sms
+#: model:ir.model.fields,field_description:odex_sms.field_res_company_password
+msgid "Password"
+msgstr "كلمة المرور"
+
+#. module: odex_sms
+#: selection:benefit.sms.configuration,state:0
+msgid "Refused"
+msgstr "رفض"
+
+#. module: odex_sms
+#: model:ir.model,name:odex_sms.model_res_company
+msgid "Res Company OneDrive Configuration Customization"
+msgstr "Res Company OneDrive Configuration Customization"
+
+#. module: odex_sms
+#: model:ir.ui.view,arch_db:odex_sms.Sms_view_company_form
+msgid "SMS Gateway"
+msgstr "إعدادات الرسائل النصية"
+
+#. module: odex_sms
+#: model:ir.actions.act_window,name:odex_sms.benefit_sms_configuration_action
+#: model:ir.ui.menu,name:odex_sms.sms_menu
+#: model:ir.ui.view,arch_db:odex_sms.benefit_sms_configuration_tree
+#: model:ir.ui.view,arch_db:odex_sms.grant_benefit_form
+msgid "SMS Template"
+msgstr "قوالب الرسائل النصية "
+
+#. module: odex_sms
+#: model:ir.model.fields,field_description:odex_sms.field_res_company_user_send
+msgid "Sender"
+msgstr "اسم المرسل"
+
+#. module: odex_sms
+#: model:ir.model.fields,field_description:odex_sms.field_res_company_sms_active
+msgid "Sms Active"
+msgstr "تنشيط الرسائل"
+
+#. module: odex_sms
+#: model:ir.actions.act_window,help:odex_sms.benefit_sms_configuration_action
+msgid "Sms Configuration"
+msgstr "إعدادات الرسائل "
+
+#. module: odex_sms
+#: model:ir.model.fields,field_description:odex_sms.field_benefit_sms_configuration_state
+msgid "State"
+msgstr "الحــالة"
+
+#. module: odex_sms
+#: model:ir.model.fields,field_description:odex_sms.field_res_company_user_name
+msgid "User Name"
+msgstr "اسم المستخدم"
+
+#. module: odex_sms
+#: selection:benefit.sms.configuration,state:0
+msgid "Waiting Approved"
+msgstr "في انتظار الموافقة"
+
+#. module: odex_sms
+#: model:ir.model,name:odex_sms.model_benefit_sms_configuration
+msgid "benefit.sms.configuration"
+msgstr "benefit.sms.configuration"
+
+#. module: odex_sms
+#: model:ir.model.fields,field_description:odex_sms.field_benefit_sms_configuration_case_text
+msgid "case Text"
+msgstr "نص الرسالة"
+
+#. module: odex_sms
+#: model:ir.model,name:odex_sms.model_grant_benefit
+msgid "grant.benefit"
+msgstr "grant.benefit"
+
+#. module: odex_sms
+#: model:ir.model.fields,field_description:odex_sms.field_benefit_sms_configuration_name
+msgid "name"
+msgstr "اسم القالب"
+
+#. module: odex_sms
+#: model:ir.ui.view,arch_db:odex_sms.Sms_view_company_form
+msgid "password"
+msgstr "كلمة المرور"
+
+#. module: odex_sms
+#: model:ir.ui.view,arch_db:odex_sms.Sms_view_company_form
+msgid "user name"
+msgstr "اسم المستخدم"
+
+#. module: odex_sms
+#: code:addons/odex_sms/models/sms.py:25
+#, python-format
+msgid "عفواءً اسم المرسل غير متاح!"
+msgstr "عفواءً اسم المرسل غير متاح!"
+
+#. module: odex_sms
+#: code:addons/odex_sms/models/sms.py:21
+#, python-format
+msgid "عفواءً خطاء في اسم المستخدم!"
+msgstr "عفواءً خطاء في اسم المستخدم!"
+
+#. module: odex_sms
+#: code:addons/odex_sms/models/sms.py:23
+#, python-format
+msgid "عفواءً خطاء في كلمة المرور!"
+msgstr "عفواءً خطاء في كلمة المرور!"
+
+#. module: odex_sms
+#: code:addons/odex_sms/models/sms.py:19
+#, python-format
+msgid "عفواءً لا يوجد رصيد كافي!"
+msgstr "عفواءً لا يوجد رصيد كافي!"
+
+#. module: odex_sms
+#: code:addons/odex_sms/models/sms.py:27
+#: code:addons/odex_sms/models/sms.py:29
+#, python-format
+msgid "عفواءً لم يتم وضع رسالة!"
+msgstr "عفواءً لم يتم وضع رسالة!"
+
+#. module: odex_sms
+#: model:ir.ui.view,arch_db:odex_sms.grant_benefit_form
+msgid "عند الحوجة لاستخدام اسم المستفيد ادخل $اسم_المستفيد *"
+msgstr "عند الحوجة لاستخدام اسم المستفيد ادخل $اسم_المستفيد *"
+
+#. module: odex_sms
+#: model:ir.ui.view,arch_db:odex_sms.grant_benefit_form
+msgid "عند الحوجة لاستخدام اسم عائلة المستفيد ادخل $اسم_العائلة *"
+msgstr "عند الحوجة لاستخدام اسم عائلة المستفيد ادخل $اسم_العائلة *"
+
+#. module: odex_sms
+#: model:ir.ui.view,arch_db:odex_sms.grant_benefit_form
+msgid "عند الحوجة لاستخدام رقم هوية المستفيد ادخل $رقم_الهوية *"
+msgstr "عند الحوجة لاستخدام رقم هوية المستفيد ادخل $رقم_الهوية *"
+
diff --git a/odex25_transactions/odex_sms/models/__init__.py b/odex25_transactions/odex_sms/models/__init__.py
new file mode 100644
index 000000000..c4e8a82ba
--- /dev/null
+++ b/odex25_transactions/odex_sms/models/__init__.py
@@ -0,0 +1,2 @@
+# -*- coding: utf-8 -*-
+from . import res_company
\ No newline at end of file
diff --git a/odex25_transactions/odex_sms/models/res_company.py b/odex25_transactions/odex_sms/models/res_company.py
new file mode 100644
index 000000000..901e19365
--- /dev/null
+++ b/odex25_transactions/odex_sms/models/res_company.py
@@ -0,0 +1,59 @@
+# -*- coding: utf-8 -*-
+import requests
+from odoo import api, models, fields, _
+from odoo.exceptions import ValidationError
+
+
+class ResCompanySMS(models.Model):
+ _inherit = "res.company"
+ _description = "Res Company SMS Configuration"
+
+ # Company Level SMS Configuration Fields
+ sms_active = fields.Boolean()
+ user_name = fields.Char("User Name")
+ password = fields.Char("Password")
+ user_send = fields.Char("Sender")
+ api_sms = fields.Char("API")
+ api_unicode = fields.Char("Unicode")
+
+ @api.model
+ def send_sms(self, number, message):
+ """
+ This method is used to send odex_sms
+ """
+ if self.user_name and self.password and number:
+ url = self.api_sms + "?user=" + self.user_name + "&pass=" + self.password + "&to=" + number + "&message=" + message + "&sender=" + self.user_send + "&unicode=" + self.api_unicode
+ headers = {'Accept-Encoding': 'identity'}
+ try:
+ response = requests.get(url, headers=headers)
+ except:
+ print("Oops! Something wrong")
+ request = response.text[:100].split("-")
+ print("*************************************************************************************", request)
+ error = self.get_error_response(str(request))
+ print(error)
+ print(response)
+ print("SMS Successfully Sent")
+
+ return response
+
+ def get_error_response(self, result):
+ print(result)
+ if result == "100":
+ raise ValidationError(_("SMS : Missing parameters (not exist or empty) Username And password"))
+ if result == "110":
+ raise ValidationError(_("SMS :Account not exist (wrong username or password)"))
+ if result == "111":
+ raise ValidationError(_("SMS : The account not activated."))
+ if result == "112":
+ raise ValidationError(_("SMS : Blocked account."))
+ if result == "113":
+ raise ValidationError(_("SMS : Not enough balance."))
+ if result == "114":
+ raise ValidationError(_("SMS : The service not available for now"))
+ if result == "115":
+ raise ValidationError(_("SMS : The sender not available (if user have no opened sender)"))
+ if result == "116":
+ raise ValidationError(_("SMS : The sender not available (if user have no opened sender)"))
+ if result == "120":
+ raise ValidationError(_("SMS : No destination addresses, or all destinations are not correct)"))
diff --git a/odex25_transactions/odex_sms/security/ir.model.access.csv b/odex25_transactions/odex_sms/security/ir.model.access.csv
new file mode 100644
index 000000000..08145a00f
--- /dev/null
+++ b/odex25_transactions/odex_sms/security/ir.model.access.csv
@@ -0,0 +1,2 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+
diff --git a/odex25_transactions/odex_sms/static/description/icon.png b/odex25_transactions/odex_sms/static/description/icon.png
new file mode 100644
index 000000000..4141f52da
Binary files /dev/null and b/odex25_transactions/odex_sms/static/description/icon.png differ
diff --git a/odex25_transactions/odex_sms/views/res_company_view.xml b/odex25_transactions/odex_sms/views/res_company_view.xml
new file mode 100644
index 000000000..698870603
--- /dev/null
+++ b/odex25_transactions/odex_sms/views/res_company_view.xml
@@ -0,0 +1,24 @@
+
+
+
+
+ sms.view.company.form
+ res.company
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_transactions/transaction_cmis/__init__.py b/odex25_transactions/transaction_cmis/__init__.py
new file mode 100644
index 000000000..9a7e03ede
--- /dev/null
+++ b/odex25_transactions/transaction_cmis/__init__.py
@@ -0,0 +1 @@
+from . import models
\ No newline at end of file
diff --git a/odex25_transactions/transaction_cmis/__manifest__.py b/odex25_transactions/transaction_cmis/__manifest__.py
new file mode 100644
index 000000000..e22432e02
--- /dev/null
+++ b/odex25_transactions/transaction_cmis/__manifest__.py
@@ -0,0 +1,29 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# Odex - Communications Management System.
+# Copyright (C) 2019 Expert Co. Ltd. ().
+#
+##############################################################################
+{
+ 'name': 'Communications Management DMS',
+ 'version': '1.0',
+ 'author': 'Expert Co. Ltd. - Sudan Team',
+ 'summary': 'Communications Management DMS',
+ 'description': """
+Odex - Communications Management System DMS
+========================================
+Managing Communications Transcations DMS
+ """,
+ 'website': 'http://www.exp-sa.com',
+ 'category':'Odex25-Transactions/Odex25-Transactions',
+ 'depends': ['exp_transaction_documents', 'cmis_field'],
+ 'data': [
+ 'views/internal_transaction.xml',
+ ],
+ 'qweb' : [
+ ],
+ 'installable': True,
+ 'auto_install': False,
+ 'application': True,
+}
diff --git a/odex25_transactions/transaction_cmis/models/__init__.py b/odex25_transactions/transaction_cmis/models/__init__.py
new file mode 100644
index 000000000..af290cf1a
--- /dev/null
+++ b/odex25_transactions/transaction_cmis/models/__init__.py
@@ -0,0 +1 @@
+from . import internal_transaction
\ No newline at end of file
diff --git a/odex25_transactions/transaction_cmis/models/internal_transaction.py b/odex25_transactions/transaction_cmis/models/internal_transaction.py
new file mode 100644
index 000000000..cc7b22a22
--- /dev/null
+++ b/odex25_transactions/transaction_cmis/models/internal_transaction.py
@@ -0,0 +1,8 @@
+from odoo import models
+from odoo.addons.cmis_field import fields
+
+
+class InternalTransaction(models.Model):
+ _inherit = 'internal.transaction'
+
+ cmis_folder = fields.CmisFolder()
diff --git a/odex25_transactions/transaction_cmis/views/internal_transaction.xml b/odex25_transactions/transaction_cmis/views/internal_transaction.xml
new file mode 100644
index 000000000..f47b0fdc6
--- /dev/null
+++ b/odex25_transactions/transaction_cmis/views/internal_transaction.xml
@@ -0,0 +1,15 @@
+
+
+
+ cmis.common.transactions.internal.form
+ internal.transaction
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file