252 lines
11 KiB
Bash
Executable File
252 lines
11 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# SCRIPT ESTRAZIONE COMPLETA FLUSSO FINANZIARIO GESCON
|
|
# Include: Incassi, Conti Bancari, Fornitori, Relazioni Rate-Incassi-Banca
|
|
|
|
set -e
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
GESCON_DIR="/home/michele/netgescon/docs/02-architettura-laravel/Gescon/0021/0001"
|
|
UNICREDIT_FILE="/home/michele/netgescon/docs/02-architettura-laravel/dati-test/milizie 3/250410 da 200101 a 250410 Unicredit.wri"
|
|
OUTPUT_DIR="/home/michele/netgescon/docs/000-IMPORT/estratti"
|
|
ANALYSIS_LOG="/home/michele/netgescon/docs/000-IMPORT/analisi_flusso_finanziario.log"
|
|
|
|
mkdir -p "$OUTPUT_DIR"
|
|
|
|
echo "=== ANALISI FLUSSO FINANZIARIO COMPLETO ===" | tee "$ANALYSIS_LOG"
|
|
echo "Source Gescon: $GESCON_DIR/singolo_anno.mdb" | tee -a "$ANALYSIS_LOG"
|
|
echo "Source Unicredit: $UNICREDIT_FILE" | tee -a "$ANALYSIS_LOG"
|
|
echo "Started: $(date)" | tee -a "$ANALYSIS_LOG"
|
|
echo "" | tee -a "$ANALYSIS_LOG"
|
|
|
|
cd "$GESCON_DIR"
|
|
|
|
# 1. ESTRAZIONE TABELLE FINANZIARIE CORE
|
|
echo "=== FASE 1: TABELLE FINANZIARIE CORE ===" | tee -a "$ANALYSIS_LOG"
|
|
|
|
echo "Extracting incassi (payments received)..." | tee -a "$ANALYSIS_LOG"
|
|
mdb-export singolo_anno.mdb incassi > "$OUTPUT_DIR/incassi_completo.csv"
|
|
INCASSI_COUNT=$(cat "$OUTPUT_DIR/incassi_completo.csv" | wc -l)
|
|
echo "- incassi: $((INCASSI_COUNT - 1)) records" | tee -a "$ANALYSIS_LOG"
|
|
|
|
echo "Extracting Anagr_casse (bank accounts)..." | tee -a "$ANALYSIS_LOG"
|
|
mdb-export singolo_anno.mdb Anagr_casse > "$OUTPUT_DIR/anagr_casse.csv"
|
|
CASSE_COUNT=$(cat "$OUTPUT_DIR/anagr_casse.csv" | wc -l)
|
|
echo "- Anagr_casse: $((CASSE_COUNT - 1)) records" | tee -a "$ANALYSIS_LOG"
|
|
|
|
echo "Extracting Rubrica (suppliers/contacts)..." | tee -a "$ANALYSIS_LOG"
|
|
mdb-export singolo_anno.mdb Rubrica > "$OUTPUT_DIR/rubrica_fornitori.csv"
|
|
RUBRICA_COUNT=$(cat "$OUTPUT_DIR/rubrica_fornitori.csv" | wc -l)
|
|
echo "- Rubrica: $((RUBRICA_COUNT - 1)) records" | tee -a "$ANALYSIS_LOG"
|
|
|
|
# 2. ANALISI RELAZIONI CRITICHE
|
|
echo "" | tee -a "$ANALYSIS_LOG"
|
|
echo "=== FASE 2: ANALISI RELAZIONI FINANZIARIE ===" | tee -a "$ANALYSIS_LOG"
|
|
|
|
# Analisi codici cassa negli incassi
|
|
echo "Analyzing cod_cassa distribution in incassi..." | tee -a "$ANALYSIS_LOG"
|
|
tail -n +2 "$OUTPUT_DIR/incassi_completo.csv" | cut -d',' -f18 | sort | uniq -c | while read count cod_cassa; do
|
|
echo " - Cassa $cod_cassa: $count incassi" | tee -a "$ANALYSIS_LOG"
|
|
done
|
|
|
|
# Analisi codici cassa nelle operazioni (se già estratte)
|
|
if [ -f "$OUTPUT_DIR/operazioni_contabili.csv" ]; then
|
|
echo "Analyzing cod_cassa distribution in operazioni..." | tee -a "$ANALYSIS_LOG"
|
|
tail -n +2 "$OUTPUT_DIR/operazioni_contabili.csv" | cut -d',' -f14 | sort | uniq -c | while read count cod_cassa; do
|
|
echo " - Cassa $cod_cassa: $count operazioni" | tee -a "$ANALYSIS_LOG"
|
|
done
|
|
fi
|
|
|
|
# Analisi conti bancari configurati
|
|
echo "Analyzing bank accounts configuration..." | tee -a "$ANALYSIS_LOG"
|
|
cat "$OUTPUT_DIR/anagr_casse.csv" | while IFS=',' read -r id_cassa codice descrizione saldo_iniziale saldo_euro tipo_riga; do
|
|
if [[ "$codice" != "Codice" ]]; then # Skip header
|
|
echo " - $codice: $descrizione (Saldo: €$saldo_euro)" | tee -a "$ANALYSIS_LOG"
|
|
fi
|
|
done
|
|
|
|
# 3. ANALISI CORRELAZIONI TEMPORALI
|
|
echo "" | tee -a "$ANALYSIS_LOG"
|
|
echo "=== FASE 3: CORRELAZIONI TEMPORALI ===" | tee -a "$ANALYSIS_LOG"
|
|
|
|
# Distribuzione incassi per anno
|
|
echo "Analyzing incassi by year..." | tee -a "$ANALYSIS_LOG"
|
|
tail -n +2 "$OUTPUT_DIR/incassi_completo.csv" | cut -d',' -f5 | sort | uniq -c | while read count anno; do
|
|
echo " - Anno $anno: $count incassi" | tee -a "$ANALYSIS_LOG"
|
|
done
|
|
|
|
# Distribuzione incassi per mese (se presenti date)
|
|
echo "Analyzing incassi temporal distribution..." | tee -a "$ANALYSIS_LOG"
|
|
tail -n +2 "$OUTPUT_DIR/incassi_completo.csv" | cut -d',' -f15 | grep -E '[0-9]{2}/[0-9]{2}/[0-9]{2}' | cut -d'/' -f1,2 | sort | uniq -c | head -10 | while read count mese_anno; do
|
|
echo " - Periodo $mese_anno: $count incassi" | tee -a "$ANALYSIS_LOG"
|
|
done
|
|
|
|
# 4. ANALISI FILE UNICREDIT
|
|
echo "" | tee -a "$ANALYSIS_LOG"
|
|
echo "=== FASE 4: ANALISI FILE UNICREDIT ===" | tee -a "$ANALYSIS_LOG"
|
|
|
|
if [ -f "$UNICREDIT_FILE" ]; then
|
|
echo "Analyzing Unicredit WRI file..." | tee -a "$ANALYSIS_LOG"
|
|
|
|
# Cerca l'inizio dei dati CSV
|
|
CSV_START_LINE=$(grep -n "Data;Valuta;Descrizione;Euro;Caus." "$UNICREDIT_FILE" | head -1 | cut -d':' -f1)
|
|
if [ -n "$CSV_START_LINE" ]; then
|
|
TOTAL_MOVEMENTS=$(tail -n +$((CSV_START_LINE + 1)) "$UNICREDIT_FILE" | grep -E '^[0-9]{2}/[0-9]{2}/[0-9]{4}' | wc -l)
|
|
echo " - Total bank movements: $TOTAL_MOVEMENTS" | tee -a "$ANALYSIS_LOG"
|
|
|
|
# Analisi causali bancarie
|
|
echo " - Bank transaction codes:" | tee -a "$ANALYSIS_LOG"
|
|
tail -n +$((CSV_START_LINE + 1)) "$UNICREDIT_FILE" | grep -E '^[0-9]{2}/[0-9]{2}/[0-9]{4}' | cut -d';' -f5 | sort | uniq -c | while read count code; do
|
|
case "$code" in
|
|
"048") echo " - $code: $count transactions (BONIFICO ENTRATA)" | tee -a "$ANALYSIS_LOG" ;;
|
|
"219") echo " - $code: $count transactions (IMPOSTA BOLLO)" | tee -a "$ANALYSIS_LOG" ;;
|
|
*) echo " - $code: $count transactions" | tee -a "$ANALYSIS_LOG" ;;
|
|
esac
|
|
done
|
|
|
|
# Analisi importi
|
|
echo " - Amount analysis:" | tee -a "$ANALYSIS_LOG"
|
|
TOTAL_ENTRATE=$(tail -n +$((CSV_START_LINE + 1)) "$UNICREDIT_FILE" | grep -E '^[0-9]{2}/[0-9]{2}/[0-9]{4}' | grep ';048$' | cut -d';' -f4 | tr ',' '.' | awk '{sum += $1} END {printf "%.2f", sum}')
|
|
TOTAL_USCITE=$(tail -n +$((CSV_START_LINE + 1)) "$UNICREDIT_FILE" | grep -E '^[0-9]{2}/[0-9]{2}/[0-9]{4}' | grep -v ';048$' | cut -d';' -f4 | grep '^-' | tr ',' '.' | sed 's/-//' | awk '{sum += $1} END {printf "%.2f", sum}')
|
|
|
|
echo " - Total entrate (048): €$TOTAL_ENTRATE" | tee -a "$ANALYSIS_LOG"
|
|
echo " - Total uscite: €$TOTAL_USCITE" | tee -a "$ANALYSIS_LOG"
|
|
|
|
# Estrazione sample per pattern matching
|
|
echo " - Sample entries for pattern analysis:" | tee -a "$ANALYSIS_LOG"
|
|
tail -n +$((CSV_START_LINE + 1)) "$UNICREDIT_FILE" | grep ';048$' | head -5 | while IFS=';' read data valuta descrizione importo caus; do
|
|
echo " - $data: €$importo - $(echo "$descrizione" | cut -c1-50)..." | tee -a "$ANALYSIS_LOG"
|
|
done
|
|
|
|
else
|
|
echo " - WARNING: Could not find CSV data start in Unicredit file" | tee -a "$ANALYSIS_LOG"
|
|
fi
|
|
else
|
|
echo " - WARNING: Unicredit file not found at $UNICREDIT_FILE" | tee -a "$ANALYSIS_LOG"
|
|
fi
|
|
|
|
# 5. MAPPATURA RELAZIONI CROSS-TABLE
|
|
echo "" | tee -a "$ANALYSIS_LOG"
|
|
echo "=== FASE 5: MAPPATURA RELAZIONI CROSS-TABLE ===" | tee -a "$ANALYSIS_LOG"
|
|
|
|
# Correlazione condomini in incassi vs condomini master
|
|
if [ -f "$OUTPUT_DIR/condomini_completo.csv" ]; then
|
|
echo "Cross-referencing condomini in incassi vs master table..." | tee -a "$ANALYSIS_LOG"
|
|
|
|
# Condomini unici negli incassi
|
|
COND_IN_INCASSI=$(tail -n +2 "$OUTPUT_DIR/incassi_completo.csv" | cut -d',' -f2 | sort | uniq | wc -l)
|
|
# Condomini totali
|
|
COND_TOTAL=$(tail -n +2 "$OUTPUT_DIR/condomini_completo.csv" | cut -d',' -f2 | sort | uniq | wc -l)
|
|
|
|
echo " - Condomini with payments: $COND_IN_INCASSI" | tee -a "$ANALYSIS_LOG"
|
|
echo " - Total condomini: $COND_TOTAL" | tee -a "$ANALYSIS_LOG"
|
|
echo " - Payment coverage: $(echo "scale=1; $COND_IN_INCASSI * 100 / $COND_TOTAL" | bc -l)%" | tee -a "$ANALYSIS_LOG"
|
|
fi
|
|
|
|
# Correlazione rate vs incassi (se esistono entrambe)
|
|
if [ -f "$OUTPUT_DIR/rate_condominiali.csv" ]; then
|
|
echo "Cross-referencing rate vs incassi..." | tee -a "$ANALYSIS_LOG"
|
|
|
|
RATE_TOTALI=$(tail -n +2 "$OUTPUT_DIR/rate_condominiali.csv" | wc -l)
|
|
INCASSI_TOTALI=$(tail -n +2 "$OUTPUT_DIR/incassi_completo.csv" | wc -l)
|
|
|
|
echo " - Total rate emesse: $RATE_TOTALI" | tee -a "$ANALYSIS_LOG"
|
|
echo " - Total incassi registrati: $INCASSI_TOTALI" | tee -a "$ANALYSIS_LOG"
|
|
echo " - Collection ratio: $(echo "scale=1; $INCASSI_TOTALI * 100 / $RATE_TOTALI" | bc -l)%" | tee -a "$ANALYSIS_LOG"
|
|
fi
|
|
|
|
# 6. CREAZIONE REPORT INTEGRAZIONE
|
|
echo "" | tee -a "$ANALYSIS_LOG"
|
|
echo "=== FASE 6: INTEGRATION MAPPING ===" | tee -a "$ANALYSIS_LOG"
|
|
|
|
cat > "$OUTPUT_DIR/mapping_integrazione.md" << 'EOF'
|
|
# MAPPING INTEGRAZIONE FLUSSO FINANZIARIO
|
|
|
|
## Relazioni Identificate
|
|
|
|
### 1. INCASSI → CONDOMINI
|
|
```sql
|
|
incassi.cod_cond = condomin.cod_cond
|
|
```
|
|
|
|
### 2. INCASSI → CONTI BANCARI
|
|
```sql
|
|
incassi.cod_cassa = Anagr_casse.Codice
|
|
```
|
|
|
|
### 3. OPERAZIONI → CONTI BANCARI
|
|
```sql
|
|
operazioni.cod_cassa = Anagr_casse.Codice
|
|
```
|
|
|
|
### 4. OPERAZIONI → FORNITORI
|
|
```sql
|
|
operazioni.cod_ben = Rubrica.ID
|
|
```
|
|
|
|
### 5. RATE → INCASSI (Cross-Reference)
|
|
```sql
|
|
-- Complex matching required
|
|
rate.id_condomino = incassi.cod_cond
|
|
AND rate.n_mese = incassi.n_mese
|
|
AND rate.o_r_s = incassi.o_r_s
|
|
AND ABS(rate.importo_dovuto_euro - incassi.importo_pagato_euro) < 1.00
|
|
```
|
|
|
|
### 6. INCASSI → MOVIMENTI BANCARI (Pattern Matching)
|
|
```sql
|
|
-- Matching via pattern recognition
|
|
movimenti_bancari.controparte_nome LIKE CONCAT('%', condomin.nom_cond, '%')
|
|
AND ABS(movimenti_bancari.importo - incassi.importo_pagato_euro) < 1.00
|
|
AND ABS(DATEDIFF(movimenti_bancari.data_operazione, incassi.dt_empag)) <= 30
|
|
```
|
|
|
|
## Pattern Unicredit Identificati
|
|
|
|
- **Causale 048**: Bonifici in entrata (pagamenti condomini)
|
|
- **Causale 219**: Commissioni bancarie
|
|
- **Pattern UI**: `([A-D])\s*-?\s*(\d+)` per estrazione Scala-Interno
|
|
- **Pattern Nome**: `BONIFICO SEPA DA\s+([A-Z\s]+)\s+PER` per nome pagatore
|
|
|
|
## Import Sequence Raccomandato
|
|
|
|
1. **Conti bancari** (da Anagr_casse)
|
|
2. **Fornitori** (da Rubrica)
|
|
3. **Incassi** (da incassi)
|
|
4. **Movimenti bancari** (da file Unicredit)
|
|
5. **Pattern matching** automatico
|
|
6. **Riconciliazione** manuale sospesi
|
|
EOF
|
|
|
|
echo "Integration mapping created: $OUTPUT_DIR/mapping_integrazione.md" | tee -a "$ANALYSIS_LOG"
|
|
|
|
# 7. SUMMARY FINALE
|
|
echo "" | tee -a "$ANALYSIS_LOG"
|
|
echo "=== SUMMARY FLUSSO FINANZIARIO ===" | tee -a "$ANALYSIS_LOG"
|
|
echo "Files extracted:" | tee -a "$ANALYSIS_LOG"
|
|
for file in "$OUTPUT_DIR"/*.csv; do
|
|
if [ -f "$file" ]; then
|
|
filename=$(basename "$file")
|
|
lines=$(cat "$file" | wc -l)
|
|
size=$(du -h "$file" | cut -f1)
|
|
echo "- $filename: $((lines - 1)) records, $size" | tee -a "$ANALYSIS_LOG"
|
|
fi
|
|
done
|
|
|
|
echo "" | tee -a "$ANALYSIS_LOG"
|
|
echo "Next steps:" | tee -a "$ANALYSIS_LOG"
|
|
echo "1. Create Laravel migrations for: incassi, conti_bancari, fornitori" | tee -a "$ANALYSIS_LOG"
|
|
echo "2. Implement Unicredit WRI import service" | tee -a "$ANALYSIS_LOG"
|
|
echo "3. Build pattern matching engine for auto-reconciliation" | tee -a "$ANALYSIS_LOG"
|
|
echo "4. Create dashboard for payment tracking and gap analysis" | tee -a "$ANALYSIS_LOG"
|
|
|
|
echo "" | tee -a "$ANALYSIS_LOG"
|
|
echo "Completed: $(date)" | tee -a "$ANALYSIS_LOG"
|
|
echo "=== END FINANCIAL FLOW ANALYSIS ===" | tee -a "$ANALYSIS_LOG"
|
|
|
|
echo ""
|
|
echo "✅ Financial flow analysis completed!"
|
|
echo "📁 Files saved to: $OUTPUT_DIR"
|
|
echo "📊 Analysis log: $ANALYSIS_LOG"
|
|
echo "🗺️ Integration mapping: $OUTPUT_DIR/mapping_integrazione.md"
|