Browse Source

[ADD]Initial Commit

pull/81/head
SHEREEF PT 8 years ago
parent
commit
316d94e746
  1. 18
      fleet_car_workshop/README.rst
  2. 24
      fleet_car_workshop/__init__.py
  3. 55
      fleet_car_workshop/__openerp__.py
  4. 26
      fleet_car_workshop/models/__init__.py
  5. 370
      fleet_car_workshop/models/car_workshop.py
  6. 95
      fleet_car_workshop/models/config.py
  7. 130
      fleet_car_workshop/models/dashboard.py
  8. 57
      fleet_car_workshop/models/timesheet.py
  9. 22
      fleet_car_workshop/security/ir.model.access.csv
  10. 28
      fleet_car_workshop/security/workshop_security.xml
  11. BIN
      fleet_car_workshop/static/description/1.png
  12. BIN
      fleet_car_workshop/static/description/4.png
  13. BIN
      fleet_car_workshop/static/description/Screenshot from 2017-04-12 11:28:25.png
  14. BIN
      fleet_car_workshop/static/description/banner.jpg
  15. BIN
      fleet_car_workshop/static/description/calendar.png
  16. BIN
      fleet_car_workshop/static/description/cybro_logo.png
  17. BIN
      fleet_car_workshop/static/description/icon.png
  18. 166
      fleet_car_workshop/static/description/index.html
  19. BIN
      fleet_car_workshop/static/description/invoice.png
  20. BIN
      fleet_car_workshop/static/description/journal.png
  21. BIN
      fleet_car_workshop/static/description/kanban.png
  22. BIN
      fleet_car_workshop/static/description/report.png
  23. BIN
      fleet_car_workshop/static/description/timesheet.png
  24. BIN
      fleet_car_workshop/static/description/worksheet.png
  25. 40
      fleet_car_workshop/static/src/css/vehicles.css
  26. 98
      fleet_car_workshop/static/src/less/car_dashboard.less
  27. 194
      fleet_car_workshop/views/car_dashboard.xml
  28. 32
      fleet_car_workshop/views/config_setting.xml
  29. 16
      fleet_car_workshop/views/report.xml
  30. 59
      fleet_car_workshop/views/timesheet_view.xml
  31. 12
      fleet_car_workshop/views/vehicle.xml
  32. 90
      fleet_car_workshop/views/worksheet_stages.xml
  33. 289
      fleet_car_workshop/views/worksheet_views.xml
  34. 107
      fleet_car_workshop/views/workshop_data.xml

18
fleet_car_workshop/README.rst

@ -0,0 +1,18 @@
Car Workshop v9
===============
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.

24
fleet_car_workshop/__init__.py

@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
# Copyright (C) 2008-TODAY Cybrosys Technologies(<http://www.cybrosys.com>).
# Author: Nilmar Shereef(<http://www.cybrosys.com>)
# you can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# It is forbidden to publish, distribute, sublicense, or sell copies
# of the Software or modified copies of the Software.
#
# 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 <http://www.gnu.org/licenses/>.
#
##############################################################################
import models

55
fleet_car_workshop/__openerp__.py

