Browse Source

Nov 10 [ADD] : Initial Commit 'fleet_car_workshop'

pull/221/merge
AjmalCybro 2 years ago
parent
commit
74a547dd48
  1. 18
      fleet_car_workshop/README.rst
  2. 21
      fleet_car_workshop/__init__.py
  3. 54
      fleet_car_workshop/__manifest__.py
  4. 77
      fleet_car_workshop/data/workshop_data.xml
  5. 10
      fleet_car_workshop/doc/RELEASE_NOTES.md
  6. 23
      fleet_car_workshop/models/__init__.py
  7. 431
      fleet_car_workshop/models/car_workshop.py
  8. 61
      fleet_car_workshop/models/config.py
  9. 109
      fleet_car_workshop/models/dashboard.py
  10. 54
      fleet_car_workshop/models/timesheet.py
  11. 15
      fleet_car_workshop/security/ir.model.access.csv
  12. 25
      fleet_car_workshop/security/workshop_security.xml
  13. BIN
      fleet_car_workshop/static/10.png
  14. BIN
      fleet_car_workshop/static/description/assets/icons/check.png
  15. BIN
      fleet_car_workshop/static/description/assets/icons/chevron.png
  16. BIN
      fleet_car_workshop/static/description/assets/icons/cogs.png
  17. BIN
      fleet_car_workshop/static/description/assets/icons/consultation.png
  18. BIN
      fleet_car_workshop/static/description/assets/icons/ecom-black.png
  19. BIN
      fleet_car_workshop/static/description/assets/icons/education-black.png
  20. BIN
      fleet_car_workshop/static/description/assets/icons/hotel-black.png
  21. BIN
      fleet_car_workshop/static/description/assets/icons/license.png
  22. BIN
      fleet_car_workshop/static/description/assets/icons/lifebuoy.png
  23. BIN
      fleet_car_workshop/static/description/assets/icons/manufacturing-black.png
  24. BIN
      fleet_car_workshop/static/description/assets/icons/pos-black.png
  25. BIN
      fleet_car_workshop/static/description/assets/icons/puzzle.png
  26. BIN
      fleet_car_workshop/static/description/assets/icons/restaurant-black.png
  27. BIN
      fleet_car_workshop/static/description/assets/icons/service-black.png
  28. BIN
      fleet_car_workshop/static/description/assets/icons/trading-black.png
  29. BIN
      fleet_car_workshop/static/description/assets/icons/training.png
  30. BIN
      fleet_car_workshop/static/description/assets/icons/update.png
  31. BIN
      fleet_car_workshop/static/description/assets/icons/user.png
  32. BIN
      fleet_car_workshop/static/description/assets/icons/wrench.png
  33. BIN
      fleet_car_workshop/static/description/assets/misc/categories.png
  34. BIN
      fleet_car_workshop/static/description/assets/misc/check-box.png
  35. BIN
      fleet_car_workshop/static/description/assets/misc/compass.png
  36. BIN
      fleet_car_workshop/static/description/assets/misc/corporate.png
  37. BIN
      fleet_car_workshop/static/description/assets/misc/customer-support.png
  38. BIN
      fleet_car_workshop/static/description/assets/misc/cybrosys-logo.png
  39. BIN
      fleet_car_workshop/static/description/assets/misc/features.png
  40. BIN
      fleet_car_workshop/static/description/assets/misc/logo.png
  41. BIN
      fleet_car_workshop/static/description/assets/misc/pictures.png
  42. BIN
      fleet_car_workshop/static/description/assets/misc/pie-chart.png
  43. BIN
      fleet_car_workshop/static/description/assets/misc/right-arrow.png
  44. BIN
      fleet_car_workshop/static/description/assets/misc/star.png
  45. BIN
      fleet_car_workshop/static/description/assets/misc/support.png
  46. BIN
      fleet_car_workshop/static/description/assets/misc/whatsapp.png
  47. BIN
      fleet_car_workshop/static/description/assets/modules/1.png
  48. BIN
      fleet_car_workshop/static/description/assets/modules/2.png
  49. BIN
      fleet_car_workshop/static/description/assets/modules/3.png
  50. BIN
      fleet_car_workshop/static/description/assets/modules/4.png
  51. BIN
      fleet_car_workshop/static/description/assets/modules/5.gif
  52. BIN
      fleet_car_workshop/static/description/assets/modules/6.png
  53. BIN
      fleet_car_workshop/static/description/assets/screenshots/1.1.png
  54. BIN
      fleet_car_workshop/static/description/assets/screenshots/1.2.png
  55. BIN
      fleet_car_workshop/static/description/assets/screenshots/1.3.png
  56. BIN
      fleet_car_workshop/static/description/assets/screenshots/1.4.png
  57. BIN
      fleet_car_workshop/static/description/assets/screenshots/1.5.png
  58. BIN
      fleet_car_workshop/static/description/assets/screenshots/1.7.png
  59. BIN
      fleet_car_workshop/static/description/assets/screenshots/1.8.png
  60. BIN
      fleet_car_workshop/static/description/assets/screenshots/1.9.png
  61. BIN
      fleet_car_workshop/static/description/assets/screenshots/hero.gif
  62. BIN
      fleet_car_workshop/static/description/banner.png
  63. BIN
      fleet_car_workshop/static/description/icon.png
  64. 588
      fleet_car_workshop/static/description/index.html
  65. 40
      fleet_car_workshop/static/src/css/vehicles.css
  66. 38
      fleet_car_workshop/static/src/less/car_dashboard.less
  67. 215
      fleet_car_workshop/views/car_dashboard.xml
  68. 41
      fleet_car_workshop/views/configuration_settings_view.xml
  69. 15
      fleet_car_workshop/views/report.xml
  70. 53
      fleet_car_workshop/views/timesheet_view.xml
  71. 124
      fleet_car_workshop/views/worksheet_stages.xml
  72. 320
      fleet_car_workshop/views/worksheet_views.xml

