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