#include "lilib01.h" #include #define FINO_A_PLAFOND 2 void TLi_manager::elabTipiStati(TToken_string& tipi, TToken_string& stati) { for(int i = 0; i < tipidoc->items(); i++) { TToken_string statidoc(ini_get_string(CONFIG_DITTA, "li", tipidoc->get(i)), ','); for(int j = statidoc.get_int(0); j <= statidoc.get_int(1); j++) { tipi.add(tipidoc->get(i)); stati.add(j); } } } void TLi_manager::elabPlafond() { TRelation letint(LF_LETINT); TRectype filtro(letint.curr()); filtro.add("CODCLI", codcli); if(year != -1) filtro.add("ANNO", year); // Creo un cursore ordinato e prelevo la prima riga non chiusa TSorted_cursor c_dicint(&letint, "ANNO-|NUMPROT-", "", 2, &filtro, &filtro); validPlafond = false; bool done = false; if(c_dicint.items() > 0) { for(c_dicint = 0; c_dicint.pos() < c_dicint.items() && !done; ++c_dicint) { TRectype row = c_dicint.curr(); if(!row.get_bool("CHIUSA")) { done = true; if(row.get_int("TIPOOP") != FINO_A_PLAFOND) continue; year = row.get_int("ANNO"); iniDicInt = row.get_date("VSDATA"); plafond = row.get_real("IMPORTO"); validPlafond = true; } } } if(!validPlafond) plafond = -UNO; } const real TLi_manager::getPlaRes() { TToken_string tipi, stati; elabTipiStati(tipi, stati); return elabPlaRes(tipi, stati); } const real TLi_manager::getPlaRes(TToken_string tipi, TToken_string stati) { return elabPlaRes(tipi, stati); } const real TLi_manager::elabPlaRes(TToken_string tipi, TToken_string stati) { if(!validPlafond) return -UNO; real resPlafond = plafond; TLista_documenti din; // Legge tutti i documenti di input TDate ad(31, 12, year); // Trovo tutti i documenti che mi interessano e sottraggo l'imponibile al plafond din.read('D', tipocf, codcli, year, tipi, stati, iniDicInt, ad); for(int i = 0; i < din.items(); i++) { TAssoc_array tabIva = din[i].tabella_iva(true); TString numerazione = din[i].numerazione(); int numdoc = din[i].numero(); int anno = din[i].anno(); TRiepilogo_iva * totali = dynamic_cast(tabIva.get()); if(totali->cod_iva().codice() == *codiva) { resPlafond -= cache().get("%TIP", din[i].tipo().codice()).get_bool("B7") ? -totali->imp_orig() : totali->imp_orig(); } if(resPlafond < 0) break; } return resPlafond; } bool TLi_manager::testPlafond(TLista_documenti dout, TLog_report& lerr) { bool err = false; real resPlafond = getPlaRes(); real testPlafond = getPlaRes(); real totFatt; int i = 0; // Faccio un ragionamento identico a getPlaRes, ma in input ho la lista di documenti appena elaborati for(int i = 0; i < dout.items(); i++) { TAssoc_array tabIva = dout[i].tabella_iva(true); TString numerazione = dout[i].numerazione(); int numdoc = dout[i].numero(); int anno = dout[i].anno(); TRiepilogo_iva * totali = static_cast(tabIva.get()); if(totali->cod_iva().codice() == *codiva) { resPlafond -= totali->imp_orig(); totFatt += totali->imp_orig(); } } if(resPlafond < 0) { err = true; // Alzo il flag dell'errore TString msgerr; msgerr << "Superata dichiarazione di intento cliente N." << dout[i].codcf() << "\nPlafond rimanente: " << resPlafond + totFatt << "\nTotale fatture generate: " << totFatt << "\nSforato di: " << -resPlafond << "\n"; lerr.log(2, msgerr); // 2 <- Errore } return err; } // TIPOCF, CODCLI, ANNO TLi_manager::TLi_manager(const char t, const long c, int y) : tipocf(t), codcli(c), year(y), iniDicInt(), plafond(-UNO), validPlafond(false) { tipidoc = new TToken_string(ini_get_string(CONFIG_DITTA, "li", "TIPIDOC")); elabPlafond(); // Estrapolo il codice iva codiva = new TString(ini_get_string(CONFIG_DITTA, "li", "CODIVA")); } TLi_manager::~TLi_manager() { delete codiva; delete tipidoc; }