diff --git a/fleet_car_workshop/README.rst b/fleet_car_workshop/README.rst new file mode 100644 index 000000000..13fc1690d --- /dev/null +++ b/fleet_car_workshop/README.rst @@ -0,0 +1,49 @@ +.. image:: https://img.shields.io/badge/license-AGPL--3-blue.svg + :target: https://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +Car Workshop +============ +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. + +Configuration +============= +* No additional configurations needed + +License +------- +General Public License, Version 3 (AGPL v3). +(https://www.gnu.org/licenses/agpl-3.0-standalone.html) + +Company +------- +* `Cybrosys Techno Solutions `__ + +Credits +------- +Developer: (V17) Ayana KP, +Contact: odoo@cybrosys.com + +Contacts +-------- +* Mail Contact : odoo@cybrosys.com +* Website : https://cybrosys.com + +Bug Tracker +----------- +Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. + +Maintainer +========== +.. image:: https://cybrosys.com/images/logo.png + :target: https://cybrosys.com + +This module is maintained by Cybrosys Technologies. + +For support and more information, please visit `Our Website `__ + +Further information +=================== +HTML Description: ``__ diff --git a/fleet_car_workshop/__init__.py b/fleet_car_workshop/__init__.py new file mode 100644 index 000000000..482ed927c --- /dev/null +++ b/fleet_car_workshop/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Ayana KP (odoo@cybrosys.com) +# +# You can modify it under the terms of the GNU AFFERO +# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. +# +# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE +# (AGPL v3) along with this program. +# If not, see . +# +############################################################################### +from . import models diff --git a/fleet_car_workshop/__manifest__.py b/fleet_car_workshop/__manifest__.py new file mode 100644 index 000000000..9fef42ea4 --- /dev/null +++ b/fleet_car_workshop/__manifest__.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Ayana KP (odoo@cybrosys.com) +# +# You can modify it under the terms of the GNU AFFERO +# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. +# +# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE +# (AGPL v3) along with this program. +# If not, see . +# +############################################################################### +{ + 'name': 'Car Workshop', + 'version': '17.0.1.0.0', + 'category': 'Industries', + 'summary': 'A Complete Vehicle Workshop Operations & Reports', + 'description': """This module helps to manage automobile workshop with + great ease. Keep track of everything, like vehicle owner details, + Works assigned, Bill details of service provided, etc.""", + 'author': 'Cybrosys Techno Solutions', + 'company': 'Cybrosys Techno Solutions', + 'maintainer ': 'Cybrosys Techno Solutions', + 'website': "https://www.cybrosys.com", + 'depends': ['fleet', 'stock', 'account'], + 'data': [ + 'security/fleet_vehicle_security.xml', + 'security/ir.model.access.csv', + 'data/mail_message_subtype_data.xml', + 'data/ir_cron_data.xml', + 'views/car_workshop_views.xml', + 'views/vehicle_details_views.xml', + 'views/res_config_settings_views.xml', + 'views/material_used_views.xml', + 'views/worksheet_stages_views.xml', + 'views/worksheet_tag_views.xml', + 'views/car_workshop_reports.xml', + + ], + 'images': ['static/description/banner.png'], + 'license': 'AGPL-3', + 'installable': True, + 'auto_install': False, + 'application': True, +} diff --git a/fleet_car_workshop/data/ir_cron_data.xml b/fleet_car_workshop/data/ir_cron_data.xml new file mode 100644 index 000000000..312edc234 --- /dev/null +++ b/fleet_car_workshop/data/ir_cron_data.xml @@ -0,0 +1,17 @@ + + + + + + Demo scheduler + + 1 + minutes + -1 + + + code + model.process_demo_scheduler_queue() + + + diff --git a/fleet_car_workshop/data/mail_message_subtype_data.xml b/fleet_car_workshop/data/mail_message_subtype_data.xml new file mode 100644 index 000000000..b6fe98ba3 --- /dev/null +++ b/fleet_car_workshop/data/mail_message_subtype_data.xml @@ -0,0 +1,64 @@ + + + + + + Task Opened + car.workshop + + + Task opened + + + Task Blocked + car.workshop + + Task blocked + + + Task Ready + car.workshop + + Task ready for Next Stage + + + Stage Changed + car.workshop + + Stage changed + + + + Task Opened + 10 + vehicle.details + + + vehicle_id + + + Task Blocked + 11 + vehicle.details + + + vehicle_id + + + Task Ready + 12 + vehicle.details + + + vehicle_id + + + Task Stage Changed + 13 + vehicle.details + + + vehicle_id + + + diff --git a/fleet_car_workshop/doc/RELEASE_NOTES.md b/fleet_car_workshop/doc/RELEASE_NOTES.md new file mode 100755 index 000000000..e7564564a --- /dev/null +++ b/fleet_car_workshop/doc/RELEASE_NOTES.md @@ -0,0 +1,5 @@ +## Module +#### 17.04.2024 +#### Version 17.0.1.0.0 +#### ADD +- Initial Commit for Car Workshop diff --git a/fleet_car_workshop/models/__init__.py b/fleet_car_workshop/models/__init__.py new file mode 100644 index 000000000..dc56f25d1 --- /dev/null +++ b/fleet_car_workshop/models/__init__.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Ayana KP (odoo@cybrosys.com) +# +# You can modify it under the terms of the GNU AFFERO +# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. +# +# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE +# (AGPL v3) along with this program. +# If not, see . +# +############################################################################### +from . import car_workshop +from . import material_used +from . import planned_work +from . import res_config_settings +from . import vehicle_details +from . import worksheet_stages +from . import worksheet_tag diff --git a/fleet_car_workshop/models/car_workshop.py b/fleet_car_workshop/models/car_workshop.py new file mode 100644 index 000000000..27f58af28 --- /dev/null +++ b/fleet_car_workshop/models/car_workshop.py @@ -0,0 +1,385 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Ayana KP (odoo@cybrosys.com) +# +# You can modify it under the terms of the GNU AFFERO +# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. +# +# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE +# (AGPL v3) along with this program. +# If not, see . +# +############################################################################### +from datetime import date +from dateutil.relativedelta import relativedelta +from odoo.exceptions import UserError +from odoo import models, api, fields, _, SUPERUSER_ID + + +class CarWorkshop(models.Model): + """ Model for car workshop management """ + _name = 'car.workshop' + _description = "Car Workshop" + _inherit = ['mail.thread'] + + @api.model + def _read_group_stage_ids(self, stages, domain, order): + """ Read group customization in order to display all the stages in the + kanban view, even if they are empty """ + stage_ids = stages._search([], order=order, + access_rights_uid=SUPERUSER_ID) + return stages.browse(stage_ids) + + def _default_stage_id(self): + # Since project stages are order by sequence first, + # this should fetch the one with the lowest sequence number. + return self.env['worksheet.stages'].search([], limit=1) + + vehicle_id = fields.Many2one('vehicle.details', string='Vehicle', + index=True, tracking=True, change_default=True, + help='The vehicle for the work started') + name = fields.Char(string='Title', tracking=True, required=True, + help='Give Name of the work') + user_id = fields.Many2one('res.users', string='Assigned to', + default=lambda self: self.env.user, tracking=True, + help='Give Name of the user') + active = fields.Boolean(string='Active', default=True, + help='Work is active?') + partner_id = fields.Many2one('res.partner', string='Customer', + related='vehicle_id.partner_id', + help='Customer or car owner') + priority = fields.Selection([('0', 'Normal'), ('1', 'High')], + string='Priority', index=True, default='0', + help='Priority of work') + description = fields.Html(string='Description', + help='Give any notes for the work') + sequence = fields.Integer(string='Sequence', index=True, default=10, + help="Gives the sequence order when displaying " + "a list of tasks.") + tag_ids = fields.Many2many('worksheet.tag', string='Tags', + ondelete='cascade', + help='Give tags for the work') + kanban_state = fields.Selection( + [('normal', 'In Progress'), ('done', 'Ready for next stage'), + ('blocked', 'Blocked')], string='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, tracking=True, default='normal', + copy=False) + date_start = fields.Datetime(string='Starting Date', + default=fields.datetime.now(), index=True, + copy=False, help='Give start date of the work') + date_end = fields.Datetime(string='Ending Date', index=True, copy=False, + help='End date of the work') + date_assign = fields.Date(string='Assigning Date', index=True, + default=lambda self: fields.Date.today(), + copy=False, help='Date assigned of the work') + date_deadline = fields.Datetime(string='Deadline', index=True, copy=False, + help='Deadline of the work') + progress = fields.Integer(string="Working Time Progress(%)", copy=False, + readonly=True, help='Work progress details') + date_last_stage_update = fields.Datetime(string='Last Stage Update', + index=True, + default=fields.datetime.now(), + copy=False, readonly=True, + help='The last stage changed date') + company_id = fields.Many2one('res.company', string='Company', help='', + required=True, + default=lambda self: self.env.company) + color = fields.Integer(string='Color Index', help='Choose the color') + stage_id = fields.Many2one('worksheet.stages', string='Stage', + ondelete='restrict', tracking=True, index=True, + default=_default_stage_id, + group_expand='_read_group_stage_ids', + copy=False, help='The stages of the work') + state = fields.Selection([ + ('waiting', 'Ready'), + ('workshop_create_invoices', 'Invoiced'), + ('cancel', 'Invoice Canceled'), + ], string='Status', readonly=True, default='waiting', + tracking=True, index=True, help='State of the work') + attachment_ids = fields.One2many('ir.attachment', 'res_id', + string='Attachments', auto_join=True, + domain=lambda self: [ + ('res_model', '=', self._name)], + help='Attachment details of work') + displayed_image_id = fields.Many2one('ir.attachment', + domain="[" + "('res_model', '=', 'car.workshop')," + "('res_id', '=', id)," + "('mimetype', 'ilike', 'image')]", + string='Displayed Image', + help='Image of the vehicle') + planned_work_ids = fields.One2many('planned.work', 'work_id', + string='Planned/Ordered Works', + help='The planned work for the vehicle') + works_done_ids = fields.One2many('planned.work', 'work_id', + string='Work Done', + domain=[('is_completed', '=', True)], + help='The completed work for the vehicle') + materials_ids = fields.One2many('material.used', + 'material_id', + string='Materials Used', + help='Material used for the work') + remaining_hour = fields.Float(string='Remaining Hour', readonly=True, + compute="_compute_remaining_hour", + help='Remaining hours for the work') + effective_hour = fields.Float(string='Hours Spent', readonly=True, + compute="_compute_effective_hour", + help='The net working hours for the work ') + amount_total = fields.Float(string='Total Amount', readonly=True, + compute="_compute_amount_total", + help='Total amount for the work') + invoice_count = fields.Integer(string="Invoice_count", + compute='_compute_invoice_count', + help='The invoice count for the work') + + @api.depends('planned_work_ids.work_cost', 'materials_ids.price') + def _compute_amount_total(self): + """ Calculate the total amount for each record by summing 'work_cost' + from 'planned_work_ids' and 'price' from 'materials_ids'. """ + for records in self: + amount_total = 0.0 + for line in records.planned_work_ids: + amount_total += line.work_cost + for line2 in records.materials_ids: + amount_total += line2.price + records.amount_total = amount_total + + def cancel(self): + """ Function for cancel button """ + self.state = 'cancel' + + def action_create_invoices(self): + """ Function for creating invoice """ + self.state = 'workshop_create_invoices' + inv_obj = self.env['account.move'] + customer = self.partner_id + if not customer.name: + raise UserError( + _('Please select a Customer.')) + if not self.planned_work_ids: + raise UserError( + _('Nothing to invoice, Plan a work.')) + invoice_line_ids = [] + self.ensure_one() + journal_id = self.env['ir.config_parameter'].sudo().get_param( + 'fleet_car_workshop.invoice_journal_type') + if not journal_id: + journal_id = self.env['account.journal'].search([ + *self.env['account.journal']._check_company_domain( + self.env.company), ('type', '=', 'sale'), ], limit=1) + inv_data = { + 'ref': self.name, + 'partner_bank_id': customer.bank_ids[:1].id, + 'partner_id': customer.id, + 'currency_id': self.company_id.currency_id.id, + 'journal_id': int(journal_id), + 'invoice_origin': self.name, + 'company_id': self.company_id.id, + 'move_type': 'out_invoice', + } + # Get the planned work + for records in self.planned_work_ids: + if records.planned_work_id.id: + income_account = records.planned_work_id.property_account_income_id.id + if not income_account: + raise UserError( + _('There is no income account defined for' + ' this product: "%s".') % + (records.planned_work_id.name,)) + if records.is_completed: + inv_line_data = (0, 0, { + 'name': records.planned_work_id.name, + 'account_id': income_account, + 'price_unit': records.work_cost, + 'quantity': 1, + 'product_id': records.planned_work_id.id, + }) + invoice_line_ids.append(inv_line_data) + for records in self.materials_ids: + if records.material_product_id.id: + income_account = records.material_product_id.property_account_income_id.id + if not income_account: + raise UserError( + _('There is no income account defined ' + 'for this product: "%s".') % + (records.material_product_id.name,)) + inv_line_data = (0, 0, { + 'name': records.material_product_id.name, + 'account_id': records.material_product_id.property_account_income_id.id, + 'price_unit': records.price, + 'quantity': records.quantity, + 'product_id': records.material_product_id.id, + }) + invoice_line_ids.append(inv_line_data) + 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_ids: + product_ids = self.env['product.product'].search( + [('id', '=', lines.material_product_id.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.quantity, + '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_ids.duration') + def _compute_effective_hour(self): + """Function for get total hours spent""" + for hour in self: + effective_hour = 0.0 + for line in hour.works_done_ids: + effective_hour += line.duration + self.effective_hour = effective_hour + + @api.depends('planned_work_ids.time_spent') + def _compute_remaining_hour(self): + """ Function for calculate remaining hours """ + for hour in self: + remaining_hour = 0.0 + for line in hour.planned_work_ids: + remaining_hour += line.time_spent + self.remaining_hour = remaining_hour - self.effective_hour + + def process_demo_scheduler_queue(self): + # Schedule action function for get work progress + records = self.search([]) + now = fields.Datetime.from_string(fields.Datetime.now()) + for data in records: + if data.stage_id.name != 'Done' and data.stage_id.name != 'Cancelled' and data.stage_id.name != 'Verified': + end_date = fields.Datetime.from_string(data.date_deadline) + start_date = fields.Datetime.from_string(data.date_assign) + if data.date_deadline and data.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: + vall = ((current_hr * 100) / total_hr) + data.progress = vall + else: + data.progress = 100 + else: + data.progress = 100 + else: + data.progress = 0 + + def write(self, vals): + """ Function for update values in records """ + 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): + """ Function for getting last time of stage id changed """ + worksheet_stage = self.env['worksheet.stages'].browse(stage_id) + if worksheet_stage.is_fold: + return {'date_end': fields.Datetime.now()} + return {'date_end': False} + + @api.onchange('vehicle_id') + def _onchange_vehicle_id(self): + # get partner id in the vehicle + if self.vehicle_id.exists(): + self.partner_id = self.vehicle_id.partner_id + + def action_get_invoices(self): + """ Function for invoice smart tab """ + 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): + """ Function for get total invoice count """ + for record in self: + record.invoice_count = self.env['account.move'].search_count( + [('invoice_origin', '=', self.name)]) diff --git a/fleet_car_workshop/models/material_used.py b/fleet_car_workshop/models/material_used.py new file mode 100644 index 000000000..990d271a2 --- /dev/null +++ b/fleet_car_workshop/models/material_used.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Ayana KP (odoo@cybrosys.com) +# +# You can modify it under the terms of the GNU AFFERO +# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. +# +# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE +# (AGPL v3) along with this program. +# If not, see . +# +############################################################################### +from odoo import api, fields, models + + +class MaterialUsed(models.Model): + """Model for material used in car workshop """ + _name = 'material.used' + _description = 'Material Used in Car Workshop' + + material_product_id = fields.Many2one('product.product', + string='Products', + help="Product used for work") + company_id = fields.Many2one('res.company', string='Company', + help='The company of material',required=True, + default=lambda self: self.env.company) + currency_id = fields.Many2one(string='Company Currency',readonly=True, + related='company_id.currency_id', + help='The currency of the company') + quantity = fields.Integer(string='Quantity', help='Amount for material used') + price = fields.Monetary(string='Unit Price', help='Unit price for material') + material_id = fields.Many2one('car.workshop', + help='The work details of material') + + @api.onchange('material_product_id') + def _onchange_material_product_id(self): + """ Function for update total price""" + self.price = self.material_product_id.lst_price diff --git a/fleet_car_workshop/models/planned_work.py b/fleet_car_workshop/models/planned_work.py new file mode 100644 index 000000000..306b4b443 --- /dev/null +++ b/fleet_car_workshop/models/planned_work.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Ayana KP (odoo@cybrosys.com) +# +# You can modify it under the terms of the GNU AFFERO +# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. +# +# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE +# (AGPL v3) along with this program. +# If not, see . +# +############################################################################### +from odoo import api, fields, models + + +class PlannedWork(models.Model): + """Model for planned work in car workshop""" + _name = 'planned.work' + _description = 'Planned Work in Car Workshop' + + planned_work_id = fields.Many2one('product.product', + string='Planned work', + help='Planned work details') + time_spent = fields.Float(string='Estimated Time',help='Estimated time for the work') + work_date = fields.Datetime(string='Date', + help='Date of work planned:planned date') + user_id = fields.Many2one('res.users', string='Responsible', + help='The responsible user') + work_id = fields.Many2one('car.workshop', string="Work id", + help='The work details') + work_cost = fields.Float(string="Service Cost", + help='The service cost of work') + is_completed = fields.Boolean(string="Completed", + help='If enabling this field indicates that ' + 'this work completed') + duration = fields.Float(string='Duration', help='Time taken for the work') + work_date2 = fields.Datetime(string='Date',help='Date of work ' + 'completed/done:completed' + ' date') + + @api.onchange('planned_work_id') + def _onchange_planned_work_id(self): + """ Compute work cost based on planned work""" + self.work_cost = self.planned_work_id.lst_price diff --git a/fleet_car_workshop/models/res_config_settings.py b/fleet_car_workshop/models/res_config_settings.py new file mode 100644 index 000000000..b31807961 --- /dev/null +++ b/fleet_car_workshop/models/res_config_settings.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Ayana KP (odoo@cybrosys.com) +# +# You can modify it under the terms of the GNU AFFERO +# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. +# +# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE +# (AGPL v3) along with this program. +# If not, see . +# +############################################################################### +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + """Inherit config settings for adding journal field """ + _inherit = 'res.config.settings' + + invoice_journal_id = fields.Many2one('account.journal', + string="Car Workshop Journal", + config_parameter='fleet_car_workshop.invoice_journal_type', + help='Set a journal for workshop') diff --git a/fleet_car_workshop/models/vehicle_details.py b/fleet_car_workshop/models/vehicle_details.py new file mode 100644 index 000000000..61e076684 --- /dev/null +++ b/fleet_car_workshop/models/vehicle_details.py @@ -0,0 +1,129 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Ayana KP (odoo@cybrosys.com) +# +# You can modify it under the terms of the GNU AFFERO +# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. +# +# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE +# (AGPL v3) along with this program. +# If not, see . +# +############################################################################### +from odoo.tools.translate import _ +from odoo import fields, models + + +class VehicleDetails(models.Model): + """Model for vehicle details in car work shop""" + _name = 'vehicle.details' + _description = "Vehicles Details in Car Workshop" + _inherit = ['mail.thread'] + _rec_name = 'vehicle_id' + + active = fields.Boolean('Active', default=True, + help='Enables will Active this record') + vehicle_id = fields.Many2one('fleet.vehicle', + string='Vehicle Name', help='Vehicle details', + 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_ids = fields.One2many('car.workshop', + 'vehicle_id',string="Task Activities", + help=' The work details of vehicle') + type_ids = fields.Many2many('worksheet.stages', + 'car_workshop_type_rel', + 'vehicle_id', 'type_id', + string='Worksheet Stages', + help='The type of vehicle') + task_count = fields.Integer(compute='_compute_task_count', type='integer', + string="Tasks", + help='The number of created for the vehicle') + task_ids = fields.One2many('car.workshop', 'vehicle_id', + help='The task of vehicle created', + domain=['|', ('stage_id.is_fold', '=', False), + ('stage_id', '=', False)]) + doc_count = fields.Integer(compute='_compute_attached_docs_count', + string="Number of documents attached", + help='The number of attachments created') + color = fields.Integer(string='Color Index', help='The color of tags') + partner_id = fields.Many2one('res.partner', string='Customer', + help='The owner of vehicle') + state = fields.Selection([('draft', 'New'), + ('open', 'In Progress'), + ('cancelled', 'Cancelled'), + ('pending', 'Pending'), + ('close', 'Closed')], string='Status', + required=True, tracking=True, default='open', + copy=False, help='State details of vehicle') + date = fields.Date(string='Expiration Date', index=True, + tracking=True) + is_use_tasks = fields.Boolean(string='Use in Tasks', default=True) + image_128 = fields.Image(related='vehicle_id.image_128', readonly=False) + + def _get_visibility_selection_id(self, cr, uid, context=None): + """Returns the list of users in work shop """ + 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): + """Used to compute the attached document in work shop task""" + Attachment = self.env['ir.attachment'] + for vehicle in self: + vehicle.doc_count = Attachment.search_count([ + '|', + '&', + ('res_model', '=', 'vehicle.details'), ('res_id', '=', vehicle.id), + '&', + ('res_model', '=', 'car.worksheet'), + ('res_id', 'in', vehicle.task_ids.ids) + ]) + + def _compute_task_count(self): + """Used to compute the task count for a vehicle """ + for vehicle in self: + vehicle.task_count = len(vehicle.task_ids) + + def attachment_tree_views(self): + """ Get the attachment in the task """ + self.ensure_one() + domain = [ + '|', + '&', ('res_model', '=', 'vehicle.details'), ('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': _('''

