diff --git a/mobile_service_shop/README.rst b/mobile_service_shop/README.rst new file mode 100644 index 000000000..5f062896e --- /dev/null +++ b/mobile_service_shop/README.rst @@ -0,0 +1,51 @@ +.. image:: https://img.shields.io/badge/license-LGPL--3-green.svg + :target: https://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 + +Mobile Service Management +========================= +Module for mobile service shop daily activities + +Configuration +============= +* No additional configurations needed + +Company +------- +* `Cybrosys Techno Solutions `__ + +License +------- +General Public License, Version 3 (LGPL v3). +(https://www.odoo.com/documentation/17.0/legal/licenses.html) + +Credits +------- +* Developers: Milind Mohan, + (V15) Mohammed Shahil M P, + (V16) Neenu Merlin Jose, + (V17) Vishnu KP, + (V18) Jumana Jabin MP, + Contact : odoo@cybrosys.com + +Contacts +-------- +* Mail Contact : odoo@cybrosys.com +* Website : https://cybrosys.com + +Bug Tracker +----------- +Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. + +Maintainer +========== +.. image:: https://cybrosys.com/images/logo.png + :target: https://cybrosys.com + +This module is maintained by Cybrosys Technologies. + +For support and more information, please visit `Our Website `__ + +Further information +=================== +HTML Description: ``__ diff --git a/mobile_service_shop/__init__.py b/mobile_service_shop/__init__.py new file mode 100644 index 000000000..02cb477b5 --- /dev/null +++ b/mobile_service_shop/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author:Jumana Jabin MP (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 LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL 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..9f3be62eb --- /dev/null +++ b/mobile_service_shop/__manifest__.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author:Jumana Jabin MP (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 LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +{ + 'name': 'Mobile Service Management', + 'version': '18.0.1.0.0', + 'summary': 'Module for managing mobile service shop daily activities.', + 'description':'This module provides an all-in-one solution for mobile' + ' service centers, helping them efficiently manage operations' + ' while maintaining high levels of customer satisfaction.', + 'category': 'Industries', + 'author': 'Cybrosys Techno Solutions', + 'company': 'Cybrosys Techno Solutions', + 'maintainer': 'Cybrosys Techno Solutions', + 'website': 'https://www.cybrosys.com', + 'depends': ['stock_account', 'mail', 'product', 'account' ,'sale'], + '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_email_template.xml', + 'reports/mobile_service_ticket.xml', + 'data/mobile_service_data.xml', + 'data/mobile_service_email_template.xml'], + 'images': ['static/description/banner.jpg'], + 'assetsq': { + 'web.assets_backend': [ + 'mobile_service_shop/static/src/css/mobile_service.css', + ], + }, + 'license': 'LGPL-3', + 'installable': True, + 'application': True, + 'auto_install': False, +} 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..767bfc700 --- /dev/null +++ b/mobile_service_shop/data/mobile_service_data.xml @@ -0,0 +1,21 @@ + + + + + + Mobile Service + sale + SERV + + + + Mobile Service Charge + service + + + + Mobile Service Advance + service + + + 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..897c3070d --- /dev/null +++ b/mobile_service_shop/data/mobile_service_email_template.xml @@ -0,0 +1,37 @@ + + + + + + Service Status Email + + ${ object.user_id.email or object.company_id.email } + {{object.person_name.email}} + Ref {{ (object.name or 'n/a') }} + + {{ (object.person_name.lang or object.technician_name.lang) }} + +
+

Dear, +

+

Your service request for + + ( + + ) with reference no + + + + has been processed to + + + + stage. +

+

If you have any questions, please let us know.

+

Best regards,

