@ -0,0 +1,35 @@ |
|||
Mobile Service Management |
|||
========================= |
|||
Module for mobile service shop daily activities |
|||
|
|||
Configuration |
|||
============= |
|||
* No additional configurations needed |
|||
|
|||
Company |
|||
------- |
|||
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__ |
|||
|
|||
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 <https://cybrosys.com/>`__ |
|||
|
|||
Further information |
|||
=================== |
|||
HTML Description: `<static/description/index.html>`__ |
|||
|
@ -0,0 +1,24 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2019-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
|||
# 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 <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################# |
|||
|
|||
from . import models |
|||
from . import wizard |
@ -0,0 +1,56 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2019-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
|||
# 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 <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################# |
|||
{ |
|||
'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', |
|||
} |
@ -0,0 +1,23 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
|
|||
<data noupdate="1"> |
|||
<record model="account.journal" id="mobile_service_journal"> |
|||
<field name="name">Mobile Service</field> |
|||
<field name="type">sale</field> |
|||
<field name="code">SERV</field> |
|||
<field name="active">TRUE</field> |
|||
</record> |
|||
<record model="product.template" id="mobile_service_product"> |
|||
<field name="name">Mobile Service Charge</field> |
|||
<field name="type">service</field> |
|||
<!-- <field name="invoice_policy">order</field>--> |
|||
</record> |
|||
<record model="product.template" id="mobile_service_advance_product"> |
|||
<field name="name">Mobile Service Advance</field> |
|||
<field name="type">service</field> |
|||
<!-- <field name="invoice_policy">order</field>--> |
|||
</record> |
|||
</data> |
|||
|
|||
</odoo> |
@ -0,0 +1,24 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
|
|||
<data noupdate="1"> |
|||
<!--Email template --> |
|||
<record id="email_template_mobile_service" model="mail.template"> |
|||
<field name="name">Service Status Email</field> |
|||
<field name="model_id" ref="mobile_service_shop.model_mobile_service"/> |
|||
<field name="email_from">${(object.user_id.email |safe}</field> |
|||
<field name="email_to" >${object.person_name.email |safe}</field> |
|||
<field name="subject">Ref ${object.name or 'n/a' }</field> |
|||
<field name="auto_delete" eval="True"/> |
|||
<field name="lang">${object.person_name.lang}</field> |
|||
<field name="body_html"><![CDATA[ |
|||
<p>Dear ${object.person_name.name},</p> |
|||
<p>Your service request for ${object.brand_name.brand_name or 'n/a' } (${object.model_name.mobile_brand_models or 'n/a' }) with reference no <b>${object.name or 'n/a' }</b> has been processed to <b>${object.service_state or 'n/a' }</b> stage.</p> |
|||
<p>If you have any questions, please let us know.</p> |
|||
<p>Best regards,</p>]]> |
|||
</field> |
|||
</record> |
|||
|
|||
</data> |
|||
|
|||
</odoo> |
@ -0,0 +1,8 @@ |
|||
## Module <mobile_service_shop> |
|||
|
|||
#### 05.10.2020 |
|||
#### Version 16.0.1.0.0 |
|||
#### ADD |
|||
|
|||
Initial Commit. |
|||
|
@ -0,0 +1,25 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2019-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
|||
# 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 <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################# |
|||
from . import mobile_service |
|||
from . import service_ticket |
|||
from . import product_order_line |
|||
from . import product |
@ -0,0 +1,405 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2019-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
|||
# 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 <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################# |
|||
############################################################################# |
|||
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 '' |
|||
|
|||
|
@ -0,0 +1,36 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2019-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
|||
# 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 <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################# |
|||
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") |
@ -0,0 +1,92 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2019-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
|||
# 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 <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################# |
|||
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 |
@ -0,0 +1,46 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2019-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
|||
# 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 <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################# |
|||
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, |
|||
} |
@ -0,0 +1,12 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<odoo> |
|||
<data> |
|||
<record id="mobile_service_ticket" model="ir.actions.report"> |
|||
<field name="name">Mobile Service Ticket</field> |
|||
<field name="model">mobile.service</field> |
|||
<field name="report_type">qweb-pdf</field> |
|||
<field name="report_name">mobile_service_shop.mobile_service_ticket_template</field> |
|||
<field name="report_file">mobile_service_shop.mobile_service_ticket_template</field> |
|||
</record> |
|||
</data> |
|||
</odoo> |
@ -0,0 +1,78 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
|
|||
<template id="mobile_service_ticket_template"> |
|||
<t t-call="web.external_layout"> |
|||
<t t-call="web.html_container"> |
|||
<div class="page"> |
|||
<br/> |
|||
<div class="row" style="margin-bottom:40px; text-align:center;margin-left:0;margin-top:2%;"> |
|||
<h3><strong>Service Ticket</strong></h3> |
|||
</div> |
|||
<div class="col-xs-6" style="margin-top:2%; margin-left:15%;"> |
|||
<table style="width:100%;"> |
|||
<tbody style="line-height:2"> |
|||
<tr> |
|||
<td><strong>Ref no</strong></td><td> : </td> |
|||
<td><strong> <span style="font-size:16px; font-weight:2px;" t-esc="sev_id"/></strong></td> |
|||
<td><strong>Customer name </strong></td><td> : </td> |
|||
<td> <span t-esc="customer_name"/></td> |
|||
</tr> |
|||
</tbody> |
|||
</table> |
|||
</div> |
|||
<div class="col-xs-6" style="margin-top:2%; margin-left:15%;"> |
|||
<table style="width:100%;"> |
|||
<tbody style="line-height:2"> |
|||
<tr> |
|||
<td style="margin-right:10%;"><strong>Requested date </strong></td><td> : </td> |
|||
<td> <span t-esc="date_request"/></td> |
|||
<td style="margin-right:10%;"><strong>Return date </strong></td><td> : </td> |
|||
<td> <span t-esc="date_return"/></td> |
|||
</tr> |
|||
</tbody> |
|||
</table> |
|||
</div> |
|||
<div class="col-xs-6" style="margin-top:20%;margin-left:5%; text-align:center;"><h2>Device details</h2></div> |
|||
<table style="margin-top:5%;margin-left:5%;width:95%;border:1px solid black;line-height:2;text-align:center;"> |
|||
<thead style="background-color:#c9cacc;font-size:15px;"> |
|||
<tr> |
|||
<td>Sl no.</td> |
|||
<td>Device brand</td> |
|||
<td>Model name</td> |
|||
<td>IMEI</td> |
|||
<td>Complaints</td> |
|||
<td>Description</td> |
|||
</tr> |
|||
</thead> |
|||
<tbody> |
|||
<tr> |
|||
<td>1</td> |
|||
<td><t t-esc="mobile_brand"/></td> |
|||
<td><t t-esc="model_name"/></td> |
|||
<td><t t-esc="imei_no"/></td> |
|||
<td><t t-esc="complaint_types"/></td> |
|||
<td><t t-esc="complaint_description"/></td> |
|||
</tr> |
|||
</tbody> |
|||
</table> |
|||
</div> |
|||
<div style="margin-top:10px;"> |
|||
<t t-if="warranty==True"> |
|||
<span>The device is in warranty range !!</span> |
|||
</t> |
|||
</div> |
|||
<div style="margin-top:30px;"> |
|||
<h5><strong>Terms and Conditions</strong></h5> |
|||
<t t-foreach="terms" t-as="term"> |
|||
<span><t t-esc="term.terms_conditions"/><br/></span> |
|||
</t> |
|||
</div> |
|||
<div style="margin-top:200px;"> |
|||
<span>Keep this ticket safely for future reference.</span><br/> |
|||
<span>Issue Date :</span> <t t-esc="date_today"/> |
|||
</div> |
|||
</t> |
|||
</t> |
|||
</template> |
|||
</odoo> |
|
@ -0,0 +1,36 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<odoo> |
|||
|
|||
<record id="mobile_service_execute" model="ir.module.category"> |
|||
<field name="name">Mobile Service</field> |
|||
<field name="sequence">5</field> |
|||
</record> |
|||
|
|||
<record id="mobile_service_group_executer" model="res.groups"> |
|||
<field name="name">Mobile Technician</field> |
|||
<field name="implied_ids" eval="[(4, ref('base.group_user'))]"/> |
|||
<field name="category_id" ref="mobile_service_execute"/> |
|||
</record> |
|||
|
|||
<record id="mobile_service_group_manager" model="res.groups"> |
|||
<field name="name">Manager</field> |
|||
<field name="implied_ids" eval="[(4, ref('mobile_service_group_executer'))]"/> |
|||
<field name="category_id" ref="mobile_service_execute"/> |
|||
<field name="users" eval="[(4, ref('base.user_admin')), (4, ref('base.user_root'))]"/> |
|||
</record> |
|||
|
|||
<record id="mobile_service_tech_rules" model="ir.rule"> |
|||
<field name="name">Mobile Service rule</field> |
|||
<field name="model_id" ref="model_mobile_service" /> |
|||
<field name="domain_force">[('technician_name','=',user.id),('service_state','!=','draft'), ('company_id','=',user.company_id.id)]</field> |
|||
<field name="groups" eval="[(4,ref('mobile_service_group_executer'))]"/> |
|||
</record> |
|||
|
|||
<record id="mobile_service_rule_manager" model="ir.rule"> |
|||
<field name="name">Mobile Service Manager rule</field> |
|||
<field name="model_id" ref="model_mobile_service" /> |
|||
<field name="domain_force">[('company_id','=',user.company_id.id)]</field> |
|||
<field name="groups" eval="[(4,ref('mobile_service_group_manager'))]"/> |
|||
</record> |
|||
|
|||
</odoo> |
After Width: | Height: | Size: 3.6 KiB |
After Width: | Height: | Size: 310 B |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 576 B |
After Width: | Height: | Size: 733 B |
After Width: | Height: | Size: 911 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 673 B |
After Width: | Height: | Size: 878 B |
After Width: | Height: | Size: 653 B |
After Width: | Height: | Size: 905 B |
After Width: | Height: | Size: 839 B |
After Width: | Height: | Size: 427 B |
After Width: | Height: | Size: 627 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 988 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 4.4 KiB |
After Width: | Height: | Size: 589 B |
After Width: | Height: | Size: 3.4 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 967 B |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 5.0 KiB |
After Width: | Height: | Size: 60 KiB |
After Width: | Height: | Size: 56 KiB |
After Width: | Height: | Size: 56 KiB |
After Width: | Height: | Size: 59 KiB |
After Width: | Height: | Size: 1.8 MiB |
After Width: | Height: | Size: 57 KiB |
After Width: | Height: | Size: 65 KiB |
After Width: | Height: | Size: 43 KiB |
After Width: | Height: | Size: 38 KiB |
After Width: | Height: | Size: 43 KiB |
After Width: | Height: | Size: 98 KiB |
After Width: | Height: | Size: 48 KiB |
After Width: | Height: | Size: 96 KiB |
After Width: | Height: | Size: 95 KiB |
After Width: | Height: | Size: 92 KiB |
After Width: | Height: | Size: 30 KiB |
After Width: | Height: | Size: 48 KiB |
After Width: | Height: | Size: 45 KiB |
After Width: | Height: | Size: 292 KiB |
After Width: | Height: | Size: 81 KiB |
After Width: | Height: | Size: 12 KiB |
@ -0,0 +1,663 @@ |
|||
<div style="background-color: #714B67; min-height: 600px; width: 100%; padding: 15px; position: relative;"> |
|||
<!-- TITLE BAR --> |
|||
<div |
|||
style="border-bottom: 1px solid #875A7B; padding: 15px; display: flex; justify-content: space-between; align-items: center;"> |
|||
<img src="assets/misc/cybrosys-logo.png" width="42" height="42" style="width: 42px; height: 42px;" /> |
|||
<div> |
|||
<div style="color: #7C7BAD; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;" |
|||
class="mr-2"> |
|||
<i class="fa fa-check mr-1"></i>Community |
|||
</div> |
|||
<div style="color: #875A7B; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;" |
|||
class="mr-2"> |
|||
<i class="fa fa-check mr-1"></i>Enterprise |
|||
</div> |
|||
<div style="color: #017E84; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;" |
|||
class="mr-2"> |
|||
<i class="fa fa-check mr-1"></i>Odoo.sh |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<!-- END OF TITLE BAR --> |
|||
|
|||
<!-- APP HERO --> |
|||
<h1 style="color: #FFFFFF; font-weight: bolder; font-size: 50px; text-align: center; margin-top: 50px;">Mobile Service Management</h1> |
|||
<p style="color:#FFFFFF; padding: 8px 15px; text-align: center; font-size: 24px;"> This module helps in managing mobile service shop daily activities.</p> |
|||
<!-- END OF APP HERO --> |
|||
<img src="assets/screenshots/hero.gif" |
|||
style="width: 75%; height: auto; position: absolute; margin-left: auto; margin-right: auto; top: 45%; left: 12%; right: auto;" /> |
|||
|
|||
</div> |
|||
|
|||
<!-- NAVIGATION SECTION --> |
|||
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px; margin-top: 300px;"> |
|||
<div class="d-flex justify-content-center align-items-center mr-2" |
|||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
|||
<img src="assets/misc/compass.png" /> |
|||
</div> |
|||
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Explore This |
|||
Module</h2> |
|||
</div> |
|||
<div class="row my-4" style="font-family: 'Montserrat', sans-serif;"> |
|||
<div class="col-sm-12 col-md-6 my-3"> |
|||
<a href="#overview"> |
|||
<div class="d-flex justify-content-between align-items-center" |
|||
style="background-color: #f5f5f5; padding: 30px; width: 100%;"> |
|||
<div> |
|||
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Overview</span> |
|||
<span |
|||
style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">Learn |
|||
more about this |
|||
module</span> |
|||
</div> |
|||
<img src="assets/misc/right-arrow.png" width="36" height="36" /> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class="col-sm-12 col-md-6 my-3"> |
|||
<a href="#features"> |
|||
<div class="d-flex justify-content-between align-items-center" |
|||
style="background-color: #f5f5f5; padding: 30px; width: 100%;"> |
|||
<div> |
|||
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Features</span> |
|||
<span |
|||
style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">View |
|||
features of this |
|||
module</span> |
|||
</div> |
|||
<img src="assets/misc/right-arrow.png" width="36" height="36" /> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class="col-sm-12 col-md-6 my-3"> |
|||
<a href="#screenshots"> |
|||
<div class="d-flex justify-content-between align-items-center" |
|||
style="background-color: #f5f5f5; padding: 30px; width: 100%;"> |
|||
<div> |
|||
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Screenshots</span> |
|||
<span |
|||
style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">View |
|||
screenshots for this |
|||
module</span> |
|||
</div> |
|||
<img src="assets/misc/right-arrow.png" width="36" height="36" /> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
<!-- END OF NAVIGATION SECTION --> |
|||
|
|||
<!-- OVERVIEW SECTION --> |
|||
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="overview"> |
|||
<div class="d-flex justify-content-center align-items-center mr-2" |
|||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
|||
<img src="assets/misc/pie-chart.png" /> |
|||
</div> |
|||
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Overview |
|||
</h2> |
|||
</div> |
|||
<div class="row" style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;"> |
|||
<div class="col-sm-12 py-4"> |
|||
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. |
|||
</div> |
|||
</div> |
|||
<div class="row" id="access"> |
|||
<div class="col-md-12" style="border-bottom: 1px solid #d5d5d5 !important; margin: 2rem 0 !important"> |
|||
<h2 |
|||
style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.5rem !important;"> |
|||
<i class="fa fa-cogs mr-2"></i>Access Rights |
|||
</h2> |
|||
</div> |
|||
|
|||
<div class="col-md-6 pl-3 d-flex"> |
|||
<div> |
|||
<img src="assets/icons/check.png"> |
|||
</div> |
|||
<div> |
|||
<h4 |
|||
style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;"> |
|||
Manager </h4> |
|||
<p |
|||
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;"> |
|||
Manager has the complete access over the mobile shop management.</p> |
|||
</div> |
|||
|
|||
</div> |
|||
<div class="col-md-6 pl-3 d-flex"> |
|||
<div> |
|||
<img src="assets/icons/check.png"> |
|||
</div> |
|||
<div> |
|||
<h4 |
|||
style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;"> |
|||
Mobile Technician </h4> |
|||
<p |
|||
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;"> |
|||
Mobile Technician can read and write service requests and also update the parts usage.</p> |
|||
</div> |
|||
|
|||
</div> |
|||
</div> |
|||
|
|||
|
|||
<!-- END OF OVERVIEW SECTION --> |
|||
|
|||
<!-- FEATURES SECTION --> |
|||
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="features"> |
|||
<div class="d-flex justify-content-center align-items-center mr-2" |
|||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
|||
<img src="assets/misc/features.png" /> |
|||
</div> |
|||
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Features |
|||
</h2> |
|||
</div> |
|||
<div class="row" style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;"> |
|||
<div class="col-sm-12 col-md-6"> |
|||
<div class="d-flex align-items-center" style="margin-top: 40px; margin-bottom: 40px"> |
|||
<img src="assets/misc/check-box.png" class="mr-2" /> |
|||
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Service request creation.</span> |
|||
</div> |
|||
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px"> |
|||
<img src="assets/misc/check-box.png" class="mr-2" /> |
|||
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Assigning service request to technicians</span> |
|||
</div> |
|||
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px"> |
|||
<img src="assets/misc/check-box.png" class="mr-2" /> |
|||
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Mobile service ticket generation.</span> |
|||
</div> |
|||
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px"> |
|||
<img src="assets/misc/check-box.png" class="mr-2" /> |
|||
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Tracking the service status.</span> |
|||
</div> |
|||
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px"> |
|||
<img src="assets/misc/check-box.png" class="mr-2" /> |
|||
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Integrated with accounting and sales module.</span> |
|||
</div> |
|||
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px"> |
|||
<img src="assets/misc/check-box.png" class="mr-2" /> |
|||
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Multi-level access rights.</span> |
|||
</div> |
|||
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px"> |
|||
<img src="assets/misc/check-box.png" class="mr-2" /> |
|||
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Mobile complaint templates.</span> |
|||
</div> |
|||
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px"> |
|||
<img src="assets/misc/check-box.png" class="mr-2" /> |
|||
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Invoice for parts usage and service charges.</span> |
|||
</div> |
|||
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px"> |
|||
<img src="assets/misc/check-box.png" class="mr-2" /> |
|||
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Email notifications to customer.</span> |
|||
</div> |
|||
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px"> |
|||
<img src="assets/misc/check-box.png" class="mr-2" /> |
|||
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Parts inventory.</span> |
|||
</div> |
|||
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px"> |
|||
<img src="assets/misc/check-box.png" class="mr-2" /> |
|||
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Flexible for further customization.</span> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<!-- END OF FEATURES SECTION --> |
|||
|
|||
<!-- SCREENSHOTS SECTION --> |
|||
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="screenshots"> |
|||
<div class="d-flex justify-content-center align-items-center mr-2" |
|||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
|||
<img src="assets/misc/pictures.png" /> |
|||
</div> |
|||
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Screenshots |
|||
</h2> |
|||
</div> |
|||
<div class="row"> |
|||
<div class="col-sm-12"> |
|||
|
|||
<div style="display: block; margin: 30px auto;"> |
|||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Mobile Service Shop</h3> |
|||
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">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.</p> |
|||
<img src="assets/screenshots/12.png" class="img-thumbnail"> |
|||
</div> |
|||
|
|||
<div style="display: block; margin: 30px auto;"> |
|||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Mobile Service -> Service Request -> Create</h3> |
|||
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">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.</p> |
|||
<img src="assets/screenshots/1.png" class="img-thumbnail"> |
|||
</div> |
|||
|
|||
<div style="display: block; margin: 30px auto;"> |
|||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Generating tickets for service request.</h3> |
|||
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Here you can create tickets for service requests by using the 'Print Ticket' button.</p> |
|||
<img src="assets/screenshots/2.png" class="img-thumbnail"> |
|||
</div> |
|||
<div style="display: block; margin: 30px auto;"> |
|||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Mobile parts inventory.</h3> |
|||
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Here you see the mobile parts used for service processing..</p> |
|||
<img src="assets/screenshots/3.png" class="img-thumbnail"> |
|||
</div> |
|||
<div style="display: block; margin: 30px auto;"> |
|||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Invoice for service requests.</h3> |
|||
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Here you can create invoices for service requests.</p> |
|||
<img src="assets/screenshots/4.png" class="img-thumbnail"> |
|||
</div> |
|||
<div style="display: block; margin: 30px auto;"> |
|||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Post Stock moves.</h3> |
|||
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">No need to create stock moves for parts usage manually. 'Post Stock Moves' will generate stock for |
|||
the parts usage.</p> |
|||
<img src="assets/screenshots/5.png" class="img-thumbnail"> |
|||
</div> |
|||
<div style="display: block; margin: 30px auto;"> |
|||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Email Notification.</h3> |
|||
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">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.</p> |
|||
<img src="assets/screenshots/6.png" class="img-thumbnail"> |
|||
</div> |
|||
<div style="display: block; margin: 30px auto;"> |
|||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Brands Configuration.</h3> |
|||
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Create mobile brands which is used in service request creation. Mobile Service -> Configuration -> |
|||
Brands.</p> |
|||
<img src="assets/screenshots/7.png" class="img-thumbnail"> |
|||
</div> |
|||
<div style="display: block; margin: 30px auto;"> |
|||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Models Configuration.</h3> |
|||
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">You can also create models for different mobile brands from. Mobile Service -> Configuration -> |
|||
Models</p> |
|||
<img src="assets/screenshots/8.png" class="img-thumbnail"> |
|||
</div> |
|||
<div style="display: block; margin: 30px auto;"> |
|||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Complaint Types.</h3> |
|||
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">You can create different complaint types from. Mobile Service -> Configuration -> Complaint Types</p> |
|||
<img src="assets/screenshots/9.png" class="img-thumbnail"> |
|||
</div> |
|||
<div style="display: block; margin: 30px auto;"> |
|||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Complaint Templates</h3> |
|||
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Complaint Templates can be created from. Mobile Service -> Configuration -> Complaint Templates</p> |
|||
<img src="assets/screenshots/10.png" class="img-thumbnail"> |
|||
</div> |
|||
<div style="display: block; margin: 30px auto;"> |
|||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Terms and Conditions</h3> |
|||
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Terms and Conditions can be created from. Mobile Service -> Configuration ->Terms and Conditions </p> |
|||
<img src="assets/screenshots/11.png" class="img-thumbnail"> |
|||
</div> |
|||
|
|||
</div> |
|||
</div> |
|||
<!-- END OF SCREENSHOTS SECTION --> |
|||
|
|||
<!-- RELATED PRODUCTS --> |
|||
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> |
|||
<div class="d-flex justify-content-center align-items-center mr-2" |
|||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
|||
<img src="assets/misc/categories.png" /> |
|||
</div> |
|||
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Related |
|||
Products |
|||
</h2> |
|||
</div> |
|||
<div class="row"> |
|||
<div class="col-sm-12"> |
|||
<div id="demo1" class="row carousel slide" data-ride="carousel"> |
|||
<!-- The slideshow --> |
|||
<div class="carousel-inner" style="padding: 30px;"> |
|||
<div class="carousel-item" style="min-height: 198.656px;"> |
|||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> |
|||
<a href="https://apps.odoo.com/apps/modules/15.0/dynamic_accounts_report/" target="_blank"> |
|||
<div style="border-radius:10px"> |
|||
<img class="img img-responsive center-block" style="border-radius: 0px;" |
|||
src="assets/modules/1.png"> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> |
|||
<a href="https://apps.odoo.com/apps/modules/15.0/custom_gantt_view/" target="_blank"> |
|||
<div style="border-radius:10px"> |
|||
<img class="img img-responsive center-block" style="border-radius: 0px;" |
|||
src="assets/modules/2.png"> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> |
|||
<a href="https://apps.odoo.com/apps/modules/15.0/project_custom_gantt/" target="_blank"> |
|||
<div style="border-radius:10px"> |
|||
<img class="img img-responsive center-block" style="border-radius: 0px;" |
|||
src="assets/modules/3.png"> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
<div class="carousel-item active" style="min-height: 198.656px;"> |
|||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> |
|||
<a href="https://apps.odoo.com/apps/modules/15.0/account_reports_xlsx/" target="_blank"> |
|||
<div style="border-radius:10px"> |
|||
<img class="img img-responsive center-block" style="border-radius: 0px;" |
|||
src="assets/modules/4.png"> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> |
|||
<a href="https://apps.odoo.com/apps/modules/15.0/base_accounting_kit/" target="_blank"> |
|||
<div style="border-radius:10px"> |
|||
<img class="img img-responsive center-block" style="border-radius: 0px;" |
|||
src="assets/modules/5.png"> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> |
|||
<a href="https://apps.odoo.com/apps/modules/15.0/hr_payroll_community/" target="_blank"> |
|||
<div style="border-radius:10px"> |
|||
<img class="img img-responsive center-block" style="border-radius: 0px;" |
|||
src="assets/modules/6.png"> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<!-- Left and right controls --> |
|||
<a class="carousel-control-prev" href="#demo1" data-slide="prev" style="width:35px; color:#000"> <span |
|||
class="carousel-control-prev-icon"><i class="fa fa-chevron-left" style="font-size:24px"></i></span> |
|||
</a> <a class="carousel-control-next" href="#demo1" data-slide="next" style="width:35px; color:#000"> |
|||
<span class="carousel-control-next-icon"><i class="fa fa-chevron-right" |
|||
style="font-size:24px"></i></span> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<!-- END OF RELATED PRODUCTS --> |
|||
|
|||
<!-- OUR SERVICES --> |
|||
|
|||
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> |
|||
<div class="d-flex justify-content-center align-items-center mr-2" |
|||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
|||
<img src="assets/misc/star.png" /> |
|||
</div> |
|||
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Our Services |
|||
</h2> |
|||
</div> |
|||
|
|||
<div class="container my-5"> |
|||
<div class="row"> |
|||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|||
style="background-color: #1dd1a1 !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|||
<img src="assets/icons/cogs.png" class="img-responsive" height="48px" width="48px"> |
|||
</div> |
|||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|||
Odoo |
|||
Customization</h6> |
|||
</div> |
|||
|
|||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|||
style="background-color: #ff6b6b !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|||
<img src="assets/icons/wrench.png" class="img-responsive" height="48px" width="48px"> |
|||
</div> |
|||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|||
Odoo |
|||
Implementation</h6> |
|||
</div> |
|||
|
|||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|||
style="background-color: #6462CD !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|||
<img src="assets/icons/lifebuoy.png" class="img-responsive" height="48px" width="48px"> |
|||
</div> |
|||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|||
Odoo |
|||
Support</h6> |
|||
</div> |
|||
|
|||
|
|||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|||
style="background-color: #ffa801 !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|||
<img src="assets/icons/user.png" class="img-responsive" height="48px" width="48px"> |
|||
</div> |
|||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|||
Hire |
|||
Odoo |
|||
Developer</h6> |
|||
</div> |
|||
|
|||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|||
style="background-color: #54a0ff !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|||
<img src="assets/icons/puzzle.png" class="img-responsive" height="48px" width="48px"> |
|||
</div> |
|||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|||
Odoo |
|||
Integration</h6> |
|||
</div> |
|||
|
|||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|||
style="background-color: #6d7680 !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|||
<img src="assets/icons/update.png" class="img-responsive" height="48px" width="48px"> |
|||
</div> |
|||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|||
Odoo |
|||
Migration</h6> |
|||
</div> |
|||
|
|||
|
|||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|||
style="background-color: #786fa6 !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|||
<img src="assets/icons/consultation.png" class="img-responsive" height="48px" width="48px"> |
|||
</div> |
|||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|||
Odoo |
|||
Consultancy</h6> |
|||
</div> |
|||
|
|||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|||
style="background-color: #f8a5c2 !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|||
<img src="assets/icons/training.png" class="img-responsive" height="48px" width="48px"> |
|||
</div> |
|||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|||
Odoo |
|||
Implementation</h6> |
|||
</div> |
|||
|
|||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|||
style="background-color: #e6be26 !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|||
<img src="assets/icons/license.png" class="img-responsive" height="48px" width="48px"> |
|||
</div> |
|||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|||
Odoo |
|||
Licensing Consultancy</h6> |
|||
</div> |
|||
</div> |
|||
|
|||
</div> |
|||
|
|||
<!-- END OF END OF OUR SERVICES --> |
|||
|
|||
<!-- OUR INDUSTRIES --> |
|||
|
|||
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> |
|||
<div class="d-flex justify-content-center align-items-center mr-2" |
|||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
|||
<img src="assets/misc/corporate.png" /> |
|||
</div> |
|||
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Our |
|||
Industries |
|||
</h2> |
|||
</div> |
|||
|
|||
<div class="container my-5"> |
|||
<div class="row"> |
|||
<div class="col-lg-3"> |
|||
<div class="my-4 d-flex flex-column justify-content-center" |
|||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
|||
<img src="assets/icons/trading-black.png" class="img-responsive mb-3" height="48px" width="48px"> |
|||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
|||
Trading |
|||
</h5> |
|||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
|||
Easily procure |
|||
and |
|||
sell your products</p> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="col-lg-3"> |
|||
<div class="my-4 d-flex flex-column justify-content-center" |
|||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
|||
<img src="assets/icons/pos-black.png" class="img-responsive mb-3" height="48px" width="48px"> |
|||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
|||
POS |
|||
</h5> |
|||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
|||
Easy |
|||
configuration |
|||
and convivial experience</p> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="col-lg-3"> |
|||
<div class="my-4 d-flex flex-column justify-content-center" |
|||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
|||
<img src="assets/icons/education-black.png" class="img-responsive mb-3" height="48px" width="48px"> |
|||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
|||
Education |
|||
</h5> |
|||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
|||
A platform for |
|||
educational management</p> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="col-lg-3"> |
|||
<div class="my-4 d-flex flex-column justify-content-center" |
|||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
|||
<img src="assets/icons/manufacturing-black.png" class="img-responsive mb-3" height="48px" |
|||
width="48px"> |
|||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
|||
Manufacturing |
|||
</h5> |
|||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
|||
Plan, track and |
|||
schedule your operations</p> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="col-lg-3"> |
|||
<div class="my-4 d-flex flex-column justify-content-center" |
|||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
|||
<img src="assets/icons/ecom-black.png" class="img-responsive mb-3" height="48px" width="48px"> |
|||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
|||
E-commerce & Website |
|||
</h5> |
|||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
|||
Mobile |
|||
friendly, |
|||
awe-inspiring product pages</p> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="col-lg-3"> |
|||
<div class="my-4 d-flex flex-column justify-content-center" |
|||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
|||
<img src="assets/icons/service-black.png" class="img-responsive mb-3" height="48px" width="48px"> |
|||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
|||
Service Management |
|||
</h5> |
|||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
|||
Keep track of |
|||
services and invoice</p> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="col-lg-3"> |
|||
<div class="my-4 d-flex flex-column justify-content-center" |
|||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
|||
<img src="assets/icons/restaurant-black.png" class="img-responsive mb-3" height="48px" width="48px"> |
|||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
|||
Restaurant |
|||
</h5> |
|||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
|||
Run your bar or |
|||
restaurant methodically</p> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="col-lg-3"> |
|||
<div class="my-4 d-flex flex-column justify-content-center" |
|||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
|||
<img src="assets/icons/hotel-black.png" class="img-responsive mb-3" height="48px" width="48px"> |
|||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
|||
Hotel Management |
|||
</h5> |
|||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
|||
An |
|||
all-inclusive |
|||
hotel management application</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<!-- END OF END OF OUR INDUSTRIES --> |
|||
|
|||
<!-- SUPPORT --> |
|||
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> |
|||
<div class="d-flex justify-content-center align-items-center mr-2" |
|||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
|||
<img src="assets/misc/customer-support.png" /> |
|||
</div> |
|||
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Support |
|||
</h2> |
|||
</div> |
|||
<div class="container mt-5"> |
|||
<div class="row"> |
|||
<div class="col-sm-12 col-md-6"> |
|||
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;"> |
|||
<div class="mr-4" |
|||
style="background-color: #714B67; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;"> |
|||
<img src="assets/misc/support.png" height="48" width="48" style="width: 42px; height: 42px;" /> |
|||
</div> |
|||
<div> |
|||
<h4>Need Help?</h4> |
|||
<p style="line-height: 100%;">Got questions or need help? Get in touch.</p> |
|||
<a href="mailto:odoo@cybrosys.com"> |
|||
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;"> |
|||
odoo@cybrosys.com</p> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-sm-12 col-md-6"> |
|||
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;"> |
|||
<div class="mr-4" |
|||
style="background-color: #2AC44D; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;"> |
|||
<img src="assets/misc/whatsapp.png" height="52" width="52" style="width: 52px; height: 52px;" /> |
|||
</div> |
|||
<div> |
|||
<h4>WhatsApp</h4> |
|||
<p style="line-height: 100%;">Say hi to us on WhatsApp!</p> |
|||
<a href="https://api.whatsapp.com/send?phone=918606827707"> |
|||
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;">+91 86068 |
|||
27707</p> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="row"> |
|||
<div class="col-sm-12 my-5 d-flex justify-content-center align-items-center"> |
|||
<img src="assets/misc/logo.png" width="144" height="31" |
|||
style="width:144px; height: 31px; margin-top: 40px;" /> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<!-- END OF SUPPORT --> |
@ -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; |
|||
} |
@ -0,0 +1,45 @@ |
|||
<odoo> |
|||
<data> |
|||
|
|||
<record id="mobile_brand_form_view" model="ir.ui.view"> |
|||
<field name="name">mobile.brand.form</field> |
|||
<field name="model">mobile.brand</field> |
|||
<field name="arch" type="xml"> |
|||
<form string="Brand"> |
|||
<sheet> |
|||
<group> |
|||
<group> |
|||
<field name="brand_name"/> |
|||
</group> |
|||
</group> |
|||
</sheet> |
|||
</form> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="mobile_brand_tree_view" model="ir.ui.view"> |
|||
<field name="name">mobile.brand.tree</field> |
|||
<field name="model">mobile.brand</field> |
|||
<field name="arch" type="xml"> |
|||
<tree> |
|||
<field name="brand_name"/> |
|||
</tree> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="action_mobile_brand" model="ir.actions.act_window"> |
|||
<field name="name">Brand</field> |
|||
<field name="res_model">mobile.brand</field> |
|||
<field name="view_mode">tree,form</field> |
|||
<field name="view_id" ref="mobile_brand_tree_view"/> |
|||
<field name="help" type="html"> |
|||
<p class="oe_view_nocontent_create"> |
|||
Click to Create a New Record. |
|||
</p> |
|||
</field> |
|||
</record> |
|||
|
|||
<menuitem action="action_mobile_brand" id="mobile_service_shop_conf1" parent="mobile_service_shop_configuration" |
|||
name="Brand" sequence="1"/> |
|||
</data> |
|||
</odoo> |
@ -0,0 +1,82 @@ |
|||
<odoo> |
|||
<data> |
|||
|
|||
<record id="mobile_brand_model_form_view" model="ir.ui.view"> |
|||
<field name="name">mobile.brand.model.form</field> |
|||
<field name="model">brand.model</field> |
|||
<field name="arch" type="xml"> |
|||
<form string="Brand Model"> |
|||
<sheet> |
|||
<field name="image_medium" widget='image' class="oe_avatar"/> |
|||
<group> |
|||
<group> |
|||
<field name="mobile_brand_name"/> |
|||
<field name="mobile_brand_models"/> |
|||
</group> |
|||
</group> |
|||
</sheet> |
|||
</form> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="mobile_brand_model_view_kanban" model="ir.ui.view"> |
|||
<field name="name">mobile.service.kanban</field> |
|||
<field name="model">brand.model</field> |
|||
<field name="arch" type="xml"> |
|||
<kanban> |
|||
<field name="image_medium"/> |
|||
<field name="id"/> |
|||
<progressbar field="activity_state" colors="{"planned": "success", "today": "warning", "overdue": "danger"}"/> |
|||
<templates> |
|||
<t t-name="kanban-box"> |
|||
<div class="oe_kanban_global_click"> |
|||
<div class="o_kanban_image"> |
|||
<img t-att-src="kanban_image('brand.model', 'image_medium', record.id.raw_value)" alt="Product" class="o_image_64_contain"/> |
|||
</div> |
|||
<div class="oe_kanban_details"> |
|||
<strong class="o_kanban_record_title"> |
|||
<field name="mobile_brand_name"/> |
|||
</strong> |
|||
</div> |
|||
<div name="tags"/> |
|||
<ul> |
|||
<li> model: <field name="mobile_brand_models"/></li> |
|||
</ul> |
|||
<div name="tags"/> |
|||
</div> |
|||
</t> |
|||
</templates> |
|||
</kanban> |
|||
|
|||
</field> |
|||
</record> |
|||
|
|||
<record id="mobile_brand_model_tree_view" model="ir.ui.view"> |
|||
<field name="name">mobile.brand.model.tree</field> |
|||
<field name="model">brand.model</field> |
|||
<field name="arch" type="xml"> |
|||
<tree> |
|||
<field name="mobile_brand_name"/> |
|||
<field name="mobile_brand_models"/> |
|||
<field name="image_medium" widget='image' class="Your_custom_class"/> |
|||
</tree> |
|||
</field> |
|||
</record> |
|||
|
|||
|
|||
<record id="action_mobile_brand_models" model="ir.actions.act_window"> |
|||
<field name="name">Models</field> |
|||
<field name="res_model">brand.model</field> |
|||
<field name="view_mode">kanban,tree,form</field> |
|||
<field name="help" type="html"> |
|||
<p class="o_view_nocontent_empty_folder"> |
|||
Click to Create a New Record. |
|||
</p> |
|||
</field> |
|||
</record> |
|||
|
|||
<menuitem action="action_mobile_brand_models" id="mobile_service_shop_conf3" |
|||
parent="mobile_service_shop_configuration" |
|||
name="Models" sequence="2"/> |
|||
</data> |
|||
</odoo> |
@ -0,0 +1,45 @@ |
|||
<odoo> |
|||
<data> |
|||
|
|||
<record id="mobile_complaint_template_form_view" model="ir.ui.view"> |
|||
<field name="name">mobile.complaint.template.form</field> |
|||
<field name="model">mobile.complaint.description</field> |
|||
<field name="arch" type="xml"> |
|||
<form string="Complaint Template"> |
|||
<sheet> |
|||
<group> |
|||
<field name="complaint_type_template"/> |
|||
<field name="description"/> |
|||
</group> |
|||
</sheet> |
|||
</form> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="mobile_complaint_template_tree_view" model="ir.ui.view"> |
|||
<field name="name">mobile.complaint.type.tree</field> |
|||
<field name="model">mobile.complaint.description</field> |
|||
<field name="arch" type="xml"> |
|||
<tree> |
|||
<field name="complaint_type_template"/> |
|||
<field name="description"/> |
|||
</tree> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="action_mobile_complaint_template" model="ir.actions.act_window"> |
|||
<field name="name">Complaint Types</field> |
|||
<field name="res_model">mobile.complaint.description</field> |
|||
<field name="view_mode">tree,form</field> |
|||
<field name="view_id" ref="mobile_complaint_template_tree_view"/> |
|||
<field name="help" type="html"> |
|||
<p class="oe_view_nocontent_create"> |
|||
Click to Create a New Record. |
|||
</p> |
|||
</field> |
|||
</record> |
|||
|
|||
<menuitem action="action_mobile_complaint_template" id="mobile_service_shop_conf6" parent="mobile_service_shop_configuration" |
|||
name="Complaint Templates" sequence="3"/> |
|||
</data> |
|||
</odoo> |
@ -0,0 +1,47 @@ |
|||
<odoo> |
|||
<data> |
|||
|
|||
<record id="mobile_complaint_type_form_view" model="ir.ui.view"> |
|||
<field name="name">mobile.complaint.type.form</field> |
|||
<field name="model">mobile.complaint</field> |
|||
<field name="arch" type="xml"> |
|||
<form string="Complaint Type"> |
|||
<sheet> |
|||
<group> |
|||
<group> |
|||
<field name="complaint_type"/> |
|||
</group> |
|||
</group> |
|||
</sheet> |
|||
</form> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="mobile_complaint_type_tree_view" model="ir.ui.view"> |
|||
<field name="name">mobile.complaint.type.tree</field> |
|||
<field name="model">mobile.complaint</field> |
|||
<field name="arch" type="xml"> |
|||
<tree> |
|||
<field name="complaint_type"/> |
|||
</tree> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="action_mobile_complaint_type" model="ir.actions.act_window"> |
|||
<field name="name">Complaint Types</field> |
|||
<field name="res_model">mobile.complaint</field> |
|||
<field name="view_mode">tree,form</field> |
|||
<field name="view_id" ref="mobile_complaint_type_tree_view"/> |
|||
<field name="help" type="html"> |
|||
<p class="oe_view_nocontent_create"> |
|||
Click to Create a New Record. |
|||
</p> |
|||
</field> |
|||
|
|||
</record> |
|||
|
|||
<menuitem action="mobile_service_shop.action_mobile_complaint_type" id="mobile_service_shop_conf2" |
|||
parent="mobile_service_shop_configuration" |
|||
name="Complaint Type" sequence="3"/> |
|||
</data> |
|||
</odoo> |
@ -0,0 +1,298 @@ |
|||
<odoo> |
|||
<data> |
|||
|
|||
<record id="mobile_service_sequence" model="ir.sequence"> |
|||
<field name="name">Service Code</field> |
|||
<field name="code">mobile.service</field> |
|||
<field name="prefix">SERV/</field> |
|||
<field eval="4" name="padding"/> |
|||
<field name="company_id" eval="False"/> |
|||
</record> |
|||
|
|||
<record id="mobile_service_request_search_view" model="ir.ui.view"> |
|||
<field name="name">service.request.search1</field> |
|||
<field name="model">mobile.service</field> |
|||
<field name="arch" type="xml"> |
|||
<search string="Search in requests"> |
|||
<field name="person_name" widget="res_partner_many2one" |
|||
context="{'res_partner_search_mode': 'customer'}"/> |
|||
<field name="contact_no"/> |
|||
<field name="technician_name"/> |
|||
<field name="imei_no"/> |
|||
<field name="return_date"/> |
|||
<field name="service_state"/> |
|||
|
|||
<filter string="Returned" name="Service Status" domain="[('service_state', '=', 'returned')]"/> |
|||
<filter string="Draft" name="Service Status" domain="[('service_state', '=', 'draft')]"/> |
|||
<filter string="Not Solved" name="Service Status" domain="[('service_state', '=', 'not_solved')]"/> |
|||
|
|||
<separator/> |
|||
<group expand="0" string="Group By"> |
|||
<filter string="Service State" name="service_state" domain="[]" |
|||
context="{'group_by': 'service_state'}"/> |
|||
<filter string="Technician" name="technician" domain="[]" |
|||
context="{'group_by': 'technician_name'}"/> |
|||
</group> |
|||
</search> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="mobile_service_request_form_view" model="ir.ui.view"> |
|||
<field name="name">mobile.service.request.form</field> |
|||
<field name="model">mobile.service</field> |
|||
<field name="arch" type="xml"> |
|||
<form string="Mobile Shop"> |
|||
<header> |
|||
<button string="Assign to technician" type="object" name="approve" |
|||
class="oe_highlight" |
|||
attrs="{'invisible': [('service_state','not in',('draft'))]}" |
|||
groups="mobile_service_shop.mobile_service_group_manager"/> |
|||
<button string="Completed" type="object" name="complete" |
|||
class="oe_highlight" |
|||
attrs="{'invisible': [('service_state','not in',('assigned'))]}"/> |
|||
|
|||
<button string="Return advance" type="object" name="return_advance" |
|||
class="oe_highlight" |
|||
attrs="{'invisible': [('service_state','not in',('not_solved'))]}" |
|||
groups="mobile_service_shop.mobile_service_group_manager"/> |
|||
|
|||
<button name="action_invoice_create_wizard" string="Create Invoice" |
|||
attrs="{'invisible': [('service_state','not in',('completed', 'assigned'))]}" |
|||
type="object" class="oe_highlight" |
|||
groups="mobile_service_shop.mobile_service_group_manager"/> |
|||
|
|||
<button name="action_post_stock" string="Post Stock moves" |
|||
attrs="{'invisible': [('service_state','not in',('completed', 'assigned'))]}" |
|||
type="object" class="oe_highlight" |
|||
groups="mobile_service_shop.mobile_service_group_manager"/> |
|||
|
|||
<button string="Return to customer" type="object" name="return_to" |
|||
attrs="{'invisible': [('service_state','not in',('completed'))]}" |
|||
groups="mobile_service_shop.mobile_service_group_manager"/> |
|||
|
|||
<button string="Not Solved" type="object" name="not_solved" |
|||
attrs="{'invisible': [('service_state','not in',('assigned'))]}"/> |
|||
|
|||
<button name="get_ticket" string="Print Ticket" type="object" class="oe_highlight" |
|||
groups="mobile_service_shop.mobile_service_group_manager"/> |
|||
|
|||
<button name="action_send_mail" string="Send email" type="object" |
|||
attrs="{'invisible': [('service_state','=',('draft'))]}" |
|||
groups="mobile_service_shop.mobile_service_group_manager"/> |
|||
|
|||
|
|||
<field name="service_state" widget="statusbar" statusbar_visible="draft,returned,not_solved"/> |
|||
</header> |
|||
<sheet> |
|||
<div class="oe_button_box" name="button_box"> |
|||
<button name='action_view_invoice' class="oe_stat_button" type="object" icon="fa-money" |
|||
attrs="{'invisible': [('service_state','=',('draft'))]}"> |
|||
<field string="Invoice" name="invoice_count" widget="statinfo"/> |
|||
</button> |
|||
</div> |
|||
<div class="oe_title"> |
|||
<h1> |
|||
<field name="name" readonly="1"/> |
|||
</h1> |
|||
</div> |
|||
<group> |
|||
<div> |
|||
<field name="is_in_warranty" |
|||
attrs="{'readonly': [('service_state','in',('returned','not_solved'))]}"/> |
|||
<label for="is_in_warranty"/> |
|||
<field name="re_repair" |
|||
attrs="{'readonly': [('service_state','in',('returned','not_solved'))]}"/> |
|||
<label for="re_repair"/> |
|||
</div> |
|||
</group> |
|||
|
|||
<group> |
|||
<group> |
|||
<field name="person_name" widget="res_partner_many2one" |
|||
context="{'res_partner_search_mode': 'customer'}" style="width:50%;" |
|||
attrs="{'readonly': [('service_state','not in',('draft'))]}"/> |
|||
<field name="contact_no" style="width:50%;" |
|||
attrs="{'readonly': [('service_state','in',('returned','not_solved'))]}"/> |
|||
<field name="email_id" style="width:50%;" |
|||
attrs="{'readonly': [('service_state','in',('returned','not_solved'))]}"/> |
|||
<label for="street" string="Address"/> |
|||
<div class="o_address_format"> |
|||
<field name="street" placeholder="Street..." class="o_address_street"/> |
|||
<field name="street2" placeholder="Street 2..." class="o_address_street"/> |
|||
<field name="city" placeholder="City" class="o_address_city"/> |
|||
<field name="state_id" class="o_address_state" placeholder="State" |
|||
options='{"no_open": True}'/> |
|||
<field name="zip" placeholder="ZIP" class="o_address_zip"/> |
|||
<field name="country_id" placeholder="Country" class="o_address_country" |
|||
options='{"no_open": True, "no_create": True}'/> |
|||
</div> |
|||
</group> |
|||
<group> |
|||
<label for="brand_name"/> |
|||
<div class="o_row"> |
|||
<field name="brand_name" placeholder="Brand name" |
|||
attrs="{'readonly': [('service_state','not in',('draft'))]}"/> |
|||
<field name="model_name" placeholder="Model name" |
|||
attrs="{'readonly': [('service_state','not in',('draft'))]}"/> |
|||
</div> |
|||
<field name="date_request" style="width:50%;" |
|||
attrs="{'readonly': [('service_state','not in',('draft'))]}"/> |
|||
<field name="return_date" style="width:50%;" |
|||
attrs="{'readonly': [('service_state','in',('returned','not_solved'))]}"/> |
|||
<field name="technician_name" style="width:50%;" |
|||
attrs="{'readonly': [('service_state','not in',('draft'))]}"/> |
|||
<field name="picking_count" invisible="1"/> |
|||
</group> |
|||
|
|||
</group> |
|||
<notebook> |
|||
<page string="Description"> |
|||
<group> |
|||
<group> |
|||
<field name="imei_no" style="width:50%;" colspan="1" |
|||
attrs="{'readonly': [('service_state','not in',('draft'))]}"/> |
|||
<field name="warranty_number" style="width:50%;" attrs="{'readonly': [('service_state','not in',('draft'))], |
|||
'required': [('is_in_warranty', '=', True)], 'invisible': [('is_in_warranty', '!=', True)]}"/> |
|||
</group> |
|||
<group> |
|||
<field name="internal_notes" |
|||
placeholder="Notes used internally (eg: device password)" |
|||
attrs="{'readonly': [('service_state','in',('returned','not_solved'))]}"/> |
|||
</group> |
|||
</group> |
|||
</page> |
|||
<page string="Complaints"> |
|||
<field name="complaints_tree" mode="tree" |
|||
attrs="{'readonly': [('service_state','in',('returned','not_solved'))]}"> |
|||
<tree string="Complaints" editable="bottom"> |
|||
<field name="complaint_type_tree"/> |
|||
<field name="description_tree"/> |
|||
</tree> |
|||
<form> |
|||
<field name="complaint_type_tree"/> |
|||
<field name="description_tree"/> |
|||
</form> |
|||
</field> |
|||
</page> |
|||
<page string="Parts Usage"> |
|||
<field name="product_order_line" mode="tree" |
|||
attrs="{'readonly': [('service_state','in',('returned','not_solved'))]}"> |
|||
<tree string="Complaints" editable="bottom"> |
|||
<field name="product_id"/> |
|||
<field name="product_uom_qty"/> |
|||
<field name="product_uom"/> |
|||
<field name="price_unit"/> |
|||
<field name="qty_stock_move"/> |
|||
<field name="qty_invoiced"/> |
|||
<field name="part_price"/> |
|||
</tree> |
|||
<form> |
|||
<field name="product_id"/> |
|||
<field name="product_uom_qty"/> |
|||
</form> |
|||
</field> |
|||
</page> |
|||
|
|||
</notebook> |
|||
</sheet> |
|||
<div class="oe_chatter"> |
|||
<field name="message_follower_ids" widget="mail_followers"/> |
|||
<field name="message_ids" widget="mail_thread"/> |
|||
</div> |
|||
</form> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="service_request_view_kanban" model="ir.ui.view"> |
|||
<field name="name">mobile.service.kanban</field> |
|||
<field name="model">mobile.service</field> |
|||
<field name="arch" type="xml"> |
|||
<kanban class="o_kanban_small_column"> |
|||
<field name="image_medium"/> |
|||
<field name="id"/> |
|||
<templates> |
|||
<t t-name="kanban-box"> |
|||
<div class="oe_kanban_card oe_kanban_global_click"> |
|||
<div class="o_kanban_image"> |
|||
<img t-att-src="kanban_image('mobile.service', 'image_medium', record.id.raw_value)"/> |
|||
</div> |
|||
<div class="oe_kanban_content"> |
|||
<div> |
|||
<strong class="o_kanban_record_title"> |
|||
<field name="name"/> |
|||
</strong> |
|||
</div> |
|||
<div class="text-muted o_kanban_record_subtitle"> |
|||
<field name="person_name" widget="res_partner_many2one" |
|||
context="{'res_partner_search_mode': 'customer'}"/> |
|||
<br/> |
|||
<field name="service_state"/> |
|||
</div> |
|||
</div> |
|||
<div class="oe_clear"></div> |
|||
</div> |
|||
</t> |
|||
</templates> |
|||
</kanban> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="mobile_service_graph" model="ir.ui.view"> |
|||
<field name="name">mobile.service.graph</field> |
|||
<field name="model">mobile.service</field> |
|||
<field name="arch" type="xml"> |
|||
<graph string="Service Graph"> |
|||
<field name="technician_name" type="row"/> |
|||
</graph> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="mobile_service_request_tree_view" model="ir.ui.view"> |
|||
<field name="name">mobile.service.request.tree</field> |
|||
<field name="model">mobile.service</field> |
|||
<field name="arch" type="xml"> |
|||
<tree decoration-danger="service_state == 'not_solved'" decoration-muted="service_state=='returned'" |
|||
default_order="name desc"> |
|||
<field name="name"/> |
|||
<field name="person_name"/> |
|||
<field name="contact_no"/> |
|||
<field name="brand_name"/> |
|||
<field name="model_name"/> |
|||
<field name="imei_no"/> |
|||
<field name="image_medium" widget='image' class="Your_custom_class" string="Image"/> |
|||
<field name="technician_name"/> |
|||
<field name="return_date"/> |
|||
<field name="service_state"/> |
|||
</tree> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="action_mobile_service_request" model="ir.actions.act_window"> |
|||
<field name="name">Service Request</field> |
|||
<field name="res_model">mobile.service</field> |
|||
<field name="view_mode">tree,form,kanban,pivot,graph</field> |
|||
<field name="search_view_id" ref="mobile_service_request_search_view"/> |
|||
<field name="view_id" ref="mobile_service_request_tree_view"/> |
|||
<field name="help" type="html"> |
|||
<p class="oe_view_nocontent_create"> |
|||
Click to Create a New Record. |
|||
</p> |
|||
</field> |
|||
</record> |
|||
|
|||
|
|||
<menuitem id="mobile_service_main_menu" web_icon="mobile_service_shop,static/description/web-icon.png" |
|||
name="Mobile Service" sequence="20"/> |
|||
|
|||
<menuitem id="mobile_service_shop_menu" parent="mobile_service_main_menu" sequence="20"/> |
|||
|
|||
<menuitem action="action_mobile_service_request" id="mobile_service_shop_menu2" |
|||
parent="mobile_service_main_menu" |
|||
name="Service Request" sequence="1"/> |
|||
|
|||
<menuitem id="mobile_service_shop_configuration" parent="mobile_service_main_menu" |
|||
name="Configuration" sequence="3"/> |
|||
|
|||
|
|||
</data> |
|||
</odoo> |
@ -0,0 +1,83 @@ |
|||
<odoo> |
|||
<data> |
|||
|
|||
|
|||
<record id="mobile_service_products_parts" model="ir.ui.view"> |
|||
<field name="name">product.parts.form.view</field> |
|||
<field name="model">product.template</field> |
|||
<field name="inherit_id" ref="product.product_template_form_view"/> |
|||
<field name="arch" type="xml"> |
|||
<xpath expr="//div[@name='options']" position="inside"> |
|||
<field name="is_a_parts"/> |
|||
<label for="is_a_parts"/> |
|||
</xpath> |
|||
<xpath expr="//page[@name='general_information']" position="after"> |
|||
<page string="Parts details" attrs="{'invisible': [('is_a_parts', '=', False)]}"> |
|||
<group> |
|||
<group> |
|||
<field name="brand_name" attrs="{'required': [('is_a_parts', '=', True)]}"/> |
|||
<field name="model_name" attrs="{'required': [('is_a_parts', '=', True)]}"/> |
|||
</group> |
|||
<group> |
|||
<field name="model_colour"/> |
|||
<field name="extra_descriptions"/> |
|||
</group> |
|||
</group> |
|||
</page> |
|||
</xpath> |
|||
</field> |
|||
</record> |
|||
|
|||
|
|||
|
|||
<record id="view_product_name_kanban" model="ir.ui.view"> |
|||
<field name="name">product.template.product.kanban</field> |
|||
<field name="model">product.product</field> |
|||
<field name="inherit_id" ref="product.product_kanban_view"/> |
|||
<field name="arch" type="xml"> |
|||
<xpath expr="//field[@name='name']" |
|||
position="after"> |
|||
<strong> |
|||
<field name="brand_name"/> |
|||
<field name="model_name"/> |
|||
</strong> |
|||
</xpath> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="view_product_template_name_kanban" model="ir.ui.view"> |
|||
<field name="name">product.template.product.kanban</field> |
|||
<field name="model">product.template</field> |
|||
<field name="inherit_id" ref="product.product_template_kanban_view"/> |
|||
<field name="arch" type="xml"> |
|||
<xpath expr="//field[@name='name']" |
|||
position="after"> |
|||
<strong> |
|||
<field name="brand_name"/> |
|||
<field name="model_name"/> |
|||
</strong> |
|||
</xpath> |
|||
</field> |
|||
</record> |
|||
|
|||
|
|||
<record id="product_template_action_product" model="ir.actions.act_window"> |
|||
<field name="name">Products</field> |
|||
<field name="type">ir.actions.act_window</field> |
|||
<field name="res_model">product.product</field> |
|||
<field name="view_mode">kanban,tree,form</field> |
|||
<field name="context">{"search_default_consumable":1, 'default_type': 'product'}</field> |
|||
<field name="domain">[('is_a_parts', '=', True)]</field> |
|||
<field name="help" type="html"> |
|||
<p class="oe_view_nocontent_create"> |
|||
Click to define a new product. |
|||
</p> |
|||
</field> |
|||
</record> |
|||
|
|||
<menuitem action="product_template_action_product" id="mobile_service_shop_parts" parent="mobile_service_main_menu" |
|||
name="Parts inventory" sequence="2"/> |
|||
|
|||
|
|||
</data> |
|||
</odoo> |
@ -0,0 +1,44 @@ |
|||
<odoo> |
|||
<data> |
|||
|
|||
<record id="mobile_terms_and_conditions_form_view" model="ir.ui.view"> |
|||
<field name="name">mobile.terms.and.conditions.form</field> |
|||
<field name="model">terms.conditions</field> |
|||
<field name="arch" type="xml"> |
|||
<form string="Complaint Type"> |
|||
<sheet> |
|||
<group> |
|||
<field name="terms_conditions"/> |
|||
</group> |
|||
</sheet> |
|||
</form> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="mobile_terms_and_conditions_tree_view" model="ir.ui.view"> |
|||
<field name="name">mobile.terms.and.conditions.tree</field> |
|||
<field name="model">terms.conditions</field> |
|||
<field name="arch" type="xml"> |
|||
<tree> |
|||
<field name="terms_conditions"/> |
|||
</tree> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="action_mobile_terms_and_conditions" model="ir.actions.act_window"> |
|||
<field name="name">Terms and Conditions</field> |
|||
<field name="res_model">terms.conditions</field> |
|||
<field name="view_mode">tree,form</field> |
|||
<field name="view_id" ref="mobile_terms_and_conditions_tree_view"/> |
|||
<field name="help" type="html"> |
|||
<p class="oe_view_nocontent_create"> |
|||
Click to Create a New Record. |
|||
</p> |
|||
</field> |
|||
</record> |
|||
|
|||
<menuitem action="action_mobile_terms_and_conditions" id="mobile_service_shop_conf5" |
|||
parent="mobile_service_shop_configuration" |
|||
name="Terms and Conditions" sequence="4"/> |
|||
</data> |
|||
</odoo> |
@ -0,0 +1,23 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2019-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
|||
# 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 <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################# |
|||
from . import mobile_create_invoice |
|||
|
@ -0,0 +1,159 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2019-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
|||
# 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 <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################# |
|||
from odoo import api, fields, models, _ |
|||
from odoo.exceptions import Warning, UserError |
|||
from odoo.exceptions import UserError, ValidationError |
|||
|
|||
|
|||
class MobileServiceInvoice(models.Model): |
|||
|
|||
_name = 'mobile.invoice' |
|||
|
|||
advance_payment_method = fields.Selection([('advance', 'Advance'), ('full_amount', 'Full amount')], |
|||
string='Invoice method', default='advance') |
|||
amount = fields.Integer(string='Amount') |
|||
number = fields.Char(string='Service Id') |
|||
|
|||
def action_invoice_create(self): |
|||
active_id = self._context.get('active_id') |
|||
service_id = self.env['mobile.service'].search([('id', '=', active_id)]) |
|||
if not service_id.env['product.product'].search([("name", "=", "Mobile Service Advance")]): |
|||
vals = self._prepare_advance_product() |
|||
self.env['product.product'].create(vals) |
|||
|
|||
if not service_id.env['product.product'].search([("name", "=", "Mobile Service Charge")]): |
|||
vals1 = self._prepare_service_product() |
|||
self.env['product.product'].create(vals1) |
|||
|
|||
service_id.first_invoice_created = True |
|||
inv_obj = self.env['account.move'] |
|||
|
|||
inv_line_obj = self.env['account.move.line'] |
|||
supplier = service_id.person_name |
|||
inv_data = { |
|||
'move_type': 'out_invoice', |
|||
'ref': supplier.name, |
|||
'partner_id': supplier.id, |
|||
'currency_id': service_id.company_id.currency_id.id, |
|||
'journal_id': service_id.journal_type.id, |
|||
'invoice_origin': service_id.name, |
|||
'company_id': service_id.company_id.id, |
|||
} |
|||
inv_id = inv_obj.create(inv_data) |
|||
service_id.first_payment_inv = inv_id.id |
|||
self.number = service_id.name |
|||
if self.advance_payment_method != 'advance': |
|||
product_id = service_id.env['product.product'].search([("name", "=", "Mobile Service Charge")]) |
|||
else: |
|||
product_id = service_id.env['product.product'].search([("name", "=", "Mobile Service Advance")]) |
|||
|
|||
if product_id.property_account_income_id.id: |
|||
income_account = product_id.property_account_income_id.id |
|||
elif product_id.categ_id.property_account_income_categ_id.id: |
|||
income_account = product_id.categ_id.property_account_income_categ_id.id |
|||
else: |
|||
raise UserError('Please define income account for this product: "%s" (id:%d).' % |
|||
(product_id.name, product_id.id)) |
|||
flag = 0 |
|||
if self.amount: |
|||
flag = 1 |
|||
inv_line_data = [(0, 0, { |
|||
'name': product_id.name, |
|||
'price_unit': self.amount, |
|||
'quantity': 1, |
|||
'credit': self.amount, |
|||
'debit': 0, |
|||
'account_id': income_account, |
|||
'product_id': product_id.id, |
|||
'move_id': inv_id.id, |
|||
})] |
|||
inv_id.write({ |
|||
'invoice_line_ids': inv_line_data}) |
|||
inv_id._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.product_id.list_price |
|||
inv_line_data = [(0, 0, { |
|||
'name': line_data.product_id.name, |
|||
'price_unit': price, |
|||
'quantity': qty, |
|||
'product_uom_id': uom_id.id, |
|||
'credit': price, |
|||
'debit': 0, |
|||
'account_id': income_account, |
|||
'product_id': line_data.product_id.id, |
|||
'move_id': inv_id.id, |
|||
})] |
|||
inv_id.write({ |
|||
'invoice_line_ids': inv_line_data}) |
|||
print(line_data.product_id.id,'pr') |
|||
line_data.qty_invoiced = line_data.qty_invoiced + qty |
|||
inv_id._compute_journal_id() |
|||
|
|||
# inv_id.post() |
|||
if flag != 1: |
|||
raise UserError(_('Nothing to create invoice')) |
|||
imd = service_id.env['ir.model.data'] |
|||
action = self.env.ref('account.action_move_out_invoice_type') |
|||
list_view_id = imd._xmlid_to_res_id('account.view_move_tree') |
|||
form_view_id = imd._xmlid_to_res_id('account.view_move_form') |
|||
result = { |
|||
'name': action.name, |
|||
'help': action.help, |
|||
'type': 'ir.actions.act_window', |
|||
'views': [[list_view_id, 'tree'], [form_view_id, 'form'], [False, 'graph'], [False, 'kanban'], |
|||
[False, 'calendar'], [False, 'pivot']], |
|||
'target': action.target, |
|||
'context': action.context, |
|||
'res_model': 'account.move', |
|||
} |
|||
if len(inv_id) > 1: |
|||
result['domain'] = "[('id','in',%s)]" % inv_id.ids |
|||
elif len(inv_id) == 1: |
|||
result['views'] = [(form_view_id, 'form')] |
|||
result['res_id'] = inv_id.ids[0] |
|||
else: |
|||
result = {'type': 'ir.actions.act_window_close'} |
|||
return result |
|||
|
|||
def _prepare_advance_product(self): |
|||
return { |
|||
'name': 'Mobile Service Advance', |
|||
'type': 'service', |
|||
'invoice_policy': 'order', |
|||
'company_id': False, |
|||
} |
|||
|
|||
def _prepare_service_product(self): |
|||
return { |
|||
'name': 'Mobile Service Charge', |
|||
'type': 'service', |
|||
'invoice_policy': 'order', |
|||
'company_id': False, |
|||
} |
@ -0,0 +1,37 @@ |
|||
<odoo> |
|||
<record id="view_mobile_create_inv" model="ir.ui.view"> |
|||
<field name="name">Create Invoice</field> |
|||
<field name="model">mobile.invoice</field> |
|||
<field name="arch" type="xml"> |
|||
<form string="Invoice Service Order"> |
|||
<p class="oe_grey"> |
|||
Invoices will be created in draft so that you can review |
|||
them before validation. |
|||
</p> |
|||
<group> |
|||
<field name="advance_payment_method" class="oe_inline" widget="radio" /> |
|||
<label for="amount"/> |
|||
<div> |
|||
<field name="amount" |
|||
class="oe_inline" widget="monetary"/> |
|||
</div> |
|||
</group> |
|||
<footer> |
|||
<button name="action_invoice_create" string="Create Invoices" type="object" |
|||
class="btn-primary"/> |
|||
<button string="Cancel" class="btn-default" special="cancel"/> |
|||
</footer> |
|||
</form> |
|||
</field> |
|||
</record> |
|||
|
|||
|
|||
<record id="action_mobile_service_inv" model="ir.actions.act_window"> |
|||
<field name="name">Create Invoice</field> |
|||
<field name="type">ir.actions.act_window</field> |
|||
<field name="res_model">mobile.invoice</field> |
|||
<field name="view_mode">form</field> |
|||
<field name="target">new</field> |
|||
<field name="view_id" ref="view_mobile_create_inv"/> |
|||
</record> |
|||
</odoo> |