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 @@
+
- +
- Request for Quotation + طلب عرض سعر

@@ -111,7 +113,7 @@
@@ -186,7 +188,7 @@ - +