销售1.新增进度状态字段,选项为:待排程、待加工、待发货、待收货、已收货,
2.销售和报价页面的所有按钮根据审核状态和状态做隐藏显示控制 3.销售订单Form和Tree视图新增进度状态字段,且form表单根据状态字段的值为销售和取消时,表单不可编辑 4.产品页面的所有按钮根据销售和采购的权限组做显示和隐藏控制
This commit is contained in:
@@ -42,11 +42,53 @@
|
||||
</group>
|
||||
</page>
|
||||
<page name="inventory" position="attributes">
|
||||
<attribute name="groups">stock.group_stock_user,product.group_stock_packaging</attribute>
|
||||
<attribute name="groups">
|
||||
stock.group_stock_user,product.group_stock_packaging,sf_base.group_sale_salemanager,sf_base.group_sale_director,sf_base.group_purchase,sf_base.group_purchase_director
|
||||
</attribute>
|
||||
</page>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="product_template_form_view_procurement_button_inherit_sf" model="ir.ui.view">
|
||||
<field name="name">product.template_procurement.form.inherit.sf</field>
|
||||
<field name="model">product.template</field>
|
||||
<field name="inherit_id" ref="stock.product_template_form_view_procurement_button"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//button[@name='action_open_quants']" position="attributes">
|
||||
<attribute name="groups">
|
||||
stock.group_stock_user,sf_base.group_sale_salemanager,sf_base.group_sale_director,sf_base.group_purchase,sf_base.group_purchase_director
|
||||
</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//button[@name='action_product_tmpl_forecast_report']" position="attributes">
|
||||
<attribute name="groups">
|
||||
stock.group_stock_user,sf_base.group_sale_salemanager,sf_base.group_sale_director,sf_base.group_purchase,sf_base.group_purchase_director
|
||||
</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//button[@name='action_view_stock_move_lines']" position="attributes">
|
||||
<attribute name="groups">
|
||||
stock.group_stock_user,sf_base.group_sale_salemanager,sf_base.group_sale_director,sf_base.group_purchase,sf_base.group_purchase_director
|
||||
</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//button[@name='action_view_orderpoints']" position="attributes">
|
||||
<attribute name="groups">
|
||||
stock.group_stock_user,sf_base.group_sale_salemanager,sf_base.group_sale_director,sf_base.group_purchase,sf_base.group_purchase_director
|
||||
</attribute>
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//button[@name='action_view_related_putaway_rules']" position="attributes">
|
||||
<attribute name="groups">
|
||||
stock.group_stock_user,sf_base.group_sale_salemanager,sf_base.group_sale_director,sf_base.group_purchase,sf_base.group_purchase_director
|
||||
</attribute>
|
||||
</xpath>
|
||||
|
||||
<!-- <xpath expr="//button[@name='action_view_orderpoints']" position="attributes">-->
|
||||
<!-- <attribute name="groups">-->
|
||||
<!-- stock.group_stock_user,sf_base.group_sale_salemanager,sf_base.group_sale_director,sf_base.group_purchase,sf_base.group_purchase_director-->
|
||||
<!-- </attribute>-->
|
||||
<!-- </xpath>-->
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_mrp_bom_form_inherit_sf" model="ir.ui.view">
|
||||
<field name="name">mrp.bom.form.inherit.sf</field>
|
||||
<field name="model">mrp.bom</field>
|
||||
@@ -80,5 +122,6 @@
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</odoo>
|
||||
@@ -201,17 +201,18 @@ class StockRule(models.Model):
|
||||
|
||||
sale_order = self.env['sale.order'].sudo().search([('name', '=', production.origin)])
|
||||
if sale_order:
|
||||
sale_order.write({'schedule_status': 'to schedule'})
|
||||
self.env['sf.production.plan'].sudo().with_company(company_id). \
|
||||
create({
|
||||
'name': production.name,
|
||||
'order_deadline': sale_order.deadline_of_delivery,
|
||||
'production_id': production.id,
|
||||
'date_planned_start': production.date_planned_start,
|
||||
'origin': production.origin,
|
||||
'product_qty': production.product_qty,
|
||||
'product_id': production.product_id.id,
|
||||
'state': 'draft',
|
||||
})
|
||||
'name': production.name,
|
||||
'order_deadline': sale_order.deadline_of_delivery,
|
||||
'production_id': production.id,
|
||||
'date_planned_start': production.date_planned_start,
|
||||
'origin': production.origin,
|
||||
'product_qty': production.product_qty,
|
||||
'product_id': production.product_id.id,
|
||||
'state': 'draft',
|
||||
})
|
||||
return True
|
||||
|
||||
|
||||
|
||||
@@ -15,7 +15,8 @@ class ReSaleOrder(models.Model):
|
||||
pay_way = fields.Selection([('转账', '转账'), ('微信', '微信'), ('支付宝', '支付宝')], '支付方式')
|
||||
check_status = fields.Selection([('pending', '待审核'), ('approved', '已审核'), ('fail', '不通过')], '审核状态')
|
||||
schedule_status = fields.Selection(
|
||||
[('schedule', '待排程'), ('process', '待加工'), ('deliver', '待发货'), ('receive', '待收货'), ('received', '已收货')],
|
||||
[('to schedule', '待排程'), ('to process', '待加工'), ('to deliver', '待发货'), ('to receive', '待收货'),
|
||||
('received', '已收货')],
|
||||
'进度状态')
|
||||
payment_term_id = fields.Many2one(
|
||||
comodel_name='account.payment.term',
|
||||
@@ -35,7 +36,7 @@ class ReSaleOrder(models.Model):
|
||||
'date_order': now_time,
|
||||
'name': self.env['ir.sequence'].next_by_code('sale.order', sequence_date=now_time),
|
||||
'partner_id': partner.id,
|
||||
'check_status': 'checked',
|
||||
'check_status': 'approved',
|
||||
'state': 'draft',
|
||||
'person_of_delivery': delivery_name,
|
||||
'telephone_of_delivery': delivery_telephone,
|
||||
@@ -46,14 +47,17 @@ class ReSaleOrder(models.Model):
|
||||
})
|
||||
return order_id
|
||||
|
||||
def write(self, vals):
|
||||
if self.env.user.has_group('sf_base.group_sale_director'):
|
||||
if vals.get('check_status'):
|
||||
if vals['check_status'] in ('pending', False):
|
||||
vals['check_status'] = 'approved'
|
||||
return super().write(vals)
|
||||
|
||||
# 提交
|
||||
def submit(self):
|
||||
self.check_status = 'pending'
|
||||
|
||||
# 审核
|
||||
def action_check(self):
|
||||
self.check_status = 'checked'
|
||||
|
||||
def get_customer(self):
|
||||
customer = self.env['res.partner'].search([('name', '=', '业务平台')])
|
||||
if customer:
|
||||
|
||||
@@ -42,9 +42,14 @@ access_account_move_line_group_purchase,account_move_line_group_purchase,account
|
||||
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_director,res_user_group_purchase_director,model_res_users,sf_base.group_purchase_director,1,1,1,0
|
||||
access_res_users_sale_salemanager,res_user_group_sale_salemanager,model_res_users,sf_base.group_sale_salemanager,1,0,0,0
|
||||
access_res_users_group_sale_director,res_user_group_sale_director,model_res_users,sf_base.group_sale_director,1,1,1,0
|
||||
access_res_users_group_purchase_director,res_users_group_purchase_director,model_res_users,sf_base.group_purchase_director,1,1,1,0
|
||||
access_res_users_group_sale_salemanager,res_users_group_sale_salemanager,model_res_users,sf_base.group_sale_salemanager,1,0,0,0
|
||||
access_res_users_group_sale_director,res_users_group_sale_director,model_res_users,sf_base.group_sale_director,1,1,1,0
|
||||
|
||||
access_mrp_bom_byproduct_group_purchase,mrp_bom_byproduct_group_purchase,mrp.model_mrp_bom_byproduct,sf_base.group_purchase,1,1,1,0
|
||||
access_mrp_bom_byproduct_group_purchase_director,mrp_bom_byproduct_group_purchase_director,mrp.model_mrp_bom_byproduct,sf_base.group_purchase_director,1,1,1,0
|
||||
access_mrp_bom_byproduct_group_sale_salemanager,mrp_bom_byproduct_group_sale_salemanager,mrp.model_mrp_bom_byproduct,sf_base.group_sale_salemanager,1,0,0,0
|
||||
access_mrp_bom_byproduct_group_sale_director,mrp_bom_byproduct_group_sale_director,mrp.model_mrp_bom_byproduct,sf_base.group_sale_director,1,1,1,0
|
||||
|
||||
|
||||
|
||||
|
||||
|
@@ -9,7 +9,7 @@
|
||||
<xpath expr="//form/header/button[@name='action_quotation_send'][1]" position="replace">
|
||||
<button name="action_quotation_send" string="通过EMAIL发送" type="object"
|
||||
class="btn-primary" data-hotkey="g" context="{'validate_analytic': True}"
|
||||
attrs="{'invisible': [('check_status', 'not in', ['approved',False]),('state', 'in', ['draft'])]}"/>
|
||||
attrs="{'invisible': ['|','&',('check_status', '!=', 'approved'),('state', 'in', ['draft','cancel']),'&',('check_status', '=', 'approved'),('state', 'in', ['sale','cancel'])]}"/>
|
||||
</xpath>
|
||||
<xpath expr="//form/header/button[@name='action_confirm']" position="after">
|
||||
<button name="submit" string="提交" type="object"
|
||||
@@ -18,11 +18,11 @@
|
||||
class="oe_highlight"/>
|
||||
</xpath>
|
||||
<xpath expr="//form/header/button[@name='action_confirm']" position="after">
|
||||
<field name="check_status"/>
|
||||
<field name="state"/>
|
||||
<field name="check_status" invisible="1"/>
|
||||
<field name="schedule_status" invisible="1"/>
|
||||
<button name="sf_sale.action_sale_order_check_wizard" string="审核" type="action"
|
||||
context="{'default_order_id':active_id}" groups="sf_base.group_sale_director"
|
||||
attrs="{'invisible': [('check_status','in', ['approved',False])]}"
|
||||
attrs="{'invisible': ['|',('check_status','in', ['approved',False]),('state', 'in', ['cancel'])]}"
|
||||
class="oe_highlight"/>
|
||||
</xpath>
|
||||
<!-- <xpath expr="//form/header/button[@name='action_confirm'][1]" position="attributes">-->
|
||||
@@ -33,29 +33,85 @@
|
||||
<xpath expr="//form/header/button[@name='action_confirm'][2]" position="replace">
|
||||
<button name="action_confirm" data-hotkey="v"
|
||||
string="确认" type="object" context="{'validate_analytic': True}"
|
||||
attrs="{'invisible': [('check_status', 'not in', ['approved']),('state', 'in',['draft','sale'])]}"/>
|
||||
attrs="{'invisible': ['|','&',('check_status', '!=', 'approved'),('state', 'in', ['draft','cancel']),'&',('check_status', '=', 'approved'),('state', 'in', ['sale','cancel'])]}"/>
|
||||
</xpath>
|
||||
<xpath expr="//form/header/button[@name='action_cancel']" position="attributes">
|
||||
<attribute name="attrs">{'invisible': [('check_status', '!=', 'approved')]}
|
||||
<attribute name="attrs">{'invisible': ['|',('check_status', '!=', 'approved'),('schedule_status',
|
||||
'not in', ['to schedule',False])]}
|
||||
</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//form/header/button[@name='action_draft']" position="attributes">
|
||||
<attribute name="invisible">1</attribute>
|
||||
</xpath>
|
||||
<!-- <xpath expr="//form/header/button[@name='action_draft']" position="replace">-->
|
||||
<!-- <button name="action_draft" states="cancel" type="object" string="设为报价" data-hotkey="w"-->
|
||||
<!-- invisible="1"/>-->
|
||||
<!-- </xpath>-->
|
||||
<field name="partner_id" position="replace">
|
||||
<field name="partner_id" widget="res_partner_many2one" context="{'is_customer': True }"
|
||||
options='{"always_reload": True}'/>
|
||||
</field>
|
||||
<field name="payment_term_id" position="attributes">
|
||||
<attribute name="attrs">{'readonly': [('state', 'in', ['cancel','sale'])]}</attribute>
|
||||
</field>
|
||||
<field name="payment_term_id" position="after">
|
||||
<field name="deadline_of_delivery"/>
|
||||
<field name="payments_way"/>
|
||||
<field name="pay_way"/>
|
||||
<field name="deadline_of_delivery" attrs="{'readonly': [('state', 'in', ('sale','cancel'))]}"/>
|
||||
<field name="payments_way" attrs="{'readonly': [('state', 'in', ('sale','cancel'))]}"/>
|
||||
<field name="pay_way" attrs="{'readonly': [('state', 'in', ('sale','cancel'))]}"/>
|
||||
<field name="schedule_status" readonly="1"
|
||||
attrs="{'invisible': [('state', 'in', ('sale','cancel'))]}"/>
|
||||
</field>
|
||||
<xpath expr="//field[@name='order_line']/tree/field[@name='name']" position="before">
|
||||
<field name="model_glb_file" widget="Viewer3D" optional="show"
|
||||
string="模型文件"/>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='order_line']" position="attributes">
|
||||
<attribute name="attrs">{'readonly': [('state', 'in', ['cancel','sale'])]}</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='order_line']/tree/field[@name='name']" position="replace">
|
||||
<field name="name" widget="section_and_note_text" optional="show"
|
||||
string="参数说明(长/宽/高/体积/精度/材质)"/>
|
||||
</xpath>
|
||||
<field name="user_id" position="attributes">
|
||||
<attribute name="attrs">{'readonly': [('state', 'in', ['cancel','sale'])]}</attribute>
|
||||
</field>
|
||||
<field name="team_id" position="attributes">
|
||||
<attribute name="attrs">{'readonly': [('state', 'in', ['cancel','sale'])]}</attribute>
|
||||
</field>
|
||||
<field name="fiscal_position_id" position="attributes">
|
||||
<attribute name="attrs">{'readonly': [('state', 'in', ['cancel','sale'])]}</attribute>
|
||||
</field>
|
||||
<field name="client_order_ref" position="attributes">
|
||||
<attribute name="attrs">{'readonly': [('state', 'in', ['cancel','sale'])]}</attribute>
|
||||
</field>
|
||||
|
||||
<field name="tag_ids" position="attributes">
|
||||
<attribute name="attrs">{'readonly': [('state', 'in', ['cancel','sale'])]}</attribute>
|
||||
</field>
|
||||
<field name="commitment_date" position="attributes">
|
||||
<attribute name="attrs">{'readonly': [('state', 'in', ['cancel','sale'])]}</attribute>
|
||||
</field>
|
||||
<field name="origin" position="attributes">
|
||||
<attribute name="attrs">{'readonly': [('state', 'in', ['cancel','sale'])]}</attribute>
|
||||
</field>
|
||||
<field name="campaign_id" position="attributes">
|
||||
<attribute name="attrs">{'readonly': [('state', 'in', ['cancel','sale'])]}</attribute>
|
||||
</field>
|
||||
<field name="medium_id" position="attributes">
|
||||
<attribute name="attrs">{'readonly': [('state', 'in', ['cancel','sale'])]}</attribute>
|
||||
</field>
|
||||
<field name="source_id" position="attributes">
|
||||
<attribute name="attrs">{'readonly': [('state', 'in', ['cancel','sale'])]}</attribute>
|
||||
</field>
|
||||
<field name="signed_by" position="attributes">
|
||||
<attribute name="attrs">{'readonly': [('state', 'in', ['cancel','sale'])]}</attribute>
|
||||
</field>
|
||||
<field name="signed_on" position="attributes">
|
||||
<attribute name="attrs">{'readonly': [('state', 'in', ['cancel','sale'])]}</attribute>
|
||||
</field>
|
||||
<field name="signature" position="attributes">
|
||||
<attribute name="attrs">{'readonly': [('state', 'in', ['cancel','sale'])]}</attribute>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
@@ -69,10 +125,13 @@
|
||||
<attribute name="string">下单日期</attribute>
|
||||
</field>
|
||||
<field name="sale_order_template_id" position="after">
|
||||
<field name="person_of_delivery" string="交货人"/>
|
||||
<field name="telephone_of_delivery" string="交货人联系方式"/>
|
||||
<field name="address_of_delivery" string="交货人地址"/>
|
||||
<field name="remark"/>
|
||||
<field name="person_of_delivery" string="交货人"
|
||||
attrs="{'readonly': [('state', 'in', ('sale','cancel'))]}"/>
|
||||
<field name="telephone_of_delivery" string="交货人联系方式"
|
||||
attrs="{'readonly': [('state', 'in', ('sale','cancel'))]}"/>
|
||||
<field name="address_of_delivery" string="交货人地址"
|
||||
attrs="{'readonly': [('state', 'in', ('sale','cancel'))]}"/>
|
||||
<field name="remark" attrs="{'readonly': [('state', 'in', ('sale','cancel'))]}"/>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
@@ -92,8 +151,10 @@
|
||||
<attribute name="string">下单时间</attribute>
|
||||
</field>
|
||||
<field name="state" position="after">
|
||||
<field name="check_status" widget="label_selection"
|
||||
options="{'classes': {'unchecked':'warning','checked': 'success'}}"/>
|
||||
<field name="check_status" widget="badge"
|
||||
decoration-success="check_status == 'approved'"
|
||||
decoration-warning="check_status == 'pending'"
|
||||
decoration-danger="check_status == 'fail'"/>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
@@ -103,9 +164,20 @@
|
||||
<field name="model">sale.order</field>
|
||||
<field name="inherit_id" ref="sale.view_order_tree"/>
|
||||
<field name="arch" type="xml">
|
||||
<tree position="attributes">
|
||||
<attribute name="create">False</attribute>
|
||||
</tree>
|
||||
<field name="name" position="attributes">
|
||||
<attribute name="string">订单号</attribute>
|
||||
</field>
|
||||
<field name="amount_total" position="after">
|
||||
<field name="schedule_status" widget="badge"
|
||||
decoration-success="schedule_status == 'received'"
|
||||
decoration-warning="schedule_status == 'to process'"
|
||||
decoration-danger="schedule_status == 'to receive'"
|
||||
decoration-muted="schedule_status == 'to process'"
|
||||
decoration-info="schedule_status == 'to schedule'"/>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
@@ -20,6 +20,4 @@ class saleOrderCheckWizard(models.TransientModel):
|
||||
if not self.check_audit:
|
||||
raise UserError('请输入原因')
|
||||
else:
|
||||
self.order_id.check_status = 'fail'
|
||||
self.order_id.remark = self.check_audit
|
||||
|
||||
self.order_id.write({'check_status': 'fail', 'remark': self.check_audit})
|
||||
|
||||
Reference in New Issue
Block a user