def order_with_variant_from_different_stocks(order_with_lines_and_stock): line = OrderLine.objects.get(product_sku='SKU_A') variant = ProductVariant.objects.get(sku=line.product_sku) warehouse_2 = StockLocation.objects.create(name='Warehouse 2') stock = Stock.objects.create(variant=variant, cost_price=1, quantity=5, quantity_allocated=2, location=warehouse_2) OrderLine.objects.create( delivery_group=line.delivery_group, product=variant.product, product_name=variant.product.name, product_sku=line.product_sku, is_shipping_required=variant.product.product_type.is_shipping_required, quantity=2, unit_price_net=Decimal('30.00'), unit_price_gross=Decimal('30.00'), stock=stock, stock_location=stock.location.name) warehouse_2 = StockLocation.objects.create(name='Warehouse 3') Stock.objects.create(variant=variant, cost_price=1, quantity=5, quantity_allocated=0, location=warehouse_2) recalculate_order(order_with_lines_and_stock) return order_with_lines_and_stock
def delivery_group(order, product_type, default_category): group = DeliveryGroup.objects.create(order=order) product = Product.objects.create(name='Test product', price=Decimal('10.00'), product_type=product_type, category=default_category) variant = ProductVariant.objects.create(product=product, sku='SKU_A') warehouse = StockLocation.objects.create(name='Warehouse 2') stock = Stock.objects.create(variant=variant, cost_price=1, quantity=5, quantity_allocated=3, location=warehouse) OrderLine.objects.create( delivery_group=group, product=product, product_name=product.name, product_sku='SKU_A', is_shipping_required=product.product_type.is_shipping_required, quantity=3, unit_price_net=Decimal('30.00'), unit_price_gross=Decimal('30.00'), stock=stock, stock_location=stock.location.name) recalculate_order(order) order.refresh_from_db() return group
def order_with_lines(order, product_type, category, shipping_zone, vatlayer): taxes = vatlayer product = Product.objects.create( name="Test product", price=Money("10.00", "USD"), product_type=product_type, category=category, ) variant = ProductVariant.objects.create( product=product, sku="SKU_A", cost_price=Money(1, "USD"), quantity=5, quantity_allocated=3, ) order.lines.create( product_name=variant.display_product(), product_sku=variant.sku, is_shipping_required=variant.is_shipping_required(), quantity=3, variant=variant, unit_price=variant.get_price(taxes=taxes), tax_rate=taxes["standard"]["value"], ) product = Product.objects.create( name="Test product 2", price=Money("20.00", "USD"), product_type=product_type, category=category, ) variant = ProductVariant.objects.create( product=product, sku="SKU_B", cost_price=Money(2, "USD"), quantity=2, quantity_allocated=2, ) order.lines.create( product_name=variant.display_product(), product_sku=variant.sku, is_shipping_required=variant.is_shipping_required(), quantity=2, variant=variant, unit_price=variant.get_price(taxes=taxes), tax_rate=taxes["standard"]["value"], ) order.shipping_address = order.billing_address.get_copy() method = shipping_zone.shipping_methods.get() order.shipping_method_name = method.name order.shipping_method = method order.shipping_price = method.get_total(taxes) order.save() recalculate_order(order) order.refresh_from_db() return order
def test_order_get_subtotal(order_with_lines): order_with_lines.discount_name = "Test discount" order_with_lines.discount = order_with_lines.total.gross * Decimal("0.5") recalculate_order(order_with_lines) target_subtotal = order_with_lines.total - order_with_lines.shipping_price target_subtotal += order_with_lines.discount assert order_with_lines.get_subtotal() == target_subtotal
def test_order_get_subtotal(order_with_lines): order_with_lines.discount_name = "Test discount" order_with_lines.discount_amount = order_with_lines.total.gross * Decimal("0.5") recalculate_order(order_with_lines) target_subtotal = order_with_lines.total - order_with_lines.shipping_price target_subtotal += order_with_lines.discount_amount assert order_with_lines.get_subtotal() == target_subtotal
def order_with_lines(order, product_type, default_category, shipping_method): product = Product.objects.create(name='Test product', price=Money('10.00', 'USD'), product_type=product_type, category=default_category) variant = ProductVariant.objects.create(product=product, sku='SKU_A') warehouse = StockLocation.objects.create(name='Warehouse 1') stock = Stock.objects.create(variant=variant, cost_price=Money(1, 'USD'), quantity=5, quantity_allocated=3, location=warehouse) order.lines.create( product=product, product_name=product.name, product_sku='SKU_A', is_shipping_required=product.product_type.is_shipping_required, quantity=3, unit_price_net=Decimal('30.00'), unit_price_gross=Decimal('30.00'), stock=stock, stock_location=stock.location.name) product = Product.objects.create(name='Test product 2', price=Money('20.00', 'USD'), product_type=product_type, category=default_category) variant = ProductVariant.objects.create(product=product, sku='SKU_B') stock = Stock.objects.create(variant=variant, cost_price=Money(2, 'USD'), quantity=2, quantity_allocated=2, location=warehouse) order.lines.create( product=product, product_name=product.name, product_sku='SKU_B', is_shipping_required=product.product_type.is_shipping_required, quantity=2, unit_price_net=Decimal('20.00'), unit_price_gross=Decimal('20.00'), stock=stock, stock_location=stock.location.name) order.shipping_address = order.billing_address.get_copy() order.shipping_method_name = shipping_method.name method = shipping_method.price_per_country.get() order.shipping_method = method order.shipping_price = method.get_total_price() order.save() recalculate_order(order) order.refresh_from_db() return order
def order_with_lines(order, product_type, default_category, shipping_method): product = Product.objects.create(name='Test product', price=Money('10.00', 'USD'), product_type=product_type, category=default_category) variant = ProductVariant.objects.create(product=product, sku='SKU_A', cost_price=Money(1, 'USD'), quantity=0, quantity_allocated=0) order.lines.create( product_name=product.name, product_sku='SKU_%d' % (product.pk, ), is_shipping_required=product.product_type.is_shipping_required, quantity=1, unit_price_net=Decimal('10.00'), unit_price_gross=Decimal('10.00'), variant=variant) product = Product.objects.create(name='Test product 2', price=Money('20.00', 'USD'), product_type=product_type, category=default_category) variant = ProductVariant.objects.create(product=product, sku='SKU_B', cost_price=Money(2, 'USD'), quantity=0, quantity_allocated=0) order.lines.create( product_name=product.name, product_sku='SKU_%d' % (product.pk, ), is_shipping_required=product.product_type.is_shipping_required, quantity=1, unit_price_net=Decimal('20.00'), unit_price_gross=Decimal('20.00'), variant=variant) product = Product.objects.create(name='Test product 3', price=Money('30.00', 'USD'), product_type=product_type, category=default_category) order.shipping_address = order.billing_address.get_copy() order.shipping_method_name = shipping_method.name method = shipping_method.price_per_country.get() order.shipping_method = method order.shipping_price = method.get_total_price() order.save() recalculate_order(order) order.refresh_from_db() recalculate_order(order) return order
def order_with_lines(order, product_type, default_category, shipping_method, vatlayer): taxes = vatlayer product = Product.objects.create(name='Test product', price=Money('10.00', 'USD'), product_type=product_type, category=default_category) variant = ProductVariant.objects.create(product=product, sku='SKU_A', cost_price=Money(1, 'USD'), quantity=5, quantity_allocated=3) order.lines.create(product_name=variant.display_product(), product_sku=variant.sku, is_shipping_required=variant.is_shipping_required(), quantity=3, variant=variant, unit_price=variant.get_price(taxes=taxes), tax_rate=taxes['standard']['value']) product = Product.objects.create(name='Test product 2', price=Money('20.00', 'USD'), product_type=product_type, category=default_category) variant = ProductVariant.objects.create(product=product, sku='SKU_B', cost_price=Money(2, 'USD'), quantity=2, quantity_allocated=2) order.lines.create(product_name=variant.display_product(), product_sku=variant.sku, is_shipping_required=variant.is_shipping_required(), quantity=2, variant=variant, unit_price=variant.get_price(taxes=taxes), tax_rate=taxes['standard']['value']) order.shipping_address = order.billing_address.get_copy() order.shipping_method_name = shipping_method.name method = shipping_method.price_per_country.get() order.shipping_method = method order.shipping_price = method.get_total_price(taxes) order.save() recalculate_order(order) order.refresh_from_db() return order
def order_with_lines_and_stock(order, product_type, default_category): product = Product.objects.create(name='Test product', price=Money('10.00', 'USD'), product_type=product_type, category=default_category) variant = ProductVariant.objects.create(product=product, sku='SKU_A') warehouse = StockLocation.objects.create(name='Warehouse 1') stock = Stock.objects.create(variant=variant, cost_price=Money(1, 'USD'), quantity=5, quantity_allocated=3, location=warehouse) order.lines.create( order=order, product=product, product_name=product.name, product_sku='SKU_A', is_shipping_required=product.product_type.is_shipping_required, quantity=3, unit_price_net=Decimal('30.00'), unit_price_gross=Decimal('30.00'), stock=stock, stock_location=stock.location.name) product = Product.objects.create(name='Test product 2', price=Money('20.00', 'USD'), product_type=product_type, category=default_category) variant = ProductVariant.objects.create(product=product, sku='SKU_B') stock = Stock.objects.create(variant=variant, cost_price=Money(2, 'USD'), quantity=2, quantity_allocated=2, location=warehouse) order.lines.create( order=order, product=product, product_name=product.name, product_sku='SKU_B', is_shipping_required=product.product_type.is_shipping_required, quantity=2, unit_price_net=Decimal('20.00'), unit_price_gross=Decimal('20.00'), stock=stock, stock_location=stock.location.name) recalculate_order(order) order.refresh_from_db() return order
def order_with_lines(order, product_type, default_category): group = DeliveryGroup.objects.create(order=order) product = Product.objects.create(name='Test product', price=Decimal('10.00'), product_type=product_type, category=default_category) OrderLine.objects.create( delivery_group=group, product=product, product_name=product.name, product_sku='SKU_%d' % (product.pk, ), is_shipping_required=product.product_type.is_shipping_required, quantity=1, unit_price_net=Decimal('10.00'), unit_price_gross=Decimal('10.00')) product = Product.objects.create(name='Test product 2', price=Decimal('20.00'), product_type=product_type, category=default_category) OrderLine.objects.create( delivery_group=group, product=product, product_name=product.name, product_sku='SKU_%d' % (product.pk, ), is_shipping_required=product.product_type.is_shipping_required, quantity=1, unit_price_net=Decimal('20.00'), unit_price_gross=Decimal('20.00')) product = Product.objects.create(name='Test product 3', price=Decimal('30.00'), product_type=product_type, category=default_category) OrderLine.objects.create( delivery_group=group, product=product, product_name=product.name, product_sku='SKU_%d' % (product.pk, ), is_shipping_required=product.product_type.is_shipping_required, quantity=1, unit_price_net=Decimal('30.00'), unit_price_gross=Decimal('30.00')) recalculate_order(order) return order
def save(cls, info, instance, cleaned_input): shipping_address = cleaned_input.get('shipping_address') if shipping_address: shipping_address.save() instance.shipping_address = shipping_address billing_address = cleaned_input.get('billing_address') if billing_address: billing_address.save() instance.billing_address = billing_address super().save(info, instance, cleaned_input) instance.save(update_fields=['billing_address', 'shipping_address']) variants = cleaned_input.get('variants') quantities = cleaned_input.get('quantities') if variants and quantities: for variant, quantity in zip(variants, quantities): add_variant_to_order(instance, variant, quantity) recalculate_order(instance)
def save(cls, info, instance, cleaned_input): shipping_address = cleaned_input.get('shipping_address') if shipping_address: shipping_address.save() instance.shipping_address = shipping_address billing_address = cleaned_input.get('billing_address') if billing_address: billing_address.save() instance.billing_address = billing_address super().save(info, instance, cleaned_input) instance.save(update_fields=['billing_address', 'shipping_address']) variants = cleaned_input.get('variants') quantities = cleaned_input.get('quantities') if variants and quantities: for variant, quantity in zip(variants, quantities): add_variant_to_order(instance, variant, quantity) recalculate_order(instance)
def order_with_lines(order, product_type, default_category): group = DeliveryGroup.objects.create(order=order) product = Product.objects.create( name='Test product', price=Decimal('10.00'), product_type=product_type, category=default_category) OrderLine.objects.create( delivery_group=group, product=product, product_name=product.name, product_sku='SKU_%d' % (product.pk,), is_shipping_required=product.product_type.is_shipping_required, quantity=1, unit_price_net=Decimal('10.00'), unit_price_gross=Decimal('10.00')) product = Product.objects.create( name='Test product 2', price=Decimal('20.00'), product_type=product_type, category=default_category) OrderLine.objects.create( delivery_group=group, product=product, product_name=product.name, product_sku='SKU_%d' % (product.pk,), is_shipping_required=product.product_type.is_shipping_required, quantity=1, unit_price_net=Decimal('20.00'), unit_price_gross=Decimal('20.00')) product = Product.objects.create( name='Test product 3', price=Decimal('30.00'), product_type=product_type, category=default_category) OrderLine.objects.create( delivery_group=group, product=product, product_name=product.name, product_sku='SKU_%d' % (product.pk,), is_shipping_required=product.product_type.is_shipping_required, quantity=1, unit_price_net=Decimal('30.00'), unit_price_gross=Decimal('30.00')) recalculate_order(order) return order
def order_with_lines( order, product_type, default_category, shipping_method, vatlayer): taxes = vatlayer product = Product.objects.create( name='Test product', price=Money('10.00', 'USD'), product_type=product_type, category=default_category) variant = ProductVariant.objects.create( product=product, sku='SKU_A', cost_price=Money(1, 'USD'), quantity=5, quantity_allocated=3) order.lines.create( product_name=variant.display_product(), product_sku=variant.sku, is_shipping_required=variant.is_shipping_required(), quantity=3, variant=variant, unit_price=variant.get_price(taxes=taxes), tax_rate=taxes['standard']['value']) product = Product.objects.create( name='Test product 2', price=Money('20.00', 'USD'), product_type=product_type, category=default_category) variant = ProductVariant.objects.create( product=product, sku='SKU_B', cost_price=Money(2, 'USD'), quantity=2, quantity_allocated=2) order.lines.create( product_name=variant.display_product(), product_sku=variant.sku, is_shipping_required=variant.is_shipping_required(), quantity=2, variant=variant, unit_price=variant.get_price(taxes=taxes), tax_rate=taxes['standard']['value']) order.shipping_address = order.billing_address.get_copy() order.shipping_method_name = shipping_method.name method = shipping_method.price_per_country.get() order.shipping_method = method order.shipping_price = method.get_total_price(taxes) order.save() recalculate_order(order) order.refresh_from_db() return order
def order_with_lines(order, product_type, default_category): product = Product.objects.create(name='Test product', price=Money('10.00', 'USD'), product_type=product_type, category=default_category) order.lines.create( product=product, product_name=product.name, product_sku='SKU_%d' % (product.pk, ), is_shipping_required=product.product_type.is_shipping_required, quantity=1, unit_price_net=Decimal('10.00'), unit_price_gross=Decimal('10.00')) product = Product.objects.create(name='Test product 2', price=Money('20.00', 'USD'), product_type=product_type, category=default_category) order.lines.create( product=product, product_name=product.name, product_sku='SKU_%d' % (product.pk, ), is_shipping_required=product.product_type.is_shipping_required, quantity=1, unit_price_net=Decimal('20.00'), unit_price_gross=Decimal('20.00')) product = Product.objects.create(name='Test product 3', price=Money('30.00', 'USD'), product_type=product_type, category=default_category) order.lines.create( product=product, product_name=product.name, product_sku='SKU_%d' % (product.pk, ), is_shipping_required=product.product_type.is_shipping_required, quantity=1, unit_price_net=Decimal('30.00'), unit_price_gross=Decimal('30.00')) recalculate_order(order) return order
def order_with_lines_and_stock(order, product_type, default_category): group = DeliveryGroup.objects.create(order=order) product = Product.objects.create( name='Test product', price=Decimal('10.00'), product_type=product_type, category=default_category) variant = ProductVariant.objects.create(product=product, sku='SKU_A') warehouse = StockLocation.objects.create(name='Warehouse 1') stock = Stock.objects.create( variant=variant, cost_price=1, quantity=5, quantity_allocated=3, location=warehouse) OrderLine.objects.create( delivery_group=group, product=product, product_name=product.name, product_sku='SKU_A', is_shipping_required=product.product_type.is_shipping_required, quantity=3, unit_price_net=Decimal('30.00'), unit_price_gross=Decimal('30.00'), stock=stock, stock_location=stock.location.name) product = Product.objects.create( name='Test product 2', price=Decimal('20.00'), product_type=product_type, category=default_category) variant = ProductVariant.objects.create(product=product, sku='SKU_B') stock = Stock.objects.create( variant=variant, cost_price=2, quantity=2, quantity_allocated=2, location=warehouse) OrderLine.objects.create( delivery_group=group, product=product, product_name=product.name, product_sku='SKU_B', is_shipping_required=product.product_type.is_shipping_required, quantity=2, unit_price_net=Decimal('20.00'), unit_price_gross=Decimal('20.00'), stock=stock, stock_location=stock.location.name) recalculate_order(order) order.refresh_from_db() return order
def order_with_lines_and_stock(order, product_class): group = DeliveryGroup.objects.create(order=order) product = Product.objects.create(name='Test product', price=Decimal('10.00'), product_class=product_class) variant = ProductVariant.objects.create(product=product, sku='SKU_A') warehouse = StockLocation.objects.create(name='Warehouse 1') stock = Stock.objects.create(variant=variant, cost_price=1, quantity=5, quantity_allocated=3, location=warehouse) OrderLine.objects.create(delivery_group=group, product=product, product_name=product.name, product_sku='SKU_A', quantity=3, unit_price_net=Decimal('30.00'), unit_price_gross=Decimal('30.00'), stock=stock, stock_location=stock.location.name) product = Product.objects.create(name='Test product 2', price=Decimal('20.00'), product_class=product_class) variant = ProductVariant.objects.create(product=product, sku='SKU_B') stock = Stock.objects.create(variant=variant, cost_price=2, quantity=2, quantity_allocated=2, location=warehouse) OrderLine.objects.create(delivery_group=group, product=product, product_name=product.name, product_sku='SKU_B', quantity=2, unit_price_net=Decimal('20.00'), unit_price_gross=Decimal('20.00'), stock=stock, stock_location=stock.location.name) recalculate_order(order) order.refresh_from_db() return order
def order_with_lines(order, product_type, default_category): product = Product.objects.create( name='Test product', price=Money('10.00', 'USD'), product_type=product_type, category=default_category) order.lines.create( product=product, product_name=product.name, product_sku='SKU_%d' % (product.pk,), is_shipping_required=product.product_type.is_shipping_required, quantity=1, unit_price_net=Decimal('10.00'), unit_price_gross=Decimal('10.00')) product = Product.objects.create( name='Test product 2', price=Money('20.00', 'USD'), product_type=product_type, category=default_category) order.lines.create( product=product, product_name=product.name, product_sku='SKU_%d' % (product.pk,), is_shipping_required=product.product_type.is_shipping_required, quantity=1, unit_price_net=Decimal('20.00'), unit_price_gross=Decimal('20.00')) product = Product.objects.create( name='Test product 3', price=Money('30.00', 'USD'), product_type=product_type, category=default_category) order.lines.create( product=product, product_name=product.name, product_sku='SKU_%d' % (product.pk,), is_shipping_required=product.product_type.is_shipping_required, quantity=1, unit_price_net=Decimal('30.00'), unit_price_gross=Decimal('30.00')) recalculate_order(order) return order
def order_with_variant_from_different_stocks(order_with_lines_and_stock): line = OrderLine.objects.get(product_sku='SKU_A') variant = ProductVariant.objects.get(sku=line.product_sku) warehouse_2 = StockLocation.objects.create(name='Warehouse 2') stock = Stock.objects.create( variant=variant, cost_price=1, quantity=5, quantity_allocated=2, location=warehouse_2) OrderLine.objects.create( delivery_group=line.delivery_group, product=variant.product, product_name=variant.product.name, product_sku=line.product_sku, is_shipping_required=variant.product.product_type.is_shipping_required, quantity=2, unit_price_net=Decimal('30.00'), unit_price_gross=Decimal('30.00'), stock=stock, stock_location=stock.location.name) warehouse_2 = StockLocation.objects.create(name='Warehouse 3') Stock.objects.create( variant=variant, cost_price=1, quantity=5, quantity_allocated=0, location=warehouse_2) recalculate_order(order_with_lines_and_stock) return order_with_lines_and_stock
def order_with_lines(order, product_type, category, shipping_zone): product = Product.objects.create( name="Test product", price=Money("10.00", "USD"), product_type=product_type, category=category, ) variant = ProductVariant.objects.create( product=product, sku="SKU_A", cost_price=Money(1, "USD"), quantity=5, quantity_allocated=3, ) net = variant.get_price() gross = Money(amount=net.amount * Decimal(1.23), currency=net.currency) order.lines.create( product_name=str(variant.product), variant_name=str(variant), product_sku=variant.sku, is_shipping_required=variant.is_shipping_required(), quantity=3, variant=variant, unit_price=TaxedMoney(net=net, gross=gross), tax_rate=23, ) product = Product.objects.create( name="Test product 2", price=Money("20.00", "USD"), product_type=product_type, category=category, ) variant = ProductVariant.objects.create( product=product, sku="SKU_B", cost_price=Money(2, "USD"), quantity=2, quantity_allocated=2, ) net = variant.get_price() gross = Money(amount=net.amount * Decimal(1.23), currency=net.currency) order.lines.create( product_name=str(variant.product), variant_name=str(variant), product_sku=variant.sku, is_shipping_required=variant.is_shipping_required(), quantity=2, variant=variant, unit_price=TaxedMoney(net=net, gross=gross), tax_rate=23, ) order.shipping_address = order.billing_address.get_copy() method = shipping_zone.shipping_methods.get() order.shipping_method_name = method.name order.shipping_method = method net = method.get_total() gross = Money(amount=net.amount * Decimal(1.23), currency=net.currency) order.shipping_price = TaxedMoney(net=net, gross=gross) order.save() recalculate_order(order) order.refresh_from_db() return order