|
-
- from odoo import api, fields, models
-
- # 状态可选值
- LEAD_STATES = [
- ('todo', '新建'),
- ('doing', '正在进行'),
- ('done', '已完成'),
- ('cancel', '无效'),
- ]
-
-
- class Lead(models.Model):
- _name = 'lead'
- _description = '线索'
-
- name = fields.Char('名称', required=True)
- note = fields.Text('描述')
- customer_name = fields.Char('客户公司名称')
- contact = fields.Char('联系人信息')
- state = fields.Selection(LEAD_STATES, '状态', default='todo')
- channel_id = fields.Many2one('core.value', '渠道',
- ondelete='restrict',
- domain=[('type', '=', 'channel')])
- source = fields.Char('来源')
- track_date = fields.Date('跟进日期')
- track_result = fields.Text('跟进结果')
-
- def new_opp(self):
- """创建商机"""
- return {
- 'name': "创建商机",
- 'res_model': 'opportunity',
- 'type': 'ir.actions.act_window',
- 'view_mode': 'form',
- 'context': {'default_name': self.name,
- 'default_lead_id': self.id,
- 'default_note': '%s %s %s' % (self.customer_name,
- self.contact,
- self.note)}
- }
-
- def set_cancel(self):
- """线索无效"""
- for lead in self:
- lead.write({'state': 'cancel'})
- return
-
-
- class Opportunity(models.Model):
- _name = 'opportunity'
- _inherits = {'task': 'task_id'}
- _inherit = ['mail.thread']
- _order = 'planned_revenue desc, priority desc, id'
- _description = '商机'
-
- @api.model
- def _select_objects(self):
- records = self.env['opportunity'].search([])
- models = self.env['ir.model'].sudo().search(
- [('model', 'in', [record.name for record in records])])
- return [(model.model, model.name) for model in models]
-
- @api.depends('line_ids.price', 'line_ids.quantity')
- def _compute_total_amount(self):
- """
- 计算报价总额
- :return:
- """
- for s in self:
- s.total_amount = sum(
- line.price * line.quantity for line in s.line_ids)
-
- # @api.model
- # def _read_group_status_ids(self):
- # """看板或列表视图上分组时显示所有阶段(即使该阶段没有记录)"""
- # status_ids = self.env['task.status'].search([('project_type_id', '=', False)])
- # return status_ids
-
- @api.model
- def _default_status(self):
- """创建商机时,阶段默认为todo状态的阶段,即 新建"""
- return self.task_id._default_status()
-
- task_id = fields.Many2one('task',
- '任务',
- ondelete='cascade',
- required=True)
- planned_revenue = fields.Float('预期收益', tracking=True)
- ref = fields.Reference(string='相关记录',
- selection='_select_objects')
- company_id = fields.Many2one(
- 'res.company',
- string='公司',
- change_default=True,
- default=lambda self: self.env.company)
- partner_id = fields.Many2one(
- 'partner',
- '客户',
- ondelete='restrict',
- help='待签约合同的客户',
- )
- date = fields.Date('预计采购时间', tracking=True)
- line_ids = fields.One2many(
- 'goods.quotation',
- 'opportunity_id',
- string='商品报价',
- copy=True,
- )
- total_amount = fields.Float(
- '报价总额',
- tracking=True,
- compute='_compute_total_amount',
- )
- success_reason_id = fields.Many2one(
- 'core.value',
- '成败原因',
- ondelete='restrict',
- domain=[('type', '=', 'success_reason')],
- context={'type': 'success_reason'},
- help='成败原因分析',
- )
-
- lead_id = fields.Many2one('lead', '线索')
-
- channel_id = fields.Many2one('core.value', related='lead_id.channel_id')
-
- source = fields.Char('来源', related='lead_id.source')
-
- status = fields.Many2one(
- 'task.status',
- string='状态',
- # group_expand='_read_group_status_ids',
- default=_default_status,
- tracking=True,
- ondelete='restrict',
- domain="[('project_type_id', '=', False)]",
- )
-
- def assign_to_me(self):
- """继承任务 指派给自己,将商机指派给自己,并修改状态"""
- for o in self:
- o.task_id.assign_to_me()
-
- def write(self, vals):
- if vals.get('status'):
- for s in self:
- s.lead_id.state = s.status.state
- return super().write(vals)
-
- @api.model_create_multi
- def create(self, vals_list):
- ret = super().create(vals_list)
- for s in ret:
- s.lead_id.state = 'doing'
- return ret
-
- def action_create_sell_order(self):
- line_ids = []
- for line in self.line_ids:
- newline = {'goods_id': line.goods_id.id, 'quantity': line.quantity, 'price_taxed': line.price}
- line_ids.append((0, 0, newline))
- date = fields.Date.context_today(self)
- res = self.env['sell.order'].create({
- 'opportunity_id': self.id,
- 'partner_id': self.partner_id.id,
- 'date': date,
- 'delivery_date': date,
- 'warehouse_id': self.env['warehouse'].search([('type', '=', 'stock')], order='id', limit=1).id,
- 'type': 'sell',
- 'line_ids': line_ids
- })
- self.status = self.env['task.status'].search([('state', '=', 'done')])
- action = {
- "type": "ir.actions.act_window",
- "view_mode": "form",
- "res_model": "sell.order",
- "res_id": res.id
- }
- return action
-
-
- class SellOrder(models.Model):
- _inherit = 'sell.order'
-
- opportunity_id = fields.Many2one('opportunity',
- ondelete='restrict',
- string='商机',
- domain="[('partner_id', '=', partner_id)]")
-
-
- class GoodsQuotation(models.Model):
- _name = 'goods.quotation'
- _description = '商品报价'
-
- opportunity_id = fields.Many2one('opportunity',
- '商机',
- index=True,
- required=True,
- ondelete='cascade',
- help='关联的商机')
- goods_id = fields.Many2one('goods',
- '商品',
- ondelete='restrict',
- help='商品')
- quantity = fields.Float('数量',
- default=1,
- digits='数量',
- help='数量')
- price = fields.Float('单价',
- required=True,
- digits='价格',
- help='商品报价')
- note = fields.Char('描述',
- help='商品描述')
-
-
- class Timeline(models.Model):
- _inherit = 'timeline'
-
- @api.model_create_multi
- def create(self, vals_list):
- """创建工作记录时,更新对应task的status等字段"""
- res = super(Timeline, self).create(vals_list)
- for vals in vals_list:
- set_status = vals.get('set_status')
- task_id = vals.get('task_id')
- next_action = vals.get('next_action')
- next_datetime = vals.get('next_datetime')
- user_id = vals.get('user_id')
- task = self.with_user(2).env['opportunity'].search([('task_id', '=', task_id)])
- if set_status:
- task.write({'status': set_status})
- if next_action:
- task.write({'next_action': next_action})
- if next_datetime:
- task.write({'next_datetime': next_datetime})
- if user_id:
- task.write({'user_id': user_id})
- return res
|