@ -0,0 +1,55 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
# Copyright (C) 2008-TODAY Cybrosys Technologies(<http://www.cybrosys.com>).
# Author: Nilmar Shereef(<http://www.cybrosys.com>)
# you can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# It is forbidden to publish, distribute, sublicense, or sell copies
# of the Software or modified copies of the Software.
#
# 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 <http://www.gnu.org/licenses/>.
#
##############################################################################
{
'name': 'Car Workshop',
'version': '9.0.1.0.0',
'summary': 'Vehicle Workshop Operations',
'description': 'Vehicle workshop operations & Its reports',
'category': 'Industries',
'author': 'Cybrosys Techno Solutions',
'website': "http://www.cybrosys.com",
'company': 'Cybrosys Techno Solutions',
'depends': [
'base',
'fleet',
'account_accountant',
],
'data': [
'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',
'views/workshop_data.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,
}

26
fleet_car_workshop/models/__init__.py

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
# Copyright (C) 2008-TODAY Cybrosys Technologies(<http://www.cybrosys.com>).
# Author: Nilmar Shereef(<http://www.cybrosys.com>)
# you can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# It is forbidden to publish, distribute, sublicense, or sell copies
# of the Software or modified copies of the Software.
#
# 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 <http://www.gnu.org/licenses/>.
#
##############################################################################
import car_workshop
import timesheet
import dashboard
import config

370
fleet_car_workshop/models/car_workshop.py

@ -0,0 +1,370 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
# Copyright (C) 2008-TODAY Cybrosys Technologies(<http://www.cybrosys.com>).
# Author: Nilmar Shereef(<http://www.cybrosys.com>)
# you can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# It is forbidden to publish, distribute, sublicense, or sell copies
# of the Software or modified copies of the Software.
#
# 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 <http://www.gnu.org/licenses/>.
#
##############################################################################
from datetime import date
from dateutil.relativedelta import relativedelta
from openerp import models, api, fields, _
from openerp.exceptions import UserError
class CarWorkshop(models.Model):
_name = 'car.workshop'
_inherit = ['mail.thread']
name = fields.Char(string='Title', track_visibility='onchange', required=True)
vehicle_id = fields.Many2one('car.car', string='Vehicle', track_visibility='onchange')
user_id = fields.Many2one('res.users', string='Assigned to', select=True)
active = fields.Boolean(string='Active')
partner_id = fields.Many2one('res.partner', string='Customer')
priority = fields.Selection([('0', 'Normal'), ('1', 'High')], 'Priority', select=True)
description = fields.Html(string='Description')
sequence = fields.Integer(string='Sequence', select=True, help="Gives the sequence order when displaying a list of tasks.")
tag_ids = fields.Many2many('worksheet.tags', string='Tags')
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', 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', 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, readonly=True)
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, copy=False, readonly=True)
id = fields.Integer('ID', readonly=True)
company_id = fields.Many2many('res.company', string='Company Name')
color = fields.Integer(string='Color Index')
stage_id = fields.Many2one('worksheet.stages', string='Stage', track_visibility='onchange', 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")
def _get_default_stages(self, cr, uid, context=None):
""" Gives default stage_id """
if context is None:
context = {}
default_vehicle_id = context.get('default_vehicle_id')
if not default_vehicle_id:
return False
return self.find_stage(cr, uid, [], default_vehicle_id, [('fold', '=', False)], context=context)
_defaults = {
'stage_id': _get_default_stages,
'vehicle_id': lambda self, cr, uid, ctx=None: ctx.get('default_vehicle_id') if ctx is not None else False,
'date_last_stage_update': fields.datetime.now(),
'kanban_state': 'normal',
'priority': '0',
'sequence': 10,
'active': True,
'user_id': lambda obj, cr, uid, ctx=None: uid,
'company_id': lambda self, cr, uid, ctx=None: self.pool.get('res.company')._company_default_get(cr, uid,
'car.workshop',
context=ctx),
'partner_id': lambda self, cr, uid, ctx=None: self._get_default_vehicle(cr, uid, context=ctx),
'date_start': fields.datetime.now(),
}
@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
@api.multi
def cancel(self):
self.state = 'cancel'
@api.multi
def workshop_create_invoices(self):
self.state = 'workshop_create_invoices'
inv_obj = self.env['account.invoice']
inv_line_obj = self.env['account.invoice.line']
customer = self.partner_id
if not customer.name:
raise UserError(
_(
'Please select a Customer.'))
company_id = self.env['res.users'].browse(1).company_id
currency_value = company_id.currency_id.id
self.ensure_one()
ir_values = self.env['ir.values']
journal_id = ir_values.get_default('workshop.config.setting', 'invoice_journal_type')
if not journal_id:
journal_id = 1
inv_data = {
'name': customer.name,
'reference': customer.name,
'account_id': customer.property_account_payable_id.id,
'partner_id': customer.id,
'currency_id': currency_value,
'journal_id': journal_id,
'origin': self.name,
'company_id': company_id.id,
}
inv_id = inv_obj.create(inv_data)
for records in self.planned_works:
if records.planned_work.id :
income_account = records.planned_work.property_account_income_id.id
if not income_account:
raise UserError(_('There is no income account defined for this product: "%s".') %
(records.planned_work.name,))
inv_line_data = {
'name': records.planned_work.name,
'account_id': income_account,
'price_unit': records.work_cost,
'quantity': 1,
'product_id': records.planned_work.id,
'invoice_id': inv_id.id,
}
inv_line_obj.create(inv_line_data)
for records in self.materials_used:
inv_line_data = {
'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_id': inv_id.id,
}
inv_line_obj.create(inv_line_data)
imd = self.env['ir.model.data']
action = imd.xmlid_to_object('account.action_invoice_tree1')
list_view_id = imd.xmlid_to_res_id('account.invoice_tree')
form_view_id = imd.xmlid_to_res_id('account.invoice_form')
result = {
'name': action.name,
'help': action.help,
'type': 'ir.actions.act_window',
'views': [[list_view_id, 'tree'], [form_view_id, 'form'], [False, 'graph'], [False, 'kanban'],
[False, 'calendar'], [False, 'pivot']],
'target': action.target,
'context': action.context,
'res_model': 'account.invoice',
}
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
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, cr, uid, context=None):
obj = self.pool.get('car.workshop')
obj1 = obj.search(cr, uid, [])
now = fields.Datetime.from_string(fields.Datetime.now())
for obj2 in obj1:
obj3 = obj.browse(cr, uid, obj2, context=context)
if obj3.stage_id.name != 'Done' and obj3.stage_id.name != 'Cancelled' and obj3.stage_id.name != 'Verified':
start_date = fields.Datetime.from_string(obj3.date_start)
end_date = fields.Datetime.from_string(obj3.date_deadline)
if obj3.date_deadline 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
def _track_subtype(self, cr, uid, ids, init_values, context=None):
record = self.browse(cr, uid, ids[0], context=context)
if 'kanban_state' in init_values and record.kanban_state == 'blocked':
return 'fleet_car_workshop.mt_task_blocked'
elif 'kanban_state' in init_values and record.kanban_state == 'done':
return 'fleet_car_workshop.mt_task_ready'
elif 'user_id' in init_values and record.user_id: # assigned -> new
return '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
return 'fleet_car_workshop.mt_task_new'
elif 'stage_id' in init_values:
return 'fleet_car_workshop.mt_task_stage'
return super(CarWorkshop, self)._track_subtype(cr, uid, ids, init_values, context=context)
def create(self, cr, uid, vals, context=None):
context = dict(context or {})
if vals.get('vehicle_id') and not context.get('default_vehicle_id'):
context['default_vehicle_id'] = vals.get('vehicle_id')
if vals.get('user_id'):
vals['date_assign'] = fields.datetime.now()
create_context = dict(context, mail_create_nolog=True)
work_id = super(CarWorkshop, self).create(cr, uid, vals, context=create_context)
return work_id
def write(self, cr, uid, ids, vals, context=None):
if isinstance(ids, (int, long)):
ids = [ids]
if 'stage_id' in vals:
vals['date_last_stage_update'] = fields.datetime.now()
if vals.get('user_id'):
vals['date_assign'] = fields.datetime.now()
if vals and not'kanban_state' in vals and 'stage_id' in vals:
new_stage = vals.get('stage_id')
vals_reset_kstate = dict(vals, kanban_state='normal')
for t in self.browse(cr, uid, ids, context=context):
write_vals = vals_reset_kstate if t.stage_id.id != new_stage else vals
super(CarWorkshop, self).write(cr, uid, [t.id], write_vals, context=context)
result = True
else:
result = super(CarWorkshop, self).write(cr, uid, ids, vals, context=context)
return result
def _read_group_stages(self, cr, uid, ids, domain, read_group_order=None, access_rights_uid=None, context=None):
if context is None:
context = {}
stage_obj = self.pool.get('worksheet.stages')
order = stage_obj._order
access_rights_uid = access_rights_uid or uid
if read_group_order == 'stage_id desc':
order = '%s desc' % order
if 'default_vehicle_id' in context:
search_domain = ['|', ('vehicle_ids', '=', context['default_vehicle_id']), ('id', 'in', ids)]
else:
search_domain = [('id', 'in', ids)]
stage_ids = stage_obj._search(cr, uid, search_domain, order=order, access_rights_uid=access_rights_uid, context=context)
result = stage_obj.name_get(cr, access_rights_uid, stage_ids, context=context)
result.sort(lambda x, y: cmp(stage_ids.index(x[0]), stage_ids.index(y[0])))
fold = {}
for stage in stage_obj.browse(cr, access_rights_uid, stage_ids, context=context):
fold[stage.id] = stage.fold or False
return result, fold
_group_by_full = {
'stage_id': _read_group_stages,
}
@api.cr_uid_ids_context
def onchange_vehicle(self, cr, uid, id, vehicle_id, context=None):
values = {}
if vehicle_id:
vehicle = self.pool.get('fleet.vehicle').browse(cr, uid, vehicle_id, context=context)
if vehicle.exists():
values['partner_id'] = vehicle.partner_id.id
values['stage_id'] = self.find_stage(cr, uid, [], vehicle_id, [('fold', '=', False)], context=context)
else:
values['stage_id'] = False
return {'value': values}
def _get_default_vehicle(self, cr, uid, context=None):
if context is None:
context = {}
if 'default_vehicle_id' in context:
vehicle = self.pool.get('car.car').browse(cr, uid, context['default_vehicle_id'], context=context)
if vehicle and vehicle.partner_id:
return vehicle.partner_id.id
return False
def find_stage(self, cr, uid, cases, section_id, domain=[], order='sequence', context=None):
""" 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
"""
if isinstance(cases, (int, long)):
cases = self.browse(cr, uid, cases, context=context)
section_ids = []
if section_id:
section_ids.append(section_id)
for task in cases:
if task.vehicle_id:
section_ids.append(task.vehicle_id.id)
search_domain = []
if section_ids:
search_domain = [('|')] * (len(section_ids) - 1)
for section_id in section_ids:
search_domain.append(('vehicle_ids', '=', section_id))
search_domain += list(domain)
stage_ids = self.pool.get('worksheet.stages').search(cr, uid, search_domain, order=order, context=context)
if stage_ids:
return stage_ids[0]
return False