18
fleet_car_workshop/README.rst

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

21
fleet_car_workshop/__init__.py

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

54
fleet_car_workshop/__manifest__.py

@ -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/>.
#
##############################################################################
{
'name': 'Car Workshop',
'version': '16.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/configuration_settings_view.xml',
'views/car_dashboard.xml',
'views/timesheet_view.xml',
'views/worksheet_stages.xml',
'views/report.xml',
'security/workshop_security.xml',
'security/ir.model.access.csv',
],
'web.assets_backend': [
'fleet_car_workshop/static/src/css/vehicles.css',
'fleet_car_workshop/static/src/less/car_dashboard.less',
],
'images': ['static/description/banner.png'],
'license': 'AGPL-3',
'installable': True,
'auto_install': False,
'application': False,
}

77
fleet_car_workshop/data/workshop_data.xml

@ -0,0 +1,77 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- <data noupdate="1">-->
<!-- &lt;!&ndash; Requests Links &ndash;&gt;-->
<!-- <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>

10
fleet_car_workshop/doc/RELEASE_NOTES.md

@ -0,0 +1,10 @@
## Module <fleet_car_workshop>
#### 5.11.2022
#### Version 16.0.1.0.0
#### ADD
Initial Commit

23
fleet_car_workshop/models/__init__.py

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

431
fleet_car_workshop/models/car_workshop.py

