From f1e32ce6017b603ffb802242b8ba0e8a01323c56 Mon Sep 17 00:00:00 2001 From: esam Date: Wed, 12 Nov 2025 16:27:14 -0500 Subject: [PATCH] annual --- .../odex25_annual_purchase/i18n/ar_001.po | 23 ++++++++++++- .../models/annual_request.py | 32 +++++++++++-------- .../models/annual_rfq.py | 2 +- .../security/ir.model.access.csv | 2 +- .../views/annual_request_views.xml | 25 ++++++++------- .../views/annual_rfq_views.xml | 7 ++-- .../odex25_annual_purchase/views/menu.xml | 10 ++++++ .../wizard/annual_cancel_wizard.py | 9 ++---- 8 files changed, 72 insertions(+), 38 deletions(-) diff --git a/odex25_purchase/odex25_annual_purchase/i18n/ar_001.po b/odex25_purchase/odex25_annual_purchase/i18n/ar_001.po index b537d1ece..c49923021 100644 --- a/odex25_purchase/odex25_annual_purchase/i18n/ar_001.po +++ b/odex25_purchase/odex25_annual_purchase/i18n/ar_001.po @@ -1229,4 +1229,25 @@ msgstr "أعضاء اللجنة" #: model:ir.actions.act_window,name:odex25_annual_purchase.action_annual_committe #: model:ir.ui.menu,name:odex25_annual_purchase.menu_odx_annual_committee msgid "Annual Committee" -msgstr "لجان الإحتياج السنوي" \ No newline at end of file +msgstr "لجان الإحتياج السنوي" + +#. module: odex25_annual_purchase +#: model:ir.model.fields,field_description:odex25_annual_purchase.field_annual_rfq__technical_attachment_ids +#: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_annual_rfq_form_hide_chatter_for_committee +msgid "Technical Attachments" +msgstr "المرفقات الفنية" + +#. module: odex25_annual_purchase +#: model:ir.model.fields,field_description:odex25_annual_purchase.field_annual_rfq__name +msgid "Reference Number" +msgstr "رقم المرجع" + +#. module: odex25_annual_purchase +#: model:ir.model.fields,field_description:odex25_annual_purchase.field_annual_rfq__request_date +msgid "Request Date" +msgstr "تاريخ الطلب" + +#. module: odex25_annual_purchase +#: model:ir.model.fields,field_description:odex25_annual_purchase.field_annual_rfq__state +msgid "Status" +msgstr "الحالة" diff --git a/odex25_purchase/odex25_annual_purchase/models/annual_request.py b/odex25_purchase/odex25_annual_purchase/models/annual_request.py index 66a15ea20..8f7913244 100644 --- a/odex25_purchase/odex25_annual_purchase/models/annual_request.py +++ b/odex25_purchase/odex25_annual_purchase/models/annual_request.py @@ -28,10 +28,14 @@ class AnnualPurchaseRequest(models.Model): employee_id = fields.Many2one('hr.employee', string="Employee", tracking=True, default=lambda self: self.env['hr.employee'].search([('user_id', '=', self.env.user.id)], limit=1)) user_id = fields.Many2one('res.users', string="Requested By", default=lambda self: self.env.user, tracking=True) department_id = fields.Many2one('hr.department', string="Department", tracking=True, related='employee_id.department_id', store=True) - date = fields.Date(string="Date", tracking=True) + date = fields.Date( + string="Date", + tracking=True, + default=lambda self: fields.Date.context_today(self) + ) date_start = fields.Date(string="Start Date", tracking=True) date_end = fields.Date(string="End Date", tracking=True) - purpose = fields.Char(string="Purpose", tracking=True) + purpose = fields.Char(string="Purpose", tracking=True, required=True) note = fields.Text(string="Notes") state = fields.Selection(selection=STATES, default='draft', tracking=True) line_ids = fields.One2many('odx.annual.request.line', 'request_id', string="Products") @@ -53,8 +57,8 @@ class AnnualPurchaseRequest(models.Model): store=True) committee_enabled = fields.Boolean(string="Require Committee Review", default=False) - ssd_approve = fields.Boolean(string="SSD Approve", default=False) - seo_approve = fields.Boolean(string="SEO Approve", default=False) + ssd_approve = fields.Boolean(string="SSD Approve", default=True) + seo_approve = fields.Boolean(string="SEO Approve", default=True) can_create_agreement = fields.Boolean(compute='_compute_can_create_agreement') @@ -315,17 +319,17 @@ class AnnualPurchaseRequest(models.Model): else: rec.write({'state': 'procurement'}) - def action_manager_reject(self, reason=False): - for rec in self: - manager = rec.sudo().employee_id.parent_id - if manager: - if manager.user_id.id == rec.env.uid : - rec.write({'state': 'rejected'}) - else: - raise UserError(_("Sorry, The Approval For The Direct Manager '%s' Only !")%(rec.employee_id.parent_id.name)) + def action_manager_reject(self): + self.ensure_one() + manager = self.sudo().employee_id.parent_id + if manager: + if manager.user_id.id == self.env.uid: + return self._open_reason_wizard('manager_reject') else: - rec.write({'state': 'rejected'}) - + raise UserError( + _("Sorry, The Approval For The Direct Manager '%s' Only!") % (self.employee_id.parent_id.name)) + else: + return self._open_reason_wizard('manager_reject') def action_send_to_committee(self): self.write({'sent_to_commitee': True}) diff --git a/odex25_purchase/odex25_annual_purchase/models/annual_rfq.py b/odex25_purchase/odex25_annual_purchase/models/annual_rfq.py index cd38b0cbf..ee9819349 100644 --- a/odex25_purchase/odex25_annual_purchase/models/annual_rfq.py +++ b/odex25_purchase/odex25_annual_purchase/models/annual_rfq.py @@ -15,7 +15,7 @@ class PurchaseRFQ(models.Model): vendor_id = fields.Many2one( 'res.partner', string='Vendor', - domain=[('supplier_rank', '>', 0)], + domain=[('supplier_rank', '>', 0)], required=True ) partner_id = fields.Many2one( 'res.partner', 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 1ac9487bc..412660d61 100644 --- a/odex25_purchase/odex25_annual_purchase/security/ir.model.access.csv +++ b/odex25_purchase/odex25_annual_purchase/security/ir.model.access.csv @@ -23,7 +23,7 @@ access_annual_rfq_general_manager,access_annual_rfq_general_manager,model_annual access_annual_rfq_technical_committee,access_annual_rfq_technical_committee,model_annual_rfq,odex25_annual_purchase.group_technical_committee,1,1,0,0 access_annual_rfq_annual_committee,access_annual_rfq_annual_committee,model_annual_rfq,odex25_annual_purchase.group_annual_committee,1,1,0,0 -access_annual_rfq_line_purchase_user,access_annual_rfq_line_purchase_user,model_annual_rfq_line,purchase.group_purchase_user,1,1,1,0 +access_annual_rfq_line_purchase_user,access_annual_rfq_line_purchase_user,model_annual_rfq_line,purchase.group_purchase_user,1,1,1,1 access_annual_rfq_line_purchase_manager,access_annual_rfq_line_purchase_manager,model_annual_rfq_line,purchase.group_purchase_manager,1,1,1,0 access_annual_rfq_line_services_manager,access_annual_rfq_line_services_manager,model_annual_rfq_line,hr_base.group_services_manager,1,1,1,0 access_annual_rfq_line_general_manager,access_annual_rfq_line_general_manager,model_annual_rfq_line,hr_base.group_general_manager,1,1,1,0 diff --git a/odex25_purchase/odex25_annual_purchase/views/annual_request_views.xml b/odex25_purchase/odex25_annual_purchase/views/annual_request_views.xml index ec940ea38..a16505af5 100644 --- a/odex25_purchase/odex25_annual_purchase/views/annual_request_views.xml +++ b/odex25_purchase/odex25_annual_purchase/views/annual_request_views.xml @@ -106,18 +106,19 @@ - - - - - - - - - - - + + + + + + + + + + + + diff --git a/odex25_purchase/odex25_annual_purchase/views/annual_rfq_views.xml b/odex25_purchase/odex25_annual_purchase/views/annual_rfq_views.xml index afbc1e518..031d8ff72 100644 --- a/odex25_purchase/odex25_annual_purchase/views/annual_rfq_views.xml +++ b/odex25_purchase/odex25_annual_purchase/views/annual_rfq_views.xml @@ -71,7 +71,7 @@ - + @@ -87,7 +87,7 @@ - + @@ -165,7 +165,7 @@ - + + diff --git a/odex25_purchase/odex25_annual_purchase/views/menu.xml b/odex25_purchase/odex25_annual_purchase/views/menu.xml index 8ba625872..157695ac0 100644 --- a/odex25_purchase/odex25_annual_purchase/views/menu.xml +++ b/odex25_purchase/odex25_annual_purchase/views/menu.xml @@ -9,4 +9,14 @@ + + + + + + + \ 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 837624eec..5fb24bde7 100644 --- a/odex25_purchase/odex25_annual_purchase/wizard/annual_cancel_wizard.py +++ b/odex25_purchase/odex25_annual_purchase/wizard/annual_cancel_wizard.py @@ -9,6 +9,7 @@ class AnnualRequestReasonWizard(models.TransientModel): ('cancel', 'Cancel'), ('ssd_reject', 'SSD Reject'), ('ceo_reject', 'CEO Reject'), + ('manager_reject', 'Manager Reject'), ], required=True) request_id = fields.Many2one('odx.annual.request', string='Request', required=True) reason = fields.Text(string='Reason', required=True) @@ -18,19 +19,15 @@ class AnnualRequestReasonWizard(models.TransientModel): req = self.request_id if self.action_type == '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) - elif self.action_type == 'ssd_reject': - req.message_post(body=_("Reason: %s") % self.reason) - req.write({'state': 'rejected'}) - - elif self.action_type == 'ceo_reject': + elif self.action_type in ['ssd_reject', 'ceo_reject', 'manager_reject']: # حدث هنا لتشمل الرفض من المدير req.message_post(body=_("Reason: %s") % self.reason) req.write({'state': 'rejected'}) return {'type': 'ir.actions.act_window_close'} +