|  | from odoo.tests.common import TransactionCase
from odoo.exceptions import UserError, ValidationError
class TestMoveLine(TransactionCase):
    ''' 测试库存调拨 '''
    def setUp(self):
        super(TestMoveLine, self).setUp()
        self.keyboard_mouse_in_line = self.browse_ref(
            'warehouse.wh_move_line_keyboard_mouse_in_2')
        self.keyboard_mouse_out_line = self.browse_ref(
            'warehouse.wh_move_line_keyboard_mouse_in_2')
        self.mouse_in_line = self.browse_ref('warehouse.wh_move_line_12')
        self.mouse_in_line.cost = self.mouse_in_line.cost_unit * self.mouse_in_line.goods_qty
        self.mouse_out_line = self.browse_ref('warehouse.wh_move_line_0')
        self.cable_int_line = self.browse_ref('warehouse.wh_move_line_17')
        self.bj_warehouse = self.browse_ref('warehouse.bj_stock')
        self.hd_warehouse = self.browse_ref('warehouse.hd_stock')
        self.goods_mouse = self.browse_ref('goods.mouse')
        self.goods_cable = self.browse_ref('goods.cable')
        self.assembly = self.browse_ref('warehouse.wh_assembly_ass0')
    def test_origin_explain(self):
        explain = self.mouse_in_line.get_origin_explain()
        self.assertEqual(explain, '盘盈')
        explain = self.mouse_out_line.get_origin_explain()
        self.assertEqual(explain, '组装单子件')
        explain = self.cable_int_line.get_origin_explain()
        self.assertEqual(explain, '调拨入库')
        self.cable_int_line.move_id.origin = ''
        explain = self.cable_int_line.get_origin_explain()
        self.assertEqual(explain, '')
    def test_default(self):
        # 需找默认的仓库
        defaults = self.env['wh.move.line'].with_context({
            'goods_id': 1,
            'warehouse_id': 1,
        }).default_get(['goods_id', 'warehouse_id'])
        self.assertEqual(defaults.get('goods_id'), 1)
        self.assertEqual(defaults.get('warehouse_id'), 1)
    def test_name_get(self):
        line = self.mouse_in_line
        name = line.with_context({'match': 1}).name_get()
        real_name = '%s-%s->%s(%s, %s%s)' % (line.move_id.name, line.warehouse_id.name,
                                             line.warehouse_dest_id.name, line.goods_id.name,
                                             str(line.goods_qty), line.uom_id.name)
        self.assertEqual(name[0][1], real_name)
        lot_name = line.name_get()
        real_lot_name = line.lot
        self.assertEqual(lot_name[0][1], real_lot_name)
    def test_copy_data(self):
        # 复制的时候,如果该明细行是出库行为,那么需要重新计算成本
        _, cost_unit = self.mouse_out_line.goods_id.get_suggested_cost_by_warehouse(
            self.mouse_out_line.warehouse_id, self.mouse_out_line.goods_qty,
            lot_id=self.mouse_out_line.lot_id)
        self.assertEqual(cost_unit, self.mouse_out_line.lot_id.cost_unit)
    def test_get_matching_records_by_lot(self):
        # 批次号未审核的时候获取批次信息会报错
        with self.assertRaises(UserError):
            self.mouse_out_line.goods_id.get_matching_records_by_lot(
                self.mouse_out_line.lot_id, self.mouse_out_line.goods_qty)
        # 批次号不存在的时候应该报错
        with self.assertRaises(UserError):
            self.mouse_out_line.goods_id.get_matching_records_by_lot(False, 0)
        self.mouse_out_line.lot_id.action_done()
        results, _ = self.mouse_out_line.goods_id.get_matching_records_by_lot(
            self.mouse_out_line.lot_id, self.mouse_out_line.goods_qty,
            self.mouse_out_line.goods_uos_qty)
        real_results = {
            'line_in_id': self.mouse_out_line.lot_id.id,
            'qty': self.mouse_out_line.goods_qty,
            'uos_qty': self.mouse_out_line.goods_uos_qty,
            'expiration_date': False,
        }
        self.assertEqual(results[0], real_results)
        # 当前明细行的商品数量大于批次的数量的时候,会报错
        with self.assertRaises(UserError):
            self.mouse_out_line.goods_id.get_matching_records_by_lot(
                self.mouse_out_line.lot_id,
                self.mouse_out_line.lot_id.qty_remaining + 10)
    def test_attribute(self):
        '''在出库类型的明细行中,选择商品属性,lot_id的domain需要包含属性相关'''
        self.env.ref('core.goods_category_1').account_id = self.env.ref(
            'finance.account_goods').id
        self.env.ref('warehouse.wh_in_wh_in_attribute').date = '2016-02-06'
        attribute_in = self.browse_ref('warehouse.wh_in_wh_in_attribute')
        white_iphone = self.browse_ref('warehouse.wh_move_line_iphone_in_1')
        white_iphone.cost = white_iphone.cost_unit * white_iphone.goods_qty
        black_iphone = self.browse_ref('warehouse.wh_move_line_iphone_in_2')
        black_iphone.cost = black_iphone.cost_unit * black_iphone.goods_qty
        out_iphone = self.browse_ref('warehouse.wh_move_line_iphone_out')
        attribute_in.approve_order()
        # 指定属性的时候,出库成本会寻找和自己属性一致的入库行
        out_iphone.attribute_id = white_iphone.attribute_id
        out_iphone.action_done()
        self.assertEqual(out_iphone.cost_unit, white_iphone.cost_unit)
        out_iphone.action_draft()
        out_iphone.attribute_id = black_iphone.attribute_id
        real_domain = [
            ('goods_id', '=', out_iphone.goods_id.id),
            ('state', '=', 'done'),
            ('lot', '!=', False),
            ('qty_remaining', '>', 0),
            ('warehouse_dest_id.type', '=', 'stock'),
            ('warehouse_dest_id', '=', out_iphone.warehouse_id.id),
            ('attribute_id', '=', black_iphone.attribute_id.id)
        ]
        domain = out_iphone.with_context({
            'default_warehouse_id': out_iphone.move_id.warehouse_id.id
        }).onchange_attribute_id().get('domain')
        self.assertEqual(real_domain, domain.get('lot_id'))
        out_iphone.action_done()
        self.assertEqual(out_iphone.cost_unit, black_iphone.cost_unit)
    def test_onchange(self):
        '''在出库类型的明细行中,选择商品,lot_id的domain需要包含仓库相关'''
        results = self.mouse_out_line.with_context({
            'default_warehouse_id': self.mouse_out_line.move_id.warehouse_id.id
        }).onchange_goods_id()
        real_domain = [
            ('goods_id', '=', self.mouse_out_line.goods_id.id),
            ('state', '=', 'done'),
            ('lot', '!=', False),
            ('qty_remaining', '>', 0),
            ('warehouse_dest_id.type', '=', 'stock'),
            ('warehouse_dest_id', '=', self.mouse_out_line.warehouse_id.id)
        ]
        # 商品改变的时候,此时仓库存在,lot_id字段的domain值需要包含仓库相关
        self.assertEqual(results['domain']['lot_id'], real_domain)
        self.assertEqual(self.mouse_out_line.goods_qty, 1)
        results = self.keyboard_mouse_out_line.with_context({
            'type': 'out',
        }).onchange_goods_id()
        self.assertEqual(self.keyboard_mouse_out_line.goods_qty,
                         self.keyboard_mouse_out_line.goods_id.conversion_unit(
                             self.keyboard_mouse_out_line.goods_uos_qty))
        # 改变仓库的时候,如果批号的仓库和它不一致,那么批号需要被删除
        self.assertTrue(self.mouse_out_line.lot_id)
        self.mouse_out_line.warehouse_id = self.bj_warehouse
        self.mouse_out_line.onchange_warehouse_id()
        self.assertTrue(not self.mouse_out_line.lot_id)
        # 改变商品的时候,如果批号的商品和它不一致,那么批号也要被删除
        self.mouse_out_line.lot_id = self.mouse_in_line
        self.mouse_out_line.warehouse_id = self.hd_warehouse
        self.mouse_out_line.goods_id = self.goods_cable
        self.mouse_out_line.compute_lot_compatible()
        self.assertTrue(not self.mouse_out_line.lot_id)
        self.mouse_out_line.goods_id = self.goods_mouse
        self.keyboard_mouse_in_line.cost_unit = 0
        results = self.keyboard_mouse_out_line.with_context({
            'type': 'out',
        }).onchange_goods_qty()
        # 出库的单据,数量改变的时候,成本应该跟着改变
        _, cost_unit = self.keyboard_mouse_out_line.goods_id.get_suggested_cost_by_warehouse(
            self.keyboard_mouse_out_line.warehouse_id, self.keyboard_mouse_out_line.goods_qty)
        self.assertEqual(self.keyboard_mouse_out_line.cost_unit, cost_unit)
        self.keyboard_mouse_out_line.goods_id = self.goods_cable
        self.keyboard_mouse_out_line.goods_uos_qty = 10
        temp_goods_qty = self.keyboard_mouse_out_line.goods_id.conversion_unit(
            10)
        self.keyboard_mouse_out_line.onchange_goods_uos_qty()
        self.assertEqual(self.keyboard_mouse_out_line.goods_qty, temp_goods_qty)
        self.mouse_in_line.action_done()
        self.mouse_out_line.lot_qty = 0
        self.mouse_out_line.lot_id = self.mouse_in_line
        self.mouse_out_line.with_context(
            {'type': 'internal'}).onchange_lot_id()
        # 当传递type为internal的上下文值的时候,此时lot会设置为lot_id的lot
        self.assertEqual(self.mouse_out_line.lot,
                         self.mouse_out_line.lot_id.lot)
        self.assertEqual(self.mouse_out_line.lot_qty,
                         self.mouse_out_line.lot_id.qty_remaining)
        self.mouse_in_line.discount_rate = 0
        self.mouse_in_line.onchange_discount_rate()
        self.assertEqual(self.mouse_in_line.discount_amount, 0)
        self.mouse_in_line.price = 100
        self.mouse_in_line.discount_rate = 100
        self.mouse_in_line.onchange_discount_rate()
        self.assertEqual(self.mouse_in_line.discount_amount,
                         self.mouse_in_line.goods_qty * self.mouse_in_line.price)
        with self.assertRaises(UserError):
            self.mouse_in_line.unlink()
        self.mouse_in_line.warehouse_id = self.mouse_in_line.warehouse_dest_id
        with self.assertRaises(UserError):
            self.mouse_in_line.check_availability()
    def test_onchange_goods_id_no_goods(self):
        ''' 测试  onchange_goods_id no goods '''
        self.goods_id = False
        self.env['wh.move.line'].onchange_goods_id()
    def test_onchange_goods_id_in_cost_unit(self):
        ''' 测试  onchange_goods_id 入库单行默认带出入库成本 '''
        self.mouse_in_line.goods_id = self.goods_cable
        self.mouse_in_line.with_context({'type': 'in'}).onchange_goods_id()
    def test_name_search(self):
        '''测试批号下拉的时候显示批次和剩余数量'''
        move_line = self.env.ref('warehouse.wh_move_line_12')
        result = self.env['wh.move.line'].name_search('ms160301')
        real_result = [(move_line.id, move_line.lot + ' ' +
                        move_line.warehouse_dest_id.name + ' 余 ' + str(move_line.goods_qty))]
        self.assertEqual(result, real_result)
    def test_name_search_args(self):
        '''批号下拉时候以domain搜索'''
        result = self.env['wh.move.line'].name_search(args=[('lot', '=', 'ms160301')])
        real_result = [(self.mouse_in_line.id, self.mouse_in_line.lot + ' ' +
                        self.mouse_in_line.warehouse_dest_id.name + ' 余 ' + str(self.mouse_in_line.goods_qty))]
        self.assertEqual(result, real_result)
    def test_compute_all_amount_wrong_tax_rate(self):
        '''明细行上输入错误税率,应报错'''
        with self.assertRaises(UserError):
            self.mouse_in_line.tax_rate = -1
            self.mouse_in_line.read()
        with self.assertRaises(UserError):
            self.mouse_in_line.tax_rate = 102
            self.mouse_in_line.read()
    def test_compute_cost(self):
        '''计算成本if语句'''
        self.mouse_in_line.with_context({'type': 'in'}).price = 100
        #self.assertEqual(self.mouse_in_line.cost, 100)
    def test_onchange_discount_amount(self):
        '''当优惠金额发生变化时'''
        self.assertEqual(self.mouse_in_line.cost, 40)
        self.assertEqual(self.mouse_in_line.cost_unit, 40)
        self.mouse_in_line.with_context({'type': 'in'}).discount_amount = 5
        self.mouse_in_line.onchange_discount_amount()
        #self.assertEqual(self.mouse_in_line.cost, 35)
        #self.assertEqual(self.mouse_in_line.read()[0]['cost_unit'], 40)  #    """单位成本并没发生变化"""
    def test_check_goods_qty(self):
        '''序列号管理的商品数量必须为1'''
        # 鼠标进行了序列号管理
        with self.assertRaises(UserError):
            self.mouse_in_line.goods_qty = 2
    def test_action_done_no_lot_raise_error(self):
        '''检查属性或批号是否填充'''
        # type=in,lot为空
        self.mouse_in_line.lot = False
        with self.assertRaises(UserError):
            self.mouse_in_line.action_done()
        # type=out,lot_id为空
        self.mouse_out_line.lot_id = False
        with self.assertRaises(UserError):
            self.mouse_out_line.action_done()
        # 属性为空
        keyboard_line = self.env.ref('warehouse.wh_move_line_13')
        keyboard_line.attribute_id = False
        with self.assertRaises(UserError):
            keyboard_line.action_done()
 |