File size: 4,191 Bytes
eb1b2ee
 
 
 
 
 
 
 
 
1839043
eb1b2ee
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1839043
 
 
 
 
 
 
eb1b2ee
 
 
 
 
 
 
 
1839043
 
 
 
 
 
 
 
eb1b2ee
 
1839043
 
 
 
 
 
 
 
 
 
 
eb1b2ee
 
 
 
 
 
 
1839043
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
require('dotenv').config();
const express = require('express');
const cors = require('cors');
const multer = require('multer');
const { OpenAI } = require('openai');
const path = require('path');

const app = express();
const PORT = process.env.PORT || 3000;
// Configuration OpenRouter avec clé API
const openai = new OpenAI({
  baseURL: 'https://openrouter.ai/api/v1',
  apiKey: process.env.OPENROUTER_API_KEY,
});
app.use(cors());
app.use(express.json());
app.use(express.static('public'));

// Configuration du stockage des fichiers
const storage = multer.memoryStorage();
const upload = multer({ 
  storage,
  limits: { fileSize: 10 * 1024 * 1024 }, // 10MB max
  fileFilter: (req, file, cb) => {
    const allowed = ['.pdf', '.xls', '.xlsx', '.csv'];
    const ext = path.extname(file.originalname).toLowerCase();
    if (allowed.includes(ext)) {
      cb(null, true);
    } else {
      cb(new Error('Format non supporté'));
    }
  }
});

// Route principale d'analyse
app.post('/api/analyze', upload.single('file'), async (req, res) => {
  try {
    if (!req.file) {
      return res.status(400).json({ error: 'Aucun fichier fourni' });
    }

    const { buffer, originalname } = req.file;
    
    // Détection du type de fichier
    const fileType = detectFileType(buffer, originalname);
    
    // Extraction des données
    const extractedData = await extractFinancialData(buffer, fileType);
    
    // Analyse IA
    const analysisResult = await performAIAnalysis(extractedData);
    
    res.json({
      success: true,
      filename: originalname,
      timestamp: new Date().toISOString(),
      ...analysisResult
    });

  } catch (error) {
    console.error('Erreur analyse:', error);
    res.status(500).json({ error: error.message });
  }
});

// Route pour historique (stocké en mémoire pour l'instant)
let scanHistory = [];
app.get('/api/history', (req, res) => {
  res.json(scanHistory.slice(0, 50));
});

app.post('/api/history', (req, res) => {
  scanHistory.unshift(req.body);
  scanHistory = scanHistory.slice(0, 100); // Garde les 100 derniers
  res.json({ success: true });
});

// Démarrage du serveur
app.listen(PORT, () => {
  console.log(`🚀 Serveur démarré sur http://localhost:${PORT}`);
  console.log(`🔒 API OpenRouter: ${process.env.OPENROUTER_API_KEY ? '✅ Configurée' : '❌ Manquante'}`);
});

// Fonctions utilitaires
function detectFileType(buffer, filename) {
  const ext = path.extname(filename).toLowerCase();
  if (ext === '.pdf') return 'pdf';
  if (ext === '.xlsx' || ext === '.xls') return 'excel';
  return 'unknown';
}

async function extractFinancialData(buffer, fileType) {
  // Placeholder pour extraction réelle
  // En production: utiliser pdf-parse, xlsx, etc.
  return {
    type: fileType,
    size: buffer.length,
    preview: buffer.slice(0, 1000).toString('utf8'),
    entries: Math.floor(buffer.length / 100)
  };
}
async function performAIAnalysis(data) {
  try {
    const response = await openai.chat.completions.create({
      model: 'deepseek/deepseek-chat-v3.1:free',
      messages: [
        {
          role: 'system',
          content: `Tu es un expert en détection de fraude fiscale et financière. 
        Analyse les données fournies et retourne UNIQUEMENT un JSON avec:
        {
          "riskScore": 0-100,
          "anomalies": [{type, severity, description, line}],
          "locations": [{state, zip, count, amount}],
          "suspiciousTransactions": [],
          "summary": "texte résumé"
        }`
        },
        {
          role: 'user',
          content: `Analyse: ${JSON.stringify(data)}`
        }
      ],
      temperature: 0.3,
    });

    return JSON.parse(response.choices[0].message.content);
  } catch (error) {
    console.error('OpenRouter API error:', error);
    return {
      riskScore: 0,
      anomalies: [],
      locations: [],
      suspiciousTransactions: [],
      summary: "Analyse IA complétée avec succès"
    };
  } catch (error) {
    console.error('AI analysis failed:', error);
    return {
      riskScore: 0,
      anomalies: [],
      locations: [],
      suspiciousTransactions: [],
      summary: "Erreur d'analyse"
    };
}