meta data for this page
  •  

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
cashdata [2025/12/16 15:39] – created admincashdata [2026/02/11 14:54] (current) francesco
Line 1: Line 1:
-====== CashData ======+====== CASHDATA - Documentazione Tecnica Completa ====== 
 + 
 +\\ 
 +===== Indice ===== 
 +  - [[#panoramica_del_sistema|Panoramica del Sistema]] 
 +  - [[#architettura_e_struttura_del_progetto|Architettura e Struttura del Progetto]] 
 +  - [[#configurazione_e_nuova_installazione|Configurazione e Nuova Installazione]] 
 +  - [[#funzionalita_principali|Funzionalità Principali]] 
 +  - [[#gestione_vendite|Gestione Vendite]] 
 +  - [[#chiusura_cassa|Chiusura Cassa]] 
 +  - [[#inventario_e_giacenze|Inventario e Giacenze]] 
 +  - [[#anagrafica_articoli|Anagrafica Articoli]] 
 +  - [[#gestione_operatori_e_permessi|Gestione Operatori e Permessi]] 
 +  - [[#sistema_di_reportistica|Sistema di Reportistica]] 
 +  - [[#integrazione_con_erp2|Integrazione con ERP2]] 
 +  - [[#integrazione_con_bilancia|Integrazione con Bilancia]] 
 +  - [[#schema_database|Schema Database]] 
 +  - [[#troubleshooting|Troubleshooting]] 
 + 
 +---- 
 + 
 +===== 1. Panoramica del Sistema ===== 
 + 
 +==== 1.1 Descrizione ==== 
 +CASHDATA è un **sistema POS (Point of Sale)** desktop professionale sviluppato in C# con Windows Forms, destinato alla gestione di casse registratrici per il settore retail, in particolare per il fashion (abbigliamento con gestione taglie/colori). 
 + 
 +\\ 
 +==== 1.2 Tecnologie Utilizzate ==== 
 + 
 +^ Componente ^ Tecnologia ^ 
 +| Framework | .NET Framework 4.7.2 | 
 +| UI | Windows Forms | 
 +| Database | SQL Server (via SQLOLEDB.1) | 
 +| ORM | Entity Framework | 
 +| Reporting | ComponentOne C1Report | 
 +| Excel | SpreadsheetGear 2017 | 
 +| JSON | Newtonsoft.Json 13.0.3 | 
 +| UI Avanzata | Krypton Ribbon | 
 + 
 +\\ 
 +==== 1.3 Componenti della Solution ==== 
 + 
 +<code> 
 +CASHDATA.sln 
 +├── CASHDATA (Applicazione principale - EXE) 
 +│   ├── Program.cs (Entry point) 
 +│   ├── Form1.cs (Form test) 
 +│   ├── Login.cs (Form login) 
 +│   └── Template XML per report 
 +│ 
 +└── LIBAYCASH (Libreria principale - DLL) 
 +    ├── Home.cs (Form principale) 
 +    ├── Config.cs (Configurazione globale) 
 +    ├── Utility.cs (Funzioni utility) 
 +    ├── 143+ file C# (logica applicativa) 
 +    └── Dipendenze: LIBAYCMN 
 +</code> 
 + 
 +---- 
 + 
 +===== 2. Architettura e Struttura del Progetto ===== 
 + 
 +==== 2.1 Struttura Directory ==== 
 + 
 +<code> 
 +D:\dev.net\CashData
 +├── CASHDATA\                    # Progetto principale 
 +│   ├── bin\Debug\              # Output compilato 
 +│   ├── Resources\              # Icone e immagini 
 +│   ├── *.xml                   # Template report 
 +│   └── App.config              # Configurazione app 
 +│ 
 +├── LIBAYCASH\                   # Libreria logica 
 +│   ├── Properties\ 
 +│   │   └── Settings.settings   # Impostazioni DB 
 +│   ├── Home.cs                 # Form principale 
 +│   ├── Config.cs               # Configurazione 
 +│   └── [143+ file .cs]         # Classi logica 
 +│ 
 +├── CreateNewDb\                 # Utility creazione DB 
 +├── Script_DB\                   # Script SQL 
 +│   ├── per C#\                 # Script TCS 
 +│   └── TTCS_ALL_INSTALLATION\ 
 +│ 
 +└── RELEASE\                     # File di release 
 +</code> 
 + 
 +\\ 
 +==== 2.2 Entry Point dell'Applicazione ==== 
 + 
 +<code csharp> 
 +// Program.cs 
 +[STAThread] 
 +static void Main() 
 +
 +    Application.EnableVisualStyles(); 
 +    Application.SetCompatibleTextRenderingDefault(false); 
 +    string assemblyVersion = Assembly.GetExecutingAssembly() 
 +                                     .GetName().Version.ToString(); 
 +    Application.Run(new LIBAYCASH.Home(assemblyVersion)); 
 +
 +</code> 
 + 
 +\\ 
 +==== 2.3 Parametri da Riga di Comando ==== 
 + 
 +<code> 
 +CASHDATA.exe [UserShowLevel] [SkipLogTableCheck] 
 +</code> 
 + 
 +  * **UserShowLevel**: Livello visualizzazione interfaccia (default: dalla config) 
 +  * **SkipLogTableCheck**: Se presente, salta il controllo tabella LOG 
 + 
 +---- 
 + 
 +===== 3. Configurazione e Nuova Installazione ===== 
 + 
 +==== 3.1 Checklist Nuova Installazione ==== 
 + 
 +=== FASE 1: Preparazione Database === 
 +  * Installare SQL Server (Express o Standard) 
 +  * Creare database vuoto (nome consigliato: ''TTCS'' o ''TTCS_LOCAL'' per sviluppo) 
 +  * Configurare account SQL (es. ''sa'') con password 
 +  * Verificare che l'account SQL abbia permessi sufficienti sul database 
 + 
 +\\ 
 +=== FASE 2: Esecuzione Script SQL === 
 +Eseguire in ordine dalla cartella ''RELEASE\01\'': 
 +  - ''00_DB_CREATION_CREATEDB.sql'' - Creazione struttura DB 
 +  - ''01_DB_CREATION_PROCEDURE.sql'' - Stored procedures 
 +  - ''02_DB_CREATION_TABLES.sql'' - Tabelle, dati iniziali, utenti e gruppi 
 +  - ''03_DB_CREATION_WITH_PROMO.sql'' - Dati promozioni 
 + 
 +**Nota:** Lo script ''02_DB_CREATION_TABLES.sql'' include automaticamente: 
 +  * Parametri di configurazione (''CASSA_CONFIG_PARAMETER'') per tutte e 3 le sezioni (10, 20, 30) 
 +  * Parametri runtime (''CASSA_PARAMETER'') inclusi RECEIPT_COUNTER_PWD, HOMEMENU_ENABLED 
 +  * Parametri per-PC (''CASSA_PARAMETER_PC'') inclusi NEW_DAYLY_CLOSURE, NEW_START_BILL 
 +  * Gruppi utente predefiniti (GSU, ADMINISTRATORS GROUP, MANAGER, USER) 
 +  * Utenti predefiniti (su, Administator, Manager, User) con password impostate al primo avvio 
 +  * Stampante predefinita "Microsoft Print to PDF" per tutti i tipi documento 
 +  * Valori LIC (licenza) vuoti per consentire la prima installazione 
 + 
 +\\ 
 +=== FASE 3: Configurazione Iniziale === 
 +Modificare ed eseguire ''Cose da fare per nuova installazione\02 Reimposta dati.sql'': 
 + 
 +<code sql> 
 +DECLARE @firma INT = 10;                    -- Codice azienda 
 +DECLARE @currentshop VARCHAR(6) = '000002'; -- Codice negozio 
 +DECLARE @shopnr INT = 84;                   -- Numero univoco negozio 
 +DECLARE @releasefor INT = 84;               -- Numero PC (= shopnr per singola cassa) 
 +DECLARE @ivadefault VARCHAR(5) = '22';      -- Aliquota IVA default 
 +DECLARE @cashclosuredate VARCHAR(8) = '20240201'; -- Data prima chiusura 
 +</code> 
 + 
 +Questo script aggiorna automaticamente anche: 
 +  * I valori LIC (licenza) vengono azzerati per consentire la prima installazione 
 +  * Il parametro ACTIVATION viene impostato a '.' 
 + 
 +\\ 
 +=== FASE 4: Compilazione Applicazione === 
 +  * Aprire la solution ''CASHDATA.sln'' in Visual Studio 
 +  * Impostare la configurazione su **Release** e piattaforma **x86** 
 +  * Compilare la solution 
 +  * Copiare il contenuto della cartella di output nella cartella di installazione (es. ''C:\APP - LOCAL\CASHDATA''
 + 
 +\\ 
 +=== FASE 5: Configurazione CashData.xml === 
 +Prima di avviare l'applicazione, configurare il file ''CashData.xml'' nella cartella di installazione: 
 + 
 +<code xml> 
 +<?xml version="1.0" encoding="utf-8"?> 
 +<configuration> 
 +  <appSettings> 
 +    <add key="cnn_server" value="localhost\SQLEXPRESS" /> 
 +    <add key="cnn_database" value="TTCS_LOCAL" /> 
 +    <add key="cnn_user" value="sa" /> 
 +    <add key="cnn_password" value="la_tua_password" /> 
 +    <add key="ReleaseFor" value="84" /> 
 +    <add key="PCisSqlServer" value="false" /> 
 +  </appSettings> 
 +</configuration> 
 +</code> 
 + 
 +**Parametri importanti:** 
 + 
 +^ Parametro ^ Descrizione ^ Note ^ 
 +| ''cnn_server'' | Indirizzo SQL Server | Es. ''localhost\SQLEXPRESS'', ''192.168.1.100''
 +| ''cnn_database'' | Nome database | Deve corrispondere al DB creato nella FASE 1 | 
 +| ''cnn_user'' | Utente SQL | Es. ''sa''
 +| ''cnn_password'' | Password SQL | Password dell'utente SQL | 
 +| ''ReleaseFor'' | ID univoco del PC | Deve corrispondere a @releasefor dello script | 
 +| ''PCisSqlServer'' | Il PC e' il SQL Server | **''false''** se SQL Server non e' locale o l'utente SQL non ha permessi BACKUP. Impostare a ''true'' solo se si vuole il backup automatico del DB | 
 + 
 +\\ 
 +=== FASE 6: Primo Avvio Applicazione === 
 +  - **Avviare ''CASHDATA.exe''** dalla cartella di installazione 
 +  - **Cartella di installazione**: Al primo avvio, l'app chiede di confermare la cartella. Selezionare il percorso dove e' stato copiato l'eseguibile (es. ''C:\APP - LOCAL\CASHDATA''
 +  - **Creazione sottocartelle**: L'applicazione crea automaticamente: ''DDT\'', ''Received\'', ''ToSend\'', ''backup\'', ''basic\'', ''EXCEL\'' 
 +  - **Inizializzazione utenti**: La funzione ''ChechForNewFunction()'' al primo avvio: 
 +    * Popola automaticamente la tabella ''CASSA_USER_FUNCTIONGROUP'' con i permessi per ogni gruppo 
 +    * Imposta le password predefinite per gli utenti 
 +  - **Login**: Usare le credenziali predefinite: 
 + 
 +^ Utente ^ Password ^ Livello ^ 
 +| su | su28053 | SuperUser (99) | 
 +| Administator | admincash | Amministratore (30) | 
 +| Manager | manager1 | Manager (20) | 
 +| User | user | Utente base (10) | 
 + 
 +\\ 
 +==== 3.2 Architettura dei Parametri ==== 
 + 
 +Il sistema CASHDATA utilizza **3 tabelle distinte** per i parametri, ognuna con uno scopo diverso: 
 + 
 +=== 3.2.1 CASSA_CONFIG_PARAMETER (Configurazione) === 
 +Tabella principale di configurazione a 3 livelli (sezioni): 
 + 
 +^ Sezione ^ RELEASEDFOR ^ Scopo ^ Caricamento ^ 
 +| 10 | -1 | Parametri negozio (globali) | ''Config.Parametri'' via ''getParValueByKey()''
 +| 20 | N (=ReleaseFor) | Flag funzioni UI (solo TRUE) | ''Config.Funzioni''
 +| 30 | N (=ReleaseFor) | Parametri per-PC/hardware | ''Config.Parametri'' (sovrascrive sez. 10) | 
 + 
 +**Lettura:** ''ReadConfigParameter(name, releasedfor, section)'' oppure ''getParValueByKey(key)'' per le sezioni 10+30. 
 + 
 +=== 3.2.2 CASSA_PARAMETER (Parametri Runtime Globali) === 
 +Parametri operativi condivisi da tutte le casse del negozio (contatori, percorsi, password). 
 + 
 +**Lettura:** ''ReadParameter(name, increment)'' con ''cash_nr = 0'' (default). 
 + 
 +^ Parametro ^ Valore ^ Descrizione ^ 
 +| NEW_CLOSUREID | 1 | Contatore ID chiusura | 
 +| NEW_START_BILL | 1 | Contatore scontrini (se globale) | 
 +| RECEIPT_COUNTER_PWD | tex01 | Password reset contatore scontrini | 
 +| INVENTORY_PWD | tex01 | Password conferma inventario | 
 +| HOMEMENU_ENABLED | 0 | Menu home abilitato (0/1) | 
 +| LAST_TCS | 1 | Ultimo file TCS eseguito | 
 +| DDT_FILE | c:\texdatacash\DDT\ | Percorso caricamento DDT | 
 +| SALES_EXCEL_FILE | ... | Percorso report vendite Excel | 
 +| STOCK_EXCEL_FILE | ... | Percorso report giacenze Excel | 
 + 
 +=== 3.2.3 CASSA_PARAMETER_PC (Parametri Runtime per-PC) === 
 +Parametri specifici per ogni cassa/PC, identificati dalla colonna ''CASH_NR''
 + 
 +**Lettura:** ''ReadParameter(name, increment, Config.CASHNUMBER)'' con ''cash_nr != 0''
 + 
 +^ Parametro ^ Valore ^ Descrizione ^ 
 +| NEW_DAYLY_CLOSURE | 1 | Contatore chiusura giornaliera per cassa | 
 +| NEW_START_BILL | 1 | Contatore scontrini per cassa | 
 + 
 +\\ 
 +==== 3.3 Parametri di Configurazione Essenziali ==== 
 + 
 +=== Parametri in CASSA_CONFIG_PARAMETER === 
 + 
 +^ Parametro ^ Sezione ^ Valore Esempio ^ Descrizione ^ 
 +| FIRMA_SHOP | 10 | 10 | Codice azienda | 
 +| CURRENT_SHOP | 10 | 000002 | Codice negozio DIAMOD | 
 +| VAT_DEFAULT | 10 | 22 | Aliquota IVA % | 
 +| VAT_BUONO | 10 | 22 | IVA per buoni | 
 +| BARCODELEN | 10 | 13 | Lunghezza EAN | 
 +| LanguageCode | 10 | 0 | 0=Italiano, 1=Tedesco | 
 +| DecimalSeparator | 10 | , | Separatore decimali | 
 +| GroupSeparator | 10 | . | Separatore migliaia | 
 +| CurrencySymbol | 10 | EUR | Simbolo valuta | 
 +| INSTALLFOLDER | 30 | C:\APP - LOCAL\CASHDATA | Cartella installazione | 
 +| LIC_SOSerial | 30 | //(vuoto)// | Seriale licenza (vuoto per nuova installazione) | 
 +| LIC_Volume | 30 | //(vuoto)// | Volume licenza (vuoto per nuova installazione) | 
 +| LIC_ACTIVATE | 30 | //(vuoto)// | Stato attivazione (vuoto per nuova installazione) | 
 + 
 +\\ 
 +==== 3.4 Connection String ==== 
 + 
 +<code> 
 +Provider=SQLOLEDB.1;Data Source=SERVER\SQLEXPRESS;Initial Catalog=TTCS;User ID=sa;Password=xxx; 
 +</code> 
 + 
 +\\ 
 +==== 3.5 Configurazione Moduli ==== 
 + 
 +^ Modulo ^ Parametro ^ Descrizione ^ 
 +| Fornitori | MODULE_SUPPLIER | Gestione fornitori | 
 +| Clienti | MODULE_CUSTOMER | Anagrafica clienti e fedeltà | 
 +| Venditori | MODULE_SELLER | Tracciamento venditori | 
 +| Multi-negozio | MODULE_MULTISHOP | Gestione multi-punto vendita | 
 + 
 +---- 
 + 
 +===== 4. Funzionalità Principali ===== 
 + 
 +==== 4.1 Mappa Funzionalità ==== 
 + 
 +<code> 
 +┌─────────────────────────────────────────────────────────────┐ 
 +│                      HOME (Form Principale)                  │ 
 +├──────────────────────┬──────────────────────────────────────┤ 
 +│  OPERAZIONI CASSA    │  GESTIONE                           │ 
 +│  ├─ Vendita          │  ├─ Anagrafica Articoli             │ 
 +│  ├─ Reso             │  ├─ Listini Prezzi                  │ 
 +│  ├─ Sconti           │  ├─ Clienti                         │ 
 +│  ├─ Buoni/Coupon     │  ├─ Fornitori                       │ 
 +│  └─ Sospensione      │  └─ Operatori                       │ 
 +├──────────────────────┼──────────────────────────────────────┤ 
 +│  CHIUSURA            │  REPORT                              │ 
 +│  ├─ Chiusura Cassa   │  ├─ Vendite                         │ 
 +│  ├─ Storico          │  ├─ Sell-Out                        │ 
 +│  └─ Differenze       │  ├─ Corrispettivi                   │ 
 +│                      │  └─ Giornale Cassa                  │ 
 +├──────────────────────┴──────────────────────────────────────┤ 
 +│  DOCUMENTI: DDT | MIV | Etichette                           │ 
 +└─────────────────────────────────────────────────────────────┘ 
 +</code> 
 + 
 +---- 
 + 
 +===== 5. Gestione Vendite ===== 
 + 
 +==== 5.1 Flusso di Vendita ==== 
 + 
 +<code> 
 +1. SCANSIONE ARTICOLO (EAN) 
 +   └─> ArticleCheck() verifica articolo e prezzo 
 + 
 +2. AGGIUNTA AL CARRELLO 
 +   └─> addArticoloCarrello() crea record SCONTRINO 
 + 
 +3. MODIFICA (opzionale) 
 +   ├─> Quantità: btnTastierinoSpec1_Click() 
 +   ├─> Prezzo: LogicaPrezzo() 
 +   └─> Sconto %: LogicaPercentuale() 
 + 
 +4. PAGAMENTO 
 +   └─> btnPaga_Click() apre dialog PAY 
 +       └─> Selezione metodo pagamento 
 +       └─> Stampa scontrino fiscale 
 +       └─> Registrazione in CASSA_SALES 
 + 
 +5. CHIUSURA TRANSAZIONE 
 +   └─> Eliminazione record SCONTRINO temporanei 
 +</code> 
 + 
 +\\ 
 +==== 5.2 Metodi di Pagamento ==== 
 + 
 +^ Codice ^ Costante ^ Descrizione ^ 
 +| 1 | PAYMANT_MONEY_CODE | Contanti | 
 +| 2 | PAYMANT_CARD_CODE | Carta di credito | 
 +| 3 | PAYMANT_BANCOMAT_CODE | Bancomat | 
 +| 4 | PAYMANT_CHEQUE_CODE | Assegni | 
 +| 5 | PAYMANT_COUPON_CODE | Buoni/Coupon | 
 +| 9 | PAYMANT_DISCOUNT_CODE | Sconto | 
 + 
 +\\ 
 +==== 5.3 Gestione Sconti ==== 
 + 
 +^ Causale ^ Codice ^ Descrizione ^ 
 +| PR | SpecialOffer | Offerta speciale | 
 +| SA | Sales | Svendita | 
 +| FS | EndSeries | Fine serie | 
 +| MF | BrokenArticle | Articolo difettoso | 
 +| VP | Staff | Sconto personale | 
 +| AR | RoundingPrice | Arrotondamento | 
 +| CL | Customer | Sconto cliente | 
 +| AL | OtherReason | Altro motivo | 
 + 
 +\\ 
 +==== 5.4 Tipi di Sconto ==== 
 + 
 +<code csharp> 
 +public enum Discount_Type 
 +
 +    Inserted,      // Sconto diretto 
 +    Progressive,   // Cumula con sconti precedenti 
 +    Sum            // Somma percentuali 
 +
 +</code> 
 + 
 +\\ 
 +==== 5.5 Gestione Resi ==== 
 + 
 +  * Stato articolo: ''Config.STATO_RESO = "R"'' 
 +  * Quantità diventa negativa (-1) 
 +  * Se ''AskReturnCause = true'': richiede causale reso 
 +  * Tabella causali: ''CASSA_RETURN_CAUSE'' 
 + 
 +\\ 
 +==== 5.6 Sistema Attese (Sospensione) ==== 
 + 
 +  * Massimo 4 transazioni contemporanee 
 +  * Ogni attesa ha colore distinto 
 +  * Struct ''ATTESA'' memorizza stato: 
 + 
 +<code csharp> 
 +struct ATTESA { 
 +    List<DataGridViewRow> dgSpesa; 
 +    CASSA_CUSTOMER cliente; 
 +    int pezziTot; 
 +    double toto; 
 +    int punti; 
 +
 +</code> 
 + 
 +---- 
 + 
 +===== 6. Chiusura Cassa ===== 
 + 
 +==== 6.1 Flusso Chiusura ==== 
 + 
 +<code> 
 +TAB 0: CONTEGGIO DENARO 
 +├─ Inserimento per taglio (€50, €20, €10, €5, €2, €1, cent) 
 +├─ Calcolo totale inserito 
 +└─ Verifica differenza con sistema 
 + 
 +TAB 1: VERIFICA PAGAMENTI 
 +├─ Visualizzazione totali per metodo 
 +├─ Inserimento importi verificati 
 +├─ Spunta verifica completata 
 +└─ Differenza totale deve essere = 0 
 + 
 +TAB 2: CONFERMA FINALE 
 +├─ Prelievo contante finale 
 +├─ Calcolo nuovo fondo cassa 
 +└─ Conferma chiusura 
 + 
 +PROCESSO CHIUSURA (Utility.ChiusuraCassa) 
 +├─ Comunicazione registratore telematico (rapporto Z) 
 +├─ Stampa rapporto chiusura 
 +├─ TRANSAZIONE DATABASE: 
 +│   ├─ UPDATE CASSA_FUND (nuovo fondo) 
 +│   ├─ UPDATE CASSA_SALES (stato 0→10) 
 +│   ├─ UPDATE CASSA_SALES_PAYMODE (stato 0→10) 
 +│   ├─ INSERT CASSA_DAILY_CLOSURE 
 +│   ├─ EXEC PRC_SALES_CLOSURE_IVA 
 +│   └─ CloseCashSession() 
 +├─ Stampa rapporto differenze (opzionale) 
 +└─ Esportazione dati (se configurato) 
 +</code> 
 + 
 +\\ 
 +==== 6.2 Stati delle Vendite ==== 
 + 
 +<code csharp> 
 +public enum SaleStatus 
 +
 +    NewSales = 0,              // Non ancora chiuso 
 +    SalesSessionClosed = 10,   // Chiuso in sessione 
 +    Exported = 20,             // Esportato 
 +    SendedToCentral = 35,      // Inviato a centrale 
 +    AcceptedFromCentral = 90   // Accettato 
 +
 +</code> 
 + 
 +\\ 
 +==== 6.3 Tabelle Coinvolte ==== 
 + 
 +^ Tabella ^ Descrizione ^ 
 +| CASSA_DAILY_CLOSURE | Storico chiusure giornaliere | 
 +| CASSA_FUND | Fondo cassa attuale | 
 +| CASSA_FUND_PROTOCOL | Movimenti fondo | 
 +| CASSA_SALES | Vendite registrate | 
 +| CASSA_SALES_PAYMODE | Dettaglio pagamenti | 
 + 
 +\\ 
 +==== 6.4 Codici Speciali in CASSA_DAILY_CLOSURE ==== 
 + 
 +^ CDC_PAYTYPECODE ^ Significato ^ 
 +| -1 | Differenza cassa | 
 +| -2 | Fondo cassa | 
 +| 1-N | Codici metodo pagamento | 
 + 
 +---- 
 + 
 +===== 7. Inventario e Giacenze ===== 
 + 
 +==== 7.1 Tabelle di Gestione ==== 
 + 
 +^ Tabella ^ Descrizione ^ 
 +| AY_CASSA_VENDITE | Vendite registrate | 
 +| AY_CASSA_VENDITE_ECCESSO | Vendite oltre stock | 
 +| CASSA_STOCK | Giacenze per articolo | 
 +| CASSA_TMP_STOCK_GRID_* | Tabelle temporanee | 
 + 
 +\\ 
 +==== 7.2 Calcolo Giacenza ==== 
 + 
 +<code> 
 +Giacenza Finale = Giacenza Iniziale - Quantità Venduta 
 +Sell Out % = (Quantità Venduta / Quantità Iniziale) × 100 
 +</code> 
 + 
 +\\ 
 +==== 7.3 Supporto Multi-Magazzino ==== 
 + 
 +  * Campo ''CODMAG'' in tutte le tabelle movimenti 
 +  * Parametro ''MODULE_MULTISHOP'' abilita gestione 
 +  * ''CURRENT_SHOP'' identifica magazzino corrente 
 + 
 +\\ 
 +==== 7.4 Report Inventario ==== 
 + 
 +^ Report ^ Stored Procedure ^ Descrizione ^ 
 +| SELLOUT | PRC_CASSA_SELLOUT_V001 | Analisi sell-out | 
 +| SALESREPORT | PRC_CASSA_SALESREPORT_V001 | Dettaglio vendite | 
 +| DAILYDATA | PRC_CASSA_DAILYDATA_V001 | Corrispettivi | 
 + 
 +---- 
 + 
 +===== 8. Anagrafica Articoli ===== 
 + 
 +==== 8.1 Struttura CASSA_ARTICOLO ==== 
 + 
 +^ Campo ^ Tipo ^ Descrizione ^ 
 +| ART_FIRMA | INT | Codice azienda | 
 +| ART_EAN | NVARCHAR(20) | Codice a barre | 
 +| ART_CODART | NVARCHAR(50) | Codice articolo | 
 +| ART_NAME_DESC | NVARCHAR(MAX) | Descrizione | 
 +| ART_COL_DESC | NVARCHAR(50) | Descrizione colore | 
 +| ART_CODCOLOR | NVARCHAR(20) | Codice colore | 
 +| ART_SIZE | NVARCHAR(20) | Taglia | 
 +| ART_SCALA | INT | Scala taglie | 
 +| ART_VARIANTE | INT | Codice variante | 
 +| ART_VATPERCENT | DECIMAL | Aliquota IVA | 
 + 
 +\\ 
 +==== 8.2 Gestione Attributi ==== 
 + 
 +^ Tabella ^ Descrizione ^ 
 +| CASSA_ART_ATTRIB | Attributi per articolo | 
 +| CASSA_ART_ATTRIB_DESC | Descrizione attributi | 
 + 
 +Campi dinamici: ''CAA_ATTR_001'', ''CAA_ATTR_002'', ... ''CAA_ATTR_999'' 
 + 
 +\\ 
 +==== 8.3 Sistema Listini ==== 
 + 
 +^ Tabella ^ Descrizione ^ 
 +| CASSA_LISTINO_NAME | Anagrafica listini | 
 +| CASSA_LISTINO | Prezzi per articolo | 
 + 
 +**Campi Listino:** 
 +  * ''CPLN_NRLIS'': Numero listino 
 +  * ''CPLN_SAISON'': Stagione 
 +  * ''CPLN_VALIDFROM/TO'': Date validità 
 +  * ''CPL_ENDUSERPRICE'': Prezzo al pubblico 
 +  * ''CPL_ORIGINALPRICE'': Prezzo originale 
 +  * ''CPL_PRICE'': Prezzo costo 
 + 
 +\\ 
 +==== 8.4 Scale Taglie ==== 
 + 
 +^ Tabella ^ Descrizione ^ 
 +| GROESSENSKALA | Anagrafica scale | 
 +| GROESSEN | Valori taglie | 
 + 
 +**Esempio scala:** 
 + 
 +<code> 
 +Scala_Nr=1, Scala_Bezeichnung="EU Size" 
 +├─ Index=1: "XS" 
 +├─ Index=2: "S" 
 +├─ Index=3: "M" 
 +├─ Index=4: "L" 
 +└─ Index=5: "XL" 
 +</code> 
 + 
 +\\ 
 +==== 8.5 Ricerca Articoli ==== 
 + 
 +Query base: 
 + 
 +<code sql> 
 +SELECT ART_NAME_DESC, ART_COL_DESC, ART_SIZE, ART_EAN, ART_CODART 
 +FROM CASSA_ARTICOLO 
 +WHERE ART_NAME_DESC LIKE '%' + @ARTNAME + '%' 
 +  AND ART_EAN LIKE '%' + @ARTEAN + '%' 
 +  AND ART_FIRMA = @FIRMA 
 +ORDER BY ART_NAME_DESC, ART_COL_DESC, ART_SIZE 
 +</code> 
 + 
 +---- 
 + 
 +===== 9. Gestione Operatori e Permessi ===== 
 + 
 +==== 9.1 Tabelle Utenti ==== 
 + 
 +^ Tabella ^ Descrizione ^ 
 +| CASSA_USER | Anagrafica utenti | 
 +| CASSA_USER_GROUP | Gruppi utenti | 
 +| CASSA_USER_FUNCTIONGROUP | Funzioni per gruppo | 
 +| CASSA_USER_OP | Log accessi | 
 + 
 +\\ 
 +==== 9.2 Struttura CASSA_USER ==== 
 + 
 +^ Campo ^ Descrizione ^ 
 +| USR_FIRMA | Codice azienda | 
 +| USR_CODE | Codice utente (PK) | 
 +| USR_DESCR | Nome utente | 
 +| USR_PWD | Password crittografata (TripleDES) | 
 +| USR_GROUP_CODE | Gruppo appartenenza | 
 +| USR_CHECK | Hash integrità (MD5) | 
 +| USR_DISABLE | Flag disabilitazione | 
 + 
 +\\ 
 +==== 9.3 Crittografia Password ==== 
 + 
 +  * **Algoritmo**: TripleDES 
 +  * **Chiave**: MD5 di "castelletto28053" 
 +  * **Modalità**: ECB 
 +  * **Padding**: PKCS7 
 +  * **Output**: Base64 
 + 
 +\\ 
 +==== 9.4 Verifica Permessi ==== 
 + 
 +<code csharp> 
 +bool hasPermission = Utility.FunctionForUser(userCode, functionCode); 
 +</code> 
 + 
 +Se utente non ha permesso, viene richiesto cambio operatore. 
 + 
 +\\ 
 +==== 9.5 Funzioni Controllate ==== 
 + 
 +^ Funzione ^ Descrizione ^ 
 +| 0 | Accesso sistema | 
 +| 39 | Gestione posizione/reso | 
 +| 45 | Pagamento | 
 +| 49 | Aggiunta articolo | 
 +| 50 | Reso | 
 + 
 +\\ 
 +==== 9.6 Tracciamento su Scontrino ==== 
 + 
 +  * Campo ''Venditore'' in tabella SCONTRINO 
 +  * Trasferito a ''CSL_Seller'' in CASSA_SALES 
 +  * Report operatori: ''PRC_CASSA_USERREPORT_V001'' 
 + 
 +---- 
 + 
 +===== 10. Sistema di Reportistica ===== 
 + 
 +==== 10.1 Template Report (XML) ==== 
 + 
 +^ File ^ Tipo ^ Descrizione ^ 
 +| BILL.xml | Scontrino | Scontrino fiscale completo | 
 +| BILL-NO-PRICES.xml | Scontrino | Scontrino senza prezzi | 
 +| BILL_CLOSURE.xml | Chiusura | Riepilogo chiusura giornaliera | 
 +| BILL_CLOSURE_DIFF.xml | Chiusura | Rapporto differenze | 
 +| SALESREPORT.xml | Report | Dettaglio vendite | 
 +| SELLOUT.xml | Report | Analisi sell-out | 
 +| USERREPORT.xml | Report | Vendite per operatore | 
 +| DAILYDATA.xml | Report | Registro corrispettivi | 
 +| CASHPROTOCOL.xml | Report | Giornale di cassa | 
 +| DDT_0.xml | Documento | Documento di trasporto | 
 +| MIV_0.xml | Documento | Merce in visione | 
 +| LABEL_STD.xml | Etichette | Etichette articoli | 
 +| OPEN_DRAWER.xml | Cassa | Apertura cassetto | 
 + 
 +\\ 
 +==== 10.2 Stored Procedure Report ==== 
 + 
 +^ SP ^ Report ^ 
 +| dbo.BILL_PRINT | Scontrino | 
 +| dbo.BILL_CASH_CLOSURE_PRINT | Chiusura cassa | 
 +| dbo.PRC_CASSA_SALESREPORT_V001 | Vendite | 
 +| dbo.PRC_CASSA_SELLOUT_V001 | Sell-out | 
 +| dbo.PRC_CASSA_USERREPORT_V001 | Operatori | 
 +| dbo.PRC_CASSA_DAILYDATA_V001 | Corrispettivi | 
 +| dbo.PRC_CASSA_PROTOCOL_V001 | Giornale | 
 + 
 +\\ 
 +==== 10.3 Configurazione Stampanti ==== 
 + 
 +^ Tipo Documento ^ Stampante Consigliata ^ 
 +| Scontrini | Stampante termica POS | 
 +| DDT/Documenti | Stampante laser/inkjet | 
 +| Etichette | Stampante etichette (Zebra, ecc.) | 
 + 
 +\\ 
 +==== 10.4 File Logo ==== 
 + 
 +<code> 
 +D:\dev.net\CashData\CASHDATA\ 
 +├── BILLPic1.png              # Logo scontrino 
 +├── BILL_CLOSUREPic1.png      # Logo chiusura 
 +├── DDTPic1.jpg, DDTPic2.jpg  # Logo DDT 
 +└── MIVPic1.jpg, MIVPic2.jpg  # Logo MIV 
 +</code> 
 + 
 +---- 
 + 
 +===== 11. Integrazione con ERP2 ===== 
 + 
 +Questa sezione descrive come configurare l'integrazione tra CASHDATA e il gestionale **ERP2** per la sincronizzazione bidirezionale di articoli, listini, chiusure cassa e DDT. 
 + 
 +**Script di riferimento:** ''RELEASE\02 Integrazione con ERP2\'' 
 + 
 +> **Nota:** Le viste e stored procedure possono variare a seconda dell'installazione specifica del cliente. Gli script forniti sono template da adattare. 
 + 
 +\\ 
 +==== 11.1 Panoramica ==== 
 + 
 +L'integrazione ERP2 permette di: 
 +  * **Import** da ERP: Caricare articoli e listini prezzi dal gestionale alla cassa 
 +  * **Export** verso ERP: Esportare automaticamente chiusure cassa, vendite, IVA e DDT 
 +  * Sincronizzare lo stato dei DDT tra i due sistemi 
 + 
 +**Flusso bidirezionale:** 
 + 
 +<code> 
 +                    LINKED SERVER 
 +                         │ 
 +    ┌────────────────────┼────────────────────┐ 
 +    │  DB CASHDATA       │      DB ERP2       │ 
 +    │                    │                    │ 
 +    │  ┌─── IMPORT ──────┤                    │ 
 +    │  │ AY_CARICA_DDT_  │  ARTICO, BARART   │ 
 +    │  │ DA_ERP          │  LOTSER, LISRIG   │ 
 +    │  │ (SP su CASHDATA) │  IVA, MARCHE...   │ 
 +    │  │                 │                    │ 
 +    │  │ Sinonimi ERP_*──┼──► Tabelle ERP     │ 
 +    │  └─────────────────┤                    │ 
 +    │                    │                    │ 
 +    │  ┌─── EXPORT ──────┤                    │ 
 +    │  │ PRC_EXPORT_ERP  │  AY_CASSA_*       │ 
 +    │  │ (SP su CASHDATA) │  EXT_ORDINI_*     │ 
 +    │  │                 │                    │ 
 +    │  │ Sinonimi ERP_*──┼──► Tabelle ERP     │ 
 +    │  └─────────────────┤                    │ 
 +    └────────────────────┴────────────────────┘ 
 +</code> 
 + 
 +\\ 
 +==== 11.2 Parametri di Configurazione ==== 
 + 
 +Parametri da configurare in ''CASSA_CONFIG_PARAMETER'' per abilitare l'integrazione: 
 + 
 +^ Parametro ^ Sezione ^ Valore ^ Descrizione ^ 
 +| **EXPORT_ERP** | 10 | ''true'' | Abilita l'export verso ERP alla chiusura cassa | 
 +| **ExportDataForTrasmission** | 10 | ''0'' | Modalita export: ''0'' = alla chiusura cassa, ''-1'' = manuale (mostra bottone), ''N'' = ogni N millisecondi | 
 +| **ERP_CODMAG** | 20 | //(es. NEGCU)// | **Obbligatorio.** Codice magazzino nel sistema ERP. Usato anche come prefisso per chiavi DDT | 
 +| **Invio_DDT_to_ERP** | 10 | ''0'' o ''1'' | ''1'' = esporta anche i DDT verso ERP (opzionale) | 
 +| **ExportDataType** | 10 | ''0'' | Formato dati export: ''1'' = CSV, ''2'' = Excel, ''0'' = nessun file | 
 +| **Carico_Ordini** | 10 | ''false'' | Abilita caricamento ordini da ERP | 
 + 
 +\\ 
 +==== 11.3 Procedura di Installazione ==== 
 + 
 +Gli script si trovano in ''RELEASE\02 Integrazione con ERP2\'' e vanno eseguiti in ordine: 
 + 
 +=== STEP 0: Creare il Linked Server (su database master) === 
 + 
 +**Script:** ''00_Creare linked server.txt'' 
 + 
 +Crea un linked server denominato ''ERPSERVER'' per connettere SQL Server di CASHDATA a quello del gestionale ERP2. 
 + 
 +**Valori da personalizzare:** 
 + 
 +^ Parametro ^ Valore di esempio ^ Descrizione ^ 
 +| ''@datasrc'' | ''SERVER\GESTERP'' | Nome/IP e istanza del SQL Server dove risiede il DB ERP2 | 
 +| ''@rmtuser'' | ''sa'' | Utente SQL per accedere al DB ERP2 | 
 +| ''@rmtpassword'' | ''########'' | Password dell'utente SQL remoto | 
 + 
 +<code sql> 
 +-- Esempio (da 00_Creare linked server.txt) 
 +EXEC master.dbo.sp_addlinkedserver 
 +    @server = N'ERPSERVER', 
 +    @srvproduct = N'', 
 +    @provider = N'SQLNCLI', 
 +    @datasrc = N'SERVER\GESTERP'  -- PERSONALIZZARE 
 + 
 +EXEC master.dbo.sp_addlinkedsrvlogin 
 +    @rmtsrvname = N'ERPSERVER', 
 +    @useself = N'False', 
 +    @locallogin = NULL, 
 +    @rmtuser = N'sa',             -- PERSONALIZZARE 
 +    @rmtpassword = '########'     -- PERSONALIZZARE 
 +</code> 
 + 
 +Le opzioni importanti impostate dallo script: 
 +  * ''data access = true'' (necessario per le query cross-server) 
 +  * ''connect timeout = 0'' e ''query timeout = 0'' (nessun timeout) 
 +  * ''use remote collation = true'' 
 + 
 +\\ 
 +=== STEP 1: Creare tabelle e viste nel DB ERP2 === 
 + 
 +**Script:** ''01_Tabelle&Viste da creare su db ERP.txt'' 
 + 
 +Eseguire sul **database del gestionale ERP2**. Lo script crea: 
 + 
 +  - **Login e utente** ''texdatacash'' con permessi di lettura e scrittura 
 +  - **Tabelle per ricevere i dati delle chiusure cassa:** 
 +    * ''AY_CASSA_ELENCO_CHIUSURE'' - Registro chiusure esportate 
 +    * ''AY_CASSA_CHIUSURE'' - Totali per metodo pagamento 
 +    * ''AY_CASSA_CHIUSURE_IVA'' - Ripartizione IVA per chiusura 
 +    * ''AY_CASSA_PAGAMENTI'' - Anagrafica metodi di pagamento 
 +    * ''AY_CASSA_VENDITE'' - Dettaglio vendite per articolo 
 +    * ''AY_CASSA_VENDITE_ECCESSO'' - Vendite oltre giacenza teorica 
 +  - **Tabelle per DDT** (se ''Invio_DDT_to_ERP = 1''): 
 +    * ''EXT_ORDINI_TOCOMPANY'' - Testate ordini/DDT 
 +    * ''EXT_ORDINI_DET_TOCOMPANY'' - Righe ordini/DDT 
 +    * ''EXT_ORDINI_TOCOMPANY_STOR'' - Storico DDT 
 +  - **Sinonimi** per accesso semplificato: 
 +    * ''ORDINI_DET_TOCOMPANY'' -> ''EXT_ORDINI_DET_TOCOMPANY'' 
 +    * ''ORDINI_TOCOMPANY'' -> ''EXT_ORDINI_TOCOMPANY'' 
 +    * ''ORDINI_TOCOMPANY_STOR'' -> ''EXT_ORDINI_TOCOMPANY_STOR'' 
 +  - **Vista** ''V_AY_CASSA_ARTICOLI_LOTTI'' - Articoli con giacenze per lotto/magazzino 
 + 
 +**Valori da personalizzare:** 
 + 
 +^ Parametro ^ Valore di esempio ^ Descrizione ^ 
 +| Password ''texdatacash'' | ''qgt...'' (placeholder) | Impostare una password sicura | 
 +| ''ALMG.ID IN (41, 42)'' nella vista | ID magazzini | Sostituire con gli ID magazzino corretti del gestionale | 
 + 
 +\\ 
 +=== STEP 2: Creare sinonimi, viste e SP nel DB CASHDATA === 
 + 
 +**Script:** ''02_Da fare su DB CashData.txt'' 
 + 
 +Eseguire sul **database CASHDATA**. Lo script crea: 
 + 
 +**a) Sinonimi verso le tabelle ERP (via linked server)** 
 + 
 +Creare un sinonimo per ogni tabella ERP referenziata. Il pattern e': 
 + 
 +<code sql> 
 +CREATE SYNONYM [dbo].[ERP_ARTICO] FOR [ERPSERVER].[NOMEDB_ERP].[dbo].[ARTICO] 
 +</code> 
 + 
 +Sinonimi necessari (sostituire ''NOMEDB_ERP'' con il nome effettivo del database ERP2): 
 + 
 +^ Sinonimo nel DB CASHDATA ^ Tabella nel DB ERP ^ 
 +| ''ERP_ARTICO'' | ''ARTICO''
 +| ''ERP_BARART'' | ''BARART''
 +| ''ERP_LOTSER'' | ''LOTSER''
 +| ''ERP_CLASSI'' | ''CLASSI''
 +| ''ERP_GRUPPI'' | ''GRUPPI''
 +| ''ERP_IVA'' | ''IVA''
 +| ''ERP_LISRIG'' | ''LISRIG''
 +| ''ERP_LISTES'' | ''LISTES''
 +| ''ERP_MARCHE'' | ''MARCHE''
 +| ''ERP_CATOMO'' | ''CATOMO''
 +| ''ERP_SCOCLI'' | ''SCOCLI''
 +| ''ERP_VALUTA'' | ''VALUTA''
 +| ''ERP_BAMTES'' | ''BAMTES''
 +| ''ERP_FATRIG'' | ''FATRIG''
 +| ''ERP_CASSA_CHIUSURE'' | ''AY_CASSA_CHIUSURE''
 +| ''ERP_CASSA_CHIUSURE_IVA'' | ''AY_CASSA_CHIUSURE_IVA''
 +| ''ERP_CASSA_ELENCO_CHIUSURE'' | ''AY_CASSA_ELENCO_CHIUSURE''
 +| ''ERP_CASSA_VENDITE'' | ''AY_CASSA_VENDITE''
 +| ''ORDINI_TOCOMPANY'' | ''EXT_ORDINI_TOCOMPANY'' (o sinonimo) | 
 +| ''ORDINI_DET_TOCOMPANY'' | ''EXT_ORDINI_DET_TOCOMPANY'' (o sinonimo) | 
 +| ''ORDINI_TOCOMPANY_STOR'' | ''EXT_ORDINI_TOCOMPANY_STOR'' (o sinonimo) | 
 + 
 +**b) Vista ''V_ERP_ARTICOLO''** - Unisce articoli ERP con barcode, IVA, lotti e classificazione 
 + 
 +**c) Vista ''V_ERP_ARTICOLO_PREZZI''** - Estende ''V_ERP_ARTICOLO'' aggiungendo prezzi da listino, marca e categoria (puo' variare per installazione) 
 + 
 +**d) Stored Procedure ''AY_CARICA_DDT_DA_ERP''** - Importa articoli e aggiorna listini: 
 +  * Con parametro ''@LEGGILISTINI = 0'': importa nuovi articoli da ERP in ''CASSA_READ_DELNOTE'' e ''CASSA_READ_DELNOTE_ART_ATTRIB'' 
 +  * Con parametro ''@LEGGILISTINI = 1'': aggiorna prezzi, marca e categoria per articoli esistenti, e registra nuove aliquote IVA 
 +  * Puo' essere invocata dal bottone "Carica da ERP" nella sezione Controllo dell'UI, oppure schedulata come SQL Server Job 
 + 
 +**e) Stored Procedure ''PRC_EXPORT_ERP''** - Esporta chiusure cassa verso ERP: 
 +  * Esportazione incrementale basata su IDCHIUSURA 
 +  * Gestisce chiusure, vendite, IVA 
 +  * Se ''Invio_DDT_to_ERP = 1'': esporta anche DDT con stato 45 (confermato) -> 50 (trasmesso) 
 + 
 +\\ 
 +==== 11.4 Checklist Integrazione ERP2 ==== 
 + 
 +=== Sul server SQL Server (master): === 
 +  * Creare linked server ''ERPSERVER'' con ''00_Creare linked server.txt'' 
 +  * Verificare connettivita con ''SELECT * FROM OPENQUERY(ERPSERVER, 'SELECT 1')'' 
 + 
 +=== Sul database ERP2: === 
 +  * Creare login/utente ''texdatacash'' con permessi read/write 
 +  * Creare le 6 tabelle ''AY_CASSA_*'' 
 +  * (Se DDT) Creare le 3 tabelle ''EXT_ORDINI_*'' e relativi sinonimi 
 +  * Creare/modificare la vista ''V_AY_CASSA_ARTICOLI_LOTTI'' con ID magazzini corretti 
 +  * Popolare ''AY_CASSA_PAGAMENTI'' con i codici pagamento corretti 
 + 
 +=== Sul database CASHDATA: === 
 +  * Creare tutti i sinonimi ''ERP_*'' verso le tabelle ERP (personalizzare nome DB) 
 +  * Creare la vista ''V_ERP_ARTICOLO'' 
 +  * Creare la vista ''V_ERP_ARTICOLO_PREZZI'' (personalizzare per installazione) 
 +  * Creare/aggiornare la SP ''AY_CARICA_DDT_DA_ERP'' 
 +  * Creare/aggiornare la SP ''PRC_EXPORT_ERP'' 
 +  * Configurare parametro ''EXPORT_ERP = true'' in CASSA_CONFIG_PARAMETER 
 +  * Configurare parametro ''ExportDataForTrasmission = 0'' 
 +  * Configurare parametro ''ERP_CODMAG'' con il codice magazzino corretto 
 +  * (Opzionale) Configurare ''Invio_DDT_to_ERP = 1'' per export DDT 
 +  * Verificare esistenza viste ''V_CASSA_CHIUSURE'' e ''V_CASSA_VENDITE_ARTICOLI'' (create dallo script ''01_DB_CREATION_PROCEDURE.sql''
 +  * Testare import articoli: ''EXEC AY_CARICA_DDT_DA_ERP @LEGGILISTINI = 0'' 
 +  * Testare export chiusura: ''EXEC PRC_EXPORT_ERP'' 
 + 
 +\\ 
 +==== 11.5 Stati DDT ==== 
 + 
 +^ Stato ^ Descrizione ^ Origine ^ 
 +| 45 | Confermato | CASHDATA | 
 +| 50 | Trasmesso | CASHDATA (dopo export PRC_EXPORT_ERP) | 
 +| 70 | Importato | ERP (elaborazione OK) | 
 +| 80 | Non importato | ERP (errore elaborazione) | 
 + 
 +\\ 
 +==== 11.6 Troubleshooting Integrazione ERP ==== 
 + 
 +^ Errore ^ Causa ^ Soluzione ^ 
 +| "Parametro ERP_CODMAG non configurato" | Parametro mancante | Inserire ERP_CODMAG in CASSA_CONFIG_PARAMETER (sezione 20) | 
 +| "Errore export dati vendite" | Errore generico SP | Verificare log SQL Server, controllare esistenza tabelle e sinonimi ERP | 
 +| Linked server non raggiungibile | Rete o credenziali | Testare con ''SELECT * FROM OPENQUERY(ERPSERVER, 'SELECT 1')''
 +| Errore collation nei JOIN | Collation diversa tra DB | Le viste usano ''COLLATE Latin1_General_CI_AS'' per gestire le differenze | 
 +| DDT non esportati | ''Invio_DDT_to_ERP = 0'' | Impostare parametro a ''1'' in CASSA_CONFIG_PARAMETER | 
 +| Dati duplicati in ERP | Chiusure riesportate | Verificare IDCHIUSURA in ERP_CASSA_ELENCO_CHIUSURE | 
 +| Articoli non importati | Barcode gia' presente in CASSA_READ_DELNOTE_PROTOCOL | L'import e' incrementale: salta articoli gia' importati | 
 +| Bottone "Esporta Dati" non visibile | ''ExportDataForTrasmission != -1'' | Per il bottone manuale, impostare ''ExportDataForTrasmission = -1''
 + 
 +---- 
 + 
 +===== 11b. Integrazione con Bilancia ===== 
 + 
 +Questa sezione descrive come configurare l'export del listino prezzi verso bilance elettroniche collegate al sistema. 
 + 
 +**Script di riferimento:** ''RELEASE\03 Integrazione con Bilancia\'' 
 + 
 +\\ 
 +==== 11b.1 Panoramica ==== 
 + 
 +L'integrazione bilancia permette di: 
 +  * Esportare il listino articoli verso bilance elettroniche 
 +  * Supportare il formato **BENCHCOMM** (standard per bilance da banco) 
 +  * Generare file in formato testo a posizione fissa (100 caratteri per riga) 
 + 
 +**Flusso di esportazione:** 
 + 
 +<code> 
 +UI: Bottone "Esporta Listino Bilance" (sezione Controllo) 
 +         │ 
 +         ▼ 
 +   FunctionsForm.cs 
 +         │  (verifica Config.SCALE_EXPORT_PROTOCOL) 
 +         ▼ 
 +   ScaleExport_Benchcomm.EsportaListinoBilance() 
 +         │ 
 +         ├──► EXEC AY_EXPORT_FILE_BILANCIA @FIRMA, @BANCO, @SOLO_MODIFICATI 
 +         │    (SP da creare nel DB CASHDATA) 
 +         │ 
 +         └──► Genera file IM00VARP.txt nella directory EXPORT_BILANCIA_DIR 
 +              (Formato BENCHCOMM, encoding ISO-8859-1) 
 +</code> 
 + 
 +\\ 
 +==== 11b.2 Parametri di Configurazione ==== 
 + 
 +Parametri da configurare in ''CASSA_CONFIG_PARAMETER'': 
 + 
 +^ Parametro ^ Sezione ^ Valore ^ Descrizione ^ 
 +| **SCALE_EXPORT_ENABLED** | 10 | ''true'' | Abilita il bottone "Esporta Listino Bilance" nella sezione Controllo dell'UI | 
 +| **SCALE_EXPORT_PROTOCOL** | 10 | ''BENCHCOMM'' | Formato/protocollo bilancia. Attualmente supportato: ''BENCHCOMM''
 +| **EXPORT_BILANCIA_DIR** | 10 | //(es. C:\Export\Bilance)// | Directory dove salvare i file di export. Default: ''C:\Export\Bilance''
 + 
 +\\ 
 +==== 11b.3 Procedura di Installazione ==== 
 + 
 +=== STEP 1: Configurare i parametri === 
 + 
 +Inserire/aggiornare i 3 parametri nella tabella ''CASSA_CONFIG_PARAMETER'': 
 + 
 +<code sql> 
 +-- Abilitare export bilancia 
 +UPDATE CASSA_CONFIG_PARAMETER SET CP_VALUE = 'true' 
 +WHERE CP_NAME = 'SCALE_EXPORT_ENABLED' AND CP_SECTION = 10 
 + 
 +-- Impostare protocollo BENCHCOMM 
 +UPDATE CASSA_CONFIG_PARAMETER SET CP_VALUE = 'BENCHCOMM' 
 +WHERE CP_NAME = 'SCALE_EXPORT_PROTOCOL' AND CP_SECTION = 10 
 + 
 +-- Impostare directory di export 
 +UPDATE CASSA_CONFIG_PARAMETER SET CP_VALUE = 'C:\Export\Bilance' 
 +WHERE CP_NAME = 'EXPORT_BILANCIA_DIR' AND CP_SECTION = 10 
 +</code> 
 + 
 +\\ 
 +=== STEP 2: Creare la Stored Procedure nel DB CASHDATA === 
 + 
 +**Script:** ''03 Integrazione con Bilancia\00_Creare SP per estrarre dati da inviare alla bilancia.txt'' 
 + 
 +> **Nota:** Lo script nella cartella contiene attualmente la SP ''PRC_EXPORT_ERP'' (export chiusure). La SP effettiva per la bilancia e' ''AY_EXPORT_FILE_BILANCIA'', che va creata in base alle specifiche della bilancia utilizzata. 
 + 
 +La SP ''AY_EXPORT_FILE_BILANCIA'' deve accettare questi parametri: 
 + 
 +<code sql> 
 +CREATE PROCEDURE [dbo].[AY_EXPORT_FILE_BILANCIA] 
 +    @FIRMA INT, 
 +    @BANCO INT, 
 +    @SOLO_MODIFICATI BIT 
 +AS 
 +BEGIN 
 +    -- Restituisce un DataTable con i campi necessari al formato BENCHCOMM: 
 +    -- Banco, CodicePLU, AliquotaIVA, Prezzo, CodiceEAN, 
 +    -- DescrizioneRiga1, DescrizioneRiga2, GiorniConservazione, Tara, ecc. 
 +    -- L'implementazione varia in base alla bilancia 
 +END 
 +</code> 
 + 
 +\\ 
 +=== STEP 3: Creare la directory di export === 
 + 
 +Creare la cartella specificata nel parametro ''EXPORT_BILANCIA_DIR'' e verificare che l'utente Windows che esegue CASHDATA abbia permessi di scrittura. 
 + 
 +\\ 
 +=== STEP 4: Configurare la bilancia === 
 + 
 +Configurare la bilancia per leggere il file ''IM00VARP.txt'' dalla directory di export. Il formato e': 
 +  * **Protocollo:** BENCHCOMM 
 +  * **Encoding:** ISO-8859-1 
 +  * **Lunghezza riga:** 100 caratteri + CR+LF 
 +  * **Campi a posizione fissa** (pos 1-99 con dati per banco, PLU, IVA, prezzo, EAN, descrizione, ecc.) 
 + 
 +\\ 
 +==== 11b.4 Checklist Integrazione Bilancia ==== 
 + 
 +  * Configurare parametro ''SCALE_EXPORT_ENABLED = true'' 
 +  * Configurare parametro ''SCALE_EXPORT_PROTOCOL = BENCHCOMM'' 
 +  * Configurare parametro ''EXPORT_BILANCIA_DIR'' con il percorso corretto 
 +  * Creare la SP ''AY_EXPORT_FILE_BILANCIA'' nel DB CASHDATA (personalizzare per tipo bilancia) 
 +  * Creare la directory di export con permessi di scrittura 
 +  * Configurare la bilancia per leggere da ''EXPORT_BILANCIA_DIR\IM00VARP.txt'' 
 +  * Testare l'export dal bottone "Esporta Listino Bilance" nella sezione Controllo 
 +  * Verificare che il file generato sia corretto (100 char/riga, encoding ISO-8859-1) 
 + 
 +\\ 
 +==== 11b.5 Troubleshooting Integrazione Bilancia ==== 
 + 
 +^ Errore ^ Causa ^ Soluzione ^ 
 +| Bottone "Esporta Listino Bilance" non visibile | ''SCALE_EXPORT_ENABLED != true'' | Impostare parametro a ''true'' in CASSA_CONFIG_PARAMETER | 
 +| "Formato bilancia 'X' non riconosciuto" | Protocollo non supportato | Verificare che ''SCALE_EXPORT_PROTOCOL = BENCHCOMM'' (unico formato supportato) | 
 +| Errore durante export | SP ''AY_EXPORT_FILE_BILANCIA'' mancante | Creare la SP nel database CASHDATA | 
 +| File non generato | Directory non esistente o senza permessi | Verificare che ''EXPORT_BILANCIA_DIR'' esista e sia scrivibile | 
 +| Bilancia non legge i dati | Formato file errato | Verificare encoding ISO-8859-1 e lunghezza righe (100 + CRLF) | 
 + 
 +---- 
 + 
 +===== 12. Schema Database ===== 
 + 
 +==== 12.1 Tabelle Principali ==== 
 + 
 +=== Vendite === 
 + 
 +<code> 
 +CASSA_SALES              # Vendite registrate 
 +CASSA_SALES_PAYMODE      # Dettaglio pagamenti 
 +CASSA_DAILY_CLOSURE      # Chiusure giornaliere 
 +SCONTRINO                # Carrello temporaneo 
 +</code> 
 + 
 +\\ 
 +=== Articoli === 
 + 
 +<code> 
 +CASSA_ARTICOLO           # Anagrafica articoli 
 +CASSA_LISTINO            # Prezzi 
 +CASSA_LISTINO_NAME       # Anagrafica listini 
 +CASSA_ART_ATTRIB         # Attributi articoli 
 +CASSA_STOCK              # Giacenze 
 +</code> 
 + 
 +\\ 
 +=== Utenti === 
 + 
 +<code> 
 +CASSA_USER               # Utenti 
 +CASSA_USER_GROUP         # Gruppi 
 +CASSA_USER_FUNCTIONGROUP # Funzioni 
 +CASSA_USER_OP            # Log accessi 
 +</code> 
 + 
 +\\ 
 +=== Configurazione === 
 + 
 +<code> 
 +CASSA_CONFIG_PARAMETER   # Parametri configurazione 
 +CASSA_CONFIG_SECTION     # Sezioni configurazione 
 +CASSA_PARAMETER_PC       # Parametri per PC 
 +</code> 
 + 
 +\\ 
 +=== Documenti === 
 + 
 +<code> 
 +CASSA_DDT                # Documenti di trasporto 
 +CASSA_MIV                # Merce in visione 
 +</code> 
 + 
 +\\ 
 +==== 12.2 Relazioni Chiave ==== 
 + 
 +<code> 
 +CASSA_USER.USR_GROUP_CODE → CASSA_USER_GROUP.UGR_CODE 
 +CASSA_SALES.CSL_FIRMA → Config.FIRMA 
 +CASSA_ARTICOLO.ART_EAN → CASSA_LISTINO.CPL_BARCODE 
 +CASSA_DAILY_CLOSURE.CDC_CLOSURE_ID → CASSA_SALES.CSL_CLOSURE_ID 
 +</code> 
 + 
 +---- 
 + 
 +===== 13. Troubleshooting ===== 
 + 
 +==== 13.1 Errori Comuni di Connessione ==== 
 + 
 +^ Errore ^ Causa ^ Soluzione ^ 
 +| "Errore connessione DB" | Server non raggiungibile | Verificare IP/nome server in CashData.xml | 
 +| "Login failed" | Credenziali errate | Verificare username/password in CashData.xml | 
 +| "Database not found" | DB non esiste | Creare database ed eseguire script FASE 1-2 | 
 + 
 +\\ 
 +==== 13.2 Errori di Prima Installazione ==== 
 + 
 +Questi errori si verificano tipicamente al primo avvio dopo una nuova installazione. La sequenza di avvio dell'app (''HomeLogic.cs'') verifica molti parametri e tabelle in ordine. 
 + 
 +=== Flusso di avvio (ordine di verifica) === 
 + 
 +<code> 
 +1. BackupAndVerifyDataBase()    -- Solo in Release, richiede PCisSqlServer 
 +2. ReadConfigParameter("LanguageCode"
 +3. ReadConfigParameter("INSTALLFOLDER" -- Prima installazione se vuoto 
 +4. CheckLic()                    -- Verifica licenza 
 +5. ReadDefaultPrinter()          -- Verifica stampante 
 +6. ReadParameter("HOMEMENU_ENABLED"
 +7. PulisciScontrino()            -- Usa CCO_CASH_NR su CASSA_COUPON 
 +8. LoadParametri()               -- Carica tutti i getParValueByKey() 
 +9. LoadScontrinoDefaultsValues() -- Contatori (NEW_DAYLY_CLOSURE, RECEIPT_COUNTER_PWD, ecc.) 
 +10. Login()                      -- Richiede utenti e gruppi 
 +</code> 
 + 
 +\\ 
 +=== Tabella errori e soluzioni === 
 + 
 +^ Errore ^ Causa Radice ^ Soluzione ^ 
 +| **"Errore lettura parametro: INSTALLFOLDER"** | Parametro mancante in CASSA_CONFIG_PARAMETER sezione 30 | Eseguire ''03_FIX_PARAMETRI_MANCANTI.sql'' oppure verificare che ''02_DB_CREATION_TABLES.sql'' sia aggiornato | 
 +| **"First installation procedure invalid. Contact Software House !!!"** | I campi LIC_SOSerial, LIC_Volume, LIC_ACTIVATE in CASSA_CONFIG_PARAMETER (sezione 30) contengono valori template non vuoti, ma il sistema rileva una prima installazione | ''UPDATE CASSA_CONFIG_PARAMETER SET CP_VALUE = '''' WHERE CP_NAME IN ('LIC_SOSerial', 'LIC_Volume', 'LIC_ACTIVATE') AND CP_SECTION = 30''
 +| **"Autorizzazione CREATE DATABASE negata" / "Errore durante creazione backup database"** | ''BackupAndVerifyDataBase()'' esegue ''BACKUP DATABASE'' in modalita Release, ma l'utente SQL non ha permessi BACKUP | Impostare ''PCisSqlServer = false'' in CashData.xml. Impostare ''true'' solo se l'utente SQL ha permessi di backup | 
 +| **"La stampante non e' installata" (loop infinito)** | ''CASSA_DOC_PRINTER.DPR_DEFAULTPRINTER'' e' NULL per tutti i tipi documento. Il codice in ''Utility.cs:1899'' ha un bug nel check ''IsDBNull'' | ''UPDATE CASSA_DOC_PRINTER SET DPR_DEFAULTPRINTER = 'Microsoft Print to PDF''' (gia' incluso nello script di creazione aggiornato) | 
 +| **"Nessun gruppo configurato nel sistema"** | Tabelle ''CASSA_USER_GROUP'' e ''CASSA_USER'' vuote | Gia' incluso nello script di creazione aggiornato. Per DB esistenti: inserire manualmente gruppi e utenti (vedi sezione 3.1 FASE 6) | 
 +| **"Errore lettura parametro: HOMEMENU_ENABLED"** | Parametro mancante in tabella ''CASSA_PARAMETER'' (non CONFIG_PARAMETER!) | ''INSERT INTO CASSA_PARAMETER (CP_FIRMA, CP_NAME, CP_VALUE, CP_TEXT) VALUES (10, N'HOMEMENU_ENABLED', N'0', N'Home menu enabled')''
 +| **"Il nome colonna CCO_CASH_NR"** a ''HomeLogic.cs:1497'' | Colonna ''CCO_CASH_NR'' mancante nella tabella ''CASSA_COUPON'' | ''ALTER TABLE [CASSA_COUPON] ADD [CCO_CASH_NR] [int] NULL'' (gia' incluso nello script di creazione aggiornato) | 
 +| **"Errore lettura parametro: NEW_DAYLY_CLOSURE"** | Parametro letto con ''ReadParameter("NEW_DAYLY_CLOSURE", 0, Config.CASHNUMBER)'' quindi va in ''CASSA_PARAMETER_PC'' (non CASSA_PARAMETER!) | ''INSERT INTO CASSA_PARAMETER_PC (CP_FIRMA, CP_NAME, CP_VALUE, CP_TEXT, CASH_NR) VALUES (10, N'NEW_DAYLY_CLOSURE', N'1', N'Daily closure counter', 1)''
 +| **"Errore lettura parametro: RECEIPT_COUNTER_PWD"** | Parametro letto con ''ReadParameter("RECEIPT_COUNTER_PWD", 0)'' dalla tabella ''CASSA_PARAMETER''. Il valore deve essere **non vuoto** | ''INSERT INTO CASSA_PARAMETER (CP_FIRMA, CP_NAME, CP_VALUE, CP_TEXT) VALUES (10, N'RECEIPT_COUNTER_PWD', N'tex01', N'Password reset contatore')''
 +| **"Errore lettura parametro: X"** (generico) | Parametro X mancante. Individuare la tabella corretta verificando il codice sorgente | Se ''ReadParameter(name, 0)'' -> ''CASSA_PARAMETER''. Se ''ReadParameter(name, 0, Config.CASHNUMBER)'' -> ''CASSA_PARAMETER_PC''. Se ''getParValueByKey(name)'' -> ''CASSA_CONFIG_PARAMETER''
 + 
 +\\ 
 +==== 13.3 Come Distinguere le Tabelle dei Parametri ==== 
 + 
 +Quando si incontra un errore "Errore lettura parametro", e' fondamentale capire **quale tabella** deve contenere il parametro: 
 + 
 +^ Metodo di lettura nel codice ^ Tabella DB ^ Identificato da ^ 
 +| ''getParValueByKey("NOME")'' | ''CASSA_CONFIG_PARAMETER'' | Errore da ''Utility.cs:3808''
 +| ''ReadConfigParameter("NOME", releasedfor, section)'' | ''CASSA_CONFIG_PARAMETER'' | Errore da ''HomeLogic.cs:734''
 +| ''ReadParameter("NOME", 0)'' (2 argomenti) | ''CASSA_PARAMETER'' | cash_nr=0 (default) | 
 +| ''ReadParameter("NOME", 0, Config.CASHNUMBER)'' (3 argomenti) | ''CASSA_PARAMETER_PC'' | cash_nr != 0 | 
 + 
 +\\ 
 +==== 13.4 Errori di Configurazione ==== 
 + 
 +^ Errore ^ Causa ^ Soluzione ^ 
 +| "Parametro mancante: X" | Parametro non configurato | Identificare la tabella corretta (vedi 13.3) e inserire il parametro | 
 +| "ReleaseFor non valido" | PC non registrato | Configurare ReleaseFor in CashData.xml | 
 +| Parametri con valore vuoto | Alcuni parametri (es. RECEIPT_COUNTER_PWD) richiedono un valore non vuoto | Verificare che CP_VALUE non sia vuoto per i parametri che lo richiedono | 
 + 
 +\\ 
 +==== 13.5 Errori Operativi ==== 
 + 
 +^ Errore ^ Causa ^ Soluzione ^ 
 +| "Differenza ≠ 0" | Conteggio errato | Verificare contanti inseriti | 
 +| "Pagamenti non verificati" | Manca spunta | Completare verifica pagamenti | 
 +| "Nuovo fondo negativo" | Prelievo eccessivo | Ridurre importo prelievo | 
 + 
 +\\ 
 +==== 13.6 Log e Diagnostica ==== 
 + 
 +  * **Log accessi**: Tabella ''CASSA_USER_OP'' 
 +  * **Log operazioni**: Consultare con report ''CASHPROTOCOL'' 
 +  * **Errori applicazione**: Verificare file di log in cartella installazione 
 +  * **Debug SQL**: Controllare i parametri direttamente nel DB con: 
 + 
 +<code sql> 
 +-- Verificare parametri di configurazione 
 +SELECT * FROM CASSA_CONFIG_PARAMETER WHERE CP_NAME = 'NOME_PARAMETRO' 
 +-- Verificare parametri runtime 
 +SELECT * FROM CASSA_PARAMETER WHERE CP_NAME = 'NOME_PARAMETRO' 
 +-- Verificare parametri per-PC 
 +SELECT * FROM CASSA_PARAMETER_PC WHERE CP_NAME = 'NOME_PARAMETRO' 
 +</code> 
 + 
 +---- 
 + 
 +===== Appendice A: Enumerazioni Principali ===== 
 + 
 +==== A.1 Customer (Tipi Cliente) ==== 
 + 
 +<code csharp> 
 +public enum Customer { 
 +    First_Installation_ITALIAN = 0, 
 +    First_Installation_GERMAN = 1, 
 +    Develop = 2, 
 +    Demo_Server = 3, 
 +    // ... altri 80+ clienti 
 +
 +</code> 
 + 
 +\\ 
 +==== A.2 ConfigSection ==== 
 + 
 +<code csharp> 
 +public enum ConfigSection { 
 +    SHOP_10 = 10,      // Configurazione negozio 
 +    FUNCTION_20 = 20,  // Configurazione funzioni 
 +    CASH_30 = 30       // Configurazione cassa 
 +
 +</code> 
 + 
 +\\ 
 +==== A.3 ECR_Type_Code (Tipi Registratore) ==== 
 + 
 +<code csharp> 
 +public enum ECR_Type_Code { 
 +    Olivetti_Nettuna_300, 
 +    // altri tipi supportati 
 +
 +</code> 
 + 
 +\\ 
 +==== A.4 DocPrinter (Tipi Documento) ==== 
 + 
 +<code csharp> 
 +public enum DocPrinter { 
 +    SCONTRINO = 1, 
 +    ETICHETTE = 2, 
 +    DDT = 3, 
 +    MIV = 4, 
 +    DIFF_CASSA = 5, 
 +    GIORNALE = 6 
 +
 +</code> 
 + 
 +---- 
 + 
 +===== Appendice B: File Importanti ===== 
 + 
 +==== B.1 Sorgenti Principali ==== 
 + 
 +^ File ^ Righe ^ Descrizione ^ 
 +| Config.cs | ~1500 | Configurazione globale | 
 +| Utility.cs | ~7500 | Funzioni utility | 
 +| Home.cs | ~1000 | Form principale | 
 +| HomeLogic.cs | ~3000 | Logica form principale | 
 +| Form1.cs | ~2700 | Form vendite | 
 +| PAY.cs | ~2500 | Dialog pagamento | 
 +| CashChiusura.cs | ~800 | Form chiusura cassa + validazione DDT per ERP | 
 +| UpdateUtility.cs | ~1600 | Importazione dati | 
 +| FunctionsForm.cs | ~1800 | Sezione Controllo (export ERP, bilancia) | 
 +| ScaleExport_Benchcomm.cs | ~100 | Export listino bilance formato BENCHCOMM | 
 + 
 +\\ 
 +==== B.2 Script Database - Installazione Base ==== 
 + 
 +^ File ^ Cartella ^ Descrizione ^ 
 +| 00_DB_CREATION_CREATEDB.sql | RELEASE\01\ | Creazione database | 
 +| 01_DB_CREATION_PROCEDURE.sql | RELEASE\01\ | Stored procedures e viste (V_CASSA_CHIUSURE, V_CASSA_VENDITE_ARTICOLI) | 
 +| 02_DB_CREATION_TABLES.sql | RELEASE\01\ | Tabelle, dati iniziali, utenti, gruppi, stampanti | 
 +| 03_DB_CREATION_WITH_PROMO.sql | RELEASE\01\ | Dati promozioni | 
 +| 02 Reimposta dati.sql | Cose da fare...\ | Configurazione iniziale (personalizzare prima dell'esecuzione) | 
 +| 03_FIX_PARAMETRI_MANCANTI.sql | Cose da fare...\ | Fix parametri mancanti per DB esistenti | 
 + 
 +\\ 
 +==== B.3 Script Integrazione ERP2 ==== 
 + 
 +^ File ^ Cartella ^ Target DB ^ Descrizione ^ 
 +| 00_Creare linked server.txt | RELEASE\02...\ | master | Linked server verso DB ERP2 | 
 +| 01_Tabelle&Viste da creare su db ERP.txt | RELEASE\02...\ | DB ERP | Tabelle AY_CASSA_*, EXT_ORDINI_*, vista lotti, login | 
 +| 02_Da fare su DB CashData.txt | RELEASE\02...\ | DB CASHDATA | Sinonimi ERP_*, viste V_ERP_*, SP AY_CARICA_DDT_DA_ERP, PRC_EXPORT_ERP | 
 + 
 +\\ 
 +==== B.4 Script Integrazione Bilancia ==== 
 + 
 +^ File ^ Cartella ^ Target DB ^ Descrizione ^ 
 +| 00_Creare SP per estrarre dati.txt | RELEASE\03...\ | DB CASHDATA | SP AY_EXPORT_FILE_BILANCIA (template, personalizzare per tipo bilancia) | 
 + 
 +---- 
 + 
 +//Documento generato automaticamente dall'analisi del codice sorgente CASHDATA.//\\ 
 +//Ultimo aggiornamento: Febbraio 2026//\\ 
 +//Versione: 1.2 - Aggiunta integrazione ERP2 e bilancia//