diff --git a/job_card_management/README.rst b/job_card_management/README.rst new file mode 100644 index 000000000..35007fe0d --- /dev/null +++ b/job_card_management/README.rst @@ -0,0 +1,17 @@ +Job Card Management v15 +======================= +Job Card Management + +Installation +============ + - www.odoo.com/documentation/15.0/setup/install.html + - Install our custom addon + +Configuration +============= + + No additional configurations needed + +Credits +======= + Developer: Megha v15 @ cybrosys, Contact: odoo@cybrosys.com diff --git a/job_card_management/__init__.py b/job_card_management/__init__.py new file mode 100644 index 000000000..d1635c3d8 --- /dev/null +++ b/job_card_management/__init__.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +################################################################################### +# Job Card +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2022-TODAY Cybrosys Technologies (). +# Author: Megha K () +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# 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 for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### + +from . import models diff --git a/job_card_management/__manifest__.py b/job_card_management/__manifest__.py new file mode 100644 index 000000000..7798c1684 --- /dev/null +++ b/job_card_management/__manifest__.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +################################################################################### +# Job Card Management +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2022-TODAY Cybrosys Technologies (). +# Author: Megha K () +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# 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 for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### +{ + 'name': 'Job Card Management', + 'version': '15.0.1.0.0', + 'category': 'Job Card Management', + 'summary': 'Job Card Management', + 'author': 'Cybrosys Techno Solutions', + 'maintainer': 'Cybrosys Techno Solutions', + 'company': 'Cybrosys Techno Solutions', + 'website': 'https://www.cybrosys.com', + 'description': "Job Card Management", + 'depends': ['hr', 'project', 'purchase', 'account', 'hr_timesheet'], + 'images': ['static/description/banner.png'], + 'data': [ + 'security/ir.model.access.csv', + 'views/job_card.xml', + 'views/workshop.xml', + 'views/hr_employee.xml', + 'views/material_requisition.xml', + 'views/job_card_menu.xml', + 'data/job_card_data.xml', + 'report/job_card_report.xml', + 'report/cost_sheet.xml' + + ], + 'installable': True, + 'application': True, + 'auto_install': False, + 'license': 'AGPL-3', +} diff --git a/job_card_management/data/job_card_data.xml b/job_card_management/data/job_card_data.xml new file mode 100644 index 000000000..20a8dd6b1 --- /dev/null +++ b/job_card_management/data/job_card_data.xml @@ -0,0 +1,25 @@ + + + + + Job Card Sequence + job.card.sequence + JC + + + + 6 + + + + Job Card Sequence + material.requisition.sequence + PMR + + + + 6 + + + + \ No newline at end of file diff --git a/job_card_management/doc/RELEASE_NOTES.md b/job_card_management/doc/RELEASE_NOTES.md new file mode 100644 index 000000000..0eb1b18ae --- /dev/null +++ b/job_card_management/doc/RELEASE_NOTES.md @@ -0,0 +1,8 @@ +## Module + +#### 28.10.2022 +#### Version 16.0.1.0.0 +#### ADD + +- Initial Commit job_card_management + diff --git a/job_card_management/models/__init__.py b/job_card_management/models/__init__.py new file mode 100644 index 000000000..3943350a6 --- /dev/null +++ b/job_card_management/models/__init__.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +################################################################################### +# Job Card +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2022-TODAY Cybrosys Technologies (). +# Author: Megha K () +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# 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 for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### + +from . import workshop +from . import hr_employee +from . import job_card +from . import material_requisition diff --git a/job_card_management/models/hr_employee.py b/job_card_management/models/hr_employee.py new file mode 100644 index 000000000..83ad8d5cb --- /dev/null +++ b/job_card_management/models/hr_employee.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +################################################################################### +# Job Card +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2022-TODAY Cybrosys Technologies (). +# Author: Megha K () +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# 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 for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### + +from odoo import models, fields + + +class HrEmployee(models.Model): + _inherit = "hr.employee" + + workshop_position = fields.Selection([('leader', 'Leader'), ('worker', 'Worker')]) + + +class ProjectTask(models.Model): + _inherit = 'project.task' + + job_card_id = fields.Many2one('job.card') + diff --git a/job_card_management/models/job_card.py b/job_card_management/models/job_card.py new file mode 100644 index 000000000..b1d4bfbc7 --- /dev/null +++ b/job_card_management/models/job_card.py @@ -0,0 +1,367 @@ +# -*- coding: utf-8 -*- +################################################################################### +# Job Card +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2022-TODAY Cybrosys Technologies (). +# Author: Megha K () +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# 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 for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### +from werkzeug import urls + +from odoo import models, fields, api, _ +from odoo.exceptions import ValidationError + + +class JobCard(models.Model): + _name = "job.card" + _description = 'Job Cards' + + def _default_currency_id(self): + """get currency id""" + return self.env.user.company_id.currency_id + + card_name = fields.Char('Name', required=True, store=True) + sequence = fields.Char('Name', store=True) + name = fields.Char('Name', store=True) + + start_date = fields.Date('Starting Date', required=True) + end_date = fields.Date('Ending Date', required=False) + project_id = fields.Many2one('project.project', required=True) + user_id = fields.Many2one('res.users', string='Assigned To', required=True) + + quality_checklist_id = fields.Many2many('quality.check.list') + deadline = fields.Date() + + team_id = fields.Many2one('workshop.team') + currency_id = fields.Many2one('res.currency', string='Currency', + required=True, default=lambda + self: self._default_currency_id()) + description = fields.Text('Description') + + instruction_ids = fields.One2many('job.card.instruction', 'job_card_id') + instruction_count = fields.Integer(default=1) + job_cost_sheet_ids = fields.One2many('job.cost.sheet', 'job_card_id') + cost_sheet_amount = fields.Monetary(compute='_compute_cost_sheet_amount', + store=True) + job_cost_sheet_untaxed_amount = fields.Monetary( + compute='_compute_cost_sheet_amount', store=True) + job_card_timesheet_ids = fields.One2many('job.card.timesheet', + 'job_card_id') + state = fields.Selection( + [('draft', 'Draft'), ('submit', 'Submitted'), ('approve', 'Approved'), + ('complete', 'Completed'), ('invoice', 'Invoiced')], default='draft') + partner_id = fields.Many2one('res.partner', string="Customer", + required=True) + email = fields.Char('Mail', help="for share this job card") + total_hours = fields.Float('Total Working Hour', store=True, + compute="_compute_hour") + hours = fields.Float('Total working hour', store=True, + compute="_compute_hour") + planned_hours = fields.Float('Planned Hours', required=True, + help="Planned hour for this task") + mpr_count = fields.Integer(compute='compute_count') + progress = fields.Float(help="progress of this task") + invoice_name = fields.Char('Name', help="reference of invoice") + + def action_submit(self): + """submit""" + for rec in self: + if not rec.instruction_ids.ids: + raise ValidationError( + 'You cant submit the job card without instruction lines') + else: + rec.state = 'submit' + + def action_approve(self): + """approve, Creating task""" + for rec in self: + if not rec.job_cost_sheet_ids.ids: + raise ValidationError( + 'You cant approve the job card without Cost sheet information') + else: + rec.state = 'approve' + + task = rec.env['project.task'].create({ + 'name': rec.name, + 'project_id': rec.project_id.id, + 'user_ids': (4, rec.user_id.id), + 'planned_hours': rec.planned_hours, + 'job_card_id': rec.id + }) + + def action_completed(self): + for rec in self: + rec.state = 'complete' + + @api.depends('job_card_timesheet_ids.time') + def _compute_hour(self): + """calculate time cost amount""" + for rec in self: + rec.cost_sheet_amount = sum( + rec.job_card_timesheet_ids.mapped('time')) + rec.total_hours = sum( + rec.job_card_timesheet_ids.mapped('time')) + rec.hours = rec.planned_hours - rec.total_hours + + @api.depends('job_cost_sheet_ids.amount') + def _compute_cost_sheet_amount(self): + """calculate time cost amount""" + for rec in self: + rec.cost_sheet_amount = sum(rec.job_cost_sheet_ids.mapped('amount')) + rec.job_cost_sheet_untaxed_amount = sum( + rec.job_cost_sheet_ids.mapped('untaxed_amount')) + + @api.onchange('card_name', 'sequence') + def _onchange_card_name(self): + """create the sequence""" + for rec in self: + if not self.sequence: + sequence_code = 'job.card.sequence' + self.sequence = self.env['ir.sequence'].next_by_code( + sequence_code) + + if rec.card_name and rec.sequence: + self.name = self.sequence + ':' + self.card_name + + @api.onchange('job_card_timesheet_ids.time') + def _onchange_time(self): + for rec in self: + rec.hours = sum(rec.job_cost_sheet_ids.mapped('time')) + rec.days = rec.hours / 60 + + def create_pmr(self): + """create purchase material request""" + self.ensure_one() + return { + 'type': 'ir.actions.act_window', + 'name': 'PMR', + 'view_mode': 'form', + 'target': 'new', + 'res_model': 'material.requisition', + 'context': { + 'default_job_card_id': self.id + } + + } + + def get_pmr(self): + """create purchase material request""" + self.ensure_one() + return { + 'type': 'ir.actions.act_window', + 'name': 'PMR', + 'view_mode': 'tree,form', + 'res_model': 'material.requisition', + 'domain': [('job_card_id', '=', self.id)], + 'context': "{'create': False}" + } + + @api.depends('name') + def compute_count(self): + """Compute mr count""" + for rec in self: + if rec.env['material.requisition'].search( + [('job_card_id', '=', rec.id)]): + rec.mpr_count = rec.env['material.requisition'].search_count( + [('job_card_id', '=', rec.id)]) + else: + rec.mpr_count = 0 + + def create_invoice(self): + """Create invoice""" + lines = [] + for rec in self: + if rec.job_cost_sheet_ids: + for job in rec.job_cost_sheet_ids: + value = (0, 0, { + 'product_id': job.product_id.id, + 'price_unit': job.amount, + 'quantity': job.quantity, + }) + lines.append(value) + invoice_line = { + 'move_type': 'out_invoice', + 'partner_id': rec.partner_id.id, + 'invoice_user_id': rec.env.user.id, + 'invoice_origin': rec.name, + 'ref': rec.name, + 'invoice_line_ids': lines, + } + inv = self.env['account.move'].create(invoice_line) + rec.state = 'invoice' + rec.invoice_name = inv.name + + def get_invoice(self): + """View the invoice""" + self.ensure_one() + return { + 'type': 'ir.actions.act_window', + 'name': 'Invoice', + 'view_mode': 'tree,form', + 'res_model': 'account.move', + 'domain': [('ref', '=', self.name)], + 'context': "{'create': False}" + } + + @api.onchange('planned_hours', 'total_hours') + def _onchange_progress(self): + if self.planned_hours and self.total_hours: + self.progress = round(100.0 * self.total_hours / self.planned_hours, + 2) + else: + self.progress = 0.0 + + def share(self): + for rec in self: + base_url = self.env['ir.config_parameter'].sudo().get_param( + 'web.base.url') + Urls = urls.url_join(base_url, + 'web#id=%(id)s&model=job.card&view_type=form' % { + 'id': self.id}) + + mail_content = _('Hi %s,
' + 'Job Card' + '' + ) % \ + (rec.name, Urls, rec.name) + main_content = { + 'subject': _('Job Card: %s') % self.name, + 'author_id': self.env.user.partner_id.id, + 'body_html': mail_content, + 'email_to': rec.partner_id.email + } + + mail_id = self.env['mail.mail'].create(main_content) + mail_id.mail_message_id.body = mail_content + mail_id.send() + + +class JobCardInstruction(models.Model): + _name = "job.card.instruction" + _description = 'Job Cards Instruction' + _rec_name = 'instruction' + + @api.depends('job_card_id') + def _compute_name(self): + for rec in self: + name = rec.job_card_id.name + '/' + str( + rec.job_card_id.instruction_count) + if not rec.name: + rec.job_card_id.instruction_count += 1 + rec.name = name + + job_card_id = fields.Many2one('job.card') + name = fields.Char('Name', compute='_compute_name', store=True) + start_date = fields.Datetime('Starting Date', required=True) + end_date = fields.Datetime('Ending Date', required=False) + user_id = fields.Many2one('res.users', string='Assigned To', required=True) + instruction = fields.Char(help='Instructions', required=True) + notes = fields.Char(help='notes for this instruction') + state = fields.Selection( + [('to_do', 'To Do'), ('in_progress', 'In progress'), ('done', 'Done')], + default='to_do') + + +class CostSheet(models.Model): + _name = 'job.cost.sheet' + _description = 'Cost Sheet' + + type = fields.Selection([('material', 'Material'), ('labour', 'Labour'), + ('overhead', 'Overhead')], required=True, + help='Type of product') + job_card_id = fields.Many2one('job.card') + product_id = fields.Many2one('product.product', required=True) + quantity = fields.Float('Quantity', default=1) + unit_price = fields.Float('Unit Price') + discount = fields.Float('Discount %') + tax = fields.Many2one('account.tax') + amount = fields.Float('Amount') + untaxed_amount = fields.Float('Untaxed Amount') + + @api.onchange('product_id', 'discount', 'tax') + def _onchange_product_id(self): + """calculate the amount""" + for rec in self: + rec.unit_price = rec.product_id.list_price + rec.amount = rec.unit_price * rec.quantity + rec.untaxed_amount = rec.unit_price * rec.quantity + if rec.tax: + taxes = rec.tax.compute_all(**rec._prepare_compute_all_values()) + rec.amount = taxes['total_included'] + rec.untaxed_amount = taxes['total_excluded'] + if rec.discount: + rec.amount = rec.amount - (rec.amount * rec.discount / 100) + rec.untaxed_amount = rec.untaxed_amount - ( + rec.untaxed_amount * rec.discount / 100) + + def _prepare_compute_all_values(self): + """prepare values""" + self.ensure_one() + return { + 'price_unit': self.unit_price, + 'currency': self.job_card_id.currency_id, + 'quantity': self.quantity, + 'product': self.product_id, + 'partner': self.job_card_id.user_id.partner_id, + } + + +class JobCardTimesheet(models.Model): + _name = 'job.card.timesheet' + _description = 'Job Card TimeSheet' + + job_card_id = fields.Many2one('job.card', default=lambda + self: self._default_job_card_id()) + name = fields.Char('Instruction Name', store=True) + instruction_id = fields.Many2one('job.card.instruction', required=True, ) + description = fields.Char('Description') + leader_id = fields.Many2one('hr.employee', required=True, + domain=[('workshop_position', '=', 'leader')], + help="leader for this instruction") + worker_id = fields.Many2one('hr.employee', required=True, + help="workers for this instruction", + string="Workers") + date = fields.Date('Date', default=fields.Date.today()) + time = fields.Float('Time') + + @api.onchange('instruction_id') + def _onchange_instruction_id(self): + for rec in self: + if rec.instruction_id: + rec.name = rec.instruction_id.name + ':' + rec.instruction_id.instruction + + @api.model + def create(self, vals_list): + res = super(JobCardTimesheet, self).create(vals_list) + job_card = self.env['job.card'].browse(vals_list['job_card_id']) + task = self.env['project.task'].search( + [('job_card_id', '=', job_card.id)]) + attendance = self.env['account.analytic.line'].create({ + 'date': vals_list['date'], + 'project_id': job_card.project_id.id, + 'employee_id': vals_list['worker_id'], + 'name': vals_list['description'], + 'unit_amount': vals_list['time'], + 'task_id': task.id + }) + return res diff --git a/job_card_management/models/material_requisition.py b/job_card_management/models/material_requisition.py new file mode 100644 index 000000000..c8888d524 --- /dev/null +++ b/job_card_management/models/material_requisition.py @@ -0,0 +1,92 @@ +# -*- coding: utf-8 -*- +################################################################################### +# Job Card +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2022-TODAY Cybrosys Technologies (). +# Author: Megha K () +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# 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 for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################### +from odoo.exceptions import ValidationError + +from odoo import models, fields, api + + +class MaterialRequisition(models.Model): + _name = "material.requisition" + _description = "Material Requisition" + + name = fields.Char() + employee_id = fields.Many2one('hr.employee', required=True) + department_id = fields.Many2one('hr.department', required=True) + date = fields.Date('Requisition Date') + job_card_id = fields.Many2one('job.card') + line_ids = fields.One2many('material.requisition.line', 'line_id') + state = fields.Selection( + [('draft', 'Draft'), ('submit', 'Submit'), ('approve', 'Approve'), + ('po', 'Purchase Order')], default='draft') + + @api.model + def create(self, vals_list): + """create sequence""" + sequence_code = 'material.requisition.sequence' + vals_list['name'] = self.env['ir.sequence'].next_by_code(sequence_code) + res = super(MaterialRequisition, self).create(vals_list) + return res + + def action_submit(self): + """submit button""" + for rec in self: + if not rec.line_ids.ids: + raise ValidationError( + 'You cant submit the job card without instruction lines') + else: + rec.state = 'submit' + + def action_approve(self): + """approve button""" + for rec in self: + rec.state = 'approve' + + def create_purchase_order(self): + """create purchase order""" + for rec in self: + lines = [] + for line in rec.line_ids: + value = (0, 0, { + 'name': line.product_id.name, + 'product_id': line.product_id.id, + 'price_unit': line.product_id.standard_price, + 'product_qty': line.quantity + }) + lines.append(value) + self.env['purchase.order'].create({ + 'partner_id': line.vendor_id.id, + 'order_line': lines + }) + rec.state = 'po' + + +class MaterialRequisitionLine(models.Model): + _name = "material.requisition.line" + _description = 'Material Requisition Line' + + line_id = fields.Many2one("material.requisition") + name = fields.Char() + product_id = fields.Many2one('product.product', required=True) + quantity = fields.Float(required=True) + uom = fields.Many2one('uom.uom') + vendor_id = fields.Many2one('res.partner', required=True) diff --git a/job_card_management/models/workshop.py b/job_card_management/models/workshop.py new file mode 100644 index 000000000..27b25ee69 --- /dev/null +++ b/job_card_management/models/workshop.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +################################################################################### +# Job Card +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2022-TODAY Cybrosys Technologies (). +# Author: Megha K () +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# 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 for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### + +from odoo import models, fields + + +class WorkshopTeam(models.Model): + _name = 'workshop.team' + _description = 'Workshop Team' + + name = fields.Char('Team Name', help='name of the workshop team', + required=True) + active = fields.Boolean('Active', default=True) + + +class QualityCheckList(models.Model): + _name = 'quality.check.list' + _description = 'Quality Check List' + + name = fields.Char(help='Name for the Quality Check List', required=True) + description = fields.Text('Description') diff --git a/job_card_management/report/cost_sheet.xml b/job_card_management/report/cost_sheet.xml new file mode 100644 index 000000000..ce29f0ba5 --- /dev/null +++ b/job_card_management/report/cost_sheet.xml @@ -0,0 +1,114 @@ + + + + + Cost Sheet + job.card + qweb-pdf + job_card_management.report_cost_sheet + job_card_management.report_cost_sheet + 'Cost Sheet - %s' % object.name + + + report + + + + diff --git a/job_card_management/report/job_card_report.xml b/job_card_management/report/job_card_report.xml new file mode 100644 index 000000000..0e079d13c --- /dev/null +++ b/job_card_management/report/job_card_report.xml @@ -0,0 +1,197 @@ + + + + + Job Card + job.card + qweb-pdf + job_card_management.report_job_card + job_card_management.report_job_card + 'Job card - %s' % object.name + + + report + + + + \ No newline at end of file diff --git a/job_card_management/security/ir.model.access.csv b/job_card_management/security/ir.model.access.csv new file mode 100644 index 000000000..8b61077c7 --- /dev/null +++ b/job_card_management/security/ir.model.access.csv @@ -0,0 +1,9 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_workshop_team,workshop.team,model_workshop_team,,1,1,1,1 +access_quality_check_list,quality.check.list,model_quality_check_list,,1,1,1,1 +access_job_card,job.card,model_job_card,,1,1,1,1 +access_job_card_instruction,job.card.instruction,model_job_card_instruction,,1,1,1,1 +access_job_cost_sheet,job.cost.sheet,model_job_cost_sheet,,1,1,1,1 +access_job_card_timesheet,job.card.timesheet,model_job_card_timesheet,,1,1,1,0 +access_material_requisition,material.requisition,model_material_requisition,,1,1,1,1 +access_material_requisition_line,material.requisition.line,model_material_requisition_line,,1,1,1,1 diff --git a/job_card_management/static/description/assets/icons/check.png b/job_card_management/static/description/assets/icons/check.png new file mode 100644 index 000000000..c8e85f51d Binary files /dev/null and b/job_card_management/static/description/assets/icons/check.png differ diff --git a/job_card_management/static/description/assets/icons/chevron.png b/job_card_management/static/description/assets/icons/chevron.png new file mode 100644 index 000000000..2089293d6 Binary files /dev/null and b/job_card_management/static/description/assets/icons/chevron.png differ diff --git a/job_card_management/static/description/assets/icons/cogs.png b/job_card_management/static/description/assets/icons/cogs.png new file mode 100644 index 000000000..95d0bad62 Binary files /dev/null and b/job_card_management/static/description/assets/icons/cogs.png differ diff --git a/job_card_management/static/description/assets/icons/consultation.png b/job_card_management/static/description/assets/icons/consultation.png new file mode 100644 index 000000000..8319d4baa Binary files /dev/null and b/job_card_management/static/description/assets/icons/consultation.png differ diff --git a/job_card_management/static/description/assets/icons/ecom-black.png b/job_card_management/static/description/assets/icons/ecom-black.png new file mode 100644 index 000000000..a9385ff13 Binary files /dev/null and b/job_card_management/static/description/assets/icons/ecom-black.png differ diff --git a/job_card_management/static/description/assets/icons/education-black.png b/job_card_management/static/description/assets/icons/education-black.png new file mode 100644 index 000000000..3eb09b27b Binary files /dev/null and b/job_card_management/static/description/assets/icons/education-black.png differ diff --git a/job_card_management/static/description/assets/icons/hotel-black.png b/job_card_management/static/description/assets/icons/hotel-black.png new file mode 100644 index 000000000..130f613be Binary files /dev/null and b/job_card_management/static/description/assets/icons/hotel-black.png differ diff --git a/job_card_management/static/description/assets/icons/license.png b/job_card_management/static/description/assets/icons/license.png new file mode 100644 index 000000000..a5869797e Binary files /dev/null and b/job_card_management/static/description/assets/icons/license.png differ diff --git a/job_card_management/static/description/assets/icons/lifebuoy.png b/job_card_management/static/description/assets/icons/lifebuoy.png new file mode 100644 index 000000000..658d56ccc Binary files /dev/null and b/job_card_management/static/description/assets/icons/lifebuoy.png differ diff --git a/job_card_management/static/description/assets/icons/logo.png b/job_card_management/static/description/assets/icons/logo.png new file mode 100644 index 000000000..478462d3e Binary files /dev/null and b/job_card_management/static/description/assets/icons/logo.png differ diff --git a/job_card_management/static/description/assets/icons/manufacturing-black.png b/job_card_management/static/description/assets/icons/manufacturing-black.png new file mode 100644 index 000000000..697eb0e9f Binary files /dev/null and b/job_card_management/static/description/assets/icons/manufacturing-black.png differ diff --git a/job_card_management/static/description/assets/icons/pos-black.png b/job_card_management/static/description/assets/icons/pos-black.png new file mode 100644 index 000000000..97c0f90c1 Binary files /dev/null and b/job_card_management/static/description/assets/icons/pos-black.png differ diff --git a/job_card_management/static/description/assets/icons/puzzle.png b/job_card_management/static/description/assets/icons/puzzle.png new file mode 100644 index 000000000..65cf854e7 Binary files /dev/null and b/job_card_management/static/description/assets/icons/puzzle.png differ diff --git a/job_card_management/static/description/assets/icons/restaurant-black.png b/job_card_management/static/description/assets/icons/restaurant-black.png new file mode 100644 index 000000000..4a35eb939 Binary files /dev/null and b/job_card_management/static/description/assets/icons/restaurant-black.png differ diff --git a/job_card_management/static/description/assets/icons/service-black.png b/job_card_management/static/description/assets/icons/service-black.png new file mode 100644 index 000000000..301ab51cb Binary files /dev/null and b/job_card_management/static/description/assets/icons/service-black.png differ diff --git a/job_card_management/static/description/assets/icons/trading-black.png b/job_card_management/static/description/assets/icons/trading-black.png new file mode 100644 index 000000000..9398ba2f1 Binary files /dev/null and b/job_card_management/static/description/assets/icons/trading-black.png differ diff --git a/job_card_management/static/description/assets/icons/training.png b/job_card_management/static/description/assets/icons/training.png new file mode 100644 index 000000000..884ca024d Binary files /dev/null and b/job_card_management/static/description/assets/icons/training.png differ diff --git a/job_card_management/static/description/assets/icons/update.png b/job_card_management/static/description/assets/icons/update.png new file mode 100644 index 000000000..ecbc5a01a Binary files /dev/null and b/job_card_management/static/description/assets/icons/update.png differ diff --git a/job_card_management/static/description/assets/icons/user.png b/job_card_management/static/description/assets/icons/user.png new file mode 100644 index 000000000..6ffb23d9f Binary files /dev/null and b/job_card_management/static/description/assets/icons/user.png differ diff --git a/job_card_management/static/description/assets/icons/wrench.png b/job_card_management/static/description/assets/icons/wrench.png new file mode 100644 index 000000000..6c04dea0f Binary files /dev/null and b/job_card_management/static/description/assets/icons/wrench.png differ diff --git a/job_card_management/static/description/assets/modules/budget_image.png b/job_card_management/static/description/assets/modules/budget_image.png new file mode 100644 index 000000000..b50130c7d Binary files /dev/null and b/job_card_management/static/description/assets/modules/budget_image.png differ diff --git a/job_card_management/static/description/assets/modules/credit_image.png b/job_card_management/static/description/assets/modules/credit_image.png new file mode 100644 index 000000000..3ad04ecfd Binary files /dev/null and b/job_card_management/static/description/assets/modules/credit_image.png differ diff --git a/job_card_management/static/description/assets/modules/employee_image.png b/job_card_management/static/description/assets/modules/employee_image.png new file mode 100644 index 000000000..30ad58232 Binary files /dev/null and b/job_card_management/static/description/assets/modules/employee_image.png differ diff --git a/job_card_management/static/description/assets/modules/export_image.png b/job_card_management/static/description/assets/modules/export_image.png new file mode 100644 index 000000000..492980ad0 Binary files /dev/null and b/job_card_management/static/description/assets/modules/export_image.png differ diff --git a/job_card_management/static/description/assets/modules/gantt_image.png b/job_card_management/static/description/assets/modules/gantt_image.png new file mode 100644 index 000000000..1ae7cfe3b Binary files /dev/null and b/job_card_management/static/description/assets/modules/gantt_image.png differ diff --git a/job_card_management/static/description/assets/modules/quotation_image.png b/job_card_management/static/description/assets/modules/quotation_image.png new file mode 100644 index 000000000..499b1a72f Binary files /dev/null and b/job_card_management/static/description/assets/modules/quotation_image.png differ diff --git a/job_card_management/static/description/assets/screenshots/hero.gif b/job_card_management/static/description/assets/screenshots/hero.gif new file mode 100644 index 000000000..a4009153e Binary files /dev/null and b/job_card_management/static/description/assets/screenshots/hero.gif differ diff --git a/job_card_management/static/description/assets/screenshots/job1.png b/job_card_management/static/description/assets/screenshots/job1.png new file mode 100644 index 000000000..f84001389 Binary files /dev/null and b/job_card_management/static/description/assets/screenshots/job1.png differ diff --git a/job_card_management/static/description/assets/screenshots/job10.png b/job_card_management/static/description/assets/screenshots/job10.png new file mode 100644 index 000000000..6d0e7db39 Binary files /dev/null and b/job_card_management/static/description/assets/screenshots/job10.png differ diff --git a/job_card_management/static/description/assets/screenshots/job11.png b/job_card_management/static/description/assets/screenshots/job11.png new file mode 100644 index 000000000..26941d732 Binary files /dev/null and b/job_card_management/static/description/assets/screenshots/job11.png differ diff --git a/job_card_management/static/description/assets/screenshots/job12.png b/job_card_management/static/description/assets/screenshots/job12.png new file mode 100644 index 000000000..ccf8833a2 Binary files /dev/null and b/job_card_management/static/description/assets/screenshots/job12.png differ diff --git a/job_card_management/static/description/assets/screenshots/job13.png b/job_card_management/static/description/assets/screenshots/job13.png new file mode 100644 index 000000000..3be1aac9a Binary files /dev/null and b/job_card_management/static/description/assets/screenshots/job13.png differ diff --git a/job_card_management/static/description/assets/screenshots/job14.png b/job_card_management/static/description/assets/screenshots/job14.png new file mode 100644 index 000000000..088aefb0f Binary files /dev/null and b/job_card_management/static/description/assets/screenshots/job14.png differ diff --git a/job_card_management/static/description/assets/screenshots/job15.png b/job_card_management/static/description/assets/screenshots/job15.png new file mode 100644 index 000000000..0d44c13e9 Binary files /dev/null and b/job_card_management/static/description/assets/screenshots/job15.png differ diff --git a/job_card_management/static/description/assets/screenshots/job16.png b/job_card_management/static/description/assets/screenshots/job16.png new file mode 100644 index 000000000..c6f69d735 Binary files /dev/null and b/job_card_management/static/description/assets/screenshots/job16.png differ diff --git a/job_card_management/static/description/assets/screenshots/job17.png b/job_card_management/static/description/assets/screenshots/job17.png new file mode 100644 index 000000000..feffcd7a2 Binary files /dev/null and b/job_card_management/static/description/assets/screenshots/job17.png differ diff --git a/job_card_management/static/description/assets/screenshots/job18.png b/job_card_management/static/description/assets/screenshots/job18.png new file mode 100644 index 000000000..fcae88b9c Binary files /dev/null and b/job_card_management/static/description/assets/screenshots/job18.png differ diff --git a/job_card_management/static/description/assets/screenshots/job2.png b/job_card_management/static/description/assets/screenshots/job2.png new file mode 100644 index 000000000..4b15be997 Binary files /dev/null and b/job_card_management/static/description/assets/screenshots/job2.png differ diff --git a/job_card_management/static/description/assets/screenshots/job3.png b/job_card_management/static/description/assets/screenshots/job3.png new file mode 100644 index 000000000..12a2d3668 Binary files /dev/null and b/job_card_management/static/description/assets/screenshots/job3.png differ diff --git a/job_card_management/static/description/assets/screenshots/job4.png b/job_card_management/static/description/assets/screenshots/job4.png new file mode 100644 index 000000000..533e1563d Binary files /dev/null and b/job_card_management/static/description/assets/screenshots/job4.png differ diff --git a/job_card_management/static/description/assets/screenshots/job5.png b/job_card_management/static/description/assets/screenshots/job5.png new file mode 100644 index 000000000..e1fac721a Binary files /dev/null and b/job_card_management/static/description/assets/screenshots/job5.png differ diff --git a/job_card_management/static/description/assets/screenshots/job6.png b/job_card_management/static/description/assets/screenshots/job6.png new file mode 100644 index 000000000..9cc0faa95 Binary files /dev/null and b/job_card_management/static/description/assets/screenshots/job6.png differ diff --git a/job_card_management/static/description/assets/screenshots/job7.png b/job_card_management/static/description/assets/screenshots/job7.png new file mode 100644 index 000000000..cdc525860 Binary files /dev/null and b/job_card_management/static/description/assets/screenshots/job7.png differ diff --git a/job_card_management/static/description/assets/screenshots/job8.png b/job_card_management/static/description/assets/screenshots/job8.png new file mode 100644 index 000000000..493e5d8cd Binary files /dev/null and b/job_card_management/static/description/assets/screenshots/job8.png differ diff --git a/job_card_management/static/description/assets/screenshots/job9.png b/job_card_management/static/description/assets/screenshots/job9.png new file mode 100644 index 000000000..f34eb6715 Binary files /dev/null and b/job_card_management/static/description/assets/screenshots/job9.png differ diff --git a/job_card_management/static/description/banner.png b/job_card_management/static/description/banner.png new file mode 100644 index 000000000..a6a8b1fd3 Binary files /dev/null and b/job_card_management/static/description/banner.png differ diff --git a/job_card_management/static/description/icon.png b/job_card_management/static/description/icon.png new file mode 100644 index 000000000..9c673a283 Binary files /dev/null and b/job_card_management/static/description/icon.png differ diff --git a/job_card_management/static/description/index.html b/job_card_management/static/description/index.html new file mode 100644 index 000000000..de1cd980a --- /dev/null +++ b/job_card_management/static/description/index.html @@ -0,0 +1,757 @@ +
+
+
+
+ +
+
+
+ Community +
+
+ Enterprise +
+ +
+
+
+
+ +
+
+
+

