from flask import Flask from flask import request import json app = Flask(__name__) # Definition of invoice class class Invoice: def __init__(self, amount: float, department: str, _manager_approval_required: bool) -> None: self.amount = amount self.department = department self.manager_approval_required = _manager_approval_required # Definition of conditions to be used in the process_invoice function def invoice_amount_greater_than(self, threshold: float, onSuccess, onFailure): if self.amount > threshold: return onSuccess else: return onFailure def department_is(self, _department: str, onSuccess, onFailure): if self.department == _department: return onSuccess else: return onFailure def needs_manager_approval(self, onSuccess, onFailure): if self.manager_approval_required: return onSuccess else: return onFailure # Definition of actions to be used in the process_invoice function def send_for_approval_slack(self, approver: str) -> str: return f"Sending approval request to {approver} via Slack." def send_for_approval_email(self, approver: str) -> str: return f"Sending approval request to {approver} via email." def process_invoice(invoice: Invoice) -> str: # Workflow for processing the invoice result = invoice.invoice_amount_greater_than(10000, invoice.department_is("marketing", invoice.send_for_approval_email("CMO"), # amount > 10000 & department = marketing invoice.send_for_approval_slack("CFO") # amount > 10000 & department != marketing ), invoice.invoice_amount_greater_than(5000, invoice.needs_manager_approval( invoice.send_for_approval_email("Finance manager"), # amount < 10000 & amount > 5000 & requires_manager_approval = true invoice.send_for_approval_slack("Finance team member") # amount < 10000 & amount > 5000 & requires_manager_approval = false ), invoice.send_for_approval_slack("Finance team member") # amount < 10000 & amount < 5000 ) ) return result @app.route("/", methods=["POST"]) def receiveData(): data = request.data # Validate the data if not data: return "No data received" try: data_json = json.loads(data) amount = data_json["amount"] # Amount is received as a string, so converting it to float, e.g. '$ 23,000.20' -> 23000.20 amount = float(amount.replace('$', '').replace(',', '').replace(' ', '')) department = data_json["department"] manager_approval_required = data_json["managerApprovalRequired"] invoice = Invoice(amount, department, manager_approval_required) print("Data received:") print(f"Amount: {amount}, Department: {department}, Requires Manager Approval: {manager_approval_required}") print('Processing invoice...') result = process_invoice(invoice) print('Action:', result) # TODO: Save the invoice in the database jsonified = json.dumps({"result": result}) return jsonified except Exception as e: print("Error occurred:", e) return "Error occurred" # to test the code, the following curl command can be used # curl -X POST http://127.0.0.1:5000/ -H "Content-Type: application/json" -d '{"amount": 2000, "department": "marketing", "manager_approval_required": true}'