def _create_line_item_from_draft(
         self, draft: types.CartDraft,
         line_item_draft: types.LineItemDraft) -> types.LineItem:
     line_id = str(uuid.uuid4())
     price = 1000
     return types.LineItem(
         id=line_id,
         name=types.LocalizedString({"en": line_id}),
         price=types.Price(value=types.CentPrecisionMoney(
             currency_code=draft.currency, cent_amount=price)),
         taxed_price=types.TaxedItemPrice(
             total_net=types.CentPrecisionMoney(
                 currency_code=draft.currency,
                 cent_amount=price * (line_item_draft.quantity or 0),
                 fraction_digits=2,
             ),
             total_gross=types.CentPrecisionMoney(
                 currency_code=draft.currency,
                 cent_amount=price * (line_item_draft.quantity or 0),
                 fraction_digits=2,
             ),
         ),
         total_price=types.CentPrecisionMoney(
             currency_code=draft.currency,
             cent_amount=price * (line_item_draft.quantity or 0),
         ),
         quantity=line_item_draft.quantity,
         price_mode=types.LineItemPriceMode.PLATFORM,
         line_item_mode=types.LineItemMode.STANDARD,
         custom=utils.create_from_draft(line_item_draft.custom),
     )
    def updater(self, obj: dict, action: types.ProductSetPricesAction):
        new = copy.deepcopy(obj)
        target_obj = _get_target_obj(new, getattr(action, "staged", True))
        prices = []
        for price_draft in action.prices:
            price = types.Price(
                id=str(uuid.uuid4()),
                country=price_draft.country,
                channel=price_draft.channel,
                value=types.TypedMoney(
                    fraction_digits=2,
                    cent_amount=price_draft.value.cent_amount,
                    currency_code=price_draft.value.currency_code,
                    type=types.MoneyType.CENT_PRECISION,
                ),
                valid_from=price_draft.valid_from,
                valid_until=price_draft.valid_until,
                discounted=price_draft.discounted,
                custom=price_draft.custom,
                tiers=price_draft.tiers,
            )
            prices.append(price)

        schema = schemas.PriceSchema()
        for variant in get_product_variants(target_obj):
            if variant["sku"] == action.sku:
                variant["prices"] = schema.dump(prices, many=True)
        if action.staged:
            new["masterData"]["hasStagedChanges"] = True
        return new
    def _create_line_item_from_draft(
            self, draft: types.CartDraft,
            line_item_draft: types.LineItemDraft) -> types.LineItem:
        line_id = str(uuid.uuid4())
        price = 1000

        product_data = self._storage.get_by_resource_identifier(
            types.ProductResourceIdentifier(id=line_item_draft.product_id))
        product: types.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 types.LineItem(
            id=line_id,
            name=types.LocalizedString({"en": line_id}),
            product_id=line_item_draft.product_id,
            product_type=product.product_type,
            variant=variant,
            price=types.Price(
                id=str(uuid.uuid4()),
                value=types.CentPrecisionMoney(currency_code=draft.currency,
                                               cent_amount=price,
                                               fraction_digits=2),
            ),
            taxed_price=types.TaxedItemPrice(
                total_net=types.CentPrecisionMoney(
                    currency_code=draft.currency,
                    cent_amount=price * (line_item_draft.quantity or 0),
                    fraction_digits=2,
                ),
                total_gross=types.CentPrecisionMoney(
                    currency_code=draft.currency,
                    cent_amount=price * (line_item_draft.quantity or 0),
                    fraction_digits=2,
                ),
            ),
            total_price=types.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=types.LineItemPriceMode.PLATFORM,
            line_item_mode=types.LineItemMode.STANDARD,
            custom=utils.create_from_draft(line_item_draft.custom),
        )
예제 #4
0
def convert_draft_price(price_draft: types.PriceDraft,
                        price_id: str = None) -> types.Price:
    tiers: Optional[List[types.PriceTier]] = None
    if price_draft.tiers:
        tiers = [utils.create_from_draft(tier) for tier in price_draft.tiers]
    return types.Price(
        id=price_id or str(uuid.uuid4()),
        country=price_draft.country,
        channel=price_draft.channel,
        value=utils._money_to_typed(price_draft.value),
        valid_from=price_draft.valid_from,
        valid_until=price_draft.valid_until,
        discounted=price_draft.discounted,
        custom=utils.create_from_draft(price_draft.custom),
        tiers=tiers,
    )
예제 #5
0
 def _create_prices_from_draft(
     self, drafts: typing.List[types.PriceDraft]
 ) -> typing.List[types.Price]:
     prices: typing.List[types.Price] = []
     for draft in drafts:
         custom = None
         if draft.custom:
             custom = custom_fields_from_draft(self._storage, draft.custom)
         price = types.Price(
             value=draft.value,
             country=draft.country,
             customer_group=draft.customer_group,
             channel=draft.channel,
             valid_from=draft.valid_from,
             valid_until=draft.valid_until,
             discounted=None,
             custom=custom,
             tiers=draft.tiers,
         )
         prices.append(price)
     return prices
예제 #6
0
 def post_load(self, data, **kwargs):
     return types.Price(**data)