@ -0,0 +1,431 @@
# -*- 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)
# company_id = fields.Many2many('res.company', string='Company Name', default=lambda self: self.env['res.company']._company_default_get('car.workshop'))
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)
# stage_id = fields.Many2one('project.task.type', string='Stage', ondelete='restrict', tracking=True, index=True,
# default=_get_default_stage_id, group_expand='_read_group_stage_ids',
# domain="[('project_ids', '=', project_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):
print(self.planned_works.planned_work.property_account_income_id,'rrrrrrrrrrrrrrrrrrrrrrrrr')
self.state = 'workshop_create_invoices'
inv_obj = self.env['account.move']
print('inv_obj',inv_obj)
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')
print(journal_id,'journal_id')
if not journal_id:
journal_id = 1
inv_data = {
'ref': self.name,
'partner_bank_id': customer.bank_ids[:1].id,
'partner_id': customer.id,
'currency_id': currency_value,
'journal_id': int(journal_id),
'invoice_origin': self.name,
'company_id': company_id.id,
'move_type': 'out_invoice',
# 'invoice_line_ids': invoice_line_ids,
}
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_ids': [(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):
# values = {}
if self.vehicle_id.exists():
# vehicle = self.pool.get('fleet.vehicle').browse(cr, uid, vehicle_id, context=context)
# 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):
print(self.env['account.move'].search([]),'self')
for record in self:
record.invoice_count = self.env['account.move'].search_count(
[('invoice_origin', '=', self.name)])

61
fleet_car_workshop/models/config.py

@ -0,0 +1,61 @@
# -*- 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 Index')
_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.')

109
fleet_car_workshop/models/dashboard.py

@ -0,0 +1,109 @@
# -*- 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)
}

54
fleet_car_workshop/models/timesheet.py

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

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

@ -0,0 +1,15 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_car_car_user,car.car.user,fleet_car_workshop.model_car_car,fleet.fleet_group_user,1,0,0,0
access_car_workshop_user,car.workshop.user,fleet_car_workshop.model_car_workshop,fleet.fleet_group_user,1,0,0,0
access_worksheet_tags_all_user,car.car_tags_all,fleet_car_workshop.model_worksheet_tags,fleet.fleet_group_user,1,0,0,0
access_worksheet_stages_user,worksheet.stages.user,fleet_car_workshop.model_worksheet_stages,fleet.fleet_group_user,1,0,0,0
access_material_used_user,material.used.user,fleet_car_workshop.model_material_used,fleet.fleet_group_user,1,0,0,0
access_planned_work_user,planned.work.user,fleet_car_workshop.model_planned_work,fleet.fleet_group_user,1,0,0,0
access_car_car_manager,car.car.manager,fleet_car_workshop.model_car_car,fleet.fleet_group_manager,1,1,1,1
access_car_workshop_manager,car.workshop.manager,fleet_car_workshop.model_car_workshop,fleet.fleet_group_manager,1,1,1,1
access_worksheet_tags_all_manager,car.car_tags_all.manager,fleet_car_workshop.model_worksheet_tags,fleet.fleet_group_manager,1,1,1,1
access_worksheet_stages_manager,worksheet.stages.manager,fleet_car_workshop.model_worksheet_stages,fleet.fleet_group_manager,1,1,1,1
access_material_used_manager,material.used.manager,fleet_car_workshop.model_material_used,fleet.fleet_group_manager,1,1,1,1
access_planned_work_manager,planned.work.manager,fleet_car_workshop.model_planned_work,fleet.fleet_group_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.fleet_group_user 1 0 0 0
3 access_car_workshop_user car.workshop.user fleet_car_workshop.model_car_workshop fleet.fleet_group_user 1 0 0 0
4 access_worksheet_tags_all_user car.car_tags_all fleet_car_workshop.model_worksheet_tags fleet.fleet_group_user 1 0 0 0
5 access_worksheet_stages_user worksheet.stages.user fleet_car_workshop.model_worksheet_stages fleet.fleet_group_user 1 0 0 0
6 access_material_used_user material.used.user fleet_car_workshop.model_material_used fleet.fleet_group_user 1 0 0 0
7 access_planned_work_user planned.work.user fleet_car_workshop.model_planned_work fleet.fleet_group_user 1 0 0 0
8 access_car_car_manager car.car.manager fleet_car_workshop.model_car_car fleet.fleet_group_manager 1 1 1 1
9 access_car_workshop_manager car.workshop.manager fleet_car_workshop.model_car_workshop fleet.fleet_group_manager 1 1 1 1
10 access_worksheet_tags_all_manager car.car_tags_all.manager fleet_car_workshop.model_worksheet_tags fleet.fleet_group_manager 1 1 1 1
11 access_worksheet_stages_manager worksheet.stages.manager fleet_car_workshop.model_worksheet_stages fleet.fleet_group_manager 1 1 1 1
12 access_material_used_manager material.used.manager fleet_car_workshop.model_material_used fleet.fleet_group_manager 1 1 1 1
13 access_planned_work_manager planned.work.manager fleet_car_workshop.model_planned_work fleet.fleet_group_manager 1 1 1 1

