Code Python pour Agent de Recouvrement du Trésor

Pour un agent de recouvrement du Trésor, un système complet doit inclure la gestion des débiteurs, le suivi des paiements, l’envoi de rappels automatiques, et l’analyse des données pour optimiser le recouvrement. Voici un exemple de code Python qui intègre ces fonctionnalités avec une approche complexe.

Configuration de la Base de Données

Nous utiliserons SQLite pour simplifier l’exemple. La base de données contiendra deux tables : debtors pour les débiteurs et payments pour les paiements.

Structure de la Base de Données (SQL)

CREATE TABLE debtors (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    email TEXT NOT NULL,
    phone TEXT,
    amount_owed REAL NOT NULL,
    due_date DATE NOT NULL
);

CREATE TABLE payments (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    debtor_id INTEGER,
    amount_paid REAL NOT NULL,
    payment_date DATE NOT NULL,
    FOREIGN KEY (debtor_id) REFERENCES debtors(id)
);

Code Python

Connexion à la Base de Données

import sqlite3
import datetime
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

def connect_db():
    return sqlite3.connect('treasury.db')

def create_tables():
    conn = connect_db()
    cursor = conn.cursor()
    cursor.execute('''CREATE TABLE IF NOT EXISTS debtors (
                        id INTEGER PRIMARY KEY AUTOINCREMENT,
                        name TEXT NOT NULL,
                        email TEXT NOT NULL,
                        phone TEXT,
                        amount_owed REAL NOT NULL,
                        due_date DATE NOT NULL
                    )''')
    cursor.execute('''CREATE TABLE IF NOT EXISTS payments (
                        id INTEGER PRIMARY KEY AUTOINCREMENT,
                        debtor_id INTEGER,
                        amount_paid REAL NOT NULL,
                        payment_date DATE NOT NULL,
                        FOREIGN KEY (debtor_id) REFERENCES debtors(id)
                    )''')
    conn.commit()
    conn.close()

create_tables()

Classe Debtor et Payment

class Debtor:
    def __init__(self, id, name, email, phone, amount_owed, due_date):
        self.id = id
        self.name = name
        self.email = email
        self.phone = phone
        self.amount_owed = amount_owed
        self.due_date = due_date

    @staticmethod
    def add_debtor(name, email, phone, amount_owed, due_date):
        conn = connect_db()
        cursor = conn.cursor()
        cursor.execute("INSERT INTO debtors (name, email, phone, amount_owed, due_date) VALUES (?, ?, ?, ?, ?)",
                       (name, email, phone, amount_owed, due_date))
        conn.commit()
        conn.close()

    @staticmethod
    def get_debtors():
        conn = connect_db()
        cursor = conn.cursor()
        cursor.execute("SELECT * FROM debtors")
        debtors = cursor.fetchall()
        conn.close()
        return debtors

class Payment:
    def __init__(self, id, debtor_id, amount_paid, payment_date):
        self.id = id
        self.debtor_id = debtor_id
        self.amount_paid = amount_paid
        self.payment_date = payment_date

    @staticmethod
    def add_payment(debtor_id, amount_paid, payment_date):
        conn = connect_db()
        cursor = conn.cursor()
        cursor.execute("INSERT INTO payments (debtor_id, amount_paid, payment_date) VALUES (?, ?, ?)",
                       (debtor_id, amount_paid, payment_date))
        conn.commit()
        cursor.execute("UPDATE debtors SET amount_owed = amount_owed - ? WHERE id = ?", (amount_paid, debtor_id))
        conn.commit()
        conn.close()

    @staticmethod
    def get_payments():
        conn = connect_db()
        cursor = conn.cursor()
        cursor.execute("SELECT * FROM payments")
        payments = cursor.fetchall()
        conn.close()
        return payments

Fonction d’envoi de Rappels

def send_reminder(email, subject, body):
    sender_email = "your_email@example.com"
    sender_password = "your_password"

    msg = MIMEMultipart()
    msg['From'] = sender_email
    msg['To'] = email
    msg['Subject'] = subject
    msg.attach(MIMEText(body, 'plain'))

    try:
        server = smtplib.SMTP('smtp.example.com', 587)
        server.starttls()
        server.login(sender_email, sender_password)
        text = msg.as_string()
        server.sendmail(sender_email, email, text)
        server.quit()
        print(f"Reminder sent to {email}.")
    except Exception as e:
        print(f"Failed to send email: {str(e)}")

Rappel Automatique pour les Débiteurs

def send_reminders():
    debtors = Debtor.get_debtors()
    today = datetime.date.today()

    for debtor in debtors:
        due_date = datetime.datetime.strptime(debtor[5], '%Y-%m-%d').date()
        if due_date < today and debtor[4] > 0:
            days_past_due = (today - due_date).days
            subject = "Payment Reminder"
            body = (f"Dear {debtor[1]},\n\n"
                    f"Your payment of ${debtor[4]:.2f} was due on {due_date}. "
                    f"It is now {days_past_due} days past due. Please make your payment as soon as possible.\n\n"
                    "Thank you.")
            send_reminder(debtor[2], subject, body)

send_reminders()

Interface Utilisateur Basique

def main():
    while True:
        print("1. Add Debtor")
        print("2. Add Payment")
        print("3. View Debtors")
        print("4. View Payments")
        print("5. Send Reminders")
        print("6. Exit")
        choice = input("Enter choice: ")

        if choice == '1':
            name = input("Enter name: ")
            email = input("Enter email: ")
            phone = input("Enter phone: ")
            amount_owed = float(input("Enter amount owed: "))
            due_date = input("Enter due date (YYYY-MM-DD): ")
            Debtor.add_debtor(name, email, phone, amount_owed, due_date)
        elif choice == '2':
            debtor_id = int(input("Enter debtor ID: "))
            amount_paid = float(input("Enter amount paid: "))
            payment_date = input("Enter payment date (YYYY-MM-DD): ")
            Payment.add_payment(debtor_id, amount_paid, payment_date)
        elif choice == '3':
            debtors = Debtor.get_debtors()
            for debtor in debtors:
                print(debtor)
        elif choice == '4':
            payments = Payment.get_payments()
            for payment in payments:
                print(payment)
        elif choice == '5':
            send_reminders()
        elif choice == '6':
            break
        else:
            print("Invalid choice. Please try again.")

if __name__ == "__main__":
    main()

Conclusion

Ce code constitue une base pour un système complexe de gestion de recouvrement pour un agent du Trésor. Il permet de gérer les débiteurs, suivre les paiements, envoyer des rappels automatiques, et offre une interface utilisateur basique. Pour une application réelle, il faudrait ajouter des fonctionnalités supplémentaires, sécuriser l’envoi d’emails, améliorer l’interface utilisateur, et intégrer une gestion avancée des données.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Retour en haut