"""Generate 3 documentation Word files for DiDi platform.""" import sys, io sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') from docx import Document from docx.shared import Pt, Cm, RGBColor BASE = "C:/Users/avedev/Desktop/Achizitii TOP/livrabile/didi" def setup_doc(): doc = Document() for s in doc.sections: s.top_margin = Cm(2.5); s.bottom_margin = Cm(2); s.left_margin = Cm(2.5); s.right_margin = Cm(2.5) style = doc.styles['Normal']; style.font.name = 'Calibri'; style.font.size = Pt(11) style.paragraph_format.space_after = Pt(6); style.paragraph_format.line_spacing = 1.15 for lv, sz in [(1,16),(2,13),(3,11)]: hs = doc.styles[f'Heading {lv}']; hs.font.name = 'Calibri'; hs.font.size = Pt(sz) hs.font.color.rgb = RGBColor(0x0D,0x94,0x88); hs.font.bold = True return doc def tbl(doc, headers, rows): t = doc.add_table(rows=1, cols=len(headers)); t.style = 'Light Grid Accent 1' for i, h in enumerate(headers): t.rows[0].cells[i].text = h for p in t.rows[0].cells[i].paragraphs: for r in p.runs: r.bold = True; r.font.size = Pt(9) for rd in rows: row = t.add_row() for i, v in enumerate(rd): row.cells[i].text = str(v) for p in row.cells[i].paragraphs: for r in p.runs: r.font.size = Pt(9) def bl(doc, text): p = doc.add_paragraph(style='List Bullet'); p.paragraph_format.space_after = Pt(3) p.add_run(text).font.size = Pt(10) def pa(doc, text, sz=11): p = doc.add_paragraph(); p.add_run(text).font.size = Pt(sz) # ═══ DOC 1: Manual Utilizare ═══ print("1. Manual_Utilizare_Website.docx...") d = setup_doc() d.add_heading('Manual de Utilizare - Website DiDi', level=1) pa(d, 'Ghid complet pentru utilizatorii platformei DiDi de la Clossers.') d.add_heading('1. Introducere', level=1) pa(d, 'DiDi este o platforma digitala inteligenta pentru prevenirea si combaterea dezinformarii. Analizeaza automat continut media (text, imagini, audio, video) folosind inteligenta artificiala pentru a detecta dezinformarea si a verifica informatiile in timp real.') d.add_heading('2. Pagini Publice', level=1) for t, desc in [('Homepage','Prezentare platforma: hero, 4 capabilitati AI, cum functioneaza (4 pasi), cazuri de utilizare, statistici. Continut gestionat din CMS.'),('Servicii','6 module AI detaliate: Analiza Text, Detectie Deepfake, Fact-Checking, Evaluare Surse, Tehnici Manipulare, Monitorizare Media.'),('Pricing','Grila preturi: 4 categorii servicii x tipuri media (Text, Imagine, Audio, Video). Preturi in RON. Buton achizitie cu redirect Stripe.'),('Despre','Prezentare companie, misiune, proiect PNRR, tehnologie utilizata.'),('Contact','Formular (nume, email, mesaj) care creeaza automat Lead in CRM.'),('Privacy / Termeni','Politica GDPR si Termeni si Conditii, editabile din CMS.')]: d.add_heading(t, level=2); pa(d, desc, 10) d.add_heading('3. Autentificare', level=1) bl(d,'Login prin SSO Keycloak - buton "Login" din navbar, redirect catre pagina centralizata') bl(d,'Inregistrare - creare cont pe serverul de identitate, autentificare automata') bl(d,'Sesiune JWT cu reinoire automata; deconectare prin buton "Sign out"') d.add_heading('4. Dashboard Client', level=1) for t, items in [('4.1 Overview',['Numar facturi emise si analize achizitionate','Tabel ultimele facturi (numar, data, suma, status)','Link achizitie serviciu']),('4.2 Analize',['Lista analize disponibile (achizitionate, neconsumate)','Selectare analiza → formular input (text sau URL)','Pornire analiza → procesare AI (pana la 2 minute)','Rezultate: scor risc, concluzie, tehnici manipulare, verificare afirmatii, detectie AI, evaluare sursa, viralitate','Buton "Descarca Raport PDF" cu toate rezultatele']),('4.3 Facturi',['Lista completa cu numar, data, suma, status','Download PDF (format "DiDi Invoice" personalizat)']),('4.4 Abonament',['Plan activ si functionalitati incluse','Free: 5 analize/luna | Paid: 100/luna | Enterprise: nelimitat']),('4.5 Profil',['Editare date: companie, cod fiscal','GDPR: export date CSV, solicitare stergere cont'])]: d.add_heading(t, level=2) for i in items: bl(d, i) d.add_heading('5. Achizitie Serviciu', level=1) for s in ['1. Pricing → selectare serviciu si tip media','2. Redirect Stripe Checkout (plata securizata PCI DSS)','3. Completare date card si plata','4. Confirmare → factura automata cu TVA 19%','5. Analiza disponibila in dashboard']: bl(d, s) d.add_heading('6. Cookie Consent si Limba', level=1) pa(d,'Banner cookie cu 3 categorii: Necesare (always on), Functionale, Analitice. Comutare limba RO/EN din navbar.') d.save(f"{BASE}/Manual_Utilizare_Website.docx"); print(" OK") # ═══ DOC 2: Documentatie API ═══ print("2. Documentatie_API.docx...") d = setup_doc() d.add_heading('Documentatie API - Platforma DiDi', level=1) d.add_heading('1. Arhitectura si Autentificare', level=1) pa(d,'3 categorii API: Website API Routes (Next.js), ERPNext REST API (proxy server-side), DiDi Analysis API (AI).') bl(d,'Website: sesiune NextAuth (cookie httpOnly) prin Keycloak SSO') bl(d,'ERPNext: API Key + Secret (server-side)') bl(d,'DiDi API: Bearer token JWT din sesiunea Keycloak') d.add_heading('2. Endpoint-uri Website', level=1) tbl(d, ['Endpoint','Descriere','Request','Response'], [ ['POST /api/checkout','Sesiune plata one-time','{ serviceKey }','{ url }'], ['POST /api/subscribe','Subscriptie recurenta','{ planKey }','{ url }'], ['GET /api/analyze','Lista analize disponibile','Auth required','{ data: [{invoice, component}] }'], ['POST /api/analyze','Trimitere analiza','{invoice, component, media, text/url}','{ data: {session_id} }'], ['GET /api/analyze?session_id=X','Polling rezultate','Auth required','{ data: {status, risk_score} }'], ['POST /api/leads','Creare lead CRM','{lead_name, email_id, notes}','{ data: {name} }'], ['GET /api/invoice-pdf?name=X','Download PDF factura','Auth required','PDF binary'], ['GET /api/customer/me','Date client','Auth required','{ data: {name, iam_role} }'], ['GET /api/analysis-reports','Lista rapoarte','Auth required','{ data: [...] }'], ['POST /api/analysis-reports','Salvare raport','{invoiceName, sessionId, result}','{ data: {name, pdfFile} }'], ['GET /api/analysis-report-pdf','Download PDF raport','?name=X','PDF binary'], ['POST /api/webhooks/stripe','Webhook Stripe','Stripe signature','{ received: true }'], ]) d.add_heading('2.1 Evenimente Webhook Stripe', level=2) bl(d,'checkout.session.completed → Client + Factura + Payment Entry + Service Agreement') bl(d,'customer.subscription.updated → update iam_role pe Customer') bl(d,'customer.subscription.deleted → downgrade free_tier') bl(d,'invoice.payment_failed → log in Payment Log') d.add_heading('3. ERPNext DocTypes', level=1) tbl(d, ['DocType','Descriere','Campuri'], [ ['Customer','Clienti','customer_name, didi_user_id, iam_role, active_plan'], ['Sales Invoice','Facturi','customer, grand_total, status, items, taxes'], ['Lead','Lead-uri','lead_name, email_id, source, source_form, utm_*'], ['Website Content','CMS','page_slug, section_key, content_ro, content_en'], ['Service Agreement','Acorduri','customer, plan, status, acceptance_date'], ['Payment Log','Log plati','customer, event_type, status, stripe_session_id'], ['Analysis Report','Rapoarte','customer, sales_invoice, component, pdf_file, result_json'], ['Item','Servicii','item_code, item_name, standard_rate'], ['Subscription Plan','Planuri','plan_name, cost, billing_interval'], ]) d.add_heading('4. DiDi Analysis API', level=1) tbl(d, ['Endpoint','Metoda','Descriere','Response'], [ ['/v3/techniques/analyze','POST','Tehnici manipulare','risk_score, techniques_detected[]'], ['/v3/ai-tampered/analyze','POST','Detectie AI','ai_probability, verdict'], ['/v3/claims/analyze','POST','Fact-checking','claims[{claim, verdict}]'], ['/v3/domain/analyze','POST','Evaluare sursa','credibility_score, category'], ]) d.save(f"{BASE}/Documentatie_API.docx"); print(" OK") # ═══ DOC 3: Ghid Admin ERPNext ═══ print("3. Ghid_Administrare_ERPNext.docx...") d = setup_doc() d.add_heading('Ghid de Administrare - ERPNext DiDi', level=1) d.add_heading('1. Accesare si Navigare', level=1) pa(d,'ERPNext se acceseaza prin browser. Autentificare cu contul Administrator. Sidebar cu 7 module:') tbl(d, ['Modul','Continut'], [['Facturi','Sales Invoice, Payment Entry, TVA'],['Clienti','Customer, Service Agreement'],['CRM','Lead, Sales Stage, Lead Source'],['Servicii','Item, Subscription Plan'],['Plati','Payment Log, Analysis Report'],['Contabilitate','Account, Company, Supplier'],['Website CMS','Website Content, Email Template']]) d.add_heading('2. Facturi', level=1) bl(d,'Create automat la plata Stripe. Serie: DIDI-INV-YYYY-#####') bl(d,'TVA 19% automat. Print Format "DiDi Invoice" cu logo si date firma') bl(d,'Statusuri: Draft → Submitted → Paid / Cancelled. Download PDF din lista.') d.add_heading('3. Clienti', level=1) tbl(d, ['Camp','Descriere'], [['customer_name','Numele clientului'],['didi_user_id','UUID Keycloak'],['iam_role','free_tier / paid_tier / enterprise_tier'],['active_plan','Cod plan activ'],['plan_activation_date','Data activarii']]) d.add_heading('4. CRM', level=1) bl(d,'Lead-uri automate din formular contact website') bl(d,'Pipeline: Lead → Calificat → Demo → Client') bl(d,'UTM tracking: utm_source, utm_medium, utm_campaign') d.add_heading('5. Servicii', level=1) bl(d,'14 articole one-time: TECHNIQUES/AI_DETECTION/CLAIMS/SOURCE x TEXT/IMAGE/AUDIO/VIDEO/URL (50-200 RON)') bl(d,'5 planuri: Free(0), Paid lunar(99)/anual(999), Enterprise lunar(499)/anual(4990) RON') d.add_heading('6. Plati si Rapoarte', level=1) bl(d,'Payment Log — tranzactii Stripe: status, suma, event_type, stripe_session_id') bl(d,'Analysis Report — rapoarte AI cu PDF atasat, rezultat JSON complet') d.add_heading('7. Contabilitate', level=1) bl(d,'Plan conturi romanesc tradus. TVA 19% sablon automat.') bl(d,'Furnizori: Hetzner (hosting), Stripe (plati), SendGrid (email)') bl(d,'Rapoarte standard: Balanta, Profit si Pierdere, Registru General') bl(d,'3 rapoarte custom: Dashboard Financiar, Raport CRM, Clienti per Plan') d.add_heading('8. Website CMS', level=1) pa(d,'24 intrari pe 6 pagini (homepage, services, about, contact, privacy, terms). Fiecare cu content_ro, content_en, image, extra_data JSON.') d.add_heading('9. Notificari Email', level=1) bl(d,'Factura Emisa — email automat la confirmare, cu PDF atasat') bl(d,'Plata Confirmata — email la plata reusita') bl(d,'Expirare Abonament — 7 zile inainte de expirare') pa(d,'Email Account SendGrid configurat (necesita cheie API reala).') d.add_heading('10. Service Agreement', level=1) pa(d,'Acorduri automate la achizitie: client, plan, data acceptare, versiune termeni. Statusuri: Draft → Accepted → Expired.') d.save(f"{BASE}/Ghid_Administrare_ERPNext.docx"); print(" OK") print("\nAll 3 documents generated!")