From 95cf14c9a7b614be1e4a7b2427be15af735e5c5c Mon Sep 17 00:00:00 2001 From: mohammed-alkhazrji Date: Sun, 26 Oct 2025 13:03:56 +0300 Subject: [PATCH] v2-annual --- .../odex25_annual_purchase/i18n/ar_001.po | 154 +++++-- .../models/annual_request.py | 105 +++-- .../models/purchase_inherit.py | 66 ++- .../security/ir.model.access.csv | 4 +- .../security/odex25_security.xml | 14 +- .../views/addendum_views.xml | 8 +- .../views/annual_request_views.xml | 95 ++-- .../odex25_annual_purchase/views/menu.xml | 2 +- .../views/purchase_inherit_views.xml | 430 +++++++++++++----- 9 files changed, 637 insertions(+), 241 deletions(-) diff --git a/odex25_purchase/odex25_annual_purchase/i18n/ar_001.po b/odex25_purchase/odex25_annual_purchase/i18n/ar_001.po index 82f883c28..eb7485e2d 100644 --- a/odex25_purchase/odex25_annual_purchase/i18n/ar_001.po +++ b/odex25_purchase/odex25_annual_purchase/i18n/ar_001.po @@ -119,7 +119,15 @@ msgstr "طلب عرض أسعار سنوي" #: model:ir.model.fields,field_description:odex25_annual_purchase.field_purchase_order__annual_request_id #: model:ir.model.fields,field_description:odex25_annual_purchase.field_purchase_requisition__annual_request_id msgid "Annual Request" -msgstr "الطلب السنوي" +msgstr "المستند المصدر" + +#. module: odex25_annual_purchase +#: model:ir.model.fields,field_description:odex25_annual_purchase.field_odx_annual_request__line_ids +#: 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_po_form_products_for_annual_committee +#: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_po_form_products_for_tech_committee +msgid "Products" +msgstr "الأصناف/الخدمات" #. module: odex25_annual_purchase #: model:ir.actions.act_window,name:odex25_annual_purchase.action_odx_annual_request @@ -179,8 +187,8 @@ msgstr "المحادثات" #. module: odex25_annual_purchase #: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_odx_annual_request_form -msgid "Committee" -msgstr "اللجنة" +msgid "Committee " +msgstr "أعضاء لجنة المشتريات" #. module: odex25_annual_purchase #: model:res.groups,name:odex25_annual_purchase.group_technical_committee @@ -195,7 +203,7 @@ msgstr "رئيس اللجنة" #. module: odex25_annual_purchase #: model:ir.model.fields.selection,name:odex25_annual_purchase.selection__odx_annual_request__state__committee msgid "Committee Review" -msgstr "مراجعة اللجنة" +msgstr "اللجان" #. module: odex25_annual_purchase #: model:ir.model.fields,field_description:odex25_annual_purchase.field_odx_annual_request__committee_status @@ -261,11 +269,7 @@ msgstr "وحدة القياس الافتراضية المستخدمة في أو msgid "Department" msgstr "الإدارة" -#. module: odex25_annual_purchase -#: model:ir.model.fields,field_description:odex25_annual_purchase.field_odx_annual_addendum_line__description -#: model:ir.model.fields,field_description:odex25_annual_purchase.field_odx_annual_request_line__description -msgid "Description" -msgstr "الوصف" + #. module: odex25_annual_purchase #: model:ir.model.fields,field_description:odex25_annual_purchase.field_odx_annual_addendum__display_name @@ -333,7 +337,6 @@ msgstr "رفض المدير العام" #. module: odex25_annual_purchase #: model:ir.model.fields.selection,name:odex25_annual_purchase.selection__odx_annual_addendum__state__gm #: model:ir.model.fields.selection,name:odex25_annual_purchase.selection__odx_annual_request__state__gm -#: model:res.groups,name:odex25_annual_purchase.group_gm msgid "General Manager" msgstr "المدير العام" @@ -387,7 +390,7 @@ msgstr "لجنة فنية" #. module: odex25_annual_purchase #: model:ir.model.fields,field_description:odex25_annual_purchase.field_odx_annual_request__product_category_ids msgid "Items Categories" -msgstr "فئات الأصناف" +msgstr "تصنيف الأصناف" #. module: odex25_annual_purchase #: model:ir.model.fields,field_description:odex25_annual_purchase.field_odx_annual_addendum____last_update @@ -498,7 +501,7 @@ msgstr "عدد الاختيارات لا يمكن أن يكون صفراً" #. module: odex25_annual_purchase #: model:ir.model.fields,field_description:odex25_annual_purchase.field_odx_annual_request__min_vote msgid "No. of Votes" -msgstr "عدد الأصوات" +msgstr "عدد الاختيارات/ التصويت" #. module: odex25_annual_purchase #: model:ir.model.fields.selection,name:odex25_annual_purchase.selection__odx_annual_request__committee_status__none @@ -576,12 +579,7 @@ msgstr "يرجى تحديد المورد المختار." msgid "Product" msgstr "المنتج" -#. module: odex25_annual_purchase -#: model:ir.model.fields,field_description:odex25_annual_purchase.field_odx_annual_request__line_ids -#: 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_purchase_order_form_annual_rfq_odx -msgid "Products" -msgstr "المنتجات" + #. module: odex25_annual_purchase #: model:ir.model.fields.selection,name:odex25_annual_purchase.selection__odx_annual_request__state__purchase @@ -606,10 +604,7 @@ msgstr "تم إنشاء وربط اتفاقية الشراء." msgid "Purchase Committee" msgstr "لجنة المشتريات" -#. module: odex25_annual_purchase -#: model:ir.model,name:odex25_annual_purchase.model_purchase_order -msgid "Purchase Order" -msgstr "أمر الشراء" + #. module: odex25_annual_purchase #: model:ir.model,name:odex25_annual_purchase.model_purchase_requisition @@ -619,14 +614,13 @@ msgstr "طلب شراء" #. module: odex25_annual_purchase #: model:ir.model.fields.selection,name:odex25_annual_purchase.selection__odx_annual_request__state__procurement msgid "Purchasing" -msgstr "المشتريات" +msgstr "إدارة المشتريات" #. module: odex25_annual_purchase #: model:ir.model.fields,field_description:odex25_annual_purchase.field_odx_annual_addendum__purpose #: model:ir.model.fields,field_description:odex25_annual_purchase.field_odx_annual_request__purpose -#: model:ir.model.fields,field_description:odex25_annual_purchase.field_purchase_order__purpose msgid "Purpose" -msgstr "الغرض" +msgstr "مبررات طلب الشراء (الغرض)" #. module: odex25_annual_purchase #: model:ir.model.fields,field_description:odex25_annual_purchase.field_odx_annual_addendum_line__quantity @@ -642,8 +636,8 @@ msgstr "طلب عرض أسعار" #. module: odex25_annual_purchase #: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_odx_annual_request_form -msgid "RFQs / POs" -msgstr "طلبات عروض الأسعار / أوامر الشراء" +msgid "RFQs" +msgstr "طلبات عروض الأسعار " #. module: odex25_annual_purchase #: code:addons/odex25_annual_purchase/models/annual_request.py:0 @@ -662,10 +656,6 @@ msgstr "طلبات عروض الأسعار/أوامر الشراء" msgid "Reason/Justification" msgstr "السبب/التبرير" -#. module: odex25_annual_purchase -#: model:ir.model.fields.selection,name:odex25_annual_purchase.selection__odx_annual_request__committee_status__recommended -msgid "Recommended" -msgstr "موصى به" #. module: odex25_annual_purchase #: model:ir.model.fields,field_description:odex25_annual_purchase.field_odx_annual_request__committee_recommended_vendor_id @@ -745,7 +735,7 @@ msgstr "بطلب من" #. module: odex25_annual_purchase #: model:ir.model.fields,field_description:odex25_annual_purchase.field_odx_annual_request__committee_enabled msgid "Require Committee Review" -msgstr "يتطلب مراجعة اللجنة" +msgstr "يحتاج لجنة" #. module: odex25_annual_purchase #: model:ir.model.fields,field_description:odex25_annual_purchase.field_odx_annual_addendum__activity_user_id @@ -760,9 +750,9 @@ msgid "SMS Delivery error" msgstr "خطأ في تسليم الرسائل القصيرة" #. module: odex25_annual_purchase -#: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_odx_annual_addendum_form +#: model:ir.model.fields,field_description:odex25_annual_purchase.field_odx_annual_request__ssd_approve msgid "SSD Approve" -msgstr "موافقة مدير الخدمات المشتركة" +msgstr "موافقة مدير الخدمات المشتركة؟" #. module: odex25_annual_purchase #: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_odx_annual_addendum_form @@ -799,7 +789,6 @@ msgstr "أُرسل إلى اللجنة؟" #. module: odex25_annual_purchase #: model:ir.model.fields.selection,name:odex25_annual_purchase.selection__odx_annual_addendum__state__ssd #: model:ir.model.fields.selection,name:odex25_annual_purchase.selection__odx_annual_request__state__ssd -#: model:res.groups,name:odex25_annual_purchase.group_ssd msgid "Shared Services Director" msgstr "مدير الخدمات المشتركة" @@ -903,7 +892,7 @@ msgstr "المورد" #. module: odex25_annual_purchase #: model:ir.model.fields.selection,name:odex25_annual_purchase.selection__odx_annual_request__state__to_manager msgid "Waiting Manager" -msgstr "بانتظار المدير" +msgstr " المدير المباشر" #. module: odex25_annual_purchase #: model:ir.model.fields,field_description:odex25_annual_purchase.field_odx_annual_addendum__website_message_ids @@ -966,4 +955,95 @@ msgstr "" #. module: odex25_annual_purchase #: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_purchase_order_form_annual_rfq_odx msgid "ملاحظة" -msgstr "" \ No newline at end of file +msgstr "" + + + +#. module: odex25_annual_purchase +#: model:ir.model.fields.selection,name:odex25_annual_purchase.selection__odx_annual_request__state__ceo +msgid "CEO" +msgstr "المدير التنفيذي" + + + + +#. module: odex25_annual_purchase +#: model:ir.model.fields,field_description:odex25_annual_purchase.field_odx_annual_request__date +msgid "Date" +msgstr "التاريخ" + +#. module: odex25_annual_purchase +#: model:ir.model.fields,field_description:odex25_annual_purchase.field_odx_annual_request__seo_approve +msgid "SEO Approve" +msgstr "موافقة المدير التنفيذي؟" + +#. module: odex25_annual_purchase +#: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_po_form_products_for_annual_committee +#: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_po_form_products_for_tech_committee +msgid "Committee Members" +msgstr "أعضاء اللجنة" + +#. module: odex25_annual_purchase +#: model:ir.model.fields,field_description:odex25_annual_purchase.field_odx_annual_request__description +#: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_odx_annual_request_form +msgid "Description" +msgstr "الملاحظة" + + +#. module: odex25_annual_purchase +#: model:ir.model.fields,field_description:odex25_annual_purchase.field_odx_annual_request__attach_no +#: 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_po_form_products_for_annual_committee +#: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_po_form_products_for_tech_committee +msgid "Documents" +msgstr "المرفقات" + + +#. module: odex25_annual_purchase +#: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_po_form_products_for_annual_committee +#: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_po_form_products_for_tech_committee +msgid "Other Information" +msgstr "معلومات أخرى" + +#. module: odex25_annual_purchase +#: model:ir.model,name:odex25_annual_purchase.model_purchase_order +msgid "Purchase Order" +msgstr "أمر الشراء" + + +#. module: odex25_annual_purchase +#: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_po_form_products_for_annual_committee +#: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_po_form_products_for_tech_committee +msgid "Select" +msgstr "إختيار" + +#. module: odex25_annual_purchase +#: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_po_form_products_for_annual_committee +#: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_po_form_products_for_tech_committee +msgid "Refuse" +msgstr "رفض" + + +#. module: odex25_annual_purchase +#: model:ir.model.fields,field_description:odex25_annual_purchase.field_odx_annual_request_line__description +#: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_po_form_products_for_annual_committee +#: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_po_form_products_for_tech_committee +msgid "Technical Description" +msgstr "المواصفات الفنية" + +#. module: odex25_annual_purchase +#: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_po_form_products_for_annual_committee +msgid "Are you sure you want to process ?" +msgstr "هل أنت متأكد أنك تريد المتابعة؟" + + + + + + + +#. module: odex25_annual_purchase +#: model:ir.model.fields.selection,name:odex25_annual_purchase.selection__odx_annual_request__committee_status__recommended +#: model_terms:ir.ui.view,arch_db:odex25_annual_purchase.view_po_form_products_for_annual_committee +msgid "Recommended" +msgstr "موصى به" diff --git a/odex25_purchase/odex25_annual_purchase/models/annual_request.py b/odex25_purchase/odex25_annual_purchase/models/annual_request.py index 7c4e67e2c..8a5679f1c 100644 --- a/odex25_purchase/odex25_annual_purchase/models/annual_request.py +++ b/odex25_purchase/odex25_annual_purchase/models/annual_request.py @@ -11,6 +11,7 @@ STATES = [ ('committee', 'Committee Review'), ('ssd', 'Shared Services Director'), ('gm', 'General Manager'), + ('ceo', 'CEO'), ('purchase', 'Purchase '), ('approved', 'Approved'), ('rejected', 'Rejected'), @@ -52,6 +53,8 @@ class AnnualPurchaseRequest(models.Model): store=True) committee_enabled = fields.Boolean(string="Require Committee Review", default=False, tracking=True) + ssd_approve = fields.Boolean(string="SSD Approve", default=False) + seo_approve = fields.Boolean(string="SEO Approve", default=False) rfq_count = fields.Integer(string='RFQs/POs', compute='_compute_counts') po_count = fields.Integer(string='PO Count', compute='_compute_counts') @@ -66,7 +69,42 @@ class AnnualPurchaseRequest(models.Model): min_vote = fields.Integer(string='No. of Votes', help='Minimum number of votes required') actual_vote = fields.Integer(string='Actual Votes', default=0) sent_to_commitee = fields.Boolean(string='Sent to Committee?', default=False) + description = fields.Char(string="Description", tracking=True) + + attach_no = fields.Integer( + string="Documents", + compute="_compute_attach_no", + store=False, + readonly=True, + ) + + def _compute_attach_no(self): + Attachment = self.env['ir.attachment'] + for rec in self: + rec.attach_no = Attachment.search_count([ + ('res_model', '=', rec._name), + ('res_id', '=', rec.id) + ]) + + def get_attachments(self): + self.ensure_one() + return { + 'name': "Documents", + 'type': 'ir.actions.act_window', + 'res_model': 'ir.attachment', + 'view_mode': 'kanban,tree,form', + 'domain': [ + ('res_model', '=', self._name), + ('res_id', 'in', self.ids) + ], + 'context': { + 'default_res_model': self._name, + 'default_res_id': self.id, + + }, + 'target': 'current', + } def copy(self, default=None): default = dict(default or {}) @@ -138,7 +176,7 @@ class AnnualPurchaseRequest(models.Model): @api.depends('state', 'vendor_id', 'line_ids') def _compute_can_create_agreement(self): for rec in self: - rec.can_create_agreement = rec.state in ('gm','approved') and not rec.agreement_id and bool(rec.vendor_id) + rec.can_create_agreement = rec.state in ('ceo','approved') and not rec.agreement_id and bool(rec.vendor_id) @api.depends('agreement_id') def _compute_counts(self): @@ -179,9 +217,6 @@ class AnnualPurchaseRequest(models.Model): def action_create_rfq(self): self.ensure_one() self._check_lines() - if not self.vendor_id: - raise UserError(_("You must set a Vendor for this RFQ.")) - order_line_vals = [] for line in self.line_ids: order_line_vals.append((0, 0, { @@ -195,29 +230,37 @@ class AnnualPurchaseRequest(models.Model): 'taxes_id': [(6, 0, line.product_id.supplier_taxes_id.ids)], })) - PO = self.env['purchase.order'].sudo().create({ - 'origin': self.name, - 'annual_request_id': self.id, - 'partner_id': self.vendor_id.id, - 'department_id': self.department_id.id if hasattr(self.department_id, 'id') else False, - 'purpose': self.purpose, - 'is_recommended': False, - 'order_line': order_line_vals, - 'purchase_commitee': self.committee_enabled, # نقل حالة اللجنة - }) - - # نسخ أعضاء اللجنة - if self.committee_enabled: - PO._copy_committee_from_annual_request() + # PO = self.env['purchase.order'].sudo().create({ + # 'origin': self.name, + # 'annual_request_id': self.id, + # 'department_id': self.department_id.id if hasattr(self.department_id, 'id') else False, + # 'purpose': self.purpose, + # 'is_recommended': False, + # 'allow_empty_vendor': True, + # 'order_line': order_line_vals, + # 'purchase_commitee': self.committee_enabled, + # }) + # + # if self.committee_enabled: + # PO._copy_committee_from_annual_request() return { 'name': _("Annual RFQ"), 'type': 'ir.actions.act_window', 'res_model': 'purchase.order', 'view_mode': 'form', - 'res_id': PO.id, 'target': 'current', - 'context': {'default_annual_request_id': self.id, 'default_origin': self.name}, + 'context': { + 'default_origin': self.name, + 'default_annual_request_id': self.id, + 'default_department_id': self.department_id.id if self.department_id else False, + 'default_purpose': self.purpose, + 'default_is_recommended': False, + + 'default_partner_id': False, + + 'default_order_line': order_line_vals, + }, } def action_open_agreement(self): @@ -243,10 +286,17 @@ class AnnualPurchaseRequest(models.Model): self._check_lines() for rec in self: rec.write({'state': 'to_manager'}) - rec.activity_schedule('mail.mail_activity_data_todo', user_id=rec.department_id.manager_id.user_id.id if rec.department_id and rec.department_id.manager_id else False, summary=_("Approve Annual Request")) def action_manager_approve(self): - self.write({'state': 'procurement'}) + for rec in self: + manager = rec.sudo().employee_id.parent_id + if manager: + if manager.user_id.id == rec.env.uid : + rec.write({'state': 'procurement'}) + else: + raise Warning(_("Sorry, The Approval For The Direct Manager '%s' Only !")%(rec.employee_id.parent_id.name)) + else: + rec.write({'state': 'procurement'}) def action_manager_reject(self, reason=False): self.message_post(body=_("Rejected by Manager: %s") % (reason or '')) @@ -270,16 +320,19 @@ class AnnualPurchaseRequest(models.Model): self.write({'committee_status':'approved'}) def action_ssd_approve(self): - self.write({'state':'gm'}) + if self.seo_approve: + self.write({'state':'ceo'}) + else: + self.write({'state': 'purchase'}) def action_ssd_reject(self, reason=False): self.message_post(body=_("Rejected by SSD: %s") % (reason or '')) self.write({'state':'rejected'}) - def action_gm_approve(self): + def action_ceo_approve(self): self.write({'state':'purchase'}) - def action_gm_reject(self, reason=False): + def action_ceo_reject(self, reason=False): self.message_post(body=_("Rejected by GM: %s") % (reason or '')) self.write({'state':'rejected'}) @@ -329,7 +382,7 @@ class AnnualPurchaseRequestLine(models.Model): request_id = fields.Many2one('odx.annual.request', string="Request", required=True, ondelete='cascade') product_id = fields.Many2one('product.product', string="Product", required=True, domain=[('purchase_ok','=',True)]) - description = fields.Char(string="Description") + description = fields.Char(string="Technical Description") quantity = fields.Float(string="Quantity", default=1.0) uom_id = fields.Many2one('uom.uom', string="UoM", related='product_id.uom_po_id', readonly=False) price_unit = fields.Monetary(string="Unit Price", currency_field='currency_id', groups="purchase_requisition_custom.committe_member") diff --git a/odex25_purchase/odex25_annual_purchase/models/purchase_inherit.py b/odex25_purchase/odex25_annual_purchase/models/purchase_inherit.py index fd6d617bc..3e31eda36 100644 --- a/odex25_purchase/odex25_annual_purchase/models/purchase_inherit.py +++ b/odex25_purchase/odex25_annual_purchase/models/purchase_inherit.py @@ -22,22 +22,38 @@ class PurchaseOrder(models.Model): is_technical_committee = fields.Boolean( compute='_compute_is_technical_committee', string='Is Technical Committee', + store=False ) + + @api.depends( + 'requisition_id', 'requisition_id.state', 'requisition_id.purchase_commitee', + 'annual_request_id', 'annual_request_id.state', 'annual_request_id.committee_enabled' + ) + def _compute_parent_state(self): + """ + + """ + for rec in self: + state = False + comm = False + + if rec.requisition_id: + state = rec.requisition_id.state or False + comm = bool(getattr(rec.requisition_id, 'purchase_commitee', False)) + elif rec.annual_request_id: + state = rec.annual_request_id.state or False + comm = bool(getattr(rec.annual_request_id, 'committee_enabled', False)) + + rec.parent_state = state + rec.purchase_commitee = comm + def _compute_is_technical_committee(self): for record in self: record.is_technical_committee = self.env.user.has_group( 'odex25_annual_purchase.group_technical_committee' ) - @api.depends('annual_request_id', 'annual_request_id.committee_enabled', - 'annual_request_id.committe_members') - def _compute_annual_committee_fields(self): - for po in self: - if po.annual_request_id: - po.annual_purchase_commitee = po.annual_request_id.committee_enabled - else: - po.annual_purchase_commitee = False def _compute_annual_can_committee_vote(self): user = self.env.user @@ -52,7 +68,6 @@ class PurchaseOrder(models.Model): @api.model def create(self, vals): res = super(PurchaseOrder, self).create(vals) - # نسخ أعضاء اللجنة من الاحتياج السنوي if res.annual_request_id and res.annual_request_id.committee_enabled: res._copy_committee_from_annual_request() return res @@ -76,6 +91,28 @@ class PurchaseOrder(models.Model): 'refused': False, }) + + @api.constrains('recommendation_order') + def check_recommendation_order(self): + for rec in self: + if not rec.recommendation_order: + continue + + domain = [ + ('id', '!=', rec.id), + ('state', '!=', 'cancel'), + ('recommendation_order', '=', True), + ] + + if rec.requisition_id: + domain.append(('requisition_id', '=', rec.requisition_id.id)) + elif rec.annual_request_id: + domain.append(('annual_request_id', '=', rec.annual_request_id.id)) + else: + continue + if self.env['purchase.order'].search_count(domain): + raise ValidationError(_("Only one recommended order is allowed per parent document.")) + @api.depends('state', 'requisition_state', 'requisition_type_exclusive', 'requisition_id', 'is_purchase_budget', 'annual_request_id') def _compute_hide_action_budget_button(self): for record in self: @@ -101,7 +138,6 @@ class PurchaseOrder(models.Model): def action_select(self): - # التحقق من المصدر (اتفاقية أو احتياج سنوي) if self.annual_request_id and self.annual_request_id.committee_enabled: self.annual_request_id.actual_vote += 1 elif self.requisition_id: @@ -118,7 +154,6 @@ class PurchaseOrder(models.Model): def action_refuse(self): - # التحقق من المصدر (اتفاقية أو احتياج سنوي) if self.annual_request_id and self.annual_request_id.committee_enabled: self.annual_request_id.actual_vote += 1 elif self.requisition_id: @@ -151,7 +186,14 @@ class PurchaseOrder(models.Model): ]) for order in other_orders: order.action_unsign() - self.annual_request_id.state = 'ssd' + self.annual_request_id.vendor_id = self.partner_id.id + if self.annual_request_id.ssd_approve: + self.annual_request_id.state = 'ssd' + elif self.annual_request_id.seo_approve: + self.annual_request_id.state = 'seo' + else: + self.annual_request_id.state = 'purchase' + super(PurchaseOrder, self).action_sign() 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 a6dfa3b0a..927084232 100644 --- a/odex25_purchase/odex25_annual_purchase/security/ir.model.access.csv +++ b/odex25_purchase/odex25_annual_purchase/security/ir.model.access.csv @@ -2,8 +2,8 @@ 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,1 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,odex25_annual_purchase.group_ssd,1,1,0,0 -access_request_gm,access_request_gm,model_odx_annual_request,odex25_annual_purchase.group_gm,1,1,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 access_request_line_staff,access_request_line_staff,model_odx_annual_request_line,purchase.group_purchase_user,1,1,1,0 access_addendum_staff,access_addendum_staff,model_odx_annual_addendum,purchase.group_purchase_user,1,1,1,0 access_addendum_line_staff,access_addendum_line_staff,model_odx_annual_addendum_line,purchase.group_purchase_user,1,1,1,0 diff --git a/odex25_purchase/odex25_annual_purchase/security/odex25_security.xml b/odex25_purchase/odex25_annual_purchase/security/odex25_security.xml index 24f6d25ef..e61414f3f 100644 --- a/odex25_purchase/odex25_annual_purchase/security/odex25_security.xml +++ b/odex25_purchase/odex25_annual_purchase/security/odex25_security.xml @@ -7,18 +7,12 @@ - - Shared Services Director - - - - General Manager - - - committe_member - Committee / Technical + + Committee + + diff --git a/odex25_purchase/odex25_annual_purchase/views/addendum_views.xml b/odex25_purchase/odex25_annual_purchase/views/addendum_views.xml index ec01f30b5..c6b34b270 100644 --- a/odex25_purchase/odex25_annual_purchase/views/addendum_views.xml +++ b/odex25_purchase/odex25_annual_purchase/views/addendum_views.xml @@ -20,10 +20,10 @@
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 24a204737..b79bf9e4e 100644 --- a/odex25_purchase/odex25_annual_purchase/views/annual_request_views.xml +++ b/odex25_purchase/odex25_annual_purchase/views/annual_request_views.xml @@ -9,7 +9,7 @@ - + @@ -28,58 +28,75 @@ +
+

