This commit is contained in:
mohammed-alkhazrji 2025-10-30 13:42:37 +03:00
parent c738cfbae1
commit cfdd71ecf6
4 changed files with 57 additions and 36 deletions

View File

@ -384,29 +384,31 @@ class AnnualPurchaseRequest(models.Model):
else: else:
self.write({'state': 'purchase'}) 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): def action_ssd_reject(self, reason=False):
self.message_post(body=_("Rejected by SSD: %s") % (reason or '')) return self._open_reason_wizard('ssd_reject')
self.write({'state':'rejected'})
def action_ceo_approve(self): def action_ceo_approve(self):
self.write({'state':'purchase'}) self.write({'state':'purchase'})
def action_ceo_reject(self, reason=False): def action_ceo_reject(self, reason=False):
self.message_post(body=_("Rejected by GM: %s") % (reason or '')) return self._open_reason_wizard('ssd_reject')
self.write({'state':'rejected'})
def action_cancel(self): def action_cancel(self):
self.ensure_one() return self._open_reason_wizard('cancel')
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,
},
}
def action_create_agreement(self): def action_create_agreement(self):
for rec in self: for rec in self:

View File

@ -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_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_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_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
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
7 access_request_line_staff access_request_line_staff model_odx_annual_request_line purchase.group_purchase_user 1 1 1 0
8 access_addendum_staff access_addendum_staff model_odx_annual_addendum purchase.group_purchase_user 1 1 1 0
9 access_addendum_line_staff access_addendum_line_staff model_odx_annual_addendum_line purchase.group_purchase_user 1 1 1 0
10 access_odx_annual_request_cancel_wizard_user access_odx_annual_request_reason_wizard_user odx_annual_request_cancel_wizard_user odx_annual_request_reason_wizard_user model_odx_annual_request_cancel_wizard model_odx_annual_request_reason_wizard base.group_user 1 1 1 1
11 access_purchase_order_group_technical_committee purchase_order_group_technical_committee model_purchase_order odex25_annual_purchase.group_technical_committee 1 1 0 0
12 access_purchase_order_group_annual_committee purchase_order_group_annual_committee model_purchase_order odex25_annual_purchase.group_annual_committee 1 1 0 0
13 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
14 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

View File

@ -1,27 +1,40 @@
from odoo import api, fields, models, _ from odoo import api, fields, models, _
from odoo.exceptions import UserError from odoo.exceptions import UserError
class AnnualRequestCancelWizard(models.TransientModel): class AnnualRequestReasonWizard(models.TransientModel):
_name = 'odx.annual.request.cancel.wizard' _name = 'odx.annual.request.reason.wizard'
_description = 'Cancel Annual Request 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) 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): def action_confirm(self):
self.ensure_one() self.ensure_one()
request = self.request_id req = self.request_id
related_orders = self.env['purchase.order'].search([('annual_request_id', '=', request.id)]) if self.action_type == 'cancel':
for order in related_orders: # نفس منطقك الحالي لإلغاء أوامر الشراء المرتبطة
if order.state: related_orders = self.env['purchase.order'].search([('annual_request_id', '=', req.id)])
order.button_cancel() 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'} elif self.action_type == 'ceo_reject':
if 'cancel_reason' in request._fields: req.message_post(body=_("Reason: %s") % self.reason)
vals['cancel_reason'] = self.reason req.write({'state': 'rejected'})
request.write(vals)
return {'type': 'ir.actions.act_window_close'} return {'type': 'ir.actions.act_window_close'}

View File

@ -1,13 +1,14 @@
<odoo> <odoo>
<!-- Wizard Form View --> <!-- Wizard Form View -->
<record id="view_odx_annual_request_cancel_wizard_form" model="ir.ui.view"> <record id="view_odx_annual_request_reason_wizard_form" model="ir.ui.view">
<field name="name">odx.annual.request.cancel.wizard.form</field> <field name="name">odx.annual.request.reason.wizard.form</field>
<field name="model">odx.annual.request.cancel.wizard</field> <field name="model">odx.annual.request.reason.wizard</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<form string="Cancel Request"> <form string="Provide Reason">
<group> <group>
<field name="action_type" invisible="1"/>
<field name="request_id" invisible="1"/> <field name="request_id" invisible="1"/>
<field name="reason" placeholder="اكتب سبب الإلغاء..." required="1"/> <field name="reason" placeholder="اكتب السبب هنا..." required="1"/>
</group> </group>
<footer> <footer>
<button name="action_confirm" type="object" string="Confirm" class="btn-primary"/> <button name="action_confirm" type="object" string="Confirm" class="btn-primary"/>
@ -17,9 +18,10 @@
</field> </field>
</record> </record>
<record id="action_odx_annual_request_cancel_wizard" model="ir.actions.act_window"> <record id="action_odx_annual_request_cancel_wizard" model="ir.actions.act_window">
<field name="name">Cancel Request</field> <field name="name">Cancel Request</field>
<field name="res_model">odx.annual.request.cancel.wizard</field> <field name="res_model">odx.annual.request.reason.wizard</field>
<field name="view_mode">form</field> <field name="view_mode">form</field>
<field name="target">new</field> <field name="target">new</field>
</record> </record>