From 6f4f0ab0fb2b2784a4ddc4a3889b6b67bfa2147f Mon Sep 17 00:00:00 2001
From: hyyy <123@qq.com>
Date: Tue, 18 Feb 2025 15:44:40 +0800
Subject: [PATCH 1/6] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=80=E5=85=B7?=
=?UTF-8?q?=E7=AE=A1=E7=90=86=E7=9A=84=E5=B1=95=E5=BC=80=E5=88=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sf_base/views/tool_views.xml | 10 +++++-----
sf_sale/static/src/css/purchase_list.css | 2 +-
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/sf_base/views/tool_views.xml b/sf_base/views/tool_views.xml
index e0679e55..e9d672e5 100644
--- a/sf_base/views/tool_views.xml
+++ b/sf_base/views/tool_views.xml
@@ -187,23 +187,23 @@
+ widget="many2one_radio" attrs="{'showExpand': True}"/>
-
+
-
+
-
+
-
+
diff --git a/sf_sale/static/src/css/purchase_list.css b/sf_sale/static/src/css/purchase_list.css
index 5e2aa86e..ec3d1e76 100644
--- a/sf_sale/static/src/css/purchase_list.css
+++ b/sf_sale/static/src/css/purchase_list.css
@@ -2,7 +2,7 @@
min-width: 62px !important;
}
-.section_and_note_text span{
+.section_and_note_text, .section_and_note_text span{
white-space: wrap!important;
overflow: auto!important;
text-overflow: unset!important;
From 6984f3154713d16009af410019a44d3494b64ac9 Mon Sep 17 00:00:00 2001
From: hyyy <123@qq.com>
Date: Tue, 18 Feb 2025 16:23:25 +0800
Subject: [PATCH 2/6] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=A4=9A=E4=BD=99?=
=?UTF-8?q?=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/js/custom_form_status_indicator.js | 31 +++----------------
1 file changed, 4 insertions(+), 27 deletions(-)
diff --git a/jikimo_frontend/static/src/js/custom_form_status_indicator.js b/jikimo_frontend/static/src/js/custom_form_status_indicator.js
index 038c2dc0..5d8b2fbf 100644
--- a/jikimo_frontend/static/src/js/custom_form_status_indicator.js
+++ b/jikimo_frontend/static/src/js/custom_form_status_indicator.js
@@ -9,7 +9,6 @@ import {ListRenderer} from "@web/views/list/list_renderer";
import {FormLabel} from "@web/views/form/form_label";
import { fieldVisualFeedback } from "@web/views/fields/field";
-import {Field} from "@web/views/fields/field";
var Dialog = require('web.Dialog');
// var {patch} = require("web.utils") 这句话也行
@@ -53,7 +52,6 @@ const tableRequiredList = [
'product_template_id', 'product_uom_qty', 'price_unit','product_id','product_qty',
'name', 'fault_type', 'maintenance_standards', 'Period'
]
-
patch(FormStatusIndicator.prototype, 'jikimo_frontend.FormStatusIndicator', {
setup() {
owl.onMounted(() => {
@@ -109,30 +107,7 @@ patch(FormStatusIndicator.prototype, 'jikimo_frontend.FormStatusIndicator', {
}
);
-patch(Field.prototype, 'jikimo_frontend.Field', {
- setup() {
- owl.onMounted(this.setRequired);
- return this._super(...arguments);
- },
- setRequired() {
- const id = this.props.id
- const isRequired = filedRequiredList[id]
- if(isRequired) {
- let dom;
- dom = $(`label[for=${id}]`)
- if(isRequired.multiple && dom.length > 1) {
- dom = dom.eq(-1)
- dom = dom.parent().parent().next().find('label')
- }
- if(isRequired.noLabel) {
- dom = dom.parent().parent()
- }
- let t = dom.html()
- t = '*' + t
- dom.html(t)
- }
- }
-})
+
patch(ListRenderer.prototype, 'jikimo_frontend.ListRenderer', {
setup(){
owl.onMounted(() => {
@@ -200,7 +175,9 @@ patch(FormLabel.prototype, 'jikimo_frontend.FormLabel', {
this.props.fieldInfo
);
const classes = this.props.className ? [this.props.className] : [];
- if(this.props.fieldInfo?.rawAttrs?.class?.indexOf('custom_required') >= 0) {
+ const otherRequired = filedRequiredList[this.props.fieldName]
+
+ if(this.props.fieldInfo?.rawAttrs?.class?.indexOf('custom_required') >= 0 || otherRequired) {
classes.push('custom_required_add')
}
if (invalid) {
From 9e6fc3bacb8ee469c0a83817afdbea2d80ff4220 Mon Sep 17 00:00:00 2001
From: hyyy <123@qq.com>
Date: Wed, 19 Feb 2025 10:29:25 +0800
Subject: [PATCH 3/6] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=A0=B7=E5=BC=8F?=
=?UTF-8?q?=E6=9D=83=E9=87=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sf_sale/static/src/css/purchase_list.css | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/sf_sale/static/src/css/purchase_list.css b/sf_sale/static/src/css/purchase_list.css
index ec3d1e76..17df6065 100644
--- a/sf_sale/static/src/css/purchase_list.css
+++ b/sf_sale/static/src/css/purchase_list.css
@@ -2,8 +2,10 @@
min-width: 62px !important;
}
-.section_and_note_text, .section_and_note_text span{
+.o_list_renderer .o_list_table .o_data_row td.o_data_cell.o_field_cell.o_list_char.section_and_note_text, .section_and_note_text span{
white-space: wrap!important;
overflow: auto!important;
text-overflow: unset!important;
+ word-wrap: break-word;
+ word-break: break-all;
}
\ No newline at end of file
From 4dc19cab8163ec6eb4f8df0f889cd59114631089 Mon Sep 17 00:00:00 2001
From: guanhuan
Date: Wed, 19 Feb 2025 10:42:48 +0800
Subject: [PATCH 4/6] =?UTF-8?q?=E9=87=87=E8=B4=AD=E5=8D=8F=E8=AE=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
jikimo_purchase_tier_validation/__init__.py | 1 -
.../__manifest__.py | 3 -
.../controllers/__init__.py | 3 -
.../controllers/controllers.py | 21 --
.../data/documents_data.xml | 11 -
jikimo_purchase_tier_validation/demo/demo.xml | 30 ---
.../models/models.py | 41 ----
.../security/ir.model.access.csv | 2 -
.../views/templates.xml | 24 --
.../views/views.xml | 66 ------
.../wizards/__init__.py | 3 +-
.../wizards/upload_file_wizard.py | 114 ----------
sf_mrs_connect/__manifest__.py | 2 +-
sf_sale/__manifest__.py | 7 +-
sf_sale/data/documents_data.xml | 23 ++
sf_sale/i18n/zh_CN.po | 10 +
sf_sale/models/__init__.py | 2 +-
sf_sale/models/purchase_requisition.py | 210 ++++++++++++++++++
sf_sale/models/sale_order.py | 149 ++++++++++++-
sf_sale/security/ir.model.access.csv | 2 +-
sf_sale/views/purchase_order_view.xml | 21 +-
sf_sale/views/purchase_requisition_view.xml | 75 +++++++
sf_sale/wizard/__init__.py | 2 +
sf_sale/wizard/purchase_requisition_wizard.py | 20 ++
.../purchase_requisition_wizard_views.xml | 17 ++
sf_sale/wizard/upload_file_upload.py | 60 +++++
.../wizard/upload_file_upload_view.xml | 6 +-
27 files changed, 597 insertions(+), 328 deletions(-)
delete mode 100644 jikimo_purchase_tier_validation/controllers/__init__.py
delete mode 100644 jikimo_purchase_tier_validation/controllers/controllers.py
delete mode 100644 jikimo_purchase_tier_validation/data/documents_data.xml
delete mode 100644 jikimo_purchase_tier_validation/demo/demo.xml
delete mode 100644 jikimo_purchase_tier_validation/security/ir.model.access.csv
delete mode 100644 jikimo_purchase_tier_validation/views/templates.xml
delete mode 100644 jikimo_purchase_tier_validation/wizards/upload_file_wizard.py
create mode 100644 sf_sale/data/documents_data.xml
create mode 100644 sf_sale/i18n/zh_CN.po
create mode 100644 sf_sale/models/purchase_requisition.py
create mode 100644 sf_sale/views/purchase_requisition_view.xml
create mode 100644 sf_sale/wizard/purchase_requisition_wizard.py
create mode 100644 sf_sale/wizard/purchase_requisition_wizard_views.xml
create mode 100644 sf_sale/wizard/upload_file_upload.py
rename jikimo_purchase_tier_validation/wizards/upload_file_wizard_view.xml => sf_sale/wizard/upload_file_upload_view.xml (81%)
diff --git a/jikimo_purchase_tier_validation/__init__.py b/jikimo_purchase_tier_validation/__init__.py
index 40c32597..f553d8ff 100644
--- a/jikimo_purchase_tier_validation/__init__.py
+++ b/jikimo_purchase_tier_validation/__init__.py
@@ -1,5 +1,4 @@
# -*- 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
index a7bdbddf..4d676d8f 100644
--- a/jikimo_purchase_tier_validation/__manifest__.py
+++ b/jikimo_purchase_tier_validation/__manifest__.py
@@ -24,9 +24,6 @@
# 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
diff --git a/jikimo_purchase_tier_validation/controllers/__init__.py b/jikimo_purchase_tier_validation/controllers/__init__.py
deleted file mode 100644
index 457bae27..00000000
--- a/jikimo_purchase_tier_validation/controllers/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# -*- 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
deleted file mode 100644
index 6bbe5e40..00000000
--- a/jikimo_purchase_tier_validation/controllers/controllers.py
+++ /dev/null
@@ -1,21 +0,0 @@
-# -*- 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
deleted file mode 100644
index 990a6418..00000000
--- a/jikimo_purchase_tier_validation/data/documents_data.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
- 采购合同
- 存放采购合同相关文件
- 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
deleted file mode 100644
index cbba42ce..00000000
--- a/jikimo_purchase_tier_validation/demo/demo.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/jikimo_purchase_tier_validation/models/models.py b/jikimo_purchase_tier_validation/models/models.py
index 34d33d32..018766eb 100644
--- a/jikimo_purchase_tier_validation/models/models.py
+++ b/jikimo_purchase_tier_validation/models/models.py
@@ -21,12 +21,8 @@ class jikimo_purchase_tier_validation(models.Model):
def button_confirm(self):
for record in self:
- # if record.need_validation and record.validation_status != 'validated':
- # raise ValidationError(_('此操作需要至少对一条记录进行审批。\n请发起审批申请。'))
if record.state in ['to approve']:
raise ValidationError(_('请先完成审批。'))
- # if record.state == 'approved':
- # record.state = 'purchase'
res = super(jikimo_purchase_tier_validation, self).button_confirm()
for record in self:
if record.state == 'approved':
@@ -39,45 +35,8 @@ class jikimo_purchase_tier_validation(models.Model):
record.message_subscribe([record.partner_id.id])
return res
- # 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))
-
# 添加通知消息
if hasattr(record, 'message_post'):
current_user = self.env.user.name
diff --git a/jikimo_purchase_tier_validation/security/ir.model.access.csv b/jikimo_purchase_tier_validation/security/ir.model.access.csv
deleted file mode 100644
index 09ba96bc..00000000
--- a/jikimo_purchase_tier_validation/security/ir.model.access.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-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
deleted file mode 100644
index cea6b39a..00000000
--- a/jikimo_purchase_tier_validation/views/templates.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/jikimo_purchase_tier_validation/views/views.xml b/jikimo_purchase_tier_validation/views/views.xml
index b651e914..fdfd52c1 100644
--- a/jikimo_purchase_tier_validation/views/views.xml
+++ b/jikimo_purchase_tier_validation/views/views.xml
@@ -23,76 +23,10 @@
-
-
-
-
-
-
- ]}"/>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/jikimo_purchase_tier_validation/wizards/__init__.py b/jikimo_purchase_tier_validation/wizards/__init__.py
index 43edb50d..2484d9e0 100644
--- a/jikimo_purchase_tier_validation/wizards/__init__.py
+++ b/jikimo_purchase_tier_validation/wizards/__init__.py
@@ -1,2 +1 @@
-from . import upload_file_wizard
-from . import comment_wizard
\ No newline at end of file
+from . import comment_wizard
diff --git a/jikimo_purchase_tier_validation/wizards/upload_file_wizard.py b/jikimo_purchase_tier_validation/wizards/upload_file_wizard.py
deleted file mode 100644
index f7ead9e1..00000000
--- a/jikimo_purchase_tier_validation/wizards/upload_file_wizard.py
+++ /dev/null
@@ -1,114 +0,0 @@
-from odoo import models, fields, api, _
-
-
-class IrAttachmentWizard(models.TransientModel):
- _name = 'ir.attachment.wizard'
- _description = '文件上传向导'
-
- attachment = fields.Binary(string='选择文件', required=True)
- filename = fields.Char(string='文件名')
- res_model = fields.Char()
- res_id = fields.Integer()
-
- # def action_upload_file(self):
- # self.ensure_one()
- # # 首先创建 ir.attachment
- # attachment = self.env['ir.attachment'].create({
- # 'name': self.filename,
- # 'type': 'binary',
- # 'datas': self.attachment,
- # 'res_model': self.res_model,
- # 'res_id': self.res_id,
- # })
- #
- # # 获取默认的文档文件夹
- # workspace = self.env['documents.folder'].search([('name', '=', '采购合同')], limit=1)
- #
- # # 创建 documents.document 记录
- # document = self.env['documents.document'].create({
- # 'name': self.filename,
- # 'attachment_id': attachment.id,
- # 'folder_id': workspace.id,
- # 'res_model': self.res_model,
- # 'res_id': self.res_id,
- # })
- #
- # return {
- # 'type': 'ir.actions.client',
- # 'tag': 'display_notification',
- # 'params': {
- # 'title': _('成功'),
- # 'message': _('文件上传成功'),
- # 'type': 'success',
- # }
- # }
-
- def action_upload_file(self):
- self.ensure_one()
- # 获取当前用户的 partner_id
- current_partner = self.env.user.partner_id
- # 首先创建 ir.attachment
- attachment = self.env['ir.attachment'].create({
- 'name': self.filename,
- 'type': 'binary',
- 'datas': self.attachment,
- 'res_model': self.res_model,
- 'res_id': self.res_id,
- })
-
- # 获取默认的文档文件夹
- workspace = self.env['documents.folder'].search([('name', '=', '采购合同')], limit=1)
-
- # 创建 documents.document 记录
- document = self.env['documents.document'].create({
- 'name': self.filename,
- 'attachment_id': attachment.id,
- 'folder_id': workspace.id,
- 'res_model': self.res_model,
- 'res_id': self.res_id,
- 'partner_id': current_partner.id,
- })
-
- # 更新采购订单的合同文档字段
- purchase_order = self.env['purchase.order'].browse(self.res_id)
- purchase_order.write({
- 'contract_document_id': document.id,
- 'is_upload_contract_file': True
- })
-
- # 显示成功消息并关闭向导
- message = {
- 'type': 'ir.actions.client',
- 'tag': 'display_notification',
- 'params': {
- 'title': _('成功'),
- 'message': _('文件上传成功'),
- 'type': 'success',
- 'sticky': False, # 自动消失
- 'next': {
- 'type': 'ir.actions.act_window_close'
- }
- }
- }
-
- return message
-
-
- # def action_upload_file(self):
- # self.ensure_one()
- # attachment = self.env['ir.attachment'].create({
- # 'name': self.filename,
- # 'type': 'binary',
- # 'datas': self.attachment,
- # 'res_model': self.res_model,
- # 'res_id': self.res_id,
- # })
- # return {
- # 'type': 'ir.actions.client',
- # 'tag': 'display_notification',
- # 'params': {
- # 'title': _('成功'),
- # 'message': _('文件上传成功'),
- # 'type': 'success',
- # }
- # }
diff --git a/sf_mrs_connect/__manifest__.py b/sf_mrs_connect/__manifest__.py
index 1ea4f693..ea1fb001 100644
--- a/sf_mrs_connect/__manifest__.py
+++ b/sf_mrs_connect/__manifest__.py
@@ -10,7 +10,7 @@
""",
'category': 'sf',
'website': 'https://www.sf.cs.jikimo.com',
- 'depends': ['sf_base', 'base_setup','sf_bf_connect'],
+ 'depends': ['sf_base', 'base_setup','sf_bf_connect','sf_sale'],
'data': [
'data/ir_cron_data.xml',
'security/ir.model.access.csv',
diff --git a/sf_sale/__manifest__.py b/sf_sale/__manifest__.py
index e824240e..d33bb02e 100644
--- a/sf_sale/__manifest__.py
+++ b/sf_sale/__manifest__.py
@@ -10,18 +10,23 @@
""",
'category': 'sf',
'website': 'https://www.sf.jikimo.com',
- 'depends': ['sale', 'sale_management', 'web_widget_model_viewer', 'sf_base', 'account', 'purchase', 'delivery'],
+ 'depends': ['sale', 'sale_management', 'web_widget_model_viewer', 'sf_base', 'account', 'purchase', 'delivery',
+ 'purchase_requisition', 'purchase_requisition_stock', 'documents'],
'data': [
+ 'data/documents_data.xml',
'security/group_security.xml',
'security/ir.model.access.csv',
'wizard/sale_order_wizard_views.xml',
'wizard/purchase_order_wizard_views.xml',
+ 'wizard/upload_file_upload_view.xml',
+ 'wizard/purchase_requisition_wizard_views.xml',
'data/cron_data.xml',
'views/sale_team.xml',
'views/sale_order_view.xml',
'views/res_partner_view.xml',
'views/purchase_order_view.xml',
'views/quick_easy_order_view.xml',
+ 'views/purchase_requisition_view.xml',
'views/purchase_menu.xml'
],
'assets': {
diff --git a/sf_sale/data/documents_data.xml b/sf_sale/data/documents_data.xml
new file mode 100644
index 00000000..f5f46023
--- /dev/null
+++ b/sf_sale/data/documents_data.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+ 采购合同
+ 存放采购合同相关文件
+ 10
+
+
+ 废弃
+
+
+
+ 通过
+
+
+
+ 待审
+
+
+
+
\ No newline at end of file
diff --git a/sf_sale/i18n/zh_CN.po b/sf_sale/i18n/zh_CN.po
new file mode 100644
index 00000000..2cb98706
--- /dev/null
+++ b/sf_sale/i18n/zh_CN.po
@@ -0,0 +1,10 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * purchase_requisition
+#
+
+#. module: purchase_requisition
+#: model:ir.actions.act_window,name:purchase_requisition.action_purchase_requisition
+#: model:ir.ui.menu,name:purchase_requisition.menu_purchase_requisition_pro_mgt
+msgid "Blanket Orders"
+msgstr "采购协议"
diff --git a/sf_sale/models/__init__.py b/sf_sale/models/__init__.py
index 97400237..c8e3a43f 100644
--- a/sf_sale/models/__init__.py
+++ b/sf_sale/models/__init__.py
@@ -4,4 +4,4 @@ from . import quick_easy_order_old
from . import auto_quatotion_common
from . import parser_and_calculate_work_time
from . import preload_datas_functions
-
+from . import purchase_requisition
diff --git a/sf_sale/models/purchase_requisition.py b/sf_sale/models/purchase_requisition.py
new file mode 100644
index 00000000..263f65ab
--- /dev/null
+++ b/sf_sale/models/purchase_requisition.py
@@ -0,0 +1,210 @@
+from odoo import models, fields, api, _
+from odoo.exceptions import UserError, ValidationError
+import logging
+
+_logger = logging.getLogger(__name__)
+
+
+class PurchaseRequisition(models.Model):
+ _inherit = 'purchase.requisition'
+
+ partner_ref = fields.Char(string='合同名称', required=True)
+ contract_number = fields.Char(string='合同编码', size=20, required=True)
+ payment_term_id = fields.Many2one('account.payment.term', '付款条件',
+ domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]",
+ required=True)
+ contract_summary = fields.Text(string='合同概况', required=True)
+
+ 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 upload_contract_file(self):
+ self.ensure_one()
+ action = {
+ 'type': 'ir.actions.act_window',
+ 'name': _('上传合同文件'),
+ 'res_model': 'ir.attachment.upload', # 我们需要创建一个新的向导模型
+ '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.requisition',
+ '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,
+ }
+ }
+
+ def action_in_progress(self):
+ self.ensure_one()
+ # 检查合同文件
+ if not self.contract_document_id:
+ raise ValidationError('* 必须点击上传合同文件')
+ if self.origin:
+ purchase_order = self.env['purchase.order'].search([('name', '=', self.origin)], limit=1)
+ if purchase_order:
+ if not purchase_order.requisition_id:
+ # 绑定采购协议
+ self.purchase_ids += purchase_order
+ else:
+ raise ValidationError('源单据已绑定采购协议,请手动清除源单据解绑。')
+ res = super(PurchaseRequisition, self).action_in_progress()
+ # 将合同文档移动到废弃
+ for requisition in self:
+ if requisition.contract_document_id:
+ workspace = self.update_documents_folder('通过')
+ requisition.contract_document_id.write({
+ 'folder_id': workspace.id,
+ })
+ return res
+
+ def action_cancel(self):
+ for requisition in self:
+ if requisition.purchase_ids:
+ raise ValidationError(_('已关联采购订单,不能取消该采购协议'))
+ res = super(PurchaseRequisition, self).action_cancel()
+ # 将合同文档移动到废弃
+ for requisition in self:
+ if requisition.contract_document_id:
+ workspace = self.update_documents_folder('废弃')
+ requisition.contract_document_id.write({
+ 'folder_id': workspace.id,
+ })
+ return res
+
+ def action_draft(self):
+ res = super(PurchaseRequisition, self).action_draft()
+ for requisition in self:
+ if requisition.contract_document_id:
+ workspace = self.update_documents_folder('待审')
+ requisition.contract_document_id.write({
+ 'folder_id': workspace.id,
+ })
+ return res
+
+ def update_documents_folder(self, documents_folder_name):
+ workspace_parent = self.env['documents.folder'].search([('name', '=', '采购合同')], limit=1)
+ workspace = self.env['documents.folder'].search(
+ [('name', '=', documents_folder_name), ('parent_folder_id', '=', workspace_parent.id)], limit=1)
+ return workspace
+
+ @api.constrains('line_ids')
+ def check_line_ids(self):
+ if self.origin:
+ purchase_order = self.env['purchase.order'].search([('name', '=', self.origin)], limit=1)
+ if purchase_order:
+ error_products = []
+ # 获取采购订单中的所有产品
+ purchase_order_products = purchase_order.order_line.mapped('product_id')
+ if self.line_ids:
+ for line in self.line_ids:
+ # 检查当前行的产品在采购订单中的数量
+ order_line = purchase_order.order_line.filtered(lambda ol: ol.product_id == line.product_id)
+ if order_line and line.product_qty < order_line.product_qty:
+ error_products.append(line.product_id.name) # 收集不符合条件的产品名称
+ else:
+ raise ValidationError(
+ _('采购协议的产品和数量应达超源单据的产品和数量,请修改产品数量或修改源单据。'))
+
+ # 检查采购订单中的产品是否都在采购协议中
+ for product in purchase_order_products:
+ if product not in self.line_ids.mapped('product_id'):
+ raise ValidationError(
+ _('采购协议的产品和数量应达超源单据的产品和数量,请修改产品数量或修改源单据。'))
+ if error_products:
+ raise ValidationError(
+ _('产品 %s 的数量不能小于源单据数量,当前无法保存。') % (', '.join(error_products)))
+
+
+class PurchaseRequisitionLine(models.Model):
+ _inherit = 'purchase.requisition.line'
+
+ materials_id = fields.Many2one('sf.production.materials', string='材料', compute='_compute_product_info')
+ materials_type_id = fields.Many2one('sf.materials.model', string='规格型号', compute='_compute_product_info')
+ part_number = fields.Char(string='零件图号', compute='_compute_product_info')
+ delivery_date = fields.Date(string='交货时间')
+
+ @api.depends('product_id')
+ def _compute_product_info(self):
+ for line in self:
+ if line.product_id:
+ line.materials_id = line.product_id.materials_id
+ line.materials_type_id = line.product_id.materials_type_id
+ line.part_number = line.product_id.part_number
+ else:
+ line.materials_id = False
+ line.materials_type_id = False
+ line.part_number = False
+
+ @api.model_create_multi
+ def create(self, vals_list):
+ for vals in vals_list:
+ if 'product_qty' in vals and vals.get('product_qty') <= 0:
+ raise UserError('请对【产品】中的【数量】进行输入')
+ if 'price_unit' in vals and vals.get('price_unit') <= 0:
+ raise UserError('请对【产品】中的【单价】进行输入')
+ return super(PurchaseRequisitionLine, self).create(vals_list)
+
+ def write(self, vals):
+ if 'product_qty' in vals and vals.get('product_qty') <= 0:
+ raise UserError('请对【产品】中的【数量】进行输入')
+ if 'price_unit' in vals and vals.get('price_unit') <= 0:
+ raise UserError('请对【产品】中的【单价】进行输入')
+ return super(PurchaseRequisitionLine, self).write(vals)
diff --git a/sf_sale/models/sale_order.py b/sf_sale/models/sale_order.py
index 4d0106bc..3d5d2b21 100644
--- a/sf_sale/models/sale_order.py
+++ b/sf_sale/models/sale_order.py
@@ -132,7 +132,7 @@ class ReSaleOrder(models.Model):
'name': '%s/%s/%s/%s/%s/%s' % (
self.format_float(product.model_long),
self.format_float(product.model_width),
- self.format_float(product.model_height),
+ self.format_float(product.model_height),
self.format_float(product.model_volume),
machining_accuracy_name,
product.materials_id.name),
@@ -303,13 +303,39 @@ class RePurchaseOrder(models.Model):
string='采购类型', default='standard', store=True, compute='_compute_purchase_type')
# 合同编号
- contract_number = fields.Char(string='合同编号', size=20)
+ contract_number = fields.Char(related='requisition_id.contract_number', string='合同编号', size=20)
# 合同概况
contract_summary = fields.Text(string='合同概况')
# 选择是否为紧急采购
urgent_purchase = fields.Selection([('no', '否'), ('yes', '是')], string='紧急采购', default='no')
+ purchase_requisition_count = fields.Integer('采购协议数量', compute='_compute_purchase_requisition_count')
+
+ partner_ref = fields.Char(related='requisition_id.partner_ref')
+ payment_term_id = fields.Many2one(related='requisition_id.payment_term_id')
+
+ requisition_id = fields.Many2one('purchase.requisition', string='采购协议', copy=False, readonly=True)
+ show_create_requisition_button = fields.Boolean(string='显示创建采购协议按钮',
+ compute='_compute_show_create_requisition_button'
+ )
+ show_requisition_fields = fields.Boolean(string='显示协议按钮', compute='_compute_show_requisition_fields')
+
+ @api.depends('requisition_id')
+ def _compute_show_requisition_fields(self):
+ for order in self:
+ order.show_requisition_fields = bool(order.requisition_id and order.requisition_id.state == 'ongoing')
+
+ @api.depends('requisition_id')
+ def _compute_show_create_requisition_button(self):
+ for order in self:
+ purchase_requisition = self.env['purchase.requisition'].search_count([('origin', '=', order.name)])
+ order.show_create_requisition_button = purchase_requisition > 0
+
+ def _compute_purchase_requisition_count(self):
+ for record in self:
+ record.purchase_requisition_count = len(record.requisition_id)
+
@api.depends('origin')
def _compute_purchase_type(self):
for purchase in self:
@@ -344,6 +370,26 @@ class RePurchaseOrder(models.Model):
for item in self:
if not item.order_line:
raise UserError('该询价单未添加【产品】,请进行添加')
+ missing_products = []
+ over_ordered_products = []
+ if item.requisition_id:
+ requisition_product_ids = item.requisition_id.line_ids.mapped('product_id.id')
+ for line in item.order_line:
+ if line.product_id.id not in requisition_product_ids:
+ missing_products.append(line.product_id.name)
+ else:
+ requisition_line = item.requisition_id.line_ids.filtered(
+ lambda r: r.product_id.id == line.product_id.id)
+ remaining_qty = requisition_line.product_qty - requisition_line.qty_ordered
+ if requisition_line and line.product_qty > remaining_qty:
+ over_ordered_products.append(
+ f'{line.product_id.name}:{remaining_qty}{requisition_line.product_uom_id.name}')
+
+ if missing_products:
+ raise UserError('关联协议不存在产品 %s ,无法保存。' % '、'.join(missing_products))
+ if over_ordered_products:
+ raise UserError('当前订购数量超过了关联协议的剩余数量,无法保存。\n涉及产品及剩余数量有:\n%s' % '\n'.join(
+ over_ordered_products))
for line in item.order_line:
if not line.product_id:
raise UserError('【产品】未添加,请进行添加')
@@ -399,6 +445,21 @@ class RePurchaseOrder(models.Model):
# raise ValidationError('【%s】已存在,请勿重复添加' % product[-1].name)
def button_confirm(self):
+ over_ordered_products = []
+ for item in self:
+ if item.requisition_id:
+ requisition_product_ids = item.requisition_id.line_ids.mapped('product_id.id')
+ for line in item.order_line:
+ if line.product_id.id in requisition_product_ids:
+ requisition_line = item.requisition_id.line_ids.filtered(
+ lambda r: r.product_id.id == line.product_id.id)
+ remaining_qty = requisition_line.product_qty - requisition_line.qty_ordered
+ if requisition_line and line.product_qty > remaining_qty:
+ over_ordered_products.append(
+ f'{line.product_id.name}:{remaining_qty} {requisition_line.product_uom_id.name}')
+ if over_ordered_products:
+ raise UserError('当前订购数量超过了关联协议的剩余数量,无法保存。\n涉及产品及剩余数量有:\n%s' % '\n'.join(
+ over_ordered_products))
result = super(RePurchaseOrder, self).button_confirm()
for item in self:
# 确认订单时,自动分配序列号
@@ -439,6 +500,90 @@ class RePurchaseOrder(models.Model):
purchase_order_overdue.write({'delivery_warning': 'normal'})
return last_overdue_order, last_warning_order
+ def button_create_requisition(self):
+ self.ensure_one()
+ line_ids = []
+ for order_line in self.order_line:
+ line_values = {
+ 'product_id': order_line.product_id.id,
+ 'product_uom_id': order_line.product_uom.id,
+ 'product_qty': order_line.product_qty,
+ 'price_unit': order_line.price_unit,
+ }
+ line_ids.append((0, 0, line_values))
+ initial_data = {
+ 'vendor_id': self.partner_id.id,
+ 'origin': self.name,
+ 'line_ids': line_ids,
+ }
+ return {
+ 'type': 'ir.actions.act_window',
+ 'res_model': 'purchase.requisition',
+ 'view_mode': 'form',
+ 'target': 'current',
+ 'context': {
+ 'default_origin': initial_data['origin'],
+ 'default_line_ids': initial_data['line_ids'],
+ 'default_vendor_id': initial_data['vendor_id'],
+ }
+ }
+
+ def button_link_requisition(self):
+ requisition_ids = self.env['purchase.requisition'].sudo().search(
+ [('state', '=', 'ongoing'), ('vendor_id', '=', self.partner_id.id),
+ ('line_ids.product_id', 'in', self.order_line.mapped('product_id.id'))])
+
+ # 新增的逻辑:过滤出符合条件的requisition_ids
+ valid_requisition_ids = []
+ for requisition in requisition_ids:
+ for line in requisition.line_ids:
+ if line.product_id in self.order_line.mapped(
+ 'product_id') and line.product_qty - line.qty_ordered >= self.order_line.filtered(
+ lambda ol: ol.product_id == line.product_id).product_qty:
+ valid_requisition_ids.append(requisition.id)
+ break
+
+ action = {
+ 'res_model': 'purchase.requisition',
+ 'type': 'ir.actions.act_window',
+ 'name': _("选择采购申请"),
+ 'domain': [('id', 'in', valid_requisition_ids)],
+ 'views': [[self.env.ref('sf_sale.purchase_requisition_wizard_tree_view').id, 'list']],
+ 'target': 'new',
+ 'context': {'purchase_order_id': self.id},
+ }
+ return action
+
+ def button_unlink_requisition(self):
+ self.ensure_one()
+ for line in self.order_line:
+ if self.requisition_id:
+ requisition_line = self.requisition_id.line_ids.filtered(lambda r: r.product_id.id == line.product_id.id)
+ if requisition_line:
+ self.requisition_id.origin = False
+ self.requisition_id.purchase_ids = [(3, self.id)]
+
+
+ def action_view_requisition(self):
+ self.ensure_one()
+ requisition_ids = self.requisition_id.ids
+ action = {
+ 'res_model': 'purchase.requisition',
+ 'type': 'ir.actions.act_window',
+ }
+ if len(requisition_ids) == 1:
+ action.update({
+ 'view_mode': 'form',
+ 'res_id': requisition_ids[0],
+ })
+ else:
+ action.update({
+ 'name': _("采购协议来源%s", self.name),
+ 'domain': [('id', 'in', requisition_ids)],
+ 'view_mode': 'tree,form',
+ })
+ return action
+
class PurchaseOrderLine(models.Model):
_inherit = 'purchase.order.line'
diff --git a/sf_sale/security/ir.model.access.csv b/sf_sale/security/ir.model.access.csv
index 64194f9a..03f636e6 100644
--- a/sf_sale/security/ir.model.access.csv
+++ b/sf_sale/security/ir.model.access.csv
@@ -119,5 +119,5 @@ access_stock_scrap_group_sale_director,stock_scrap_group_sale_director,stock.mod
access_account_move_group_plan_dispatch,account_move_group_plan_dispatch,account.model_account_move,sf_base.group_plan_dispatch,1,1,1,0
-
+access_ir_attachment_upload,ir.attachment.upload,model_ir_attachment_upload,base.group_user,1,1,1,1
diff --git a/sf_sale/views/purchase_order_view.xml b/sf_sale/views/purchase_order_view.xml
index ecc061fa..9a271cb9 100644
--- a/sf_sale/views/purchase_order_view.xml
+++ b/sf_sale/views/purchase_order_view.xml
@@ -25,6 +25,14 @@
data-hotkey="y" groups="stock.group_stock_user"/>
+
+
+
+
+
1
@@ -139,7 +147,7 @@
-
+
{'readonly': [('state', 'in', ['purchase'])]}
@@ -210,6 +218,17 @@
1
+
+
+
diff --git a/sf_sale/views/purchase_requisition_view.xml b/sf_sale/views/purchase_requisition_view.xml
new file mode 100644
index 00000000..e96e5c31
--- /dev/null
+++ b/sf_sale/views/purchase_requisition_view.xml
@@ -0,0 +1,75 @@
+
+
+
+
+ purchase.requisition.form.inherit.sf
+ purchase.requisition
+
+
+
+
+
+ ]}"/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sf_sale/wizard/__init__.py b/sf_sale/wizard/__init__.py
index 7f1bd0c7..d74cb77b 100644
--- a/sf_sale/wizard/__init__.py
+++ b/sf_sale/wizard/__init__.py
@@ -1,2 +1,4 @@
from . import sale_order_wizard
from . import purchase_order_wizard
+from . import upload_file_upload
+from . import purchase_requisition_wizard
diff --git a/sf_sale/wizard/purchase_requisition_wizard.py b/sf_sale/wizard/purchase_requisition_wizard.py
new file mode 100644
index 00000000..7b335b57
--- /dev/null
+++ b/sf_sale/wizard/purchase_requisition_wizard.py
@@ -0,0 +1,20 @@
+from odoo import models, fields, api, _
+import logging
+from odoo.exceptions import UserError
+
+_logger = logging.getLogger(__name__)
+
+
+class PurchaseRequisition(models.Model):
+ _inherit = 'purchase.requisition'
+
+ def action_confirm(self):
+ purchase_order_id = self.env.context.get('purchase_order_id')
+ purchase_order = self.env['purchase.order'].sudo().search([('id', '=', purchase_order_id)])
+ if purchase_order.requisition_id.id == self.id:
+ raise UserError(_('该采购订单已绑定%s协议') % purchase_order.name)
+ if purchase_order.requisition_id:
+ # 先解绑
+ purchase_order.button_unlink_requisition()
+ purchase_order.write({'requisition_id': self.id})
+ self.purchase_ids += purchase_order
diff --git a/sf_sale/wizard/purchase_requisition_wizard_views.xml b/sf_sale/wizard/purchase_requisition_wizard_views.xml
new file mode 100644
index 00000000..a18321f3
--- /dev/null
+++ b/sf_sale/wizard/purchase_requisition_wizard_views.xml
@@ -0,0 +1,17 @@
+
+
+
+ purchase.requisition.wizard.tree.view
+ purchase.requisition
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sf_sale/wizard/upload_file_upload.py b/sf_sale/wizard/upload_file_upload.py
new file mode 100644
index 00000000..4d84caa6
--- /dev/null
+++ b/sf_sale/wizard/upload_file_upload.py
@@ -0,0 +1,60 @@
+from odoo import models, fields, api, _
+
+
+class IrAttachmentUpload(models.TransientModel):
+ _name = 'ir.attachment.upload'
+ _description = '文件上传向导'
+
+ attachment = fields.Binary(string='选择文件', required=True)
+ filename = fields.Char(string='文件名')
+ res_model = fields.Char()
+ res_id = fields.Integer()
+
+ def action_upload_file(self):
+ self.ensure_one()
+ # 获取当前用户的 partner_id
+ current_partner = self.env.user.partner_id
+ # 首先创建 ir.attachment
+ attachment = self.env['ir.attachment'].create({
+ 'name': self.filename,
+ 'type': 'binary',
+ 'datas': self.attachment,
+ 'res_model': self.res_model,
+ 'res_id': self.res_id,
+ })
+
+ # 获取默认的文档文件夹
+ workspace = self.env['purchase.requisition'].update_documents_folder('待审')
+
+ # 创建 documents.document 记录
+ document = self.env['documents.document'].create({
+ 'name': self.filename,
+ 'attachment_id': attachment.id,
+ 'folder_id': workspace.id,
+ 'res_model': self.res_model,
+ 'res_id': self.res_id,
+ 'partner_id': current_partner.id,
+ })
+
+ # 更新采购订单的合同文档字段
+ purchase_requisition = self.env['purchase.requisition'].browse(self.res_id)
+ purchase_requisition.write({
+ 'contract_document_id': document.id,
+ 'is_upload_contract_file': True
+ })
+
+ # 显示成功消息并关闭向导
+ message = {
+ 'type': 'ir.actions.client',
+ 'tag': 'display_notification',
+ 'params': {
+ 'title': _('成功'),
+ 'message': _('文件上传成功'),
+ 'type': 'success',
+ 'sticky': False, # 自动消失
+ 'next': {
+ 'type': 'ir.actions.act_window_close'
+ }
+ }
+ }
+ return message
diff --git a/jikimo_purchase_tier_validation/wizards/upload_file_wizard_view.xml b/sf_sale/wizard/upload_file_upload_view.xml
similarity index 81%
rename from jikimo_purchase_tier_validation/wizards/upload_file_wizard_view.xml
rename to sf_sale/wizard/upload_file_upload_view.xml
index d75e75cb..54412063 100644
--- a/jikimo_purchase_tier_validation/wizards/upload_file_wizard_view.xml
+++ b/sf_sale/wizard/upload_file_upload_view.xml
@@ -1,8 +1,8 @@
-
- ir.attachment.wizard.form
- ir.attachment.wizard
+
+ ir.attachment.upload.form
+ ir.attachment.upload
1
@@ -218,17 +210,6 @@
1
-
-
-
diff --git a/sf_sale/views/purchase_requisition_view.xml b/sf_sale/views/purchase_requisition_view.xml
deleted file mode 100644
index e96e5c31..00000000
--- a/sf_sale/views/purchase_requisition_view.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-
-
-
-
- purchase.requisition.form.inherit.sf
- purchase.requisition
-
-
-
-
-
- ]}"/>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/sf_sale/wizard/__init__.py b/sf_sale/wizard/__init__.py
index d74cb77b..7f1bd0c7 100644
--- a/sf_sale/wizard/__init__.py
+++ b/sf_sale/wizard/__init__.py
@@ -1,4 +1,2 @@
from . import sale_order_wizard
from . import purchase_order_wizard
-from . import upload_file_upload
-from . import purchase_requisition_wizard
diff --git a/sf_sale/wizard/purchase_requisition_wizard.py b/sf_sale/wizard/purchase_requisition_wizard.py
deleted file mode 100644
index 7b335b57..00000000
--- a/sf_sale/wizard/purchase_requisition_wizard.py
+++ /dev/null
@@ -1,20 +0,0 @@
-from odoo import models, fields, api, _
-import logging
-from odoo.exceptions import UserError
-
-_logger = logging.getLogger(__name__)
-
-
-class PurchaseRequisition(models.Model):
- _inherit = 'purchase.requisition'
-
- def action_confirm(self):
- purchase_order_id = self.env.context.get('purchase_order_id')
- purchase_order = self.env['purchase.order'].sudo().search([('id', '=', purchase_order_id)])
- if purchase_order.requisition_id.id == self.id:
- raise UserError(_('该采购订单已绑定%s协议') % purchase_order.name)
- if purchase_order.requisition_id:
- # 先解绑
- purchase_order.button_unlink_requisition()
- purchase_order.write({'requisition_id': self.id})
- self.purchase_ids += purchase_order
diff --git a/sf_sale/wizard/purchase_requisition_wizard_views.xml b/sf_sale/wizard/purchase_requisition_wizard_views.xml
deleted file mode 100644
index a18321f3..00000000
--- a/sf_sale/wizard/purchase_requisition_wizard_views.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
- purchase.requisition.wizard.tree.view
- purchase.requisition
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/sf_sale/wizard/upload_file_upload.py b/sf_sale/wizard/upload_file_upload.py
deleted file mode 100644
index 4d84caa6..00000000
--- a/sf_sale/wizard/upload_file_upload.py
+++ /dev/null
@@ -1,60 +0,0 @@
-from odoo import models, fields, api, _
-
-
-class IrAttachmentUpload(models.TransientModel):
- _name = 'ir.attachment.upload'
- _description = '文件上传向导'
-
- attachment = fields.Binary(string='选择文件', required=True)
- filename = fields.Char(string='文件名')
- res_model = fields.Char()
- res_id = fields.Integer()
-
- def action_upload_file(self):
- self.ensure_one()
- # 获取当前用户的 partner_id
- current_partner = self.env.user.partner_id
- # 首先创建 ir.attachment
- attachment = self.env['ir.attachment'].create({
- 'name': self.filename,
- 'type': 'binary',
- 'datas': self.attachment,
- 'res_model': self.res_model,
- 'res_id': self.res_id,
- })
-
- # 获取默认的文档文件夹
- workspace = self.env['purchase.requisition'].update_documents_folder('待审')
-
- # 创建 documents.document 记录
- document = self.env['documents.document'].create({
- 'name': self.filename,
- 'attachment_id': attachment.id,
- 'folder_id': workspace.id,
- 'res_model': self.res_model,
- 'res_id': self.res_id,
- 'partner_id': current_partner.id,
- })
-
- # 更新采购订单的合同文档字段
- purchase_requisition = self.env['purchase.requisition'].browse(self.res_id)
- purchase_requisition.write({
- 'contract_document_id': document.id,
- 'is_upload_contract_file': True
- })
-
- # 显示成功消息并关闭向导
- message = {
- 'type': 'ir.actions.client',
- 'tag': 'display_notification',
- 'params': {
- 'title': _('成功'),
- 'message': _('文件上传成功'),
- 'type': 'success',
- 'sticky': False, # 自动消失
- 'next': {
- 'type': 'ir.actions.act_window_close'
- }
- }
- }
- return message
diff --git a/sf_sale/wizard/upload_file_upload_view.xml b/sf_sale/wizard/upload_file_upload_view.xml
deleted file mode 100644
index 54412063..00000000
--- a/sf_sale/wizard/upload_file_upload_view.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
- ir.attachment.upload.form
- ir.attachment.upload
-
-
-
-
-
\ No newline at end of file
From a628826b52cc6e3210170414c79b75594de774ad Mon Sep 17 00:00:00 2001
From: guanhuan
Date: Wed, 19 Feb 2025 11:34:58 +0800
Subject: [PATCH 6/6] =?UTF-8?q?=E9=87=87=E8=B4=AD=E5=8D=8F=E8=AE=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sf_sale/models/__init__.py | 1 +
sf_sale/security/ir.model.access.csv | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/sf_sale/models/__init__.py b/sf_sale/models/__init__.py
index 9f2eb4dc..97400237 100644
--- a/sf_sale/models/__init__.py
+++ b/sf_sale/models/__init__.py
@@ -4,3 +4,4 @@ from . import quick_easy_order_old
from . import auto_quatotion_common
from . import parser_and_calculate_work_time
from . import preload_datas_functions
+
diff --git a/sf_sale/security/ir.model.access.csv b/sf_sale/security/ir.model.access.csv
index 03f636e6..64194f9a 100644
--- a/sf_sale/security/ir.model.access.csv
+++ b/sf_sale/security/ir.model.access.csv
@@ -119,5 +119,5 @@ access_stock_scrap_group_sale_director,stock_scrap_group_sale_director,stock.mod
access_account_move_group_plan_dispatch,account_move_group_plan_dispatch,account.model_account_move,sf_base.group_plan_dispatch,1,1,1,0
-access_ir_attachment_upload,ir.attachment.upload,model_ir_attachment_upload,base.group_user,1,1,1,1
+