From a54524453f9a49d842e869b97dd733db8134abe6 Mon Sep 17 00:00:00 2001 From: esam Date: Sun, 30 Nov 2025 17:07:17 -0500 Subject: [PATCH] anuul --- .../data/mail_activity.xml | 2 +- .../odex25_annual_purchase/data/sequence.xml | 2 +- .../odex25_annual_purchase/i18n/ar_001.po | 4 ++-- .../models/annual_request.py | 13 ++++++----- .../models/annual_rfq.py | 22 ++++++++++++++++++- .../security/ir.model.access.csv | 1 + .../views/annual_rfq_views.xml | 12 +++++----- .../odex25_annual_purchase/views/menu.xml | 5 +++-- .../wizard/annual_cancel_wizard.py | 2 +- 9 files changed, 44 insertions(+), 19 deletions(-) diff --git a/odex25_purchase/odex25_annual_purchase/data/mail_activity.xml b/odex25_purchase/odex25_annual_purchase/data/mail_activity.xml index 587a64ed8..3c92e88ad 100644 --- a/odex25_purchase/odex25_annual_purchase/data/mail_activity.xml +++ b/odex25_purchase/odex25_annual_purchase/data/mail_activity.xml @@ -8,7 +8,7 @@

- عزيزي ${object.vendor_id.name} + السادة ${object.vendor_id.name} % if object.vendor_id.parent_id: (${object.vendor_id.parent_id.name}) % endif diff --git a/odex25_purchase/odex25_annual_purchase/data/sequence.xml b/odex25_purchase/odex25_annual_purchase/data/sequence.xml index 24dfa2afa..cbf2d35d5 100644 --- a/odex25_purchase/odex25_annual_purchase/data/sequence.xml +++ b/odex25_purchase/odex25_annual_purchase/data/sequence.xml @@ -2,7 +2,7 @@ Annual Request odx.annual.request - AR%(y)s- + AR %(year)s/%(month)s/ 4 diff --git a/odex25_purchase/odex25_annual_purchase/i18n/ar_001.po b/odex25_purchase/odex25_annual_purchase/i18n/ar_001.po index c711ed0f7..58904ccf6 100644 --- a/odex25_purchase/odex25_annual_purchase/i18n/ar_001.po +++ b/odex25_purchase/odex25_annual_purchase/i18n/ar_001.po @@ -138,7 +138,7 @@ msgstr "الطلبات السنوية" #. module: odex25_annual_purchase #: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_odx_annual_request_form msgid "Approve" -msgstr "موافقة" +msgstr "اعتماد" #. module: odex25_annual_purchase #: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_odx_annual_request_form @@ -1098,7 +1098,7 @@ msgstr "موصى به" #: model:ir.model.fields.selection,name:odex25_annual_purchase.selection__annual_rfq__state__draft #: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_annual_rfq_form msgid "Sign" -msgstr "تنفيذ عرض سعر" +msgstr "مسودة" #. module: odex25_annual_purchase diff --git a/odex25_purchase/odex25_annual_purchase/models/annual_request.py b/odex25_purchase/odex25_annual_purchase/models/annual_request.py index 6cf43ae8a..4ab59a289 100644 --- a/odex25_purchase/odex25_annual_purchase/models/annual_request.py +++ b/odex25_purchase/odex25_annual_purchase/models/annual_request.py @@ -25,7 +25,7 @@ class AnnualPurchaseRequest(models.Model): _order = "create_date desc" name = fields.Char(string="Reference", default="New", readonly=True, copy=False) - 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)) + 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),copy=False) 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( @@ -38,7 +38,7 @@ class AnnualPurchaseRequest(models.Model): 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") + line_ids = fields.One2many('odx.annual.request.line', 'request_id', string="Products", copy=True) agreement_id = fields.Many2one('purchase.requisition', string="Purchase Agreement", readonly=True) vendor_id = fields.Many2one('res.partner', string="Selected Vendor", domain=[('supplier_rank','>',0)]) currency_id = fields.Many2one('res.currency', string="Currency", default=lambda self: self.env.company.currency_id.id) @@ -54,7 +54,7 @@ class AnnualPurchaseRequest(models.Model): product_category_ids = fields.Many2many('product.category', string='Items Categories', compute='_compute_product_category_ids', - store=True) + store=True,copy=True) committee_enabled = fields.Boolean(string="Require Committee Review", default=False) ssd_approve = fields.Boolean(string="SSD Approve", default=True) @@ -328,8 +328,11 @@ class AnnualPurchaseRequest(models.Model): return self._open_reason_wizard('manager_reject') def action_send_to_committee(self): - self.write({'sent_to_commitee': True}) - self.write({'state': 'committee'}) + if self.rfq_count > 0: + self.write({'sent_to_commitee': True}) + self.write({'state': 'committee'}) + else: + raise UserError("لا يمكن الإرسال إلى اللجنة لأن عدد RFQs يساوي صفر.") def action_send_to_ssd(self): self.write({'state':'ssd'}) diff --git a/odex25_purchase/odex25_annual_purchase/models/annual_rfq.py b/odex25_purchase/odex25_annual_purchase/models/annual_rfq.py index e24ebb41f..7193e52d6 100644 --- a/odex25_purchase/odex25_annual_purchase/models/annual_rfq.py +++ b/odex25_purchase/odex25_annual_purchase/models/annual_rfq.py @@ -31,6 +31,7 @@ class PurchaseRFQ(models.Model): ('po', 'Purchase Order'), ('approved', 'Approved'), ('rejected', 'Rejected'), + ('cancel', 'Cancelled'), ], string='Status', default='draft', tracking=True) purpose = fields.Text(string='Purpose') company_id = fields.Many2one('res.company', default=lambda self: self.env.company, required=True) @@ -99,6 +100,12 @@ class PurchaseRFQ(models.Model): order.recommendation_order = True + def unlink(self): + for record in self: + if record.state != 'draft': + raise UserError(_('لا يمكن حذف السجل إلا إذا كانت الحالة مسودة فقط.')) + return super(PurchaseRFQ, self).unlink() + def action_select_rfq(self): self.ensure_one() member = self._get_current_member_vote() @@ -135,6 +142,19 @@ class PurchaseRFQ(models.Model): self._check_committee_rejection() + return { + 'type': 'ir.actions.act_window', + 'name': _('Select Reason'), + 'res_model': 'refuse.reason.rfq', + 'view_mode': 'form', + 'target': 'new', + 'context': { + 'default_rfq_id': self.id + } + } + + + def _check_committee_rejection(self): self.ensure_one() @@ -194,7 +214,7 @@ class PurchaseRFQ(models.Model): ('id', '!=', rec.id), ('state', 'not in', ['po', 'approved', 'rejected']) ]) - related_rfqs.write({'state': 'rejected'}) + related_rfqs.write({'state': 'cancel'}) return res def action_rfq_send(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 7024cb426..d759407c3 100644 --- a/odex25_purchase/odex25_annual_purchase/security/ir.model.access.csv +++ b/odex25_purchase/odex25_annual_purchase/security/ir.model.access.csv @@ -13,6 +13,7 @@ access_annual_request_group_annual_committee,annual_request_group_annual_committ access_annual_request_line_group_technical_committee,annual_request_line_group_technical_committee,model_odx_annual_request_line,odex25_annual_purchase.group_technical_committee,1,1,0,0 access_annual_request_line_group_annual_committee,annual_request_line_group_annual_committee,model_odx_annual_request_line,odex25_annual_purchase.group_annual_committee,1,1,0,0 +access_annual_request_line_group_annual_committee_gnral,annual_request_line_group_annual_committee_gnra,model_odx_annual_request_line,hr_base.group_general_manager,1,1,0,0 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 ec40f4ba9..a3753ca1f 100644 --- a/odex25_purchase/odex25_annual_purchase/views/annual_rfq_views.xml +++ b/odex25_purchase/odex25_annual_purchase/views/annual_rfq_views.xml @@ -8,7 +8,7 @@ annual.rfq.form annual.rfq -

