# -*- coding: utf-8 -*- from datetime import datetime as dt from odoo import _, api, exceptions, fields, models from odoo.exceptions import UserError class EmployeeIqamaRenew(models.Model): _name = "employee.iqama.renewal" _description = "Employee Iqama Renewal" _inherit = ["mail.thread", "mail.activity.mixin"] name = fields.Char(readonly=True) date = fields.Date() line_ids = fields.One2many("employee.iqama.renewal.line", "line_id") x_description = fields.Char() company_id = fields.Many2one("res.company", string="Company", default=lambda self: self.env.user.company_id) state = fields.Selection( [('draft', 'Draft'), ('submit', 'Submit'), ('hr_depart', 'HR Department'), ('effective_department', 'Effective_Department'), ('chief_accountant', 'Transferred'), ('refused', 'Refused')], default="draft", tracking=True, ) @api.model_create_multi def create(self, vals_list): employee_id = self.env["hr.employee"].search( [("user_id", "=", self.env.uid)], limit=1 ) for vals in vals_list: seq = self.env["ir.sequence"].get("employee.iqama.renewal") vals["name"] = seq + "/" + employee_id.name return super(EmployeeIqamaRenew, self).create(vals_list) def draft_state(self): for item in self: for record in item.line_ids: if record.state == 'chief_accountant': if record.move_id: if record.move_id.state == 'draft': # record.move_id.state ='canceled' record.move_id.unlink() record.state = "draft" record.employee_id.iqama_number.write({ 'expiry_date': record.iqama_expir_date}) else: raise UserError( _('You can not cancel account move "%s" in state not draft') % record.move_id.name) if record.move_id2: if record.move_id2.state == 'draft': # record.move_id2.state ='canceled' record.move_id2.unlink() record.state = "draft" record.employee_id.iqama_number.write({ 'expiry_date': record.iqama_expir_date }) else: raise UserError( _('You can not cancel account move "%s" in state not draft') % record.move_id.name) item.state = "draft" else: item.state = 'draft' record.state = "draft" def submit(self): for item in self: for record in item.line_ids: if not record.iqama_new_expiry: raise UserError(_("Sorry You must enter New Iqama expiry")) item.state = "submit" record.state = "submit" def hr_depart(self): for item in self: for record in item.line_ids: item.state = "hr_depart" record.state = "hr_depart" def effective_department(self): for item in self: for record in item.line_ids: item.state = "effective_department" record.state = "effective_department" def chief_accountant(self): for item in self: for record in item.sudo().line_ids: if record.state == "effective_department": if not record.account_id.id or not record.journal_id.id: raise UserError( _( "To Transfer the entry you must enter the account and journal" ) ) # journal renewal_fees debit_line_vals = { "name": record.employee_id.name, "debit": record.renewal_fees, "account_id": record.account_id.id, "partner_id": record.employee_id.user_id.partner_id.id, } credit_line_vals = { "name": record.employee_id.name, "credit": record.renewal_fees, "account_id": record.journal_id.default_account_id.id, "partner_id": record.employee_id.user_id.partner_id.id, } move = record.env["account.move"].create( { "state": "draft", "journal_id": record.journal_id.id, "date": item.date, "ref": record.employee_id.name, "line_ids": [ (0, 0, debit_line_vals), (0, 0, credit_line_vals), ], } ) record.move_id = move.id # journal work_premint_fees debit_line_vals = { "name": record.employee_id.name, "debit": record.work_premint_fees, "account_id": record.account_id2.id, "partner_id": record.employee_id.user_id.partner_id.id, } credit_line_vals = { "name": record.employee_id.name, "credit": record.work_premint_fees, "account_id": record.journal_id.default_account_id.id, "partner_id": record.employee_id.user_id.partner_id.id, } move = record.env["account.move"].create( { "state": "draft", "journal_id": record.journal_id.id, "date": item.date, "ref": record.employee_id.name, "line_ids": [ (0, 0, debit_line_vals), (0, 0, credit_line_vals), ], } ) record.move_id2 = move.id record.sudo().employee_id.iqama_number.write( {"expiry_date": record.iqama_new_expiry} ) record.state = "chief_accountant" item.state = "chief_accountant" def refused(self): for item in self: for record in item.line_ids: item.state = "refused" record.state = "refused" def unlink(self): for i in self: if i.state != "draft": raise UserError( _("You can not delete record in state not in draft") ) return super(EmployeeIqamaRenew, self).unlink() def b_search(self): emp_obj = self.sudo().env["hr.employee"].search( [("iqama_expiy_date", "<=", self.date), ("state", "=", "open")] ) self.line_ids.unlink() vals = [] for emp in emp_obj: #vals.append((0, False, {"employee_id": emp.id})) vals.append((0, False, {"employee_id": emp.id,"iqama_expir_date":emp.iqama_expiy_date})) self.write({"line_ids": vals}) class EmployeeIqamaRenewLine(models.Model): _name = "employee.iqama.renewal.line" _description = "Employee Iqama Renewal Line" document_id = fields.Many2one("hr.employee.document", domain=[("document_type", "=", "Iqama")]) employee_id = fields.Many2one(comodel_name="hr.employee", required=True) iqama_no = fields.Many2one("hr.employee.document", related="employee_id.iqama_number", readonly=True) iqama_expir_date = fields.Date(compute='_get_iqama_expiry', store=True, readonly=True) work_premit_sedad_no = fields.Char() renewal_fees = fields.Float(required=True, default=0) work_premint_fees = fields.Float(required=True, default=0) total = fields.Float(readonly=True, compute="get_total_fees") line_id = fields.Many2one("employee.iqama.renewal", required=True, ondelete="cascade") iqama_new_expiry = fields.Date() account_id = fields.Many2one("account.account") account_id2 = fields.Many2one("account.account") journal_id = fields.Many2one("account.journal") move_id = fields.Many2one("account.move", string="Move Renewal") move_id2 = fields.Many2one("account.move", string="Move Work") contract_date_end = fields.Date(related="employee_id.contract_id.date_end", readonly=True) state = fields.Selection( [ ("draft", "Draft"), ("submit", "Submit"), ("hr_depart", "HR Department"), ("effective_department", "Effective_Department"), ("chief_accountant", "Chief Accountant"), ("refused", "Refused"), ], default="draft", readonly=True, ) @api.depends("employee_id") def _get_iqama_expiry(self): for item in self: item.iqama_expir_date = item.employee_id.iqama_expiy_date @api.depends("work_premint_fees", "renewal_fees") def get_total_fees(self): for rec in self: rec.total = rec.renewal_fees + rec.work_premint_fees @api.onchange("iqama_expir_date", "iqama_new_expiry") def onchange_dates(self): if self.iqama_new_expiry: if self.iqama_expir_date: expiry_date_1 = dt.strptime(str(self.iqama_expir_date), "%Y-%m-%d") new_expiry_date_1 = dt.strptime(str(self.iqama_new_expiry), "%Y-%m-%d") if expiry_date_1 > new_expiry_date_1: raise UserError( _("New Identity Expiry Date must be greater than old expiry Date") ) def unlink(self): for i in self: if i.state != 'draft': raise UserError(_('You can not delete record in state not in draft')) # i.line_ids.unlink() return super(EmployeeIqamaRenewLine, self).unlink()