def create_vouchers(): defaults = { "type_": VoucherTypeKinds.shipping.value, "title": "Free shipping", "discount_value_type": DiscountValueTypeKinds.percent.value, "discount_value": 100, } voucher, created = Voucher.get_or_create(code="FREESHIPPING", **defaults) if created: yield f"Voucher #{voucher.id}" else: yield "Shipping voucher already exists" defaults = { "type_": VoucherTypeKinds.value.value, "title": "Big order discount", "discount_value_type": DiscountValueTypeKinds.fixed.value, "discount_value": 25, "limit": 200, } voucher, created = Voucher.get_or_create(code="DISCOUNT", **defaults) if created: yield f"Voucher #{voucher.id}" else: yield "Value voucher already exists"
def voucher_manage(id=None): if id: voucher = Voucher.get_by_id(id) form = VoucherForm(obj=voucher) else: form = VoucherForm() if form.validate_on_submit(): if not id: voucher = Voucher() start_date, end_date = form.validity_period.data.split("-") voucher.start_date = datetime.strptime(start_date.strip(), "%m/%d/%Y") voucher.end_date = datetime.strptime(end_date.strip(), "%m/%d/%Y") del form.validity_period form.populate_obj(voucher) voucher.save() return redirect(url_for("dashboard.vouchers")) products = Product.query.all() categories = Category.query.all() voucher_types = [ dict(id=kind.value, title=kind.name) for kind in VoucherTypeKinds ] discount_types = [ dict(id=kind.value, title=kind.name) for kind in DiscountValueTypeKinds ] context = { "form": form, "products": products, "categories": categories, "voucher_types": voucher_types, "discount_types": discount_types, } return render_template("discount/voucher.html", **context)
def checkout_voucher(): voucher_form = VoucherForm(request.form) if voucher_form.validate_on_submit(): voucher = Voucher.get_by_code(voucher_form.code.data) cart = Cart.get_current_user_cart() err_msg = None if voucher: try: voucher.check_available(cart) except Exception as e: err_msg = str(e) else: err_msg = lazy_gettext("Your code is not correct") if err_msg: flash(err_msg, "warning") else: cart.voucher_code = voucher.code cart.save() return redirect(url_for("checkout.checkout_note"))
def create_whole_order(cls, cart, note=None): # Step1, certify stock, voucher to_update_variants = [] to_update_orderlines = [] total_net = 0 for line in cart.lines: variant = ProductVariant.get_by_id(line.variant.id) result, msg = variant.check_enough_stock(line.quantity) if result is False: return result, msg variant.quantity_allocated += line.quantity to_update_variants.append(variant) orderline = OrderLine( variant_id=variant.id, quantity=line.quantity, product_name=variant.display_product(), product_sku=variant.sku, product_id=variant.sku.split("-")[0], unit_price_net=variant.price, is_shipping_required=variant.is_shipping_required, ) to_update_orderlines.append(orderline) total_net += orderline.get_total() voucher = None if cart.voucher_code: voucher = Voucher.get_by_code(cart.voucher_code) try: voucher.check_available(cart) except Exception as e: return False, str(e) # Step2, create Order obj try: shipping_method_id = None shipping_method_title = None shipping_method_price = 0 shipping_address = None if cart.shipping_method_id: shipping_method = ShippingMethod.get_by_id( cart.shipping_method_id) shipping_method_id = shipping_method.id shipping_method_title = shipping_method.title shipping_method_price = shipping_method.price shipping_address = UserAddress.get_by_id( cart.shipping_address_id).full_address order = cls.create( user_id=current_user.id, token=str(uuid4()), shipping_method_id=shipping_method_id, shipping_method_name=shipping_method_title, shipping_price_net=shipping_method_price, shipping_address=shipping_address, status=OrderStatusKinds.unfulfilled.value, total_net=total_net, ) except Exception as e: return False, str(e) # Step3, process others if note: order_note = OrderNote(order_id=order.id, user_id=current_user.id, content=note) db.session.add(order_note) if voucher: order.voucher_id = voucher.id order.discount_amount = voucher.get_vouchered_price(cart) order.discount_name = voucher.title voucher.used += 1 db.session.add(order) db.session.add(voucher) for variant in to_update_variants: db.session.add(variant) for orderline in to_update_orderlines: orderline.order_id = order.id db.session.add(orderline) for line in cart.lines: db.session.delete(line) db.session.delete(cart) db.session.commit() return order, "success"
def voucher(self): if self.voucher_code: return Voucher.get_by_code(self.voucher_code) return None