+ Job Card Management

+

+ A Module For Managing All Job orders +

+ +
+
+ + + +
+
+

+ Overview +

+
+ +
+

+ This module helps you to manage all job orders Workshops, Factory, Any Technical, Repair Shops, Industry.It is a used to manage all + aspects of your job card operations. +

+
+

+ +
+ + +
+
+

+ Features +

+
+ +
+
+ +
+
+

+ Configure Job cards

+
+
+ +
+
+ +
+
+

+ Configure the workshop team

+
+
+ +
+
+ +
+
+

+ Configure workshop positions

+
+
+ +
+
+ +
+
+

+ Manage project and task

+
+
+ +
+
+ +
+
+

+ Product material request

+
+
+ +
+
+ +
+
+

+ Job Card Reports

+
+
+ +
+
+ +
+
+

+ Cash Sheet report

+
+
+ + +
+ +
+
+

+ Screenshots +

+
+
+

+ Job Card

+

+ After installation open freight management go to job card, then create the job cards.

+ +
+ +
+

+ Instructions

+

+ Add the instruction lines. +

+ +
+ +
+

+ Cost Sheet

+

+ Add the cost sheet for this job card. +

+ +
+ + +
+

+ job Card Timesheet

+

+ To submit and approve those job card we have some buttons. After approve this job card we can create the timesheet for this job card. +

