Initial commit - Phone Refurb system
This commit is contained in:
241
phone-cli
Executable file
241
phone-cli
Executable file
@@ -0,0 +1,241 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Phone Refurb CLI - Gestion du stock de téléphones
|
||||
Usage: ./phone-cli <command> [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 <command> [args]
|
||||
|
||||
Commands:
|
||||
add <brand> <model> <model_code> [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 <phone_id>
|
||||
Détails complets d'un téléphone
|
||||
|
||||
action <phone_id> <action_type> [status] [notes]
|
||||
Ajouter une action (status: success, partial, failed)
|
||||
|
||||
status <phone_id> <status>
|
||||
Changer le statut d'un téléphone
|
||||
|
||||
roms [device_code]
|
||||
Lister les ROMs disponibles
|
||||
|
||||
search <query>
|
||||
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 <brand> <model> <model_code>"), 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()
|
||||
Reference in New Issue
Block a user