diff --git a/mobile_service_shop/README.rst b/mobile_service_shop/README.rst
new file mode 100644
index 000000000..e189f868c
--- /dev/null
+++ b/mobile_service_shop/README.rst
@@ -0,0 +1,36 @@
+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
+ Neenu Merlin Jose @cybrosys, odoo@cybrosys.com
+ Vishnu KP @ 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..215d7140d
--- /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: Vishnu KP @ 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 models
+from . import wizard
diff --git a/mobile_service_shop/__manifest__.py b/mobile_service_shop/__manifest__.py
new file mode 100644
index 000000000..629527777
--- /dev/null
+++ b/mobile_service_shop/__manifest__.py
@@ -0,0 +1,55 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# Author: Vishnu KP @ 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': '17.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/mobile_service_shop_security.xml',
+ 'security/ir.model.access.csv',
+ 'views/mobile_service_views.xml',
+ 'views/product_template_views.xml',
+ 'views/product_product_views.xml',
+ 'views/terms_and_condition_views.xml',
+ 'views/mobile_complaint_description_views.xml',
+ 'views/mobile_complaint_views.xml',
+ 'views/brand_models_views.xml',
+ 'views/mobile_brand_views.xml',
+ 'wizard/mobile_create_invoice_views.xml',
+ 'reports/mobile_service_ticket.xml',
+ 'data/mobile_service_data.xml',
+ 'data/mobile_service_email_template.xml'],
+ 'images': ['static/description/banner.jpg'],
+ 'assets': {
+ 'web.assets_backend': [
+ 'mobile_service_shop/static/src/css/mobile_service.css',
+ ],
+ },
+ 'installable': True,
+ 'application': True,
+ 'auto_install': False,
+ 'license': 'LGPL-3',
+}
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..25d4c4a75
--- /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..24724d4d1
--- /dev/null
+++ b/mobile_service_shop/data/mobile_service_email_template.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+ 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..056bdabec
--- /dev/null
+++ b/mobile_service_shop/doc/RELEASE_NOTES.md
@@ -0,0 +1,6 @@
+## Module
+
+### 17.11.2023
+#### Version 17.0.1.0.0
+#### ADD
+Initial Commit for Mobile Service Management
diff --git a/mobile_service_shop/models/__init__.py b/mobile_service_shop/models/__init__.py
new file mode 100644
index 000000000..82b667825
--- /dev/null
+++ b/mobile_service_shop/models/__init__.py
@@ -0,0 +1,31 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# Author: Vishnu KP @ 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 brand_model
+from . import mobile_brand
+from . import mobile_complaint
+from . import mobile_complaint_description
+from . import mobile_complaint_tree
+from . import mobile_service
+from . import product_order_line
+from . import product_template
+from . import service_ticket
+from . import terms_condition
diff --git a/mobile_service_shop/models/brand_model.py b/mobile_service_shop/models/brand_model.py
new file mode 100644
index 000000000..fe540c0e4
--- /dev/null
+++ b/mobile_service_shop/models/brand_model.py
@@ -0,0 +1,37 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# Author: Vishnu KP @ 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 fields, models
+
+
+class BrandModel(models.Model):
+ """This class represents a mobile brand model"""
+ _name = 'brand.model'
+ _description = 'Brand Model'
+ _rec_name = 'mobile_brand_models'
+
+ mobile_brand_name = fields.Many2one('mobile.brand',
+ string="Mobile Brand", required=True,
+ help="Brand name of the mobile")
+ mobile_brand_models = fields.Char(string="Model Name", required=True,
+ help="Model name of the mobile")
+ image_medium = fields.Binary(string='image', store=True, attachment=True,
+ help="Mobile image space")
diff --git a/mobile_service_shop/models/mobile_brand.py b/mobile_service_shop/models/mobile_brand.py
new file mode 100644
index 000000000..32c814215
--- /dev/null
+++ b/mobile_service_shop/models/mobile_brand.py
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# Author: Vishnu KP @ 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 fields, models
+
+
+class MobileBrand(models.Model):
+ """This model represents the Mobile Brand"""
+ _name = 'mobile.brand'
+ _description = 'Mobile Brand'
+ _rec_name = 'brand_name'
+
+ brand_name = fields.Char(string="Mobile Brand", required=True,
+ help="Mobile Brand name")
diff --git a/mobile_service_shop/models/mobile_complaint.py b/mobile_service_shop/models/mobile_complaint.py
new file mode 100644
index 000000000..ccfbec367
--- /dev/null
+++ b/mobile_service_shop/models/mobile_complaint.py
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# Author: Vishnu KP @ 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 fields, models
+
+
+class MobileComplaint(models.Model):
+ """This model represents for the mobile Complaint type managing"""
+ _name = 'mobile.complaint'
+ _description = 'Mobile Complaint'
+ _rec_name = 'complaint_type'
+
+ complaint_type = fields.Char(string="Complaint Type", required=True,
+ help="This field specifies the type of the "
+ "complaint.")
\ No newline at end of file
diff --git a/mobile_service_shop/models/mobile_complaint_description.py b/mobile_service_shop/models/mobile_complaint_description.py
new file mode 100644
index 000000000..0abb9f0aa
--- /dev/null
+++ b/mobile_service_shop/models/mobile_complaint_description.py
@@ -0,0 +1,36 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# Author: Vishnu KP @ 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 fields, models
+
+
+class MobileComplaintDescription(models.Model):
+ """This model represents description about the mobile Complaint"""
+ _name = 'mobile.complaint.description'
+ _description = "Mobile Complaint Description"
+ _rec_name = 'description'
+
+ complaint_type_template = fields.Many2one('mobile.complaint',
+ string="Complaint Type",
+ required=True,
+ help="Complaint type template.")
+ description = fields.Text(string="Description",
+ help="Complaint description.")
diff --git a/mobile_service_shop/models/mobile_complaint_tree.py b/mobile_service_shop/models/mobile_complaint_tree.py
new file mode 100644
index 000000000..7c5c30f51
--- /dev/null
+++ b/mobile_service_shop/models/mobile_complaint_tree.py
@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# Author: Vishnu KP @ 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 fields, models
+
+
+class MobileComplaintTree(models.Model):
+ _name = 'mobile.complaint.tree'
+ _description = 'Mobile Complaint Tree'
+ _rec_name = 'complaint_type_tree'
+
+ complaint_id = fields.Many2one('mobile.service',
+ string="Complaint ID",
+ help="Complaint id associated with this "
+ "record.")
+ complaint_type_tree = fields.Many2one('mobile.complaint',
+ string="Category",
+ required=True,
+ help="Complaint type tree records.")
+ description_tree = fields.Many2one('mobile.complaint.description',
+ string="Description",
+ domain="[('complaint_type_template',"
+ "'=',complaint_type_tree)]",
+ help="Description field for the "
+ "complaint.")
diff --git a/mobile_service_shop/models/mobile_service.py b/mobile_service_shop/models/mobile_service.py
new file mode 100644
index 000000000..df2e01875
--- /dev/null
+++ b/mobile_service_shop/models/mobile_service.py
@@ -0,0 +1,363 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# Author: Vishnu KP @ 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
+from odoo import api, fields, models, _
+from odoo.exceptions import UserError
+import pytz
+
+
+class MobileService(models.Model):
+ _name = 'mobile.service'
+ _rec_name = 'name'
+ _description = "Mobile Service"
+ _inherit = ['mail.thread', 'mail.activity.mixin']
+
+ name = fields.Char(string='Service Number', copy=False, default="New",
+ help="Number of The Service.")
+ person_name = fields.Many2one('res.partner',
+ string="Customer Name", required=True,
+ help="Name of the customer.")
+ contact_no = fields.Char(related='person_name.mobile',
+ string="Contact Number",
+ help="Contact number of the customer.")
+ email_id = fields.Char(related='person_name.email', string="Email",
+ help="Email ID of the customer.")
+ street = fields.Char(related='person_name.street', string="Address",
+ help="Street of the customer.")
+ street2 = fields.Char(related='person_name.street2', string="Address",
+ help="Street2 of the customer.")
+ city = fields.Char(related='person_name.city', string="Address",
+ help="City of the customer.")
+ state_id = fields.Many2one(related='person_name.state_id', string="Address",
+ help="State of the customer.")
+ zip = fields.Char(related='person_name.zip', string="Address",
+ help="Zip number of the customer address.")
+ country_id = fields.Many2one(related='person_name.country_id',
+ string="Address",
+ help="Country of the customer.")
+ brand_name = fields.Many2one('mobile.brand',
+ string="Mobile Brand",
+ help="Brand name of the mobile.")
+ 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",
+ help="IMEI Number of the device.")
+ model_name = fields.Many2one('brand.model', string="Model",
+ domain="[('mobile_brand_name','=',brand_name)]"
+ , help="Model name of the device.")
+ image_medium = fields.Binary(related='model_name.image_medium', store=True,
+ attachment=True, help="Image of the device.")
+ date_request = fields.Date(string="Requested Date",
+ default=fields.Date.context_today,
+ help="Device submitted date.")
+ return_date = fields.Date(string="Return Date", required=True,
+ help="Device returned date.")
+ technician_name = fields.Many2one('res.users',
+ string="Technician Name",
+ default=lambda self: self.env.user,
+ help="Work assigned technician name.",
+ 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',
+ help='Service status of the work.')
+ complaints_tree = fields.One2many('mobile.complaint.tree',
+ 'complaint_id',
+ string='Complaints Tree',
+ help='Mobile complaint details.')
+ product_order_line = fields.One2many('product.order.line',
+ 'product_order_id',
+ string='Parts Order Lines',
+ help='Product parts order details.')
+ internal_notes = fields.Text(string="Internal Notes")
+ invoice_count = fields.Integer(compute='_compute_invoice_count',
+ string='# Invoice', copy=False,
+ help="Count of invoice.")
+ invoice_ids = fields.Many2many("account.move", string='Invoices',
+ compute="_get_invoiced", readonly=True,
+ copy=False, help="Invoices line")
+ first_payment_inv = fields.Many2one('account.move', copy=False,
+ help="First payment of the invoice.")
+ first_invoice_created = fields.Boolean(string="First Invoice Created",
+ invisible=True, copy=False,
+ help="Date of the first invoice.")
+ journal_type = fields.Many2one('account.journal',
+ 'Journal', invisible=True,
+ default=lambda self: self.env[
+ 'account.journal'].search(
+ [('code', '=', 'SERV')]),
+ help='Type of the journal.')
+ company_id = fields.Many2one('res.company', 'Company',
+ default=lambda self: self.env.company,
+ help='Default company id.')
+
+ @api.model
+ def _default_picking_transfer(self):
+ """To get the default picking transfers."""
+ 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",
+ help='Stock picking ID information.')
+ 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):
+ """Check the return date and request date"""
+ if self.return_date:
+ 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):
+ """Assigning the Service Request to the corresponding user"""
+ self.service_state = 'assigned'
+
+ def complete(self):
+ """Mark the service request as completed"""
+ self.service_state = 'completed'
+
+ def return_to(self):
+ """The service request is returned to the client"""
+ self.service_state = 'returned'
+
+ def not_solved(self):
+ """Mark the service request as not solved"""
+ 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()
+ try:
+ template_id = self.env.ref(
+ 'mobile_service_shop.email_template_mobile_service')
+ except ValueError:
+ template_id = False
+ try:
+ compose_form_id = self.env.ref(
+ 'mail.email_compose_message_wizard_form')
+ except ValueError:
+ compose_form_id = False
+ ctx = {
+ 'default_model': 'mobile.service',
+ 'default_res_ids': self.ids,
+ 'default_use_template': bool(template_id),
+ 'default_template_id': template_id.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.id, 'form')],
+ 'view_id': compose_form_id.id,
+ 'target': 'new',
+ 'context': ctx}
+
+ def return_advance(self):
+ """This method returns the current invoice related to the work"""
+ 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[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[0]}
+ return value
+ else:
+ raise UserError("No invoice created")
+
+ def _compute_invoice_count(self):
+ """Calculating the number of invoices"""
+ self.invoice_count = self.env['account.move'].search_count(
+ [('invoice_origin', '=', self.name)])
+
+ @api.model
+ def create(self, vals):
+ """Creating sequence"""
+ 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(MobileService, self).create(vals)
+
+ def unlink(self):
+ """Supering the unlink function"""
+ for service in self:
+ if service.service_state != 'draft':
+ raise UserError(
+ _('You cannot delete an assigned service request'))
+ return super(MobileService, self).unlink()
+
+ def action_invoice_create_wizard(self):
+ """Opening a wizard to create invoice"""
+ return {
+ 'name': _('Create Invoice'),
+ 'view_mode': 'form',
+ 'res_model': 'mobile.invoice',
+ 'type': 'ir.actions.act_window',
+ 'target': 'new'}
+
+ def action_post_stock(self):
+ """It will post the stock move"""
+ 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': int(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'))
+
+ def action_view_invoice(self):
+ """It will show the invoice for the customer"""
+ 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_ids in invoice_ids:
+ inv_ids.append(each_ids.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
+
+ def get_ticket(self):
+ """This will return a ticket associated with the given service"""
+ 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))
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..1fd41641b
--- /dev/null
+++ b/mobile_service_shop/models/product_order_line.py
@@ -0,0 +1,92 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# Author: Vishnu KP @ 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, _
+
+
+class ProductOrderLine(models.Model):
+ _name = 'product.order.line'
+ _description = 'Product Order Line'
+
+ product_order_id = fields.Many2one('mobile.service')
+ product_id = fields.Many2one('product.product', string='Product',
+ domain="[('is_a_parts','=', True)]",
+ help="Product ID of the product.",
+ required=True)
+ product_uom_qty = fields.Float(string='Used Quantity', default=1.0,
+ help="Choose a quantity to use.",
+ required=True)
+ price_unit = fields.Float(string='Unit Price', default=0.0, required=True,
+ help="Price of the product.")
+ qty_invoiced = fields.Float(string='Invoiced Qty', readonly=True,
+ help="Number of invoice created.")
+ qty_stock_move = fields.Float(string='Stock Move Posted Qty', readonly=True,
+ help="Count of stock move.")
+ part_price = fields.Char(compute='_compute_part_price', string='Price',
+ readonly=True, store=True, help="Price for the "
+ "part.")
+ product_uom = fields.Char(string='Unit of Measure', required=True,
+ help="Unit of measure of the product.")
+
+ @api.onchange('product_id')
+ def change_prod(self):
+ """It will return the product price and the unit of measurement"""
+ 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_part_price(self):
+ """Compute the amount of part price"""
+ for line in self:
+ price = line.price_unit * line.product_uom_qty
+ line.update({'part_price': price})
+
+ def _create_stock_moves_transfer(self, picking):
+ """It will return the stock moves"""
+ 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.route'].search(
+ [('id', 'in', (2, 3))])])] or [],
+ 'warehouse_id': picking.picking_type_id.warehouse_id.id}
+ diff_quantity = self.product_uom_qty - self.qty_stock_move
+ tmp = template.copy()
+ tmp.update({'product_uom_qty': diff_quantity})
+ template['product_uom_qty'] = diff_quantity
+ done += self.env['stock.move'].create(template)
+ self.qty_stock_move = self.qty_stock_move + diff_quantity
+ return done
diff --git a/mobile_service_shop/models/product_template.py b/mobile_service_shop/models/product_template.py
new file mode 100644
index 000000000..94e20c087
--- /dev/null
+++ b/mobile_service_shop/models/product_template.py
@@ -0,0 +1,41 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# Author: Vishnu KP @ 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 fields, models
+
+
+class ProductTemplate(models.Model):
+
+ # Inherited to add custom fields
+ _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", help="Extra description "
+ "for the part.")
diff --git a/mobile_service_shop/models/service_ticket.py b/mobile_service_shop/models/service_ticket.py
new file mode 100755
index 000000000..aaee67447
--- /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: Vishnu KP @ 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 MobileServiceTicket(models.AbstractModel):
+ """Mobile service ticket report abstract model"""
+ _name = 'report.mobile_service_shop.mobile_service_ticket_template'
+
+ @api.model
+ def _get_report_values(self, data):
+ """Returns the data file for the report"""
+ 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/models/terms_condition.py b/mobile_service_shop/models/terms_condition.py
new file mode 100644
index 000000000..5131ab58e
--- /dev/null
+++ b/mobile_service_shop/models/terms_condition.py
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2019-TODAY Cybrosys Technologies().
+# Author: Vishnu KP @ 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 fields, models
+
+
+class TermsConditions(models.Model):
+ """Used to add the Mobile Service Terms and Conditions"""
+ _name = 'terms.conditions'
+ _description = 'Terms and Conditions'
+ _rec_name = 'terms_id'
+
+ terms_id = fields.Char(String="Terms and condition",
+ compute="_compute_terms_id", help="this will be "
+ "the terms id.")
+ terms_conditions = fields.Text(string="Terms and Conditions",
+ help="this will be the terms and "
+ "conditions space.")
+
+ def _compute_terms_id(self):
+ """Return the terms ID"""
+ self.terms_id = self.id or ''
diff --git a/mobile_service_shop/reports/mobile_service_email_template.xml b/mobile_service_shop/reports/mobile_service_email_template.xml
new file mode 100644
index 000000000..27e920a53
--- /dev/null
+++ b/mobile_service_shop/reports/mobile_service_email_template.xml
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
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 :
+
+
+
+
+
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..8fb3a14af
--- /dev/null
+++ b/mobile_service_shop/reports/mobile_service_ticket.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+ Mobile Service Ticket
+ mobile.service
+ qweb-pdf
+ mobile_service_shop.mobile_service_ticket_template
+ mobile_service_shop.mobile_service_ticket_template
+
+
+
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/mobile_service_shop_security.xml b/mobile_service_shop/security/mobile_service_shop_security.xml
new file mode 100644
index 000000000..05c6747c2
--- /dev/null
+++ b/mobile_service_shop/security/mobile_service_shop_security.xml
@@ -0,0 +1,35 @@
+
+
+
+
+ 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)]
+
+
+
diff --git a/mobile_service_shop/static/description/assets/icons/capture (1).png b/mobile_service_shop/static/description/assets/icons/capture (1).png
new file mode 100644
index 000000000..8824deafc
Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/capture (1).png differ
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/img.png b/mobile_service_shop/static/description/assets/icons/img.png
new file mode 100644
index 000000000..70197f477
Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/img.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/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/photo-capture.png b/mobile_service_shop/static/description/assets/icons/photo-capture.png
new file mode 100644
index 000000000..06c111758
Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/photo-capture.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/misc/Cybrosys R.png b/mobile_service_shop/static/description/assets/misc/Cybrosys R.png
new file mode 100644
index 000000000..da4058087
Binary files /dev/null and b/mobile_service_shop/static/description/assets/misc/Cybrosys R.png differ
diff --git a/mobile_service_shop/static/description/assets/misc/email.svg b/mobile_service_shop/static/description/assets/misc/email.svg
new file mode 100644
index 000000000..15291cdc3
--- /dev/null
+++ b/mobile_service_shop/static/description/assets/misc/email.svg
@@ -0,0 +1,33 @@
+
diff --git a/mobile_service_shop/static/description/assets/misc/phone.svg b/mobile_service_shop/static/description/assets/misc/phone.svg
new file mode 100644
index 000000000..b7bd7f251
--- /dev/null
+++ b/mobile_service_shop/static/description/assets/misc/phone.svg
@@ -0,0 +1,3 @@
+
diff --git a/mobile_service_shop/static/description/assets/misc/star (1) 2.svg b/mobile_service_shop/static/description/assets/misc/star (1) 2.svg
new file mode 100644
index 000000000..5ae9f507a
--- /dev/null
+++ b/mobile_service_shop/static/description/assets/misc/star (1) 2.svg
@@ -0,0 +1,9 @@
+
diff --git a/mobile_service_shop/static/description/assets/misc/support (1) 1.svg b/mobile_service_shop/static/description/assets/misc/support (1) 1.svg
new file mode 100644
index 000000000..7d37a8f30
--- /dev/null
+++ b/mobile_service_shop/static/description/assets/misc/support (1) 1.svg
@@ -0,0 +1,9 @@
+
diff --git a/mobile_service_shop/static/description/assets/misc/support-email.svg b/mobile_service_shop/static/description/assets/misc/support-email.svg
new file mode 100644
index 000000000..eb70370d6
--- /dev/null
+++ b/mobile_service_shop/static/description/assets/misc/support-email.svg
@@ -0,0 +1,6 @@
+
diff --git a/mobile_service_shop/static/description/assets/misc/tick-mark.svg b/mobile_service_shop/static/description/assets/misc/tick-mark.svg
new file mode 100644
index 000000000..2dbb40187
--- /dev/null
+++ b/mobile_service_shop/static/description/assets/misc/tick-mark.svg
@@ -0,0 +1,17 @@
+
diff --git a/mobile_service_shop/static/description/assets/misc/whatsapp 1.svg b/mobile_service_shop/static/description/assets/misc/whatsapp 1.svg
new file mode 100644
index 000000000..0bfaf8fc6
--- /dev/null
+++ b/mobile_service_shop/static/description/assets/misc/whatsapp 1.svg
@@ -0,0 +1,9 @@
+
diff --git a/mobile_service_shop/static/description/assets/misc/whatsapp.svg b/mobile_service_shop/static/description/assets/misc/whatsapp.svg
new file mode 100644
index 000000000..b618aea1d
--- /dev/null
+++ b/mobile_service_shop/static/description/assets/misc/whatsapp.svg
@@ -0,0 +1,33 @@
+
diff --git a/mobile_service_shop/static/description/assets/modules/1.png b/mobile_service_shop/static/description/assets/modules/1.png
new file mode 100644
index 000000000..ba1058c42
Binary files /dev/null and b/mobile_service_shop/static/description/assets/modules/1.png differ
diff --git a/mobile_service_shop/static/description/assets/modules/2.png b/mobile_service_shop/static/description/assets/modules/2.png
new file mode 100644
index 000000000..6949185dd
Binary files /dev/null and b/mobile_service_shop/static/description/assets/modules/2.png differ
diff --git a/mobile_service_shop/static/description/assets/modules/3.png b/mobile_service_shop/static/description/assets/modules/3.png
new file mode 100644
index 000000000..4e506f79b
Binary files /dev/null and b/mobile_service_shop/static/description/assets/modules/3.png differ
diff --git a/mobile_service_shop/static/description/assets/modules/4.png b/mobile_service_shop/static/description/assets/modules/4.png
new file mode 100644
index 000000000..e78427938
Binary files /dev/null and b/mobile_service_shop/static/description/assets/modules/4.png differ
diff --git a/mobile_service_shop/static/description/assets/modules/5.png b/mobile_service_shop/static/description/assets/modules/5.png
new file mode 100755
index 000000000..272ec20f9
Binary files /dev/null and b/mobile_service_shop/static/description/assets/modules/5.png differ
diff --git a/mobile_service_shop/static/description/assets/modules/6.png b/mobile_service_shop/static/description/assets/modules/6.png
new file mode 100644
index 000000000..7d5c3154f
Binary files /dev/null and b/mobile_service_shop/static/description/assets/modules/6.png differ
diff --git a/mobile_service_shop/static/description/assets/screenshots/11.png b/mobile_service_shop/static/description/assets/screenshots/11.png
new file mode 100644
index 000000000..164e252f5
Binary files /dev/null and b/mobile_service_shop/static/description/assets/screenshots/11.png differ
diff --git a/mobile_service_shop/static/description/assets/screenshots/config_settings.png b/mobile_service_shop/static/description/assets/screenshots/config_settings.png
new file mode 100644
index 000000000..d1def527f
Binary files /dev/null and b/mobile_service_shop/static/description/assets/screenshots/config_settings.png differ
diff --git a/mobile_service_shop/static/description/assets/screenshots/hero.gif b/mobile_service_shop/static/description/assets/screenshots/hero.gif
new file mode 100644
index 000000000..452e2c7b6
Binary files /dev/null and b/mobile_service_shop/static/description/assets/screenshots/hero.gif differ
diff --git a/mobile_service_shop/static/description/assets/screenshots/invoice.png b/mobile_service_shop/static/description/assets/screenshots/invoice.png
new file mode 100644
index 000000000..6ec5975d1
Binary files /dev/null and b/mobile_service_shop/static/description/assets/screenshots/invoice.png differ
diff --git a/mobile_service_shop/static/description/assets/screenshots/mail.png b/mobile_service_shop/static/description/assets/screenshots/mail.png
new file mode 100644
index 000000000..60d39e48c
Binary files /dev/null and b/mobile_service_shop/static/description/assets/screenshots/mail.png differ
diff --git a/mobile_service_shop/static/description/assets/screenshots/product.png b/mobile_service_shop/static/description/assets/screenshots/product.png
new file mode 100644
index 000000000..6f83f51db
Binary files /dev/null and b/mobile_service_shop/static/description/assets/screenshots/product.png differ
diff --git a/mobile_service_shop/static/description/assets/screenshots/product_page.png b/mobile_service_shop/static/description/assets/screenshots/product_page.png
new file mode 100644
index 000000000..c5abb7eea
Binary files /dev/null and b/mobile_service_shop/static/description/assets/screenshots/product_page.png differ
diff --git a/mobile_service_shop/static/description/assets/screenshots/product_page_2.png b/mobile_service_shop/static/description/assets/screenshots/product_page_2.png
new file mode 100644
index 000000000..a0ca4e5a4
Binary files /dev/null and b/mobile_service_shop/static/description/assets/screenshots/product_page_2.png differ
diff --git a/mobile_service_shop/static/description/assets/screenshots/ss1.png b/mobile_service_shop/static/description/assets/screenshots/ss1.png
new file mode 100644
index 000000000..304f66178
Binary files /dev/null and b/mobile_service_shop/static/description/assets/screenshots/ss1.png differ
diff --git a/mobile_service_shop/static/description/banner.jpg b/mobile_service_shop/static/description/banner.jpg
new file mode 100644
index 000000000..73781cf50
Binary files /dev/null and b/mobile_service_shop/static/description/banner.jpg 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..521eccb1f
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..2ce53ea6b
--- /dev/null
+++ b/mobile_service_shop/static/description/index.html
@@ -0,0 +1,741 @@
+
+
+
+
+
+
+ Odoo App 3 Index
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Community
+
+
+ Enterprise
+
+
+ Odoo SH
+
+
+
+
+
+
+
+ Mobile Service Management
+
+ Mobile Service Management for Odoo 17 Community & Enterprise Edition.
+
+
+
+
+
+
+
+
+
Key Highlights
+
+
+
+
+
+
+
+
+
+
Odoo 17 Community & Enterprise Edition Support.
+
Budget management system in Odoo 17 Community & Enterprise Edition.
+
+
+
+
+
+
+
+
+
+
+
Service request creation.
+
Create and manage Service request.
+
+
+
+
+
+
+
+
+
+
+
Assigning Service Request to Technicians
+
To Ensure the Smooth and Effective Workflow.
+
+
+
+
+
+
+
+
+
+
+
Mobile service ticket generation.
+
User can create Mobile Service Ticket.
+
+
+
+
+
+
+
+
+
+
+
Tracking the Service Status.
+
User can Track the Work Status.
+
+
+
+
+
+
+
+
+
+
+
Integrated with accounting and sales module.
+
User can Generate Invoice After the Service Completion.
+
+
+
+
+
+
+
+
+
+
+
Multi-level access rights.
+
Users are Granted Different Levels of Access Within the Application.
+
+
+
+
+
+
+
+
+
+
+
Flexible for further customization.
+
It Allows Users to Modify the Functionalities Easily.
+