@ -0,0 +1,18 @@ |
|||||
|
Car Workshop v13 |
||||
|
================ |
||||
|
Car Workshop Management helps to manage automobile workshop with |
||||
|
great ease. Keep track of everything, like vehicle owner details, |
||||
|
Works assigned, Bill details of service provided, etc. |
||||
|
|
||||
|
Features |
||||
|
======== |
||||
|
* User Friendly Interface. |
||||
|
* Effective Time management. |
||||
|
* Separate Journal Configuration. |
||||
|
* Integrated with Accounting. |
||||
|
* High Scalability. |
||||
|
|
||||
|
.. note:: |
||||
|
|
||||
|
# Its Working Domain Based on Project App. |
||||
|
# Mapped Fleet for Easy Method. |
@ -0,0 +1,21 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: ASWATHI C (<https://www.cybrosys.com>) |
||||
|
# you can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
||||
|
|
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
||||
|
# If not, see <https://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
from . import models |
||||
|
|
@ -0,0 +1,52 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: ASWATHI C (<https://www.cybrosys.com>) |
||||
|
# you can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
||||
|
|
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
||||
|
# If not, see <https://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
{ |
||||
|
'name': 'Car Workshop', |
||||
|
'version': '13.0.1.0.0', |
||||
|
'summary': 'Complete Vehicle Workshop Operations & Reports', |
||||
|
'description': 'Vehicle workshop operations & Its reports', |
||||
|
'category': 'Industries', |
||||
|
'author': 'Cybrosys Techno Solutions', |
||||
|
'website': "https://www.cybrosys.com", |
||||
|
'company': 'Cybrosys Techno Solutions', |
||||
|
'depends': [ |
||||
|
'base', |
||||
|
'fleet', |
||||
|
'stock', |
||||
|
'account', |
||||
|
], |
||||
|
'data': [ |
||||
|
'data/workshop_data.xml', |
||||
|
'views/worksheet_views.xml', |
||||
|
'views/car_dashboard.xml', |
||||
|
'views/timesheet_view.xml', |
||||
|
'views/worksheet_stages.xml', |
||||
|
'views/vehicle.xml', |
||||
|
'views/report.xml', |
||||
|
'views/config_setting.xml', |
||||
|
'security/workshop_security.xml', |
||||
|
'security/ir.model.access.csv', |
||||
|
], |
||||
|
'images': ['static/description/banner.jpg'], |
||||
|
'license': 'AGPL-3', |
||||
|
'installable': True, |
||||
|
'auto_install': False, |
||||
|
'application': True, |
||||
|
} |
@ -0,0 +1,77 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<!-- <data noupdate="1">--> |
||||
|
<!-- <!– Requests Links –>--> |
||||
|
<!-- <record id="req_link_car" model="res.request.link">--> |
||||
|
<!-- <field name="name">Car</field>--> |
||||
|
<!-- <field name="object">car.car</field>--> |
||||
|
<!-- </record>--> |
||||
|
|
||||
|
<!-- <record id="req_link_worksheet" model="res.request.link">--> |
||||
|
<!-- <field name="name">Car Worksheet</field>--> |
||||
|
<!-- <field name="object">car.workshop</field>--> |
||||
|
<!-- </record>--> |
||||
|
<!-- </data>--> |
||||
|
|
||||
|
<data noupdate="1"> |
||||
|
<!-- Task-related subtypes for messaging / Chatter --> |
||||
|
<record id="mt_task_new" model="mail.message.subtype"> |
||||
|
<field name="name">Task Opened</field> |
||||
|
<field name="res_model">car.workshop</field> |
||||
|
<field name="default" eval="False"/> |
||||
|
<field name="hidden" eval="False"/> |
||||
|
<field name="description">Task opened</field> |
||||
|
</record> |
||||
|
<record id="mt_task_blocked" model="mail.message.subtype"> |
||||
|
<field name="name">Task Blocked</field> |
||||
|
<field name="res_model">car.workshop</field> |
||||
|
<field name="default" eval="False"/> |
||||
|
<field name="description">Task blocked</field> |
||||
|
</record> |
||||
|
<record id="mt_task_ready" model="mail.message.subtype"> |
||||
|
<field name="name">Task Ready</field> |
||||
|
<field name="res_model">car.workshop</field> |
||||
|
<field name="default" eval="False"/> |
||||
|
<field name="description">Task ready for Next Stage</field> |
||||
|
</record> |
||||
|
<record id="mt_task_stages" model="mail.message.subtype"> |
||||
|
<field name="name">Stage Changed</field> |
||||
|
<field name="res_model">car.workshop</field> |
||||
|
<field name="default" eval="False"/> |
||||
|
<field name="description">Stage changed</field> |
||||
|
</record> |
||||
|
<!-- Project-related subtypes for messaging / Chatter --> |
||||
|
<record id="mt_project_task_new" model="mail.message.subtype"> |
||||
|
<field name="name">Task Opened</field> |
||||
|
<field name="sequence">10</field> |
||||
|
<field name="res_model">car.car</field> |
||||
|
<field name="default" eval="True"/> |
||||
|
<field name="parent_id" eval="ref('mt_task_new')"/> |
||||
|
<field name="relation_field">vehicle_id</field> |
||||
|
</record> |
||||
|
<record id="mt_project_task_blocked" model="mail.message.subtype"> |
||||
|
<field name="name">Task Blocked</field> |
||||
|
<field name="sequence">11</field> |
||||
|
<field name="res_model">car.car</field> |
||||
|
<field name="default" eval="False"/> |
||||
|
<field name="parent_id" eval="ref('mt_task_blocked')"/> |
||||
|
<field name="relation_field">vehicle_id</field> |
||||
|
</record> |
||||
|
<record id="mt_project_task_ready" model="mail.message.subtype"> |
||||
|
<field name="name">Task Ready</field> |
||||
|
<field name="sequence">12</field> |
||||
|
<field name="res_model">car.car</field> |
||||
|
<field name="default" eval="False"/> |
||||
|
<field name="parent_id" eval="ref('mt_task_ready')"/> |
||||
|
<field name="relation_field">vehicle_id</field> |
||||
|
</record> |
||||
|
<record id="mt_project_task_stage" model="mail.message.subtype"> |
||||
|
<field name="name">Task Stage Changed</field> |
||||
|
<field name="sequence">13</field> |
||||
|
<field name="res_model">car.car</field> |
||||
|
<field name="default" eval="False"/> |
||||
|
<field name="parent_id" eval="ref('mt_task_stages')"/> |
||||
|
<field name="relation_field">vehicle_id</field> |
||||
|
</record> |
||||
|
</data> |
||||
|
</odoo> |
@ -0,0 +1,10 @@ |
|||||
|
## Module <fleet_car_workshop> |
||||
|
|
||||
|
#### 26.07.2022 |
||||
|
#### Version 13.0.1.0.0 |
||||
|
#### ADD |
||||
|
Initial Commit |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
@ -0,0 +1,23 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: ASWATHI C(<https://www.cybrosys.com>) |
||||
|
# you can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
||||
|
|
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
||||
|
# If not, see <https://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
from . import car_workshop |
||||
|
from . import timesheet |
||||
|
from . import dashboard |
||||
|
from . import config |
@ -0,0 +1,410 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: ASWATHI C (<https://www.cybrosys.com>) |
||||
|
# you can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
||||
|
|
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
||||
|
# If not, see <https://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
from datetime import date, datetime |
||||
|
from dateutil.relativedelta import relativedelta |
||||
|
from psutil import long |
||||
|
|
||||
|
from odoo.exceptions import UserError |
||||
|
from odoo import models, api, fields, _ |
||||
|
|
||||
|
|
||||
|
class CarWorkshop(models.Model): |
||||
|
_name = 'car.workshop' |
||||
|
_description = "Car Workshop" |
||||
|
_inherit = ['mail.thread'] |
||||
|
|
||||
|
def _get_default_vehicle(self): |
||||
|
car_id = self._context.get('active_id') |
||||
|
car = self.env['car.car'].browse(car_id) |
||||
|
if car.name: |
||||
|
return car.name.id |
||||
|
else: |
||||
|
return 1 |
||||
|
|
||||
|
vehicle_id = fields.Many2one('car.car', string='Vehicle', |
||||
|
default=lambda self: self.env.context.get('default_vehicle_id'), index=True, |
||||
|
tracking=True, |
||||
|
change_default=True) |
||||
|
|
||||
|
|
||||
|
@api.model |
||||
|
def _default_company_id(self): |
||||
|
car_id = self._context.get('active_id') |
||||
|
car = self.env['car.car'].browse(car_id) |
||||
|
if car.vehicle_id: |
||||
|
return car.vehicle_id.company_id.id |
||||
|
else: |
||||
|
return self.env.company |
||||
|
|
||||
|
def _get_default_partner(self): |
||||
|
if 'default_vehicle_id' in self.env.context: |
||||
|
default_vehicle_id = self.env['car.car'].browse(self.env.context['default_vehicle_id']) |
||||
|
return default_vehicle_id.partner_id |
||||
|
|
||||
|
def _get_default_stage_id(self): |
||||
|
""" Gives default stage_id """ |
||||
|
vehicle_id = self.env.context.get('default_vehicle_id') |
||||
|
if not vehicle_id: |
||||
|
return False |
||||
|
return self.stage_find(vehicle_id, [('fold', '=', False)]) |
||||
|
|
||||
|
@api.model |
||||
|
def _read_group_stage_ids(self, stages, domain, order): |
||||
|
search_domain = [('id', 'in', stages.ids)] |
||||
|
if 'default_vehicle_id' in self.env.context: |
||||
|
search_domain = ['|', ('vehicle_ids', '=', self.env.context['default_vehicle_id'])] + search_domain |
||||
|
|
||||
|
stage_ids = stages._search(search_domain, order=order) |
||||
|
return stages.browse(stage_ids) |
||||
|
|
||||
|
name = fields.Char(string='Title', track_visibility='onchange', required=True) |
||||
|
user_id = fields.Many2one('res.users', string='Assigned to', default=lambda self: self.env.user, tracking=True) |
||||
|
active = fields.Boolean(string='Active', default=True) |
||||
|
partner_id = fields.Many2one('res.partner', string='Customer', default=_get_default_partner) |
||||
|
priority = fields.Selection([('0', 'Normal'), ('1', 'High')], 'Priority', select=True, default='0') |
||||
|
description = fields.Html(string='Description') |
||||
|
sequence = fields.Integer(string='Sequence', select=True, default=10, |
||||
|
help="Gives the sequence order when displaying a list of tasks.") |
||||
|
tag_ids = fields.Many2many('worksheet.tags', string='Tags', ondelete='cascade') |
||||
|
kanban_state = fields.Selection( |
||||
|
[('normal', 'In Progress'), ('done', 'Ready for next stage'), ('blocked', 'Blocked')], 'Kanban State', |
||||
|
help="A task's kanban state indicates special situations affecting it:\n" |
||||
|
" * Normal is the default situation\n" |
||||
|
" * Blocked indicates something is preventing the progress of this task\n" |
||||
|
" * Ready for next stage indicates the task is ready to be pulled to the next stage", |
||||
|
required=True, track_visibility='onchange', default='normal', copy=False) |
||||
|
create_date = fields.Datetime(string='Create Date', readonly=True, select=True) |
||||
|
write_date = fields.Datetime(string='Last Modification Date', readonly=True, select=True) |
||||
|
date_start = fields.Datetime(string='Starting Date', default=fields.datetime.now(), select=True, copy=False) |
||||
|
date_end = fields.Datetime(string='Ending Date', select=True, copy=False) |
||||
|
date_assign = fields.Datetime(string='Assigning Date', select=True, copy=False) |
||||
|
date_deadline = fields.Datetime(string='Deadline', select=True, copy=False) |
||||
|
progress = fields.Integer(string="Working Time Progress(%)", copy=False, readonly=True) |
||||
|
date_last_stage_update = fields.Datetime(string='Last Stage Update', select=True, default=fields.datetime.now(), |
||||
|
copy=False, readonly=True) |
||||
|
id = fields.Integer('ID', readonly=True) |
||||
|
company_id = fields.Many2one('res.company', string='Company', required=True, default=_default_company_id) |
||||
|
color = fields.Integer(string='Color Index') |
||||
|
stage_id = fields.Many2one('worksheet.stages', string='Stage', ondelete='restrict', tracking=True, index=True, |
||||
|
default=_get_default_stage_id, group_expand='_read_group_stage_ids', |
||||
|
domain="[('vehicle_ids', '=', vehicle_id)]", copy=False) |
||||
|
state = fields.Selection([ |
||||
|
('waiting', 'Ready'), |
||||
|
('workshop_create_invoices', 'Invoiced'), |
||||
|
('cancel', 'Invoice Canceled'), |
||||
|
], string='Status', readonly=True, default='waiting', track_visibility='onchange', select=True) |
||||
|
attachment_ids = fields.One2many('ir.attachment', 'res_id', domain=lambda self: [('res_model', '=', self._name)], |
||||
|
auto_join=True, string='Attachments') |
||||
|
displayed_image_id = fields.Many2one('ir.attachment', |
||||
|
domain="[" |
||||
|
"('res_model', '=', 'car.workshop')," |
||||
|
"('res_id', '=', id)," |
||||
|
"('mimetype', 'ilike', 'image')]", |
||||
|
string='Displayed Image') |
||||
|
planned_works = fields.One2many('planned.work', 'work_id', string='Planned/Ordered Works') |
||||
|
works_done = fields.One2many('planned.work', 'work_id', string='Work Done', domain=[('completed', '=', True)]) |
||||
|
materials_used = fields.One2many('material.used', 'material_id', string='Materials Used') |
||||
|
remaining_hour = fields.Float(string='Remaining Hour', readonly=True, compute="hours_left") |
||||
|
effective_hour = fields.Float(string='Hours Spent', readonly=True, compute="hours_spent") |
||||
|
amount_total = fields.Float(string='Total Amount', readonly=True, compute="amount_total1") |
||||
|
invoice_count = fields.Integer(string="Invoice_count", compute='compute_invoice_count') |
||||
|
|
||||
|
@api.depends('planned_works.work_cost', 'materials_used.price') |
||||
|
def amount_total1(self): |
||||
|
for records in self: |
||||
|
for hour in records: |
||||
|
amount_totall = 0.0 |
||||
|
for line in hour.planned_works: |
||||
|
amount_totall += line.work_cost |
||||
|
for line2 in hour.materials_used: |
||||
|
amount_totall += line2.price |
||||
|
records.amount_total = amount_totall |
||||
|
|
||||
|
def cancel(self): |
||||
|
self.state = 'cancel' |
||||
|
|
||||
|
def workshop_create_invoices(self): |
||||
|
self.state = 'workshop_create_invoices' |
||||
|
inv_obj = self.env['account.move'] |
||||
|
inv_line_obj = self.env['account.move.line'] |
||||
|
customer = self.partner_id |
||||
|
if not customer.name: |
||||
|
raise UserError( |
||||
|
_( |
||||
|
'Please select a Customer.')) |
||||
|
|
||||
|
|
||||
|
invoice_line_ids = [] |
||||
|
company_id = self.env['res.users'].browse(1).company_id |
||||
|
currency_value = company_id.currency_id.id |
||||
|
self.ensure_one() |
||||
|
journal_id = self.env['ir.config_parameter'].sudo().get_param( |
||||
|
'fleet_car_workshop.invoice_journal_type') |
||||
|
if not journal_id: |
||||
|
journal_id = 1 |
||||
|
|
||||
|
inv_data = { |
||||
|
'ref': self.name, |
||||
|
'invoice_partner_bank_id': customer.property_account_receivable_id.id, |
||||
|
'partner_id': customer.id, |
||||
|
'currency_id': currency_value, |
||||
|
'journal_id': int(journal_id), |
||||
|
'invoice_origin': self.name, |
||||
|
'company_id': company_id.id, |
||||
|
'type': 'out_invoice', |
||||
|
} |
||||
|
|
||||
|
for records in self.planned_works: |
||||
|
if records.planned_work.id: |
||||
|
income_account = records.planned_work.property_account_income_id.id |
||||
|
inv_line_data = (0, 0, { |
||||
|
'name': records.planned_work.name, |
||||
|
'account_id': income_account, |
||||
|
'price_unit': records.work_cost, |
||||
|
'quantity': 1, |
||||
|
'product_id': records.planned_work.id, |
||||
|
}) |
||||
|
invoice_line_ids.append(inv_line_data) |
||||
|
if not income_account: |
||||
|
raise UserError(_('There is no income account defined for this product: "%s".') % |
||||
|
(records.planned_work.name,)) |
||||
|
|
||||
|
for records in self.materials_used: |
||||
|
if records.material.id: |
||||
|
income_account = records.material.property_account_income_id.id |
||||
|
inv_line_data = (0, 0, { |
||||
|
'name': records.material.name, |
||||
|
'account_id': records.material.property_account_income_id.id, |
||||
|
'price_unit': records.price, |
||||
|
'quantity': records.amount, |
||||
|
'product_id': records.material.id, |
||||
|
}) |
||||
|
invoice_line_ids.append(inv_line_data) |
||||
|
if not income_account: |
||||
|
raise UserError(_('There is no income account defined for this product: "%s".') % |
||||
|
(records.material.name,)) |
||||
|
|
||||
|
inv_data.update({ |
||||
|
'invoice_line_ids': invoice_line_ids |
||||
|
}) |
||||
|
inv_id = inv_obj.create(inv_data) |
||||
|
result = { |
||||
|
'type': 'ir.actions.act_window', |
||||
|
'name': _('Invoice'), |
||||
|
'view_mode': 'form', |
||||
|
'res_model': 'account.move', |
||||
|
'target': 'current', |
||||
|
'res_id': inv_id.id, |
||||
|
} |
||||
|
IMD = self.env['ir.model.data'] |
||||
|
form_view_id = IMD.xmlid_to_res_id('account.invoice_form') |
||||
|
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'} |
||||
|
invoiced_records = self.env['car.workshop'] |
||||
|
|
||||
|
total = 0 |
||||
|
for rows in invoiced_records: |
||||
|
invoiced_date = rows.date |
||||
|
invoiced_date = invoiced_date[0:10] |
||||
|
if invoiced_date == str(date.today()): |
||||
|
total = total + rows.price_subtotal |
||||
|
for lines in self.materials_used: |
||||
|
product_ids = self.env['product.product'].search( |
||||
|
[('id', '=', lines.material.id)]) |
||||
|
for prod_id in product_ids: |
||||
|
move_id = self.env['stock.picking'] |
||||
|
type_object = self.env['stock.picking.type'] |
||||
|
company_id = self.env.context.get('company_id') or self.env.user.company_id.id |
||||
|
types = type_object.search([('code', '=', 'outgoing'), ('warehouse_id.company_id', '=', company_id)], |
||||
|
limit=1) |
||||
|
vals = { |
||||
|
'partner_id': self.partner_id.id, |
||||
|
'origin': self.name, |
||||
|
'move_type': 'one', |
||||
|
'picking_type_id': types.id, |
||||
|
'location_id': types.default_location_src_id.id, |
||||
|
'location_dest_id': self.partner_id.property_stock_customer.id, |
||||
|
'move_lines': [(0, 0, { |
||||
|
'name': self.name, |
||||
|
'product_id': prod_id.id, |
||||
|
'product_uom': prod_id.uom_id.id, |
||||
|
'product_uom_qty': lines.amount, |
||||
|
'quantity_done': lines.amount, |
||||
|
'location_id': types.default_location_src_id.id, |
||||
|
'location_dest_id': self.partner_id.property_stock_customer.id, |
||||
|
})], |
||||
|
} |
||||
|
move = move_id.create(vals) |
||||
|
move.action_confirm() |
||||
|
move.action_assign() |
||||
|
move.action_done() |
||||
|
return result |
||||
|
|
||||
|
@api.depends('works_done.duration') |
||||
|
def hours_spent(self): |
||||
|
for hour in self: |
||||
|
effective_hour = 0.0 |
||||
|
for line in hour.works_done: |
||||
|
effective_hour += line.duration |
||||
|
self.effective_hour = effective_hour |
||||
|
|
||||
|
@api.depends('planned_works.time_spent') |
||||
|
def hours_left(self): |
||||
|
for hour in self: |
||||
|
remaining_hour = 0.0 |
||||
|
for line in hour.planned_works: |
||||
|
remaining_hour += line.time_spent |
||||
|
self.remaining_hour = remaining_hour - self.effective_hour |
||||
|
|
||||
|
def process_demo_scheduler_queue(self): |
||||
|
obj = self.env['car.workshop'] |
||||
|
obj1 = obj.search([]) |
||||
|
now = fields.Datetime.from_string(fields.Datetime.now()) |
||||
|
for obj2 in obj1: |
||||
|
obj3 = obj2 |
||||
|
if obj3.stage_id.name != 'Done' and obj3.stage_id.name != 'Cancelled' and obj3.stage_id.name != 'Verified': |
||||
|
end_date = fields.Datetime.from_string(obj3.date_deadline) |
||||
|
start_date = fields.Datetime.from_string(obj3.date_assign) |
||||
|
if obj3.date_deadline and obj3.date_assign and end_date > start_date: |
||||
|
if now < end_date: |
||||
|
diff1 = relativedelta(end_date, start_date) |
||||
|
if diff1.days == 0: |
||||
|
total_hr = int(diff1.minutes) |
||||
|
else: |
||||
|
total_hr = int(diff1.days) * 24 * 60 + int(diff1.minutes) |
||||
|
diff2 = relativedelta(now, start_date) |
||||
|
if diff2.days == 0: |
||||
|
current_hr = int(diff2.minutes) |
||||
|
else: |
||||
|
current_hr = int(diff2.days) * 24 * 60 + int(diff2.minutes) |
||||
|
if total_hr != 0: |
||||
|
obj3.progress = ((current_hr * 100) / total_hr) |
||||
|
else: |
||||
|
obj3.progress = 100 |
||||
|
else: |
||||
|
obj3.progress = 100 |
||||
|
else: |
||||
|
obj3.progress = 0 |
||||
|
|
||||
|
@api.model |
||||
|
def _track_subtype(self, init_values): |
||||
|
record = self.ensure_one() |
||||
|
if 'kanban_state' in init_values and record.kanban_state == 'blocked': |
||||
|
return self.env.ref('fleet_car_workshop.mt_task_blocked') |
||||
|
elif 'kanban_state' in init_values and record.kanban_state == 'done': |
||||
|
return self.env.ref('fleet_car_workshop.mt_task_ready') |
||||
|
elif 'user_id' in init_values and record.user_id: # assigned -> new |
||||
|
return self.env.ref('fleet_car_workshop.mt_task_new') |
||||
|
elif 'stage_id' in init_values and record.stage_id and record.stage_id.sequence <= 1: # start stage -> new |
||||
|
self.env.ref('fleet_car_workshop.mt_task_new') |
||||
|
elif 'stage_id' in init_values: |
||||
|
return self.env.ref('fleet_car_workshop.mt_task_stages') |
||||
|
return super(CarWorkshop, self)._track_subtype(init_values) |
||||
|
@api.model |
||||
|
def create(self, vals): |
||||
|
# context: no_log, because subtype already handle this |
||||
|
context = dict(self.env.context, mail_create_nolog=True) |
||||
|
|
||||
|
# for default stage |
||||
|
if vals.get('vehicle_id') and not context.get('default_vehicle_id'): |
||||
|
context['default_vehicle_id'] = vals.get('vehicle_id') |
||||
|
# user_id change: update date_assign |
||||
|
if vals.get('user_id'): |
||||
|
vals['date_assign'] = fields.Datetime.now() |
||||
|
# Stage change: Update date_end if folded stage and date_last_stage_update |
||||
|
if vals.get('stage_id'): |
||||
|
vals.update(self.change_date_end(vals['stage_id'])) |
||||
|
vals['date_last_stage_update'] = fields.Datetime.now() |
||||
|
task = super(CarWorkshop, self.with_context(context)).create(vals) |
||||
|
return task |
||||
|
|
||||
|
def write(self, vals): |
||||
|
now = fields.Datetime.now(self) |
||||
|
# stage change: update date_last_stage_update |
||||
|
if 'stage_id' in vals: |
||||
|
vals.update(self.change_date_end(vals['stage_id'])) |
||||
|
vals['date_last_stage_update'] = now |
||||
|
# reset kanban state when changing stage |
||||
|
if 'kanban_state' not in vals: |
||||
|
vals['kanban_state'] = 'normal' |
||||
|
# user_id change: update date_assign |
||||
|
if vals.get('user_id') and 'date_assign' not in vals: |
||||
|
vals['date_assign'] = now |
||||
|
result = super(CarWorkshop, self).write(vals) |
||||
|
return result |
||||
|
|
||||
|
def change_date_end(self, stage_id): |
||||
|
worksheet_stage = self.env['worksheet.stages'].browse(stage_id) |
||||
|
if worksheet_stage.fold: |
||||
|
return {'date_end': fields.Datetime.now()} |
||||
|
return {'date_end': False} |
||||
|
|
||||
|
@api.onchange('vehicle_id') |
||||
|
def onchange_vehicle(self): |
||||
|
if self.vehicle_id.exists(): |
||||
|
self.partner_id = self.vehicle_id.partner_id |
||||
|
self.stage_id = self.stage_find(self.vehicle_id, [('fold', '=', False)]) |
||||
|
|
||||
|
def stage_find(self, section_id, domain=[], order='sequence'): |
||||
|
""" Override of the base.stage method |
||||
|
Parameter of the stage search taken from the lead: |
||||
|
- section_id: if set, stages must belong to this section or |
||||
|
be a default stage; if not set, stages must be default |
||||
|
stages |
||||
|
""" |
||||
|
# collect all section_ids |
||||
|
section_ids = [] |
||||
|
if section_id: |
||||
|
section_ids.append(section_id) |
||||
|
section_ids.extend(self.mapped('vehicle_id').ids) |
||||
|
search_domain = [] |
||||
|
if section_ids: |
||||
|
search_domain = [('|')] * (len(section_ids) - 1) |
||||
|
for section_id in section_ids: |
||||
|
if isinstance(section_id, (int, long)): |
||||
|
search_domain.append(('vehicle_ids', '=', section_id)) |
||||
|
search_domain += list(domain) |
||||
|
# perform search, return the first found |
||||
|
stage_ids = self.env['worksheet.stages'].search(search_domain, order=order, limit=1).id |
||||
|
if stage_ids: |
||||
|
return stage_ids |
||||
|
return False |
||||
|
|
||||
|
def get_invoices(self): |
||||
|
self.ensure_one() |
||||
|
return { |
||||
|
'type': 'ir.actions.act_window', |
||||
|
'name': 'Invoices', |
||||
|
'view_mode': 'tree,form', |
||||
|
'view_type': 'form', |
||||
|
'res_model': 'account.move', |
||||
|
'domain': [('invoice_origin', '=', self.name)], |
||||
|
'context': "{'create': False}" |
||||
|
} |
||||
|
|
||||
|
def compute_invoice_count(self): |
||||
|
for record in self: |
||||
|
record.invoice_count = self.env['account.move'].search_count( |
||||
|
[('invoice_origin', '=', self.name)]) |
@ -0,0 +1,62 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: ASWATHI C (<https://www.cybrosys.com>) |
||||
|
# you can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
||||
|
|
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
||||
|
# If not, see <https://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
from odoo.tools.translate import _ |
||||
|
from odoo import fields, models, api |
||||
|
|
||||
|
|
||||
|
from odoo import fields, models |
||||
|
|
||||
|
|
||||
|
class WorkshopSetting(models.TransientModel): |
||||
|
_inherit = ['res.config.settings'] |
||||
|
|
||||
|
invoice_journal_type = fields.Many2one('account.journal', string="Car Workshop Journal", config_parameter='fleet_car_workshop.invoice_journal_type') |
||||
|
|
||||
|
|
||||
|
class WorksheetTags(models.Model): |
||||
|
_name = "worksheet.tags" |
||||
|
_description = "Tags of vehicles's tasks, issues..." |
||||
|
|
||||
|
name = fields.Char('Name', required=True) |
||||
|
color = fields.Integer('Color') |
||||
|
|
||||
|
_sql_constraints = [ |
||||
|
('name_uniq', 'unique (name)', "Tag name already exists !"), |
||||
|
] |
||||
|
|
||||
|
|
||||
|
class WorksheetStages(models.Model): |
||||
|
_name = 'worksheet.stages' |
||||
|
_description = 'worksheet Stage' |
||||
|
_order = 'sequence' |
||||
|
|
||||
|
def _get_default_vehicle_ids(self): |
||||
|
default_vehicle_id = self.env.context.get('default_vehicle_id') |
||||
|
return [default_vehicle_id] if default_vehicle_id else None |
||||
|
|
||||
|
name = fields.Char(string='Stage Name', required=True) |
||||
|
description = fields.Text(string='Description', translate=True) |
||||
|
sequence = fields.Integer(string='Sequence') |
||||
|
vehicle_ids = fields.Many2many('car.car', 'worksheet_type_rel', 'type_id', 'vehicle_id', string='Vechicles', |
||||
|
default=_get_default_vehicle_ids) |
||||
|
fold = fields.Boolean('Folded in Tasks Pipeline', |
||||
|
help='This stage is folded in the kanban view when ' |
||||
|
'there are no records in that stage to display.') |
||||
|
|
@ -0,0 +1,107 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: ASWATHI C (<https://www.cybrosys.com>) |
||||
|
# you can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
||||
|
|
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
||||
|
# If not, see <https://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
import base64 |
||||
|
|
||||
|
from odoo.osv import osv |
||||
|
from odoo.tools.translate import _ |
||||
|
from odoo import fields, api |
||||
|
|
||||
|
|
||||
|
class CarVehicle(osv.osv): |
||||
|
_name = 'car.car' |
||||
|
_description = "Vechicles" |
||||
|
_inherit = ['mail.thread'] |
||||
|
_rec_name = 'vehicle_id' |
||||
|
|
||||
|
active = fields.Boolean('Active',default=True) |
||||
|
vehicle_id = fields.Many2one('fleet.vehicle', string='Vehicle Name', tracking=True, required=True) |
||||
|
sequence = fields.Integer('Sequence', help="Gives the sequence order when displaying a list of Projects.") |
||||
|
|
||||
|
label_tasks = fields.Char(string='Use Tasks as', help="Gives label to Work on kanban view.", default="Task") |
||||
|
worksheet = fields.One2many('car.workshop', 'vehicle_id', string="Task Activities") |
||||
|
|
||||
|
type_ids = fields.Many2many('worksheet.stages', 'car_workshop_type_rel', |
||||
|
'vehicle_id', 'type_id', string='Worksheet Stages', |
||||
|
states={'close': [('readonly', True)], 'cancelled': [('readonly', True)]}) |
||||
|
task_count = fields.Integer(compute='_compute_task_count', type='integer', string="Tasks" ) |
||||
|
task_ids = fields.One2many('car.workshop', 'vehicle_id', domain=['|', ('stage_id.fold', '=', False), ('stage_id', '=', False)]) |
||||
|
doc_count = fields.Integer(compute='_compute_attached_docs_count', string="Number of documents attached") |
||||
|
color = fields.Integer(string='Color Index') |
||||
|
partner_id = fields.Many2one('res.partner', string='Customer') |
||||
|
state = fields.Selection([('draft', 'New'), |
||||
|
('open', 'In Progress'), |
||||
|
('cancelled', 'Cancelled'), |
||||
|
('pending', 'Pending'), |
||||
|
('close', 'Closed')], string='Status', required=True, |
||||
|
track_visibility='onchange',default='open', copy=False) |
||||
|
|
||||
|
date_start = fields.Date(string='Start Date') |
||||
|
date = fields.Date(string='Expiration Date', select=True, track_visibility='onchange') |
||||
|
use_tasks = fields.Boolean(string='Tasks', default=True) |
||||
|
image_128 = fields.Image(related='vehicle_id.image_128', readonly=False) |
||||
|
|
||||
|
def _get_visibility_selection_id(self, cr, uid, context=None): |
||||
|
return [('portal', _('Customer Works: visible in portal if the customer is a follower')), |
||||
|
('employees', _('All Employees Work: all employees can access')), |
||||
|
('followers', _('Private Work: followers only'))] |
||||
|
|
||||
|
_visibility_selections = lambda self, *args, **kwargs: self._get_visibility_selection_id(*args, **kwargs) |
||||
|
|
||||
|
def _compute_attached_docs_count(self): |
||||
|
Attachment = self.env['ir.attachment'] |
||||
|
for vehicle in self: |
||||
|
vehicle.doc_count = Attachment.search_count([ |
||||
|
'|', |
||||
|
'&', |
||||
|
('res_model', '=', 'car.car'), ('res_id', '=', vehicle.id), |
||||
|
'&', |
||||
|
('res_model', '=', 'car.worksheet'), ('res_id', 'in', vehicle.task_ids.ids) |
||||
|
]) |
||||
|
|
||||
|
def _compute_task_count(self): |
||||
|
for vehicle in self: |
||||
|
vehicle.task_count = len(vehicle.task_ids) |
||||
|
|
||||
|
def attachment_tree_views(self): |
||||
|
self.ensure_one() |
||||
|
domain = [ |
||||
|
'|', |
||||
|
'&', ('res_model', '=', 'car.car'), ('res_id', 'in', self.ids), |
||||
|
'&', ('res_model', '=', 'car.workshop'), ('res_id', 'in', self.task_ids.ids)] |
||||
|
|
||||
|
return { |
||||
|
'name': _('Attachments'), |
||||
|
'domain': domain, |
||||
|
'res_model': 'ir.attachment', |
||||
|
'type': 'ir.actions.act_window', |
||||
|
'view_id': False, |
||||
|
'view_mode': 'kanban,tree,form', |
||||
|
'view_type': 'form', |
||||
|
'help': _('''<p class="oe_view_nocontent_create"> |
||||
|
Documents are attached to the tasks and issues of your Worksheet.</p><p> |
||||
|
Send messages or log internal notes with attachments to link |
||||
|
documents to your Worksheet. |
||||
|
</p>'''), |
||||
|
'limit': 80, |
||||
|
'context': "{'default_res_model': '%s','default_res_id': %d}" % (self._name, self.id) |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
@ -0,0 +1,54 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: ASWATHI C (<https://www.cybrosys.com>) |
||||
|
# you can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
||||
|
|
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
||||
|
# If not, see <https://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
|
||||
|
from odoo import fields, models, api |
||||
|
|
||||
|
|
||||
|
class PlannedWork (models.Model): |
||||
|
_name = 'planned.work' |
||||
|
|
||||
|
planned_work = fields.Many2one('product.product', string='Planned work', domain=[('type', '=', 'service')]) |
||||
|
time_spent = fields.Float(string='Estimated Time') |
||||
|
work_date = fields.Datetime(string='Date') # Date of work planned:planned date |
||||
|
responsible = fields.Many2one('res.users', string='Responsible') |
||||
|
work_id = fields.Many2one('car.workshop', string="Work id") |
||||
|
work_cost = fields.Float(string="Service Cost") |
||||
|
completed = fields.Boolean(string="Completed") |
||||
|
duration = fields.Float(string='Duration') |
||||
|
work_date2 = fields.Datetime(string='Date') # Date of work completed/done:completed date |
||||
|
|
||||
|
@api.onchange('planned_work') |
||||
|
def get_price(self): |
||||
|
self.work_cost = self.planned_work.lst_price |
||||
|
|
||||
|
|
||||
|
class MaterialUsed (models.Model): |
||||
|
_name = 'material.used' |
||||
|
|
||||
|
material = fields.Many2one('product.product', string='Products') |
||||
|
amount = fields.Integer(string='Quantity') |
||||
|
price = fields.Float(string='Unit Price') |
||||
|
material_id = fields.Many2one('car.workshop') |
||||
|
_defaults = { |
||||
|
'amount': 1, } |
||||
|
|
||||
|
@api.onchange('material') |
||||
|
def get_price(self): |
||||
|
self.price = self.material.lst_price |
|
@ -0,0 +1,25 @@ |
|||||
|
<?xml version="1.0" ?> |
||||
|
<odoo> |
||||
|
<data noupdate="0"> |
||||
|
<record id="fleet_car_workshop.main_workshop_menu" model="ir.ui.menu"> |
||||
|
<field name="groups_id" eval="[(6, 0, [ref('fleet.fleet_group_user')] )]"/> |
||||
|
</record> |
||||
|
<record id="fleet_car_workshop.workshop_vehicles" model="ir.ui.menu"> |
||||
|
<field name="groups_id" eval="[(6, 0, [ref('fleet.fleet_group_user')] )]"/> |
||||
|
</record> |
||||
|
<record id="fleet_car_workshop.vehicle_works" model="ir.ui.menu"> |
||||
|
<field name="groups_id" eval="[(6, 0, [ref('fleet.fleet_group_user')] )]"/> |
||||
|
</record> |
||||
|
<record id="fleet_car_workshop.menu_worksheet_config" model="ir.ui.menu"> |
||||
|
<field name="groups_id" eval="[(6, 0, [ref('fleet.fleet_group_user')] )]"/> |
||||
|
</record> |
||||
|
<record id="fleet_car_workshop.menu_worksheet_stages_action" model="ir.ui.menu"> |
||||
|
<field name="groups_id" eval="[(6, 0, [ref('fleet.fleet_group_manager')] )]"/> |
||||
|
</record> |
||||
|
<record id="fleet_user_vehicle_visibility_user" model="ir.rule"> |
||||
|
<field name="name">Manager has all rights on vehicle</field> |
||||
|
<field name="model_id" ref="fleet.model_fleet_vehicle"/> |
||||
|
<field name="groups" eval="[(4, ref('fleet.fleet_group_manager'))]"/> |
||||
|
</record> |
||||
|
</data> |
||||
|
</odoo> |
After Width: | Height: | Size: 40 KiB |
After Width: | Height: | Size: 77 KiB |
After Width: | Height: | Size: 77 KiB |
After Width: | Height: | Size: 121 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 116 KiB |
After Width: | Height: | Size: 95 KiB |
After Width: | Height: | Size: 143 KiB |
After Width: | Height: | Size: 82 KiB |
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 18 KiB |
@ -0,0 +1,365 @@ |
|||||
|
|
||||
|
<section class="oe_container" style="background-image:url(https://www.cybrosys.com/images/odoo-index-header-banner.png); background-repeat:no-repeat; background-size:cover;padding: 13% 0% 22% 15%;"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<h2 class="oe_slogan" style="font-size: 35px;color: #fff;font-weight: 900;text-transform: uppercase;text-align: left;margin: 0;margin-bottom: 16px;"> |
||||
|
Car Workshop Management |
||||
|
</h2> |
||||
|
<h3 class="oe_slogan" style="font-size: 25px;color: #fff;font-weight: 600;text-align: left;opacity: 1;margin: 0 !important;"> |
||||
|
Car Workshop Management |
||||
|
</h3> |
||||
|
<h5 class="oe_slogan" style="text-align: left;background: #fff;width: 293px;padding: 10px;color: #080808 !important;opacity: 1 !important;font-weight: 600;font-size: 20px;"> |
||||
|
<a style="color: #080808 !important;" href="https://www.cybrosys.com">Cybrosys Technologies</a> |
||||
|
</h5> |
||||
|
</div> |
||||
|
</section> |
||||
|
<section class="oe_container" style="padding: 3% 0% 3% 15%;"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;"> |
||||
|
Overview |
||||
|
</h2> |
||||
|
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;"> |
||||
|
Car Workshop Management is a Cybrosys Generic Module to manage automobile workshop with |
||||
|
great ease. Keep track of everything, like vehicle owner details, |
||||
|
Works assigned, Bill details of service provided,etc.. |
||||
|
</h3> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
<section class="oe_container" style="background-image:url(https://www.cybrosys.com/images/odoo-index-banner.png); background-repeat:no-repeat; background-size:cover;padding: 19% 0% 30% 15%;"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;"> |
||||
|
Features |
||||
|
</h2> |
||||
|
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 18px;"> |
||||
|
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700"></i> |
||||
|
User Friendly Interface. |
||||
|
</h3> |
||||
|
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 18px;"> |
||||
|
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700"></i> |
||||
|
Effective Time management. |
||||
|
</h3><h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 18px;"> |
||||
|
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700"></i> |
||||
|
Separate Journal Configuration.. |
||||
|
</h3> |
||||
|
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 18px;"> |
||||
|
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700"></i> |
||||
|
Integrated with Accounting.</h3> |
||||
|
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 18px;"> |
||||
|
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700"></i> |
||||
|
High Scalability.</h3> |
||||
|
</div> |
||||
|
</section> |
||||
|
<section class="oe_container" style="padding: 3% 0% 0% 15%;"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;"> |
||||
|
Dashboard/All Vehicles |
||||
|
</h2> |
||||
|
<h3 class="oe_slogan" style="text-align: left;padding: 1% 0% 0% 0%;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;"> |
||||
|
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700"></i> |
||||
|
Whole Workshop Analysis |
||||
|
</h3> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<img src="8.png" alt="" style="width: 95%;"/> |
||||
|
</div> |
||||
|
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;"> |
||||
|
All works |
||||
|
</h2> |
||||
|
<h3>Goto Car Workshop -->Worksheet</h3> |
||||
|
<h3 class="oe_slogan" style="text-align: left;padding: 1% 0% 0% 0%;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;"> |
||||
|
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700"></i> |
||||
|
Organise all the works according to their Status. Works/Tasks assigned works using the kanban view and control deadlines in the calendar view.Each Work may have it's own stages. |
||||
|
</h3> |
||||
|
<h3>Kanban</h3> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<img src="7.png" alt="" style="width: 95%;"/> |
||||
|
</div> |
||||
|
<h3>Calendar</h3> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<img src="9.png" alt="" style="width: 95%;"/> |
||||
|
</div> |
||||
|
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;"> |
||||
|
Worksheet View |
||||
|
</h2> |
||||
|
<h3 class="oe_slogan" style="text-align: left;padding: 1% 0% 0% 0%;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;"> |
||||
|
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700"></i> |
||||
|
All details related to a work/task |
||||
|
</h3> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<img src="1.png" alt="" style="width: 95%;"/> |
||||
|
</div> |
||||
|
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;"> |
||||
|
Timesheet |
||||
|
</h2> |
||||
|
<h3>Goto Car Workshop >Worksheet >Timesheet</h3> |
||||
|
<h3 class="oe_slogan" style="text-align: left;padding: 1% 0% 0% 0%;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;"> |
||||
|
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700"></i> |
||||
|
In timesheet ,Planned work is the sub works related to main Work. By ticking 'Completed' that work will be automatically updated to Work done.<br/> |
||||
|
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700"></i> |
||||
|
Work done is the details of completed works.<br/> |
||||
|
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700"></i> |
||||
|
Hour spent is time taken for completed work(Work Done).<br/> |
||||
|
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700"></i> |
||||
|
Remaining Hour is total time left(Difference between Total Time and Hour Spent). |
||||
|
</h3> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<img src="2.png" alt="" style="width: 95%;"/> |
||||
|
</div> |
||||
|
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;"> |
||||
|
Report |
||||
|
</h2> |
||||
|
<h3 class="oe_slogan" style="text-align: left;padding: 1% 0% 0% 0%;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;"> |
||||
|
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700"></i> |
||||
|
Tabular Details of Vehicles |
||||
|
</h3> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<img src="10.png" alt="" style="width: 95%;"/> |
||||
|
</div> |
||||
|
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;"> |
||||
|
Settings |
||||
|
</h2> |
||||
|
<h3 class="oe_slogan" style="text-align: left;padding: 1% 0% 0% 0%;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;"> |
||||
|
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700"></i> |
||||
|
Configure Preferred journal for Invoicing |
||||
|
</h3> |
||||
|
<h3>Goto Car Workshop >Configuration >Settings </h3> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<img src="5.png" alt="" style="width: 95%;"/> |
||||
|
</div> |
||||
|
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;"> |
||||
|
Separate Journal |
||||
|
</h2> |
||||
|
<h3 class="oe_slogan" style="text-align: left;padding: 1% 0% 0% 0%;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;"> |
||||
|
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700"></i> |
||||
|
Invoices from the car workshop will be saved to Separate journal. |
||||
|
</h3> |
||||
|
<h3>Goto Car Workshop >Worksheet >Create Invoices </h3> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<img src="4.png" alt="" style="width: 95%;"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
<section class="oe_container" style="padding: 1% 0% 0% 3%;"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;"> |
||||
|
Our Service |
||||
|
</h2> |
||||
|
<div style="display:flex;padding-top: 20px;justify-content: space-between;"> |
||||
|
<div style="flex-basis: 18%;"> |
||||
|
<a href="https://www.cybrosys.com/odoo-customization-and-installation/" target="_blank"> |
||||
|
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;"> |
||||
|
<img src="https://www.cybrosys.com/images/odoo-customization.png" style="width: 100%;border-radius: 100%;"/> |
||||
|
</div> |
||||
|
<h3 class="oe_slogan" style="text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;"> |
||||
|
Odoo <br/>Customization |
||||
|
</h3> |
||||
|
</a> |
||||
|
</div> |
||||
|
<div style="flex-basis: 18%;"> |
||||
|
<a href="https://www.cybrosys.com/odoo-erp-implementation/" target="_blank"> |
||||
|
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;"> |
||||
|
<img src="https://www.cybrosys.com/images/odoo-erp-implementation.png" style="width: 100%;border-radius: 100%;"/> |
||||
|
</div> |
||||
|
<h3 class="oe_slogan" style="text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;"> |
||||
|
Odoo <br/>Implementation |
||||
|
</h3> |
||||
|
</a> |
||||
|
</div> |
||||
|
<div style="flex-basis: 18%;"> |
||||
|
<a href="https://www.cybrosys.com/odoo-erp-integration/" target="_blank"> |
||||
|
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;"> |
||||
|
<img src="https://www.cybrosys.com/images/odoo-erp-integration.png" style="width: 100%;border-radius: 100%;"/> |
||||
|
</div> |
||||
|
<h3 class="oe_slogan" style="text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;"> |
||||
|
Odoo <br/>Integration |
||||
|
</h3> |
||||
|
</a> |
||||
|
</div> |
||||
|
<div style="flex-basis: 18%;"> |
||||
|
<a href="https://www.cybrosys.com/odoo-erp-support/" target="_blank"> |
||||
|
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;"> |
||||
|
<img src="https://www.cybrosys.com/images/odoo-erp-support.png" style="width: 100%;border-radius: 100%;"/> |
||||
|
</div> |
||||
|
<h3 class="oe_slogan" style="text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;"> |
||||
|
Odoo <br/>Support |
||||
|
</h3> |
||||
|
</a> |
||||
|
</div> |
||||
|
<div style="flex-basis: 18%;"> |
||||
|
<a href="https://www.cybrosys.com/hire-odoo-developer/" target="_blank"> |
||||
|
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;"> |
||||
|
<img src="https://www.cybrosys.com/images/hire-odoo-developer.png" style="width: 100%;border-radius: 100%;"/> |
||||
|
</div> |
||||
|
<h3 class="oe_slogan" style="text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;"> |
||||
|
Hire <br/>Odoo Developer |
||||
|
</h3> |
||||
|
</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
<section class="oe_container" style="padding: 3% 0% 0% 3%;"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;"> |
||||
|
Our Industries |
||||
|
</h2> |
||||
|
<div style="display:flex;justify-content: space-between;flex-wrap:wrap;"> |
||||
|
<div style="flex-basis: 32%;padding-top: 20px;"> |
||||
|
<a href="https://www.cybrosys.com/odoo/industries/best-trading-erp/" target="_blank"> |
||||
|
<div style="width:30%; float:left;"> |
||||
|
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;"> |
||||
|
<img src="https://www.cybrosys.com/images/odoo-index-industry-1.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div style="width:70%;float:left;"> |
||||
|
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:600;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;"> |
||||
|
Trading |
||||
|
</h3> |
||||
|
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;"> |
||||
|
Easily procure and sell your products. |
||||
|
</h3> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
<div style="flex-basis: 32%;padding-top: 20px;"> |
||||
|
<a href="https://www.cybrosys.com/odoo/industries/manufacturing-erp-software/" target="_blank"> |
||||
|
<div style="width:30%; float:left;"> |
||||
|
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;"> |
||||
|
<img src="https://www.cybrosys.com/images/odoo-index-industry-2.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div style="width:70%;float:left;"> |
||||
|
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:600;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;"> |
||||
|
Manufacturing |
||||
|
</h3> |
||||
|
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;"> |
||||
|
Plan, track and schedule your operations. |
||||
|
</h3> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
<div style="flex-basis: 32%;padding-top: 20px;"> |
||||
|
<a href="https://www.cybrosys.com/odoo/industries/restaurant-management/" target="_blank"> |
||||
|
<div style="width:30%; float:left;"> |
||||
|
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;"> |
||||
|
<img src="https://www.cybrosys.com/images/odoo-index-industry-3.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div style="width:70%;float:left;"> |
||||
|
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:600;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;"> |
||||
|
Restaurant |
||||
|
</h3> |
||||
|
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;"> |
||||
|
Run your bar or restaurant methodical. |
||||
|
</h3> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
<div style="flex-basis: 32%;padding-top: 20px;"> |
||||
|
<a href="https://www.cybrosys.com/odoo/industries/pos/" target="_blank"> |
||||
|
<div style="width:30%; float:left;"> |
||||
|
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;"> |
||||
|
<img src="https://www.cybrosys.com/images/odoo-index-industry-4.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/> |
||||
|
|
||||
|
</div> |
||||
|
</div> |
||||
|
<div style="width:70%;float:left;"> |
||||
|
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:600;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;"> |
||||
|
POS |
||||
|
</h3> |
||||
|
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;"> |
||||
|
Easy configuring and convivial selling. |
||||
|
</h3> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
<div style="flex-basis: 32%;padding-top: 20px;"> |
||||
|
<a href="https://www.cybrosys.com/odoo/industries/ecommerce-website/" target="_blank"> |
||||
|
<div style="width:30%; float:left;"> |
||||
|
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;"> |
||||
|
<img src="https://www.cybrosys.com/images/odoo-index-industry-5.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/> |
||||
|
|
||||
|
</div> |
||||
|
</div> |
||||
|
<div style="width:70%;float:left;"> |
||||
|
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:600;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 0px;margin-left: 16px;"> |
||||
|
E-commerce & Website |
||||
|
</h3> |
||||
|
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;"> |
||||
|
Mobile friendly, awe-inspiring product pages. |
||||
|
</h3> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
<div style="flex-basis: 32%;padding-top: 20px;"> |
||||
|
<a href="https://www.cybrosys.com/odoo/industries/hotel-management-erp/" target="_blank"> |
||||
|
<div style="width:30%; float:left;"> |
||||
|
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;"> |
||||
|
<img src="https://www.cybrosys.com/images/odoo-index-industry-6.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/> |
||||
|
|
||||
|
</div> |
||||
|
</div> |
||||
|
<div style="width:70%;float:left;"> |
||||
|
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:600;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;"> |
||||
|
Hotel Management |
||||
|
</h3> |
||||
|
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;"> |
||||
|
An all-inclusive hotel management application. |
||||
|
</h3> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
<div style="flex-basis: 32%;padding-top: 20px;"> |
||||
|
<a href="https://www.cybrosys.com/odoo/industries/education-erp-software/" target="_blank"> |
||||
|
<div style="width:30%; float:left;"> |
||||
|
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;"> |
||||
|
<img src="https://www.cybrosys.com/images/odoo-index-industry-7.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/> |
||||
|
|
||||
|
</div> |
||||
|
</div> |
||||
|
<div style="width:70%;float:left;"> |
||||
|
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:600;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;"> |
||||
|
Education |
||||
|
</h3> |
||||
|
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;"> |
||||
|
A Collaborative platform for educational management. |
||||
|
</h3> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
<div style="flex-basis: 32%;padding-top: 20px;"> |
||||
|
<a href="https://www.cybrosys.com/odoo/industries/service-management/" target="_blank"> |
||||
|
<div style="width:30%; float:left;"> |
||||
|
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;"> |
||||
|
<img src="https://www.cybrosys.com/images/odoo-index-industry-8.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/> |
||||
|
|
||||
|
</div> |
||||
|
</div> |
||||
|
<div style="width:70%;float:left;"> |
||||
|
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:600;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;"> |
||||
|
Service Management |
||||
|
</h3> |
||||
|
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;"> |
||||
|
Keep track of services and invoice accordingly. |
||||
|
</h3> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
<section class="oe_container" style="background-image:url(https://www.cybrosys.com/images/odoo-index-footer-bg.png); background-repeat:no-repeat; background-size:100%;padding: 13% 0% 6% 0%;"> |
||||
|
<div class="oe_slogan" style="margin-top:10px !important;margin-bottom: 0px;"> |
||||
|
<div class="col-md-6" style="float:left; padding:20px;"> <h4><i class="fa fa-envelope"></i>Email us </h4> <p>odoo@cybrosys.com</p> </div> <div class="col-md-6" style="float:left; padding:20px;"> <h4><i class="fa fa-phone"></i> Contact Us </h4> <a href="https://www.cybrosys.com/contact/" target="_blank"> www.cybrosys.com</a> </div> |
||||
|
<br> |
||||
|
<img src="https://www.cybrosys.com/images/logo.png" style="width: 190px; margin-bottom: 25px;margin-top: 30px;" class="center-block"> |
||||
|
<div> |
||||
|
<a href="https://twitter.com/cybrosys" target="_blank"><i class="fa fa-2x fa-twitter" style="color:white;background: #00a0d1;width:35px;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td> |
||||
|
<a href="https://www.linkedin.com/company/cybrosys-technologies-pvt-ltd" target="_blank"><i class="fa fa-2x fa-linkedin" style="color:white;background: #31a3d6;width:35px;padding-left: 3px;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td> |
||||
|
<a href="https://www.facebook.com/cybrosystechnologies" target="_blank"><i class="fa fa-2x fa-facebook" style="color:white;background: #3b5998;width:35px; ;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td> |
||||
|
<a href="https://plus.google.com/106641282743045431892/about" target="_blank"><i class="fa fa-2x fa-google-plus" style="color:white;background: #c53c2c;width:35px;padding-left: 3px;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td> |
||||
|
<a href="https://in.pinterest.com/cybrosys" target="_blank"><i class="fa fa-2x fa-pinterest" style="color:white;background: #ac0f18;width:35px;padding-left: 3px;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
@ -0,0 +1,40 @@ |
|||||
|
|
||||
|
.oe_kanban_project_avatars img { |
||||
|
width: 30px; |
||||
|
border-radius: 2px; |
||||
|
-moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); |
||||
|
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); |
||||
|
-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); |
||||
|
} |
||||
|
.oe_form_gantt_avatars:after { |
||||
|
font-family: "mnmliconsRegular" !important; |
||||
|
font-size: 21px; |
||||
|
font-weight: 300 !important; |
||||
|
content: "y"; |
||||
|
top: 3px; |
||||
|
position: relative; |
||||
|
} |
||||
|
|
||||
|
.openerp .oe_kanban_view .oe_kanban_project { |
||||
|
width: 250px; |
||||
|
min-height: 160px !important; |
||||
|
cursor: default; |
||||
|
} |
||||
|
|
||||
|
.openerp .oe_percent strong:after { |
||||
|
content: "%"; |
||||
|
} |
||||
|
|
||||
|
.openerp .oe_margin_top_8 { |
||||
|
margin-top: 8px; |
||||
|
} |
||||
|
.openerp .oe_kanban_project .oe_kanban_project_list .col-md-6 a{ |
||||
|
margin-left: 5px; |
||||
|
} |
||||
|
|
||||
|
/* Kanban status as label in project stage form view */ |
||||
|
.openerp label.oe_project_kanban_legend { |
||||
|
min-width: inherit !important; |
||||
|
margin-top: 6px; |
||||
|
margin-right: 8px; |
||||
|
} |
@ -0,0 +1,38 @@ |
|||||
|
.o_kanban_view.o_kanban_dashboard.o_project_kanban { |
||||
|
.o_project_kanban_boxes { |
||||
|
display: flex; |
||||
|
flex-flow: row wrap; |
||||
|
justify-content: space-between; |
||||
|
|
||||
|
.o_project_kanban_box { |
||||
|
position: relative; |
||||
|
text-align: center; |
||||
|
padding: 0 0 0 0; |
||||
|
margin: 0 5px; |
||||
|
|
||||
|
.o_value { |
||||
|
font-weight: 800; |
||||
|
} |
||||
|
|
||||
|
> div { |
||||
|
font-weight: 500; |
||||
|
|
||||
|
button.o_needaction { |
||||
|
font-size: small; |
||||
|
font-weight: 400; |
||||
|
margin-left: 4px; |
||||
|
@include o-hover-opacity(0.5, 1); |
||||
|
|
||||
|
&:before { |
||||
|
content: "/ "; |
||||
|
} |
||||
|
|
||||
|
&:after { |
||||
|
content: "\f086"; |
||||
|
font: normal normal normal 14px/1 FontAwesome; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,213 @@ |
|||||
|
<odoo> |
||||
|
<record id="car_car_form" model="ir.ui.view"> |
||||
|
<field name="name">car.car.form</field> |
||||
|
<field name="model">car.car</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<form string="Vehicle"> |
||||
|
<header> |
||||
|
<field name="state" widget="statusbar" clickable="True"/> |
||||
|
</header> |
||||
|
<sheet string="Vehicle"> |
||||
|
<div class="oe_button_box" name="button_box" groups="base.group_user"> |
||||
|
|
||||
|
<button class="oe_stat_button" |
||||
|
icon="fa-tasks" |
||||
|
name="%(fleet_car_workshop.worksheet_action_super_button)d" |
||||
|
type="action"> |
||||
|
<field string="Tasks" name="task_count" widget="statinfo"/> |
||||
|
</button> |
||||
|
<button class="oe_stat_button" name="attachment_tree_views" type="object" icon="fa-files-o"> |
||||
|
<field string="Documents" name="doc_count" widget="statinfo"/> |
||||
|
</button> |
||||
|
<button name="toggle_active" type="object" |
||||
|
confirm="(Un)archiving a project automatically (un)archives its tasks and issues. Do you want to proceed?" |
||||
|
class="oe_stat_button" icon="fa-archive"> |
||||
|
<field name="active" widget="boolean_button" |
||||
|
options='{"terminology": "archive"}'/> |
||||
|
</button> |
||||
|
|
||||
|
</div> |
||||
|
<field name="image_128" widget='image' class="oe_avatar"/> |
||||
|
<div class="oe_title"> |
||||
|
<h1> |
||||
|
<field name="vehicle_id" placeholder="Vehicle Name"/> |
||||
|
</h1> |
||||
|
<div name="options_active" class="oe_edit_only"> |
||||
|
<div> |
||||
|
<field name="use_tasks" class="oe_inline" string="Use Tasks"/> |
||||
|
<label for="use_tasks" class="oe_inline"/> |
||||
|
<span attrs="{'invisible':[('use_tasks', '=', False)]}">as</span> |
||||
|
<field name="label_tasks" class="oe_inline oe_input_align" |
||||
|
attrs="{'invisible': [('use_tasks', '=', False)]}"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<notebook> |
||||
|
<page string="Settings"> |
||||
|
<group> |
||||
|
<field name="partner_id" string="Customer"/> |
||||
|
</group> |
||||
|
</page> |
||||
|
|
||||
|
</notebook> |
||||
|
</sheet> |
||||
|
<div class="oe_chatter"> |
||||
|
<field name="message_follower_ids" widget="mail_followers" groups="base.group_user"/> |
||||
|
<field name="message_ids" widget="mail_thread"/> |
||||
|
</div> |
||||
|
</form> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="view_car_car_filter" model="ir.ui.view"> |
||||
|
<field name="name">car.car.select</field> |
||||
|
<field name="model">car.car</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<search string="Search Vehicle"> |
||||
|
<field name="vehicle_id" string="Vehicle Name"/> |
||||
|
<filter string="Open" name="Current" domain="[('state', '=','open')]"/> |
||||
|
<filter string="Pending" name="Pending" domain="[('state', '=','pending')]"/> |
||||
|
<separator/> |
||||
|
<separator/> |
||||
|
<filter string="Archived" name="inactive" domain="[('active','=',False)]"/> |
||||
|
<field name="partner_id" string="Contact" filter_domain="[('partner_id', 'child_of', self)]"/> |
||||
|
<group expand="0" string="Group By"> |
||||
|
<filter string="Contact" name="Partner" context="{'group_by':'partner_id'}"/> |
||||
|
</group> |
||||
|
</search> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record model="ir.ui.view" id="view_car_car_kanban"> |
||||
|
<field name="name">car.car.kanban</field> |
||||
|
<field name="model">car.car</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<kanban class="oe_background_grey o_kanban_dashboard o_project_kanban"> |
||||
|
<field name="vehicle_id"/> |
||||
|
<field name="use_tasks"/> |
||||
|
<field name="color"/> |
||||
|
<field name="task_count"/> |
||||
|
<field name="label_tasks"/> |
||||
|
<field name="task_ids"/> |
||||
|
<field name="doc_count"/> |
||||
|
<field name="image_128"/> |
||||
|
<field name="id"/> |
||||
|
<templates> |
||||
|
<t t-name="kanban-box"> |
||||
|
<div t-attf-class="#{!selection_mode ? kanban_color(record.color.raw_value) : ''} oe_kanban_global_click"> |
||||
|
<div class="o_project_kanban_main"> |
||||
|
<div class="o_kanban_card_content"> |
||||
|
<div class="o_kanban_image"> |
||||
|
<img t-att-src="kanban_image('car.car', 'image_128', record.id.raw_value)" |
||||
|
alt="Vehicle" class="o_image_64_contain"/> |
||||
|
</div> |
||||
|
<div class="o_kanban_primary_left"> |
||||
|
<div class="oe_kanban_details"> |
||||
|
<div class="o_primary"> |
||||
|
<span> |
||||
|
<t t-esc="record.vehicle_id.value"/> |
||||
|
</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="o_kanban_card_manage_pane o_invisible"> |
||||
|
<div class="o_kanban_card_manage_pane dropdown-menu" role="menu"> |
||||
|
<div class="o_kanban_card_manage_section o_kanban_manage_reports"> |
||||
|
<div role="menuitem" groups="project.group_project_manager"> |
||||
|
<a type="edit">Settings</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div role="menuitem" aria-haspopup="true" |
||||
|
class="o_no_padding_kanban_colorpicker"> |
||||
|
<ul class="oe_kanban_colorpicker" data-field="color" role="popup"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
</div> |
||||
|
<div class="o_project_kanban_manage"> |
||||
|
<a class="o_kanban_manage_toggle_button" href="#"> |
||||
|
<i class="fa fa-ellipsis-v" role="img" aria-label="Manage" title="Manage"/> |
||||
|
</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="o_project_kanban_boxes"> |
||||
|
<div t-if="record.use_tasks.raw_value" class="o_project_kanban_box"> |
||||
|
<a name="%(fleet_car_workshop.worksheet_action_super_button)d" type="action"> |
||||
|
<span class="o_value"> |
||||
|
<t t-esc="record.task_count.value"/> |
||||
|
</span> |
||||
|
<span class="o_label"> |
||||
|
<t t-esc="record.label_tasks.value"/> |
||||
|
</span> |
||||
|
</a> |
||||
|
|
||||
|
</div> |
||||
|
<a t-if="record.doc_count.raw_value" class="o_project_kanban_box" |
||||
|
name="attachment_tree_views" type="object"> |
||||
|
<span class="o_value"> |
||||
|
<t t-esc="record.doc_count.value"/> |
||||
|
</span> |
||||
|
<span class="o_label">Documents</span> |
||||
|
</a> |
||||
|
</div> |
||||
|
|
||||
|
</div> |
||||
|
</t> |
||||
|
</templates> |
||||
|
</kanban> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="view_car_car_tree" model="ir.ui.view"> |
||||
|
<field name="name">car.car.tree</field> |
||||
|
<field name="model">car.car</field> |
||||
|
<field name="field_parent">child_ids</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<tree decoration-info="state in ('draft','pending')" decoration-muted="state in ('close','cancelled')" |
||||
|
string="Vehicles"> |
||||
|
<field name="vehicle_id" string="Vehicle Name"/> |
||||
|
<field name="partner_id" string="Contact"/> |
||||
|
<field name="state"/> |
||||
|
</tree> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="open_view_vehicle_all" model="ir.actions.act_window"> |
||||
|
<field name="name">Vehicles</field> |
||||
|
<field name="res_model">car.car</field> |
||||
|
<field name="domain">[]</field> |
||||
|
<field name="view_mode">kanban,form</field> |
||||
|
<field name="search_view_id" ref="view_car_car_filter"/> |
||||
|
<field name="context">{'search_default_Current': 1}</field> |
||||
|
<field name="help" type="html"> |
||||
|
<p class="oe_view_nocontent_create"> |
||||
|
Create a new project. |
||||
|
</p> |
||||
|
<p> |
||||
|
Organize your activities (plan tasks, track issues, invoice timesheets) for internal, personal or |
||||
|
customer projects. |
||||
|
</p> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="config_view_vehicle_all" model="ir.actions.act_window"> |
||||
|
<field name="name">Vehicles</field> |
||||
|
<field name="res_model">car.car</field> |
||||
|
<field name="domain">[]</field> |
||||
|
<field name="view_mode">tree,form</field> |
||||
|
<field name="search_view_id" ref="view_car_car_filter"/> |
||||
|
<field name="context">{'search_default_Current': 1}</field> |
||||
|
<field name="help" type="html"> |
||||
|
<p class="oe_view_nocontent_create"> |
||||
|
Create a new vehicle. |
||||
|
</p> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<menuitem name="Dashboard" parent="main_workshop_menu" id="workshop_vehicles" sequence="1" |
||||
|
action="open_view_vehicle_all"/> |
||||
|
<menuitem name="Vehicles" action="config_view_vehicle_all" id="config_vehicle_view_action" |
||||
|
parent="menu_worksheet_config"/> |
||||
|
</odoo> |
@ -0,0 +1,40 @@ |
|||||
|
<odoo> |
||||
|
<record id="car_workshop_res_config_settings_view_form" model="ir.ui.view"> |
||||
|
<field name="name">res.config.settings.view.form.inherit.car.workshop</field> |
||||
|
<field name="model">res.config.settings</field> |
||||
|
<field name="priority" eval="91"/> |
||||
|
<field name="inherit_id" ref="base.res_config_settings_view_form"/> |
||||
|
<field name="arch" type="xml"> |
||||
|
<xpath expr="//div[hasclass('settings')]" position="inside"> |
||||
|
<div class="app_settings_block" data-string="Car Workshop" id="car_workshop" string="Car Workshop" |
||||
|
data-key="fleet_car_workshop"> |
||||
|
<h2>Car Work Shop</h2> |
||||
|
<div class="row mt16 o_settings_container"> |
||||
|
<div class="col-12 col-lg-6 o_setting_box"> |
||||
|
<div class="o_setting_left_pane"/> |
||||
|
<div class="o_setting_right_pane"> |
||||
|
<span class="o_form_label">Seperate Journal</span> |
||||
|
<div class="text-muted content-group mt16"> |
||||
|
<span>Choose Journal</span> |
||||
|
<field name="invoice_journal_type" class="text-center oe_inline"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</xpath> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="car_workshop_config_settings_action" model="ir.actions.act_window"> |
||||
|
<field name="name">Settings</field> |
||||
|
<field name="type">ir.actions.act_window</field> |
||||
|
<field name="res_model">res.config.settings</field> |
||||
|
<field name="view_mode">form</field> |
||||
|
<field name="target">inline</field> |
||||
|
<field name="context">{'module' : 'fleet_car_workshop'}</field> |
||||
|
</record> |
||||
|
|
||||
|
<menuitem action="car_workshop_config_settings_action" id="menu_workshop_config_settings_act" |
||||
|
string="Settings" sequence="1" parent="menu_worksheet_config"/> |
||||
|
</odoo> |
@ -0,0 +1,15 @@ |
|||||
|
<odoo> |
||||
|
<record model="ir.actions.act_window" id="action_car_workshop_report"> |
||||
|
<field name="name">Worksheets</field> |
||||
|
<field name="res_model">car.workshop</field> |
||||
|
<field name="view_mode">pivot,graph</field> |
||||
|
<field name="help" type="html"> |
||||
|
<p> |
||||
|
Odoo's car workshop management allows you to manage the pipeline of your work efficiently. You can track |
||||
|
progress, discuss on works, attach documents, etc. |
||||
|
</p> |
||||
|
</field> |
||||
|
</record> |
||||
|
<menuitem name="Report" id="report_worksheet" parent="main_workshop_menu" sequence="3"/> |
||||
|
<menuitem name="Worksheet" id="vehicle_report" parent="report_worksheet" action="action_car_workshop_report"/> |
||||
|
</odoo> |
@ -0,0 +1,53 @@ |
|||||
|
<odoo> |
||||
|
<data> |
||||
|
<record model="ir.ui.view" id="planned_work_form_view"> |
||||
|
<field name="name">planned.work.form</field> |
||||
|
<field name="model">planned.work</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<form string="Planned Work"> |
||||
|
<group> |
||||
|
<group> |
||||
|
<field name="planned_work"/> |
||||
|
<field name="time_spent" widget="float_time"/> |
||||
|
</group> |
||||
|
<group> |
||||
|
<field name="responsible"/> |
||||
|
<field name="work_date"/> |
||||
|
<field name="work_cost"/> |
||||
|
</group> |
||||
|
</group> |
||||
|
</form> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record model="ir.ui.view" id="material_used_form_view"> |
||||
|
<field name="name">material.used.form</field> |
||||
|
<field name="model">material.used</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<form string="Work Done"> |
||||
|
<group> |
||||
|
<group> |
||||
|
<field name="material"/> |
||||
|
</group> |
||||
|
<group> |
||||
|
<field name="amount"/> |
||||
|
<field name="price"/> |
||||
|
</group> |
||||
|
</group> |
||||
|
</form> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record model="ir.ui.view" id="material_used_tree_view"> |
||||
|
<field name="name">material.used.tree</field> |
||||
|
<field name="model">material.used</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<tree string="Materials" editable="bottom"> |
||||
|
<field name="material"/> |
||||
|
<field name="amount"/> |
||||
|
<field name="price"/> |
||||
|
</tree> |
||||
|
</field> |
||||
|
</record> |
||||
|
</data> |
||||
|
</odoo> |
@ -0,0 +1,11 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<data> |
||||
|
<template id="assets_backend" name="vehicle assets" inherit_id="web.assets_backend"> |
||||
|
<xpath expr="." position="inside"> |
||||
|
<link rel="stylesheet" href="/fleet_car_workshop/static/src/css/vehicles.css"/> |
||||
|
<link rel="stylesheet" href="/fleet_car_workshop/static/src/less/car_dashboard.less"/> |
||||
|
</xpath> |
||||
|
</template> |
||||
|
</data> |
||||
|
</odoo> |
@ -0,0 +1,121 @@ |
|||||
|
<odoo> |
||||
|
<data> |
||||
|
<record id="worksheet_stages_form" model="ir.ui.view"> |
||||
|
<field name="name">worksheet.stages.form</field> |
||||
|
<field name="model">worksheet.stages</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<form string="Worksheet Stages"> |
||||
|
<sheet> |
||||
|
<div class="oe_title"> |
||||
|
<div class="oe_edit_only"> |
||||
|
<label for="name"/> |
||||
|
</div> |
||||
|
<h1> |
||||
|
<field name="name"/> |
||||
|
</h1> |
||||
|
</div> |
||||
|
<group> |
||||
|
<group> |
||||
|
<field name="sequence" groups="base.group_no_one"/> |
||||
|
</group> |
||||
|
<group> |
||||
|
<field name="fold"/> |
||||
|
</group> |
||||
|
</group> |
||||
|
<group string="Vehicles using this stage"> |
||||
|
<group> |
||||
|
<field name="vehicle_ids" widget="many2many_tags"/> |
||||
|
</group> |
||||
|
</group> |
||||
|
<group> |
||||
|
<p class="text-muted" colspan="2"> |
||||
|
You can also add a description to help your co-workers understand the meaning and |
||||
|
purpose of the stage. |
||||
|
</p> |
||||
|
<field name="description" placeholder="Add a description..." nolabel="1" colspan="2"/> |
||||
|
</group> |
||||
|
</sheet> |
||||
|
</form> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="worksheet_stages_tree" model="ir.ui.view"> |
||||
|
<field name="name">worksheet.stages.tree</field> |
||||
|
<field name="model">worksheet.stages</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<tree string="Task Stage"> |
||||
|
<field name="sequence" widget="handle" groups="base.group_no_one"/> |
||||
|
<field name="name"/> |
||||
|
<field name="fold"/> |
||||
|
<field name="description"/> |
||||
|
<field name="vehicle_ids" widget="many2many_tags"/> |
||||
|
</tree> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="worksheet_stages_action" model="ir.actions.act_window"> |
||||
|
<field name="name">Stages</field> |
||||
|
<field name="res_model">worksheet.stages</field> |
||||
|
<field name="view_mode">tree,form</field> |
||||
|
</record> |
||||
|
|
||||
|
<record model="ir.ui.view" id="worksheet_tags_tree_view"> |
||||
|
<field name="name">Tags</field> |
||||
|
<field name="model">worksheet.tags</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<tree editable="bottom"> |
||||
|
<field name="name"/> |
||||
|
</tree> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record model="ir.ui.view" id="worksheet_tags_form_view"> |
||||
|
<field name="name">Tags</field> |
||||
|
<field name="model">worksheet.tags</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<form string="Tags"> |
||||
|
<sheet> |
||||
|
<group col="2"> |
||||
|
<group> |
||||
|
<field name="name"/> |
||||
|
</group> |
||||
|
<group> |
||||
|
<field name="color"/> |
||||
|
</group> |
||||
|
</group> |
||||
|
</sheet> |
||||
|
|
||||
|
</form> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
|
||||
|
<record id="worksheet_tags_action" model="ir.actions.act_window"> |
||||
|
<field name="name">Tags</field> |
||||
|
<field name="res_model">worksheet.tags</field> |
||||
|
<field name="view_mode">tree,form</field> |
||||
|
<field name="help" type="html"> |
||||
|
<p class="oe_view_nocontent_create"> |
||||
|
Click to add a new tag. |
||||
|
</p> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="workshop_services" model="ir.actions.act_window"> |
||||
|
<field name="name">Service-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_services":'service'}</field> |
||||
|
<field name="help" type="html"> |
||||
|
<p class="oe_view_nocontent_create"> |
||||
|
Click to define a new product. |
||||
|
</p> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<menuitem action="worksheet_tags_action" id="menu_worksheet_tags_act" parent="menu_worksheet_config"/> |
||||
|
<menuitem action="worksheet_stages_action" id="menu_worksheet_stages_action" parent="menu_worksheet_config"/> |
||||
|
<menuitem action="workshop_services" id="menu_workshop_product_services" parent="menu_worksheet_config"/> |
||||
|
</data> |
||||
|
</odoo> |
@ -0,0 +1,320 @@ |
|||||
|
<odoo> |
||||
|
<data> |
||||
|
<record id="ir_cron_scheduler_demo_action" model="ir.cron"> |
||||
|
<field name="name">Demo scheduler</field> |
||||
|
<field name="user_id" ref="base.user_root"/> |
||||
|
<field name="interval_number">1</field> |
||||
|
<field name="interval_type">minutes</field> |
||||
|
<field name="numbercall">-1</field> |
||||
|
<field eval="False" name="doall"/> |
||||
|
<field name="model_id" ref="fleet_car_workshop.model_car_workshop"/> |
||||
|
<field name="state">code</field> |
||||
|
<field name="code">model.process_demo_scheduler_queue()</field> |
||||
|
</record> |
||||
|
|
||||
|
<record model="ir.ui.view" id="worksheet_form_view"> |
||||
|
<field name="name">worksheet.form.view</field> |
||||
|
<field name="model">car.workshop</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<form string="Worksheet"> |
||||
|
<header> |
||||
|
<button name="workshop_create_invoices" string="Create Invoices" type="object" |
||||
|
class="btn-primary" states="waiting"/> |
||||
|
<button class="btn-primary" name="cancel" string="Cancel" type="object" states="waiting"/> |
||||
|
<field name="state" widget="statusbar" statusbar_visible="workshop_create_invoices,cancel"/> |
||||
|
</header> |
||||
|
<header> |
||||
|
<field name="stage_id" widget="statusbar" clickable="True" |
||||
|
options="{'fold_field': 'fold'}"/> |
||||
|
</header> |
||||
|
|
||||
|
<sheet string="Worksheet"> |
||||
|
<div class="oe_button_box" name="button_box"> |
||||
|
<button class="oe_stat_button" type="object" name="get_invoices" |
||||
|
icon="fa-pencil-square-o"> |
||||
|
<field string="Invoices" name="invoice_count" widget="statinfo"/> |
||||
|
</button> |
||||
|
</div> |
||||
|
<field name="kanban_state" widget="kanban_state_selection"/> |
||||
|
<div class="oe_title"> |
||||
|
<h1 class="o_row"> |
||||
|
<field name="company_id" invisible="1"/> |
||||
|
<field name="priority" widget="priority"/> |
||||
|
<field name="name" placeholder="Title..."/> |
||||
|
</h1> |
||||
|
</div> |
||||
|
<group> |
||||
|
<group> |
||||
|
<field name="vehicle_id"/> |
||||
|
<field name="user_id"/> |
||||
|
</group> |
||||
|
<group> |
||||
|
<field name="date_deadline"/> |
||||
|
<field name="tag_ids" widget="many2many_tags"/> |
||||
|
<field name="progress" widget="progressbar"/> |
||||
|
</group> |
||||
|
</group> |
||||
|
<notebook> |
||||
|
<page name="description_page" string="Description"> |
||||
|
<field name="description" type="html"/> |
||||
|
<div class="oe_clear"/> |
||||
|
</page> |
||||
|
<page name="timesheet_page" string="Timesheets"> |
||||
|
<group string="Planned/Ordered Work"> |
||||
|
<field name="planned_works"> |
||||
|
<tree string="Planned Work" editable="bottom"> |
||||
|
<field name="planned_work"/> |
||||
|
<field name="time_spent" sum="Estimated Time" widget="float_time"/> |
||||
|
<field name="work_date"/> |
||||
|
<field name="responsible"/> |
||||
|
<field name="work_cost"/> |
||||
|
<field name="completed"/> |
||||
|
</tree> |
||||
|
</field> |
||||
|
</group> |
||||
|
<group string="Work Done"> |
||||
|
<field name="works_done"> |
||||
|
<tree string="Planned Work" editable="bottom"> |
||||
|
<field name="planned_work" string="Work Done"/> |
||||
|
<field name="duration" sum="Estimated Time" widget="float_time"/> |
||||
|
<field name="work_date2"/> |
||||
|
<field name="responsible" string="User"/> |
||||
|
<field name="work_cost"/> |
||||
|
</tree> |
||||
|
</field> |
||||
|
</group> |
||||
|
<group string="Materials Used"> |
||||
|
<field name="materials_used"/> |
||||
|
</group> |
||||
|
<group> |
||||
|
<field name="amount_total"/> |
||||
|
</group> |
||||
|
<group class="oe_subtotal_footer oe_right" name="project_hours"> |
||||
|
<field name="effective_hour" widget="float_time"/> |
||||
|
<field name="remaining_hour" class="oe_subtotal_footer_separator" |
||||
|
widget="float_time"/> |
||||
|
</group> |
||||
|
</page> |
||||
|
<page string="Extra Info"> |
||||
|
|
||||
|
<group col="4"> |
||||
|
<field name="sequence"/> |
||||
|
<field name="partner_id"/> |
||||
|
|
||||
|
<field name="displayed_image_id"/> |
||||
|
</group> |
||||
|
<group col="4"> |
||||
|
<field name="date_assign"/> |
||||
|
<field name="date_last_stage_update"/> |
||||
|
</group> |
||||
|
|
||||
|
</page> |
||||
|
</notebook> |
||||
|
</sheet> |
||||
|
<div class="oe_chatter"> |
||||
|
<field name="message_follower_ids" widget="mail_followers" groups="base.group_user"/> |
||||
|
<field name="message_ids" widget="mail_thread"/> |
||||
|
</div> |
||||
|
</form> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record model="ir.ui.view" id="car_workshop_view_kanban"> |
||||
|
<field name="name">car workshop kanban</field> |
||||
|
<field name="model">car.workshop</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<kanban default_group_by="stage_id" class="o_kanban_small_column" records_draggable="1"> |
||||
|
<field name="color"/> |
||||
|
<field name="priority"/> |
||||
|
<field name="stage_id" options='{"group_by_tooltip": {"description": "Stage Description"}}'/> |
||||
|
<field name="user_id"/> |
||||
|
<field name="description"/> |
||||
|
<field name="sequence"/> |
||||
|
<field name="date_deadline"/> |
||||
|
<field name="tag_ids"/> |
||||
|
<field name="attachment_ids"/> |
||||
|
<field name="displayed_image_id"/> |
||||
|
<field name="active"/> |
||||
|
<progressbar field="kanban_state" |
||||
|
colors='{"done": "success", "blocked": "danger", "normal": "muted"}'/> |
||||
|
<templates> |
||||
|
<t t-name="kanban-box"> |
||||
|
<div t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_card oe_kanban_global_click"> |
||||
|
|
||||
|
<div class="o_dropdown_kanban dropdown" t-if="!selection_mode" groups="base.group_user"> |
||||
|
<a role="button" class="dropdown-toggle o-no-caret btn" data-toggle="dropdown" |
||||
|
data-display="static" href="#" aria-label="Dropdown menu" title="Dropdown menu"> |
||||
|
<span class="fa fa-ellipsis-v"/> |
||||
|
</a> |
||||
|
<div class="dropdown-menu" role="menu"> |
||||
|
<a t-if="widget.editable" role="menuitem" type="edit" class="dropdown-item">Edit |
||||
|
Task |
||||
|
</a> |
||||
|
<a t-if="widget.deletable" role="menuitem" type="delete" class="dropdown-item"> |
||||
|
Delete |
||||
|
</a> |
||||
|
<div role="separator" class="dropdown-divider"></div> |
||||
|
<ul class="oe_kanban_colorpicker" data-field="color"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="oe_kanban_content"> |
||||
|
<div> |
||||
|
<field name="tag_ids"/> |
||||
|
</div> |
||||
|
<div> |
||||
|
<strong> |
||||
|
<field name="name"/> |
||||
|
</strong> |
||||
|
</div> |
||||
|
<div class="text-muted"> |
||||
|
<field name="vehicle_id" invisible="context.get('default_vehicle_id', False)"/> |
||||
|
<t t-if="record.date_deadline.raw_value and record.date_deadline.raw_value lt (new Date())" |
||||
|
t-set="red">oe_kanban_text_red |
||||
|
</t> |
||||
|
<span t-attf-class="#{red || ''}"> |
||||
|
<i> |
||||
|
<field name="date_deadline"/> |
||||
|
</i> |
||||
|
</span> |
||||
|
</div> |
||||
|
<div class="oe_kanban_bottom_left"> |
||||
|
<field name="priority" widget="priority"/> |
||||
|
|
||||
|
</div> |
||||
|
<div class="oe_kanban_bottom_right"> |
||||
|
<img t-att-src="kanban_image('res.users', 'image_128', record.user_id.raw_value)" |
||||
|
t-att-title="record.user_id.value" width="24" height="24" |
||||
|
class="oe_kanban_avatar pull-right" alt="img"/> |
||||
|
<div class="pull-left"> |
||||
|
<field name="kanban_state" widget="kanban_state_selection"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div t-if="record.displayed_image_id.value"> |
||||
|
<field name="displayed_image_id" widget="attachment_image"/> |
||||
|
</div> |
||||
|
<div class="oe_clear"></div> |
||||
|
</div> |
||||
|
</t> |
||||
|
</templates> |
||||
|
</kanban> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
|
||||
|
<record model="ir.ui.view" id="worksheet_tree_view"> |
||||
|
<field name="name">worksheet.tree.view</field> |
||||
|
<field name="model">car.workshop</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<tree string="Worksheet"> |
||||
|
<field name="name"/> |
||||
|
<field name="vehicle_id" invisible="context.get('user_invisible', False)"/> |
||||
|
<field name="user_id" invisible="context.get('user_invisible', False)"/> |
||||
|
<field name="date_deadline" invisible="context.get('deadline_visible',True)"/> |
||||
|
<field name="amount_total"/> |
||||
|
<field name="stage_id" invisible="context.get('set_visible',False)"/> |
||||
|
<field name="tag_ids" widget="many2many_tags"/> |
||||
|
|
||||
|
</tree> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="worksheet_calender_view" model="ir.ui.view"> |
||||
|
<field name="name">worksheet.calender.view</field> |
||||
|
<field name="model">car.workshop</field> |
||||
|
<field eval="2" name="priority"/> |
||||
|
<field name="arch" type="xml"> |
||||
|
<calendar color="user_id" date_start="date_deadline" string="Tasks"> |
||||
|
<field name="name"/> |
||||
|
<field name="vehicle_id"/> |
||||
|
</calendar> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="view_car_workshop_pivot" model="ir.ui.view"> |
||||
|
<field name="name">car.workshop.pivot</field> |
||||
|
<field name="model">car.workshop</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<pivot string="Project Tasks"> |
||||
|
<field name="vehicle_id" type="row"/> |
||||
|
<field name="stage_id" type="col"/> |
||||
|
</pivot> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="view_car_workshop_graph" model="ir.ui.view"> |
||||
|
<field name="name">car.workshop.graph</field> |
||||
|
<field name="model">car.workshop</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<graph string="Project Tasks"> |
||||
|
<field name="vehicle_id"/> |
||||
|
<field name="stage_id"/> |
||||
|
</graph> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="view_vehicle_search_form" model="ir.ui.view"> |
||||
|
<field name="name">car.workshop.search.form</field> |
||||
|
<field name="model">car.workshop</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<search string="Worksheet"> |
||||
|
<field name="name" string="Tasks"/> |
||||
|
<field name="tag_ids"/> |
||||
|
<field name="partner_id"/> |
||||
|
<field name="vehicle_id"/> |
||||
|
<field name="user_id"/> |
||||
|
<field name="stage_id"/> |
||||
|
<filter string="My worksheets" name="my_worksheets" domain="[('user_id', '=', uid)]"/> |
||||
|
<filter string="Unassigned" name="unassigned" domain="[('user_id', '=', False)]"/> |
||||
|
<separator/> |
||||
|
<filter string="New" name="draft" domain="[('stage_id.sequence', '<=', 1)]"/> |
||||
|
<separator/> |
||||
|
<filter string="Archived" name="inactive" domain="[('active','=',False)]"/> |
||||
|
<group expand="0" string="Group By"> |
||||
|
<filter string="Vehicle" name="vehicle" context="{'group_by':'vehicle_id'}"/> |
||||
|
<filter string="Worksheets" name="name" context="{'group_by':'name'}"/> |
||||
|
<filter string="Assigned to" name="User" context="{'group_by':'user_id'}"/> |
||||
|
<filter string="Stage" name="Stage" context="{'group_by':'stage_id'}"/> |
||||
|
<separator/> |
||||
|
</group> |
||||
|
</search> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
|
||||
|
<record model="ir.actions.act_window" id="worksheet_action_super_button"> |
||||
|
<field name="name">Worksheets</field> |
||||
|
<field name="res_model">car.workshop</field> |
||||
|
<field name="view_mode">kanban,tree,form,calendar,pivot,graph</field> |
||||
|
<field name="context">{'search_default_vehicle_id': [active_id], |
||||
|
'default_vehicle_id':active_id} |
||||
|
</field> |
||||
|
<field name="search_view_id" ref="view_vehicle_search_form"/> |
||||
|
<field name="help" type="html"> |
||||
|
<p> |
||||
|
Odoo's car workshop management allows you to manage the pipeline of your work efficiently. You can |
||||
|
track progress, discuss on works, attach documents, etc. |
||||
|
</p> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
|
||||
|
<record model="ir.actions.act_window" id="action_car_workshop_filtered"> |
||||
|
<field name="name">Worksheets</field> |
||||
|
<field name="res_model">car.workshop</field> |
||||
|
<field name="view_mode">kanban,tree,form,calendar,pivot,graph</field> |
||||
|
<field name="help" type="html"> |
||||
|
<p> |
||||
|
Odoo's car workshop management allows you to manage the pipeline of your work efficiently. You can |
||||
|
track progress, discuss on works, attach documents, etc. |
||||
|
</p> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<menuitem id="main_workshop_menu" name="Car Workshop"/> |
||||
|
<menuitem name="Worksheets" id="search_worksheet" parent="main_workshop_menu" sequence="2"/> |
||||
|
<menuitem name="Worksheet" id="vehicle_works" parent="search_worksheet" action="action_car_workshop_filtered"/> |
||||
|
<menuitem id="menu_worksheet_config" name="Configuration" parent="main_workshop_menu" sequence="4"/> |
||||
|
</data> |
||||
|
</odoo> |