diff --git a/odex25_purchase/odex25_annual_purchase/__manifest__.py b/odex25_purchase/odex25_annual_purchase/__manifest__.py index 2d601d5a1..5a629b2b3 100644 --- a/odex25_purchase/odex25_annual_purchase/__manifest__.py +++ b/odex25_purchase/odex25_annual_purchase/__manifest__.py @@ -15,6 +15,7 @@ "views/addendum_views.xml", "views/purchase_requisition.xml", "data/mail_activity.xml", + "data/new_mail.xml", "views/menu.xml", "views/annual_rfq_views.xml", "views/report_annual_rfq.xml", diff --git a/odex25_purchase/odex25_annual_purchase/data/new_mail.xml b/odex25_purchase/odex25_annual_purchase/data/new_mail.xml new file mode 100644 index 000000000..0efb10082 --- /dev/null +++ b/odex25_purchase/odex25_annual_purchase/data/new_mail.xml @@ -0,0 +1,33 @@ + + + + + Purchase Order: Send RFQ + + طلب عرض سعر ${object.name or ''} + +
+

+ السادة ${object.vendor_id.name} + % if object.vendor_id.parent_id: + (${object.vendor_id.parent_id.name}) + % endif +

+ يُرفق إليكم طلب عرض السعر الخاص بالطلب رقم ${object.name} + % if object.partner_ref: + بالمرجع: ${object.partner_ref} + % endif + من ${object.company_id.name}. +

+ في حال وجود أي استفسارات، لا تترددوا في التواصل معنا بالرد على هذا الايميل . +

+ مع أطيب التحيات، +

+
+ + ${(object.name or '').replace('/','_')} + ar + +
+
+
diff --git a/odex25_purchase/odex25_annual_purchase/models/annual_request.py b/odex25_purchase/odex25_annual_purchase/models/annual_request.py index 4ab59a289..71b23c622 100644 --- a/odex25_purchase/odex25_annual_purchase/models/annual_request.py +++ b/odex25_purchase/odex25_annual_purchase/models/annual_request.py @@ -384,16 +384,28 @@ class AnnualPurchaseRequest(models.Model): rec._check_lines() if rec.agreement_id: raise UserError(_("Agreement already linked.")) + + winning_rfq = rec.rfq_ids.filtered(lambda r: r.recommendation_order or r.state == 'po') + if not winning_rfq: + raise UserError(_("No winning RFQ found for this request.")) + + winning_rfq = winning_rfq[0] + agreement = self.env['purchase.requisition'].create({ - 'type_id': self.env['purchase.requisition.type'].search([('exclusive','=','multiple')], limit=1).id or False, + 'type_id': self.env['purchase.requisition.type'].search([('exclusive', '=', 'multiple')], + limit=1).id or False, 'user_id': self.env.user.id, - 'vendor_id': rec.vendor_id.id, + 'category_ids': rec.product_category_ids, + 'purpose': rec.purpose, + 'purchase_cost': 'product_line', + 'vendor_id': winning_rfq.vendor_id.id, 'ordering_date': fields.Date.context_today(self), 'schedule_date': rec.date_end, 'name': "%s - %s" % (rec.name, rec.purpose or ''), 'annual_request_id': rec.id, }) - for line in rec.line_ids: + + for line in winning_rfq.line_ids: self.env['purchase.requisition.line'].create({ 'requisition_id': agreement.id, 'product_id': line.product_id.id, @@ -403,11 +415,20 @@ class AnnualPurchaseRequest(models.Model): 'schedule_date': rec.date_end, 'name': line.description or line.product_id.display_name, }) + + attachments = self.env['ir.attachment'].search([ + ('res_model', '=', 'annual.rfq'), + ('res_id', '=', winning_rfq.id) + ]) + for attachment in attachments: + attachment.copy({ + 'res_model': 'purchase.requisition', + 'res_id': agreement.id, + }) + rec.agreement_id = agreement.id - rec.message_post(body=_("Purchase Agreement created and linked.")) - self.write({'state':'approved'}) - - + rec.message_post(body=_("Purchase Agreement created and linked with winning RFQ and attachments.")) + self.write({'state': 'approved'}) class AnnualPurchaseRequestLine(models.Model): diff --git a/odex25_purchase/odex25_annual_purchase/models/annual_rfq.py b/odex25_purchase/odex25_annual_purchase/models/annual_rfq.py index 7193e52d6..be4f50d4c 100644 --- a/odex25_purchase/odex25_annual_purchase/models/annual_rfq.py +++ b/odex25_purchase/odex25_annual_purchase/models/annual_rfq.py @@ -6,6 +6,8 @@ class PurchaseRFQ(models.Model): _name = 'annual.rfq' _description = 'Request for Quotation' _inherit = ['mail.thread', 'mail.activity.mixin'] + _copy = False # تعطيل النسخ لحجب زر الاستنساخ + name = fields.Char(string='Reference Number', default='New', copy=False, tracking=True) source_request_ref = fields.Many2one( 'odx.annual.request', string='Source Request Reference', help='Original request number/reference (optional)') @@ -89,6 +91,11 @@ class PurchaseRFQ(models.Model): and rec.state in ('committee', 'draft', 'sent') ) + + @api.model + def copy(self, default=None): + raise UserError("لا يسمح باستنساخ هذا السجل.") + def _get_current_member_vote(self): self.ensure_one() return self.env['committe.member'].search([ @@ -212,7 +219,7 @@ class PurchaseRFQ(models.Model): related_rfqs = self.search([ ('source_request_ref', '=', rec.source_request_ref.id), ('id', '!=', rec.id), - ('state', 'not in', ['po', 'approved', 'rejected']) + ('state', 'not in', ['po', 'approved', 'rejected','cancel']) ]) related_rfqs.write({'state': 'cancel'}) return res @@ -225,7 +232,7 @@ class PurchaseRFQ(models.Model): self.partner_id = self.vendor_id.id try: - template = self.env.ref('odex25_annual_purchase.email_template_annual_rfq_ar') + template = self.env.ref('odex25_annual_purchase.email_template_annual_rfq_new') except ValueError: template = False @@ -242,12 +249,11 @@ class PurchaseRFQ(models.Model): 'default_res_id': self.id, 'default_use_template': bool(template), 'default_template_id': template.id if template else False, - 'default_composition_mode': 'mass_mail', + 'default_composition_mode': 'comment', + 'custom_layout': "mail.mail_notification_paynow", 'force_email': True, - 'mail_post_autofollow': False, - 'mail_post_autolog': False, - 'default_notify': False, - 'default_is_log': False, + 'mail_post_autofollow': True, + }) lang = self.env.context.get('lang') 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 a3753ca1f..1c630c7be 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 -
+