DEV Community

Brad
Brad

Posted on

Python for Small Business: Automate Your Invoicing and Payments

Python for Small Business: Automate Your Invoicing

Manual invoicing wastes hours every month. Here is how to automate it with Python.

Generate PDF Invoices

from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
from datetime import date

def generate_invoice(client, items, invoice_num):
    filename = "invoice_" + str(invoice_num) + ".pdf"
    c = canvas.Canvas(filename, pagesize=letter)

    c.setFont("Helvetica-Bold", 20)
    c.drawString(50, 750, "INVOICE")
    c.setFont("Helvetica", 12)
    c.drawString(50, 730, "Invoice #: " + str(invoice_num))
    c.drawString(50, 715, "Date: " + str(date.today()))
    c.drawString(50, 670, "Bill To: " + client['name'])
    c.drawString(50, 655, client['email'])

    y = 600
    total = 0
    for item in items:
        amount = item['qty'] * item['rate']
        total += amount
        c.drawString(50, y, item['description'])
        c.drawString(400, y, "$" + str(amount))
        y -= 20

    c.setFont("Helvetica-Bold", 14)
    c.drawString(350, y - 20, "TOTAL: $" + str(total))
    c.save()
    return filename
Enter fullscreen mode Exit fullscreen mode

Send Invoice by Email

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email import encoders

def send_invoice(client_email, invoice_path, invoice_num):
    msg = MIMEMultipart()
    msg["Subject"] = "Invoice #" + str(invoice_num) + " - Payment Due in 30 Days"
    msg["From"] = "billing@yourcompany.com"
    msg["To"] = client_email
    msg.attach(MIMEText("Please find your invoice attached."))

    with open(invoice_path, "rb") as f:
        pdf = MIMEBase("application", "pdf")
        pdf.set_payload(f.read())
        encoders.encode_base64(pdf)
        pdf.add_header("Content-Disposition", "attachment; filename=invoice.pdf")
        msg.attach(pdf)

    with smtplib.SMTP("smtp.gmail.com", 587) as s:
        s.starttls()
        s.login("billing@yourcompany.com", "your-app-password")
        s.send_message(msg)
Enter fullscreen mode Exit fullscreen mode

Track Overdue Invoices

import sqlite3
from datetime import date

def get_outstanding():
    conn = sqlite3.connect("invoices.db")
    conn.execute("CREATE TABLE IF NOT EXISTS invoices (id TEXT, client TEXT, amount REAL, due TEXT, paid INTEGER DEFAULT 0)")
    return conn.execute("SELECT * FROM invoices WHERE paid=0 ORDER BY due").fetchall()

def send_reminders():
    today = date.today()
    for invoice in get_outstanding():
        due = date.fromisoformat(invoice[3])
        days = (today - due).days
        if days > 0:
            print("Overdue by " + str(days) + " days: " + invoice[0])
Enter fullscreen mode Exit fullscreen mode

This handles the entire invoicing workflow automatically.


Want 50+ ready-to-use Python automation scripts? Get the complete toolkit for just $9: https://lukassbrad.gumroad.com/l/ugeka

Top comments (0)