gigafibre-fsm/scripts/migration/fix_dates.py
louispaulb 5640063bd0 fix: correct creation/modified dates from unix timestamps
- 129,078 Issues: creation = ticket.date_create, modified = ticket.last_update
- 115,721 Invoices: creation = invoice.date_orig
- 15,059 Customers: creation = account.date_orig, modified = account.date_last

All timestamps now show real legacy dates instead of import date.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 16:20:47 -04:00

119 lines
4.0 KiB
Python

#!/usr/bin/env python3
"""
Fix creation/modified dates on all migrated documents.
Sets creation = original legacy date (converted from unix timestamp).
Fixes Issues, Sales Invoices, Customers, Communications.
"""
import pymysql
import psycopg2
from datetime import datetime, timezone
LEGACY = {"host": "10.100.80.100", "user": "facturation", "password": "VD67owoj",
"database": "gestionclient", "connect_timeout": 30, "read_timeout": 600}
PG = {"host": "db", "port": 5432, "user": "postgres", "password": "123",
"dbname": "_eb65bdc0c4b1b2d6"}
def ts_to_dt(unix_ts):
if not unix_ts or unix_ts <= 0:
return None
try:
return datetime.fromtimestamp(int(unix_ts), tz=timezone.utc).strftime("%Y-%m-%d %H:%M:%S")
except:
return None
def log(msg):
print(msg, flush=True)
def main():
log("=== Fix Creation/Modified Dates ===")
mc = pymysql.connect(**LEGACY)
cur = mc.cursor(pymysql.cursors.DictCursor)
# 1. Tickets → Issues
log("Loading ticket dates...")
cur.execute("SELECT id, date_create, last_update, date_closed FROM ticket ORDER BY id")
ticket_dates = {r["id"]: r for r in cur.fetchall()}
# 2. Invoices → Sales Invoices
log("Loading invoice dates...")
cur.execute("SELECT id, date_orig FROM invoice WHERE billing_status = 1 ORDER BY id")
inv_dates = {r["id"]: r["date_orig"] for r in cur.fetchall()}
# 3. Accounts → Customers
log("Loading account dates...")
cur.execute("SELECT id, date_orig, date_last FROM account ORDER BY id")
acct_dates = {r["id"]: r for r in cur.fetchall()}
mc.close()
log(" Loaded {} ticket, {} invoice, {} account dates".format(
len(ticket_dates), len(inv_dates), len(acct_dates)))
pg = psycopg2.connect(**PG)
pgc = pg.cursor()
# Fix Issues
log("")
log("--- Fixing Issue dates ---")
pgc.execute('SELECT name, legacy_ticket_id FROM "tabIssue" WHERE legacy_ticket_id > 0')
issues = pgc.fetchall()
fixed_issues = 0
for name, tid in issues:
t = ticket_dates.get(tid)
if not t:
continue
created = ts_to_dt(t.get("date_create"))
modified = ts_to_dt(t.get("last_update")) or created
if created:
pgc.execute('UPDATE "tabIssue" SET creation = %s, modified = %s WHERE name = %s',
(created, modified or created, name))
fixed_issues += 1
pg.commit()
log(" {} Issues dates fixed".format(fixed_issues))
# Fix Sales Invoices
log("")
log("--- Fixing Sales Invoice dates ---")
pgc.execute('SELECT name, legacy_invoice_id FROM "tabSales Invoice" WHERE legacy_invoice_id > 0')
sinvs = pgc.fetchall()
fixed_inv = 0
for name, inv_id in sinvs:
date_orig = inv_dates.get(inv_id)
created = ts_to_dt(date_orig)
if created:
pgc.execute('UPDATE "tabSales Invoice" SET creation = %s, modified = %s WHERE name = %s',
(created, created, name))
fixed_inv += 1
pg.commit()
log(" {} Sales Invoice dates fixed".format(fixed_inv))
# Fix Customers
log("")
log("--- Fixing Customer dates ---")
pgc.execute('SELECT name, legacy_account_id FROM "tabCustomer" WHERE legacy_account_id > 0')
custs = pgc.fetchall()
fixed_cust = 0
for name, aid in custs:
a = acct_dates.get(aid)
if not a:
continue
created = ts_to_dt(a.get("date_orig"))
modified = ts_to_dt(a.get("date_last")) or created
if created:
pgc.execute('UPDATE "tabCustomer" SET creation = %s, modified = %s WHERE name = %s',
(created, modified or created, name))
fixed_cust += 1
pg.commit()
pg.close()
log(" {} Customer dates fixed".format(fixed_cust))
log("")
log("=" * 60)
log("Issues: {} dates fixed".format(fixed_issues))
log("Invoices: {} dates fixed".format(fixed_inv))
log("Customers: {} dates fixed".format(fixed_cust))
log("=" * 60)
if __name__ == "__main__":
main()