sync-legacy: scoreboard abos = F brut status=1 (écart positif = fantômes retirés d'ERPNext) + note clarifiée

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
louispaulb 2026-07-06 20:23:21 -04:00
parent 29589597b1
commit 5783ec30b9

View File

@ -540,8 +540,8 @@ async function scoreboard () {
const [fAcct, fSvcActive, fDelivery, fTicket, fInvoice, fPayment, fDevice, const [fAcct, fSvcActive, fDelivery, fTicket, fInvoice, fPayment, fDevice,
eCust, eSubActif, eLoc, eIssue, eInv, ePay, eDevice, ghost] = await Promise.all([ eCust, eSubActif, eLoc, eIssue, eInv, ePay, eDevice, ghost] = await Promise.all([
myc('SELECT COUNT(*) c FROM account'), myc('SELECT COUNT(*) c FROM account'),
// F actif = service.status=1 SUR compte non-résilié (F ne cascade pas la résiliation → comptage brut gonflé) : comparé pomme-à-pomme au 'Actif' ERPNext maintenant nettoyé // F actif = service.status=1 BRUT (ce que F croit actif, fantômes F-non-cascadés inclus) ; l'écart positif = fantômes avérés qu'ERPNext a retirés (raffinage 2026-07-06)
myc('SELECT COUNT(*) c FROM service s JOIN delivery d ON d.id=s.delivery_id JOIN account a ON a.id=d.account_id WHERE s.status=1 AND a.status NOT IN (3,4,5)'), myc('SELECT COUNT(*) c FROM service WHERE status=1'),
myc('SELECT COUNT(*) c FROM delivery'), myc('SELECT COUNT(*) c FROM delivery'),
myc('SELECT COUNT(*) c FROM ticket'), myc('SELECT COUNT(*) c FROM ticket'),
myc('SELECT COUNT(*) c FROM invoice'), myc('SELECT COUNT(*) c FROM invoice'),
@ -564,7 +564,7 @@ async function scoreboard () {
entities: [ entities: [
row('customers', 'Clients', fAcct, eCust, 'F account ↔ Customer'), row('customers', 'Clients', fAcct, eCust, 'F account ↔ Customer'),
row('locations', 'Lieux de service', fDelivery, eLoc, 'F delivery ↔ Service Location'), row('locations', 'Lieux de service', fDelivery, eLoc, 'F delivery ↔ Service Location'),
row('subscriptions', 'Abonnements actifs', fSvcActive, eSubActif, ghost ? `${ghost} actifs sur compte résilié — à revoir (fantômes payants >24 mois auto-annulés)` : 'F actif hors compte résilié ↔ Actif'), row('subscriptions', 'Abonnements actifs', fSvcActive, eSubActif, `écart = fantômes avérés retirés d'ERPNext (payants, résiliés, F silencieux >24 mois) ; ${ghost} actifs sur compte résilié restants à revoir`),
row('devices', 'Appareils', fDevice, eDevice, 'F device ↔ Service Equipment (liens orphelins possibles)'), row('devices', 'Appareils', fDevice, eDevice, 'F device ↔ Service Equipment (liens orphelins possibles)'),
row('tickets', 'Tickets', fTicket, eIssue, 'F ticket ↔ Issue (import à réparer)'), row('tickets', 'Tickets', fTicket, eIssue, 'F ticket ↔ Issue (import à réparer)'),
row('invoices', 'Factures', fInvoice, eInv, 'F invoice ↔ Sales Invoice'), row('invoices', 'Factures', fInvoice, eInv, 'F invoice ↔ Sales Invoice'),