diff --git a/jikimo_purchase_tier_validation/__init__.py b/jikimo_purchase_tier_validation/__init__.py new file mode 100644 index 00000000..40c32597 --- /dev/null +++ b/jikimo_purchase_tier_validation/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- + +from . import controllers +from . import models +from . import wizards diff --git a/jikimo_purchase_tier_validation/__manifest__.py b/jikimo_purchase_tier_validation/__manifest__.py new file mode 100644 index 00000000..2c59b177 --- /dev/null +++ b/jikimo_purchase_tier_validation/__manifest__.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +{ + 'name': "机企猫 采购审批流程", + + 'summary': """ + Short (1 phrase/line) summary of the module's purpose, used as + subtitle on modules listing or apps.openerp.com""", + + 'description': """ + Long description of module's purpose + """, + + 'author': "My Company", + 'website': "https://www.yourcompany.com", + + # Categories can be used to filter modules in modules listing + # Check https://github.com/odoo/odoo/blob/16.0/odoo/addons/base/data/ir_module_category_data.xml + # for the full list + 'category': 'Uncategorized', + 'version': '0.1', + + # any module necessary for this one to work correctly + 'depends': ['purchase', 'base_tier_validation', 'documents'], + + # always loaded + 'data': [ + 'security/ir.model.access.csv', + 'data/documents_data.xml', + 'wizards/upload_file_wizard_view.xml', + 'views/views.xml', + ], + # only loaded in demonstration mode + 'demo': [ + 'demo/demo.xml', + ], +} diff --git a/jikimo_purchase_tier_validation/controllers/__init__.py b/jikimo_purchase_tier_validation/controllers/__init__.py new file mode 100644 index 00000000..457bae27 --- /dev/null +++ b/jikimo_purchase_tier_validation/controllers/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import controllers \ No newline at end of file diff --git a/jikimo_purchase_tier_validation/controllers/controllers.py b/jikimo_purchase_tier_validation/controllers/controllers.py new file mode 100644 index 00000000..6bbe5e40 --- /dev/null +++ b/jikimo_purchase_tier_validation/controllers/controllers.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# from odoo import http + + +# class JikimoPurchaseTierValidation(http.Controller): +# @http.route('/jikimo_purchase_tier_validation/jikimo_purchase_tier_validation', auth='public') +# def index(self, **kw): +# return "Hello, world" + +# @http.route('/jikimo_purchase_tier_validation/jikimo_purchase_tier_validation/objects', auth='public') +# def list(self, **kw): +# return http.request.render('jikimo_purchase_tier_validation.listing', { +# 'root': '/jikimo_purchase_tier_validation/jikimo_purchase_tier_validation', +# 'objects': http.request.env['jikimo_purchase_tier_validation.jikimo_purchase_tier_validation'].search([]), +# }) + +# @http.route('/jikimo_purchase_tier_validation/jikimo_purchase_tier_validation/objects/', auth='public') +# def object(self, obj, **kw): +# return http.request.render('jikimo_purchase_tier_validation.object', { +# 'object': obj +# }) diff --git a/jikimo_purchase_tier_validation/data/documents_data.xml b/jikimo_purchase_tier_validation/data/documents_data.xml new file mode 100644 index 00000000..990a6418 --- /dev/null +++ b/jikimo_purchase_tier_validation/data/documents_data.xml @@ -0,0 +1,11 @@ + + + + + + 采购合同 + 存放采购合同相关文件 + 10 + + + \ No newline at end of file diff --git a/jikimo_purchase_tier_validation/demo/demo.xml b/jikimo_purchase_tier_validation/demo/demo.xml new file mode 100644 index 00000000..cbba42ce --- /dev/null +++ b/jikimo_purchase_tier_validation/demo/demo.xml @@ -0,0 +1,30 @@ + + + + + \ No newline at end of file diff --git a/jikimo_purchase_tier_validation/models/__init__.py b/jikimo_purchase_tier_validation/models/__init__.py new file mode 100644 index 00000000..5305644d --- /dev/null +++ b/jikimo_purchase_tier_validation/models/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import models \ No newline at end of file diff --git a/jikimo_purchase_tier_validation/models/models.py b/jikimo_purchase_tier_validation/models/models.py new file mode 100644 index 00000000..bb90a894 --- /dev/null +++ b/jikimo_purchase_tier_validation/models/models.py @@ -0,0 +1,154 @@ +from odoo import models, fields, api, _ +from odoo.exceptions import ValidationError +import logging + +_logger = logging.getLogger(__name__) + + +class jikimo_purchase_tier_validation(models.Model): + _name = 'purchase.order' + _inherit = ['purchase.order', 'tier.validation'] + + _tier_validation_buttons_xpath = "/form/header/button[@id='draft_confirm'][1]" + + contract_document_id = fields.Many2one('documents.document', string='合同文件') + contract_file = fields.Binary(related='contract_document_id.datas', string='合同文件内容') + contract_file_name = fields.Char(related='contract_document_id.attachment_id.name', string='文件名') + + # 是否已上传合同文件 + is_upload_contract_file = fields.Boolean(string='是否已上传合同文件', default=False) + + def button_confirm(self): + for record in self: + if record.need_validation and record.validation_status != 'validated': + raise ValidationError(_('请先完成审批!')) + return super().button_confirm() + + # def button_confirm(self): + # self = self.with_context(skip_validation=True) + # return super().button_confirm() + # + # def _check_state_conditions(self, vals): + # self.ensure_one() + # if self._context.get('skip_validation'): + # return False + # return ( + # self._check_state_from_condition() + # and vals.get(self._state_field) in self._state_to + # ) + + def request_validation(self): + for record in self: + error_messages = [] + + # 检查必填字段 + required_fields = { + 'partner_ref': '合同名称', + 'contract_number': '合同编号' + } + + missing_fields = [ + name for field, name in required_fields.items() + if not record[field] + ] + + if missing_fields: + error_messages.append('* 如下字段要求必须填写:%s' % '、'.join(missing_fields)) + + # 检查合同文件 + if not record.contract_document_id: + error_messages.append('* 必须点击上传合同文件') + + # 如果有任何错误,一次性显示所有错误信息 + if error_messages: + raise ValidationError('\n'.join(error_messages)) + + return super(jikimo_purchase_tier_validation, self).request_validation() + + # 上传合同文件 + def upload_contract_file(self): + print('upload_contract_file===========================') + # self.ensure_one() + # return { + # 'name': _('上传合同文件'), + # 'type': 'ir.actions.act_window', + # 'res_model': 'ir.attachment', + # 'view_mode': 'form', + # 'view_type': 'form', + # 'target': 'new', + # 'context': { + # 'default_res_model': self._name, + # 'default_res_id': self.id, + # 'default_type': 'binary', + # 'default_mimetype': 'application/pdf,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,image/jpeg,image/png', + # } + # } + + self.ensure_one() + action = { + 'type': 'ir.actions.act_window', + 'name': _('上传合同文件'), + 'res_model': 'ir.attachment.wizard', # 我们需要创建一个新的向导模型 + 'view_mode': 'form', + 'target': 'new', + 'context': { + 'default_res_model': self._name, + 'default_res_id': self.id, + } + } + return action + + # 删除合同文件 + def delete_contract_file(self): + self.ensure_one() + if self.contract_document_id: + try: + document = self.contract_document_id + + # 清空关联 + self.write({ + 'contract_document_id': False, + 'contract_file': False, + 'contract_file_name': False + }) + + # 删除文档 + if document: + document.with_context(no_attachment=True).sudo().unlink() + + self.is_upload_contract_file = False + + # 返回视图动作来刷新当前表单 + return { + 'type': 'ir.actions.act_window', + 'res_model': 'purchase.order', + 'res_id': self.id, + 'view_mode': 'form', + 'view_type': 'form', + 'target': 'current', + 'flags': {'mode': 'readonly'}, + } + + except Exception as e: + _logger.error('删除合同文件时出错: %s', str(e)) + return { + 'type': 'ir.actions.client', + 'tag': 'display_notification', + 'params': { + 'title': _('错误'), + 'message': _('删除文件时出现错误'), + 'type': 'danger', + 'sticky': True, + } + } + + return { + 'type': 'ir.actions.client', + 'tag': 'display_notification', + 'params': { + 'title': _('提示'), + 'message': _('没有需要删除的合同文件'), + 'type': 'warning', + 'sticky': False, + } + } diff --git a/jikimo_purchase_tier_validation/security/ir.model.access.csv b/jikimo_purchase_tier_validation/security/ir.model.access.csv new file mode 100644 index 00000000..09ba96bc --- /dev/null +++ b/jikimo_purchase_tier_validation/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_ir_attachment_wizard,ir.attachment.wizard,model_ir_attachment_wizard,base.group_user,1,1,1,1 \ No newline at end of file diff --git a/jikimo_purchase_tier_validation/views/templates.xml b/jikimo_purchase_tier_validation/views/templates.xml new file mode 100644 index 00000000..cea6b39a --- /dev/null +++ b/jikimo_purchase_tier_validation/views/templates.xml @@ -0,0 +1,24 @@ + + + + + \ No newline at end of file diff --git a/jikimo_purchase_tier_validation/views/views.xml b/jikimo_purchase_tier_validation/views/views.xml new file mode 100644 index 00000000..6d6995ef --- /dev/null +++ b/jikimo_purchase_tier_validation/views/views.xml @@ -0,0 +1,82 @@ + + + + + tier_validation_view_purchase_order_form_inherit + purchase.order + + + + + + +