Merge pull request #443 from expsa/dev_odex25_realstate
Dev odex25 realstate
This commit is contained in:
commit
41071e763e
|
|
@ -0,0 +1,129 @@
|
|||
# Byte-compiled / optimized / DLL files
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
|
||||
# C extensions
|
||||
*.so
|
||||
|
||||
# Distribution / packaging
|
||||
.Python
|
||||
build/
|
||||
develop-eggs/
|
||||
dist/
|
||||
downloads/
|
||||
eggs/
|
||||
.eggs/
|
||||
parts/
|
||||
sdist/
|
||||
wheels/
|
||||
pip-wheel-metadata/
|
||||
share/python-wheels/
|
||||
*.egg-info/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
MANIFEST
|
||||
|
||||
# PyInstaller
|
||||
# Usually these files are written by a python script from a template
|
||||
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||
*.manifest
|
||||
*.spec
|
||||
|
||||
# Installer logs
|
||||
pip-log.txt
|
||||
pip-delete-this-directory.txt
|
||||
|
||||
# Unit test / coverage reports
|
||||
htmlcov/
|
||||
.tox/
|
||||
.nox/
|
||||
.coverage
|
||||
.coverage.*
|
||||
.cache
|
||||
nosetests.xml
|
||||
coverage.xml
|
||||
*.cover
|
||||
*.py,cover
|
||||
.hypothesis/
|
||||
.pytest_cache/
|
||||
|
||||
# Translations
|
||||
*.mo
|
||||
*.pot
|
||||
|
||||
# Django stuff:
|
||||
*.log
|
||||
local_settings.py
|
||||
db.sqlite3
|
||||
db.sqlite3-journal
|
||||
|
||||
# Flask stuff:
|
||||
instance/
|
||||
.webassets-cache
|
||||
|
||||
# Scrapy stuff:
|
||||
.scrapy
|
||||
|
||||
# Sphinx documentation
|
||||
docs/_build/
|
||||
|
||||
# PyBuilder
|
||||
target/
|
||||
|
||||
# Jupyter Notebook
|
||||
.ipynb_checkpoints
|
||||
|
||||
# IPython
|
||||
profile_default/
|
||||
ipython_config.py
|
||||
|
||||
# pyenv
|
||||
.python-version
|
||||
|
||||
# pipenv
|
||||
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
||||
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
||||
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
||||
# install all needed dependencies.
|
||||
#Pipfile.lock
|
||||
|
||||
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
|
||||
__pypackages__/
|
||||
|
||||
# Celery stuff
|
||||
celerybeat-schedule
|
||||
celerybeat.pid
|
||||
|
||||
# SageMath parsed files
|
||||
*.sage.py
|
||||
|
||||
# Environments
|
||||
.env
|
||||
.venv
|
||||
env/
|
||||
venv/
|
||||
ENV/
|
||||
env.bak/
|
||||
venv.bak/
|
||||
|
||||
# Spyder project settings
|
||||
.spyderproject
|
||||
.spyproject
|
||||
|
||||
# Rope project settings
|
||||
.ropeproject
|
||||
|
||||
|
||||
|
||||
# mypy
|
||||
.mypy_cache/
|
||||
.dmypy.json
|
||||
dmypy.json
|
||||
|
||||
# Pyre type checker
|
||||
.pyre/
|
||||
|
||||
# github action
|
||||
.github/workflows/*yaml
|
||||
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from . import models
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
{
|
||||
'name': "City and District",
|
||||
'summary': """Base City and District""",
|
||||
'description': "",
|
||||
'author': 'Expert Co. Ltd.',
|
||||
'website': 'http://exp-sa.com',
|
||||
'category': 'Odex25-Realstate/dex25-Realstate',
|
||||
'version': '0.1',
|
||||
'depends': ['base', 'mail',],
|
||||
'data': [
|
||||
'security/ir.model.access.csv',
|
||||
'views/city_district_views.xml',
|
||||
],
|
||||
'installable': True,
|
||||
'application': True,
|
||||
}
|
||||
|
|
@ -0,0 +1,341 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * country_city
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 14.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-01-04 19:21+0000\n"
|
||||
"PO-Revision-Date: 2022-01-04 19:21+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: country_city
|
||||
#: model_terms:ir.ui.view,arch_db:country_city.city_form_view
|
||||
#: model_terms:ir.ui.view,arch_db:country_city.district_form_view
|
||||
msgid ""
|
||||
"<span class=\"o_stat_text\" attrs=\"{'invisible': [('active', '=', False)]}\">Restore</span>\n"
|
||||
" <span class=\"o_stat_text\" attrs=\"{'invisible': [('active', '=', True)]}\">Archive</span>"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__message_needaction
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__message_needaction
|
||||
msgid "Action Needed"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__active
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__active
|
||||
msgid "Active"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__activity_ids
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__activity_ids
|
||||
msgid "Activities"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__activity_exception_decoration
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__activity_exception_decoration
|
||||
msgid "Activity Exception Decoration"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__activity_state
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__activity_state
|
||||
msgid "Activity State"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__activity_type_icon
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__activity_type_icon
|
||||
msgid "Activity Type Icon"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__message_attachment_count
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__message_attachment_count
|
||||
msgid "Attachment Count"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.actions.act_window,name:country_city.city_action
|
||||
#: model:ir.model,name:country_city.model_re_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__city_id
|
||||
msgid "City"
|
||||
msgstr "المدينة"
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__company_id
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__company_id
|
||||
msgid "Company"
|
||||
msgstr "الشركة"
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__create_uid
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__create_uid
|
||||
msgid "Created by"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__create_date
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__create_date
|
||||
msgid "Created on"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__display_name
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__display_name
|
||||
msgid "Display Name"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.actions.act_window,name:country_city.district_action
|
||||
#: model:ir.model,name:country_city.model_district
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__district_ids
|
||||
#: model_terms:ir.ui.view,arch_db:country_city.city_form_view
|
||||
msgid "District"
|
||||
msgstr "الحي"
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__message_follower_ids
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__message_follower_ids
|
||||
msgid "Followers"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__message_channel_ids
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__message_channel_ids
|
||||
msgid "Followers (Channels)"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__message_partner_ids
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__message_partner_ids
|
||||
msgid "Followers (Partners)"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,help:country_city.field_district__activity_type_icon
|
||||
#: model:ir.model.fields,help:country_city.field_re_city__activity_type_icon
|
||||
msgid "Font awesome icon e.g. fa-tasks"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__id
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__id
|
||||
msgid "ID"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__activity_exception_icon
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__activity_exception_icon
|
||||
msgid "Icon"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,help:country_city.field_district__activity_exception_icon
|
||||
#: model:ir.model.fields,help:country_city.field_re_city__activity_exception_icon
|
||||
msgid "Icon to indicate an exception activity."
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,help:country_city.field_district__message_needaction
|
||||
#: model:ir.model.fields,help:country_city.field_district__message_unread
|
||||
#: model:ir.model.fields,help:country_city.field_re_city__message_needaction
|
||||
#: model:ir.model.fields,help:country_city.field_re_city__message_unread
|
||||
msgid "If checked, new messages require your attention."
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,help:country_city.field_district__message_has_error
|
||||
#: model:ir.model.fields,help:country_city.field_district__message_has_sms_error
|
||||
#: model:ir.model.fields,help:country_city.field_re_city__message_has_error
|
||||
#: model:ir.model.fields,help:country_city.field_re_city__message_has_sms_error
|
||||
msgid "If checked, some messages have a delivery error."
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__message_is_follower
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__message_is_follower
|
||||
msgid "Is Follower"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district____last_update
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city____last_update
|
||||
msgid "Last Modified on"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__write_uid
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__write_uid
|
||||
msgid "Last Updated by"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__write_date
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__write_date
|
||||
msgid "Last Updated on"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__message_main_attachment_id
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__message_main_attachment_id
|
||||
msgid "Main Attachment"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__message_has_error
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__message_has_error
|
||||
msgid "Message Delivery error"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__message_ids
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__message_ids
|
||||
msgid "Messages"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__name
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__name
|
||||
msgid "Name"
|
||||
msgstr "الأسم"
|
||||
|
||||
#. module: country_city
|
||||
#: code:addons/country_city/models/city_configuration.py:0
|
||||
#: code:addons/country_city/models/city_configuration.py:0
|
||||
#, python-format
|
||||
msgid "Name field cannot accept numbers or special character"
|
||||
msgstr "الاسم لا يقبل قيمة رقمية فقط حروف"
|
||||
|
||||
#. module: country_city
|
||||
#: code:addons/country_city/models/city_configuration.py:0
|
||||
#: code:addons/country_city/models/city_configuration.py:0
|
||||
#, python-format
|
||||
msgid "Name field is required (cannot accept white space)"
|
||||
msgstr "حقل الأسم لا يقبل أرقام فقط حروف"
|
||||
|
||||
#. module: country_city
|
||||
#: code:addons/country_city/models/city_configuration.py:0
|
||||
#: code:addons/country_city/models/city_configuration.py:0
|
||||
#, python-format
|
||||
msgid "Name field must be literal"
|
||||
msgstr "حقل الأسم يجب أن يكون قيمة حرفية"
|
||||
|
||||
#. module: country_city
|
||||
#: code:addons/country_city/models/city_configuration.py:0
|
||||
#: code:addons/country_city/models/city_configuration.py:0
|
||||
#: model:ir.model.constraint,message:country_city.constraint_district_name
|
||||
#: model:ir.model.constraint,message:country_city.constraint_re_city_name
|
||||
#, python-format
|
||||
msgid "Name must be unique."
|
||||
msgstr "يجب أن يكون الأسم فريد"
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__activity_date_deadline
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__activity_date_deadline
|
||||
msgid "Next Activity Deadline"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__activity_summary
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__activity_summary
|
||||
msgid "Next Activity Summary"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__activity_type_id
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__activity_type_id
|
||||
msgid "Next Activity Type"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__message_needaction_counter
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__message_needaction_counter
|
||||
msgid "Number of Actions"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__message_has_error_counter
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__message_has_error_counter
|
||||
msgid "Number of errors"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,help:country_city.field_district__message_needaction_counter
|
||||
#: model:ir.model.fields,help:country_city.field_re_city__message_needaction_counter
|
||||
msgid "Number of messages which requires an action"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,help:country_city.field_district__message_has_error_counter
|
||||
#: model:ir.model.fields,help:country_city.field_re_city__message_has_error_counter
|
||||
msgid "Number of messages with delivery error"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,help:country_city.field_district__message_unread_counter
|
||||
#: model:ir.model.fields,help:country_city.field_re_city__message_unread_counter
|
||||
msgid "Number of unread messages"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__activity_user_id
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__activity_user_id
|
||||
msgid "Responsible User"
|
||||
msgstr "المستخدم المدرج"
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__message_has_sms_error
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__message_has_sms_error
|
||||
msgid "SMS Delivery error"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,help:country_city.field_district__activity_state
|
||||
#: model:ir.model.fields,help:country_city.field_re_city__activity_state
|
||||
msgid ""
|
||||
"Status based on activities\n"
|
||||
"Overdue: Due date is already passed\n"
|
||||
"Today: Activity date is today\n"
|
||||
"Planned: Future activities."
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,help:country_city.field_district__activity_exception_decoration
|
||||
#: model:ir.model.fields,help:country_city.field_re_city__activity_exception_decoration
|
||||
msgid "Type of the exception activity on record."
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__message_unread
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__message_unread
|
||||
msgid "Unread Messages"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__message_unread_counter
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__message_unread_counter
|
||||
msgid "Unread Messages Counter"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,field_description:country_city.field_district__website_message_ids
|
||||
#: model:ir.model.fields,field_description:country_city.field_re_city__website_message_ids
|
||||
msgid "Website Messages"
|
||||
msgstr ""
|
||||
|
||||
#. module: country_city
|
||||
#: model:ir.model.fields,help:country_city.field_district__website_message_ids
|
||||
#: model:ir.model.fields,help:country_city.field_re_city__website_message_ids
|
||||
msgid "Website communication history"
|
||||
msgstr ""
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from . import city_configuration
|
||||
|
|
@ -0,0 +1,78 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
import re
|
||||
from odoo import models, fields, api,_
|
||||
from odoo.exceptions import ValidationError
|
||||
|
||||
class Cities(models.Model):
|
||||
_name = 're.city'
|
||||
_description = 'City'
|
||||
_inherit = ['mail.thread','mail.activity.mixin']
|
||||
_order = "id desc"
|
||||
|
||||
active = fields.Boolean(default=True)
|
||||
name = fields.Char(string="Name")
|
||||
district_ids = fields.One2many('district','city_id',string="District")
|
||||
company_id = fields.Many2one('res.company', string='Company',
|
||||
default=lambda self: self.env.user.company_id)
|
||||
|
||||
_sql_constraints = [
|
||||
('name', 'unique(name)', _('Name must be unique.')),
|
||||
]
|
||||
|
||||
@api.constrains('name')
|
||||
def fields_check(self):
|
||||
"""
|
||||
Check if name field contain an invalid value
|
||||
:raise exception
|
||||
"""
|
||||
num_pattern = re.compile(r'\d', re.I | re.M)
|
||||
white_space = re.compile(r'^\s')
|
||||
if not re.match(
|
||||
"^[\u0600-\u065F\u066A-\u06EF\u06FA-\u06FFa-zA-Z]+[\u0600-\u065F\u066A-\u06EF\u06FA-\u06FFa-zA-Z-_]*$",
|
||||
self.name.replace(" ", "")):
|
||||
raise ValidationError(_('Name field must be literal'))
|
||||
if num_pattern.search(self.name):
|
||||
raise ValidationError(_("Name field cannot accept numbers or special character"))
|
||||
if white_space.search(self.name):
|
||||
raise ValidationError(_("Name field is required (cannot accept white space)"))
|
||||
|
||||
|
||||
class District(models.Model):
|
||||
_name = 'district'
|
||||
_description = 'District'
|
||||
_inherit = ['mail.thread','mail.activity.mixin']
|
||||
_order = "id desc"
|
||||
|
||||
active = fields.Boolean(default=True)
|
||||
name = fields.Char(string="Name")
|
||||
company_id = fields.Many2one('res.company', string='Company',
|
||||
default=lambda self: self.env.user.company_id)
|
||||
city_id = fields.Many2one('re.city', string="City")
|
||||
|
||||
_sql_constraints = [
|
||||
('name', 'unique(name,city_id)', _('Name must be unique.')),
|
||||
]
|
||||
|
||||
@api.constrains('name')
|
||||
def fields_check(self):
|
||||
"""
|
||||
Check if name field contain an invalid value
|
||||
:raise exception
|
||||
"""
|
||||
num_pattern = re.compile(r'\d', re.I | re.M)
|
||||
white_space = re.compile(r'^\s')
|
||||
if not re.match(
|
||||
"^[\u0600-\u065F\u066A-\u06EF\u06FA-\u06FFa-zA-Z]+[\u0600-\u065F\u066A-\u06EF\u06FA-\u06FFa-zA-Z-_]*$",
|
||||
self.name.replace(" ", "")):
|
||||
raise ValidationError(_('Name field must be literal'))
|
||||
if num_pattern.search(self.name):
|
||||
raise ValidationError(_("Name field cannot accept numbers or special character"))
|
||||
if white_space.search(self.name):
|
||||
raise ValidationError(_("Name field is required (cannot accept white space)"))
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||
access_city,re.city,model_re_city,real_estate.group_real_estate_user,1,1,1,1
|
||||
access_district,res.district,model_district,real_estate.group_real_estate_user,1,1,1,1
|
||||
|
||||
|
Binary file not shown.
|
After Width: | Height: | Size: 34 KiB |
|
|
@ -0,0 +1,116 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<data>
|
||||
|
||||
<!-- city -->
|
||||
<record id="city_form_view" model="ir.ui.view">
|
||||
<field name="name">City</field>
|
||||
<field name="model">re.city</field>
|
||||
<field name="arch" type="xml">
|
||||
<form>
|
||||
<sheet>
|
||||
<div class="oe_button_box" name="button_box">
|
||||
<button name="toggle_active" type="object" class="oe_stat_button" icon="fa-archive">
|
||||
<field name="active" widget="toggle_button"/>
|
||||
<span class="o_stat_text" attrs="{'invisible': [('active', '=', False)]}">Restore</span>
|
||||
<span class="o_stat_text" attrs="{'invisible': [('active', '=', True)]}">Archive</span>
|
||||
</button>
|
||||
</div>
|
||||
<group col="4" colspan="2">
|
||||
<field name="name" required="1"/>
|
||||
<field name="company_id" groups="base.group_multi_company"/>
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="District">
|
||||
<field name="district_ids" readonly="1">
|
||||
<tree>
|
||||
<field name="name" required="1"/>
|
||||
</tree>
|
||||
<form>
|
||||
<sheet>
|
||||
<div class="oe_button_box" name="button_box">
|
||||
<button class="oe_stat_button" type="object" name="toggle_active"
|
||||
icon="fa-archive">
|
||||
<field name="active"/>
|
||||
</button>
|
||||
</div>
|
||||
<group colspan="2" col="4">
|
||||
<field name="name" required="1"/>
|
||||
<field name="city_id" required="1"/>
|
||||
<field name="company_id" groups="base.group_multi_company"/>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
<div class="oe_chatter">
|
||||
<field name="message_follower_ids" widget="mail_followers" groups="base.group_user"/>
|
||||
<field name="activity_ids" widget="mail_activity"/>
|
||||
<field name="message_ids" widget="mail_thread"/>
|
||||
</div>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="city_action" model="ir.actions.act_window">
|
||||
<field name="name">City</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">re.city</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
</record>
|
||||
|
||||
|
||||
<!-- District -->
|
||||
<record id="district_form_view" model="ir.ui.view">
|
||||
<field name="name">District</field>
|
||||
<field name="model">district</field>
|
||||
<field name="arch" type="xml">
|
||||
<form>
|
||||
<sheet>
|
||||
<div class="oe_button_box" name="button_box">
|
||||
<button name="toggle_active" type="object" class="oe_stat_button" icon="fa-archive">
|
||||
<field name="active" widget="toggle_button"/>
|
||||
<span class="o_stat_text" attrs="{'invisible': [('active', '=', False)]}">Restore</span>
|
||||
<span class="o_stat_text" attrs="{'invisible': [('active', '=', True)]}">Archive</span>
|
||||
</button>
|
||||
</div>
|
||||
<group col="4" colspan="2">
|
||||
<field name="name" required="1"/>
|
||||
<field name="city_id" required="1"/>
|
||||
<field name="company_id" groups="base.group_multi_company"/>
|
||||
</group>
|
||||
</sheet>
|
||||
<div class="oe_chatter">
|
||||
<field name="message_follower_ids" widget="mail_followers" groups="base.group_user"/>
|
||||
<field name="activity_ids" widget="mail_activity"/>
|
||||
<field name="message_ids" widget="mail_thread"/>
|
||||
</div>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="district_list_view" model="ir.ui.view">
|
||||
<field name="name">District List</field>
|
||||
<field name="model">district</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree>
|
||||
<field name="name" required="1"/>
|
||||
<field name="city_id" required="1"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="district_action" model="ir.actions.act_window">
|
||||
<field name="name">District</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">district</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
|
||||
from . import models
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
{
|
||||
'name': "Project Management - Khawald",
|
||||
'summary': """Real Estate Project - Khawald""",
|
||||
'description': """ """,
|
||||
'author': 'Expert Co. Ltd.',
|
||||
'website': 'http://exp-sa.com',
|
||||
'category': 'Odex25-Realstate/Odex25-Realstate',
|
||||
'version': '0.1',
|
||||
'depends': ['project_management_custom', 'real_estate_marketing','odex25_web_map', 'dhx_gantt'],
|
||||
'data': [
|
||||
'data/templates.xml',
|
||||
'security/ir.model.access.csv',
|
||||
'views/khawald_project_config_views.xml',
|
||||
'views/khawald_project_view.xml',
|
||||
'views/internal_property_view.xml',
|
||||
'views/re_unit_view.xml',
|
||||
'views/project_task_view.xml',
|
||||
'views/resource_calendar_view.xml',
|
||||
'report/sub_contractor_report_template.xml',
|
||||
'report/sample_report_template.xml',
|
||||
'report/inspection_report_template.xml',
|
||||
'report/daily_report_template.xml',
|
||||
'report/report_action.xml',
|
||||
],
|
||||
|
||||
'installable': True,
|
||||
'application': False,
|
||||
}
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<data>
|
||||
|
||||
<record id="template_marketing_task_complete" model="mail.template">
|
||||
<field name="name">Marketing Task Done</field>
|
||||
<field name="model_id" ref="khawald_project.model_project_task"/>
|
||||
<field name="subject">Al-Khawalid Real Estate Company - Marketing Task</field>
|
||||
<field name="email_to">${object.email_formatted}</field>
|
||||
<field name="body_html"><![CDATA[
|
||||
<div>
|
||||
Dear colleague,
|
||||
</div>
|
||||
<div>
|
||||
<br/>
|
||||
You have a task waiting for you to perform
|
||||
<br/>
|
||||
<br/>
|
||||
<br/>
|
||||
<br/>
|
||||
With sincere affection and appreciation,<br/>
|
||||
Al-Khawalid Real Estate Company - Projects Department<br/>
|
||||
</div>
|
||||
]]>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
</data>
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,15 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from . import project_conf
|
||||
from . import project_task
|
||||
from . import project_expense
|
||||
from . import project_insurance
|
||||
from . import internal_property
|
||||
from . import re_unit
|
||||
from . import project_custom
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from odoo import models, fields, api, _
|
||||
|
||||
class InternalProperty(models.Model):
|
||||
_inherit = "internal.property"
|
||||
|
||||
project_id = fields.Many2one('project.project', string="Project")
|
||||
advantage_ids = fields.Many2many('project.advantage', related="project_id.advantage_ids", string="Advantage",
|
||||
ondelete="cascade")
|
||||
advantage_price = fields.Float(string="Advantage Price", compute="get_advantage_price")
|
||||
electric_service = fields.Selection([('issued', 'Issued'),
|
||||
('not', 'Not Issued')], string="Electric Service", default='not')
|
||||
water_service = fields.Selection([('issued', 'Issued'),
|
||||
('not', 'Not Issued')], string="Water Service", default='not')
|
||||
stamp_service = fields.Selection([('issued', 'Issued'),
|
||||
('not', 'Not Issued')], string="Stamp Service", default='not')
|
||||
building_service = fields.Selection([('issued', 'Issued'),
|
||||
('not', 'Not Issued')], string="Building Certificate", default='not')
|
||||
|
||||
@api.depends('property_space', 'meter_price', 'advantage_price')
|
||||
def get_total_price(self):
|
||||
for rec in self:
|
||||
rec.total_price = rec.advantage_price + (rec.meter_price * rec.property_space)
|
||||
|
||||
@api.depends('advantage_ids', 'advantage_ids.price')
|
||||
def get_advantage_price(self):
|
||||
price = 0.0
|
||||
for rec in self:
|
||||
if rec.advantage_ids:
|
||||
price = sum([line.price for line in rec.advantage_ids])
|
||||
rec.advantage_price = price
|
||||
|
|
@ -0,0 +1,161 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
|
||||
from odoo import models, fields, api, _
|
||||
from odoo.exceptions import ValidationError
|
||||
from random import randint
|
||||
|
||||
class ProjectExpenseConf(models.Model):
|
||||
_name = 'project.expense.conf'
|
||||
_description = "Project Expense"
|
||||
|
||||
name = fields.Char(string="Name")
|
||||
|
||||
|
||||
class ProjectTasks(models.Model):
|
||||
_name = 'khawald.project.task'
|
||||
_description = "Project Task Custom"
|
||||
|
||||
name = fields.Char(string="Name")
|
||||
tasks_time = fields.Char(string="Task Days")
|
||||
description = fields.Text(string="Task Description")
|
||||
parent_id = fields.Many2one('khawald.project.task', string="Parent Task")
|
||||
|
||||
@api.constrains('parent_id')
|
||||
def _check_parent_id(self):
|
||||
if not self._check_recursion():
|
||||
raise ValidationError(_('You cannot create recursive task.'))
|
||||
|
||||
|
||||
class ProjectState(models.Model):
|
||||
_name = 'project.state'
|
||||
_description = "Project State"
|
||||
|
||||
def _get_default_color(self):
|
||||
return randint(1, 11)
|
||||
|
||||
name = fields.Char(string="Name")
|
||||
dependency_id = fields.Many2one('project.state', string="Dependency")
|
||||
parent_id = fields.Many2one('project.state', string="Parent")
|
||||
project_type_ids = fields.Many2many('project.type', 'project_type_state_rel', string="Project Type")
|
||||
project_id = fields.Many2one('project.project', string="Project", ondelete="cascade")
|
||||
project_task_ids = fields.Many2many('khawald.project.task', string="Task")
|
||||
total_tasks = fields.Integer(dtring="Total of Tasks", compute="get_total_task", store=True)
|
||||
default = fields.Boolean(string="Default")
|
||||
color = fields.Integer(string='Color', default=_get_default_color)
|
||||
rating_active = fields.Boolean('Customer Ratings',
|
||||
default=lambda self: self.env.user.has_group('project.group_project_rating'))
|
||||
rating_percentage_satisfaction = fields.Integer(
|
||||
"Rating Satisfaction",
|
||||
default=1, help="Percentage of happy ratings")
|
||||
is_favorite = fields.Boolean( string='Show Project on dashboard',default=True,
|
||||
help="Whether this project should be displayed on your dashboard.")
|
||||
|
||||
_sql_constraints = [
|
||||
('name_uniq', 'unique (name)', "State name already exists!"),
|
||||
]
|
||||
|
||||
@api.depends('project_task_ids')
|
||||
def get_total_task(self):
|
||||
print(self, ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>111111111")
|
||||
for rec in self:
|
||||
rec.total_tasks = len(rec.project_task_ids)
|
||||
|
||||
|
||||
@api.constrains('parent_id')
|
||||
def _check_parent_id(self):
|
||||
if not self._check_recursion():
|
||||
raise ValidationError(_('You cannot create recursive state.'))
|
||||
|
||||
|
||||
class ProjectType(models.Model):
|
||||
_name = 'project.type'
|
||||
_description = 'Project Type'
|
||||
|
||||
def _get_default_color(self):
|
||||
return randint(1, 11)
|
||||
|
||||
name = fields.Selection([('apartment', 'Apartment'),
|
||||
('vila', 'Vila'),
|
||||
('construction','Construction'),
|
||||
('general_service','General Service'),
|
||||
('oil_gas','Oil & Gas'),
|
||||
('mining','Mining')], string="Name")
|
||||
color = fields.Integer(string='Color', default=_get_default_color)
|
||||
|
||||
|
||||
@api.depends('name')
|
||||
def name_get(self):
|
||||
res = []
|
||||
for record in self:
|
||||
name = dict(record.fields_get(allfields=['name'])['name']['selection'])[record.name]
|
||||
res.append((record.id, name))
|
||||
return res
|
||||
|
||||
_sql_constraints = [
|
||||
('name_uniq', 'unique (name)', "Type name already exists!"),
|
||||
]
|
||||
|
||||
|
||||
|
||||
class ProjectIssues(models.Model):
|
||||
_name = 'project.issue'
|
||||
_description = 'Project Issue'
|
||||
|
||||
name = fields.Char(string="Issue")
|
||||
|
||||
|
||||
class ProjectStatus(models.Model):
|
||||
_name = 'project.status'
|
||||
_description = 'Project Status'
|
||||
|
||||
name = fields.Char(string="Status", required=True)
|
||||
|
||||
_sql_constraints = [
|
||||
('name_uniq', 'unique (name)', "Status name already exists!"),
|
||||
]
|
||||
|
||||
|
||||
class LandState(models.Model):
|
||||
_name = 'land.state'
|
||||
_description = 'Land State'
|
||||
|
||||
name = fields.Char(string="Land Sate", required=True)
|
||||
|
||||
_sql_constraints = [
|
||||
('name_uniq', 'unique (name)', "Land State name already exists!"),
|
||||
]
|
||||
|
||||
|
||||
class ProjectFace(models.Model):
|
||||
_name = 'project.face'
|
||||
_description = 'Project Face'
|
||||
|
||||
name = fields.Char(string="Face", required=True)
|
||||
|
||||
_sql_constraints = [
|
||||
('name_uniq', 'unique (name)', "Project Face already exists!"),
|
||||
]
|
||||
|
||||
|
||||
class ProjectAdvantage(models.Model):
|
||||
_name = 'project.advantage'
|
||||
_description = 'Project Advantage'
|
||||
|
||||
name = fields.Char(string="Advantage Name")
|
||||
price = fields.Monetary(string="Price", currency_field='company_currency_id')
|
||||
company_id = fields.Many2one('res.company', required=True, readonly=True, default=lambda self: self.env.company)
|
||||
company_currency_id = fields.Many2one(string='Company Currency', readonly=True,
|
||||
related='company_id.currency_id')
|
||||
project_id = fields.Many2one('project.project', string="Project", ondelete="cascade")
|
||||
|
||||
|
||||
_sql_constraints = [
|
||||
('name_uniq', 'unique (name)', "Type name already exists!"),
|
||||
]
|
||||
|
|
@ -0,0 +1,216 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
import string
|
||||
from datetime import datetime
|
||||
from dateutil.relativedelta import relativedelta
|
||||
from odoo import models, fields, api, _
|
||||
from odoo.exceptions import UserError
|
||||
|
||||
|
||||
class ProjectCustom(models.Model):
|
||||
_inherit = 'project.project'
|
||||
_description = "Khawald Project"
|
||||
|
||||
project_type_id = fields.Many2one('project.type', string="Project Type")
|
||||
# project_status_id = fields.Many2one('project.status', string="Project Status")
|
||||
land_state_id = fields.Many2one('land.state', string="Land State")
|
||||
project_face_ids = fields.Many2many('project.face', string="Project Face")
|
||||
basement = fields.Selection([('yes', 'Yes'),
|
||||
('no', 'NO')], string="Basement Available ?", default='no')
|
||||
owner_id = fields.Many2one('res.partner', string="Owner")
|
||||
agent_id = fields.Many2one('res.partner', string="GOV Agent")
|
||||
supervisor_id = fields.Many2one('res.partner', string="Supervisor")
|
||||
engineer_id = fields.Many2one('res.partner', string="Project Engineer")
|
||||
stamp = fields.Char(string="Stamp")
|
||||
building_license = fields.Char(string="Building License")
|
||||
building_certificate = fields.Char(string="Building Certificate")
|
||||
insurance_policy = fields.Char(string="Insurance Policy")
|
||||
space = fields.Float(string="Project Space")
|
||||
land_space = fields.Float(string="Land Space")
|
||||
building_factor = fields.Char(string="Building Factor")
|
||||
sale_space = fields.Char(string="Sale Space")
|
||||
location_x = fields.Char(string="Location X")
|
||||
location_y = fields.Char(string="Location Y")
|
||||
total_days = fields.Char(string="Total Days", compute="get_work_days", stroe=True)
|
||||
building_count = fields.Integer(string="Building count")
|
||||
floor_count = fields.Integer(string="Floor count")
|
||||
unit_count = fields.Integer(string="Unit in floor count")
|
||||
unit_space = fields.Float(string="Unit Space")
|
||||
total_unit = fields.Float(string="Total Unit", compute="get_unit_count", store=True)
|
||||
advantage_ids = fields.Many2many('project.advantage', string="Advantage", ondelete="cascade")
|
||||
project_state_ids = fields.Many2many('project.state', string="Project State", ondelete="cascade")
|
||||
project_task_ids = fields.Many2many('khawald.project.task', string="Project Task", ondelete="cascade")
|
||||
project_insurance_ids = fields.One2many('project.insurance', 'project_id', string="Insurance")
|
||||
invoice_ref = fields.Char(string="Contract/Invoice REF")
|
||||
state = fields.Selection([('draft', 'In Progress'),
|
||||
('in_progess', 'In Executing'),
|
||||
('sale', 'Selling'),
|
||||
('done', 'Sold'),
|
||||
('cancel', 'Cancelled'), ], string="Status", default='draft')
|
||||
created = fields.Boolean(string="Created")
|
||||
unit_counts = fields.Integer(string='Unit Count', compute='count_unit_number')
|
||||
project_expense_ids = fields.One2many('project.expense', 'project_id', string="Expense")
|
||||
stamping = fields.Char(string="Stamping Number")
|
||||
stamping_date = fields.Date(string="Stamping Date")
|
||||
stamping_attach = fields.Binary("Stamping Attach", attachment=True)
|
||||
|
||||
room_no = fields.Integer(string="Room Count")
|
||||
bathroom_no = fields.Integer(string="Bathroom Count")
|
||||
hall_no = fields.Integer(string="Hall Count")
|
||||
kitchen_no = fields.Integer(string="kitchen Count")
|
||||
|
||||
suppl_payment_amount = fields.Float('Supplier Payments Amount', compute="get_payment_amount")
|
||||
engineer_payment_amount = fields.Float('Engineering Payment', compute="get_payment_amount")
|
||||
subcontractor_payment_amount = fields.Float('Subcontractor Payment', compute="get_payment_amount")
|
||||
total_payment = fields.Float('Total Payment', compute="get_payment_amount")
|
||||
|
||||
|
||||
def count_unit_number(self):
|
||||
unit_count = self.env['re.unit'].search_count([('project_id', '=', self.id)])
|
||||
self.unit_counts = unit_count
|
||||
|
||||
def get_unit(self):
|
||||
unit_ids = self.env['re.unit'].search(
|
||||
[('project_id', '=', self.id)])
|
||||
form_id = self.env.ref('real_estate.unit_form_view').id
|
||||
domain = [('id', 'in', unit_ids.ids)]
|
||||
return {
|
||||
'name': _('Units'),
|
||||
'view_type': 'form',
|
||||
'view_mode': 'form',
|
||||
'res_model': 're.unit',
|
||||
'views': [(False, 'tree'), (form_id, 'form')],
|
||||
'type': 'ir.actions.act_window',
|
||||
'target': 'current',
|
||||
'domain': domain,
|
||||
}
|
||||
|
||||
|
||||
def get_payment_amount(self):
|
||||
suppl_payment_amount = sum(self.project_expense_ids.mapped('amount'))
|
||||
engineering_payment_ids = self.env['project.payment.request'].search([('project_id', '=', self.id),
|
||||
('type', '=', 'eng_office')])
|
||||
subcontractor_payment_ids = self.env['project.payment.request'].search([('project_id', '=', self.id),
|
||||
('type', '=', 'subcontractor')])
|
||||
|
||||
self.suppl_payment_amount = suppl_payment_amount
|
||||
self.engineer_payment_amount = sum(engineering_payment_ids.mapped('amount'))
|
||||
self.subcontractor_payment_amount = sum(subcontractor_payment_ids.mapped('amount'))
|
||||
self.total_payment = suppl_payment_amount + sum(engineering_payment_ids.mapped('amount')) + sum(subcontractor_payment_ids.mapped('amount'))
|
||||
|
||||
|
||||
def get_supplier_payment(self):
|
||||
domain = [('id', 'in', self.project_expense_ids.ids)]
|
||||
tree_id = self.env.ref('khawald_project.project_expense_tree_view').id
|
||||
return {
|
||||
'name': _('Supplier Payments'),
|
||||
'view_type': 'form',
|
||||
'view_mode': 'tree',
|
||||
'res_model': 'project.expense',
|
||||
'views': [(tree_id, 'tree')],
|
||||
'type': 'ir.actions.act_window',
|
||||
'target': 'current',
|
||||
'domain': domain,
|
||||
}
|
||||
|
||||
@api.model
|
||||
def create(self, vals):
|
||||
res = super(ProjectCustom, self).create(vals)
|
||||
for line in res:
|
||||
for tasks in line.project_task_ids:
|
||||
self.env['project.task'].create({
|
||||
'name': tasks.name,
|
||||
'project_id': line.id,
|
||||
'days': tasks.tasks_time,
|
||||
'description': tasks.description,
|
||||
'project_type_id': line.project_type_id.id,
|
||||
'project_task_id': tasks.id,
|
||||
'state': 'draft'
|
||||
})
|
||||
return res
|
||||
|
||||
def create_unit_building(self):
|
||||
letters = list(string.ascii_uppercase)
|
||||
for rec in self:
|
||||
no_unit = rec.total_unit / rec.building_count
|
||||
for building in range(rec.building_count):
|
||||
build = self.env['internal.property'].create({
|
||||
'name': rec.code + '/' + letters[
|
||||
building] if building <= 26 else rec.code + '/' + building if rec.project_type_id.name == 'apartment' else rec.code,
|
||||
'city_id': rec.city.id,
|
||||
'project_id': rec.id,
|
||||
'floors_count': rec.floor_count,
|
||||
'unit_floor_count': rec.unit_count,
|
||||
'district_id': rec.district.id,
|
||||
'stamping': rec.stamping,
|
||||
'stamping_date': rec.stamping_date,
|
||||
'stamping_attach': rec.stamping_attach,
|
||||
'room_no':rec.room_no * rec.total_unit,
|
||||
'bathroom_no':rec.bathroom_no * rec.total_unit,
|
||||
'hall_no':rec.hall_no * rec.total_unit,
|
||||
'kitchen_no':rec.kitchen_no * rec.total_unit,})
|
||||
for unit in range(int(no_unit)):
|
||||
self.env['re.unit'].create({
|
||||
'name': build.name + '/' + str(unit + 1),
|
||||
'project_id': rec.id,
|
||||
'space': rec.unit_space,
|
||||
'property_id': build.id,
|
||||
'stamping': rec.stamping,
|
||||
'stamping_date': rec.stamping_date,
|
||||
'stamping_attach': rec.stamping_attach,
|
||||
'room_no':rec.room_no,
|
||||
'bathroom_no':rec.bathroom_no,
|
||||
'hall_no':rec.hall_no,
|
||||
'kitchen_no':rec.kitchen_no,})
|
||||
rec.created = True
|
||||
|
||||
def action_selling(self):
|
||||
self.state = 'sale'
|
||||
|
||||
@api.onchange('project_type_id')
|
||||
def set_state_project(self):
|
||||
"""
|
||||
set project tasks and state based on project type
|
||||
:return:
|
||||
"""
|
||||
task_ids = []
|
||||
if self._context.get('project_type_id'):
|
||||
for record in self:
|
||||
state_ids = self.env['project.state'].search(
|
||||
[('project_type_ids', 'in', [self._context.get('project_type_id')]), ('default', '=', True)])
|
||||
for state in state_ids:
|
||||
for line in state.project_task_ids:
|
||||
task_ids.append(line.id)
|
||||
record.write({'project_state_ids': state_ids.ids,
|
||||
'project_task_ids': task_ids })
|
||||
|
||||
|
||||
@api.onchange('project_state_ids')
|
||||
def onchange_project_state_ids(self):
|
||||
""" get task related with state """
|
||||
|
||||
self.project_task_ids = self.project_state_ids.mapped('project_task_ids').ids
|
||||
|
||||
|
||||
@api.depends('floor_count', 'unit_count')
|
||||
def get_unit_count(self):
|
||||
for rec in self:
|
||||
rec.total_unit = (rec.floor_count * rec.unit_count) * rec.building_count
|
||||
|
||||
@api.depends('resource_calendar_id', 'date_start', 'date')
|
||||
def get_work_days(self):
|
||||
for rec in self:
|
||||
rec.total_days = 0.0
|
||||
if rec.date_start and rec.date_end:
|
||||
date_start = datetime.strptime(datetime.strftime(rec.date_start, '%Y-%m-%d'), '%Y-%m-%d')
|
||||
date_end = datetime.strptime(datetime.strftime(rec.date_end, '%Y-%m-%d'), '%Y-%m-%d')
|
||||
duration_data = self.resource_calendar_id.get_work_duration_data(date_start, date_end)
|
||||
rec.total_days = duration_data['days']
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,67 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from odoo import models, fields, api, _
|
||||
from odoo.exceptions import UserError
|
||||
|
||||
class ProjectExpense(models.Model):
|
||||
_name = 'project.expense'
|
||||
_description = "Project Expense"
|
||||
|
||||
name = fields.Many2one('project.expense.conf',string="Description")
|
||||
partner_id = fields.Many2one('res.partner', string="Vendor")
|
||||
project_id = fields.Many2one('project.project', string="Project")
|
||||
date = fields.Date(string="Date", default=fields.Date.context_today)
|
||||
amount = fields.Float(string="Amount")
|
||||
paid = fields.Boolean(string="Paid")
|
||||
invoice_id = fields.Many2one('account.move', string="Invoice")
|
||||
|
||||
def _prepare_invoice_values(self, expense, name_spec, account_id, amount):
|
||||
invoice_vals = {
|
||||
'ref': expense.name.name,
|
||||
'move_type': 'in_invoice',
|
||||
'invoice_origin': expense.name.name,
|
||||
'invoice_user_id': self.env.user.id,
|
||||
'invoice_date': expense.date,
|
||||
'project_expense_id': expense.id,
|
||||
'invoice_date_due': expense.date,
|
||||
'narration': expense.name.name,
|
||||
'partner_id': expense.partner_id.id,
|
||||
'invoice_line_ids': [(0, 0, {
|
||||
'name': name_spec,
|
||||
'price_unit': amount,
|
||||
'quantity': 1.0,
|
||||
'account_id': account_id.id,
|
||||
})],
|
||||
}
|
||||
|
||||
return invoice_vals
|
||||
|
||||
def create_invoice(self):
|
||||
if not self.project_id.project_expenses_account_id or not self.project_id.project_investment_account_id:
|
||||
raise UserError(_('Please Contact Administrator to configure your project accounts.'))
|
||||
if self.project_id.project_owner_type == 'company':
|
||||
account_id = self.project_id.project_expenses_account_id
|
||||
else:
|
||||
account_id = self.project_id.project_investment_account_id
|
||||
name_spec = 'Expense Reference:' + str(self.name.name) + '-' + str(self.project_id.name)
|
||||
invoice = self._prepare_invoice_values(self, name_spec, account_id, self.amount)
|
||||
invoice_id = self.env['account.move'].sudo().create(invoice).with_user(self.env.uid)
|
||||
self.write({'invoice_id': invoice_id.id})
|
||||
|
||||
|
||||
class AccountInvoice(models.Model):
|
||||
_inherit = 'account.move'
|
||||
|
||||
project_expense_id = fields.Many2one('project.expense', string='Project Expense')
|
||||
|
||||
def action_post(self):
|
||||
res = super(AccountInvoice, self).action_post()
|
||||
if self.project_expense_id:
|
||||
self.project_expense_id.paid = True
|
||||
return res
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from datetime import datetime
|
||||
from odoo import models, fields, api, _
|
||||
from odoo.exceptions import UserError
|
||||
from dateutil.relativedelta import relativedelta
|
||||
|
||||
class ProjectInsurance(models.Model):
|
||||
_name = 'project.insurance'
|
||||
_description = "Project Insurance"
|
||||
_rec_name = ''
|
||||
|
||||
partner_id = fields.Many2one('res.partner', string="Insurance Provider")
|
||||
project_insur_line_id = fields.Many2one('project.insurance.line',string='Description')
|
||||
project_id = fields.Many2one('project.project', string="Project")
|
||||
duration = fields.Integer(string="Insurance Duration", default=1)
|
||||
duration_kind = fields.Selection([('year', 'Year'),
|
||||
('month', 'Month'),
|
||||
], string="Duration Kind", default='year')
|
||||
date_from = fields.Date(string="Date from", default=fields.Date.today)
|
||||
date_to = fields.Date(string="Date To", compute="get_to_date", store=True)
|
||||
|
||||
@api.depends('date_from', 'duration', 'duration_kind')
|
||||
def get_to_date(self):
|
||||
for rec in self:
|
||||
if rec.date_from and rec.duration and rec.duration_kind:
|
||||
date_from = datetime.strptime(datetime.strftime(rec.date_from, '%Y-%m-%d'), '%Y-%m-%d').date()
|
||||
date_from = date_from - relativedelta(days=int(1))
|
||||
if rec.duration_kind == 'year':
|
||||
date_to = date_from + relativedelta(years=int(rec.duration))
|
||||
rec.date_to = date_to.strftime('%Y-%m-%d')
|
||||
elif rec.duration_kind == 'month':
|
||||
date_to = date_from + relativedelta(months=int(rec.duration))
|
||||
rec.date_to = date_to.strftime('%Y-%m-%d')
|
||||
|
||||
|
||||
class ProjectInsuranceLine(models.Model):
|
||||
_name = 'project.insurance.line'
|
||||
_description = "Project Insurance Line"
|
||||
|
||||
name = fields.Char(string='Name', required=True)
|
||||
|
|
@ -0,0 +1,73 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
|
||||
from odoo import models, fields, tools, _
|
||||
|
||||
class ProjectTask(models.Model):
|
||||
_inherit = "project.task"
|
||||
|
||||
days = fields.Integer(string="Days To be done")
|
||||
project_type_id = fields.Many2one('project.type', string="Project Type", ondelete="cascade")
|
||||
project_task_id = fields.Many2one('khawald.project.task')
|
||||
state = fields.Selection([('draft', 'Draft'),
|
||||
('done', 'Done')], string="Status", default='draft')
|
||||
marketing = fields.Boolean(string="Marketing")
|
||||
email_formatted = fields.Char(string="Formatted Email")
|
||||
completion_rate = fields.Float('Completion Rate')
|
||||
|
||||
# def notification_message(self, group):
|
||||
# receiver = []
|
||||
# groups = []
|
||||
# for ref in group:
|
||||
# group_id = self.env.ref(ref).id
|
||||
# groups.append(group_id)
|
||||
# domain = [('id', 'in', groups)]
|
||||
# group_ids = self.env['res.groups'].search(domain)
|
||||
# if len(group_ids)> 1:
|
||||
# for group in group_ids:
|
||||
# for user in group.users:
|
||||
# if user.partner_id not in receiver:
|
||||
# receiver.append(user.partner_id)
|
||||
# else:
|
||||
# for user in group_ids.users:
|
||||
# if user.partner_id not in receiver:
|
||||
# receiver.append(user.partner_id)
|
||||
# return receiver
|
||||
|
||||
# def compute_email(self, receiver):
|
||||
# email_formatted = []
|
||||
# final_receiver = receiver[0]
|
||||
# count = len(final_receiver)
|
||||
# for partner in range(count):
|
||||
# if final_receiver[partner].email:
|
||||
# email_formatted.append(tools.formataddr((final_receiver[partner].name or u"False", final_receiver[partner].email or u"False")))
|
||||
# else:
|
||||
# email_formatted = []
|
||||
# return email_formatted
|
||||
|
||||
# def action_draft(self):
|
||||
# self.write({'state': 'draft'})
|
||||
|
||||
# def action_done(self):
|
||||
# for rec in self:
|
||||
# rec.write({'state': 'done'})
|
||||
# # Internal User Notification
|
||||
# if rec.marketing:
|
||||
# receiver = rec.notification_message(['real_estate_marketing.group_marketer_manager_user', 'real_estate_marketing.group_marketer_normal_user'])
|
||||
# email = rec.compute_email(receiver)
|
||||
# email = ','.join(email)
|
||||
# rec.email_formatted = email
|
||||
# template = rec.env.ref('khawald_project.template_marketing_task_complete', raise_if_not_found=False)
|
||||
# ctx = dict(rec._context)
|
||||
# ctx.update({
|
||||
# 'model': rec._name
|
||||
# })
|
||||
# if template:
|
||||
# template.sudo().with_context(ctx).send_mail(rec.id, force_send=True)
|
||||
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from odoo import models, fields, api, _
|
||||
|
||||
class ReUnit(models.Model):
|
||||
_inherit = "re.unit"
|
||||
|
||||
project_id = fields.Many2one('project.project', string="Project")
|
||||
change_price = fields.Boolean(string="Change Meter Price", tracking=True)
|
||||
new_price = fields.Float(string="New Price", tracking=True)
|
||||
meter_price = fields.Float(string="Meter Price", store=True, digits=(16, 2), tracking=True)
|
||||
rent_price = fields.Float(string="Total Price", compute="get_rent_price", tracking=True, store=True)
|
||||
advantage_ids = fields.Many2many('project.advantage', related="project_id.advantage_ids", string="Advantage",
|
||||
ondelete="cascade")
|
||||
|
||||
@api.depends('external_space', 'change_price', 'meter_price', 'new_price', 'advantage_ids', 'advantage_ids.price')
|
||||
def get_rent_price(self):
|
||||
rent_price = 0.0
|
||||
advantage_price = 0.0
|
||||
for rec in self:
|
||||
if rec.advantage_ids:
|
||||
advantage_price = sum([rec.price for rec in self.advantage_ids])
|
||||
if rec.meter_price:
|
||||
rent_price = rec.meter_price * rec.space
|
||||
if rec.external_price and rec.external_space:
|
||||
rent_price += rec.external_space * rec.external_price
|
||||
if rec.change_price:
|
||||
rent_price = rec.new_price
|
||||
rec.rent_price = rent_price + advantage_price
|
||||
|
|
@ -0,0 +1,274 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<odoo>
|
||||
<data>
|
||||
|
||||
<template id="daily_report_template">
|
||||
<t t-call="web.html_container">
|
||||
<t t-foreach="docs" t-as="o">
|
||||
<t t-call="web.external_layout">
|
||||
<div class="page">
|
||||
<br/>
|
||||
<h2 style="text-align: center;">تــقريـــر يومـــــي رقم ( ) لمشــــــروع : <t t-esc="o.name"/> </h2>
|
||||
<body>
|
||||
<div style="display: -webkit-box; display: -webkit-flex; display: flex; flex-wrap: wrap;">
|
||||
<table class="table table-bordered" style="width:50%">
|
||||
<t t-set="col_repeat" t-value="7"/>
|
||||
|
||||
<tr>
|
||||
<td colspan="2" style="border:none;">المقـــاول : </td>
|
||||
<td colspan="2" style="border:none;">الإستشاري : </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:none;">اليوم : </td>
|
||||
<td style="border:none;">التاريخ : </td>
|
||||
<td style="border:none;">ساعات العمل من : </td>
|
||||
<td style="border:none;">إلي : </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="4" style="text-align: center;border:none;">حالة الطقس : </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:none;"> <input type="checkbox"/> صحو</td>
|
||||
<td style="border:none;"><input type="checkbox"/> ماطر</td>
|
||||
<td style="border:none;"><input type="checkbox"/> رياح</td>
|
||||
<td style="border:none;"><input type="checkbox"/> غبار</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="4">ملخص أعمال اليوم الجاري تنفيذها</th>
|
||||
</tr>
|
||||
<tr t-foreach="range(col_repeat)" t-as="rep">
|
||||
<td colspan="2" style="white-space: pre;"> </td>
|
||||
<td colspan="2" style="white-space: pre;"> </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th colspan="4">الأعمال المتوقع تنفيذها في اليوم التالي:</th>
|
||||
</tr>
|
||||
<tr t-foreach="range(col_repeat)" t-as="rep">
|
||||
<td colspan="2" style="white-space: pre;"> </td>
|
||||
<td colspan="2" style="white-space: pre;"> </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th colspan="4">المشاكل الموجودة بالموقع:</th>
|
||||
</tr>
|
||||
<tr t-foreach="range(col_repeat - 1)" t-as="rep">
|
||||
<td colspan="2" style="white-space: pre;"> </td>
|
||||
<td colspan="2" style="white-space: pre;"> </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th colspan="4">المواد المورده للموقع:</th>
|
||||
</tr>
|
||||
<tr t-foreach="range(col_repeat - 3)" t-as="rep">
|
||||
<td colspan="2" style="white-space: pre;"> </td>
|
||||
<td colspan="2" style="white-space: pre;"> </td>
|
||||
</tr>
|
||||
|
||||
|
||||
<tr>
|
||||
<td colspan="4">
|
||||
<p>مهندس مقاول</p>
|
||||
<p>الإسم</p>
|
||||
<p>التوقيع</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="table table-bordered" style="width:50%">
|
||||
|
||||
<tr>
|
||||
<th >العمالة</th>
|
||||
<th >العدد</th>
|
||||
<th >الجهاز الفني والإداري</th>
|
||||
<th >العدد</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td >حارس</td>
|
||||
<td > </td>
|
||||
<td >مدير مشروع</td>
|
||||
<td > </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td >عمال موقع</td>
|
||||
<td > </td>
|
||||
<td >مهندس موقع</td>
|
||||
<td > </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td >سائق</td>
|
||||
<td > </td>
|
||||
<td >مهندس كهربا</td>
|
||||
<td > </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td >حداد</td>
|
||||
<td > </td>
|
||||
<td > </td>
|
||||
<td > </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td >مساعد حداد</td>
|
||||
<td > </td>
|
||||
<td > </td>
|
||||
<td > </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td >نجار</td>
|
||||
<td > </td>
|
||||
<td > </td>
|
||||
<td > </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td >مساعد نجار</td>
|
||||
<td > </td>
|
||||
<td > </td>
|
||||
<td > </td>
|
||||
</tr>
|
||||
<tr t-foreach="range(col_repeat - 3)" t-as="rep">
|
||||
<td style="white-space: pre;"> </td>
|
||||
<td style="white-space: pre;"> </td>
|
||||
<td style="white-space: pre;"> </td>
|
||||
<td style="white-space: pre;"> </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td >إجمالي العمالة</td>
|
||||
<td > </td>
|
||||
<td >إجمالي الفنيين والإداريين</td>
|
||||
<td > </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="2">مقاولي الباطن</th>
|
||||
<th colspan="2">العدد</th>
|
||||
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2">مقاول الدفان</td>
|
||||
<td colspan="2"> </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td colspan="2">مقاول لم يتم ارسال العقد</td>
|
||||
<td colspan="2"> </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td colspan="2">مقاول زهرة رغد</td>
|
||||
<td colspan="2"> </td>
|
||||
</tr>
|
||||
<tr t-foreach="range(col_repeat - 4)" t-as="rep">
|
||||
<td colspan="2" style="white-space: pre;"> </td>
|
||||
<td colspan="2" style="white-space: pre;"> </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td colspan="2">الإجمالي</td>
|
||||
<td colspan="2"> </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th >المعدات</th>
|
||||
<th >العدد</th>
|
||||
<th >المعدات</th>
|
||||
<th >العدد</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td >سيارات صغيره</td>
|
||||
<td > </td>
|
||||
<td >بلدوز</td>
|
||||
<td > </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td >ألة ثني الحديد</td>
|
||||
<td > </td>
|
||||
<td >بوكلين</td>
|
||||
<td > </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td >جاك همر</td>
|
||||
<td > </td>
|
||||
<td >كرين</td>
|
||||
<td > </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td >منشار خشب</td>
|
||||
<td > </td>
|
||||
<td >تريلة</td>
|
||||
<td > </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td >دكاكة صغيرة</td>
|
||||
<td > </td>
|
||||
<td >كمبروسر كبير</td>
|
||||
<td > </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td >هزاز خرسانه</td>
|
||||
<td > </td>
|
||||
<td >رصاصه كبيره</td>
|
||||
<td > </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td >مضخة مياه</td>
|
||||
<td > </td>
|
||||
<td >بوبكات</td>
|
||||
<td > </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td >مولد كهرباء</td>
|
||||
<td > </td>
|
||||
<td >غريدر</td>
|
||||
<td > </td>
|
||||
</tr>
|
||||
<tr t-foreach="range(col_repeat - 3)" t-as="rep">
|
||||
<td style="white-space: pre;"> </td>
|
||||
<td style="white-space: pre;"> </td>
|
||||
<td style="white-space: pre;"> </td>
|
||||
<td style="white-space: pre;"> </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td colspan="3">إجمالي المعدات بالموقع</td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</body>
|
||||
<style type="text/css">
|
||||
|
||||
td
|
||||
{
|
||||
-ms-writing-mode: tb-rl;
|
||||
-webkit-writing-mode: vertical-rl;
|
||||
writing-mode: vertical-rl;
|
||||
transform: rotate(180deg);
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
body {
|
||||
|
||||
|
||||
font-style: normal;
|
||||
font-weight: 60px;
|
||||
bottom: 10px;
|
||||
top: 1px;
|
||||
font-size: 115%;
|
||||
|
||||
}
|
||||
|
||||
</style>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
</t>
|
||||
</template>
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,226 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<odoo>
|
||||
<data>
|
||||
|
||||
<template id="inspection_report_template">
|
||||
<t t-call="web.html_container">
|
||||
<t t-foreach="docs" t-as="o">
|
||||
<t t-call="web.external_layout">
|
||||
<div class="page">
|
||||
<body>
|
||||
<table dir="rtl" class="table table-bordered"
|
||||
style="border: 2px solid;width: 100%;">
|
||||
<tbody style="border: 2px solid;">
|
||||
<tr>
|
||||
<td colspan="12" height="50"
|
||||
style="text-align: center;border: 2px solid; background-color:#636e72 !important;font-weight:bold;">طلب فحص أعمال
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="12" height="50"
|
||||
style="text-align: center;border: 2px solid; background-color:#636e72 !important;font-weight:bold;">
|
||||
Inspection Request
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="4" style="border: 2px solid;white-space: pre;">اسم المبنى/Building Name</td>
|
||||
<td colspan="8" style="border: 2px solid;white-space: pre;">اسم المشروع/Project Name: <t t-esc="o.name"/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2" style="text-align: center;border: 2px solid;">تاريخ الطلب/Request Date</td>
|
||||
<td colspan="2" style="text-align: center;border: 2px solid;">رقم الطلب/Request No</td>
|
||||
<td colspan="8" style="border: 2px solid;white-space: pre !important;">إسم المقاول/Contractor</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2" style="text-align: center;border: 2px solid;"></td>
|
||||
<td colspan="2" style="text-align: center;border: 2px solid;"></td>
|
||||
<td colspan="6" style="text-align: center;border: 2px solid;"></td>
|
||||
<td colspan="2" style="text-align: center;border: 2px solid;">الأعمال المطلوب فحصها</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="4"
|
||||
style="text-align: center;border: 2px solid; background-color:#636e72 !important;font-weight:bold;">نوع الأعمال/Type of work</td>
|
||||
<td rowspan="2" colspan="6" style="border: 2px solid;white-space: pre;"></td>
|
||||
<td rowspan="2" colspan="2" style="text-align: center;border: 2px solid;">التفاصيل</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border: 2px solid;">
|
||||
<p>ميكانيكا</p>
|
||||
<p>Mech.</p>
|
||||
</td>
|
||||
<td style="border: 2px solid;">
|
||||
<p>كهرباء</p>
|
||||
<p>Elc.</p>
|
||||
</td>
|
||||
<td style="border: 2px solid;">
|
||||
<p>تشطيبات</p>
|
||||
<p>Finishing</p>
|
||||
</td>
|
||||
<td style="border: 2px solid;">
|
||||
<p>اعتيادي</p>
|
||||
<p>Civil.</p>
|
||||
</td>
|
||||
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="4" style="border: 2px solid;">التوقيع/signature </td>
|
||||
<td colspan="6"
|
||||
style="border: 2px solid; white-space: pre !important;">الأسم/Name
|
||||
</td>
|
||||
<td colspan="4"
|
||||
style="border: 2px solid; white-space: pre !important;">المهندس
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2" style="border: 2px solid;">
|
||||
<p>ميكانيكا</p>
|
||||
<p>Mech.</p>
|
||||
</td>
|
||||
<td colspan="2" style="border: 2px solid;">
|
||||
<p>تكيف</p>
|
||||
<p>AC</p>
|
||||
</td>
|
||||
<td colspan="2" style="border: 2px solid;">
|
||||
<p>كهرباء</p>
|
||||
<p>Elc.</p>
|
||||
</td>
|
||||
<td colspan="2" style="border: 2px solid;">
|
||||
<p>صحي</p>
|
||||
<p>Plumb</p>
|
||||
</td>
|
||||
<td colspan="2" style="border: 2px solid;">
|
||||
<p>اعتيادي</p>
|
||||
<p>Civil.</p>
|
||||
</td>
|
||||
<td colspan="2" rowspan="3" style="border: 2px solid;white-space: pre;">البند السابق</td>
|
||||
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border: 2px solid;">تم</td>
|
||||
<td style="border: 2px solid;">لم يتم</td>
|
||||
<td style="border: 2px solid;">تم</td>
|
||||
<td style="border: 2px solid;">لم يتم</td>
|
||||
<td style="border: 2px solid;">تم</td>
|
||||
<td style="border: 2px solid;">لم يتم</td>
|
||||
<td style="border: 2px solid;">تم</td>
|
||||
<td style="border: 2px solid;">لم يتم</td>
|
||||
<td style="border: 2px solid;">تم</td>
|
||||
<td style="border: 2px solid;">لم يتم</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2" style="border: 2px solid;"></td>
|
||||
<td colspan="2" style="border: 2px solid;"></td>
|
||||
<td colspan="2" style="border: 2px solid;"></td>
|
||||
<td colspan="2" style="border: 2px solid;"></td>
|
||||
<td colspan="2" style="border: 2px solid;"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="12"
|
||||
style="text-align: center;border: 2px solid; background-color:#636e72 !important;font-weight:bold;">نتائج الفحص/Inspector
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="4" style="border: 2px solid;white-space: pre;">مقبول/Approve</td>
|
||||
<td colspan="4" style="border: 2px solid;white-space: pre;">مقبول بملاحظات/Approved As Noted</td>
|
||||
<td colspan="4" style="border: 2px solid;white-space: pre;">مرفوض/Rejected</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border: 2px solid;white-space: pre;" colspan="12">
|
||||
<p style="word-wrap: break-word !important;">الملاحظات/Notes</p>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2" style="border: 2px solid;">
|
||||
<p>المشرف</p>
|
||||
<p>Supervision</p>
|
||||
</td>
|
||||
<td colspan="4" style="border: 2px solid;">
|
||||
<p style="white-space: pre;">الأسم/name</p>
|
||||
<p style="white-space: pre;">التوقيع/signature</p>
|
||||
<p style="white-space: pre;">التاريخ/Date</p>
|
||||
</td>
|
||||
<td colspan="2" style="border: 2px solid;">
|
||||
<p>مدير المشروع</p>
|
||||
<p>Project Manager</p>
|
||||
</td>
|
||||
<td colspan="4" style="border: 2px solid;">
|
||||
<p style="white-space: pre;">الأسم/name</p>
|
||||
<p style="white-space: pre;">التوقيع/signature</p>
|
||||
<p style="white-space: pre;">التاريخ/Date</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="12"
|
||||
style="text-align: center;border: 2px solid; background-color:#636e72 !important;font-weight:bold;">التحقق من إنتهاء الملاحظات/Verification
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="4" style="border: 2px solid;">
|
||||
<p>تاريخ التحقق/verification date</p>
|
||||
<p>مهندس الإشراف/Supervisor</p>
|
||||
<p>التوقيع/Signature</p>
|
||||
</td>
|
||||
<td colspan="3" style="border: 2px solid;">
|
||||
<p></p>
|
||||
<p></p>
|
||||
<p></p>
|
||||
</td>
|
||||
<td colspan="3" style="border: 2px solid;">
|
||||
<p>Done تم Not Done لم يتم</p>
|
||||
<p>مدير المشروع/Project Manager</p>
|
||||
<p>التاريخ/Date</p>
|
||||
</td>
|
||||
<td style="border: 2px solid;">
|
||||
<p></p>
|
||||
<p></p>
|
||||
<p></p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="3">
|
||||
<p>استلام المقاول</p>
|
||||
<p>Contractor</p>
|
||||
</td>
|
||||
<td colspan="3">
|
||||
الأسم:
|
||||
</td>
|
||||
<td colspan="3">
|
||||
التوقيع:
|
||||
</td>
|
||||
<td colspan="3">
|
||||
التاريخ:
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
</body>
|
||||
|
||||
|
||||
<style type="text/css">
|
||||
|
||||
|
||||
body {
|
||||
|
||||
font-style: normal;
|
||||
font-weight: 60px;
|
||||
bottom: 10px;
|
||||
top: 1px;
|
||||
font-size: 130%;
|
||||
|
||||
}
|
||||
|
||||
</style>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
</t>
|
||||
</template>
|
||||
|
||||
|
||||
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<data>
|
||||
|
||||
<record id="paperformat_project_report" model="report.paperformat">
|
||||
<field name="name">Project Report</field>
|
||||
<field name="default" eval="True"/>
|
||||
<field name="format">custom</field>
|
||||
<field name="orientation">Portrait</field>
|
||||
<field name="margin_top">15</field>
|
||||
<field name="margin_bottom">15</field>
|
||||
<field name="margin_left">5</field>
|
||||
<field name="margin_right">5</field>
|
||||
<field name="header_line" eval="False"/>
|
||||
<field name="header_spacing">5</field>
|
||||
<field name="dpi">150</field>
|
||||
</record>
|
||||
|
||||
<record id="action_sub_contractor_report" model="ir.actions.report">
|
||||
<field name="name">Sub-Contractor Approvals</field>
|
||||
<field name="model">project.project</field>
|
||||
<field name="report_type">qweb-pdf</field>
|
||||
<field name="report_name">khawald_project.sub_contractor_report_template</field>
|
||||
<field name="report_file">khawald_project.sub_contractor_report_template</field>
|
||||
<field name="paperformat_id" ref="khawald_project.paperformat_project_report"/>
|
||||
<field name="attachment_use">True</field>
|
||||
</record>
|
||||
|
||||
<record id="action_sample_report" model="ir.actions.report">
|
||||
<field name="name">Sample Approvals</field>
|
||||
<field name="model">project.project</field>
|
||||
<field name="report_type">qweb-pdf</field>
|
||||
<field name="report_name">khawald_project.sample_report_template</field>
|
||||
<field name="report_file">khawald_project.sample_report_template</field>
|
||||
<field name="paperformat_id" ref="khawald_project.paperformat_project_report"/>
|
||||
<field name="attachment_use">True</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="action_inspection_report" model="ir.actions.report">
|
||||
<field name="name">Inspection Request</field>
|
||||
<field name="model">project.project</field>
|
||||
<field name="report_type">qweb-pdf</field>
|
||||
<field name="report_name">khawald_project.inspection_report_template</field>
|
||||
<field name="report_file">khawald_project.inspection_report_template</field>
|
||||
<field name="paperformat_id" ref="khawald_project.paperformat_project_report"/>
|
||||
<field name="attachment_use">True</field>
|
||||
</record>
|
||||
|
||||
<record id="action_daily_report" model="ir.actions.report">
|
||||
<field name="name">Daily Report</field>
|
||||
<field name="model">project.project</field>
|
||||
<field name="report_type">qweb-pdf</field>
|
||||
<field name="report_name">khawald_project.daily_report_template</field>
|
||||
<field name="report_file">khawald_project.daily_report_template</field>
|
||||
<field name="paperformat_id" ref="khawald_project.paperformat_project_report"/>
|
||||
<field name="attachment_use">True</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,170 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<odoo>
|
||||
<data>
|
||||
|
||||
<template id="sample_report_template">
|
||||
<t t-call="web.html_container">
|
||||
<t t-foreach="docs" t-as="o">
|
||||
<t t-call="web.external_layout">
|
||||
<div class="page">
|
||||
<body>
|
||||
<table dir="rtl" class="table table-bordered"
|
||||
style="border: 2px solid;width: 100%;">
|
||||
<tbody style="border: 2px solid;">
|
||||
<tr>
|
||||
<td colspan="12" height="50"
|
||||
style="text-align: center;border: 2px solid; background-color:#636e72 !important;font-weight:bold;">تقرير إعتماد عينة
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="12" height="50"
|
||||
style="text-align: center;border: 2px solid; background-color:#636e72 !important;font-weight:bold;">
|
||||
Sample Approval Report
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="5" style="border: 2px solid;white-space: pre;">اسم المبنى/Building Name</td>
|
||||
<td colspan="7" style="border: 2px solid;white-space: pre;">اسم المشروع/Project Name: <t t-esc="o.name"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2" style="text-align: center;border: 2px solid;">تاريخ الطلب/Request Date</td>
|
||||
<td colspan="2" style="text-align: center;border: 2px solid;">رقم الطلب/Request No</td>
|
||||
<td colspan="4" style="border: 2px solid;white-space: pre;"></td>
|
||||
<td colspan="4" style="border: 2px solid;">اسم المقاول/Contractor</td>
|
||||
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2" style="text-align: center;border: 2px solid;"></td>
|
||||
<td colspan="2" style="text-align: center;border: 2px solid;"></td>
|
||||
<td colspan="4" style="text-align: center;border: 2px solid;"></td>
|
||||
<td colspan="4" style="border: 2px solid;">بيان المواد/Material Name
|
||||
</td>
|
||||
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="4"
|
||||
style="text-align: center;border: 2px solid; background-color:#636e72 !important;">نوع الأعمال/Type of work
|
||||
</td>
|
||||
<td colspan="4" style="border: 2px solid;white-space: pre;"></td>
|
||||
<td colspan="4" style="border: 2px solid;white-space: pre;">بيان الأعمال/Items Name
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border: 2px solid;">
|
||||
<p>ميكانيكا</p>
|
||||
<p>Mech.</p>
|
||||
</td>
|
||||
<td style="border: 2px solid;">
|
||||
<p>كهرباء</p>
|
||||
<p>Elc.</p>
|
||||
</td>
|
||||
<td style="border: 2px solid;">
|
||||
<p>تشطيبات</p>
|
||||
<p>Finishing</p>
|
||||
</td>
|
||||
<td style="border: 2px solid;">
|
||||
<p>اعتيادي</p>
|
||||
<p>Civil.</p>
|
||||
</td>
|
||||
<td style="border: 2px solid;white-space: pre;" rowspan="2" colspan="8">وصف المواد/Material Description</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2" style="border: 2px solid;white-space: pre;">إسم المورد/</td>
|
||||
<td colspan="2" style="border: 2px solid;">المرفقات</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td colspan="12" height="50"
|
||||
style="text-align: center;border: 2px solid; background-color:#636e72 !important;font-weight:bold;">نتيجة الفحص/Inspection Result
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="8" style="text-align: center;border: 2px solid;">التقيم/Evaluation</td>
|
||||
<td colspan="4" style="border: 2px solid;">تاريخ الإستلام/Date Receive</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align: center;border: 2px solid; ">
|
||||
<p>معتمد</p>
|
||||
<p>Approve</p>
|
||||
</td>
|
||||
<td style="text-align: center;border: 2px solid; ">A</td>
|
||||
<td style="text-align: center;border: 2px solid; ">
|
||||
<p>معتمد بشروط</p>
|
||||
<p>Approved As Noted</p>
|
||||
</td>
|
||||
<td style="text-align: center;border: 2px solid; ">B</td>
|
||||
<td style="text-align: center;border: 2px solid; ">
|
||||
<p>يعاد التقيم</p>
|
||||
<p>Resubmit</p>
|
||||
</td>
|
||||
<td style="text-align: center;border: 2px solid; ">C</td>
|
||||
<td style="text-align: center;border: 2px solid; ">
|
||||
<p>مرفوض</p>
|
||||
<p>Rejected</p>
|
||||
</td>
|
||||
<td style="text-align: center;border: 2px solid; ">D</td>
|
||||
<td style="border: 2px solid;white-space: pre;" colspan="4">المستلم/Receiver</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td rowspan="6" style="border: 2px solid;white-space: pre;" colspan="12">
|
||||
<p style="word-wrap: break-word !important;">القرارات و التوصيات/Recommendation</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr></tr>
|
||||
<tr></tr>
|
||||
<tr></tr>
|
||||
<tr></tr>
|
||||
<tr></tr>
|
||||
<tr></tr>
|
||||
<tr>
|
||||
<td colspan="12" height="50"
|
||||
style="text-align: center;border: 2px solid; background-color:#636e72 !important;font-weight:bold;">إدارة المشروعات/Project Management
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="4" style="border: 2px solid;white-space: pre;">
|
||||
<p>الأسم/name</p>
|
||||
<p>التوقيع/signature</p>
|
||||
<p>التاريخ/Date</p>
|
||||
</td>
|
||||
<td colspan="2" style="border: 2px solid;white-space: pre;">
|
||||
<p>المدير العام/General Manager</p>
|
||||
</td>
|
||||
<td colspan="4" style="border: 2px solid;white-space: pre;">
|
||||
<p>الأسم/name</p>
|
||||
<p><t t-esc="o.user_id.partner_id.name"/></p>
|
||||
<p>التوقيع/signature</p>
|
||||
<p>التاريخ/Date</p>
|
||||
</td>
|
||||
<td colspan="2" style="border: 2px solid;white-space: pre;">
|
||||
<p>مدير المشاريع/Project Manager</p>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
</body>
|
||||
|
||||
|
||||
<style type="text/css">
|
||||
|
||||
|
||||
body {
|
||||
|
||||
font-style: normal;
|
||||
font-weight: 60px;
|
||||
bottom: 10px;
|
||||
top: 1px;
|
||||
font-size: 130%;
|
||||
|
||||
}
|
||||
|
||||
</style>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
</t>
|
||||
</template>
|
||||
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,170 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<odoo>
|
||||
<data>
|
||||
|
||||
<template id="sub_contractor_report_template">
|
||||
<t t-call="web.html_container">
|
||||
<t t-foreach="docs" t-as="o">
|
||||
<t t-call="web.external_layout">
|
||||
<div class="page">
|
||||
<body>
|
||||
<table dir="rtl" class="table table-bordered"
|
||||
style="border: 2px solid;width: 100%;">
|
||||
<tbody style="border: 2px solid;">
|
||||
<tr>
|
||||
<td colspan="12" height="50"
|
||||
style="text-align: center;border: 2px solid; background-color:#636e72 !important;font-weight:bold;">إعتماد مقاول من الباطن</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="12" height="50"
|
||||
style="text-align: center;border: 2px solid; background-color:#636e72 !important;font-weight:bold;">
|
||||
Sub-Contractor Approval
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="5" style="border: 2px solid;white-space: pre;">اسم المبنى/Building Name</td>
|
||||
<td colspan="7" style="border: 2px solid;white-space: pre;">اسم المشروع/Project Name: <t t-esc="o.name"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2" style="text-align: center;border: 2px solid;">تاريخ الطلب/Request Date</td>
|
||||
<td colspan="2" style="text-align: center;border: 2px solid;">رقم الطلب/Request No</td>
|
||||
<td rowspan="2" colspan="4"
|
||||
style="border: 2px solid;white-space: pre;"></td>
|
||||
<td rowspan="2" colspan="4" style="border: 2px solid;">المقاول الرئيسي/Contractor</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2" style="text-align: center;border: 2px solid;"></td>
|
||||
<td colspan="2" style="text-align: center;border: 2px solid;"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="4"
|
||||
style="text-align: center;border: 2px solid; background-color:#636e72 !important;">نوع الأعمال/Type of work</td>
|
||||
<td rowspan="2" colspan="4"
|
||||
style="border: 2px solid;white-space: pre;"></td>
|
||||
<td rowspan="2" colspan="4" style="border: 2px solid;white-space: pre;">بيان الأعمال/Items Name</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border: 2px solid;">
|
||||
<p>ميكانيكا</p>
|
||||
<p>Mech.</p>
|
||||
</td>
|
||||
<td style="border: 2px solid;">
|
||||
<p>كهرباء</p>
|
||||
<p>Elc.</p>
|
||||
</td>
|
||||
<td style="border: 2px solid;">
|
||||
<p>تشطيبات</p>
|
||||
<p>Finishing</p>
|
||||
</td>
|
||||
<td style="border: 2px solid;">
|
||||
<p>اعتيادي</p>
|
||||
<p>Civil.</p>
|
||||
</td>
|
||||
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="7" style="border: 2px solid;white-space: pre;"></td>
|
||||
<td colspan="5" style="border: 2px solid;">إسم المقاول الرئيسي المطلوب إعتمادة</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td colspan="7" style="border: 2px solid;white-space: pre;"></td>
|
||||
<td colspan="5" style="border: 2px solid;">المرفقات</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="12" height="50"
|
||||
style="text-align: center;border: 2px solid; background-color:#636e72 !important;font-weight:bold;">نتيجة الفحص/Inspection Result</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="8" style="text-align: center;border: 2px solid;">التقيم/Evaluation</td>
|
||||
<td colspan="4" style="border: 2px solid;">تاريخ الإستلام/Date Receive</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align: center;border: 2px solid; ">
|
||||
<p>معتمد</p>
|
||||
<p>Approve</p>
|
||||
</td>
|
||||
<td style="text-align: center;border: 2px solid; ">A</td>
|
||||
<td style="text-align: center;border: 2px solid; ">
|
||||
<p>معتمد بشروط</p>
|
||||
<p>Approved As Noted</p>
|
||||
</td>
|
||||
<td style="text-align: center;border: 2px solid; ">B</td>
|
||||
<td style="text-align: center;border: 2px solid; ">
|
||||
<p>يعاد التقيم</p>
|
||||
<p>Resubmit</p>
|
||||
</td>
|
||||
<td style="text-align: center;border: 2px solid; ">C</td>
|
||||
<td style="text-align: center;border: 2px solid; ">
|
||||
<p>مرفوض</p>
|
||||
<p>Rejected</p>
|
||||
</td>
|
||||
<td style="text-align: center;border: 2px solid; ">D</td>
|
||||
<td style="border: 2px solid;white-space: pre;" colspan="4">المستلم/Receiver</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td rowspan="6" style="border: 2px solid;white-space: pre;" colspan="12">
|
||||
<p style="word-wrap: break-word !important;">القرارات و التوصيات/Recommendation
|
||||
</p>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr></tr>
|
||||
<tr></tr>
|
||||
<tr></tr>
|
||||
<tr></tr>
|
||||
<tr></tr>
|
||||
<tr></tr>
|
||||
<tr>
|
||||
<td colspan="12" height="50"
|
||||
style="text-align: center;border: 2px solid; background-color:#636e72 !important;font-weight:bold;">
|
||||
إدارة المشروعات/Project Management
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="4" style="border: 2px solid;white-space: pre;">
|
||||
<p>الأسم/name</p>
|
||||
<p>التوقيع/signature</p>
|
||||
<p>التاريخ/Date</p>
|
||||
</td>
|
||||
<td colspan="2" style="border: 2px solid;white-space: pre;">
|
||||
<p>المدير العام/General Manager</p>
|
||||
</td>
|
||||
<td colspan="4" style="border: 2px solid;white-space: pre;">
|
||||
<p>الأسم/name</p>
|
||||
<p><t t-esc="o.user_id.partner_id.name"/></p>
|
||||
<p>التوقيع/signature</p>
|
||||
<p>التاريخ/Date</p>
|
||||
</td>
|
||||
<td colspan="2" style="border: 2px solid;white-space: pre;">
|
||||
<p>مدير المشاريع/Project Manager</p>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
</body>
|
||||
|
||||
|
||||
<style type="text/css">
|
||||
|
||||
|
||||
body {
|
||||
|
||||
font-style: normal;
|
||||
font-weight: 60px;
|
||||
bottom: 10px;
|
||||
top: 1px;
|
||||
font-size: 130%;
|
||||
|
||||
}
|
||||
|
||||
</style>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
</t>
|
||||
</template>
|
||||
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||
access_project_state,project.state,model_project_state,project.group_project_manager,1,1,1,1
|
||||
access_project_expense,project.expense,model_project_expense,project.group_project_manager,1,1,1,1
|
||||
access_project_expense_conf,project.expense.conf,model_project_expense_conf,project.group_project_manager,1,1,1,1
|
||||
access_project_expense_conf_user,project.expense.conf,model_project_expense_conf,project.group_project_user,1,1,1,0
|
||||
access_project_expense_user,project.expense,model_project_expense,project.group_project_user,1,1,1,0
|
||||
access_khawald_project_task,khawald.project.task,model_khawald_project_task,project.group_project_manager,1,1,1,1
|
||||
access_project_state_user,project.state,model_project_state,project.group_project_user,1,0,0,0
|
||||
access_khawald_project_task_user,khawald.project.task,model_khawald_project_task,project.group_project_user,1,0,0,0
|
||||
access_project_type,project.type,model_project_type,project.group_project_manager,1,1,1,1
|
||||
access_project_type_user,project.type,model_project_type,project.group_project_user,1,0,0,0
|
||||
access_project_face,project.face,model_project_face,project.group_project_manager,1,1,1,1
|
||||
access_project_face_user,project.face,model_project_face,project.group_project_user,1,0,0,0
|
||||
access_project_status,project.status,model_project_status,project.group_project_manager,1,1,1,1
|
||||
access_project_status_user,project.status,model_project_status,project.group_project_user,1,0,0,0
|
||||
access_project_advantage,project.advantage,model_project_advantage,project.group_project_manager,1,1,1,1
|
||||
access_project_advantage_user,project.advantage,model_project_advantage,project.group_project_user,1,0,0,0
|
||||
access_project_project,project.project,project.model_project_project,project.group_project_manager,1,1,1,1
|
||||
access_project_project_user,project.project,project.model_project_project,project.group_project_user,1,1,1,0
|
||||
access_project_insurance,project_insurance,model_project_insurance,project.group_project_manager,1,1,1,1
|
||||
access_project_insurance_user,project_insurance,model_project_insurance,project.group_project_user,1,1,1,0
|
||||
access_project_land_state_user,land_state,model_land_state,project.group_project_user,1,1,1,0
|
||||
access_project_insurance_line,project_insurance_line,model_project_insurance_line,,1,1,1,1
|
||||
|
Binary file not shown.
|
After Width: | Height: | Size: 63 KiB |
Binary file not shown.
|
|
@ -0,0 +1,321 @@
|
|||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<defs >
|
||||
<font id="Tajawal" horiz-adv-x="421" ><font-face
|
||||
font-family="Tajawal"
|
||||
units-per-em="1000"
|
||||
panose-1="0 0 5 0 0 0 0 0 0 0"
|
||||
ascent="643"
|
||||
descent="-357"
|
||||
alphabetic="0" />
|
||||
<glyph unicode=" " glyph-name="space" horiz-adv-x="240" />
|
||||
<glyph unicode="!" glyph-name="exclam" horiz-adv-x="216" d="M73 149V633H140V149H73ZM150 36Q150 35 150 34Q150 -9 109 -9Q66 -9 66 35Q68 76 109 76Q150 76 150 36Z" />
|
||||
<glyph unicode=""" glyph-name="quotedbl" horiz-adv-x="276" d="M70 485V618L120 645V512L70 485ZM155 485V618L206 645V512L155 485Z" />
|
||||
<glyph unicode="#" glyph-name="numbersign" horiz-adv-x="497" d="M343 147L313 0H260L290 147H145L114 0H61L92 147H15V202H103L144 399H49V454H155L188 609H241L208 454H354L386 609H439L407 454H482V399H395L355 202H449V147H343ZM197 399L156 202H302L342 399H197Z" />
|
||||
<glyph unicode="$" glyph-name="dollar" horiz-adv-x="532" d="M287 700V644Q368 640 440 593L407 548Q350 578 287 581V368Q383 330 423 284T464 166Q464 92 416 44T287 -11V-74H252V-11Q157 -8 68 51L100 96Q170 56 248 55H252V308Q156 342 114 383T72 485Q72
|
||||
553 121 596T252 645V700H287ZM287 294V56Q387 71 387 168Q387 249 287 294ZM252 383V580Q151 570 151 488Q151 425 252 383Z" />
|
||||
<glyph unicode="%" glyph-name="percent" horiz-adv-x="700" d="M178 0L469 565H527L236 0H178ZM278 412Q278 342 248 300T166 258Q112 258 81 299T50 411Q50 479 81 518T166 557Q215 557 246 517T278 412ZM230 410Q230 455 211 485T164 515Q135 515 116 486T97
|
||||
410Q97 361 115 331T164 300Q193 300 211 331T230 410ZM650 156Q650 86 619 44T537 2Q483 2 453 42T422 155Q422 222 453 261T537 301Q587 301 618 261T650 156ZM601 154Q601 199 583 229T535 259Q506 259 488 230T469 154Q469 105 487 75T535 44Q564 44 582 74T601
|
||||
154Z" />
|
||||
<glyph unicode="&" glyph-name="ampersand" horiz-adv-x="561" d="M417 329H489V290Q489 166 451 108L546 0H463L415 54Q358 -12 256 -12Q166 -12 109 45Q60 95 60 167Q60 219 87 267T161 344L148 359Q76 439 76 503Q76 566 120 605T235 645Q302 645 369 599L340
|
||||
553Q287 581 234 581Q195 581 172 560T148 506Q148 454 219 373L403 163Q417 192 417 275V329ZM199 303Q173 285 155 250T137 181Q137 123 171 88T262 53Q329 53 369 105L199 303Z" />
|
||||
<glyph unicode="'" glyph-name="quotesingle" horiz-adv-x="190" d="M70 485V618L120 645V512L70 485Z" />
|
||||
<glyph unicode="(" glyph-name="parenleft" horiz-adv-x="368" d="M232 645H292Q161 459 161 254Q161 38 292 -140H232Q172 -80 132 34T91 254Q91 359 131 470T232 645Z" />
|
||||
<glyph unicode=")" glyph-name="parenright" horiz-adv-x="368" d="M74 645H134Q194 582 234 471T275 254Q275 119 216 -10Q177 -97 134 -140H74Q205 38 205 254Q205 459 74 645Z" />
|
||||
<glyph unicode="*" glyph-name="asterisk" horiz-adv-x="332" d="M164 646L237 625L186 520L298 548L304 476L187 490L249 390L181 364L159 477L83 387L36 446L140 502L29 546L71 608L155 527L164 646Z" />
|
||||
<glyph unicode="+" glyph-name="plus" horiz-adv-x="518" d="M228 200H42V255H228V454H290V255H476V200H290V0H228V200Z" />
|
||||
<glyph unicode="," glyph-name="comma" horiz-adv-x="196" d="M65 -74Q103 -44 103 -11Q103 -7 101 1Q91 -6 83 -6Q68 -6 57 7T45 37Q45 56 57 68T89 81Q142 81 142 9Q142 -63 76 -98L65 -74Z" />
|
||||
<glyph unicode="-" glyph-name="hyphen" horiz-adv-x="276" d="M251 212H25V267H251V212Z" />
|
||||
<glyph unicode="." glyph-name="period" horiz-adv-x="264" d="M174 40Q174 39 174 38Q174 -5 133 -5Q90 -5 90 39Q92 80 133 80Q174 80 174 40Z" />
|
||||
<glyph unicode="/" glyph-name="slash" horiz-adv-x="327" d="M354 633L38 -30H-25L292 633H354Z" />
|
||||
<glyph unicode="0" glyph-name="zero" horiz-adv-x="552" d="M502 315Q502 158 433 68Q373 -12 275 -12Q162 -12 100 91Q48 179 48 315Q48 467 117 560Q179 645 275 645Q384 645 448 537Q502 446 502 315ZM274 581Q205 581 166 512T127 321Q127 191 169 119Q208
|
||||
53 274 53Q343 53 383 124T423 321Q423 449 379 518Q340 581 274 581Z" />
|
||||
<glyph unicode="1" glyph-name="one" horiz-adv-x="375" d="M268 633V0H194V554L67 482L30 535L194 633H268Z" />
|
||||
<glyph unicode="2" glyph-name="two" horiz-adv-x="480" d="M50 0V66L227 260Q292 332 318 378T344 472Q344 521 311 551T222 581Q156 581 92 539L61 583Q144 646 239 646Q323 646 375 593Q423 545 423 472Q423 419 395 369T288 231L137 63H411V0H50Z" />
|
||||
<glyph unicode="3" glyph-name="three" horiz-adv-x="496" d="M85 538L55 582Q126 645 225 645Q306 645 359 597Q408 552 408 482Q408 432 378 394T299 343Q362 328 398 285T434 181Q434 80 358 27Q302 -11 226 -11Q130 -11 47 55L79 98Q142 54 217 54Q279 54
|
||||
317 89T355 182Q355 305 208 305H126V368H208Q264 368 296 397T329 477Q329 582 212 582Q151 582 85 538Z" />
|
||||
<glyph unicode="4" glyph-name="four" horiz-adv-x="553" d="M35 198L319 633H397V198H513V135H397V0H324V135H35V198ZM109 198H324V531L109 198Z" />
|
||||
<glyph unicode="5" glyph-name="five" horiz-adv-x="515" d="M410 570H168V392Q198 397 238 397Q339 397 398 341Q453 288 453 198Q453 99 382 38Q324 -12 244 -12Q139 -12 62 54L91 97Q154 54 228 54Q297 54 336 91T375 197Q375 264 333 301T216 338Q166 338
|
||||
94 325V633H410V570Z" />
|
||||
<glyph unicode="6" glyph-name="six" horiz-adv-x="523" d="M438 595L412 553Q359 581 297 581Q230 581 188 520T142 356Q196 412 271 412Q351 412 404 360Q462 304 462 203Q462 113 404 49Q350 -12 268 -12Q158 -12 104 93Q62 174 62 294Q62 464 132 560Q194
|
||||
645 293 645Q375 645 438 595ZM138 287Q139 172 176 108Q210 51 267 51Q319 51 351 92T383 203Q383 275 350 314T258 353Q183 353 138 287Z" />
|
||||
<glyph unicode="7" glyph-name="seven" horiz-adv-x="423" d="M42 570V633H388V565L144 0H66L314 570H42Z" />
|
||||
<glyph unicode="8" glyph-name="eight" horiz-adv-x="536" d="M196 339Q83 382 83 481Q83 558 140 605Q191 647 269 647Q355 647 408 593Q455 546 455 479Q455 432 425 395T341 338Q402 319 437 275T472 172Q472 86 405 33Q347 -12 266 -12Q173 -12 114 46Q62
|
||||
97 62 171Q62 231 99 277T196 339ZM268 363Q319 375 348 407T378 482Q378 527 348 555T269 583Q219 583 190 557T160 485Q160 395 268 363ZM266 314Q213 308 177 268T141 174Q141 120 176 86T266 51Q322 51 357 85T393 173Q393 228 357 268T266 314Z" />
|
||||
<glyph unicode="9" glyph-name="nine" horiz-adv-x="523" d="M91 39L117 81Q170 53 232 53Q298 53 340 113T387 277Q333 221 258 221Q178 221 125 273Q67 329 67 430Q67 520 124 584Q179 645 261 645Q370 645 425 540Q467 459 467 339Q467 169 396 73Q335 -12
|
||||
236 -12Q153 -12 91 39ZM391 347Q389 461 352 525Q318 583 262 583Q209 583 178 541T146 430Q146 358 178 319T271 280Q346 280 391 347Z" />
|
||||
<glyph unicode=":" glyph-name="colon" horiz-adv-x="224" d="M174 280Q174 279 174 278Q174 235 133 235Q90 235 90 279Q92 320 133 320Q174 320 174 280ZM174 40Q174 39 174 38Q174 -5 133 -5Q90 -5 90 39Q92 80 133 80Q174 80 174 40Z" />
|
||||
<glyph unicode=";" glyph-name="semicolon" horiz-adv-x="186" d="M65 -74Q102 -44 102 -11Q102 -7 101 1Q91 -6 83 -6Q67 -6 56 7T45 37Q45 56 57 68T89 81Q142 81 142 9Q142 -63 76 -98L65 -74ZM86 230Q42 233 42 276Q42 294 55 307T86 320Q105 320 118 308T132
|
||||
276Q133 232 86 230Z" />
|
||||
<glyph unicode="<" glyph-name="less" horiz-adv-x="517" d="M466 416L88 240L466 48V-12L42 202V279L466 477V416Z" />
|
||||
<glyph unicode="=" glyph-name="equal" horiz-adv-x="509" d="M467 272H42V327H467V272ZM467 127H42V182H467V127Z" />
|
||||
<glyph unicode=">" glyph-name="greater" horiz-adv-x="517" d="M430 240L52 416V477L476 278V201L52 -13V48L430 240Z" />
|
||||
<glyph unicode="?" glyph-name="question" horiz-adv-x="386" d="M186 145H118V231Q118 271 129 290T180 343Q269 415 269 485Q269 531 242 558T168 585Q117 585 65 556L42 596Q109 645 187 645Q255 645 297 603T339 494Q339 399 256 330Q249 325 239 316Q204
|
||||
287 195 271T186 219V145ZM152 -12Q131 -12 118 2T105 38Q105 57 118 71T152 85Q172 85 186 71T201 38Q201 16 187 2T152 -12Z" />
|
||||
<glyph unicode="@" glyph-name="at" horiz-adv-x="698" d="M430 49Q400 -12 328 -12Q273 -12 239 27T204 130Q204 209 250 254Q287 291 340 291Q384 291 420 265L430 292H474V107Q474 35 523 35Q556 35 575 72T594 175Q594 300 508 366Q444 416 359 416Q243 416
|
||||
172 337Q106 264 106 145Q106 -1 203 -74Q273 -127 369 -127Q383 -127 396 -126L410 -124V-172L397 -173Q383 -174 370 -174Q231 -174 139 -86Q48 1 48 142Q48 300 151 391Q236 466 359 466Q487 466 571 380Q650 299 650 175Q650 101 618 48Q582 -12 515 -12Q484
|
||||
-12 461 5T430 49ZM416 218Q387 243 345 243Q266 243 266 139Q266 38 341 38Q416 38 416 142V218Z" />
|
||||
<glyph unicode="A" glyph-name="A" horiz-adv-x="561" d="M242 633H319L546 0H470L419 148H144L92 0H15L242 633ZM280 550L164 210H397L280 550Z" />
|
||||
<glyph unicode="B" glyph-name="B" horiz-adv-x="536" d="M90 1V633Q171 645 253 645Q368 645 423 590Q466 546 466 474Q466 424 436 387T355 338V337Q416 327 451 282T486 167Q486 76 415 29Q354 -12 253 -12Q179 -12 90 1ZM164 579V366H268Q322 366 355 393T389
|
||||
467Q389 586 251 586Q198 586 164 579ZM164 304V54Q206 48 262 48Q407 48 407 168Q407 232 371 268T268 304H164Z" />
|
||||
<glyph unicode="C" glyph-name="C" horiz-adv-x="556" d="M498 582L468 539Q401 581 331 581Q235 581 180 502Q129 430 129 310Q129 185 195 115Q251 54 339 54Q411 54 476 101L506 56Q428 -12 329 -12Q192 -12 114 94Q50 181 50 310Q50 454 128 552Q202 645 317
|
||||
645Q419 645 498 582Z" />
|
||||
<glyph unicode="D" glyph-name="D" horiz-adv-x="615" d="M90 1V633Q174 645 242 645Q404 645 490 547Q565 462 565 323Q565 154 472 66Q390 -12 247 -12Q176 -12 90 1ZM164 579V54Q201 48 247 48Q366 48 429 124Q486 194 486 319Q486 454 407 527Q343 586 244
|
||||
586Q193 586 164 579Z" />
|
||||
<glyph unicode="E" glyph-name="E" horiz-adv-x="526" d="M86 633H458V570H160V361H411V298H160V63H471V0H86V633Z" />
|
||||
<glyph unicode="F" glyph-name="F" horiz-adv-x="513" d="M86 0V633H458V570H160V360H411V297H160V0H86Z" />
|
||||
<glyph unicode="G" glyph-name="G" horiz-adv-x="594" d="M498 582L468 539Q400 581 328 581Q237 581 181 503Q129 430 129 311Q129 183 192 113Q246 53 332 53Q396 53 452 77V271H339V336H525V45Q430 -12 323 -12Q181 -12 107 102Q50 190 50 315Q50 455 128 552Q203
|
||||
645 320 645Q420 645 498 582Z" />
|
||||
<glyph unicode="H" glyph-name="H" horiz-adv-x="649" d="M164 0H90V633H164V361H485V633H559V0H485V298H164V0Z" />
|
||||
<glyph unicode="I" glyph-name="I" horiz-adv-x="254" d="M164 633V0H90V633H164Z" />
|
||||
<glyph unicode="J" glyph-name="J" horiz-adv-x="238" d="M148 633V-37Q148 -168 32 -168Q-26 -168 -85 -129L-59 -90Q-23 -110 12 -110Q74 -110 74 -30V633H148Z" />
|
||||
<glyph unicode="K" glyph-name="K" horiz-adv-x="517" d="M90 0V633H163V354L397 633H486L234 335L496 0H401L163 313V314V0H90Z" />
|
||||
<glyph unicode="L" glyph-name="L" horiz-adv-x="468" d="M90 0V633H164V63H413V0H90Z" />
|
||||
<glyph unicode="M" glyph-name="M" horiz-adv-x="772" d="M164 526V0H90V633H182Q250 476 353 171Q374 107 386 75Q398 111 407 137Q519 466 592 633H682V0H608V527Q556 359 420 0H353Q234 292 164 526Z" />
|
||||
<glyph unicode="N" glyph-name="N" horiz-adv-x="638" d="M164 0H90V633H157Q248 496 474 117V633H548V0H479Q425 81 259 350Q189 464 164 506V0Z" />
|
||||
<glyph unicode="O" glyph-name="O" horiz-adv-x="644" d="M322 -12Q185 -12 109 101Q50 189 50 315Q50 461 128 555Q202 645 322 645Q459 645 535 531Q594 441 594 315Q594 169 516 76Q442 -12 322 -12ZM129 315Q129 189 184 118Q235 53 322 53Q422 53 473 137Q515
|
||||
206 515 315Q515 441 460 513Q409 581 322 581Q223 581 171 494Q129 424 129 315Z" />
|
||||
<glyph unicode="P" glyph-name="P" horiz-adv-x="518" d="M90 0V633Q179 645 244 645Q468 645 468 453Q468 356 405 304Q348 258 252 258Q209 258 164 264V0H90ZM164 579V324Q200 318 248 318Q390 318 390 453Q390 586 244 586Q198 586 164 579Z" />
|
||||
<glyph unicode="Q" glyph-name="Q" horiz-adv-x="644" d="M450 20L573 -109H487L388 -3Q354 -12 322 -12Q185 -12 109 100Q50 189 50 315Q50 462 128 556Q203 645 322 645Q459 645 535 530Q594 440 594 315Q594 215 556 137T450 20ZM129 315Q129 188 184 118Q235
|
||||
53 322 53Q422 53 473 136Q515 205 515 315Q515 441 460 513Q409 581 322 581Q223 581 171 494Q129 424 129 315Z" />
|
||||
<glyph unicode="R" glyph-name="R" horiz-adv-x="521" d="M90 0V633Q179 645 244 645Q468 645 468 453Q468 322 356 277L483 0H408L291 259L290 260Q273 258 248 258Q209 258 164 264V0H90ZM164 579V324Q200 318 244 318Q390 318 390 453Q390 586 244 586Q198
|
||||
586 164 579Z" />
|
||||
<glyph unicode="S" glyph-name="S" horiz-adv-x="506" d="M51 52L83 97Q156 55 238 55Q301 55 337 84T373 168Q373 260 252 302Q149 337 103 380T57 485Q57 559 115 604Q168 645 254 645Q348 645 425 593L392 548Q330 581 259 581Q201 581 167 556T133 488Q133
|
||||
421 237 382Q355 337 402 290T450 166Q450 79 383 29Q328 -12 249 -12Q150 -12 51 52Z" />
|
||||
<glyph unicode="T" glyph-name="T" horiz-adv-x="526" d="M25 570V633H501V570H292V0H218V570H25Z" />
|
||||
<glyph unicode="U" glyph-name="U" horiz-adv-x="632" d="M90 633H165V242Q165 53 316 53Q466 53 466 242V633H542V264Q542 -12 316 -12Q90 -12 90 264V633Z" />
|
||||
<glyph unicode="V" glyph-name="V" horiz-adv-x="547" d="M95 633L274 108L451 633H531L303 0H243L15 633H95Z" />
|
||||
<glyph unicode="W" glyph-name="W" horiz-adv-x="872" d="M395 633H477L623 108L777 633H857L658 0H590Q521 222 436 527Q351 223 283 0H216L15 633H95L250 108L395 633Z" />
|
||||
<glyph unicode="X" glyph-name="X" horiz-adv-x="564" d="M541 633L333 329L549 0H463L288 278L100 0H15L247 328L49 633H134L293 386L456 633H541Z" />
|
||||
<glyph unicode="Y" glyph-name="Y" horiz-adv-x="530" d="M15 633H93L265 313L437 633H515L302 248V0H229V248L15 633Z" />
|
||||
<glyph unicode="Z" glyph-name="Z" horiz-adv-x="465" d="M433 566L111 63H440V0H25V60L354 570H34V633H433V566Z" />
|
||||
<glyph unicode="[" glyph-name="bracketleft" horiz-adv-x="349" d="M277 -140H91V645H277V588H157V-82H277V-140Z" />
|
||||
<glyph unicode="\" glyph-name="backslash" horiz-adv-x="327" d="M279 -30L-38 633H24L341 -30H279Z" />
|
||||
<glyph unicode="]" glyph-name="bracketright" horiz-adv-x="349" d="M72 645H258V-140H72V-82H193V588H72V645Z" />
|
||||
<glyph unicode="^" glyph-name="asciicircum" horiz-adv-x="407" d="M175 609H232L372 318H311L203 545L202 544L99 318H35L175 609Z" />
|
||||
<glyph unicode="_" glyph-name="underscore" horiz-adv-x="394" d="M389 -85H5V-30H389V-85Z" />
|
||||
<glyph unicode="`" glyph-name="grave" horiz-adv-x="177" d="M110 543L25 655H98L152 543H110Z" />
|
||||
<glyph unicode="a" glyph-name="a" horiz-adv-x="487" d="M411 0H361L351 49Q290 -12 199 -12Q130 -12 89 26T48 129Q48 285 276 285H345V291Q345 410 229 410Q163 410 102 366L80 403Q149 466 248 466Q327 466 369 417T411 276V0ZM345 236H284Q120 236 120 135Q120
|
||||
92 145 68T217 43Q257 43 294 63T345 113V236Z" />
|
||||
<glyph unicode="b" glyph-name="b" horiz-adv-x="533" d="M129 0H78V609L145 645V407Q192 466 276 466Q379 466 436 392Q485 330 485 236Q485 112 414 44Q357 -12 273 -12Q185 -12 138 48L129 0ZM145 332V115Q158 83 191 63T265 43Q330 43 371 93T413 226Q413
|
||||
318 367 368Q328 411 267 411Q228 411 194 389T145 332Z" />
|
||||
<glyph unicode="c" glyph-name="c" horiz-adv-x="471" d="M421 418L399 380Q348 412 288 412Q206 412 160 352Q120 300 120 222Q120 139 171 89Q218 43 294 43Q358 43 407 80L429 40Q373 -12 279 -12Q169 -12 104 62Q48 127 48 225Q48 335 121 405Q184 466 273
|
||||
466Q360 466 421 418Z" />
|
||||
<glyph unicode="d" glyph-name="d" horiz-adv-x="533" d="M405 0L394 48Q346 -12 255 -12Q156 -12 98 62Q48 126 48 221Q48 341 118 409Q176 466 261 466Q341 466 389 413V607L455 644V0H405ZM389 121V338Q376 369 342 390T270 412Q204 412 162 361T120 228Q120
|
||||
136 166 85Q206 43 266 43Q306 43 339 64T389 121Z" />
|
||||
<glyph unicode="e" glyph-name="e" horiz-adv-x="495" d="M447 204H123Q127 131 173 87T294 43Q356 43 415 80L438 40Q372 -12 279 -12Q171 -12 107 59Q48 123 48 225Q48 331 111 402Q168 466 252 466Q353 466 406 384Q447 320 447 226V204ZM122 258H378Q375 331
|
||||
343 372T253 413Q199 413 163 370T122 258Z" />
|
||||
<glyph unicode="f" glyph-name="f" horiz-adv-x="336" d="M42 454H107V520Q107 579 136 612T218 645Q272 645 321 611L297 574Q264 591 232 591Q173 591 173 517V454H287V400H173V0H107V400H42V454Z" />
|
||||
<glyph unicode="g" glyph-name="g" horiz-adv-x="538" d="M398 408L408 454H460V37Q460 -191 261 -191Q167 -191 95 -128L118 -91Q180 -134 250 -134Q324 -134 359 -93T394 37V46Q345 -12 260 -12Q161 -12 103 62Q53 126 53 221Q53 341 123 409Q181 466 266 466Q304
|
||||
466 341 450T398 408ZM394 121V338Q381 369 347 390T275 412Q209 412 167 361T125 228Q125 136 171 85Q211 43 271 43Q311 43 344 64T394 121Z" />
|
||||
<glyph unicode="h" glyph-name="h" horiz-adv-x="533" d="M460 0H394V266Q394 408 268 408Q234 408 198 391T145 348V0H78V610L145 645V406Q207 466 289 466Q460 466 460 271V0Z" />
|
||||
<glyph unicode="i" glyph-name="i" horiz-adv-x="232" d="M149 454V0H83V454H149ZM73 602Q73 619 86 632T117 645Q135 645 148 632T161 602Q161 583 148 571T117 558Q98 558 86 570T73 602Z" />
|
||||
<glyph unicode="j" glyph-name="j" horiz-adv-x="235" d="M150 454V-66Q150 -125 121 -158T39 -191Q-16 -191 -64 -156L-40 -119Q-9 -137 25 -137Q84 -137 84 -63V454H150ZM72 602Q72 619 85 632T116 645Q134 645 147 632T160 602Q160 583 147 571T116 558Q97
|
||||
558 85 570T72 602Z" />
|
||||
<glyph unicode="k" glyph-name="k" horiz-adv-x="446" d="M402 454L201 277L426 0H345L145 252V0H78V609L145 645V302L309 454H402Z" />
|
||||
<glyph unicode="l" glyph-name="l" horiz-adv-x="223" d="M145 645V0H78V609L145 645Z" />
|
||||
<glyph unicode="m" glyph-name="m" horiz-adv-x="830" d="M757 0H690V260Q690 408 566 408Q499 408 442 350Q452 315 452 272V0H386V264Q386 408 265 408Q233 408 199 391T145 347V0H78V454H134L140 407H143Q206 466 288 466Q386 466 425 393Q491 466 590 466Q672
|
||||
466 716 413Q757 363 757 272V0Z" />
|
||||
<glyph unicode="n" glyph-name="n" horiz-adv-x="533" d="M460 0H394V266Q394 408 270 408Q234 408 199 391T145 348V0H78V454H134L140 406H143Q202 466 291 466Q460 466 460 271V0Z" />
|
||||
<glyph unicode="o" glyph-name="o" horiz-adv-x="533" d="M485 226Q485 118 417 49Q356 -12 267 -12Q164 -12 101 66Q48 132 48 226Q48 336 114 404Q174 466 267 466Q372 466 434 387Q485 321 485 226ZM120 226Q120 139 165 88Q205 43 266 43Q332 43 372 93T413
|
||||
226Q413 312 369 364Q329 412 267 412Q201 412 161 361T120 226Z" />
|
||||
<glyph unicode="p" glyph-name="p" horiz-adv-x="539" d="M78 454H131L140 405Q196 466 288 466Q386 466 443 392Q491 329 491 236Q491 113 421 44Q364 -12 283 -12Q195 -12 145 42V-182H78V454ZM145 331V116Q157 85 192 64T266 43Q335 43 377 93T419 226Q419
|
||||
319 373 369Q335 411 273 411Q234 411 197 388T145 331Z" />
|
||||
<glyph unicode="q" glyph-name="q" horiz-adv-x="538" d="M409 454H460V-185H394V48Q339 -12 252 -12Q156 -12 98 62Q48 125 48 220Q48 342 119 410Q176 466 260 466Q352 466 398 408L409 454ZM394 123V337Q380 369 345 390T271 412Q204 412 163 361T121 228Q121
|
||||
135 167 85Q205 43 264 43Q305 43 342 65T394 123Z" />
|
||||
<glyph unicode="r" glyph-name="r" horiz-adv-x="392" d="M374 415L319 377Q285 407 246 407Q189 407 145 348V0H78V454H135L141 406H143Q202 466 264 466Q337 466 374 415Z" />
|
||||
<glyph unicode="s" glyph-name="s" horiz-adv-x="415" d="M316 386Q266 412 207 412Q167 412 145 395T122 347Q122 315 142 298T221 263Q303 238 335 207T367 120Q367 61 323 25T208 -12Q116 -12 48 38Q51 43 58 55Q65 68 70 75Q128 43 195 43Q300 43 300 122Q300
|
||||
154 278 172T194 206Q52 246 52 345Q52 398 93 432T200 466Q277 466 338 423L316 386Z" />
|
||||
<glyph unicode="t" glyph-name="t" horiz-adv-x="367" d="M178 399L177 115Q177 42 236 42Q269 42 301 59L325 22Q276 -12 222 -12Q169 -12 140 21T111 113V399H42V454H112V553L178 587V454H317V399H178Z" />
|
||||
<glyph unicode="u" glyph-name="u" horiz-adv-x="522" d="M444 454V0H392L386 52L383 51Q322 -12 235 -12Q162 -12 120 39T78 182V454H145V194Q145 47 255 47Q289 47 323 64T378 108V454H444Z" />
|
||||
<glyph unicode="v" glyph-name="v" horiz-adv-x="441" d="M254 0H186L15 454H87L221 79L354 454H426L254 0Z" />
|
||||
<glyph unicode="w" glyph-name="w" horiz-adv-x="692" d="M237 0H165L15 454H87L201 78L310 454H387L491 78L605 454H677L526 0H454L348 373L237 0Z" />
|
||||
<glyph unicode="x" glyph-name="x" horiz-adv-x="427" d="M407 454L256 237L414 0H340L216 188L88 0H13L178 234L37 454H111L217 285L333 454H407Z" />
|
||||
<glyph unicode="y" glyph-name="y" horiz-adv-x="457" d="M442 454L244 -69Q199 -191 120 -191Q70 -191 20 -155L42 -119Q76 -137 102 -137Q152 -137 189 -44L207 0H190L15 454H86L230 69L370 454H442Z" />
|
||||
<glyph unicode="z" glyph-name="z" horiz-adv-x="410" d="M385 0H25V58L300 399H42V454H379V396L105 55H385V0Z" />
|
||||
<glyph unicode="{" glyph-name="braceleft" horiz-adv-x="377" d="M48 226V284Q97 287 125 326T154 429V477Q154 572 185 608T300 645H320V587H300Q250 587 235 566T220 477V429Q220 302 117 254Q172 229 196 189T220 79V29Q220 -40 235 -61T300 -82H320V-139H300Q208
|
||||
-139 178 -93Q154 -57 154 29V79Q154 141 125 180T48 226Z" />
|
||||
<glyph unicode="|" glyph-name="bar" horiz-adv-x="242" d="M152 662V-179H90V662H152Z" />
|
||||
<glyph unicode="}" glyph-name="braceright" horiz-adv-x="377" d="M329 284V226Q280 220 252 181T223 79V29Q223 -67 192 -103T77 -139H57V-82H77Q127 -82 142 -61T157 29V79Q157 148 180 188T260 254Q157 302 157 429V477Q157 545 142 566T77 587H57V645H77Q168
|
||||
645 199 599Q223 563 223 477V429Q223 365 251 326T329 284Z" />
|
||||
<glyph unicode="~" glyph-name="asciitilde" horiz-adv-x="483" d="M68 199L42 217Q71 305 141 305Q177 305 255 270Q317 242 344 242Q391 242 413 293L441 275Q417 188 353 188Q319 188 244 220Q237 223 221 230Q174 251 143 251Q98 251 68 199Z" />
|
||||
<glyph unicode=" " glyph-name="space" horiz-adv-x="240" />
|
||||
<glyph unicode="¡" glyph-name="exclamdown" horiz-adv-x="216" d="M73 315H140V-169H73V315ZM150 428Q150 388 109 388Q68 388 66 429Q66 473 109 473Q150 473 150 430Q150 429 150 428Z" />
|
||||
<glyph unicode="¢" glyph-name="cent" horiz-adv-x="474" d="M294 -11V-52H258V-11Q157 -4 99 68Q48 132 48 225Q48 330 115 400Q174 460 258 466V512H294V465Q365 461 421 418L399 380Q350 410 294 412V43H295Q358 43 407 80L429 40Q379 -7 294 -11ZM258
|
||||
47V408Q195 398 158 348T120 222Q120 152 157 105T258 47Z" />
|
||||
<glyph unicode="£" glyph-name="sterling" horiz-adv-x="474" d="M349 313H188V63H430V0H44V63H114V313H42V370H114V429Q114 645 290 645Q372 645 446 584L415 539Q354 580 299 580Q188 580 188 437V370H349V313Z" />
|
||||
<glyph unicode="¤" glyph-name="currency" horiz-adv-x="482" d="M431 96L349 176Q308 147 248 147Q187 147 147 176L68 98Q66 97 64 97Q56 97 43 111T29 134Q29 136 30 136L107 211Q73 256 73 315Q73 373 109 419L30 497Q28 498 28 501Q28 510 41 523T63
|
||||
536Q65 536 67 534L147 454Q191 483 248 483Q304 483 349 454L430 533Q431 535 435 535Q444 535 456 524T468 503Q468 500 466 498L388 420Q421 375 421 315Q421 257 388 212L467 135Q469 134 469 131Q469 121 457 108T435 94Q432 94 431 96ZM249 203Q299 203 327
|
||||
233T356 316Q356 368 328 398T249 428Q200 428 170 397T138 316Q138 265 168 234T249 203Z" />
|
||||
<glyph unicode="¥" glyph-name="yen" horiz-adv-x="530" d="M302 0H229V132H51V187H229V248L219 266H51V321H188L15 633H93L261 321H269L437 633H515L342 321H475V266H311L302 248V187H475V132H302V0Z" />
|
||||
<glyph unicode="¦" glyph-name="brokenbar" horiz-adv-x="230" d="M84 222H146V-186H84V222ZM146 669V296H84V669H146Z" />
|
||||
<glyph unicode="§" glyph-name="section" horiz-adv-x="449" d="M67 -93L88 -58Q141 -83 202 -83Q318 -83 318 10Q318 79 212 113Q50 163 50 268Q50 354 136 394Q70 440 70 510Q70 571 112 608T225 645Q304 645 366 602L343 567Q293 592 235 592Q191 592
|
||||
165 572T139 516Q139 447 258 404Q334 376 366 340T399 244Q399 169 325 130Q387 90 387 11Q387 -56 340 -98T220 -140Q134 -140 67 -93ZM168 374Q117 339 117 283Q119 239 146 213T238 166Q257 160 286 149Q288 149 289 150Q335 181 335 236Q335 309 244 342Q191
|
||||
361 168 374Z" />
|
||||
<glyph unicode="¨" glyph-name="dieresis" horiz-adv-x="308" d="M34 602Q34 620 47 632T78 645Q96 645 109 632T122 602Q122 583 109 571T78 558Q59 558 47 570T34 602ZM185 602Q185 619 198 632T229 645Q247 645 260 632T273 602Q273 583 260 571T229 558Q210
|
||||
558 198 570T185 602Z" />
|
||||
<glyph unicode="©" glyph-name="copyright" horiz-adv-x="699" d="M481 459L466 427Q421 455 367 455Q310 455 275 415T239 308Q239 248 276 210T373 171Q428 171 469 202L487 167Q436 123 359 123Q274 123 222 183Q178 235 178 311Q178 397 235 453Q286
|
||||
502 358 502Q429 502 481 459ZM48 315Q48 448 148 539Q234 617 349 617Q482 617 573 517Q651 431 651 315Q651 182 551 92Q464 14 349 14Q216 14 126 114Q48 200 48 315ZM102 315Q102 202 183 128Q253 64 351 64Q463 64 536 146Q600 217 600 315Q600 427 518 501Q447
|
||||
565 349 565Q236 565 164 483Q102 413 102 315Z" />
|
||||
<glyph unicode="ª" glyph-name="ordfeminine" horiz-adv-x="268" d="M231 406H191L186 441Q161 400 113 400Q78 400 56 420T33 473Q33 552 155 552H182V554Q182 607 129 607Q98 607 62 581L46 611Q89 645 138 645Q231 645 231 544V406ZM181 521H161Q83 521
|
||||
83 476Q83 440 123 440Q168 440 181 485V521Z" />
|
||||
<glyph unicode="«" glyph-name="guillemotleft" horiz-adv-x="502" d="M260 18Q201 32 143 90T50 230Q85 311 143 369T260 442V382Q167 336 118 230Q167 123 260 77V18ZM462 18Q403 32 346 90T253 230Q288 311 345 369T462 442V382Q371 336 320 230Q371 122
|
||||
462 78V18Z" />
|
||||
<glyph unicode="¬" glyph-name="logicalnot" horiz-adv-x="467" d="M42 158V224H425V0H350V158H42Z" />
|
||||
<glyph unicode="®" glyph-name="registered" horiz-adv-x="414" d="M204 470H185V410H152V567H208Q265 567 265 520Q265 488 237 476L272 410H233L204 470ZM185 541V497H204Q232 497 232 518Q232 541 204 541H185ZM207 322Q135 322 87 376Q45 422 45 484Q45
|
||||
555 99 604Q145 645 207 645Q279 645 327 592Q369 546 369 484Q369 412 315 364Q269 322 207 322ZM207 611Q154 611 118 574T81 484Q81 430 117 393T207 356Q260 356 297 393T334 484Q334 536 297 573T207 611Z" />
|
||||
<glyph unicode="¯" glyph-name="overscore" horiz-adv-x="231" d="M215 581H16V633H215V581Z" />
|
||||
<glyph unicode="°" glyph-name="degree" horiz-adv-x="278" d="M25 538Q25 587 57 619T139 652Q188 652 220 620T253 538Q253 489 221 457T139 424Q90 424 58 456T25 538ZM61 538Q61 504 82 482T139 460Q174 460 196 481T218 538Q218 573 196 595T139 617Q104
|
||||
617 83 595T61 538Z" />
|
||||
<glyph unicode="±" glyph-name="plusminus" horiz-adv-x="509" d="M223 251H42V306H223V454H285V306H467V251H285V103H223V251ZM467 0H42V55H467V0Z" />
|
||||
<glyph unicode="²" glyph-name="twosuperior" horiz-adv-x="354" d="M62 316V368L166 456Q227 507 227 541Q227 594 164 594Q126 594 84 565L58 596Q113 645 173 645Q223 645 254 618T285 545Q285 487 215 425L149 368H284V316H62Z" />
|
||||
<glyph unicode="³" glyph-name="threesuperior" horiz-adv-x="371" d="M141 463V514H181Q238 514 238 553Q238 594 181 594Q143 594 101 571L76 599Q128 645 190 645Q240 645 268 622T297 559Q297 536 282 517T244 491Q303 474 303 409Q303 367 269 341T183
|
||||
314Q127 314 76 359L103 389Q140 366 178 366Q243 366 243 413Q243 463 180 463H141Z" />
|
||||
<glyph unicode="´" glyph-name="acute" horiz-adv-x="177" d="M152 655L67 543H25L79 655H152Z" />
|
||||
<glyph unicode="µ" glyph-name="mu" horiz-adv-x="557" d="M146 -178H78V454H146V186Q146 50 251 50Q286 50 318 67T368 114V454H435V101Q435 43 474 43Q491 43 512 57L533 23Q498 -13 456 -13Q382 -13 370 58Q347 27 309 8T233 -12Q178 -12 146 17V-178Z" />
|
||||
<glyph unicode="¶" glyph-name="paragraph" horiz-adv-x="445" d="M355 0H318V633H355V0ZM250 0V365H207Q46 365 46 496Q46 558 88 595T202 633H288V0H250Z" />
|
||||
<glyph unicode="·" glyph-name="middot" horiz-adv-x="175" d="M86 308Q66 308 53 322T39 358Q39 377 53 391T86 405Q107 405 121 391T136 358Q136 336 122 322T86 308Z" />
|
||||
<glyph unicode="¸" glyph-name="cedilla" horiz-adv-x="213" d="M72 10H118L106 -30Q115 -28 126 -28Q188 -28 188 -86Q188 -118 163 -139T97 -160Q61 -160 25 -144L37 -108Q66 -121 93 -121Q138 -121 138 -87Q138 -53 91 -53Q74 -53 56 -55L72 10Z" />
|
||||
<glyph unicode="¹" glyph-name="onesuperior" horiz-adv-x="280" d="M191 633V318H136V563L69 505L32 543L132 633H191Z" />
|
||||
<glyph unicode="º" glyph-name="ordmasculine" horiz-adv-x="290" d="M145 400Q97 400 65 435T33 522Q33 577 64 611T145 645Q194 645 225 611T257 522Q257 470 225 435T145 400ZM145 609Q85 609 85 522Q85 484 101 461T145 437Q206 437 206 522Q206 561
|
||||
190 585T145 609Z" />
|
||||
<glyph unicode="»" glyph-name="guillemotright" horiz-adv-x="502" d="M40 18V78Q133 123 182 230Q133 335 40 382V442Q99 427 157 369T250 230Q215 149 157 91T40 18ZM243 18V78Q334 122 385 230Q334 336 243 382V442Q302 427 359 369T452 230Q417 149
|
||||
360 91T243 18Z" />
|
||||
<glyph unicode="¼" glyph-name="onequarter" horiz-adv-x="820" d="M474 119L640 318H696V116H756V65H696V0H641V65H474V119ZM540 116H641V243L540 116ZM235 633V318H180V563L113 505L76 543L176 633H235ZM617 633L233 -30H180L564 633H617Z" />
|
||||
<glyph unicode="½" glyph-name="onehalf" horiz-adv-x="831" d="M235 633V318H180V563L113 505L76 543L176 633H235ZM529 0V52L633 140Q694 191 694 225Q694 278 631 278Q593 278 551 249L525 280Q580 329 640 329Q690 329 721 302T752 229Q752 171 682 109L616
|
||||
52H751V0H529ZM610 633L226 -30H173L557 633H610Z" />
|
||||
<glyph unicode="¾" glyph-name="threequarters" horiz-adv-x="858" d="M502 119L669 318H724V116H784V65H724V0H669V65H502V119ZM568 116H669V243L568 116ZM141 463V514H181Q238 514 238 553Q238 594 181 594Q143 594 101 571L76 599Q128 645 190 645Q240
|
||||
645 268 622T297 559Q297 536 282 517T244 491Q303 474 303 409Q303 367 269 341T183 314Q127 314 76 359L103 389Q140 366 178 366Q243 366 243 413Q243 463 180 463H141ZM643 633L259 -30H206L590 633H643Z" />
|
||||
<glyph unicode="¿" glyph-name="questiondown" horiz-adv-x="392" d="M203 309H271V222Q271 182 260 163T208 110Q120 38 120 -32Q120 -78 147 -104T221 -131Q272 -131 324 -102L347 -142Q279 -192 202 -192Q134 -192 92 -150T50 -40Q50 53 133 123Q137 127
|
||||
147 135L149 137Q185 166 194 182T203 234V309ZM237 465Q257 465 270 451T284 416Q284 396 270 383T237 369Q216 369 202 382T188 416Q188 437 201 451T237 465Z" />
|
||||
<glyph unicode="À" glyph-name="Agrave" horiz-adv-x="576" d="M242 633H319L546 0H470L419 148H144L92 0H15L242 633ZM280 550L164 210H397L280 550ZM246 711L162 823H234L288 711H246Z" />
|
||||
<glyph unicode="Á" glyph-name="Aacute" horiz-adv-x="576" d="M242 633H319L546 0H470L419 148H144L92 0H15L242 633ZM280 550L164 210H397L280 550ZM388 823L303 711H261L315 823H388Z" />
|
||||
<glyph unicode="Â" glyph-name="Acircumflex" horiz-adv-x="576" d="M242 633H319L546 0H470L419 148H144L92 0H15L242 633ZM280 550L164 210H397L280 550ZM257 823H304L382 711H327L281 779L279 778L232 711H178L257 823Z" />
|
||||
<glyph unicode="Ã" glyph-name="Atilde" horiz-adv-x="576" d="M242 633H319L546 0H470L419 148H144L92 0H15L242 633ZM280 550L164 210H397L280 550ZM174 714L147 731Q171 807 230 807Q258 807 298 782Q330 763 344 763Q371 763 394 808L421 790Q396 714
|
||||
342 714Q321 714 284 734Q282 735 277 738L275 739Q245 757 230 757Q213 757 197 744T174 714Z" />
|
||||
<glyph unicode="Ä" glyph-name="Adieresis" horiz-adv-x="576" d="M242 633H319L546 0H470L419 148H144L92 0H15L242 633ZM280 550L164 210H397L280 550ZM161 770Q161 788 174 800T205 813Q223 813 236 800T249 770Q249 751 236 739T205 726Q186 726 174
|
||||
738T161 770ZM312 770Q312 787 325 800T356 813Q374 813 387 800T400 770Q400 751 387 739T356 726Q337 726 325 738T312 770Z" />
|
||||
<glyph unicode="Å" glyph-name="Aring" horiz-adv-x="576" d="M242 633H319L546 0H470L419 148H144L92 0H15L242 633ZM280 550L164 210H397L280 550ZM218 763Q218 789 236 807T281 826Q307 826 325 808T344 763Q344 737 326 719T281 700Q254 700 236 718T218
|
||||
763ZM248 763Q248 731 280 731Q294 731 304 740T314 763Q314 776 304 786T280 796Q248 796 248 763Z" />
|
||||
<glyph unicode="Æ" glyph-name="AE" horiz-adv-x="785" d="M723 633V570H425V361H676V298H425V63H736V0H351V152H153L92 0H15L290 633H723ZM330 569L179 214H351V569H330Z" />
|
||||
<glyph unicode="Ç" glyph-name="Ccedilla" horiz-adv-x="566" d="M496 582L466 539Q399 581 329 581Q233 581 178 502Q127 430 127 310Q127 185 193 115Q249 54 337 54Q409 54 474 101L504 56Q433 -6 341 -11L336 -30Q345 -28 356 -28Q418 -28 418 -86Q418
|
||||
-118 393 -139T327 -160Q291 -160 255 -144L267 -108Q296 -121 323 -121Q368 -121 368 -87Q368 -53 321 -53Q304 -53 286 -55L297 -10Q173 1 105 104Q48 189 48 310Q48 454 126 552Q200 645 315 645Q417 645 496 582Z" />
|
||||
<glyph unicode="È" glyph-name="Egrave" horiz-adv-x="526" d="M82 633H454V570H156V361H407V298H156V63H467V0H82V633ZM262 712L177 824H250L304 712H262Z" />
|
||||
<glyph unicode="É" glyph-name="Eacute" horiz-adv-x="526" d="M82 633H454V570H156V361H407V298H156V63H467V0H82V633ZM348 819L263 707H221L275 819H348Z" />
|
||||
<glyph unicode="Ê" glyph-name="Ecircumflex" horiz-adv-x="526" d="M82 633H454V570H156V361H407V298H156V63H467V0H82V633ZM244 823H292L369 711H314L269 779L267 778L220 711H166L244 823Z" />
|
||||
<glyph unicode="Ë" glyph-name="Edieresis" horiz-adv-x="526" d="M82 633H454V570H156V361H407V298H156V63H467V0H82V633ZM150 770Q150 788 163 800T194 813Q212 813 225 800T238 770Q238 751 225 739T194 726Q175 726 163 738T150 770ZM301 770Q301 787
|
||||
314 800T345 813Q363 813 376 800T389 770Q389 751 376 739T345 726Q326 726 314 738T301 770Z" />
|
||||
<glyph unicode="Ì" glyph-name="Igrave" horiz-adv-x="272" d="M164 633V0H91V633H164ZM106 711L21 823H94L148 711H106Z" />
|
||||
<glyph unicode="Í" glyph-name="Iacute" horiz-adv-x="272" d="M164 633V0H90V633H164ZM235 823L151 711H109L163 823H235Z" />
|
||||
<glyph unicode="Î" glyph-name="Icircumflex" horiz-adv-x="272" d="M164 633V0H91V633H164ZM106 834H153L231 722H176L130 790L128 789L81 722H27L106 834Z" />
|
||||
<glyph unicode="Ï" glyph-name="Idieresis" horiz-adv-x="272" d="M164 633V0H91V633H164ZM8 770Q8 788 21 800T52 813Q70 813 83 800T96 770Q96 751 83 739T52 726Q33 726 21 738T8 770ZM159 770Q159 787 172 800T203 813Q221 813 234 800T247 770Q247 751
|
||||
234 739T203 726Q184 726 172 738T159 770Z" />
|
||||
<glyph unicode="Ð" glyph-name="Eth" horiz-adv-x="655" d="M119 299H41V356H119V634Q205 645 271 645Q434 645 520 547Q594 462 594 323Q594 154 501 66Q419 -12 277 -12Q209 -12 119 0V299ZM193 575V356H345V299H193V58Q235 49 277 49Q396 49 458 125Q515
|
||||
194 515 319Q515 454 436 526Q372 584 274 584Q232 584 193 575Z" />
|
||||
<glyph unicode="Ñ" glyph-name="Ntilde" horiz-adv-x="675" d="M164 0H90V633H157Q248 496 474 117V633H548V0H479Q425 81 259 350Q189 464 164 506V0ZM210 705L183 722Q208 798 266 798Q294 798 335 773Q367 754 381 754Q408 754 430 799L458 781Q432 705
|
||||
379 705Q357 705 321 725Q318 726 312 730Q282 748 266 748Q250 748 233 735T210 705Z" />
|
||||
<glyph unicode="Ò" glyph-name="Ograve" horiz-adv-x="654" d="M322 -12Q185 -12 109 101Q50 189 50 315Q50 461 128 555Q202 645 322 645Q459 645 535 531Q594 441 594 315Q594 169 516 76Q442 -12 322 -12ZM129 315Q129 189 184 118Q235 53 322 53Q422
|
||||
53 473 137Q515 206 515 315Q515 441 460 513Q409 581 322 581Q223 581 171 494Q129 424 129 315ZM310 710L225 822H298L352 710H310Z" />
|
||||
<glyph unicode="Ó" glyph-name="Oacute" horiz-adv-x="654" d="M322 -12Q185 -12 109 101Q50 189 50 315Q50 461 128 555Q202 645 322 645Q459 645 535 531Q594 441 594 315Q594 169 516 76Q442 -12 322 -12ZM129 315Q129 189 184 118Q235 53 322 53Q422
|
||||
53 473 137Q515 206 515 315Q515 441 460 513Q409 581 322 581Q223 581 171 494Q129 424 129 315ZM424 822L340 710H298L352 822H424Z" />
|
||||
<glyph unicode="Ô" glyph-name="Ocircumflex" horiz-adv-x="654" d="M322 -12Q185 -12 109 101Q50 189 50 315Q50 461 128 555Q202 645 322 645Q459 645 535 531Q594 441 594 315Q594 169 516 76Q442 -12 322 -12ZM129 315Q129 189 184 118Q235 53 322 53Q422
|
||||
53 473 137Q515 206 515 315Q515 441 460 513Q409 581 322 581Q223 581 171 494Q129 424 129 315ZM302 822H349L427 710H372L326 778L324 777L277 710H223L302 822Z" />
|
||||
<glyph unicode="Õ" glyph-name="Otilde" horiz-adv-x="654" d="M322 -12Q185 -12 109 101Q50 189 50 315Q50 461 128 555Q202 645 322 645Q459 645 535 531Q594 441 594 315Q594 169 516 76Q442 -12 322 -12ZM129 315Q129 189 184 118Q235 53 322 53Q422
|
||||
53 473 137Q515 206 515 315Q515 441 460 513Q409 581 322 581Q223 581 171 494Q129 424 129 315ZM214 714L187 731Q212 807 270 807Q298 807 339 782Q371 763 385 763Q412 763 434 808L462 790Q436 714 383 714Q361 714 325 734Q322 735 316 739Q286 757 270 757Q254
|
||||
757 237 744T214 714Z" />
|
||||
<glyph unicode="Ö" glyph-name="Odieresis" horiz-adv-x="654" d="M322 -12Q185 -12 109 101Q50 189 50 315Q50 461 128 555Q202 645 322 645Q459 645 535 531Q594 441 594 315Q594 169 516 76Q442 -12 322 -12ZM129 315Q129 189 184 118Q235 53 322 53Q422
|
||||
53 473 137Q515 206 515 315Q515 441 460 513Q409 581 322 581Q223 581 171 494Q129 424 129 315ZM205 770Q205 788 217 800T249 813Q266 813 279 800T292 770Q292 751 280 739T249 726Q230 726 218 738T205 770ZM356 770Q356 787 368 800T399 813Q417 813 430
|
||||
800T443 770Q443 751 431 739T399 726Q381 726 369 738T356 770Z" />
|
||||
<glyph unicode="×" glyph-name="multiply" horiz-adv-x="501" d="M81 5Q69 16 50 35Q41 44 36 50L216 232L104 351L48 410Q56 418 63 425Q80 441 90 452L254 273Q281 302 332 356L344 369Q396 425 423 453L466 410L295 231Q317 206 369 149Q433 80 463 46L422
|
||||
5L257 190L81 5Z" />
|
||||
<glyph unicode="Ø" glyph-name="Oslash" horiz-adv-x="644" d="M216 10L197 -30H134L167 38Q50 128 50 315Q50 461 128 555Q202 645 322 645Q392 645 449 612L465 645H527L494 579Q594 485 594 315Q594 169 516 76Q442 -12 322 -12Q265 -12 216 10ZM198 102L419
|
||||
552Q377 581 322 581Q223 581 171 494Q129 424 129 315Q129 171 198 102ZM245 69Q280 53 322 53Q422 53 473 137Q515 206 515 315Q515 439 461 511L245 69Z" />
|
||||
<glyph unicode="Ù" glyph-name="Ugrave" horiz-adv-x="644" d="M90 633H165V242Q165 53 316 53Q466 53 466 242V633H542V264Q542 -12 316 -12Q90 -12 90 264V633ZM301 710L216 822H289L343 710H301Z" />
|
||||
<glyph unicode="Ú" glyph-name="Uacute" horiz-adv-x="644" d="M90 633H165V242Q165 53 316 53Q466 53 466 242V633H542V264Q542 -12 316 -12Q90 -12 90 264V633ZM405 822L320 710H278L332 822H405Z" />
|
||||
<glyph unicode="Û" glyph-name="Ucircumflex" horiz-adv-x="644" d="M90 633H165V242Q165 53 316 53Q466 53 466 242V633H542V264Q542 -12 316 -12Q90 -12 90 264V633ZM292 822H340L417 710H362L317 778L315 777L268 710H214L292 822Z" />
|
||||
<glyph unicode="Ü" glyph-name="Udieresis" horiz-adv-x="644" d="M90 633H165V242Q165 53 316 53Q466 53 466 242V633H542V264Q542 -12 316 -12Q90 -12 90 264V633ZM197 771Q197 789 210 801T241 814Q259 814 272 801T285 771Q285 752 272 740T241 727Q222
|
||||
727 210 739T197 771ZM348 771Q348 788 361 801T392 814Q410 814 423 801T436 771Q436 752 423 740T392 727Q373 727 361 739T348 771Z" />
|
||||
<glyph unicode="Ý" glyph-name="Yacute" horiz-adv-x="530" d="M15 633H93L265 313L437 633H515L302 248V0H229V248L15 633ZM366 818L281 706H239L293 818H366Z" />
|
||||
<glyph unicode="Þ" glyph-name="Thorn" horiz-adv-x="533" d="M90 0V633H163V520Q204 531 244 531Q469 531 469 340Q469 236 400 183Q344 139 256 139Q215 139 164 148V0H90ZM164 460V210Q206 201 256 201Q390 201 390 340Q390 470 247 470Q197 470 164 460Z" />
|
||||
<glyph unicode="ß" glyph-name="germandbls" horiz-adv-x="500" d="M189 9L205 55Q241 43 270 43Q316 43 345 78T375 168Q375 303 249 303H224V361H246Q294 361 323 394T353 483Q353 531 323 561T245 592Q199 592 172 563T145 483V0H78V469Q78 646 246 646Q333
|
||||
646 384 592Q426 547 426 484Q426 429 394 390T309 338Q451 306 451 166Q451 72 385 22Q339 -12 283 -12Q234 -12 189 9Z" />
|
||||
<glyph unicode="à" glyph-name="agrave" horiz-adv-x="495" d="M411 0H361L351 49Q290 -12 199 -12Q130 -12 89 26T48 129Q48 285 276 285H345V291Q345 410 229 410Q163 410 102 366L80 403Q149 466 248 466Q327 466 369 417T411 276V0ZM345 236H284Q120
|
||||
236 120 135Q120 92 145 68T217 43Q257 43 294 63T345 113V236ZM235 538L151 650H223L277 538H235Z" />
|
||||
<glyph unicode="á" glyph-name="aacute" horiz-adv-x="495" d="M411 0H361L351 49Q290 -12 199 -12Q130 -12 89 26T48 129Q48 285 276 285H345V291Q345 410 229 410Q163 410 102 366L80 403Q149 466 248 466Q327 466 369 417T411 276V0ZM345 236H284Q120
|
||||
236 120 135Q120 92 145 68T217 43Q257 43 294 63T345 113V236ZM335 650L250 538H208L262 650H335Z" />
|
||||
<glyph unicode="â" glyph-name="acircumflex" horiz-adv-x="495" d="M411 0H361L351 49Q290 -12 199 -12Q130 -12 89 26T48 129Q48 285 276 285H345V291Q345 410 229 410Q163 410 102 366L80 403Q149 466 248 466Q327 466 369 417T411 276V0ZM345 236H284Q120
|
||||
236 120 135Q120 92 145 68T217 43Q257 43 294 63T345 113V236ZM221 655H269L346 543H291L246 611L244 610L197 543H143L221 655Z" />
|
||||
<glyph unicode="ã" glyph-name="atilde" horiz-adv-x="495" d="M411 0H361L351 49Q290 -12 199 -12Q130 -12 89 26T48 129Q48 285 276 285H345V291Q345 410 229 410Q163 410 102 366L80 403Q149 466 248 466Q327 466 369 417T411 276V0ZM345 236H284Q120
|
||||
236 120 135Q120 92 145 68T217 43Q257 43 294 63T345 113V236ZM136 548L109 565Q134 641 192 641Q220 641 261 616Q293 597 307 597Q334 597 356 642L384 624Q358 548 305 548Q283 548 247 568Q244 569 238 573Q208 591 192 591Q176 591 159 578T136 548Z" />
|
||||
<glyph unicode="ä" glyph-name="adieresis" horiz-adv-x="495" d="M411 0H361L351 49Q290 -12 199 -12Q130 -12 89 26T48 129Q48 285 276 285H345V291Q345 410 229 410Q163 410 102 366L80 403Q149 466 248 466Q327 466 369 417T411 276V0ZM345 236H284Q120
|
||||
236 120 135Q120 92 145 68T217 43Q257 43 294 63T345 113V236ZM130 602Q130 620 142 632T174 645Q191 645 204 632T217 602Q217 583 205 571T174 558Q155 558 143 570T130 602ZM281 602Q281 619 293 632T324 645Q342 645 355 632T368 602Q368 583 356 571T324
|
||||
558Q306 558 294 570T281 602Z" />
|
||||
<glyph unicode="å" glyph-name="aring" horiz-adv-x="495" d="M411 0H361L351 49Q290 -12 199 -12Q130 -12 89 26T48 129Q48 285 276 285H345V291Q345 410 229 410Q163 410 102 366L80 403Q149 466 248 466Q327 466 369 417T411 276V0ZM345 236H284Q120 236
|
||||
120 135Q120 92 145 68T217 43Q257 43 294 63T345 113V236ZM182 594Q182 620 200 638T245 657Q271 657 289 639T308 594Q308 568 290 550T245 531Q218 531 200 549T182 594ZM212 594Q212 562 244 562Q258 562 268 571T278 594Q278 607 268 617T244 627Q212 627
|
||||
212 594Z" />
|
||||
<glyph unicode="æ" glyph-name="ae" horiz-adv-x="795" d="M741 204H418L420 188Q428 122 473 83T588 43Q651 43 710 80L732 40Q667 -12 573 -12Q445 -12 384 81H383Q338 30 297 9T199 -12Q130 -12 89 26T48 129Q48 285 276 285H345V291Q345 410 229 410Q163
|
||||
410 102 366L80 403Q149 466 248 466Q353 466 391 379Q448 466 547 466Q648 466 700 384Q741 320 741 226V204ZM345 236H284Q120 236 120 135Q120 92 145 68T217 43Q257 43 294 63T345 113V236ZM416 258H672Q670 331 638 372T548 413Q493 413 457 370T416 258Z"
|
||||
/>
|
||||
<glyph unicode="ç" glyph-name="ccedilla" horiz-adv-x="481" d="M230 -55L241 -9Q147 4 94 74Q48 136 48 225Q48 335 121 405Q184 466 273 466Q360 466 421 418L399 380Q348 412 288 412Q206 412 160 352Q120 300 120 222Q120 139 171 89Q218 43 294 43Q358
|
||||
43 407 80L429 40Q377 -8 292 -11H285L280 -30Q289 -28 300 -28Q362 -28 362 -86Q362 -118 337 -139T271 -160Q235 -160 199 -144L211 -108Q240 -121 267 -121Q312 -121 312 -87Q312 -53 265 -53Q248 -53 230 -55Z" />
|
||||
<glyph unicode="è" glyph-name="egrave" horiz-adv-x="512" d="M447 204H123Q127 131 173 87T294 43Q356 43 415 80L438 40Q372 -12 279 -12Q171 -12 107 59Q48 123 48 225Q48 331 111 402Q168 466 252 466Q353 466 406 384Q447 320 447 226V204ZM122 258H378Q375
|
||||
331 343 372T253 413Q199 413 163 370T122 258ZM233 543L148 655H221L275 543H233Z" />
|
||||
<glyph unicode="é" glyph-name="eacute" horiz-adv-x="512" d="M447 204H123Q127 131 173 87T294 43Q356 43 415 80L438 40Q372 -12 279 -12Q171 -12 107 59Q48 123 48 225Q48 331 111 402Q168 466 252 466Q353 466 406 384Q447 320 447 226V204ZM122 258H378Q375
|
||||
331 343 372T253 413Q199 413 163 370T122 258ZM358 655L274 543H232L286 655H358Z" />
|
||||
<glyph unicode="ê" glyph-name="ecircumflex" horiz-adv-x="512" d="M447 204H123Q127 131 173 87T294 43Q356 43 415 80L438 40Q372 -12 279 -12Q171 -12 107 59Q48 123 48 225Q48 331 111 402Q168 466 252 466Q353 466 406 384Q447 320 447 226V204ZM122
|
||||
258H378Q375 331 343 372T253 413Q199 413 163 370T122 258ZM228 655H275L353 543H298L252 611L250 610L203 543H149L228 655Z" />
|
||||
<glyph unicode="ë" glyph-name="edieresis" horiz-adv-x="512" d="M447 204H123Q127 131 173 87T294 43Q356 43 415 80L438 40Q372 -12 279 -12Q171 -12 107 59Q48 123 48 225Q48 331 111 402Q168 466 252 466Q353 466 406 384Q447 320 447 226V204ZM122
|
||||
258H378Q375 331 343 372T253 413Q199 413 163 370T122 258ZM134 602Q134 620 147 632T178 645Q196 645 209 632T222 602Q222 583 209 571T178 558Q159 558 147 570T134 602ZM285 602Q285 619 298 632T329 645Q347 645 360 632T373 602Q373 583 360 571T329 558Q310
|
||||
558 298 570T285 602Z" />
|
||||
<glyph unicode="ì" glyph-name="igrave" horiz-adv-x="281" d="M169 454V0H102V454H169ZM112 543L27 655H100L154 543H112Z" />
|
||||
<glyph unicode="í" glyph-name="iacute" horiz-adv-x="273" d="M243 655L158 543H116L170 655H243ZM171 454V0H104V454H171Z" />
|
||||
<glyph unicode="î" glyph-name="icircumflex" horiz-adv-x="281" d="M175 454V0H108V454H175ZM119 655H166L244 543H189L143 611L141 610L94 543H40L119 655Z" />
|
||||
<glyph unicode="ï" glyph-name="idieresis" horiz-adv-x="281" d="M168 454V0H101V454H168ZM16 602Q16 620 29 632T60 645Q78 645 91 632T104 602Q104 583 91 571T60 558Q41 558 29 570T16 602ZM167 602Q167 619 180 632T211 645Q229 645 242 632T255 602Q255
|
||||
583 242 571T211 558Q192 558 180 570T167 602Z" />
|
||||
<glyph unicode="ð" glyph-name="eth" horiz-adv-x="503" d="M153 621L189 645Q257 633 316 589L421 644Q427 638 431 634Q446 620 455 612L353 559Q454 457 454 285Q454 154 400 73Q343 -12 240 -12Q144 -12 89 67Q48 126 48 196Q48 316 120 372Q171 411
|
||||
243 411Q324 411 376 356Q362 468 299 532L179 471L146 505L264 565Q224 598 153 621ZM377 296Q332 355 254 355Q193 355 159 315T124 203Q124 129 153 87T236 45Q304 45 341 102T378 262Q378 278 377 296Z" />
|
||||
<glyph unicode="ñ" glyph-name="ntilde" horiz-adv-x="545" d="M460 0H394V266Q394 408 270 408Q234 408 199 391T145 348V0H78V454H134L140 406H143Q202 466 291 466Q460 466 460 271V0ZM163 562L136 579Q160 655 219 655Q247 655 287 630Q319 611 333 611Q360
|
||||
611 383 656L410 638Q385 562 331 562Q310 562 273 582Q271 583 266 586L264 587Q234 605 219 605Q202 605 186 592T163 562Z" />
|
||||
<glyph unicode="ò" glyph-name="ograve" horiz-adv-x="538" d="M485 226Q485 118 417 49Q356 -12 267 -12Q164 -12 101 66Q48 132 48 226Q48 336 114 404Q174 466 267 466Q372 466 434 387Q485 321 485 226ZM120 226Q120 139 165 88Q205 43 266 43Q332 43
|
||||
372 93T413 226Q413 312 369 364Q329 412 267 412Q201 412 161 361T120 226ZM250 543L165 655H238L292 543H250Z" />
|
||||
<glyph unicode="ó" glyph-name="oacute" horiz-adv-x="538" d="M485 226Q485 118 417 49Q356 -12 267 -12Q164 -12 101 66Q48 132 48 226Q48 336 114 404Q174 466 267 466Q372 466 434 387Q485 321 485 226ZM120 226Q120 139 165 88Q205 43 266 43Q332 43
|
||||
372 93T413 226Q413 312 369 364Q329 412 267 412Q201 412 161 361T120 226ZM367 655L282 543H240L294 655H367Z" />
|
||||
<glyph unicode="ô" glyph-name="ocircumflex" horiz-adv-x="538" d="M485 226Q485 118 417 49Q356 -12 267 -12Q164 -12 101 66Q48 132 48 226Q48 336 114 404Q174 466 267 466Q372 466 434 387Q485 321 485 226ZM120 226Q120 139 165 88Q205 43 266 43Q332
|
||||
43 372 93T413 226Q413 312 369 364Q329 412 267 412Q201 412 161 361T120 226ZM245 655H293L370 543H315L270 611L268 610L221 543H167L245 655Z" />
|
||||
<glyph unicode="õ" glyph-name="otilde" horiz-adv-x="538" d="M485 226Q485 118 417 49Q356 -12 267 -12Q164 -12 101 66Q48 132 48 226Q48 336 114 404Q174 466 267 466Q372 466 434 387Q485 321 485 226ZM120 226Q120 139 165 88Q205 43 266 43Q332 43
|
||||
372 93T413 226Q413 312 369 364Q329 412 267 412Q201 412 161 361T120 226ZM154 562L127 579Q152 655 210 655Q238 655 279 630Q311 611 325 611Q352 611 374 656L402 638Q376 562 323 562Q301 562 265 582Q262 583 256 587Q226 605 210 605Q194 605 177 592T154
|
||||
562Z" />
|
||||
<glyph unicode="ö" glyph-name="odieresis" horiz-adv-x="538" d="M485 226Q485 118 417 49Q356 -12 267 -12Q164 -12 101 66Q48 132 48 226Q48 336 114 404Q174 466 267 466Q372 466 434 387Q485 321 485 226ZM120 226Q120 139 165 88Q205 43 266 43Q332
|
||||
43 372 93T413 226Q413 312 369 364Q329 412 267 412Q201 412 161 361T120 226ZM150 602Q150 620 163 632T194 645Q212 645 225 632T238 602Q238 583 225 571T194 558Q175 558 163 570T150 602ZM301 602Q301 619 314 632T345 645Q363 645 376 632T389 602Q389 583
|
||||
376 571T345 558Q326 558 314 570T301 602Z" />
|
||||
<glyph unicode="÷" glyph-name="divide" horiz-adv-x="390" d="M195 286Q155 286 155 327Q155 368 195 368Q235 368 235 327Q235 286 195 286ZM45 181V243H345V181H45ZM195 48Q155 48 155 89Q155 129 195 129Q235 129 235 89Q235 48 195 48Z" />
|
||||
<glyph unicode="ø" glyph-name="oslash" horiz-adv-x="533" d="M189 2L175 -30H117L142 27Q48 94 48 226Q48 336 114 404Q174 466 267 466Q301 466 336 455L352 490H411L384 432Q485 366 485 226Q485 118 417 49Q356 -12 267 -12Q229 -12 189 2ZM358 375L213
|
||||
54Q237 43 266 43Q332 43 372 93T413 226Q413 323 358 375ZM312 404Q290 412 267 412Q201 412 161 361T120 226Q120 136 169 86L312 404Z" />
|
||||
<glyph unicode="ù" glyph-name="ugrave" horiz-adv-x="534" d="M444 454V0H392L386 52L383 51Q322 -12 235 -12Q162 -12 120 39T78 182V454H145V194Q145 47 255 47Q289 47 323 64T378 108V454H444ZM240 543L155 655H228L282 543H240Z" />
|
||||
<glyph unicode="ú" glyph-name="uacute" horiz-adv-x="534" d="M444 454V0H392L386 52L383 51Q322 -12 235 -12Q162 -12 120 39T78 182V454H145V194Q145 47 255 47Q289 47 323 64T378 108V454H444ZM357 655L272 543H230L284 655H357Z" />
|
||||
<glyph unicode="û" glyph-name="ucircumflex" horiz-adv-x="534" d="M444 454V0H392L386 52L383 51Q322 -12 235 -12Q162 -12 120 39T78 182V454H145V194Q145 47 255 47Q289 47 323 64T378 108V454H444ZM238 655H286L363 543H308L263 611L261 610L214 543H160L238
|
||||
655Z" />
|
||||
<glyph unicode="ü" glyph-name="udieresis" horiz-adv-x="534" d="M444 454V0H392L386 52L383 51Q322 -12 235 -12Q162 -12 120 39T78 182V454H145V194Q145 47 255 47Q289 47 323 64T378 108V454H444ZM143 602Q143 620 155 632T187 645Q204 645 217 632T230
|
||||
602Q230 583 218 571T187 558Q168 558 156 570T143 602ZM294 602Q294 619 306 632T337 645Q355 645 368 632T381 602Q381 583 369 571T337 558Q319 558 307 570T294 602Z" />
|
||||
<glyph unicode="ý" glyph-name="yacute" horiz-adv-x="457" d="M442 454L244 -69Q199 -191 120 -191Q70 -191 20 -155L42 -119Q76 -137 102 -137Q152 -137 189 -44L207 0H190L15 454H86L230 69L370 454H442ZM326 650L241 538H199L253 650H326Z" />
|
||||
<glyph unicode="þ" glyph-name="thorn" horiz-adv-x="541" d="M78 609L146 644V397Q199 466 289 466Q388 466 444 392Q492 330 492 236Q492 112 422 44Q366 -12 284 -12Q200 -12 146 44V-185H78V609ZM146 318V127Q155 92 191 68T267 43Q335 43 377 93T419
|
||||
226Q419 319 374 369Q335 411 274 411Q233 411 193 382T146 318Z" />
|
||||
<glyph unicode="ÿ" glyph-name="ydieresis" horiz-adv-x="457" d="M442 454L244 -69Q199 -191 120 -191Q70 -191 20 -155L42 -119Q76 -137 102 -137Q152 -137 189 -44L207 0H190L15 454H86L230 69L370 454H442ZM111 602Q111 620 123 632T155 645Q172 645
|
||||
185 632T198 602Q198 583 186 571T155 558Q136 558 124 570T111 602ZM262 602Q262 619 274 632T305 645Q323 645 336 632T349 602Q349 583 337 571T305 558Q287 558 275 570T262 602Z" />
|
||||
<glyph unicode="–" glyph-name="endash" horiz-adv-x="381" d="M70 171V233H311V171H70Z" />
|
||||
<glyph unicode="—" glyph-name="emdash" horiz-adv-x="622" d="M70 171V233H552V171H70Z" />
|
||||
<glyph unicode="‘" glyph-name="quoteleft" horiz-adv-x="229" d="M123 547Q168 547 168 502V501V500Q168 478 155 465T120 451Q70 451 70 514V619L101 631V547H123Z" />
|
||||
<glyph unicode="’" glyph-name="quoteright" horiz-adv-x="229" d="M106 543Q61 543 61 588Q61 589 61 590Q61 612 74 625T109 639Q159 639 159 576V471L128 459V543H106Z" />
|
||||
<glyph unicode="‚" glyph-name="quotesinglbase" horiz-adv-x="229" d="M106 -1Q61 -1 61 44Q61 45 61 46Q61 67 74 81T109 95Q159 95 159 32V-73L128 -85V-1H106Z" />
|
||||
<glyph unicode="“" glyph-name="quotedblleft" horiz-adv-x="358" d="M123 547Q168 547 168 502V501V500Q168 478 155 465T120 451Q70 451 70 514V619L101 631V547H123ZM252 547Q297 547 297 502V501V500Q297 478 284 465T249 451Q199 451 199 514V619L230
|
||||
631V547H252Z" />
|
||||
<glyph unicode="”" glyph-name="quotedblright" horiz-adv-x="359" d="M106 543Q61 543 61 588Q61 589 61 590Q61 612 74 625T109 639Q159 639 159 576V471L128 459V543H106ZM236 543Q191 543 191 588Q191 589 191 590Q191 612 204 625T239 639Q289 639
|
||||
289 576V471L258 459V543H236Z" />
|
||||
<glyph unicode="„" glyph-name="quotedblbase" horiz-adv-x="359" d="M106 0Q61 0 61 45V47Q61 68 74 82T109 96Q159 96 159 33V-72L128 -84V0H106ZM236 0Q191 0 191 45V47Q191 68 204 82T239 96Q289 96 289 33V-72L258 -84V0H236Z" />
|
||||
<glyph unicode="•" glyph-name="bullet" horiz-adv-x="287" d="M144 150Q70 150 70 225Q70 300 144 300Q217 300 217 225Q217 150 144 150Z" />
|
||||
<glyph unicode="‹" glyph-name="guilsinglleft" horiz-adv-x="300" d="M260 18Q201 32 143 90T50 230Q85 311 143 369T260 442V382Q166 336 118 230Q167 123 260 77V18Z" />
|
||||
<glyph unicode="›" glyph-name="guilsinglright" horiz-adv-x="300" d="M40 18V77Q134 124 182 230Q134 335 40 382V442Q99 427 157 369T250 230Q215 149 157 91T40 18Z" />
|
||||
</font>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 49 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1,121 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
|
||||
<record id="property_form_view_khawald" model="ir.ui.view">
|
||||
<field name="name">Property Khawald</field>
|
||||
<field name="model">internal.property</field>
|
||||
<field name="inherit_id" ref="real_estate.property_form_view"/>
|
||||
<field name="arch" type="xml">
|
||||
|
||||
<xpath expr="//field[@name='name']" position="attributes">
|
||||
<attribute name="attrs">{'readonly':[('project_id','!=',False)]}</attribute>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//group[@name='p_info']" position="before">
|
||||
<group>
|
||||
<group>
|
||||
<field name="project_id" readonly="1"/>
|
||||
<field name="marketer_id" attrs="{'readonly':[('state','!=','draft'),('unlock','=',True)]}"
|
||||
required="1"/>
|
||||
<field name="action_type" required="1"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="market_type" required="1"
|
||||
attrs="{'readonly':[('state','!=','draft'),('unlock','=',True)]}"/>
|
||||
<field name="property_type_id" domain="[('market_type', '=', market_type)]" required="1"
|
||||
attrs="{'readonly':[('state','!=','draft'),('unlock','=',True)]}"/>
|
||||
<field name="floors_count" readonly="1"/>
|
||||
<field name="no_units" readonly="1"/>
|
||||
|
||||
</group>
|
||||
</group>
|
||||
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//group[@name='p_info']" position="replace"/>
|
||||
|
||||
<xpath expr="//field[@name='branch_manager_id']" position="attributes">
|
||||
<attribute name="invisible">1</attribute>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//page[@name='regis_info']" position="replace"/>
|
||||
<xpath expr="//page[@name='location_info']/group/group[2]" position="attributes">
|
||||
<attribute name="invisible">1</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//page[@name='location_info']/group/group[3]" position="attributes">
|
||||
<attribute name="invisible">1</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//page[@name='other']" position="replace"/>
|
||||
<xpath expr="//field[@name='unit_ids']" position="attributes">
|
||||
<attribute name="invisible">1</attribute>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//field[@name='property_space']" position="after">
|
||||
<field name="advantage_price" readonly="1"/>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//field[@name='meter_price']" position="after">
|
||||
<field name="total_price" readonly="1"/>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//notebook/page[@name='prices']" position="before">
|
||||
<page name="advantage_unit" string="Advantage and Unit">
|
||||
<label for="advantage_ids" string="Advantages"/>
|
||||
<field name="advantage_ids" options="{'no_create': True, 'no_quick_create': True}">
|
||||
<tree>
|
||||
<field name="name"/>
|
||||
<field name="price" options="{'currency_field': 'company_currency_id'}"
|
||||
readonly="1"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//notebook/page[@name='prices']" position="after">
|
||||
<page name="service" string="Services">
|
||||
<group>
|
||||
<group>
|
||||
<field name="electric_service"
|
||||
attrs="{'readonly':[('state','!=','draft'),('unlock','=',True)]}"/>
|
||||
<field name="water_service"
|
||||
attrs="{'readonly':[('state','!=','draft'),('unlock','=',True)]}"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="stamp_service"
|
||||
attrs="{'readonly':[('state','!=','draft'),('unlock','=',True)]}"/>
|
||||
<field name="building_service"
|
||||
attrs="{'readonly':[('state','!=','draft'),('unlock','=',True)]}"/>
|
||||
</group>
|
||||
</group>
|
||||
</page>
|
||||
<page name="stamping_info" string="Stamping">
|
||||
<group>
|
||||
<group>
|
||||
<field name="stamping" required="1" attrs="{'readonly':[('state','!=','draft'),('unlock','=',True)]}"/>
|
||||
<field name="stamping_date" required="1" attrs="{'readonly':[('state','!=','draft'),('unlock','=',True)]}"/>
|
||||
<field name="stamping_attach" attrs="{'readonly':[('state','!=','draft'),('unlock','=',True)]}"/>
|
||||
</group>
|
||||
</group>
|
||||
</page>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//field[@name='pur_price']" position="replace"/>
|
||||
<xpath expr="//field[@name='rent_price']" position="replace"/>
|
||||
<xpath expr="//field[@name='pur_meter_price']" position="replace"/>
|
||||
<xpath expr="//field[@name='curr_price']" position="replace"/>
|
||||
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="property_list_view" model="ir.ui.view">
|
||||
<field name="name">Property List</field>
|
||||
<field name="model">internal.property</field>
|
||||
<field name="inherit_id" ref="real_estate.property_list_view"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='property_state_id']" position="attributes">
|
||||
<attribute name="invisible">1</attribute>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,434 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
|
||||
<!-- Project State -->
|
||||
<record id="khawald_project_state_form_view" model="ir.ui.view">
|
||||
<field name="name">Project State</field>
|
||||
<field name="model">project.state</field>
|
||||
<field name="arch" type="xml">
|
||||
<form>
|
||||
<sheet>
|
||||
<group col="2">
|
||||
<field name="name" required="1"/>
|
||||
<field name="parent_id" domain="[('id', '!=', active_id)]"
|
||||
options="{'no_create': True, 'no_quick_create': True}"/>
|
||||
<field name="dependency_id" domain="[('id', 'not in', [parent_id, active_id])]"
|
||||
options="{'no_create': True, 'no_quick_create': True}"/>
|
||||
<field name="project_type_ids" required="1" widget="many2many_tags"
|
||||
options="{'color_field': 'color'}" context="{'project_type_ids': project_type_ids}"/>
|
||||
<field name="default"/>
|
||||
<field name="total_tasks"/>
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="Tasks">
|
||||
<field name="project_task_ids">
|
||||
<tree editable="bottom">
|
||||
<field name="name"/>
|
||||
<field name="description"/>
|
||||
<field name="tasks_time"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="khawald_project_state_tree_view" model="ir.ui.view">
|
||||
<field name="name">Project State</field>
|
||||
<field name="model">project.state</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree>
|
||||
<field name="parent_id"/>
|
||||
<field name="name" string="Predecessors"/>
|
||||
<field name="dependency_id"/>
|
||||
<field name="project_type_ids" widget="many2many_tags"/>
|
||||
<field name="total_tasks"/>
|
||||
<field name="default"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="view_project_state_kanban">
|
||||
<field name="name">project.state.kanban</field>
|
||||
<field name="model">project.state</field>
|
||||
<field name="arch" type="xml">
|
||||
<kanban class="oe_background_grey o_kanban_dashboard o_project_kanban o_emphasize_colors" sample="1">
|
||||
<field name="name"/>
|
||||
<field name="parent_id"/>
|
||||
<field name="dependency_id"/>
|
||||
<field name="project_type_ids"/>
|
||||
<field name="total_tasks"/>
|
||||
<field name="default"/>
|
||||
<field name="rating_active"/>
|
||||
<field name="rating_percentage_satisfaction"/>
|
||||
<field name="is_favorite"/>
|
||||
<field name="color"/>
|
||||
<templates>
|
||||
<t t-name="kanban-box">
|
||||
<div t-attf-class="#{kanban_color(record.color.raw_value)} oe_kanban_global_click o_has_icon">
|
||||
<div class="o_project_kanban_main">
|
||||
<div class="o_kanban_card_content">
|
||||
<div class="o_kanban_primary_left">
|
||||
<div class="o_primary">
|
||||
<span>
|
||||
<t t-esc="record.name.value"/>
|
||||
</span>
|
||||
<span t-if="record.parent_id.value">
|
||||
<strong>
|
||||
<t t-esc="record.parent_id.value"/>
|
||||
</strong>
|
||||
<strong>
|
||||
<t t-esc="record.name.value"/>
|
||||
</strong>
|
||||
<strong>
|
||||
<t t-esc="record.dependency_id.value"/>
|
||||
</strong>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div t-if="record.rating_active.raw_value" class="mt8 text-primary"
|
||||
title="Percentage of happy ratings over the past 30 days."
|
||||
groups="project.group_project_rating">
|
||||
<b>
|
||||
<a name="action_view_all_rating" type="object"
|
||||
context="{'search_default_rating_last_30_days':1}">
|
||||
<t t-if="record.rating_percentage_satisfaction.value != -1">
|
||||
<i class="fa fa-smile-o" role="img"
|
||||
aria-label="Percentage of satisfaction"
|
||||
title="Percentage of satisfaction"/>
|
||||
<t t-esc="record.rating_percentage_satisfaction.value"/>%
|
||||
</t>
|
||||
</a>
|
||||
</b>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="o_kanban_card_manage_pane dropdown-menu"
|
||||
groups="project.group_project_manager" role="menu">
|
||||
<div class="o_kanban_card_manage_section o_kanban_manage_reports">
|
||||
|
||||
<div role="menuitem">
|
||||
<a type="edit">Edit</a>
|
||||
</div>
|
||||
</div>
|
||||
<div role="menuitem" aria-haspopup="true" class="o_no_padding_kanban_colorpicker">
|
||||
<ul class="oe_kanban_colorpicker" data-field="color" role="popup"/>
|
||||
</div>
|
||||
</div>
|
||||
<a class="o_kanban_manage_toggle_button o_left" href="#"
|
||||
groups="project.group_project_manager">
|
||||
<i class="fa fa-ellipsis-v" role="img" aria-label="Manage" title="Manage"/>
|
||||
</a>
|
||||
<span class="o_right">
|
||||
<field name="is_favorite" widget="boolean_favorite" nolabel="1"/>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="o_project_kanban_boxes">
|
||||
<a class="o_project_kanban_box" name="action_view_tasks" type="object">
|
||||
<div>
|
||||
<span class="o_value">
|
||||
<t t-esc="record.total_tasks.value"/>
|
||||
</span>
|
||||
<span class="o_label">Tasks:</span>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</templates>
|
||||
</kanban>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="khawald_project_state_search_view" model="ir.ui.view">
|
||||
<field name="name">project.state.search</field>
|
||||
<field name="model">project.state</field>
|
||||
<field name="arch" type="xml">
|
||||
<search>
|
||||
<field name="parent_id"/>
|
||||
<field name="name"/>
|
||||
<field name="dependency_id"/>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="khawald_project_state_action" model="ir.actions.act_window">
|
||||
<field name="name">Project State</field>
|
||||
<field name="res_model">project.state</field>
|
||||
<field name="view_mode">kanban,tree,form</field>
|
||||
<field name="view_id" ref="view_project_state_kanban"/>
|
||||
<field name="search_view_id" ref="khawald_project_state_search_view"/>
|
||||
</record>
|
||||
|
||||
<menuitem name="Project State" id="project_state_menu" parent="project.menu_project_config"
|
||||
action="khawald_project_state_action" sequence="9"/>
|
||||
|
||||
|
||||
<!-- Khawald Project Task -->
|
||||
<record id="khawald_project_task_custom_form_view" model="ir.ui.view">
|
||||
<field name="name">Project Task</field>
|
||||
<field name="model">khawald.project.task</field>
|
||||
<field name="arch" type="xml">
|
||||
<form>
|
||||
<sheet>
|
||||
<group>
|
||||
<group>
|
||||
<field name="name" required="1"/>
|
||||
<field name="tasks_time" required="1"/>
|
||||
|
||||
</group>
|
||||
<group>
|
||||
<field name="description"/>
|
||||
<field name="parent_id"/>
|
||||
</group>
|
||||
</group>
|
||||
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="khawald_project_task_custom_tree_view" model="ir.ui.view">
|
||||
<field name="name">Project Task list</field>
|
||||
<field name="model">khawald.project.task</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree>
|
||||
<field name="name"/>
|
||||
<field name="tasks_time"/>
|
||||
<field name="description"/>
|
||||
<field name="parent_id"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="view_khawald_task_kanban">
|
||||
<field name="name">khawald.project.task.kanban</field>
|
||||
<field name="model">khawald.project.task</field>
|
||||
<field name="arch" type="xml">
|
||||
<kanban class="o_kanban_small_column o_kanban_project_tasks"
|
||||
|
||||
js_class="project_kanban" sample="1">
|
||||
<field name="name"/>
|
||||
<field name="tasks_time"/>
|
||||
<field name="description"/>
|
||||
<field name="parent_id"/>
|
||||
<templates>
|
||||
<t t-name="kanban-box">
|
||||
<div t-attf-class=" oe_kanban_global_click o_has_icon">
|
||||
<div class="oe_kanban_content">
|
||||
<div class="o_kanban_record_top">
|
||||
<div class="o_kanban_record_headings">
|
||||
<strong class="o_kanban_record_title">
|
||||
<field name="name"/>
|
||||
</strong>
|
||||
<span>
|
||||
<br/>
|
||||
|
||||
</span>
|
||||
<br/>
|
||||
<span>
|
||||
<field name="name"/>
|
||||
<field name="description"/>
|
||||
<field name="parent_id"/>
|
||||
|
||||
</span>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
<div class="oe_clear"></div>
|
||||
</div>
|
||||
</t>
|
||||
</templates>
|
||||
</kanban>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="khawald_project_task_custom_search_view" model="ir.ui.view">
|
||||
<field name="name">khawald.project.task.search</field>
|
||||
<field name="model">khawald.project.task</field>
|
||||
<field name="arch" type="xml">
|
||||
<search>
|
||||
<field name="name"/>
|
||||
<field name="tasks_time"/>
|
||||
<field name="description"/>
|
||||
<field name="parent_id"/>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="khawald_project_task_custom_action" model="ir.actions.act_window">
|
||||
<field name="name">Project Task</field>
|
||||
<field name="res_model">khawald.project.task</field>
|
||||
<field name="view_mode">kanban,tree,form</field>
|
||||
<field name="view_id" ref="view_khawald_task_kanban"/>
|
||||
<field name="search_view_id" ref="khawald_project_task_custom_search_view"/>
|
||||
</record>
|
||||
|
||||
<menuitem name="Project Task" id="khawald_project_task_custom_menu" parent="project.menu_project_config"
|
||||
action="khawald_project_task_custom_action" sequence="9"/>
|
||||
|
||||
<!-- Project Type -->
|
||||
<record id="khawald_project_type_form_view" model="ir.ui.view">
|
||||
<field name="name">Project Type</field>
|
||||
<field name="model">project.type</field>
|
||||
<field name="arch" type="xml">
|
||||
<form>
|
||||
<sheet>
|
||||
<group col="2">
|
||||
<field name="name" required="1"/>
|
||||
<field name="color" widget="color_picker"/>
|
||||
</group>
|
||||
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="khawald_project_type_tree_view" model="ir.ui.view">
|
||||
<field name="name">Project Type</field>
|
||||
<field name="model">project.type</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree>
|
||||
<field name="name" required="1"/>
|
||||
<field name="color" widget="color_picker"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="khawald_project_type_search_view" model="ir.ui.view">
|
||||
<field name="name">project.type.search</field>
|
||||
<field name="model">project.type</field>
|
||||
<field name="arch" type="xml">
|
||||
<search>
|
||||
<field name="name"/>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="khawald_project_type_action" model="ir.actions.act_window">
|
||||
<field name="name">Project Type</field>
|
||||
<field name="res_model">project.type</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="view_id" ref="khawald_project_type_tree_view"/>
|
||||
<field name="search_view_id" ref="khawald_project_type_search_view"/>
|
||||
</record>
|
||||
|
||||
|
||||
<menuitem name="Project Type" id="project_type_menu" parent="project.menu_project_config"
|
||||
action="khawald_project_type_action" sequence="9"/>
|
||||
|
||||
|
||||
<!-- Project Advantage -->
|
||||
<record id="khawald_project_advantage_form_view" model="ir.ui.view">
|
||||
<field name="name">Project Advantage</field>
|
||||
<field name="model">project.advantage</field>
|
||||
<field name="arch" type="xml">
|
||||
<form>
|
||||
<sheet>
|
||||
<group col="2">
|
||||
<field name="name" required="1"/>
|
||||
<field name="price" class="oe_inline" widget='monetary'
|
||||
options="{'currency_field': 'company_currency_id'}"/>
|
||||
<field name="company_currency_id" invisible="1"/>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="khawald_project_advantage_tree_view" model="ir.ui.view">
|
||||
<field name="name">Project Advantage List</field>
|
||||
<field name="model">project.advantage</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree>
|
||||
<field name="name" required="1"/>
|
||||
<field name="price" widget='monetary'
|
||||
options="{'currency_field': 'company_currency_id'}"/>
|
||||
<field name="company_currency_id" invisible="1"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="khawald_project_advantage_search_view" model="ir.ui.view">
|
||||
<field name="name">Project Advantage Search</field>
|
||||
<field name="model">project.advantage</field>
|
||||
<field name="arch" type="xml">
|
||||
<search>
|
||||
<field name="name"/>
|
||||
<field name="price"/>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="khawald_project_advantage_action" model="ir.actions.act_window">
|
||||
<field name="name">Project Advantage</field>
|
||||
<field name="res_model">project.advantage</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="view_id" ref="khawald_project_advantage_tree_view"/>
|
||||
<field name="search_view_id" ref="khawald_project_advantage_search_view"/>
|
||||
</record>
|
||||
|
||||
|
||||
<menuitem name="Project Advantage" id="project_advantage_menu" parent="project.menu_project_config"
|
||||
action="khawald_project_advantage_action" sequence="9"/>
|
||||
|
||||
|
||||
<!-- Project Expense -->
|
||||
<record id="khawald_project_expense_form_view" model="ir.ui.view">
|
||||
<field name="name">Project Expense</field>
|
||||
<field name="model">project.expense.conf</field>
|
||||
<field name="arch" type="xml">
|
||||
<form>
|
||||
<sheet>
|
||||
<group col="2">
|
||||
<field name="name" required="1"/>
|
||||
</group>
|
||||
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="khawald_project_expense_tree_view" model="ir.ui.view">
|
||||
<field name="name">Project Expense</field>
|
||||
<field name="model">project.expense.conf</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree>
|
||||
<field name="name" required="1"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="khawald_project_expense_search_view" model="ir.ui.view">
|
||||
<field name="name">project.expense.conf.search</field>
|
||||
<field name="model">project.expense.conf</field>
|
||||
<field name="arch" type="xml">
|
||||
<search>
|
||||
<field name="name"/>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="khawald_project_expense_action" model="ir.actions.act_window">
|
||||
<field name="name">Project Expense</field>
|
||||
<field name="res_model">project.expense.conf</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="view_id" ref="khawald_project_expense_tree_view"/>
|
||||
<field name="search_view_id" ref="khawald_project_expense_search_view"/>
|
||||
</record>
|
||||
|
||||
|
||||
<menuitem name="Project Expense" id="project_expense_menu" parent="project.menu_project_config"
|
||||
action="khawald_project_expense_action" sequence="9"/>
|
||||
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,233 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<data>
|
||||
<record id="khawald_edit_project_customs" model="ir.ui.view">
|
||||
<field name="name">Project</field>
|
||||
<field name="model">project.project</field>
|
||||
<field name="inherit_id" ref="project_management_custom.edit_project_customs"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//button[@name='get_engineering_payment']" position="after">
|
||||
<button class="oe_stat_button" name="get_supplier_payment" type="object" icon="fa-money">
|
||||
<field string="Supplier Payments" name="suppl_payment_amount"/>
|
||||
</button>
|
||||
|
||||
<button class="oe_stat_button" name="get_unit" type="object" icon="fa-home">
|
||||
<field string="Units" name="unit_counts" widget="statinfo"/>
|
||||
</button>
|
||||
</xpath>
|
||||
<xpath expr="//button[@name='action_done']" position="before">
|
||||
<button name="action_selling" type="object" string="Start Sale" states="in_progess"
|
||||
groups="project.group_project_manager"
|
||||
class="oe_highlight"/>
|
||||
</xpath>
|
||||
<xpath expr="//button[@name='action_done']" position="attributes">
|
||||
<attribute name="states">sale</attribute>
|
||||
<attribute name="groups">project.group_project_manager</attribute>
|
||||
|
||||
|
||||
</xpath>
|
||||
|
||||
|
||||
<xpath expr="//group[@name='project_info']" position="replace">
|
||||
<group col="4" colspan="2">
|
||||
<field name="project_type_id" context="{'project_type_id': project_type_id}"
|
||||
options="{'no_create': True, 'no_quick_create': True}" required="1"/>
|
||||
<field name="space" required="1"/>
|
||||
<!-- <field name="project_status_id" required="1"/> -->
|
||||
|
||||
<field name="project_face_ids" required="1" widget="many2many_tags"/>
|
||||
<field name="building_factor"/>
|
||||
|
||||
<field name="basement" widget="radio" required="1"/>
|
||||
<field name="sale_space"/>
|
||||
|
||||
<field name="owner_id" options="{'no_create': True, 'no_quick_create': True}" required="1"/>
|
||||
<field name="agent_id" options="{'no_create': True, 'no_quick_create': True}" />
|
||||
|
||||
<field name="user_id" options="{'no_create': True, 'no_quick_create': True}" required="1"/>
|
||||
<field name="building_license" required="1"/>
|
||||
|
||||
<field name="engineer_id" options="{'no_create': True, 'no_quick_create': True}"/>
|
||||
<field name="building_certificate" required="1"/>
|
||||
|
||||
<field name="supervisor_id" options="{'no_create': True, 'no_quick_create': True}"/>
|
||||
<field name="insurance_policy" required="1"/>
|
||||
|
||||
<field name="stamping" required="1"/>
|
||||
<field name="stamping_date" required="1"/>
|
||||
<field name="stamping_attach" />
|
||||
|
||||
|
||||
</group>
|
||||
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//page[@name='team']" position="replace"/>
|
||||
|
||||
<xpath expr="//page[@name='info']" position="after">
|
||||
<page name="unit_info" string="Unit Information">
|
||||
<group>
|
||||
<group>
|
||||
<field name="building_count" attrs="{'readonly':[('created', '=', True)]}"/>
|
||||
<field name="floor_count" attrs="{'readonly':[('created', '=', True)]}"/>
|
||||
<field name="unit_count" attrs="{'readonly':[('created', '=', True)]}"/>
|
||||
<field name="unit_space" attrs="{'readonly':[('created', '=', True)]}"/>
|
||||
<field name="total_unit" readonly="1"/>
|
||||
</group>
|
||||
|
||||
<group>
|
||||
<field name="room_no" attrs="{'readonly':[('created', '=', True)]}"/>
|
||||
<field name="bathroom_no" attrs="{'readonly':[('created', '=', True)]}"/>
|
||||
<field name="hall_no" attrs="{'readonly':[('created', '=', True)]}" />
|
||||
<field name="kitchen_no" attrs="{'readonly':[('created', '=', True)]}" />
|
||||
</group>
|
||||
|
||||
<group></group>
|
||||
<field name="created" invisible="1"/>
|
||||
<button attrs="{'invisible':[('created', '=', True)]}" name="create_unit_building"
|
||||
type="object" string="Create Building and unit" class="oe_highlight"/>
|
||||
</group>
|
||||
<label for="advantage_ids" string="Advantages"/>
|
||||
<div>
|
||||
<field name="advantage_ids" options="{'no_create': True, 'no_quick_create': True}">
|
||||
<tree>
|
||||
<field name="name"/>
|
||||
<field name="price" options="{'currency_field': 'company_currency_id'}"
|
||||
readonly="1"/>
|
||||
</tree>
|
||||
</field>
|
||||
</div>
|
||||
</page>
|
||||
<page name="project_state" string="Project State & Tasks">
|
||||
<label for="project_state_ids"/>
|
||||
<div>
|
||||
<field name="project_state_ids" force_save="true" >
|
||||
<tree>
|
||||
<field name="parent_id"/>
|
||||
<field name="name"/>
|
||||
<field name="dependency_id"/>
|
||||
<field name="total_tasks"/>
|
||||
</tree>
|
||||
</field>
|
||||
</div>
|
||||
<label for="project_task_ids"/>
|
||||
<div>
|
||||
<field name="project_task_ids" force_save="true"
|
||||
attrs="{'readonly': [('state', '!=', 'draft')]}"/>
|
||||
</div>
|
||||
</page>
|
||||
<page name="project_insurance" string="Project Insurance">
|
||||
<field name="project_insurance_ids">
|
||||
<tree editable="bottom">
|
||||
<field name="partner_id" required="1"/>
|
||||
<field name="project_insur_line_id" required="1"/>
|
||||
<field name="duration" required="1"/>
|
||||
<field name="duration_kind"/>
|
||||
<field name="date_from"/>
|
||||
<field name="date_to"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
|
||||
<page name="land_info" string="Land Info">
|
||||
<group>
|
||||
<group>
|
||||
<field name="stamp" attrs="{'readonly': [('state', '!=', 'draft')]}" required="1"/>
|
||||
<field name="land_state_id" attrs="{'readonly': [('state', '!=', 'draft')]}"/>
|
||||
<field name="land_space" attrs="{'readonly': [('state', '!=', 'draft')]}"/>
|
||||
<field name="invoice_ref" attrs="{'readonly': [('state', '!=', 'draft')]}"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="city" attrs="{'readonly': [('state', '!=', 'draft')]}"
|
||||
options="{'no_create': True, 'no_quick_create': True}" required="1"/>
|
||||
<field name="district" domain="[('city_id', '=', city)]"
|
||||
attrs="{'readonly': [('state', '!=', 'draft')]}"
|
||||
options="{'no_create': True, 'no_quick_create': True}" required="1"/>
|
||||
<field name="street" attrs="{'readonly': [('state', '!=', 'draft')]}"/>
|
||||
|
||||
<label for="location_x" string="Location"/>
|
||||
<div>
|
||||
<field name="location_x" attrs="{'readonly': [('state', '!=', 'draft')]}" class="oe_inline"/>|
|
||||
<field name="location_y" attrs="{'readonly': [('state', '!=', 'draft')]}" class="oe_inline"/>
|
||||
</div>
|
||||
</group>
|
||||
|
||||
</group>
|
||||
</page>
|
||||
|
||||
<page name="s_payments" string="Supplier Payments">
|
||||
<field name="project_expense_ids" attrs="{'readonly': [('state', '!=', 'draft')]}">
|
||||
<tree editable="bottom">
|
||||
<field name="name" required="1" attrs="{'readonly':[('invoice_id', '!=', False)]}"/>
|
||||
<field name="partner_id" required="1" attrs="{'readonly':[('invoice_id', '!=', False)]}"/>
|
||||
<field name="date" required="1" attrs="{'readonly':[('invoice_id', '!=', False)]}"/>
|
||||
<field name="amount" required="1" attrs="{'readonly':[('invoice_id', '!=', False)]}"/>
|
||||
<field name="paid" readonly="1"/>
|
||||
<field name="invoice_id" attrs="{'invisible':[('invoice_id', '=', False)]}" readonly="1"/>
|
||||
<button name="create_invoice" attrs="{'invisible':[('invoice_id', '!=', False)]}" string="Create invoice" type="object"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//page[@name='project_account_config']" position="before">
|
||||
<page name="e_payments" string="Payment Expense">
|
||||
<group class="oe_subtotal_footer oe_left">
|
||||
<field name="suppl_payment_amount" string="Supplier Payments"/>
|
||||
<field name="engineer_payment_amount" />
|
||||
<field name="subcontractor_payment_amount" />
|
||||
<field name="total_payment" string="Total Payments" class="oe_subtotal_footer_separator" />
|
||||
</group>
|
||||
</page>
|
||||
</xpath>
|
||||
|
||||
|
||||
<xpath expr="//page[@name='phase']" position="replace"/>
|
||||
|
||||
<xpath expr="//page[@name='Task']" position="replace"/>
|
||||
|
||||
<xpath expr="//page[@name='quantity']" position="replace"/>
|
||||
|
||||
<xpath expr="//page[@name='info']/group/group[2]/field[@name='date_start']" position="before">
|
||||
<field name="resource_calendar_id" attrs="{'readonly': [('state', '!=', 'draft')]}" required="1"/>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//field[@name='date_end']" position="after">
|
||||
<field name="total_days" readonly="1"/>
|
||||
</xpath>
|
||||
|
||||
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="project.action_view_all_task" model="ir.actions.act_window">
|
||||
<field name="view_mode">kanban,tree,form,calendar,pivot,graph,activity,map,dhx_gantt</field>
|
||||
</record>
|
||||
|
||||
<record id="project.act_project_project_2_project_task_all" model="ir.actions.act_window">
|
||||
<field name="view_mode">kanban,tree,form,calendar,pivot,graph,activity,map,dhx_gantt</field>
|
||||
</record>
|
||||
|
||||
<record id="project_expense_tree_view" model="ir.ui.view">
|
||||
<field name="name">Project Expense</field>
|
||||
<field name="model">project.expense</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree>
|
||||
<field name="name"/>
|
||||
<field name="partner_id" />
|
||||
<field name="date"/>
|
||||
<field name="amount" />
|
||||
<field name="paid"/>
|
||||
<field name="invoice_id"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<delete id="project_management_custom.project_estimated_quantities" model="ir.ui.menu"/>
|
||||
<delete id="project_management_custom.project_estimated_quantities_menu" model="ir.ui.menu"/>
|
||||
<delete id="project_management_custom.work_item_menu" model="ir.ui.menu"/>
|
||||
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
|
||||
<record id="view_khawald_task_form2__custom" model="ir.ui.view">
|
||||
<field name="name">khawald.project.task.custom</field>
|
||||
<field name="model">project.task</field>
|
||||
<field name="inherit_id" ref="project.view_task_form2"/>
|
||||
<field name="arch" type="xml">
|
||||
|
||||
<xpath expr="//field[@name='project_id']" position="after">
|
||||
<field name="days" required="1"/>
|
||||
<field name="completion_rate" />
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='project_id']" position="after">
|
||||
<field name="project_type_id" readonly="1" attrs="{'invisible':[('project_type_id','=',False)]}"/>
|
||||
<field name="project_task_id" readonly="1" attrs="{'invisible':[('project_task_id','=',False)]}"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,78 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<record id="unit_form_view_khawald" model="ir.ui.view">
|
||||
<field name="name">Unit Khawald</field>
|
||||
<field name="model">re.unit</field>
|
||||
<field name="inherit_id" ref="real_estate.unit_form_view"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='name']" position="attributes">
|
||||
<attribute name="attrs">{'readonly':[('project_id','!=',False)]}</attribute>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//field[@name='seq']" position="attributes">
|
||||
<attribute name="required">0</attribute>
|
||||
<attribute name="invisible">1</attribute>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//field[@name='unit_type_id']" position="before">
|
||||
<field name="project_id" readonly="1"/>
|
||||
</xpath>
|
||||
|
||||
<!-- <xpath expr="//field[@name='action_type']" position="attributes">
|
||||
<attribute name="invisible">1</attribute>
|
||||
</xpath> -->
|
||||
|
||||
<xpath expr="//field[@name='mezzanine']" position="attributes">
|
||||
<attribute name="invisible">1</attribute>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//field[@name='management_type']" position="attributes">
|
||||
<attribute name="invisible">1</attribute>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//page[@name='unit_price']" position="replace"/>
|
||||
|
||||
|
||||
<xpath expr="//page[@name='prop_info']" position="after">
|
||||
<page name="advantage_price" string="Advantage and Price">
|
||||
<group name="price">
|
||||
<field name="meter_price" attrs="{'readonly':[('state','!=','draft'),('unlock','=',True)]}"
|
||||
required="1"/>
|
||||
<field name="external_price"
|
||||
attrs="{'readonly':[('state','!=','draft'),('unlock','=',True)]}"/>
|
||||
|
||||
<field name="change_price"
|
||||
attrs="{'readonly':[('state','!=','draft'),('unlock','=',True)]}"/>
|
||||
<field name="new_price"
|
||||
attrs="{'readonly':[('state','!=','draft'),('unlock','=',True)], 'invisible':[('change_price', '=', False)]}"/>
|
||||
<field name="rent_price" readonly="1"/>
|
||||
</group>
|
||||
<label for="advantage_ids" string="Advantages"/>
|
||||
<div>
|
||||
<field name="advantage_ids" options="{'no_create': True, 'no_quick_create': True}">
|
||||
<tree>
|
||||
<field name="name"/>
|
||||
<field name="price" options="{'currency_field': 'company_currency_id'}"
|
||||
readonly="1"/>
|
||||
</tree>
|
||||
</field>
|
||||
</div>
|
||||
|
||||
</page>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="project_unit_filter_view" model="ir.ui.view">
|
||||
<field name="name">Unit Filter</field>
|
||||
<field name="model">re.unit</field>
|
||||
<field name="inherit_id" ref="real_estate.unit_filter_view"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='space']" position="after">
|
||||
<field name="rent_price"/>
|
||||
<field name="advantage_ids"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,106 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
|
||||
<record id="resource_calendar_form" model="ir.ui.view">
|
||||
<field name="name">resource.calendar.form</field>
|
||||
<field name="model">resource.calendar</field>
|
||||
<field name="inherit_id" ref="resource.resource_calendar_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//button[@name='%(resource.resource_resource_action_from_calendar)d']" position="attributes">
|
||||
<attribute name="invisible">1</attribute>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//button[@name='switch_calendar_type']" position="attributes">
|
||||
<attribute name="invisible">1</attribute>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//field[@name='global_leave_ids']/tree/field[@name='name']" position="attributes">
|
||||
<attribute name="required">1</attribute>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//field[@name='global_leave_ids']/tree/field[@name='date_from']" position="attributes">
|
||||
<attribute name="widget">date</attribute>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//field[@name='global_leave_ids']/tree/field[@name='date_to']" position="attributes">
|
||||
<attribute name="widget">date</attribute>
|
||||
</xpath>
|
||||
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="view_resource_calendar_attendance_tree" model="ir.ui.view">
|
||||
<field name="name">resource.calendar.attendance.tree</field>
|
||||
<field name="model">resource.calendar.attendance</field>
|
||||
<field name="inherit_id" ref="resource.view_resource_calendar_attendance_tree"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='day_period']" position="attributes">
|
||||
<attribute name="invisible">1</attribute>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//field[@name='week_type']" position="attributes">
|
||||
<attribute name="invisible">1</attribute>
|
||||
</xpath>
|
||||
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="resource_calendar_leave_tree" model="ir.ui.view">
|
||||
<field name="name">resource.calendar.leaves.tree</field>
|
||||
<field name="model">resource.calendar.leaves</field>
|
||||
<field name="inherit_id" ref="resource.resource_calendar_leave_tree"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='calendar_id']" position="attributes">
|
||||
<attribute name="invisible">1</attribute>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//field[@name='resource_id']" position="attributes">
|
||||
<attribute name="invisible">1</attribute>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//field[@name='date_from']" position="attributes">
|
||||
<attribute name="widget">date</attribute>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//field[@name='date_to']" position="attributes">
|
||||
<attribute name="widget">date</attribute>
|
||||
</xpath>
|
||||
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="resource_calendar_leave_form" model="ir.ui.view">
|
||||
<field name="name">resource.calendar.leaves.form</field>
|
||||
<field name="model">resource.calendar.leaves</field>
|
||||
<field name="inherit_id" ref="resource.resource_calendar_leave_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='name']" position="attributes">
|
||||
<attribute name="required">1</attribute>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//field[@name='calendar_id']" position="attributes">
|
||||
<attribute name="invisible">1</attribute>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//field[@name='resource_id']" position="attributes">
|
||||
<attribute name="invisible">1</attribute>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//field[@name='date_from']" position="attributes">
|
||||
<attribute name="widget">date</attribute>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//field[@name='date_to']" position="attributes">
|
||||
<attribute name="widget">date</attribute>
|
||||
</xpath>
|
||||
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<menuitem id="project_resource_calendar_menu" parent="project.menu_project_config"
|
||||
action="resource.action_resource_calendar_form" />
|
||||
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from . import models
|
||||
from . import wizard
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
{
|
||||
'name': "Real Estate Marketing - Khawald",
|
||||
'summary': """Real Estate Marketing""",
|
||||
'description': """ """,
|
||||
'author': 'Expert Co. Ltd.',
|
||||
'website': 'http://exp-sa.com',
|
||||
'category': 'Odex25-Realstate/dex25-Realstate',
|
||||
'version': '0.1',
|
||||
'depends': ['real_estate_marketing', 'khawald_project_contract','contract'],
|
||||
'data': [
|
||||
'security/security_groups.xml',
|
||||
'security/ir.model.access.csv',
|
||||
'wizard/return_payment_view.xml',
|
||||
'views/res_partner_view.xml',
|
||||
'views/property_reservation_payment_view.xml',
|
||||
'views/real_estate_view.xml',
|
||||
'views/re_sale_view.xml',
|
||||
'views/client_requirement_view.xml',
|
||||
'views/property_reservation_view.xml',
|
||||
'views/re_unit_view.xml',
|
||||
'data/templates.xml',
|
||||
'data/ir_seq_data.xml',
|
||||
'views/contract_view.xml',
|
||||
|
||||
],
|
||||
'installable': True,
|
||||
'application': False,
|
||||
}
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<data>
|
||||
<record id="sequence_property_reservation" model="ir.sequence">
|
||||
<field name="name">Property Reservation</field>
|
||||
<field name="code">property.reservation</field>
|
||||
<field name="prefix">UN/R/%(year)s/</field>
|
||||
<field name="padding">5</field>
|
||||
<field name="company_id" eval="False"/>
|
||||
<field name="number_increment" eval="1"/>
|
||||
</record>
|
||||
|
||||
<record id="sequence_property_reservation_payment" model="ir.sequence">
|
||||
<field name="name">Property Reservation Payment</field>
|
||||
<field name="code">property.reservation.payment</field>
|
||||
<field name="prefix">pay/</field>
|
||||
<field name="padding">3</field>
|
||||
<field name="company_id" eval="False"/>
|
||||
<field name="number_increment" eval="1"/>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
|
|
@ -0,0 +1,158 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<data>
|
||||
|
||||
<record id="template_sale_request_property" model="mail.template">
|
||||
<field name="name">Property Sale Request</field>
|
||||
<field name="model_id" ref="real_estate_marketing.model_re_sale"/>
|
||||
<field name="subject">شركة الخوالد العقارية - بيع وحدة سكنية</field>
|
||||
<field name="email_to">${object.partner_id.email}</field>
|
||||
<field name="email_cc"></field>
|
||||
<field name="body_html"><![CDATA[
|
||||
<div dir="rtl" class="arabic_header">
|
||||
مرحباً
|
||||
${object.partner_id.name}
|
||||
</div>
|
||||
<div dir="rtl" class="arabic_content">
|
||||
<br/>
|
||||
<br/>قد تم تقييد أمر بيع وحدة سكنية حسب رغبتك وتجد إدناه موعد التسليم:
|
||||
<br/> معلومات أمر البيع:
|
||||
<br/> مرجع أمر البيع: ${object.name}
|
||||
<br/>الوحدة السكنية: ${object.unit_id.name}
|
||||
<br/>تاريخ التسليم للعميل: ${object.handover_to_client_date}
|
||||
<br/>المبلغ: ${object.amount or '-'}
|
||||
<br/>العقد: ${object.contract_id.name_seq or '-'}
|
||||
<br/>
|
||||
<br/>ولمزيد من المعلومات الرجاء الضغط علي الرابط إدناه.
|
||||
<br/>
|
||||
<br/>
|
||||
<br/>
|
||||
<br/>
|
||||
<div style="font-size:13px;font-family:"Lucida Grande", Helvetica, Verdana, Arial, sans-serif;margin-top: 16px;">
|
||||
<a href="www.google.com"
|
||||
style="text-decoration-thickness:auto;text-decoration:none;color:rgb(0, 135, 132);background-color: rgb(135, 90, 123); color: rgb(255, 255, 255); padding: 5px 10px; font-size: 12px; line-height: 18px; display: inline-block; margin-bottom: 0px; text-align: center; vertical-align: middle; cursor: pointer; white-space: nowrap; background-image: none; border: 1px solid rgb(135, 90, 123); border-radius: 3px;"
|
||||
data-original-title="" title="">الرجاء الضغط علي الرابط إدناه
|
||||
</a>
|
||||
</div>
|
||||
<br/>
|
||||
<br/>
|
||||
مع خالص الود والتقدير<br/>
|
||||
شركة الخوالد العقارية - قسم التسويق العقاري<br/>
|
||||
</div>
|
||||
]]>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="template_property_reservation" model="mail.template">
|
||||
<field name="name">Property Reservation</field>
|
||||
<field name="model_id" ref="khawald_real_estate_marketing.model_property_reservation"/>
|
||||
<field name="subject">شركة الخوالد العقارية - حجز وحدة سكنية</field>
|
||||
<field name="email_to">${object.partner_id.email}</field>
|
||||
<field name="email_cc">${object.marketer_user_id.partner_id.email}</field>
|
||||
<field name="body_html"><![CDATA[
|
||||
<div dir="rtl" class="arabic_header">
|
||||
مرحباً
|
||||
${object.partner_id.name}
|
||||
</div>
|
||||
<div dir="rtl" class="arabic_content">
|
||||
<br/>
|
||||
<br/>قد تم حجز وحدة سكنية حسب رغبتك وتجد إدناه معلومات المسوق المسؤول عن الحجز ومعلومات الحجز:
|
||||
<br/>أسم المسوق: ${object.marketer_user_id.partner_id.name}
|
||||
<br/>رقم الجوال: ${object.marketer_user_id.partner_id.mobile}
|
||||
<br/> معلومات الحجز:
|
||||
<br/> مرجع الحجز: ${object.name}
|
||||
<br/>الوحدة السكنية: ${object.unit_id.name}
|
||||
<br/>تاريخ إنتهاء الحجز: ${object.end_date}
|
||||
<br/>نوع الحجز: ${dict(object.fields_get(allfields=['reserve_type'])['reserve_type']['selection'])[object.reserve_type]}
|
||||
<br/>مبلغ العربون: ${object.payment_amount or '-'}
|
||||
<br/>ولمزيد من المعلومات الرجاء الضغط علي الرابط إدناه.
|
||||
<br/>
|
||||
<br/>
|
||||
<br/>
|
||||
<br/>
|
||||
<div style="font-size:13px;font-family:"Lucida Grande", Helvetica, Verdana, Arial, sans-serif;margin-top: 16px;">
|
||||
<a href="www.google.com"
|
||||
style="text-decoration-thickness:auto;text-decoration:none;color:rgb(0, 135, 132);background-color: rgb(135, 90, 123); color: rgb(255, 255, 255); padding: 5px 10px; font-size: 12px; line-height: 18px; display: inline-block; margin-bottom: 0px; text-align: center; vertical-align: middle; cursor: pointer; white-space: nowrap; background-image: none; border: 1px solid rgb(135, 90, 123); border-radius: 3px;"
|
||||
data-original-title="" title="">الرجاء الضغط علي الرابط إدناه
|
||||
</a>
|
||||
</div>
|
||||
<br/>
|
||||
<br/>
|
||||
مع خالص الود والتقدير<br/>
|
||||
شركة الخوالد العقارية - قسم التسويق العقاري<br/>
|
||||
</div>
|
||||
]]>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="template_client_requirement_register" model="mail.template">
|
||||
<field name="name">Register Client Requirement</field>
|
||||
<field name="model_id" ref="real_estate_marketing.model_re_clients_requirement"/>
|
||||
<field name="subject">شركة الخوالد العقارية - طلبك قيد الإجراء</field>
|
||||
<field name="email_to">${object.partner_id.email}</field>
|
||||
<field name="email_cc">${object.marketer_user_id.partner_id.email}</field>
|
||||
<field name="body_html"><![CDATA[
|
||||
<div dir="rtl" class="arabic_header">
|
||||
مرحباً
|
||||
${object.partner_id.name}
|
||||
</div>
|
||||
<div dir="rtl" class="arabic_content">
|
||||
<br/>
|
||||
<br/>طلبك قيد الإجراء ، وتجد إدناه معلومات المسوق المسؤول عن طلبك:
|
||||
<br/>أسم المسوق: ${object.marketer_user_id.partner_id.name}
|
||||
<br/>رقم الجوال: ${object.marketer_user_id.partner_id.mobile}
|
||||
<br/>ولمزيد من المعلومات الرجاء الضغط علي الرابط إدناه.
|
||||
<br/>
|
||||
<br/>
|
||||
<br/>
|
||||
<br/>
|
||||
<div style="font-size:13px;font-family:"Lucida Grande", Helvetica, Verdana, Arial, sans-serif;margin-top: 16px;">
|
||||
<a href="www.google.com"
|
||||
style="text-decoration-thickness:auto;text-decoration:none;color:rgb(0, 135, 132);background-color: rgb(135, 90, 123); color: rgb(255, 255, 255); padding: 5px 10px; font-size: 12px; line-height: 18px; display: inline-block; margin-bottom: 0px; text-align: center; vertical-align: middle; cursor: pointer; white-space: nowrap; background-image: none; border: 1px solid rgb(135, 90, 123); border-radius: 3px;"
|
||||
data-original-title="" title="">الرجاء الضغط علي الرابط إدناه
|
||||
</a>
|
||||
</div>
|
||||
<br/>
|
||||
<br/>
|
||||
مع خالص الود والتقدير<br/>
|
||||
شركة الخوالد العقارية - قسم خدمات العملاء<br/>
|
||||
</div>
|
||||
]]>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="template_client_requirement_closed" model="mail.template">
|
||||
<field name="name">Closed Client Requirement</field>
|
||||
<field name="model_id" ref="real_estate_marketing.model_re_clients_requirement"/>
|
||||
<field name="subject">شركة الخوالد العقارية - تم إغلاق طلبك</field>
|
||||
<field name="email_to">${object.partner_id.email}</field>
|
||||
<field name="email_cc">${object.marketer_user_id.partner_id.email}</field>
|
||||
<field name="body_html"><![CDATA[
|
||||
<div dir="rtl" class="arabic_header">
|
||||
مرحباً
|
||||
${object.partner_id.name}
|
||||
</div>
|
||||
<div dir="rtl" class="arabic_content">
|
||||
<br/>
|
||||
<br/>طلبك تم إغلاقه ، وتجد إدناه معلومات المسوق المسؤول عن طلبك:
|
||||
<br/>أسم المسوق: ${object.marketer_user_id.partner_id.name}
|
||||
<br/>رقم الجوال: ${object.marketer_user_id.partner_id.mobile}
|
||||
<br/>الرجاء الضغط علي الرابط ادناه لتقييم الخدمة.
|
||||
<br/>
|
||||
<br/>
|
||||
<br/>
|
||||
<br/>
|
||||
<div style="font-size:13px;font-family:"Lucida Grande", Helvetica, Verdana, Arial, sans-serif;margin-top: 16px;">
|
||||
<a href="www.google.com"
|
||||
style="text-decoration-thickness:auto;text-decoration:none;color:rgb(0, 135, 132);background-color: rgb(135, 90, 123); color: rgb(255, 255, 255); padding: 5px 10px; font-size: 12px; line-height: 18px; display: inline-block; margin-bottom: 0px; text-align: center; vertical-align: middle; cursor: pointer; white-space: nowrap; background-image: none; border: 1px solid rgb(135, 90, 123); border-radius: 3px;"
|
||||
data-original-title="" title="">الرجاء الضغط علي الرابط إدناه
|
||||
</a>
|
||||
</div>
|
||||
<br/>
|
||||
<br/>
|
||||
<br/>مع خالص الود والتقدير
|
||||
<br/>شركة الخوالد العقارية - قسم خدمات العملاء
|
||||
</div>
|
||||
]]>
|
||||
</field>
|
||||
</record>
|
||||
</data>
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,12 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# This Module Created by Selective Systems Developers
|
||||
#
|
||||
##############################################################################
|
||||
from . import res_partner
|
||||
from . import client_requirement
|
||||
from . import property_reservation
|
||||
from . import real_estate
|
||||
from . import contract
|
||||
from . import re_sale
|
||||
|
|
@ -0,0 +1,68 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
from odoo.exceptions import ValidationError, UserError, Warning
|
||||
from odoo import models, fields, api, exceptions, tools, _
|
||||
from datetime import datetime, date
|
||||
|
||||
|
||||
class ReClientRequirement(models.Model):
|
||||
_inherit = "re.clients.requirement"
|
||||
|
||||
# action_type = fields.Selection([('rent', 'Rent'), ('sale', 'Sale')], string="Action Type", default='sale', readonly="True")
|
||||
client_type = fields.Selection([('serious', 'Serious'), ('possible', 'Possible'), ('not_serious', 'Not serious')], string="How serious is the client?", default='serious')
|
||||
state = fields.Selection([('draft', 'Open Request'),
|
||||
('register', 'Under Process'),
|
||||
('approve', 'Closed'),
|
||||
('cancel', 'Cancel'),
|
||||
], string="Status", default='draft')
|
||||
project_id = fields.Many2one('project.project', string='Project')
|
||||
marketer_user_id = fields.Many2one('res.users', string="Marketer", default=lambda self: self.env.user)
|
||||
|
||||
def action_register(self):
|
||||
for rec in self:
|
||||
if rec.name == '/' or False:
|
||||
rec.name = self.env['ir.sequence'].next_by_code('re.clients.requirement')
|
||||
if rec.client_type != 'not_serious' and rec.client_line_ids:
|
||||
email_template = self.env.ref('khawald_real_estate_marketing.template_client_requirement_register')
|
||||
email_template.with_env(self.env).with_context(active_model=self._name).send_mail(rec.id)
|
||||
rec.write({'state': 'register'})
|
||||
elif rec.client_type != 'not_serious' and not rec.client_line_ids:
|
||||
raise exceptions.ValidationError(_("You must have Search Result"))
|
||||
else:
|
||||
rec.write({'state': 'approve'})
|
||||
|
||||
def action_approve(self):
|
||||
for rec in self:
|
||||
if rec.client_type != 'not_serious':
|
||||
email_template = self.env.ref('khawald_real_estate_marketing.template_client_requirement_closed')
|
||||
email_template.with_env(self.env).with_context(active_model=self._name).send_mail(rec.id)
|
||||
rec.write({'state': 'approve'})
|
||||
|
||||
|
||||
class ReClientRequirementProperty(models.Model):
|
||||
_inherit = "re.clients.requirement.property"
|
||||
|
||||
reservation_id = fields.Many2one('property.reservation', string="Reservation")
|
||||
|
||||
def create_reservation_record(self):
|
||||
vals = {}
|
||||
reservation_obj = self.env['property.reservation']
|
||||
for record in self:
|
||||
if record.state != 'register':
|
||||
raise exceptions.ValidationError(_("Please first Register Your Request"
|
||||
"Then You can Proceed"))
|
||||
vals = {
|
||||
'name': '/',
|
||||
'search_type': self.search_type,
|
||||
'property_id': record.property_id and record.property_id.id or False,
|
||||
'state': 'draft',
|
||||
'unit_id': record.unit_id and record.unit_id.id or False,
|
||||
'partner_id': record.request_id.partner_id and record.request_id.partner_id.id or False,
|
||||
}
|
||||
reservation_id = reservation_obj.create(vals)
|
||||
if reservation_id:
|
||||
record.reservation_id = reservation_id.id
|
||||
record.flag = True
|
||||
return True
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
from odoo.exceptions import ValidationError, UserError, Warning
|
||||
from odoo import models, fields, api, exceptions, tools, _
|
||||
from datetime import datetime, date
|
||||
|
||||
|
||||
class ContractContract(models.Model):
|
||||
_inherit = "contract.contract"
|
||||
|
||||
sale_id = fields.Many2one('re.sale', string="Sale Order")
|
||||
property_id = fields.Many2one('internal.property', string="Property")
|
||||
unit_id = fields.Many2one('re.unit', string="Unit")
|
||||
total_sale_amount = fields.Float(string='Total Sale Amount', digits=(16, 2))
|
||||
|
|
@ -0,0 +1,235 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from odoo.exceptions import ValidationError
|
||||
from odoo import models, fields, api, _
|
||||
from datetime import datetime, date
|
||||
|
||||
|
||||
class PropertyReservation(models.Model):
|
||||
_name = "property.reservation"
|
||||
_inherit = ['mail.thread', 'mail.activity.mixin']
|
||||
_description = "Property Reservation"
|
||||
|
||||
name = fields.Char(string='Reference', default='/')
|
||||
request_date = fields.Date('Order Date', index=True, default=fields.Date.context_today)
|
||||
reserve_type = fields.Selection([('with', 'With Down Payment'), ('without', 'Without Down Payment')], string="Reserve Type", default='with')
|
||||
title = fields.Selection([('mr', 'Mr'), ('mrs', 'Mrs')], string="Title", default='mr')
|
||||
partner_id = fields.Many2one('res.partner', string="Client")
|
||||
client_check_number = fields.Char(string='Client check number')
|
||||
phone = fields.Char(string='Phone', related='partner_id.phone')
|
||||
mobile = fields.Char(string='Mobile', related='partner_id.mobile')
|
||||
date_of_birth = fields.Date(string='Date Of Birth', related='partner_id.date_of_birth')
|
||||
country_id = fields.Many2one('res.country', string='Nationality', related='partner_id.country_id')
|
||||
email = fields.Char(string='Email', related='partner_id.email')
|
||||
street = fields.Char(string="Street Name", related='partner_id.street')
|
||||
identification_type = fields.Selection(related="partner_id.identification_type", string='Identification Type')
|
||||
identification_number = fields.Char(related="partner_id.identification_number", string='Identification Number')
|
||||
search_type = fields.Selection([('property', 'Property'), ('unit', 'Unit')], string="Property Type", default='unit')
|
||||
property_id = fields.Many2one('internal.property', string="Property", tracking=True)
|
||||
unit_id = fields.Many2one('re.unit', string="Units", tracking=True)
|
||||
project_id = fields.Many2one('project.project', string='Project')
|
||||
marketer_user_id = fields.Many2one('res.users', string="Marketer", default=lambda self: self.env.user)
|
||||
payment_type = fields.Selection([('cash', 'Cash'), ('bank', 'Bank')], string="Payment Type", default='cash')
|
||||
bank_id = fields.Many2one('res.bank', string="Bank")
|
||||
payment_amount = fields.Float(string='Down Payment Amount', digits=(16, 2))
|
||||
user_id = fields.Many2one('res.users', string="Responsible", default=lambda self: self.env.user)
|
||||
tax_exemption = fields.Selection([('yes', 'Yes'), ('no', 'No')], string="Tax Exemption", default='no')
|
||||
price = fields.Float(string='Property Price', digits=(16, 2), compute='get_price', store=True)
|
||||
discount = fields.Float(string='Discount', digits=(16, 2))
|
||||
final_price = fields.Float(string='Price', digits=(16, 2))
|
||||
total_price = fields.Float(string='Final Price', digits=(16, 2), compute='get_total_price', store=True)
|
||||
agent_id = fields.Many2one('res.partner', string="Agent")
|
||||
end_date = fields.Date('Reserve End Date',)
|
||||
state = fields.Selection([('draft', 'Draft'),
|
||||
('approve', 'Reservation Done'),
|
||||
('cancel', 'Cancel'),
|
||||
], string="Status", default='draft')
|
||||
total_days = fields.Integer(string="Reserve Days to end", compute="compute_days", store=True)
|
||||
client_check = fields.Binary("Client Check", attachment=True)
|
||||
receive_check = fields.Binary("Receive Check", attachment=True)
|
||||
payment_id = fields.Many2one('property.reservation.payment', string="Down Payment ID")
|
||||
sale_contract_id = fields.Many2one('re.sale', string="Sale Request")
|
||||
sale_creation = fields.Boolean(compute='get_sale_creation')
|
||||
company_id = fields.Many2one('res.company', string="Company", default=lambda self: self.env.user.company_id)
|
||||
move_id = fields.Many2one('account.move', string="Down Payment Invoice")
|
||||
|
||||
@api.depends('state', 'sale_contract_id')
|
||||
def get_sale_creation(self):
|
||||
for rec in self:
|
||||
if rec.state == 'approve' and not rec.sale_contract_id:
|
||||
rec.sale_creation = True
|
||||
else:
|
||||
rec.sale_creation = False
|
||||
|
||||
@api.depends('request_date', 'end_date')
|
||||
def compute_days(self):
|
||||
for rec in self:
|
||||
days = 0
|
||||
today_date = date.today()
|
||||
if rec.request_date and rec.end_date:
|
||||
d1 = datetime.strptime(str(today_date), '%Y-%m-%d')
|
||||
d2 = datetime.strptime(str(rec.end_date), '%Y-%m-%d')
|
||||
daysDiff = (d2 - d1).days
|
||||
if daysDiff >= 0:
|
||||
days = int(daysDiff) + 1
|
||||
rec.total_days = days
|
||||
|
||||
@api.constrains('end_date')
|
||||
def _check_dates_constraint(self):
|
||||
today_date = date.today()
|
||||
for rec in self:
|
||||
d1 = datetime.strptime(str(today_date), '%Y-%m-%d')
|
||||
d2 = datetime.strptime(str(rec.end_date), '%Y-%m-%d')
|
||||
if d2 < d1:
|
||||
raise ValidationError(_('The Reserve end date cannot be before Today date.'))
|
||||
|
||||
@api.depends('search_type', 'property_id', 'unit_id')
|
||||
def get_price(self):
|
||||
for rec in self:
|
||||
if rec.search_type == 'property' and rec.property_id:
|
||||
rec.price = rec.property_id.rent_price
|
||||
elif rec.search_type == 'unit' and rec.unit_id:
|
||||
rec.price = rec.unit_id.rent_price
|
||||
else:
|
||||
rec.price = 0.0
|
||||
|
||||
@api.depends('discount', 'final_price')
|
||||
def get_total_price(self):
|
||||
for rec in self:
|
||||
rec.total_price = rec.final_price - rec.discount or 0.0
|
||||
|
||||
|
||||
def _prepare_invoice_values(self, journal_id, account_id):
|
||||
invoice_vals = {
|
||||
'ref': self.name,
|
||||
'move_type': 'out_invoice',
|
||||
'invoice_origin': self.name,
|
||||
'narration': self.name,
|
||||
'journal_id': journal_id,
|
||||
'partner_id': self.partner_id.id,
|
||||
'invoice_line_ids': [(0, 0, {
|
||||
'name': self.name + ' - ' + str(self.request_date),
|
||||
'price_unit': self.payment_amount,
|
||||
'quantity': 1.0,
|
||||
'account_id': account_id,
|
||||
})],
|
||||
}
|
||||
return invoice_vals
|
||||
|
||||
def create_invoice(self):
|
||||
params = self.env['res.config.settings'].get_values()
|
||||
if not params['re_sale_journal_id']:
|
||||
raise ValidationError(_("Please Configure your Journal in Setting first"))
|
||||
|
||||
account_id = self.env['account.account'].search([
|
||||
('user_type_id', '=', self.env.ref('account.data_account_type_revenue').id),
|
||||
('company_id', '=', self.company_id.id)])
|
||||
invoice_vals = self._prepare_invoice_values(params['re_sale_journal_id'] or False, account_id)
|
||||
move_id = self.env['account.move'].sudo().create(invoice_vals).with_user(self.env.uid)
|
||||
move_id.action_post()
|
||||
return move_id
|
||||
|
||||
|
||||
def action_approve(self):
|
||||
for rec in self:
|
||||
if rec.name == '/' or False:
|
||||
rec.name = self.env['ir.sequence'].next_by_code('property.reservation')
|
||||
email_template = self.env.ref('khawald_real_estate_marketing.template_property_reservation')
|
||||
email_template.with_env(self.env).with_context(active_model=self._name).send_mail(rec.id)
|
||||
if rec.reserve_type == 'with':
|
||||
payment_values = {}
|
||||
payment_seq = self.env['ir.sequence'].next_by_code('property.reservation.payment')
|
||||
payment_values ={
|
||||
'name': rec.unit_id.name + '-' + payment_seq,
|
||||
'reservation_id': rec.id,
|
||||
'unit_id': rec.unit_id.id,
|
||||
'bank_id': rec.bank_id.id,
|
||||
'partner_id': rec.partner_id.id,
|
||||
'client_check_number': rec.client_check_number,
|
||||
'payment_amount': rec.payment_amount,
|
||||
'end_date': rec.end_date,
|
||||
'state': 'approve',
|
||||
'client_check': rec.client_check,
|
||||
'receive_check': rec.receive_check,
|
||||
}
|
||||
payment_id = self.env['property.reservation.payment'].sudo().create(payment_values)
|
||||
move_id = rec.create_invoice()
|
||||
rec.move_id = move_id
|
||||
rec.unit_id.state = 'with'
|
||||
rec.payment_id = payment_id and payment_id.id
|
||||
else:
|
||||
rec.unit_id.state = 'without'
|
||||
rec.state = 'approve'
|
||||
|
||||
def action_cancel(self):
|
||||
for rec in self:
|
||||
rec.unit_id.state = 'available'
|
||||
rec.state = 'cancel'
|
||||
rec.move_id.button_cancel()
|
||||
|
||||
def action_create_sale(self):
|
||||
vals = {}
|
||||
sale_obj = self.env['re.sale']
|
||||
for record in self:
|
||||
# if record.project_id.state not in ['','']:
|
||||
# raise ValidationError(_("Please first Register Your Request"
|
||||
# "Then You can Proceed"))
|
||||
vals = {
|
||||
'name': '/',
|
||||
'sell_method': self.search_type,
|
||||
'property_id': record.property_id and record.property_id.id or False,
|
||||
'state': 'draft',
|
||||
'reservation_id': record.id,
|
||||
'total_property_size': record.unit_id.space,
|
||||
'amount': record.total_price - record.payment_amount,
|
||||
'unit_id': record.unit_id and record.unit_id.id or False,
|
||||
'partner_id': record.partner_id and record.partner_id.id or False,
|
||||
}
|
||||
sale_id = sale_obj.create(vals)
|
||||
if sale_id:
|
||||
sale_id.action_register()
|
||||
record.sale_contract_id = sale_id.id
|
||||
return True
|
||||
|
||||
|
||||
class PropertyReservationPayment(models.Model):
|
||||
_name = "property.reservation.payment"
|
||||
|
||||
name = fields.Char(string='Reference', default='/')
|
||||
reservation_id = fields.Many2one('property.reservation', string="Property Reservation")
|
||||
unit_id = fields.Many2one('re.unit', string="Units", tracking=True)
|
||||
bank_id = fields.Many2one('res.bank', string="Bank")
|
||||
partner_id = fields.Many2one('res.partner', string="Client")
|
||||
client_check_number = fields.Char(string='Client check number')
|
||||
payment_amount = fields.Float(string='Down Payment Amount', digits=(16, 2))
|
||||
end_date = fields.Date('Reserve End Date',)
|
||||
request_date = fields.Date('Order Date', index=True, default=fields.Date.context_today)
|
||||
delivery_date = fields.Date('Delivery Date', index=True)
|
||||
state = fields.Selection([('draft', 'Draft'),
|
||||
('approve', 'Reservation Done'),
|
||||
('return', 'Down Payment Returned'),
|
||||
], string="Status", default='draft')
|
||||
client_check = fields.Binary("Client Check", attachment=True)
|
||||
receive_check = fields.Binary("Receive Check", attachment=True)
|
||||
delivery_check = fields.Binary("Delivery Check", attachment=True)
|
||||
return_amount = fields.Float('Return Amount')
|
||||
move_id = fields.Many2one('account.move', string="Return Invoice")
|
||||
|
||||
def action_return(self):
|
||||
for rec in self:
|
||||
rec.state = 'return'
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,176 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from odoo.exceptions import ValidationError
|
||||
from odoo import models, fields, api, _
|
||||
|
||||
|
||||
class ReSale(models.Model):
|
||||
_inherit = "re.sale"
|
||||
|
||||
handover_to_client_date = fields.Date('Handover to Client Date', index=True)
|
||||
reservation_id = fields.Many2one('property.reservation', string="Property Reservation")
|
||||
contract_id = fields.Many2one('contract.contract', string="Contract")
|
||||
invoice_count = fields.Integer(compute="_compute_invoice_count")
|
||||
payment_count = fields.Integer(compute="_compute_payment_count")
|
||||
installment_count = fields.Integer(compute="compute_installment_count")
|
||||
contract_type = fields.Selection(selection=[('sale', 'Customer'), ('purchase', 'Supplier')],
|
||||
related="contract_id.contract_type", store=True)
|
||||
contract_total_amount = fields.Integer(related="contract_id.total_amount", readonly=True)
|
||||
|
||||
def get_related_instalment(self):
|
||||
self.ensure_one()
|
||||
installments = (self.env['line.contract.installment'].search([('contract_id', '=', self.contract_id.id)]))
|
||||
return installments
|
||||
|
||||
def compute_installment_count(self):
|
||||
for item in self:
|
||||
item.installment_count = len(item.get_related_instalment())
|
||||
|
||||
def _compute_invoice_count(self):
|
||||
for rec in self:
|
||||
rec.invoice_count = len(rec._get_related_invoices())
|
||||
|
||||
def _compute_payment_count(self):
|
||||
for rec in self:
|
||||
rec.payment_count = rec._get_related_payment()
|
||||
|
||||
def _get_related_invoices(self):
|
||||
self.ensure_one()
|
||||
invoices = self.env['account.move'].search([('contract_id', '=', self.contract_id.id)])
|
||||
return invoices
|
||||
|
||||
def _get_related_payment(self):
|
||||
self.ensure_one()
|
||||
contract_payment = self.env['account.payment'].search([('contract_id', '=', self.contract_id.id)])
|
||||
invoices = self.env['account.move'].search([('contract_id', '=', self.contract_id.id)]).ids
|
||||
inv_payment = self.env['account.payment'].search(
|
||||
['|', ('reconciled_invoice_ids', 'in', invoices), ('reconciled_bill_ids', 'in', invoices)])
|
||||
count = len(contract_payment) + len(inv_payment)
|
||||
return count
|
||||
|
||||
def action_register(self):
|
||||
for rec in self:
|
||||
if rec.name == '/' or False:
|
||||
rec.name = self.env['ir.sequence'].next_by_code('re.sale')
|
||||
if rec.sell_method == 'property':
|
||||
rec.property_id.state = 'sold'
|
||||
else:
|
||||
rec.unit_id.state = 'sold'
|
||||
rec.write({'state': 'register'})
|
||||
return True
|
||||
|
||||
def _create_contract(self):
|
||||
params = self.env['res.config.settings'].get_values()
|
||||
if not params['re_sale_journal_id']:
|
||||
raise ValidationError(_("Please Configure your Sales Journal in Setting first"))
|
||||
for record in self:
|
||||
contract = self.env['contract.contract'].sudo().create({
|
||||
'sale_id': record.id,
|
||||
'property_id': record.property_id.id,
|
||||
'unit_id': record.unit_id.id,
|
||||
'date_start': record.request_date,
|
||||
'type_of_contract': 'sales',
|
||||
'contract_type': 'sale',
|
||||
'name': record.partner_id.name + '-' + record.name,
|
||||
'partner_id': record.partner_id.id,
|
||||
'total_sale_amount': record.amount,
|
||||
'journal_id': params['re_sale_journal_id'],
|
||||
})
|
||||
record.contract_id = contract and contract.id
|
||||
if record.sell_method == 'property':
|
||||
record.property_id.contract_id = contract and contract.id
|
||||
else:
|
||||
record.unit_id.sale_contract_id = contract and contract.id
|
||||
return True
|
||||
|
||||
def action_approve(self):
|
||||
#self._create_move_entry()
|
||||
for rec in self:
|
||||
rec._create_contract()
|
||||
if rec.sell_method == 'property':
|
||||
rec.property_id.state = 'sold'
|
||||
else:
|
||||
rec.unit_id.state = 'handover'
|
||||
rec.unit_id.handover_to_client_date = rec.handover_to_client_date
|
||||
email_template = self.env.ref('khawald_real_estate_marketing.template_sale_request_property')
|
||||
email_template.with_env(self.env).with_context(active_model=self._name).send_mail(rec.id)
|
||||
rec.state = 'approve'
|
||||
|
||||
def action_show_invoices(self):
|
||||
self.ensure_one()
|
||||
tree_view_ref = (
|
||||
'account.move_supplier_tree'
|
||||
if self.contract_type == 'purchase'
|
||||
else 'account.move_tree_with_onboarding'
|
||||
)
|
||||
form_view_ref = (
|
||||
'account.move_supplier_form'
|
||||
if self.contract_type == 'purchase'
|
||||
else 'account.move_form'
|
||||
)
|
||||
tree_view = self.env.ref(tree_view_ref, raise_if_not_found=False)
|
||||
form_view = self.env.ref(form_view_ref, raise_if_not_found=False)
|
||||
action = {
|
||||
'type': 'ir.actions.act_window',
|
||||
'name': 'Invoices',
|
||||
'res_model': 'account.move',
|
||||
'view_mode': 'tree,form',
|
||||
'domain': [('contract_id', '=', self.contract_id.id)],
|
||||
'context': {'default_contract_id': self.contract_id.id, 'create': False}
|
||||
}
|
||||
if tree_view and form_view:
|
||||
action['views'] = [(tree_view.id, 'tree'), (form_view.id, 'form')]
|
||||
return action
|
||||
|
||||
def action_show_payment(self):
|
||||
self.ensure_one()
|
||||
invoices = self.env['account.move'].search([('contract_id', '=', self.contract_id.id)]).ids
|
||||
inv_payment = self.env['account.payment'].search(
|
||||
['|', ('reconciled_invoice_ids', 'in', invoices), ('reconciled_bill_ids', 'in', invoices)]).ids
|
||||
tree_view_ref = (
|
||||
'account.view_account_supplier_payment_tree'
|
||||
if self.contract_type == 'purchase'
|
||||
else 'account.view_account_payment_tree'
|
||||
)
|
||||
form_view_ref = (
|
||||
'account.view_account_payment_form'
|
||||
if self.contract_type == 'purchase'
|
||||
else 'account.view_account_payment_form'
|
||||
)
|
||||
tree_view = self.env.ref(tree_view_ref, raise_if_not_found=False)
|
||||
form_view = self.env.ref(form_view_ref, raise_if_not_found=False)
|
||||
action = {
|
||||
'type': 'ir.actions.act_window',
|
||||
'name': 'Payments',
|
||||
'res_model': 'account.payment',
|
||||
'context': {'default_contract_id': self.contract_id.id, 'create': False},
|
||||
'view_mode': 'tree,kanban,form,calendar,pivot,graph,activity',
|
||||
'domain': ['|', ('contract_id', '=', self.contract_id.id), ('id', 'in', inv_payment)],
|
||||
}
|
||||
if tree_view and form_view:
|
||||
action['views'] = [(tree_view.id, 'tree'), (form_view.id, 'form')]
|
||||
return action
|
||||
|
||||
def action_show_installment(self):
|
||||
installment_ids = self.env['line.contract.installment'].search([('contract_id', '=', self.contract_id.id)])
|
||||
form_id = self.env.ref('contract.contract_installment_form_view').id
|
||||
tree_id = self.env.ref('contract.contract_installment_tree').id
|
||||
domain = [('id', 'in', installment_ids.ids)]
|
||||
return {
|
||||
'name': _('Contractor Payment'),
|
||||
'view_type': 'form',
|
||||
'view_mode': 'form',
|
||||
'res_model': 'line.contract.installment',
|
||||
'views': [(tree_id, 'tree'), (form_id, 'form')],
|
||||
'type': 'ir.actions.act_window',
|
||||
'target': 'current',
|
||||
'domain': domain,
|
||||
'context': {'default_contract_id': self.contract_id.id}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,73 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from odoo import models, fields, api, _
|
||||
from datetime import date
|
||||
|
||||
|
||||
class Property(models.Model):
|
||||
_inherit = 'internal.property'
|
||||
|
||||
# contract_id = fields.Many2one('contract.contract', string="Contract")
|
||||
|
||||
|
||||
class Unit(models.Model):
|
||||
_inherit = 're.unit'
|
||||
|
||||
state = fields.Selection([('draft', 'Draft'),
|
||||
('available', 'Available'),
|
||||
('reserved', 'Reserved'),
|
||||
('with', 'With Down Payment'),
|
||||
('without', 'Without Down Payment'),
|
||||
('handover', 'Handover to client'),
|
||||
('emptied', 'Emptied'),
|
||||
('sold', 'Sold')], string="Status", default='draft')
|
||||
waiting_ids = fields.One2many('re.unit.waiting', 'unit_id', string="Waiting List")
|
||||
handover_to_client_date = fields.Date('Handover to Client Date', index=True)
|
||||
emptied_date = fields.Date('Emptied Date', index=True)
|
||||
# sale_contract_id = fields.Many2one('contract.contract', string="Contract")
|
||||
sale_contract_counts = fields.Integer(compute="compute_sale_contract_count")
|
||||
|
||||
# def get_related_contract(self):
|
||||
# self.ensure_one()
|
||||
# contracts = (self.env['contract.contract'].search([('unit_id', '=', self.id)]))
|
||||
# return contracts
|
||||
|
||||
# def compute_sale_contract_count(self):
|
||||
# for item in self:
|
||||
# item.sale_contract_counts = len(item.get_related_contract())
|
||||
|
||||
def action_unit_emptied(self):
|
||||
for record in self:
|
||||
record.state = 'emptied'
|
||||
record.emptied_date = date.today()
|
||||
|
||||
# def action_view_contract(self):
|
||||
# contract_ids = self.env['contract.contract'].search([('unit_id', '=', self.id)])
|
||||
# form_id = self.env.ref('contract.contract_contract_form_view').id
|
||||
# tree_id = self.env.ref('contract.contract_contract_tree_view').id
|
||||
# domain = [('id', 'in', contract_ids.ids)]
|
||||
# return {
|
||||
# 'name': _('Contractor Contract'),
|
||||
# 'view_type': 'form',
|
||||
# 'view_mode': 'form',
|
||||
# 'res_model': 'contract.contract',
|
||||
# 'views': [(tree_id, 'tree'), (form_id, 'form')],
|
||||
# 'type': 'ir.actions.act_window',
|
||||
# 'target': 'current',
|
||||
# 'domain': domain,
|
||||
# }
|
||||
|
||||
|
||||
class UnitWaiting(models.Model):
|
||||
_name = 're.unit.waiting'
|
||||
_rec_name = 'unit_id'
|
||||
|
||||
unit_id = fields.Many2one('re.unit', string="Units", tracking=True)
|
||||
partner_id = fields.Many2one('res.partner', string="Client")
|
||||
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from odoo import models, fields, api, _
|
||||
from odoo.exceptions import ValidationError
|
||||
|
||||
class ResPartner(models.Model):
|
||||
_inherit = 'res.partner'
|
||||
|
||||
date_of_birth = fields.Date(string='Date Of Birth')
|
||||
|
||||
@api.constrains('mobile')
|
||||
def check_unique_phone(self):
|
||||
for rec in self:
|
||||
if rec.mobile:
|
||||
exists_phone = self.env['res.partner'].sudo().search([('id', '!=', rec.id), ('mobile', '=', rec.mobile)])
|
||||
if exists_phone:
|
||||
raise ValidationError(_('Mobile number must be unique'))
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||
access_property_reservation_normal_user,property.reservation,model_property_reservation,,1,1,1,1
|
||||
access_property_reservation_payment_normal_user,property.reservation.payment,model_property_reservation_payment,,1,1,1,1
|
||||
access_e_unit_waiting_normal_user,re.unit.waiting,model_re_unit_waiting,,1,1,1,1
|
||||
access_return_payment,return.payment,model_return_payment,,1,1,1,1
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<odoo>
|
||||
<data>
|
||||
|
||||
<record id="real_estate_marketing.group_marketer_normal_user" model="res.groups">
|
||||
<field name="name">Call Center - Normal user</field>
|
||||
</record>
|
||||
|
||||
<record id="real_estate_marketing.group_marketer_manager_user" model="res.groups">
|
||||
<field name="name">Call Center - Manager</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</odoo>
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 63 KiB |
|
|
@ -0,0 +1,80 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<data>
|
||||
<!-- Inherit Form View to Modify it -->
|
||||
<record id="re_clients_requirement_form_inherit" model="ir.ui.view">
|
||||
<field name="name">re.clients.requirement.form.inherit</field>
|
||||
<field name="model">re.clients.requirement</field>
|
||||
<field name="inherit_id" ref="real_estate_marketing.view_client_requirements_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='search_type']" position="before">
|
||||
<field name="project_id" attrs="{'readonly':[('state', '!=', 'draft')]}"/>
|
||||
</xpath>
|
||||
<field name="user_id" position="after">
|
||||
<field name="marketer_user_id" attrs="{'readonly':[('state', '!=', 'draft')]}" />
|
||||
</field>
|
||||
<field name="partner_id" position="after">
|
||||
<field name="client_type" required="1" attrs="{'readonly':[('state', '!=', 'draft')]}" />
|
||||
</field>
|
||||
<xpath expr="//tree/button[@name='create_sale_request']" position="before">
|
||||
<button name="create_reservation_record" type="object" string="Create Reservation Order" class="oe_highlight"
|
||||
attrs="{'invisible':['|','|','|',('parent.search_type','!=','unit'),('flag', '=', True),('state','!=','register'),('parent.action_type','!=','sale')]}"/>
|
||||
<field name="reservation_id" readonly="1" attrs="{'invisible': [('reservation_id', '=', False)]}"/>
|
||||
</xpath>
|
||||
<xpath expr="//tree/button[@name='create_sale_request']" position="attributes">
|
||||
<attribute name="invisible">1</attribute>
|
||||
</xpath>
|
||||
|
||||
<!-- rent -->
|
||||
<!-- <xpath expr="//tree/button[@name='create_contract_request']" position="attributes">
|
||||
<attribute name="attrs">{}</attribute>
|
||||
<attribute name="attrs">{'invisible':True}</attribute>
|
||||
<attribute name="invisible">1</attribute>
|
||||
</xpath> -->
|
||||
<!-- <xpath expr="//tree/field[@name='rental_contract_id']" position="attributes">
|
||||
<attribute name="attrs">{}</attribute>
|
||||
<attribute name="attrs">{'invisible':True}</attribute>
|
||||
<attribute name="invisible">1</attribute>
|
||||
</xpath> -->
|
||||
<xpath expr="//tree/field[@name='sale_contract_id']" position="attributes">
|
||||
<attribute name="attrs">{}</attribute>
|
||||
<attribute name="attrs">{'invisible':True}</attribute>
|
||||
<attribute name="invisible">1</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//tree/field[@name='flag']" position="attributes">
|
||||
<attribute name="attrs">{}</attribute>
|
||||
<attribute name="attrs">{'invisible':True}</attribute>
|
||||
<attribute name="invisible">1</attribute>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="re_clients_requirement_select_list" model="ir.ui.view">
|
||||
<field name="name">re.clients.requirement.select.list</field>
|
||||
<field name="model">re.clients.requirement</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="">
|
||||
<field name="name"/>
|
||||
<field name="action_type"/>
|
||||
<field name="search_type"/>
|
||||
<field name="partner_id"/>
|
||||
<field name="client_type"/>
|
||||
<group expand="0" string="Group By..." colspan="12" col="10">
|
||||
<filter string="Partner" name="group_partner" domain="[]"
|
||||
context="{'group_by':'partner_id'}"/>
|
||||
<filter string="Client Type" name="group_client_type" domain="[]"
|
||||
context="{'group_by':'client_type'}"/>
|
||||
<filter string="Action Type" name="group_action_type" domain="[]"
|
||||
context="{'group_by':'action_type'}"/>
|
||||
<filter string="Property Type" name="group_search_type" domain="[]"
|
||||
context="{'group_by':'search_type'}"/>
|
||||
<filter string="City" name="group_city_id" domain="[]"
|
||||
context="{'group_by':'city_id'}"/>
|
||||
</group>
|
||||
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<!-- Inherit Form View to Modify it -->
|
||||
<record id="contract_contract_inherit_sale_marketing_form" model="ir.ui.view">
|
||||
<field name="name">contract.contract.inherit.sale.marketing</field>
|
||||
<field name="model">contract.contract</field>
|
||||
<field name="inherit_id" ref="contract.contract_contract_form_view"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='total_amount']" position="before">
|
||||
<field name="total_sale_amount" readonly="1" force_save="1"
|
||||
groups="real_estate_marketing.group_sale_marketer_manager_user"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,83 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<data>
|
||||
<record id="property_reservation_payment_view_form" model="ir.ui.view">
|
||||
<field name="name">property.reservation.payment.form.view</field>
|
||||
<field name="model">property.reservation.payment</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="property_reservation_payment_form">
|
||||
<header>
|
||||
<button name="%(return_payment_action)d" string="Return Down Payment" states="approve" type="action" />
|
||||
<field name="state" widget="statusbar"/>
|
||||
</header>
|
||||
<sheet>
|
||||
<group string="General Information">
|
||||
<group>
|
||||
<field name="name" readonly="1" force_save="1"/>
|
||||
<field name="partner_id" readonly="1" force_save="1"/>
|
||||
<field name="bank_id" readonly="1" force_save="1"/>
|
||||
<field name="end_date" readonly="1" force_save="1"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="unit_id" readonly="1" force_save="1"/>
|
||||
<field name="payment_amount" readonly="1" force_save="1"/>
|
||||
<field name="return_amount" readonly="1"/>
|
||||
<field name="client_check_number" readonly="1" force_save="1"/>
|
||||
<field name="move_id" readonly="1" />
|
||||
</group>
|
||||
</group>
|
||||
<group string="Received Attachments">
|
||||
<group>
|
||||
<field name="request_date" readonly="1" force_save="1"/>
|
||||
<field name="receive_check" readonly="1" force_save="1"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="client_check" readonly="1" force_save="1"/>
|
||||
</group>
|
||||
</group>
|
||||
<group string="Delivery Attachments" attrs="{'readonly':[('state', '!=', 'approve')]}">
|
||||
<group>
|
||||
<field name="delivery_date" attrs="{'readonly':[('state', '!=', 'approve')]}" force_save="1"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="delivery_check" attrs="{'readonly':[('state', '!=', 'approve')]}" force_save="1"/>
|
||||
</group>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="property_reservation_payment_view_tree" model="ir.ui.view">
|
||||
<field name="name">property.reservation.payment_view_tree</field>
|
||||
<field name="model">property.reservation.payment</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="property_reservation_payment_tree">
|
||||
<field name="name"/>
|
||||
<field name="unit_id"/>
|
||||
<field name="partner_id"/>
|
||||
<field name="bank_id"/>
|
||||
<field name="payment_amount"/>
|
||||
<field name="state"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="property_reservation_payment_action" model="ir.actions.act_window">
|
||||
<field name="name">Down Payments</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">property.reservation.payment</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="domain">[('unit_id','=', active_id)]</field>
|
||||
</record>
|
||||
|
||||
<record id="property_reservation_action" model="ir.actions.act_window">
|
||||
<field name="name">Down Payments</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">property.reservation.payment</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="domain">[('reservation_id','=', active_id)]</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,146 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<data>
|
||||
<record id="property_reservation_view_form" model="ir.ui.view">
|
||||
<field name="name">property_reservation_view_form</field>
|
||||
<field name="model">property.reservation</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="property_reservation_form">
|
||||
<header>
|
||||
<button name="action_approve" string="Approve" states="draft" type="object"/>
|
||||
<button name="action_cancel" string="Cancel Reservation" states="approve" type="object"
|
||||
confirm="Are you sure you want to cancel the reservation?!. Please be aware if you cancel the unit will be return Available"/>
|
||||
<button name="action_create_sale" string="Create Sale Request" attrs="{'invisible':[('sale_creation', '!=',True)]}" type="object"/>
|
||||
<field name="state" widget="statusbar"/>
|
||||
</header>
|
||||
<sheet>
|
||||
<div class="oe_button_box" name="button_box">
|
||||
<button name="%(property_reservation_action)d" type="action"
|
||||
class="oe_stat_button"
|
||||
icon="fa-dollar">
|
||||
Down Payments
|
||||
</button>
|
||||
<button name="%(property_sales_from_reservation_action)d" type="action"
|
||||
class="oe_stat_button"
|
||||
icon="fa-dollar">
|
||||
Sales Request
|
||||
</button>
|
||||
</div>
|
||||
<group string="Reservation Information" name="reserve">
|
||||
<group>
|
||||
<field name="name" readonly="1" force_save="1"/>
|
||||
<field name="search_type" readonly="1" required="1"/>
|
||||
<field name="property_id" attrs="{'readonly':[('state', '!=', 'draft')]}" required="1"/>
|
||||
<field name="unit_id" domain="[('property_id', '=', property_id),('state', '=', 'available'),('action_type', '=', 'sale')]" attrs="{'readonly':[('state', '!=', 'draft')],'invisible':[('search_type', '!=', 'unit')],'required':[('search_type', '=', 'unit')]}"/>
|
||||
<field name="marketer_user_id" attrs="{'readonly':[('state', '!=', 'draft')],'required':[('state', '=', 'draft')]}"/>
|
||||
<field name="user_id" readonly="1" force_save="1"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="request_date" readonly="1" force_save="1"/>
|
||||
<field name="end_date" attrs="{'readonly':[('state', '!=', 'draft')],'required':[('state', '=', 'draft')]}"/>
|
||||
<field name="total_days" readonly="1" force_save="1"/>
|
||||
<field name="agent_id" attrs="{'readonly':[('state', '!=', 'draft')],'required':[('state', '=', 'draft')]}"/>
|
||||
<field name="sale_creation" invisible="1"/>
|
||||
</group>
|
||||
</group>
|
||||
<group string="Client Information" name="client">
|
||||
<group>
|
||||
<field name="title" attrs="{'readonly':[('state', '!=', 'draft')],'required':[('state', '=', 'draft')]}"/>
|
||||
<field name="partner_id" attrs="{'readonly':[('state', '!=', 'draft')],'required':[('state', '=', 'draft')]}"/>
|
||||
<field name="phone" readonly="1" force_save="1"/>
|
||||
<field name="date_of_birth" readonly="1" force_save="1"/>
|
||||
<field name="email" readonly="1" force_save="1"/>
|
||||
<field name="identification_type" readonly="1" force_save="1"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="mobile" readonly="1" force_save="1"/>
|
||||
<field name="country_id" readonly="1" force_save="1"/>
|
||||
<field name="street" readonly="1" force_save="1"/>
|
||||
<field name="identification_number" />
|
||||
<field name="tax_exemption" attrs="{'readonly':[('state', '!=', 'draft')],'required':[('state', '=', 'draft')]}"/>
|
||||
</group>
|
||||
</group>
|
||||
<group string="Finance Details" name="finance">
|
||||
<group>
|
||||
<field name="reserve_type" attrs="{'readonly':[('state', '!=', 'draft')],'required':[('state', '=', 'draft')]}"/>
|
||||
<field name="payment_type" attrs="{'readonly':[('state', '!=', 'draft')],'required':[('state', '=', 'draft')]}"/>
|
||||
<field name="client_check_number" attrs="{'readonly':[('state', '!=', 'draft')],'invisible':[('payment_type', '!=', 'bank')],'required':[('payment_type', '=', 'bank')]}"/>
|
||||
<field name="price" readonly="1" force_save="1"/>
|
||||
<field name="final_price" attrs="{'readonly':[('state', '!=', 'draft')],'required':[('state', '=', 'draft')]}"/>
|
||||
<field name="total_price" readonly="1" force_save="1"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="bank_id" attrs="{'readonly':[('state', '!=', 'draft')],'invisible':[('payment_type', '!=', 'bank')],'required':[('payment_type', '=', 'bank')]}"/>
|
||||
<field name="payment_amount" attrs="{'readonly':[('state', '!=', 'draft')],'required':[('state', '=', 'draft')]}"/>
|
||||
<field name="client_check" attrs="{'readonly':[('state', '!=', 'draft')],'invisible':[('payment_type', '!=', 'bank')],'required':[('payment_type', '=', 'bank')]}"/>
|
||||
<field name="receive_check" attrs="{'readonly':[('state', '!=', 'draft')],'invisible':[('payment_type', '!=', 'bank')],'required':[('payment_type', '=', 'bank')]}"/>
|
||||
<field name="discount" attrs="{'readonly':[('state', '!=', 'draft')],'required':[('state', '=', 'draft')]}"/>
|
||||
<field name="move_id" readonly="1"/>
|
||||
</group>
|
||||
</group>
|
||||
</sheet>
|
||||
<div class="oe_chatter">
|
||||
<field name="message_follower_ids" widget="mail_followers" groups="base.group_user"/>
|
||||
<field name="message_ids" widget="mail_thread"/>
|
||||
</div>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="property_reservation_view_tree" model="ir.ui.view">
|
||||
<field name="name">property_reservation_view_tree</field>
|
||||
<field name="model">property.reservation</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="property_reservation_tree">
|
||||
<field name="name"/>
|
||||
<field name="partner_id"/>
|
||||
<field name="property_id"/>
|
||||
<field name="unit_id"/>
|
||||
<field name="request_date"/>
|
||||
<field name="end_date"/>
|
||||
<field name="state"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="property_reservation_search_view" model="ir.ui.view">
|
||||
<field name="name">property.reservation.select.list</field>
|
||||
<field name="model">property.reservation</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="">
|
||||
<field name="name"/>
|
||||
<field name="partner_id"/>
|
||||
<field name="property_id"/>
|
||||
<field name="unit_id"/>
|
||||
<field name="payment_type"/>
|
||||
<field name="payment_amount"/>
|
||||
<group expand="0" string="Group By..." colspan="12" col="10">
|
||||
<filter string="Partner" domain="[]" name="partner_id"
|
||||
context="{'group_by':'partner_id'}"/>
|
||||
<filter string="Status" domain="[]" name="state"
|
||||
context="{'group_by':'state'}"/>
|
||||
<filter string="Payment Type" domain="[]" name="payment_type"
|
||||
context="{'group_by':'payment_type'}"/>
|
||||
</group>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_property_reservation_action" model="ir.actions.act_window">
|
||||
<field name="name">Property Reservation</field>
|
||||
<field name="res_model">property.reservation</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="domain"></field>
|
||||
<field name="context"></field>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to create a New Reservation.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<menuitem id="res_property_reservation_menu" name="Property Reservation"
|
||||
parent="real_estate_marketing.menu_real_estate_marketing"
|
||||
action="view_property_reservation_action" sequence="1"/>
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<data>
|
||||
|
||||
<!-- Inherit Form View to Modify it -->
|
||||
<record id="view_re_sales_form_inherit" model="ir.ui.view">
|
||||
<field name="name">re.sale.inherit.view</field>
|
||||
<field name="model">re.sale</field>
|
||||
<field name="inherit_id" ref="real_estate_marketing.view_re_sales_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//form//sheet/group[1]" position="before">
|
||||
<div class="oe_button_box" name="button_box">
|
||||
<button name="action_show_installment" class="oe_stat_button" type="object" icon="fa-list" attrs="{'invisible': [('contract_total_amount','=',0)]}">
|
||||
<field string="Installments" name="installment_count" widget="statinfo"/>
|
||||
</button>
|
||||
<button name="action_show_invoices" type="object" icon="fa-list" class="oe_stat_button">
|
||||
<field string="Invoices" name="invoice_count" widget="statinfo"/>
|
||||
</button>
|
||||
<button name="action_show_payment" type="object" icon="fa-list" class="oe_stat_button">
|
||||
<field string="Payment" name="payment_count" widget="statinfo"/>
|
||||
</button>
|
||||
</div>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='partner_id']" position="after">
|
||||
<field name="handover_to_client_date" attrs="{'readonly':[('state', '!=', 'register')],'required':[('state', '=', 'register')]}"/>
|
||||
<field name="contract_total_amount" invisible="1"/>
|
||||
</xpath>
|
||||
<xpath expr="//page[@name='payment_info']" position="replace">
|
||||
<page name="contract_info" string="Contract Information">
|
||||
<group string="Contract Information">
|
||||
<field name="contract_id" force_save="1" readonly="1"/>
|
||||
</group>
|
||||
</page>
|
||||
</xpath>
|
||||
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="property_sales_from_reservation_action" model="ir.actions.act_window">
|
||||
<field name="name">Property Sales</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">re.sale</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="domain">[('reservation_id','=', active_id)]</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,58 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<data>
|
||||
<!-- Inherit Form View to Modify it -->
|
||||
<record id="unit_form_view_khawald_inherit_real_estate" model="ir.ui.view">
|
||||
<field name="name">re.unit.real.estate.marketing</field>
|
||||
<field name="model">re.unit</field>
|
||||
<field name="inherit_id" ref="khawald_project.unit_form_view_khawald"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//button[@name='action_draft']" position="before">
|
||||
<button name="action_unit_emptied" string="Emptied Done" states="handover" type="object"/>
|
||||
</xpath>
|
||||
<xpath expr="//page[@name='unit_electric']" position="after">
|
||||
<page string="Additional Info" name="additional_info">
|
||||
<group>
|
||||
<group>
|
||||
<field name="handover_to_client_date" readonly="1" force_save="1"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="emptied_date" readonly="1" force_save="1"/>
|
||||
</group>
|
||||
</group>
|
||||
<group string="Waiting List">
|
||||
<field name="waiting_ids" options="{'no_create': True, 'no_quick_create': True}">
|
||||
<tree editable="bottom">
|
||||
<field name="partner_id"/>
|
||||
</tree>
|
||||
<form></form>
|
||||
</field>
|
||||
</group>
|
||||
</page>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//page[@name='stamping_info']/group/group" position="after">
|
||||
<group string="New Stamping">
|
||||
<field name="stamping_new" attrs="{'readonly':[('state','!=','handover'),('unlock','=',True)], 'required':[('state', '=', 'handover')]}"/>
|
||||
<field name="stamping_date_new" attrs="{'readonly':[('state','!=','handover'),('unlock','=',True)], 'required':[('state', '=', 'handover')]}"/>
|
||||
<field name="stamping_attach_new" attrs="{'readonly':[('state','!=','handover'),('unlock','=',True)], 'required':[('state', '=', 'handover')]}"/>
|
||||
</group>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- Inherit Form View to Modify it --> <!-- edit -->
|
||||
<!-- <record id="re_unit_inherit_contract_form_view" model="ir.ui.view">
|
||||
<field name="name">re.unit.inherit.contract.form.view</field>
|
||||
<field name="model">re.unit</field>
|
||||
<field name="inherit_id" ref="property_management.contract_unit_view"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//button[@name='get_contract']" position="replace">
|
||||
<button class="oe_stat_button" name="action_view_contract" type="object" icon="fa-files">
|
||||
<field string="Contracts" name="sale_contract_counts" widget="statinfo"/>
|
||||
</button>
|
||||
</xpath>
|
||||
</field>
|
||||
</record> -->
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<data>
|
||||
<!-- Inherit Form View to Modify it -->
|
||||
<record id="re_unit_down_payment_inherit" model="ir.ui.view">
|
||||
<field name="name">re.unit.inherit.downpayment</field>
|
||||
<field name="model">re.unit</field>
|
||||
<field name="inherit_id" ref="real_estate.unit_form_view"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//button[@name='action_toggle_is_locked']" position="after">
|
||||
<button name="%(property_reservation_payment_action)d" type="action"
|
||||
class="oe_stat_button"
|
||||
icon="fa-dollar">
|
||||
Down Payments
|
||||
</button>
|
||||
</xpath>
|
||||
|
||||
</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<data>
|
||||
|
||||
<record model="ir.ui.view" id="partner_view_property_extra">
|
||||
<field name="name">partner.view.extra.data</field>
|
||||
<field name="model">res.partner</field>
|
||||
<field name="inherit_id" ref="base.view_partner_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='vat']" position="after">
|
||||
<field name="date_of_birth" required="0"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_res_partner_marketing" model="ir.actions.act_window">
|
||||
<field name="name">Clients</field>
|
||||
<field name="res_model">res.partner</field>
|
||||
<field name="view_mode">kanban,tree,form</field>
|
||||
<field name="domain"></field>
|
||||
<field name="context"></field>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to create a Client.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<menuitem id="res_partner_marketing_menu" name="Clients"
|
||||
parent="real_estate_marketing.menu_real_estate_marketing"
|
||||
action="view_res_partner_marketing" sequence="1"/>
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from . import return_payment
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from odoo import models, fields, api, _
|
||||
from odoo.exceptions import ValidationError
|
||||
|
||||
class ReturnPayment(models.TransientModel):
|
||||
|
||||
_name = 'return.payment'
|
||||
_description = "Return Payment"
|
||||
|
||||
return_type = fields.Selection([('total','Total'), ('partial', 'Partial')], 'Return Type', default="total")
|
||||
return_amount = fields.Float('Amount')
|
||||
|
||||
def _prepare_invoice_values(self, reservation_payment_id, journal_id, account_id):
|
||||
invoice_vals = {
|
||||
'ref': reservation_payment_id.name,
|
||||
'move_type': 'out_refund',
|
||||
'invoice_origin': reservation_payment_id.name,
|
||||
'narration': reservation_payment_id.name,
|
||||
'journal_id': journal_id,
|
||||
'partner_id': reservation_payment_id.partner_id.id,
|
||||
'invoice_line_ids': [(0, 0, {
|
||||
'name': reservation_payment_id.name + ' - ' + (str(reservation_payment_id.request_date)),
|
||||
'price_unit': reservation_payment_id.payment_amount if self.return_type == 'total' else self.return_amount,
|
||||
'quantity': 1.0,
|
||||
'account_id': account_id,
|
||||
})],
|
||||
}
|
||||
return invoice_vals
|
||||
|
||||
def create_invoice(self, reservation_payment_id):
|
||||
params = self.env['res.config.settings'].get_values()
|
||||
if not params['re_sale_journal_id']:
|
||||
raise ValidationError(_("Please Configure your Journal in Setting first"))
|
||||
|
||||
account_id = self.env['account.account'].search([
|
||||
('user_type_id', '=', self.env.ref('account.data_account_type_revenue').id),
|
||||
('company_id', '=', reservation_payment_id.reservation_id.company_id.id)])
|
||||
invoice_vals = self._prepare_invoice_values(reservation_payment_id, params['re_sale_journal_id'] or False, account_id)
|
||||
move_id = self.env['account.move'].sudo().create(invoice_vals).with_user(self.env.uid)
|
||||
move_id.action_post()
|
||||
return move_id
|
||||
|
||||
def action_return(self):
|
||||
|
||||
reservation_payment_id = self.env['property.reservation.payment'].browse(self.env.context.get('active_ids', False))
|
||||
move_id = self.create_invoice(reservation_payment_id)
|
||||
|
||||
if self.return_amount > reservation_payment_id.payment_amount:
|
||||
raise ValidationError(_("Return amount must be less than or equal to down payment amount"))
|
||||
|
||||
reservation_payment_id.return_amount = reservation_payment_id.payment_amount if self.return_type == 'total' else self.return_amount
|
||||
reservation_payment_id.move_id = move_id
|
||||
reservation_payment_id.state = 'return'
|
||||
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data>
|
||||
|
||||
<record id="return_payment_form" model="ir.ui.view">
|
||||
<field name="name">return.payment.form</field>
|
||||
<field name="model">return.payment</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Return Payment">
|
||||
<group>
|
||||
<field name="return_type" required="1" />
|
||||
<field name="return_amount" attrs="{'invisible':[('return_type', '=', 'total')], 'required':[('return_type', '=', 'partial')]}"/>
|
||||
</group>
|
||||
<footer>
|
||||
<button string="Return" name="action_return" type="object" class="oe_highlight"/>
|
||||
<button string="Cancel" class="btn btn-secondary" special="cancel"/>
|
||||
</footer>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="return_payment_action" model="ir.actions.act_window">
|
||||
<field name="name">Return Payment</field>
|
||||
<field name="res_model">return.payment</field>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="target">new</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from . import models
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
|
||||
{
|
||||
'name': 'Khwalid Real Estate Report',
|
||||
'version': '1.0',
|
||||
'license': 'AGPL-3',
|
||||
'category': 'Odex25-Realstate/Odex25-Realstate',
|
||||
'author': 'Expert Co. Ltd.',
|
||||
'website': 'http://exp-sa.com',
|
||||
'summary': "Khwalid Real Estate Report ",
|
||||
'depends': ['khawald_real_estate_marketing', 'report_xlsx'],
|
||||
'data': [
|
||||
'reports/property_reservation_cheque_report_template.xml',
|
||||
'reports/receipt_voucher_report_template.xml',
|
||||
'reports/refund_request_report_template.xml',
|
||||
'reports/customer_Identi_without_image_report_template.xml',
|
||||
'reports/receive_unit_report_template.xml',
|
||||
'reports/report_invoice.xml',
|
||||
'reports/permission_empty_unit_report_template.xml',
|
||||
],
|
||||
|
||||
'installable': True,
|
||||
'application': False,
|
||||
}
|
||||
|
|
@ -0,0 +1,853 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * khwalid_real_estate_report
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 14.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-04-06 11:21+0000\n"
|
||||
"PO-Revision-Date: 2022-04-06 11:21+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: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receipt_voucher_report
|
||||
msgid ", Mobile"
|
||||
msgstr "، جوال رقم"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receipt_voucher_report
|
||||
msgid ", Identification Number"
|
||||
msgstr "، هوية رقم"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receipt_voucher_report
|
||||
msgid ", district"
|
||||
msgstr "، حي"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receipt_voucher_report
|
||||
msgid ", project"
|
||||
msgstr "، مشروع"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.property_reservation_cheque_report
|
||||
msgid "<span>Cheque Details: </span>"
|
||||
msgstr "<span>تفاصيل الشيك: </span>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.refund_request_report
|
||||
msgid "<span>Justifications for the refund request:</span>"
|
||||
msgstr "<span>مبررات طلب الإسترداد:</span>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.property_reservation_cheque_report
|
||||
msgid "<span>Notes:</span>"
|
||||
msgstr "<span>ملاحظات:</span>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.property_reservation_cheque_report
|
||||
msgid "<span>Unit Details: </span>"
|
||||
msgstr "<span>تفاصيل الوحدة: </span>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receive_unit_report
|
||||
msgid "<strong> Maid's Bath </strong>"
|
||||
msgstr "<strong> حمام الخادمة </strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receive_unit_report
|
||||
msgid "<strong>Air Conditioner Electricity</strong>"
|
||||
msgstr "<strong>كهرباء المكيفات</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.property_reservation_cheque_report
|
||||
msgid "<strong>Amount</strong>"
|
||||
msgstr "<strong>المبلغ</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receipt_voucher_report
|
||||
msgid "<strong>Bank</strong>"
|
||||
msgstr "<strong>بنك</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receive_unit_report
|
||||
msgid "<strong>Bedroom 1</strong>"
|
||||
msgstr "<strong>غرفة 1</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receive_unit_report
|
||||
msgid "<strong>Bedroom 2</strong>"
|
||||
msgstr "<strong>غرفة 2</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.customer_Identi_without_image_report
|
||||
msgid "<strong>Birth Date</strong>"
|
||||
msgstr "<strong>تاريخ الميلاد</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receipt_voucher_report
|
||||
msgid "<strong>Buyer Signature: </strong>"
|
||||
msgstr "<strong>توقيع المشتري: </strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receipt_voucher_report
|
||||
msgid "<strong>Cheque No.</strong>"
|
||||
msgstr "<strong>رقم الشيك</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.refund_request_report
|
||||
msgid "<strong>Cheque Receipt Date</strong>"
|
||||
msgstr "<strong>تاريخ إستلام الشيك</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "<strong>Cheque</strong>"
|
||||
msgstr "<strong>الشيك</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.customer_Identi_without_image_report
|
||||
msgid "<strong>Copy No.</strong>"
|
||||
msgstr "<strong>رقم النسخه</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receive_unit_report
|
||||
msgid "<strong>Council</strong>"
|
||||
msgstr "<strong>المجلس</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.customer_Identi_without_image_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.property_reservation_cheque_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receive_unit_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.refund_request_report
|
||||
msgid "<strong>Customer Name</strong>"
|
||||
msgstr "<strong>اسم العميل</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.customer_Identi_without_image_report
|
||||
msgid "<strong>Customer Signature</strong>"
|
||||
msgstr "<strong>توقيع العميل</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receive_unit_report
|
||||
msgid "<strong>Customer</strong>"
|
||||
msgstr "<strong>العميل</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receipt_voucher_report
|
||||
msgid "<strong>Date</strong>"
|
||||
msgstr "<strong>التاريخ</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.property_reservation_cheque_report
|
||||
msgid "<strong>Discount</strong>"
|
||||
msgstr "<strong>الخصم</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.property_reservation_cheque_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receive_unit_report
|
||||
msgid "<strong>District</strong>"
|
||||
msgstr "<strong>الحي</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.property_reservation_cheque_report
|
||||
msgid "<strong>Down Payment Amount</strong>"
|
||||
msgstr "<strong>العربون</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receive_unit_report
|
||||
msgid "<strong>Hall</strong>"
|
||||
msgstr "<strong>صالة</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receive_unit_report
|
||||
msgid "<strong>Heater</strong>"
|
||||
msgstr "<strong>سخان</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.customer_Identi_without_image_report
|
||||
msgid "<strong>Identification Expiry Date</strong>"
|
||||
msgstr "<strong>تاريخ الإنتهاء</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.customer_Identi_without_image_report
|
||||
msgid "<strong>Identification Number/ Iqama</strong>"
|
||||
msgstr "<strong>رقم الهوية/ الإقامه</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "<strong>Identification Number</strong>"
|
||||
msgstr "<strong>رقم الهوية</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.customer_Identi_without_image_report
|
||||
msgid "<strong>Issuer</strong>"
|
||||
msgstr "<strong>جهة الإصدار</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receive_unit_report
|
||||
msgid "<strong>Lighting</strong>"
|
||||
msgstr "<strong>الإضاءه</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receive_unit_report
|
||||
msgid "<strong>Majlis Bath</strong>"
|
||||
msgstr "<strong>حمام المجلس</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receive_unit_report
|
||||
msgid "<strong>Master Bedroom Bath</strong>"
|
||||
msgstr "<strong>حمام غرفة النوم الرئيسية</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receive_unit_report
|
||||
msgid "<strong>Master Bedroom</strong>"
|
||||
msgstr "<strong>غرفة النوم الرئيسية</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.customer_Identi_without_image_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.refund_request_report
|
||||
msgid "<strong>Mobile</strong>"
|
||||
msgstr "<strong>رقم الجوال</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receive_unit_report
|
||||
msgid "<strong>Notes</strong>"
|
||||
msgstr "<strong>الملاحظات</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receive_unit_report
|
||||
msgid "<strong>Ourity</strong>"
|
||||
msgstr "<strong>الصفاية</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receive_unit_report
|
||||
msgid "<strong>Paint</strong>"
|
||||
msgstr "<strong>الدهان</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "<strong>Payment Type</strong>"
|
||||
msgstr "<strong>نوع المدفوع</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.refund_request_report
|
||||
msgid "<strong>Project Name</strong>"
|
||||
msgstr "<strong>إسم المشروع</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.property_reservation_cheque_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receive_unit_report
|
||||
msgid "<strong>Project</strong>"
|
||||
msgstr "<strong>المشروع</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.refund_request_report
|
||||
msgid "<strong>Property No.</strong>"
|
||||
msgstr "<strong>رقم المبني</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.customer_Identi_without_image_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.property_reservation_cheque_report
|
||||
msgid "<strong>Purpose</strong>"
|
||||
msgstr "<strong>الغرض</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.refund_request_report
|
||||
msgid "<strong>Reason for requesting refund</strong>"
|
||||
msgstr "<strong>سبب طلب الإسترداد</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receipt_voucher_report
|
||||
msgid "<strong>Receiver Signature: </strong>"
|
||||
msgstr "<strong>توقيع المستلم: </strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receipt_voucher_report
|
||||
msgid "<strong>Receiver: </strong>"
|
||||
msgstr "<strong>المستلم: </strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.property_reservation_cheque_report
|
||||
msgid "<strong>Reserve Type</strong>"
|
||||
msgstr "<strong>اسلوب الدفع</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.refund_request_report
|
||||
msgid "<strong>Return Amount</strong>"
|
||||
msgstr "<strong>قيمة الإسترداد</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.refund_request_report
|
||||
msgid "<strong>Return Type</strong>"
|
||||
msgstr "<strong>نوع المسترد</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.refund_request_report
|
||||
msgid "<strong>Sale Price</strong>"
|
||||
msgstr "<strong>سعر البيع</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receive_unit_report
|
||||
msgid "<strong>Sales Employee</strong>"
|
||||
msgstr "<strong>موظف المبيعات</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.report_invoice_document_inherit
|
||||
msgid "<strong>Salesperson</strong>"
|
||||
msgstr "<strong>البائع</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receive_unit_report
|
||||
msgid "<strong>Section</strong>"
|
||||
msgstr "<strong>البند</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receive_unit_report
|
||||
msgid "<strong>Service Bath</strong>"
|
||||
msgstr "<strong>حمام الخدمة</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receive_unit_report
|
||||
msgid "<strong>Shower and Rinse</strong>"
|
||||
msgstr "<strong>الدش والشطاف</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receive_unit_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.report_invoice_document_inherit
|
||||
msgid "<strong>Signature</strong>"
|
||||
msgstr "<strong>التوقيع</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receive_unit_report
|
||||
msgid "<strong>Siphon</strong>"
|
||||
msgstr "<strong>السيفون</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receive_unit_report
|
||||
msgid "<strong>Suction Fan</strong>"
|
||||
msgstr "<strong>مروحة الشفط</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.property_reservation_cheque_report
|
||||
msgid "<strong>Tax</strong>"
|
||||
msgstr "<strong>قيمة الضريبة</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.customer_Identi_without_image_report
|
||||
msgid "<strong>The Confession</strong>"
|
||||
msgstr "<strong>الإقرار</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receive_unit_report
|
||||
msgid "<strong>Tiles</strong>"
|
||||
msgstr "<strong>البلاط</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.property_reservation_cheque_report
|
||||
msgid "<strong>Unit Amount</strong>"
|
||||
msgstr "<strong>سعر الوحدة</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.customer_Identi_without_image_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receive_unit_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.refund_request_report
|
||||
msgid "<strong>Unit No.</strong>"
|
||||
msgstr "<strong>رقم الوحدة</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.property_reservation_cheque_report
|
||||
msgid "<strong>Unit</strong>"
|
||||
msgstr "<strong>الوحدة</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receive_unit_report
|
||||
msgid "<strong>Valve</strong>"
|
||||
msgstr "<strong>المحبس</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.refund_request_report
|
||||
msgid "<strong>Voucher No.</strong>"
|
||||
msgstr "<strong>رقم سند القبض</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receive_unit_report
|
||||
msgid "<strong>Windows</strong>"
|
||||
msgstr "<strong>النوافذ</strong>"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "A copy of the financing contract"
|
||||
msgstr "نسخة من عقد التمويل"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "A copy of the housing unit cheque"
|
||||
msgstr "صورة من شيك الوحدة السكنية"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "A copy of the tax cheque"
|
||||
msgstr "صورة من شيك الضريبة"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.report_invoice_document_inherit
|
||||
msgid "Address"
|
||||
msgstr "العنوان"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "Agent Empty"
|
||||
msgstr "الموكل بالإفراغ"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receipt_voucher_report
|
||||
msgid "Amount of"
|
||||
msgstr "مبلغ وقدره "
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receipt_voucher_report
|
||||
msgid "And this price of unit"
|
||||
msgstr "وذلك ثمن شقة رقم"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receipt_voucher_report
|
||||
msgid "And we received it:"
|
||||
msgstr "واستلمنا معه: "
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.property_reservation_cheque_report
|
||||
msgid ""
|
||||
"Anyone who has a first home certificate is exempted from real estate tax for"
|
||||
" an amount of less than one million riyals."
|
||||
msgstr "يُعفى من لديه شهادة المسكن الأول من ضريبة التصرفات العقارية لما دون مبلغ مليون ريال."
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "Apartment Amount"
|
||||
msgstr "قيمة الشقة"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.property_reservation_cheque_report
|
||||
msgid "Attached is the cheque details below."
|
||||
msgstr "مرفق لكم بيانات الشيك أدناه."
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model:ir.actions.report,name:khwalid_real_estate_report.action_cancel_sale_pdf
|
||||
msgid "Cancel Sale Request Unit"
|
||||
msgstr "إلغاء بيع وحده سكنية"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.refund_request_report
|
||||
msgid ""
|
||||
"Cancellation of the residential unit reservation with the consent of both "
|
||||
"parties."
|
||||
msgstr "إلغاء حجز الوحدة السكنية بموافقة الطرفين."
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.refund_request_report
|
||||
msgid ""
|
||||
"Cancellation of the sale of the housing unit with the consent of both "
|
||||
"parties."
|
||||
msgstr "إلغاء بيع الوحدة السكنية بموافقة الطرفين."
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.refund_request_report
|
||||
msgid "Cancellation of the sale."
|
||||
msgstr "إلغاء البيع"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "Cheque 1"
|
||||
msgstr "شيك 1"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "Cheque 2"
|
||||
msgstr "شيك 2"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "Cheque 3"
|
||||
msgstr "شيك 3"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "Cheque Deposit Origin"
|
||||
msgstr "أصل إيداع الشيك"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "Customer"
|
||||
msgstr "العميل"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.refund_request_report
|
||||
msgid "Customer Details:"
|
||||
msgstr "تفاصيل العميل"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model:ir.actions.report,name:khwalid_real_estate_report.action_customer_Identi_without_image_pdf
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.customer_Identi_without_image_report
|
||||
msgid "Customer Identification without Image"
|
||||
msgstr "هوية العميل بدون صورة"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.report_invoice_document_inherit
|
||||
msgid "Date"
|
||||
msgstr "التاريخ"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.property_reservation_cheque_report
|
||||
msgid "Dear Customer:"
|
||||
msgstr "عزيزنا العميل"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.refund_request_report
|
||||
msgid "Deposit"
|
||||
msgstr "عربون"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.report_invoice_document_inherit
|
||||
msgid "From"
|
||||
msgstr "من"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.customer_Identi_without_image_report
|
||||
msgid "I acknowledge receipt of each of:"
|
||||
msgstr "و أقر بإستلام كل من: "
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.customer_Identi_without_image_report
|
||||
msgid "I agree, I am the second party buyer"
|
||||
msgstr "أوافق انا الطرف الثاني المشتري: "
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "Instrument Date"
|
||||
msgstr "تاريخ الصك"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "Instrument No."
|
||||
msgstr "رقم الصك"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.report_invoice_document_inherit
|
||||
msgid "Invoice No"
|
||||
msgstr "رقم الفاتوره"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receive_unit_report
|
||||
msgid "Kitchen"
|
||||
msgstr "المطبخ"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receipt_voucher_report
|
||||
msgid "Mr/ Mrs"
|
||||
msgstr "السيد/ السيدة"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "Owner"
|
||||
msgstr "المالك"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.refund_request_report
|
||||
msgid "Pay the first payment to the bank."
|
||||
msgstr "دفع الدفعة الأولى للبنك."
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model:ir.actions.report,name:khwalid_real_estate_report.action_permission_empty_unit
|
||||
msgid "Permission to Empty Unit"
|
||||
msgstr "إذن إفراغ وحده سكنية"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "Permission to Empty a Residential Unit"
|
||||
msgstr "إذن إفراغ وحده سكنية"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "Project"
|
||||
msgstr "المشروع"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model:ir.actions.report,name:khwalid_real_estate_report.action_receipt_voucher_pdf
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receipt_voucher_report
|
||||
msgid "Receipt Voucher"
|
||||
msgstr "سند قبض"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model:ir.actions.report,name:khwalid_real_estate_report.action_receive_unit_pdf
|
||||
msgid "Receive Unit"
|
||||
msgstr "إستلام وحدة سكنية"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model:ir.actions.report,name:khwalid_real_estate_report.action_refund_request_pdf
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.refund_request_report
|
||||
msgid "Refund Request"
|
||||
msgstr "طلب الإسترداد"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model:ir.actions.report,name:khwalid_real_estate_report.action_property_reservation_cheque_pdf
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.property_reservation_cheque_report
|
||||
msgid "Reservation and Cheque Details"
|
||||
msgstr "حجز وبيانات الشيك"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.customer_Identi_without_image_report
|
||||
msgid "Sale Unit"
|
||||
msgstr "شراء شقة"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "Sales Employee"
|
||||
msgstr "موظف المبيعات"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.refund_request_report
|
||||
msgid "Sales Manager:"
|
||||
msgstr "مدير المبيعات: "
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receive_unit_report
|
||||
msgid "Section"
|
||||
msgstr "البند"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "Signature"
|
||||
msgstr "التوقيع"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "Signing and matching the sales contract"
|
||||
msgstr "توقيع ومطابقة عقد البيع"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "Tax Amount"
|
||||
msgstr "قيمة الضريبة"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receipt_voucher_report
|
||||
msgid "Tax Cheque"
|
||||
msgstr "شيك الضريبة"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "Tax Invoice"
|
||||
msgstr "الفاتورة الضريبية"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "Tax Invoice Number"
|
||||
msgstr "رقم الفاتورة الضريبية"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receipt_voucher_report
|
||||
msgid "Tax exemption certificate"
|
||||
msgstr "شهادة إعفاء ضريبي"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.property_reservation_cheque_report
|
||||
msgid "Thanks You."
|
||||
msgstr "شكرا لكم.."
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.refund_request_report
|
||||
msgid "The apartment has been emptied."
|
||||
msgstr "تم إفراغ الوحدة السكنية."
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.property_reservation_cheque_report
|
||||
msgid ""
|
||||
"The customer issues a cheque certified by the bank with the above data."
|
||||
msgstr "يصدر العميل شيك مصدق من البنك بالبيانات أعلاه."
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.report_invoice_document_inherit
|
||||
msgid "To"
|
||||
msgstr "إلي"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receive_unit_report
|
||||
msgid "To receive Unit"
|
||||
msgstr "استلام وحدة سكنية"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "Unit"
|
||||
msgstr "الوحدة"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.refund_request_report
|
||||
msgid "Unit Details:"
|
||||
msgstr "تفاصيل الوحدة السكنية:"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.report_invoice_document_inherit
|
||||
msgid "Vat"
|
||||
msgstr "الرقم الضريبي"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "Verification Items"
|
||||
msgstr "بنود التحقق"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.receipt_voucher_report
|
||||
msgid "We are Khawald Real Estate Company, received from:"
|
||||
msgstr "نحن شركة خوالد العقارية، استلمنا من: "
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.property_reservation_cheque_report
|
||||
msgid "We inform you that the unit No. has been booked"
|
||||
msgstr "نفيدكم بأنه تم حجز الوحدة السكنية رقم "
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.property_reservation_cheque_report
|
||||
msgid ""
|
||||
"We kindly ask you to hand over a cheque in the amount of the deposit / the "
|
||||
"value of the price of the housing unit before"
|
||||
msgstr "نرجو منكم تسليم شيك بقيمة العربون / بقيمة ثمن الوحدة السكنية قبل تاريخ "
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.property_reservation_cheque_report
|
||||
msgid "and located in the district"
|
||||
msgstr "والواقع في حي "
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.property_reservation_cheque_report
|
||||
msgid "in the date"
|
||||
msgstr "في تاريخ "
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.property_reservation_cheque_report
|
||||
msgid "for a period of"
|
||||
msgstr "وذلك لمده "
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.property_reservation_cheque_report
|
||||
msgid "in order to avoid cancel the reservation."
|
||||
msgstr "تفادياً لإلغاء الحجز"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.property_reservation_cheque_report
|
||||
msgid "in project"
|
||||
msgstr "في مشروع"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.customer_Identi_without_image_report
|
||||
msgid ""
|
||||
"to take the data of the national identity card for official use with the "
|
||||
"first party, and I also acknowledge the validity of the information and data"
|
||||
" that it provided, and I bear any responsibility that may result from my "
|
||||
"failure to disclose any data that the agreement requires disclosure or its "
|
||||
"incorrectness. I have read, understood and accepted the terms and conditions"
|
||||
" of this Agreement and agree to be bound by its contents."
|
||||
msgstr "على أخذ بيانات بطاقة الهوية الوطنية للاستخدام الرسمي لدى الطرف الأول كما أقر بصحة المعلومات والبيانات التي قدمها وأتحمل أي مسؤولية قد تنتج عن عدم إفصاحي عن أي بيانات تتطلب الاتفاقية الإفصاح عنها أو عدم صحتها ولقد قرأت وفهمت وقبلت شروط هذه الاتفاقية أحكامها وأوافق على التقيد بما جاء فيها."
|
||||
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: code:addons/khwalid_real_estate_report/models/ir_actions_report.py:0
|
||||
#, python-format
|
||||
msgid "Printed only in state (draft, approve)."
|
||||
msgstr "تتم الطباعه في حاله (مبدئي، تم الحجز)."
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: code:addons/khwalid_real_estate_report/models/ir_actions_report.py:0
|
||||
#, python-format
|
||||
msgid "Printed only in state (register, approve)."
|
||||
msgstr "تتم الطباعه في حاله (مسجل، معتمد)."
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: code:addons/khwalid_real_estate_report/models/ir_actions_report.py:0
|
||||
#, python-format
|
||||
msgid "Printed only in state approve reservation."
|
||||
msgstr "تتم الطباعة في حاله تم الحجز."
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: code:addons/khwalid_real_estate_report/models/ir_actions_report.py:0
|
||||
#, python-format
|
||||
msgid "Printed only in state approve."
|
||||
msgstr "تتم الطباعه في حاله معتمد."
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: code:addons/khwalid_real_estate_report/models/ir_actions_report.py:0
|
||||
#, python-format
|
||||
msgid "Printed only in state cancel."
|
||||
msgstr "تتم الطباعه في حاله الإلغاء."
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: code:addons/khwalid_real_estate_report/models/ir_actions_report.py:0
|
||||
#, python-format
|
||||
msgid "Printed only in state return."
|
||||
msgstr "تتم الطباعه في حاله تم استرجاع العربون."
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: code:addons/khwalid_real_estate_report/models/ir_actions_report.py:0
|
||||
#, python-format
|
||||
msgid "Printed only in unit state emptied."
|
||||
msgstr "تتم الطباعه في حاله الوحدة تم الإخلاء."
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: code:addons/khwalid_real_estate_report/models/ir_actions_report.py:0
|
||||
#, python-format
|
||||
msgid "Only sell method in unit could be printed."
|
||||
msgstr "يتم طباعة طريقة البيع وحدة فقط"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "Exist"
|
||||
msgstr "يوجد"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "Exist (Tax Exemption)"
|
||||
msgstr "(يوجد (إعفاء ضريبي"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "Not Exist"
|
||||
msgstr "لا يوجد"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "Not Exist (Tax Exemption)"
|
||||
msgstr "(لا يوجد (إعفاء ضريبي"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "Instrument No. New"
|
||||
msgstr "رقم الصك الجديد"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "Instrument Date New"
|
||||
msgstr "تاريخ الصك الجديد"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "The new instrument file has been uploaded to the drive"
|
||||
msgstr "تم رفع ملف الصك الجديد على الدرايف"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "All original files have been returned to the accountant"
|
||||
msgstr "تم إعادة جميع الملفات الأصل إلى المحاسب"
|
||||
|
||||
#. module: khwalid_real_estate_report
|
||||
#: model_terms:ir.ui.view,arch_db:khwalid_real_estate_report.permission_empty_unit_report
|
||||
msgid "Tax"
|
||||
msgstr "الضريبة"
|
||||
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from . import ir_actions_report
|
||||
|
|
@ -0,0 +1,66 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from odoo import models, api, _
|
||||
from odoo.exceptions import UserError
|
||||
|
||||
class IrActionsReport(models.Model):
|
||||
_inherit = 'ir.actions.report'
|
||||
|
||||
|
||||
def _render_qweb_pdf(self, res_ids=None, data=None):
|
||||
|
||||
if self.model == 'property.reservation.payment' and res_ids:
|
||||
refund_reports = (self.env.ref('khwalid_real_estate_report.action_refund_request_pdf'))
|
||||
if self in refund_reports:
|
||||
reservation_payment_ids = self.env['property.reservation.payment'].browse(res_ids)
|
||||
if any(pay.state != 'return' for pay in reservation_payment_ids):
|
||||
raise UserError(_("Printed only in state return."))
|
||||
|
||||
if self.model == 'property.reservation' and res_ids:
|
||||
property_reservation_ids = self.env['property.reservation'].browse(res_ids)
|
||||
voucher_reports = (self.env.ref('khwalid_real_estate_report.action_receipt_voucher_pdf'))
|
||||
reservation_cheque_reports = (self.env.ref('khwalid_real_estate_report.action_property_reservation_cheque_pdf'))
|
||||
if self in voucher_reports:
|
||||
if any(prop.state != 'approve' for prop in property_reservation_ids):
|
||||
raise UserError(_("Printed only in state approve reservation."))
|
||||
|
||||
if self in reservation_cheque_reports:
|
||||
if any(prop.state == 'cancel' for prop in property_reservation_ids):
|
||||
raise UserError(_("Printed only in state (draft, approve)."))
|
||||
|
||||
if self.model == 're.sale' and res_ids:
|
||||
sale_ids = self.env['re.sale'].browse(res_ids)
|
||||
permission_empty_reports = (self.env.ref('khwalid_real_estate_report.action_permission_empty_unit'))
|
||||
cancel_sale_reports = (self.env.ref('khwalid_real_estate_report.action_cancel_sale_pdf'))
|
||||
receive_unit_reports = (self.env.ref('khwalid_real_estate_report.action_receive_unit_pdf'))
|
||||
customer_Identi_reports = (self.env.ref('khwalid_real_estate_report.action_customer_Identi_without_image_pdf'))
|
||||
|
||||
|
||||
if self in (permission_empty_reports, cancel_sale_reports, receive_unit_reports, customer_Identi_reports):
|
||||
if any(sale.sell_method != 'unit' for sale in sale_ids):
|
||||
raise UserError(_("Only sell method in unit could be printed."))
|
||||
|
||||
if self in permission_empty_reports:
|
||||
if any(sale.unit_id.state != 'emptied' and sale.state == 'approve' for sale in sale_ids):
|
||||
raise UserError(_("Printed only in unit state emptied."))
|
||||
|
||||
if self in cancel_sale_reports:
|
||||
if any(sale.state != 'cancel' for sale in sale_ids):
|
||||
raise UserError(_("Printed only in state cancel."))
|
||||
|
||||
if self in receive_unit_reports:
|
||||
if any(sale.state != 'approve' for sale in sale_ids):
|
||||
raise UserError(_("Printed only in state approve."))
|
||||
|
||||
if self in customer_Identi_reports:
|
||||
if any(sale.state not in ('register', 'approve') for sale in sale_ids):
|
||||
raise UserError(_("Printed only in state (register, approve)."))
|
||||
|
||||
|
||||
return super()._render_qweb_pdf(res_ids=res_ids, data=data)
|
||||
|
|
@ -0,0 +1,86 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
|
||||
<template id="customer_Identi_without_image_report">
|
||||
<t t-call="web.html_container">
|
||||
<t t-foreach="docs" t-as="doc">
|
||||
<div class="page">
|
||||
<t t-call="web.external_layout">
|
||||
<h2 class="text-center">Customer Identification without Image</h2> <br/>
|
||||
|
||||
<table class="table table-bordered">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Unit No.</strong></th>
|
||||
<th colspan="2" style="text-align: center; background-color:#e6e5e5;"><strong>Customer Name</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Mobile</strong></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<td style="text-align: center;"> <t t-esc="doc.unit_id.name"/> </td>
|
||||
<td colspan="2" style="text-align: center;"> <t t-esc="doc.partner_id.name"/> </td>
|
||||
<td style="text-align: center;"> <t t-esc="doc.partner_id.mobile"/> </td>
|
||||
</tbody>
|
||||
|
||||
<thead>
|
||||
<tr>
|
||||
<th colspan="4" style="text-align: center; background-color:#e6e5e5;"><strong>Identification Number/ Iqama</strong></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<td colspan="4" style="text-align: center;"> <t t-esc="doc.partner_id.identification_number"/> </td>
|
||||
</tbody>
|
||||
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Birth Date</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Identification Expiry Date</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Issuer</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Copy No.</strong></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<td style="text-align: center;"> <t t-esc="doc.partner_id.date_of_birth"/> </td>
|
||||
<td style="text-align: center;"> <t t-esc="doc.partner_id.identification_expiry_date"/> </td>
|
||||
<td style="text-align: center;"> <t t-esc="doc.partner_id.issuer"/> </td>
|
||||
<td style="text-align: center;"> <t t-esc="doc.partner_id.copy_no"/> </td>
|
||||
</tbody>
|
||||
|
||||
<thead>
|
||||
<tr>
|
||||
<th colspan="4" style="text-align: center; background-color:#e6e5e5;"><strong>The Confession</strong></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<td colspan="4"> <p> I agree, I am the second party buyer <t t-esc="doc.partner_id.name"/> to take the data of the national identity card for official use with the first party, and I also acknowledge the validity of the information and data that it provided, and I bear any responsibility that may result from my failure to disclose any data that the agreement requires disclosure or its incorrectness. I have read, understood and accepted the terms and conditions of this Agreement and agree to be bound by its contents.</p> <p> I acknowledge receipt of each of: </p> <t t-raw="doc.cusomer_confession"/></td>
|
||||
|
||||
</tbody>
|
||||
|
||||
<thead>
|
||||
<tr>
|
||||
<th colspan="2" style="text-align: center; background-color:#e6e5e5;"><strong>Purpose</strong></th>
|
||||
<th colspan="2" style="text-align: center; background-color:#e6e5e5;"><strong>Customer Signature</strong></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<td colspan="2" style="text-align: center;"> Sale Unit </td>
|
||||
<td colspan="2"> </td>
|
||||
</tbody>
|
||||
|
||||
|
||||
</table>
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
</template>
|
||||
<report
|
||||
id ="action_customer_Identi_without_image_pdf"
|
||||
model ="re.sale"
|
||||
string ="Customer Identification without Image"
|
||||
report_type ="qweb-pdf"
|
||||
name ="khwalid_real_estate_report.customer_Identi_without_image_report"
|
||||
file ="khwalid_real_estate_report.customer_Identi_without_image_report"
|
||||
/>
|
||||
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,187 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
|
||||
<template id="permission_empty_unit_report">
|
||||
<t t-call="web.html_container">
|
||||
<t t-foreach="docs" t-as="doc">
|
||||
<div class="page">
|
||||
<t t-call="web.external_layout">
|
||||
<h2 class="text-center">Permission to Empty a Residential Unit</h2> <br/>
|
||||
|
||||
<table class="table table-bordered">
|
||||
<tr>
|
||||
<td style="background-color:#e6e5e5;"> Project </td>
|
||||
<td colspan="2"> <t t-esc="doc.unit_id.project_id.name"/> </td>
|
||||
|
||||
<td style="background-color:#e6e5e5;"> Unit </td>
|
||||
<td colspan="2"> <t t-esc="doc.unit_id.name"/> </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td style="background-color:#e6e5e5;"> Owner </td>
|
||||
<td colspan="2"> <t t-esc="doc.unit_id.project_id.owner_id.name"/> </td>
|
||||
|
||||
<td style="background-color:#e6e5e5;"> Customer </td>
|
||||
<td colspan="2"> <t t-esc="doc.partner_id.name"/> </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Identification Number</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;" colspan="2"><strong>Mobile</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Identification Number</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;" colspan="2"><strong>Mobile</strong></th>
|
||||
</tr>
|
||||
<tbody>
|
||||
<td style="text-align: center;"> <t t-esc="doc.unit_id.project_id.owner_id.identification_number"/> </td>
|
||||
<td style="text-align: center;" colspan="2"> <t t-esc="doc.unit_id.project_id.owner_id.mobile"/> </td>
|
||||
<td style="text-align: center;"> <t t-esc="doc.partner_id.identification_number"/> </td>
|
||||
<td style="text-align: center;" colspan="2"> <t t-esc="doc.partner_id.mobile"/> </td>
|
||||
</tbody>
|
||||
|
||||
<tr>
|
||||
<td style="background-color:#e6e5e5;"> Instrument No. </td>
|
||||
<td colspan="2"> <t t-esc="doc.unit_id.stamping"/> </td>
|
||||
|
||||
<td style="background-color:#e6e5e5;"> Instrument Date </td>
|
||||
<td colspan="2"> <t t-esc="doc.unit_id.stamping_date"/> </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td style="background-color:#e6e5e5;"> Apartment Amount </td>
|
||||
<td><t t-esc="'%.2f'% doc.amount"/></td>
|
||||
|
||||
<td style="background-color:#e6e5e5;"> Tax Amount </td>
|
||||
<td> </td>
|
||||
|
||||
<td style="background-color:#e6e5e5;"> Tax Invoice Number </td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
|
||||
<table class="table table-bordered">
|
||||
<tr>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Cheque</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Payment Type</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Amount</strong></th>
|
||||
</tr>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="text-align: center; background-color:#e6e5e5;"> Cheque 1 </td>
|
||||
<td style="text-align: center;"> Deposit </td>
|
||||
<td style="text-align: center;">
|
||||
<t t-if="doc.reservation_id.reserve_type == 'with' "> Exist </t>
|
||||
<t t-if="doc.reservation_id.reserve_type != 'with' "> Not Exist </t>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align: center; background-color:#e6e5e5;"> Cheque 2 </td>
|
||||
<td style="text-align: center;"> Apartment Amount </td>
|
||||
<td style="text-align: center;"><t t-esc="'%.2f'% doc.amount"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align: center; background-color:#e6e5e5;"> Cheque 3 </td>
|
||||
<td style="text-align: center;"> Tax </td>
|
||||
<td style="text-align: center;">
|
||||
<t t-if="doc.reservation_id.tax_exemption == 'yes' "> Exist (Tax Exemption) </t>
|
||||
<t t-if="doc.reservation_id.tax_exemption == 'no' "> Not Exist (Tax Exemption) </t>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<table class="table table-bordered">
|
||||
<tr>
|
||||
<td colspan="4" style="text-align: center; background-color: #e6e5e5;"> Verification Items </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td width="5%"> </td>
|
||||
<td> Signing and matching the sales contract </td>
|
||||
|
||||
<td width="5%"> </td>
|
||||
<td> A copy of the financing contract </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td width="5%"> </td>
|
||||
<td> A copy of the housing unit cheque </td>
|
||||
|
||||
<td width="5%"> </td>
|
||||
<td> Cheque Deposit Origin </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td width="5%"> </td>
|
||||
<td> Tax exemption certificate </td>
|
||||
|
||||
<td width="5%"> </td>
|
||||
<td> A copy of the tax cheque </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td width="5%"> </td>
|
||||
<td> Tax Invoice </td>
|
||||
|
||||
<td width="5%"> </td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
<table class="table table-bordered">
|
||||
|
||||
<tr>
|
||||
<td style="background-color: #e6e5e5;"> Instrument No. New </td>
|
||||
<td width="20%"> <t t-esc="doc.unit_id.stamping_new"/> </td>
|
||||
|
||||
<td width="5%"></td>
|
||||
<td> The new instrument file has been uploaded to the drive</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td style="background-color: #e6e5e5;"> Instrument Date New </td>
|
||||
<td width="20%"><t t-esc="doc.unit_id.stamping_date_new"/></td>
|
||||
|
||||
<td width="5%"></td>
|
||||
<td> All original files have been returned to the accountant</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
|
||||
<table class="table table-bordered">
|
||||
|
||||
<tr>
|
||||
<td width="25%" style="background-color: #e6e5e5;"> Sales Employee </td>
|
||||
<td width="25%"> </td>
|
||||
|
||||
<td width="25%" style="background-color: #e6e5e5;"> Signature </td>
|
||||
<td width="25%"> </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td style="background-color: #e6e5e5;"> Agent Empty </td>
|
||||
<td> </td>
|
||||
|
||||
<td style="background-color: #e6e5e5;"> Signature </td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
</template>
|
||||
<report
|
||||
id ="action_permission_empty_unit"
|
||||
model ="re.sale"
|
||||
string ="Permission to Empty Unit"
|
||||
report_type ="qweb-pdf"
|
||||
name ="khwalid_real_estate_report.permission_empty_unit_report"
|
||||
file ="khwalid_real_estate_report.permission_empty_unit_report"
|
||||
/>
|
||||
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,94 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
|
||||
<template id="property_reservation_cheque_report">
|
||||
<t t-call="web.html_container">
|
||||
<t t-foreach="docs" t-as="doc">
|
||||
<div class="page">
|
||||
<t t-call="web.external_layout">
|
||||
<h2 class="text-center">Reservation and Cheque Details</h2><br/>
|
||||
|
||||
<p>Dear Customer:</p>
|
||||
<p>We inform you that the unit No. has been booked <b><span t-esc="doc.unit_id.name"/></b> in project <b><span t-esc="doc.property_id.name"/></b> and located in the district <b><span t-esc="doc.unit_id.district_id.name"/></b> in the date <b><span t-esc="doc.request_date"/></b> for a period of <b><span t-esc="doc.total_days"/></b> </p>
|
||||
<p>We kindly ask you to hand over a cheque in the amount of the deposit / the value of the price of the housing unit before <b><span t-esc="doc.end_date"/></b> in order to avoid cancel the reservation. </p>
|
||||
|
||||
<p>Attached is the cheque details below. </p>
|
||||
<p>Thanks You. </p>
|
||||
<span>Unit Details: </span>
|
||||
<table class="table table-bordered">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Project</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>District</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Unit</strong></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<td style="text-align: center;"> <t t-esc="doc.property_id.name"/> </td>
|
||||
<td style="text-align: center;"> <t t-esc="doc.unit_id.district_id.name"/> </td>
|
||||
<td style="text-align: center;"> <t t-esc="doc.unit_id.name"/> </td>
|
||||
</tbody>
|
||||
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Unit Amount</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Tax</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Reserve Type</strong></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<td style="text-align: center;"> <t t-esc="'%.2f'% doc.total_price"/> </td>
|
||||
<td style="text-align: center;"> <t t-esc="doc.unit_id.district_id.name"/> </td>
|
||||
<td style="text-align: center;"> <t t-esc="doc.reserve_type"/> </td>
|
||||
</tbody>
|
||||
|
||||
<thead>
|
||||
<tr>
|
||||
<th colspan="2" style="text-align: center; background-color:#e6e5e5;"><strong>Down Payment Amount</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Discount</strong></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<td colspan="2" style="text-align: center;"> <t t-esc="doc.payment_amount"/> </td>
|
||||
<td style="text-align: center;"> <t t-esc="doc.discount"/> </td>
|
||||
</tbody>
|
||||
|
||||
</table>
|
||||
|
||||
<span>Cheque Details: </span>
|
||||
<table class="table table-bordered">
|
||||
<tr>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Customer Name</strong></th>
|
||||
<td style="text-align: center;"><t t-esc="doc.partner_id.name"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Amount</strong></th>
|
||||
<td><t t-esc="'%.2f'% doc.total_price"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Purpose</strong></th>
|
||||
<td></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<span>Notes:</span>
|
||||
<ul>
|
||||
<li> The customer issues a cheque certified by the bank with the above data.</li>
|
||||
<li> Anyone who has a first home certificate is exempted from real estate tax for an amount of less than one million riyals.</li>
|
||||
</ul>
|
||||
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
</template>
|
||||
<report
|
||||
id ="action_property_reservation_cheque_pdf"
|
||||
model ="property.reservation"
|
||||
string ="Reservation and Cheque Details"
|
||||
report_type ="qweb-pdf"
|
||||
name ="khwalid_real_estate_report.property_reservation_cheque_report"
|
||||
file ="khwalid_real_estate_report.property_reservation_cheque_report"
|
||||
/>
|
||||
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
|
||||
<template id="receipt_voucher_report">
|
||||
<t t-call="web.html_container">
|
||||
<t t-foreach="docs" t-as="doc">
|
||||
<div class="page">
|
||||
<t t-call="web.external_layout">
|
||||
<h2 class="text-center">Receipt Voucher</h2> <br/>
|
||||
|
||||
<p>We are Khawald Real Estate Company, received from:</p>
|
||||
<p> Mr/ Mrs <b><span t-esc="doc.partner_id.name"/></b>, Identification Number <b><span t-esc="doc.identification_number"/></b>, Mobile <b><span t-esc="doc.mobile"/></b> </p>
|
||||
|
||||
<p> Amount of <b><span t-esc="'%.2f'% doc.total_price"/></b> <span t-esc="doc.env.company.currency_id.amount_to_text(doc.total_price)"/> </p>
|
||||
|
||||
<table class="table">
|
||||
<tr>
|
||||
<th style="text-align: center;"><strong>Cheque No.</strong></th>
|
||||
<td> <span t-esc="doc.client_check_number"/> </td>
|
||||
|
||||
<th style="text-align: center;"><strong>Bank</strong></th>
|
||||
<td> <span t-esc="doc.bank_id.name"/> </td>
|
||||
|
||||
<th style="text-align: center;"><strong>Date</strong></th>
|
||||
<td> <span t-esc="doc.request_date"/> </td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<p>And this price of unit <b><span t-esc="doc.unit_id.name"/></b>, project <b><span t-esc="doc.unit_id.project_id.name"/></b>, <b><span t-esc="doc.unit_id.city_id.name"/></b>, district <b><span t-esc="doc.unit_id.district_id.name"/></b></p>
|
||||
|
||||
<p>And we received it: </p>
|
||||
<ul style="list-style-type:square;">
|
||||
<li t-if="doc.tax_exemption == 'yes' "> Tax exemption certificate </li>
|
||||
<li t-if="doc.tax_exemption == 'no'" > Tax Cheque </li>
|
||||
</ul>
|
||||
|
||||
<table class="table">
|
||||
<tr>
|
||||
<th style="text-align: center;"><strong>Receiver: </strong></th>
|
||||
<td> </td>
|
||||
|
||||
<th style="text-align: center;"><strong>Receiver Signature: </strong></th>
|
||||
<td> </td>
|
||||
|
||||
<th style="text-align: center;"><strong>Buyer Signature: </strong></th>
|
||||
<td> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
</template>
|
||||
<report
|
||||
id ="action_receipt_voucher_pdf"
|
||||
model ="property.reservation"
|
||||
string ="Receipt Voucher"
|
||||
report_type ="qweb-pdf"
|
||||
name ="khwalid_real_estate_report.receipt_voucher_report"
|
||||
file ="khwalid_real_estate_report.receipt_voucher_report"
|
||||
/>
|
||||
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,207 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
|
||||
<template id="receive_unit_report">
|
||||
<t t-call="web.html_container">
|
||||
<t t-foreach="docs" t-as="doc">
|
||||
<div class="page">
|
||||
<t t-call="web.external_layout">
|
||||
<!-- <style>
|
||||
.line {
|
||||
width: 112px;
|
||||
height: 47px;
|
||||
border-bottom: 1px solid red;
|
||||
transform: translateY(-20px) translateX(5px) rotate(27deg);
|
||||
position: absolute;
|
||||
z-index: -1;
|
||||
}
|
||||
</style> -->
|
||||
<h2 class="text-center">To receive Unit</h2> <br/>
|
||||
|
||||
<table class="table table-bordered">
|
||||
<thead>
|
||||
<tr>
|
||||
<th colspan="2" style="text-align: center; background-color:#e6e5e5;"><strong>Customer Name</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Project</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>District</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Unit No.</strong></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<td colspan="2" style="text-align: center;"> <t t-esc="doc.partner_id.name"/> </td>
|
||||
<td style="text-align: center;"> <t t-esc="doc.unit_id.project_id.name"/> </td>
|
||||
<td style="text-align: center;"> <t t-esc="doc.unit_id.district_id.name"/> </td>
|
||||
<td style="text-align: center;"> <t t-esc="doc.unit_id.name"/> </td>
|
||||
</tbody>
|
||||
|
||||
</table>
|
||||
|
||||
<table class="table table-bordered">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"> Section</th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Paint</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Windows</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Tiles</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Lighting</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Air Conditioner Electricity</strong></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="text-align: center; background-color:#e6e5e5;"><strong>Council</strong></td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align: center; background-color:#e6e5e5;"><strong>Hall</strong></td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td style="text-align: center; background-color:#e6e5e5;"><strong>Bedroom 1</strong></td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align: center; background-color:#e6e5e5;"><strong>Bedroom 2</strong></td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td style="text-align: center; background-color:#e6e5e5;"><strong>Master Bedroom</strong></td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<table class="table table-bordered">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"> Section</th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Shower and Rinse</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Siphon</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Heater</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Suction Fan</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Ourity</strong></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="text-align: center; background-color:#e6e5e5;"><strong>Majlis Bath</strong></td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align: center; background-color:#e6e5e5;"><strong>Service Bath</strong></td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td style="text-align: center; background-color:#e6e5e5;"><strong>Master Bedroom Bath</strong></td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align: center; background-color:#e6e5e5;"><strong> Maid's Bath </strong></td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<table class="table table-bordered">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Section</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Paint</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Valve</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Heater</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Suction Fan</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Ourity</strong></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<td style="text-align: center; background-color:#e6e5e5;"> Kitchen </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
<td style="text-align: center;"> </td>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<br/>
|
||||
<table class="table table-bordered">
|
||||
<thead>
|
||||
<tr>
|
||||
<th colspan="6" style="text-align: center; background-color:#e6e5e5;"><strong>Notes</strong></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<td colspan="6"></td>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<table class="table table-bordered">
|
||||
<tr>
|
||||
<td style="text-align: center; background-color:#e6e5e5;"><strong>Sales Employee</strong></td>
|
||||
<td colspan="2"> </td>
|
||||
|
||||
<td style="text-align: center; background-color:#e6e5e5;"><strong>Signature</strong></td>
|
||||
<td colspan="2"> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align: center; background-color:#e6e5e5;"><strong>Customer</strong></td>
|
||||
<td colspan="2"> </td>
|
||||
|
||||
<td style="text-align: center; background-color:#e6e5e5;"><strong>Signature</strong></td>
|
||||
<td colspan="2"> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
</template>
|
||||
<report
|
||||
id ="action_receive_unit_pdf"
|
||||
model ="re.sale"
|
||||
string ="Receive Unit"
|
||||
report_type ="qweb-pdf"
|
||||
name ="khwalid_real_estate_report.receive_unit_report"
|
||||
file ="khwalid_real_estate_report.receive_unit_report"
|
||||
/>
|
||||
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,121 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
|
||||
<template id="report_refund_deposit">
|
||||
<t t-call="web.html_container">
|
||||
<t t-foreach="docs" t-as="o">
|
||||
<t t-call="khwalid_real_estate_report.refund_request_report"/>
|
||||
</t>
|
||||
</t>
|
||||
</template>
|
||||
|
||||
<template id="report_cancel_sale">
|
||||
<t t-call="web.html_container">
|
||||
<t t-foreach="docs" t-as="o">
|
||||
<t t-call="khwalid_real_estate_report.refund_request_report"/>
|
||||
</t>
|
||||
</t>
|
||||
</template>
|
||||
|
||||
<template id="refund_request_report">
|
||||
<t t-call="web.html_container">
|
||||
<t t-foreach="docs" t-as="doc">
|
||||
<div class="page">
|
||||
<t t-call="web.external_layout">
|
||||
<h2 class="text-center">Refund Request</h2> <br/>
|
||||
|
||||
<p>Unit Details: </p>
|
||||
<table class="table table-bordered">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Project Name</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Property No.</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Unit No.</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Sale Price</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Return Type</strong></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<td style="text-align: center;"> <t t-esc="doc.unit_id.project_id.name"/> </td>
|
||||
<td style="text-align: center;"> <t t-esc="doc.unit_id.property_id.name"/> </td>
|
||||
<td style="text-align: center;"> <t t-esc="doc.unit_id.name"/> </td>
|
||||
<td style="text-align: center;">
|
||||
<t t-if="doc._name == 'property.reservation.payment' " t-esc="'%.2f'% doc.reservation_id.total_price"/>
|
||||
<t t-if="doc._name == 're.sale' " t-esc="'%.2f'% doc.amount"/>
|
||||
</td>
|
||||
<td t-if="doc._name == 'property.reservation.payment' " style="text-align: center;"> Deposit </td>
|
||||
<td t-if="doc._name == 're.sale' " style="text-align: center;"> Cancellation of the sale. </td>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<p>Customer Details: </p>
|
||||
<table class="table table-bordered">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Customer Name</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Mobile</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Return Amount</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Voucher No.</strong></th>
|
||||
<th style="text-align: center; background-color:#e6e5e5;"><strong>Cheque Receipt Date</strong></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<td style="text-align: center;"> <t t-esc="doc.partner_id.name"/> </td>
|
||||
<td style="text-align: center;"> <t t-esc="doc.partner_id.mobile"/> </td>
|
||||
<td style="text-align: center;">
|
||||
<t t-if="doc._name == 'property.reservation.payment' " t-esc="'%.2f'% doc.return_amount"/>
|
||||
<t t-if="doc._name == 're.sale' " t-esc="'%.2f'% doc.amount"/>
|
||||
</td>
|
||||
<td style="text-align: center;"> <t t-esc="doc.move_id.name"/> </td>
|
||||
<td style="text-align: center;">
|
||||
<t t-if="doc._name == 'property.reservation.payment' " t-esc="doc.request_date"/>
|
||||
<t t-if="doc._name == 're.sale' " t-esc="doc.reservation_id.request_date"/>
|
||||
</td>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<span>Justifications for the refund request:</span>
|
||||
<ul style="list-style-type:square;">
|
||||
<li> The apartment has been emptied. </li>
|
||||
<li> Pay the first payment to the bank. </li>
|
||||
<li> Cancellation of the residential unit reservation with the consent of both parties. </li>
|
||||
<li> Cancellation of the sale of the housing unit with the consent of both parties. </li>
|
||||
</ul>
|
||||
|
||||
<table class="table table-bordered">
|
||||
<thead>
|
||||
<tr>
|
||||
<th colspan="6" style="text-align: center; background-color:#e6e5e5;"><strong>Reason for requesting refund</strong></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<td colspan="6"></td>
|
||||
</tbody>
|
||||
</table>
|
||||
<br/><br/><br/><br/>
|
||||
<p style="text-align: left;"> Sales Manager: </p>
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
</template>
|
||||
|
||||
<report
|
||||
id ="action_refund_request_pdf"
|
||||
model ="property.reservation.payment"
|
||||
string ="Refund Request"
|
||||
report_type ="qweb-pdf"
|
||||
name ="khwalid_real_estate_report.report_refund_deposit"
|
||||
file ="khwalid_real_estate_report.report_refund_deposit"
|
||||
/>
|
||||
|
||||
<report
|
||||
id ="action_cancel_sale_pdf"
|
||||
model ="re.sale"
|
||||
string ="Cancel Sale Request Unit"
|
||||
report_type ="qweb-pdf"
|
||||
name ="khwalid_real_estate_report.report_cancel_sale"
|
||||
file ="khwalid_real_estate_report.report_cancel_sale"
|
||||
/>
|
||||
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data>
|
||||
<template id="report_invoice_document_inherit" inherit_id="account.report_invoice_document">
|
||||
|
||||
<xpath expr="//t[@t-set='address']" position="replace"/>
|
||||
<xpath expr="//h2/span[7]" position="replace"/>
|
||||
<xpath expr="//div[@id='informations']" position="replace">
|
||||
<table class="table">
|
||||
<tr>
|
||||
<th>Invoice No</th>
|
||||
<td><span t-if="o.name != '/'" t-field="o.name"/> </td>
|
||||
|
||||
<th>Date</th>
|
||||
<td><span t-field="o.invoice_date"/> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>From</th>
|
||||
<td><span t-field="o.invoice_user_id.name"/> </td>
|
||||
|
||||
<th>Vat</th>
|
||||
<td><span t-field="o.company_id.vat"/> </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th>Address</th>
|
||||
<td><span t-field="o.partner_id.country_id.name"/>, <span t-field="o.partner_id.city"/>, <span t-field="o.partner_id.street"/>, <span t-field="o.partner_id.street2"/> </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th>To</th>
|
||||
<td><span t-field="o.partner_id.name"/> </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th>Vat</th>
|
||||
<td><span t-field="o.partner_id.vat"/> </td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
<br/>
|
||||
</xpath>
|
||||
<xpath expr="//th[@name='th_quantity']" position="replace"/>
|
||||
<xpath expr="//table/tbody/t[3]/tr/t/td[2]" position="replace"/>
|
||||
|
||||
<xpath expr="//div[@class='clearfix']" position="after">
|
||||
<table class="table table-sm" style="page-break-inside: avoid;">
|
||||
<tr>
|
||||
<td><strong>Salesperson</strong></td>
|
||||
<td class="text-right">
|
||||
<span class="text-nowrap" t-field="o.invoice_user_id.name"/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Signature</strong></td>
|
||||
<td class="text-right"> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</xpath>
|
||||
|
||||
</template>
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from . import models
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
{
|
||||
'name': "Project Management Custom",
|
||||
'summary': """Organize and plan your real estate in project""",
|
||||
'description': """ """,
|
||||
'author': 'Expert Co. Ltd.',
|
||||
'website': 'http://exp-sa.com',
|
||||
'category': 'Odex25-Realstate/Odex25-Realstate',
|
||||
'version': '0.1',
|
||||
'depends': ['project', 'country_city'],
|
||||
'data': [
|
||||
'security/ir.model.access.csv',
|
||||
'data/ir_sequence_data.xml',
|
||||
'views/subcontractor_installment_view.xml',
|
||||
'views/project_custom_views.xml',
|
||||
'views/work_item_view.xml',
|
||||
'views/project_estimated_quantities_view.xml',
|
||||
'views/project_config_view.xml',
|
||||
'views/res_partner_inherit.xml',
|
||||
'views/project_main_menus.xml',
|
||||
'views/engineering_office_view.xml',
|
||||
'views/project_payment_view.xml',
|
||||
'views/subcontractor_office_view.xml',
|
||||
],
|
||||
'installable': True,
|
||||
'application': False,
|
||||
}
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<data>
|
||||
|
||||
<record id="sequence_project_seq" model="ir.sequence">
|
||||
<field name="name">Project</field>
|
||||
<field name="code">project.project</field>
|
||||
<field name="prefix">PJ:%(y)s/%(month)s/</field>
|
||||
<field name="padding">3</field>
|
||||
<field name="company_id" eval="False"/>
|
||||
<field name="number_increment" eval="1"/>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="sequence_project_eng_office_payment_seq" model="ir.sequence">
|
||||
<field name="name">Project Eng office Payment</field>
|
||||
<field name="code">project.payment.request.eng</field>
|
||||
<field name="prefix">EPA/%(range_year)s/</field>
|
||||
<field name="padding">5</field>
|
||||
<field name="company_id" eval="False"/>
|
||||
<field name="number_increment" eval="1"/>
|
||||
</record>
|
||||
|
||||
<record id="sequence_project_subcontractor_payment_seq" model="ir.sequence">
|
||||
<field name="name">Project SubContractor Payment</field>
|
||||
<field name="code">project.payment.request.subcontract</field>
|
||||
<field name="prefix">SPA/%(range_year)s/</field>
|
||||
<field name="padding">5</field>
|
||||
<field name="company_id" eval="False"/>
|
||||
<field name="number_increment" eval="1"/>
|
||||
</record>
|
||||
|
||||
|
||||
</data>
|
||||
</odoo>
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,16 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from . import subcontractor_work
|
||||
from . import engineering_office
|
||||
from . import project_estimated_quantities
|
||||
from . import work_tem
|
||||
from . import project_custom
|
||||
from . import project_conf
|
||||
from . import res_partner
|
||||
from . import project_payment
|
||||
|
|
@ -0,0 +1,78 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from odoo import models, fields, api, _
|
||||
from odoo.exceptions import ValidationError, UserError
|
||||
|
||||
|
||||
class EngineeringOfficePayment(models.Model):
|
||||
_name = 'engineering.office.line'
|
||||
_inherit = ['mail.thread', 'mail.activity.mixin']
|
||||
_description = "Engineering Office Line"
|
||||
_order = 'project_id, id, name'
|
||||
_check_company_auto = True
|
||||
|
||||
|
||||
name = fields.Char(string="Description")
|
||||
project_id = fields.Many2one('project.project', string="project", ondelete='cascade', index=True, copy=False)
|
||||
engineering_office_id = fields.Many2one('res.partner', related='project_id.engineering_office_id',
|
||||
string="Engineering Office", store=True)
|
||||
percent = fields.Float(string="Percentage")
|
||||
amount = fields.Float(string="Amount", compute="get_amount", store=True)
|
||||
payment_id = fields.Many2one('project.payment.request', string="Eng Office Payment")
|
||||
paid = fields.Boolean(string="Paid")
|
||||
paid_date = fields.Date(string="Payment Date", )
|
||||
due_date = fields.Date(string="Due Date", )
|
||||
display_type = fields.Selection([
|
||||
('line_section', "Section"),
|
||||
('line_note', "Note")], default=False, help="Technical field for UX purpose.")
|
||||
|
||||
@api.model_create_multi
|
||||
def create(self, vals_list):
|
||||
for values in vals_list:
|
||||
if values.get('display_type', self.default_get(['display_type'])['display_type']):
|
||||
values.update(percent=False, due_date=False, )
|
||||
return super(EngineeringOfficePayment, self).create(vals_list)
|
||||
|
||||
def write(self, values):
|
||||
if 'display_type' in values and self.filtered(lambda line: line.display_type != values.get('display_type')):
|
||||
raise UserError(_(
|
||||
"You cannot change the type of a Engeerning Office line. Instead you should delete the current line and create a new line of the proper type."))
|
||||
return super(EngineeringOfficePayment, self).write(values)
|
||||
|
||||
def create_office_payment(self):
|
||||
vals = {}
|
||||
payment_obj = self.env['project.payment.request']
|
||||
for record in self:
|
||||
vals = {
|
||||
'sequence': '/',
|
||||
'name': record.name or '/',
|
||||
'project_id': record.project_id.id,
|
||||
'delivery_date': record.due_date,
|
||||
'type': 'eng_office',
|
||||
'state': 'draft',
|
||||
'partner_id': record.engineering_office_id.id,
|
||||
'amount': record.amount,
|
||||
'eng_office_installment_id': self.id,
|
||||
}
|
||||
payment_id = payment_obj.create(vals)
|
||||
record.payment_id = payment_id.id
|
||||
return True
|
||||
|
||||
@api.constrains('percent')
|
||||
def check_percent(self):
|
||||
for rec in self:
|
||||
if rec.percent < 0.0:
|
||||
raise ValidationError(_('Percentage Cannot be less than zero'))
|
||||
|
||||
@api.depends('project_id', 'project_id.engineering_contract_amount', 'percent')
|
||||
def get_amount(self):
|
||||
for rec in self:
|
||||
if rec.project_id and rec.project_id.engineering_contract_amount > 0.0 and not rec.display_type:
|
||||
rec.amount = rec.project_id.engineering_contract_amount * (rec.percent / 100)
|
||||
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from odoo import models, fields
|
||||
|
||||
|
||||
class Branches(models.Model):
|
||||
_name = 'res.branches'
|
||||
_description = "Branches"
|
||||
|
||||
name = fields.Char(string="Name")
|
||||
manager_id = fields.Many2one('res.users', string="Supervisor")
|
||||
|
||||
|
||||
class ProjectTaskType(models.Model):
|
||||
_inherit = 'project.task.type'
|
||||
|
||||
case_default = fields.Boolean(string="Default in new project")
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,213 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from datetime import datetime, date
|
||||
from odoo import models, fields, api, _
|
||||
from odoo.exceptions import ValidationError
|
||||
|
||||
|
||||
class ProjectCustom(models.Model):
|
||||
_inherit = 'project.project'
|
||||
_description = "Real Estate Project"
|
||||
|
||||
def _get_task_type(self):
|
||||
"""
|
||||
:return: project task type if it default
|
||||
"""
|
||||
type_ids = self.env['project.task.type'].search([('case_default', '=', True)])
|
||||
return type_ids
|
||||
|
||||
code = fields.Char(string="Code")
|
||||
project_type = fields.Selection([('with_bone', 'With Bone'),
|
||||
('without_bone', 'Without Bone'),
|
||||
('finishing', 'Finishing')], string="Project Type", default='with_bone')
|
||||
project_owner_type = fields.Selection([('company', 'Company'),
|
||||
('investment', 'Investment')], string="Owner Type")
|
||||
branch_id = fields.Many2one('res.branches', string="Branch")
|
||||
member_ids = fields.Many2many('res.users', string="Project Member")
|
||||
date_start = fields.Date(string="Start Date")
|
||||
date_end = fields.Date(string="End Date")
|
||||
# attachment_ids = fields.One2many('ir.attachment', 'project_id', string="Attachment")
|
||||
type_ids = fields.Many2many('project.task.type', 'project_task_type_rel', 'project_id', 'type_id',
|
||||
string='Tasks Stages', default=_get_task_type)
|
||||
engineering_office_id = fields.Many2one('res.partner', string="Engineering Office")
|
||||
engineering_contract_amount = fields.Float(string="Contract Value")
|
||||
engineering_contract_balance = fields.Float(string="Engineering Contract Balance", compute="get_contract_balance")
|
||||
engineering_office_line_ids = fields.One2many('engineering.office.line', 'project_id',
|
||||
string="Engineering Office Payment", copy=True, auto_join=True)
|
||||
project_estimated_quantities_ids = fields.One2many('project.estimated.quantities', 'project_id',
|
||||
string="Project Estimated Quantities")
|
||||
project_expenses_account_id = fields.Many2one('account.account', string='Project Expenses Account')
|
||||
project_investment_account_id = fields.Many2one('account.account', string='Project Investment Account')
|
||||
discount_account_id = fields.Many2one('account.account', string='Discount Account')
|
||||
subcontractor_work_ids = fields.One2many('subcontractor.work','project_id', string="Subcontractor")
|
||||
spayment_counts = fields.Integer(string='Subcontractor Payment', compute='count_payment_number')
|
||||
epayment_counts = fields.Integer(string='Engineering Payment', compute='count_payment_number')
|
||||
sinstallment_count = fields.Integer(string='Subcontractor Installment', compute='count_installment')
|
||||
state = fields.Selection([('draft', 'Draft'),
|
||||
('in_progess', 'In Progress'),
|
||||
('done', 'Done'),
|
||||
('cancel', 'Cancelled'),], string="Status", default='draft')
|
||||
project_cost = fields.Float(string="Project Cost", compute="get_project_cost")
|
||||
estimated_cost = fields.Float(string="Estimated Cost", compute="get_project_cost")
|
||||
project_total_cost = fields.Float(string="Project Expected Cost")
|
||||
project_revenue = fields.Float(string="Project Revenue",compute="get_project_cost")
|
||||
street = fields.Char(string='Street', copy=False)
|
||||
city = fields.Many2one('re.city', string="City", copy=False)
|
||||
district = fields.Many2one('district',string="District", copy=False)
|
||||
|
||||
@api.depends('project_total_cost','subcontractor_work_ids', 'subcontractor_work_ids.contract_amount', 'project_estimated_quantities_ids', 'project_estimated_quantities_ids.total_estimated_qty', 'engineering_contract_amount')
|
||||
def get_project_cost(self):
|
||||
estimated_cost = 0.0
|
||||
project_cost = 0.0
|
||||
for rec in self:
|
||||
for line in rec.project_estimated_quantities_ids:
|
||||
estimated_cost += line.total_estimated_qty
|
||||
for subcontractor in rec.subcontractor_work_ids:
|
||||
project_cost += subcontractor.contract_amount
|
||||
project_cost += rec.engineering_contract_amount
|
||||
rec.project_cost = project_cost
|
||||
rec.estimated_cost = estimated_cost
|
||||
rec.project_revenue = rec.project_total_cost - rec.project_cost
|
||||
|
||||
|
||||
def _check_validations(self):
|
||||
for record in self:
|
||||
if record.engineering_contract_amount == 0.0:
|
||||
raise ValidationError(_("To Proceed,Contract Value Cannot be zero"))
|
||||
if not record.engineering_office_line_ids:
|
||||
raise ValidationError(_("To Proceed,Please Insert Engineering Office Payment"))
|
||||
if record.engineering_office_line_ids:
|
||||
due_date = record.engineering_office_line_ids.mapped('due_date')
|
||||
if len (due_date) == 1 and not due_date[0]:
|
||||
raise ValidationError(_("To Proceed,Please Insert Engineering Office Payment"))
|
||||
if not record.project_estimated_quantities_ids:
|
||||
raise ValidationError(_("To Proceed,Please Insert Project Estimated Quantities"))
|
||||
if not record.subcontractor_work_ids:
|
||||
raise ValidationError(_("To Proceed,Please Insert Subcontractor"))
|
||||
|
||||
def action_submit(self):
|
||||
self._check_validations()
|
||||
self.state = 'in_progess'
|
||||
|
||||
def action_done(self):
|
||||
paid = True
|
||||
contract_installment = self.env['subcontractor.installment'].search([('project_id', '=', self.id)])
|
||||
# Check Contractor Payment
|
||||
for payment in contract_installment.installment_line_ids:
|
||||
if not payment.paid:
|
||||
paid = False
|
||||
# Check Engineering Payment
|
||||
for engineering_payment in self.engineering_office_line_ids:
|
||||
if not engineering_payment.paid:
|
||||
paid = False
|
||||
if paid:
|
||||
self.state = 'done'
|
||||
|
||||
elif not paid:
|
||||
raise ValidationError(_("Please Check Project Payment first To Mark This Project as Done"))
|
||||
|
||||
def action_draft(self):
|
||||
self.state = 'draft'
|
||||
|
||||
|
||||
def action_cancel(self):
|
||||
self.state = 'cancel'
|
||||
|
||||
def get_subcontractor_payment(self):
|
||||
subcontractor_payment_ids = self.env['project.payment.request'].search([('project_id', '=', self.id),
|
||||
('type', '=', 'subcontractor')])
|
||||
form_id = self.env.ref('project_management_custom.project_payment_request_view_forms').id
|
||||
tree_id = self.env.ref('project_management_custom.project_payment_request_view_tree').id
|
||||
domain = [('id', 'in', subcontractor_payment_ids.ids)]
|
||||
return {
|
||||
'name': _('Subcontractor Payment'),
|
||||
'view_type': 'form',
|
||||
'view_mode': 'form',
|
||||
'res_model': 'project.payment.request',
|
||||
'views': [(tree_id, 'tree'), (form_id, 'form')],
|
||||
'type': 'ir.actions.act_window',
|
||||
'target': 'current',
|
||||
'domain': domain,
|
||||
}
|
||||
|
||||
def get_engineering_payment(self):
|
||||
engineering_payment_ids = self.env['project.payment.request'].search([('project_id', '=', self.id),
|
||||
('type', '=', 'eng_office')])
|
||||
form_id = self.env.ref('project_management_custom.project_payment_request_view_forms').id
|
||||
domain = [('id', 'in', engineering_payment_ids.ids)]
|
||||
return {
|
||||
'name': _('Engineering Office Payment'),
|
||||
'view_type': 'form',
|
||||
'view_mode': 'form',
|
||||
'res_model': 'project.payment.request',
|
||||
'views': [(False, 'tree'), (form_id, 'form')],
|
||||
'type': 'ir.actions.act_window',
|
||||
'target': 'current',
|
||||
'domain': domain,
|
||||
}
|
||||
|
||||
def get_subcontractor_installment(self):
|
||||
subcontractor_installment_ids = self.env['subcontractor.installment'].search(
|
||||
[('project_id', '=', self.id)])
|
||||
form_id = self.env.ref('project_management_custom.subcontractor_installment_form').id
|
||||
domain = [('id', 'in', subcontractor_installment_ids.ids)]
|
||||
return {
|
||||
'name': _('Subcontractor Installment'),
|
||||
'view_type': 'form',
|
||||
'view_mode': 'form',
|
||||
'res_model': 'subcontractor.installment',
|
||||
'views': [(False, 'tree'), (form_id, 'form')],
|
||||
'type': 'ir.actions.act_window',
|
||||
'target': 'current',
|
||||
'domain': domain,
|
||||
}
|
||||
|
||||
def count_installment(self):
|
||||
sinstallment_count = self.env['subcontractor.installment'].search_count([('project_id', '=', self.id)])
|
||||
self.sinstallment_count = sinstallment_count
|
||||
|
||||
def count_payment_number(self):
|
||||
spayment_count = self.env['project.payment.request'].search_count([('project_id', '=', self.id),
|
||||
('type', '=', 'subcontractor')])
|
||||
epayment_count = self.env['project.payment.request'].search_count([('project_id', '=', self.id),
|
||||
('type', '=', 'eng_office')])
|
||||
|
||||
self.spayment_counts = spayment_count
|
||||
self.epayment_counts = epayment_count
|
||||
|
||||
|
||||
@api.depends('engineering_office_line_ids', 'engineering_office_line_ids.amount',
|
||||
'engineering_office_line_ids.paid')
|
||||
def get_contract_balance(self):
|
||||
for rec in self:
|
||||
paid_amount = sum([line.amount if line.paid == True else 0.0 for line in rec.engineering_office_line_ids])
|
||||
rec.engineering_contract_balance = rec.engineering_contract_amount - paid_amount
|
||||
|
||||
@api.constrains('engineering_contract_amount')
|
||||
def check_amount(self):
|
||||
for rec in self:
|
||||
if rec.engineering_contract_amount < 0.0:
|
||||
raise ValidationError(_("Contract Value Cannot be less than zero"))
|
||||
|
||||
@api.constrains('engineering_office_line_ids', 'engineering_office_line_ids.amount')
|
||||
def check_total(self):
|
||||
for rec in self:
|
||||
line_amount = sum([line.amount for line in rec.engineering_office_line_ids])
|
||||
if rec.engineering_office_line_ids:
|
||||
for line in rec.engineering_office_line_ids:
|
||||
if line_amount > rec.engineering_contract_amount or line_amount < rec.engineering_contract_amount and not line.display_type:
|
||||
raise ValidationError(
|
||||
_("Please Check Payment Line Must Be equal to %s") % rec.engineering_contract_amount)
|
||||
|
||||
|
||||
# class IrAttachment(models.Model):
|
||||
# _inherit = "ir.attachment"
|
||||
# _description = "Project Attachment"
|
||||
|
||||
# project_id = fields.Many2one('project.project', string="Project")
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from odoo import models, fields, api, _
|
||||
from odoo.exceptions import UserError
|
||||
|
||||
class ProjectEstimatedQuantities(models.Model):
|
||||
_name = 'project.estimated.quantities'
|
||||
_description = "Project Estimated Quantities"
|
||||
_inherit = ['mail.thread', 'mail.activity.mixin']
|
||||
|
||||
@api.model_create_multi
|
||||
def create(self, vals_list):
|
||||
for values in vals_list:
|
||||
if values.get('display_type', self.default_get(['display_type'])['display_type']):
|
||||
values.update(quantity=False, uom_id=False, unit_price=False, )
|
||||
return super(ProjectEstimatedQuantities, self).create(vals_list)
|
||||
|
||||
def write(self, values):
|
||||
if 'display_type' in values and self.filtered(lambda line: line.display_type != values.get('display_type')):
|
||||
raise UserError(_(
|
||||
"You cannot change the type of a Project Estimated Quantities. Instead you should delete the current line and create a new line of the proper type."))
|
||||
return super(ProjectEstimatedQuantities, self).write(values)
|
||||
|
||||
work_item_id = fields.Many2one('work.item', string="Work item")
|
||||
name = fields.Char(string='Description')
|
||||
sub_work_item_id = fields.Many2one('sub.work.item', string='Sub work item')
|
||||
work_detail_id = fields.Many2one('detailed.work.item', string="Detailed Work item")
|
||||
work_attached_id = fields.Many2one('work.attached', string="Work Attached")
|
||||
quantity = fields.Float(string="Quantity", default=1, digits=(16, 2))
|
||||
uom_id = fields.Many2one('uom.uom', string="Unit of measure")
|
||||
unit_price = fields.Float(string="Unit Price", digits=(16, 2))
|
||||
total_estimated_qty = fields.Float(string="Total estimated quantity", compute='compute_total', digits=(16, 2))
|
||||
project_id = fields.Many2one("project.project", string="Project")
|
||||
subcontractor_id = fields.Many2one("subcontractor.work", sgtring="Subcontractor ")
|
||||
from_subcontractor = fields.Boolean(string="Line Created From Subcontractor Work")
|
||||
duplicated = fields.Boolean(string="Duplicated")
|
||||
description = fields.Char(string="Work Description")
|
||||
work_amount = fields.Float(string="Subcontractor Work Amount")
|
||||
display_type = fields.Selection([
|
||||
('line_section', "Section"),
|
||||
('line_note', "Note")], default=False, help="Technical field for UX purpose.")
|
||||
|
||||
@api.onchange('work_item_id')
|
||||
def onchange_work_item(self):
|
||||
for record in self:
|
||||
record.sub_work_item_id = False
|
||||
record.work_detail_id = False
|
||||
|
||||
@api.onchange('sub_work_item_id')
|
||||
def onchange_sub_work_item(self):
|
||||
for record in self:
|
||||
record.work_detail_id = False
|
||||
|
||||
@api.depends('quantity', 'unit_price')
|
||||
def compute_total(self):
|
||||
price_unit = 0.0
|
||||
for record in self:
|
||||
record.total_estimated_qty = round(record.quantity * record.unit_price, 2)
|
||||
|
|
@ -0,0 +1,173 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from datetime import datetime, date
|
||||
from odoo import models, fields, api, _
|
||||
from odoo.exceptions import UserError
|
||||
|
||||
|
||||
class ProjectPaymentRequest(models.Model):
|
||||
_name = 'project.payment.request'
|
||||
_inherit = ['mail.thread', 'mail.activity.mixin']
|
||||
|
||||
def create(self, vals):
|
||||
if vals.get('sequence') == '/':
|
||||
if vals.get('type') == 'subcontractor':
|
||||
vals['sequence'] = self.env['ir.sequence'].next_by_code('project.payment.request.subcontract') or ('/')
|
||||
else :
|
||||
vals['sequence'] = self.env['ir.sequence'].next_by_code('project.payment.request.eng') or ('/')
|
||||
result = super(ProjectPaymentRequest, self).create(vals)
|
||||
return result
|
||||
|
||||
@api.returns('self', lambda value: value.id)
|
||||
def copy(self, default=None):
|
||||
raise UserError(_('You cannot duplicate project payment.'))
|
||||
|
||||
def unlink(self):
|
||||
raise UserError(_('You cannot Delete project payment.'))
|
||||
|
||||
|
||||
@api.model
|
||||
def name_get(self):
|
||||
"""
|
||||
:return:
|
||||
"""
|
||||
res = []
|
||||
for rec in self:
|
||||
order_name = rec.sequence
|
||||
if order_name:
|
||||
order_name = order_name + ' |' + str(rec.name)
|
||||
res.append((rec.id, order_name))
|
||||
return res
|
||||
|
||||
@api.model
|
||||
def name_search(self, name='', args=None, operator='ilike', limit=80):
|
||||
args = args or []
|
||||
records = self.search(
|
||||
['|', ('sequence', operator, name), ('name', operator, name)] + args,
|
||||
limit=limit)
|
||||
return records.name_get()
|
||||
|
||||
sequence = fields.Char(string='Sequence', default='/')
|
||||
name = fields.Char(string='Description')
|
||||
project_id = fields.Many2one('project.project', string='Project')
|
||||
date = fields.Date(string='Date')
|
||||
delivery_date = fields.Date(string='Delivery Data')
|
||||
type = fields.Selection([('subcontractor', 'Subcontractor'),
|
||||
('eng_office', 'Engineering Office')], string='Payment Type', default='eng_office')
|
||||
state = fields.Selection([('draft', 'Draft'),
|
||||
('submit', 'Submit'),
|
||||
('approve', 'To Pay'),
|
||||
('done', 'Paid'),
|
||||
('cancel', 'Cancel')], string='State', default='draft')
|
||||
partner_id = fields.Many2one('res.partner', string='Partner')
|
||||
amount = fields.Float(string='Amount',digits=(16, 2))
|
||||
eng_office_installment_id = fields.Many2one('engineering.office.line',string='Engineering Office Installment')
|
||||
subcontractor_line_id = fields.Many2one('subcontractor.work.line',string='Contractor Installment')
|
||||
account_move_id = fields.Many2one('account.move',string='Account Move')
|
||||
penalty_amount = fields.Float(string="Penalty Amount")
|
||||
flag = fields.Boolean(string="Flag")
|
||||
company_id = fields.Many2one('res.company', string='Company', required=True, default=lambda self: self.env.company)
|
||||
|
||||
def _get_delay_details(self):
|
||||
amount = 0.0
|
||||
for record in self:
|
||||
if record.subcontractor_line_id:
|
||||
for line in record.subcontractor_line_id:
|
||||
amount += line.penalty_amount
|
||||
record.penalty_amount = amount
|
||||
|
||||
def expect_penalty(self):
|
||||
self.penalty_amount = 0
|
||||
self.flag = True
|
||||
|
||||
def submit(self):
|
||||
self._get_delay_details()
|
||||
self.state = 'submit'
|
||||
|
||||
def cancel(self):
|
||||
if self.eng_office_installment_id :
|
||||
self.eng_office_installment_id.payment_id = False
|
||||
self.state = 'cancel'
|
||||
|
||||
def compute_days(self, date,date_to):
|
||||
if date and date_to:
|
||||
d1 = datetime.strptime(str(date), '%Y-%m-%d')
|
||||
d2 = datetime.strptime(str(date_to), '%Y-%m-%d')
|
||||
daysDiff = (d1 - d2).days
|
||||
days = int(daysDiff) + 1
|
||||
return days
|
||||
|
||||
def _prepare_invoice_values(self, payment, installment_type, project_payment_id,name_spec,account_id, amount):
|
||||
invoice_vals = {
|
||||
'ref': payment.name,
|
||||
'move_type': 'in_invoice',
|
||||
'invoice_origin': payment.sequence,
|
||||
'invoice_user_id': self.env.user.id,
|
||||
'installment_type': installment_type,
|
||||
'project_payment_id': project_payment_id,
|
||||
'invoice_date': payment.date,
|
||||
'invoice_date_due': payment.date,
|
||||
'eng_office_installment_id': payment.eng_office_installment_id.id,
|
||||
'narration': payment.name,
|
||||
'partner_id': payment.partner_id.id,
|
||||
'invoice_line_ids': [(0, 0, {
|
||||
'name': name_spec,
|
||||
'price_unit': amount,
|
||||
'quantity': 1.0,
|
||||
'account_id': account_id,
|
||||
# 'tax_ids': [(6, 0, [payment.tax_id.id])],
|
||||
})],
|
||||
}
|
||||
return invoice_vals
|
||||
|
||||
|
||||
def approve(self):
|
||||
if not self.project_id.project_expenses_account_id or not self.project_id.discount_account_id or not self.project_id.project_investment_account_id:
|
||||
raise UserError(_('Please Contact Administrator to configure your project accounts.'))
|
||||
if self.project_id.project_owner_type == 'company':
|
||||
account_id = self.project_id.project_expenses_account_id
|
||||
else :
|
||||
account_id = self.project_id.project_investment_account_id
|
||||
name_spec = ''
|
||||
name_spec = 'Installment Reference:' + str(self.sequence) + '-' + str(self.name)
|
||||
if self.type == 'eng_office':
|
||||
invoice = self._prepare_invoice_values(self, 'engineer_office', self.id, name_spec, account_id, self.amount)
|
||||
elif self.type == 'subcontractor':
|
||||
amount = 0.0
|
||||
days = self.compute_days(self.subcontractor_line_id.subcontractor_installment_id.delivery_date, date.today().strftime('%Y-%m-%d'))
|
||||
if not self.flag:
|
||||
amount = abs(self.amount - self.penalty_amount)
|
||||
else:
|
||||
amount = self.amount
|
||||
invoice = self._prepare_invoice_values(self, 'subcontractor', self.id, name_spec, account_id, self.amount)
|
||||
invoice_id = self.env['account.move'].sudo().create(invoice).with_user(self.env.uid)
|
||||
self.state = 'approve'
|
||||
self.account_move_id = invoice_id.id
|
||||
|
||||
|
||||
class AccountInvoice(models.Model):
|
||||
_inherit = 'account.move'
|
||||
|
||||
installment_type = fields.Selection([('subcontractor','Subcontractor'),
|
||||
('engineer_office','Engineering Office')], string='Installment Type')
|
||||
project_payment_id = fields.Many2one('project.payment.request', string='Project Payment')
|
||||
eng_office_installment_id = fields.Many2one('engineering.office.line', string='Engineering Office Installment')
|
||||
subcontractor_installment_id = fields.Many2one('subcontractor.work.line', string='Subcontractor Office Installment')
|
||||
|
||||
def action_post(self):
|
||||
res = super(AccountInvoice, self).action_post()
|
||||
if self.project_payment_id:
|
||||
self.project_payment_id.state = 'done'
|
||||
if self.subcontractor_installment_id:
|
||||
self.subcontractor_installment_id.paid = True
|
||||
self.subcontractor_installment_id.paid_date = date.today()
|
||||
if self.eng_office_installment_id:
|
||||
self.eng_office_installment_id.paid = True
|
||||
self.eng_office_installment_id.paid_date = date.today()
|
||||
return res
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from odoo import models, fields
|
||||
|
||||
|
||||
class ResPartner(models.Model):
|
||||
_inherit = 'res.partner'
|
||||
|
||||
is_engineering_office = fields.Boolean(string='Engineering Office')
|
||||
is_subcontractor = fields.Boolean(string='Subcontractor')
|
||||
|
|
@ -0,0 +1,170 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from datetime import date
|
||||
from odoo import models, fields, api, _
|
||||
from odoo.exceptions import ValidationError
|
||||
|
||||
class SubcontractorWork(models.Model):
|
||||
_name = 'subcontractor.work'
|
||||
_description = "Subcontractor"
|
||||
_rec_name = 'subcontractor_id'
|
||||
|
||||
subcontractor_id = fields.Many2one('res.partner', string="Subcontractor")
|
||||
work_item_id = fields.Many2one('work.item', string="Work Item")
|
||||
contract_amount = fields.Float(string="Contract Amount")
|
||||
balance = fields.Float(string="Balance", compute='_compute_balance')
|
||||
project_id = fields.Many2one('project.project', string="Project")
|
||||
installment_id = fields.Many2one('subcontractor.installment', string="Installment")
|
||||
|
||||
@api.depends('installment_id')
|
||||
def _compute_balance(self):
|
||||
for record in self:
|
||||
total_paid = 0
|
||||
if record.installment_id:
|
||||
for line in record.installment_id.installment_line_ids:
|
||||
if line.paid:
|
||||
total_paid += line.amount
|
||||
record.balance = record.contract_amount - total_paid
|
||||
|
||||
|
||||
def open_installment_view(self):
|
||||
return {
|
||||
'name': _('Subcontractor Installment'),
|
||||
'type': 'ir.actions.act_window',
|
||||
'view_type': 'form',
|
||||
'view_mode': 'form',
|
||||
'res_model': 'subcontractor.installment',
|
||||
'target': 'current',
|
||||
'res_id': self.installment_id.id,
|
||||
}
|
||||
|
||||
|
||||
class SubcontractorInstallment(models.Model):
|
||||
_name = "subcontractor.installment"
|
||||
|
||||
name = fields.Char(string="Description")
|
||||
subcontractor_work_id = fields.Many2one('subcontractor.work', string="Subcontractor Work")
|
||||
delivery_date = fields.Date(string="Delivery Date")
|
||||
project_id = fields.Many2one('project.project', related="subcontractor_work_id.project_id", string="Project", store=True)
|
||||
subcontractor_id = fields.Many2one('res.partner', related="subcontractor_work_id.subcontractor_id", string="Subcontractor", store=True)
|
||||
work_item_id = fields.Many2one('work.item', related="subcontractor_work_id.work_item_id", store=True)
|
||||
contract_amount = fields.Float(related="subcontractor_work_id.contract_amount", string="Contract Amount", store=True)
|
||||
total_installment = fields.Float(string="Total Installment", compute="_get_installment_total", store=True)
|
||||
installment_line_ids = fields.One2many('subcontractor.work.line', 'subcontractor_installment_id', string="Installment Line")
|
||||
remain_amount = fields.Float(string="Remain Amount", compute="get_remain_amount")
|
||||
|
||||
@api.depends('remain_amount')
|
||||
def get_remain_amount(self):
|
||||
for rec in self:
|
||||
rec.remain_amount = rec.contract_amount - rec.total_installment
|
||||
|
||||
|
||||
@api.constrains('total_installment')
|
||||
def check_total_installment(self):
|
||||
for rec in self:
|
||||
if rec.total_installment > rec.contract_amount:
|
||||
raise ValidationError(_("Total installment line is more than %s contract amount") % rec.contract_amount)
|
||||
|
||||
@api.depends('installment_line_ids', 'installment_line_ids.amount')
|
||||
def _get_installment_total(self):
|
||||
for rec in self:
|
||||
rec.total_installment = sum([line.amount for line in rec.installment_line_ids])
|
||||
|
||||
@api.model
|
||||
def default_get(self, fields):
|
||||
rec = super(SubcontractorInstallment, self).default_get(fields)
|
||||
if self._context.get('active_model'):
|
||||
active_id = self.env[self._context.get('active_model')].browse(self._context.get('active_id'))
|
||||
rec['subcontractor_work_id'] = active_id.id
|
||||
rec['delivery_date'] = date.today().strftime('%Y-%m-%d')
|
||||
if not active_id:
|
||||
raise ValidationError(_("Programming error: wizard action executed without active_id in context."))
|
||||
return rec
|
||||
|
||||
@api.model
|
||||
def create(self, vals_list):
|
||||
res = super(SubcontractorInstallment, self).create(vals_list)
|
||||
res.subcontractor_work_id.write({'installment_id': res.id})
|
||||
return res
|
||||
|
||||
|
||||
class SubContractorWorkLine(models.Model):
|
||||
_name = "subcontractor.work.line"
|
||||
|
||||
subcontractor_installment_id = fields.Many2one('subcontractor.installment', string="Subcontract Installment")
|
||||
project_id = fields.Many2one('project.project', related="subcontractor_installment_id.project_id", string="Project", store=True)
|
||||
work_item_id = fields.Many2one('work.item', related="subcontractor_installment_id.work_item_id", string="Work Item", store=True)
|
||||
subcontractor_id = fields.Many2one('res.partner', related="subcontractor_installment_id.subcontractor_id", string="Subcontract", store=True)
|
||||
name = fields.Char(string="Description")
|
||||
type = fields.Selection([('fixed', 'Fixed'),
|
||||
('percentage', 'Percentage')], string="Payment Type", default='fixed')
|
||||
value = fields.Float(sting="Value")
|
||||
amount = fields.Float(strng="Amount", compute='get_amount',store=True)
|
||||
penalty_after = fields.Float(string="Penalty After")
|
||||
penalty_amount = fields.Float(string="Penalty Amount", compute='get_penalty_amount', store=True)
|
||||
penalty_percentage = fields.Float(string="Penalty Percentage")
|
||||
penalty_percentage_limit = fields.Float(string="Penalty Percentage Limit")
|
||||
last_installment = fields.Boolean(string="Last Installment")
|
||||
payment_id = fields.Many2one('project.payment.request', string="Payment")
|
||||
paid = fields.Boolean(string="Paid")
|
||||
paid_date = fields.Date(string="paid date")
|
||||
|
||||
def unlink(self):
|
||||
for rec in self:
|
||||
if rec.paid:
|
||||
raise ValidationError(_("Cannot Delete line that already have payment"))
|
||||
return super(SubContractorWorkLine, self).unlink()
|
||||
|
||||
def create_payment(self):
|
||||
vals = {}
|
||||
payment_obj = self.env['project.payment.request']
|
||||
for record in self:
|
||||
vals = {
|
||||
'sequence': '/',
|
||||
'name': record.name or '/',
|
||||
'project_id': record.subcontractor_installment_id.project_id.id,
|
||||
'date': record.subcontractor_installment_id.delivery_date,
|
||||
'penalty_amount': self.penalty_amount,
|
||||
'type': 'subcontractor',
|
||||
'state': 'draft',
|
||||
'partner_id': record.subcontractor_installment_id.subcontractor_work_id.subcontractor_id.id,
|
||||
'amount': record.amount,
|
||||
'subcontractor_line_id': self.id,
|
||||
}
|
||||
payment_id = payment_obj.create(vals)
|
||||
record.payment_id = payment_id.id
|
||||
return True
|
||||
|
||||
@api.constrains('value', 'penalty_percentage', 'penalty_percentage_limit')
|
||||
def check_negative(self):
|
||||
message = _('%s Cannot Be Less than zero')
|
||||
for rec in self:
|
||||
if rec.value < 0.0:
|
||||
raise ValidationError(_(rec._fields['value'].string) + ' ' + message)
|
||||
if rec.penalty_percentage < 0.0:
|
||||
raise ValidationError(_(rec._fields['penalty_percentage'].string) + ' ' + message)
|
||||
if rec.penalty_percentage_limit < 0.0:
|
||||
raise ValidationError(_(rec._fields['penalty_percentage_limit'].string) + ' ' + message)
|
||||
|
||||
@api.constrains('penalty_percentage')
|
||||
def penalty_percentage_check(self):
|
||||
for rec in self:
|
||||
if rec.penalty_percentage != 0.0:
|
||||
if rec.penalty_percentage > rec.penalty_percentage_limit:
|
||||
raise ValidationError(_("Penalty Percentage Limit exceed !!"))
|
||||
|
||||
@api.depends('type', 'value', 'subcontractor_installment_id.contract_amount')
|
||||
def get_amount(self):
|
||||
for rec in self:
|
||||
rec.amount = rec.value * rec.subcontractor_installment_id.contract_amount / 100.0 if rec.type == 'percentage' else rec.value
|
||||
|
||||
@api.depends('penalty_percentage', 'amount')
|
||||
def get_penalty_amount(self):
|
||||
for rec in self:
|
||||
rec.penalty_amount = rec.penalty_percentage * rec.amount / 100.0
|
||||
|
|
@ -0,0 +1,138 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Expert (LCT, Life Connection Technology)
|
||||
# Copyright (C) 2021-2022 LCT
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from odoo import models, fields, api, _
|
||||
from odoo.exceptions import ValidationError, UserError
|
||||
|
||||
class WorkItem(models.Model):
|
||||
_name = 'work.item'
|
||||
|
||||
name = fields.Char(string="Name")
|
||||
sequence = fields.Char(string="Sequence")
|
||||
# work_ids = fields.One2many('sub.work.item', 'work_id', string="Works")
|
||||
type = fields.Selection([('item', 'Work Item'),
|
||||
('sub', 'Sub work'),
|
||||
('detailed', 'Detailed work')], string="Type")
|
||||
|
||||
def unlink(self):
|
||||
for record in self:
|
||||
estimated_quantities_ids = self.env['project.estimated.quantities'].search(
|
||||
[('work_item_id', '=', record.id)])
|
||||
if estimated_quantities_ids:
|
||||
raise ValidationError(_("This Record Cannot Be Deleted"))
|
||||
# if record.work_ids:
|
||||
# raise ValidationError(_("This Record Cannot Be Deleted"))
|
||||
return super(WorkItem, self).unlink()
|
||||
|
||||
|
||||
class SubWorkItem(models.Model):
|
||||
_name = 'sub.work.item'
|
||||
_description = "Sub Work Items"
|
||||
|
||||
name = fields.Char(string="Name")
|
||||
sequence = fields.Char(string="Sequence")
|
||||
work_id = fields.Many2one('work.item', string="Work Item")
|
||||
detailed_work_item_ids = fields.One2many('detailed.work.item', 'sub_work_item_id', string="Detailed Item")
|
||||
type = fields.Selection([('item', 'Work Item'),
|
||||
('sub', 'Sub Work'),
|
||||
('detailed', 'Detailed Work')], string='Type')
|
||||
|
||||
def unlink(self):
|
||||
for record in self:
|
||||
search_ids = self.env['project.estimated.quantities'].search([('sub_work_item_id', '=', record.id)])
|
||||
if search_ids:
|
||||
raise ValidationError(_("This Record Cannot Be Deleted"))
|
||||
if record.detailed_work_item_ids:
|
||||
raise ValidationError(_("This Record Cannot Be Deleted"))
|
||||
return super(SubWorkItem, self).unlink()
|
||||
|
||||
|
||||
class DetailedWorkItem(models.Model):
|
||||
_name = 'detailed.work.item'
|
||||
_description = "DetailedWorkItem"
|
||||
|
||||
name = fields.Char(string="Name")
|
||||
sequence = fields.Char(string="Sequence")
|
||||
sub_work_item_id = fields.Many2one('sub.work.item', string="Sub Work Item")
|
||||
type = fields.Selection([('item', 'Work Item'),
|
||||
('sub', 'Sub Work'),
|
||||
('detailed', 'Detailed Work')], string="Type")
|
||||
|
||||
def unlink(self):
|
||||
for record in self:
|
||||
search_ids = self.env['project.estimated.quantities'].search([('work_detail_id', '=', record.id)])
|
||||
if search_ids:
|
||||
raise ValidationError(_("This Record Cannot Be Deleted"))
|
||||
return super(DetailedWorkItem, self).unlink()
|
||||
|
||||
|
||||
class WorkAttached(models.Model):
|
||||
_name = 'work.attached'
|
||||
_description = "Work Attached"
|
||||
|
||||
name = fields.Char(string="Description")
|
||||
work_attached_ids = fields.One2many('work.attached.line', 'work_attached_id', string='Work Attached')
|
||||
total_work = fields.Float(_string="Total", compute='compute_total')
|
||||
estimated_quantities_id = fields.Many2one('project.estimated.quantities', string="Estimated Quantity")
|
||||
project_id = fields.Many2one('project.project', string="Project")
|
||||
work_item_id = fields.Many2one('work.item', string="Work Item", related='estimated_quantities_id.work_item_id')
|
||||
work_description = fields.Many2one('detailed.work.item', string="Detailed Work",
|
||||
related='estimated_quantities_id.work_detail_id')
|
||||
sub_work_item_id = fields.Many2one('sub.work.item', string="Sub Work",
|
||||
related='estimated_quantities_id.sub_work_item_id')
|
||||
|
||||
@api.depends('work_attached_ids')
|
||||
def compute_total(self):
|
||||
for record in self:
|
||||
record.total_work_attached = 0
|
||||
for line in record.work_attached_ids:
|
||||
record.total_work_attached += line.total_work_attached_line
|
||||
|
||||
@api.model
|
||||
def create(self, vals):
|
||||
# default_project_estimated_quantities_id
|
||||
project_estimated = False
|
||||
if self._context.has_key('default_estimated_quantities_id'):
|
||||
project_estimated = self.env['project.estimated.quantities'].browse(self._context[
|
||||
'default_estimated_quantities_id'])
|
||||
project_id = project_estimated.project_id.id or False
|
||||
vals.update({
|
||||
'estimated_quantities_id': self._context.get('default_estimated_quantities_id'),
|
||||
'project_id': project_id,
|
||||
})
|
||||
res = super(WorkAttached, self).create(vals)
|
||||
if project_estimated:
|
||||
project_estimated.write({'work_attached_id': res.id})
|
||||
return res
|
||||
|
||||
|
||||
class WorkAttachedLine(models.Model):
|
||||
_name = 'work.attached.line'
|
||||
_description = "Work Attached Line"
|
||||
_rec_name = 'product_id'
|
||||
|
||||
product_id = fields.Many2one('product.template', string="Product")
|
||||
work_description = fields.Text(string="Work Description")
|
||||
work_attached_id = fields.Many2one('work.attached', string="Work Attached")
|
||||
estimated_quantities_id = fields.Many2one('project.estimated.quantities', string="Project Estimated Quantity",
|
||||
related='work_attached_id.estimated_quantities_id')
|
||||
project_id = fields.Many2one('project.project', string="Project", related='work_attached_id.project_id')
|
||||
quantity = fields.Float(string="Quantity")
|
||||
uom_id = fields.Many2one('product.uom', string="Product UOM")
|
||||
unit_price = fields.Float(string="Unit Price")
|
||||
total_work_attached_line = fields.Float(string="Total", compute='compute_total')
|
||||
|
||||
@api.onchange('product_id')
|
||||
def onchange_product(self):
|
||||
for record in self:
|
||||
record.uom_id = record.product_id.uom_id.id or False
|
||||
|
||||
@api.depends('quantity', 'unit_price')
|
||||
def compute_total(self):
|
||||
for record in self:
|
||||
record.total_work_attached_line = record.unit_price * record.qty
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||
access_res_branches,res_branches,model_res_branches,,1,1,1,1
|
||||
access_project_task_type,project_task_type,model_project_task_type,,1,1,1,1
|
||||
access_engineering_office_line,engineering_office_line,model_engineering_office_line,,1,1,1,1
|
||||
access_project_estimated_quantities,project_estimated_quantities,model_project_estimated_quantities,,1,1,1,1
|
||||
access_work_item,work_item,model_work_item,,1,1,1,1
|
||||
access_sub_work_item,sub_work_item,model_sub_work_item,,1,1,1,1
|
||||
access_detailed_work_item,detailed_work_item,model_detailed_work_item,,1,1,1,1
|
||||
access_work_attached,work_attached,model_work_attached,,1,1,1,1
|
||||
access_work_attached_line,work_attached_line,model_work_attached_line,,1,1,1,1
|
||||
access_subcontractor_work,subcontractor_work,model_subcontractor_work,,1,1,1,1
|
||||
access_project_payment_request,project_payment_request,model_project_payment_request,,1,1,1,1
|
||||
access_subcontractor_installment,subcontractor_installment,model_subcontractor_installment,,1,1,1,1
|
||||
access_subcontractor_work_line,subcontractor_work_line,model_subcontractor_work_line,,1,1,1,1
|
||||
|
Binary file not shown.
|
After Width: | Height: | Size: 42 KiB |
|
|
@ -0,0 +1,111 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
|
||||
<!-- Engineering Office -->
|
||||
|
||||
<record id="view_engineering_office_partner" model="ir.actions.act_window">
|
||||
<field name="name">Engineering Office</field>
|
||||
<field name="res_model">res.partner</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="domain">[('is_engineering_office','=',True)]</field>
|
||||
<field name="context">{'search_default_is_engineering_office': True,
|
||||
'default_is_engineering_office': True}</field>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to create a Engineering Office.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<menuitem id="engineering_office" name="Engineering Office" parent="project_installment"
|
||||
action="view_engineering_office_partner" sequence="1"/>
|
||||
|
||||
|
||||
<!-- ##### Engineering Office Line #####-->
|
||||
<record id="view_engineering_office_line_form" model="ir.ui.view">
|
||||
<field name="name">Engineer Office Installment</field>
|
||||
<field name="model">engineering.office.line</field>
|
||||
<field name="arch" type="xml">
|
||||
<form create="false">
|
||||
<sheet>
|
||||
<group>
|
||||
<group>
|
||||
<field name="project_id" readonly="1"/>
|
||||
<field name="engineering_office_id" readonly="1" domain="[('is_engineering_office','=',True)]"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="name"/>
|
||||
<field name="percent" /><h5>-</h5>
|
||||
<field name="due_date" required="1"/>
|
||||
<field name="paid" readonly="1"/>
|
||||
<field name="paid_date" readonly="1"/>
|
||||
<field name="amount" />
|
||||
</group>
|
||||
</group>
|
||||
</sheet>
|
||||
<div class="oe_chatter">
|
||||
<field name="message_follower_ids" widget="mail_followers"/>
|
||||
<field name="message_ids" widget="mail_thread"/>
|
||||
</div>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_engineering_office_line_tree" model="ir.ui.view">
|
||||
<field name="name">Engineer Office Installment</field>
|
||||
<field name="model">engineering.office.line</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree create="false" sample="1">
|
||||
<field name="project_id"/>
|
||||
<field name="engineering_office_id"/>
|
||||
<field name="name" optional="show"/>
|
||||
<field name="percent" sum="Percentage"/>
|
||||
<field name="due_date" required="1"/>
|
||||
<field name="amount" sum="Amount"/>
|
||||
<field name="paid"/>
|
||||
<field name="paid_date"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_engineering_office_line_search" model="ir.ui.view">
|
||||
<field name="name">engineering.office.line.select</field>
|
||||
<field name="model">engineering.office.line</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Search Engineer Office/Project">
|
||||
<field name="name"/>
|
||||
<filter name="engineering_office_id" />
|
||||
<filter name="project_id" />
|
||||
<group expand="0" string="Group By...">
|
||||
<filter string="Engineering Office Name" name="engineering_office_id" domain="[]"
|
||||
context="{'group_by':'engineering_office_id'}"/>
|
||||
<filter string="Project" name="project_id" domain="[]"
|
||||
context="{'group_by':'project_id'}"/>
|
||||
<filter string="Item" domain="[]" name="description" context="{'group_by':'name'}"/>
|
||||
<filter string="Paid Date" domain="[]" name="paid_date" context="{'group_by':'paid_date'}"/>
|
||||
</group>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="view_engineering_office_line_action" model="ir.actions.act_window">
|
||||
<field name="name">Engineer Office Installment</field>
|
||||
<field name="res_model">engineering.office.line</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="view_id" ref="view_engineering_office_line_tree"/>
|
||||
<field name="search_view_id" ref="view_engineering_office_line_search"/>
|
||||
<field name="context">{'search_default_engineering_office_id': 1,'search_default_project_id':1}</field>
|
||||
<field name="domain">[('display_type', '=', False)]</field>
|
||||
|
||||
</record>
|
||||
|
||||
|
||||
<menuitem id="engineering_office_installment" name="Engineer Office Installment" parent="project_installment"
|
||||
action="view_engineering_office_line_action" sequence="2"/>
|
||||
|
||||
|
||||
|
||||
</odoo>
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
|
||||
<record id="project_task_type_form_view" model="ir.ui.view">
|
||||
<field name="name">Project Task Type</field>
|
||||
<field name="model">project.task.type</field>
|
||||
<field name="inherit_id" ref="project.task_type_edit"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='fold']" position="after">
|
||||
<field name="case_default"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<menuitem name="City" id="project_city_menu" parent="project.menu_project_config"
|
||||
action="country_city.city_action" sequence="7"/>
|
||||
|
||||
<menuitem name="District" id="project_district_menu" parent="project.menu_project_config"
|
||||
action="country_city.district_action" sequence="8"/>
|
||||
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,268 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<odoo>
|
||||
<data>
|
||||
|
||||
<record id="custom_open_view_project_all" model="ir.actions.act_window">
|
||||
<field name="name">Projects</field>
|
||||
<field name="res_model">project.project</field>
|
||||
<field name="domain">[]</field>
|
||||
<field name="view_mode">kanban,tree,form</field>
|
||||
<field name="view_ids" eval="[(5, 0, 0),
|
||||
(0, 0, {'view_mode': 'kanban', 'view_id': ref('project.view_project_kanban')}),
|
||||
(0, 0, {'view_mode': 'tree', 'view_id': ref('project.view_project')})
|
||||
]"/>
|
||||
<field name="search_view_id" ref="project.view_project_project_filter"/>
|
||||
<field name="target">main</field>
|
||||
<field name="help" type="html">
|
||||
<p class="o_view_nocontent_smiling_face">
|
||||
No projects found. Let's create one!
|
||||
</p>
|
||||
<p>
|
||||
Projects regroup tasks on the same topic and each have their own dashboard.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="edit_project_customs" model="ir.ui.view">
|
||||
<field name="name">project.project.form.inherit</field>
|
||||
<field name="model">project.project</field>
|
||||
<field name="inherit_id" ref="project.edit_project"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//header" position="inside">
|
||||
<button name="action_submit" type="object" string="In Progress" states="draft"
|
||||
groups="project.group_project_user"
|
||||
class="oe_highlight"/>
|
||||
<button name="action_draft" type="object" string="Set To Draft" states="in_progess"
|
||||
groups="project.group_project_user"
|
||||
class="oe_highlight"/>
|
||||
<button name="action_done" type="object" string="Done" states="in_progess"
|
||||
groups="project.group_project_manager"
|
||||
class="oe_highlight"/>
|
||||
<button name="action_cancel" type="object" string="Cancel" states="draft,in_progess"
|
||||
groups="project.group_project_user"
|
||||
class="oe_highlight"/>
|
||||
<field name="state" widget="statusbar" statusbar_visible="draft,in_progess,done"/>
|
||||
</xpath>
|
||||
<xpath expr="//div[@class='oe_button_box']//button[2]" position="replace"/>
|
||||
<xpath expr="//div[@class='oe_button_box']//button[@name='attachment_tree_view']" position="before">
|
||||
|
||||
<button class="oe_stat_button" name="get_subcontractor_installment" type="object"
|
||||
icon="fa-file-text-o">
|
||||
<field string="Subcontractor Installment" name="sinstallment_count" widget="statinfo"/>
|
||||
</button>
|
||||
|
||||
<button class="oe_stat_button" name="get_subcontractor_payment" type="object" icon="fa-money">
|
||||
<field string="Subcontractor Payment" name="spayment_counts" widget="statinfo"/>
|
||||
</button>
|
||||
|
||||
<button class="oe_stat_button" name="get_engineering_payment" type="object" icon="fa-money">
|
||||
<field string="Engineering Office Payment" name="epayment_counts" widget="statinfo"/>
|
||||
</button>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//field[@name='name']" position="after">
|
||||
<p>-</p>
|
||||
<field name="code" required="1" attrs="{'readonly': [('state', '!=', 'draft')]}" placeholder="Project Code"/>
|
||||
</xpath>
|
||||
<xpath expr="//div[2]" position="after">
|
||||
<group name="project_info">
|
||||
<group>
|
||||
<field name="project_owner_type" attrs="{'readonly': [('state', '!=', 'draft')]}" required="1"/>
|
||||
<field name="city" attrs="{'readonly': [('state', '!=', 'draft')]}"/>
|
||||
<field name="district" domain="[('city_id','=',city)]" attrs="{'readonly': [('state', '!=', 'draft')]}"/>
|
||||
<field name="street" attrs="{'readonly': [('state', '!=', 'draft')]}"/>
|
||||
<field name="user_id" attrs="{'readonly': [('state', '!=', 'draft')]}"/>
|
||||
<field name="partner_id" attrs="{'readonly': [('state', '!=', 'draft')]}"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="project_type" required="1" attrs="{'readonly': [('state', '!=', 'draft')]}"/>
|
||||
<field name="branch_id" required="0" attrs="{'readonly': [('state', '!=', 'draft')]}"/>
|
||||
<field name="project_total_cost" required="1" attrs="{'readonly': [('state', '!=', 'draft')]}"/>
|
||||
<field name="project_revenue" readonly="1" attrs="{'readonly': [('state', '!=', 'draft')]}"/>
|
||||
<field name="project_cost" readonly="1" attrs="{'readonly': [('state', '!=', 'draft')]}"/>
|
||||
<field name="estimated_cost" readonly="1" attrs="{'readonly': [('state', '!=', 'draft')]}"/>
|
||||
</group>
|
||||
</group>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//div[@name='options_active']" position="replace">
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//form//sheet//notebook/page[@name='settings']" position="attributes">
|
||||
<attribute name="invisible">1</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//notebook//page[@name='description_page']" position="replace"/>
|
||||
|
||||
<field name="name" position="attributes">
|
||||
<attribute name="attrs">{'readonly': [('state', '!=', 'draft')]}</attribute>
|
||||
</field>
|
||||
|
||||
<xpath expr="//notebook" position="inside">
|
||||
<page name="team" string="Teams" attrs="{'readonly': [('state', '!=', 'draft')]}">
|
||||
<field name="member_ids" widget="section_and_note_one2many" mode="tree"
|
||||
attrs="{'readonly': [('state', '!=', 'draft')]}">
|
||||
<control>
|
||||
<create name="add_line_control" string="Add a line"/>
|
||||
<create name="add_section_control" string="Add a section"
|
||||
context="{'default_display_type': 'line_section'}"/>
|
||||
<create name="add_note_control" string="Add a note"
|
||||
context="{'default_display_type': 'line_note'}"/>
|
||||
</control>
|
||||
<tree editable="bottom">
|
||||
<field name="name"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
|
||||
<page name="info" string="Other Information">
|
||||
<group>
|
||||
<group>
|
||||
<field name="privacy_visibility" widget="radio" attrs="{'readonly': [('state', '!=', 'draft')]}"/>
|
||||
|
||||
<field name="allowed_internal_user_ids" widget="many2many_tags" attrs="{'invisible': [('privacy_visibility', '!=', 'followers')], 'readonly': [('state', '!=', 'draft')]}"/>
|
||||
|
||||
<field name="allowed_portal_user_ids" widget="many2many_tags" options="{'no_create': True}" attrs="{'invisible': [('privacy_visibility', '!=', 'portal')], 'readonly': [('state', '!=', 'draft')]}"/>
|
||||
|
||||
<field name="company_id" groups="base.group_multi_company" attrs="{'readonly': [('state', '!=', 'draft')]}"/>
|
||||
</group>
|
||||
<group string="Other">
|
||||
<field name="date_start" attrs="{'readonly': [('state', '!=', 'draft')]}"/>
|
||||
<field name="date_end" attrs="{'readonly': [('state', '!=', 'draft')]}"/>
|
||||
<field name="analytic_account_id" attrs="{'readonly': [('state', '!=', 'draft')]}" groups="analytic.group_analytic_accounting"/>
|
||||
</group>
|
||||
</group>
|
||||
</page>
|
||||
|
||||
<page name="phase" string="Project Phase">
|
||||
<field name="type_ids" attrs="{'readonly': [('state', '!=', 'draft')]}"/>
|
||||
</page>
|
||||
<page name="Task" string="Project Tasks">
|
||||
<field name="task_ids" attrs="{'readonly': [('state', '!=', 'draft')]}"/>
|
||||
</page>
|
||||
|
||||
<page name="engineering" string="Engineering Office">
|
||||
<group>
|
||||
<field name="engineering_office_id" required="1"
|
||||
domain="[('is_engineering_office','=',True)]"
|
||||
attrs="{'readonly': [('state', '!=', 'draft')]}"/>
|
||||
</group>
|
||||
<group colspan="2" col="4">
|
||||
<field name="engineering_contract_amount" required="1"
|
||||
attrs="{'readonly': [('state', '!=', 'draft')]}"/>
|
||||
<field name="engineering_contract_balance" readonly="1"
|
||||
attrs="{'readonly': [('state', '!=', 'draft')]}"/>
|
||||
</group>
|
||||
<field name="engineering_office_line_ids" widget="section_and_note_one2many" mode="tree,kanban"
|
||||
attrs="{'readonly': [('state', '!=', 'draft')]}">
|
||||
<tree editable="bottom">
|
||||
<control>
|
||||
<create name="add_product_control" string="Add a Line"/>
|
||||
<create name="add_section_control" string="Add a section"
|
||||
context="{'default_display_type': 'line_section'}"/>
|
||||
<create name="add_note_control" string="Add a note"
|
||||
context="{'default_display_type': 'line_note'}"/>
|
||||
</control>
|
||||
<field name="display_type" invisible="1"/>
|
||||
<field name="name" required="1" widget="section_and_note_text" optional="show"/>
|
||||
<field name="percent" sum="Percentage"
|
||||
attrs="{'required': [('display_type', '=', False)]}"/>
|
||||
<field name="due_date" attrs="{'required': [('display_type', '=', False)]}"/>
|
||||
<field name="amount" sum="Payment Amount" readonly="1"/>
|
||||
<button name="create_office_payment" type="object" string="Create Payment"
|
||||
class="oe_highlight"
|
||||
attrs="{'invisible':[('payment_id', '!=', False)]}"/>
|
||||
<field name="payment_id" readonly="0"/>
|
||||
<field name="paid" readonly="1"/>
|
||||
<field name="paid_date" attrs="{'invisible':[('paid', '=', False)]}" readonly="1"/>
|
||||
</tree>
|
||||
|
||||
</field>
|
||||
</page>
|
||||
|
||||
<page name="contractor" string="Contractor">
|
||||
<field name="subcontractor_work_ids" attrs="{'readonly': [('state', '!=', 'draft')]}">
|
||||
<tree editable="bottom">
|
||||
<field name="subcontractor_id" domain="[('is_subcontractor', '=', True)]" required="1"/>
|
||||
<field name="work_item_id" required="1"/>
|
||||
<field name="contract_amount" required="1"/>
|
||||
<field name="balance"/>
|
||||
<field name="installment_id" invisible="1"/>
|
||||
<button name="%(view_subcontractor_work_line_installment_action)d"
|
||||
string="contract terms with the contractor" type="action"
|
||||
icon="fa-pencil-square-o"
|
||||
class="oe_highlight"
|
||||
attrs="{'invisible': [('installment_id', '!=', False)]}"/>
|
||||
<button name="open_installment_view" type="object"
|
||||
string="Open Installment"
|
||||
class="oe_highlight"
|
||||
attrs="{'invisible': [('installment_id', '=', False)]}"
|
||||
/>
|
||||
</tree>
|
||||
|
||||
</field>
|
||||
</page>
|
||||
|
||||
<page name="quantity" string="Estimated Quantity">
|
||||
<field name="project_estimated_quantities_ids" widget="section_and_note_one2many"
|
||||
mode="tree,kanban" attrs="{'readonly': [('state', '!=', 'draft')]}">
|
||||
<tree editable="bottom">
|
||||
<control>
|
||||
<create name="add_product_control" string="Add a Line"/>
|
||||
<create name="add_section_control" string="Add a section"
|
||||
context="{'default_display_type': 'line_section'}"/>
|
||||
</control>
|
||||
<field name="display_type" invisible="1"/>
|
||||
<field name="work_item_id" attrs="{'required': [('display_type', '=', False)]}"/>
|
||||
<field name="name" required="1" widget="section_and_note_text"/>
|
||||
<field name="quantity" sum="Qty" attrs="{'required': [('display_type', '=', False)]}"/>
|
||||
<field name="uom_id" attrs="{'required': [('display_type', '=', False)]}"
|
||||
optional="show"/>
|
||||
<field name="unit_price" sum="unit"
|
||||
attrs="{'required': [('display_type', '=', False)]}"/>
|
||||
<field name="total_estimated_qty" sum="total"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
|
||||
<page name="project_account_config" string="Accounting configuration">
|
||||
<group>
|
||||
<group>
|
||||
<field name="project_expenses_account_id"
|
||||
attrs="{'readonly': [('state', 'not in', ['draft', 'in_progess'])]}"/>
|
||||
<field name="discount_account_id" attrs="{'readonly': [('state', 'not in', ['draft', 'in_progess'])]}" />
|
||||
</group>
|
||||
<group>
|
||||
<field name="project_investment_account_id"
|
||||
attrs="{'readonly': [('state', 'not in', ['draft', 'in_progess'])]}"/>
|
||||
</group>
|
||||
</group>
|
||||
|
||||
</page>
|
||||
|
||||
<!-- <page name="attachment" string="Attachments">
|
||||
<field name="attachment_ids">
|
||||
<tree editable="bottom">
|
||||
<field name="name" required="1"/>
|
||||
<field name="datas" required="1"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page> -->
|
||||
|
||||
</xpath>
|
||||
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_task_form2_custom" model="ir.ui.view">
|
||||
<field name="name">project.task.custom</field>
|
||||
<field name="model">project.task</field>
|
||||
<field name="inherit_id" ref="project.view_task_form2"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='project_id']" position="attributes">
|
||||
<attribute name="required">0</attribute>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,88 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<odoo>
|
||||
<data>
|
||||
|
||||
<!-- ##### Project Estimated Quantities ##### -->
|
||||
<record id="view_project_estimated_quantities_form" model="ir.ui.view">
|
||||
<field name="name">Project Estimated Quantities</field>
|
||||
<field name="model">project.estimated.quantities</field>
|
||||
<field name="arch" type="xml">
|
||||
<form create="false">
|
||||
<sheet>
|
||||
<group>
|
||||
<group>
|
||||
<field name="project_id" readonly="1"/>
|
||||
<field name="work_item_id"/>
|
||||
<field name="total_estimated_qty" sum="Total Amount" readonly="1" />
|
||||
</group>
|
||||
<group>
|
||||
<field name="name" />
|
||||
<field name="quantity" sum="Qty"/>
|
||||
<field name="uom_id" />
|
||||
<field name="unit_price" sum="Unit"/>
|
||||
</group>
|
||||
</group>
|
||||
</sheet>
|
||||
<div class="oe_chatter">
|
||||
<field name="message_follower_ids" widget="mail_followers"/>
|
||||
<field name="message_ids" widget="mail_thread"/>
|
||||
</div>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_project_estimated_quantities_tree" model="ir.ui.view">
|
||||
<field name="name">Project Estimated Quantities</field>
|
||||
<field name="model">project.estimated.quantities</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree create="false">
|
||||
<field name="project_id"/>
|
||||
<field name="work_item_id"/>
|
||||
<field name="name"/>
|
||||
<field name="quantity"/>
|
||||
<field name="uom_id"/>
|
||||
<field name="unit_price"/>
|
||||
<field name="total_estimated_qty"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_project_estimated_quantities_search" model="ir.ui.view">
|
||||
<field name="name">Project Estimated Quantities</field>
|
||||
<field name="model">project.estimated.quantities</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Search">
|
||||
<field name="work_item_id"/>
|
||||
<group expand="0" string="Group By..." colspan="12" col="10">
|
||||
<filter string="Work Item" domain="[]" name="work_item"
|
||||
context="{'group_by':'work_item_id'}"
|
||||
icon="terp-project"/>
|
||||
<filter string="Description" icon="terp-go-today" domain="[]" name="work_desc"
|
||||
context="{'group_by':'name'}"/>
|
||||
<filter string="Quantity" icon="terp-go-today" domain="[]" name="work_qty"
|
||||
context="{'group_by':'quantity'}"/>
|
||||
<filter string="Uom" icon="terp-go-today" domain="[]" name="work_uom"
|
||||
context="{'group_by':'uom_id'}"/>
|
||||
<filter string="Unit Price" icon="terp-go-today" domain="[]" name="work_price"
|
||||
context="{'group_by':'unit_price'}"/>
|
||||
<filter string="Total" icon="terp-go-today" domain="[]" name="work_total"
|
||||
context="{'group_by':'total_estimated_qty'}"/>
|
||||
<filter string="Project" icon="terp-go-today" domain="[]"
|
||||
name="project_id"
|
||||
context="{'group_by':'project_id'}"/>
|
||||
</group>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_project_estimated_quantities_action" model="ir.actions.act_window">
|
||||
<field name="name">Project Estimated Quantities</field>
|
||||
<field name="res_model">project.estimated.quantities</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="context">{'search_default_project_id': 1}</field>
|
||||
<field name="domain">[('display_type', '=', False)]</field>
|
||||
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
|
||||
<!-- Project -->
|
||||
<menuitem action="custom_open_view_project_all"
|
||||
id="project.menu_projects"
|
||||
name="Projects"
|
||||
parent="project.menu_main_pm"
|
||||
sequence="1"/>
|
||||
|
||||
|
||||
<!-- ##### Estimated Qty #####-->
|
||||
<menuitem id="project_estimated_quantities"
|
||||
name="Project Estimated Quantities"
|
||||
parent="project.menu_main_pm"
|
||||
sequence="2"/>
|
||||
|
||||
<menuitem id="project_estimated_quantities_menu"
|
||||
parent="project_estimated_quantities"
|
||||
sequence="1"
|
||||
action="view_project_estimated_quantities_action"/>
|
||||
|
||||
<menuitem id="work_item_menu"
|
||||
parent="project_estimated_quantities"
|
||||
sequence="5"
|
||||
action="view_work_item_action"/>
|
||||
|
||||
|
||||
<!-- ##### Installment #####-->
|
||||
<menuitem id="project_installment"
|
||||
name="Project Installment"
|
||||
parent="project.menu_main_pm"
|
||||
sequence="3"/>
|
||||
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,106 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<odoo>
|
||||
|
||||
<!-- Project Payment -->
|
||||
<record id="project_payment_request_view_forms" model="ir.ui.view">
|
||||
<field name="name">project.payment.request.form.view</field>
|
||||
<field name="model">project.payment.request</field>
|
||||
<field name="arch" type="xml">
|
||||
<form create="false" delete="false" string="Project Payment">
|
||||
<header>
|
||||
<button name="submit" type="object" string="Submit" states="draft" groups="project.group_project_user"
|
||||
class="oe_highlight"/>
|
||||
<button name="expect_penalty" attrs="{'invisible':['|','|',('type', '!=', 'subcontractor'),('penalty_amount','=', 0.0),('state', '!=', 'submit')]}" type="object" string="Penalty Escape"
|
||||
groups="project.group_project_manager"
|
||||
class="oe_highlight"/>
|
||||
<button name="approve" type="object" string="Approve" states="submit"
|
||||
groups="project.group_project_manager"
|
||||
class="oe_highlight"/>
|
||||
<button name="cancel" type="object" string="Cancel" states="draft,submit" groups="project.group_project_user"
|
||||
class="oe_highlight"/>
|
||||
<field name="state" widget="statusbar" statusbar_visible="draft,submit,approve" attrs="{'invisible': [('state', '=', 'cancel')]}"/>
|
||||
</header>
|
||||
<sheet>
|
||||
<group>
|
||||
<group>
|
||||
<field name="sequence" readonly="1"/>
|
||||
<field name="date" readonly="1"/>
|
||||
<field name="type" readonly="1"/>
|
||||
<field name="partner_id" readonly="1"/>
|
||||
<field name="eng_office_installment_id" attrs="{'invisible':[('eng_office_installment_id','=', False)]}" readonly="1" />
|
||||
<field name="subcontractor_line_id" attrs="{'invisible':[('subcontractor_line_id','=', False)]}" readonly="1" />
|
||||
</group>
|
||||
<group>
|
||||
<field name="name" readonly="1"/>
|
||||
<field name="project_id" readonly="1"/>
|
||||
<field name="delivery_date" required="1"/>
|
||||
<field name="amount" readonly="1"/>
|
||||
<field name="penalty_amount" attrs="{'invisible':[('penalty_amount','=', 0.0)]}" readonly="1"/>
|
||||
<field name="account_move_id" readonly="1" />
|
||||
</group>
|
||||
</group>
|
||||
</sheet>
|
||||
<div class="oe_chatter">
|
||||
<field name="message_follower_ids" groups="base.group_user"/>
|
||||
<field name="activity_ids"/>
|
||||
<field name="message_ids"/>
|
||||
</div>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="project_payment_request_view_tree" model="ir.ui.view">
|
||||
<field name="name">project.payment.request.tree.view</field>
|
||||
<field name="model">project.payment.request</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree create="false" edit="false" delete="false" string="Project Payment">
|
||||
<field name="sequence"/>
|
||||
<field name="name"/>
|
||||
<field name="project_id"/>
|
||||
<field name="type"/>
|
||||
<field name="partner_id"/>
|
||||
<field name="delivery_date"/>
|
||||
<field name="amount"/>
|
||||
<field name="state"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="project_payment_request_view_select" model="ir.ui.view">
|
||||
<field name="name">project.payment.request.search.view</field>
|
||||
<field name="model">project.payment.request</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Search Project Payment">
|
||||
<field name="partner_id" />
|
||||
<field name="project_id" />
|
||||
<group expand="0" string="Group By...">
|
||||
<filter string="Partner" name="partner_id" domain="[]"
|
||||
context="{'group_by':'partner_id'}"/>
|
||||
<filter string="Project" name="project_id" domain="[]"
|
||||
context="{'group_by':'project_id'}"/>
|
||||
<filter string="Type" domain="[]" name="payment_type" context="{'group_by':'type'}"/>
|
||||
<filter string="State" domain="[]" name="state" context="{'group_by':'state'}"/>
|
||||
</group>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record model="ir.actions.act_window" id="action_projects_payments_custom">
|
||||
<field name="name">Projects Payments</field>
|
||||
<field name="res_model">project.payment.request</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="view_id" ref="project_payment_request_view_tree"/>
|
||||
</record>
|
||||
|
||||
|
||||
<menuitem action="action_projects_payments_custom"
|
||||
id="custom_project_payment_menu"
|
||||
name="Projects Payments"
|
||||
parent="project_installment"
|
||||
sequence="5"/>
|
||||
|
||||
|
||||
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<!-- Partner -->
|
||||
<record id="view_partner_property_form" model="ir.ui.view">
|
||||
<field name="name">partner.form</field>
|
||||
<field name="model">res.partner</field>
|
||||
<field name="inherit_id" ref="account.view_partner_property_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<page name="accounting" position="after">
|
||||
<page string="Project Configuration" name="real_estate_project_config">
|
||||
<group>
|
||||
<group name="project_config">
|
||||
<field name="is_engineering_office"/>
|
||||
<field name="is_subcontractor"/>
|
||||
</group>
|
||||
</group>
|
||||
</page>
|
||||
</page>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue