From cfdd71ecf6b44ff20e4642c0a3c2b778a87d4126 Mon Sep 17 00:00:00 2001 From: mohammed-alkhazrji Date: Thu, 30 Oct 2025 13:42:37 +0300 Subject: [PATCH] v4-po --- .../models/annual_request.py | 32 ++++++++------- .../security/ir.model.access.csv | 6 ++- .../wizard/annual_cancel_wizard.py | 41 ++++++++++++------- .../wizard/annual_cancel_wizard_view.xml | 14 ++++--- 4 files changed, 57 insertions(+), 36 deletions(-) diff --git a/odex25_purchase/odex25_annual_purchase/models/annual_request.py b/odex25_purchase/odex25_annual_purchase/models/annual_request.py index 1e94e4b60..cfc3f5d2a 100644 --- a/odex25_purchase/odex25_annual_purchase/models/annual_request.py +++ b/odex25_purchase/odex25_annual_purchase/models/annual_request.py @@ -384,29 +384,31 @@ class AnnualPurchaseRequest(models.Model): else: self.write({'state': 'purchase'}) + def _open_reason_wizard(self, action_type): + self.ensure_one() + return { + 'name': _('Provide Reason'), + 'type': 'ir.actions.act_window', + 'res_model': 'odx.annual.request.reason.wizard', + 'view_mode': 'form', + 'target': 'new', + 'context': { + 'default_request_id': self.id, + 'default_action_type': action_type, + }, + } + def action_ssd_reject(self, reason=False): - self.message_post(body=_("Rejected by SSD: %s") % (reason or '')) - self.write({'state':'rejected'}) + return self._open_reason_wizard('ssd_reject') def action_ceo_approve(self): self.write({'state':'purchase'}) def action_ceo_reject(self, reason=False): - self.message_post(body=_("Rejected by GM: %s") % (reason or '')) - self.write({'state':'rejected'}) + return self._open_reason_wizard('ssd_reject') def action_cancel(self): - self.ensure_one() - return { - 'name': _('Cancel Request'), - 'type': 'ir.actions.act_window', - 'res_model': 'odx.annual.request.cancel.wizard', - 'view_mode': 'form', - 'target': 'new', - 'context': { - 'default_request_id': self.id, - }, - } + return self._open_reason_wizard('cancel') def action_create_agreement(self): for rec in self: diff --git a/odex25_purchase/odex25_annual_purchase/security/ir.model.access.csv b/odex25_purchase/odex25_annual_purchase/security/ir.model.access.csv index 9a01ee5b2..23863d086 100644 --- a/odex25_purchase/odex25_annual_purchase/security/ir.model.access.csv +++ b/odex25_purchase/odex25_annual_purchase/security/ir.model.access.csv @@ -7,4 +7,8 @@ access_request_gm,access_request_gm,model_odx_annual_request,hr_base.group_gener access_request_line_staff,access_request_line_staff,model_odx_annual_request_line,purchase.group_purchase_user,1,1,1,0 access_addendum_staff,access_addendum_staff,model_odx_annual_addendum,purchase.group_purchase_user,1,1,1,0 access_addendum_line_staff,access_addendum_line_staff,model_odx_annual_addendum_line,purchase.group_purchase_user,1,1,1,0 -access_odx_annual_request_cancel_wizard_user,odx_annual_request_cancel_wizard_user,model_odx_annual_request_cancel_wizard,base.group_user,1,1,1,1 +access_odx_annual_request_reason_wizard_user,odx_annual_request_reason_wizard_user,model_odx_annual_request_reason_wizard,base.group_user,1,1,1,1 +access_purchase_order_group_technical_committee,purchase_order_group_technical_committee,model_purchase_order,odex25_annual_purchase.group_technical_committee,1,1,0,0 +access_purchase_order_group_annual_committee,purchase_order_group_annual_committee,model_purchase_order,odex25_annual_purchase.group_annual_committee,1,1,0,0 +access_annual_request_group_technical_committee,annual_request_group_technical_committee,model_odx_annual_request,odex25_annual_purchase.group_technical_committee,1,1,0,0 +access_annual_request_group_annual_committee,annual_request_group_annual_committee,model_odx_annual_request,odex25_annual_purchase.group_annual_committee,1,1,0,0 \ No newline at end of file diff --git a/odex25_purchase/odex25_annual_purchase/wizard/annual_cancel_wizard.py b/odex25_purchase/odex25_annual_purchase/wizard/annual_cancel_wizard.py index 0278f2ac6..b7f91852b 100644 --- a/odex25_purchase/odex25_annual_purchase/wizard/annual_cancel_wizard.py +++ b/odex25_purchase/odex25_annual_purchase/wizard/annual_cancel_wizard.py @@ -1,27 +1,40 @@ from odoo import api, fields, models, _ from odoo.exceptions import UserError -class AnnualRequestCancelWizard(models.TransientModel): - _name = 'odx.annual.request.cancel.wizard' - _description = 'Cancel Annual Request Wizard' +class AnnualRequestReasonWizard(models.TransientModel): + _name = 'odx.annual.request.reason.wizard' + _description = 'Annual Request Reason Wizard' + action_type = fields.Selection([ + ('cancel', 'Cancel'), + ('ssd_reject', 'SSD Reject'), + ('ceo_reject', 'CEO Reject'), + ], required=True) request_id = fields.Many2one('odx.annual.request', string='Request', required=True) - reason = fields.Text(string='Cancellation Reason', required=True) + reason = fields.Text(string='Reason', required=True) def action_confirm(self): self.ensure_one() - request = self.request_id + req = self.request_id - related_orders = self.env['purchase.order'].search([('annual_request_id', '=', request.id)]) - for order in related_orders: - if order.state: - order.button_cancel() + if self.action_type == 'cancel': + # نفس منطقك الحالي لإلغاء أوامر الشراء المرتبطة + related_orders = self.env['purchase.order'].search([('annual_request_id', '=', req.id)]) + for order in related_orders: + if order.state: + order.button_cancel() + req.message_post(body=_("Reason: %s") % self.reason) + vals = {'state': 'cancel'} + if 'cancel_reason' in req._fields: + vals['cancel_reason'] = self.reason + req.write(vals) - request.message_post(body=_("Cancelled: %s") % (self.reason or '')) + elif self.action_type == 'ssd_reject': + req.message_post(body=_("Reason: %s") % self.reason) + req.write({'state': 'rejected'}) - vals = {'state': 'cancel'} - if 'cancel_reason' in request._fields: - vals['cancel_reason'] = self.reason - request.write(vals) + elif self.action_type == 'ceo_reject': + req.message_post(body=_("Reason: %s") % self.reason) + req.write({'state': 'rejected'}) return {'type': 'ir.actions.act_window_close'} diff --git a/odex25_purchase/odex25_annual_purchase/wizard/annual_cancel_wizard_view.xml b/odex25_purchase/odex25_annual_purchase/wizard/annual_cancel_wizard_view.xml index dba6c2e24..904ce71f6 100644 --- a/odex25_purchase/odex25_annual_purchase/wizard/annual_cancel_wizard_view.xml +++ b/odex25_purchase/odex25_annual_purchase/wizard/annual_cancel_wizard_view.xml @@ -1,13 +1,14 @@ - - odx.annual.request.cancel.wizard.form - odx.annual.request.cancel.wizard + + odx.annual.request.reason.wizard.form + odx.annual.request.reason.wizard -
+ + - +