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), )
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, )
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
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)