+
+
+
+
+
diff --git a/mobile_service_shop/doc/RELEASE_NOTES.md b/mobile_service_shop/doc/RELEASE_NOTES.md new file mode 100755 index 000000000..7b3b49ea6 --- /dev/null +++ b/mobile_service_shop/doc/RELEASE_NOTES.md @@ -0,0 +1,6 @@ +## Module + +### 16.10.2024 +#### Version 18.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..20ff73f89 --- /dev/null +++ b/mobile_service_shop/models/__init__.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author:Jumana Jabin MP (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 LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL 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..8df1dc11e --- /dev/null +++ b/mobile_service_shop/models/brand_model.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author:Jumana Jabin MP (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 LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL 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' + _inherit = ['mail.thread', 'mail.activity.mixin'] + _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..085e5d829 --- /dev/null +++ b/mobile_service_shop/models/mobile_brand.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author:Jumana Jabin MP (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 LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL 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' + _inherit = ['mail.thread', 'mail.activity.mixin'] + _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..f4c68521d --- /dev/null +++ b/mobile_service_shop/models/mobile_complaint.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author:Jumana Jabin MP (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 LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL 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' + _inherit = ['mail.thread', 'mail.activity.mixin'] + _rec_name = 'complaint_type' + + complaint_type = fields.Char(string="Complaint Type", required=True, + help="This field specifies the type of the " + "complaint.") 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..6ec03d43a --- /dev/null +++ b/mobile_service_shop/models/mobile_complaint_description.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author:Jumana Jabin MP (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 LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL 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" + _inherit = ['mail.thread', 'mail.activity.mixin'] + _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..5c9f5d6de --- /dev/null +++ b/mobile_service_shop/models/mobile_complaint_tree.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author:Jumana Jabin MP (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 LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from odoo import fields, models + + +class MobileComplaintTree(models.Model): + """Model for managing complaint details in mobile services.""" + _name = 'mobile.complaint.tree' + _description = 'Mobile Complaint Tree' + _inherit = ['mail.thread', 'mail.activity.mixin'] + _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..71096d99d --- /dev/null +++ b/mobile_service_shop/models/mobile_service.py @@ -0,0 +1,387 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author:Jumana Jabin MP (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 LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +import pytz +from datetime import datetime +from odoo import api, fields, models, _ +from odoo.exceptions import UserError + + +class MobileService(models.Model): + """Creates the model mobile.service""" + _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', + string='Deliver To', + required=True, + default=_default_picking_transfer, + help="This will determine picking " + "type of outgoing shipment.") + picking_count = fields.Integer(string="Picking Count", + help='Number of outgoing shipment') + + @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 a stock picking with products in parts usage""" + if not self.product_order_line: + raise UserError(_('No products are mentioned for this service.')) + flag = 0 + all_have_stock_number = True + move_lines = [] + for order in self.product_order_line: + if not order.stock_number: + all_have_stock_number = False + if order.product_uom_qty > order.qty_stock_move: + flag = 1 + move_line_vals = { + 'product_id': order.product_id.id, + 'quantity': order.product_uom_qty - order.qty_stock_move, + 'product_uom_id': order.product_id.uom_id.id if order.product_id.uom_id else False, + } + move_lines.append((0, 0, move_line_vals)) + elif order.product_uom_qty < order.qty_stock_move: + raise UserError( + _('Used quantity is less than quantity stock move posted.')) + if all_have_stock_number: + raise UserError( + _('All products have stock moves. No stock picking will be created.')) + if flag == 0: + raise UserError(_('Nothing to post stock move.')) + 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), + 'move_line_ids': move_lines + } + picking = self.env['stock.picking'].create(pick) + self.stock_picking_id = picking.id + self.picking_count = len(picking) + picking.action_confirm() + picking.button_validate() + for order in self.product_order_line: + if not order.stock_number: + order.stock_number = picking.name + self.message_post( + body='Stock moves have been successfully posted for picking %s.' + % picking.name,) + + 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..4f68dac45 --- /dev/null +++ b/mobile_service_shop/models/product_order_line.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author:Jumana Jabin MP (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 LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from odoo import api, fields, models, _ + + +class ProductOrderLine(models.Model): + """Model for managing product order lines in mobile service operations.""" + _name = 'product.order.line' + _description = 'Product Order Line' + + product_order_id = fields.Many2one('mobile.service', + help="Reference to the related mobile " + "service order to which this product" + " order line belongs.") + 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.") + stock_number = fields.Char(string="Picking", help="Stock move picking name", + readonly=True) + + @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}) diff --git a/mobile_service_shop/models/product_template.py b/mobile_service_shop/models/product_template.py new file mode 100644 index 000000000..6a87716eb --- /dev/null +++ b/mobile_service_shop/models/product_template.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author:Jumana Jabin MP (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 LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from odoo import fields, models + + +class ProductTemplate(models.Model): + """Inherits the model product.template to extend and add 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..1950f323c --- /dev/null +++ b/mobile_service_shop/models/service_ticket.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author:Jumana Jabin MP (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 LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from odoo import api, models + + +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, docids, 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..b4450a3a3 --- /dev/null +++ b/mobile_service_shop/models/terms_condition.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author:Jumana Jabin MP (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 LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL 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' + _inherit = ['mail.thread', 'mail.activity.mixin'] + _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..bcc784564 --- /dev/null +++ b/mobile_service_shop/reports/mobile_service_email_template.xml @@ -0,0 +1,118 @@ + + + + + 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..3a251d881 --- /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/cybro-icon.png b/mobile_service_shop/static/description/assets/cybro-icon.png new file mode 100644 index 000000000..06e73e11d Binary files /dev/null and b/mobile_service_shop/static/description/assets/cybro-icon.png differ diff --git a/mobile_service_shop/static/description/assets/cybro-odoo.png b/mobile_service_shop/static/description/assets/cybro-odoo.png new file mode 100644 index 000000000..ed02e07a4 Binary files /dev/null and b/mobile_service_shop/static/description/assets/cybro-odoo.png differ diff --git a/mobile_service_shop/static/description/assets/icons/arrows-repeat.svg b/mobile_service_shop/static/description/assets/icons/arrows-repeat.svg new file mode 100644 index 000000000..1d7efabc5 --- /dev/null +++ b/mobile_service_shop/static/description/assets/icons/arrows-repeat.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/mobile_service_shop/static/description/assets/icons/banner-1.png b/mobile_service_shop/static/description/assets/icons/banner-1.png new file mode 100644 index 000000000..c180db172 Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/banner-1.png differ diff --git a/mobile_service_shop/static/description/assets/icons/banner-2.svg b/mobile_service_shop/static/description/assets/icons/banner-2.svg new file mode 100644 index 000000000..e606d97d9 --- /dev/null +++ b/mobile_service_shop/static/description/assets/icons/banner-2.svg @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mobile_service_shop/static/description/assets/icons/banner-bg.png b/mobile_service_shop/static/description/assets/icons/banner-bg.png new file mode 100644 index 000000000..a8238d3c0 Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/banner-bg.png differ diff --git a/mobile_service_shop/static/description/assets/icons/banner-bg.svg b/mobile_service_shop/static/description/assets/icons/banner-bg.svg new file mode 100644 index 000000000..b1378103e --- /dev/null +++ b/mobile_service_shop/static/description/assets/icons/banner-bg.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/mobile_service_shop/static/description/assets/icons/banner-call.svg b/mobile_service_shop/static/description/assets/icons/banner-call.svg new file mode 100644 index 000000000..96c687e81 --- /dev/null +++ b/mobile_service_shop/static/description/assets/icons/banner-call.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/mobile_service_shop/static/description/assets/icons/banner-mail.svg b/mobile_service_shop/static/description/assets/icons/banner-mail.svg new file mode 100644 index 000000000..cbf0d158d --- /dev/null +++ b/mobile_service_shop/static/description/assets/icons/banner-mail.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/mobile_service_shop/static/description/assets/icons/banner-pattern.svg b/mobile_service_shop/static/description/assets/icons/banner-pattern.svg new file mode 100644 index 000000000..9c1c7e101 --- /dev/null +++ b/mobile_service_shop/static/description/assets/icons/banner-pattern.svg @@ -0,0 +1,343 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mobile_service_shop/static/description/assets/icons/banner-promo.svg b/mobile_service_shop/static/description/assets/icons/banner-promo.svg new file mode 100644 index 000000000..d52791b11 --- /dev/null +++ b/mobile_service_shop/static/description/assets/icons/banner-promo.svg @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mobile_service_shop/static/description/assets/icons/brand-pair.svg b/mobile_service_shop/static/description/assets/icons/brand-pair.svg new file mode 100644 index 000000000..d8db7fc1e --- /dev/null +++ b/mobile_service_shop/static/description/assets/icons/brand-pair.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/close-icon.svg b/mobile_service_shop/static/description/assets/icons/close-icon.svg new file mode 100644 index 000000000..df8cce37a --- /dev/null +++ b/mobile_service_shop/static/description/assets/icons/close-icon.svg @@ -0,0 +1,5 @@ + + + + + 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/collabarate-icon.svg b/mobile_service_shop/static/description/assets/icons/collabarate-icon.svg new file mode 100644 index 000000000..dd4e10518 --- /dev/null +++ b/mobile_service_shop/static/description/assets/icons/collabarate-icon.svg @@ -0,0 +1,3 @@ + + + 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/cybro-logo.png b/mobile_service_shop/static/description/assets/icons/cybro-logo.png new file mode 100644 index 000000000..ff4b78220 Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/cybro-logo.png differ diff --git a/mobile_service_shop/static/description/assets/icons/down.svg b/mobile_service_shop/static/description/assets/icons/down.svg new file mode 100644 index 000000000..f21c36271 --- /dev/null +++ b/mobile_service_shop/static/description/assets/icons/down.svg @@ -0,0 +1 @@ + \ No newline at end of file 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/faq.png b/mobile_service_shop/static/description/assets/icons/faq.png new file mode 100644 index 000000000..4250b5b81 Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/faq.png differ diff --git a/mobile_service_shop/static/description/assets/icons/feature-icon.svg b/mobile_service_shop/static/description/assets/icons/feature-icon.svg new file mode 100644 index 000000000..fa0ea6850 --- /dev/null +++ b/mobile_service_shop/static/description/assets/icons/feature-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/mobile_service_shop/static/description/assets/icons/feature.png b/mobile_service_shop/static/description/assets/icons/feature.png new file mode 100644 index 000000000..ac7a785c0 Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/feature.png differ diff --git a/mobile_service_shop/static/description/assets/icons/gear.svg b/mobile_service_shop/static/description/assets/icons/gear.svg new file mode 100644 index 000000000..0cc66b6ea --- /dev/null +++ b/mobile_service_shop/static/description/assets/icons/gear.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/mobile_service_shop/static/description/assets/icons/hire-odoo.svg b/mobile_service_shop/static/description/assets/icons/hire-odoo.svg new file mode 100644 index 000000000..e1ac089b0 --- /dev/null +++ b/mobile_service_shop/static/description/assets/icons/hire-odoo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + 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/life-ring-icon.svg b/mobile_service_shop/static/description/assets/icons/life-ring-icon.svg new file mode 100644 index 000000000..3ae6e1d89 --- /dev/null +++ b/mobile_service_shop/static/description/assets/icons/life-ring-icon.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + 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/mail.svg b/mobile_service_shop/static/description/assets/icons/mail.svg new file mode 100644 index 000000000..1eedde695 --- /dev/null +++ b/mobile_service_shop/static/description/assets/icons/mail.svg @@ -0,0 +1,3 @@ + + + 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/notes.png b/mobile_service_shop/static/description/assets/icons/notes.png new file mode 100644 index 000000000..ee5e95404 Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/notes.png differ diff --git a/mobile_service_shop/static/description/assets/icons/notification icon.svg b/mobile_service_shop/static/description/assets/icons/notification icon.svg new file mode 100644 index 000000000..053189973 --- /dev/null +++ b/mobile_service_shop/static/description/assets/icons/notification icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/mobile_service_shop/static/description/assets/icons/odoo-consultancy.svg b/mobile_service_shop/static/description/assets/icons/odoo-consultancy.svg new file mode 100644 index 000000000..e05f65bde --- /dev/null +++ b/mobile_service_shop/static/description/assets/icons/odoo-consultancy.svg @@ -0,0 +1,4 @@ + + + + diff --git a/mobile_service_shop/static/description/assets/icons/odoo-licencing.svg b/mobile_service_shop/static/description/assets/icons/odoo-licencing.svg new file mode 100644 index 000000000..2606c88b0 --- /dev/null +++ b/mobile_service_shop/static/description/assets/icons/odoo-licencing.svg @@ -0,0 +1,3 @@ + + + diff --git a/mobile_service_shop/static/description/assets/icons/odoo-logo.png b/mobile_service_shop/static/description/assets/icons/odoo-logo.png new file mode 100644 index 000000000..0e4d0eb5a Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/odoo-logo.png differ diff --git a/mobile_service_shop/static/description/assets/icons/patter.svg b/mobile_service_shop/static/description/assets/icons/patter.svg new file mode 100644 index 000000000..25c9c0a8f --- /dev/null +++ b/mobile_service_shop/static/description/assets/icons/patter.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/mobile_service_shop/static/description/assets/icons/pattern1.png b/mobile_service_shop/static/description/assets/icons/pattern1.png new file mode 100644 index 000000000..09ab0fb2d Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/pattern1.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-piece-icon.svg b/mobile_service_shop/static/description/assets/icons/puzzle-piece-icon.svg new file mode 100644 index 000000000..3e9ad9373 --- /dev/null +++ b/mobile_service_shop/static/description/assets/icons/puzzle-piece-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + 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/replace-icon.svg b/mobile_service_shop/static/description/assets/icons/replace-icon.svg new file mode 100644 index 000000000..d0e3a7af1 --- /dev/null +++ b/mobile_service_shop/static/description/assets/icons/replace-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + 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/screenshot-main.png b/mobile_service_shop/static/description/assets/icons/screenshot-main.png new file mode 100644 index 000000000..575f8e676 Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/screenshot-main.png differ diff --git a/mobile_service_shop/static/description/assets/icons/screenshot.png b/mobile_service_shop/static/description/assets/icons/screenshot.png new file mode 100644 index 000000000..cef272529 Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/screenshot.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/skype-fill.svg b/mobile_service_shop/static/description/assets/icons/skype-fill.svg new file mode 100644 index 000000000..c17423639 --- /dev/null +++ b/mobile_service_shop/static/description/assets/icons/skype-fill.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/mobile_service_shop/static/description/assets/icons/skype.png b/mobile_service_shop/static/description/assets/icons/skype.png new file mode 100644 index 000000000..51b409fb3 Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/skype.png differ diff --git a/mobile_service_shop/static/description/assets/icons/skype.svg b/mobile_service_shop/static/description/assets/icons/skype.svg new file mode 100644 index 000000000..df3dad39b --- /dev/null +++ b/mobile_service_shop/static/description/assets/icons/skype.svg @@ -0,0 +1,3 @@ + + + diff --git a/mobile_service_shop/static/description/assets/icons/star-1.svg b/mobile_service_shop/static/description/assets/icons/star-1.svg new file mode 100644 index 000000000..7e55ab162 --- /dev/null +++ b/mobile_service_shop/static/description/assets/icons/star-1.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mobile_service_shop/static/description/assets/icons/star-2.svg b/mobile_service_shop/static/description/assets/icons/star-2.svg new file mode 100644 index 000000000..5ae9f507a --- /dev/null +++ b/mobile_service_shop/static/description/assets/icons/star-2.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/mobile_service_shop/static/description/assets/icons/support.png b/mobile_service_shop/static/description/assets/icons/support.png new file mode 100644 index 000000000..4f18b8b82 Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/support.png differ diff --git a/mobile_service_shop/static/description/assets/icons/test-1 - Copy.png b/mobile_service_shop/static/description/assets/icons/test-1 - Copy.png new file mode 100644 index 000000000..f6a902663 Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/test-1 - Copy.png differ diff --git a/mobile_service_shop/static/description/assets/icons/test-1.png b/mobile_service_shop/static/description/assets/icons/test-1.png new file mode 100644 index 000000000..0908add2b Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/test-1.png differ diff --git a/mobile_service_shop/static/description/assets/icons/test-2.png b/mobile_service_shop/static/description/assets/icons/test-2.png new file mode 100644 index 000000000..4671fe91e Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/test-2.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/translate.svg b/mobile_service_shop/static/description/assets/icons/translate.svg new file mode 100644 index 000000000..af9c8a1aa --- /dev/null +++ b/mobile_service_shop/static/description/assets/icons/translate.svg @@ -0,0 +1,10 @@ + + + + + + + + + + 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/video.png b/mobile_service_shop/static/description/assets/icons/video.png new file mode 100644 index 000000000..576705b17 Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/video.png differ diff --git a/mobile_service_shop/static/description/assets/icons/whatsapp.png b/mobile_service_shop/static/description/assets/icons/whatsapp.png new file mode 100644 index 000000000..d513a5356 Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/whatsapp.png differ diff --git a/mobile_service_shop/static/description/assets/icons/wrench-icon.svg b/mobile_service_shop/static/description/assets/icons/wrench-icon.svg new file mode 100644 index 000000000..174b5a465 --- /dev/null +++ b/mobile_service_shop/static/description/assets/icons/wrench-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/mobile_service_shop/static/description/assets/icons/wrench.png b/mobile_service_shop/static/description/assets/icons/wrench.png new file mode 100644 index 000000000..6c04dea0f Binary files /dev/null and b/mobile_service_shop/static/description/assets/icons/wrench.png differ diff --git a/mobile_service_shop/static/description/assets/modules/1.gif b/mobile_service_shop/static/description/assets/modules/1.gif new file mode 100644 index 000000000..ae3a880a2 Binary files /dev/null and b/mobile_service_shop/static/description/assets/modules/1.gif differ diff --git a/mobile_service_shop/static/description/assets/modules/2.gif b/mobile_service_shop/static/description/assets/modules/2.gif new file mode 100644 index 000000000..d19e2b352 Binary files /dev/null and b/mobile_service_shop/static/description/assets/modules/2.gif 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..8513873ea 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..3bedf7981 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 100644 index 000000000..0e311ca87 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.jpg b/mobile_service_shop/static/description/assets/modules/6.jpg new file mode 100644 index 000000000..67c7f7062 Binary files /dev/null and b/mobile_service_shop/static/description/assets/modules/6.jpg 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..e7660a0f8 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..b44ec9201 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..fadc46c43 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..5a3a2fe04 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..5240f0bf7 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..b2db2e420 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..6c25b01ff 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..17ce0c67a 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..d8000a52a 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..9851baa44 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..cbefe512f 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..39dd33a79 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..420f4fcf9 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.jpg b/mobile_service_shop/static/description/banner.jpg new file mode 100644 index 000000000..3381c0cd5 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..e13a308b8 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..8f240d3d3 --- /dev/null +++ b/mobile_service_shop/static/description/index.html @@ -0,0 +1,1355 @@ + + + + + + Mobile Service Management + + + + + + + + + + +
+
+ + + +
+
+ Community +
+
+ Enterprise +
+
+ Odoo.sh +
+
+
+ +
+
+
+
+

