Accept Merge Request #1633: (feature/制造功能优化 -> develop)
Merge Request: 询价单字段排版及增加逻辑验证 Created By: @马广威 Accepted By: @马广威 URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/1633?initial=true
This commit is contained in:
4
jikimo_purchase_tier_validation/__init__.py
Normal file
4
jikimo_purchase_tier_validation/__init__.py
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from . import controllers
|
||||||
|
from . import models
|
||||||
35
jikimo_purchase_tier_validation/__manifest__.py
Normal file
35
jikimo_purchase_tier_validation/__manifest__.py
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
# -*- 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'],
|
||||||
|
|
||||||
|
# always loaded
|
||||||
|
'data': [
|
||||||
|
# 'security/ir.model.access.csv',
|
||||||
|
'views/views.xml',
|
||||||
|
'views/templates.xml',
|
||||||
|
],
|
||||||
|
# only loaded in demonstration mode
|
||||||
|
'demo': [
|
||||||
|
'demo/demo.xml',
|
||||||
|
],
|
||||||
|
}
|
||||||
3
jikimo_purchase_tier_validation/controllers/__init__.py
Normal file
3
jikimo_purchase_tier_validation/controllers/__init__.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from . import controllers
|
||||||
21
jikimo_purchase_tier_validation/controllers/controllers.py
Normal file
21
jikimo_purchase_tier_validation/controllers/controllers.py
Normal file
@@ -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/<model("jikimo_purchase_tier_validation.jikimo_purchase_tier_validation"):obj>', auth='public')
|
||||||
|
# def object(self, obj, **kw):
|
||||||
|
# return http.request.render('jikimo_purchase_tier_validation.object', {
|
||||||
|
# 'object': obj
|
||||||
|
# })
|
||||||
30
jikimo_purchase_tier_validation/demo/demo.xml
Normal file
30
jikimo_purchase_tier_validation/demo/demo.xml
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
<odoo>
|
||||||
|
<data>
|
||||||
|
<!--
|
||||||
|
<record id="object0" model="jikimo_purchase_tier_validation.jikimo_purchase_tier_validation">
|
||||||
|
<field name="name">Object 0</field>
|
||||||
|
<field name="value">0</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="object1" model="jikimo_purchase_tier_validation.jikimo_purchase_tier_validation">
|
||||||
|
<field name="name">Object 1</field>
|
||||||
|
<field name="value">10</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="object2" model="jikimo_purchase_tier_validation.jikimo_purchase_tier_validation">
|
||||||
|
<field name="name">Object 2</field>
|
||||||
|
<field name="value">20</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="object3" model="jikimo_purchase_tier_validation.jikimo_purchase_tier_validation">
|
||||||
|
<field name="name">Object 3</field>
|
||||||
|
<field name="value">30</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="object4" model="jikimo_purchase_tier_validation.jikimo_purchase_tier_validation">
|
||||||
|
<field name="name">Object 4</field>
|
||||||
|
<field name="value">40</field>
|
||||||
|
</record>
|
||||||
|
-->
|
||||||
|
</data>
|
||||||
|
</odoo>
|
||||||
3
jikimo_purchase_tier_validation/models/__init__.py
Normal file
3
jikimo_purchase_tier_validation/models/__init__.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from . import models
|
||||||
19
jikimo_purchase_tier_validation/models/models.py
Normal file
19
jikimo_purchase_tier_validation/models/models.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
from odoo import models, fields, api, _
|
||||||
|
from odoo.exceptions import ValidationError
|
||||||
|
|
||||||
|
class jikimo_purchase_tier_validation(models.Model):
|
||||||
|
_name = 'purchase.order'
|
||||||
|
_inherit = ['purchase.order', 'tier.validation']
|
||||||
|
|
||||||
|
def request_validation(self):
|
||||||
|
for record in self:
|
||||||
|
missing_fields = []
|
||||||
|
if not record.partner_ref:
|
||||||
|
missing_fields.append('合同名称')
|
||||||
|
if not record.contract_number:
|
||||||
|
missing_fields.append('合同编号')
|
||||||
|
|
||||||
|
if missing_fields:
|
||||||
|
raise ValidationError(_('如下字段要求必须填写:%s') % '、'.join(missing_fields))
|
||||||
|
|
||||||
|
return super(jikimo_purchase_tier_validation, self).request_validation()
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||||
|
access_jikimo_purchase_tier_validation_jikimo_purchase_tier_validation,jikimo_purchase_tier_validation.jikimo_purchase_tier_validation,model_jikimo_purchase_tier_validation_jikimo_purchase_tier_validation,base.group_user,1,1,1,1
|
||||||
|
24
jikimo_purchase_tier_validation/views/templates.xml
Normal file
24
jikimo_purchase_tier_validation/views/templates.xml
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<odoo>
|
||||||
|
<data>
|
||||||
|
<!--
|
||||||
|
<template id="listing">
|
||||||
|
<ul>
|
||||||
|
<li t-foreach="objects" t-as="object">
|
||||||
|
<a t-attf-href="#{ root }/objects/#{ object.id }">
|
||||||
|
<t t-esc="object.display_name"/>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</template>
|
||||||
|
<template id="object">
|
||||||
|
<h1><t t-esc="object.display_name"/></h1>
|
||||||
|
<dl>
|
||||||
|
<t t-foreach="object._fields" t-as="field">
|
||||||
|
<dt><t t-esc="field"/></dt>
|
||||||
|
<dd><t t-esc="object[field]"/></dd>
|
||||||
|
</t>
|
||||||
|
</dl>
|
||||||
|
</template>
|
||||||
|
-->
|
||||||
|
</data>
|
||||||
|
</odoo>
|
||||||
60
jikimo_purchase_tier_validation/views/views.xml
Normal file
60
jikimo_purchase_tier_validation/views/views.xml
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
<odoo>
|
||||||
|
<data>
|
||||||
|
<!-- explicit list view definition -->
|
||||||
|
<!--
|
||||||
|
<record model="ir.ui.view" id="jikimo_purchase_tier_validation.list">
|
||||||
|
<field name="name">jikimo_purchase_tier_validation list</field>
|
||||||
|
<field name="model">jikimo_purchase_tier_validation.jikimo_purchase_tier_validation</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<tree>
|
||||||
|
<field name="name"/>
|
||||||
|
<field name="value"/>
|
||||||
|
<field name="value2"/>
|
||||||
|
</tree>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- actions opening views on models -->
|
||||||
|
<!--
|
||||||
|
<record model="ir.actions.act_window" id="jikimo_purchase_tier_validation.action_window">
|
||||||
|
<field name="name">jikimo_purchase_tier_validation window</field>
|
||||||
|
<field name="res_model">jikimo_purchase_tier_validation.jikimo_purchase_tier_validation</field>
|
||||||
|
<field name="view_mode">tree,form</field>
|
||||||
|
</record>
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- server action to the one above -->
|
||||||
|
<!--
|
||||||
|
<record model="ir.actions.server" id="jikimo_purchase_tier_validation.action_server">
|
||||||
|
<field name="name">jikimo_purchase_tier_validation server</field>
|
||||||
|
<field name="model_id" ref="model_jikimo_purchase_tier_validation_jikimo_purchase_tier_validation"/>
|
||||||
|
<field name="state">code</field>
|
||||||
|
<field name="code">
|
||||||
|
action = {
|
||||||
|
"type": "ir.actions.act_window",
|
||||||
|
"view_mode": "tree,form",
|
||||||
|
"res_model": model._name,
|
||||||
|
}
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- Top menu item -->
|
||||||
|
<!--
|
||||||
|
<menuitem name="jikimo_purchase_tier_validation" id="jikimo_purchase_tier_validation.menu_root"/>
|
||||||
|
-->
|
||||||
|
<!-- menu categories -->
|
||||||
|
<!--
|
||||||
|
<menuitem name="Menu 1" id="jikimo_purchase_tier_validation.menu_1" parent="jikimo_purchase_tier_validation.menu_root"/>
|
||||||
|
<menuitem name="Menu 2" id="jikimo_purchase_tier_validation.menu_2" parent="jikimo_purchase_tier_validation.menu_root"/>
|
||||||
|
-->
|
||||||
|
<!-- actions -->
|
||||||
|
<!--
|
||||||
|
<menuitem name="List" id="jikimo_purchase_tier_validation.menu_1_list" parent="jikimo_purchase_tier_validation.menu_1"
|
||||||
|
action="jikimo_purchase_tier_validation.action_window"/>
|
||||||
|
<menuitem name="Server to list" id="jikimo_purchase_tier_validation" parent="jikimo_purchase_tier_validation.menu_2"
|
||||||
|
action="jikimo_purchase_tier_validation.action_server"/>
|
||||||
|
-->
|
||||||
|
</data>
|
||||||
|
</odoo>
|
||||||
@@ -287,6 +287,11 @@ class RePurchaseOrder(models.Model):
|
|||||||
|
|
||||||
origin_sale_id = fields.Many2one('sale.order', string='销售订单号', compute='_compute_origin_sale_id')
|
origin_sale_id = fields.Many2one('sale.order', string='销售订单号', compute='_compute_origin_sale_id')
|
||||||
|
|
||||||
|
# 合同编号
|
||||||
|
contract_number = fields.Char(string='合同编号', size=20)
|
||||||
|
# 合同概况
|
||||||
|
contract_summary = fields.Text(string='合同概况')
|
||||||
|
|
||||||
@api.depends('origin')
|
@api.depends('origin')
|
||||||
def _compute_purchase_type(self):
|
def _compute_purchase_type(self):
|
||||||
for purchase in self:
|
for purchase in self:
|
||||||
|
|||||||
@@ -36,7 +36,7 @@
|
|||||||
<field name="partner_id" widget="res_partner_many2one" context="{'is_supplier': True }"/>
|
<field name="partner_id" widget="res_partner_many2one" context="{'is_supplier': True }"/>
|
||||||
</field>
|
</field>
|
||||||
<field name="currency_id" position="after">
|
<field name="currency_id" position="after">
|
||||||
<field name="remark" attrs="{'readonly': [('state', 'in', ['purchase'])]}"/>
|
<field name="remark" attrs="{'readonly': [('state', 'in', ['purchase'])]}" string="订单备注"/>
|
||||||
</field>
|
</field>
|
||||||
<xpath expr="//form/header/button[@name='button_confirm'][2]" position="replace">
|
<xpath expr="//form/header/button[@name='button_confirm'][2]" position="replace">
|
||||||
<button name="button_confirm" type="object" context="{'validate_analytic': True}"
|
<button name="button_confirm" type="object" context="{'validate_analytic': True}"
|
||||||
@@ -139,7 +139,14 @@
|
|||||||
<!-- <field name="part_number" optional="show"/>-->
|
<!-- <field name="part_number" optional="show"/>-->
|
||||||
</xpath>
|
</xpath>
|
||||||
<xpath expr="//field[@name='date_order']" position="attributes">
|
<xpath expr="//field[@name='date_order']" position="attributes">
|
||||||
<attribute name="string">报价截止日期</attribute>
|
<attribute name="string">签约日期</attribute>
|
||||||
|
</xpath>
|
||||||
|
<field name="payment_term_id" position="attributes">
|
||||||
|
<attribute name="invisible">1</attribute>
|
||||||
|
</field>
|
||||||
|
<xpath expr="//field[@name='date_order']" position="after">
|
||||||
|
<field name="payment_term_id" attrs="{'readonly': ['|', ('invoice_status','=', 'invoiced'), ('state', '=', 'done')]}" options="{'no_create': True}"/>
|
||||||
|
<field name="contract_summary"/>
|
||||||
</xpath>
|
</xpath>
|
||||||
<field name="partner_ref" position="attributes">
|
<field name="partner_ref" position="attributes">
|
||||||
<attribute name="attrs">{'readonly': [('state', 'in', ['purchase'])]}
|
<attribute name="attrs">{'readonly': [('state', 'in', ['purchase'])]}
|
||||||
@@ -171,13 +178,49 @@
|
|||||||
</field>
|
</field>
|
||||||
|
|
||||||
<!-- 添加采购类型字段 -->
|
<!-- 添加采购类型字段 -->
|
||||||
<field name="partner_ref" position="after">
|
<field name="partner_id" position="after">
|
||||||
<field name="purchase_type" string="采购类型" readonly="1"/>
|
<field name="purchase_type" string="采购类型" readonly="1"/>
|
||||||
|
<field name="picking_type_id" string="作业类型" domain="[('code','=','incoming'), '|', ('warehouse_id', '=', False), ('warehouse_id.company_id', '=', company_id)]" options="{'no_create': True}" groups="stock.group_stock_multi_locations"/>
|
||||||
|
<label for="date_planned" string="最近交货日期"/>
|
||||||
|
<div name="date_planned_div" class="o_row">
|
||||||
|
<field name="date_planned" attrs="{'readonly': [('state', 'not in', ('draft', 'sent', 'to approve', 'purchase'))]}"/>
|
||||||
|
<field name="mail_reminder_confirmed" invisible="1"/>
|
||||||
|
<span class="text-muted" attrs="{'invisible': [('mail_reminder_confirmed', '=', False)]}">(confirmed by vendor)</span>
|
||||||
|
</div>
|
||||||
|
<field name="effective_date" attrs="{'invisible': [('effective_date', '=', False)]}" string="到货时间"/>
|
||||||
</field>
|
</field>
|
||||||
|
<field name="partner_ref" position="attributes">
|
||||||
|
<attribute name="invisible">1</attribute>
|
||||||
|
</field>
|
||||||
|
<xpath expr="//sheet/group/group[2]/field[1]" position="before">
|
||||||
|
<field name="partner_ref" string="合同名称"/>
|
||||||
|
<field name="contract_number"/>
|
||||||
|
</xpath>
|
||||||
<!-- 添加销售订单号字段-->
|
<!-- 添加销售订单号字段-->
|
||||||
<field name="effective_date" position="after">
|
<xpath expr="//sheet/group/group[2]/div[@name='date_approve']" position="after">
|
||||||
<field name="origin_sale_id" readonly="1" attrs="{'invisible': [('origin_sale_id', '=', False)]}"/>
|
<!-- <field name="origin_sale_id" readonly="1" attrs="{'invisible': [('origin_sale_id', '=', False)]}" string="参考销售订单"/> -->
|
||||||
</field>
|
<field name="origin_sale_id" readonly="1" string="参考销售订单"/>
|
||||||
|
</xpath>
|
||||||
|
<xpath expr="//sheet/group/group[2]/field[@name='effective_date']" position="attributes">
|
||||||
|
<attribute name="invisible">1</attribute>
|
||||||
|
</xpath>
|
||||||
|
|
||||||
|
<!-- 隐藏 label -->
|
||||||
|
<xpath expr="//label[@for='receipt_reminder_email']" position="attributes">
|
||||||
|
<attribute name="invisible">1</attribute>
|
||||||
|
</xpath>
|
||||||
|
|
||||||
|
<!-- 隐藏整个 reminder div -->
|
||||||
|
<xpath expr="//div[@name='reminder']" position="attributes">
|
||||||
|
<attribute name="invisible">1</attribute>
|
||||||
|
</xpath>
|
||||||
|
<!-- 使用更精确的路径定位原始元素 -->
|
||||||
|
<xpath expr="//sheet/group/group[2]/label[@for='date_planned']" position="attributes">
|
||||||
|
<attribute name="invisible">1</attribute>
|
||||||
|
</xpath>
|
||||||
|
<xpath expr="//sheet/group/group[2]/div[@name='date_planned_div']" position="attributes">
|
||||||
|
<attribute name="invisible">1</attribute>
|
||||||
|
</xpath>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
@@ -196,7 +239,7 @@
|
|||||||
<attribute name="optional">hide</attribute>
|
<attribute name="optional">hide</attribute>
|
||||||
</xpath>
|
</xpath>
|
||||||
<xpath expr="//field[@name='date_order']" position="attributes">
|
<xpath expr="//field[@name='date_order']" position="attributes">
|
||||||
<attribute name="string">报价截止日期</attribute>
|
<attribute name="string">签约日期</attribute>
|
||||||
<attribute name="widget">''</attribute>
|
<attribute name="widget">''</attribute>
|
||||||
</xpath>
|
</xpath>
|
||||||
<xpath expr="//field[@name='date_order']" position="after">
|
<xpath expr="//field[@name='date_order']" position="after">
|
||||||
@@ -224,6 +267,8 @@
|
|||||||
<attribute name="attrs">{'readonly': [('state', 'in', ['purchase'])]}
|
<attribute name="attrs">{'readonly': [('state', 'in', ['purchase'])]}
|
||||||
</attribute>
|
</attribute>
|
||||||
</field>
|
</field>
|
||||||
|
<xpath expr="//field[@name='picking_type_id'][1]" position="replace">
|
||||||
|
</xpath>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user