25
fleet_car_workshop/security/workshop_security.xml

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

BIN
fleet_car_workshop/static/10.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

BIN
fleet_car_workshop/static/description/assets/icons/check.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

BIN
fleet_car_workshop/static/description/assets/icons/chevron.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

BIN
fleet_car_workshop/static/description/assets/icons/cogs.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
fleet_car_workshop/static/description/assets/icons/consultation.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
fleet_car_workshop/static/description/assets/icons/ecom-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 B

BIN
fleet_car_workshop/static/description/assets/icons/education-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

BIN
fleet_car_workshop/static/description/assets/icons/hotel-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 911 B

BIN
fleet_car_workshop/static/description/assets/icons/license.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
fleet_car_workshop/static/description/assets/icons/lifebuoy.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
fleet_car_workshop/static/description/assets/icons/manufacturing-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

BIN
fleet_car_workshop/static/description/assets/icons/pos-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

BIN
fleet_car_workshop/static/description/assets/icons/puzzle.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 B

BIN
fleet_car_workshop/static/description/assets/icons/restaurant-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 905 B

BIN
fleet_car_workshop/static/description/assets/icons/service-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 B

BIN
fleet_car_workshop/static/description/assets/icons/trading-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

BIN
fleet_car_workshop/static/description/assets/icons/training.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 B

BIN
fleet_car_workshop/static/description/assets/icons/update.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
fleet_car_workshop/static/description/assets/icons/user.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 B

BIN
fleet_car_workshop/static/description/assets/icons/wrench.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
fleet_car_workshop/static/description/assets/misc/categories.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
fleet_car_workshop/static/description/assets/misc/check-box.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
fleet_car_workshop/static/description/assets/misc/compass.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
fleet_car_workshop/static/description/assets/misc/corporate.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
fleet_car_workshop/static/description/assets/misc/customer-support.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
fleet_car_workshop/static/description/assets/misc/cybrosys-logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

BIN
fleet_car_workshop/static/description/assets/misc/features.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 B

BIN
fleet_car_workshop/static/description/assets/misc/logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
fleet_car_workshop/static/description/assets/misc/pictures.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
fleet_car_workshop/static/description/assets/misc/pie-chart.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
fleet_car_workshop/static/description/assets/misc/right-arrow.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 967 B

BIN
fleet_car_workshop/static/description/assets/misc/star.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
fleet_car_workshop/static/description/assets/misc/support.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
fleet_car_workshop/static/description/assets/misc/whatsapp.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

BIN
fleet_car_workshop/static/description/assets/modules/1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

BIN
fleet_car_workshop/static/description/assets/modules/2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

BIN
fleet_car_workshop/static/description/assets/modules/3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

BIN
fleet_car_workshop/static/description/assets/modules/4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

BIN
fleet_car_workshop/static/description/assets/modules/5.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

BIN
fleet_car_workshop/static/description/assets/modules/6.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

BIN
fleet_car_workshop/static/description/assets/screenshots/1.1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

BIN
fleet_car_workshop/static/description/assets/screenshots/1.2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

BIN
fleet_car_workshop/static/description/assets/screenshots/1.3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

