diff --git a/mobile_service_shop/README.rst b/mobile_service_shop/README.rst
new file mode 100644
index 000000000..e4a34d408
--- /dev/null
+++ b/mobile_service_shop/README.rst
@@ -0,0 +1,35 @@
+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
+
+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..fcbbac999
--- /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': '16.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..a38b3facc
--- /dev/null
+++ b/mobile_service_shop/doc/RELEASE_NOTES.md
@@ -0,0 +1,8 @@
+## Module
+
+#### 05.10.2020
+#### Version 16.0.1.0.0
+#### ADD
+
+Initial Commit.
+
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..3d149a3a7
--- /dev/null
+++ b/mobile_service_shop/models/mobile_service.py
@@ -0,0 +1,405 @@
+# -*- 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[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 _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..7cbd74592
--- /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: 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.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..4cbab2e20
--- /dev/null
+++ b/mobile_service_shop/reports/service_ticket_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 :
+
+
+
+
+
\ 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/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/misc/categories.png b/mobile_service_shop/static/description/assets/misc/categories.png
new file mode 100644
index 000000000..bedf1e0b1
Binary files /dev/null and b/mobile_service_shop/static/description/assets/misc/categories.png differ
diff --git a/mobile_service_shop/static/description/assets/misc/check-box.png b/mobile_service_shop/static/description/assets/misc/check-box.png
new file mode 100644
index 000000000..42caf24b9
Binary files /dev/null and b/mobile_service_shop/static/description/assets/misc/check-box.png differ
diff --git a/mobile_service_shop/static/description/assets/misc/compass.png b/mobile_service_shop/static/description/assets/misc/compass.png
new file mode 100644
index 000000000..d5fed8faa
Binary files /dev/null and b/mobile_service_shop/static/description/assets/misc/compass.png differ
diff --git a/mobile_service_shop/static/description/assets/misc/corporate.png b/mobile_service_shop/static/description/assets/misc/corporate.png
new file mode 100644
index 000000000..2eb13edbf
Binary files /dev/null and b/mobile_service_shop/static/description/assets/misc/corporate.png differ
diff --git a/mobile_service_shop/static/description/assets/misc/customer-support.png b/mobile_service_shop/static/description/assets/misc/customer-support.png
new file mode 100644
index 000000000..79efc72ed
Binary files /dev/null and b/mobile_service_shop/static/description/assets/misc/customer-support.png differ
diff --git a/mobile_service_shop/static/description/assets/misc/cybrosys-logo.png b/mobile_service_shop/static/description/assets/misc/cybrosys-logo.png
new file mode 100644
index 000000000..cc3cc0ccf
Binary files /dev/null and b/mobile_service_shop/static/description/assets/misc/cybrosys-logo.png differ
diff --git a/mobile_service_shop/static/description/assets/misc/features.png b/mobile_service_shop/static/description/assets/misc/features.png
new file mode 100644
index 000000000..b41769f77
Binary files /dev/null and b/mobile_service_shop/static/description/assets/misc/features.png differ
diff --git a/mobile_service_shop/static/description/assets/misc/logo.png b/mobile_service_shop/static/description/assets/misc/logo.png
new file mode 100644
index 000000000..478462d3e
Binary files /dev/null and b/mobile_service_shop/static/description/assets/misc/logo.png differ
diff --git a/mobile_service_shop/static/description/assets/misc/pictures.png b/mobile_service_shop/static/description/assets/misc/pictures.png
new file mode 100644
index 000000000..56d255fe9
Binary files /dev/null and b/mobile_service_shop/static/description/assets/misc/pictures.png differ
diff --git a/mobile_service_shop/static/description/assets/misc/pie-chart.png b/mobile_service_shop/static/description/assets/misc/pie-chart.png
new file mode 100644
index 000000000..426e05244
Binary files /dev/null and b/mobile_service_shop/static/description/assets/misc/pie-chart.png differ
diff --git a/mobile_service_shop/static/description/assets/misc/right-arrow.png b/mobile_service_shop/static/description/assets/misc/right-arrow.png
new file mode 100644
index 000000000..730984a06
Binary files /dev/null and b/mobile_service_shop/static/description/assets/misc/right-arrow.png differ
diff --git a/mobile_service_shop/static/description/assets/misc/star.png b/mobile_service_shop/static/description/assets/misc/star.png
new file mode 100644
index 000000000..2eb9ab29f
Binary files /dev/null and b/mobile_service_shop/static/description/assets/misc/star.png differ
diff --git a/mobile_service_shop/static/description/assets/misc/support.png b/mobile_service_shop/static/description/assets/misc/support.png
new file mode 100644
index 000000000..4f18b8b82
Binary files /dev/null and b/mobile_service_shop/static/description/assets/misc/support.png differ
diff --git a/mobile_service_shop/static/description/assets/misc/whatsapp.png b/mobile_service_shop/static/description/assets/misc/whatsapp.png
new file mode 100644
index 000000000..d513a5356
Binary files /dev/null and b/mobile_service_shop/static/description/assets/misc/whatsapp.png differ
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..5238bdeab
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..1ae7cfe3b
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..3c3ff1afb
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..3fae4631e
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.gif b/mobile_service_shop/static/description/assets/modules/5.gif
new file mode 100644
index 000000000..2a5f8e659
Binary files /dev/null and b/mobile_service_shop/static/description/assets/modules/5.gif 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..7f2815273
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/1.png b/mobile_service_shop/static/description/assets/screenshots/1.png
new file mode 100644
index 000000000..4ea363df2
Binary files /dev/null and b/mobile_service_shop/static/description/assets/screenshots/1.png differ
diff --git a/mobile_service_shop/static/description/assets/screenshots/10.png b/mobile_service_shop/static/description/assets/screenshots/10.png
new file mode 100644
index 000000000..b460e42b8
Binary files /dev/null and b/mobile_service_shop/static/description/assets/screenshots/10.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..fa19a7163
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/12.png b/mobile_service_shop/static/description/assets/screenshots/12.png
new file mode 100644
index 000000000..dbad6f028
Binary files /dev/null and b/mobile_service_shop/static/description/assets/screenshots/12.png differ
diff --git a/mobile_service_shop/static/description/assets/screenshots/2.png b/mobile_service_shop/static/description/assets/screenshots/2.png
new file mode 100644
index 000000000..f12f86739
Binary files /dev/null and b/mobile_service_shop/static/description/assets/screenshots/2.png differ
diff --git a/mobile_service_shop/static/description/assets/screenshots/3.png b/mobile_service_shop/static/description/assets/screenshots/3.png
new file mode 100644
index 000000000..cadfee050
Binary files /dev/null and b/mobile_service_shop/static/description/assets/screenshots/3.png differ
diff --git a/mobile_service_shop/static/description/assets/screenshots/4.png b/mobile_service_shop/static/description/assets/screenshots/4.png
new file mode 100644
index 000000000..d4b74fbf9
Binary files /dev/null and b/mobile_service_shop/static/description/assets/screenshots/4.png differ
diff --git a/mobile_service_shop/static/description/assets/screenshots/5.png b/mobile_service_shop/static/description/assets/screenshots/5.png
new file mode 100644
index 000000000..030e3e11b
Binary files /dev/null and b/mobile_service_shop/static/description/assets/screenshots/5.png differ
diff --git a/mobile_service_shop/static/description/assets/screenshots/6.png b/mobile_service_shop/static/description/assets/screenshots/6.png
new file mode 100644
index 000000000..f14d5e5ae
Binary files /dev/null and b/mobile_service_shop/static/description/assets/screenshots/6.png differ
diff --git a/mobile_service_shop/static/description/assets/screenshots/7.png b/mobile_service_shop/static/description/assets/screenshots/7.png
new file mode 100644
index 000000000..54c68ee15
Binary files /dev/null and b/mobile_service_shop/static/description/assets/screenshots/7.png differ
diff --git a/mobile_service_shop/static/description/assets/screenshots/8.png b/mobile_service_shop/static/description/assets/screenshots/8.png
new file mode 100644
index 000000000..5e01e0e35
Binary files /dev/null and b/mobile_service_shop/static/description/assets/screenshots/8.png differ
diff --git a/mobile_service_shop/static/description/assets/screenshots/9.png b/mobile_service_shop/static/description/assets/screenshots/9.png
new file mode 100644
index 000000000..6370d8bae
Binary files /dev/null and b/mobile_service_shop/static/description/assets/screenshots/9.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..0170a22b5
Binary files /dev/null and b/mobile_service_shop/static/description/assets/screenshots/hero.gif 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..2ccea2da6
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..3e9e524c3
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..9eb34b3a1
--- /dev/null
+++ b/mobile_service_shop/static/description/index.html
@@ -0,0 +1,663 @@
+
+
+
+
+
+
+ Community
+
+
+ Enterprise
+
+
+ Odoo.sh
+
+
+
+
+
+
+
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
+
+
+
+
Terms and Conditions
+
Terms and Conditions can be created from. Mobile Service -> Configuration ->Terms and Conditions