bb / app.py
iamironman4279's picture
Upload 24 files
a6ebfad verified
raw
history blame
5.45 kB
from flask import Flask, render_template, request, redirect, url_for, send_file, flash
import sqlite3
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
import io
from datetime import datetime
app = Flask(__name__)
app.secret_key = 'your_secret_key' # Needed for flashing messages
def init_db():
conn = sqlite3.connect('pycash.db')
c = conn.cursor()
c.execute('''
CREATE TABLE IF NOT EXISTS transactions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
type TEXT,
amount REAL,
recipient TEXT,
date TEXT,
memo TEXT
)
''')
c.execute('''
CREATE TABLE IF NOT EXISTS balance (
id INTEGER PRIMARY KEY,
total REAL
)
''')
c.execute('SELECT COUNT(*) FROM balance')
if c.fetchone()[0] == 0:
c.execute('INSERT INTO balance (id, total) VALUES (1, 0)')
conn.commit()
conn.close()
init_db()
def update_balance(amount, operation):
conn = sqlite3.connect('pycash.db')
c = conn.cursor()
c.execute('SELECT total FROM balance WHERE id = 1')
current_balance = c.fetchone()[0]
new_balance = current_balance + amount if operation == 'deposit' else current_balance - amount
c.execute('UPDATE balance SET total = ? WHERE id = 1', (new_balance,))
conn.commit()
conn.close()
@app.route('/')
def index():
return render_template('index.html')
@app.route('/add_payment', methods=['GET', 'POST'])
def add_payment():
if request.method == 'POST':
amount = float(request.form['dollars'])
payment_to = request.form['paymentTo']
date = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
memo = request.form.get('memo', '')
conn = sqlite3.connect('pycash.db')
c = conn.cursor()
c.execute('SELECT total FROM balance WHERE id = 1')
current_balance = c.fetchone()[0]
if amount > current_balance:
flash('Insufficient funds!')
return redirect(url_for('add_payment'))
c.execute('''
INSERT INTO transactions (type, amount, recipient, date, memo)
VALUES (?, ?, ?, ?, ?)
''', ('Payment', amount, payment_to, date, memo))
conn.commit()
conn.close()
update_balance(amount, 'payment')
return redirect(url_for('index'))
return render_template('add_payment.html')
@app.route('/add_deposit', methods=['GET', 'POST'])
def add_deposit():
if request.method == 'POST':
amount = float(request.form['dollars'])
date = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
memo = request.form.get('memo', '')
conn = sqlite3.connect('pycash.db')
c = conn.cursor()
c.execute('''
INSERT INTO transactions (type, amount, recipient, date, memo)
VALUES (?, ?, ?, ?, ?)
''', ('Deposit', amount, '', date, memo))
conn.commit()
conn.close()
update_balance(amount, 'deposit')
return redirect(url_for('index'))
return render_template('add_deposit.html')
@app.route('/view_finances', methods=['GET'])
def view_finances():
conn = sqlite3.connect('pycash.db')
c = conn.cursor()
c.execute('SELECT * FROM transactions')
transactions = c.fetchall()
c.execute('SELECT total FROM balance WHERE id = 1')
balance = c.fetchone()[0]
conn.close()
return render_template('view_finances.html', transactions=transactions, balance=balance)
@app.route('/generate_pdf')
def generate_pdf():
conn = sqlite3.connect('pycash.db')
c = conn.cursor()
c.execute('SELECT * FROM transactions')
transactions = c.fetchall()
c.execute('SELECT total FROM balance WHERE id = 1')
balance = c.fetchone()[0]
conn.close()
pdf_buffer = io.BytesIO()
pdf = canvas.Canvas(pdf_buffer, pagesize=letter)
width, height = letter
pdf.setFont("Helvetica-Bold", 16)
pdf.drawString(30, height - 30, "Transaction Statement")
pdf.setFont("Helvetica-Bold", 12)
pdf.drawString(30, height - 60, "Type")
pdf.drawString(120, height - 60, "Amount")
pdf.drawString(210, height - 60, "Date")
pdf.drawString(300, height - 60, "From")
y = height - 80
pdf.setFont("Helvetica", 12)
for transaction in transactions:
transaction_type, amount, recipient, date, memo = transaction[1], transaction[2], transaction[3], transaction[4], transaction[5]
pdf.drawString(30, y, transaction_type)
pdf.drawString(120, y, f"₹{amount:.2f}")
pdf.drawString(210, y, date)
pdf.drawString(300, y, From)
y -= 20
pdf.setFont("Helvetica-Bold", 14)
pdf.drawString(30, y - 20, f"Current Balance: ₹{balance:.2f}")
pdf.save()
pdf_buffer.seek(0)
return send_file(pdf_buffer, as_attachment=True, download_name='statement.pdf', mimetype='application/pdf')
@app.route('/clear_transactions', methods=['POST'])
def clear_transactions():
conn = sqlite3.connect('pycash.db')
c = conn.cursor()
c.execute('DELETE FROM transactions')
c.execute('UPDATE balance SET total = 0 WHERE id = 1')
conn.commit()
conn.close()
return redirect(url_for('index'))
if __name__ == '__main__':
app.run(debug=True)