diff --git a/odex25_purchase/odex25_annual_purchase/data/mail_activity.xml b/odex25_purchase/odex25_annual_purchase/data/mail_activity.xml
index 53ee112db..587a64ed8 100644
--- a/odex25_purchase/odex25_annual_purchase/data/mail_activity.xml
+++ b/odex25_purchase/odex25_annual_purchase/data/mail_activity.xml
@@ -1,3 +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/i18n/ar_001.po b/odex25_purchase/odex25_annual_purchase/i18n/ar_001.po
index b6788ca9d..c711ed0f7 100644
--- a/odex25_purchase/odex25_annual_purchase/i18n/ar_001.po
+++ b/odex25_purchase/odex25_annual_purchase/i18n/ar_001.po
@@ -173,11 +173,7 @@ msgstr "عدد المرفقات"
msgid "Can Create Agreement"
msgstr "يمكن إنشاء اتفاقية"
-#. module: odex25_annual_purchase
-#: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_odx_annual_addendum_form
-#: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_odx_annual_request_form
-msgid "Cancel"
-msgstr "إلغاء"
+
#. module: odex25_annual_purchase
#: model:ir.model.fields.selection,name:odex25_annual_purchase.selection__odx_annual_addendum__state__cancel
@@ -1042,15 +1038,6 @@ msgstr "هل أنت متأكد أنك تريد المتابعة؟"
-
-
-#. module: odex25_annual_purchase
-#: code:addons/odex25_annual_purchase/models/annual_rfq.py:0
-#: model:ir.model,name:odex25_annual_purchase.model_annual_rfq
-#: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_annual_rfq_form
-#, python-format
-msgid "Request for Quotation"
-msgstr "طلب عرض سعر"
#. module: odex25_annual_purchase
@@ -1274,3 +1261,34 @@ msgstr "تأكيد"
#: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_odx_annual_request_reason_wizard_form
msgid "Discard"
msgstr "إلغاء"
+
+#. module: odex25_annual_purchase
+#: code:addons/odex25_annual_purchase/models/annual_rfq.py:0
+#: model:ir.model,name:odex25_annual_purchase.model_annual_rfq
+#: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_annual_rfq_form
+#, python-format
+msgid "Request for Quotation"
+msgstr "طلب عرض سعر"
+
+#. module: odex25_annual_purchase
+#: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_refuse_reason_rfq_form
+#: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_select_reason_rfq_form
+msgid "Submit"
+msgstr "إرسال"
+
+#. module: odex25_annual_purchase
+#: model:ir.model.fields.selection,name:odex25_annual_purchase.selection__odx_annual_request_reason_wizard__action_type__cancel
+#: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_odx_annual_addendum_form
+#: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_odx_annual_request_form
+#: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_refuse_reason_rfq_form
+#: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_select_reason_rfq_form
+msgid "Cancel"
+msgstr "إلغاء"
+
+#. module: odex25_annual_purchase
+#: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_annual_rfq_form
+msgid "Re-Send by Email"
+msgstr "إعادة إرسال طلب عرض سعر"
+
+
+
diff --git a/odex25_purchase/odex25_annual_purchase/models/annual_request.py b/odex25_purchase/odex25_annual_purchase/models/annual_request.py
index d116d50f9..6cf43ae8a 100644
--- a/odex25_purchase/odex25_annual_purchase/models/annual_request.py
+++ b/odex25_purchase/odex25_annual_purchase/models/annual_request.py
@@ -43,7 +43,7 @@ class AnnualPurchaseRequest(models.Model):
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)
technical_notes = fields.Html(string="Technical Notes")
- financial_notes = fields.Html(string="Financial Notes", groups="purchase_requisition_custom.committe_member")
+ financial_notes = fields.Html(string="Financial Notes")
committee_recommended_vendor_id = fields.Many2one('res.partner', string="Recommended Vendor", domain=[('supplier_rank','>',0)])
committee_status = fields.Selection([
('none','None'),
@@ -379,8 +379,6 @@ class AnnualPurchaseRequest(models.Model):
def action_create_agreement(self):
for rec in self:
rec._check_lines()
- if not rec.vendor_id:
- raise UserError(_("Please set Selected Vendor."))
if rec.agreement_id:
raise UserError(_("Agreement already linked."))
agreement = self.env['purchase.requisition'].create({
@@ -406,6 +404,9 @@ class AnnualPurchaseRequest(models.Model):
rec.message_post(body=_("Purchase Agreement created and linked."))
self.write({'state':'approved'})
+
+
+
class AnnualPurchaseRequestLine(models.Model):
_name = "odx.annual.request.line"
_description = "Annual Purchase Request Line"
diff --git a/odex25_purchase/odex25_annual_purchase/models/annual_rfq.py b/odex25_purchase/odex25_annual_purchase/models/annual_rfq.py
index 4082ebcba..e24ebb41f 100644
--- a/odex25_purchase/odex25_annual_purchase/models/annual_rfq.py
+++ b/odex25_purchase/odex25_annual_purchase/models/annual_rfq.py
@@ -15,7 +15,6 @@ class PurchaseRFQ(models.Model):
vendor_id = fields.Many2one(
'res.partner',
string='Vendor',
- domain=[('supplier_rank', '>', 0)]
)
partner_id = fields.Many2one(
'res.partner',
@@ -120,20 +119,37 @@ class PurchaseRFQ(models.Model):
def action_refuse_rfq(self):
self.ensure_one()
- member = self._get_current_member_vote()
+ member = self.committe_members.filtered(lambda m: m.user_id == self.env.user)
+
if member and member.refused:
raise UserError(_("You have already refused this RFQ before."))
- return {
- 'type': 'ir.actions.act_window',
- 'name': _('Refuse Reason'),
- 'res_model': 'refuse.reason.rfq',
- 'view_mode': 'form',
- 'target': 'new',
- 'context': {
- 'default_rfq_id': self.id
- }
- }
+
+ else:
+ self.env['committe.member'].create({
+ 'rfq_id': self.id,
+ 'user_id': self.env.user.id,
+ 'refused': True,
+ 'select': False
+ })
+
+ self._check_committee_rejection()
+
+ def _check_committee_rejection(self):
+ self.ensure_one()
+
+ if not self.source_request_ref or not self.source_request_ref.committe_members:
+ return
+
+ requisition_users = self.source_request_ref.committe_members
+ rfq_users = self.committe_members.mapped('user_id')
+
+ if set(requisition_users.ids) == set(rfq_users.ids):
+ if self.committe_members and all(member.refused for member in self.committe_members):
+ self.source_request_ref.write({'state': 'rejected_by_committee'})
+ self.action_reject()
+ self.message_post(body=_("تم رفض عرض السعر من قبل جميع أعضاء اللجنة."))
+
def action_submit_to_committees(self):
res = super(PurchaseRFQ, self).action_submit_to_committees()
@@ -168,6 +184,19 @@ class PurchaseRFQ(models.Model):
'target': 'current',
}
+ def write(self, vals):
+ res = super().write(vals)
+ if 'state' in vals:
+ for rec in self:
+ if rec.state in ['po', 'approved']:
+ related_rfqs = self.search([
+ ('source_request_ref', '=', rec.source_request_ref.id),
+ ('id', '!=', rec.id),
+ ('state', 'not in', ['po', 'approved', 'rejected'])
+ ])
+ related_rfqs.write({'state': 'rejected'})
+ return res
+
def action_rfq_send(self):
self.ensure_one()
if not self.vendor_id:
@@ -176,7 +205,7 @@ class PurchaseRFQ(models.Model):
self.partner_id = self.vendor_id.id
try:
- template = self.env.ref('odex25_annual_purchase.email_template_annual_rfq')
+ template = self.env.ref('odex25_annual_purchase.email_template_annual_rfq_ar')
except ValueError:
template = False
@@ -209,7 +238,6 @@ class PurchaseRFQ(models.Model):
ctx['model_description'] = _('Request for Quotation')
- self.state ='sent'
return {
'name': _('Compose Email'),
'type': 'ir.actions.act_window',
@@ -233,8 +261,8 @@ class PurchaseRFQ(models.Model):
if any((l.quantity or 0.0) <= 0.0 for l in self.line_ids):
raise UserError(_('ضروري الكمية تكون أكبر من 0.'))
- if any((l.price_unit or 0.0) <= 0.0 for l in self.line_ids):
- raise UserError(_('رجاء أضِف الأسعار لكل السطور.'))
+ # if any((l.price_unit or 0.0) <= 0.0 for l in self.line_ids):
+ # raise UserError(_('رجاء أضِف الأسعار لكل السطور.'))
def _sync_approved_prices_to_request(self):
@@ -318,6 +346,18 @@ class PurchaseRFQ(models.Model):
rec.state = 'rejected'
+
+class MailComposeMessage(models.TransientModel):
+ _inherit = 'mail.compose.message'
+
+ def send_mail(self, auto_commit=False):
+ res = super(MailComposeMessage, self).send_mail(auto_commit=auto_commit)
+ if self.model == 'annual.rfq' and self.res_id:
+ rfq = self.env['annual.rfq'].browse(self.res_id)
+ rfq.write({'state': 'sent'})
+ return res
+
+
class PurchaseRFQLine(models.Model):
_name = 'annual.rfq.line'
_description = 'RFQ Line Items'
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 b834d8b80..7024cb426 100644
--- a/odex25_purchase/odex25_annual_purchase/security/ir.model.access.csv
+++ b/odex25_purchase/odex25_annual_purchase/security/ir.model.access.csv
@@ -1,6 +1,6 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_request_staff,access_request_staff,model_odx_annual_request,purchase.group_purchase_user,1,1,1,0
-access_request_manager,access_request_manager,model_odx_annual_request,purchase.group_purchase_manager,1,1,1,0
+access_request_manager,access_request_manager,model_odx_annual_request,purchase.group_purchase_manager,1,1,0,0
access_request_committee,access_request_committee,model_odx_annual_request,purchase_requisition_custom.committe_member,1,0,0,0
access_request_ssd,access_request_ssd,model_odx_annual_request,hr_base.group_services_manager,1,1,0,0
access_request_gm,access_request_gm,model_odx_annual_request,hr_base.group_general_manager,1,1,0,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 18d657957..54dae2245 100644
--- a/odex25_purchase/odex25_annual_purchase/views/annual_request_views.xml
+++ b/odex25_purchase/odex25_annual_purchase/views/annual_request_views.xml
@@ -23,6 +23,7 @@