From 12ec001b382cc19268afad909a0af42f093ea8e1 Mon Sep 17 00:00:00 2001 From: pranaysaidurga Date: Fri, 12 Jun 2026 15:00:28 +0530 Subject: [PATCH] business travel expenses --- .../__init__.py | 2 + .../__manifest__.py | 38 ++++ .../data/trip_sequence.xml | 9 + .../data/users.xml | 9 + .../models/__init__.py | 9 + .../models/hr_job.py | 28 +++ .../models/travel_activity.py | 114 +++++++++++ .../models/travel_city_category.py | 17 ++ .../models/travel_daily_allowance.py | 25 +++ .../models/travel_expense.py | 112 +++++++++++ .../models/travel_group.py | 25 +++ .../models/travel_mode_policy.py | 31 +++ .../models/travel_stay_policy.py | 26 +++ .../models/travel_trip.py | 179 ++++++++++++++++++ .../security/ir.model.access.csv | 11 ++ .../security/travel_groups.xml | 18 ++ .../security/travel_trip_rules.xml | 27 +++ .../static/decription/banner.png | Bin 0 -> 31116 bytes .../static/decription/icon.png | Bin 0 -> 31116 bytes .../views/hr_job_view.xml | 16 ++ .../views/travel_activity_views.xml | 134 +++++++++++++ .../views/travel_city_category_views.xml | 54 ++++++ .../views/travel_daily_allowance_view.xml | 44 +++++ .../views/travel_expense_views.xml | 66 +++++++ .../views/travel_group_view.xml | 43 +++++ .../views/travel_menu.xml | 61 ++++++ .../views/travel_mode_policy_view.xml | 41 ++++ .../views/travel_stay_policy_view.xml | 42 ++++ .../views/travel_trip_views.xml | 170 +++++++++++++++++ .../wizard/__init__.py | 1 + .../wizard/trip_reject_wizard.py | 19 ++ .../wizard/trip_reject_wizard_view.xml | 31 +++ 32 files changed, 1402 insertions(+) create mode 100644 addons_extensions/business_travel_expense_management/__init__.py create mode 100644 addons_extensions/business_travel_expense_management/__manifest__.py create mode 100644 addons_extensions/business_travel_expense_management/data/trip_sequence.xml create mode 100644 addons_extensions/business_travel_expense_management/data/users.xml create mode 100644 addons_extensions/business_travel_expense_management/models/__init__.py create mode 100644 addons_extensions/business_travel_expense_management/models/hr_job.py create mode 100644 addons_extensions/business_travel_expense_management/models/travel_activity.py create mode 100644 addons_extensions/business_travel_expense_management/models/travel_city_category.py create mode 100644 addons_extensions/business_travel_expense_management/models/travel_daily_allowance.py create mode 100644 addons_extensions/business_travel_expense_management/models/travel_expense.py create mode 100644 addons_extensions/business_travel_expense_management/models/travel_group.py create mode 100644 addons_extensions/business_travel_expense_management/models/travel_mode_policy.py create mode 100644 addons_extensions/business_travel_expense_management/models/travel_stay_policy.py create mode 100644 addons_extensions/business_travel_expense_management/models/travel_trip.py create mode 100644 addons_extensions/business_travel_expense_management/security/ir.model.access.csv create mode 100644 addons_extensions/business_travel_expense_management/security/travel_groups.xml create mode 100644 addons_extensions/business_travel_expense_management/security/travel_trip_rules.xml create mode 100644 addons_extensions/business_travel_expense_management/static/decription/banner.png create mode 100644 addons_extensions/business_travel_expense_management/static/decription/icon.png create mode 100644 addons_extensions/business_travel_expense_management/views/hr_job_view.xml create mode 100644 addons_extensions/business_travel_expense_management/views/travel_activity_views.xml create mode 100644 addons_extensions/business_travel_expense_management/views/travel_city_category_views.xml create mode 100644 addons_extensions/business_travel_expense_management/views/travel_daily_allowance_view.xml create mode 100644 addons_extensions/business_travel_expense_management/views/travel_expense_views.xml create mode 100644 addons_extensions/business_travel_expense_management/views/travel_group_view.xml create mode 100644 addons_extensions/business_travel_expense_management/views/travel_menu.xml create mode 100644 addons_extensions/business_travel_expense_management/views/travel_mode_policy_view.xml create mode 100644 addons_extensions/business_travel_expense_management/views/travel_stay_policy_view.xml create mode 100644 addons_extensions/business_travel_expense_management/views/travel_trip_views.xml create mode 100644 addons_extensions/business_travel_expense_management/wizard/__init__.py create mode 100644 addons_extensions/business_travel_expense_management/wizard/trip_reject_wizard.py create mode 100644 addons_extensions/business_travel_expense_management/wizard/trip_reject_wizard_view.xml diff --git a/addons_extensions/business_travel_expense_management/__init__.py b/addons_extensions/business_travel_expense_management/__init__.py new file mode 100644 index 000000000..3f3abeb49 --- /dev/null +++ b/addons_extensions/business_travel_expense_management/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import wizard diff --git a/addons_extensions/business_travel_expense_management/__manifest__.py b/addons_extensions/business_travel_expense_management/__manifest__.py new file mode 100644 index 000000000..1f612318e --- /dev/null +++ b/addons_extensions/business_travel_expense_management/__manifest__.py @@ -0,0 +1,38 @@ +{ + 'name': 'Business Travel & Expense Management', + 'version': '1.0', + 'summary': 'Enterprise Business Travel & Expense Management', + 'description': """ + Business Travel (Trips) & Expense Management Module. + - Pre-approved Trips + - Trip lifecycle management + - Expense tracking per Trip + - Manager & Finance approvals + - Reimbursement workflow + """, + 'category': 'Human Resources', + 'author': 'Karuna', + 'depends': ['base', 'hr'], + 'data': [ + 'security/travel_groups.xml', + 'security/travel_trip_rules.xml', + 'security/ir.model.access.csv', + # 'data/users.xml', + 'data/trip_sequence.xml', + 'wizard/trip_reject_wizard_view.xml', + 'views/hr_job_view.xml', # 👈 hr extension BEFORE menus + 'views/travel_trip_views.xml', + 'views/travel_city_category_views.xml', + 'views/travel_group_view.xml', + 'views/travel_stay_policy_view.xml', # 👈 ADD HERE + 'views/travel_daily_allowance_view.xml', + 'views/travel_mode_policy_view.xml', + 'views/travel_expense_views.xml', + 'views/travel_activity_views.xml', + 'views/travel_menu.xml', + + ], + 'images': ['static/description/banner.png'], + 'installable': True, + 'application': True, +} diff --git a/addons_extensions/business_travel_expense_management/data/trip_sequence.xml b/addons_extensions/business_travel_expense_management/data/trip_sequence.xml new file mode 100644 index 000000000..07447e1c7 --- /dev/null +++ b/addons_extensions/business_travel_expense_management/data/trip_sequence.xml @@ -0,0 +1,9 @@ + + + + Travel Trip + travel.trip + TRIP/%(year)s/ + 4 + + diff --git a/addons_extensions/business_travel_expense_management/data/users.xml b/addons_extensions/business_travel_expense_management/data/users.xml new file mode 100644 index 000000000..8e0e658f2 --- /dev/null +++ b/addons_extensions/business_travel_expense_management/data/users.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/addons_extensions/business_travel_expense_management/models/__init__.py b/addons_extensions/business_travel_expense_management/models/__init__.py new file mode 100644 index 000000000..246afe4cc --- /dev/null +++ b/addons_extensions/business_travel_expense_management/models/__init__.py @@ -0,0 +1,9 @@ +from . import travel_trip +from . import travel_expense +from . import travel_activity +from . import travel_city_category +from . import travel_group +from . import hr_job +from . import travel_stay_policy +from . import travel_daily_allowance +from . import travel_mode_policy diff --git a/addons_extensions/business_travel_expense_management/models/hr_job.py b/addons_extensions/business_travel_expense_management/models/hr_job.py new file mode 100644 index 000000000..5b78fa389 --- /dev/null +++ b/addons_extensions/business_travel_expense_management/models/hr_job.py @@ -0,0 +1,28 @@ +from odoo import models, fields, api + +class HrJob(models.Model): + _inherit = 'hr.job' + + designation_level = fields.Selection([ + ('a', 'Level A'), + ('b', 'Level B'), + ('c', 'Level C'), + ], string="Designation Level") + + travel_group_id = fields.Many2one( + 'travel.group', + compute='_compute_travel_group', + store=True, + readonly=True + ) + + @api.depends('designation_level') + def _compute_travel_group(self): + for rec in self: + if rec.designation_level: + group = self.env['travel.group'].search([ + ('level_code', '=', rec.designation_level) + ], limit=1) + rec.travel_group_id = group.id + else: + rec.travel_group_id = False diff --git a/addons_extensions/business_travel_expense_management/models/travel_activity.py b/addons_extensions/business_travel_expense_management/models/travel_activity.py new file mode 100644 index 000000000..5eb9b1504 --- /dev/null +++ b/addons_extensions/business_travel_expense_management/models/travel_activity.py @@ -0,0 +1,114 @@ +from odoo import models, fields, api + + +class TravelActivity(models.Model): + _name = 'travel.activity' + _description = 'Travel Activity' + _order = 'sequence, id' + + # -------------------- + # BASIC + # -------------------- + sequence = fields.Integer(default=10) + name = fields.Char(string="Activity Title", required=True) + + trip_id = fields.Many2one( + 'travel.trip', + required=True, + ondelete='cascade' + ) + + activity_type = fields.Selection([ + ('travel', 'Travel'), + ('stay', 'Stay'), + ('meeting', 'Meeting'), + ('local', 'Local Travel'), + ], required=True) + + start_datetime = fields.Datetime("Start Time") + end_datetime = fields.Datetime("End Time") + + # -------------------- + # COMPUTED GROUP (VERY IMPORTANT) + # -------------------- + travel_group_id = fields.Many2one( + 'travel.group', + string="Travel Group", + compute="_compute_travel_group", + store=True + ) + + @api.depends('trip_id') + def _compute_travel_group(self): + for rec in self: + rec.travel_group_id = rec.trip_id.travel_group_id + + # -------------------- + # TRAVEL MODE (FILTERED BY GROUP) + # -------------------- + travel_mode_policy_id = fields.Many2one( + 'travel.mode.policy', + string="Travel Mode", + domain=""" + [ + ('travel_group_id', '=', travel_group_id), + ('mode_type', '=', activity_type), + ('active', '=', True) + ] + """ + ) + + from_location = fields.Char() + to_location = fields.Char() + travel_details = fields.Char() + + # -------------------- + # OTHER FIELDS + # -------------------- + stay_type = fields.Selection([ + ('hotel', 'Hotel'), + ('guest', 'Guest House'), + ]) + + hotel_name = fields.Char() + city = fields.Char() + # city_category_id = fields.Many2one( + # 'travel.city.category', + # string="City Category" + # ) + checkin = fields.Datetime() + checkout = fields.Datetime() + + meeting_title = fields.Char() + meeting_location = fields.Char() + notes = fields.Text() + + local_travel_mode = fields.Selection([ + ('cab', 'Cab'), + ('own', 'Own Vehicle'), + ], string="Local Travel Mode") + + attachment_ids = fields.Many2many( + 'ir.attachment', + 'travel_activity_attachment_rel', + 'activity_id', + 'attachment_id', + string="Documents" + ) + + expense_ids = fields.One2many( + 'travel.expense', + 'activity_id', + string="Expenses" + ) + + total_amount = fields.Float( + string='Activity Total', + compute='_compute_total_amount', + store=True + ) + + @api.depends('expense_ids.amount') + def _compute_total_amount(self): + for rec in self: + rec.total_amount = sum(rec.expense_ids.mapped('amount')) \ No newline at end of file diff --git a/addons_extensions/business_travel_expense_management/models/travel_city_category.py b/addons_extensions/business_travel_expense_management/models/travel_city_category.py new file mode 100644 index 000000000..88b52b9b7 --- /dev/null +++ b/addons_extensions/business_travel_expense_management/models/travel_city_category.py @@ -0,0 +1,17 @@ +from odoo import models, fields + +class TravelCityCategory(models.Model): + _name = 'travel.city.category' + _description = 'Travel City Category' + + name = fields.Char( + string="City Category", + required=True + ) + + code = fields.Char( + string="Code", + help="Short code like AP_TG_HYD, AP_TG_OTHER, ROI" + ) + + active = fields.Boolean(default=True) diff --git a/addons_extensions/business_travel_expense_management/models/travel_daily_allowance.py b/addons_extensions/business_travel_expense_management/models/travel_daily_allowance.py new file mode 100644 index 000000000..913092244 --- /dev/null +++ b/addons_extensions/business_travel_expense_management/models/travel_daily_allowance.py @@ -0,0 +1,25 @@ +from odoo import models, fields + + +class TravelDailyAllowance(models.Model): + _name = 'travel.daily.allowance' + _description = 'Daily Allowance Policy' + _rec_name = 'travel_group_id' + + travel_group_id = fields.Many2one( + 'travel.group', + string="Travel Group", + required=True + ) + + city_category_id = fields.Many2one( + 'travel.city.category', + string="City Category", + required=True + ) + + amount = fields.Float(string="Allowance Amount") + + actuals_allowed = fields.Boolean(string="Actuals Allowed") + + active = fields.Boolean(default=True) \ No newline at end of file diff --git a/addons_extensions/business_travel_expense_management/models/travel_expense.py b/addons_extensions/business_travel_expense_management/models/travel_expense.py new file mode 100644 index 000000000..bf48811e5 --- /dev/null +++ b/addons_extensions/business_travel_expense_management/models/travel_expense.py @@ -0,0 +1,112 @@ +from odoo import models, fields, api +from odoo.exceptions import UserError +from odoo.exceptions import ValidationError + + + +class TravelExpense(models.Model): + _name = 'travel.expense' + _description = 'Travel Expense' + _order = 'expense_date desc, id desc' + + name = fields.Char(string="Expense Description", required=True) + expense_date = fields.Date(default=fields.Date.today) + amount = fields.Monetary(required=True) + + activity_id = fields.Many2one( + 'travel.activity', + string="Activity", + required=True, + ondelete='cascade' + ) + receipt = fields.Binary() + + currency_id = fields.Many2one( + 'res.currency', + default=lambda self: self.env.company.currency_id + ) + + state = fields.Selection([ + ('draft', 'Draft'), + ('submitted', 'Submitted'), + ('approved', 'Approved'), + ('rejected', 'Rejected'), + ], default='draft') + + # ---------------- Actions ---------------- + + @api.depends('expense_ids.amount') + def _compute_total_amount(self): + for rec in self: + rec.total_amount = sum(rec.expense_ids.mapped('amount')) + + @api.onchange('expense_ids') + def _onchange_expense_ids(self): + self.total_amount = sum(self.expense_ids.mapped('amount')) + + def action_submit(self): + for rec in self: + if rec.state != 'draft': + raise UserError("Only Draft expenses can be submitted.") + rec.state = 'submitted' + rec.message_post(body="🟡 Expense submitted.") + + def action_approve(self): + for rec in self: + if rec.state != 'submitted': + raise UserError("Only Submitted expenses can be approved.") + + manager_user = rec.activity_id.trip_id.manager_id.sudo().user_id + if manager_user != self.env.user: + raise UserError("Only the reporting manager can approve.") + + rec.state = 'approved' + rec.message_post(body="🟢 Expense approved.") + + def action_mark_reimbursed(self): + for rec in self: + if rec.state != 'approved': + raise UserError("Only Approved expenses can be reimbursed.") + + if not self.env.user.has_group( + 'business_travel_expense_management.group_travel_finance' + ): + raise UserError("Only Finance can reimburse.") + + rec.state = 'reimbursed' + rec.message_post(body="💰 Expense reimbursed.") + + @api.constrains('amount', 'activity_id') + def _check_stay_policy(self): + for record in self: + + activity = record.activity_id + + if not activity or activity.activity_type != 'stay': + continue + + trip = activity.trip_id + group = trip.travel_group_id + city_category = trip.city_category_id # 👈 NOW FROM TRIP + + if not group: + raise ValidationError("Trip must have a Travel Group.") + + if not city_category: + raise ValidationError("Trip must have a City Category selected.") + + policy = self.env['travel.stay.policy'].search([ + ('travel_group_id', '=', group.id), + ('city_category_id', '=', city_category.id), + ('active', '=', True) + ], limit=1) + + if not policy: + raise ValidationError( + f"No Stay Policy configured for Group '{group.name}' and City '{city_category.name}'." + ) + + if record.amount > policy.max_amount: + raise ValidationError( + f"Stay expense exceeds allowed limit of {policy.max_amount}." + ) \ No newline at end of file diff --git a/addons_extensions/business_travel_expense_management/models/travel_group.py b/addons_extensions/business_travel_expense_management/models/travel_group.py new file mode 100644 index 000000000..37835298e --- /dev/null +++ b/addons_extensions/business_travel_expense_management/models/travel_group.py @@ -0,0 +1,25 @@ +from odoo import models, fields + +class TravelGroup(models.Model): + _name = 'travel.group' + _description = 'Travel Group' + + name = fields.Char(string='Travel Group', required=True) + active = fields.Boolean(default=True) + + job_ids = fields.One2many( + 'hr.job', + 'travel_group_id', + string="Designations" + ) + + level_code = fields.Selection([ + ('a', 'Level A'), + ('b', 'Level B'), + ('c', 'Level C'), + ], required=True) + + allowed_travel_mode_ids = fields.Many2many( + 'travel.mode', + string="Allowed Travel Modes" + ) \ No newline at end of file diff --git a/addons_extensions/business_travel_expense_management/models/travel_mode_policy.py b/addons_extensions/business_travel_expense_management/models/travel_mode_policy.py new file mode 100644 index 000000000..231e9a37b --- /dev/null +++ b/addons_extensions/business_travel_expense_management/models/travel_mode_policy.py @@ -0,0 +1,31 @@ +from odoo import models, fields + + +class TravelModePolicy(models.Model): + _name = 'travel.mode.policy' + _description = 'Travel Mode Policy' + _rec_name = 'travel_mode' # This makes dropdown show Flight/2AC etc + + travel_group_id = fields.Many2one( + 'travel.group', + string="Travel Group", + required=True, + ondelete='cascade' + ) + + mode_type = fields.Selection([ + ('travel', 'Travel'), + ('local', 'Local Travel'), + ], string="Mode Type", required=True) + + travel_mode = fields.Selection([ + ('flight', 'Flight'), + ('2ac', 'II AC'), + ('3ac', 'III AC'), + ('1st_class', '1st Class'), + ('car', 'Car'), + ('taxi', 'Taxi'), + ('auto', 'Auto'), + ], string="Travel Mode", required=True) + + active = fields.Boolean(default=True) \ No newline at end of file diff --git a/addons_extensions/business_travel_expense_management/models/travel_stay_policy.py b/addons_extensions/business_travel_expense_management/models/travel_stay_policy.py new file mode 100644 index 000000000..f7666e71f --- /dev/null +++ b/addons_extensions/business_travel_expense_management/models/travel_stay_policy.py @@ -0,0 +1,26 @@ +from odoo import models, fields + +class TravelStayPolicy(models.Model): + _name = 'travel.stay.policy' + _description = 'Travel Stay Policy' + + travel_group_id = fields.Many2one( + 'travel.group', + string='Travel Group', + required=True + ) + city_category_id = fields.Many2one( + 'travel.city.category', + string='City Category', + required=True + ) + + min_amount = fields.Float(string='Min Amount') + max_amount = fields.Float(string='Max Amount') + + is_actuals = fields.Boolean( + string='Actuals Allowed', + help='If checked, actual hotel cost is allowed' + ) + + active = fields.Boolean(default=True) diff --git a/addons_extensions/business_travel_expense_management/models/travel_trip.py b/addons_extensions/business_travel_expense_management/models/travel_trip.py new file mode 100644 index 000000000..3a1fcdf47 --- /dev/null +++ b/addons_extensions/business_travel_expense_management/models/travel_trip.py @@ -0,0 +1,179 @@ +from odoo import models, fields, api +from odoo.exceptions import UserError + + +class TravelTrip(models.Model): + _name = 'travel.trip' + _description = 'Business Travel Trip' + _inherit = ['mail.thread', 'mail.activity.mixin'] + _order = 'id desc' + + name = fields.Char( + string='Trip Reference', + required=True, + copy=False, + readonly=True, + default='New', + tracking=True + ) + + employee_id = fields.Many2one( + 'hr.employee', + string='Employee', + required=True, + tracking=True + ) + + department_id = fields.Many2one( + 'hr.department', + compute='_compute_emp_details', + store=True, + readonly=True, + tracking=True, + compute_sudo=True, # IMPORTANT + ) + + manager_id = fields.Many2one( + 'hr.employee', + compute='_compute_emp_details', + store=True, + readonly=True, + tracking=True, + compute_sudo=True, # IMPORTANT + ) + + purpose = fields.Text(tracking=True) + from_location = fields.Char(tracking=True) + to_location = fields.Char(tracking=True) + start_date = fields.Date(tracking=True) + end_date = fields.Date(tracking=True) + estimated_cost = fields.Float(tracking=True) + + reject_reason = fields.Text(string="Reject Reason", tracking=True) + + state = fields.Selection([ + ('draft', 'Draft'), + ('submitted', 'Submitted'), + ('approved', 'Approved'), + ('completed', 'Completed'), + ('reimbursed', 'Reimbursed'), + ], default='draft', tracking=True) + + # expense_ids = fields.One2many( + # 'travel.expense', + # 'trip_id', + # string='Expenses' + # ) + + trave_activity_ids = fields.One2many( + 'travel.activity', # child model + 'trip_id', # inverse field in travel.activity + string="Activities" + ) + total_expense = fields.Float( + string='Activity Total', + compute='_compute_total_expense', + store=True + ) + + travel_group_id = fields.Many2one( + 'travel.group', + string='Travel Group', + related='employee_id.job_id.travel_group_id', + store=True, + readonly=True + ) + city_category_id = fields.Many2one( + 'travel.city.category', + string="City Category", + required=True + ) + + @api.depends('trave_activity_ids.total_amount') + def _compute_total_expense(self): + for rec in self: + rec.total_expense = sum(rec.trave_activity_ids.mapped('total_amount')) + + + # ---------------- COMPUTE ---------------- + + @api.depends('employee_id') + def _compute_emp_details(self): + for rec in self: + if rec.employee_id: + emp = rec.employee_id.sudo() + rec.department_id = emp.department_id + rec.manager_id = emp.parent_id + else: + rec.department_id = False + rec.manager_id = False + + # ---------------- CREATE ---------------- + + @api.model + def create(self, vals): + if vals.get('name', 'New') == 'New': + vals['name'] = self.env['ir.sequence'].next_by_code('travel.trip') or 'New' + return super().create(vals) + + # ---------------- ACTIONS ---------------- + + def action_submit(self): + for rec in self: + # Submit all DRAFT expenses inside ALL activities + activities = rec.trave_activity_ids + + expenses = activities.mapped('expense_ids').filtered( + lambda e: e.state == 'draft' + ) + + expenses.write({'state': 'submitted'}) + + rec.state = 'submitted' + + def action_approve(self): + for rec in self: + if rec.state != 'submitted': + raise UserError('Only Submitted trips can be approved.') + + # Only reporting manager or admin can approve + manager_user = rec.manager_id.sudo().user_id + if not self.env.is_admin() and (not manager_user or manager_user != self.env.user): + raise UserError("Only the reporting manager can approve this trip.") + + rec.state = 'approved' + + rec.message_post( + body=f"Trip {rec.name} has been approved by {self.env.user.name}.", + subtype_xmlid="mail.mt_comment" + ) + + + + def action_mark_completed(self): + for rec in self: + if rec.state != 'approved': + raise UserError('Only Approved trips can be marked as Completed.') + + rec.state = 'completed' + + rec.message_post( + body=f"Trip {rec.name} has been marked as Completed.", + subtype_xmlid="mail.mt_comment" + ) + + is_current_user_manager = fields.Boolean( + compute="_compute_is_current_user_manager", + store=False + ) + + def _compute_is_current_user_manager(self): + for rec in self: + rec.is_current_user_manager = ( + rec.manager_id + and rec.manager_id.sudo().user_id + and rec.manager_id.sudo().user_id.id == self.env.user.id + ) + + + diff --git a/addons_extensions/business_travel_expense_management/security/ir.model.access.csv b/addons_extensions/business_travel_expense_management/security/ir.model.access.csv new file mode 100644 index 000000000..2a6a06ea3 --- /dev/null +++ b/addons_extensions/business_travel_expense_management/security/ir.model.access.csv @@ -0,0 +1,11 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_travel_trip,travel.trip,model_travel_trip,base.group_user,1,1,1,1 +access_travel_expense,travel.expense,model_travel_expense,base.group_user,1,1,1,1 +access_trip_reject_wizard,trip.reject.wizard,model_trip_reject_wizard,base.group_user,1,1,1,1 +access_travel_activity_employee,travel.activity employee,model_travel_activity,base.group_user,1,1,1,1 +access_travel_activity_user,travel.activity user,model_travel_activity,base.group_user,1,1,1,1 +access_travel_city_category,travel.city.category,model_travel_city_category,base.group_user,1,1,1,1 +access_travel_group_user,travel.group user,model_travel_group,base.group_user,1,1,1,1 +access_travel_stay_policy,travel.stay.policy,model_travel_stay_policy,base.group_user,1,1,1,1 +access_travel_daily_allowance_user,access_travel_daily_allowance_user,model_travel_daily_allowance,base.group_user,1,1,1,1 +access_travel_mode_policy_user,access_travel_mode_policy_user,model_travel_mode_policy,base.group_user,1,1,1,1 \ No newline at end of file diff --git a/addons_extensions/business_travel_expense_management/security/travel_groups.xml b/addons_extensions/business_travel_expense_management/security/travel_groups.xml new file mode 100644 index 000000000..6ea3e36fc --- /dev/null +++ b/addons_extensions/business_travel_expense_management/security/travel_groups.xml @@ -0,0 +1,18 @@ + + + Travel - Employee + + + + + Travel - Manager + + + + + + Travel - Finance + + + + diff --git a/addons_extensions/business_travel_expense_management/security/travel_trip_rules.xml b/addons_extensions/business_travel_expense_management/security/travel_trip_rules.xml new file mode 100644 index 000000000..ab38fc66d --- /dev/null +++ b/addons_extensions/business_travel_expense_management/security/travel_trip_rules.xml @@ -0,0 +1,27 @@ + + + + + Travel Trip: Employee Own + + [('employee_id.user_id', '=', user.id)] + + + + + + Travel Trip: Manager Team + + [('manager_id.user_id', '=', user.id)] + + + + + + Travel Trip: Admin All + + [(1,'=',1)] + + + + diff --git a/addons_extensions/business_travel_expense_management/static/decription/banner.png b/addons_extensions/business_travel_expense_management/static/decription/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..234fa7fa336bdbfd8e439f4ad37510bbd8e9ce0b GIT binary patch literal 31116 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 z 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 literal 0 HcmV?d00001 diff --git a/addons_extensions/business_travel_expense_management/static/decription/icon.png b/addons_extensions/business_travel_expense_management/static/decription/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..234fa7fa336bdbfd8e439f4ad37510bbd8e9ce0b GIT binary patch literal 31116 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 z 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 literal 0 HcmV?d00001 diff --git a/addons_extensions/business_travel_expense_management/views/hr_job_view.xml b/addons_extensions/business_travel_expense_management/views/hr_job_view.xml new file mode 100644 index 000000000..2a9471f5f --- /dev/null +++ b/addons_extensions/business_travel_expense_management/views/hr_job_view.xml @@ -0,0 +1,16 @@ + + + hr.job.form.inherit.travel.group + hr.job + + + + + + + + + + + + diff --git a/addons_extensions/business_travel_expense_management/views/travel_activity_views.xml b/addons_extensions/business_travel_expense_management/views/travel_activity_views.xml new file mode 100644 index 000000000..67672bb3f --- /dev/null +++ b/addons_extensions/business_travel_expense_management/views/travel_activity_views.xml @@ -0,0 +1,134 @@ + + + + + travel.activity.form + travel.activity + + +
+ + + + +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ + Activity + travel.activity + form + + + + +
diff --git a/addons_extensions/business_travel_expense_management/views/travel_city_category_views.xml b/addons_extensions/business_travel_expense_management/views/travel_city_category_views.xml new file mode 100644 index 000000000..aae34a044 --- /dev/null +++ b/addons_extensions/business_travel_expense_management/views/travel_city_category_views.xml @@ -0,0 +1,54 @@ + + + + + + travel.city.category.tree + travel.city.category + + + + + + + + + + + + travel.city.category.form + travel.city.category + +
+ + + + + + + +
+
+
+ + + + City Categories + travel.city.category + list,form + + + + + + + + + + + + + + + +
diff --git a/addons_extensions/business_travel_expense_management/views/travel_daily_allowance_view.xml b/addons_extensions/business_travel_expense_management/views/travel_daily_allowance_view.xml new file mode 100644 index 000000000..e557ea59a --- /dev/null +++ b/addons_extensions/business_travel_expense_management/views/travel_daily_allowance_view.xml @@ -0,0 +1,44 @@ + + + + + travel.daily.allowance.tree + travel.daily.allowance + + + + + + + + + + + + + + travel.daily.allowance.form + travel.daily.allowance + +
+ + + + + + + + + +
+
+
+ + + + Daily Allowance Policies + travel.daily.allowance + list,form + + +
\ No newline at end of file diff --git a/addons_extensions/business_travel_expense_management/views/travel_expense_views.xml b/addons_extensions/business_travel_expense_management/views/travel_expense_views.xml new file mode 100644 index 000000000..1fb6fa0b4 --- /dev/null +++ b/addons_extensions/business_travel_expense_management/views/travel_expense_views.xml @@ -0,0 +1,66 @@ + + + + + travel.expense.form + travel.expense + +
+ +
+
+ + + +
+

+ +

+ +
+ + + + + + + + + + + + + + + +
+ + + + + +
+
+
+ +
diff --git a/addons_extensions/business_travel_expense_management/views/travel_group_view.xml b/addons_extensions/business_travel_expense_management/views/travel_group_view.xml new file mode 100644 index 000000000..1ae366959 --- /dev/null +++ b/addons_extensions/business_travel_expense_management/views/travel_group_view.xml @@ -0,0 +1,43 @@ + + + + + travel.group.tree + travel.group + + + + + + + + + + + travel.group.form + travel.group + +
+ + + + + + + + + + +
+
+
+ + + + Travel Groups + travel.group + list,form + + + +
diff --git a/addons_extensions/business_travel_expense_management/views/travel_menu.xml b/addons_extensions/business_travel_expense_management/views/travel_menu.xml new file mode 100644 index 000000000..cd4758eda --- /dev/null +++ b/addons_extensions/business_travel_expense_management/views/travel_menu.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/addons_extensions/business_travel_expense_management/views/travel_mode_policy_view.xml b/addons_extensions/business_travel_expense_management/views/travel_mode_policy_view.xml new file mode 100644 index 000000000..f4b822c3f --- /dev/null +++ b/addons_extensions/business_travel_expense_management/views/travel_mode_policy_view.xml @@ -0,0 +1,41 @@ + + + + + travel.mode.policy.tree + travel.mode.policy + + + + + + + + + + + + + travel.mode.policy.form + travel.mode.policy + +
+ + + + + + + + +
+
+
+ + + Travel Mode Policies + travel.mode.policy + list,form + + +
\ No newline at end of file diff --git a/addons_extensions/business_travel_expense_management/views/travel_stay_policy_view.xml b/addons_extensions/business_travel_expense_management/views/travel_stay_policy_view.xml new file mode 100644 index 000000000..01f83ecd4 --- /dev/null +++ b/addons_extensions/business_travel_expense_management/views/travel_stay_policy_view.xml @@ -0,0 +1,42 @@ + + + travel.stay.policy.tree + travel.stay.policy + + + + + + + + + + + + + + travel.stay.policy.form + travel.stay.policy + +
+ + + + + + + + + + +
+
+
+ + + + Stay Policies + travel.stay.policy + list,form + +
diff --git a/addons_extensions/business_travel_expense_management/views/travel_trip_views.xml b/addons_extensions/business_travel_expense_management/views/travel_trip_views.xml new file mode 100644 index 000000000..ffd780953 --- /dev/null +++ b/addons_extensions/business_travel_expense_management/views/travel_trip_views.xml @@ -0,0 +1,170 @@ + + + + + + travel.trip.form + travel.trip + +
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + travel.trip.tree + travel.trip + + + + + + + + + + + + + + + + + Trips + travel.trip + list,form + + + + + + + + + + + + + +
diff --git a/addons_extensions/business_travel_expense_management/wizard/__init__.py b/addons_extensions/business_travel_expense_management/wizard/__init__.py new file mode 100644 index 000000000..d05c3e001 --- /dev/null +++ b/addons_extensions/business_travel_expense_management/wizard/__init__.py @@ -0,0 +1 @@ +from . import trip_reject_wizard diff --git a/addons_extensions/business_travel_expense_management/wizard/trip_reject_wizard.py b/addons_extensions/business_travel_expense_management/wizard/trip_reject_wizard.py new file mode 100644 index 000000000..11338a0a4 --- /dev/null +++ b/addons_extensions/business_travel_expense_management/wizard/trip_reject_wizard.py @@ -0,0 +1,19 @@ +from odoo import models, fields +from odoo.exceptions import UserError + + +class TripRejectWizard(models.TransientModel): + _name = 'trip.reject.wizard' + _description = 'Reject Trip Wizard' + + reason = fields.Text(string="Reason for Rejection", required=True) + + def action_confirm_reject(self): + trip = self.env['travel.trip'].browse(self.env.context.get('active_id')) + if not trip: + raise UserError("No Trip found.") + + trip.write({ + 'state': 'draft', + 'reject_reason': self.reason + }) diff --git a/addons_extensions/business_travel_expense_management/wizard/trip_reject_wizard_view.xml b/addons_extensions/business_travel_expense_management/wizard/trip_reject_wizard_view.xml new file mode 100644 index 000000000..cacb308d7 --- /dev/null +++ b/addons_extensions/business_travel_expense_management/wizard/trip_reject_wizard_view.xml @@ -0,0 +1,31 @@ + + + + + trip.reject.wizard.form + trip.reject.wizard + +
+ + + +
+
+
+
+
+ + + Reject Trip + trip.reject.wizard + form + new + + + +