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.