修复bug

This commit is contained in:
jinling.yang
2024-01-09 09:31:44 +08:00
parent 8928d497ff
commit ce2f8714d0
6 changed files with 129 additions and 15 deletions

View File

@@ -62,7 +62,6 @@ class ResProductMo(models.Model):
tool_thickness = fields.Float('厚度(mm)') tool_thickness = fields.Float('厚度(mm)')
tool_weight = fields.Float('重量(kg)') tool_weight = fields.Float('重量(kg)')
tool_hardness = fields.Integer('硬度(hrc)') tool_hardness = fields.Integer('硬度(hrc)')
coating_material = fields.Char('涂层材质') coating_material = fields.Char('涂层材质')
# 整体式刀具特有字段 # 整体式刀具特有字段
cutting_tool_total_length = fields.Float('总长度(mm)', digits=(6, 1)) cutting_tool_total_length = fields.Float('总长度(mm)', digits=(6, 1))
@@ -262,7 +261,7 @@ class ResProductMo(models.Model):
self.cutting_tool_top_angle = self.specification_id.top_angle self.cutting_tool_top_angle = self.specification_id.top_angle
self.cutting_tool_screw = self.specification_id.screw self.cutting_tool_screw = self.specification_id.screw
self.cutting_tool_wrench = self.specification_id.wrench self.cutting_tool_wrench = self.specification_id.wrench
self.cutting_tool_blade_id = self.specification_id.blade_id self.cutting_tool_blade_id = self.specification_id.blade_id.id
self.cutting_tool_is_cooling_hole = self.specification_id.is_cooling_hole self.cutting_tool_is_cooling_hole = self.specification_id.is_cooling_hole
self.cutting_tool_locating_slot_code = self.specification_id.locating_slot_code self.cutting_tool_locating_slot_code = self.specification_id.locating_slot_code
self.cutting_tool_install_blade_tip_num = self.specification_id.install_blade_tip_num self.cutting_tool_install_blade_tip_num = self.specification_id.install_blade_tip_num

View File

@@ -81,6 +81,25 @@ class ReSaleOrder(models.Model):
} }
return self.env['sale.order.line'].create(vals) return self.env['sale.order.line'].create(vals)
@api.constrains('order_line')
def check_order_line(self):
for item in self:
if not item.order_line:
raise UserError('请选择【订单行】中的【产品】')
for line in item.order_line:
if not line.product_template_id:
raise UserError('请对【订单行】中的【产品】进行选择')
if not line.name:
raise UserError('请对【订单行】中的【说明】进行输入')
if line.product_qty == 0:
raise UserError('请对【订单行】中的【数量】进行输入')
if not line.product_uom:
raise UserError('请对【订单行】中的【计量单位】进行选择')
if line.price_unit == 0:
raise UserError('请对【订单行】中的【单价】进行输入')
if not line.taxes_id:
raise UserError('请对【订单行】中的【税】进行选择')
class ResaleOrderLine(models.Model): class ResaleOrderLine(models.Model):
_inherit = 'sale.order.line' _inherit = 'sale.order.line'
@@ -95,6 +114,28 @@ class RePurchaseOrder(models.Model):
check_status = fields.Selection([('pending', '待审核'), ('approved', '已审核'), ('fail', '不通过')], '审核状态') check_status = fields.Selection([('pending', '待审核'), ('approved', '已审核'), ('fail', '不通过')], '审核状态')
remark = fields.Text('备注') remark = fields.Text('备注')
def button_confirming(self):
self.write({'state': 'purchase', 'check_status': 'pending'})
@api.constrains('order_line')
def check_order_line(self):
for item in self:
if not item.order_line:
raise UserError('该询价单未添加【产品】,请进行添加')
for line in item.order_line:
if not line.product_id:
raise UserError('【产品】未添加,请进行添加')
if not line.name:
raise UserError('请对【产品】中的【说明】进行输入')
if line.product_qty == 0:
raise UserError('请对【产品】中的【数量】进行输入')
if not line.product_uom:
raise UserError('请对【产品】中的【计量单位】进行选择')
if line.price_unit == 0:
raise UserError('请对【产品】中的【单价】进行输入')
if not line.taxes_id:
raise UserError('请对【产品】中的【税】进行选择')
def write(self, vals): def write(self, vals):
if self.env.user.has_group('sf_base.group_purchase_director'): if self.env.user.has_group('sf_base.group_purchase_director'):
if vals.get('check_status'): if vals.get('check_status'):
@@ -103,9 +144,19 @@ class RePurchaseOrder(models.Model):
return super().write(vals) return super().write(vals)
def button_confirm(self): def button_confirm(self):
self.check_status = 'pending' for order in self:
res = super().button_confirm() if order.state not in ['draft', 'sent', 'purchase']:
return res continue
order.order_line._validate_analytic_distribution()
order._add_supplier_to_product()
# Deal with double validation process
if order._approval_allowed():
order.button_approve()
else:
order.write({'state': 'to approve'})
if order.partner_id not in order.message_partner_ids:
order.message_subscribe([order.partner_id.id])
return True
class ResPartnerToSale(models.Model): class ResPartnerToSale(models.Model):