+ +

+
+ + - - - + - - - - - - - - - - - - + + - - - - - - + + + + + + + + + + + + + + + + + + + + + + @@ -87,13 +104,17 @@ - - - +
+ + + + + + diff --git a/odex25_purchase/odex25_annual_purchase/views/menu.xml b/odex25_purchase/odex25_annual_purchase/views/menu.xml index 8dc864ee9..d107f19a1 100644 --- a/odex25_purchase/odex25_annual_purchase/views/menu.xml +++ b/odex25_purchase/odex25_annual_purchase/views/menu.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/odex25_purchase/odex25_annual_purchase/views/purchase_inherit_views.xml b/odex25_purchase/odex25_annual_purchase/views/purchase_inherit_views.xml index 6eb25d4de..456d68c7a 100644 --- a/odex25_purchase/odex25_annual_purchase/views/purchase_inherit_views.xml +++ b/odex25_purchase/odex25_annual_purchase/views/purchase_inherit_views.xml @@ -1,134 +1,340 @@ - - purchase.order.form.annual.rfq.odx - purchase.order - - - - - + + purchase.order.form.products.tech_committee + purchase.order + + + + + +
+ + + +
+ +
+ +
+
+ Request for Quotation + Purchase Order +

+ + +

+
+ + + + + + + - - - { - 'invisible': [ - '&', - ('requisition_id', '=', False), - ('annual_request_id', '=', False), - '|', - ('state', 'in', [ - 'sign','purchase','to approve','done', - 'cancel','budget_rejected','wait_for_send','waiting' - ]), - ('is_signed', '=', True) - ] - } - + + + + + + + + + - - - {'invisible': ['&', ('requisition_id', '=', False), ('annual_request_id', '=', False)]} - + - - - + - - {'invisible': [('is_technical_committee', '=', True)]} - + - - - - - - - - - + + + - - - - - - + + + - - - - - - - - - - - - - - - - - + - - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + + + purchase.order.form.products.annual_committee + purchase.order + + + + +
+
+ + + +
+ +
+ +
+
+ Request for Quotation + Purchase Order +

+ + +

+
- + + + + + -