diff --git a/login_user_detail/README.rst b/login_user_detail/README.rst
new file mode 100755
index 000000000..a3673fe3c
--- /dev/null
+++ b/login_user_detail/README.rst
@@ -0,0 +1,54 @@
+.. image:: https://img.shields.io/badge/licence-AGPL--1-blue.svg
+ :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
+ :alt: License: AGPL-3
+
+User Log Details
+================
+
+This module developed to record login details of user.
+
+Installation
+============
+
+Just select it from available modules to install it, there is no need to extra installations.
+
+Configuration
+=============
+
+Nothing to configure.
+
+Company
+-------
+* `Cybrosys Techno Solutions `__
+
+Credits
+-------
+* Developer:
+ Saritha @ cybrosys
+ Muhammad P @ cybrosys
+ Noorjahan P @ cybrosys
+
+Contacts
+--------
+* Mail Contact : odoo@cybrosys.com
+* Website : https://cybrosys.com
+
+Bug Tracker
+-----------
+Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported.
+
+Maintainer
+==========
+.. image:: https://cybrosys.com/images/logo.png
+ :target: https://cybrosys.com
+
+This module is maintained by Cybrosys Technologies.
+
+For support and more information, please visit `Our Website `__
+
+Further information
+===================
+HTML Description: ``__
+
+
+
diff --git a/login_user_detail/__init__.py b/login_user_detail/__init__.py
new file mode 100755
index 000000000..4d63b6757
--- /dev/null
+++ b/login_user_detail/__init__.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# Author: Your Name (odoo@cybrosys.com)
+#
+# You can modify it under the terms of the GNU AFFERO
+# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+
+from . import models
diff --git a/login_user_detail/__manifest__.py b/login_user_detail/__manifest__.py
new file mode 100755
index 000000000..bb313c8a0
--- /dev/null
+++ b/login_user_detail/__manifest__.py
@@ -0,0 +1,41 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2020-TODAY Cybrosys Technologies().
+#
+# You can modify it under the terms of the GNU AFFERO
+# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+
+{
+ 'name': "User Log Details",
+ 'version': '15.0.1.0.0',
+ 'summary': """Login User Details & IP Address""",
+ 'description': """This module records login information of user""",
+ 'author': "Cybrosys Techno Solutions ",
+ 'company': "Cybrosys Techno Solutions ",
+ 'maintainer': 'Cybrosys Techno Solutions',
+ 'website': "https://www.cybrosys.com",
+ 'category': 'Tools',
+ 'depends': ['base'],
+ 'license': 'AGPL-3',
+ 'data': [
+ 'security/ir.model.access.csv',
+ 'views/login_user_views.xml'],
+ 'demo': [],
+ 'images': ['static/description/banner.png'],
+ 'installable': True,
+ 'auto_install': False,
+}
diff --git a/login_user_detail/doc/RELEASE_NOTES.md b/login_user_detail/doc/RELEASE_NOTES.md
new file mode 100644
index 000000000..0b7af7918
--- /dev/null
+++ b/login_user_detail/doc/RELEASE_NOTES.md
@@ -0,0 +1,6 @@
+## Module
+
+#### 08.10.2020
+#### Version 15.0.1.0.0
+#### ADD
+- Initial Commit for login_user_details
\ No newline at end of file
diff --git a/login_user_detail/models/__init__.py b/login_user_detail/models/__init__.py
new file mode 100755
index 000000000..52c913351
--- /dev/null
+++ b/login_user_detail/models/__init__.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# Author: Your Name (odoo@cybrosys.com)
+#
+# You can modify it under the terms of the GNU AFFERO
+# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+
+from . import login_user_details
diff --git a/login_user_detail/models/login_user_details.py b/login_user_detail/models/login_user_details.py
new file mode 100755
index 000000000..6e0670a06
--- /dev/null
+++ b/login_user_detail/models/login_user_details.py
@@ -0,0 +1,53 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# Author: Your Name (odoo@cybrosys.com)
+#
+# You can modify it under the terms of the GNU AFFERO
+# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+
+import logging
+from itertools import chain
+from odoo.http import request
+from odoo import models, fields, api
+
+_logger = logging.getLogger(__name__)
+USER_PRIVATE_FIELDS = ['password']
+concat = chain.from_iterable
+
+
+class LoginUserDetail(models.Model):
+ _inherit = 'res.users'
+
+ @api.model
+ def _check_credentials(self, password, user_agent_env):
+ result = super(LoginUserDetail, self)._check_credentials(password, user_agent_env)
+ ip_address = request.httprequest.environ['REMOTE_ADDR']
+ vals = {'name': self.name,
+ 'ip_address': ip_address
+ }
+ self.env['login.detail'].sudo().create(vals)
+ return result
+
+
+class LoginUpdate(models.Model):
+ _name = 'login.detail'
+ _description = 'Login Details'
+
+ name = fields.Char(string="User Name")
+ date_time = fields.Datetime(string="Login Date And Time", default=lambda self: fields.datetime.now())
+ ip_address = fields.Char(string="IP Address")
diff --git a/login_user_detail/security/ir.model.access.csv b/login_user_detail/security/ir.model.access.csv
new file mode 100755
index 000000000..7935bc9e7
--- /dev/null
+++ b/login_user_detail/security/ir.model.access.csv
@@ -0,0 +1,2 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_login_user_detail,login_user_detail_login_detail,model_login_detail,,1,1,1,1
diff --git a/login_user_detail/static/description/assets/icons/check.png b/login_user_detail/static/description/assets/icons/check.png
new file mode 100644
index 000000000..c8e85f51d
Binary files /dev/null and b/login_user_detail/static/description/assets/icons/check.png differ
diff --git a/login_user_detail/static/description/assets/icons/chevron.png b/login_user_detail/static/description/assets/icons/chevron.png
new file mode 100644
index 000000000..2089293d6
Binary files /dev/null and b/login_user_detail/static/description/assets/icons/chevron.png differ
diff --git a/login_user_detail/static/description/assets/icons/cogs.png b/login_user_detail/static/description/assets/icons/cogs.png
new file mode 100644
index 000000000..95d0bad62
Binary files /dev/null and b/login_user_detail/static/description/assets/icons/cogs.png differ
diff --git a/login_user_detail/static/description/assets/icons/consultation.png b/login_user_detail/static/description/assets/icons/consultation.png
new file mode 100644
index 000000000..8319d4baa
Binary files /dev/null and b/login_user_detail/static/description/assets/icons/consultation.png differ
diff --git a/login_user_detail/static/description/assets/icons/ecom-black.png b/login_user_detail/static/description/assets/icons/ecom-black.png
new file mode 100644
index 000000000..a9385ff13
Binary files /dev/null and b/login_user_detail/static/description/assets/icons/ecom-black.png differ
diff --git a/login_user_detail/static/description/assets/icons/education-black.png b/login_user_detail/static/description/assets/icons/education-black.png
new file mode 100644
index 000000000..3eb09b27b
Binary files /dev/null and b/login_user_detail/static/description/assets/icons/education-black.png differ
diff --git a/login_user_detail/static/description/assets/icons/hotel-black.png b/login_user_detail/static/description/assets/icons/hotel-black.png
new file mode 100644
index 000000000..130f613be
Binary files /dev/null and b/login_user_detail/static/description/assets/icons/hotel-black.png differ
diff --git a/login_user_detail/static/description/assets/icons/license.png b/login_user_detail/static/description/assets/icons/license.png
new file mode 100644
index 000000000..a5869797e
Binary files /dev/null and b/login_user_detail/static/description/assets/icons/license.png differ
diff --git a/login_user_detail/static/description/assets/icons/lifebuoy.png b/login_user_detail/static/description/assets/icons/lifebuoy.png
new file mode 100644
index 000000000..658d56ccc
Binary files /dev/null and b/login_user_detail/static/description/assets/icons/lifebuoy.png differ
diff --git a/login_user_detail/static/description/assets/icons/manufacturing-black.png b/login_user_detail/static/description/assets/icons/manufacturing-black.png
new file mode 100644
index 000000000..697eb0e9f
Binary files /dev/null and b/login_user_detail/static/description/assets/icons/manufacturing-black.png differ
diff --git a/login_user_detail/static/description/assets/icons/pos-black.png b/login_user_detail/static/description/assets/icons/pos-black.png
new file mode 100644
index 000000000..97c0f90c1
Binary files /dev/null and b/login_user_detail/static/description/assets/icons/pos-black.png differ
diff --git a/login_user_detail/static/description/assets/icons/puzzle.png b/login_user_detail/static/description/assets/icons/puzzle.png
new file mode 100644
index 000000000..65cf854e7
Binary files /dev/null and b/login_user_detail/static/description/assets/icons/puzzle.png differ
diff --git a/login_user_detail/static/description/assets/icons/restaurant-black.png b/login_user_detail/static/description/assets/icons/restaurant-black.png
new file mode 100644
index 000000000..4a35eb939
Binary files /dev/null and b/login_user_detail/static/description/assets/icons/restaurant-black.png differ
diff --git a/login_user_detail/static/description/assets/icons/service-black.png b/login_user_detail/static/description/assets/icons/service-black.png
new file mode 100644
index 000000000..301ab51cb
Binary files /dev/null and b/login_user_detail/static/description/assets/icons/service-black.png differ
diff --git a/login_user_detail/static/description/assets/icons/trading-black.png b/login_user_detail/static/description/assets/icons/trading-black.png
new file mode 100644
index 000000000..9398ba2f1
Binary files /dev/null and b/login_user_detail/static/description/assets/icons/trading-black.png differ
diff --git a/login_user_detail/static/description/assets/icons/training.png b/login_user_detail/static/description/assets/icons/training.png
new file mode 100644
index 000000000..884ca024d
Binary files /dev/null and b/login_user_detail/static/description/assets/icons/training.png differ
diff --git a/login_user_detail/static/description/assets/icons/update.png b/login_user_detail/static/description/assets/icons/update.png
new file mode 100644
index 000000000..ecbc5a01a
Binary files /dev/null and b/login_user_detail/static/description/assets/icons/update.png differ
diff --git a/login_user_detail/static/description/assets/icons/user.png b/login_user_detail/static/description/assets/icons/user.png
new file mode 100644
index 000000000..6ffb23d9f
Binary files /dev/null and b/login_user_detail/static/description/assets/icons/user.png differ
diff --git a/login_user_detail/static/description/assets/icons/wrench.png b/login_user_detail/static/description/assets/icons/wrench.png
new file mode 100644
index 000000000..6c04dea0f
Binary files /dev/null and b/login_user_detail/static/description/assets/icons/wrench.png differ
diff --git a/login_user_detail/static/description/assets/modules/approval_image.png b/login_user_detail/static/description/assets/modules/approval_image.png
new file mode 100644
index 000000000..84fe94e80
Binary files /dev/null and b/login_user_detail/static/description/assets/modules/approval_image.png differ
diff --git a/login_user_detail/static/description/assets/modules/dynamic_image.png b/login_user_detail/static/description/assets/modules/dynamic_image.png
new file mode 100644
index 000000000..f55c47e0f
Binary files /dev/null and b/login_user_detail/static/description/assets/modules/dynamic_image.png differ
diff --git a/login_user_detail/static/description/assets/modules/list_view_image.png b/login_user_detail/static/description/assets/modules/list_view_image.png
new file mode 100644
index 000000000..510d36ae9
Binary files /dev/null and b/login_user_detail/static/description/assets/modules/list_view_image.png differ
diff --git a/login_user_detail/static/description/assets/modules/multiple_ref_image.png b/login_user_detail/static/description/assets/modules/multiple_ref_image.png
new file mode 100644
index 000000000..3fe90e552
Binary files /dev/null and b/login_user_detail/static/description/assets/modules/multiple_ref_image.png differ
diff --git a/login_user_detail/static/description/assets/modules/print_image.png b/login_user_detail/static/description/assets/modules/print_image.png
new file mode 100644
index 000000000..b470725a1
Binary files /dev/null and b/login_user_detail/static/description/assets/modules/print_image.png differ
diff --git a/login_user_detail/static/description/assets/modules/product_return_image.png b/login_user_detail/static/description/assets/modules/product_return_image.png
new file mode 100644
index 000000000..3afc14722
Binary files /dev/null and b/login_user_detail/static/description/assets/modules/product_return_image.png differ
diff --git a/login_user_detail/static/description/assets/screenshots/hero.png b/login_user_detail/static/description/assets/screenshots/hero.png
new file mode 100644
index 000000000..3145df18a
Binary files /dev/null and b/login_user_detail/static/description/assets/screenshots/hero.png differ
diff --git a/login_user_detail/static/description/assets/screenshots/screenshot1.png b/login_user_detail/static/description/assets/screenshots/screenshot1.png
new file mode 100644
index 000000000..4d7002e2c
Binary files /dev/null and b/login_user_detail/static/description/assets/screenshots/screenshot1.png differ
diff --git a/login_user_detail/static/description/banner.png b/login_user_detail/static/description/banner.png
new file mode 100644
index 000000000..4fbe85ac1
Binary files /dev/null and b/login_user_detail/static/description/banner.png differ
diff --git a/login_user_detail/static/description/cybro_logo.png b/login_user_detail/static/description/cybro_logo.png
new file mode 100755
index 000000000..bb309114c
Binary files /dev/null and b/login_user_detail/static/description/cybro_logo.png differ
diff --git a/login_user_detail/static/description/cybrosys-login-user-details.png b/login_user_detail/static/description/cybrosys-login-user-details.png
new file mode 100755
index 000000000..38477eeed
Binary files /dev/null and b/login_user_detail/static/description/cybrosys-login-user-details.png differ
diff --git a/login_user_detail/static/description/icon.png b/login_user_detail/static/description/icon.png
new file mode 100644
index 000000000..850496cd0
Binary files /dev/null and b/login_user_detail/static/description/icon.png differ
diff --git a/login_user_detail/static/description/index.html b/login_user_detail/static/description/index.html
new file mode 100644
index 000000000..4db4af36c
--- /dev/null
+++ b/login_user_detail/static/description/index.html
@@ -0,0 +1,524 @@
+
+
+
+
+ User Log Details
+
+ User Log Details, Record login date, IP Address of login user.
+
\ No newline at end of file
diff --git a/login_user_detail/static/description/login.png b/login_user_detail/static/description/login.png
new file mode 100755
index 000000000..38477eeed
Binary files /dev/null and b/login_user_detail/static/description/login.png differ
diff --git a/login_user_detail/views/login_user_views.xml b/login_user_detail/views/login_user_views.xml
new file mode 100755
index 000000000..1b49d4f1c
--- /dev/null
+++ b/login_user_detail/views/login_user_views.xml
@@ -0,0 +1,42 @@
+
+
+
+
+ Login User Details
+ login.detail
+
+
+
+
+
+
+ Login User Details
+ login.detail
+
+
+
+
+
+
+
+
+
+
+ Login User Details
+ login.detail
+ tree,form
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mobile_service_shop/README.rst b/mobile_service_shop/README.rst
new file mode 100644
index 000000000..94afe0acf
--- /dev/null
+++ b/mobile_service_shop/README.rst
@@ -0,0 +1,34 @@
+Mobile Service Management
+=========================
+Module for mobile service shop daily activities
+
+Configuration
+=============
+* No additional configurations needed
+
+Company
+-------
+* `Cybrosys Techno Solutions `__
+
+Credits
+-------
+* Developers: Milind Mohan @ Cybrosys, odoo@cybrosys.com
+ Mohammed Shahil M P @cybrosys, odoo@cybrosys.com
+
+Bug Tracker
+-----------
+Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported.
+
+Maintainer
+==========
+.. image:: https://cybrosys.com/images/logo.png
+ :target: https://cybrosys.com
+
+This module is maintained by Cybrosys Technologies.
+
+For support and more information, please visit `Our Website `__
+
+Further information
+===================
+HTML Description: ``__
+
diff --git a/mobile_service_shop/__init__.py b/mobile_service_shop/__init__.py
new file mode 100644
index 000000000..52d4e9e57
--- /dev/null
+++ b/mobile_service_shop/__init__.py
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# Author: Milind Mohan @ Cybrosys, (odoo@cybrosys.com)
+# Mohammed Shahil M P @ Cybrosys, (odoo@cybrosys.com)
+# You can modify it under the terms of the GNU LESSER
+# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+
+from . import models
+from . import wizard
diff --git a/mobile_service_shop/__manifest__.py b/mobile_service_shop/__manifest__.py
new file mode 100644
index 000000000..8e6c1951a
--- /dev/null
+++ b/mobile_service_shop/__manifest__.py
@@ -0,0 +1,56 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# Author: Milind Mohan @ Cybrosys, (odoo@cybrosys.com)
+# Mohammed Shahil M P @ Cybrosys, (odoo@cybrosys.com)
+# Noorjahan @ Cybrosys, (odoo@cybrosys.com)
+# You can modify it under the terms of the GNU AFFERO
+# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+{
+ 'name': 'Mobile Service Management',
+ 'version': '15.0.1.0.0',
+ 'summary': 'Module for managing mobile service shop daily activities.',
+ 'category': 'Industries',
+ 'author': 'Cybrosys Techno Solutions',
+ 'company': 'Cybrosys Techno Solutions',
+ 'website': 'https://www.cybrosys.com',
+ 'depends': ['base', 'stock_account', 'mail', 'product', 'account'],
+ 'data': ['security/security.xml',
+ 'security/ir.model.access.csv',
+ 'views/mobile_service_views.xml',
+ 'views/product_template.xml',
+ 'views/terms_and_condition.xml',
+ 'views/complaint_template.xml',
+ 'views/complaint_type.xml',
+ 'views/brand_models.xml',
+ 'views/brand.xml',
+ 'wizard/mobile_create_invoice_views.xml',
+ 'reports/mobile_service_ticket.xml',
+ 'reports/service_ticket_template.xml',
+ 'data/mobile_service_data.xml',
+ 'data/mobile_service_email_template.xml'],
+ 'images': ['static/description/banner.png'],
+ 'assets': {
+ 'web.assets_backend': [
+ 'mobile_service_shop/static/src/css/mobile_service.css',
+ ],
+ },
+ 'installable': True,
+ 'application': True,
+ 'auto_install': False,
+ 'license': 'LGPL-3',
+}
\ No newline at end of file
diff --git a/mobile_service_shop/data/mobile_service_data.xml b/mobile_service_shop/data/mobile_service_data.xml
new file mode 100644
index 000000000..f4b1fa2b5
--- /dev/null
+++ b/mobile_service_shop/data/mobile_service_data.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+ Mobile Service
+ sale
+ SERV
+ TRUE
+
+
+ Mobile Service Charge
+ service
+
+
+
+ Mobile Service Advance
+ service
+
+
+
+
+
\ No newline at end of file
diff --git a/mobile_service_shop/data/mobile_service_email_template.xml b/mobile_service_shop/data/mobile_service_email_template.xml
new file mode 100644
index 000000000..99e7894a4
--- /dev/null
+++ b/mobile_service_shop/data/mobile_service_email_template.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+ Service Status Email
+
+ ${(object.user_id.email |safe}
+ ${object.person_name.email |safe}
+ Ref ${object.name or 'n/a' }
+
+ ${object.person_name.lang}
+ Dear ${object.person_name.name},
+
Your service request for ${object.brand_name.brand_name or 'n/a' } (${object.model_name.mobile_brand_models or 'n/a' }) with reference no ${object.name or 'n/a' } has been processed to ${object.service_state or 'n/a' } stage.
+
If you have any questions, please let us know.
+
Best regards,
]]>
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mobile_service_shop/doc/RELEASE_NOTES.md b/mobile_service_shop/doc/RELEASE_NOTES.md
new file mode 100755
index 000000000..f8d2bd427
--- /dev/null
+++ b/mobile_service_shop/doc/RELEASE_NOTES.md
@@ -0,0 +1,7 @@
+## Module
+
+#### 05.10.2020
+#### Version 15.0.1.0.0
+#### ADD
+
+Initial Commit.
\ No newline at end of file
diff --git a/mobile_service_shop/models/__init__.py b/mobile_service_shop/models/__init__.py
new file mode 100644
index 000000000..be71dbc02
--- /dev/null
+++ b/mobile_service_shop/models/__init__.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# Author: Milind Mohan @ Cybrosys, (odoo@cybrosys.com)
+# Mohammed Shahil M P @ Cybrosys, (odoo@cybrosys.com)
+# You can modify it under the terms of the GNU AFFERO
+# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from . import mobile_service
+from . import service_ticket
+from . import product_order_line
+from . import product
\ No newline at end of file
diff --git a/mobile_service_shop/models/mobile_service.py b/mobile_service_shop/models/mobile_service.py
new file mode 100644
index 000000000..ac4745ce6
--- /dev/null
+++ b/mobile_service_shop/models/mobile_service.py
@@ -0,0 +1,402 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# Author: Milind Mohan @ Cybrosys, (odoo@cybrosys.com)
+# Mohammed Shahil M P @ Cybrosys, (odoo@cybrosys.com)
+# You can modify it under the terms of the GNU AFFERO
+# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+#############################################################################
+from datetime import datetime, date, timedelta
+from odoo import models, fields, api, _
+from odoo.exceptions import Warning, UserError
+import pytz
+
+
+class MobileServiceShop(models.Model):
+ _name = 'mobile.service'
+ _rec_name = 'name'
+ _inherit = ['mail.thread', 'mail.activity.mixin']
+
+ name = fields.Char(string='Service Number', copy=False, default="New")
+ person_name = fields.Many2one('res.partner', string="Customer Name", required=True)
+ contact_no = fields.Char(related='person_name.mobile', string="Contact Number")
+ email_id = fields.Char(related='person_name.email', string="Email")
+
+ street = fields.Char(related='person_name.street', string="Address")
+ street2 = fields.Char(related='person_name.street2', string="Address")
+ city = fields.Char(related='person_name.city', string="Address")
+ state_id = fields.Many2one(related='person_name.state_id', string="Address")
+ zip = fields.Char(related='person_name.zip', string="Address")
+ country_id = fields.Many2one(related='person_name.country_id', string="Address")
+
+ brand_name = fields.Many2one('mobile.brand', string="Mobile Brand")
+ is_in_warranty = fields.Boolean(
+ 'In Warranty', default=False,
+ help="Specify if the product is in warranty.")
+
+ warranty_number = fields.Char(string="Warranty No ", help="warranty details")
+
+ re_repair = fields.Boolean(
+ 'Re-repair', default=False,
+ help="Re-repairing.")
+
+ imei_no = fields.Char(string="IMEI Number")
+
+ model_name = fields.Many2one('brand.model', string="Model", domain="[('mobile_brand_name','=',brand_name)]")
+ image_medium = fields.Binary(related='model_name.image_medium', store=True, attachment=True)
+ date_request = fields.Date(string="Requested date", default=fields.Date.context_today)
+ return_date = fields.Date(string="Return date", required=True)
+ technician_name = fields.Many2one('res.users', string="Technician Name",
+ default=lambda self: self.env.user, required=True)
+ service_state = fields.Selection([('draft', 'Draft'), ('assigned', 'Assigned'),
+ ('completed', 'Completed'), ('returned', 'Returned'),
+ ('not_solved', 'Not solved')],
+ string='Service Status', default='draft', track_visibility='always')
+
+ complaints_tree = fields.One2many('mobile.complaint.tree', 'complaint_id', string='Complaints Tree')
+
+ product_order_line = fields.One2many('product.order.line', 'product_order_id', string='Parts Order Lines')
+
+ internal_notes = fields.Text(string="Internal notes")
+ invoice_count = fields.Integer(compute='_invoice_count', string='# Invoice', copy=False)
+ invoice_ids = fields.Many2many("account.move", string='Invoices', compute="_get_invoiced", readonly=True,
+ copy=False)
+
+ first_payment_inv = fields.Many2one('account.move', copy=False)
+
+ first_invoice_created = fields.Boolean(string="First Invoice Created", invisible=True, copy=False)
+
+ journal_type = fields.Many2one('account.journal', 'Journal', invisible=True,
+ default=lambda self: self.env['account.journal'].search([('code', '=', 'SERV')]))
+
+ company_id = fields.Many2one('res.company', 'Company',
+ default=lambda self: self.env['res.company']._company_default_get('mobile.service'))
+
+ @api.model
+ def _default_picking_transfer(self):
+ type_obj = self.env['stock.picking.type']
+ company_id = self.env.context.get('company_id') or self.env.user.company_id.id
+ types = type_obj.search([('code', '=', 'outgoing'), ('warehouse_id.company_id', '=', company_id)], limit=1)
+ if not types:
+ types = type_obj.search([('code', '=', 'outgoing'), ('warehouse_id', '=', False)])
+ return types[:4]
+
+ stock_picking_id = fields.Many2one('stock.picking', string="Picking Id")
+
+ picking_transfer_id = fields.Many2one('stock.picking.type', 'Deliver To', required=True,
+ default=_default_picking_transfer,
+ help="This will determine picking type of outgoing shipment")
+
+ picking_count = fields.Integer()
+
+ @api.onchange('return_date')
+ def check_date(self):
+ if self.return_date != False:
+ return_date_string = datetime.strptime(str(self.return_date), "%Y-%m-%d")
+ request_date_string = datetime.strptime(str(self.date_request), "%Y-%m-%d")
+ if return_date_string < request_date_string:
+ raise UserError("Return date should be greater than requested date")
+
+ def approve(self):
+ self.service_state = 'assigned'
+
+ def complete(self):
+ self.service_state = 'completed'
+
+ def return_to(self):
+ self.service_state = 'returned'
+
+ def not_solved(self):
+ self.service_state = 'not_solved'
+
+ def action_send_mail(self):
+ '''
+ This function opens a window to compose an email, with the edi sale template message loaded by default
+ '''
+ self.ensure_one()
+ ir_model_data = self.env['ir.model.data']
+ try:
+ template_id = ir_model_data._xmlid_lookup('mobile_service_shop.email_template_mobile_service')[2]
+ except ValueError:
+ template_id = False
+ try:
+ compose_form_id = ir_model_data._xmlid_lookup('mail.email_compose_message_wizard_form')[2]
+ except ValueError:
+ compose_form_id = False
+ ctx = {
+ 'default_model': 'mobile.service',
+ 'default_res_id': self.ids[0],
+ 'default_use_template': bool(template_id),
+ 'default_template_id': template_id,
+ 'default_composition_mode': 'comment',
+ }
+ return {
+ 'name': _('Compose Email'),
+ 'type': 'ir.actions.act_window',
+ 'view_mode': 'form',
+ 'res_model': 'mail.compose.message',
+ 'views': [(compose_form_id, 'form')],
+ 'view_id': compose_form_id,
+ 'target': 'new',
+ 'context': ctx,
+ }
+
+ def return_advance(self):
+ inv_obj = self.env['account.move'].search([('invoice_origin', '=', self.name)])
+ inv_ids = []
+ for each in inv_obj:
+ inv_ids.append(each.id)
+ view_id = self.env.ref('account.view_move_form').id
+ if inv_ids:
+ if len(inv_ids) <= 1:
+ value = {
+ 'view_mode': 'form',
+ 'res_model': 'account.move',
+ 'view_id': view_id,
+ 'type': 'ir.actions.act_window',
+ 'name': 'Invoice',
+ 'res_id': inv_ids and inv_ids[0]
+ }
+ else:
+ value = {
+ 'domain': str([('id', 'in', inv_ids)]),
+ 'view_mode': 'tree,form',
+ 'res_model': 'account.move',
+ 'view_id': False,
+ 'type': 'ir.actions.act_window',
+ 'name': 'Invoice',
+ 'res_id': inv_ids
+ }
+
+ return value
+ else:
+ raise UserError("No invoice created")
+
+ def _invoice_count(self):
+ invoice_ids = self.env['account.move'].search([('invoice_origin', '=', self.name)])
+ self.invoice_count = len(invoice_ids)
+
+ @api.model
+ def create(self, vals):
+ print(self.env.user.company_id)
+ if 'company_id' in vals:
+ vals['name'] = self.env['ir.sequence'].with_context(force_company=self.env.user.company_id.id).next_by_code(
+ 'mobile.service') or _('New')
+ else:
+ vals['name'] = self.env['ir.sequence'].next_by_code('mobile.service') or _('New')
+ vals['service_state'] = 'draft'
+ return super(MobileServiceShop, self).create(vals)
+
+ def unlink(self):
+ for i in self:
+ if i.service_state != 'draft':
+ raise UserError(_('You cannot delete an assigned service request'))
+ return super(MobileServiceShop, self).unlink()
+
+ def action_invoice_create_wizard(self):
+
+ return {
+ 'name': _('Create Invoice'),
+ 'view_mode': 'form',
+ 'res_model': 'mobile.invoice',
+ 'type': 'ir.actions.act_window',
+ 'target': 'new'
+ }
+
+ def action_post_stock(self):
+ flag = 0
+ for order in self.product_order_line:
+ if order.product_uom_qty > order.qty_stock_move:
+ flag = 1
+ pick = {
+ 'picking_type_id': self.picking_transfer_id.id,
+ 'partner_id': self.person_name.id,
+ 'origin': self.name,
+ 'location_dest_id': self.person_name.property_stock_customer.id,
+ 'location_id': self.picking_transfer_id.default_location_src_id.id,
+ }
+
+ picking = self.env['stock.picking'].create(pick)
+ self.stock_picking_id = picking.id
+ self.picking_count = len(picking)
+ moves = order.filtered(
+ lambda r: r.product_id.type in ['product', 'consu'])._create_stock_moves_transfer(picking)
+ move_ids = moves._action_confirm()
+ move_ids._action_assign()
+ if order.product_uom_qty < order.qty_stock_move:
+ raise UserError(_('Used quantity is less than quantity stock move posted. '))
+ if flag != 1:
+ raise UserError(_('Nothing to post stock move'))
+ if flag != 1:
+ raise UserError(_('Nothing to post stock move'))
+
+ def action_view_invoice(self):
+ self.ensure_one()
+ ctx = dict(
+ create=False,
+ )
+ action = {
+ 'name': _("Invoices"),
+ 'type': 'ir.actions.act_window',
+ 'res_model': 'account.move',
+ 'target': 'current',
+ 'context': ctx
+ }
+ invoice_ids = self.env['account.move'].search([('invoice_origin', '=', self.name)])
+ inv_ids = []
+ for each in invoice_ids:
+ inv_ids.append(each.id)
+ if len(invoice_ids) == 1:
+ invoice = inv_ids and inv_ids[0]
+ action['res_id'] = invoice
+ action['view_mode'] = 'form'
+ action['views'] = [
+ (self.env.ref('account.view_move_form').id, 'form')]
+ else:
+
+ action['view_mode'] = 'tree,form'
+ action['domain'] = [('id', 'in', inv_ids)]
+ return action
+ # inv_obj = self.env['account.move'].search([('invoice_origin', '=', self.name)])
+ # inv_ids = []
+ # for each in inv_obj:
+ # inv_ids.append(each.id)
+ # view_id = self.env.ref('account.view_move_form').id
+ # ctx = dict(
+ # create=False,
+ # )
+ # if inv_ids:
+ # if len(inv_ids) <= 1:
+ # value = {
+ # 'view_mode': 'form',
+ # 'res_model': 'account.move',
+ # 'view_id': view_id,
+ # 'type': 'ir.actions.act_window',
+ # 'name': 'Invoice',
+ # 'context': ctx,
+ # 'res_id': inv_ids and inv_ids[0]
+ # }
+ # else:
+ # value = {
+ # 'domain': str([('id', 'in', inv_ids)]),
+ # 'view_mode': 'tree,form',
+ # 'res_model': 'account.move',
+ # 'view_id': False,
+ # 'type': 'ir.actions.act_window',
+ # 'context': ctx,
+ # 'name': 'Invoice',
+ # 'res_id': inv_ids
+ # }
+ #
+ # return value
+
+ def get_ticket(self):
+ self.ensure_one()
+ user = self.env['res.users'].browse(self.env.uid)
+ if user.tz:
+ tz = pytz.timezone(user.tz)
+ time = pytz.utc.localize(datetime.now()).astimezone(tz)
+ date_today = time.strftime("%Y-%m-%d %H:%M %p")
+ else:
+ date_today = datetime.strftime(datetime.now(), "%Y-%m-%d %I:%M:%S %p")
+ complaint_text = ""
+ description_text = ""
+ complaint_id = self.env['mobile.complaint.tree'].search([('complaint_id', '=', self.id)])
+ if complaint_id:
+ for obj in complaint_id:
+ complaint = obj.complaint_type_tree
+ description = obj.description_tree
+ complaint_text = complaint.complaint_type + ", " + complaint_text
+ if description.description:
+ description_text = description.description + ", " + description_text
+ else:
+ for obj in complaint_id:
+ complaint = obj.complaint_type_tree
+ complaint_text = complaint.complaint_type + ", " + complaint_text
+ data = {
+ 'ids': self.ids,
+ 'model': self._name,
+ 'date_today': date_today,
+ 'date_request': self.date_request,
+ 'date_return': self.return_date,
+ 'sev_id': self.name,
+ 'warranty': self.is_in_warranty,
+ 'customer_name': self.person_name.name,
+ 'imei_no': self.imei_no,
+ 'technician': self.technician_name.name,
+ 'complaint_types': complaint_text,
+ 'complaint_description': description_text,
+ 'mobile_brand': self.brand_name.brand_name,
+ 'model_name': self.model_name.mobile_brand_models,
+
+ }
+ return self.env.ref('mobile_service_shop.mobile_service_ticket').report_action(self, data=data)
+
+
+class MobileBrand(models.Model):
+ _name = 'mobile.brand'
+ _rec_name = 'brand_name'
+
+ brand_name = fields.Char(string="Mobile Brand", required=True)
+
+
+class MobileComplaintType(models.Model):
+ _name = 'mobile.complaint'
+ _rec_name = 'complaint_type'
+
+ complaint_type = fields.Char(string="Complaint Type", required=True)
+
+
+class MobileComplaintTypeTemplate(models.Model):
+ _name = 'mobile.complaint.description'
+ _rec_name = 'description'
+
+ complaint_type_template = fields.Many2one('mobile.complaint', string="Complaint Type Template", required=True)
+ description = fields.Text(string="Complaint Description")
+
+
+class MobileComplaintTree(models.Model):
+ _name = 'mobile.complaint.tree'
+ _rec_name = 'complaint_type_tree'
+
+ complaint_id = fields.Many2one('mobile.service')
+
+ complaint_type_tree = fields.Many2one('mobile.complaint', string="Category", required=True)
+ description_tree = fields.Many2one('mobile.complaint.description', string="Description",
+ domain="[('complaint_type_template','=',complaint_type_tree)]")
+
+
+class MobileBrandModels(models.Model):
+ _name = 'brand.model'
+ _rec_name = 'mobile_brand_models'
+
+ mobile_brand_name = fields.Many2one('mobile.brand', string="Mobile Brand", required=True)
+ mobile_brand_models = fields.Char(string="Model Name", required=True)
+ image_medium = fields.Binary(string='image', store=True, attachment=True)
+
+
+class MobileServiceTermsAndConditions(models.Model):
+ _name = 'terms.conditions'
+ _rec_name = 'terms_id'
+
+ terms_id = fields.Char(String="Terms and condition", compute="_find_id")
+ terms_conditions = fields.Text(string="Terms and Conditions")
+
+ def _find_id(self):
+ self.terms_id = self.id or ''
+
+
diff --git a/mobile_service_shop/models/product.py b/mobile_service_shop/models/product.py
new file mode 100644
index 000000000..ca57029fe
--- /dev/null
+++ b/mobile_service_shop/models/product.py
@@ -0,0 +1,36 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# Author: Milind Mohan @ Cybrosys, (odoo@cybrosys.com)
+# Mohammed Shahil M P @ Cybrosys, (odoo@cybrosys.com)
+# You can modify it under the terms of the GNU AFFERO
+# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from odoo import models, fields, api, _
+
+
+class ProductProduct(models.Model):
+ _inherit = 'product.template'
+
+ is_a_parts = fields.Boolean(
+ 'Is a Mobile Part', default=False,
+ help="Specify if the product is a mobile part or not.")
+
+ brand_name = fields.Many2one('mobile.brand', String="Brand", help="Select a mobile brand for the part")
+ model_name = fields.Many2one('brand.model', String="Model Name", domain="[('mobile_brand_name','=',brand_name)]",
+ help="Select a model for the part")
+ model_colour = fields.Char(string="Colour", help="colour for the part")
+ extra_descriptions = fields.Text(string="Note")
\ No newline at end of file
diff --git a/mobile_service_shop/models/product_order_line.py b/mobile_service_shop/models/product_order_line.py
new file mode 100644
index 000000000..33be7d3f5
--- /dev/null
+++ b/mobile_service_shop/models/product_order_line.py
@@ -0,0 +1,91 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# Author: Milind Mohan @ Cybrosys, (odoo@cybrosys.com)
+# Mohammed Shahil M P @ Cybrosys, (odoo@cybrosys.com)
+# You can modify it under the terms of the GNU AFFERO
+# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from odoo import models, fields, api, _
+
+
+class ProductOrderLine(models.Model):
+
+ _name = 'product.order.line'
+
+ product_order_id = fields.Many2one('mobile.service')
+
+ product_id = fields.Many2one('product.product', string='Product',
+ domain="[('is_a_parts','=', True)]", required=True)
+ product_uom_qty = fields.Float(string='Used Quantity', default=1.0, required=True)
+ price_unit = fields.Float(string='Unit Price', default=0.0, required=True)
+ qty_invoiced = fields.Float(string='Invoiced qty', readonly=True)
+ qty_stock_move = fields.Float(string='Stock Move Posted Qty', readonly=True)
+ part_price = fields.Char(compute='_compute_amount', string='Price', readonly=True, store=True)
+ product_uom = fields.Char(string='Unit of Measure', required=True)
+
+ @api.onchange('product_id')
+ def change_prod(self):
+ self.ensure_one()
+ if self.product_id:
+ product_template_obj = self.product_id.product_tmpl_id
+ self.price_unit = product_template_obj.list_price
+ self.product_uom = product_template_obj.uom_id.name
+
+ @api.depends('product_uom_qty', 'product_id')
+ def _compute_amount(self):
+ """
+ Compute the amount
+ """
+ for line in self:
+ price = line.price_unit * line.product_uom_qty
+
+ line.update({
+ 'part_price': price,
+ })
+
+ def _create_stock_moves_transfer(self, picking):
+ moves = self.env['stock.move']
+ done = self.env['stock.move'].browse()
+ if self.product_id.product_tmpl_id.type != 'service':
+ price_unit = self.price_unit
+ template = {
+ 'name': self.product_id.product_tmpl_id.name or '',
+ 'product_id': self.product_id.id,
+ 'product_uom': self.product_id.product_tmpl_id.uom_id.id,
+ 'location_id': picking.picking_type_id.default_location_src_id.id,
+ 'location_dest_id': self.product_order_id.person_name.property_stock_customer.id,
+ 'picking_id': picking.id,
+ 'move_dest_ids': False,
+ 'state': 'draft',
+ 'company_id': self.product_order_id.company_id.id,
+ 'price_unit': price_unit,
+ 'picking_type_id': picking.picking_type_id.id,
+ 'route_ids': 1 and [
+ (6, 0, [x.id for x in self.env['stock.location.route'].search([('id', 'in', (2, 3))])])] or [],
+ 'warehouse_id': picking.picking_type_id.warehouse_id.id,
+ }
+ qty = self.product_uom_qty - self.qty_stock_move
+ print(qty)
+ diff_quantity = qty
+ tmp = template.copy()
+ tmp.update({
+ 'product_uom_qty': diff_quantity,
+ })
+ template['product_uom_qty'] = diff_quantity
+ done += moves.create(template)
+ self.qty_stock_move = self.qty_stock_move + qty
+ return done
\ No newline at end of file
diff --git a/mobile_service_shop/models/service_ticket.py b/mobile_service_shop/models/service_ticket.py
new file mode 100755
index 000000000..cb224f9eb
--- /dev/null
+++ b/mobile_service_shop/models/service_ticket.py
@@ -0,0 +1,46 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# Author: Milind Mohan @ Cybrosys, (odoo@cybrosys.com)
+# Mohammed Shahil M P @ Cybrosys, (odoo@cybrosys.com)
+# You can modify it under the terms of the GNU AFFERO
+# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from odoo import models, api
+
+
+class StockMoveReport(models.AbstractModel):
+
+ _name = 'report.mobile_service_shop.mobile_service_ticket_template'
+
+ @api.model
+ def _get_report_values(self, docids, data):
+ terms = self.env['terms.conditions'].search([])
+ return {
+ 'date_today': data['date_today'],
+ 'date_request': data['date_request'],
+ 'date_return': data['date_return'],
+ 'sev_id': data['sev_id'],
+ 'imei_no': data['imei_no'],
+ 'technician': data['technician'],
+ 'complaint_types': data['complaint_types'],
+ 'complaint_description': data['complaint_description'],
+ 'mobile_brand': data['mobile_brand'],
+ 'model_name': data['model_name'],
+ 'customer_name': data['customer_name'],
+ 'warranty': data['warranty'],
+ 'terms': terms,
+ }
diff --git a/mobile_service_shop/reports/mobile_service_ticket.xml b/mobile_service_shop/reports/mobile_service_ticket.xml
new file mode 100644
index 000000000..5a9f0cc4d
--- /dev/null
+++ b/mobile_service_shop/reports/mobile_service_ticket.xml
@@ -0,0 +1,12 @@
+
+
+
+
+ Mobile Service Ticket
+ mobile.service
+ qweb-pdf
+ mobile_service_shop.mobile_service_ticket_template
+ mobile_service_shop.mobile_service_ticket_template
+
+
+
\ No newline at end of file
diff --git a/mobile_service_shop/reports/service_ticket_template.xml b/mobile_service_shop/reports/service_ticket_template.xml
new file mode 100644
index 000000000..484091d2f
--- /dev/null
+++ b/mobile_service_shop/reports/service_ticket_template.xml
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
+
+
Service Ticket
+
+
+
+
+
+
Ref no
:
+
+
+
+
Customer name
:
+
+
+
+
+
+
+
+
+
+
Requested date
:
+
+
+
+
Return date
:
+
+
+
+
+
+
+
Device details
+
+
+
+
Sl no.
+
Device brand
+
Model name
+
IMEI
+
Complaints
+
Description
+
+
+
+
+
1
+
+
+
+
+
+
+
+
+
+
+
+ The device is in warranty range !!
+
+
+
+
Terms and Conditions
+
+
+
+
+
+ Keep this ticket safely for future reference.
+ Issue Date :
+
+
+
+
+
\ No newline at end of file
diff --git a/mobile_service_shop/security/ir.model.access.csv b/mobile_service_shop/security/ir.model.access.csv
new file mode 100644
index 000000000..ca693432e
--- /dev/null
+++ b/mobile_service_shop/security/ir.model.access.csv
@@ -0,0 +1,15 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_mobile_service_shop_mobile_service_shop,access.mobile_service_shop.mobile_service_shop,model_mobile_service,mobile_service_group_executer,1,1,0,0
+access_mobile_service_shop_mobile_service_shop11,access.mobile_service_shop.mobile_service_shop11,model_mobile_complaint,mobile_service_group_executer,1,0,0,0
+access_mobile_service_shop_mobile_service_shop22,access.mobile_service_shop.mobile_service_shop22,model_mobile_service,mobile_service_group_manager,1,1,1,1
+access_mobile_service_shop_mobile_service_shop33,access.mobile_service_shop.mobile_service_shop33,model_mobile_brand,mobile_service_group_manager,1,1,1,1
+access_mobile_service_shop_mobile_service_shop44,access.mobile_service_shop.mobile_service_shop44,model_brand_model,mobile_service_group_manager,1,1,1,1
+access_mobile_service_shop_mobile_service_shop66,access.mobile_service_shop.mobile_service_shop66,model_mobile_complaint,mobile_service_group_manager,1,1,1,1
+access_mobile_service_shop_mobile_service_shop88,access.mobile_service_shop.mobile_service_shop88,model_product_template,mobile_service_group_manager,1,1,1,1
+access_mobile_service_shop_mobile_service_shop99,access.mobile_service_shop.mobile_service_shop99,model_mobile_complaint_tree,mobile_service_group_executer,1,1,1,0
+access_mobile_service_shop_mobile_service_shop111,access.mobile_service_shop.mobile_service_shop111,model_mobile_complaint_description,mobile_service_group_manager,1,1,1,1
+access_mobile_service_shop_mobile_service_shop112,access.mobile_service_shop.mobile_service_shop112,model_terms_conditions,mobile_service_group_manager,1,1,1,1
+access_mobile_service_shop_mobile_service_shop113,access.mobile_service_shop.mobile_service_shop113,model_mobile_complaint_tree,mobile_service_group_manager,1,1,1,1
+access_mobile_service_shop_mobile_service_shop114,access.mobile_service_shop.mobile_service_shop114,model_mobile_complaint_description,mobile_service_group_executer,1,1,0,0
+access_mobile_service_shop_mobile_service_shop115,access.mobile_service_shop.mobile_service_shop115,model_product_order_line,mobile_service_group_executer,1,1,1,1
+access_mobile_service_shop_mobile_service_shop116,access.mobile_service_shop.mobile_service_shop116,model_mobile_invoice,mobile_service_group_manager,1,1,1,1
diff --git a/mobile_service_shop/security/security.xml b/mobile_service_shop/security/security.xml
new file mode 100644
index 000000000..c52e40263
--- /dev/null
+++ b/mobile_service_shop/security/security.xml
@@ -0,0 +1,36 @@
+
+
+
+
+ Mobile Service
+ 5
+
+
+
+ Mobile Technician
+
+
+
+
+
+ Manager
+
+
+
+
+
+
+ Mobile Service rule
+
+ [('technician_name','=',user.id),('service_state','!=','draft'), ('company_id','=',user.company_id.id)]
+
+
+
+
+ Mobile Service Manager rule
+
+ [('company_id','=',user.company_id.id)]
+
+
+
+
\ No newline at end of file
diff --git a/mobile_service_shop/static/description/assets/icons/check.png b/mobile_service_shop/static/description/assets/icons/check.png
new file mode 100644
index 000000000..c8e85f51d
Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/check.png differ
diff --git a/mobile_service_shop/static/description/assets/icons/chevron.png b/mobile_service_shop/static/description/assets/icons/chevron.png
new file mode 100644
index 000000000..2089293d6
Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/chevron.png differ
diff --git a/mobile_service_shop/static/description/assets/icons/cogs.png b/mobile_service_shop/static/description/assets/icons/cogs.png
new file mode 100644
index 000000000..95d0bad62
Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/cogs.png differ
diff --git a/mobile_service_shop/static/description/assets/icons/consultation.png b/mobile_service_shop/static/description/assets/icons/consultation.png
new file mode 100644
index 000000000..8319d4baa
Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/consultation.png differ
diff --git a/mobile_service_shop/static/description/assets/icons/ecom-black.png b/mobile_service_shop/static/description/assets/icons/ecom-black.png
new file mode 100644
index 000000000..a9385ff13
Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/ecom-black.png differ
diff --git a/mobile_service_shop/static/description/assets/icons/education-black.png b/mobile_service_shop/static/description/assets/icons/education-black.png
new file mode 100644
index 000000000..3eb09b27b
Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/education-black.png differ
diff --git a/mobile_service_shop/static/description/assets/icons/hotel-black.png b/mobile_service_shop/static/description/assets/icons/hotel-black.png
new file mode 100644
index 000000000..130f613be
Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/hotel-black.png differ
diff --git a/mobile_service_shop/static/description/assets/icons/license.png b/mobile_service_shop/static/description/assets/icons/license.png
new file mode 100644
index 000000000..a5869797e
Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/license.png differ
diff --git a/mobile_service_shop/static/description/assets/icons/lifebuoy.png b/mobile_service_shop/static/description/assets/icons/lifebuoy.png
new file mode 100644
index 000000000..658d56ccc
Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/lifebuoy.png differ
diff --git a/mobile_service_shop/static/description/assets/icons/logo.png b/mobile_service_shop/static/description/assets/icons/logo.png
new file mode 100644
index 000000000..478462d3e
Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/logo.png differ
diff --git a/mobile_service_shop/static/description/assets/icons/manufacturing-black.png b/mobile_service_shop/static/description/assets/icons/manufacturing-black.png
new file mode 100644
index 000000000..697eb0e9f
Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/manufacturing-black.png differ
diff --git a/mobile_service_shop/static/description/assets/icons/pos-black.png b/mobile_service_shop/static/description/assets/icons/pos-black.png
new file mode 100644
index 000000000..97c0f90c1
Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/pos-black.png differ
diff --git a/mobile_service_shop/static/description/assets/icons/puzzle.png b/mobile_service_shop/static/description/assets/icons/puzzle.png
new file mode 100644
index 000000000..65cf854e7
Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/puzzle.png differ
diff --git a/mobile_service_shop/static/description/assets/icons/restaurant-black.png b/mobile_service_shop/static/description/assets/icons/restaurant-black.png
new file mode 100644
index 000000000..4a35eb939
Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/restaurant-black.png differ
diff --git a/mobile_service_shop/static/description/assets/icons/service-black.png b/mobile_service_shop/static/description/assets/icons/service-black.png
new file mode 100644
index 000000000..301ab51cb
Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/service-black.png differ
diff --git a/mobile_service_shop/static/description/assets/icons/trading-black.png b/mobile_service_shop/static/description/assets/icons/trading-black.png
new file mode 100644
index 000000000..9398ba2f1
Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/trading-black.png differ
diff --git a/mobile_service_shop/static/description/assets/icons/training.png b/mobile_service_shop/static/description/assets/icons/training.png
new file mode 100644
index 000000000..884ca024d
Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/training.png differ
diff --git a/mobile_service_shop/static/description/assets/icons/update.png b/mobile_service_shop/static/description/assets/icons/update.png
new file mode 100644
index 000000000..ecbc5a01a
Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/update.png differ
diff --git a/mobile_service_shop/static/description/assets/icons/user.png b/mobile_service_shop/static/description/assets/icons/user.png
new file mode 100644
index 000000000..6ffb23d9f
Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/user.png differ
diff --git a/mobile_service_shop/static/description/assets/icons/wrench.png b/mobile_service_shop/static/description/assets/icons/wrench.png
new file mode 100644
index 000000000..6c04dea0f
Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/wrench.png differ
diff --git a/mobile_service_shop/static/description/assets/modules/approval_image.png b/mobile_service_shop/static/description/assets/modules/approval_image.png
new file mode 100644
index 000000000..84fe94e80
Binary files /dev/null and b/mobile_service_shop/static/description/assets/modules/approval_image.png differ
diff --git a/mobile_service_shop/static/description/assets/modules/budget_image.png b/mobile_service_shop/static/description/assets/modules/budget_image.png
new file mode 100644
index 000000000..fe6aa6fe4
Binary files /dev/null and b/mobile_service_shop/static/description/assets/modules/budget_image.png differ
diff --git a/mobile_service_shop/static/description/assets/modules/export_image.png b/mobile_service_shop/static/description/assets/modules/export_image.png
new file mode 100644
index 000000000..4e4ea0e51
Binary files /dev/null and b/mobile_service_shop/static/description/assets/modules/export_image.png differ
diff --git a/mobile_service_shop/static/description/assets/modules/magento_image.png b/mobile_service_shop/static/description/assets/modules/magento_image.png
new file mode 100644
index 000000000..39de0820f
Binary files /dev/null and b/mobile_service_shop/static/description/assets/modules/magento_image.png differ
diff --git a/mobile_service_shop/static/description/assets/modules/mobile_service_shop_pro.png b/mobile_service_shop/static/description/assets/modules/mobile_service_shop_pro.png
new file mode 100644
index 000000000..68d11114c
Binary files /dev/null and b/mobile_service_shop/static/description/assets/modules/mobile_service_shop_pro.png differ
diff --git a/mobile_service_shop/static/description/assets/modules/pos_image.png b/mobile_service_shop/static/description/assets/modules/pos_image.png
new file mode 100644
index 000000000..c5932894b
Binary files /dev/null and b/mobile_service_shop/static/description/assets/modules/pos_image.png differ
diff --git a/mobile_service_shop/static/description/assets/modules/shopify_image.png b/mobile_service_shop/static/description/assets/modules/shopify_image.png
new file mode 100644
index 000000000..c6d92c16d
Binary files /dev/null and b/mobile_service_shop/static/description/assets/modules/shopify_image.png differ
diff --git a/mobile_service_shop/static/description/assets/screenshots/hero.png b/mobile_service_shop/static/description/assets/screenshots/hero.png
new file mode 100644
index 000000000..7730fad19
Binary files /dev/null and b/mobile_service_shop/static/description/assets/screenshots/hero.png differ
diff --git a/mobile_service_shop/static/description/assets/screenshots/mobile-1.png b/mobile_service_shop/static/description/assets/screenshots/mobile-1.png
new file mode 100644
index 000000000..469ee94d3
Binary files /dev/null and b/mobile_service_shop/static/description/assets/screenshots/mobile-1.png differ
diff --git a/mobile_service_shop/static/description/assets/screenshots/mobile-10.png b/mobile_service_shop/static/description/assets/screenshots/mobile-10.png
new file mode 100644
index 000000000..2faeca8d8
Binary files /dev/null and b/mobile_service_shop/static/description/assets/screenshots/mobile-10.png differ
diff --git a/mobile_service_shop/static/description/assets/screenshots/mobile-11.png b/mobile_service_shop/static/description/assets/screenshots/mobile-11.png
new file mode 100644
index 000000000..eabd6ee18
Binary files /dev/null and b/mobile_service_shop/static/description/assets/screenshots/mobile-11.png differ
diff --git a/mobile_service_shop/static/description/assets/screenshots/mobile-2.png b/mobile_service_shop/static/description/assets/screenshots/mobile-2.png
new file mode 100644
index 000000000..23a105fab
Binary files /dev/null and b/mobile_service_shop/static/description/assets/screenshots/mobile-2.png differ
diff --git a/mobile_service_shop/static/description/assets/screenshots/mobile-3.png b/mobile_service_shop/static/description/assets/screenshots/mobile-3.png
new file mode 100644
index 000000000..3fa818856
Binary files /dev/null and b/mobile_service_shop/static/description/assets/screenshots/mobile-3.png differ
diff --git a/mobile_service_shop/static/description/assets/screenshots/mobile-4.png b/mobile_service_shop/static/description/assets/screenshots/mobile-4.png
new file mode 100644
index 000000000..91fb01252
Binary files /dev/null and b/mobile_service_shop/static/description/assets/screenshots/mobile-4.png differ
diff --git a/mobile_service_shop/static/description/assets/screenshots/mobile-5.png b/mobile_service_shop/static/description/assets/screenshots/mobile-5.png
new file mode 100644
index 000000000..13107ee2a
Binary files /dev/null and b/mobile_service_shop/static/description/assets/screenshots/mobile-5.png differ
diff --git a/mobile_service_shop/static/description/assets/screenshots/mobile-6.png b/mobile_service_shop/static/description/assets/screenshots/mobile-6.png
new file mode 100644
index 000000000..c20cd8e85
Binary files /dev/null and b/mobile_service_shop/static/description/assets/screenshots/mobile-6.png differ
diff --git a/mobile_service_shop/static/description/assets/screenshots/mobile-7.png b/mobile_service_shop/static/description/assets/screenshots/mobile-7.png
new file mode 100644
index 000000000..e954257fd
Binary files /dev/null and b/mobile_service_shop/static/description/assets/screenshots/mobile-7.png differ
diff --git a/mobile_service_shop/static/description/assets/screenshots/mobile-8.png b/mobile_service_shop/static/description/assets/screenshots/mobile-8.png
new file mode 100644
index 000000000..77c1c6c85
Binary files /dev/null and b/mobile_service_shop/static/description/assets/screenshots/mobile-8.png differ
diff --git a/mobile_service_shop/static/description/assets/screenshots/mobile-9.png b/mobile_service_shop/static/description/assets/screenshots/mobile-9.png
new file mode 100644
index 000000000..417ea27ea
Binary files /dev/null and b/mobile_service_shop/static/description/assets/screenshots/mobile-9.png differ
diff --git a/mobile_service_shop/static/description/banner.png b/mobile_service_shop/static/description/banner.png
new file mode 100644
index 000000000..0ab0bc2db
Binary files /dev/null and b/mobile_service_shop/static/description/banner.png differ
diff --git a/mobile_service_shop/static/description/icon.png b/mobile_service_shop/static/description/icon.png
new file mode 100644
index 000000000..f55332537
Binary files /dev/null and b/mobile_service_shop/static/description/icon.png differ
diff --git a/mobile_service_shop/static/description/index.html b/mobile_service_shop/static/description/index.html
new file mode 100644
index 000000000..d94e5a146
--- /dev/null
+++ b/mobile_service_shop/static/description/index.html
@@ -0,0 +1,849 @@
+
+
+
+
+
+
+
+
+ Community
+
+
+ Enterprise
+
+
+
+
+
+
+
+
+
+
+
+ Mobile Service Management
+
+ This module helps in managing mobile service shop daily activities.
+
+ This module is exclusively designed for the mobile service shop for managing their daily activities
+ inside the service center. The module comes integrated with accounting and inventory modules
+ maximizing the efficiency. It comes embedded with features such as adding complaint templates,
+ making it a much user-friendly application. The module also helps in generating service tickets in
+ the workplace.
+
+
+
+
+
+
+ Access Rights
+
+
+
+
+
+
+
+
+
+ Manager
+
+ Manager has the complete access over the mobile shop management.
+
+
+
+
+
+
+
+
+
+ Mobile Technician
+
+ Mobile Technician can read and write service requests and also update the parts usage.
+
+
+
+
+
+
+
+
+
+ Features
+
+
+
+
+
+
+
+
+
+ Service request creation.
+
+
+
+
+
+
+
+
+
+ Assigning service request to technicians
+
+
+
+
+
+
+
+
+
+
+ Mobile service ticket generation
+
+
+
+
+
+
+
+
+
+
+ Tracking the service status
+
+
+
+
+
+
+
+
+
+
+ Integrated with accounting and sales module
+
+
+
+
+
+
+
+
+
+
+ Multi-level access rights
+
+
+
+
+
+
+
+
+
+
+ Mobile complaint templates
+
+
+
+
+
+
+
+
+
+
+ Invoice for parts usage and service charges
+
+
+
+
+
+
+
+
+
+ Email notifications to customer
+
+
+
+
+
+
+
+
+
+ Parts inventory
+
+
+
+
+
+
+
+
+
+
+ Flexible for further customization
+
+
+
+
+
+
+
+
+
+
+
+ Screenshots
+
+
+
+
+ Mobile Service Shop
+
+ When you install the module, an extra menu named Mobile Service is created. Here you can see the
+ service requests and thereafter configure your mobile service shop.
+
+
+
+
+
+ Mobile Service -> Service Request -> Create
+
+ This is the service request creation form. Service request can be created according to the device
+ brand and model. One can assign the technician, service request, provide with warranty details,
+ customer details, IMEI no, request and return dates etc.
+
+
+
+
+
+
+ Generating tickets for service request.
+
+ Here you can create tickets for service requests by using the 'Print Ticket' button.
+
+
+
+
+
+
+
+ Mobile parts inventory
+
+ Here you see the mobile parts used for service processing.
+
+
+
+
+
+
+
+ Invoice for service requests
+
+ Here you can create invoices for service requests.
+
+
+
+
+
+
+
+ Post Stock moves
+
+ No need to create stock moves for parts usage manually. 'Post Stock Moves' will generate stock for
+ the parts usage.
+
+
+
+
+
+
+ Email Notification
+
+ The system will send email notification to the customer for each stage in the service request.
+ Note:- You should configure outgoing and incoming e-mail settings from your Odoo for email service
+
+
+
+
+
+
+ Brands Configuration
+
+ Create mobile brands which is used in service request creation. Mobile Service -> Configuration ->
+ Brands
+
+
+
+
+
+
+ Models Configuration
+
+ You can also create models for different mobile brands from. Mobile Service -> Configuration ->
+ Models
+
+
+
+
+
+
+
+ Complaint Types
+
+
+ You can create different complaint types from. Mobile Service -> Configuration -> Complaint Types
+
+
+
+
+
+
+
+ Complaint Templates
+
+ Complaint Templates can be created from. Mobile Service -> Configuration -> Complaint Templates
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mobile_service_shop/wizard/__init__.py b/mobile_service_shop/wizard/__init__.py
new file mode 100644
index 000000000..b42d7c3d2
--- /dev/null
+++ b/mobile_service_shop/wizard/__init__.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# Author: Milind Mohan @ Cybrosys, (odoo@cybrosys.com)
+# Mohammed Shahil M P @ Cybrosys, (odoo@cybrosys.com)
+# You can modify it under the terms of the GNU AFFERO
+# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from . import mobile_create_invoice
+
diff --git a/mobile_service_shop/wizard/mobile_create_invoice.py b/mobile_service_shop/wizard/mobile_create_invoice.py
new file mode 100644
index 000000000..2e6881296
--- /dev/null
+++ b/mobile_service_shop/wizard/mobile_create_invoice.py
@@ -0,0 +1,157 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# Author: Milind Mohan @ Cybrosys, (odoo@cybrosys.com)
+# Mohammed Shahil M P @ Cybrosys, (odoo@cybrosys.com)
+# You can modify it under the terms of the GNU AFFERO
+# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from odoo import api, fields, models, _
+from odoo.exceptions import Warning, UserError
+from odoo.exceptions import UserError, ValidationError
+
+
+class MobileServiceInvoice(models.Model):
+
+ _name = 'mobile.invoice'
+
+ advance_payment_method = fields.Selection([('advance', 'Advance'), ('full_amount', 'Full amount')],
+ string='Invoice method', default='advance')
+ amount = fields.Integer(string='Amount')
+ number = fields.Char(string='Service Id')
+
+ def action_invoice_create(self):
+ active_id = self._context.get('active_id')
+ service_id = self.env['mobile.service'].search([('id', '=', active_id)])
+ if not service_id.env['product.product'].search([("name", "=", "Mobile Service Advance")]):
+ vals = self._prepare_advance_product()
+ self.env['product.product'].create(vals)
+
+ if not service_id.env['product.product'].search([("name", "=", "Mobile Service Charge")]):
+ vals1 = self._prepare_service_product()
+ self.env['product.product'].create(vals1)
+
+ service_id.first_invoice_created = True
+ inv_obj = self.env['account.move']
+ inv_line_obj = self.env['account.move.line']
+ supplier = service_id.person_name
+ inv_data = {
+ 'move_type': 'out_invoice',
+ 'ref': supplier.name,
+ 'partner_id': supplier.id,
+ 'currency_id': service_id.company_id.currency_id.id,
+ 'journal_id': service_id.journal_type.id,
+ 'invoice_origin': service_id.name,
+ 'company_id': service_id.company_id.id,
+ }
+ inv_id = inv_obj.create(inv_data)
+ service_id.first_payment_inv = inv_id.id
+ self.number = service_id.name
+ if self.advance_payment_method != 'advance':
+ product_id = service_id.env['product.product'].search([("name", "=", "Mobile Service Charge")])
+ else:
+ product_id = service_id.env['product.product'].search([("name", "=", "Mobile Service Advance")])
+
+ if product_id.property_account_income_id.id:
+ income_account = product_id.property_account_income_id.id
+ elif product_id.categ_id.property_account_income_categ_id.id:
+ income_account = product_id.categ_id.property_account_income_categ_id.id
+ else:
+ raise UserError('Please define income account for this product: "%s" (id:%d).' %
+ (product_id.name, product_id.id))
+ flag = 0
+ if self.amount:
+ flag = 1
+ inv_line_data = [(0, 0, {
+ 'name': product_id.name,
+ 'price_unit': self.amount,
+ 'quantity': 1,
+ 'credit': self.amount,
+ 'debit': 0,
+ 'account_id': income_account,
+ 'product_id': product_id.id,
+ 'move_id': inv_id.id,
+ })]
+ inv_id.write({
+ 'invoice_line_ids': inv_line_data})
+ inv_id._recompute_payment_terms_lines()
+
+ sale_order_product = self.env['product.order.line'].search([('product_order_id', '=', service_id.name)])
+ for line_data in sale_order_product:
+ qty = line_data.product_uom_qty - line_data.qty_invoiced
+ if line_data.product_uom_qty < line_data.qty_invoiced:
+ raise UserError(_('Used quantity is less than invoiced quantity'))
+ uom_id = line_data.product_id.product_tmpl_id.uom_id
+ if qty > 0:
+ flag = 1
+ price = line_data.product_id.list_price
+ inv_line_data = [(0, 0, {
+ 'name': line_data.product_id.name,
+ 'price_unit': price,
+ 'quantity': qty,
+ 'product_uom_id': uom_id.id,
+ 'credit': price,
+ 'debit': 0,
+ 'account_id': income_account,
+ 'product_id': line_data.product_id.id,
+ 'move_id': inv_id.id,
+ })]
+ inv_id.write({
+ 'invoice_line_ids': inv_line_data})
+ line_data.qty_invoiced = line_data.qty_invoiced + qty
+ inv_id._recompute_payment_terms_lines()
+
+ inv_id.post()
+ if flag != 1:
+ raise UserError(_('Nothing to create invoice'))
+ imd = service_id.env['ir.model.data']
+ action = self.env.ref('account.action_move_out_invoice_type')
+ list_view_id = imd._xmlid_to_res_id('account.view_move_tree')
+ form_view_id = imd._xmlid_to_res_id('account.view_move_form')
+ result = {
+ 'name': action.name,
+ 'help': action.help,
+ 'type': 'ir.actions.act_window',
+ 'views': [[list_view_id, 'tree'], [form_view_id, 'form'], [False, 'graph'], [False, 'kanban'],
+ [False, 'calendar'], [False, 'pivot']],
+ 'target': action.target,
+ 'context': action.context,
+ 'res_model': 'account.move',
+ }
+ if len(inv_id) > 1:
+ result['domain'] = "[('id','in',%s)]" % inv_id.ids
+ elif len(inv_id) == 1:
+ result['views'] = [(form_view_id, 'form')]
+ result['res_id'] = inv_id.ids[0]
+ else:
+ result = {'type': 'ir.actions.act_window_close'}
+ return result
+
+ def _prepare_advance_product(self):
+ return {
+ 'name': 'Mobile Service Advance',
+ 'type': 'service',
+ 'invoice_policy': 'order',
+ 'company_id': False,
+ }
+
+ def _prepare_service_product(self):
+ return {
+ 'name': 'Mobile Service Charge',
+ 'type': 'service',
+ 'invoice_policy': 'order',
+ 'company_id': False,
+ }
diff --git a/mobile_service_shop/wizard/mobile_create_invoice_views.xml b/mobile_service_shop/wizard/mobile_create_invoice_views.xml
new file mode 100644
index 000000000..612c8e3d8
--- /dev/null
+++ b/mobile_service_shop/wizard/mobile_create_invoice_views.xml
@@ -0,0 +1,37 @@
+
+
+ Create Invoice
+ mobile.invoice
+
+
+
+ Invoices will be created in draft so that you can review
+ them before validation.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Create Invoice
+ ir.actions.act_window
+ mobile.invoice
+ form
+ new
+
+
+
diff --git a/product_barcode/README.rst b/product_barcode/README.rst
new file mode 100644
index 000000000..4727885b9
--- /dev/null
+++ b/product_barcode/README.rst
@@ -0,0 +1,47 @@
+.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
+ :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
+ :alt: License: AGPL-3
+
+Product Barcode Generator
+=========================
+
+Generates EAN13 Standard Barcode for Product.
+Also, introduces a new feature to print product variant price and name on the product label.
+
+Configuration
+=============
+* No additional configurations needed
+
+Company
+-------
+* `Cybrosys Techno Solutions `__
+
+Credits
+-------
+* Developer: Sreejith P @ cybrosys, Contact: odoo@cybrosys.com
+ Niyas Raphy @cybrosys, Contact: odoo@cybrosys.com
+ Version 13: Nimisha Murali@cybrosys,Contact: odoo@cybrosys.com
+ Version 14: Naveen V @cybrosys, Contact: odoo@cybrosys.com
+ Version 15: Noorjahan V @cybrosys, Contact: odoo@cybrosys.com
+
+Contacts
+--------
+* Mail Contact : odoo@cybrosys.com
+* Website : https://cybrosys.com
+
+Bug Tracker
+-----------
+Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported.
+
+Maintainer
+==========
+.. image:: https://cybrosys.com/images/logo.png
+ :target: https://cybrosys.com
+
+This module is maintained by Cybrosys Technologies.
+
+For support and more information, please visit `Our Website `__
+
+Further information
+===================
+HTML Description: ``__
diff --git a/product_barcode/__init__.py b/product_barcode/__init__.py
new file mode 100644
index 000000000..63c68c069
--- /dev/null
+++ b/product_barcode/__init__.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2020-TODAY Cybrosys Technologies().
+# Author: Niyas Raphy and Sreejith P (odoo@cybrosys.com)
+#
+# You can modify it under the terms of the GNU AFFERO
+# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+
+from . import models
diff --git a/product_barcode/__manifest__.py b/product_barcode/__manifest__.py
new file mode 100644
index 000000000..f83a44dba
--- /dev/null
+++ b/product_barcode/__manifest__.py
@@ -0,0 +1,42 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2021-TODAY Cybrosys Technologies().
+# Author: Niyas Raphy and Sreejith P (odoo@cybrosys.com)
+#
+# You can modify it under the terms of the GNU AFFERO
+# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+
+{
+ 'name': 'Product Barcode Generator',
+ 'version': '15.0.1.0.0',
+ 'summary': 'Generates EAN13 Standard Barcode for Product.',
+ 'live_test_url': 'https://www.youtube.com/watch?v=0BrFcOEkWu4&feature=youtu.be',
+ 'category': 'Inventory',
+ 'author': 'Cybrosys Techno solutions',
+ 'maintainer': 'Cybrosys Techno Solutions',
+ 'company': 'Cybrosys Techno Solutions',
+ 'website': 'https://www.cybrosys.com',
+ 'depends': ['stock', 'product'],
+ 'data': [
+ 'views/product_label.xml',
+ ],
+ 'images': ['static/description/banner.png'],
+ 'license': 'AGPL-3',
+ 'installable': True,
+ 'application': False,
+ 'auto_install': False,
+}
diff --git a/product_barcode/doc/RELEASE_NOTES.md b/product_barcode/doc/RELEASE_NOTES.md
new file mode 100644
index 000000000..163ca80e8
--- /dev/null
+++ b/product_barcode/doc/RELEASE_NOTES.md
@@ -0,0 +1,6 @@
+## Module
+
+#### 10.08.2020
+#### Version 15.0.1.0.0
+##### ADD
+- Initial Commit
\ No newline at end of file
diff --git a/product_barcode/models/__init__.py b/product_barcode/models/__init__.py
new file mode 100644
index 000000000..ea3d20c59
--- /dev/null
+++ b/product_barcode/models/__init__.py
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2020-TODAY Cybrosys Technologies().
+# Author: Niyas Raphy and Sreejith P (odoo@cybrosys.com)
+#
+# You can modify it under the terms of the GNU AFFERO
+# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from . import product_form
diff --git a/product_barcode/models/product_form.py b/product_barcode/models/product_form.py
new file mode 100644
index 000000000..3b88c6a9e
--- /dev/null
+++ b/product_barcode/models/product_form.py
@@ -0,0 +1,97 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2020-TODAY Cybrosys Technologies().
+# Author: Niyas Raphy and Sreejith P (odoo@cybrosys.com)
+#
+# You can modify it under the terms of the GNU AFFERO
+# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+
+import math
+import re
+from odoo import api, models
+
+
+class ProductAutoBarcode(models.Model):
+ _inherit = 'product.product'
+
+ @api.model
+ def create(self, vals):
+ res = super(ProductAutoBarcode, self).create(vals)
+ ean = generate_ean(str(res.id))
+ res.barcode = ean
+ return res
+
+
+def ean_checksum(eancode):
+ """returns the checksum of an ean string of length 13, returns -1 if
+ the string has the wrong length"""
+ if len(eancode) != 13:
+ return -1
+ oddsum = 0
+ evensum = 0
+ eanvalue = eancode
+ reversevalue = eanvalue[::-1]
+ finalean = reversevalue[1:]
+
+ for i in range(len(finalean)):
+ if i % 2 == 0:
+ oddsum += int(finalean[i])
+ else:
+ evensum += int(finalean[i])
+ total = (oddsum * 3) + evensum
+
+ check = int(10 - math.ceil(total % 10.0)) % 10
+ return check
+
+
+def check_ean(eancode):
+ """returns True if eancode is a valid ean13 string, or null"""
+ if not eancode:
+ return True
+ if len(eancode) != 13:
+ return False
+ try:
+ int(eancode)
+ except:
+ return False
+ return ean_checksum(eancode) == int(eancode[-1])
+
+
+def generate_ean(ean):
+ """Creates and returns a valid ean13 from an invalid one"""
+ if not ean:
+ return "0000000000000"
+ ean = re.sub("[A-Za-z]", "0", ean)
+ ean = re.sub("[^0-9]", "", ean)
+ ean = ean[:13]
+ if len(ean) < 13:
+ ean = ean + '0' * (13 - len(ean))
+ return ean[:-1] + str(ean_checksum(ean))
+
+
+class ProductTemplateAutoBarcode(models.Model):
+ _inherit = 'product.template'
+
+ @api.model
+ def create(self, vals_list):
+ templates = super(ProductTemplateAutoBarcode, self).create(vals_list)
+ ean = generate_ean(str(templates.id))
+ templates.barcode = ean
+ return templates
+
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/product_barcode/static/description/assets/icons/check.png b/product_barcode/static/description/assets/icons/check.png
new file mode 100644
index 000000000..c8e85f51d
Binary files /dev/null and b/product_barcode/static/description/assets/icons/check.png differ
diff --git a/product_barcode/static/description/assets/icons/chevron.png b/product_barcode/static/description/assets/icons/chevron.png
new file mode 100644
index 000000000..2089293d6
Binary files /dev/null and b/product_barcode/static/description/assets/icons/chevron.png differ
diff --git a/product_barcode/static/description/assets/icons/cogs.png b/product_barcode/static/description/assets/icons/cogs.png
new file mode 100644
index 000000000..95d0bad62
Binary files /dev/null and b/product_barcode/static/description/assets/icons/cogs.png differ
diff --git a/product_barcode/static/description/assets/icons/consultation.png b/product_barcode/static/description/assets/icons/consultation.png
new file mode 100644
index 000000000..8319d4baa
Binary files /dev/null and b/product_barcode/static/description/assets/icons/consultation.png differ
diff --git a/product_barcode/static/description/assets/icons/ecom-black.png b/product_barcode/static/description/assets/icons/ecom-black.png
new file mode 100644
index 000000000..a9385ff13
Binary files /dev/null and b/product_barcode/static/description/assets/icons/ecom-black.png differ
diff --git a/product_barcode/static/description/assets/icons/education-black.png b/product_barcode/static/description/assets/icons/education-black.png
new file mode 100644
index 000000000..3eb09b27b
Binary files /dev/null and b/product_barcode/static/description/assets/icons/education-black.png differ
diff --git a/product_barcode/static/description/assets/icons/hotel-black.png b/product_barcode/static/description/assets/icons/hotel-black.png
new file mode 100644
index 000000000..130f613be
Binary files /dev/null and b/product_barcode/static/description/assets/icons/hotel-black.png differ
diff --git a/product_barcode/static/description/assets/icons/license.png b/product_barcode/static/description/assets/icons/license.png
new file mode 100644
index 000000000..a5869797e
Binary files /dev/null and b/product_barcode/static/description/assets/icons/license.png differ
diff --git a/product_barcode/static/description/assets/icons/lifebuoy.png b/product_barcode/static/description/assets/icons/lifebuoy.png
new file mode 100644
index 000000000..658d56ccc
Binary files /dev/null and b/product_barcode/static/description/assets/icons/lifebuoy.png differ
diff --git a/product_barcode/static/description/assets/icons/manufacturing-black.png b/product_barcode/static/description/assets/icons/manufacturing-black.png
new file mode 100644
index 000000000..697eb0e9f
Binary files /dev/null and b/product_barcode/static/description/assets/icons/manufacturing-black.png differ
diff --git a/product_barcode/static/description/assets/icons/pos-black.png b/product_barcode/static/description/assets/icons/pos-black.png
new file mode 100644
index 000000000..97c0f90c1
Binary files /dev/null and b/product_barcode/static/description/assets/icons/pos-black.png differ
diff --git a/product_barcode/static/description/assets/icons/puzzle.png b/product_barcode/static/description/assets/icons/puzzle.png
new file mode 100644
index 000000000..65cf854e7
Binary files /dev/null and b/product_barcode/static/description/assets/icons/puzzle.png differ
diff --git a/product_barcode/static/description/assets/icons/restaurant-black.png b/product_barcode/static/description/assets/icons/restaurant-black.png
new file mode 100644
index 000000000..4a35eb939
Binary files /dev/null and b/product_barcode/static/description/assets/icons/restaurant-black.png differ
diff --git a/product_barcode/static/description/assets/icons/service-black.png b/product_barcode/static/description/assets/icons/service-black.png
new file mode 100644
index 000000000..301ab51cb
Binary files /dev/null and b/product_barcode/static/description/assets/icons/service-black.png differ
diff --git a/product_barcode/static/description/assets/icons/trading-black.png b/product_barcode/static/description/assets/icons/trading-black.png
new file mode 100644
index 000000000..9398ba2f1
Binary files /dev/null and b/product_barcode/static/description/assets/icons/trading-black.png differ
diff --git a/product_barcode/static/description/assets/icons/training.png b/product_barcode/static/description/assets/icons/training.png
new file mode 100644
index 000000000..884ca024d
Binary files /dev/null and b/product_barcode/static/description/assets/icons/training.png differ
diff --git a/product_barcode/static/description/assets/icons/update.png b/product_barcode/static/description/assets/icons/update.png
new file mode 100644
index 000000000..ecbc5a01a
Binary files /dev/null and b/product_barcode/static/description/assets/icons/update.png differ
diff --git a/product_barcode/static/description/assets/icons/user.png b/product_barcode/static/description/assets/icons/user.png
new file mode 100644
index 000000000..6ffb23d9f
Binary files /dev/null and b/product_barcode/static/description/assets/icons/user.png differ
diff --git a/product_barcode/static/description/assets/icons/wrench.png b/product_barcode/static/description/assets/icons/wrench.png
new file mode 100644
index 000000000..6c04dea0f
Binary files /dev/null and b/product_barcode/static/description/assets/icons/wrench.png differ
diff --git a/product_barcode/static/description/assets/modules/approval_image.png b/product_barcode/static/description/assets/modules/approval_image.png
new file mode 100644
index 000000000..84fe94e80
Binary files /dev/null and b/product_barcode/static/description/assets/modules/approval_image.png differ
diff --git a/product_barcode/static/description/assets/modules/beauty_image.png b/product_barcode/static/description/assets/modules/beauty_image.png
new file mode 100644
index 000000000..a428db2e1
Binary files /dev/null and b/product_barcode/static/description/assets/modules/beauty_image.png differ
diff --git a/product_barcode/static/description/assets/modules/budget_image.png b/product_barcode/static/description/assets/modules/budget_image.png
new file mode 100644
index 000000000..fe6aa6fe4
Binary files /dev/null and b/product_barcode/static/description/assets/modules/budget_image.png differ
diff --git a/product_barcode/static/description/assets/modules/export_image.png b/product_barcode/static/description/assets/modules/export_image.png
new file mode 100644
index 000000000..4e4ea0e51
Binary files /dev/null and b/product_barcode/static/description/assets/modules/export_image.png differ
diff --git a/product_barcode/static/description/assets/modules/magento_image.png b/product_barcode/static/description/assets/modules/magento_image.png
new file mode 100644
index 000000000..39de0820f
Binary files /dev/null and b/product_barcode/static/description/assets/modules/magento_image.png differ
diff --git a/product_barcode/static/description/assets/modules/pos_order_image.png b/product_barcode/static/description/assets/modules/pos_order_image.png
new file mode 100644
index 000000000..1217263a6
Binary files /dev/null and b/product_barcode/static/description/assets/modules/pos_order_image.png differ
diff --git a/product_barcode/static/description/assets/screenshots/hero.gif b/product_barcode/static/description/assets/screenshots/hero.gif
new file mode 100644
index 000000000..faee183b3
Binary files /dev/null and b/product_barcode/static/description/assets/screenshots/hero.gif differ
diff --git a/product_barcode/static/description/assets/screenshots/screenshot1.gif b/product_barcode/static/description/assets/screenshots/screenshot1.gif
new file mode 100644
index 000000000..6ad77ddae
Binary files /dev/null and b/product_barcode/static/description/assets/screenshots/screenshot1.gif differ
diff --git a/product_barcode/static/description/assets/screenshots/screenshot2.png b/product_barcode/static/description/assets/screenshots/screenshot2.png
new file mode 100644
index 000000000..a4cc02de3
Binary files /dev/null and b/product_barcode/static/description/assets/screenshots/screenshot2.png differ
diff --git a/product_barcode/static/description/banner.png b/product_barcode/static/description/banner.png
new file mode 100644
index 000000000..cfb5be33c
Binary files /dev/null and b/product_barcode/static/description/banner.png differ
diff --git a/product_barcode/static/description/barcode_generate_product.gif b/product_barcode/static/description/barcode_generate_product.gif
new file mode 100644
index 000000000..6ad77ddae
Binary files /dev/null and b/product_barcode/static/description/barcode_generate_product.gif differ
diff --git a/product_barcode/static/description/cybro_logo.png b/product_barcode/static/description/cybro_logo.png
new file mode 100644
index 000000000..bb309114c
Binary files /dev/null and b/product_barcode/static/description/cybro_logo.png differ
diff --git a/product_barcode/static/description/icon.png b/product_barcode/static/description/icon.png
new file mode 100644
index 000000000..8267abba5
Binary files /dev/null and b/product_barcode/static/description/icon.png differ
diff --git a/product_barcode/static/description/index.html b/product_barcode/static/description/index.html
new file mode 100644
index 000000000..90364e5b8
--- /dev/null
+++ b/product_barcode/static/description/index.html
@@ -0,0 +1,564 @@
+
+ The module automatically generates EAN13 standard barcode for each product while you create it. The
+ module also introduces a new feature to print product variant price on the product label. Presently
+ Odoo doesn't have these features.
+
+
+
+
+
+
+
+ Features
+
+
+
+
+
+
+
+
+
+ Automatic Barcode Generation
+
+ Generates Barcode Automatically.
+
+
+
+
+
+
+
+
+
+ Print Variant Price
+
+ Print Variant Price on Product Labels.
+
+
+
+
+
+
+
+
+
+ Print Variant Name
+
+ Print Variant Name on Product Labels.
+
+
+
+
+
+
+
+
+ Screenshots
+
+
+
+
+
+ Create a Product
+
+
+
+
+
+
+ Product Labels
+
+ Variant name on label, Variant sale price on label.
+
\ No newline at end of file
diff --git a/product_barcode/static/description/product_label.png b/product_barcode/static/description/product_label.png
new file mode 100644
index 000000000..8a27d6916
Binary files /dev/null and b/product_barcode/static/description/product_label.png differ
diff --git a/product_barcode/views/product_label.xml b/product_barcode/views/product_label.xml
new file mode 100644
index 000000000..054156e71
--- /dev/null
+++ b/product_barcode/views/product_label.xml
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ []
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/user_login_alert/README.rst b/user_login_alert/README.rst
new file mode 100644
index 000000000..a21a755e5
--- /dev/null
+++ b/user_login_alert/README.rst
@@ -0,0 +1,35 @@
+User Login Alert v15
+====================
+
+This module will help to send the notification to users on successful login to his account.
+
+
+Working
+=======
+if user is continuously using the same system the user will be notified only once. If he changes
+the browser or the OS from same system he will receive the mail.
+
+If user logged from another system and if he come back to his original system, for the first time
+he will receive the email
+Configuration
+=============
+For the working of this module, the outgoing mail configuration has to be configured . The Email will be send
+to Users related partners Email ID. If the Email ID for the related partner of the user is not given,
+then the notification mail will not send.
+
+Also install the "httpagentparser" python package, sudo pip install httpagentparser
+
+Credits
+=======
+Cybrosys Techno Solutions
+Author
+ Niyas Raphy(v11)
+ Akshay Babu(v12)
+ Muhammad P(v14)
+ Noorjahan P(v15)
+
+
+
+------
+
+* Cybrosys Techno Solutions
diff --git a/user_login_alert/__init__.py b/user_login_alert/__init__.py
new file mode 100644
index 000000000..eea9191ae
--- /dev/null
+++ b/user_login_alert/__init__.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# Author: Niyas Raphy(v11) and Akshay Babu(v12)()(odoo@cybrosys.com)
+#
+# You can modify it under the terms of the GNU AFFERO
+# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from . import controllers
+from . import models
diff --git a/user_login_alert/__manifest__.py b/user_login_alert/__manifest__.py
new file mode 100644
index 000000000..e4da49a51
--- /dev/null
+++ b/user_login_alert/__manifest__.py
@@ -0,0 +1,45 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2021-TODAY Cybrosys Technologies().
+#
+# You can modify it under the terms of the GNU AFFERO
+# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+{
+ 'name': 'User Login Alert',
+ 'summary': """Secure your Odoo account by alerts at right time. If any successful login to your
+ account happens, an alert mail will be send to you with the browser and IP details.""",
+ 'version': '15.0.1.0.0',
+ 'description': """Secure your Odoo account by alerts at right time. If any successful login to your
+ account happens, an alert mail will be send to you with the browser and IP details, Odoo 15, Odoo15""",
+ 'author': 'Cybrosys Techno Solutions',
+ 'company': 'Cybrosys Techno Solutions',
+ 'website': 'https://www.cybrosys.com',
+ 'category': 'Tools',
+ 'depends': ['base', 'mail'],
+ 'license': 'AGPL-3',
+ 'data': [
+ 'security/notification_group.xml',
+ 'views/logged_details_view.xml',
+ ],
+ 'images': ['static/description/banner.png'],
+ 'installable': True,
+ 'auto_install': False,
+ 'external_dependencies': {
+ 'python': ['httpagentparser'],
+ },
+}
+
diff --git a/user_login_alert/controllers/__init__.py b/user_login_alert/controllers/__init__.py
new file mode 100644
index 000000000..ea03d5885
--- /dev/null
+++ b/user_login_alert/controllers/__init__.py
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# Author: Niyas Raphy(v11) and Akshay Babu(v12)()(odoo@cybrosys.com)
+#
+# You can modify it under the terms of the GNU AFFERO
+# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from . import main
diff --git a/user_login_alert/controllers/main.py b/user_login_alert/controllers/main.py
new file mode 100644
index 000000000..a971763ad
--- /dev/null
+++ b/user_login_alert/controllers/main.py
@@ -0,0 +1,111 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# Author: Niyas Raphy(v11) and Akshay Babu(v12)()(odoo@cybrosys.com)
+#
+# You can modify it under the terms of the GNU AFFERO
+# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+try:
+ import httpagentparser
+except ImportError:
+ pass
+from time import gmtime, strftime
+from odoo.addons.web.controllers import main
+from odoo.http import request
+from odoo.exceptions import Warning
+import odoo
+import odoo.modules.registry
+from odoo.tools.translate import _
+from odoo import http
+
+
+class Home(main.Home):
+
+ @http.route('/web/login', type='http', auth="public")
+ def web_login(self, redirect=None, **kw):
+ main.ensure_db()
+ request.params['login_success'] = False
+ if request.httprequest.method == 'GET' and redirect and request.session.uid:
+ return request.redirect(redirect)
+
+ if not request.uid:
+ request.uid = odoo.SUPERUSER_ID
+
+ values = request.params.copy()
+ try:
+ values['databases'] = http.db_list()
+ except odoo.exceptions.AccessDenied:
+ values['databases'] = None
+ if request.httprequest.method == 'POST':
+ old_uid = request.uid
+ uid = request.session.authenticate(request.session.db, request.params['login'], request.params['password'])
+ if uid is not False:
+ user_rec = request.env['res.users'].sudo().search([('id', '=', uid)])
+ if user_rec.partner_id.email and user_rec.has_group('user_login_alert.receive_login_notification'):
+ send_mail = 0
+ agent = request.httprequest.environ.get('HTTP_USER_AGENT')
+ agent_details = httpagentparser.detect(agent)
+ user_os = agent_details['os']['name']
+ browser_name = agent_details['browser']['name']
+ ip_address = request.httprequest.environ['REMOTE_ADDR']
+ if user_rec.last_logged_ip and user_rec.last_logged_browser and user_rec.last_logged_os:
+ if user_rec.last_logged_ip != ip_address or user_rec.last_logged_browser != browser_name or user_rec.last_logged_os != user_os:
+ send_mail = 1
+ user_rec.last_logged_ip = ip_address
+ user_rec.last_logged_browser = browser_name
+ user_rec.last_logged_os = user_os
+ else:
+ send_mail = 0
+ else:
+ send_mail = 1
+ user_rec.last_logged_ip = ip_address
+ user_rec.last_logged_browser = browser_name
+ user_rec.last_logged_os = user_os
+ if send_mail == 1:
+ email_to = user_rec.partner_id.email
+ current_date_time = strftime("%Y-%m-%d %H:%M:%S", gmtime())
+ message_body = 'Hi ' + user_rec.name + ' , Your account has been ' \
+ 'accessed successfully. The details of the ' \
+ 'system from which the account is accessed ...,'
+ message_body += '
'
+ message_body += '
' + 'OS' + '
' \
+ '
' + user_os + '
' \
+ '
'\
+ '
' + 'Browser' + '
' \
+ '
' + browser_name + '
' \
+ '
'\
+ '
' + 'IP Address' + '
' \
+ '
' + ip_address + '
' \
+ '
'
+ message_body += '
'
+ message_body += 'Thank you'
+ template_obj = request.env['mail.mail']
+ template_data = {
+ 'subject': 'Login Alert : ' + current_date_time,
+ 'body_html': message_body,
+ 'email_from': request.env.user.company_id.email,
+ 'email_to': email_to
+ }
+ template_id = template_obj.create(template_data)
+ template_obj.send(template_id)
+ request.params['login_success'] = True
+ if not redirect:
+ redirect = '/web'
+ return request.redirect(self._login_redirect(uid, redirect=redirect))
+ request.uid = old_uid
+ values['error'] = _("Wrong login/password")
+ return request.render('web.login', values)
diff --git a/user_login_alert/doc/RELEASE_NOTES.md b/user_login_alert/doc/RELEASE_NOTES.md
new file mode 100644
index 000000000..013b45ef5
--- /dev/null
+++ b/user_login_alert/doc/RELEASE_NOTES.md
@@ -0,0 +1,6 @@
+## Module
+
+#### 08.10.2020
+#### Version 15.0.1.0.0
+#### ADD
+Migration Of User Login Alert
diff --git a/user_login_alert/models/__init__.py b/user_login_alert/models/__init__.py
new file mode 100644
index 000000000..fb826fd79
--- /dev/null
+++ b/user_login_alert/models/__init__.py
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# Author: Niyas Raphy(v11) and Akshay Babu(v12)()(odoo@cybrosys.com)
+#
+# You can modify it under the terms of the GNU AFFERO
+# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from . import logged_details
diff --git a/user_login_alert/models/logged_details.py b/user_login_alert/models/logged_details.py
new file mode 100644
index 000000000..356d7a8a1
--- /dev/null
+++ b/user_login_alert/models/logged_details.py
@@ -0,0 +1,30 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# Author: Niyas Raphy(v11) and Akshay Babu(v12)()(odoo@cybrosys.com)
+#
+# You can modify it under the terms of the GNU AFFERO
+# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+#############################################################################
+from odoo import models, fields
+
+
+class ResUsersInherit(models.Model):
+ _inherit = 'res.users'
+
+ last_logged_ip = fields.Char(string='IP')
+ last_logged_browser = fields.Char(string='Browser')
+ last_logged_os = fields.Char(string='OS')
diff --git a/user_login_alert/requirements.txt b/user_login_alert/requirements.txt
new file mode 100644
index 000000000..55e961707
--- /dev/null
+++ b/user_login_alert/requirements.txt
@@ -0,0 +1 @@
+httpagentparser==1.8.1
\ No newline at end of file
diff --git a/user_login_alert/security/notification_group.xml b/user_login_alert/security/notification_group.xml
new file mode 100644
index 000000000..5867cb807
--- /dev/null
+++ b/user_login_alert/security/notification_group.xml
@@ -0,0 +1,8 @@
+
+
+
+
+ Receive Login Notification
+
+
+
\ No newline at end of file
diff --git a/user_login_alert/static/description/assets/icons/check.png b/user_login_alert/static/description/assets/icons/check.png
new file mode 100644
index 000000000..c8e85f51d
Binary files /dev/null and b/user_login_alert/static/description/assets/icons/check.png differ
diff --git a/user_login_alert/static/description/assets/icons/chevron.png b/user_login_alert/static/description/assets/icons/chevron.png
new file mode 100644
index 000000000..2089293d6
Binary files /dev/null and b/user_login_alert/static/description/assets/icons/chevron.png differ
diff --git a/user_login_alert/static/description/assets/icons/cogs.png b/user_login_alert/static/description/assets/icons/cogs.png
new file mode 100644
index 000000000..95d0bad62
Binary files /dev/null and b/user_login_alert/static/description/assets/icons/cogs.png differ
diff --git a/user_login_alert/static/description/assets/icons/consultation.png b/user_login_alert/static/description/assets/icons/consultation.png
new file mode 100644
index 000000000..8319d4baa
Binary files /dev/null and b/user_login_alert/static/description/assets/icons/consultation.png differ
diff --git a/user_login_alert/static/description/assets/icons/ecom-black.png b/user_login_alert/static/description/assets/icons/ecom-black.png
new file mode 100644
index 000000000..a9385ff13
Binary files /dev/null and b/user_login_alert/static/description/assets/icons/ecom-black.png differ
diff --git a/user_login_alert/static/description/assets/icons/education-black.png b/user_login_alert/static/description/assets/icons/education-black.png
new file mode 100644
index 000000000..3eb09b27b
Binary files /dev/null and b/user_login_alert/static/description/assets/icons/education-black.png differ
diff --git a/user_login_alert/static/description/assets/icons/hotel-black.png b/user_login_alert/static/description/assets/icons/hotel-black.png
new file mode 100644
index 000000000..130f613be
Binary files /dev/null and b/user_login_alert/static/description/assets/icons/hotel-black.png differ
diff --git a/user_login_alert/static/description/assets/icons/license.png b/user_login_alert/static/description/assets/icons/license.png
new file mode 100644
index 000000000..a5869797e
Binary files /dev/null and b/user_login_alert/static/description/assets/icons/license.png differ
diff --git a/user_login_alert/static/description/assets/icons/lifebuoy.png b/user_login_alert/static/description/assets/icons/lifebuoy.png
new file mode 100644
index 000000000..658d56ccc
Binary files /dev/null and b/user_login_alert/static/description/assets/icons/lifebuoy.png differ
diff --git a/user_login_alert/static/description/assets/icons/logo.png b/user_login_alert/static/description/assets/icons/logo.png
new file mode 100644
index 000000000..478462d3e
Binary files /dev/null and b/user_login_alert/static/description/assets/icons/logo.png differ
diff --git a/user_login_alert/static/description/assets/icons/manufacturing-black.png b/user_login_alert/static/description/assets/icons/manufacturing-black.png
new file mode 100644
index 000000000..697eb0e9f
Binary files /dev/null and b/user_login_alert/static/description/assets/icons/manufacturing-black.png differ
diff --git a/user_login_alert/static/description/assets/icons/pos-black.png b/user_login_alert/static/description/assets/icons/pos-black.png
new file mode 100644
index 000000000..97c0f90c1
Binary files /dev/null and b/user_login_alert/static/description/assets/icons/pos-black.png differ
diff --git a/user_login_alert/static/description/assets/icons/puzzle.png b/user_login_alert/static/description/assets/icons/puzzle.png
new file mode 100644
index 000000000..65cf854e7
Binary files /dev/null and b/user_login_alert/static/description/assets/icons/puzzle.png differ
diff --git a/user_login_alert/static/description/assets/icons/restaurant-black.png b/user_login_alert/static/description/assets/icons/restaurant-black.png
new file mode 100644
index 000000000..4a35eb939
Binary files /dev/null and b/user_login_alert/static/description/assets/icons/restaurant-black.png differ
diff --git a/user_login_alert/static/description/assets/icons/service-black.png b/user_login_alert/static/description/assets/icons/service-black.png
new file mode 100644
index 000000000..301ab51cb
Binary files /dev/null and b/user_login_alert/static/description/assets/icons/service-black.png differ
diff --git a/user_login_alert/static/description/assets/icons/trading-black.png b/user_login_alert/static/description/assets/icons/trading-black.png
new file mode 100644
index 000000000..9398ba2f1
Binary files /dev/null and b/user_login_alert/static/description/assets/icons/trading-black.png differ
diff --git a/user_login_alert/static/description/assets/icons/training.png b/user_login_alert/static/description/assets/icons/training.png
new file mode 100644
index 000000000..884ca024d
Binary files /dev/null and b/user_login_alert/static/description/assets/icons/training.png differ
diff --git a/user_login_alert/static/description/assets/icons/update.png b/user_login_alert/static/description/assets/icons/update.png
new file mode 100644
index 000000000..ecbc5a01a
Binary files /dev/null and b/user_login_alert/static/description/assets/icons/update.png differ
diff --git a/user_login_alert/static/description/assets/icons/user.png b/user_login_alert/static/description/assets/icons/user.png
new file mode 100644
index 000000000..6ffb23d9f
Binary files /dev/null and b/user_login_alert/static/description/assets/icons/user.png differ
diff --git a/user_login_alert/static/description/assets/icons/wrench.png b/user_login_alert/static/description/assets/icons/wrench.png
new file mode 100644
index 000000000..6c04dea0f
Binary files /dev/null and b/user_login_alert/static/description/assets/icons/wrench.png differ
diff --git a/user_login_alert/static/description/assets/modules/approval_image.png b/user_login_alert/static/description/assets/modules/approval_image.png
new file mode 100644
index 000000000..84fe94e80
Binary files /dev/null and b/user_login_alert/static/description/assets/modules/approval_image.png differ
diff --git a/user_login_alert/static/description/assets/modules/budget_image.png b/user_login_alert/static/description/assets/modules/budget_image.png
new file mode 100644
index 000000000..fe6aa6fe4
Binary files /dev/null and b/user_login_alert/static/description/assets/modules/budget_image.png differ
diff --git a/user_login_alert/static/description/assets/modules/export_image.png b/user_login_alert/static/description/assets/modules/export_image.png
new file mode 100644
index 000000000..4e4ea0e51
Binary files /dev/null and b/user_login_alert/static/description/assets/modules/export_image.png differ
diff --git a/user_login_alert/static/description/assets/modules/magento_image.png b/user_login_alert/static/description/assets/modules/magento_image.png
new file mode 100644
index 000000000..39de0820f
Binary files /dev/null and b/user_login_alert/static/description/assets/modules/magento_image.png differ
diff --git a/user_login_alert/static/description/assets/modules/pos_image.png b/user_login_alert/static/description/assets/modules/pos_image.png
new file mode 100644
index 000000000..c5932894b
Binary files /dev/null and b/user_login_alert/static/description/assets/modules/pos_image.png differ
diff --git a/user_login_alert/static/description/assets/modules/shopify_image.png b/user_login_alert/static/description/assets/modules/shopify_image.png
new file mode 100644
index 000000000..c6d92c16d
Binary files /dev/null and b/user_login_alert/static/description/assets/modules/shopify_image.png differ
diff --git a/user_login_alert/static/description/assets/screenshots/hero.png b/user_login_alert/static/description/assets/screenshots/hero.png
new file mode 100644
index 000000000..e3d60238f
Binary files /dev/null and b/user_login_alert/static/description/assets/screenshots/hero.png differ
diff --git a/user_login_alert/static/description/assets/screenshots/screenshot-01.png b/user_login_alert/static/description/assets/screenshots/screenshot-01.png
new file mode 100644
index 000000000..4cc3c4acb
Binary files /dev/null and b/user_login_alert/static/description/assets/screenshots/screenshot-01.png differ
diff --git a/user_login_alert/static/description/assets/screenshots/screenshot-02.png b/user_login_alert/static/description/assets/screenshots/screenshot-02.png
new file mode 100644
index 000000000..bf30fafa3
Binary files /dev/null and b/user_login_alert/static/description/assets/screenshots/screenshot-02.png differ
diff --git a/user_login_alert/static/description/banner.png b/user_login_alert/static/description/banner.png
new file mode 100644
index 000000000..72464b121
Binary files /dev/null and b/user_login_alert/static/description/banner.png differ
diff --git a/user_login_alert/static/description/icon.png b/user_login_alert/static/description/icon.png
new file mode 100644
index 000000000..9fc1a8f67
Binary files /dev/null and b/user_login_alert/static/description/icon.png differ
diff --git a/user_login_alert/static/description/index.html b/user_login_alert/static/description/index.html
new file mode 100644
index 000000000..92485bc96
--- /dev/null
+++ b/user_login_alert/static/description/index.html
@@ -0,0 +1,609 @@
+
+
+ This module will send a notification email to the users email. The notification email contains the IP of the system, browser name and OS from which the account is accessed.
+
+
+
+
+
+
+
+
+ Features
+
+
+
+
+
+
+
+
+
+ Community & Enterprise Support
+
+ Available in Odoo 15.0 Community and Enterprise.
+
+
+
+
+
+
+
+
+ E-mail Notification
+
+ Email notification on Log in.
+
+
+
+
+
+
+
+
+
+
+ Details
+
+ Details of the system that accessed the account.
+
+
+
+
+
+
+
+
+
+
+ Information in Notification Email
+
+ IP, OS and browser as well as log in time will be there in the notification email.
+
+
+
+
+
+
+
+
+
+ User Group
+
+ User will receive notification only if user exist in group receive login notification.
+
+
+
+
+
+
+
+
+
+ Screenshots
+
+
+
+
+ E-mail On Successful Login
+
+
+ User receives e-mail on successful login.
+
+
+
+
+
+ Adding user to the login notification group
+
+ User will receive notification only if he is added in this group.
+