def _create_price_from_draft(
        self, draft: Union[models.Money, Optional[models.TypedMoneyDraft]]
    ) -> Optional[models.TypedMoney]:
        if draft is None:
            return None

        if isinstance(draft, models.CentPrecisionMoneyDraft):
            return models.CentPrecisionMoney(cent_amount=draft.cent_amount,
                                             currency_code=draft.currency_code)
        elif isinstance(draft, models.HighPrecisionMoneyDraft):
            return models.HighPrecisionMoney(
                cent_amount=draft.cent_amount,
                currency_code=draft.currency_code,
                precise_amount=draft.precise_amount,
            )
        elif isinstance(draft, models.Money):
            return models.CentPrecisionMoney(
                cent_amount=draft.cent_amount,
                currency_code=draft.currency_code,
                fraction_digits=2,
            )
        else:
            return models.TypedMoney(
                cent_amount=draft.cent_amount,
                currency_code=draft.currency_code,
                type=draft.type,
            )
    def _create_line_item_from_draft(
            self, draft: models.CartDraft,
            line_item_draft: models.LineItemDraft) -> models.LineItem:
        line_id = str(uuid.uuid4())
        price = 1000

        product_data = self._storage.get_by_resource_identifier(
            models.ProductResourceIdentifier(id=line_item_draft.product_id))
        product: models.Product = ProductSchema().load(product_data)

        variant = None
        for v in product.master_data.current.variants:
            if v.id == line_item_draft.variant_id:
                variant = v

        return models.LineItem(
            id=line_id,
            name=models.LocalizedString({"en": line_id}),
            product_id=line_item_draft.product_id,
            product_type=product.product_type,
            variant=variant,
            price=models.Price(
                id=str(uuid.uuid4()),
                value=models.CentPrecisionMoney(currency_code=draft.currency,
                                                cent_amount=price,
                                                fraction_digits=2),
            ),
            taxed_price=models.TaxedItemPrice(
                total_net=models.CentPrecisionMoney(
                    currency_code=draft.currency,
                    cent_amount=price * (line_item_draft.quantity or 0),
                    fraction_digits=2,
                ),
                total_gross=models.CentPrecisionMoney(
                    currency_code=draft.currency,
                    cent_amount=price * (line_item_draft.quantity or 0),
                    fraction_digits=2,
                ),
            ),
            total_price=models.CentPrecisionMoney(
                currency_code=draft.currency,
                cent_amount=price * (line_item_draft.quantity or 0),
                fraction_digits=2,
            ),
            quantity=line_item_draft.quantity,
            discounted_price_per_quantity=[],
            state=[],
            price_mode=models.LineItemPriceMode.PLATFORM,
            line_item_mode=models.LineItemMode.STANDARD,
            custom=utils.create_from_draft(line_item_draft.custom),
        )
Exemple #3
0
    def updater(self, obj, action):
        parcels: typing.List[models.ParcelDraft] = getattr(action, "parcels")
        delivery = models.Delivery(
            id=str(uuid.uuid4()),
            created_at=datetime.datetime.now(datetime.timezone.utc),
            items=[],
            parcels=[
                models.Parcel(
                    id=str(uuid.uuid4()),
                    created_at=datetime.datetime.now(datetime.timezone.utc),
                    measurements=parcel_draft.measurements,
                    tracking_data=parcel_draft.tracking_data,
                    items=parcel_draft.items,
                )
                for parcel_draft in parcels
            ],
        )

        if not obj["shippingInfo"]:
            obj["shippingInfo"] = ShippingInfoSchema().dump(
                models.ShippingInfo(
                    shipping_method_name="dummy",
                    price=models.CentPrecisionMoney(
                        fraction_digits=0, cent_amount=0, currency_code="EUR"
                    ),
                    shipping_rate=models.ShippingRate(
                        price=models.CentPrecisionMoney(
                            fraction_digits=0, cent_amount=0, currency_code="EUR"
                        ),
                        tiers=[],
                    ),
                    shipping_method_state=models.ShippingMethodState(value=None),
                    deliveries=[],
                )
            )
        elif not obj["shippingInfo"].get("deliveries"):
            obj["shippingInfo"]["deliveries"] = []

        value = DeliverySchema().dump(delivery)
        if value not in obj["shippingInfo"]["deliveries"]:
            new = copy.deepcopy(obj)
            new["shippingInfo"]["deliveries"].append(value)
            return new
        return obj
