diff --git a/odex25_hr/hr_training_payment/__init__.py b/odex25_hr/hr_training_payment/__init__.py new file mode 100644 index 000000000..f5ba686bc --- /dev/null +++ b/odex25_hr/hr_training_payment/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import models \ No newline at end of file diff --git a/odex25_hr/hr_training_payment/__manifest__.py b/odex25_hr/hr_training_payment/__manifest__.py new file mode 100644 index 000000000..f469da183 --- /dev/null +++ b/odex25_hr/hr_training_payment/__manifest__.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +{ + 'name': "HR Training Payment", + + 'summary': """ + HR Training Payment + """, + + 'description': """ + HR Training Payment + """, + 'category': 'Odex25-HR/Odex25-HR', + 'version': '1.0', + 'sequence': 6, + 'website': 'http://exp-sa.com', + 'license': 'GPL-3', + 'author': 'Expert Co. Ltd.', + 'depends': ['exp_official_mission','purchase_requisition_custom'], + + 'data': [ + "views/hr_official_mission.xml", + "views/mission_type.xml", + + ], + +} diff --git a/odex25_hr/hr_training_payment/i18n/ar_001.po b/odex25_hr/hr_training_payment/i18n/ar_001.po new file mode 100644 index 000000000..a1c75070d --- /dev/null +++ b/odex25_hr/hr_training_payment/i18n/ar_001.po @@ -0,0 +1,50 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_training_payment +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-02-06 18:03+0000\n" +"PO-Revision-Date: 2025-02-06 18:03+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: hr_training_payment +#: code:addons/hr_training_payment/models/hr_official_mission.py:0 +#, python-format +msgid "" +"Employee \"%s\" has no contract Please create contract to add line to " +"advantages" +msgstr "" + +#. module: hr_training_payment +#: model:ir.model,name:hr_training_payment.model_hr_official_mission +msgid "Official mission" +msgstr "" + +#. module: hr_training_payment +#: model:ir.model.fields,field_description:hr_training_payment.field_hr_official_mission_type__pr_product_id +msgid "PR Product" +msgstr "منتج طلب الشراء" + +#. module: hr_training_payment +#: model:ir.model.fields,field_description:hr_training_payment.field_hr_official_mission__purchase_request_id +msgid "Purchase Request" +msgstr "طلب الشراء" + +#. module: hr_training_payment +#: code:addons/hr_training_payment/models/hr_official_mission.py:0 +#, python-format +msgid "You do not have account or journal in mission type \"%s\" " +msgstr "" + +#. module: hr_training_payment +#: model:ir.model,name:hr_training_payment.model_hr_official_mission_type +msgid "hr.official.mission.type" +msgstr "" diff --git a/odex25_hr/hr_training_payment/models/__init__.py b/odex25_hr/hr_training_payment/models/__init__.py new file mode 100644 index 000000000..59af57ad5 --- /dev/null +++ b/odex25_hr/hr_training_payment/models/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +from . import hr_official_mission +from . import mission_type \ No newline at end of file diff --git a/odex25_hr/hr_training_payment/models/hr_official_mission.py b/odex25_hr/hr_training_payment/models/hr_official_mission.py new file mode 100644 index 000000000..b1f054d25 --- /dev/null +++ b/odex25_hr/hr_training_payment/models/hr_official_mission.py @@ -0,0 +1,141 @@ +# -*- coding: utf-8 -*- + +from odoo import models, fields, api, exceptions +from datetime import datetime, date, timedelta +import calendar + + +class HrOfficialMission(models.Model): + _inherit = 'hr.official.mission' + + purchase_request_id = fields.Many2one(comodel_name='purchase.request', string="Purchase Request") + + + + def approve(self): + # check if there is dealing with financial + self.employee_ids.chick_not_overtime() + if self.mission_type.work_state == 'training': + product_line = { + 'product_id': self.mission_type.pr_product_id.id, + 'qty': 1, + 'expected_price': self.Training_cost, + } + + purchase_request = self.env['purchase.request'].create({ + 'state': 'draft', + 'department_id': self.department_id2.id, + 'date': date.today(), + 'employee_id': self.employee_id.id, + 'partner_id': self.partner_id.id, + 'product_category_ids':[(4, self.mission_type.pr_product_id.categ_id.id)] , + 'purchase_purpose': self.mission_purpose, + 'line_ids': [(0, 0, product_line)] + }) + + self.purchase_request_id = purchase_request.id + else: + + if self.employee_ids and self.mission_type.related_with_financial: + # move amounts to journal entries + if self.move_type == 'accounting': + if self.mission_type.account_id and self.mission_type.journal_id: + for item in self.employee_ids: + if item.amount > 0.0: + debit_line_vals = { + 'name': item.employee_id.name + ' in official mission "%s" ' % self.mission_type.name, + 'debit': item.amount, + 'account_id': self.mission_type.account_id.id, + 'partner_id': item.employee_id.user_id.partner_id.id + } + credit_line_vals = { + 'name': item.employee_id.name + ' in official mission "%s" ' % self.mission_type.name, + 'credit': item.amount, + 'account_id': self.mission_type.journal_id.default_account_id.id, + 'partner_id': item.employee_id.user_id.partner_id.id + } + move = self.env['account.move'].create({ + 'state': 'draft', + 'journal_id': self.mission_type.journal_id.id, + 'date': date.today(), + 'ref': 'Official mission for employee "%s" ' % item.employee_id.name, + 'line_ids': [(0, 0, debit_line_vals), (0, 0, credit_line_vals)] + }) + # fill account move for each employee + item.write({'account_move_id': move.id}) + else: + raise exceptions.Warning( + _('You do not have account or journal in mission type "%s" ') % self.mission_type.name) + + # move amounts to advantages of employee in contract + elif self.move_type == 'payroll': + # get start and end date of the current month + current_date = date.today() + month_start = date(current_date.year, current_date.month, 1) + month_end = date(current_date.year, current_date.month, calendar.mdays[current_date.month]) + for line in self.employee_ids: + if line.employee_id.contract_id: + + advantage_arc = line.env['contract.advantage'].create({ + 'benefits_discounts': self.official_mission.id, + 'date_from': month_start, + 'date_to': month_end, + 'amount': line.amount, + 'official_mission_id': True, + 'employee_id': line.employee_id.id, + 'contract_advantage_id': line.employee_id.contract_id.id, + 'out_rule': True, + 'state': 'confirm', + 'comments': self.mission_purpose}) + line.advantage_id = advantage_arc.id + + print(advantage_arc,"the type is payroll advantage created>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>") + else: + raise exceptions.Warning(_( + 'Employee "%s" has no contract Please create contract to add line to advantages') + % line.employee_id.name) + + for item in self: + # create ticket request from all employee + if item.issuing_ticket == 'yes': + for emp in item.employee_ids: + ticket = self.env['hr.ticket.request'].create({ + 'employee_id': emp.employee_id.id, + 'mission_request_id': item.id, + 'mission_check': True, + 'request_for': item.ticket_cash_request_for, + 'request_type': item.ticket_cash_request_type.id, + 'cost_of_tickets': item.get_ticket_cost(emp.employee_id), + 'destination': item.destination.id, + }) + item.write({'ticket_request_id': ticket.id}) + + # move invoice training cost our trining center + if item.Training_cost > 0: + invoice_line_vals = { + 'name': 'Training Cost for Course Name %s Training Center %s' % ( + item.course_name.name, item.partner_id.name), + 'price_unit': item.Training_cost, + # 'account_id': self.mission_type.journal_id.default_credit_account_id.id, + 'account_id': item.partner_id.property_account_payable_id.id, + # 'partner_id': item.employee_id.user_id.partner_id.id + } + invoice = self.env['account.move'].create({ + 'state': 'draft', + 'move_type': 'in_invoice', + 'journal_id': item.mission_type.journal_id.id, + 'partner_id': item.partner_id.id, + 'invoice_date': date.today(), + 'ref': 'Training Cost for Course Name %s ' % item.course_name.name, + 'invoice_line_ids': [(0, 0, invoice_line_vals)] + }) + item.write({'Tra_cost_invo_id': invoice.id}) + + self.state = "approve" + if self.mission_type.work_state and self.mission_type.duration_type == 'days': + for emp in self.employee_ids: + if emp.date_to >= fields.Date.today() >= emp.date_from: + emp.employee_id.write({'work_state': self.mission_type.work_state, 'active_mission_id': emp.id}) + self.call_cron_function() + + diff --git a/odex25_hr/hr_training_payment/models/mission_type.py b/odex25_hr/hr_training_payment/models/mission_type.py new file mode 100644 index 000000000..ee2328759 --- /dev/null +++ b/odex25_hr/hr_training_payment/models/mission_type.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- + +from odoo import models, fields, api + + +class HrOfficialMissionType(models.Model): + _inherit = 'hr.official.mission.type' + pr_product_id = fields.Many2one(comodel_name='product.product', string="PR Product") + diff --git a/odex25_hr/hr_training_payment/views/hr_official_mission.xml b/odex25_hr/hr_training_payment/views/hr_official_mission.xml new file mode 100644 index 000000000..17e9dd990 --- /dev/null +++ b/odex25_hr/hr_training_payment/views/hr_official_mission.xml @@ -0,0 +1,23 @@ + + + + + + + hr.official.mission.view.form + hr.official.mission + + + + + + + + True + + + + + + + diff --git a/odex25_hr/hr_training_payment/views/mission_type.xml b/odex25_hr/hr_training_payment/views/mission_type.xml new file mode 100644 index 000000000..b77937c1a --- /dev/null +++ b/odex25_hr/hr_training_payment/views/mission_type.xml @@ -0,0 +1,19 @@ + + + + + + + hr.official.mission.type.view.form + hr.official.mission.type + + + + + + + + + + +