diff --git a/cg/cg4303.cpp b/cg/cg4303.cpp index 062734915..a7f1b1200 100755 --- a/cg/cg4303.cpp +++ b/cg/cg4303.cpp @@ -189,12 +189,57 @@ void TLiquidazione_app::recalc_ventilation(int month, const char* codatt) totven += vi->_totale; } + /* + * Udite! Udite! Per editto di sua maesta' la ventilazione + * va calcolata in modo uguale al frigorifero (cioe' sbagliato) + * I migliori auguri per una pronta guarigione dallo stato di + * infermita' mentale che vi affligge tutti. + * Bando ai convenevoli e passiamo alla spiegazione (se siete + * rigorosamente razionali fermatevi qui e non andate oltre): + * la ventilazione, in breve, consiste in questo: + * si totalizzano gli acquisti beni per rivendita da inizio anno + * e le vendite (solo del periodo) da scorporare (corrispettivi). + * A questo punto si dovranno "scaglionare" le vendite in + * proporzione agli acquisti dello stesso codice IVA. Avremo quindi N + * importi vendite lordi, la cui somma dovra' sempre dare il totale vendite + * calcolato inizialmente. Per ogni scaglione ottenuto si procedera' poi + * allo scorporo dell'iva, in modo che il tutto risulti coerente. + * + * La nostra implementazione: + * si calcolino il totale acquisti beni per rivendita da inizio anno e + * le vendite da ventilare nel periodo. + * Si istanzia un TDistrib (vedi la classe) sul totale delle vendite da ripartire, + * quindi per ogni aliquota acquisti presente si aggiunge una percentuale di ripartizione + * (acquisti/totale acquisti) al suddetto oggetto. + * In tal modo avremo che il totale delle vendite sara' sempre + * uguale all'originale senza perdite 0 aggiunte di insignificanti lirette. + * come ultima cosa si estraggono le varie suddivisioni ottenute a da li si procede + * allo scorporo dell'iva. + * + * La loro implementazione: + * come nel nostro caso si effettua la totalizzazione degli acquisti e delle vendite + * a questo punto pero' si introduce il leggendario moltiplicatore, che serve, se non + * altro a far sbagliare i conti sugli arrotondamenti e sui totali. Tale moltiplicatore + * e' dato dal rapporto tra totale acquisti e totale vendite. Per ogni aliquota iva + * acquisti si effettua percio' la seguente operazione per ottenere il relativo + * importo vendite: + * ROUND(acquisti * moltiplicatore) + * come si puo' notare, gia' qui si introduce un errore, perche' non e' affatto detto + * che la somma di tutti gli importi vendite ottenuti dia ancora l'importo complessivo originale. + * Infine si scorpora l'iva come nel nostro caso. + * + * Ebbene si': il nostro metodo (corretto) e' stato bandito e sostituito con quello + * super-mega-maxi-iper-errato del sistema. Si lascia commentato per memoria futura + * l'implementazione corretta, anche perche' forse in futuro (possibilita' molto remota) + * cambieranno idea. + * + * Sigh! + * { _VendItem* vi = (_VendItem*)&_vend_arr[0]; - //totven += vi->_totale; // 3.2) calcola percentuali di ripartizione e prepara l'affettatrice - TDistrib dst(/*vi->_totale*/totven, ROUND_LIRA); + TDistrib dst(totven, ROUND_LIRA); for (j = 0; j < vent_items; j++) { _VentItem* vv = (_VentItem*)&_vent_arr[j]; @@ -258,7 +303,53 @@ void TLiquidazione_app::recalc_ventilation(int month, const char* codatt) _pim->rewrite(); } } + */ + + // Di seguito l'implementazione del sistema (errata come spiegato sopra). + + const real moltiplicatore = totven / totacq; + real imponibile, imposta; + _VendItem* vi = (_VendItem*)&_vend_arr[0]; + for (j = 0; j < vent_items; j++) + { + _VentItem* vv = (_VentItem*)&_vent_arr[j]; + imponibile = vv->_totale * moltiplicatore; // Importo lordo vendite + imponibile.round(ROUND_LIRA); + lordo2netto(imponibile, imposta, vv->_aliquota); // Scorpora l'iva + // aggiusto l'IVA vendite nei plm + look_plm(month, codatt); + real ive = _plm->get_real("R0"); + ive += imposta; + _plm->put("R0",ive); + _plm->rewrite(); + // .. e il volume di affari nei pam + real vaf = _pam->get_real("R1"); + vaf += imponibile; + _pam->put("R1", vaf); + _pam->rewrite(); + + // Aggiorno i luridi pim + bool was = look_pim(month, codatt, vi->_codreg, "0", vv->_codiva, vi->_tipodet, TRUE); + + imponibile += _pim->get_real("R0"); + imposta += _pim->get_real("R1"); + _pim->put("R0", imponibile); + _pim->put("R1", imposta); + _pim->put("S4", vv->_other); + // segnale per comodita' in stampa prospetto + _pim->put("B1","X"); + // se e' nuovo, il segnale per usare l'importo nel calcolo del rimborso + // viene amorosamente messo a quanto il codice IVA prevede + if (!was) + { + look_iva(vv->_codiva); + _pim->put("I1", (long)vendita); + if (!_iva->get_bool("B4")) _pim->put("B3", "X"); + } + _pim->rewrite(); + } + // memorizza totali per il prospettino di m. look_plm(month, codatt);