View File

@@ -49,6 +49,8 @@ access_uom_category_group_purchase,uom_category_group_purchase,uom.model_uom_cat
access_uom_category_group_purchase_director,uom_category_group_purchase_director,uom.model_uom_category,sf_base.group_purchase_director,1,0,0,0 access_uom_category_group_purchase_director,uom_category_group_purchase_director,uom.model_uom_category,sf_base.group_purchase_director,1,0,0,0
access_sale_order_check_wizard_group_sale_salemanager,sale_order_check_wizard_group_sale_salemanager,model_sale_order_check_wizard,sf_base.group_sale_salemanager,1,1,1,0 access_sale_order_check_wizard_group_sale_salemanager,sale_order_check_wizard_group_sale_salemanager,model_sale_order_check_wizard,sf_base.group_sale_salemanager,1,1,1,0
access_sale_order_check_wizard_group_sale_director,sale_order_check_wizard_group_sale_director,model_sale_order_check_wizard,sf_base.group_sale_director,1,1,1,0 access_sale_order_check_wizard_group_sale_director,sale_order_check_wizard_group_sale_director,model_sale_order_check_wizard,sf_base.group_sale_director,1,1,1,0
access_account_move_line_group_sale_salemanager,account_move_line_group_sale_salemanager,account.model_account_move_line,sf_base.group_sale_salemanager,1,1,1,0
access_account_move_line_group_sale_director,account_move_line_group_sale_director,account.model_account_move_line,sf_base.group_sale_director,1,1,1,0
access_account_move_line_group_purchase,account_move_line_group_purchase,account.model_account_move_line,sf_base.group_purchase,1,1,1,0 access_account_move_line_group_purchase,account_move_line_group_purchase,account.model_account_move_line,sf_base.group_purchase,1,1,1,0
access_account_move_line_group_purchase_director,account_move_line_group_purchase_director,account.model_account_move_line,sf_base.group_purchase_director,1,1,1,0 access_account_move_line_group_purchase_director,account_move_line_group_purchase_director,account.model_account_move_line,sf_base.group_purchase_director,1,1,1,0
access_res_users_group_purchase,res_user_group_purchase,model_res_users,sf_base.group_purchase,1,1,1,0 access_res_users_group_purchase,res_user_group_purchase,model_res_users,sf_base.group_purchase,1,1,1,0
@@ -71,9 +73,13 @@ access_crm_tag_group_sale_salemanager,crm_tag_group_sale_salemanager,sales_team.
access_crm_tag_group_sale_director,crm_tag_group_sale_director,sales_team.model_crm_tag,sf_base.group_sale_director,1,1,1,0 access_crm_tag_group_sale_director,crm_tag_group_sale_director,sales_team.model_crm_tag,sf_base.group_sale_director,1,1,1,0
access_sale_order,sale.order,sale.model_sale_order,sf_base.group_plan_dispatch,1,0,0,0 access_sale_order,sale.order,sale.model_sale_order,sf_base.group_plan_dispatch,1,0,0,0
access_res_partner_group_purchase,res_partner_group_purchase,base.model_res_partner,sf_base.group_purchase,1,1,1,0 access_res_partner_group_sale_salemanager,res_partner_group_sale_salemanager,base.model_res_partner,sf_base.group_sale_salemanager,1,0,1,0
access_res_partner_group_purchase_director,res_partner_group_purchase_director,base.model_res_partner,sf_base.group_purchase_director,1,1,1,0 access_res_partner_group_sale_director,res_partner_group_sale_director,base.model_res_partner,sf_base.group_sale_director,1,0,1,0
access_res_partner_group_purchase,res_partner_group_purchase,base.model_res_partner,sf_base.group_purchase,1,0,1,0
access_res_partner_group_purchase_director,res_partner_group_purchase_director,base.model_res_partner,sf_base.group_purchase_director,1,0,1,0
access_sale_advance_payment_inv_group_sale_salemanager,sale_advance_payment_inv_group_sale_salemanager,sale.model_sale_advance_payment_inv,sf_base.group_sale_salemanager,1,1,1,0 access_sale_advance_payment_inv_group_sale_salemanager,sale_advance_payment_inv_group_sale_salemanager,sale.model_sale_advance_payment_inv,sf_base.group_sale_salemanager,1,1,1,0
access_sale_advance_payment_inv_group_sale_director,sale_advance_payment_inv_group_sale_director,sale.model_sale_advance_payment_inv,sf_base.group_sale_director,1,1,1,0 access_sale_advance_payment_inv_group_sale_director,sale_advance_payment_inv_group_sale_director,sale.model_sale_advance_payment_inv,sf_base.group_sale_director,1,1,1,0
access_sale_report_group_sale_salemanager,sale_report_group_sale_salemanager,sale.model_sale_report,sf_base.group_sale_salemanager,1,0,1,0
access_sale_report_group_sale_director,sale_report_group_sale_director,sale.model_sale_report,sf_base.group_sale_director,1,0,1,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
49 access_uom_category_group_purchase_director uom_category_group_purchase_director uom.model_uom_category sf_base.group_purchase_director 1 0 0 0
50 access_sale_order_check_wizard_group_sale_salemanager sale_order_check_wizard_group_sale_salemanager model_sale_order_check_wizard sf_base.group_sale_salemanager 1 1 1 0
51 access_sale_order_check_wizard_group_sale_director sale_order_check_wizard_group_sale_director model_sale_order_check_wizard sf_base.group_sale_director 1 1 1 0
52 access_account_move_line_group_sale_salemanager account_move_line_group_sale_salemanager account.model_account_move_line sf_base.group_sale_salemanager 1 1 1 0
53 access_account_move_line_group_sale_director account_move_line_group_sale_director account.model_account_move_line sf_base.group_sale_director 1 1 1 0
54 access_account_move_line_group_purchase account_move_line_group_purchase account.model_account_move_line sf_base.group_purchase 1 1 1 0
55 access_account_move_line_group_purchase_director account_move_line_group_purchase_director account.model_account_move_line sf_base.group_purchase_director 1 1 1 0
56 access_res_users_group_purchase res_user_group_purchase model_res_users sf_base.group_purchase 1 1 1 0
73 access_crm_tag_group_sale_director crm_tag_group_sale_director sales_team.model_crm_tag sf_base.group_sale_director 1 1 1 0
74 access_sale_order sale.order sale.model_sale_order sf_base.group_plan_dispatch 1 0 0 0
75 access_res_partner_group_purchase access_res_partner_group_sale_salemanager res_partner_group_purchase res_partner_group_sale_salemanager base.model_res_partner sf_base.group_purchase sf_base.group_sale_salemanager 1 1 0 1 0
76 access_res_partner_group_purchase_director access_res_partner_group_sale_director res_partner_group_purchase_director res_partner_group_sale_director base.model_res_partner sf_base.group_purchase_director sf_base.group_sale_director 1 1 0 1 0
77 access_sale_advance_payment_inv_group_sale_salemanager access_res_partner_group_purchase sale_advance_payment_inv_group_sale_salemanager res_partner_group_purchase sale.model_sale_advance_payment_inv base.model_res_partner sf_base.group_sale_salemanager sf_base.group_purchase 1 1 0 1 0
78 access_res_partner_group_purchase_director res_partner_group_purchase_director base.model_res_partner sf_base.group_purchase_director 1 0 1 0
79 access_sale_advance_payment_inv_group_sale_salemanager sale_advance_payment_inv_group_sale_salemanager sale.model_sale_advance_payment_inv sf_base.group_sale_salemanager 1 1 1 0
80 access_sale_advance_payment_inv_group_sale_director sale_advance_payment_inv_group_sale_director sale.model_sale_advance_payment_inv sf_base.group_sale_director 1 1 1 0
81 access_sale_report_group_sale_salemanager sale_report_group_sale_salemanager sale.model_sale_report sf_base.group_sale_salemanager 1 0 1 0
82 access_sale_report_group_sale_director sale_report_group_sale_director sale.model_sale_report sf_base.group_sale_director 1 0 1 0
83
84
85