+ Module for managing mobile service shop daily activities. +

+

Mobile Service Management +

+
+
+ +
+ +
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+

Key + Heighlights

+
+
+
+
+ +
+
+ Odoo 18 Community & Enterprise Edition Support. +
+

+ Budget management system in Odoo 18 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. +

+
+
+
+
+ +
+
+
+ Mobile Service Management +

+ Are you ready to make your business more + organized? +
Improve now! +

+ +
+
+ +
+
+
+ + + + +
+
+ +
+
+
+
+ acc_bg +
+ +
+
+
+
+

+ Service Request + + page + +

+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ Special + + buttons + +

+
+
+

+ Easy way to Print the service , Create Invoice And Sent notification by + mail etc. +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ Complaints + + page +

+
+
+

+ Can Set up the category of complaints and description. +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ Parts + + + page +

+
+
+

+ Can Set up the parts details and price and quantity. +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ Configuration + + + Menu +

+
+
+

+ Can Set up the Brand, Models, Complaint template, etc. +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ Stock + + + Moves +

+
+
+

+ When clicking the "Post Stock Moves" Button ,the corresponding stock + move is created and can see the picking from the view +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ Create + + + Invoice +

+
+
+

+ Create Invoice Within the Module Itself +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ Print + + + Ticket +

+
+
+

