176 lines
11 KiB
Python
176 lines
11 KiB
Python
"""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!")
|