View File

@@ -18,13 +18,17 @@
<xpath expr="//form/header/button[@name='action_rfq_send'][1]" position="after"> <xpath expr="//form/header/button[@name='action_rfq_send'][1]" position="after">
<button name="sf_sale.action_purchase_order_check_wizard" string="审核" type="action" <button name="sf_sale.action_purchase_order_check_wizard" string="审核" type="action"
context="{'default_order_id':active_id}" groups="sf_base.group_purchase_director" context="{'default_order_id':active_id}" groups="sf_base.group_purchase_director"
attrs="{'invisible': ['&amp;',('check_status','in', ['approved']),('state', 'in', ['draft','send','purchase'])]}" attrs="{'invisible': ['&amp;',('check_status','in', ['approved',False]),('state', 'in', ['purchase'])]}"
class="oe_highlight"/> class="oe_highlight"/>
</xpath> </xpath>
<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}"
string="确认订单" id="draft_confirm" string="确认" id="draft_confirm"
attrs="{'invisible': ['|','&amp;',('check_status','in', ['approved','fail','pending']),('state', 'in', ['draft','purchase']),('state', 'in', ['purchase'])]}" />
<button name="button_confirming" type="object"
string="确认订单"
attrs="{'invisible': ['&amp;',('check_status','!=', False),('state', 'not in', ['draft','send'])]}"
/> />
</xpath> </xpath>
@@ -129,12 +133,15 @@
</field> </field>
</record> </record>
<record id="view_purchase_order_kpis_tree_inherit_sf" model="ir.ui.view"> <record id="view_purchase_order_view_tree_inherit_sf" model="ir.ui.view">
<field name="name">purchase.order.tree.inherit.sf</field> <field name="name">purchase.order.tree.inherit.sf</field>
<field name="model">purchase.order</field> <field name="model">purchase.order</field>
<field name="inherit_id" ref="purchase.purchase_order_kpis_tree"/> <field name="inherit_id" ref="purchase.purchase_order_view_tree"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<field name="state" position="after"> <tree position="attributes">
<attribute name="default_order">check_status desc,date_approve asc</attribute>
</tree>
<field name="amount_total" position="after">
<field name="check_status" widget="badge" <field name="check_status" widget="badge"
decoration-success="check_status == 'approved'" decoration-success="check_status == 'approved'"
decoration-warning="check_status == 'pending'" decoration-warning="check_status == 'pending'"