+ Documents are attached to the tasks and issues of your Worksheet.

+ Send messages or log internal notes with attachments to link + documents to your Worksheet. +

'''), + 'limit': 80, + 'context': "{'default_res_model': '%s','default_res_id': %d}" % ( + self._name, self.id) + } diff --git a/fleet_car_workshop/models/worksheet_stages.py b/fleet_car_workshop/models/worksheet_stages.py new file mode 100644 index 000000000..5b68be5b9 --- /dev/null +++ b/fleet_car_workshop/models/worksheet_stages.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Ayana KP (odoo@cybrosys.com) +# +# You can modify it under the terms of the GNU AFFERO +# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. +# +# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE +# (AGPL v3) along with this program. +# If not, see . +# +############################################################################### +from odoo import fields, models + + +class WorksheetStages(models.Model): + """Model for work sheet stages """ + _name = 'worksheet.stages' + _description = 'worksheet Stage of Worksheet' + _order = 'sequence' + + def _default_vehicle_ids(self): + """Get the default vehicle id """ + 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, + help='Name of the stage') + description = fields.Text(string='Description', translate=True, + help='Description of the stage') + sequence = fields.Integer(string='Sequence',help='Sequence of the stage') + vehicle_ids = fields.Many2many('vehicle.details', + 'worksheet_type_rel', 'type_id', + 'vehicle_id', string='Vehicles', + default=_default_vehicle_ids, + help='Vehicle details of the stage') + is_fold = fields.Boolean(string='Folded in Tasks Pipeline', + help='This stage is folded in the kanban view when ' + 'there are no records in that stage to display.') diff --git a/fleet_car_workshop/models/worksheet_tag.py b/fleet_car_workshop/models/worksheet_tag.py new file mode 100644 index 000000000..91812aa4b --- /dev/null +++ b/fleet_car_workshop/models/worksheet_tag.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Ayana KP (odoo@cybrosys.com) +# +# You can modify it under the terms of the GNU AFFERO +# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. +# +# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE +# (AGPL v3) along with this program. +# If not, see . +# +############################################################################### +from odoo import fields, models + + +class WorksheetTag(models.Model): + """Model for work sheet tags""" + _name = "worksheet.tag" + _description = "Tags of Vehicles Tasks" + + name = fields.Char(string='Name', required=True, help='Name of the tag') + color = fields.Integer(string='Color Index', help='Color of the tag') + + _sql_constraints = [ + ('name_uniq', 'unique (name)', "Tag name already exists !"), + ] diff --git a/fleet_car_workshop/security/fleet_vehicle_security.xml b/fleet_car_workshop/security/fleet_vehicle_security.xml new file mode 100644 index 000000000..faf82fefc --- /dev/null +++ b/fleet_car_workshop/security/fleet_vehicle_security.xml @@ -0,0 +1,30 @@ + + + + + + Manager has all rights on vehicle + + + + + Car Workshop + Car Workshop + 20 + + + User + + + + + + Manager + + + + + + diff --git a/fleet_car_workshop/security/ir.model.access.csv b/fleet_car_workshop/security/ir.model.access.csv new file mode 100644 index 000000000..9239ebde6 --- /dev/null +++ b/fleet_car_workshop/security/ir.model.access.csv @@ -0,0 +1,13 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_vehicle_details_user,vehicle.details.user,fleet_car_workshop.model_vehicle_details,fleet_car_workshop.fleet_car_workshop_user,1,0,0,0 +access_car_workshop_user,car.workshop.user,fleet_car_workshop.model_car_workshop,fleet_car_workshop.fleet_car_workshop_user,1,1,1,0 +access_worksheet_tag_all_user,vehicle.details.tags.all,fleet_car_workshop.model_worksheet_tag,fleet_car_workshop.fleet_car_workshop_user,1,1,1,0 +access_worksheet_stages_user,worksheet.stages.user,fleet_car_workshop.model_worksheet_stages,fleet_car_workshop.fleet_car_workshop_user,1,1,1,0 +access_material_used_user,material.used.user,fleet_car_workshop.model_material_used,fleet_car_workshop.fleet_car_workshop_user,1,1,1,0 +access_planned_work_user,planned.work.user,fleet_car_workshop.model_planned_work,fleet_car_workshop.fleet_car_workshop_user,1,1,1,0 +access_vehicle_details_manager,vehicle.details.manager,fleet_car_workshop.model_vehicle_details,fleet_car_workshop.fleet_car_workshop_manager,1,1,1,1 +access_car_workshop_manager,car.workshop.manager,fleet_car_workshop.model_car_workshop,fleet_car_workshop.fleet_car_workshop_manager,1,1,1,1 +access_worksheet_tag_all_manager,vehicle.details.tags.all.manager,fleet_car_workshop.model_worksheet_tag,fleet_car_workshop.fleet_car_workshop_manager,1,1,1,1 +access_worksheet_stages_manager,worksheet.stages.manager,fleet_car_workshop.model_worksheet_stages,fleet_car_workshop.fleet_car_workshop_manager,1,1,1,1 +access_material_used_manager,material.used.manager,fleet_car_workshop.model_material_used,fleet_car_workshop.fleet_car_workshop_manager,1,1,1,1 +access_planned_work_manager,planned.work.manager,fleet_car_workshop.model_planned_work,fleet_car_workshop.fleet_car_workshop_manager,1,1,1,1 \ No newline at end of file diff --git a/fleet_car_workshop/static/description/assets/icons/capture (1).png b/fleet_car_workshop/static/description/assets/icons/capture (1).png new file mode 100644 index 000000000..8824deafc Binary files /dev/null and b/fleet_car_workshop/static/description/assets/icons/capture (1).png differ diff --git a/fleet_car_workshop/static/description/assets/icons/check.png b/fleet_car_workshop/static/description/assets/icons/check.png new file mode 100644 index 000000000..c8e85f51d Binary files /dev/null and b/fleet_car_workshop/static/description/assets/icons/check.png differ diff --git a/fleet_car_workshop/static/description/assets/icons/chevron.png b/fleet_car_workshop/static/description/assets/icons/chevron.png new file mode 100644 index 000000000..2089293d6 Binary files /dev/null and b/fleet_car_workshop/static/description/assets/icons/chevron.png differ diff --git a/fleet_car_workshop/static/description/assets/icons/cogs.png b/fleet_car_workshop/static/description/assets/icons/cogs.png new file mode 100644 index 000000000..95d0bad62 Binary files /dev/null and b/fleet_car_workshop/static/description/assets/icons/cogs.png differ diff --git a/fleet_car_workshop/static/description/assets/icons/consultation.png b/fleet_car_workshop/static/description/assets/icons/consultation.png new file mode 100644 index 000000000..8319d4baa Binary files /dev/null and b/fleet_car_workshop/static/description/assets/icons/consultation.png differ diff --git a/fleet_car_workshop/static/description/assets/icons/ecom-black.png b/fleet_car_workshop/static/description/assets/icons/ecom-black.png new file mode 100644 index 000000000..a9385ff13 Binary files /dev/null and b/fleet_car_workshop/static/description/assets/icons/ecom-black.png differ diff --git a/fleet_car_workshop/static/description/assets/icons/education-black.png b/fleet_car_workshop/static/description/assets/icons/education-black.png new file mode 100644 index 000000000..3eb09b27b Binary files /dev/null and b/fleet_car_workshop/static/description/assets/icons/education-black.png differ diff --git a/fleet_car_workshop/static/description/assets/icons/hotel-black.png b/fleet_car_workshop/static/description/assets/icons/hotel-black.png new file mode 100644 index 000000000..130f613be Binary files /dev/null and b/fleet_car_workshop/static/description/assets/icons/hotel-black.png differ diff --git a/fleet_car_workshop/static/description/assets/icons/img.png b/fleet_car_workshop/static/description/assets/icons/img.png new file mode 100644 index 000000000..70197f477 Binary files /dev/null and b/fleet_car_workshop/static/description/assets/icons/img.png differ diff --git a/fleet_car_workshop/static/description/assets/icons/license.png b/fleet_car_workshop/static/description/assets/icons/license.png new file mode 100644 index 000000000..a5869797e Binary files /dev/null and b/fleet_car_workshop/static/description/assets/icons/license.png differ diff --git a/fleet_car_workshop/static/description/assets/icons/lifebuoy.png b/fleet_car_workshop/static/description/assets/icons/lifebuoy.png new file mode 100644 index 000000000..658d56ccc Binary files /dev/null and b/fleet_car_workshop/static/description/assets/icons/lifebuoy.png differ diff --git a/fleet_car_workshop/static/description/assets/icons/manufacturing-black.png b/fleet_car_workshop/static/description/assets/icons/manufacturing-black.png new file mode 100644 index 000000000..697eb0e9f Binary files /dev/null and b/fleet_car_workshop/static/description/assets/icons/manufacturing-black.png differ diff --git a/fleet_car_workshop/static/description/assets/icons/photo-capture.png b/fleet_car_workshop/static/description/assets/icons/photo-capture.png new file mode 100644 index 000000000..06c111758 Binary files /dev/null and b/fleet_car_workshop/static/description/assets/icons/photo-capture.png differ diff --git a/fleet_car_workshop/static/description/assets/icons/pos-black.png b/fleet_car_workshop/static/description/assets/icons/pos-black.png new file mode 100644 index 000000000..97c0f90c1 Binary files /dev/null and b/fleet_car_workshop/static/description/assets/icons/pos-black.png differ diff --git a/fleet_car_workshop/static/description/assets/icons/puzzle.png b/fleet_car_workshop/static/description/assets/icons/puzzle.png new file mode 100644 index 000000000..65cf854e7 Binary files /dev/null and b/fleet_car_workshop/static/description/assets/icons/puzzle.png differ diff --git a/fleet_car_workshop/static/description/assets/icons/restaurant-black.png b/fleet_car_workshop/static/description/assets/icons/restaurant-black.png new file mode 100644 index 000000000..4a35eb939 Binary files /dev/null and b/fleet_car_workshop/static/description/assets/icons/restaurant-black.png differ diff --git a/fleet_car_workshop/static/description/assets/icons/service-black.png b/fleet_car_workshop/static/description/assets/icons/service-black.png new file mode 100644 index 000000000..301ab51cb Binary files /dev/null and b/fleet_car_workshop/static/description/assets/icons/service-black.png differ diff --git a/fleet_car_workshop/static/description/assets/icons/trading-black.png b/fleet_car_workshop/static/description/assets/icons/trading-black.png new file mode 100644 index 000000000..9398ba2f1 Binary files /dev/null and b/fleet_car_workshop/static/description/assets/icons/trading-black.png differ diff --git a/fleet_car_workshop/static/description/assets/icons/training.png b/fleet_car_workshop/static/description/assets/icons/training.png new file mode 100644 index 000000000..884ca024d Binary files /dev/null and b/fleet_car_workshop/static/description/assets/icons/training.png differ diff --git a/fleet_car_workshop/static/description/assets/icons/update.png b/fleet_car_workshop/static/description/assets/icons/update.png new file mode 100644 index 000000000..ecbc5a01a Binary files /dev/null and b/fleet_car_workshop/static/description/assets/icons/update.png differ diff --git a/fleet_car_workshop/static/description/assets/icons/user.png b/fleet_car_workshop/static/description/assets/icons/user.png new file mode 100644 index 000000000..6ffb23d9f Binary files /dev/null and b/fleet_car_workshop/static/description/assets/icons/user.png differ diff --git a/fleet_car_workshop/static/description/assets/icons/wrench.png b/fleet_car_workshop/static/description/assets/icons/wrench.png new file mode 100644 index 000000000..6c04dea0f Binary files /dev/null and b/fleet_car_workshop/static/description/assets/icons/wrench.png differ diff --git a/fleet_car_workshop/static/description/assets/misc/Cybrosys R.png b/fleet_car_workshop/static/description/assets/misc/Cybrosys R.png new file mode 100644 index 000000000..da4058087 Binary files /dev/null and b/fleet_car_workshop/static/description/assets/misc/Cybrosys R.png differ diff --git a/fleet_car_workshop/static/description/assets/misc/email.svg b/fleet_car_workshop/static/description/assets/misc/email.svg new file mode 100644 index 000000000..15291cdc3 --- /dev/null +++ b/fleet_car_workshop/static/description/assets/misc/email.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fleet_car_workshop/static/description/assets/misc/phone.svg b/fleet_car_workshop/static/description/assets/misc/phone.svg new file mode 100644 index 000000000..b7bd7f251 --- /dev/null +++ b/fleet_car_workshop/static/description/assets/misc/phone.svg @@ -0,0 +1,3 @@ + + + diff --git a/fleet_car_workshop/static/description/assets/misc/star (1) 2.svg b/fleet_car_workshop/static/description/assets/misc/star (1) 2.svg new file mode 100644 index 000000000..5ae9f507a --- /dev/null +++ b/fleet_car_workshop/static/description/assets/misc/star (1) 2.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/fleet_car_workshop/static/description/assets/misc/support (1) 1.svg b/fleet_car_workshop/static/description/assets/misc/support (1) 1.svg new file mode 100644 index 000000000..7d37a8f30 --- /dev/null +++ b/fleet_car_workshop/static/description/assets/misc/support (1) 1.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/fleet_car_workshop/static/description/assets/misc/support-email.svg b/fleet_car_workshop/static/description/assets/misc/support-email.svg new file mode 100644 index 000000000..eb70370d6 --- /dev/null +++ b/fleet_car_workshop/static/description/assets/misc/support-email.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/fleet_car_workshop/static/description/assets/misc/tick-mark.svg b/fleet_car_workshop/static/description/assets/misc/tick-mark.svg new file mode 100644 index 000000000..2dbb40187 --- /dev/null +++ b/fleet_car_workshop/static/description/assets/misc/tick-mark.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/fleet_car_workshop/static/description/assets/misc/whatsapp 1.svg b/fleet_car_workshop/static/description/assets/misc/whatsapp 1.svg new file mode 100644 index 000000000..0bfaf8fc6 --- /dev/null +++ b/fleet_car_workshop/static/description/assets/misc/whatsapp 1.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/fleet_car_workshop/static/description/assets/misc/whatsapp.svg b/fleet_car_workshop/static/description/assets/misc/whatsapp.svg new file mode 100644 index 000000000..b618aea1d --- /dev/null +++ b/fleet_car_workshop/static/description/assets/misc/whatsapp.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fleet_car_workshop/static/description/assets/modules/1.png b/fleet_car_workshop/static/description/assets/modules/1.png new file mode 100644 index 000000000..ba1058c42 Binary files /dev/null and b/fleet_car_workshop/static/description/assets/modules/1.png differ diff --git a/fleet_car_workshop/static/description/assets/modules/2.png b/fleet_car_workshop/static/description/assets/modules/2.png new file mode 100644 index 000000000..6949185dd Binary files /dev/null and b/fleet_car_workshop/static/description/assets/modules/2.png differ diff --git a/fleet_car_workshop/static/description/assets/modules/3.png b/fleet_car_workshop/static/description/assets/modules/3.png new file mode 100644 index 000000000..4e506f79b Binary files /dev/null and b/fleet_car_workshop/static/description/assets/modules/3.png differ diff --git a/fleet_car_workshop/static/description/assets/modules/4.png b/fleet_car_workshop/static/description/assets/modules/4.png new file mode 100644 index 000000000..e78427938 Binary files /dev/null and b/fleet_car_workshop/static/description/assets/modules/4.png differ diff --git a/fleet_car_workshop/static/description/assets/modules/5.png b/fleet_car_workshop/static/description/assets/modules/5.png new file mode 100755 index 000000000..272ec20f9 Binary files /dev/null and b/fleet_car_workshop/static/description/assets/modules/5.png differ diff --git a/fleet_car_workshop/static/description/assets/modules/6.png b/fleet_car_workshop/static/description/assets/modules/6.png new file mode 100644 index 000000000..7d5c3154f Binary files /dev/null and b/fleet_car_workshop/static/description/assets/modules/6.png differ diff --git a/fleet_car_workshop/static/description/assets/screenshots/1.1.png b/fleet_car_workshop/static/description/assets/screenshots/1.1.png new file mode 100644 index 000000000..ef3736080 Binary files /dev/null and b/fleet_car_workshop/static/description/assets/screenshots/1.1.png differ diff --git a/fleet_car_workshop/static/description/assets/screenshots/1.10.png b/fleet_car_workshop/static/description/assets/screenshots/1.10.png new file mode 100644 index 000000000..d5db556ce Binary files /dev/null and b/fleet_car_workshop/static/description/assets/screenshots/1.10.png differ diff --git a/fleet_car_workshop/static/description/assets/screenshots/1.2.png b/fleet_car_workshop/static/description/assets/screenshots/1.2.png new file mode 100644 index 000000000..c66c8320a Binary files /dev/null and b/fleet_car_workshop/static/description/assets/screenshots/1.2.png differ diff --git a/fleet_car_workshop/static/description/assets/screenshots/1.3.png b/fleet_car_workshop/static/description/assets/screenshots/1.3.png new file mode 100644 index 000000000..046fa10b5 Binary files /dev/null and b/fleet_car_workshop/static/description/assets/screenshots/1.3.png differ diff --git a/fleet_car_workshop/static/description/assets/screenshots/1.4.png b/fleet_car_workshop/static/description/assets/screenshots/1.4.png new file mode 100644 index 000000000..2e54a0b65 Binary files /dev/null and b/fleet_car_workshop/static/description/assets/screenshots/1.4.png differ diff --git a/fleet_car_workshop/static/description/assets/screenshots/1.5.png b/fleet_car_workshop/static/description/assets/screenshots/1.5.png new file mode 100644 index 000000000..0cb5b3525 Binary files /dev/null and b/fleet_car_workshop/static/description/assets/screenshots/1.5.png differ diff --git a/fleet_car_workshop/static/description/assets/screenshots/1.6.png b/fleet_car_workshop/static/description/assets/screenshots/1.6.png new file mode 100644 index 000000000..a2cf3ae39 Binary files /dev/null and b/fleet_car_workshop/static/description/assets/screenshots/1.6.png differ diff --git a/fleet_car_workshop/static/description/assets/screenshots/1.7.png b/fleet_car_workshop/static/description/assets/screenshots/1.7.png new file mode 100644 index 000000000..6f9060801 Binary files /dev/null and b/fleet_car_workshop/static/description/assets/screenshots/1.7.png differ diff --git a/fleet_car_workshop/static/description/assets/screenshots/1.8.png b/fleet_car_workshop/static/description/assets/screenshots/1.8.png new file mode 100644 index 000000000..4898f9951 Binary files /dev/null and b/fleet_car_workshop/static/description/assets/screenshots/1.8.png differ diff --git a/fleet_car_workshop/static/description/assets/screenshots/1.9.png b/fleet_car_workshop/static/description/assets/screenshots/1.9.png new file mode 100644 index 000000000..bdd37f13e Binary files /dev/null and b/fleet_car_workshop/static/description/assets/screenshots/1.9.png differ diff --git a/fleet_car_workshop/static/description/assets/screenshots/hero.gif b/fleet_car_workshop/static/description/assets/screenshots/hero.gif new file mode 100644 index 000000000..981f21e9e Binary files /dev/null and b/fleet_car_workshop/static/description/assets/screenshots/hero.gif differ diff --git a/fleet_car_workshop/static/description/banner.png b/fleet_car_workshop/static/description/banner.png new file mode 100644 index 000000000..f9706edbe Binary files /dev/null and b/fleet_car_workshop/static/description/banner.png differ diff --git a/fleet_car_workshop/static/description/icon.png b/fleet_car_workshop/static/description/icon.png new file mode 100644 index 000000000..844d66d35 Binary files /dev/null and b/fleet_car_workshop/static/description/icon.png differ diff --git a/fleet_car_workshop/static/description/index.html b/fleet_car_workshop/static/description/index.html new file mode 100644 index 000000000..c9ed99fce --- /dev/null +++ b/fleet_car_workshop/static/description/index.html @@ -0,0 +1,812 @@ + + + + + + + Odoo App 3 Index + + + + + + + + +
+
+
+
+
+ +
+
+
+ Community +
+
+ Enterprise +
+
+ Odoo.sh +
+
+
+
+
+
+

+ Car Workshop

+

+ Designed for Streamlined + Automobile Workshop Management. +

+
+ +
+
+
+
+
+

+ Key Highlights +

+
+
+
+
+
+ +
+
+

+ User Friendly Interface.

+

Manage + automobile workshop with great ease. +

+
+
+
+
+
+
+ +
+
+

+ Effective Time management

+

The Time + Tracking of the completed Work . will be added + as timesheet. +

+
+
+
+
+
+
+ +
+
+

+ Separate Journal Configuration.

+

Add separate + journal for workshop management. +

+
+
+
+
+
+
+ +
+
+

+ Integrated with Accounting.

+

Create invoice + based on the completed work +

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

+ Dashboard of all Vehicles.

+
+
+
+
+
+
+ +
+
+

+ 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 its + own stages.

+
+
+
+
+
+
+ +
+
+

+ All details related to a Work/Task.

+
+
+
+
+
+
+ +
+
+

+ Goto Car Workshop -> Worksheet -> Timesheet
+ In timesheet, Planned work is the sub work + related to main + Work. By ticking 'Completed' that work will + be automatically + updated to Work done.
+ -> Work done is the details of completed + works.
+ -> Hour spent is time taken for completed + work(Work Done).
+ -> Remaining Hour is total time + left(Difference between Total Time + and Hour Spent).

+
+
+
+
+
+
+ +
+
+

+ Tabular details of Vehicles.

+
+
+
+
+
+
+ +
+
+

+ Configure preferred Journal for + Invoicing
+ Goto Car Workshop -> Configuration -> + Settings

+
+
+
+
+
+
+ + +
+
+

+ Invoices from the Car Workshop will be saved + to separate + Journal. + Goto Car Workshop -> Worksheet -> Create + Invoices

+
+
+
+
+ +
+
+
    +
  • + User Friendly Interface. +
  • +
  • + Effective Time management. +
  • +
  • + Separate Journal Configuration. +
  • +
  • + Integrated with Accounting. +
  • +
+
+
+
+
+
+
Version + 17.0.1.0.0|Released on:3rd November 2023 +
+

+ Initial Commit for Car Workshop.

+
+
+
+
+
+
+
+

+ Related Products

+
+
+ +
+
+

+ Our Services

+
+
+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Customization

+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Implementation

+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Support

+
+
+
+
+
+
+ service-icon +
+
+

Hire + Odoo Developer

+
+
+
+
+ +
+
+ service-icon +
+
+

Odoo + Integration

+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Migration

+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Consultancy

+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Implementation

+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Licensing Consultancy

+
+
+
+
+
+
+

+ Our Industries

+
+
+
+
+
+
+ +

Trading

+

Easily procure and sell your products

+
+
+
+
+ +

POS

+

Easy configuration and convivial experience

+
+
+
+
+ +

+ Education

+

A platform for educational management

+
+
+
+
+ +

+ Manufacturing

+

Plan, track and schedule your operations

+
+
+
+
+ +

E-commerce & + Website

+

Mobile friendly, awe-inspiring product pages

+
+
+
+
+ +

Service + Management

+

Keep track of services and invoice

+
+
+
+
+ +

+ Restaurant

+

Run your bar or restaurant methodically

+
+
+
+
+ +

Hotel + Management

+

An all-inclusive hotel management application

+
+
+
+
+
+
+

+ Support

+
+
+
+
+
+
+
+ +
+ Need + Help? +

Got + questions or need help? Get in touch.

+
odoo@cybrosys.com +
+
+
+
+
+
+
+
+ +
+ WhatsApp +

Say hi to + us on WhatsApp!

+
+91 + 99456767686 +
+
+
+
+
+
+
+
+
+ + + + + + diff --git a/fleet_car_workshop/views/car_workshop_reports.xml b/fleet_car_workshop/views/car_workshop_reports.xml new file mode 100644 index 000000000..7ba7662ec --- /dev/null +++ b/fleet_car_workshop/views/car_workshop_reports.xml @@ -0,0 +1,20 @@ + + + + + Worksheets + car.workshop + graph,pivot + +

+ 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. +

+
+
+ + +
diff --git a/fleet_car_workshop/views/car_workshop_views.xml b/fleet_car_workshop/views/car_workshop_views.xml new file mode 100644 index 000000000..e5eb5d602 --- /dev/null +++ b/fleet_car_workshop/views/car_workshop_views.xml @@ -0,0 +1,318 @@ + + + + + car.workshop.view.form + car.workshop + +
+
+
+
+ +
+ +
+ +
+ +
+

+ + + +

+
+ + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + car.workshop.view.kanban + car.workshop + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ + + +
+
+ + oe_kanban_text_red + + + + + + +
+
+ +
+
+ img +
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+ + car.workshop.view.tree + car.workshop + + + + + + + + + + + + + + car.workshop.view.calender + car.workshop + + + + + + + + + + car.workshop.view.pivot + car.workshop + + + + + + + + + car.workshop.view.graph + car.workshop + + + + + + + + + car.workshop.search.form + car.workshop + + + + + + + + + + + + + + + + + + + + + + + + + + Worksheets + car.workshop + kanban,tree,form,calendar,pivot,graph + {'search_default_vehicle_id': [active_id], + 'default_vehicle_id':active_id} + + + +

+ 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. +

+
+
+ + Worksheets + car.workshop + kanban,tree,form,calendar,pivot,graph + +

+ 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. +

+
+
+ + + + + diff --git a/fleet_car_workshop/views/material_used_views.xml b/fleet_car_workshop/views/material_used_views.xml new file mode 100644 index 000000000..5e5976eea --- /dev/null +++ b/fleet_car_workshop/views/material_used_views.xml @@ -0,0 +1,36 @@ + + + + + material.used.view.form + material.used + +
+ + + + + + + + + + + +
+
+
+ + material.used.view.tree + material.used + + + + + + + + + + +
diff --git a/fleet_car_workshop/views/res_config_settings_views.xml b/fleet_car_workshop/views/res_config_settings_views.xml new file mode 100644 index 000000000..a6035350a --- /dev/null +++ b/fleet_car_workshop/views/res_config_settings_views.xml @@ -0,0 +1,47 @@ + + + + + + res.config.settings.view.form.inherit.fleet.car.workshop + + res.config.settings + + + + +
+

Car Work Shop

+
+
+
+
+ Separate Journal + +
+ Choose Journal + +
+
+
+
+
+ + + + + Settings + ir.actions.act_window + res.config.settings + form + inline + {'module' : 'fleet_car_workshop'} + + + diff --git a/fleet_car_workshop/views/vehicle_details_views.xml b/fleet_car_workshop/views/vehicle_details_views.xml new file mode 100644 index 000000000..4f8deccf8 --- /dev/null +++ b/fleet_car_workshop/views/vehicle_details_views.xml @@ -0,0 +1,210 @@ + + + + + vehicle.details.view.form + vehicle.details + +
+
+ +
+ +
+ + + +
+ +
+

+ +

+
+
+ +
+
+
+ + + + + + + +
+
+ + +
+
+
+
+ + vehicle.details.view.search + vehicle.details + + + + + + + + + + + + + + + + + vehicle.details.view.kanban + vehicle.details + + + + + + + + + + + + + + +
+
+
+ + Vehicle + +
+
+
+ + + +
+

+

+ +

+
+
+
+
+
+ +
+ +
+
+
+
+
+
+
+
+ + vehicle.details.view.tree + vehicle.details + + + + + + + + + + Vehicles + vehicle.details + kanban,form + + +

+ Create a new project. +

+

+ Organize your activities (plan tasks, track issues, invoice + timesheets) for internal, personal or + customer projects. +

+
+
+ + Vehicles + vehicle.details + tree,form + + +

+ Create a new vehicle. +

+
+
+ + +
diff --git a/fleet_car_workshop/views/worksheet_stages_views.xml b/fleet_car_workshop/views/worksheet_stages_views.xml new file mode 100644 index 000000000..74dae9712 --- /dev/null +++ b/fleet_car_workshop/views/worksheet_stages_views.xml @@ -0,0 +1,81 @@ + + + + + worksheet.stages.view.form + worksheet.stages + +
+ +
+
+
+

+ +

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

+ You can also add a description to help your + co-workers understand the meaning and + purpose of the stage. +

+ +
+
+
+
+
+ + worksheet.stages.view.tree + worksheet.stages + + + + + + + + + + + + Stages + worksheet.stages + tree,form + + + Service-Products + ir.actions.act_window + product.product + kanban,tree,form + {"search_default_services":'service'} + +

+ Click to define a new product. +

+
+
+ + +
diff --git a/fleet_car_workshop/views/worksheet_tag_views.xml b/fleet_car_workshop/views/worksheet_tag_views.xml new file mode 100644 index 000000000..86ba00c54 --- /dev/null +++ b/fleet_car_workshop/views/worksheet_tag_views.xml @@ -0,0 +1,44 @@ + + + + + worksheet.tag.view.tree + worksheet.tag + + + + + + + + + worksheet.tag.view.form + worksheet.tag + +
+ + + + + + + + + + +
+
+
+ + Tags + worksheet.tag + tree,form + +

+ Click to add a new tag. +

+
+
+ +