+
@@ -167,7 +167,7 @@ - + annual.rfq.tree annual.rfq - + diff --git a/odex25_purchase/odex25_annual_purchase/views/menu.xml b/odex25_purchase/odex25_annual_purchase/views/menu.xml index 157695ac0..2a58993ab 100644 --- a/odex25_purchase/odex25_annual_purchase/views/menu.xml +++ b/odex25_purchase/odex25_annual_purchase/views/menu.xml @@ -5,7 +5,7 @@ (4, ref('purchase.group_purchase_user')), (4, ref('purchase.group_purchase_manager'))]"/> - + @@ -14,7 +14,8 @@ 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 5fb24bde7..5e8873bf9 100644 --- a/odex25_purchase/odex25_annual_purchase/wizard/annual_cancel_wizard.py +++ b/odex25_purchase/odex25_annual_purchase/wizard/annual_cancel_wizard.py @@ -25,7 +25,7 @@ class AnnualRequestReasonWizard(models.TransientModel): vals['cancel_reason'] = self.reason req.write(vals) - elif self.action_type in ['ssd_reject', 'ceo_reject', 'manager_reject']: # حدث هنا لتشمل الرفض من المدير + elif self.action_type in ['ssd_reject', 'ceo_reject', 'manager_reject']: req.message_post(body=_("Reason: %s") % self.reason) req.write({'state': 'rejected'})