BIN
fleet_car_workshop/static/description/assets/screenshots/1.4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

BIN
fleet_car_workshop/static/description/assets/screenshots/1.5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

BIN
fleet_car_workshop/static/description/assets/screenshots/1.7.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

BIN
fleet_car_workshop/static/description/assets/screenshots/1.8.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

BIN
fleet_car_workshop/static/description/assets/screenshots/1.9.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

BIN
fleet_car_workshop/static/description/assets/screenshots/hero.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 KiB

BIN
fleet_car_workshop/static/description/banner.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

BIN
fleet_car_workshop/static/description/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

588
fleet_car_workshop/static/description/index.html

@ -0,0 +1,588 @@
<div style="background-color: #714B67; height: 810px; width: 100%; padding: 15px; position: relative;">
<!-- TITLE BAR -->
<div class="d-flex align-items-center justify-content-between"
style="border-bottom: 1px solid #875A7B; padding: 15px; display: flex; justify-content: space-between; align-items: center;">
<img src="assets/misc/cybrosys-logo.png" width="42" height="42" style="width: 42px; height: 42px;" />
<div>
<div
style="color: #7C7BAD; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;"
class="mr-2">
<i class="fa fa-check mr-1"></i>Community
</div>
<div
style="color: #875A7B; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;"
class="mr-2">
<i class="fa fa-check mr-1"></i>Enterprise
</div>
<div
style="color: #017E84; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;"
class="mr-2">
<i class="fa fa-check mr-1"></i>Odoo.sh
</div>
</div>
</div>
<!-- END OF TITLE BAR -->
<div class="container">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-12">
<!-- APP HERO -->
<h1 style="color: #FFFFFF; font-weight: bolder; font-size: 50px; text-align: center; margin-top: 50px;">
Car Workshop Management</h1>
<!-- END OF APP HERO -->
<img src="assets/screenshots/hero.gif" class="img-responsive"
style="width: 100%; margin-left: auto; margin-right: auto;" />
</div>
</div>
</div>
</div>
<!-- NAVIGATION SECTION -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px; margin-top: 300px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/compass.png" />
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Explore This
Module</h2>
</div>
<div class="row my-4" style="font-family: 'Montserrat', sans-serif;">
<div class="col-sm-12 col-md-6 my-3">
<a href="#overview">
<div class="d-flex justify-content-between align-items-center"
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div>
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Overview</span>
<span style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">Learn
more about this
module</span>
</div>
<img src="assets/misc/right-arrow.png" width="36" height="36" />
</div>
</a>
</div>
<div class="col-sm-12 col-md-6 my-3">
<a href="#features">
<div class="d-flex justify-content-between align-items-center"
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div>
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Features</span>
<span style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">View
features of this
module</span>
</div>
<img src="assets/misc/right-arrow.png" width="36" height="36" />
</div>
</a>
</div>
<div class="col-sm-12 col-md-6 my-3">
<a href="#screenshots">
<div class="d-flex justify-content-between align-items-center"
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div>
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Screenshots</span>
<span style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">View
screenshots for this
module</span>
</div>
<img src="assets/misc/right-arrow.png" width="36" height="36" />
</div>
</a>
</div>
</div>
<!-- END OF NAVIGATION SECTION -->
<!-- OVERVIEW SECTION -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="overview">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/pie-chart.png" />
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Overview
</h2>
</div>
<div class="row" style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;">
<div class="col-sm-12 py-4">
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..
</div>
</div>
<!-- END OF OVERVIEW SECTION -->
<!-- FEATURES SECTION -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="features">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/features.png" />
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Features
</h2>
</div>
<div class="row" style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;">
<div class="col-sm-12 col-md-6">
<div class="d-flex align-items-center" style="margin-top: 40px; margin-bottom: 40px">
<img src="assets/misc/check-box.png" class="mr-2" />
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> User Friendly Interface. </span>
</div>
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px">
<img src="assets/misc/check-box.png" class="mr-2" />
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Effective Time management. </span>
</div>
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px">
<img src="assets/misc/check-box.png" class="mr-2" />
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Separate Journal Configuration.</span>
</div>
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px">
<img src="assets/misc/check-box.png" class="mr-2" />
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Integrated with Accounting.</span>
</div>
</div>
<div class="col-sm-12 col-md-6">
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px">
<img src="assets/misc/check-box.png" class="mr-2" />
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> High Scalability.</span>
</div>
</div>
</div>
<!-- END OF FEATURES SECTION -->
<!-- SCREENSHOTS SECTION -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="screenshots">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/pictures.png" />
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Screenshots
</h2>
</div>
<div class="row">
<div class="col-sm-12">
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Dashboard/All Vehicles
</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Whole Workshop Analysis</p>
<img src="assets/screenshots/1.1.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">All works
</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Goto Car Workshop -->Worksheet
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>
<h3>Kanban</h3>
<img src="assets/screenshots/1.2.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Calendar
</h3>
<img src="assets/screenshots/1.3.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Worksheet View
</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> All details related to a work/task </p>
<img src="assets/screenshots/1.4.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Timesheet
</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Goto Car Workshop >Worksheet >Timesheet
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).</p>
<img src="assets/screenshots/1.5.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Report
</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> Tabular Details of Vehicles </p>
<img src="assets/screenshots/1.7.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Settings
</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> Configure Preferred journal for Invoicing
Goto Car Workshop >Configuration >Settings</p>
<img src="assets/screenshots/1.8.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Separate Journal
</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> Invoices from the car workshop will be saved to Separate journal.
Goto Car Workshop >Worksheet >Create Invoices</p>
<img src="assets/screenshots/1.9.png" class="img-thumbnail">
</div>
</div>
</div>
<!-- END OF SCREENSHOTS SECTION -->
<!-- RELATED PRODUCTS -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/categories.png" />
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Related
Products
</h2>
</div>
<div class="row">
<div class="col-sm-12">
<div id="demo1" class="row carousel slide" data-ride="carousel">
<!-- The slideshow -->
<div class="carousel-inner" style="padding: 30px;">
<div class="carousel-item" style="min-height: 198.656px;">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/dynamic_accounts_report/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;" src="assets/modules/1.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/custom_gantt_view/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;" src="assets/modules/2.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/project_custom_gantt/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;" src="assets/modules/3.png">
</div>
</a>
</div>
</div>
<div class="carousel-item active" style="min-height: 198.656px;">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/account_reports_xlsx/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;" src="assets/modules/4.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/base_accounting_kit/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;" src="assets/modules/5.gif">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/hr_payroll_community/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;" src="assets/modules/6.png">
</div>
</a>
</div>
</div>
</div>
<!-- Left and right controls -->
<a class="carousel-control-prev" href="#demo1" data-slide="prev" style="width:35px; color:#000"> <span
class="carousel-control-prev-icon"><i class="fa fa-chevron-left" style="font-size:24px"></i></span>
</a> <a class="carousel-control-next" href="#demo1" data-slide="next" style="width:35px; color:#000">
<span class="carousel-control-next-icon"><i class="fa fa-chevron-right" style="font-size:24px"></i></span>
</a>
</div>
</div>
</div>
<!-- END OF RELATED PRODUCTS -->
<!-- OUR SERVICES -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/star.png" />
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Our Services
</h2>
</div>
<div class="container my-5">
<div class="row">
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #1dd1a1 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/cogs.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Customization</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #ff6b6b !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/wrench.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Implementation</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #6462CD !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/lifebuoy.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Support</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #ffa801 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/user.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Hire
Odoo
Developer</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #54a0ff !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/puzzle.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Integration</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #6d7680 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/update.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Migration</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #786fa6 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/consultation.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Consultancy</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #f8a5c2 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/training.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Implementation</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #e6be26 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/license.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Licensing Consultancy</h6>
</div>
</div>
</div>
<!-- END OF END OF OUR SERVICES -->
<!-- OUR INDUSTRIES -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/corporate.png" />
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Our
Industries
</h2>
</div>
<div class="container my-5">
<div class="row">
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/trading-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Trading
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Easily procure
and
sell your products</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/pos-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
POS
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Easy
configuration
and convivial experience</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/education-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Education
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
A platform for
educational management</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/manufacturing-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Manufacturing
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Plan, track and
schedule your operations</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/ecom-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
E-commerce &amp; Website
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Mobile
friendly,
awe-inspiring product pages</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/service-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Service Management
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Keep track of
services and invoice</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/restaurant-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Restaurant
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Run your bar or
restaurant methodically</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/hotel-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Hotel Management
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
An
all-inclusive
hotel management application</p>
</div>
</div>
</div>
</div>
<!-- END OF END OF OUR INDUSTRIES -->
<!-- SUPPORT -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/customer-support.png" />
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Support
</h2>
</div>
<div class="container mt-5">
<div class="row">
<div class="col-sm-12 col-md-6">
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;">
<div class="mr-4 d-flex justify-content-center align-items-center"
style="background-color: #714B67; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;">
<img src="assets/misc/support.png" height="48" width="48" style="width: 42px; height: 42px;" />
</div>
<div>
<h4>Need Help?</h4>
<p style="line-height: 100%;">Got questions or need help? Get in touch.</p>
<a href="mailto:odoo@cybrosys.com">
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;">
odoo@cybrosys.com</p>
</a>
</div>
</div>
</div>
<div class="col-sm-12 col-md-6">
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;">
<div class="mr-4 d-flex justify-content-center align-items-center"
style="background-color: #2AC44D; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;">
<img src="assets/misc/whatsapp.png" height="52" width="52" style="width: 52px; height: 52px;" />
</div>
<div>
<h4>WhatsApp</h4>
<p style="line-height: 100%;">Say hi to us on WhatsApp!</p>
<a href="https://api.whatsapp.com/send?phone=918606827707">
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;">+91 86068
27707</p>
</a>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12 my-5 d-flex justify-content-center align-items-center">
<img src="assets/misc/logo.png" width="144" height="31" style="width:144px; height: 31px; margin-top: 40px;" />
</div>
</div>
</div>
<!-- END OF SUPPORT -->

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