+ +
+ + +
+

+ Timesheet

+

+ Create the timesheet, and also we can set view the total worked hour and progress. +

+ +
+ + +
+

+ Extra information

+

+ Customer details and the pending work hours. +

+ +
+ +
+

+ Purchase Material Request

+

+ Create the PMR by clicking this button +

+ + +
+ + +
+

+ Create Invoice

+

+ By click the complete button the state changed to 'Completed'. Then we can see the button to create Invoice. View the Invoice from the smart button +

+ + +
+ +
+

+ Share The Job Card

+

+ By click the share button we can share this job card with our customer. +

+ +
+

+ Job Card report

+

+ By click this button we get the job card report. +

+ +
+ + +
+

+ Cost Sheet report

+

+ By click this button we get the cost sheet report. +

+ +
+ + +

+ Task

+

+ When we approve our job card it automatically create a task. +

+ + +
+ +
+

+ workshop Team

+ + +
+ +
+

+ workshop position

+ +
+ +
+

+ Quality CheckList

+ + +
+ +
+ +
+
+

Suggested Products

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

Our Services

+
+
+ +
+
+ +
+
+ Odoo + Customization
+
+ +
+
+ +
+
+ Odoo + Implementation
+
+ +
+
+ +
+
+ Odoo + Support
+
+ + +
+
+ +
+
+ Hire + Odoo + Developer
+
+ +
+
+ +
+
+ Odoo + Integration
+
+ +
+
+ +
+
+ Odoo + Migration
+
+ + +
+
+ +
+
+ Odoo + Consultancy
+
+ +
+
+ +
+
+ Odoo + Implementation
+
+ +
+
+ +
+
+ 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

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