+ We can print the ticket by clicking "Print Ticket" Button from the + request itself. +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ Mail + + + Notification +

+
+
+

+ We can Sent Mail Notification to the Customer +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ Product + + + Management +

+
+
+

+ We can Easily Manage the Mobile Parts Here ,Identifier field for a + Mobile Product and Configure The Model and Brand of the Mobile Product + +

+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+ +
+

+ Service request creation. +

+
+ +
+
+
+
+
+
+ +
+

+ Mobile service ticket generation. +

+
+
+
+
+
+
+
+ +
+

+ Assigning Service Request to Technicians +

+
+ +
+
+
+
+
+
+ +
+

+ Tracking the Service Status. +

+
+
+
+
+
+
+
+ +
+

+ Odoo 18 Community & Enterprise Edition Support. + +

+
+
+
+
+
+
+
+
+
+
+ +
+ +
+ +
+

+ Mobile Service Management refers to a system that helps mobile service shops manage daily operations, including tracking repairs, managing inventory, handling customer complaints, and processing invoices efficiently. +

+
+
+ +
+ +
+

+ The module integrates with Odoo's inventory features, allowing service centers to manage parts and products used in repairs. +

+
+
+ +
+ +
+

+ Yes, the module allows users to manage various mobile brands and models, ensuring accurate tracking and service management. +