95
fleet_car_workshop/models/config.py

@ -0,0 +1,95 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
# Copyright (C) 2008-TODAY Cybrosys Technologies(<http://www.cybrosys.com>).
# Author: Nilmar Shereef(<http://www.cybrosys.com>)
# you can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# It is forbidden to publish, distribute, sublicense, or sell copies
# of the Software or modified copies of the Software.
#
# 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 <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp import fields, models, api
from openerp.tools.translate import _
class WorkshopSetting(models.Model):
_name = "workshop.config.setting"
invoice_journal_type = fields.Many2one('account.journal', string="Car Workshop Journal")
@api.multi
def execute(self):
return self.env['ir.values'].sudo().set_default(
'workshop.config.setting', 'invoice_journal_type', self.invoice_journal_type.id)
def cancel(self, cr, uid, ids, context=None):
act_window = self.pool['ir.actions.act_window']
action_ids = act_window.search(cr, uid, [('res_model', '=', self._name)])
if action_ids:
return act_window.read(cr, uid, action_ids[0], [], context=context)
return {}
class WorksheetTags(models.Model):
_name = "worksheet.tags"
_description = "Tags of vehicles's tasks, issues..."
name = fields.Char('Name', required=True)
color = fields.Integer('Color Index')
_sql_constraints = [
('name_uniq', 'unique (name)', "Tag name already exists !"),
]
class WorksheetStages(models.Model):
_name = 'worksheet.stages'
_description = 'worksheet Stage'
_order = 'sequence'
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')
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.')
def _get_default_vehicle_ids(self, cr, uid, ctx=None):
if ctx is None:
ctx = {}
default_vehicle_id = ctx.get('default_vehicle_id')
return [default_vehicle_id] if default_vehicle_id else None
_defaults = {
'sequence': 1,
'vehicle_ids': _get_default_vehicle_ids,
}
_order = 'sequence'
class Services(models.Model):
_inherit = 'product.template'
type = fields.Selection([('consu', _('Consumable')), ('service', _('Service')), ('product', _('Stockable Product'))], 'Product Type', required=True,
help="A consumable is a product for which you don't manage stock,"
" a service is a non-material product provided by a company or an individual.")
_defaults = {
'type': 'service',
}