Exemple #4
0
def create_shipping_rate_from_draft(
    draft: models.ShippingRateDraft, ) -> models.ShippingRate:
    free_above = None
    if draft.free_above:
        free_above = models.CentPrecisionMoney(
            cent_amount=draft.free_above.cent_amount,
            currency_code=draft.free_above.currency_code,
            fraction_digits=2,
        )
    shipping_rate = models.ShippingRate(
        price=models.CentPrecisionMoney(
            cent_amount=draft.price.cent_amount,
            currency_code=draft.price.currency_code,
            fraction_digits=2,
        ),
        free_above=free_above,
        tiers=draft.tiers if draft.tiers else [],
    )
    return shipping_rate
    def _create_from_draft(self,
                           draft: models.CartDraft,
                           id: typing.Optional[str] = None) -> models.Cart:
        object_id = str(uuid.UUID(id) if id is not None else uuid.uuid4())
        if draft.line_items:
            line_items = [
                self._create_line_item_from_draft(draft, line_item)
                for line_item in draft.line_items
            ]
        else:
            line_items = []

        total_price = None
        taxed_price = None

        if line_items:
            total_price = models.CentPrecisionMoney(
                currency_code=draft.currency,
                cent_amount=sum(line_item.taxed_price.total_gross.cent_amount
                                for line_item in line_items
                                if line_item.taxed_price
                                and line_item.taxed_price.total_gross),
                fraction_digits=2,
            )
            taxed_price = models.TaxedPrice(
                total_net=models.CentPrecisionMoney(
                    currency_code=draft.currency,
                    cent_amount=sum(line_item.taxed_price.total_net.cent_amount
                                    for line_item in line_items
                                    if line_item.taxed_price
                                    and line_item.taxed_price.total_net),
                    fraction_digits=2,
                ),
                total_gross=models.CentPrecisionMoney(
                    currency_code=draft.currency,
                    cent_amount=sum(
                        line_item.taxed_price.total_gross.cent_amount
                        for line_item in line_items if line_item.taxed_price
                        and line_item.taxed_price.total_gross),
                    fraction_digits=2,
                ),
                tax_portions=[
                    models.TaxPortion(
                        name="0% VAT",
                        rate=0,
                        amount=models.CentPrecisionMoney(
                            currency_code=draft.currency,
                            cent_amount=0,
                            fraction_digits=2,
                        ),
                    )
                ],
            )

        # Some fields such as itemShippingAddresses are currently missing. See
        # https://docs.commercetools.com/http-api-projects-carts for a complete overview
        return models.Cart(
            id=str(object_id),
            key=None,
            version=1,
            cart_state=models.CartState.ACTIVE,
            customer_id=draft.customer_id,
            customer_email=draft.customer_email,
            customer_group=draft.customer_group,
            anonymous_id=draft.anonymous_id,
            country=draft.country,
            inventory_mode=draft.inventory_mode,
            tax_mode=draft.tax_mode or models.TaxMode.PLATFORM,
            tax_rounding_mode=draft.tax_rounding_mode
            or models.RoundingMode.HALF_EVEN,
            tax_calculation_mode=draft.tax_calculation_mode
            or models.TaxCalculationMode.LINE_ITEM_LEVEL,
            line_items=line_items,
            custom_line_items=[],
            refused_gifts=[],
            shipping_address=draft.shipping_address,
            billing_address=draft.billing_address,
            locale=draft.locale,
            origin=draft.origin or models.CartOrigin.CUSTOMER,
            created_at=datetime.datetime.now(datetime.timezone.utc),
            last_modified_at=datetime.datetime.now(datetime.timezone.utc),
            custom=utils.create_from_draft(draft.custom),
            total_price=total_price,
            taxed_price=taxed_price,
        )