+
+
+ +
+ +
+

+ The module includes features for managing customer complaints, tracking mobile service tickets, invoicing, product management, brand and model handling, and more. +

+
+
+
+ +
+
+
+
+
+
+ +
+
+

+ Latest Release 18.0.1.0.0 +

+ + 16th October, 2024 + +
+
+
+
+
+ Add +
+
+
+
    +
  • + Initial Commit +
  • + +
+
+
+
+
+
+
+
+
+
+ + + + + + +
+

+ Our Services

+ +
+ +
+
+ .... +
+
+ +
+ + +
+
+ + + + + + diff --git a/mobile_service_shop/static/src/css/mobile_service.css b/mobile_service_shop/static/src/css/mobile_service.css new file mode 100644 index 000000000..710cbc776 --- /dev/null +++ b/mobile_service_shop/static/src/css/mobile_service.css @@ -0,0 +1,6 @@ +.Your_custom_class { + height: 80px; width: 80px; overflow:hidden; +} +.openerp .oe_form .oe_form_field_image img { + max-width:80px; max-height: 80px; +} diff --git a/mobile_service_shop/views/brand_models_views.xml b/mobile_service_shop/views/brand_models_views.xml new file mode 100644 index 000000000..11683bb81 --- /dev/null +++ b/mobile_service_shop/views/brand_models_views.xml @@ -0,0 +1,85 @@ + + + + + brand.model.view.form + brand.model + +
+ + + + + + + + + + + + +
+
+ + + brand.model.view.kanban + brand.model + + + + + + + +
+
+ Product +
+
+ + + +
+
+
    +
  • model: + +
  • +