Need Help?

+
+
+
+ + +
+ +
+ + +
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+
+
+ + +
\ No newline at end of file diff --git a/job_card_management/views/hr_employee.xml b/job_card_management/views/hr_employee.xml new file mode 100644 index 000000000..38c5e40bf --- /dev/null +++ b/job_card_management/views/hr_employee.xml @@ -0,0 +1,27 @@ + + + + + hr.employee.form + hr.employee + + + + + + + + + + project.task.form + project.task + + + + + + + + + + \ No newline at end of file diff --git a/job_card_management/views/job_card.xml b/job_card_management/views/job_card.xml new file mode 100644 index 000000000..b82ff42df --- /dev/null +++ b/job_card_management/views/job_card.xml @@ -0,0 +1,169 @@ + + + + + + Job Card + job.card + + + + + + + + + + Job Card + job.card + +
+
+
+ +
+ + + +
+
+

+ + +

+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + + + + + + + + + +
+
+
+
+
+ + + Job Card + ir.actions.act_window + job.card + tree,form + +

+ Define a new Job Card +

+
+
+ +
+
\ No newline at end of file diff --git a/job_card_management/views/job_card_menu.xml b/job_card_management/views/job_card_menu.xml new file mode 100644 index 000000000..b645e9c5c --- /dev/null +++ b/job_card_management/views/job_card_menu.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/job_card_management/views/material_requisition.xml b/job_card_management/views/material_requisition.xml new file mode 100644 index 000000000..d8de508f3 --- /dev/null +++ b/job_card_management/views/material_requisition.xml @@ -0,0 +1,72 @@ + + + + + Material Requisition + material.requisition + + + + + + + + + Material Requisition + material.requisition + +
+
+
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + Material Requisition + ir.actions.act_window + material.requisition + tree,form + +

+ Define a new Material Requisition +

+
+
+
+
\ No newline at end of file diff --git a/job_card_management/views/workshop.xml b/job_card_management/views/workshop.xml new file mode 100644 index 000000000..7b261bd17 --- /dev/null +++ b/job_card_management/views/workshop.xml @@ -0,0 +1,68 @@ + + + + + + Team + workshop.team + + + + + + + + + + Team + ir.actions.act_window + workshop.team + tree + +

+ Define a new Team +

+
+
+ + + Quality Check List + quality.check.list + + + + + + + + + + Quality Check List + quality.check.list + +
+ + + + + + + +
+
+
+ + + Quality CheckList + ir.actions.act_window + quality.check.list + tree,form + +

+ Define a new Quality CheckList +

+
+
+ +
+
\ No newline at end of file