odoo 08ab28

今天我们来介绍下关于odoo10的提交:08ab28

改进结果:

这个提交是对销售费用中的exponse_policy字段的值增加了onchange方法以便动态的更改该字段的值

  • 我们首先来看下销售模块中定义产品时可以选择的字段
    image.png

    上图是我们在安装销售费用后创建产品时新增的一个bool字段can_be_expensed。先进入sale_expense模块.我们在views文件夹中可以看到这个模块对product.template视图做的继承
<?xml version="1.0" encoding="utf-8"?>
<odoo>
   <record model="ir.ui.view" id="product_template_form_view_expense_policy">
       <field name="name">product.template.expense.policy</field>
       <field name="model">product.template</field>
       <field name="inherit_id" ref="sale.product_template_form_view_invoice_policy"/>
       <field name="arch" type="xml">
           <field name="invoice_policy" position="after">
               <field name="expense_policy" widget="radio"
                      attrs="{'invisible': [('can_be_expensed','=',False)]}"/>
           </field>
       </field>
   </record>
</odoo>

上面的代码相信大家很容易看懂,无非就是在我们把该字段设置为True时。就能在开票策略下出现一个重新开票费用的选择框。这三个选项也很好理解,

  • '否' 即表示不进行开票.
  • '成本' 即使用成本价格进行开票.
  • '销售价格' 即使用销售价格进行开票.
    让我们来看看这次提交对该模块的更改:
    image.png

    通过代码我们发现,这个提交在sale_expense模块中对project.template进行了继承,新增加了一个onchange方法.当产品的can_be_expense字段为False时,把expense_policy的值设置为'no'.(即'否'这个选项)
    先上commit的说明内容:
    08ab28a

为何要进行这个修改:

这就需要通过前一个xml文件来结合一起看,由于在xml中定义了'invisible'属性,我们把产品的can_be_expense属性取消时,重新开票费用这个选项会自动隐藏.但其中的expense_policy字段还保留以前选择的内容.

image.png

在实际生产过程中.操作者很容易忽视这个问题.这就会在销售订单完成后的开票操作产生bug.我们来演示下这个bug的产生。

  • 创建名为iphone的产品。勾选可用于费用. 开票策略中选择已交货数量 . 重新开票费用设置为销售价格.保存
    image.png
  • 编辑刚才创建的iphone产品。取消选择可用于费用.点击保存.这时候这个iphone产品的expense_policy字段依然保存着销售价格这个选择.
  • 创建新的销售订单, 订单行中添加iphone这个产品。


    image.png

    保存后点击把该订单状态设为确认销售。此时,该订单已经确认销售,当我们交货后即可进行开票操作。让我们来试下


    image.png

    此时,我们在销售订单的发票状态中却发现该订单显示为没有要开票的。
    image.png

    这是为什么呢?让我们通过代码来进行解释。
    首先,进入打开sale模块中的sale.py文件。
    我们首先来看下发票状态的生成策略。

class SaleOrderLine(models.Model):
    _name = 'sale.order.line'
    _description = 'Sales Order Line'
    _order = 'order_id, layout_category_id, sequence, id'

    @api.depends('state', 'product_uom_qty', 'qty_delivered', 'qty_to_invoice', 'qty_invoiced')
    def _compute_invoice_status(self):
        """
        Compute the invoice status of a SO line. Possible statuses:
        - no: if the SO is not in status 'sale' or 'done', we consider that there is nothing to
          invoice. This is also hte default value if the conditions of no other status is met.
        - to invoice: we refer to the quantity to invoice of the line. Refer to method
          `_get_to_invoice_qty()` for more information on how this quantity is calculated.
        - upselling: this is possible only for a product invoiced on ordered quantities for which
          we delivered more than expected. The could arise if, for example, a project took more
          time than expected but we decided not to invoice the extra cost to the client. This
          occurs onyl in state 'sale', so that when a SO is set to done, the upselling opportunity
          is removed from the list.
        - invoiced: the quantity invoiced is larger or equal to the quantity ordered.
        """
        precision = self.env['decimal.precision'].precision_get('Product Unit of Measure')
        for line in self:
            if line.state not in ('sale', 'done'):
                line.invoice_status = 'no'
            elif not float_is_zero(line.qty_to_invoice, precision_digits=precision):
                line.invoice_status = 'to invoice'
            elif line.state == 'sale' and line.product_id.invoice_policy == 'order' and\
                    float_compare(line.qty_delivered, line.product_uom_qty, precision_digits=precision) == 1:
                line.invoice_status = 'upselling'
            elif float_compare(line.qty_invoiced, line.product_uom_qty, precision_digits=precision) >= 0:
                line.invoice_status = 'invoiced'
            else:
                line.invoice_status = 'no'

可以看到,首先通过对订单的状态进行判断,然后根据各个条件来决定开票的状态。那为什么我们的expense_policy属性会影响开票状态呢。继续往里走,来到第一个elif判断,这里的判断条件是当销售订单中产品的字段qty_to_invoice不为0时,开票状态处于可开票,我们来看qty_to_invoice这个字段。它是一个计算字段

    @api.depends('qty_invoiced', 'qty_delivered', 'product_uom_qty', 'order_id.state')
    def _get_to_invoice_qty(self):
        """
        Compute the quantity to invoice. If the invoice policy is order, the quantity to invoice is
        calculated from the ordered quantity. Otherwise, the quantity delivered is used.
        """
        for line in self:
            if line.order_id.state in ['sale', 'done']:
                if line.product_id.invoice_policy == 'order':
                    line.qty_to_invoice = line.product_uom_qty - line.qty_invoiced
                else:
                    line.qty_to_invoice = line.qty_delivered - line.qty_invoiced
            else:
                line.qty_to_invoice = 0

通过这个计算方法我们可以发现,由于我们的iphone产品使用的是已交货数量的开票策略,我们就需要qty_delivered这个字段。
这个字段是在sale模块中定义的

qty_delivered = fields.Float(string='Delivered', copy=False, digits=dp.get_precision('Product Unit of Measure'), default=0.0)

但是它的取值是通过sale_stock模块扩展的.进入sale_stock模块models文件夹中的stock.py文件.在13行

image.png

我们看到qty_delivered字段的取值会在这里进行一次更新.注意这里的代码.首先会对产品的expense_policy字段进行过滤。
到这里
相信我们已经可以得出结论了。因为我们的iphone产品的expense_policy的默认值依然存在,即使发了货,在销售订单中该产品却还是被过滤了。销售订单的字段qty_delivered始终是默认值0.0。所以销售订单的开票状态始终为没有要开票的

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容