+
+
+ + + + + + + + brand.model.view.list + brand.model + + + + + + + + + + + Models + brand.model + kanban,list,form + +

+ Click to Create a New Record. +

+
+
+ + + diff --git a/mobile_service_shop/views/mobile_brand_views.xml b/mobile_service_shop/views/mobile_brand_views.xml new file mode 100644 index 000000000..9d1977754 --- /dev/null +++ b/mobile_service_shop/views/mobile_brand_views.xml @@ -0,0 +1,45 @@ + + + + + mobile.brand.view.form + mobile.brand + +
+ + + + + + + + + +
+
+ + + mobile.brand.view.tree + mobile.brand + + + + + + + + + Mobile Brand + mobile.brand + list,form + + +

+ Click to Create a New Record. +

+
+
+ + +
diff --git a/mobile_service_shop/views/mobile_complaint_description_views.xml b/mobile_service_shop/views/mobile_complaint_description_views.xml new file mode 100644 index 000000000..166a0de85 --- /dev/null +++ b/mobile_service_shop/views/mobile_complaint_description_views.xml @@ -0,0 +1,47 @@ + + + + + mobile.complaint.description.view.form + mobile.complaint.description + +
+ + + + + + + + +
+
+ + + mobile.complaint.description.view.tree + mobile.complaint.description + + + + + + + + + + Complaint Type Templates + mobile.complaint.description + list,form + + +

+ Click to Create a New Record. +