130
fleet_car_workshop/models/dashboard.py

@ -0,0 +1,130 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
# Copyright (C) 2008-TODAY Cybrosys Technologies(<http://www.cybrosys.com>).
# Author: Nilmar Shereef(<http://www.cybrosys.com>)
# you can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# It is forbidden to publish, distribute, sublicense, or sell copies
# of the Software or modified copies of the Software.
#
# 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 <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp.tools.translate import _
from openerp.osv import fields, osv
class CarVehicle(osv.osv):
_name = 'car.car'
_inherit = ['mail.thread']
def _get_visibility_selection_id(self, cr, uid, context=None):
""" Overriden in portal_project to offer more options """
return [('portal', _('Customer Project: visible in portal if the customer is a follower')),
('employees', _('All Employees Project: all employees can access')),
('followers', _('Private Project: followers only'))]
_visibility_selections = lambda self, *args, **kwargs: self._get_visibility_selection_id(*args, **kwargs)
def get_task_count(self, cr, uid, ids, field_name, arg, context=None):
if context is None:
context = {}
res = {}
for vehicle in self.browse(cr, uid, ids, context=context):
res[vehicle.id] = len(vehicle.task_ids)
return res
def _get_all_attached_docs(self, cr, uid, ids, field_name, arg, context):
res = {}
attachment = self.pool.get('ir.attachment')
worksheet = self.pool.get('car.workshop')
for id in ids:
project_attachments = attachment.search(cr, uid, [('res_model', '=', 'car.car'),
('res_id', '=', id)], context=context, count=True)
task_ids = worksheet.search(cr, uid, [('vehicle_id', '=', id)], context=context)
task_attachments = attachment.search(cr, uid, [('res_model', '=', 'car.workshop'),
('res_id', 'in', task_ids)], context=context, count=True)
res[id] = (project_attachments or 0) + (task_attachments or 0)
return res
def attachment_tree_views(self, cr, uid, ids, context):
task_ids = self.pool.get('car.workshop').search(cr, uid, [('vehicle_id', 'in', ids)])
domain = [
'|',
'&', ('res_model', '=', 'car.car'), ('res_id', 'in', ids),
'&', ('res_model', '=', 'car.workshop'), ('res_id', 'in', task_ids)]
res_id = ids and ids[0] or False
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 project.</p><p>
Send messages or log internal notes with attachments to link
documents to your project.
</p>'''),
'limit': 80,
'context': "{'default_res_model': '%s','default_res_id': %d}" % (self._name, res_id)
}
_columns = {
'active': fields.boolean('Active'),
'name': fields.many2one('fleet.vehicle', string='Vehicle Name', track_visibility='onchange', 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 tasks on project's kanban view."),
'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.function(get_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.function(_get_all_attached_docs, string="Number of documents attached", type='integer'),
'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', 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'),
'image_medium': fields.related('name', 'image_medium', type="binary", string="Logo (medium)"),
}
_defaults = {
'active': True,
'use_tasks': True,
'label_tasks': 'Tasks',
'state': 'open',
}
def on_change_vehicle(self):
if not self.name:
return {}
model = self.pool.get('fleet.vehicle').browse(self.name)
return {
'value': {
'image_medium': model.image_medium,
}
}

57
fleet_car_workshop/models/timesheet.py

@ -0,0 +1,57 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
# Copyright (C) 2008-TODAY Cybrosys Technologies(<http://www.cybrosys.com>).
# Author: Nilmar Shereef(<http://www.cybrosys.com>)
# you can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# It is forbidden to publish, distribute, sublicense, or sell copies
# of the Software or modified copies of the Software.
#
# 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 <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp import fields, models, api
class PlannedWork (models.Model):
_name = 'planned.work'
planned_work = fields.Many2one('product.template', 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.template', 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

22
fleet_car_workshop/security/ir.model.access.csv

@ -0,0 +1,22 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_car_car_user,car.car.user,fleet_car_workshop.model_car_car,fleet.group_fleet_user,1,0,0,0
access_car_workshop_user,car.workshop.user,fleet_car_workshop.model_car_workshop,fleet.group_fleet_user,1,0,0,0
access_worksheet_tags_all_user,car.car_tags_all,fleet_car_workshop.model_worksheet_tags,fleet.group_fleet_user,1,0,0,0
access_worksheet_stages_user,worksheet.stages.user,fleet_car_workshop.model_worksheet_stages,fleet.group_fleet_user,1,0,0,0
access_service_product_user,car.car.products.user,fleet_car_workshop.model_product_template,fleet.group_fleet_user,0,0,0,0
access_material_used_user,material.used.user,fleet_car_workshop.model_material_used,fleet.group_fleet_user,1,0,0,0
access_planned_work_user,planned.work.user,fleet_car_workshop.model_planned_work,fleet.group_fleet_user,1,0,0,0
access_car_car_manager,car.car.manager,fleet_car_workshop.model_car_car,fleet.group_fleet_manager,1,1,1,1
access_car_workshop_manager,car.workshop.manager,fleet_car_workshop.model_car_workshop,fleet.group_fleet_manager,1,1,1,1
access_worksheet_tags_all_manager,car.car_tags_all.manager,fleet_car_workshop.model_worksheet_tags,fleet.group_fleet_manager,1,1,1,1
access_worksheet_stages_manager,worksheet.stages.manager,fleet_car_workshop.model_worksheet_stages,fleet.group_fleet_manager,1,1,1,1
access_service_product_manager,car.car.products.manager,fleet_car_workshop.model_product_template,fleet.group_fleet_manager,1,1,1,1
access_material_used_manager,material.used.manager,fleet_car_workshop.model_material_used,fleet.group_fleet_manager,1,1,1,1
access_planned_work_manager,planned.work.manager,fleet_car_workshop.model_planned_work,fleet.group_fleet_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_car_car_user car.car.user fleet_car_workshop.model_car_car fleet.group_fleet_user 1 0 0 0
3 access_car_workshop_user car.workshop.user fleet_car_workshop.model_car_workshop fleet.group_fleet_user 1 0 0 0
4 access_worksheet_tags_all_user car.car_tags_all fleet_car_workshop.model_worksheet_tags fleet.group_fleet_user 1 0 0 0
5 access_worksheet_stages_user worksheet.stages.user fleet_car_workshop.model_worksheet_stages fleet.group_fleet_user 1 0 0 0
6 access_service_product_user car.car.products.user fleet_car_workshop.model_product_template fleet.group_fleet_user 0 0 0 0
7 access_material_used_user material.used.user fleet_car_workshop.model_material_used fleet.group_fleet_user 1 0 0 0
8 access_planned_work_user planned.work.user fleet_car_workshop.model_planned_work fleet.group_fleet_user 1 0 0 0
9 access_car_car_manager car.car.manager fleet_car_workshop.model_car_car fleet.group_fleet_manager 1 1 1 1
10 access_car_workshop_manager car.workshop.manager fleet_car_workshop.model_car_workshop fleet.group_fleet_manager 1 1 1 1
11 access_worksheet_tags_all_manager car.car_tags_all.manager fleet_car_workshop.model_worksheet_tags fleet.group_fleet_manager 1 1 1 1
12 access_worksheet_stages_manager worksheet.stages.manager fleet_car_workshop.model_worksheet_stages fleet.group_fleet_manager 1 1 1 1
13 access_service_product_manager car.car.products.manager fleet_car_workshop.model_product_template fleet.group_fleet_manager 1 1 1 1
14 access_material_used_manager material.used.manager fleet_car_workshop.model_material_used fleet.group_fleet_manager 1 1 1 1
15 access_planned_work_manager planned.work.manager fleet_car_workshop.model_planned_work fleet.group_fleet_manager 1 1 1 1

28
fleet_car_workshop/security/workshop_security.xml

@ -0,0 +1,28 @@
<?xml version="1.0" ?>
<openerp>
<data noupdate="0">
<record id="fleet_car_workshop.main_workshop_menu" model="ir.ui.menu">
<field name="groups_id" eval="[(6, 0, [ref('fleet.group_fleet_user')] )]"/>
</record>
<record id="fleet_car_workshop.workshop_vehicles" model="ir.ui.menu">
<field name="groups_id" eval="[(6, 0, [ref('fleet.group_fleet_user')] )]"/>
</record>
<record id="fleet_car_workshop.vehicle_works" model="ir.ui.menu">
<field name="groups_id" eval="[(6, 0, [ref('fleet.group_fleet_user')] )]"/>
</record>
<record id="fleet_car_workshop.menu_worksheet_config" model="ir.ui.menu">
<field name="groups_id" eval="[(6, 0, [ref('fleet.group_fleet_manager')] )]"/>
</record>
<record id="fleet_car_workshop.menu_worksheet_stages_action" model="ir.ui.menu">
<field name="groups_id" eval="[(6, 0, [ref('fleet.group_fleet_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.group_fleet_user'))]"/>
</record>
</data>
</openerp>

BIN
fleet_car_workshop/static/description/1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

BIN
fleet_car_workshop/static/description/4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

BIN
fleet_car_workshop/static/description/Screenshot from 2017-04-12 11:28:25.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

BIN
fleet_car_workshop/static/description/banner.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

BIN
fleet_car_workshop/static/description/calendar.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

BIN
fleet_car_workshop/static/description/cybro_logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

BIN
fleet_car_workshop/static/description/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

166
fleet_car_workshop/static/description/index.html

@ -0,0 +1,166 @@
<section class="oe_container">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan">Car Workshop Management</h2>
<h3 class="oe_slogan"></h3>
<p class='oe_mt32'>
Car Workshop Management is 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.. <br/>Some other features are as below:
</p>
<ul>
<li style="list-style:none !important;"><span style="color:green;"> &#9733;</span>&nbsp;&nbsp; User Friendly Interface.</li>
<li style="list-style:none !important;"><span style="color:green;"> &#9733;</span>&nbsp;&nbsp; Effective Time management.</li>
<li style="list-style:none !important;"><span style="color:green;"> &#9733;</span>&nbsp;&nbsp; Separate Journal Configuration..</li>
<li style="list-style:none !important;"><span style="color:green;"> &#9733;</span>&nbsp;&nbsp; Integrated with Accounting.</li>
<li style="list-style:none !important;"><span style="color:green;"> &#9733;</span>&nbsp;&nbsp; High Scalability.</li>
</ul>
</div>
</section>
<section class="oe_container oe_dark">
<div class="oe_row oe_spaced">
<div class="oe_span12">
<h2 class="oe_slogan">Dashboard/All Vehicles</h2>
<h3 class="oe_slogan">Whole Workshop Analysis</h3>
</div>
<div class="oe_span12">
<div class="oe_demo oe_picture oe_screenshot">
<img src="4.png">
</div>
</div>
</div>
</section>
<section class="oe_container">
<div class="oe_row oe_padded">
<h2 class="oe_slogan">All works</h2>
<div class="oe_span12">
<p>
<h4>Goto Car Workshop -->Search -->Worksheet</h4>
<p>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.
</p>
</div>
<div class="oe_span6">
<h3>Kanban</h3>
<!--<div class="oe_row_img oe_centered">-->
<img class="oe_picture oe_screenshot" src="kanban.png">
</div>
<div class="oe_span6 ">
<h3>Calendar</h3>
<img class="oe_picture oe_screenshot" src="calendar.png">
</div>
</div>
</section>
<section class="oe_container oe_dark">
<div class="oe_row oe_spaced">
<div class="oe_span12">
<h2 class="oe_slogan">Worksheet View</h2>
<h3 class="oe_slogan">All details related to a work/task</h3>
</div>
<div class="oe_span12">
<div class="oe_demo oe_picture oe_screenshot">
<img src="worksheet.png">
</div>
</div>
</div>
</section>
<section class="oe_container">
<div class="oe_row oe_padded">
<h2 class="oe_slogan">Timesheet</h2>
<div class="oe_span12">
<p>
<h4>Goto Car Workshop >Search >Worksheet >Timesheet</h4>
<p>
<p>* In timesheet ,Planned work is the sub works related to main Work. By ticking
'Completed' that work will be automatically updated to Work done.</p>
<p>* Work done is the details of completed works.</p>
<p>* Hour spent is time taken for completed work(Work Done).</p>
<p>* Remaining Hour is total time left(Difference between Total Time and Hour Spent).</p>
</p>
</div>
<div class="oe_span13">
<div class="oe_demo oe_screenshot">
<img src="timesheet.png">
</div>
</div></div>
</section>
<section class="oe_container oe_dark">
<div class="oe_row oe_spaced">
<div class="oe_span12">
<h2 class="oe_slogan">Report</h2>
<h3 class="oe_slogan">Tabular Details of Vehicles</h3>
</div>
<div class="oe_span12">
<div class="oe_demo oe_picture oe_screenshot">
<img src="report.png">
</div>
</div>
</div>
</section>
<section class="oe_container">
<div class="oe_row oe_spaced">
<div class="oe_span12">
<h2 class="oe_slogan">Settings</h2>
<h3 class="oe_slogan">Configure Preferred journal for Invoicing </h3>
</div>
<div class="oe_span12">
<p>
<h4>Goto Car Workshop >Confiouration >Settings </h4>
</p></div>
<div class="oe_span8">
<div class="oe_demo oe_picture oe_screenshot">
<img src="journal.png">
</div>
</div>
</div>
</section>
<section class="oe_container oe_dark">
<div class="oe_row oe_spaced">
<div class="oe_span12">
<h2 class="oe_slogan">Separate Journal</h2>
<h3 class="oe_slogan">Invoices from the car workshop will be saved to Separate journal.</h3>
</div>
<div class="oe_span12">
<p>
<h4>Goto Car Workshop >Search >Worksheet >Create Invoices </h4>
</p></div>
<div class="oe_span8">
<div class="oe_demo oe_picture oe_screenshot">
<img src="invoice.png">
</div>
</div>
</div>
</section>
<section class="oe_container">
<br/>
<h2 class="oe_slogan" style="margin-top:20px;" >You Looking for a free Documentation of this Application.?</h2>
<h3 class="oe_slogan">Give a Request Mail to:&nbsp;&nbsp;<i class="fa fa-envelope" aria-hidden="true"></i>&nbsp;&nbsp;<a href="#" style="color:blue;">odoo@cybrosys.com</a></h3>
<br/>
<br/>
</section>
<section class="oe_container oe_dark">
<h2 class="oe_slogan" style="margin-top:20px;" >Need Any Help?</h2>
<div class="oe_slogan" style="margin-top:10px !important;">
<a class="btn btn-primary btn-lg mt8"
style="color: #FFFFFF !important;" href="http://www.cybrosys.com"><i
class="fa fa-envelope"></i> Email </a> <a
class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;"
href="http://www.cybrosys.com/contact/"><i
class="fa fa-phone"></i> Contact Us </a> <a
class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;"
href="http://www.cybrosys.com/odoo-customization-and-installation/"><i
class="fa fa-check-square"></i> Request Customization </a>
</div>
<img src="cybro_logo.png" style="width: 190px; margin-bottom: 20px;" class="center-block">
</section>

BIN
fleet_car_workshop/static/description/invoice.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

BIN
fleet_car_workshop/static/description/journal.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

BIN
fleet_car_workshop/static/description/kanban.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

BIN
fleet_car_workshop/static/description/report.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

BIN
fleet_car_workshop/static/description/timesheet.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
fleet_car_workshop/static/description/worksheet.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

40
fleet_car_workshop/static/src/css/vehicles.css

@ -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;
}

98
fleet_car_workshop/static/src/less/car_dashboard.less

@ -0,0 +1,98 @@
.o_kanban_view.o_kanban_dashboard.o_project_kanban {
.o_kanban_record {
.o-flex-display();
position: relative;
}
.o_project_kanban_main {
.o-flex(0, 0, auto);
padding: @odoo-horizontal-padding;
width: 70%; // for IE11 overflow issue
// give space for manage section at the bottom
margin-bottom: @odoo-horizontal-padding/2 + 19px;
.o_kanban_card_content {
font-size: 12px;
.o_primary {
font-size: larger;
}
}
.o_project_kanban_manage {
.o-position-absolute(@bottom: 0, @left: 0);
padding: @odoo-horizontal-padding/2 @odoo-horizontal-padding;
}
.o_kanban_card_manage_pane .o_kanban_card_manage_title {
margin: 0;
}
}
.o_project_kanban_boxes {
width: 30%;
.o-flex(0, 0, auto);
.o-flex-display();
.o-flex-flow(column, nowrap);
> a:hover {
text-decoration: none;
}
.o_value {
font-size: x-large;
color: white;
display: block;
}
.o_label {
color: white;
}
.o_needaction{
position: absolute;
top: 5px;
right: 5px;
color: white;
font-size: small;
opacity: 0.5;
&:hover{
opacity:1;
}
&::before {
content: "\f086";
font: normal normal normal 14px/1 FontAwesome;
}
}
.o_project_kanban_box {
position: relative;
text-align: center;
padding: 15px 0 15px 0;
.o-flex(1, 1, auto);
.o-flex-display();
.o-align-items(center);
.o-flex-flow(column, nowrap);
.o-justify-content(center);
}
.o_project_kanban_box:nth-child(even) {
background-color: grey;
}
.o_project_kanban_box:nth-child(odd) {
background-color: @odoo-brand-optional;
}
}
}
.o_kanban_task_cover_image {
.o-columns(200px, 4);
> img {
cursor: pointer;
margin-bottom: 1em;
border: 1px solid transparent;
&.o_selected {
border-color: @odoo-brand-secondary;
box-shadow: 0px 0px 2px 2px @odoo-brand-secondary;
}
}
}

194
fleet_car_workshop/views/car_dashboard.xml

@ -0,0 +1,194 @@
<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_medium" widget='image' class="oe_avatar"/>
<div class="oe_title">
<h1>
<field name="name" 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="name" 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="name"/>
<field name="use_tasks"/>
<field name="color"/>
<field name="task_count"/>
<field name="label_tasks"/>
<field name="task_ids"/>
<field name="doc_count"/>
<templates>
<t t-name="kanban-box">
<div t-attf-class="#{kanban_color(record.color.raw_value)} oe_kanban_global_click">
<div class="o_project_kanban_main">
<div class="o_kanban_card_content o_visible">
<div class="o_kanban_primary_left">
<div class="o_primary">
<span><t t-esc="record.name.value"/></span>
</div>
<div class="o_kanban_image">
<img t-att-src="kanban_image('car.car', 'image_medium', record.id.value)"/>
</div>
</div>
</div><div class="o_kanban_card_manage_pane o_invisible">
<div class="o_kanban_card_manage_section o_kanban_manage_reports">
<div groups="project.group_project_manager">
<a type="edit">Settings</a>
</div>
</div>
<div t-if="widget.editable" class="o_project_kanban_colorpicker">
<ul class="oe_kanban_colorpicker" data-field="color"/>
</div>
</div>
<div class="o_project_kanban_manage">
<a class="o_kanban_manage_toggle_button" href="#">More <i class="fa fa-caret-down"/></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="name" 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="view_type">form</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="view_type">form</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>

32
fleet_car_workshop/views/config_setting.xml

@ -0,0 +1,32 @@
<odoo>
<record id="view_workshop_config_settings" model="ir.ui.view">
<field name="name">workshop settings</field>
<field name="model">workshop.config.setting</field>
<field name="arch" type="xml">
<form string="Configure Workshop" class="oe_form_configuration">
<header>
<button string="Apply" type="object" name="execute" class="oe_highlight"/>
<button string="Cancel" type="object" name="cancel" class="oe_link"/>
</header>
<div id="main">
<group string="Seperate Journal">
<field name="invoice_journal_type" />
</group></div>
</form>
</field>
</record>
<record id="action_workshop_config_settings" model="ir.actions.act_window">
<field name="name">Settings</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">workshop.config.setting</field>
<field name="view_id" ref="view_workshop_config_settings"/>
<field name="view_mode">form</field>
<field name="target">inline</field>
</record>
<menuitem action="action_workshop_config_settings" id="menu_workshop_config_settings_act"
string="Setting" sequence = "1" parent="menu_worksheet_config" />
</odoo>

16
fleet_car_workshop/views/report.xml

@ -0,0 +1,16 @@
<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>

59
fleet_car_workshop/views/timesheet_view.xml

@ -0,0 +1,59 @@
<openerp>
<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>
</openerp>

12
fleet_car_workshop/views/vehicle.xml

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<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>
</openerp>

90
fleet_car_workshop/views/worksheet_stages.xml

@ -0,0 +1,90 @@
<openerp>
<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">
<group>
<group>
<field name="name"/>
<field name="sequence" groups="base.group_no_one"/>
</group>
<group>
<field name="fold"/>
</group>
</group>
<group>
<p class="text-muted" colspan="2">
You can also add a description to help your coworkers understand the meaning and purpose of the stage.
</p>
<field name="description" placeholder="Add a description..." nolabel="1" colspan="2"/>
</group>
<group string="Vehicles using this stage">
<field name="vehicle_ids" widget="many2many_tags"/>
</group>
</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"/>
</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_type">form</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">
<group col="4">
<field name="name"/>
</group>
</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_type">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.template</field>
<field name="view_mode">kanban,tree,form</field>
<field name="view_type">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>
</openerp>

289
fleet_car_workshop/views/worksheet_views.xml

@ -0,0 +1,289 @@
<openerp>
<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 eval="'car.workshop'" name="model"/>
<field eval="'process_demo_scheduler_queue'" name="function"/>
</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"/>
<field name="stage_id" widget="statusbar" clickable="True"
options="{'fold_field': 'fold'}"/>
</header>
<sheet string="Worksheet">
<field name="kanban_state" widget="kanban_state_selection"/>
<div class="oe_title">
<h1 class="o_row">
<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">
<group col="2">
<field name="sequence"/>
<field name="partner_id"/>
<field name="displayed_image_id" />
</group>
<group col="2">
<field name="date_assign" />
<field name="date_last_stage_update"/>
</group>
</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">
<field name="color"/>
<field name="priority"/>
<field name="stage_id" options='{"group_by_tooltip": {"description": "Stage Description", "legend_priority": "Use of stars"}}'/>
<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"/>
<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" groups="base.group_user">
<a class="dropdown-toggle btn" data-toggle="dropdown" href="#" >
<span class="fa fa-bars fa-lg"/>
</a>
<ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">
<t t-if="widget.editable"><li><a type="edit">Edit Task</a></li></t>
<t t-if="widget.deletable"><li><a type="delete">Delete</a></li></t>
<li>
<ul class="oe_kanban_colorpicker" data-field="color"/>
</li>
</ul>
</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_small', record.user_id.raw_value)" t-att-title="record.user_id.value" width="24" height="24" class="oe_kanban_avatar pull-right"/>
<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)"/>
</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 model="ir.actions.act_window" id="worksheet_action_super_button">
<field name="name">Worksheets</field>
<field name="res_model">car.workshop</field>
<field name="context">{'search_default_vehicle_id': active_id}</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>
<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" domain="[('user_id','=',uid)]"/>
<filter string="Unassigned" name="unassigned" domain="[('user_id', '=', False)]"/>
<separator/>
<filter string="New" name="draft" domain="[('stage_id.sequence', '&lt;=', 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="worksheet" 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="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 ="Search" 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>
</openerp>

107
fleet_car_workshop/views/workshop_data.xml

@ -0,0 +1,107 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="1">
<!-- This will set the unit of measure used in projects and tasks.-->
<!--<record id="base.main_company" model="res.company">-->
<!--<field name="project_time_mode_id" ref="product.product_uom_hour"></field>-->
<!--</record>-->
<!-- 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>
<!-- sale_timesheet and project define the same field without depending on each, which causes the field to be deleted when the module that created it
is deleted. To avoid this, we create xmlids manually for this field in both modules to prevent accidental deletion. To fix in saas-7 by moving the field definition-->
<!--<record id="duplicate_field_xmlid" model="ir.model.data">-->
<!--<field name="res_id" search="[('model','=','res.company')]" model="ir.model.fields"/>-->
<!--<field name="model">ir.model.fields</field>-->
<!--<field name="module">fleet_car_workshop</field>-->
<!--<field name="name">fleet_car_workshop_duplicate</field>-->
<!--<field name="noupdate">True</field>-->
<!--</record>-->
</data>
<data>
<!-- 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_stage" 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_stage')"/>
<field name="relation_field">vehicle_id</field>
</record>
<!--&lt;!&ndash; notify all employees of module installation &ndash;&gt;-->
<!--<record model="mail.message" id="module_install_notification">-->
<!--<field name="model">mail.channel</field>-->
<!--<field name="res_id" ref="mail.channel_all_employees"/>-->
<!--<field name="message_type">notification</field>-->
<!--<field name="subtype_id" ref="mail.mt_comment"/>-->
<!--<field name="subject">Project Management application installed!</field>-->
<!--<field name="body"><![CDATA[<p>Manage multi-level projects and tasks. You can delegate tasks, track task work, and review your planning.</p>-->
<!--<p>You can manage todo lists on tasks by installing the <i>Todo Lists</i> application, supporting the Getting Things Done (GTD) methodology.</p>-->
<!--<p>You can also manage issues/bugs in projects by installing the "Issue Tracker" application.</p>]]></field>-->
<!--</record>-->
</data>
</openerp>
Loading…
Cancel
Save