View File

@@ -8,6 +8,7 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<form position="attributes"> <form position="attributes">
<attribute name="delete">false</attribute> <attribute name="delete">false</attribute>
<attribute name="edit">false</attribute>
</form> </form>
<field name="vat" position="after"> <field name="vat" position="after">
<field name="customer_rank" invisible="1"/> <field name="customer_rank" invisible="1"/>

View File

@@ -1,6 +1,54 @@
<?xml version="1.0" encoding="UTF-8" ?> <?xml version="1.0" encoding="UTF-8" ?>
<odoo> <odoo>
<data> <data>
<record id="sale_order_view_search_inherit_sf" model="ir.ui.view">
<field name="name">sale.order.search.inherit.sf</field>
<field name="model">sale.order</field>
<field name="mode">primary</field>
<field name="inherit_id" ref="sale.view_sales_order_filter"/>
<field name="arch" type="xml">
<filter name="my_sale_orders_filter" position="replace">
<field name="campaign_id"/>
<separator/>
<filter string="报价" name="draft" domain="[('state','in',('draft', 'sent'))]"/>
<filter string="销售订单" name="sales" domain="[('state','in',('sale','done'))]"/>
<separator/>
<filter string="创建日期" name="filter_create_date" date="create_date"/>
</filter>
</field>
</record>
<record id="action_quotations_with_onboarding_inherit_sf" model="ir.actions.act_window">
<field name="name">报价</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">sale.order</field>
<field name="view_id" ref="sale.view_quotation_tree_with_onboarding"/>
<field name="view_mode">tree,kanban,form,calendar,pivot,graph,activity</field>
<field name="search_view_id" ref="sale_order_view_search_inherit_sf"/>
<field name="context">{'search_default_my_quotation': 1}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new quotation, the first step of a new sale!
</p>
<p>
Once the quotation is confirmed by the customer, it becomes a sales order.
<br/>
You will be able to create an invoice and collect the payment.
</p>
</field>
</record>
<!-- <menuitem id="menu_sale_quotations">-->
<!-- <field name="active" eval="False"/>-->
<!-- </menuitem>-->
<menuitem id="menu_sale_quotations_inherit_sf"
action="action_quotations_with_onboarding_inherit_sf"
groups="sales_team.group_sale_salesman,sf_base.group_sale_salemanager,sf_base.group_sale_director"
parent="sale.sale_order_menu"
sequence="10"/>
<record model="ir.ui.view" id="view_sale_order_form_inherit_sf"> <record model="ir.ui.view" id="view_sale_order_form_inherit_sf">
<field name="name">sale.order.form.inherit.sf</field> <field name="name">sale.order.form.inherit.sf</field>
<field name="model">sale.order</field> <field name="model">sale.order</field>
@@ -36,7 +84,8 @@
attrs="{'invisible': ['|','&amp;',('check_status', '!=', 'approved'),('state', 'in', ['draft','cancel']),'&amp;',('check_status', '=', 'approved'),('state', 'in', ['sale','cancel'])]}"/> attrs="{'invisible': ['|','&amp;',('check_status', '!=', 'approved'),('state', 'in', ['draft','cancel']),'&amp;',('check_status', '=', 'approved'),('state', 'in', ['sale','cancel'])]}"/>
</xpath> </xpath>
<xpath expr="//form/header/button[@name='action_cancel']" position="attributes"> <xpath expr="//form/header/button[@name='action_cancel']" position="attributes">
<attribute name="attrs">{'invisible': [('check_status', '=', False)]} <attribute name="attrs">{'invisible': ['|',('state', 'in', ['cancel']),('check_status', 'in',
[False,'approved'])]}
</attribute> </attribute>
</xpath> </xpath>
<xpath expr="//form/header/button[@name='action_draft']" position="attributes"> <xpath expr="//form/header/button[@name='action_draft']" position="attributes">
@@ -119,7 +168,6 @@
<field name="model">sale.order</field> <field name="model">sale.order</field>
<field name="inherit_id" ref="sale_management.sale_order_form_quote"/> <field name="inherit_id" ref="sale_management.sale_order_form_quote"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<field name="date_order" position="attributes"> <field name="date_order" position="attributes">
<attribute name="string">下单日期</attribute> <attribute name="string">下单日期</attribute>
</field> </field>
@@ -141,6 +189,7 @@
<field name="inherit_id" ref="sale.view_quotation_tree_with_onboarding"/> <field name="inherit_id" ref="sale.view_quotation_tree_with_onboarding"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<tree position="attributes"> <tree position="attributes">
<attribute name="default_order">check_status desc,create_date asc</attribute>
<attribute name="delete">False</attribute> <attribute name="delete">False</attribute>
</tree> </tree>
<field name="name" position="attributes"> <field name="name" position="attributes">
@@ -164,6 +213,7 @@
<field name="inherit_id" ref="sale.view_order_tree"/> <field name="inherit_id" ref="sale.view_order_tree"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<tree position="attributes"> <tree position="attributes">
<attribute name="default_order">schedule_status desc,date_order asc</attribute>
<attribute name="create">False</attribute> <attribute name="create">False</attribute>
</tree> </tree>
<field name="name" position="attributes"> <field name="name" position="attributes">