+
+
+ + +
diff --git a/mobile_service_shop/views/mobile_complaint_views.xml b/mobile_service_shop/views/mobile_complaint_views.xml new file mode 100644 index 000000000..95f485c1f --- /dev/null +++ b/mobile_service_shop/views/mobile_complaint_views.xml @@ -0,0 +1,46 @@ + + + + + mobile.complaint.view.form + mobile.complaint + +
+ + + + + + + + + +
+
+ + + mobile.complaint.view.tree + mobile.complaint + + + + + + + + + Complaint Types + mobile.complaint + list,form + + +

+ Click to Create a New Record. +

+
+
+ + +
diff --git a/mobile_service_shop/views/mobile_service_views.xml b/mobile_service_shop/views/mobile_service_views.xml new file mode 100644 index 000000000..60fa3f053 --- /dev/null +++ b/mobile_service_shop/views/mobile_service_views.xml @@ -0,0 +1,274 @@ + + + + + Service Code + mobile.service + SERV/ + + + + + + mobile.service.view.search + mobile.service + + + + + + + + + + + + + + + + + + + + + + mobile.service.view.form + mobile.service + +
+
+
+ +
+ +
+
+

+ +

+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+ + +
+
+ + + mobile.service.view.kanban + mobile.service + + + + + + +
+
+ +
+
+
+ + + +
+
+ +
+ +
+
+
+
+ + + + + + + + mobile.service.view.graph + mobile.service + + + + + + + + + mobile.service.view.tree + mobile.service + + + + + + + + + + + + + + + + + + Service Request + mobile.service + list,form,kanban,pivot,graph + + + +

+ Click to Create a New Record. +

+
+
+ + + + + + diff --git a/mobile_service_shop/views/product_product_views.xml b/mobile_service_shop/views/product_product_views.xml new file mode 100644 index 000000000..70709bdb6 --- /dev/null +++ b/mobile_service_shop/views/product_product_views.xml @@ -0,0 +1,55 @@ + + + + + product.product.view.kanban.inherit.mobile.service.shop + product.product + + + + + &nbsp; + + &nbsp; + + + + + + + + product.template.view.kanban.inherit.mobile.service.shop + product.template + + + + + &nbsp; + + &nbsp; + + + + + + + + Products + ir.actions.act_window + product.product + kanban,list,form + {"search_default_consumable":1, 'default_type': 'consu'} + [('is_a_parts', '=', True)] + +

+ Click to define a new product. +

+
+
+ + +
diff --git a/mobile_service_shop/views/product_template_views.xml b/mobile_service_shop/views/product_template_views.xml new file mode 100644 index 000000000..14ce21dbb --- /dev/null +++ b/mobile_service_shop/views/product_template_views.xml @@ -0,0 +1,29 @@ + + + + + product.template.view.form.inherit.mobile.service.shop + product.template + + + + + + + + + + + + + + + + + + + + + + diff --git a/mobile_service_shop/views/terms_and_condition_views.xml b/mobile_service_shop/views/terms_and_condition_views.xml new file mode 100644 index 000000000..9b94f7219 --- /dev/null +++ b/mobile_service_shop/views/terms_and_condition_views.xml @@ -0,0 +1,44 @@ + + + + + terms.conditions.view.form + terms.conditions + +
+ + + + + + + +
+
+ + + terms.conditions.view.tree + terms.conditions + + + + + + + + + Terms and Conditions + terms.conditions + list,form + + +

+ Click to Create a New Record. +

