#include "lilib01.h" #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 = 0; j < statidoc.items(); j++) { tipi.add(tipidoc.get(i)); stati.add(statidoc.get(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; if(c_dicint.items() > 0) { for(c_dicint = 0; c_dicint.pos() < c_dicint.items(); ++c_dicint) { TRectype row = c_dicint.curr(); if(!row.get_bool("CHIUSA")) { if(row.get_int("TIPOOP") != FINO_A_PLAFOND) { plafond = -UNO; return; } year = row.get_int("ANNO"); iniDicInt = row.get_date("VSDATA"); plafond = row.get_real("IMPORTO"); validPlafond = true; return; } } } plafond = -UNO; } const real TLi_manager::getPlaRes() { if(!validPlafond) return -UNO; real resPlafond = plafond; TLista_documenti din; // Legge tutti i documenti di input TToken_string tipi, stati; elabTipiStati(tipi, stati); TDate ad(TString(year)<<"1201"); // Trovo tutti i documenti che mi interessano e sottraggo l'imponibile al plafond din.read('D', tipocf, codcli, year, tipi, stati, iniDicInt, ad); int i = 0; for(; i < din.items(); i++) { int j = 1; // Le righe partono da 1? 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 = static_cast(tabIva.get()); if(totali->cod_iva() == codiva) { resPlafond -= totali->imp_orig(); } if(resPlafond < 0) break; } return resPlafond; } bool TLi_manager::testPlafond(TLista_documenti dout, TLog_report& lerr) { bool ok = true; real resPlafond = getPlaRes(); int i = 0; // Faccio un ragionamento identico a getPlaRes, ma in input ho la lista di documenti appena elaborati for(; i < dout.items(); i++) { int j = 1; // Le righe partono da 1? 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() == codiva) { resPlafond -= totali->imp_orig(); } if(resPlafond < 0) { ok = false; break; } } if(i < dout.items()) { TString msgerr; msgerr << "\nSforato plafond cliente N." << dout[i].codcf(); lerr.log(2, msgerr); } for(; i < dout.items(); i++) { TString msgerr; msgerr << "Errore doc. tipo: " << dout[i].tipo() << " N." << dout[i].numero() << " data: " << dout[i].data(); lerr.log(2, msgerr); // 2 -> Errore } return ok; } // TIPOCF, CODCLI, ANNO TLi_manager::TLi_manager(const char t, const long c, int y) : tipocf(t), codcli(c), year(y), iniDicInt() { tipidoc = ini_get_string(CONFIG_DITTA, "li", "TIPIDOC"); elabPlafond(); // Estrapolo il codice iva codiva = TCodiceIVA(ini_get_string(CONFIG_DITTA, "li", "CODIVA")); }