38
fleet_car_workshop/static/src/less/car_dashboard.less

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

215
fleet_car_workshop/views/car_dashboard.xml

@ -0,0 +1,215 @@
<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">
<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="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>

41
fleet_car_workshop/views/configuration_settings_view.xml

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="car_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">res.config.settings</field>
<field name="view_mode">form</field>
<field name="target">inline</field>
<field name="context">{'module' : 'fleet_car_workshop'}</field>
</record>
<record id="car_workshop_res_config_settings_view_form" model="ir.ui.view">
<field name="name">res wrk shop settings</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>
<menuitem name="Settings" sequence="1" id="config_settings_view_action"
parent="fleet_car_workshop.menu_worksheet_config" action="car_workshop_config_settings"/>
</odoo>

15
fleet_car_workshop/views/report.xml

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

53
fleet_car_workshop/views/timesheet_view.xml

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

124
fleet_car_workshop/views/worksheet_stages.xml

@ -0,0 +1,124 @@
<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"/>
<field name="color" widget="color_picker"/>
</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" widget="color_picker"/>
</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>

320
fleet_car_workshop/views/worksheet_views.xml

@ -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" options="{'color_field': 'color'}"/>
<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" options="{'color_field': 'color'}"/>
<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" options="{'color_field': 'color'}"/>
</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" options="{'color_field': 'color'}"/>
</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" options="{'color_field': 'color'}"/>
<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', '&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="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>
Loading…
Cancel
Save