+
+
+ + +
diff --git a/mobile_service_shop/wizard/__init__.py b/mobile_service_shop/wizard/__init__.py new file mode 100644 index 000000000..d40969295 --- /dev/null +++ b/mobile_service_shop/wizard/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author:Jumana Jabin MP (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 LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from . import mobile_create_invoice diff --git a/mobile_service_shop/wizard/mobile_create_invoice.py b/mobile_service_shop/wizard/mobile_create_invoice.py new file mode 100644 index 000000000..238643ca1 --- /dev/null +++ b/mobile_service_shop/wizard/mobile_create_invoice.py @@ -0,0 +1,160 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author:Jumana Jabin MP (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 LESSER GENERAL PUBLIC LICENSE +# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from odoo import fields, models, _ +from odoo.exceptions import UserError + + +class MobileInvoice(models.Model): + """Model for managing the creation of invoices in mobile service + operations.""" + _name = 'mobile.invoice' + + advance_payment_method = fields.Selection( + [('advance', 'Advance'), ('full_amount', 'Full amount')], + string='Invoice method', default='advance') + amount = fields.Integer(string='Amount', help="Payment Amount") + number = fields.Char(string='Service Id', help="Payment service id'") + + def action_invoice_create(self): + """Creating invoice""" + active_id = self._context.get('active_id') + service_id = self.env['mobile.service'].search([('id', '=', active_id)]) + if not service_id.env['product.product'].search( + [("name", "=", "Mobile Service Advance")]): + vals = self._prepare_advance_product() + self.env['product.product'].create(vals) + if not service_id.env['product.product'].search( + [("name", "=", "Mobile Service Charge")]): + vals1 = self._prepare_service_product() + self.env['product.product'].create(vals1) + service_id.first_invoice_created = True + inv_obj = self.env['account.move'] + supplier = service_id.person_name + inv_data = { + 'move_type': 'out_invoice', + 'ref': supplier.name, + 'partner_id': supplier.id, + 'currency_id': service_id.company_id.currency_id.id, + 'journal_id': service_id.journal_type.id, + 'invoice_origin': service_id.name, + 'company_id': service_id.company_id.id, + } + inv_id = inv_obj.create(inv_data) + service_id.first_payment_inv = inv_id.id + self.number = service_id.name + if self.advance_payment_method != 'advance': + product_id = service_id.env['product.product'].search( + [("name", "=", "Mobile Service Charge")]) + else: + product_id = service_id.env['product.product'].search( + [("name", "=", "Mobile Service Advance")]) + if product_id.property_account_income_id.id: + income_account = product_id.property_account_income_id.id + elif product_id.categ_id.property_account_income_categ_id.id: + income_account = product_id.categ_id.property_account_income_categ_id.id + else: + raise UserError( + _(f'Please define income account for this ' + f'product: "{product_id.name}" (id:{product_id.id}).')) + flag = 0 + if self.amount: + flag = 1 + inv_line_data = [(0, 0, { + 'name': product_id.name, + 'price_unit': self.amount, + 'quantity': 1, + 'credit': self.amount, + 'debit': 0, + 'account_id': income_account, + 'product_id': product_id.id, + 'move_id': inv_id.id, + })] + inv_id.write({ + 'invoice_line_ids': inv_line_data}) + inv_id._compute_journal_id() + sale_order_product = self.env['product.order.line'].search( + [('product_order_id', '=', service_id.name)]) + for line_data in sale_order_product: + qty = line_data.product_uom_qty - line_data.qty_invoiced + if line_data.product_uom_qty < line_data.qty_invoiced: + raise UserError( + _('Used quantity is less than invoiced quantity')) + uom_id = line_data.product_id.product_tmpl_id.uom_id + if qty > 0: + flag = 1 + price = line_data.part_price + inv_line_data = [(0, 0, { + 'name': line_data.product_id.name, + 'price_unit': price, + 'quantity': qty, + 'product_uom_id': uom_id.id, + 'account_id': income_account, + 'product_id': line_data.product_id.id, + 'move_id': inv_id.id, + })] + inv_id.write({ + 'invoice_line_ids': inv_line_data}) + line_data.qty_invoiced = line_data.qty_invoiced + qty + inv_id._compute_journal_id() + if flag != 1: + raise UserError(_('Nothing to create invoice')) + imd = service_id.env['ir.model.data'] + action = self.env.ref('account.action_move_out_invoice_type') + list_view_id = imd._xmlid_to_res_id('account.view_move_tree') + form_view_id = imd._xmlid_to_res_id('account.view_move_form') + result = { + 'name': action.name, + 'help': action.help, + 'type': 'ir.actions.act_window', + 'views': [[list_view_id, 'tree'], [form_view_id, 'form'], + [False, 'graph'], [False, 'kanban'], + [False, 'calendar'], [False, 'pivot']], + 'target': action.target, + 'context': action.context, + 'res_model': 'account.move', + } + if len(inv_id) > 1: + result['domain'] = f"[('id','in',{inv_id.ids})]" + elif len(inv_id) == 1: + result['views'] = [(form_view_id, 'form')] + result['res_id'] = inv_id.ids[0] + else: + result = {'type': 'ir.actions.act_window_close'} + return result + + def _prepare_advance_product(self): + # It returns the advance product + return { + 'name': 'Mobile Service Advance', + 'type': 'service', + 'invoice_policy': 'order', + 'company_id': False, + } + + def _prepare_service_product(self): + # It returns the service product + return { + 'name': 'Mobile Service Charge', + 'type': 'service', + 'invoice_policy': 'order', + 'company_id': False, + } diff --git a/mobile_service_shop/wizard/mobile_create_invoice_views.xml b/mobile_service_shop/wizard/mobile_create_invoice_views.xml new file mode 100644 index 000000000..7c9b73dab --- /dev/null +++ b/mobile_service_shop/wizard/mobile_create_invoice_views.xml @@ -0,0 +1,38 @@ + + + + + Create Invoice + mobile.invoice + +
+

+ Invoices will be created in draft so that you can review + them before validation. +

+ + + +
+
+
+
+
+ + + Create Invoice + ir.actions.act_window + mobile.invoice + form + new + + +