def add_tip() -> Tuple[str, int]: parsed_data = get_json() order_id = cast(str, parsed_data.get("order_id")) tip_amount = cast(int, parsed_data.get("tip_amount")) # todo remove existing tip line item if exists default_order_core_service().add_tip( order_id=order_id, tip_amount=tip_amount, ) return json.dumps({"order_id": order_id}), HTTP_200_OK
def remove_line_item() -> Tuple[str, int]: parsed_data = get_json() order_id = parsed_data.get("order_id") inventory_item_id = cast(str, parsed_data.get("inventory_item_id")) order_id = default_order_core_service().remove_line_item( order_id=order_id, inventory_item_id=inventory_item_id, ) return json.dumps({"order_id": order_id}), HTTP_200_OK
def charge_order() -> Tuple[str, int]: parsed_data = get_json() order_id = cast(str, parsed_data.get("order_id")) payment_method_id = cast(str, parsed_data.get("payment_method_id")) if not order_id or not payment_method_id: return json.dumps({"error": "order | payment missing"}), HTTP_400_BAD_REQUEST total = default_order_core_service().calculate_order_total(order_id) if default_order_core_service().order_is_paid(order_id): default_order_core_service().send_email(order_id=order_id) return json.dumps({"success": True, "order_id": order_id}), HTTP_200_OK try: intent = stripe.PaymentIntent.create( amount=total, currency="usd", payment_method=payment_method_id, # A PaymentIntent can be confirmed some time after creation, # but here we want to confirm (collect payment) immediately. confirm=True, # If the payment requires any follow-up actions from the # customer, like two-factor authentication, Stripe will error # and you will need to prompt them for a new payment method. error_on_requires_action=True, ) if intent.status == "succeeded": # Handle post-payment fulfillment default_order_core_service().mark_order_as_paid( order_id=order_id, stripe_reference=intent.id, total=total, ) default_order_core_service().send_email(order_id=order_id) return json.dumps({ "success": True, "order_id": order_id }), HTTP_200_OK # Any other status would be unexpected, so error return ( json.dumps({"error": "Invalid PaymentIntent status"}), HTTP_500_INTERNAL_SERVER_ERROR, ) except stripe.error.CardError as e: # Display error on client return json.dumps({"error": e.user_message}), HTTP_200_OK except smtplib.SMTPSenderRefused as e: return ( json.dumps({ "error": "please try again", "message": e.smtp_error }), HTTP_200_OK, )
def get_customer_from_order() -> Tuple[str, int]: order_id = request.args.get("order_id") if not order_id: return "{}", HTTP_400_BAD_REQUEST order_id = cast(str, order_id) return ( json.dumps( default_order_core_service().get_customer_from_order( order_id=order_id), ), HTTP_200_OK, )
def add_customer_to_order() -> Tuple[str, int]: parsed_data = get_json() order_id = parsed_data.get("order_id") first_name = parsed_data.get("first_name") last_name = parsed_data.get("last_name") email = parsed_data.get("email") note = parsed_data.get("note") phone = parsed_data.get("phone") if not first_name or not last_name or not email or not phone: return json.dumps({"error": "required field missing"}), HTTP_400_BAD_REQUEST customer_id, order_id = default_order_core_service().add_customer_to_order( order_id=order_id, first_name=first_name, last_name=last_name, email=email, phone=phone, note=note, ) return json.dumps({ "customer_id": customer_id, "order_id": order_id }), HTTP_200_OK
def get_order_details() -> Tuple[str, int]: order_id = request.args.get("order_id") if not order_id: raise BadRequest details = default_order_core_service().get_order_details(order_id) return json.dumps(details), HTTP_200_OK
def calculate_order_total() -> Tuple[str, int]: parsed_data = get_json() order_id = cast(str, parsed_data.get("order_id")) total = default_order_core_service().calculate_order_total(order_id) return json.dumps({"order_total": total}), HTTP_200_OK