def update_order_info(cls, cart, due, shipping_charges=0.0, applied_discount=0.0, shipment_info=NoDefault, bill=NoDefault, bill_info=NoDefault, notes=NoDefault, message=NoDefault, **details): cart.order_info.due = due cart.order_info.shipping_charges = shipping_charges cart.order_info.applied_discount = applied_discount cart.order_info.currencies = {'due': with_currency.float2cur(due), 'shipping_charges': with_currency.float2cur(shipping_charges), 'applied_discount': with_currency.float2cur(applied_discount)} if shipment_info is not NoDefault: cart.order_info.shipment_info.update(shipment_info) if bill is not NoDefault: cart.order_info.bill = bill if bill_info is not NoDefault: for k, v in bill_info.iteritems(): setattr(cart.order_info.bill_info, k, v) if notes is not NoDefault: cart.order_info.notes = notes if message is not NoDefault: cart.order_info.message = message if details is not {}: for k, v in details.iteritems(): setattr(cart.order_info.details, k, v)
def net_per_vat_rate(self): def _item_discount_fraction(item, total): discount_chunk = self.applied_discount / total return int(item.gross_price * discount_chunk * 100) mapping = {} sorted_items = sorted(self.items, key=lambda i: i['rate']) for k, g in groupby(sorted_items, key=lambda i: i['rate']): mapping[k] = sum(imap(lambda i: (with_currency.float2cur(i.gross_price) + _item_discount_fraction(i, self.gross_total)) * i.qty, g)) if self.currencies.due: # If we have currency values available, fix the rounding error current_total = sum(mapping.itervalues()) expected_total = self.currencies.due - self.currencies.shipping_charges delta = expected_total - current_total mapping[sorted_items[-1]['rate']] += delta # Convert everything back to floats for visualization for k, g in mapping.iteritems(): mapping[k] = with_currency.cur2float(g) return mapping