diff --git a/cg/cg2700.cpp b/cg/cg2700.cpp index a438bcfb5..7dc31972b 100755 --- a/cg/cg2700.cpp +++ b/cg/cg2700.cpp @@ -1,1075 +1,1070 @@ -// -// Ricezione dati: lista controllo movimenti -// -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "cg2103.h" -#include "cglib04.h" -#include "cg2700.h" - -HIDDEN const char* err_msg[] = {"*** Data operazione non valida", - "--- Data competenza non compresa in alcun esercizio", - "*** Data operazione antecedente ad ultima stampa giornale", - "--- Data documento non valida", - "*** Codice causale non valido o non presente in archivio", - "--- Codice pagamento non valido o non presente in tabella", - "*** Codice registro IVA non valido o non presente in tabella", - "*** Codice cliente/fornitore non valido o non presente in anagrafica", - "--- Data 74 ter non valida", - "*** Data operazione antecedente ad ultima stampa registro IVA"}; - -HIDDEN int date2esc(const TDate& d, int* prevesc = NULL); - -class TRic_ListaMov : public TPrintapp -{ - TTable* _tab_tra,* _tab_pag,* _tab_tpd,* _tab_iva; - TIsamtempfile* _tmov,* _trmov,* _tiva; - TLocalisamfile* _caus,* _ditte,* _clifo,* _pcon; - TRelation* _rel; - TCursor* _cur; - TTransfer_file* _trasfer; - TLibro_giornale* _giornale; - TString80 _pathfile, _descr_causale, _descr_conto; - TString16 _causale, _registro, _numdoc, _tipodoc, _codval; - TString16 _codpag, _codiva, _tipo_conto; - TString _record; - bool _mov_sez, _errore_grave, _esiste_conto, _esiste_causale; - char _sdt, _sezione; - int _ae, _anno, _gruppo, _conto, _tipocr, _tipod, _tiporeg; - int _gruppoc, _contoc, _n_rec, _gruppocr, _contocr; - TDate _datacomp, _datadoc, _datareg, _data74tr; - real _importo, _impo, _impos, _tot_dare, _tot_avere, _tot_doc; - long _codcf, _numero, _protiva, _sottoconto; - long _inizioZ, _inizioU, _num_rec, _sottocontoc, _sottocontocr; - TBit_array _err; - byte _controllo; - -public: - virtual bool set_print(int m); - virtual bool user_create() ; - virtual bool user_destroy(); - virtual bool preprocess_page(int,int); - virtual print_action postprocess_page(int,int); - virtual void postclose_print(); - const char* look_sdt(); - const char* get_codiva_des(const char*); - bool DescrConto(int,int,long); - bool check_archivi(TProgind*); - bool look_pag(); - bool errori_partita(int,int,long); - bool controlla_mov(); - bool controlla_rmov(); - bool controlla_riva(); - void stampa_errori_mov(int); - void stampa_errori_rmov(int); - void stampa_errori_riva(int); - void aggiorna_trasfer_Z(); - void aggiorna_trasfer_U(); - void setta_parametri(const TString&, const TString&); - void setta_intestazione(); - TLibro_giornale& giornale() { return *_giornale; } - TTransfer_file& trasfer() { return *_trasfer; } - - TRic_ListaMov(): _err(80) {} - virtual ~TRic_ListaMov() {} -}; - -HIDDEN inline TRic_ListaMov& app() { return (TRic_ListaMov&)main_app();} - -HIDDEN int date2esc(const TDate& d, int* prevesc) -{ - if (prevesc) *prevesc = 0; - TTable esc("ESC"); - for (int err = esc.first(); err == NOERR; err = esc.next()) - { - const TDate ia(esc.get("D0")); // Data inizio esercizio - const TDate fa(esc.get("D1")); // Data fine esercizio - const anno = esc.get_int("CODTAB"); - if (d >= ia && d <= fa) - return anno; - if (prevesc) *prevesc = anno; - } - return 0; -} - -const char* TRic_ListaMov::look_sdt() -{ - TConfig conf(CONFIG_DITTA); - return conf.get("FlStTra"); -} - -bool TRic_ListaMov::look_pag() -{ - TTable t ("%CPG"); - t.zero(); - t.put("CODTAB",_codpag); - if (t.read() != NOERR) return FALSE; - return TRUE; -} - -const char* TRic_ListaMov::get_codiva_des(const char* codiva) -{ - TTable iva ("%IVA"); - - iva.zero(); - iva.put("CODTAB", codiva); - if (iva.read() == NOERR) - return iva.get("S0"); - else - return NULL; -} - -bool TRic_ListaMov::DescrConto(int g, int c, long s) -{ - TString80 ragsoc; - const char* descr = NULL; - TLocalisamfile pconti (LF_PCON); - pconti.setkey(1); - pconti.zero(); - pconti.put(PCN_GRUPPO, g); - pconti.put(PCN_CONTO, c); - pconti.put(PCN_SOTTOCONTO, 0L); - if (pconti.read() == NOERR) - { - _tipo_conto = pconti.get(PCN_TMCF); - if (_tipo_conto == "C" || _tipo_conto == "F") - { - TLocalisamfile clifo (LF_CLIFO); - clifo.setkey(1); - clifo.zero(); - clifo.put(CLI_TIPOCF, _tipo_conto); - clifo.put(CLI_CODCF, s); - if (clifo.read() != NOERR) - { - _descr_conto = ""; - return FALSE; - } - else - { - char tipoa = clifo.get_char("TIPOAPER"); - if (tipoa == 'F') //persona fisica - { - TString80 cognome, nome; - ragsoc = clifo.get("RAGSOC"); - cognome = ragsoc.mid(0,30); - nome = ragsoc.mid(30,20); - cognome.trim(); nome.trim(); - ragsoc = cognome; - ragsoc << " " << nome; - _descr_conto = ragsoc; - } - else _descr_conto = clifo.get("RAGSOC"); - } - } - else - { - pconti.zero(); - pconti.put(PCN_GRUPPO, g); - pconti.put(PCN_CONTO, c); - pconti.put(PCN_SOTTOCONTO, s); - if (pconti.read() != NOERR) - { - _descr_conto = ""; - return FALSE; - } - else _descr_conto = pconti.get(PCN_DESCR); - } - } - else - { - _descr_conto = ""; - return FALSE; - } - return TRUE; -} - -bool TRic_ListaMov::user_create() -{ - _trasfer = new TTransfer_file(); - - TProgind* pnd = NULL; - pnd = new TProgind (3,"Controllo archivi\nPrego attendere", - FALSE, TRUE, 30); - _tab_tra = new TTable ("%TRA"); - _tab_tpd = new TTable ("%TPD"); - _tab_pag = new TTable ("%CPG"); - _tab_iva = new TTable ("%IVA"); - _caus = new TLocalisamfile (LF_CAUSALI); - _ditte = new TLocalisamfile (LF_NDITTE); - _clifo = new TLocalisamfile (LF_CLIFO); - _pcon = new TLocalisamfile (LF_PCON); - - if (pnd) pnd->addstatus(1); - - if (!check_archivi(pnd)) - { - delete pnd; - return FALSE; - } - - if (pnd) pnd->addstatus(1); - - TString80 tmpmov = "%"; - tmpmov << get_firm_dir(); - tmpmov << "\\" << TEMP_MOV; - TString80 tmprmov = "%"; - tmprmov << get_firm_dir(); - tmprmov << "\\" << TEMP_RMOV; - TString80 tmprmoviva = "%"; - tmprmoviva << get_firm_dir(); - tmprmoviva << "\\" << TEMP_RMOVIVA; - - _tmov = new TIsamtempfile(LF_MOV, tmpmov, 0); - _trmov = new TIsamtempfile(LF_RMOV, tmprmov, 0); - _tiva = new TIsamtempfile(LF_RMOVIVA, tmprmoviva, 0); - - _rel = new TRelation(_tmov); - _rel->add(_trmov,"NUMREG=NUMREG",1,0,0,FALSE); - _rel->add(_tiva, "NUMREG=NUMREG",1,0,0,FALSE); - _cur = new TCursor (_rel, "", 1); - - _giornale = new TLibro_giornale(); - - add_cursor(_cur); - - add_file (LF_MOV); - add_file (LF_RMOV, LF_MOV); - add_file (LF_RMOVIVA, LF_MOV); - - printer().footerlen(5); - - delete pnd; - - return TRUE; -} - -bool TRic_ListaMov::check_archivi(TProgind* pnd) -{ - TString80 nome; - long ditta_ric = get_firm(); - - if (!prefix().exist(ditta_ric)) - return error_box("Rilevati errori gravi negli archivi: procedura interrotta"); - - TTransfer_file& tr = trasfer(); - - _pathfile = tr.path(); - - _pathfile = _pathfile << "\\trasfer"; - - if (!tr.open(_pathfile)) - return error_box("Al momento non presenti trasferimenti attivi sulla ditta selezionata"); - - if (!tr.read_control_rec()) - return error_box("Rilevati errori gravi negli archivi: procedura interrotta"); - else _record = tr.record(); - - TString16 sd = look_sdt(); - - if (sd.not_empty()) - _sdt = sd[0]; - else return error_box("Ricezione tabelle non effettuata: richiamare il programma relativo"); - - if (_sdt == 'T') - return error_box("Ricezione tabelle non effettuata: richiamare il programma relativo"); - - if (_sdt == 'M') - return yesno_box("Controllo gia' effettuato: si desidera ripeterlo ?"); - - if (_sdt != '*' && _sdt != 'C') - return error_box("Rilevati errori gravi negli archivi: procedura interrotta"); - - TString16 ult = tr.ult_file(); - TString16 key = tr.key(); - - ult.strip_spaces(); - key.strip_spaces(); - - if (_sdt == 'C') - if ( ult.not_empty() || key.not_empty() ) - return error_box("Rilevati errori gravi negli archivi: procedura interrotta"); - - if (_sdt == '*') - return warning_box("Trasferimento interamente completato: proseguire per cancellare i file"); - - if (pnd) pnd->addstatus(1); - - return TRUE; -} - -void TRic_ListaMov::stampa_errori_mov(int riga) -{ - long i = _err.first_one(); - if (i != -1) - { - for (; i <= _err.last_one(); i++) - if (_err[i]) - set_row(++riga, "@8g%s", (const char*) err_msg[i]); - } -} - -bool TRic_ListaMov::controlla_mov() -{ - bool check_reg = TRUE; - TString16 causreg; - TDate udata; - char tipocf; - - _tiporeg = 0; - - if (!_datareg.ok()) - { - _errore_grave = TRUE; - _err.set(0L); - } - else if (!_datacomp.ok()) - { - const int ae = date2esc(_datacomp); - if (ae == 0) - _err.set(1); - } - - TLibro_giornale& gio = giornale(); - bool ok = gio.read(_ae); //se _ae e' zero la read considera come anno quello corrente - if (_datareg < gio.last_print()) - { - _errore_grave = TRUE; - _err.set(2); - } - - TString16 dd = _datadoc.string(); - if (dd.not_empty()) - if (!_datadoc.ok()) - _err.set(3); - - //if (_causale.not_empty()) - //{ - TLocalisamfile caus(LF_CAUSALI); - caus.setkey(1); - caus.zero(); - caus.put(CAU_CODCAUS,_causale); - if (caus.read() == NOERR) - { - _esiste_causale = TRUE; - _tipodoc = caus.get(CAU_TIPODOC); - } - else - { - caus.zero(); - _esiste_causale = FALSE; - if (look_causale(_causale)) //se la causale e' significativa - { - _errore_grave = TRUE; - _err.set(4); - } - } - //_tipodoc = caus.get(CAU_TIPODOC); ho sempre quello letto sul movimento! - causreg = caus.get(CAU_REG); - _descr_causale = caus.get(CAU_DESCR); - _mov_sez = caus.get_bool(CAU_MOVSEZ); - //} - - if (!_codpag.blank()) - { - bool ok = look_pag(); - if (!ok) - _err.set(5); - } - - if (!_registro.blank()) //movimento iva (fattura) - { - if (!look_causale(_causale)) //se la causale non e' significativa - { - _errore_grave = TRUE; - check_reg = FALSE; - _err.set(6); - } - if (check_reg && _ae) - { - TRegistro rg (_registro, _ae); - if (rg.name().empty()) - { - _errore_grave = TRUE; - check_reg = FALSE; - _err.set(6); - } - else - { - _tiporeg = rg.tipo(); - udata = rg.last_print(); - } - } - } - else if (!causreg.blank() && _ae) - { - TRegistro rg (causreg, _ae); - if (rg.name().empty()) - { - _errore_grave = TRUE; - check_reg = FALSE; - _err.set(6); - } - else - { - _tiporeg = rg.tipo(); - udata = rg.last_print(); - } - _registro = causreg; - } - - if (check_reg && !_registro.blank()) - { - if (_tiporeg == 1) tipocf = 'C'; - else if (_tiporeg == 2) tipocf = 'F'; - if (!_tipodoc.blank()) //se esiste, uso quello della causale!!! - { - TTable tabtpd("%TPD"); - tabtpd.put("CODTAB", _tipodoc); - if (tabtpd.read() == NOERR) - { - bool cor = tabtpd.get_bool("B0"); - if (!cor) - if (_codcf != 0l) - { - TLocalisamfile clifo(LF_CLIFO); - clifo.zero(); - clifo.put(CLI_CODCF, _codcf); - clifo.put(CLI_TIPOCF,tipocf); - if (clifo.read() != NOERR) - { - _errore_grave = TRUE; - _err.set(7); - } - } - else - { - _errore_grave = TRUE; - _err.set(7); - } - } - } - } - - TString16 d74 = _data74tr.string(); - if (d74.not_empty()) - if (!_data74tr.ok()) - _err.set(8); - - if (!_registro.blank() && check_reg) - if (_datareg < udata) - { - _errore_grave = TRUE; - _err.set(9); - } - - if (_err.ones()) - return TRUE; - - return FALSE; -} - -bool TRic_ListaMov::errori_partita(int g, int c, long s) -{ - TLocalisamfile pconti (LF_PCON); - pconti.setkey(1); - pconti.zero(); - pconti.put(PCN_GRUPPO, g); - pconti.put(PCN_CONTO, c); - pconti.put(PCN_SOTTOCONTO, 0L); - if (pconti.read() == NOERR) - { - char tipo = pconti.get(PCN_TMCF)[0]; - if (tipo == 'C' || tipo == 'F') - { - TLocalisamfile clifo (LF_CLIFO); - clifo.setkey(1); - clifo.zero(); - clifo.put(CLI_TIPOCF, tipo); - clifo.put(CLI_CODCF, s); - if (clifo.read() != NOERR) - return FALSE; - } - else - { - pconti.zero(); - pconti.put(PCN_GRUPPO, g); - pconti.put(PCN_CONTO, c); - pconti.put(PCN_SOTTOCONTO, s); - if (pconti.read() != NOERR) - return FALSE; - } - } - else return FALSE; - - return TRUE; -} - -bool TRic_ListaMov::controlla_rmov() -{ - TLocalisamfile& rmov = current_cursor()->file(LF_RMOV); - int gruppo, conto, gruppoc, contoc; - long sottoconto, sottocontoc; - char sezione; - real importo, dare, avere; - - if (current_cursor()->is_first_match(LF_RMOV)) - { - dare = avere = ZERO; - TRecnotype nrec = rmov.recno(); - rmov.zero(); - rmov.setkey(1); - rmov.put(RMV_NUMREG, _numero); - TRectype recc (rmov.curr()); - for (rmov.read(_isgteq); !rmov.eof() ;rmov.next()) - { - TRectype rec (rmov.curr()); - if (rec > recc) break; - gruppo = rec.get_int(RMV_GRUPPO); - conto = rec.get_int(RMV_CONTO); - sottoconto = rec.get_long(RMV_SOTTOCONTO); - gruppoc = rec.get_int(RMV_GRUPPOC); - contoc = rec.get_int(RMV_CONTOC); - sottocontoc = rec.get_long(RMV_SOTTOCONTOC); - sezione = rec.get_char(RMV_SEZIONE); - importo = rec.get_real(RMV_IMPORTO); - - if (sezione == 'D') - dare += importo; - if (sezione == 'A') - avere += importo; - - if (gruppo == 0 || conto == 0 || sottoconto == 0l) - { - rmov.readat(nrec); - return TRUE; - } - else - { - bool ok = errori_partita(gruppo,conto,sottoconto); - if (!ok) - { - rmov.readat(nrec); - return TRUE; - } - } - - if ( (importo == ZERO && sezione != ' ') || - (sezione != 'D' && sezione != 'A') ) - { - rmov.readat(nrec); - return TRUE; - } - - if (gruppoc == 0 || contoc == 0 || sottocontoc == 0l) - { - rmov.readat(nrec); - return TRUE; - } - else - { - bool ok = errori_partita(gruppoc,contoc,sottocontoc); - if (!ok) - { - rmov.readat(nrec); - return TRUE; - } - } - - if (_esiste_causale) - if (!_mov_sez && importo == ZERO) - { - rmov.readat(nrec); - return TRUE; - } - } - if (dare != avere) - { - rmov.readat(nrec); - return TRUE; - } - rmov.readat(nrec); - } - return FALSE; -} - -void TRic_ListaMov::stampa_errori_rmov(int riga) -{ - if (_gruppo == 0 || _conto == 0 || _sottoconto == 0l) - set_row(++riga, "@8g*** Sottoconto partita non valido o non presente in archivio"); - else - { - if (!_esiste_conto) - set_row(++riga, "@8g*** Sottoconto partita non valido o non presente in archivio"); - } - - if ( (_importo == ZERO && _sezione != ' ') || - (_sezione != 'D' && _sezione != 'A') ) - set_row(++riga, "@8g*** Segnale dare/avere non valido"); - - if (_sezione == 'D') - _tot_dare += _importo; - if (_sezione == 'A') - _tot_avere += _importo; - - if (_gruppoc == 0 || _contoc == 0 || _sottocontoc == 0l) - set_row(++riga, "@8g*** Sottoconto contropartita non valido o non presente in archivio"); - else - { - bool ok = errori_partita(_gruppoc,_contoc,_sottocontoc); - if (!ok) - set_row(++riga, "@8g*** Sottoconto contropartita non valido o non presente in archivio"); - } - - if (_esiste_causale) - if (!_mov_sez && _importo == ZERO) - set_row(++riga, "@8g--- Importo riga uguale a zero"); -} - -bool TRic_ListaMov::controlla_riva() -{ - TLocalisamfile& rmoviva = current_cursor()->file(LF_RMOVIVA); - TTable tab_iva("%IVA"); - TString16 codiva; - int tipodet, tipocr, gruppocr, contocr; - long sottocontocr; - - if (current_cursor()->is_first_match(LF_RMOVIVA)) - { - TRecnotype nrec = rmoviva.recno(); - rmoviva.setkey(1); - rmoviva.zero(); - rmoviva.put(RMI_NUMREG, _numero); - TRectype recc (rmoviva.curr()); - for (rmoviva.read(_isgteq); !rmoviva.eof() ;rmoviva.next()) - { - TRectype rec (rmoviva.curr()); - if (rec > recc) break; - codiva = rec.get(RMI_CODIVA); - tipodet = rec.get_int(RMI_TIPODET); - tipocr = rec.get_int(RMI_TIPOCR); - gruppocr = rec.get_int(RMI_GRUPPO); - contocr = rec.get_int(RMI_CONTO); - sottocontocr = rec.get_long(RMI_SOTTOCONTO); - - TTable iva ("%IVA"); - iva.zero(); - iva.put("CODTAB", codiva); - if (iva.read() != NOERR) - { - rmoviva.readat(nrec); - return TRUE; - } - if (!(tipocr >= 0 && tipocr <= 9)) - { - rmoviva.readat(nrec); - return TRUE; - } - if (gruppocr == 0 || contocr == 0 || sottocontocr == 0l) - { - rmoviva.readat(nrec); - return TRUE; - } - else - { - bool ok = errori_partita(gruppocr,contocr,sottocontocr); - if (!ok) - { - rmoviva.readat(nrec); - return TRUE; - } - } - - if (tipodet != 0 && tipodet != 1 && tipodet != 3 && tipodet != 9) - { - rmoviva.readat(nrec); - return TRUE; - } - } - rmoviva.readat(nrec); - } - return FALSE; -} - -void TRic_ListaMov::stampa_errori_riva(int riga) -{ - TTable iva ("%IVA"); - - iva.zero(); - iva.put("CODTAB", _codiva); - if (iva.read() != NOERR) - set_row(++riga, "@8g--- Codice IVA non valido o non presente in tabella"); - - if (!(_tipocr >= 0 && _tipocr <= 9)) - set_row(++riga, "@8g--- Tipo costo/ricavo non valido"); - - if (_gruppocr == 0 || _contocr == 0 || _sottocontocr == 0l) - set_row(++riga, "@8g*** Sottoconto costo/ricavo non valido o non presente in archivio"); - else - { - bool ok = errori_partita(_gruppocr,_contocr,_sottocontocr); - if (!ok) - set_row(++riga, "@8g*** Sottoconto costo/ricavo non valido o non presente in archivio"); - } - - if (_tipod != 0 && _tipod != 1 && _tipod != 3 && _tipod != 9) - set_row(++riga, "@8g--- Tipo indetraibilita' non valido"); -} - -bool TRic_ListaMov::preprocess_page(int file,int counter) -{ - TCursor* cur = current_cursor(); - - if (counter) return TRUE; - - reset_print(); - - if (file == LF_MOV) - { - _anno = cur->curr(LF_MOV).get_int(MOV_ANNOES); - _datacomp = cur->curr(LF_MOV).get_date(MOV_DATACOMP); - _datadoc = cur->curr(LF_MOV).get_date(MOV_DATADOC); - _data74tr = cur->curr(LF_MOV).get_date(MOV_DATA74TER); - _causale = cur->curr(LF_MOV).get(MOV_CODCAUS); - _registro = cur->curr(LF_MOV).get(MOV_REG); - format_if_zero(_registro, 3); - _tipodoc = cur->curr(LF_MOV).get(MOV_TIPODOC); - _numdoc = cur->curr(LF_MOV).get(MOV_NUMDOC); - _datareg = cur->curr(LF_MOV).get_date(MOV_DATAREG); - _codcf = cur->curr(LF_MOV).get_long(MOV_CODCF); - _numero = cur->curr(LF_MOV).get_long(MOV_NUMREG); - _protiva = cur->curr(LF_MOV).get_long(MOV_PROTIVA); - _codval = cur->curr(LF_MOV).get(MOV_CODVALI); - _codpag = cur->curr(LF_MOV).get(MOV_CODPAG); - - _tot_dare = _tot_avere = ZERO; - _tot_doc = ZERO; - - _ae = date2esc(_datareg); - - _num_rec = cur->curr(LF_MOV).get_long(MOV_NUMGIO); - - bool controlla = controlla_mov(); //se TRUE => ci sono errori nella testata - bool verifica = (controlla_rmov() || controlla_riva()); - - if ( (_controllo == 1 && controlla) || _controllo == 2 || - (_controllo == 1 && verifica) ) - { - TString16 datareg_str = _datareg.string(); - // "Fai vedere lo stesso ..-..-.... anche se non c'e' la data..." - if (datareg_str.empty()) - datareg_str = " - - "; - TString16 datadoc_str = _datadoc.string(); - if (datadoc_str.empty()) - datadoc_str = " - - "; - int r = 1; - set_row(r++, ""); - set_row(r,"Operazione n. %-7ld", _numero); - set_row(r," del %s", (const char*)datareg_str); - set_row(r," doc. n. %-7s", (const char*)_numdoc); - set_row(r," del %s", (const char*)datadoc_str); - if (!_registro.blank()) //e' una fattura - { - set_row(r," registro IVA %-3s", (const char*)_registro); - set_row(r," protocollo n. %-5ld", _protiva); - } - set_row(r, " comp. %d", _anno); - - stampa_errori_mov(r); - - return TRUE; - } - return FALSE; - } - else if (file == LF_RMOV) - { - _gruppo = cur->curr(LF_RMOV).get_int(RMV_GRUPPO); - _conto = cur->curr(LF_RMOV).get_int(RMV_CONTO); - _sottoconto = cur->curr(LF_RMOV).get_long(RMV_SOTTOCONTO); - _gruppoc = cur->curr(LF_RMOV).get_int(RMV_GRUPPOC); - _contoc = cur->curr(LF_RMOV).get_int(RMV_CONTOC); - _sottocontoc = cur->curr(LF_RMOV).get_long(RMV_SOTTOCONTOC); - _importo = cur->curr(LF_RMOV).get_real(RMV_IMPORTO); - _sezione = cur->curr(LF_RMOV).get(RMV_SEZIONE)[0]; - TString80 descr = cur->curr(LF_RMOV).get(RMV_DESCR); - int numrig = cur->curr(LF_RMOV).get_int(RMV_NUMRIG); - - _tipo_conto = ""; - - if (_gruppo != 0 && _conto != 0 && _sottoconto != 0l) - _esiste_conto = DescrConto(_gruppo,_conto,_sottoconto); - else - { - _esiste_conto = FALSE; - _descr_conto = ""; - } - int r = 1; - set_row(r, "P%d", numrig); - set_row(r, "@5g%3s %-.20s @30g%-.24s @56g%03d %03d %06ld @71g%-.28s", (const char*) _causale, - (const char*) _descr_causale, (const char*) descr, _gruppo, _conto, _sottoconto, - (const char*) _descr_conto); - if (_sezione == 'D') - set_row(r, "@99g%r", &_importo); - else if (_sezione == 'A') - set_row(r, "@116g%r", &_importo); - else set_row(r, "@107g%r", &_importo); - - stampa_errori_rmov(r); - } - else if (file == LF_RMOVIVA) - { - real impo = cur->curr(LF_RMOVIVA).get_real(RMI_IMPONIBILE); - real impos = cur->curr(LF_RMOVIVA).get_real(RMI_IMPOSTA); - int numrig = cur->curr(LF_RMOVIVA).get_int(RMI_NUMRIG); - _tipocr = cur->curr(LF_RMOVIVA).get_int(RMI_TIPOCR); - _tipod = cur->curr(LF_RMOVIVA).get_int(RMI_TIPODET); - _codiva = cur->curr(LF_RMOVIVA).get(RMI_CODIVA); - _n_rec = cur->curr(LF_RMOVIVA).get_int(RMI_ANNOES); - _gruppocr = cur->curr(LF_RMOVIVA).get_int(RMI_GRUPPO); - _contocr = cur->curr(LF_RMOVIVA).get_int(RMI_CONTO); - _sottocontocr = cur->curr(LF_RMOVIVA).get_long(RMI_SOTTOCONTO); - - TString80 codiva_des(get_codiva_des(_codiva)); - - _tot_doc += impo + impos; - _impo = impo; - _impos = impos; - - if (!_tipodoc.blank()) - { - TTable tabtpd("%TPD"); - tabtpd.put("CODTAB", _tipodoc); - if (tabtpd.read() == NOERR) - { - bool cor = tabtpd.get_bool("B0"); - if (cor) - { - _impo = impo + impos; - _impos = ZERO; - } - } - } - - int r = 1; - set_row(r, "I%d", numrig); - set_row(r, "@5gImponibile %r Imposta %r Codice %4s %-50s %d", - &_impo, &_impos, (const char*) _codiva, (const char*) codiva_des, _tipod); - - stampa_errori_riva(r); - } - return TRUE; -} - -print_action TRic_ListaMov::postprocess_page(int file,int count) -{ - if (count) return NEXT_PAGE; - if (file == LF_MOV) - { - aggiorna_trasfer_Z(); - reset_print(); - _err.reset(); - int n = 1; - if (_tot_dare != _tot_avere) - { - set_row(n++, "@8g*** Il movimento risulta sbilanciato. Totali rilevati:@99g%r@116g%r", - &_tot_dare, &_tot_avere); - return REPEAT_PAGE; - } - } - if (file == LF_RMOVIVA) - aggiorna_trasfer_U(); - - return NEXT_PAGE; -} - -void TRic_ListaMov::postclose_print() -{ - if (_errore_grave) - message_box("Rilevati errori gravi durante il controllo movimenti: \n trasferimento interrotto"); - else - { - TConfig conf (CONFIG_DITTA); - conf.set("FlStTra", "M"); - - TTransfer_file& tr = trasfer(); - _record.overwrite("Z",240); //_record e' letto nella read_control_rec() - const int size = 256; - tr.write_control_rec(_record, size); - } -} - -void TRic_ListaMov::aggiorna_trasfer_Z() -{ - TLocalisamfile& mov = current_cursor()->file(LF_MOV); - - int i=0; - while (_registro[i]=='0' || _registro[i]==' ') i++; - - _registro = ""; - _registro << _registro[i]; - _registro.left_just(3, ' '); - - mov.put(MOV_REG, _registro); - mov.put(MOV_TIPODOC, _tipodoc); - mov.rewrite(); - - TString16 str; - TTransfer_file& tr = trasfer(); - long num = _inizioZ + _num_rec; - if (tr.read_rec_trasfer(num) > 0) - { - //tr.put(_registro, "Z1", 6); - //tr.put(_tipodoc, "Z1", 12); - if (_tiporeg != 0) - { - str = format("%d", _tiporeg); - tr.put(str, "Z1", 26); - } - str = _tot_doc.string(); - tr.put(str, "Z1", 13); - tr.put(_tipo_conto, "Z1", 11); - tr.write(num); - } -} - -void TRic_ListaMov::aggiorna_trasfer_U() -{ - TTransfer_file& tr = trasfer(); - long num = _inizioU + _n_rec; - if (tr.read_rec_trasfer(num) > 0) - { - TString16 str = _impo.string(); - tr.put(str, "U1", 14); - str = _impos.string(); - tr.put(str, "U1", 15); - tr.write(num); - } -} - -bool TRic_ListaMov::user_destroy() -{ - delete _giornale; - delete _trasfer; - delete _rel; - delete _cur; - delete _tmov; - delete _trmov; - delete _tiva; - delete _caus; - delete _ditte; - delete _clifo; - delete _pcon; - delete _tab_tra; - delete _tab_pag; - delete _tab_tpd; - delete _tab_iva; - - return TRUE; -} - -bool TRic_ListaMov::set_print(int m) -{ - TMask msk ("cg2700a"); - - TTransfer_file& tr = trasfer(); - - msk.set(F_NUMERO, tr.nultras()); - msk.set(F_DATALIMITE, tr.dataultras()); - msk.set(F_SDT, look_sdt()); - msk.set(F_SIGLA, tr.ult_file()); - msk.set(F_CHIAVE, tr.key()); - - if (msk.run() != K_ENTER) return FALSE; - - _controllo = msk.get_int(F_LISTA); - - if (_sdt == '*') - fremove(_pathfile); - - setta_parametri(" ", "C"); - - set_real_picture("###.###.###.###"); - - printer().footerlen(5); - - setta_intestazione(); - - _errore_grave = FALSE; - _err.reset(); - _inizioZ = tr.start('Z'); - _inizioU = tr.start('U'); - - return TRUE; -} - -void TRic_ListaMov::setta_intestazione() -{ - int soh = 1; - TString sep(132); - TString ragsoc(50); - - TLocalisamfile nditte(LF_NDITTE); - nditte.zero(); - nditte.put(NDT_CODDITTA, get_firm()); - if (nditte.read() == NOERR) - ragsoc = nditte.get(NDT_RAGSOC); - - reset_header(); - - sep << "Ditta " << get_firm(); - sep << " " << ragsoc; - sep.left_just(132); - - set_header (soh++, (const char*) sep); - - sep = ""; - sep << "Data @< Pag. @#"; - - sep.right_just(127); - - sep.overwrite ("LISTA DI CONTROLLO MOVIMENTI IN TRASFERIMENTO"); - set_header (soh++, (const char*)sep); - sep.fill('-'); - set_header (soh++, (const char *) sep); - set_header (soh++, "Rig Cod.causale @30gDescriz.aggiuntiva @56gCod.conto @71gDescriz.conto @99gDare @116gAvere"); - set_header (soh, (const char *) sep); -} - -void TRic_ListaMov::setta_parametri(const TString& sigla, const TString& flag) -{ - TTransfer_file& tr = trasfer(); - - TConfig conf (CONFIG_DITTA); - conf.set("FlStTra", flag); - - TString rec = tr.record(); - rec.overwrite(sigla,240); - - const int size = 256; - tr.write_control_rec(rec, size); -} - -int cg2700 (int argc, char* argv[]) -{ - TRic_ListaMov a; - a.run(argc, argv,"Lista controllo movimenti"); - return TRUE; -} +// +// Ricezione dati: lista controllo movimenti +// +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "cg2103.h" +#include "cglib04.h" +#include "cg2700.h" + +HIDDEN const char* err_msg[] = {"*** Data operazione non valida", + "--- Data competenza non compresa in alcun esercizio", + "*** Data operazione antecedente ad ultima stampa giornale", + "--- Data documento non valida", + "*** Codice causale non valido o non presente in archivio", + "--- Codice pagamento non valido o non presente in tabella", + "*** Codice registro IVA non valido o non presente in tabella", + "*** Codice cliente/fornitore non valido o non presente in anagrafica", + "--- Data 74 ter non valida", + "*** Data operazione antecedente ad ultima stampa registro IVA"}; + +HIDDEN int date2esc(const TDate& d, int* prevesc = NULL); + +class TRic_ListaMov : public TPrintapp +{ + TTable* _tab_tra,* _tab_pag,* _tab_tpd,* _tab_iva; + TIsamtempfile* _tmov,* _trmov,* _tiva; + TLocalisamfile* _caus,* _ditte,* _clifo,* _pcon; + TRelation* _rel; + TCursor* _cur; + TTransfer_file* _trasfer; + TLibro_giornale* _giornale; + TString80 _pathfile, _descr_causale, _descr_conto; + TString16 _causale, _registro, _numdoc, _tipodoc, _codval; + TString16 _codpag, _codiva, _tipo_conto; + TString _record; + bool _mov_sez, _errore_grave, _esiste_conto, _esiste_causale; + char _sdt, _sezione; + int _ae, _anno, _gruppo, _conto, _tipocr, _tipod, _tiporeg; + int _gruppoc, _contoc, _n_rec, _gruppocr, _contocr; + TDate _datacomp, _datadoc, _datareg, _data74tr; + real _importo, _impo, _impos, _tot_dare, _tot_avere, _tot_doc; + long _codcf, _numero, _protiva, _sottoconto; + long _inizioZ, _inizioU, _num_rec, _sottocontoc, _sottocontocr; + TBit_array _err; + byte _controllo; + +public: + virtual bool set_print(int m); + virtual bool user_create() ; + virtual bool user_destroy(); + virtual bool preprocess_page(int,int); + virtual print_action postprocess_page(int,int); + virtual void postclose_print(); + const char* look_sdt(); + const char* get_codiva_des(const char*); + bool DescrConto(int,int,long); + bool check_archivi(TProgind*); + bool look_pag(); + bool errori_partita(int,int,long); + bool controlla_mov(); + bool controlla_rmov(); + bool controlla_riva(); + void stampa_errori_mov(int); + void stampa_errori_rmov(int); + void stampa_errori_riva(int); + void aggiorna_trasfer_Z(); + void aggiorna_trasfer_U(); + void setta_parametri(const TString&, const TString&); + void setta_intestazione(); + TLibro_giornale& giornale() { return *_giornale; } + TTransfer_file& trasfer() { return *_trasfer; } + + TRic_ListaMov(): _err(80) {} + virtual ~TRic_ListaMov() {} +}; + +HIDDEN inline TRic_ListaMov& app() { return (TRic_ListaMov&)main_app();} + +HIDDEN int date2esc(const TDate& d, int* prevesc) +{ + if (prevesc) *prevesc = 0; + TTable esc("ESC"); + for (int err = esc.first(); err == NOERR; err = esc.next()) + { + const TDate ia(esc.get("D0")); // Data inizio esercizio + const TDate fa(esc.get("D1")); // Data fine esercizio + const anno = esc.get_int("CODTAB"); + if (d >= ia && d <= fa) + return anno; + if (prevesc) *prevesc = anno; + } + return 0; +} + +const char* TRic_ListaMov::look_sdt() +{ + TConfig conf(CONFIG_DITTA); + return conf.get("FlStTra"); +} + +bool TRic_ListaMov::look_pag() +{ + TTable t ("%CPG"); + t.zero(); + t.put("CODTAB",_codpag); + if (t.read() != NOERR) return FALSE; + return TRUE; +} + +const char* TRic_ListaMov::get_codiva_des(const char* codiva) +{ + TTable iva ("%IVA"); + + iva.zero(); + iva.put("CODTAB", codiva); + if (iva.read() == NOERR) + return iva.get("S0"); + else + return NULL; +} + +bool TRic_ListaMov::DescrConto(int g, int c, long s) +{ + TString80 ragsoc; + const char* descr = NULL; + TLocalisamfile pconti (LF_PCON); + pconti.setkey(1); + pconti.zero(); + pconti.put(PCN_GRUPPO, g); + pconti.put(PCN_CONTO, c); + pconti.put(PCN_SOTTOCONTO, 0L); + if (pconti.read() == NOERR) + { + _tipo_conto = pconti.get(PCN_TMCF); + if (_tipo_conto == "C" || _tipo_conto == "F") + { + TLocalisamfile clifo (LF_CLIFO); + clifo.setkey(1); + clifo.zero(); + clifo.put(CLI_TIPOCF, _tipo_conto); + clifo.put(CLI_CODCF, s); + if (clifo.read() != NOERR) + { + _descr_conto = ""; + return FALSE; + } + else + { + char tipoa = clifo.get_char("TIPOAPER"); + if (tipoa == 'F') //persona fisica + { + TString80 cognome, nome; + ragsoc = clifo.get("RAGSOC"); + cognome = ragsoc.mid(0,30); + nome = ragsoc.mid(30,20); + cognome.trim(); nome.trim(); + ragsoc = cognome; + ragsoc << " " << nome; + _descr_conto = ragsoc; + } + else _descr_conto = clifo.get("RAGSOC"); + } + } + else + { + pconti.zero(); + pconti.put(PCN_GRUPPO, g); + pconti.put(PCN_CONTO, c); + pconti.put(PCN_SOTTOCONTO, s); + if (pconti.read() != NOERR) + { + _descr_conto = ""; + return FALSE; + } + else _descr_conto = pconti.get(PCN_DESCR); + } + } + else + { + _descr_conto = ""; + return FALSE; + } + return TRUE; +} + +bool TRic_ListaMov::user_create() +{ + _trasfer = new TTransfer_file(); + + TProgind* pnd = NULL; + pnd = new TProgind (3,"Controllo archivi\nPrego attendere", + FALSE, TRUE, 30); + _tab_tra = new TTable ("%TRA"); + _tab_tpd = new TTable ("%TPD"); + _tab_pag = new TTable ("%CPG"); + _tab_iva = new TTable ("%IVA"); + _caus = new TLocalisamfile (LF_CAUSALI); + _ditte = new TLocalisamfile (LF_NDITTE); + _clifo = new TLocalisamfile (LF_CLIFO); + _pcon = new TLocalisamfile (LF_PCON); + + if (pnd) pnd->addstatus(1); + + if (!check_archivi(pnd)) + { + delete pnd; + return FALSE; + } + + if (pnd) pnd->addstatus(1); + + TString80 tmpmov = "%"; + tmpmov << get_firm_dir(); + tmpmov << "\\" << TEMP_MOV; + TString80 tmprmov = "%"; + tmprmov << get_firm_dir(); + tmprmov << "\\" << TEMP_RMOV; + TString80 tmprmoviva = "%"; + tmprmoviva << get_firm_dir(); + tmprmoviva << "\\" << TEMP_RMOVIVA; + + _tmov = new TIsamtempfile(LF_MOV, tmpmov, 0); + _trmov = new TIsamtempfile(LF_RMOV, tmprmov, 0); + _tiva = new TIsamtempfile(LF_RMOVIVA, tmprmoviva, 0); + + _rel = new TRelation(_tmov); + _rel->add(_trmov,"NUMREG=NUMREG",1,0,0,FALSE); + _rel->add(_tiva, "NUMREG=NUMREG",1,0,0,FALSE); + _cur = new TCursor (_rel, "", 1); + + _giornale = new TLibro_giornale(); + + add_cursor(_cur); + + add_file (LF_MOV); + add_file (LF_RMOV, LF_MOV); + add_file (LF_RMOVIVA, LF_MOV); + + printer().footerlen(5); + + delete pnd; + + return TRUE; +} + +bool TRic_ListaMov::check_archivi(TProgind* pnd) +{ + TString80 nome; + long ditta_ric = get_firm(); + + if (!prefix().exist(ditta_ric)) + return error_box("Rilevati errori gravi negli archivi: procedura interrotta"); + + TTransfer_file& tr = trasfer(); + + _pathfile = tr.path(); + + _pathfile = _pathfile << "\\trasfer"; + + if (!tr.open(_pathfile)) + return error_box("Al momento non presenti trasferimenti attivi sulla ditta selezionata"); + + if (!tr.read_control_rec()) + return error_box("Rilevati errori gravi negli archivi: procedura interrotta"); + else _record = tr.record(); + + TString16 sd = look_sdt(); + + if (sd.not_empty()) + _sdt = sd[0]; + else return error_box("Ricezione tabelle non effettuata: richiamare il programma relativo"); + + if (_sdt == 'T') + return error_box("Ricezione tabelle non effettuata: richiamare il programma relativo"); + + if (_sdt == 'M') + return yesno_box("Controllo gia' effettuato: si desidera ripeterlo ?"); + + if (_sdt != '*' && _sdt != 'C') + return error_box("Rilevati errori gravi negli archivi: procedura interrotta"); + + TString16 ult = tr.ult_file(); + TString16 key = tr.key(); + + ult.strip_spaces(); + key.strip_spaces(); + + if (_sdt == 'C') + if ( ult.not_empty() || key.not_empty() ) + return error_box("Rilevati errori gravi negli archivi: procedura interrotta"); + + if (_sdt == '*') + return warning_box("Trasferimento interamente completato: proseguire per cancellare i file"); + + if (pnd) pnd->addstatus(1); + + return TRUE; +} + +void TRic_ListaMov::stampa_errori_mov(int riga) +{ + long i = _err.first_one(); + if (i != -1) + { + for (; i <= _err.last_one(); i++) + if (_err[i]) + set_row(++riga, "@8g%s", (const char*) err_msg[i]); + } +} + +bool TRic_ListaMov::controlla_mov() +{ + bool check_reg = TRUE; + TString16 causreg; + TDate udata; + char tipocf; + + _tiporeg = 0; + + if (!_datareg.ok()) + { + _errore_grave = TRUE; + _err.set(0L); + } + else if (!_datacomp.ok()) + { + const int ae = date2esc(_datacomp); + if (ae == 0) + _err.set(1); + } + + TLibro_giornale& gio = giornale(); + bool ok = gio.read(_ae); //se _ae e' zero la read considera come anno quello corrente + if (_datareg < gio.last_print()) + { + _errore_grave = TRUE; + _err.set(2); + } + + TString16 dd = _datadoc.string(); + if (dd.not_empty()) + if (!_datadoc.ok()) + _err.set(3); + + //if (_causale.not_empty()) + //{ + TLocalisamfile caus(LF_CAUSALI); + caus.setkey(1); + caus.zero(); + caus.put(CAU_CODCAUS,_causale); + if (caus.read() == NOERR) + { + _esiste_causale = TRUE; + _tipodoc = caus.get(CAU_TIPODOC); + } + else + { + caus.zero(); + _esiste_causale = FALSE; + if (look_causale(_causale)) //se la causale e' significativa + { + _errore_grave = TRUE; + _err.set(4); + } + } + //_tipodoc = caus.get(CAU_TIPODOC); ho sempre quello letto sul movimento! + causreg = caus.get(CAU_REG); + _descr_causale = caus.get(CAU_DESCR); + _mov_sez = caus.get_bool(CAU_MOVSEZ); + //} + + if (!_codpag.blank()) + { + bool ok = look_pag(); + if (!ok) + _err.set(5); + } + + if (!_registro.blank()) //movimento iva (fattura) + { + if (!look_causale(_causale)) //se la causale non e' significativa + { + _errore_grave = TRUE; + check_reg = FALSE; + _err.set(6); + } + if (check_reg && _ae) + { + TRegistro rg (_registro, _ae); + if (rg.name().empty()) + { + _errore_grave = TRUE; + check_reg = FALSE; + _err.set(6); + } + else + { + _tiporeg = rg.tipo(); + udata = rg.last_print(); + } + } + } + else if (!causreg.blank() && _ae) + { + TRegistro rg (causreg, _ae); + if (rg.name().empty()) + { + _errore_grave = TRUE; + check_reg = FALSE; + _err.set(6); + } + else + { + _tiporeg = rg.tipo(); + udata = rg.last_print(); + } + _registro = causreg; + } + + if (check_reg && !_registro.blank()) + { + if (_tiporeg == 1) tipocf = 'C'; + else if (_tiporeg == 2) tipocf = 'F'; + if (!_tipodoc.blank()) //se esiste, uso quello della causale!!! + { + TTable tabtpd("%TPD"); + tabtpd.put("CODTAB", _tipodoc); + if (tabtpd.read() == NOERR) + { + bool cor = tabtpd.get_bool("B0"); + if (!cor) + if (_codcf != 0l) + { + TLocalisamfile clifo(LF_CLIFO); + clifo.zero(); + clifo.put(CLI_CODCF, _codcf); + clifo.put(CLI_TIPOCF,tipocf); + if (clifo.read() != NOERR) + { + _errore_grave = TRUE; + _err.set(7); + } + } + else + { + _errore_grave = TRUE; + _err.set(7); + } + } + } + } + + TString16 d74 = _data74tr.string(); + if (d74.not_empty()) + if (!_data74tr.ok()) + _err.set(8); + + if (!_registro.blank() && check_reg) + if (_datareg < udata) + { + _errore_grave = TRUE; + _err.set(9); + } + + if (_err.ones()) + return TRUE; + + return FALSE; +} + +bool TRic_ListaMov::errori_partita(int g, int c, long s) +{ + TLocalisamfile pconti (LF_PCON); + pconti.setkey(1); + pconti.zero(); + pconti.put(PCN_GRUPPO, g); + pconti.put(PCN_CONTO, c); + pconti.put(PCN_SOTTOCONTO, 0L); + if (pconti.read() == NOERR) + { + char tipo = pconti.get(PCN_TMCF)[0]; + if (tipo == 'C' || tipo == 'F') + { + TLocalisamfile clifo (LF_CLIFO); + clifo.setkey(1); + clifo.zero(); + clifo.put(CLI_TIPOCF, tipo); + clifo.put(CLI_CODCF, s); + if (clifo.read() != NOERR) + return FALSE; + } + else + { + pconti.zero(); + pconti.put(PCN_GRUPPO, g); + pconti.put(PCN_CONTO, c); + pconti.put(PCN_SOTTOCONTO, s); + if (pconti.read() != NOERR) + return FALSE; + } + } + else return FALSE; + + return TRUE; +} + +bool TRic_ListaMov::controlla_rmov() +{ + TLocalisamfile& rmov = current_cursor()->file(LF_RMOV); + int gruppo, conto, gruppoc, contoc; + long sottoconto, sottocontoc; + char sezione; + real importo, dare, avere; + + if (current_cursor()->is_first_match(LF_RMOV)) + { + dare = avere = ZERO; + TRecnotype nrec = rmov.recno(); + rmov.zero(); + rmov.setkey(1); + rmov.put(RMV_NUMREG, _numero); + TRectype recc (rmov.curr()); + for (rmov.read(_isgteq); !rmov.eof() ;rmov.next()) + { + TRectype rec (rmov.curr()); + if (rec > recc) break; + gruppo = rec.get_int(RMV_GRUPPO); + conto = rec.get_int(RMV_CONTO); + sottoconto = rec.get_long(RMV_SOTTOCONTO); + gruppoc = rec.get_int(RMV_GRUPPOC); + contoc = rec.get_int(RMV_CONTOC); + sottocontoc = rec.get_long(RMV_SOTTOCONTOC); + sezione = rec.get_char(RMV_SEZIONE); + importo = rec.get_real(RMV_IMPORTO); + + if (sezione == 'D') + dare += importo; + if (sezione == 'A') + avere += importo; + + if (gruppo == 0 || conto == 0 || sottoconto == 0l) + { + rmov.readat(nrec); + return TRUE; + } + else + { + bool ok = errori_partita(gruppo,conto,sottoconto); + if (!ok) + { + rmov.readat(nrec); + return TRUE; + } + } + + if ( (importo == ZERO && sezione != ' ') || + (sezione != 'D' && sezione != 'A') ) + { + rmov.readat(nrec); + return TRUE; + } + + if (gruppoc == 0 || contoc == 0 || sottocontoc == 0l) + { + rmov.readat(nrec); + return TRUE; + } + else + { + bool ok = errori_partita(gruppoc,contoc,sottocontoc); + if (!ok) + { + rmov.readat(nrec); + return TRUE; + } + } + + if (_esiste_causale) + if (!_mov_sez && importo == ZERO) + { + rmov.readat(nrec); + return TRUE; + } + } + if (dare != avere) + { + rmov.readat(nrec); + return TRUE; + } + rmov.readat(nrec); + } + return FALSE; +} + +void TRic_ListaMov::stampa_errori_rmov(int riga) +{ + if (_gruppo == 0 || _conto == 0 || _sottoconto == 0l) + set_row(++riga, "@8g*** Sottoconto partita non valido o non presente in archivio"); + else + { + if (!_esiste_conto) + set_row(++riga, "@8g*** Sottoconto partita non valido o non presente in archivio"); + } + + if ( (_importo == ZERO && _sezione != ' ') || + (_sezione != 'D' && _sezione != 'A') ) + set_row(++riga, "@8g*** Segnale dare/avere non valido"); + + if (_sezione == 'D') + _tot_dare += _importo; + if (_sezione == 'A') + _tot_avere += _importo; + + if (_gruppoc == 0 || _contoc == 0 || _sottocontoc == 0l) + set_row(++riga, "@8g*** Sottoconto contropartita non valido o non presente in archivio"); + else + { + bool ok = errori_partita(_gruppoc,_contoc,_sottocontoc); + if (!ok) + set_row(++riga, "@8g*** Sottoconto contropartita non valido o non presente in archivio"); + } + + if (_esiste_causale) + if (!_mov_sez && _importo == ZERO) + set_row(++riga, "@8g--- Importo riga uguale a zero"); +} + +bool TRic_ListaMov::controlla_riva() +{ + TLocalisamfile& rmoviva = current_cursor()->file(LF_RMOVIVA); + TTable tab_iva("%IVA"); + TString16 codiva; + int tipodet, tipocr, gruppocr, contocr; + long sottocontocr; + + if (current_cursor()->is_first_match(LF_RMOVIVA)) + { + TRecnotype nrec = rmoviva.recno(); + rmoviva.setkey(1); + rmoviva.zero(); + rmoviva.put(RMI_NUMREG, _numero); + TRectype recc (rmoviva.curr()); + for (rmoviva.read(_isgteq); !rmoviva.eof() ;rmoviva.next()) + { + TRectype rec (rmoviva.curr()); + if (rec > recc) break; + codiva = rec.get(RMI_CODIVA); + tipodet = rec.get_int(RMI_TIPODET); + tipocr = rec.get_int(RMI_TIPOCR); + gruppocr = rec.get_int(RMI_GRUPPO); + contocr = rec.get_int(RMI_CONTO); + sottocontocr = rec.get_long(RMI_SOTTOCONTO); + + TTable iva ("%IVA"); + iva.zero(); + iva.put("CODTAB", codiva); + if (iva.read() != NOERR) + { + rmoviva.readat(nrec); + return TRUE; + } + if (!(tipocr >= 0 && tipocr <= 9)) + { + rmoviva.readat(nrec); + return TRUE; + } + if (gruppocr == 0 || contocr == 0 || sottocontocr == 0l) + { + rmoviva.readat(nrec); + return TRUE; + } + else + { + bool ok = errori_partita(gruppocr,contocr,sottocontocr); + if (!ok) + { + rmoviva.readat(nrec); + return TRUE; + } + } + + if (tipodet != 0 && tipodet != 1 && tipodet != 3 && tipodet != 9) + { + rmoviva.readat(nrec); + return TRUE; + } + } + rmoviva.readat(nrec); + } + return FALSE; +} + +void TRic_ListaMov::stampa_errori_riva(int riga) +{ + TTable iva ("%IVA"); + + iva.zero(); + iva.put("CODTAB", _codiva); + if (iva.read() != NOERR) + set_row(++riga, "@8g--- Codice IVA non valido o non presente in tabella"); + + if (!(_tipocr >= 0 && _tipocr <= 9)) + set_row(++riga, "@8g--- Tipo costo/ricavo non valido"); + + if (_gruppocr == 0 || _contocr == 0 || _sottocontocr == 0l) + set_row(++riga, "@8g*** Sottoconto costo/ricavo non valido o non presente in archivio"); + else + { + bool ok = errori_partita(_gruppocr,_contocr,_sottocontocr); + if (!ok) + set_row(++riga, "@8g*** Sottoconto costo/ricavo non valido o non presente in archivio"); + } + + if (_tipod != 0 && _tipod != 1 && _tipod != 3 && _tipod != 9) + set_row(++riga, "@8g--- Tipo indetraibilita' non valido"); +} + +bool TRic_ListaMov::preprocess_page(int file,int counter) +{ + TCursor* cur = current_cursor(); + + if (counter) return TRUE; + + reset_print(); + + if (file == LF_MOV) + { + _anno = cur->curr(LF_MOV).get_int(MOV_ANNOES); + _datacomp = cur->curr(LF_MOV).get_date(MOV_DATACOMP); + _datadoc = cur->curr(LF_MOV).get_date(MOV_DATADOC); + _data74tr = cur->curr(LF_MOV).get_date(MOV_DATA74TER); + _causale = cur->curr(LF_MOV).get(MOV_CODCAUS); + _registro = cur->curr(LF_MOV).get(MOV_REG); + format_if_zero(_registro, 3); + _tipodoc = cur->curr(LF_MOV).get(MOV_TIPODOC); + _numdoc = cur->curr(LF_MOV).get(MOV_NUMDOC); + _datareg = cur->curr(LF_MOV).get_date(MOV_DATAREG); + _codcf = cur->curr(LF_MOV).get_long(MOV_CODCF); + _numero = cur->curr(LF_MOV).get_long(MOV_NUMREG); + _protiva = cur->curr(LF_MOV).get_long(MOV_PROTIVA); + _codval = cur->curr(LF_MOV).get(MOV_CODVALI); + _codpag = cur->curr(LF_MOV).get(MOV_CODPAG); + + _tot_dare = _tot_avere = ZERO; + _tot_doc = ZERO; + + _ae = date2esc(_datareg); + + _num_rec = cur->curr(LF_MOV).get_long(MOV_NUMGIO); + + bool controlla = controlla_mov(); //se TRUE => ci sono errori nella testata + bool verifica = (controlla_rmov() || controlla_riva()); + + if ( (_controllo == 1 && controlla) || _controllo == 2 || + (_controllo == 1 && verifica) ) + { + TString16 datareg_str = _datareg.string(); + // "Fai vedere lo stesso ..-..-.... anche se non c'e' la data..." + if (datareg_str.empty()) + datareg_str = " - - "; + TString16 datadoc_str = _datadoc.string(); + if (datadoc_str.empty()) + datadoc_str = " - - "; + int r = 1; + set_row(r++, ""); + set_row(r,"Operazione n. %-7ld", _numero); + set_row(r," del %s", (const char*)datareg_str); + set_row(r," doc. n. %-7s", (const char*)_numdoc); + set_row(r," del %s", (const char*)datadoc_str); + if (!_registro.blank()) //e' una fattura + { + set_row(r," registro IVA %-3s", (const char*)_registro); + set_row(r," protocollo n. %-5ld", _protiva); + } + set_row(r, " comp. %d", _anno); + + stampa_errori_mov(r); + + return TRUE; + } + return FALSE; + } + else if (file == LF_RMOV) + { + _gruppo = cur->curr(LF_RMOV).get_int(RMV_GRUPPO); + _conto = cur->curr(LF_RMOV).get_int(RMV_CONTO); + _sottoconto = cur->curr(LF_RMOV).get_long(RMV_SOTTOCONTO); + _gruppoc = cur->curr(LF_RMOV).get_int(RMV_GRUPPOC); + _contoc = cur->curr(LF_RMOV).get_int(RMV_CONTOC); + _sottocontoc = cur->curr(LF_RMOV).get_long(RMV_SOTTOCONTOC); + _importo = cur->curr(LF_RMOV).get_real(RMV_IMPORTO); + _sezione = cur->curr(LF_RMOV).get(RMV_SEZIONE)[0]; + TString80 descr = cur->curr(LF_RMOV).get(RMV_DESCR); + int numrig = cur->curr(LF_RMOV).get_int(RMV_NUMRIG); + + _tipo_conto = ""; + + if (_gruppo != 0 && _conto != 0 && _sottoconto != 0l) + _esiste_conto = DescrConto(_gruppo,_conto,_sottoconto); + else + { + _esiste_conto = FALSE; + _descr_conto = ""; + } + int r = 1; + set_row(r, "P%d", numrig); + set_row(r, "@5g%3s %-.20s @30g%-.24s @56g%03d %03d %06ld @71g%-.28s", (const char*) _causale, + (const char*) _descr_causale, (const char*) descr, _gruppo, _conto, _sottoconto, + (const char*) _descr_conto); + if (_sezione == 'D') + set_row(r, "@99g%r", &_importo); + else if (_sezione == 'A') + set_row(r, "@116g%r", &_importo); + else set_row(r, "@107g%r", &_importo); + + stampa_errori_rmov(r); + } + else if (file == LF_RMOVIVA) + { + real impo = cur->curr(LF_RMOVIVA).get_real(RMI_IMPONIBILE); + real impos = cur->curr(LF_RMOVIVA).get_real(RMI_IMPOSTA); + int numrig = cur->curr(LF_RMOVIVA).get_int(RMI_NUMRIG); + _tipocr = cur->curr(LF_RMOVIVA).get_int(RMI_TIPOCR); + _tipod = cur->curr(LF_RMOVIVA).get_int(RMI_TIPODET); + _codiva = cur->curr(LF_RMOVIVA).get(RMI_CODIVA); + _n_rec = cur->curr(LF_RMOVIVA).get_int(RMI_ANNOES); + _gruppocr = cur->curr(LF_RMOVIVA).get_int(RMI_GRUPPO); + _contocr = cur->curr(LF_RMOVIVA).get_int(RMI_CONTO); + _sottocontocr = cur->curr(LF_RMOVIVA).get_long(RMI_SOTTOCONTO); + + TString80 codiva_des(get_codiva_des(_codiva)); + + _tot_doc += impo + impos; + _impo = impo; + _impos = impos; + + if (!_tipodoc.blank()) + { + TTable tabtpd("%TPD"); + tabtpd.put("CODTAB", _tipodoc); + if (tabtpd.read() == NOERR) + { + bool cor = tabtpd.get_bool("B0"); + if (cor) + { + _impo = impo + impos; + _impos = ZERO; + } + } + } + + int r = 1; + set_row(r, "I%d", numrig); + set_row(r, "@5gImponibile %r Imposta %r Codice %4s %-50s %d", + &_impo, &_impos, (const char*) _codiva, (const char*) codiva_des, _tipod); + + stampa_errori_riva(r); + } + return TRUE; +} + +print_action TRic_ListaMov::postprocess_page(int file,int count) +{ + if (count) return NEXT_PAGE; + if (file == LF_MOV) + { + aggiorna_trasfer_Z(); + reset_print(); + _err.reset(); + int n = 1; + if (_tot_dare != _tot_avere) + { + set_row(n++, "@8g*** Il movimento risulta sbilanciato. Totali rilevati:@99g%r@116g%r", + &_tot_dare, &_tot_avere); + return REPEAT_PAGE; + } + } + if (file == LF_RMOVIVA) + aggiorna_trasfer_U(); + + return NEXT_PAGE; +} + +void TRic_ListaMov::postclose_print() +{ + if (_errore_grave) + message_box("Rilevati errori gravi durante il controllo movimenti: \n trasferimento interrotto"); + else + { + TConfig conf (CONFIG_DITTA); + conf.set("FlStTra", "M"); + + TTransfer_file& tr = trasfer(); + _record.overwrite("Z",240); //_record e' letto nella read_control_rec() + const int size = 256; + tr.write_control_rec(_record, size); + } +} + +void TRic_ListaMov::aggiorna_trasfer_Z() +{ + TLocalisamfile& mov = current_cursor()->file(LF_MOV); + + int i=0; + while (_registro[i]=='0' || _registro[i]==' ') i++; + + _registro = ""; + _registro << _registro[i]; + _registro.left_just(3, ' '); + + mov.put(MOV_REG, _registro); + mov.put(MOV_TIPODOC, _tipodoc); + mov.rewrite(); + + TString16 str; + TTransfer_file& tr = trasfer(); + long num = _inizioZ + _num_rec; + if (tr.read_rec_trasfer(num) > 0) + { + //tr.put(_registro, "Z1", 6); + //tr.put(_tipodoc, "Z1", 12); + if (_tiporeg != 0) + { + str = format("%d", _tiporeg); + tr.put(str, "Z1", 26); + } + str = _tot_doc.string(); + tr.put(str, "Z1", 13); + tr.put(_tipo_conto, "Z1", 11); + tr.write(num); + } +} + +void TRic_ListaMov::aggiorna_trasfer_U() +{ + TTransfer_file& tr = trasfer(); + long num = _inizioU + _n_rec; + if (tr.read_rec_trasfer(num) > 0) + { + TString16 str = _impo.string(); + tr.put(str, "U1", 14); + str = _impos.string(); + tr.put(str, "U1", 15); + tr.write(num); + } +} + +bool TRic_ListaMov::user_destroy() +{ + delete _giornale; + delete _trasfer; + delete _rel; + delete _cur; + delete _tmov; + delete _trmov; + delete _tiva; + delete _caus; + delete _ditte; + delete _clifo; + delete _pcon; + delete _tab_tra; + delete _tab_pag; + delete _tab_tpd; + delete _tab_iva; + + return TRUE; +} + +bool TRic_ListaMov::set_print(int m) +{ + TMask msk ("cg2700a"); + + TTransfer_file& tr = trasfer(); + + msk.set(F_NUMERO, tr.nultras()); + msk.set(F_DATALIMITE, tr.dataultras()); + msk.set(F_SDT, look_sdt()); + msk.set(F_SIGLA, tr.ult_file()); + msk.set(F_CHIAVE, tr.key()); + + if (msk.run() != K_ENTER) return FALSE; + + _controllo = msk.get_int(F_LISTA); + + if (_sdt == '*') + fremove(_pathfile); + + setta_parametri(" ", "C"); + + set_real_picture("###.###.###.###"); + + printer().footerlen(5); + + setta_intestazione(); + + _errore_grave = FALSE; + _err.reset(); + _inizioZ = tr.start('Z'); + _inizioU = tr.start('U'); + + return TRUE; +} + +void TRic_ListaMov::setta_intestazione() +{ + int soh = 1; + TString sep(132); + TString ragsoc(50); + + TLocalisamfile nditte(LF_NDITTE); + nditte.zero(); + nditte.put(NDT_CODDITTA, get_firm()); + if (nditte.read() == NOERR) + ragsoc = nditte.get(NDT_RAGSOC); + + reset_header(); + + sep << "Ditta " << get_firm(); + sep << " " << ragsoc; + sep.left_just(132); + + set_header (soh++, (const char*) sep); + + sep = ""; + sep << "Data @< Pag. @#"; + + sep.right_just(127); + + sep.overwrite ("LISTA DI CONTROLLO MOVIMENTI IN TRASFERIMENTO"); + set_header (soh++, (const char*)sep); + sep.fill('-'); + set_header (soh++, (const char *) sep); + set_header (soh++, "Rig Cod.causale @30gDescriz.aggiuntiva @56gCod.conto @71gDescriz.conto @99gDare @116gAvere"); + set_header (soh, (const char *) sep); +} + +void TRic_ListaMov::setta_parametri(const TString& sigla, const TString& flag) +{ + TTransfer_file& tr = trasfer(); + + TConfig conf (CONFIG_DITTA); + conf.set("FlStTra", flag); + + TString rec = tr.record(); + rec.overwrite(sigla,240); + + const int size = 256; + tr.write_control_rec(rec, size); +} + +int cg2700 (int argc, char* argv[]) +{ + TRic_ListaMov a; + a.run(argc, argv,"Lista controllo movimenti"); + return TRUE; +}