def get_test_order():
    order = types.Order(
        id="20ad6c92-fe04-4983-877e-5f5f80b5e37b",
        version=10,
        created_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=types.Money(cent_amount=2000, currency_code="GBP"),
        taxed_price=types.TaxedPrice(
            total_net=types.Money(cent_amount=1666, currency_code="GBP"),
            total_gross=types.Money(cent_amount=2000, currency_code="GBP"),
            tax_portions=[
                types.TaxPortion(
                    rate=0.2,
                    amount=types.Money(cent_amount=334, currency_code="GBP"),
                    name="GB",
                )
            ],
        ),
        country="GB",
        order_state=types.OrderState.OPEN,
        shipment_state=None,
        payment_state=types.PaymentState.PAID,
        shipping_info=types.ShippingInfo(
            shipping_method_name="Shipwire",
            price=types.TypedMoney(
                currency_code="GBP",
                cent_amount=1000,
                type=types.MoneyType.CENT_PRECISION,
                fraction_digits=2,
            ),
            shipping_rate=types.ShippingRate(
                price=types.TypedMoney(
                    currency_code="GBP",
                    cent_amount=1000,
                    type=types.MoneyType.CENT_PRECISION,
                    fraction_digits=2,
                ),
                free_above=types.TypedMoney(
                    currency_code="GBP",
                    cent_amount=5000,
                    type=types.MoneyType.CENT_PRECISION,
                    fraction_digits=2,
                ),
                tiers=[],
            ),
            tax_rate=types.TaxRate(
                name="GB",
                amount=0.2,
                included_in_price=False,
                country="GB",
                id="8olFiIwX",
            ),
            tax_category=types.TaxCategoryReference(
                type_id=types.ReferenceTypeId.TAX_CATEGORY,
                id="5e564356-d367-4718-a0bb-6a17c3b1fdeb",
            ),
            shipping_method=types.ShippingMethodReference(
                id="b0e88c41-8553-4904-a2d5-a096c5f6f09f"),
            taxed_price=types.TaxedItemPrice(
                total_net=types.TypedMoney(
                    cent_amount=833,
                    currency_code="GBP",
                    type=types.MoneyType.CENT_PRECISION,
                    fraction_digits=2,
                ),
                total_gross=types.TypedMoney(
                    cent_amount=1000,
                    currency_code="GBP",
                    type=types.MoneyType.CENT_PRECISION,
                    fraction_digits=2,
                ),
            ),
            shipping_method_state=types.ShippingMethodState.MATCHES_CART,
        ),
        tax_mode=types.TaxMode.PLATFORM,
        tax_rounding_mode=types.RoundingMode.HALF_EVEN,
        tax_calculation_mode=types.TaxCalculationMode.LINE_ITEM_LEVEL,
        origin=types.CartOrigin.CUSTOMER,
        line_items=[
            types.LineItem(
                id="4e7e38f2-45c1-4672-9c41-9c74dbd911bd",
                product_id="b32d3cfd-6920-4788-a5ee-c0bcfd460c0d",
                name=types.LocalizedString({"en": "FRUIT MIX STAGE 1"}),
                product_type=types.ProductTypeReference(
                    id="9faf6335-7618-4f8b-a11d-c0f832b733c1"),
                product_slug=types.LocalizedString({"en":
                                                    "fruit-mix-stage-1"}),
                variant=types.ProductVariant(
                    id=1,
                    sku="982218931672529",
                    prices=[
                        types.Price(
                            id="fb424988-79b3-4418-8730-9f324025a13c",
                            value=types.Money(cent_amount=1000,
                                              currency_code="GBP"),
                        )
                    ],
                ),
                price=types.Price(
                    id="fb424988-79b3-4418-8730-9f324025a13c",
                    value=types.Money(cent_amount=1000, currency_code="GBP"),
                ),
                quantity=1,
                tax_rate=types.TaxRate(
                    name="GB",
                    amount=0.19,
                    included_in_price=False,
                    country="GB",
                    id="7JkeuGwo",
                ),
                state=[
                    types.ItemState(
                        quantity=1,
                        state=types.StateReference(
                            id="0e59473e-1203-4135-8bcb-f1c5141ed5ad"),
                    )
                ],
                price_mode=types.LineItemPriceMode.PLATFORM,
                total_price=types.Money(cent_amount=1000, currency_code="GBP"),
                taxed_price=types.TaxedItemPrice(
                    total_net=types.TypedMoney(
                        cent_amount=1190,
                        currency_code="GBP",
                        type=types.MoneyType.CENT_PRECISION,
                        fraction_digits=2,
                    ),
                    total_gross=types.TypedMoney(
                        cent_amount=1190,
                        currency_code="GBP",
                        type=types.MoneyType.CENT_PRECISION,
                        fraction_digits=2,
                    ),
                ),
                line_item_mode=types.LineItemMode.STANDARD,
            )
        ],
        cart=types.CartReference(id="some cart id"),
        payment_info=types.PaymentInfo(payments=[
            types.PaymentReference(id="a433f3f8-5e27-406e-b2b0-d4a1f64592c4")
        ]),
        custom=types.CustomFields(
            fields=types.FieldContainer({
                "sentEmails": ["order_email_confirmed"],
                "shipwireServiceLevelCode": "GD",
            })),
        shipping_address=types.Address(
            first_name="David",
            last_name="Weterings",
            street_name="Kanaalweg",
            street_number="14",
            postal_code="3526KL",
            city="Utrecht",
            country="GB",
        ),
        billing_address=types.Address(
            first_name="David",
            last_name="Weterings",
            street_name="Kanaalweg",
            street_number="14",
            postal_code="3526KL",
            city="Utrecht",
            country="GB",
        ),
    )
    return order
 def post_load(self, data):
     return types.Price(**data)