# app.py from flask import Flask, render_template, request, redirect, url_for, flash, send_file from flask_sqlalchemy import SQLAlchemy from reportlab.pdfgen import canvas import os app = Flask(__name__) app.secret_key = 'your_secret_key’ app.config[’SQLALCHEMY_DATABASE_URI’] = 'sqlite:///database.db’ app.config[’SQLALCHEMY_TRACK_MODIFICATIONS’] = False db = SQLAlchemy(app) # Models class Client(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100), nullable=False) email = db.Column(db.String(100), nullable=False) phone = db.Column(db.String(20), nullable=True) orders = db.relationship(’Order’, backref=’client’, lazy=True) class Accessory(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100), nullable=False) price = db.Column(db.Float, nullable=False) class Order(db.Model): id = db.Column(db.Integer, primary_key=True) client_id = db.Column(db.Integer, db.ForeignKey(’client.id’), nullable=False) accessories = db.relationship(’OrderAccessory’, backref=’order’, lazy=True) class OrderAccessory(db.Model): id = db.Column(db.Integer, primary_key=True) order_id = db.Column(db.Integer, db.ForeignKey(’order.id’), nullable=False) accessory_id = db.Column(db.Integer, db.ForeignKey(’accessory.id’), nullable=False) # Routes @app.route(’/’) def index(): clients = Client.query.all() accessories = Accessory.query.all() orders = Order.query.all() return render_template(’index.html’, clients=clients, accessories=accessories, orders=orders) @app.route(’/add_client’, methods=[’POST’]) def add_client(): name = request.form[’name’] email = request.form[’email’] phone = request.form[’phone’] new_client = Client(name=name, email=email, phone=phone) db.session.add(new_client) db.session.commit() flash(’Client added successfully!’, 'success’) return redirect(url_for(’index’)) @app.route(’/add_accessory’, methods=[’POST’]) def add_accessory(): name = request.form[’name’] price = request.form[’price’] new_accessory = Accessory(name=name, price=float(price)) db.session.add(new_accessory) db.session.commit() flash(’Accessory added successfully!’, 'success’) return redirect(url_for(’index’)) @app.route(’/create_order’, methods=[’POST’]) def create_order(): client_id = request.form[’client_id’] accessory_ids = request.form.getlist(’accessory_ids’) new_order = Order(client_id=client_id) db.session.add(new_order) db.session.commit() for accessory_id in accessory_ids: order_accessory = OrderAccessory(order_id=new_order.id, accessory_id=accessory_id) db.session.add(order_accessory) db.session.commit() flash(’Order created successfully!’, 'success’) return redirect(url_for(’index’)) @app.route(’/export_order/’) def export_order(order_id): order = Order.query.get_or_404(order_id) client = order.client accessories = [OrderAccessory.query.get(item.id).accessory_id for item in order.accessories] filename = f’order_{order_id}.pdf’ filepath = os.path.join(’exports’, filename) os.makedirs(’exports’, exist_ok=True) c = canvas.Canvas(filepath) c.drawString(100, 750, f’Order ID: {order.id}’) c.drawString(100, 730, f’Client: {client.name} – {client.email}’) y = 700 total = 0 for accessory in accessories: acc = Accessory.query.get(accessory) c.drawString(100, y, f'{acc.name} – ${acc.price}’) total += acc.price y -= 20 c.drawString(100, y – 20, f’Total: ${total}’) c.save() return send_file(filepath, as_attachment=True) if __name__ == '__main__’: db.create_all() app.run(debug=True)