예제 #1
0
def platform_invoice(
    order, seller, logistics_user, central_platform_user, traidoo_region
):
    invoice = factories.PlatformInvoiceFactory(
        order, seller=seller, region=traidoo_region
    ).compose()
    invoice.save()
    yield invoice
예제 #2
0
    def invoices(order: Order, sellers: List[User]):
        documents = []

        # Add platform invoice for a buyer only if he is not a cooperative
        # member
        if not order.buyer.is_cooperative_member:
            documents.append(
                factories.BuyerPlatformInvoiceFactory(
                    order, region=order.buyer.region).compose())

        if order.has_central_logistics_deliveries:
            regions = {
                order_item.product.region
                for order_item in order.items.select_related(
                    "product__region").filter(
                        delivery_option__id=DeliveryOption.CENTRAL_LOGISTICS).
                distinct()
            }

            for region in regions:
                documents.append(
                    factories.LogisticsInvoiceFactory(order,
                                                      region=region).compose())

        if settings.FEATURES["routes"] and order.has_third_party_deliveries:
            logger.debug("Generating invoice for a supplier.")

            regions = {
                order_item.product.region
                for order_item in order.items.select_related(
                    "product__region").filter(
                        job__user__isnull=False).distinct()
            }

            for region in regions:
                for document in factories.ThirdPartyLogisticsInvoiceFactory(
                        order, region=region).compose():
                    documents.append(document)

        for seller in sellers:
            documents.extend([
                factories.ProducerInvoiceFactory(order,
                                                 region=seller.region,
                                                 seller=seller).compose(),
                factories.PlatformInvoiceFactory(order,
                                                 region=seller.region,
                                                 seller=seller).compose(),
            ])

        return documents
예제 #3
0
def test_create_platform_invoice_cooperative_member(
    order,
    order_items,
    central_platform_user,
    traidoo_region,
    delivery_address,
    delivery_options,
    seller,
):
    assert seller.is_cooperative_member

    document = factories.PlatformInvoiceFactory(order,
                                                region=traidoo_region,
                                                seller=seller).compose()

    document.save()

    assert document.seller == factories.PlatformInvoiceFactory.as_dict(
        central_platform_user)

    assert document.buyer == factories.PlatformInvoiceFactory.as_company(
        seller)
    assert document.order_id == order.id
    assert len(document.lines) == 1
    assert document.lines[0] == {
        "amount": 1.0,
        "category": "",
        "count": 1.0,
        "name": "Plattformgebühr",
        "number": "",
        "price": 13.6,
        "producer": "Traidoo",
        "seller_user_id": central_platform_user.id,
        "unit": "",
        "vat_rate": 19.0,
    }
예제 #4
0
def test_include_paid_notice_in_seller_platform_invoice(
        order, traidoo_region, seller, order_items):
    document = (factories.PlatformInvoiceFactory(
        order, region=traidoo_region, seller=seller).compose().render_html())

    assert "Diese Rechnung ist bereits bezahlt" in document
예제 #5
0
def test_pay_oldest_order_first(
    mangopay_bank_alias_payin,
    order,
    api_client,
    order_confirmation,
    buyer,
    traidoo_region,
    products,
    delivery_address,
    delivery_options,
):

    new_order = baker.make(
        Order,
        buyer=buyer,
        region=traidoo_region,
        earliest_delivery_date=timezone.make_aware(datetime.datetime.today()),
    )

    product = products[0]
    product.amount = 10
    product.save()

    baker.make(
        OrderItem,
        product=product,
        quantity=1,
        order=new_order,
        delivery_address=delivery_address,
        delivery_option=delivery_options[0],
        latest_delivery_date=timezone.now().date() + datetime.timedelta(days=3),
    )

    factories.PlatformInvoiceFactory(
        new_order, traidoo_region, product.seller
    ).compose().save()
    new_order_confirmation = factories.OrderConfirmationBuyerFactory(
        new_order, traidoo_region
    ).compose()
    new_order_confirmation.save()
    new_order.total_price = new_order_confirmation.price_gross
    new_order.save()
    factories.ProducerInvoiceFactory(
        new_order, traidoo_region, product.seller
    ).compose().save()
    mangopay_bank_alias_payin.return_value.get_wallet.side_effect = [
        # first order check if we can afford to pay
        {
            "Currency": "EUR",
            "Id": "buyer-wallet-1",
            "Description": "Default",
            "Balance": {"Currency": "EUR", "Amount": 943191},
        },
        # second order
        {
            "Currency": "EUR",
            "Id": "buyer-wallet-1",
            "Description": "Default",
            "Balance": {"Currency": "EUR", "Amount": 0},
        },
        # final call to check if there's anything left in wallet
        {
            "Currency": "EUR",
            "Id": "buyer-wallet-1",
            "Description": "Default",
            "Balance": {"Currency": "EUR", "Amount": 0},
        },
    ]

    api_client.get(
        reverse("webhook"),
        data={"RessourceId": "payin-1", "EventType": "PAYIN_NORMAL_SUCCEEDED"},
    )

    order.refresh_from_db()
    assert order.is_paid
    assert not new_order.is_paid