#!/usr/bin/env python3 """ Phone Refurb CLI - Gestion du stock de téléphones Usage: ./phone-cli [args] """ import sqlite3 import sys import os from datetime import datetime from pathlib import Path DB_PATH = Path(__file__).parent / "phones.db" def get_conn(): return sqlite3.connect(DB_PATH) def cmd_add(brand, model, model_code, imei=None, serial=None, status="stock", notes=None): """Ajouter un téléphone""" conn = get_conn() c = conn.cursor() c.execute(""" INSERT INTO phones (brand, model, model_code, imei, serial, status, notes) VALUES (?, ?, ?, ?, ?, ?, ?) """, (brand, model, model_code, imei, serial, status, notes)) conn.commit() print(f"✅ Téléphone ajouté (ID: {c.lastrowid})") conn.close() def cmd_list(status=None): """Lister les téléphones""" conn = get_conn() c = conn.cursor() if status: c.execute("SELECT * FROM phone_summary WHERE status = ?", (status,)) else: c.execute("SELECT * FROM phone_summary") rows = c.fetchall() conn.close() if not rows: print("Aucun téléphone trouvé") return print(f"{'ID':<4} {'Marque':<10} {'Modèle':<20} {'Code':<15} {'Statut':<10} {'OS':<10} {'Root':<5}") print("-" * 80) for r in rows: print(f"{r[0]:<4} {r[1]:<10} {r[2]:<20} {r[3] or '':<15} {r[4]:<10} {r[5] or '':<10} {'✓' if r[7] else '✗':<5}") def cmd_info(phone_id): """Détails d'un téléphone""" conn = get_conn() c = conn.cursor() # Infos de base c.execute("SELECT * FROM phones WHERE id = ?", (phone_id,)) phone = c.fetchone() if not phone: print(f"❌ Téléphone {phone_id} non trouvé") conn.close() return print(f"\n📱 {phone[1]} {phone[2]} ({phone[3]})") print(f" IMEI: {phone[4] or 'N/A'}") print(f" Serial: {phone[5] or 'N/A'}") print(f" Statut: {phone[6]}") print(f" Notes: {phone[7] or 'Aucune'}") # Specs c.execute("SELECT * FROM phone_specs WHERE phone_id = ?", (phone_id,)) specs = c.fetchone() if specs: print(f"\n🔧 Specs:") print(f" CPU: {specs[2] or 'N/A'}") print(f" RAM: {specs[4]} Mo" if specs[4] else "") print(f" Stockage: {specs[5]} Go" if specs[5] else "") print(f" Écran: {specs[6] or 'N/A'}") print(f" Batterie: {specs[8]} mAh" if specs[8] else "") # Software c.execute("SELECT * FROM software_state WHERE phone_id = ? ORDER BY date_recorded DESC LIMIT 1", (phone_id,)) sw = c.fetchone() if sw: print(f"\n💾 Logiciel:") print(f" OS: {sw[2]} {sw[3] or ''}") print(f" SDK: {sw[4] or 'N/A'}") print(f" Kernel: {sw[5] or 'N/A'}") print(f" Bootloader: {'🔒 Verrouillé' if sw[6] else '🔓 Déverrouillé'}") print(f" Root: {'✓' if sw[7] else '✗'}") print(f" Recovery: {sw[8] or 'Stock'}") # Actions c.execute("SELECT action_type, action_date, status, notes FROM actions WHERE phone_id = ? ORDER BY action_date DESC LIMIT 10", (phone_id,)) actions = c.fetchall() if actions: print(f"\n📋 Actions récentes:") for a in actions: status_icon = "✅" if a[2] == "success" else "⚠️" if a[2] == "partial" else "❌" print(f" {status_icon} {a[0]} ({a[1][:10]})") if a[3]: print(f" {a[3][:50]}") conn.close() def cmd_action(phone_id, action_type, status="success", notes=None, rom_id=None): """Ajouter une action""" conn = get_conn() c = conn.cursor() c.execute(""" INSERT INTO actions (phone_id, action_type, status, notes, rom_id) VALUES (?, ?, ?, ?, ?) """, (phone_id, action_type, status, notes, rom_id)) conn.commit() # Update phone timestamp c.execute("UPDATE phones SET updated_at = CURRENT_TIMESTAMP WHERE id = ?", (phone_id,)) conn.commit() print(f"✅ Action '{action_type}' ajoutée") conn.close() def cmd_update_status(phone_id, status): """Changer le statut d'un téléphone""" conn = get_conn() c = conn.cursor() c.execute("UPDATE phones SET status = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?", (status, phone_id)) conn.commit() print(f"✅ Statut mis à jour: {status}") conn.close() def cmd_roms(device_code=None): """Lister les ROMs disponibles""" conn = get_conn() c = conn.cursor() if device_code: c.execute("SELECT id, name, version, android_version, file_size_mb FROM roms WHERE device_code = ?", (device_code,)) else: c.execute("SELECT id, name, version, android_version, device_code, file_size_mb FROM roms") rows = c.fetchall() conn.close() print(f"{'ID':<4} {'ROM':<20} {'Version':<25} {'Android':<10} {'Device':<15} {'Size':<10}") print("-" * 90) for r in rows: if device_code: print(f"{r[0]:<4} {r[1]:<20} {r[2] or '':<25} {r[3] or '':<10} {r[4]}M") else: print(f"{r[0]:<4} {r[1]:<20} {r[2] or '':<25} {r[3] or '':<10} {r[4]:<15} {r[5]}M") def cmd_search(query): """Rechercher un téléphone""" conn = get_conn() c = conn.cursor() c.execute(""" SELECT * FROM phone_summary WHERE brand LIKE ? OR model LIKE ? OR model_code LIKE ? OR status LIKE ? """, (f"%{query}%", f"%{query}%", f"%{query}%", f"%{query}%")) rows = c.fetchall() conn.close() if not rows: print("Aucun résultat") return print(f"{'ID':<4} {'Marque':<10} {'Modèle':<20} {'Code':<15} {'Statut':<10}") print("-" * 60) for r in rows: print(f"{r[0]:<4} {r[1]:<10} {r[2]:<20} {r[3] or '':<15} {r[4]:<10}") def print_help(): print(""" Phone Refurb CLI - Gestion du stock de téléphones Usage: ./phone-cli [args] Commands: add [imei] [serial] [status] [notes] Ajouter un nouveau téléphone list [status] Lister les téléphones (filtrer par statut: stock, paused, sold, etc.) info Détails complets d'un téléphone action [status] [notes] Ajouter une action (status: success, partial, failed) status Changer le statut d'un téléphone roms [device_code] Lister les ROMs disponibles search Rechercher un téléphone Examples: ./phone-cli add Samsung "Galaxy S7" SM-G930F ./phone-cli list stock ./phone-cli info 1 ./phone-cli action 1 flash_rom success "LineageOS 18.1 installée" ./phone-cli status 1 ready ./phone-cli roms j5xnlte ./phone-cli search samsung """) def main(): if len(sys.argv) < 2: print_help() return cmd = sys.argv[1] try: if cmd == "add": args = sys.argv[2:] cmd_add(*args[:7] if len(args) >= 3 else (print("Usage: add "), sys.exit(1))) elif cmd == "list": cmd_list(sys.argv[2] if len(sys.argv) > 2 else None) elif cmd == "info": cmd_info(int(sys.argv[2])) elif cmd == "action": args = sys.argv[2:] cmd_action(int(args[0]), args[1], args[2] if len(args) > 2 else "success", args[3] if len(args) > 3 else None) elif cmd == "status": cmd_update_status(int(sys.argv[2]), sys.argv[3]) elif cmd == "roms": cmd_roms(sys.argv[2] if len(sys.argv) > 2 else None) elif cmd == "search": cmd_search(sys.argv[2]) elif cmd in ["help", "-h", "--help"]: print_help() else: print(f"Commande inconnue: {cmd}") print_help() except Exception as e: print(f"❌ Erreur: {e}") if __name__ == "__main__": main()