306 lines
11 KiB
Python
306 lines
11 KiB
Python
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
|
# this repository contains the full copyright notices and license terms.
|
|
|
|
from decimal import Decimal
|
|
|
|
from trytond.modules.company.tests import (
|
|
CompanyTestMixin, create_company, set_company)
|
|
from trytond.pool import Pool
|
|
from trytond.tests.test_tryton import (
|
|
ModuleTestCase, activate_module, with_transaction)
|
|
|
|
|
|
class StockShipmentMeasurementsTestCase(CompanyTestMixin, ModuleTestCase):
|
|
'Test Stock Shipment Measurements module'
|
|
module = 'stock_shipment_measurements'
|
|
extras = ['stock_package']
|
|
longMessage = True
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super().setUpClass()
|
|
activate_module('stock_package')
|
|
|
|
@with_transaction()
|
|
def test_move_internal_measurements(self):
|
|
"Test move internal measurements"
|
|
pool = Pool()
|
|
Uom = pool.get('product.uom')
|
|
Template = pool.get('product.template')
|
|
Product = pool.get('product.product')
|
|
Location = pool.get('stock.location')
|
|
Move = pool.get('stock.move')
|
|
|
|
kg, = Uom.search([('name', '=', 'Kilogram')])
|
|
g, = Uom.search([('name', '=', 'Gram')])
|
|
liter, = Uom.search([('name', '=', 'Liter')])
|
|
supplier, = Location.search([('code', '=', 'SUP')])
|
|
storage, = Location.search([('code', '=', 'STO')])
|
|
company = create_company()
|
|
currency = company.currency
|
|
|
|
template, = Template.create([{
|
|
'name': "Test internal measurements",
|
|
'type': 'goods',
|
|
'default_uom': kg,
|
|
}])
|
|
product, = Product.create([{
|
|
'template': template.id,
|
|
}])
|
|
|
|
# without any measurements
|
|
with set_company(company):
|
|
move, = Move.create([{
|
|
'product': product,
|
|
'unit': g,
|
|
'quantity': 200,
|
|
'from_location': supplier,
|
|
'to_location': storage,
|
|
'company': company,
|
|
'unit_price': Decimal(1),
|
|
'currency': currency,
|
|
}])
|
|
self.assertEqual(move.internal_weight, 0.2)
|
|
self.assertEqual(move.internal_volume, None)
|
|
|
|
Move.write([move], {'quantity': 100})
|
|
self.assertEqual(move.internal_weight, 0.1)
|
|
self.assertEqual(move.internal_volume, None)
|
|
|
|
template.weight = 1.1
|
|
template.weight_uom = kg
|
|
template.save()
|
|
|
|
# with weight measurements
|
|
with set_company(company):
|
|
move, = Move.create([{
|
|
'product': product,
|
|
'unit': g,
|
|
'quantity': 300,
|
|
'from_location': supplier,
|
|
'to_location': storage,
|
|
'company': company,
|
|
'unit_price': Decimal(1),
|
|
'currency': currency,
|
|
}])
|
|
self.assertEqual(move.internal_weight, 0.33)
|
|
self.assertEqual(move.internal_volume, None)
|
|
|
|
Move.write([move], {'quantity': 500})
|
|
self.assertEqual(move.internal_weight, 0.55)
|
|
self.assertEqual(move.internal_volume, None)
|
|
|
|
template.volume = 2
|
|
template.volume_uom = liter
|
|
template.save()
|
|
|
|
# with weight and volume measurements
|
|
with set_company(company):
|
|
move, = Move.create([{
|
|
'product': product,
|
|
'unit': g,
|
|
'quantity': 500,
|
|
'from_location': supplier,
|
|
'to_location': storage,
|
|
'company': company,
|
|
'unit_price': Decimal(1),
|
|
'currency': currency,
|
|
}])
|
|
self.assertEqual(move.internal_weight, 0.55)
|
|
self.assertEqual(move.internal_volume, 1)
|
|
|
|
Move.write([move], {'quantity': 600})
|
|
self.assertEqual(move.internal_weight, 0.66)
|
|
self.assertEqual(move.internal_volume, 1.2)
|
|
|
|
@with_transaction()
|
|
def test_shipment_out_measurements(self):
|
|
"Test shipment out measurements"
|
|
pool = Pool()
|
|
Uom = pool.get('product.uom')
|
|
Template = pool.get('product.template')
|
|
Product = pool.get('product.product')
|
|
Location = pool.get('stock.location')
|
|
Move = pool.get('stock.move')
|
|
Shipment = pool.get('stock.shipment.out')
|
|
Package = pool.get('stock.package')
|
|
PackageType = pool.get('stock.package.type')
|
|
Party = pool.get('party.party')
|
|
|
|
kg, = Uom.search([('name', '=', 'Kilogram')])
|
|
liter, = Uom.search([('name', '=', 'Liter')])
|
|
customer, = Location.search([('code', '=', 'CUS')])
|
|
party = Party(name='Customer')
|
|
party.addresses = [{}]
|
|
party.save()
|
|
company = create_company()
|
|
currency = company.currency
|
|
package_type = PackageType(name="Type")
|
|
package_type.save()
|
|
|
|
template, = Template.create([{
|
|
'name': "Test measurements",
|
|
'type': 'goods',
|
|
'default_uom': kg,
|
|
'volume': 0.2,
|
|
'volume_uom': liter,
|
|
}])
|
|
product, = Product.create([{
|
|
'template': template.id,
|
|
}])
|
|
|
|
with set_company(company):
|
|
shipment = Shipment()
|
|
shipment.customer = party
|
|
shipment.delivery_address, = party.addresses
|
|
shipment.warehouse = Shipment.default_warehouse()
|
|
shipment.on_change_warehouse()
|
|
shipment.save()
|
|
|
|
# without moves
|
|
self.assertEqual(shipment.weight, None)
|
|
self.assertEqual(shipment.volume, None)
|
|
|
|
shipment.moves = [Move(
|
|
product=product,
|
|
unit=kg,
|
|
quantity=10,
|
|
from_location=shipment.warehouse.output_location,
|
|
to_location=customer,
|
|
company=company,
|
|
unit_price=Decimal(1),
|
|
currency=currency,
|
|
)]
|
|
shipment.save()
|
|
|
|
# without inventory moves
|
|
self.assertEqual(shipment.weight, 10)
|
|
self.assertEqual(shipment.volume, 2)
|
|
|
|
Shipment.wait([shipment])
|
|
Shipment.pick([shipment])
|
|
|
|
# with inventory moves
|
|
self.assertEqual(shipment.weight, 10)
|
|
self.assertEqual(shipment.volume, 2)
|
|
|
|
for clause, result in [
|
|
([('weight', '=', 10)], [shipment]),
|
|
([('weight', '=', 5)], []),
|
|
([('weight', 'in', [10, 5])], [shipment]),
|
|
([('volume', '=', 2)], [shipment]),
|
|
([('volume', '=', 3)], []),
|
|
([('volume', 'in', [2, 3])], [shipment]),
|
|
]:
|
|
msg = 'clause: %s' % clause
|
|
self.assertEqual(Shipment.search(clause), result, msg=msg)
|
|
|
|
# Add packages
|
|
package_root = Package()
|
|
package_root.type = package_type
|
|
package_root.shipment = shipment
|
|
package_root.additional_weight = 1
|
|
package_root.packaging_volume = 3
|
|
package_root.packaging_volume_uom = liter
|
|
package_root.save()
|
|
|
|
package = Package()
|
|
package.type = package_type
|
|
package.shipment = shipment
|
|
package.moves = shipment.outgoing_moves
|
|
package.parent = package_root
|
|
package.save()
|
|
|
|
self.assertEqual(package_root.weight, None)
|
|
self.assertEqual(package_root.volume, None)
|
|
|
|
self.assertEqual(package.weight, 10)
|
|
self.assertEqual(package.volume, 2)
|
|
|
|
self.assertEqual(package_root.total_weight, 11)
|
|
self.assertEqual(package_root.total_volume, 3)
|
|
|
|
self.assertEqual(package.total_weight, 10)
|
|
self.assertEqual(package.total_volume, 2)
|
|
|
|
Shipment.pack([shipment])
|
|
Shipment.do([shipment])
|
|
|
|
self.assertEqual(shipment.internal_weight, 10)
|
|
self.assertEqual(shipment.internal_volume, 2)
|
|
self.assertEqual(shipment.weight, 10)
|
|
self.assertEqual(shipment.volume, 2)
|
|
|
|
for clause, result in [
|
|
([('weight', '=', 10)], [shipment]),
|
|
([('weight', '=', 5)], []),
|
|
([('weight', 'in', [10, 5])], [shipment]),
|
|
([('volume', '=', 2)], [shipment]),
|
|
([('volume', '=', 3)], []),
|
|
([('volume', 'in', [2, 3])], [shipment]),
|
|
]:
|
|
msg = 'clause: %s' % clause
|
|
self.assertEqual(Shipment.search(clause), result, msg=msg)
|
|
|
|
@with_transaction()
|
|
def test_shipment_internal_measurements(self):
|
|
"Test shipment internal measurements"
|
|
pool = Pool()
|
|
Uom = pool.get('product.uom')
|
|
Template = pool.get('product.template')
|
|
Product = pool.get('product.product')
|
|
Location = pool.get('stock.location')
|
|
Move = pool.get('stock.move')
|
|
Shipment = pool.get('stock.shipment.internal')
|
|
|
|
kg, = Uom.search([('name', '=', 'Kilogram')])
|
|
liter, = Uom.search([('name', '=', 'Liter')])
|
|
warehouse1, = Location.search([('type', '=', 'warehouse')])
|
|
warehouse2, = Location.copy([warehouse1])
|
|
company = create_company()
|
|
|
|
template, = Template.create([{
|
|
'name': "Test measurements",
|
|
'type': 'goods',
|
|
'default_uom': kg,
|
|
'volume': 0.2,
|
|
'volume_uom': liter,
|
|
}])
|
|
product, = Product.create([{
|
|
'template': template.id,
|
|
}])
|
|
|
|
with set_company(company):
|
|
shipment = Shipment()
|
|
shipment.from_location = warehouse1.storage_location
|
|
shipment.to_location = warehouse2.storage_location
|
|
shipment.save()
|
|
|
|
# without moves
|
|
self.assertEqual(shipment.weight, 0)
|
|
self.assertEqual(shipment.volume, 0)
|
|
|
|
shipment.moves = [Move(
|
|
product=product,
|
|
unit=kg,
|
|
quantity=10,
|
|
from_location=shipment.from_location,
|
|
to_location=shipment.to_location,
|
|
company=company,
|
|
)]
|
|
shipment.save()
|
|
|
|
# without transit
|
|
self.assertEqual(shipment.weight, 10)
|
|
self.assertEqual(shipment.volume, 2)
|
|
|
|
Shipment.wait([shipment])
|
|
self.assertEqual(len(shipment.moves), 2)
|
|
|
|
# with transit
|
|
self.assertEqual(shipment.weight, 10)
|
|
self.assertEqual(shipment.volume, 2)
|
|
|
|
|
|
del ModuleTestCase
|