def create_bookings(self, order): ret = list() cart_data = get_data_provider(self.context) for uid, count, comment in self.items: booking = self.create_booking( order, cart_data, uid, count, comment) if booking: ret.append(booking) return ret
def create_bookings(self, order): ret = list() cart_data = get_data_provider(self.context) for uid, count, comment in self.items: booking = self.create_booking(order, cart_data, uid, count, comment) if booking: ret.append(booking) return ret
def net(self, items): settings = get_shop_shipping_settings() cart_data = get_data_provider(self.context) shipping_limit_from_gross = settings.shipping_limit_from_gross free_shipping_limit = Decimal(str(settings.free_shipping_limit)) purchase_price = Decimal(0) # calculate shipping from gross if shipping_limit_from_gross: purchase_price += cart_data.net(items) + cart_data.vat(items) # calculate shipping from net else: purchase_price += cart_data.net(items) # purchase price exceeds free shipping limit, no shipping costs if free_shipping_limit and purchase_price > free_shipping_limit: return Decimal(0) flat_shipping_cost = Decimal(str(settings.flat_shipping_cost)) item_shipping_cost = Decimal(str(settings.item_shipping_cost)) # flag whether all items have free shipping flag set all_items_free_shipping = True shipping_costs = Decimal(0) # item shipping costs set, calculate for contained cart items if item_shipping_cost > Decimal(0): for item in items: # ignore item if not shippable if not cart_item_shippable(self.context, item): continue # ignore item if free shipping set if cart_item_free_shipping(self.context, item): continue # as soon as one item in cart has no free shipping, # all_items_free_shipping is False all_items_free_shipping = False shipping_costs += item_shipping_cost * item[1] # calculate flat shipping costs anyway if no item shipping costs else: all_items_free_shipping = False # consider flat shipping cost if set, gets ignored if all items # have free shipping set if flat_shipping_cost and not all_items_free_shipping: # item shipping costs exceed flat shipping costs if shipping_costs > flat_shipping_cost: return shipping_costs # flat shipping costs apply return Decimal(flat_shipping_cost) # return calculated shipping costs return shipping_costs
def save(self, providers, widget, data): super(OrderCheckoutAdapter, self).save(providers, widget, data) creator = None member = plone.api.user.get_current() if member: creator = member.getId() created = datetime.datetime.now() order = self.order # XXX: payment name # payment type # payment total # shipping name # shipping vat sid = data.fetch('checkout.shipping_selection.shipping').extracted shipping = Shippings(self.context).get(sid) order.attrs['shipping'] = shipping.calculate(self.items) uid = order.attrs['uid'] = uuid.uuid4() order.attrs['creator'] = creator order.attrs['created'] = created bookings = self.create_bookings(order) booking_uids = list() vendor_uids = set() for booking in bookings: booking_uids.append(booking.attrs['uid']) vendor_uids.add(booking.attrs['vendor_uid']) order.attrs['booking_uids'] = booking_uids order.attrs['vendor_uids'] = list(vendor_uids) cart_data = get_data_provider(self.context) cart_discount = cart_data.discount(self.items) order.attrs['cart_discount_net'] = cart_discount['net'] order.attrs['cart_discount_vat'] = cart_discount['vat'] orders_soup = get_orders_soup(self.context) ordernumber = create_ordernumber() while self.ordernumber_exists(orders_soup, ordernumber): ordernumber = create_ordernumber() order.attrs['ordernumber'] = ordernumber orders_soup.add(order) bookings_soup = get_bookings_soup(self.context) for booking in bookings: bookings_soup.add(booking) return uid
def _cart_data(self): return get_data_provider(self.context, self.request)
def save(self, providers, widget, data): super(OrderCheckoutAdapter, self).save(providers, widget, data) order = self.order # order UUID uid = order.attrs['uid'] = uuid.uuid4() # order creator creator = None member = plone.api.user.get_current() if member: creator = member.getId() order.attrs['creator'] = creator # order creation date created = datetime.datetime.now() order.attrs['created'] = created cart_data = get_data_provider(self.context, self.request) # payment related information if cart_data.total > Decimal(0): payment_param = 'checkout.payment_selection.payment' pid = data.fetch(payment_param).extracted payment = Payments(self.context).get(pid) order.attrs['payment_method'] = pid if payment: order.attrs['payment_label'] = payment.label else: order.attrs['payment_label'] = _('unknown', default=u'Unknown') # no payment else: order.attrs['payment_method'] = 'no_payment' order.attrs['payment_label'] = _('no_payment', default=u'No Payment') # shipping related information if cart_data.include_shipping_costs: shipping_param = 'checkout.shipping_selection.shipping' sid = data.fetch(shipping_param).extracted shipping = Shippings(self.context).get(sid) order.attrs['shipping_method'] = sid order.attrs['shipping_label'] = shipping.label order.attrs['shipping_description'] = shipping.description try: shipping_net = shipping.net(self.items) shipping_vat = shipping.vat(self.items) order.attrs['shipping_net'] = shipping_net order.attrs['shipping_vat'] = shipping_vat order.attrs['shipping'] = shipping_net + shipping_vat # B/C for bda.plone.shipping < 0.4 except NotImplementedError: shipping_net = shipping.calculate(self.items) order.attrs['shipping_net'] = shipping_net order.attrs['shipping_vat'] = Decimal(0) order.attrs['shipping'] = shipping_net # no shipping else: order.attrs['shipping_method'] = 'no_shipping' order.attrs['shipping_label'] = _('no_shipping', default=u'No Shipping') order.attrs['shipping_description'] = '' order.attrs['shipping_net'] = Decimal(0) order.attrs['shipping_vat'] = Decimal(0) order.attrs['shipping'] = Decimal(0) # create order bookings bookings = self.create_bookings(order) # set order state, needed for sorting in orders table order.attrs['state'] = calculate_order_state(bookings) # set order salaried, needed for sorting in orders table order.attrs['salaried'] = ifaces.SALARIED_NO # lookup booking uids, buyable uids and vendor uids booking_uids = list() buyable_uids = list() vendor_uids = set() for booking in bookings: booking_uids.append(booking.attrs['uid']) buyable_uids.append(booking.attrs['buyable_uid']) vendor_uids.add(booking.attrs['vendor_uid']) order.attrs['booking_uids'] = booking_uids order.attrs['buyable_uids'] = buyable_uids order.attrs['vendor_uids'] = list(vendor_uids) # cart discount related information # XXX: in order to be able to reliably modify orders, cart discount # rules for this order must be stored instead of the actual # calculated discount. cart_discount = cart_data.discount(self.items) order.attrs['cart_discount_net'] = cart_discount['net'] order.attrs['cart_discount_vat'] = cart_discount['vat'] # create ordernumber orders_soup = get_orders_soup(self.context) ordernumber = create_ordernumber() while self.ordernumber_exists(orders_soup, ordernumber): ordernumber = create_ordernumber() order.attrs['ordernumber'] = ordernumber # add order orders_soup.add(order) # add bookings bookings_soup = get_bookings_soup(self.context) # list containing items where stock threshold has been reached stock_threshold_reached_items = list() for booking in bookings: bookings_soup.add(booking) buyable = get_object_by_uid( self.context, booking.attrs['buyable_uid'] ) item_stock = get_item_stock(buyable) # no stock applied if item_stock is None: stock_warning_threshold = None else: stock_warning_threshold = item_stock.stock_warning_threshold if stock_warning_threshold: remaining = booking.attrs['remaining_stock_available'] # stock threshold has been reached if remaining <= stock_warning_threshold: stock_threshold_reached_items.append(booking.attrs) if stock_threshold_reached_items: event = events.StockThresholdReached( self.context, self.request, order.attrs['uid'], stock_threshold_reached_items, ) notify(event) # return uid of added order return uid
def skip(self): cart_data = get_data_provider(self.context, self.request) return not cart_data.total
def skip(self): cart_data = get_data_provider(self.context, self.request) return not cart_data.include_shipping_costs
def data_provider(self): return get_data_provider(self.context, self.request)
def calculate(self, items): cart_data = get_data_provider(self.context) limit = FREE_SHIPPING_LIMIT if cart_data.net(items) + cart_data.vat(items) > Decimal(limit): return Decimal(0) return Decimal(FLAT_SHIPPING_COST)
def currency(self): return get_data_provider(self.context).currency
def save(self, providers, widget, data): super(OrderCheckoutAdapter, self).save(providers, widget, data) order = self.order # order UUID uid = order.attrs['uid'] = uuid.uuid4() # order creator creator = None member = plone.api.user.get_current() if member: creator = member.getId() order.attrs['creator'] = creator # order creation date created = datetime.datetime.now() order.attrs['created'] = created cart_data = get_data_provider(self.context, self.request) # payment related information if cart_data.total > Decimal(0): payment_param = 'checkout.payment_selection.payment' pid = data.fetch(payment_param).extracted payment = Payments(self.context).get(pid) order.attrs['payment_method'] = pid if payment: order.attrs['payment_label'] = payment.label else: order.attrs['payment_label'] = _('unknown', default=u'Unknown') # no payment else: order.attrs['payment_method'] = 'no_payment' order.attrs['payment_label'] = _('no_payment', default=u'No Payment') # shipping related information if cart_data.include_shipping_costs: shipping_param = 'checkout.shipping_selection.shipping' sid = data.fetch(shipping_param).extracted shipping = Shippings(self.context).get(sid) order.attrs['shipping_method'] = sid order.attrs['shipping_label'] = shipping.label order.attrs['shipping_description'] = shipping.description try: shipping_net = shipping.net(self.items) shipping_vat = shipping.vat(self.items) order.attrs['shipping_net'] = shipping_net order.attrs['shipping_vat'] = shipping_vat order.attrs['shipping'] = shipping_net + shipping_vat # B/C for bda.plone.shipping < 0.4 except NotImplementedError: shipping_net = shipping.calculate(self.items) order.attrs['shipping_net'] = shipping_net order.attrs['shipping_vat'] = Decimal(0) order.attrs['shipping'] = shipping_net # no shipping else: order.attrs['shipping_method'] = 'no_shipping' order.attrs['shipping_label'] = _('no_shipping', default=u'No Shipping') order.attrs['shipping_description'] = '' order.attrs['shipping_net'] = Decimal(0) order.attrs['shipping_vat'] = Decimal(0) order.attrs['shipping'] = Decimal(0) # create order bookings bookings = self.create_bookings(order) # set order state, needed for sorting in orders table order.attrs['state'] = calculate_order_state(bookings) # set order salaried, needed for sorting in orders table order.attrs['salaried'] = ifaces.SALARIED_NO # lookup booking uids, buyable uids and vendor uids booking_uids = list() buyable_uids = list() vendor_uids = set() for booking in bookings: booking_uids.append(booking.attrs['uid']) buyable_uids.append(booking.attrs['buyable_uid']) vendor_uids.add(booking.attrs['vendor_uid']) order.attrs['booking_uids'] = booking_uids order.attrs['buyable_uids'] = buyable_uids order.attrs['vendor_uids'] = list(vendor_uids) # cart discount related information cart_discount = cart_data.discount(self.items) order.attrs['cart_discount_net'] = cart_discount['net'] order.attrs['cart_discount_vat'] = cart_discount['vat'] # create ordernumber orders_soup = get_orders_soup(self.context) ordernumber = create_ordernumber() while self.ordernumber_exists(orders_soup, ordernumber): ordernumber = create_ordernumber() order.attrs['ordernumber'] = ordernumber # add order orders_soup.add(order) # add bookings bookings_soup = get_bookings_soup(self.context) # list containing items where stock threshold has been reached stock_threshold_reached_items = list() for booking in bookings: bookings_soup.add(booking) buyable = get_object_by_uid(self.context, booking.attrs['buyable_uid']) item_stock = get_item_stock(buyable) # no stock applied if item_stock is None: stock_warning_threshold = None else: stock_warning_threshold = item_stock.stock_warning_threshold if stock_warning_threshold: remaining = booking.attrs['remaining_stock_available'] # stock threshold has been reached if remaining <= stock_warning_threshold: stock_threshold_reached_items.append(booking.attrs) if stock_threshold_reached_items: event = events.StockThresholdReached( self.context, self.request, order.attrs['uid'], stock_threshold_reached_items, ) notify(event) # return uid of added order return uid
def save(self, providers, widget, data): super(OrderCheckoutAdapter, self).save(providers, widget, data) order = self.order # order UUID uid = order.attrs['uid'] = uuid.uuid4() # order creator creator = None member = plone.api.user.get_current() if member: creator = member.getId() order.attrs['creator'] = creator # order creation date created = datetime.datetime.now() order.attrs['created'] = created cart_data = get_data_provider(self.context, self.request) # payment related information if cart_data.total > Decimal(0): payment_param = 'checkout.payment_selection.payment' pid = data.fetch(payment_param).extracted payment = Payments(self.context).get(pid) order.attrs['payment_method'] = pid if payment: order.attrs['payment_label'] = payment.label else: order.attrs['payment_label'] = _('unknown', default=u'Unknown') # no payment else: order.attrs['payment_method'] = 'no_payment' order.attrs['payment_label'] = _('no_payment', default=u'No Payment') # shipping related information if cart_data.include_shipping_costs: shipping_param = 'checkout.shipping_selection.shipping' sid = data.fetch(shipping_param).extracted shipping = Shippings(self.context).get(sid) order.attrs['shipping_method'] = sid order.attrs['shipping_label'] = shipping.label order.attrs['shipping_description'] = shipping.description try: shipping_net = shipping.net(self.items) shipping_vat = shipping.vat(self.items) order.attrs['shipping_net'] = shipping_net order.attrs['shipping_vat'] = shipping_vat order.attrs['shipping'] = shipping_net + shipping_vat # B/C for bda.plone.shipping < 0.4 except NotImplementedError: shipping_net = shipping.calculate(self.items) order.attrs['shipping_net'] = shipping_net order.attrs['shipping_vat'] = Decimal(0) order.attrs['shipping'] = shipping_net # no shipping else: order.attrs['shipping_method'] = 'no_shipping' order.attrs['shipping_label'] = _('no_shipping', default=u'No Shipping') order.attrs['shipping_description'] = '' order.attrs['shipping_net'] = Decimal(0) order.attrs['shipping_vat'] = Decimal(0) order.attrs['shipping'] = Decimal(0) # create order bookings bookings = self.create_bookings(order) # lookup booking uids, buyable uids and vendor uids booking_uids = list() buyable_uids = list() vendor_uids = set() for booking in bookings: booking_uids.append(booking.attrs['uid']) buyable_uids.append(booking.attrs['buyable_uid']) vendor_uids.add(booking.attrs['vendor_uid']) order.attrs['booking_uids'] = booking_uids order.attrs['buyable_uids'] = buyable_uids order.attrs['vendor_uids'] = list(vendor_uids) # cart discount related information cart_discount = cart_data.discount(self.items) order.attrs['cart_discount_net'] = cart_discount['net'] order.attrs['cart_discount_vat'] = cart_discount['vat'] # create ordernumber orders_soup = get_orders_soup(self.context) ordernumber = create_ordernumber() while self.ordernumber_exists(orders_soup, ordernumber): ordernumber = create_ordernumber() order.attrs['ordernumber'] = ordernumber order.attrs['state'] = ifaces.STATE_NEW order.attrs['salaried'] = ifaces.SALARIED_NO # add order orders_soup.add(order) # add bookings bookings_soup = get_bookings_soup(self.context) for booking in bookings: bookings_soup.add(booking) # return uid of added order return uid