def get_test_order():
    order = models.Order(
        id="20ad6c92-fe04-4983-877e-5f5f80b5e37b",
        version=10,
        created_at=datetime.datetime.now(datetime.timezone.utc),
        last_modified_at=datetime.datetime.now(datetime.timezone.utc),
        last_message_sequence_number=8,
        order_number="test-number",
        customer_email="*****@*****.**",
        anonymous_id="a706a9bf-4cd5-4bd0-b35d-b2373fb0c15e",
        locale="en",
        total_price=models.CentPrecisionMoney(cent_amount=2000,
                                              currency_code="GBP",
                                              fraction_digits=2),
        taxed_price=models.TaxedPrice(
            total_net=models.CentPrecisionMoney(cent_amount=1666,
                                                currency_code="GBP",
                                                fraction_digits=2),
            total_gross=models.CentPrecisionMoney(cent_amount=2000,
                                                  currency_code="GBP",
                                                  fraction_digits=2),
            tax_portions=[
                models.TaxPortion(
                    rate=0.2,
                    amount=models.CentPrecisionMoney(cent_amount=334,
                                                     currency_code="GBP",
                                                     fraction_digits=2),
                    name="GB",
                )
            ],
        ),
        country="GB",
        order_state=models.OrderState.OPEN,
        shipment_state=None,
        payment_state=models.PaymentState.PAID,
        shipping_info=models.ShippingInfo(
            shipping_method_name="Shipwire",
            price=models.CentPrecisionMoney(currency_code="GBP",
                                            cent_amount=1000,
                                            fraction_digits=2),
            shipping_rate=models.ShippingRate(
                price=models.CentPrecisionMoney(currency_code="GBP",
                                                cent_amount=1000,
                                                fraction_digits=2),
                free_above=models.CentPrecisionMoney(currency_code="GBP",
                                                     cent_amount=5000,
                                                     fraction_digits=2),
                tiers=[],
            ),
            tax_rate=models.TaxRate(
                name="GB",
                amount=0.2,
                included_in_price=False,
                country="GB",
                id="8olFiIwX",
            ),
            tax_category=models.TaxCategoryReference(
                id="5e564356-d367-4718-a0bb-6a17c3b1fdeb"),
            shipping_method=models.ShippingMethodReference(
                id="b0e88c41-8553-4904-a2d5-a096c5f6f09f"),
            taxed_price=models.TaxedItemPrice(
                total_net=models.CentPrecisionMoney(cent_amount=833,
                                                    currency_code="GBP",
                                                    fraction_digits=2),
                total_gross=models.CentPrecisionMoney(cent_amount=1000,
                                                      currency_code="GBP",
                                                      fraction_digits=2),
            ),
            shipping_method_state=models.ShippingMethodState.MATCHES_CART,
        ),
        tax_mode=models.TaxMode.PLATFORM,
        tax_rounding_mode=models.RoundingMode.HALF_EVEN,
        tax_calculation_mode=models.TaxCalculationMode.LINE_ITEM_LEVEL,
        origin=models.CartOrigin.CUSTOMER,
        line_items=[
            models.LineItem(
                id="4e7e38f2-45c1-4672-9c41-9c74dbd911bd",
                product_id="b32d3cfd-6920-4788-a5ee-c0bcfd460c0d",
                name=models.LocalizedString({"en": "FRUIT MIX STAGE 1"}),
                product_type=models.ProductTypeReference(
                    id="9faf6335-7618-4f8b-a11d-c0f832b733c1"),
                product_slug=models.LocalizedString(
                    {"en": "fruit-mix-stage-1"}),
                variant=models.ProductVariant(
                    id=1,
                    sku="982218931672529",
                    prices=[
                        models.Price(
                            id="fb424988-79b3-4418-8730-9f324025a13c",
                            value=models.CentPrecisionMoney(
                                cent_amount=1000,
                                currency_code="GBP",
                                fraction_digits=2),
                        )
                    ],
                ),
                price=models.Price(
                    id="fb424988-79b3-4418-8730-9f324025a13c",
                    value=models.CentPrecisionMoney(cent_amount=1000,
                                                    currency_code="GBP",
                                                    fraction_digits=2),
                ),
                quantity=1,
                tax_rate=models.TaxRate(
                    name="GB",
                    amount=0.19,
                    included_in_price=False,
                    country="GB",
                    id="7JkeuGwo",
                ),
                state=[
                    models.ItemState(
                        quantity=1,
                        state=models.StateReference(
                            id="0e59473e-1203-4135-8bcb-f1c5141ed5ad"),
                    )
                ],
                discounted_price_per_quantity=[],
                price_mode=models.LineItemPriceMode.PLATFORM,
                total_price=models.CentPrecisionMoney(cent_amount=1000,
                                                      currency_code="GBP",
                                                      fraction_digits=2),
                taxed_price=models.TaxedItemPrice(
                    total_net=models.CentPrecisionMoney(cent_amount=1190,
                                                        currency_code="GBP",
                                                        fraction_digits=2),
                    total_gross=models.CentPrecisionMoney(cent_amount=1190,
                                                          currency_code="GBP",
                                                          fraction_digits=2),
                ),
                line_item_mode=models.LineItemMode.STANDARD,
            )
        ],
        custom_line_items=[],
        cart=models.CartReference(id="some cart id"),
        payment_info=models.PaymentInfo(payments=[
            models.PaymentReference(id="a433f3f8-5e27-406e-b2b0-d4a1f64592c4")
        ]),
        custom=models.CustomFields(
            type=models.TypeReference(id="dummy"),
            fields=models.FieldContainer({
                "sentEmails": ["order_email_confirmed"],
                "shipwireServiceLevelCode":
                "GD",
            }),
        ),
        shipping_address=models.Address(
            first_name="David",
            last_name="Weterings",
            street_name="Kanaalweg",
            street_number="14",
            postal_code="3526KL",
            city="Utrecht",
            country="GB",
        ),
        billing_address=models.Address(
            first_name="David",
            last_name="Weterings",
            street_name="Kanaalweg",
            street_number="14",
            postal_code="3526KL",
            city="Utrecht",
            country="GB",
        ),
        sync_info=[],
        refused_gifts=[],
    )
    return order