diff --git a/cg/cg2100.cpp b/cg/cg2100.cpp index 7771b729b..f9f2c1c71 100755 --- a/cg/cg2100.cpp +++ b/cg/cg2100.cpp @@ -257,7 +257,7 @@ bool TPrimanota_application::read_caus(const char* cod, int year) m->show(F_ANNORIF, _is_saldaconto); // Mostra/nasconde anno e riferimento partita m->show(F_NUMRIF, _is_saldaconto); - m->enable(F_ANNORIF, ins); // Dis/abilita anno e riferimento partita + m->enable(F_ANNORIF, ins); // Dis/abilita anno e riferimento partita m->enable(F_NUMRIF, ins); m->field(F_NUMRIF).set_justify(iva == iva_acquisti ? _num_for : _num_cli); @@ -312,12 +312,10 @@ bool TPrimanota_application::read_caus(const char* cod, int year) if (iva == nessuna_iva) { - char tipr = ' '; if (_is_saldaconto) { - // non si cagano gli importi totali - if (nriga < 8) continue; + if (nriga < 8) continue; // non si cagano gli importi totali switch(nriga) { case 8: @@ -611,38 +609,28 @@ int TPrimanota_application::read(TMask& m) _saldi.set_num_ulmov(m.get_long(F_NUMREG)); _saldi.set_data_ulmov((TDate)m.get(F_DATAREG)); - - TToken_string riga(255); - for (int i = 0; i < _rel->cg_items(); i++) { const TRectype& r = _rel->cg(i); - riga.cut(0); // Vuota la riga + TToken_string& riga = cgs().row(i); // Vuota la riga - const char sezione = toupper(r.get_char("SEZIONE")); - const real im(r.get_real("IMPORTO")); - - TImporto import(sezione, im); + TImporto import(r.get_char("SEZIONE"), r.get_real("IMPORTO")); import.add_to(riga); // Dare/Avere 101-102 TBill conto; conto.get(r); riga.add(conto.string(0x3)); // Conto 103-107 - _saldi.aggiorna(conto, im, sezione, FALSE); + + _saldi.aggiorna(conto, import, FALSE); riga.add(""); // Codice descrizione 108 riga.add(r.get("DESCR")); // Descrizione riga 109 - conto.set(r.get_int("GRUPPOC"), r.get_int("CONTOC"), - r.get_long("SOTTOCONTC"), r.get_char("TIPOCC")); + conto.get(r, TRUE); riga.add(conto.string(0x3)); // Contropartita 110-114 riga.add(r.get("NUMGIO")); const char tipo = r.get_char("ROWTYPE"); riga.add(tipo); // Tipo di riga 115 - if (iva() == nessuna_iva && tipo > ' ') - error_box("Riga %d con tipo incompatibile con un movimento puramente contabile", i+1); - - cgs().row(i) = riga; disable_cgs_cells(i, tipo); } @@ -663,7 +651,7 @@ int TPrimanota_application::read(TMask& m) for (i = 0; i < _rel->iva_items(); i++) { TRectype& r = _rel->iva(i); - riga.cut(0); + TToken_string& riga = ivas().row(i); real imponibile(r.get("IMPONIBILE")); if (to_swap) imponibile = -imponibile; @@ -684,8 +672,6 @@ int TPrimanota_application::read(TMask& m) TBill c; c.get(r); c.add_to(riga, 4, 0x7); // Conto 105-110 - - ivas().row(i) = riga; } TString16 dt(m.get(F_DATAREG)); @@ -709,10 +695,10 @@ void TPrimanota_application::mask2rel(const TMask& m) _saldi.set_movprovv(m.get_bool(F_PROVVISORIO)); _saldi.set_movap(causale().apertura()); _saldi.set_anno_es(annoes); - _saldi.set_num_ulmov(m.get_long(F_NUMREG)); + _saldi.set_num_ulmov(numreg); _saldi.set_data_ulmov((TDate)m.get(F_DATAREG)); - _rel->destroy_rows(); // Destroy all records + _rel->destroy_rows(numreg); // Destroy all records cgs_pack(); // Destroy all null rows TArray& rows = cgs().rows_array(); @@ -726,7 +712,7 @@ void TPrimanota_application::mask2rel(const TMask& m) TImporto n; n = row; const TBill conto(row, 2, 0x3); - _saldi.aggiorna(conto, n.valore(), n.sezione(), TRUE); + _saldi.aggiorna(conto, n, TRUE); TRectype &r = _rel->cg(i); r.zero(); @@ -875,6 +861,11 @@ int TPrimanota_application::write(const TMask& m) genera_incasso(causimm); } } + else + { + if (_is_saldaconto) + _partite.write(); + } } return err; } @@ -889,8 +880,14 @@ int TPrimanota_application::rewrite(const TMask& m) _saldi.registra(); check_saldi(); } - if (_is_saldaconto && iva() != nessuna_iva) - write_scadenze(m); + + if (_is_saldaconto) + { + if (iva() != nessuna_iva) + write_scadenze(m); + else + _partite.rewrite(); + } return err; } @@ -902,8 +899,12 @@ bool TPrimanota_application::remove() { _saldi.registra(); check_saldi(); + + if (_is_saldaconto && iva() == nessuna_iva) + { + // TBI _partite.remove(); + } } - // TBI eliminazione partita return ok; } @@ -1060,9 +1061,8 @@ void TPrimanota_application::genera_incasso(const char* causimm) { const TRectype& rec = inc.cg(r); TBill c; c.get(rec); - const real im(rec.get("IMPORTO")); - const char sezione = rec.get_char("SEZIONE"); - _saldi.aggiorna(c, im, sezione, TRUE); + const TImporto im(rec.get_char("SEZIONE"), rec.get_real("IMPORTO")); + _saldi.aggiorna(c, im, TRUE); } _saldi.registra(); check_saldi(); diff --git a/cg/cg2100b.uml b/cg/cg2100b.uml index 26344d9ef..fc570e367 100755 --- a/cg/cg2100b.uml +++ b/cg/cg2100b.uml @@ -112,7 +112,7 @@ STRING F_TIPODOC 2 BEGIN PROMPT 60 6 "Tipo documento " FIELD TIPODOC - FLAGS "D" + FLAGS "DG" MESSAGE COPY,K_TIPODOC END @@ -341,7 +341,6 @@ END STRING K_TIPODOC 2 BEGIN PROMPT 60 6 "Tipo documento " - FIELD TIPODOC FLAGS "D" END diff --git a/cg/cg2100s.uml b/cg/cg2100s.uml index 421ed4f94..889a2ce82 100755 --- a/cg/cg2100s.uml +++ b/cg/cg2100s.uml @@ -4,12 +4,18 @@ TOOLBAR "" 0 20 0 2 BUTTON DLG_OK 10 2 BEGIN - PROMPT -12 -1 "" + PROMPT -13 -1 "" +END + +BUTTON DLG_DELREC 10 2 +BEGIN + PROMPT -23 -1 "~Elimina" + MESSAGE EXIT,K_DEL END BUTTON DLG_CANCEL 10 2 BEGIN - PROMPT -22 -1 "" + PROMPT -33 -1 "" END ENDPAGE @@ -132,9 +138,11 @@ BEGIN FIELD RITENUTE END -BOOLEAN S_SALDOACC +LIST S_SALDOACC 1 12 BEGIN PROMPT 2 9 "Saldo " + ITEM "A|Acconto" + ITEM "S|Saldo" FIELD SALACC END @@ -199,14 +207,14 @@ BEGIN ITEM " |Conto" ITEM "C|Cliente" ITEM "F|Fornitore" - FIELD TIPOCF + FIELD TIPOC FLAGS "H" END NUMBER S_GRUPPO 3 BEGIN PROMPT 24 12 "Gruppo " - FIELD GRUPPO + FIELD GRUPPOC CHECKTYPE REQUIRED FLAGS "R" END @@ -214,7 +222,7 @@ END NUMBER S_CONTO 3 BEGIN PROMPT 42 12 "Conto " - FIELD CONTO + FIELD CONTOC CHECKTYPE REQUIRED FLAGS "R" END @@ -222,7 +230,7 @@ END NUMBER S_SOTTOCONTO 6 BEGIN PROMPT 57 12 "Sottoconto " - FIELD SOTTOCONTO + FIELD SOTTOCONTC USE LF_PCON INPUT GRUPPO S_GRUPPO INPUT CONTO S_CONTO diff --git a/cg/cg2101.cpp b/cg/cg2101.cpp index 51741ca52..d1509be8e 100755 --- a/cg/cg2101.cpp +++ b/cg/cg2101.cpp @@ -1,7 +1,7 @@ #include -#include #include +#include #include #include "cg2101.h" @@ -36,64 +36,46 @@ int date2esc(const TDate& d, int* prevesc) /////////////////////////////////////////////////////////// TMovimentoPN::TMovimentoPN() -: TRelation(LF_MOV), _oldcg(0), _oldiva(0) +: TRelation(LF_MOV), _cg(LF_RMOV, "NUMRIG"), _iva(LF_RMOVIVA, "NUMRIG") { add(LF_RMOV, "NUMREG=NUMREG"); add(LF_RMOVIVA, "NUMREG=NUMREG"); } -void TMovimentoPN::destroy_rows() -{ - _cg.destroy(); - _iva.destroy(); +void TMovimentoPN::destroy_rows(long num) +{ + _cg.destroy_rows(); + _cg.renum_key("NUMREG", num); + _iva.destroy_rows(); + _iva.renum_key("NUMREG", num); } TRectype& TMovimentoPN::cg(int i) { - TRectype* r = (TRectype*)_cg.objptr(i); - if (r == NULL) - { - r = new TRectype(LF_RMOV); - _cg.add(r, i); - } - return *r; + return _cg.row(i >= 0 ? i+1 : -1, TRUE); } TRectype& TMovimentoPN::iva(int i) { - TRectype* r = (TRectype*)_iva.objptr(i); - if (r == NULL) - { - r = new TRectype(LF_RMOVIVA); - _iva.add(r, i); - } - return *r; + return _iva.row(i >= 0 ? i+1 : -1, TRUE); } - int TMovimentoPN::read_mov_rows() -{ - const TLocalisamfile& rm = lfile(LF_RMOV); - const TLocalisamfile& ri = lfile(LF_RMOVIVA); - position_rels(); +{ + const long numreg = lfile().get_long(MOV_NUMREG); + + TRectype cgfilter(LF_RMOV); + cgfilter.zero(); + cgfilter.put(RMV_NUMREG, numreg); + _cg.read(cgfilter); + + TRectype ivafilter(LF_RMOVIVA); + ivafilter.zero(); + ivafilter.put(RMI_NUMREG, numreg); + _iva.read(ivafilter); - destroy_rows(); - for(bool ok = is_first_match(LF_RMOV); ok; ok = next_match(LF_RMOV)) - { - const int row = rm.get_int(RMV_NUMRIG) - 1; - cg(row) = rm.curr(); - } - _oldcg = cg_items(); - - for(ok = is_first_match(LF_RMOVIVA); ok; ok = next_match(LF_RMOVIVA)) - { - const int row = ri.get_int(RMI_NUMRIG) - 1; - iva(row) = ri.curr(); - } - _oldiva = iva_items(); - - return NOERR; + return _cg.rows(); } @@ -103,49 +85,18 @@ int TMovimentoPN::read(TIsamop op, TReclock lockop, TDate& atdate) if (err == NOERR) { _olddate = file().get("DATAREG"); - err = read_mov_rows(); + read_mov_rows(); } return err; } - -int TMovimentoPN::write_rec(bool re, const TRectype& rec, TLocalisamfile& f) -{ - const bool scrivi = re ? (f.rewrite(rec) != NOERR) : TRUE; - if (scrivi) - f.write(rec); - -#ifdef TRC - const long numreg = rec.get_long("NUMREG"); - const int numrig = f.num() == LF_MOV ? 0 : rec.get_int("NUMRIG"); - TRACE("write file=%d record=%ld nummov=%ld numrig=%d status=%d", - f.num(), f.recno(), numreg, numrig, f.status()); -#endif - - return f.status(); -} - - -int TMovimentoPN::cancella(TLocalisamfile& f, int da, int a) -{ - const long numreg = lfile().get_long(MOV_NUMREG); - for (int i = da; i <= a; i++) - { - f.put(MOV_NUMREG, numreg); - f.put(RMV_NUMRIG, i); - if (f.read(_isequal, _lock) == NOERR) - f.remove(); - } - return f.status(); -} - char TMovimentoPN::frequenza_versamenti(int year) const { static int last_year = 0; static long last_firm = 0; static char last_freq = ' '; - const long firm = main_app().get_firm(); + const long firm = prefix().get_codditta(); if (firm != last_firm || year != last_year) { @@ -161,8 +112,10 @@ char TMovimentoPN::frequenza_versamenti(int year) const } else last_freq = lia.get_char("S7"); - last_firm = firm; CHECK(last_freq == 'M' || last_freq == 'T', "Frequenza versamenti IVA assurda"); + + last_firm = firm; + last_year = year; } return last_freq; @@ -207,38 +160,27 @@ bool TMovimentoPN::controlla_liquidazione(const TDate& data, bool reset) const int TMovimentoPN::registra(bool re, bool force) { - TLocalisamfile& m = lfile(); + int err = re ? TRelation::rewrite(force) : TRelation::write(force); + if (err != NOERR) + return err; - const int err = write_rec(re, m.curr(), m); - if (err != NOERR) return err; - - TLocalisamfile& rm = lfile(LF_RMOV); - TLocalisamfile& ri = lfile(LF_RMOVIVA); - + const TRectype& m = lfile().curr(); const long numreg = m.get_long("NUMREG"); - - for (int i = 0 ; i < cg_items(); i++) - { - if (!re) cg(i).put("NUMREG", numreg); - const int err = write_rec(re, cg(i), rm); - if (!force && err != NOERR) return err; - } - if (i < _oldcg) - cancella(rm, i+1, _oldcg); - _oldcg = cg_items(); - + + if (!re) + _cg.renum_key("NUMREG", numreg); + err = _cg.write(re); + if (err != NOERR) + return err; const int annoiva = m.get_int("ANNOIVA"); - const TString16 reg(m.get("REG")); + const TString16 reg(m.get_str("REG")); TRegistro registro(reg, annoiva); const bool att_mista = reg.empty() ? FALSE : registro.attivita_mista(); - for (i = 0 ; i < iva_items(); i++) + for (int i = 0 ; i < iva_items(); i++) { TRectype& r = iva(i); - - if (!re) r.put("NUMREG", numreg); // Force correct number - int tipoatt = 1; if (att_mista) { @@ -250,22 +192,23 @@ int TMovimentoPN::registra(bool re, bool force) } } r.put("TIPOATT", tipoatt); - - const int err = write_rec(re, r, ri); - if (!force && err != NOERR) return err; } - - if (i < _oldiva) - cancella(ri, i+1, _oldiva); - _oldiva = iva_items(); + if (!re) + _iva.renum_key("NUMREG", numreg); + err = _iva.write(re); + if (err != NOERR) + return err; + + // Aggiorna data registrazione e protocollo IVA sul registro const TDate datareg(m.get("DATAREG")); if (reg.not_empty()) { const long protiva = m.get_long("PROTIVA"); const long uprotiva = m.get_long("UPROTIVA"); - registro.update(max(protiva, uprotiva), datareg); + const long max = protiva > uprotiva ? protiva : uprotiva; + registro.update(max, datareg); } // Aggiorna flags di ricalcolo liquidazione @@ -301,12 +244,7 @@ int TMovimentoPN::registra(bool re, bool force) int TMovimentoPN::write(bool force, TDate&) { - const TRectype& r = lfile().curr(); - - _oldcg = _oldiva = 0; - int err = registra(FALSE, force); - - return err; + return registra(FALSE, force); } @@ -318,14 +256,14 @@ int TMovimentoPN::rewrite(bool force, TDate&) int TMovimentoPN::remove(TDate&) { - TLocalisamfile& m = lfile(); - TLocalisamfile& rm = lfile(LF_RMOV); - TLocalisamfile& ri = lfile(LF_RMOVIVA); + int err = TRelation::remove(); + + if (err == NOERR) + err = _cg.remove(); - cancella(rm, 1, _oldcg); - cancella(ri, 1, _oldiva); - m.remove(); - _oldcg = _oldiva = 0; - return m.status(); + if (err == NOERR) + err = _iva.remove(); + + return err; } diff --git a/cg/cg2101.h b/cg/cg2101.h index daeacf7f3..2bc6657b9 100755 --- a/cg/cg2101.h +++ b/cg/cg2101.h @@ -13,15 +13,13 @@ class TMovimentoPN : public TRelation // @END // @DPRIV - TArray _cg, _iva; - int _oldcg, _oldiva; + TRecord_array _cg, _iva; TDate _olddate; // @END protected: // @FPROT - int write_rec(bool re, const TRectype&r, TLocalisamfile& f); - int cancella(TLocalisamfile& f, int da, int a); + int registra(bool re, bool force); int read_mov_rows(); // @END @@ -40,9 +38,9 @@ public: TRectype& cg(int i); TRectype& iva(int i); - int cg_items() const { return _cg.items(); } - int iva_items() const { return _iva.items(); } - void destroy_rows(); + int cg_items() const { return _cg.rows(); } + int iva_items() const { return _iva.rows(); } + void destroy_rows(long numreg); int date2liq(const TDate& data) const; // Estrae dalla data il mese di liquidazione char frequenza_versamenti(int year) const; // Ritorna 'M'ensile o 'T'rimestrale diff --git a/cg/cg2102.cpp b/cg/cg2102.cpp index 655127b1f..c1001d4e4 100755 --- a/cg/cg2102.cpp +++ b/cg/cg2102.cpp @@ -1,7 +1,7 @@ #include #include +#include #include -#include #include "cg2100.h" #include "cg2102.h" @@ -473,15 +473,15 @@ real TPrimanota_application::calcola_saldo() const real sbilancio = abs(tdare)-abs(tavere); switch (sbilancio.sign()) { - case 1: + case +1: // Il dare supera l'avere in valore assoluto curr_mask().set(F_DARE, (tdare-tavere).string()); curr_mask().reset(F_AVERE); break; - case -1: + case -1: // L'avere supera il dare in valore assoluto curr_mask().reset(F_DARE); curr_mask().set(F_AVERE, (tavere-tdare).string()); break; - default: + default: // Sbilancio nullo curr_mask().reset(F_DARE); curr_mask().reset(F_AVERE); break; @@ -495,60 +495,58 @@ real TPrimanota_application::calcola_saldo() const // Certified 90% bool TPrimanota_application::cg_handler(TMask_field& f, KEY k) { - if ((k == K_TAB && !f.mask().is_running()) || k == K_ENTER) + if (k == K_ENTER) { const real saldo = app().calcola_saldo(); - if (k == K_ENTER) + if (saldo != ZERO) { - if (saldo != ZERO) - { - const char* ss = saldo.string("."); - return f.error_box("Il movimento e' sbilanciato di %s lire.", ss); - } + const char* ss = saldo.string("."); + return f.error_box("Il movimento e' sbilanciato di %s lire.", ss); + } - TSheet_field& cg = app().cgs(); - bool empty = TRUE; - const int max = cg.items(); - for (int i = 0; i < max; i++) + TSheet_field& cg = app().cgs(); + bool empty = TRUE; + const int max = cg.items(); + for (int i = 0; i < max; i++) + { + TToken_string& r = cg.row(i); + if (!can_remove(r)) { - const TImporto im(app().get_cgs_imp(i)); - if (!im.valore().is_zero()) - { - const TBill c(cg.row(i), 3, 0x0); - if (!c.ok()) - return f.error_box("Il conto della riga %d non e' completo", i+1); - const TBill co(cg.row(i), 10, 0x0); - if (!co.empty() && !co.ok()) - return f.error_box("La contropartita della riga %d non e' completa", i+1); - empty = FALSE; - } + const TBill c(r, 3, 0x0); + if (!c.ok()) + return f.error_box("Il conto della riga %d non e' completo", i+1); + const TBill co(r, 10, 0x0); + if (!co.empty() && !co.ok()) + return f.error_box("La contropartita della riga %d non e' completa", i+1); + empty = FALSE; } - - if (empty) - return error_box("Il movimento non ha nessuna riga contabile con un importo"); - } + } + + if (empty) + return error_box("Il movimento non ha nessuna riga contabile con un importo"); } return TRUE; } void TPrimanota_application::generazione_righe_cg(int r) -{ +{ + begin_wait(); + TSheet_field& cg = cgs(); TToken_string& row = cg.row(r); + + if (can_remove(row)) // Ignora righe senza importo + return; TImporto importo; importo = row; - - if (importo.is_zero()) - return; // Ignora righe senza importo - const bool causale_ok = causale().codice()[0] > ' '; if (r == 0 && cg.row(1).empty_items()) { TBill contro(row, 9, 0x3); // Contropartita della prima riga - if (!contro.ok() && causale_ok) + if (causale_ok && !contro.ok()) { causale().bill(2, contro); // Prendi contropartita dalla causale if (contro.ok()) @@ -572,12 +570,12 @@ void TPrimanota_application::generazione_righe_cg(int r) int first_not_empty = 0; for (int i = 0; i < r; i++) { - TToken_string& r = cg.row(i); - if (r.get(0)[0] > ' ' || r.get()[0] > ' ') + TToken_string& row = cg.row(i); + if (!can_remove(row)) { first_not_empty = i; break; - } + } } TBill conto(row, 2, 0x3); @@ -639,33 +637,34 @@ void TPrimanota_application::generazione_righe_cg(int r) } } } + + end_wait(); } bool TPrimanota_application::cg_notify(int r, KEY k) -{ - TSheet_field& cg = app().cgs(); - const char tipo = cg.row(r).right(1)[0]; - +{ switch(k) { case K_SPACE: + { + TSheet_field& cg = app().cgs(); + const char tipo = row_type(cg.row(r)); cg.sheet_mask().enable(DLG_DELREC, tipo <= ' '); - break; - case K_ENTER: - if (app().iva() == nessuna_iva) - app().generazione_righe_cg(r); - app().calcola_saldo(); - break; - case K_DEL: - if (tipo > ' ') - return error_box("La riga %d non puo' essere cancellata", r+1); - // if (app().is_saldaconto() && app().iva() == nessuna_iva) - // app().notify_cgline_deletion(r+1); - break; - default: - break; } + break; + case K_ENTER: + if (app().iva() == nessuna_iva) + app().generazione_righe_cg(r); + app().calcola_saldo(); + break; + case K_DEL: + if (app().is_saldaconto() && app().iva() == nessuna_iva) + app().notify_cgline_deletion(r+1); + break; +default: + break; +} return TRUE; } @@ -697,7 +696,7 @@ bool TPrimanota_application::descr_handler(TMask_field& f, KEY k) // Scrivendo qualcosa in dare (101) cancella l'importo in avere (102) e viceversa bool TPrimanota_application::dareavere_handler(TMask_field& f, KEY k) { - if (k == K_TAB && f.focusdirty() && !f.get().empty()) + if (k == K_TAB && f.focusdirty() && f.get().not_empty()) { const int id = 203-f.dlg(); // Calcola id del campo da resettare f.mask().reset(id); diff --git a/cg/cg2102.h b/cg/cg2102.h index 462f8f728..c0ea3bac6 100755 --- a/cg/cg2102.h +++ b/cg/cg2102.h @@ -215,9 +215,11 @@ protected: int nuovo_pagamento(TPartita& partita, int rata, int rmov, TRectype& part); bool edit_pagamento(TPartita& partita, TRectype& part); - static TPrimanota_application& app() { return (TPrimanota_application&)main_app(); } - + bool notify_cgline_deletion(TPartita& partita, long nreg, int numrig); + bool notify_cgline_deletion(int numrig); + public: + static TPrimanota_application& app() { return (TPrimanota_application&)main_app(); } TPrimanota_application(); }; diff --git a/cg/cg2104.cpp b/cg/cg2104.cpp index 097b8f48c..0a601331b 100755 --- a/cg/cg2104.cpp +++ b/cg/cg2104.cpp @@ -370,9 +370,9 @@ void TPrimanota_application::write_scadenze(const TMask& m) int nriga = 1; int numrig = 1; - partita.put("ANNO", anno); - partita.put("NUMPART", numpart); - partita.put("NRIGA", nriga); + partita.put(PART_ANNO, anno); + partita.put(PART_NUMPART, numpart); + partita.put(PART_NRIGA, nriga); bool fromscratch = FALSE, new_part = TRUE; @@ -381,7 +381,7 @@ void TPrimanota_application::write_scadenze(const TMask& m) if (partita.read() == NOERR) { // se si e' specificato un codice pagamento diverso si rifa' da capo - if (pag.code() != partita.get("CODPAG")) + if (pag.code() != partita.get(PART_CODPAG)) fromscratch = TRUE; new_part = FALSE; } @@ -390,13 +390,13 @@ void TPrimanota_application::write_scadenze(const TMask& m) if (new_part) { partita.zero(); - partita.put("TIPOCF", tipocf); - partita.put("GRUPPO", gruppo); - partita.put("CONTO", conto); - partita.put("SOTTOCONTO", sottoconto); - partita.put("ANNO", anno); - partita.put("NUMPART", numpart); - partita.put("NRIGA", nriga); + partita.put(PART_TIPOCF, tipocf); + partita.put(PART_GRUPPO, gruppo); + partita.put(PART_CONTO, conto); + partita.put(PART_SOTTOCONTO, sottoconto); + partita.put(PART_ANNO, anno); + partita.put(PART_NUMPART, numpart); + partita.put(PART_NRIGA, nriga); } // put data on partita @@ -435,13 +435,13 @@ void TPrimanota_application::write_scadenze(const TMask& m) { new_scad = TRUE; scadenza.zero(); - scadenza.put("TIPOCF", tipocf); - scadenza.put("GRUPPO", gruppo); - scadenza.put("CONTO", conto); - scadenza.put("SOTTOCONTO", sottoconto); - scadenza.put("ANNO", anno); - scadenza.put("NUMPART", numpart); - scadenza.put("NRATA", i+1); + scadenza.put(SCAD_TIPOCF, tipocf); + scadenza.put(SCAD_GRUPPO, gruppo); + scadenza.put(SCAD_CONTO, conto); + scadenza.put(SCAD_SOTTOCONTO, sottoconto); + scadenza.put(SCAD_ANNO, anno); + scadenza.put(SCAD_NUMPART, numpart); + scadenza.put(SCAD_NRATA, i+1); } // set everything scadenza.put("CODPAG", pag.code()); @@ -459,9 +459,9 @@ void TPrimanota_application::write_scadenze(const TMask& m) for (; !new_scad ; i++) { scadenza.zero(); - scadenza.put("ANNO", anno); - scadenza.put("NUMPART", numpart); - scadenza.put("NRATA", i+1); + scadenza.put(SCAD_ANNO, anno); + scadenza.put(SCAD_NUMPART, numpart); + scadenza.put(SCAD_NRATA, i+1); if (scadenza.read() == NOERR) scadenza.remove(); @@ -474,22 +474,16 @@ void TPrimanota_application::write_scadenze(const TMask& m) // Sheet partite /////////////////////////////////////////////////////////// -HIDDEN int _riga; -HIDDEN TImporto _soldi, _max; - bool TPrimanota_application::edit_partite(int riga) { - begin_wait(); - - const long curreg = curr_mask().get_long(F_NUMREG); // Numero registrazione - TToken_string& cgr = cgs().row(riga); const TBill b(cgr, 2, 0x3); // Legge il conto della riga selezionata - - _riga = riga; // Riga correntemente in gestione - _soldi = cgr; // Importo della riga selezionata - TString80 caption("Partite aperte del conto "); + if (!b.ok()) return FALSE; + + begin_wait(); + + TString caption("Partite aperte del conto "); caption << b.gruppo() << ' ' << b.conto() << ' ' << b.sottoconto(); TArray_sheet a(-1, -1, 0, 0, caption, "Anno|Numero@7|Descrizione@50|Importo@15R|Sezione", 0x8); @@ -498,7 +492,7 @@ bool TPrimanota_application::edit_partite(int riga) partita.setkey(2); // Chiave per conto partita.zero(); - if (b.tipo() != ' ') // Ignora gruppo e conto dei clifo + if (b.tipo() > ' ') // Ignora gruppo e conto dei clifo { partita.put(PART_TIPOCF, b.tipo()); partita.put(PART_SOTTOCONTO, b.sottoconto()); @@ -513,6 +507,8 @@ bool TPrimanota_application::edit_partite(int riga) TString desc; // Descrizione prima partita del gruppo TImporto saldo; // Saldo ultima parita TToken_string r(80); + + const long curreg = curr_mask().get_long(F_NUMREG); // Numero registrazione for (int err = partita.read(_isgteq); err == NOERR && partita.curr() == recpar; err = partita.next()) { @@ -524,13 +520,6 @@ bool TPrimanota_application::edit_partite(int riga) { const TImporto i(partita.get_char(PART_SEZ), partita.get_real(PART_IMPORTO)); saldo += i; // ... incrementa totale - - if (nreg == curreg) - { - const int numrig = partita.get_int(PART_NUMRIG); - if (numrig == (riga+1)) - _soldi -= i; - } } else { @@ -558,7 +547,7 @@ bool TPrimanota_application::edit_partite(int riga) end_wait(); - KEY k = a.items() > 0 ? K_ENTER : K_ESC; // Esce se non ci sono righe + KEY k = a.items() > 0 ? K_ENTER : K_ESC; // Esce se non ci sono righe while (k == K_ENTER) { k = a.run(); @@ -566,7 +555,7 @@ bool TPrimanota_application::edit_partite(int riga) { const int anno = a.row().get_int(0); const TString16 num = a.row().get(1); - edit_scadenze(anno, num); // Edita pagamenti + edit_scadenze(anno, num); // Edita pagamenti } } @@ -582,7 +571,7 @@ int TPrimanota_application::nuovo_pagamento(TPartita& partita, int rata, int rmo const int nriga = partita.righe(); CHECKD(nriga > 0, "Riga partita errata ", nriga); - part = partita.riga(nriga); + part = partita.riga(1); // PART_ANNO viene preso dalla partita base // PART_NUMPART viene preso dalla partita base @@ -591,8 +580,8 @@ int TPrimanota_application::nuovo_pagamento(TPartita& partita, int rata, int rmo part.put(PART_TIPOMOV, causale().tipomov()); // Dati causale corrente part.put(PART_CODCAUS, causale().codice()); - part.put(PART_NREG, curr_mask().get(F_NUMREG)); // Numero operazione - part.put(PART_NUMRIG, rmov+1); // Riga su cui ho cliccato + part.put(PART_NREG, curr_mask().get(F_NUMREG)); // Numero operazione + part.put(PART_NUMRIG, rmov); // Riga su cui ho cliccato // Copia dati movimento corrente part.put(PART_DATAREG, curr_mask().get(F_DATAREG)); @@ -643,19 +632,24 @@ int TPrimanota_application::nuovo_pagamento(TPartita& partita, int rata, int rmo caus = 2; break; } + // PART_TIPOC viene preso dalla partita base + // PART_GRUPPO viene preso dalla partita base + // PART_CONTO viene preso dalla partita base + // PART_SOTTOCONTO viene preso dalla partita base + TBill bill; causale().bill(caus, bill); if (bill.empty()) causale().bill(caus = 1, bill); - bill.put(part); + bill.put(part, TRUE); - TBill b; b.get(partita.riga(1)); - if (b.tipo() > ' ') // Se cliente o fornitore cerca sua banca + bill.get(partita.riga(1)); + if (bill.tipo() > ' ') // Se cliente o fornitore cerca sua banca { TRelation cliforel(LF_CLIFO); cliforel.add(LF_CFVEN, "TIPOCF=TIPOCF|CODCF=CODCF"); TRectype& clifo = cliforel.lfile().curr(); - clifo.put(CLI_TIPOCF, b.tipo()); - clifo.put(CLI_CODCF, b.codclifo()); + clifo.put(CLI_TIPOCF, bill.tipo()); + clifo.put(CLI_CODCF, bill.codclifo()); const int err = cliforel.read(); CHECK(err == NOERR, "Chiss'e' fregato il clifo"); @@ -699,17 +693,11 @@ bool TPrimanota_application::edit_scadenze(int anno, const char* num) { TString caption; caption.format("Pagamenti della partita %s dell'anno %d", num, anno); TArray_sheet a(-1, -1, 0, 0, caption, "Rata|Data@10|Importo@15|Descrizione@50|Riga", 0x8); - - TPartita* game = _partite.partita(anno, num); - if (game == NULL) - { - game = new TPartita(anno, num); - _partite.add(game); - } - TPartita& partita = *game; + TPartita& partita = _partite.partita(anno, num); const long curreg = curr_mask().get_long(F_NUMREG); // Numero registrazione corrente - + const int currig = cgs().selected()+1; // Numero riga corrente + TToken_string r(80); // Work string KEY k = K_ENTER; @@ -749,7 +737,7 @@ bool TPrimanota_application::edit_scadenze(int anno, const char* num) r.add(paga.get(PART_DESCR)); r.add(paga.get(PART_NRIGA)); nr = a.add(r); - if (paga.get_long(PART_NREG) != curreg || paga.get_int(PART_NUMRIG) != _riga+1) + if (paga.get_long(PART_NREG) != curreg || paga.get_int(PART_NUMRIG) != currig) a.disable(nr); } } @@ -765,7 +753,7 @@ bool TPrimanota_application::edit_scadenze(int anno, const char* num) TRectype part(LF_PARTITE); if (nrig == 0) // Se ho cliccato su una scadenza ... - nrig = nuovo_pagamento(partita, rata, _riga, part); + nrig = nuovo_pagamento(partita, rata, currig, part); else part = partita.riga(nrig); @@ -777,41 +765,29 @@ bool TPrimanota_application::edit_scadenze(int anno, const char* num) } - static bool importopag_handler(TMask_field& f, KEY k) { + if (k == K_F8) + { + TMask& m = f.mask(); + f.set(m.get(S_IMPORTO)); + k = K_TAB; + } + if (f.to_check(k)) { TMask& m = f.mask(); - const real r(m.get(S_RESIDUO)); real i(f.get()); - - if (i > r) + const real tot(m.get(S_IMPORTO)); + if (i > tot) { - warning_box("Non e' possibile inserire un importo superiore al residuo"); - i = r; + warning_box("Non e' possibile inserire un importo superiore a ", tot.string(".")); + i = tot; f.set(i.string()); } - if (i > _max.valore()) - { - const TFixed_string val(_max.valore().string(".")); - warning_box("La riga contabile ha un residuo di %s", (const char*)val); - f.set(val); - } - if (i == r) - { - m.set(S_SALDOACC, "X"); - m.disable(S_SALDOACC); - } - else - m.enable(S_SALDOACC); + if (i == tot) + m.set(S_SALDOACC, "S"); } - else - if (k == K_F8) - { - const TString& val = f.mask().get(S_RESIDUO); - f.set(val); - } return TRUE; } @@ -847,49 +823,122 @@ bool TPrimanota_application::edit_pagamento(TPartita& p, TRectype& part) m.set(S_IMPORTOVAL, scaden.get(SCAD_IMPORTOVAL)); // " in valuta m.set(S_RATA, scaden.get(SCAD_NRATA)); + const char sez = part.get_char(PART_SEZ); // Sezione importo e rituenute + const char controsez = sez == 'D' ? 'A' : 'D'; // Sezione opposta + // Memorizza importi prima di eventuali variazioni - const real importo(part.get(PART_IMPORTO)); - const real ritenute(part.get(PART_RITENUTE)); + const real old_importo(part.get(PART_IMPORTO)); + const real old_ritenute(part.get(PART_RITENUTE)); + + const TBill old_conto(m.get_int(S_GRUPPO), m.get_int(S_CONTO), m.get_long(S_SOTTOCONTO)); + const int old_riga = old_conto.ok() ? bill2pos(old_conto, 'I') : -1; - _max.set(_soldi.sezione(), _soldi.valore() + importo); // Importo massimo del campo S_IMPORTOPAG - const KEY key = m.run(); - if (key == K_ENTER) + if (key == K_ENTER || key == K_DEL) { + if (key == K_DEL) + { + m.reset(S_IMPORTOPAG); + m.reset(S_RITENUTE); + } + m.autosave(&rel); part = partita.curr(); - const char sez = _soldi.sezione() == 'D' ? 'A' : 'D'; + if (old_riga >= 0) + sub_cgs_imp(old_riga, old_importo); - const real imp(m.get(S_IMPORTOPAG)); - const TImporto impg(sez, imp-importo); - - if (!impg.is_zero()) + // Importo della contropartita + const TImporto new_importo(controsez, part.get_real(PART_IMPORTO)); + if (!new_importo.is_zero()) { - _soldi += impg; // Sottrai soldi spesi qui - TBill conto(m.get_int(S_GRUPPO), m.get_int(S_CONTO), m.get_long(S_SOTTOCONTO)); + TBill conto; conto.get(part); const int riga = bill2pos(conto, 'I'); if (riga < 0) - set_cgs_row(riga, impg, conto, m.get(S_DESCAGG), 'I'); + set_cgs_row(riga, new_importo, conto, part.get(PART_DESCR), 'I'); else - add_cgs_imp(riga, impg); + add_cgs_imp(riga, new_importo); } - const real rit(m.get(S_RITENUTE)); - const TImporto ritg(sez, rit-ritenute); + const real rit(part.get(PART_RITENUTE)); + const TImporto grow_ritenute(controsez, rit-old_ritenute); // Variazione ritenute fiscali - if (!ritg.is_zero()) + if (!grow_ritenute.is_zero()) { const riga = type2pos('F'); if (riga < 0) { TBill conto_rit; causale().bill(11, conto_rit); - set_cgs_row(riga, ritg, conto_rit, "", 'F'); + set_cgs_row(riga, grow_ritenute, conto_rit, "", 'F'); } - else add_cgs_imp(riga, ritg); + else add_cgs_imp(riga, grow_ritenute); } - p.add_riga(part); + + if (key == K_ENTER) + p.add_riga(part); + else + p.remove_riga(part); } - return key == K_ENTER; + return key != K_ESC; } + +bool TPrimanota_application::notify_cgline_deletion(TPartita& partita, long nreg, int numrig) +{ + bool found = FALSE; + const int riga_ritenute = type2pos('F'); + + for (int r = partita.righe(); r > 0; r--) + { + TRectype pag(partita.riga(r)); + + const long reg = pag.get_long(PART_NREG); + if (reg == nreg) // Se la registrazione corrisponde + { + const int num = pag.get_int(PART_NUMRIG); + if (num == numrig) // Se la riga corrisponde + { + const real ritenute = pag.get_real(PART_RITENUTE); + if (!ritenute.is_zero()) + { + if (riga_ritenute >= 0) + sub_cgs_imp(riga_ritenute, ritenute); + else + error_box("Non esiste la riga delle ritenute di un pagamento della riga %d", numrig); + } + const real importo = pag.get_real(PART_IMPORTO); + if (!importo.is_zero()) + { + TBill contro; contro.get(pag); + const int riga_contro = bill2pos(contro, 'I'); + if (riga_contro >= 0) + sub_cgs_imp(riga_contro, importo); + else + error_box("Non esiste la riga dell'importo di un pagamento della riga %d", numrig); + } + partita.remove_riga(pag); + found = TRUE; + } + else + if (num > numrig) // Se la riga e' successiva + { + pag.put(PART_NUMRIG, num-1); + partita.add_riga(pag); + } + } + } + + return found; +} + +bool TPrimanota_application::notify_cgline_deletion(int numrig) +{ + bool found = FALSE; + const long nreg = curr_mask().get_long(F_NUMREG); + _partite.add_reg_num(nreg, 0); + + for (TPartita* game = _partite.first(); game; game = _partite.next()) + found |= notify_cgline_deletion(*game, nreg, numrig); + + return found; +} \ No newline at end of file diff --git a/cg/cg21cg.uml b/cg/cg21cg.uml index 2c9dcbef1..19d879558 100755 --- a/cg/cg21cg.uml +++ b/cg/cg21cg.uml @@ -22,7 +22,7 @@ END STRING 109 50 BEGIN - PROMPT 14 2 "" + PROMPT 12 2 "" USE %DPN KEY 2 INPUT S0 109 DISPLAY "Descrizione@50" S0 diff --git a/cg/cg2400.cpp b/cg/cg2400.cpp index 2e1b0a8d4..375b37b1d 100755 --- a/cg/cg2400.cpp +++ b/cg/cg2400.cpp @@ -1,589 +1,585 @@ -// Ricezione dati da sistema - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "cglib04.h" - -//#include "ba7.h" -#include "cg2400.h" - -TString80 TEMP; - - -class TRic_sistema : public TApplication -{ - TTable* _tab_tra; - TTransfer_file* _tras_file; - - int _numtotdisk,_progdisk,_numdisk,_numinv,_numinvp,_nultras; - int _stato_ripartenza,_nultras_tab; - bool _sequenza,_disketto; - bool _prima_volta,_baipassa; - TString _nomeid,_nomeidp,_marker,_trasf,_trasfer,_pathname,_ragsoc_dittar; - long _dittainv,_dittainvp,_dittaric,_totrectras,_totrectrasp; - TDate _datatras,_datatrasp,_dataultras_tab,_dataultras; - TString _sigle_file,_nrec_file; - char _agg_cau,_agg_pcon,_agg_cls,_agg_clifo; - bool _agg_fatatt,_agg_fatpas; - -public: - virtual bool create(); - virtual bool destroy(); - virtual bool menu(MENU_TAG m); - bool main_loop(); - bool leggi_marker(); - void leggi_trasfer(); - void ripristina_trasfer(); - long leggi_tabella_tras(); - void componi_path(TMask&); - bool video_ripartenza(); - void ditta_ricevente(); - bool ripartenza(); - bool set_flag(); - void aggiorna_tabella(); - - const char* converti (TString& data_AS400); - - static bool baipassa(TMask& m,KEY k); - - TRic_sistema() {}; -}; - -HIDDEN TRic_sistema& app() { return (TRic_sistema &) main_app(); } - -bool TRic_sistema::create() -{ - TApplication::create(); - - _tab_tra = new TTable ("%TRA"); - _tras_file = new TTransfer_file(); - - _numdisk = 1; - _prima_volta = TRUE; - _nultras = 0; - _nultras_tab = 0; - _baipassa = FALSE; - - dispatch_e_menu (BAR_ITEM(1)); - - return TRUE; -} - -bool TRic_sistema::destroy() -{ - delete _tab_tra; - delete _tras_file; - - return TApplication::destroy(); -} - -void TRic_sistema::componi_path(TMask& msk) -{ - TString path,drive; - int pos; - - path = msk.get(F_PATHNAME); - drive = msk.get(F_DRIVE); - pos = path.find(':'); - - if (drive == "A:" || drive == "B:" || drive == "D:" || drive == "E:") - _disketto = TRUE; - else - _disketto = FALSE; - - if (pos) - path = path.mid(pos+1); - - if (path != "") - { - _marker << drive << "\\" << path << "\\marker"; - _trasfer << drive << "\\" << path << "\\trasfer"; - if (!_disketto) - _pathname << drive << "\\" << path; - } - else - { - _marker << drive << "\\marker"; - _trasfer << drive << "\\trasfer"; - if (!_disketto) - _pathname << drive << "\\"; - } -} - -const char* TRic_sistema::converti (TString& data_AS400) -{ - TEMP = data_AS400.mid(4,2); - TEMP << "-" << data_AS400.mid(2,2); - TEMP << "-" << data_AS400.mid(0,2); - return TEMP; -} - -bool TRic_sistema::leggi_marker() -{ - TString16 tmp; - - if (!fexist(_marker)) - { - if (_disketto) - return error_box("File marker non presente sul dischetto %d: impossibile proseguire", _numdisk); - else - return error_box("File marker non presente in %s: impossibile proseguire", (const char*)_pathname); - } - - FILE* i; - - const word size = 64; - TString buffer(size); - - if ( (i = fopen(_marker,"r+t")) != NULL) - { - const word letti = fread((char*)(const char*)buffer,sizeof(char),size,i); - - _progdisk = atoi(buffer.sub(31,33)); - _numtotdisk = atoi(buffer.sub(29,31)); - - if (_progdisk != _numdisk) - { - message_box("Il dischetto inserito non rispecchia la giusta sequenza"); - _sequenza = FALSE; - fclose(i); - return TRUE; - } - else - _sequenza = TRUE; - - if (letti == 0) - return error_box("Rilevati ERRORI nel file MARKER: impossibile proseguire"); - - _nomeid = buffer.sub(0,10); - _dittainv = atol(buffer.sub(10,14)); - _totrectras = atol(buffer.sub(23,29)); - _numinv = atoi(buffer.sub(14,17)); - tmp = buffer.sub(17,23); - _datatras = converti(tmp); - - if (_numdisk > 1) //Va fatto solo dal disco 2 in poi - if (_nomeid != _nomeidp || _dittainv != _dittainvp || _totrectras != _totrectrasp - || _numinv != _numinvp || _datatras != _datatrasp) - return error_box("I dati del marker del disco %d, non corrispondono ai dati del marker del disco 1", _numdisk); - - _nomeidp = _nomeid; - _dittainvp = _dittainv; - _totrectrasp = _totrectras; - _numinvp = _numinv; - _datatrasp = _datatras; - - fclose(i); - - if (_numdisk == 1) // Va fatto solo per il primo disco - { - _dittaric = leggi_tabella_tras(); - - if (_dittaric != 0) - { - if (!prefix().exist(_dittaric)) - return error_box("Libreria archivi ditta non presente su disco"); - } - else - return error_box("Codici NON PRESENTI in tabella ricezione: caricarli e riprovare"); - } - - return TRUE; - } - - return FALSE; -} - -bool TRic_sistema::main_loop() -{ - TMask msk ("cg2400b"); - KEY tasto; - - tasto = msk.run(); - - if (tasto == K_ENTER) - { - componi_path(msk); - - do - { - if (_disketto) - { - char drive = msk.get(F_DRIVE)[0]; - if (yesno_box("Inserire il dischetto %d nell' unita' %c", _numdisk,drive)) - { - if (!leggi_marker()) - return FALSE; - - if (_sequenza) - { - if (video_ripartenza()) - ripristina_trasfer(); - else - return FALSE; - - set_flag(); - aggiorna_tabella(); - _tras_file->close(); // Chiude il trasfer letto dalla directory della ditta - - _numdisk++; - } - } - else - return FALSE; - } - else - { - if (!leggi_marker()) - return FALSE; - - if (_sequenza) - { - if (video_ripartenza()) - ripristina_trasfer(); - else - return FALSE; - - _tras_file->close(); // Chiude il trasfer letto da disco - - set_flag(); - aggiorna_tabella(); - _tras_file->close(); // Chiude il trasfer letto dalla directory della ditta - _numdisk++; - } - else - return FALSE; - } - } - while (_numdisk <= _numtotdisk); - } - return FALSE; -} - -void TRic_sistema::leggi_trasfer() -{ - _nultras = 0; - - _trasf = _tras_file->path(_dittaric); - _trasf << "\\trasfer"; - - _tras_file->open(_trasf); - - if (_tras_file->exist()) - { - if (_tras_file->read_control_rec()) - { - _nultras = _tras_file->nultras(); - _dataultras = _tras_file->dataultras(); - //_sigle_file = _tras_file->sigle_file(); - //_nrec_file = _tras_file->nrec_file(); - } - } -} - -bool TRic_sistema::ripartenza() -{ - if (_stato_ripartenza == 1) - return error_box("Rilevato stato di RIPARTENZA CON DATI CONTRADDITORI: procedura interrotta"); - - if (_stato_ripartenza == 2) - return error_box("Trasferimento precedente NON COMPLETATO: completarlo prima di questo"); - - return TRUE; -} - -bool TRic_sistema::video_ripartenza() -{ - TDate dataultras; - - if (_prima_volta) - { - leggi_trasfer(); - - _prima_volta = FALSE; - TMask msk ("cg2400a"); - KEY tasto; - - ditta_ricevente(); - _stato_ripartenza = _tras_file->controllo_ripartenza(); - - msk.set(F_NOMEID, _nomeid); - msk.set(F_CODDITTAINV, _dittainv); - msk.set(F_CODDITTARIC, _dittaric); - msk.set(F_RAGSOC, _ragsoc_dittar); - msk.set(F_NULTRASDSK, _numinv); - TString data1 = _datatras.string(); - msk.set(F_DATAULTRASDSK, data1); - - if (_nultras != 0) - { - msk.set(F_NULTRASTAB, _nultras); - TString data2 = _dataultras.string(); - msk.set(F_DATAULTRASTAB, data2); - } - else - { - msk.set(F_NULTRASTAB, _nultras_tab); - TString data2 = _dataultras_tab.string(); - msk.set(F_DATAULTRASTAB, data2); - } - - if (_stato_ripartenza == 1 || _stato_ripartenza == 2 ) - msk.set(F_STATO, "NON COMPLETA"); - else - if (_stato_ripartenza == 0) - msk.set(F_STATO, "COMPLETA"); - - if (_numdisk == 1) // Va fatto solo per il primo disco - { - do - { - msk.set_handler(baipassa); - - tasto = msk.run(); - - if (tasto != K_ENTER) - return FALSE; - - if (_baipassa) - return TRUE; - - if (!ripartenza()) - return FALSE; - - if (_numinv > (_nultras_tab + 1)) - warning_box("Trasferimento FUORI SEQUENZA: manca un trasferimento intermedio"); - else - if (_numinv < (_nultras_tab +1)) - warning_box("I dischetti risultano GIA' TRASFERITI"); - else - return TRUE; - } - while (tasto == K_ENTER); - } - } - - return TRUE; -} - -bool TRic_sistema::baipassa(TMask& m,KEY k) -{ - if (k == K_SHIFT+K_F7) - app()._baipassa = TRUE; - else - app()._baipassa = FALSE; - - return FALSE; -} - -void TRic_sistema::ripristina_trasfer() -{ - TString ditta,app; - - if (_numdisk == 1) - set_firm(_dittaric); - - // app.format("%05da", _dittaric); - - // ditta << "C:\\prassi\\" << app << "\\trasfer"; - // fcopy(_trasfer,/*ditta*/_trasf,TRUE); - - _tras_file->fcopytemp(_trasfer, _trasf, TRUE); -} - -void TRic_sistema::ditta_ricevente() -{ - TLocalisamfile nditte (LF_NDITTE); - - nditte.setkey(1); - nditte.zero(); - nditte.put(NDT_CODDITTA, _dittaric); - if (nditte.read() == NOERR) - _ragsoc_dittar = nditte.get(NDT_RAGSOC); -} - -long TRic_sistema::leggi_tabella_tras() -{ - TString dep; - long ditta = 0; - - _tab_tra->zero(); - dep = format("%10s%05d", (const char*) _nomeid, _dittainv); - _tab_tra->put("CODTAB", (const char*) dep); - if (_tab_tra->read() == NOERR) - { - ditta = _tab_tra->get_long("I0"); - _nultras_tab = _tab_tra->get_int ("I1"); - _dataultras_tab = _tab_tra->get_date("D0"); - _agg_cau = _tab_tra->get_char("S0"); - _agg_clifo = _tab_tra->get_char("S1"); - _agg_pcon = _tab_tra->get_char("S2"); - _agg_cls = _tab_tra->get_char("S3"); - _agg_fatatt = _tab_tra->get_bool("B0"); - _agg_fatpas = _tab_tra->get_bool("B1"); - } - - return ditta; -} - -bool TRic_sistema::set_flag() -{ - TString sigla; - long nrec; - int j; - int k = 0; - TString flag; - TString record; - TString ana_com,pcon_cau; - TString uselab; - bool fatto = TRUE; - - TConfig conf(CONFIG_DITTA); - - ana_com = conf.get("AnCfCm","cg"); - pcon_cau = conf.get("PcTcCm","cg"); - - _tras_file->open(_trasf); - - if (_tras_file->exist()) - { - if (_tras_file->read_control_rec()) - { - _nultras = _tras_file->nultras(); - _dataultras = _tras_file->dataultras(); - _sigle_file = _tras_file->sigle_file(); - _nrec_file = _tras_file->nrec_file(); - record = _tras_file->record(); - // La fill_index e' richiamata dentro a read_control_rec - // _tras_file->fill_index(_sigle_file,_nrec_file); - } - - for (j = 0; j < _sigle_file.len(); j++) - { - sigla = _sigle_file.mid(j,1); - nrec = atol(_nrec_file.mid(k,6)); - - if (fatto) - { - if (sigla == "W" || sigla == "P") - { - if (nrec > 0 && pcon_cau == "") - { - flag = "T"; - fatto = FALSE; - } - } - else - if (sigla == "A") - { - if (nrec > 0 && ana_com == "") - { - flag = "T"; - fatto = FALSE; - } - } - else - if (sigla == "Z" || sigla == "U" || sigla == "A") - { - if (nrec > 0) - { - flag = "C"; - fatto = FALSE; - } - } - else - { - flag = "*"; - fatto = FALSE; - } - - uselab = sigla; - } - - if (sigla == "W" || sigla == "P") - { - if (pcon_cau == "X") - { - _sigle_file.overwrite(" ",j); - _nrec_file.overwrite("000000",k); - } - } - - if (sigla == "A") - { - if (ana_com == "X") - { - _sigle_file.overwrite(" ",j); - _nrec_file.overwrite("000000",k); - } - } - k += 6; - } - - record.overwrite(_sigle_file,38); - record.overwrite(_nrec_file,47); - - TString agg(7); - - agg[0] = _agg_cls; - agg[1] = _agg_cau; - agg[2] = _agg_clifo; - agg[3] = _agg_pcon; - agg[4] = _agg_fatatt; - agg[5] = _agg_fatpas; - agg[6] = '\0'; - - record.overwrite(agg,234); - record.overwrite(uselab,240); - record.overwrite(" ",241); - - const int size = 256; - - if (!_tras_file->write_control_rec(record, size)) - return FALSE; - } - - conf.set("FlStTra", flag); - - return TRUE; -} - -void TRic_sistema::aggiorna_tabella() -{ - TString dep; - - _tab_tra->zero(); - dep = format("%10s%05d", (const char*) _nomeid, _dittainv); - _tab_tra->put("CODTAB", (const char*) dep); - if (_tab_tra->read() == NOERR) - { - _tab_tra->put("I1", (long)_nultras); - _tab_tra->put("D0", _dataultras); - _tab_tra->rewrite(); - } -} - -bool TRic_sistema::menu(MENU_TAG m) -{ - if (m == BAR_ITEM(1)) - return main_loop(); - return FALSE; -} - -int cg2400 (int argc, char* argv[]) -{ - TRic_sistema a; - a.run(argc, argv,"Ricezione archivi"); - return TRUE; -} +// Ricezione dati da sistema + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "cglib04.h" + +//#include "ba7.h" +#include "cg2400.h" + +class TRic_sistema : public TApplication +{ + TTable* _tab_tra; + TTransfer_file* _tras_file; + + TString80 TEMP; + + int _numtotdisk,_progdisk,_numdisk,_numinv,_numinvp,_nultras; + int _stato_ripartenza,_nultras_tab; + bool _sequenza,_disketto; + bool _prima_volta,_baipassa; + TString _nomeid,_nomeidp,_marker,_trasf,_trasfer,_pathname,_ragsoc_dittar; + long _dittainv,_dittainvp,_dittaric,_totrectras,_totrectrasp; + TDate _datatras,_datatrasp,_dataultras_tab,_dataultras; + TString _sigle_file,_nrec_file; + char _agg_cau,_agg_pcon,_agg_cls,_agg_clifo; + bool _agg_fatatt,_agg_fatpas; + +public: + virtual bool create(); + virtual bool destroy(); + virtual bool menu(MENU_TAG m); + bool main_loop(); + bool leggi_marker(); + void leggi_trasfer(); + void ripristina_trasfer(); + long leggi_tabella_tras(); + void componi_path(TMask&); + bool video_ripartenza(); + void ditta_ricevente(); + bool ripartenza(); + bool set_flag(); + void aggiorna_tabella(); + + const char* converti (const TString& data_AS400); + + static bool baipassa(TMask& m,KEY k); + + TRic_sistema() {}; +}; + +HIDDEN TRic_sistema& app() { return (TRic_sistema &) main_app(); } + +bool TRic_sistema::create() +{ + TApplication::create(); + + _tab_tra = new TTable ("%TRA"); + _tras_file = new TTransfer_file(); + + _numdisk = 1; + _prima_volta = TRUE; + _nultras = 0; + _nultras_tab = 0; + _baipassa = FALSE; + + dispatch_e_menu (BAR_ITEM(1)); + + return TRUE; +} + +bool TRic_sistema::destroy() +{ + delete _tab_tra; + delete _tras_file; + + return TApplication::destroy(); +} + +void TRic_sistema::componi_path(TMask& msk) +{ + TString path,drive; + int pos; + + path = msk.get(F_PATHNAME); + drive = msk.get(F_DRIVE); + pos = path.find(':'); + + if (drive == "A:" || drive == "B:" || drive == "D:" || drive == "E:") + _disketto = TRUE; + else + _disketto = FALSE; + + if (pos) + path = path.mid(pos+1); + + if (path != "") + { + _marker << drive << "\\" << path << "\\marker"; + _trasfer << drive << "\\" << path << "\\trasfer"; + if (!_disketto) + _pathname << drive << "\\" << path; + } + else + { + _marker << drive << "\\marker"; + _trasfer << drive << "\\trasfer"; + if (!_disketto) + _pathname << drive << "\\"; + } +} + +const char* TRic_sistema::converti (const TString& data_AS400) +{ + TEMP = data_AS400.mid(4,2); + TEMP << "-" << data_AS400.mid(2,2); + TEMP << "-" << data_AS400.mid(0,2); + return TEMP; +} + +bool TRic_sistema::leggi_marker() +{ + TString16 tmp; + + if (!fexist(_marker)) + { + if (_disketto) + return error_box("File marker non presente sul dischetto %d: impossibile proseguire", _numdisk); + else + return error_box("File marker non presente in %s: impossibile proseguire", (const char*)_pathname); + } + + FILE* i; + + const word size = 64; + TString buffer(size); + + if ( (i = fopen(_marker,"r+t")) != NULL) + { + const word letti = fread((char*)(const char*)buffer,sizeof(char),size,i); + + _progdisk = atoi(buffer.sub(31,33)); + _numtotdisk = atoi(buffer.sub(29,31)); + + if (_progdisk != _numdisk) + { + message_box("Il dischetto inserito non rispecchia la giusta sequenza"); + _sequenza = FALSE; + fclose(i); + return TRUE; + } + else + _sequenza = TRUE; + + if (letti == 0) + return error_box("Rilevati ERRORI nel file MARKER: impossibile proseguire"); + + _nomeid = buffer.sub(0,10); + _dittainv = atol(buffer.sub(10,14)); + _totrectras = atol(buffer.sub(23,29)); + _numinv = atoi(buffer.sub(14,17)); + tmp = buffer.sub(17,23); + _datatras = converti(tmp); + + if (_numdisk > 1) //Va fatto solo dal disco 2 in poi + if (_nomeid != _nomeidp || _dittainv != _dittainvp || _totrectras != _totrectrasp + || _numinv != _numinvp || _datatras != _datatrasp) + return error_box("I dati del marker del disco %d, non corrispondono ai dati del marker del disco 1", _numdisk); + + _nomeidp = _nomeid; + _dittainvp = _dittainv; + _totrectrasp = _totrectras; + _numinvp = _numinv; + _datatrasp = _datatras; + + fclose(i); + + if (_numdisk == 1) // Va fatto solo per il primo disco + { + _dittaric = leggi_tabella_tras(); + + if (_dittaric != 0) + { + if (!prefix().exist(_dittaric)) + return error_box("Libreria archivi ditta non presente su disco"); + } + else + return error_box("Codici NON PRESENTI in tabella ricezione: caricarli e riprovare"); + } + + return TRUE; + } + + return FALSE; +} + +bool TRic_sistema::main_loop() +{ + TMask msk ("cg2400b"); + KEY tasto; + + tasto = msk.run(); + + if (tasto == K_ENTER) + { + componi_path(msk); + + do + { + if (_disketto) + { + char drive = msk.get(F_DRIVE)[0]; + if (yesno_box("Inserire il dischetto %d nell' unita' %c", _numdisk,drive)) + { + if (!leggi_marker()) + return FALSE; + + if (_sequenza) + { + if (video_ripartenza()) + ripristina_trasfer(); + else + return FALSE; + + set_flag(); + aggiorna_tabella(); + _tras_file->close(); // Chiude il trasfer letto dalla directory della ditta + + _numdisk++; + } + } + else + return FALSE; + } + else + { + if (!leggi_marker()) + return FALSE; + + if (_sequenza) + { + if (video_ripartenza()) + ripristina_trasfer(); + else + return FALSE; + + _tras_file->close(); // Chiude il trasfer letto da disco + + set_flag(); + aggiorna_tabella(); + _tras_file->close(); // Chiude il trasfer letto dalla directory della ditta + _numdisk++; + } + else + return FALSE; + } + } + while (_numdisk <= _numtotdisk); + } + return FALSE; +} + +void TRic_sistema::leggi_trasfer() +{ + _nultras = 0; + + _trasf = _tras_file->path(_dittaric); + _trasf << "\\trasfer"; + + _tras_file->open(_trasf); + + if (_tras_file->exist()) + { + if (_tras_file->read_control_rec()) + { + _nultras = _tras_file->nultras(); + _dataultras = _tras_file->dataultras(); + //_sigle_file = _tras_file->sigle_file(); + //_nrec_file = _tras_file->nrec_file(); + } + } +} + +bool TRic_sistema::ripartenza() +{ + if (_stato_ripartenza == 1) + return error_box("Rilevato stato di RIPARTENZA CON DATI CONTRADDITORI: procedura interrotta"); + + if (_stato_ripartenza == 2) + return error_box("Trasferimento precedente NON COMPLETATO: completarlo prima di questo"); + + return TRUE; +} + +bool TRic_sistema::video_ripartenza() +{ + TDate dataultras; + + if (_prima_volta) + { + leggi_trasfer(); + + _prima_volta = FALSE; + TMask msk ("cg2400a"); + KEY tasto; + + ditta_ricevente(); + _stato_ripartenza = _tras_file->controllo_ripartenza(); + + msk.set(F_NOMEID, _nomeid); + msk.set(F_CODDITTAINV, _dittainv); + msk.set(F_CODDITTARIC, _dittaric); + msk.set(F_RAGSOC, _ragsoc_dittar); + msk.set(F_NULTRASDSK, _numinv); + TString data1 = _datatras.string(); + msk.set(F_DATAULTRASDSK, data1); + + if (_nultras != 0) + { + msk.set(F_NULTRASTAB, _nultras); + TString data2 = _dataultras.string(); + msk.set(F_DATAULTRASTAB, data2); + } + else + { + msk.set(F_NULTRASTAB, _nultras_tab); + TString data2 = _dataultras_tab.string(); + msk.set(F_DATAULTRASTAB, data2); + } + + if (_stato_ripartenza == 1 || _stato_ripartenza == 2 ) + msk.set(F_STATO, "NON COMPLETA"); + else + if (_stato_ripartenza == 0) + msk.set(F_STATO, "COMPLETA"); + + if (_numdisk == 1) // Va fatto solo per il primo disco + { + do + { + msk.set_handler(baipassa); + + tasto = msk.run(); + + if (tasto != K_ENTER) + return FALSE; + + if (_baipassa) + return TRUE; + + if (!ripartenza()) + return FALSE; + + if (_numinv > (_nultras_tab + 1)) + warning_box("Trasferimento FUORI SEQUENZA: manca un trasferimento intermedio"); + else + if (_numinv < (_nultras_tab +1)) + warning_box("I dischetti risultano GIA' TRASFERITI"); + else + return TRUE; + } + while (tasto == K_ENTER); + } + } + + return TRUE; +} + +bool TRic_sistema::baipassa(TMask& m,KEY k) +{ + if (k == K_SHIFT+K_F7) + app()._baipassa = TRUE; + else + app()._baipassa = FALSE; + + return FALSE; +} + +void TRic_sistema::ripristina_trasfer() +{ + TString ditta,app; + + if (_numdisk == 1) + set_firm(_dittaric); + + // app.format("%05da", _dittaric); + + // ditta << "C:\\prassi\\" << app << "\\trasfer"; + // fcopy(_trasfer,/*ditta*/_trasf,TRUE); + + _tras_file->fcopytemp(_trasfer, _trasf, TRUE); +} + +void TRic_sistema::ditta_ricevente() +{ + TLocalisamfile nditte (LF_NDITTE); + + nditte.setkey(1); + nditte.zero(); + nditte.put(NDT_CODDITTA, _dittaric); + if (nditte.read() == NOERR) + _ragsoc_dittar = nditte.get(NDT_RAGSOC); +} + +long TRic_sistema::leggi_tabella_tras() +{ + TString dep; + long ditta = 0; + + _tab_tra->zero(); + dep = format("%10s%05d", (const char*) _nomeid, _dittainv); + _tab_tra->put("CODTAB", (const char*) dep); + if (_tab_tra->read() == NOERR) + { + ditta = _tab_tra->get_long("I0"); + _nultras_tab = _tab_tra->get_int ("I1"); + _dataultras_tab = _tab_tra->get_date("D0"); + _agg_cau = _tab_tra->get_char("S0"); + _agg_clifo = _tab_tra->get_char("S1"); + _agg_pcon = _tab_tra->get_char("S2"); + _agg_cls = _tab_tra->get_char("S3"); + _agg_fatatt = _tab_tra->get_bool("B0"); + _agg_fatpas = _tab_tra->get_bool("B1"); + } + + return ditta; +} + +bool TRic_sistema::set_flag() +{ + TString sigla; + long nrec; + int j; + int k = 0; + TString flag; + TString record; + TString ana_com,pcon_cau; + TString uselab; + bool fatto = TRUE; + + TConfig conf(CONFIG_DITTA); + + ana_com = conf.get("AnCfCm","cg"); + pcon_cau = conf.get("PcTcCm","cg"); + + _tras_file->open(_trasf); + + if (_tras_file->exist()) + { + if (_tras_file->read_control_rec()) + { + _nultras = _tras_file->nultras(); + _dataultras = _tras_file->dataultras(); + _sigle_file = _tras_file->sigle_file(); + _nrec_file = _tras_file->nrec_file(); + record = _tras_file->record(); + // La fill_index e' richiamata dentro a read_control_rec + // _tras_file->fill_index(_sigle_file,_nrec_file); + } + + for (j = 0; j < _sigle_file.len(); j++) + { + sigla = _sigle_file.mid(j,1); + nrec = atol(_nrec_file.mid(k,6)); + + if (fatto) + { + if (sigla == "W" || sigla == "P") + { + if (nrec > 0 && pcon_cau == "") + { + flag = "T"; + fatto = FALSE; + } + } + else + if (sigla == "A") + { + if (nrec > 0 && ana_com == "") + { + flag = "T"; + fatto = FALSE; + } + } + else + if (sigla == "Z" || sigla == "U" || sigla == "A") + { + if (nrec > 0) + { + flag = "C"; + fatto = FALSE; + } + } + else + { + flag = "*"; + fatto = FALSE; + } + + uselab = sigla; + } + + if (sigla == "W" || sigla == "P") + { + if (pcon_cau == "X") + { + _sigle_file.overwrite(" ",j); + _nrec_file.overwrite("000000",k); + } + } + + if (sigla == "A") + { + if (ana_com == "X") + { + _sigle_file.overwrite(" ",j); + _nrec_file.overwrite("000000",k); + } + } + k += 6; + } + + record.overwrite(_sigle_file,38); + record.overwrite(_nrec_file,47); + + TString agg(7); + + agg[0] = _agg_cls; + agg[1] = _agg_cau; + agg[2] = _agg_clifo; + agg[3] = _agg_pcon; + agg[4] = _agg_fatatt; + agg[5] = _agg_fatpas; + agg[6] = '\0'; + + record.overwrite(agg,234); + record.overwrite(uselab,240); + record.overwrite(" ",241); + + const int size = 256; + + if (!_tras_file->write_control_rec(record, size)) + return FALSE; + } + + conf.set("FlStTra", flag); + + return TRUE; +} + +void TRic_sistema::aggiorna_tabella() +{ + TString dep; + + _tab_tra->zero(); + dep = format("%10s%05d", (const char*) _nomeid, _dittainv); + _tab_tra->put("CODTAB", (const char*) dep); + if (_tab_tra->read() == NOERR) + { + _tab_tra->put("I1", (long)_nultras); + _tab_tra->put("D0", _dataultras); + _tab_tra->rewrite(); + } +} + +bool TRic_sistema::menu(MENU_TAG m) +{ + if (m == BAR_ITEM(1)) + return main_loop(); + return FALSE; +} + +int cg2400 (int argc, char* argv[]) +{ + TRic_sistema a; + a.run(argc, argv,"Ricezione archivi"); + return TRUE; +} diff --git a/cg/cg2700.cpp b/cg/cg2700.cpp index 6dc299175..86d860007 100755 --- a/cg/cg2700.cpp +++ b/cg/cg2700.cpp @@ -1,1126 +1,1122 @@ -// -// 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 operazione non compresa in alcun esercizio", - "*** Data competenza non valida", - "--- Data competenza non compresa in alcun esercizio", - "--- Data competenza incompatibile con data operazione", - "*** 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); - } - - if (_datareg.ok()) - { - int pr; - const int ar = date2esc(_datareg, &pr); // Esercizio in corso - if (ar == 0) - _err.set(1); - if (_datacomp.ok()) - { - const int ae = date2esc(_datacomp); - if (ae == 0) - _err.set(3); - else if (ae != ar && ae != pr && ar) - _err.set(4); - } - } - - if (!_datacomp.ok()) - { - _errore_grave = TRUE; - _err.set(2); - } - - 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(5); - } - - TString16 dd = _datadoc.string(); - if (dd.not_empty()) - if (!_datadoc.ok()) - _err.set(6); - - //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(7); - } - } - //_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(8); - } - - if (!_registro.blank()) //movimento iva (fattura) - { - if (!look_causale(_causale)) //se la causale non e' significativa - { - _errore_grave = TRUE; - check_reg = FALSE; - _err.set(9); - } - if (check_reg && _ae) - { - TRegistro rg (_registro, _ae); - if (rg.name().empty()) - { - _errore_grave = TRUE; - check_reg = FALSE; - _err.set(9); - } - 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(9); - } - 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 (_tiporeg != 0 && !_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(10); - } - } - else - { - _errore_grave = TRUE; - _err.set(10); - } - } - } - } - - TString16 d74 = _data74tr.string(); - if (d74.not_empty()) - if (!_data74tr.ok()) - _err.set(11); - - if (!_registro.blank() && check_reg) - if (_datareg < udata) - { - _errore_grave = TRUE; - _err.set(12); - } - - 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 - */ - if (gruppoc != 0 || contoc != 0 || sottocontoc != 0l) - { - 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) - { - _errore_grave = TRUE; - set_row(++riga, "@8g*** Sottoconto partita non valido o non presente in archivio"); - } - else - { - if (!_esiste_conto) - { - _errore_grave = TRUE; - set_row(++riga, "@8g*** Sottoconto partita non valido o non presente in archivio"); - } - } - - if ( (_importo == ZERO && _sezione != ' ') || - (_sezione != 'D' && _sezione != 'A') ) - { - _errore_grave = TRUE; - 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) - { - _errore_grave = TRUE; - 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) - { - bool ok = errori_partita(gruppocr,contocr,sottocontocr); - if (!ok) - { - rmoviva.readat(nrec); - return TRUE; - } - } - */ - if (gruppocr == 0 || contocr == 0 || sottocontocr == 0l) - { - rmoviva.readat(nrec); - return TRUE; - } - else if (gruppocr != 0 && contocr != 0 && sottocontocr != 0l) - { - 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) - { - _errore_grave = TRUE; - set_row(++riga, "@8g*** Sottoconto costo/ricavo non valido o non presente in archivio"); - } - else if (_gruppocr != 0 && _contocr != 0 && _sottocontocr != 0l) - { - bool ok = errori_partita(_gruppocr,_contocr,_sottocontocr); - if (!ok) - { - _errore_grave = TRUE; - 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) - { - _errore_grave = TRUE; - 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 + +#include "cg2103.h" +#include "cglib04.h" +#include "cg2700.h" + +HIDDEN const char* err_msg[] = {"*** Data operazione non valida", + "--- Data operazione non compresa in alcun esercizio", + "*** Data competenza non valida", + "--- Data competenza non compresa in alcun esercizio", + "--- Data competenza incompatibile con data operazione", + "*** 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); + } + + if (_datareg.ok()) + { + int pr; + const int ar = date2esc(_datareg, &pr); // Esercizio in corso + if (ar == 0) + _err.set(1); + if (_datacomp.ok()) + { + const int ae = date2esc(_datacomp); + if (ae == 0) + _err.set(3); + else if (ae != ar && ae != pr && ar) + _err.set(4); + } + } + + if (!_datacomp.ok()) + { + _errore_grave = TRUE; + _err.set(2); + } + + 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(5); + } + + TString16 dd = _datadoc.string(); + if (dd.not_empty()) + if (!_datadoc.ok()) + _err.set(6); + + //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(7); + } + } + //_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(8); + } + + if (!_registro.blank()) //movimento iva (fattura) + { + if (!look_causale(_causale)) //se la causale non e' significativa + { + _errore_grave = TRUE; + check_reg = FALSE; + _err.set(9); + } + if (check_reg && _ae) + { + TRegistro rg (_registro, _ae); + if (rg.name().empty()) + { + _errore_grave = TRUE; + check_reg = FALSE; + _err.set(9); + } + 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(9); + } + 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 (_tiporeg != 0 && !_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(10); + } + } + else + { + _errore_grave = TRUE; + _err.set(10); + } + } + } + } + + TString16 d74 = _data74tr.string(); + if (d74.not_empty()) + if (!_data74tr.ok()) + _err.set(11); + + if (!_registro.blank() && check_reg) + if (_datareg < udata) + { + _errore_grave = TRUE; + _err.set(12); + } + + 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 + */ + if (gruppoc != 0 || contoc != 0 || sottocontoc != 0l) + { + 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) + { + _errore_grave = TRUE; + set_row(++riga, "@8g*** Sottoconto partita non valido o non presente in archivio"); + } + else + { + if (!_esiste_conto) + { + _errore_grave = TRUE; + set_row(++riga, "@8g*** Sottoconto partita non valido o non presente in archivio"); + } + } + + if ( (_importo == ZERO && _sezione != ' ') || + (_sezione != 'D' && _sezione != 'A') ) + { + _errore_grave = TRUE; + 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) + { + _errore_grave = TRUE; + 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) + { + bool ok = errori_partita(gruppocr,contocr,sottocontocr); + if (!ok) + { + rmoviva.readat(nrec); + return TRUE; + } + } + */ + if (gruppocr == 0 || contocr == 0 || sottocontocr == 0l) + { + rmoviva.readat(nrec); + return TRUE; + } + else if (gruppocr != 0 && contocr != 0 && sottocontocr != 0l) + { + 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) + { + _errore_grave = TRUE; + set_row(++riga, "@8g*** Sottoconto costo/ricavo non valido o non presente in archivio"); + } + else if (_gruppocr != 0 && _contocr != 0 && _sottocontocr != 0l) + { + bool ok = errori_partita(_gruppocr,_contocr,_sottocontocr); + if (!ok) + { + _errore_grave = TRUE; + 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) + { + _errore_grave = TRUE; + 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; +} diff --git a/cg/cg2800.cpp b/cg/cg2800.cpp index d1f6b15ea..2476db415 100755 --- a/cg/cg2800.cpp +++ b/cg/cg2800.cpp @@ -1,1484 +1,1481 @@ -// Variazione movimenti di prima nota e movimenti iva - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "cglib04.h" -#include "cglib.h" -#include "cg2103.h" -#include "conto.h" - -#include "cg2800.h" -#include "cg2801.h" -#include "cg2802.h" -#include "cg2803.h" - -HIDDEN TString80 TEMP; - -//HIDDEN int date2esc(const TDate& d, int* prevesc = NULL); - -class TVar_mov : public TApplication -{ - TIsamtempfile* _tmov,* _trmov,* _tiva; - TLocalisamfile* _pcon,* _clifo; - TRectype* _rec_mov,* _rec_rmov,* _rec_riva; - TTransfer_file _tras_file; - char _scelta; - - TString _trasf,_std,_descr_civa; - long _dittaric,_numreg; - TString _control_rec,_record; - bool _righe,_corrisp; - int _numrig,_tiporeg; - -public: - TString _titolo; - - virtual bool create(); - virtual bool destroy(); - virtual bool menu(MENU_TAG m); - bool main_loop(); - bool esegui_controlli(); - bool leggi_trasfer(); - bool controlli(); - void leggi_record_controllo(); - bool video_PN(); - bool video_IVA(); - void registra_PN(TMask& m); - void registra_IVA(TMask& m); - bool esiste_testata_mov(TMask& m); - bool ricerca_movimento(TMask& m); - - bool esiste_riga_mov(TMask& m); - bool esiste_riga_iva(TMask& m); - - void ricerca_codcaus(const TString& codcaus); - void setta_campi_maschera(TMask& m); - bool setta_campi_maschera_iva(TMask& m); - - void registra_file_temp_mov(long,const TDate&,const TDate&,const TString&,TString&,long,long,const TString&,TString&); - void registra_file_trasfer_t(long,int,const TDate&,const TDate&,const TString&,TString&,long,long,const TString&,const TString&); - void registra_file_temp_rmov(long,int,int,int,long,char,const TString&,int,int,long,const real&); - void registra_file_trasfer_r(long,int,int,int,long,char,const TString&,int,int,long,const real&); - void registra_file_trasfer_t_iva(long,const TDate&,long,const TString&,const TString&,const TString&,const TString&,const TString&); - void registra_file_temp_riva(long,int,const real&,const TString&,const real&,int,int,int,int,long); - void registra_file_trasfer_r_iva(long,int,const real&,const TString&,const real&,int,int,int,int,long); - - void setta_parametri_record(const TString& sigla,const TString& flag); - - const char* converti (TString& data_AS400); - const char* riconverti(TString& data_PC); - - static bool codice_registro_hnd (TMask_field& f, KEY k); - static bool codice_causale_hnd (TMask_field& f, KEY k); - static bool numero_protocollo_hnd (TMask_field& f, KEY k); - static bool ultimo_protocollo_hnd (TMask_field& f, KEY k); - static bool codice_pagamento_hnd (TMask_field& f, KEY k); - static bool data_stampa (TMask_field& f, KEY k); - - static bool controllo_partita (TMask_field& f, KEY k); - static bool controllo_contropartita (TMask_field& f, KEY k); - static bool controllo_importo (TMask_field& f, KEY k); - - static bool codice_clifo_hnd (TMask_field& f, KEY k); - static bool codice_iva_hnd (TMask_field& f, KEY k); - static bool imposta_hnd (TMask_field& f, KEY k); - static bool detraibilita_hnd (TMask_field& f, KEY k); - static bool tipocr_hnd (TMask_field& f, KEY k); - - bool decodifica_codiva(const TString& codiva); - - TVar_mov(char mov); -}; - -HIDDEN TVar_mov& app() { return (TVar_mov &) 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; -} - -TVar_mov::TVar_mov(char mov) : _scelta(toupper(mov)) -{ - switch (_scelta) - { - case 'P': - _titolo = "Variazione movimenti prima nota"; - break; - - case 'I': - _titolo = "Variazione movimenti iva"; - break; - - default: - break; - } -} - -bool TVar_mov::create() -{ - TApplication::create(); - - _pcon = new TLocalisamfile (LF_PCON); - _clifo = new TLocalisamfile (LF_CLIFO); - _rec_mov = new TRectype (LF_MOV); - - if (_scelta == 'P') - { - TString80 tmpmov = "%"; - tmpmov << get_firm_dir(); - tmpmov << "\\" << TEMP_MOV; - TString80 tmprmov = "%"; - tmprmov << get_firm_dir(); - tmprmov << "\\" << TEMP_RMOV; - - _tmov = new TIsamtempfile(LF_MOV, tmpmov, 0); - _trmov = new TIsamtempfile(LF_RMOV, tmprmov, 0); - _rec_rmov = new TRectype (LF_RMOV); - } - else - if (_scelta == 'I') - { - TString80 tmpmov = "%"; - tmpmov << get_firm_dir(); - tmpmov << "\\" << TEMP_MOV; - TString80 tmprmoviva = "%"; - tmprmoviva << get_firm_dir(); - tmprmoviva << "\\" << TEMP_RMOVIVA; - - _tmov = new TIsamtempfile(LF_MOV, tmpmov, 0); - _tiva = new TIsamtempfile(LF_RMOVIVA, tmprmoviva, 0); - _rec_riva = new TRectype (LF_RMOVIVA); - } - - dispatch_e_menu (BAR_ITEM(1)); - - return TRUE; -} - -bool TVar_mov::destroy() -{ - delete _rec_mov; - delete _pcon; - delete _clifo; - - if (_scelta == 'P') - { - delete _trmov; - delete _rec_rmov; - } - else - if (_scelta == 'I') - { - delete _tiva; - delete _rec_riva; - } - - delete _tmov; - - return TApplication::destroy(); -} - -void TVar_mov::leggi_record_controllo() -{ - _tras_file.read_control_rec(); - _control_rec = _tras_file.record(); -} - -const char* TVar_mov::converti (TString& data_AS400) -{ - TEMP = data_AS400.mid(4,2); - TEMP << "-" <get (MOV_REG); - - if (!setta_campi_maschera_iva(mask)) - return FALSE; - - mask.set_handler(F_CODCF, codice_clifo_hnd); - - if (_righe) - { - mask.set_handler(F_SOTTOCONTO, controllo_partita); - mask.set_handler(F_CODIVA, codice_iva_hnd); - mask.set_handler(F_IMPOSTA, imposta_hnd); - mask.set_handler(F_TIPODET, detraibilita_hnd); - mask.set_handler(F_TIPOCR, tipocr_hnd); - } - - tasto = mask.run(); - - switch (tasto) - { - case K_ESC : - break; - - case K_QUIT : - break; - - case K_SAVE : - { - registra_IVA(mask); - } - break; - - default: - break; - } - } - } - while (tasto != K_QUIT); //K_ENTER - - return TRUE; -} - -bool TVar_mov::ricerca_movimento(TMask& m) -{ - _numrig = atoi(m.get(F_NUMRIG)); - - if (_numrig == 0) - { - _righe = FALSE; - return esiste_testata_mov(m); - } - else - { - _righe = TRUE; - esiste_testata_mov(m); - if (_scelta == 'P') - return esiste_riga_mov(m); - else - return esiste_riga_iva(m); - } - - return TRUE; -} - -bool TVar_mov::esiste_testata_mov(TMask& m) -{ - long nprog; - - _numreg = m.get_long(F_NUMREG); - - _tmov->setkey(1); - _tmov->zero(); - _tmov->put(MOV_NUMREG, _numreg); - - if (_tmov->read() == NOERR) - { - if (_scelta == 'P') - { - nprog = _tmov->get_long(MOV_NUMGIO); - nprog += _tras_file.start('Z'); - } - else - if (_scelta == 'I') - { - _tiva->setkey(1); - _tiva->zero(); - _tiva->put(RMI_NUMREG, _numreg); - _tiva->read(); - long nr = _tiva->get_long(RMI_NUMREG); - if (_numreg != nr) - return error_box("Registrazione richiesta NON PRESENTE tra i movimenti in trasferimento"); - - nprog = _tmov->get_long(MOV_ANNOIVA); - nprog += _tras_file.start('U'); - } - - _tras_file.read_rec_trasfer(nprog); - _record = _tras_file.read_rec(); - - char annullato = _record.sub(248,249)[0]; - - if (annullato == 'A') - return error_box("Registrazione presente ma ANNULLATA: impossibile variarla"); - - *_rec_mov = _tmov->curr(); - } - else - return error_box("Registrazione richiesta NON PRESENTE tra i movimenti in trasferimento"); - - return TRUE; -} - -bool TVar_mov::esiste_riga_mov(TMask& m) -{ - _numreg = m.get_long(F_NUMREG); - _numrig = m.get_int (F_NUMRIG); - - _trmov->setkey(1); - _trmov->zero(); - _trmov->put(RMV_NUMREG, _numreg); - _trmov->put(RMV_NUMRIG, _numrig); - - if (_trmov->read() == NOERR) - { - long nprog = _trmov->get_long(RMV_ANNOES); - nprog += _tras_file.start('Z'); - - _tras_file.read_rec_trasfer(nprog); - _record = _tras_file.read_rec(); - - char annullato = _record.sub(248,249)[0]; - - if (annullato == 'A') - return error_box("Registrazione presente ma ANNULLATA: impossibile variarla"); - - *_rec_rmov = _trmov->curr(); - } - else - return error_box("Registrazione richiesta NON PRESENTE tra i movimenti in trasferimento"); - - return TRUE; -} - -bool TVar_mov::esiste_riga_iva(TMask& m) -{ - _numreg = m.get_long(F_NUMREG); - _numrig = m.get_int (F_NUMRIG); - - _tiva->setkey(1); - _tiva->zero(); - _tiva->put(RMI_NUMREG, _numreg); - _tiva->put(RMI_NUMRIG, _numrig); - - if (_tiva->read() == NOERR) - { - long nprog = _tiva->get_long(RMI_ANNOES); - nprog += _tras_file.start('U'); - - _tras_file.read_rec_trasfer(nprog); - _record = _tras_file.read_rec(); - - char annullato = _record.sub(248,249)[0]; - - if (annullato == 'A') - return error_box("Registrazione presente ma ANNULLATA: impossibile variarla"); - - *_rec_riva = _tiva->curr(); - } - else - return error_box("Registrazione richiesta NON PRESENTE tra i movimenti in trasferimento"); - - return TRUE; -} - -void TVar_mov::setta_campi_maschera(TMask& m) -{ - int annorif = atoi(_record.sub(21,22)); - TDate datareg (_rec_mov->get_date(MOV_DATAREG)); - TDate datadoc (_rec_mov->get_date(MOV_DATADOC)); - TString numdoc = _rec_mov->get (MOV_NUMDOC); - TString regiva = _rec_mov->get (MOV_REG); - regiva.trim(); - long protiva = _rec_mov->get_long(MOV_PROTIVA); - long nuprotiva = _rec_mov->get_long(MOV_UPROTIVA); - TString codcaus = _rec_mov->get (MOV_CODCAUS); - TString codpag = _rec_mov->get (MOV_CODPAG); - codpag.trim(); - - m.set(F_NUMREG, _numreg); - m.set(F_NUMRIG, _numrig); - m.set(F_DATAREG, datareg.string()); - m.set(F_ANNO, annorif); - m.set(F_DATADOC, datadoc.string()); - m.set(F_NUMDOC, numdoc); - m.set(F_REGIVA, regiva); - m.set(F_PROTIVA, protiva); - m.set(F_NUPROTIVA, nuprotiva); - m.set(F_CODCAUS, codcaus); - m.set(F_CODPAG, codpag); - - m.disable(F_NUMREG); - m.disable(F_NUMRIG); - - if (!_righe) - { - m.enable(F_DATAREG); - m.enable(F_ANNO); - m.enable(F_DATADOC); - m.enable(F_NUMDOC); - m.enable(F_REGIVA); - m.enable(F_PROTIVA); - m.enable(F_NUPROTIVA); - m.enable(F_CODCAUS); - m.enable(F_CODPAG); - m.disable(F_GRUPPO); - m.disable(F_CONTO); - m.disable(F_SOTTOCONTO); - m.disable(F_SEZIONE); - m.disable(F_IMPORTO); - m.disable(F_DESCR); - m.disable(F_GRUPPOC); - m.disable(F_CONTOC); - m.disable(F_SOTTOC); - } - else - if (_righe) - { - int gruppo = _trmov->get_int (RMV_GRUPPO); - int conto = _trmov->get_int (RMV_CONTO); - long sottocon = _trmov->get_long(RMV_SOTTOCONTO); - char sezione = _trmov->get_char(RMV_SEZIONE); - TString descr = _trmov->get (RMV_DESCR); - int gruppoc = _trmov->get_int (RMV_GRUPPOC); - int contoc = _trmov->get_int (RMV_CONTOC); - long sottoc = _trmov->get_long(RMV_SOTTOCONTOC); - real importo = _trmov->get_real(RMV_IMPORTO); - - m.set(F_GRUPPO, gruppo); - m.set(F_CONTO, conto); - m.set(F_SOTTOCONTO, sottocon); - m.set(F_SEZIONE, sezione); - m.set(F_DESCR, descr); - m.set(F_GRUPPOC, gruppoc); - m.set(F_CONTOC, contoc); - m.set(F_SOTTOC, sottoc); - m.set(F_IMPORTO, importo.string()); - - m.disable(F_DATAREG); - m.disable(F_ANNO); - m.disable(F_DATADOC); - m.disable(F_NUMDOC); - m.disable(F_REGIVA); - m.disable(F_PROTIVA); - m.disable(F_NUPROTIVA); - m.disable(F_CODCAUS); - m.disable(F_CODPAG); - - m.enable(F_GRUPPO); - m.enable(F_CONTO); - m.enable(F_SOTTOCONTO); - m.enable(F_SEZIONE); - m.enable(F_IMPORTO); - m.enable(F_DESCR); - m.enable(F_GRUPPOC); - m.enable(F_CONTOC); - m.enable(F_SOTTOC); - } -} - -bool TVar_mov::setta_campi_maschera_iva(TMask& m) -{ - TDate datareg (_rec_mov->get_date(MOV_DATAREG)); - TDate data74ter (_rec_mov->get_date(MOV_DATA74TER)); - TString regiva = _rec_mov->get (MOV_REG); - regiva.trim(); - TString codcaus = _rec_mov->get (MOV_CODCAUS); - long codcf = _rec_mov->get_long(MOV_CODCF); - - TString ragsoc = _record.sub(61,86); - TString ind = _record.sub(86,108); - TString localita = _record.sub(108,126); - TString cap = _record.sub(126,131); - TString prov = _record.sub(131,133); - - if (codcaus.not_empty()) - ricerca_codcaus(codcaus); - - int anno = date2esc(datareg); - - char cr = regiva[0]; - TString codreg; - - if (isdigit(cr)) - codreg.format("%03c", cr); - else - codreg.format("%-3c", cr); - - TRegistro rg (codreg, anno); - _tiporeg = rg.tipo(); - - if (regiva.not_empty()) - { - if (!rg.ok()) - return error_box("Registrazione presente ma con PRIMANOTA ERRATA: correggerla prima"); - } - else - return error_box("Campo NON VALIDO o codice NON PRESENTE in archivio"); - - m.set(F_NUMREG, _numreg); - m.set(F_NUMRIG, _numrig); - m.set(F_DATA74TER, data74ter.string()); - m.set(F_CODCF, codcf); - m.set(F_RAGSOCOCC, ragsoc); - m.set(F_INDOCC, ind); - m.set(F_LOCALITA, localita); - m.set(F_CAPOCC, cap); - m.set(F_PROVOCC, prov); - - m.disable(F_NUMREG); - m.disable(F_NUMRIG); - - if (!_righe) - { - m.enable(F_DATA74TER); - m.enable(F_CODCF); - m.enable(F_RAGSOCOCC); - m.enable(F_INDOCC); - m.enable(F_LOCALITA); - m.enable(F_CAPOCC); - m.enable(F_PROVOCC); - m.disable(F_IMPONIBILE); - m.disable(F_CODIVA); - m.disable(F_IMPOSTA); - m.disable(F_TIPODET); - m.disable(F_TIPOCR); - m.disable(F_GRUPPO); - m.disable(F_CONTO); - m.disable(F_SOTTOCONTO); - } - else - if (_righe) - { - real imponibile (_tiva->get_real(RMI_IMPONIBILE)); - TString codiva (_tiva->get (RMI_CODIVA)); - real imposta (_tiva->get_real(RMI_IMPOSTA)); - int tipodet = _tiva->get_int (RMI_TIPODET); - int tipocr = _tiva->get_int (RMI_TIPOCR); - int gruppo = _tiva->get_int (RMI_GRUPPO); - int conto = _tiva->get_int (RMI_CONTO); - long sottoc = _tiva->get_long(RMI_SOTTOCONTO); - - m.set(F_IMPONIBILE, imponibile.string()); - m.set(F_CODIVA, codiva); - m.set(F_IMPOSTA, imposta.string()); - m.set(F_TIPODET, tipodet); - m.set(F_TIPOCR, tipocr); - m.set(F_GRUPPO, gruppo); - m.set(F_CONTO, conto); - m.set(F_SOTTOCONTO, sottoc); - - m.disable(F_DATA74TER); - m.disable(F_CODCF); - m.disable(F_RAGSOCOCC); - m.disable(F_INDOCC); - m.disable(F_LOCALITA); - m.disable(F_CAPOCC); - m.disable(F_PROVOCC); - - m.enable(F_IMPONIBILE); - m.enable(F_CODIVA); - m.enable(F_IMPOSTA); - m.enable(F_TIPODET); - m.enable(F_TIPOCR); - m.enable(F_GRUPPO); - m.enable(F_CONTO); - m.enable(F_SOTTOCONTO); - } - - return TRUE; -} - -bool TVar_mov::codice_registro_hnd(TMask_field& f, KEY k) -{ - TTable reg ("REG"); - TString descr,dep; - - if (k == K_TAB || k == K_ENTER) - { - TString codreg = f.get(); - char cr = codreg[0]; - TDate datareg (f.mask().get(F_DATAREG)); - int anno = date2esc(datareg); - - if (isdigit(cr)) - dep.format("%04d%03c", anno, cr); - else - dep.format("%04d%-3c", anno, cr); - - reg.zero(); - reg.put("CODTAB", dep); - if (reg.read() == NOERR) - { - descr = reg.get("S0"); - f.mask().set(F_DESCRREG, descr); - } - else - if (codreg.not_empty() && f.mask().is_running()) - return warning_box("Codice registro IVA non presente in tabella"); - } - - return TRUE; -} - -bool TVar_mov::codice_causale_hnd(TMask_field& f, KEY k) -{ - TLocalisamfile cau (LF_CAUSALI); - TString descr; - - if (k == K_TAB || k == K_ENTER) - { - TString codcau = f.get(); - - if (f.mask().is_running()) - { - TString codreg = f.mask().get(F_REGIVA); - - if (codreg.not_empty()) - if (codcau.empty()) - return warning_box("Il codice registro IVA e' significativo: deve essere significativo anche il codice causale"); - } - - cau.setkey(1); - cau.zero(); - cau.put("CODCAUS", codcau); - if (cau.read() == NOERR) - { - descr = cau.get("DESCR"); - f.mask().set(F_DESCRCAU, descr); - } - else - if (f.mask().is_running()) - return warning_box("Codice causale non presente in tabella"); - } - return TRUE; -} - -bool TVar_mov::numero_protocollo_hnd(TMask_field& f, KEY k) -{ - if (k != K_ENTER) return FALSE; - - TString codreg = f.mask().get(F_REGIVA); - long protiva = atol(f.mask().get(F_PROTIVA)); - long uprotiva = atol(f.mask().get(F_NUPROTIVA)); - - if (codreg.empty()) - if (protiva != 0) - return warning_box("Il codice registro IVA non e' significativo: non e' possibile compilare il numero protocollo IVA"); - - return TRUE; -} - -bool TVar_mov::ultimo_protocollo_hnd(TMask_field& f, KEY k) -{ - if (k != K_ENTER) return FALSE; - - TString codreg = f.mask().get(F_REGIVA); - long protiva = atol(f.mask().get(F_PROTIVA)); - long uprotiva = atol(f.mask().get(F_NUPROTIVA)); - - if (codreg.empty()) - if (uprotiva != 0) - return warning_box("Il codice registro IVA non e' significativo: non e' possibile compilare l' ultimo numero protocollo IVA"); - - if (protiva == 0) - if (uprotiva != 0) - return warning_box("Numero protocollo IVA non significativo: non e' possibile compilare il numero protocollo IVA riepilogato"); - - return TRUE; -} - -bool TVar_mov::codice_pagamento_hnd(TMask_field& f, KEY k) -{ - TTable pag ("%CPG"); - TString descr,codpag,dep; - - if (k == K_TAB || k == K_ENTER) - { - codpag = f.get(); - dep.format("%04s", (const char*)codpag); - - pag.zero(); - pag.put("CODTAB", dep); - if (pag.read() == NOERR) - { - descr = pag.get("S0"); - f.mask().set(F_DESCRPAG, descr); - } - else - if (codpag.not_empty() && k == K_ENTER) - return warning_box("Codice pagamento non presente in tabella"); - } - - return TRUE; -} - -bool TVar_mov::data_stampa(TMask_field& f, KEY k) -{ - if (k != K_ENTER) return FALSE; - - TDate datareg (f.mask().get(F_DATAREG)); - const int ae = date2esc(datareg); - - TLibro_giornale gio; - gio.read(ae); //se _ae e' zero la read considera come anno quello corrente - - if (datareg < gio.last_print()) - return warning_box("La data di registrazione e' minore della data di stampa del Libro Giornale"); - - TString codreg = f.mask().get(F_REGIVA); - - if (!codreg.blank()) //movimento iva (fattura) - { - TRegistro rg (codreg, ae); - - if (datareg < rg.last_print()) - return error_box("La data di registrazione e' minore della data stampa del registro IVA"); - } - - return TRUE; -} - -bool TVar_mov::controllo_partita(TMask_field& f, KEY k) -{ - if (k == K_TAB || k == K_ENTER) - { - int gruppo = f.mask().get_int (F_GRUPPO); - int conto = f.mask().get_int (F_CONTO); - long sottoc = f.mask().get_long(F_SOTTOCONTO); - - TConto tc (gruppo,conto,sottoc); - - TString descr = tc.descrizione(); - f.mask().set(F_DESCRPARTITA, descr); - - if (k == K_ENTER) - if (!tc.find()) - return warning_box("Sottoconto partita non presente in anagrafica Piano dei Conti oppure anagrafica Clienti / Fornitori"); - } - - return TRUE; -} - -bool TVar_mov::controllo_contropartita(TMask_field& f, KEY k) -{ - if (k == K_TAB || k == K_ENTER) - { - int gruppo = f.mask().get_int (F_GRUPPOC); - int conto = f.mask().get_int (F_CONTOC); - long sottoc = f.mask().get_long(F_SOTTOC); - - TConto tc (gruppo,conto,sottoc); - - TString descr = tc.descrizione(); - f.mask().set(F_DESCRCPARTITA, descr); - - if (k == K_ENTER) - if (gruppo != 0 && conto != 0 && sottoc != 0) - if (!tc.find()) - return warning_box("Sottoconto contropartita non presente in anagrafica Piano dei Conti oppure anagrafica Clienti / Fornitori"); - } - - return TRUE; -} - -bool TVar_mov::controllo_importo(TMask_field& f, KEY k) -{ - if (k == K_ENTER) - { - real importo (f.mask().get(F_IMPORTO)); - - if (importo == ZERO) - return warning_box("L' importo deve essere significativo"); - } - - return TRUE; -} - -bool TVar_mov::codice_clifo_hnd(TMask_field& f, KEY k) -{ - char tipo; - - if (k == K_TAB || k == K_ENTER) - { - long codcf = atol(f.get()); - if (app()._tiporeg == 1) - tipo = 'C'; - else - if (app()._tiporeg == 2) - tipo = 'F'; - - TConto tc (0,0,codcf,tipo); - - if (tc.find()) - { - TString descr = tc.descrizione(); - f.mask().set(F_RAGSOCCF, descr); - } - else - if (k == K_ENTER) - return warning_box("Campo NON VALIDO o codice non presente in archivio"); - } - - return TRUE; -} - -bool TVar_mov::codice_iva_hnd(TMask_field& f, KEY k) -{ - if (k == K_TAB || k == K_ENTER) - { - TString codiva = f.get(); - - bool ok = app().decodifica_codiva(codiva); - - f.mask().set(F_DESCRCODIVA, app()._descr_civa); - - if (k == K_ENTER) - { - real imponibile (f.mask().get(F_IMPONIBILE)); - real imposta (f.mask().get(F_IMPOSTA)); - - if ( (imponibile != ZERO || imposta != ZERO) && codiva.empty() ) - return warning_box("Il codice IVA deve essere indicato obbligatoriamente"); - - if (codiva.not_empty()) - if (!ok) - return warning_box("Codice non presente in tabella"); - } - } - - return TRUE; -} - -bool TVar_mov::decodifica_codiva(const TString& codiva) -{ - TTable iva ("%IVA"); - TString dep; - - dep.format("%-4s", (const char*)codiva); - - iva.zero(); - iva.put("CODTAB", dep); - if (iva.read() == NOERR) - { - _descr_civa = iva.get("S0"); - return TRUE; - } - else - { - _descr_civa = ""; - return FALSE; - } - - return TRUE; -} - -bool TVar_mov::imposta_hnd(TMask_field& f, KEY k) -{ - if (k == K_ENTER) - { - real imposta (f.mask().get(F_IMPOSTA)); - - if (app()._corrisp && imposta != ZERO) - return warning_box("Il movimento e' relativo ad un corrispettivo: l'imposta deve essere uguale a 0"); - } - - return TRUE; -} - -bool TVar_mov::detraibilita_hnd(TMask_field& f, KEY k) -{ - if (k == K_ENTER) - { - int det = atoi(f.get()); - - if (det != 0 && det != 1 && det != 3 && det != 9) - return warning_box("Valore non ammesso per il tipo detraibilita'"); - } - - return TRUE; -} - -bool TVar_mov::tipocr_hnd(TMask_field& f, KEY k) -{ - if (k == K_ENTER) - { - int tcr = atoi(f.get()); - - if (tcr != 0 && tcr != 1 && tcr != 2 && tcr != 3 - && tcr != 4 && tcr != 5 && tcr != 8 && tcr != 9) - return warning_box("Valore non ammesso per il tipo costo/ricavo"); - } - - return TRUE; -} - -void TVar_mov::registra_PN(TMask& m) -{ - if (!_righe) - { - long numreg = m.get_long(F_NUMREG); - int annorif = m.get_int (F_ANNO); - TDate datareg (m.get(F_DATAREG)); - TDate datadoc (m.get(F_DATADOC)); - TString numdoc = m.get (F_NUMDOC); - TString regiva = m.get (F_REGIVA); - long protiva = m.get_long(F_PROTIVA); - long nuprotiva = m.get_long(F_NUPROTIVA); - TString codcaus = m.get (F_CODCAUS); - TString codpag = m.get (F_CODPAG); - - registra_file_temp_mov(numreg,datareg,datadoc,numdoc,regiva,protiva,nuprotiva,codcaus,codpag); - registra_file_trasfer_t(numreg,annorif,datareg,datadoc,numdoc,regiva,protiva,nuprotiva,codcaus,codpag); - } - else - if (_righe) - { - long numreg = m.get_long(F_NUMREG); - int numrig = m.get_int (F_NUMRIG); - int gruppo = m.get_int (F_GRUPPO); - int conto = m.get_int (F_CONTO); - long sottoc = m.get_long(F_SOTTOCONTO); - char sezione = m.get (F_SEZIONE)[0]; - TString descr = m.get (F_DESCR); - int gruppoc = m.get_int (F_GRUPPOC); - int contoc = m.get_int (F_CONTOC); - long sottocc = m.get_long(F_SOTTOC); - real importo (m.get(F_IMPORTO)); - - registra_file_temp_rmov(numreg,numrig,gruppo,conto,sottoc,sezione,descr,gruppoc,contoc,sottocc,importo); - registra_file_trasfer_r(numreg,numrig,gruppo,conto,sottoc,sezione,descr,gruppoc,contoc,sottocc,importo); - } -} - -void TVar_mov::registra_file_temp_mov(long nr,const TDate& dr,const TDate& dd,const TString& nd,TString& ri, - long pi,long upi,const TString& cc,TString& cp) -{ - _tmov->setkey(1); - _tmov->zero(); - _tmov->put(MOV_NUMREG, nr); - if (_tmov->read() == NOERR) - { - _tmov->put(MOV_DATAREG, dr); - _tmov->put(MOV_DATADOC, dd); - _tmov->put(MOV_NUMDOC, nd); - _tmov->put(MOV_REG, ri); - _tmov->put(MOV_PROTIVA, pi); - _tmov->put(MOV_UPROTIVA, upi); - _tmov->put(MOV_CODCAUS, cc); - _tmov->put(MOV_CODPAG, cp); - - _tmov->rewrite(); - } -} - -void TVar_mov::registra_file_trasfer_t(long nr,int ar,const TDate& dr,const TDate& dd,const TString& nd,TString& ri, - long pi,long upi,const TString& cc,const TString& cp) -{ - TString app,str; - TRectype* rec; - rec = new TRectype (LF_RMOV); - - _trmov->setkey(1); - _trmov->zero(); - _trmov->put(RMV_NUMREG, nr); - *rec = _trmov->curr(); - - for (_trmov->read(); !_trmov->eof(); _trmov->next()) - { - if (_trmov->curr() > *rec) break; - - long numrec = _trmov->get_int(RMV_ANNOES); - numrec += _tras_file.start('Z'); - - _tras_file.read_rec_trasfer(numrec); //Leggo il record della prima nota - - app = dr.string(); - str = riconverti(app); - _tras_file.put(str,"Z1",0,numrec); - app = dd.string(); - str = riconverti(app); - _tras_file.put(str,"Z1",4,numrec); - str = format("%d", ar); - _tras_file.put(str,"Z1",50,numrec); - str = format("%-7s", (const char*) nd); - _tras_file.put(str,"Z1",5,numrec); - if (ri == "") - ri = " "; - _tras_file.put(ri,"Z1",6,numrec); - _tras_file.put(cc,"Z1",8,numrec); - str = format("%05ld", pi); - _tras_file.put(str,"Z1",7,numrec); - str = format("%05ld", upi); - _tras_file.put(str,"Z1",10,numrec); - str = format("%2s", (const char*) cp); - _tras_file.put(str,"Z1",9,numrec); - - _tras_file.write(numrec); - } - - delete rec; -} - -void TVar_mov::registra_file_temp_rmov(long nr,int nri,int g,int c,long s,char sez,const TString& desc, - int gc,int cc,long sc,const real& imp) -{ - _trmov->setkey(1); - _trmov->zero(); - _trmov->put(RMV_NUMREG, nr); - _trmov->put(RMV_NUMRIG, nri); - if (_trmov->read() == NOERR) - { - _trmov->put(RMV_GRUPPO, g); - _trmov->put(RMV_CONTO, c); - _trmov->put(RMV_SOTTOCONTO, s); - _trmov->put(RMV_SEZIONE, sez); - _trmov->put(RMV_DESCR, desc); - _trmov->put(RMV_GRUPPOC, gc); - _trmov->put(RMV_CONTOC, cc); - _trmov->put(RMV_SOTTOCONTOC, sc); - _trmov->put(RMV_IMPORTO, imp); - - _trmov->rewrite(); - } -} - -void TVar_mov::registra_file_trasfer_r(long nr,int nri,int g,int c,long s,char sez,const TString& desc, - int gc,int cc,long sc,const real& imp) -{ - TString app,str; - - _trmov->setkey(1); - _trmov->zero(); - _trmov->put(RMV_NUMREG, nr); - _trmov->put(RMV_NUMRIG, nri); - - if (_trmov->read() == NOERR) - { - long numrec = _trmov->get_int(RMV_ANNOES); - numrec += _tras_file.start('Z'); - - _tras_file.read_rec_trasfer(numrec); //Leggo il record della prima nota - - str = format("%02d", g); - _tras_file.put(str,"Z1",17,numrec); - str = format("%02d", c); - _tras_file.put(str,"Z1",18,numrec); - str = format("%06ld", s); - _tras_file.put(str,"Z1",19,numrec); - str = format("%c", sez); - _tras_file.put(str,"Z1",20,numrec); - str = format("%-30s", (const char*)desc); - _tras_file.put(str,"Z1",16,numrec); - str = format("%02d", gc); - _tras_file.put(str,"Z1",21,numrec); - str = format("%02d", cc); - _tras_file.put(str,"Z1",22,numrec); - str = format("%06ld", sc); - _tras_file.put(str,"Z1",23,numrec); - str = format("%011s", (const char*) imp.string()); - _tras_file.put(str,"Z1",24,numrec); - - _tras_file.write(numrec); - } -} - -void TVar_mov::registra_IVA(TMask& m) -{ - if (!_righe) - { - long numreg = m.get_long(F_NUMREG); - TDate data74ter (m.get(F_DATA74TER)); - long codcf = m.get_long(F_CODCF); - TString ragsococc = m.get (F_RAGSOCOCC); - TString indocc = m.get (F_INDOCC); - TString localita = m.get (F_LOCALITA); - TString capocc = m.get (F_CAPOCC); - TString provocc = m.get (F_PROVOCC); - - _tmov->setkey(1); - _tmov->zero(); - _tmov->put(MOV_NUMREG, numreg); - if (_tmov->read() == NOERR) - { - _tmov->put(MOV_DATA74TER, data74ter); - _tmov->put(MOV_CODCF, codcf); - - _tmov->rewrite(); - } - - registra_file_trasfer_t_iva(numreg,data74ter,codcf,ragsococc,indocc,localita,capocc,provocc); - } - else - if (_righe) - { - long numreg = m.get_long(F_NUMREG); - int numrig = m.get_int (F_NUMRIG); - real imponibile (m.get (F_IMPONIBILE)); - TString codiva = m.get (F_CODIVA); - real imposta (m.get (F_IMPOSTA)); - int tipodet = m.get_int (F_TIPODET); - int tipocr = m.get_int (F_TIPOCR); - int gruppo = m.get_int (F_GRUPPO); - int conto = m.get_int (F_CONTO); - long sottoc = m.get_long(F_SOTTOCONTO); - - registra_file_temp_riva(numreg,numrig,imponibile,codiva,imposta,tipodet,tipocr,gruppo,conto,sottoc); - registra_file_trasfer_r_iva(numreg,numrig,imponibile,codiva,imposta,tipodet,tipocr,gruppo,conto,sottoc); - } -} - -void TVar_mov::registra_file_trasfer_t_iva(long nr,const TDate& d74,long cf,const TString& rgo,const TString& io, - const TString& lo,const TString& co,const TString& po) -{ - TString app,str; - TRectype* rec; - rec = new TRectype (LF_RMOVIVA); - - _tiva->setkey(1); - _tiva->zero(); - _tiva->put(RMI_NUMREG, nr); - *rec = _tiva->curr(); - - for (_tiva->read(); !_tiva->eof(); _tiva->next()) - { - if (_tiva->curr() > *rec) break; - - long numrec = _tiva->get_int(RMI_ANNOES); - numrec += _tras_file.start('U'); - - _tras_file.read_rec_trasfer(numrec); //Leggo il record della prima nota - - app = d74.string(); - str = riconverti(app); - _tras_file.put(str,"U1",4,numrec); - str = format("%06d", cf); - _tras_file.put(str,"U1",6,numrec); - str = format("%-25s", (const char*)rgo ); - _tras_file.put(str,"U1",50,numrec); - str = format("%-22s", (const char*)io); - _tras_file.put(str,"U1",51,numrec); - str = format("%-18s", (const char*)lo); - _tras_file.put(str,"U1",52,numrec); - str = format("%05s", (const char*)co ); - _tras_file.put(str,"U1",53,numrec); - str = format("%-2s", (const char*)po); - _tras_file.put(str,"U1",54,numrec); - - _tras_file.write(numrec); - } - - delete rec; -} - -void TVar_mov::registra_file_temp_riva(long nr,int nri,const real& imp,const TString& civa,const real& imposta, - int tdet,int tcr,int g,int c,long s) -{ - _tiva->setkey(1); - _tiva->zero(); - _tiva->put(RMI_NUMREG, nr); - _tiva->put(RMI_NUMRIG, nri); - if (_tiva->read() == NOERR) - { - _tiva->put(RMI_IMPONIBILE, imp); - _tiva->put(RMI_CODIVA, civa); - _tiva->put(RMI_IMPOSTA, imposta); - _tiva->put(RMI_TIPODET, tdet); - _tiva->put(RMI_TIPOCR, tcr); - _tiva->put(RMI_GRUPPO, g); - _tiva->put(RMI_CONTO, c); - _tiva->put(RMI_SOTTOCONTO, s); - - _tiva->rewrite(); - } -} - -void TVar_mov::registra_file_trasfer_r_iva(long nr,int nri,const real& imp,const TString& civa,const real& imposta, - int tdet,int tcr,int g,int c,long s) -{ - TString app,str; - - _tiva->setkey(1); - _tiva->zero(); - _tiva->put(RMI_NUMREG, nr); - _tiva->put(RMI_NUMRIG, nri); - - if (_tiva->read() == NOERR) - { - long numrec = _tiva->get_int(RMI_ANNOES); - numrec += _tras_file.start('U'); - - _tras_file.read_rec_trasfer(numrec); //Leggo il record dell' iva - - str = format("%011s", (const char*) imp.string()); - _tras_file.put(str,"U1",14,numrec); - str = format("%02s", (const char*) civa); - _tras_file.put(str,"U1",13,numrec); - str = format("%09s", (const char*) imposta.string()); - _tras_file.put(str,"U1",15,numrec); - str = format("%d", tdet); - _tras_file.put(str,"U1",16,numrec); - str = format("%d", tcr); - _tras_file.put(str,"U1",17,numrec); - str = format("%02d", g); - _tras_file.put(str,"U1",19,numrec); - str = format("%02d", c); - _tras_file.put(str,"U1",20,numrec); - str = format("%06ld", s); - _tras_file.put(str,"U1",21,numrec); - - _tras_file.write(numrec); - } -} - -bool TVar_mov::leggi_trasfer() -{ - _trasf = _tras_file.path(_dittaric); - _trasf << "\\trasfer"; - - _tras_file.open(_trasf); - - if (_tras_file.exist()) - { - if (_tras_file.read_control_rec()) - _control_rec = _tras_file.record(); - else - return error_box("Rilevati gravi errori negli archivi:procedura interrotta"); - } - else - return error_box("Al momento non presenti trasferimenti attivi sulla ditta selezionata"); - - return TRUE; -} - -bool TVar_mov::esegui_controlli() -{ - TConfig conf(CONFIG_DITTA); - - _std = conf.get("FlStTra"); - - if (!prefix().exist(_dittaric)) - return error_box("Rilevati gravi errori negli archivi: procedura interrotta"); - - if (!leggi_trasfer()) - return FALSE; - - if (!controlli()) - return FALSE; - - return TRUE; -} - -void TVar_mov::setta_parametri_record(const TString& sigla,const TString& flag) -{ - TConfig conf (CONFIG_DITTA); - - conf.set("FlStTra", flag); - - leggi_record_controllo(); - _control_rec.overwrite(sigla,240); - - const int size = 256; - - _tras_file.write_control_rec(_control_rec, size); -} - -bool TVar_mov::controlli() -{ - if (_std == "T") - return error_box("Variazione NON POSSIBILE: eseguire prima la ricezione delle tabelle"); - - if (_std == "M") - return error_box("Variazione NON POSSIBILE: trasferimento movimenti gia' iniziato"); - - if (_std == "*") - { - warning_box("Trasferimento interamente completato: proseguire per cancellare il file"); - fremove(_trasf); - return FALSE; - } - - return TRUE; -} - -bool TVar_mov::menu(MENU_TAG m) -{ - if (m == BAR_ITEM(1)) - return main_loop(); - return FALSE; -} - -int cg2800 (int argc, char* argv[]) -{ - switch (*argv[2]) - { - case 'P': - { - TVar_mov main_app(*argv[2]); - main_app.run(argc, argv,main_app._titolo); - } - break; - case 'I': -{ - TVar_mov main_app(*argv[2]); - main_app.run(argc, argv,main_app._titolo); -} -break; - case 'S': -{ - TDitta_ric a; - a.run(argc, argv,"Scelta ditta per ricezione"); -} -break; - case 'A': -{ - TAnn_mov a; - a.run(argc, argv,"Annullamento movimenti da ricevere"); -} -break; - case 'V': -{ - TVis_ric a; - a.run(argc, argv,"Visualizzazione stato ricezione"); -} -break; -default: -break; -} -//main_app.run(argc, argv,main_app._titolo); -return TRUE; -} +// Variazione movimenti di prima nota e movimenti iva + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "cglib04.h" +#include "cglib.h" +#include "cg2103.h" +#include "conto.h" + +#include "cg2800.h" +#include "cg2801.h" +#include "cg2802.h" +#include "cg2803.h" + +HIDDEN TString80 TEMP; + +//HIDDEN int date2esc(const TDate& d, int* prevesc = NULL); + +class TVar_mov : public TApplication +{ + TIsamtempfile* _tmov,* _trmov,* _tiva; + TLocalisamfile* _pcon,* _clifo; + TRectype* _rec_mov,* _rec_rmov,* _rec_riva; + TTransfer_file _tras_file; + char _scelta; + + TString _trasf,_std,_descr_civa; + long _dittaric,_numreg; + TString _control_rec,_record; + bool _righe,_corrisp; + int _numrig,_tiporeg; + +public: + TString _titolo; + + virtual bool create(); + virtual bool destroy(); + virtual bool menu(MENU_TAG m); + bool main_loop(); + bool esegui_controlli(); + bool leggi_trasfer(); + bool controlli(); + void leggi_record_controllo(); + bool video_PN(); + bool video_IVA(); + void registra_PN(TMask& m); + void registra_IVA(TMask& m); + bool esiste_testata_mov(TMask& m); + bool ricerca_movimento(TMask& m); + + bool esiste_riga_mov(TMask& m); + bool esiste_riga_iva(TMask& m); + + void ricerca_codcaus(const TString& codcaus); + void setta_campi_maschera(TMask& m); + bool setta_campi_maschera_iva(TMask& m); + + void registra_file_temp_mov(long,const TDate&,const TDate&,const TString&,TString&,long,long,const TString&,TString&); + void registra_file_trasfer_t(long,int,const TDate&,const TDate&,const TString&,TString&,long,long,const TString&,const TString&); + void registra_file_temp_rmov(long,int,int,int,long,char,const TString&,int,int,long,const real&); + void registra_file_trasfer_r(long,int,int,int,long,char,const TString&,int,int,long,const real&); + void registra_file_trasfer_t_iva(long,const TDate&,long,const TString&,const TString&,const TString&,const TString&,const TString&); + void registra_file_temp_riva(long,int,const real&,const TString&,const real&,int,int,int,int,long); + void registra_file_trasfer_r_iva(long,int,const real&,const TString&,const real&,int,int,int,int,long); + + void setta_parametri_record(const TString& sigla,const TString& flag); + + const char* converti (TString& data_AS400); + const char* riconverti(TString& data_PC); + + static bool codice_registro_hnd (TMask_field& f, KEY k); + static bool codice_causale_hnd (TMask_field& f, KEY k); + static bool numero_protocollo_hnd (TMask_field& f, KEY k); + static bool ultimo_protocollo_hnd (TMask_field& f, KEY k); + static bool codice_pagamento_hnd (TMask_field& f, KEY k); + static bool data_stampa (TMask_field& f, KEY k); + + static bool controllo_partita (TMask_field& f, KEY k); + static bool controllo_contropartita (TMask_field& f, KEY k); + static bool controllo_importo (TMask_field& f, KEY k); + + static bool codice_clifo_hnd (TMask_field& f, KEY k); + static bool codice_iva_hnd (TMask_field& f, KEY k); + static bool imposta_hnd (TMask_field& f, KEY k); + static bool detraibilita_hnd (TMask_field& f, KEY k); + static bool tipocr_hnd (TMask_field& f, KEY k); + + bool decodifica_codiva(const TString& codiva); + + TVar_mov(char mov); +}; + +HIDDEN TVar_mov& app() { return (TVar_mov &) 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; +} + +TVar_mov::TVar_mov(char mov) : _scelta(toupper(mov)) +{ + switch (_scelta) + { + case 'P': + _titolo = "Variazione movimenti prima nota"; + break; + + case 'I': + _titolo = "Variazione movimenti iva"; + break; + + default: + break; + } +} + +bool TVar_mov::create() +{ + TApplication::create(); + + _pcon = new TLocalisamfile (LF_PCON); + _clifo = new TLocalisamfile (LF_CLIFO); + _rec_mov = new TRectype (LF_MOV); + + if (_scelta == 'P') + { + TString80 tmpmov = "%"; + tmpmov << get_firm_dir(); + tmpmov << "\\" << TEMP_MOV; + TString80 tmprmov = "%"; + tmprmov << get_firm_dir(); + tmprmov << "\\" << TEMP_RMOV; + + _tmov = new TIsamtempfile(LF_MOV, tmpmov, 0); + _trmov = new TIsamtempfile(LF_RMOV, tmprmov, 0); + _rec_rmov = new TRectype (LF_RMOV); + } + else + if (_scelta == 'I') + { + TString80 tmpmov = "%"; + tmpmov << get_firm_dir(); + tmpmov << "\\" << TEMP_MOV; + TString80 tmprmoviva = "%"; + tmprmoviva << get_firm_dir(); + tmprmoviva << "\\" << TEMP_RMOVIVA; + + _tmov = new TIsamtempfile(LF_MOV, tmpmov, 0); + _tiva = new TIsamtempfile(LF_RMOVIVA, tmprmoviva, 0); + _rec_riva = new TRectype (LF_RMOVIVA); + } + + dispatch_e_menu (BAR_ITEM(1)); + + return TRUE; +} + +bool TVar_mov::destroy() +{ + delete _rec_mov; + delete _pcon; + delete _clifo; + + if (_scelta == 'P') + { + delete _trmov; + delete _rec_rmov; + } + else + if (_scelta == 'I') + { + delete _tiva; + delete _rec_riva; + } + + delete _tmov; + + return TApplication::destroy(); +} + +void TVar_mov::leggi_record_controllo() +{ + _tras_file.read_control_rec(); + _control_rec = _tras_file.record(); +} + +const char* TVar_mov::converti (TString& data_AS400) +{ + TEMP = data_AS400.mid(4,2); + TEMP << "-" <get (MOV_REG); + + if (!setta_campi_maschera_iva(mask)) + return FALSE; + + mask.set_handler(F_CODCF, codice_clifo_hnd); + + if (_righe) + { + mask.set_handler(F_SOTTOCONTO, controllo_partita); + mask.set_handler(F_CODIVA, codice_iva_hnd); + mask.set_handler(F_IMPOSTA, imposta_hnd); + mask.set_handler(F_TIPODET, detraibilita_hnd); + mask.set_handler(F_TIPOCR, tipocr_hnd); + } + + tasto = mask.run(); + + switch (tasto) + { + case K_ESC : + break; + + case K_QUIT : + break; + + case K_SAVE : + { + registra_IVA(mask); + } + break; + + default: + break; + } + } + } + while (tasto != K_QUIT); //K_ENTER + + return TRUE; +} + +bool TVar_mov::ricerca_movimento(TMask& m) +{ + _numrig = atoi(m.get(F_NUMRIG)); + + if (_numrig == 0) + { + _righe = FALSE; + return esiste_testata_mov(m); + } + else + { + _righe = TRUE; + esiste_testata_mov(m); + if (_scelta == 'P') + return esiste_riga_mov(m); + else + return esiste_riga_iva(m); + } + + return TRUE; +} + +bool TVar_mov::esiste_testata_mov(TMask& m) +{ + long nprog; + + _numreg = m.get_long(F_NUMREG); + + _tmov->setkey(1); + _tmov->zero(); + _tmov->put(MOV_NUMREG, _numreg); + + if (_tmov->read() == NOERR) + { + if (_scelta == 'P') + { + nprog = _tmov->get_long(MOV_NUMGIO); + nprog += _tras_file.start('Z'); + } + else + if (_scelta == 'I') + { + _tiva->setkey(1); + _tiva->zero(); + _tiva->put(RMI_NUMREG, _numreg); + _tiva->read(); + long nr = _tiva->get_long(RMI_NUMREG); + if (_numreg != nr) + return error_box("Registrazione richiesta NON PRESENTE tra i movimenti in trasferimento"); + + nprog = _tmov->get_long(MOV_ANNOIVA); + nprog += _tras_file.start('U'); + } + + _tras_file.read_rec_trasfer(nprog); + _record = _tras_file.read_rec(); + + char annullato = _record.sub(248,249)[0]; + + if (annullato == 'A') + return error_box("Registrazione presente ma ANNULLATA: impossibile variarla"); + + *_rec_mov = _tmov->curr(); + } + else + return error_box("Registrazione richiesta NON PRESENTE tra i movimenti in trasferimento"); + + return TRUE; +} + +bool TVar_mov::esiste_riga_mov(TMask& m) +{ + _numreg = m.get_long(F_NUMREG); + _numrig = m.get_int (F_NUMRIG); + + _trmov->setkey(1); + _trmov->zero(); + _trmov->put(RMV_NUMREG, _numreg); + _trmov->put(RMV_NUMRIG, _numrig); + + if (_trmov->read() == NOERR) + { + long nprog = _trmov->get_long(RMV_ANNOES); + nprog += _tras_file.start('Z'); + + _tras_file.read_rec_trasfer(nprog); + _record = _tras_file.read_rec(); + + char annullato = _record.sub(248,249)[0]; + + if (annullato == 'A') + return error_box("Registrazione presente ma ANNULLATA: impossibile variarla"); + + *_rec_rmov = _trmov->curr(); + } + else + return error_box("Registrazione richiesta NON PRESENTE tra i movimenti in trasferimento"); + + return TRUE; +} + +bool TVar_mov::esiste_riga_iva(TMask& m) +{ + _numreg = m.get_long(F_NUMREG); + _numrig = m.get_int (F_NUMRIG); + + _tiva->setkey(1); + _tiva->zero(); + _tiva->put(RMI_NUMREG, _numreg); + _tiva->put(RMI_NUMRIG, _numrig); + + if (_tiva->read() == NOERR) + { + long nprog = _tiva->get_long(RMI_ANNOES); + nprog += _tras_file.start('U'); + + _tras_file.read_rec_trasfer(nprog); + _record = _tras_file.read_rec(); + + char annullato = _record.sub(248,249)[0]; + + if (annullato == 'A') + return error_box("Registrazione presente ma ANNULLATA: impossibile variarla"); + + *_rec_riva = _tiva->curr(); + } + else + return error_box("Registrazione richiesta NON PRESENTE tra i movimenti in trasferimento"); + + return TRUE; +} + +void TVar_mov::setta_campi_maschera(TMask& m) +{ + int annorif = atoi(_record.sub(21,22)); + TDate datareg (_rec_mov->get_date(MOV_DATAREG)); + TDate datadoc (_rec_mov->get_date(MOV_DATADOC)); + TString numdoc = _rec_mov->get (MOV_NUMDOC); + TString regiva = _rec_mov->get (MOV_REG); + regiva.trim(); + long protiva = _rec_mov->get_long(MOV_PROTIVA); + long nuprotiva = _rec_mov->get_long(MOV_UPROTIVA); + TString codcaus = _rec_mov->get (MOV_CODCAUS); + TString codpag = _rec_mov->get (MOV_CODPAG); + codpag.trim(); + + m.set(F_NUMREG, _numreg); + m.set(F_NUMRIG, _numrig); + m.set(F_DATAREG, datareg.string()); + m.set(F_ANNO, annorif); + m.set(F_DATADOC, datadoc.string()); + m.set(F_NUMDOC, numdoc); + m.set(F_REGIVA, regiva); + m.set(F_PROTIVA, protiva); + m.set(F_NUPROTIVA, nuprotiva); + m.set(F_CODCAUS, codcaus); + m.set(F_CODPAG, codpag); + + m.disable(F_NUMREG); + m.disable(F_NUMRIG); + + if (!_righe) + { + m.enable(F_DATAREG); + m.enable(F_ANNO); + m.enable(F_DATADOC); + m.enable(F_NUMDOC); + m.enable(F_REGIVA); + m.enable(F_PROTIVA); + m.enable(F_NUPROTIVA); + m.enable(F_CODCAUS); + m.enable(F_CODPAG); + m.disable(F_GRUPPO); + m.disable(F_CONTO); + m.disable(F_SOTTOCONTO); + m.disable(F_SEZIONE); + m.disable(F_IMPORTO); + m.disable(F_DESCR); + m.disable(F_GRUPPOC); + m.disable(F_CONTOC); + m.disable(F_SOTTOC); + } + else + if (_righe) + { + int gruppo = _trmov->get_int (RMV_GRUPPO); + int conto = _trmov->get_int (RMV_CONTO); + long sottocon = _trmov->get_long(RMV_SOTTOCONTO); + char sezione = _trmov->get_char(RMV_SEZIONE); + TString descr = _trmov->get (RMV_DESCR); + int gruppoc = _trmov->get_int (RMV_GRUPPOC); + int contoc = _trmov->get_int (RMV_CONTOC); + long sottoc = _trmov->get_long(RMV_SOTTOCONTOC); + real importo = _trmov->get_real(RMV_IMPORTO); + + m.set(F_GRUPPO, gruppo); + m.set(F_CONTO, conto); + m.set(F_SOTTOCONTO, sottocon); + m.set(F_SEZIONE, sezione); + m.set(F_DESCR, descr); + m.set(F_GRUPPOC, gruppoc); + m.set(F_CONTOC, contoc); + m.set(F_SOTTOC, sottoc); + m.set(F_IMPORTO, importo.string()); + + m.disable(F_DATAREG); + m.disable(F_ANNO); + m.disable(F_DATADOC); + m.disable(F_NUMDOC); + m.disable(F_REGIVA); + m.disable(F_PROTIVA); + m.disable(F_NUPROTIVA); + m.disable(F_CODCAUS); + m.disable(F_CODPAG); + + m.enable(F_GRUPPO); + m.enable(F_CONTO); + m.enable(F_SOTTOCONTO); + m.enable(F_SEZIONE); + m.enable(F_IMPORTO); + m.enable(F_DESCR); + m.enable(F_GRUPPOC); + m.enable(F_CONTOC); + m.enable(F_SOTTOC); + } +} + +bool TVar_mov::setta_campi_maschera_iva(TMask& m) +{ + TDate datareg (_rec_mov->get_date(MOV_DATAREG)); + TDate data74ter (_rec_mov->get_date(MOV_DATA74TER)); + TString regiva = _rec_mov->get (MOV_REG); + regiva.trim(); + TString codcaus = _rec_mov->get (MOV_CODCAUS); + long codcf = _rec_mov->get_long(MOV_CODCF); + + TString ragsoc = _record.sub(61,86); + TString ind = _record.sub(86,108); + TString localita = _record.sub(108,126); + TString cap = _record.sub(126,131); + TString prov = _record.sub(131,133); + + if (codcaus.not_empty()) + ricerca_codcaus(codcaus); + + int anno = date2esc(datareg); + + char cr = regiva[0]; + TString codreg; + + if (isdigit(cr)) + codreg.format("%03c", cr); + else + codreg.format("%-3c", cr); + + TRegistro rg (codreg, anno); + _tiporeg = rg.tipo(); + + if (regiva.not_empty()) + { + if (!rg.ok()) + return error_box("Registrazione presente ma con PRIMANOTA ERRATA: correggerla prima"); + } + else + return error_box("Campo NON VALIDO o codice NON PRESENTE in archivio"); + + m.set(F_NUMREG, _numreg); + m.set(F_NUMRIG, _numrig); + m.set(F_DATA74TER, data74ter.string()); + m.set(F_CODCF, codcf); + m.set(F_RAGSOCOCC, ragsoc); + m.set(F_INDOCC, ind); + m.set(F_LOCALITA, localita); + m.set(F_CAPOCC, cap); + m.set(F_PROVOCC, prov); + + m.disable(F_NUMREG); + m.disable(F_NUMRIG); + + if (!_righe) + { + m.enable(F_DATA74TER); + m.enable(F_CODCF); + m.enable(F_RAGSOCOCC); + m.enable(F_INDOCC); + m.enable(F_LOCALITA); + m.enable(F_CAPOCC); + m.enable(F_PROVOCC); + m.disable(F_IMPONIBILE); + m.disable(F_CODIVA); + m.disable(F_IMPOSTA); + m.disable(F_TIPODET); + m.disable(F_TIPOCR); + m.disable(F_GRUPPO); + m.disable(F_CONTO); + m.disable(F_SOTTOCONTO); + } + else + if (_righe) + { + real imponibile (_tiva->get_real(RMI_IMPONIBILE)); + TString codiva (_tiva->get (RMI_CODIVA)); + real imposta (_tiva->get_real(RMI_IMPOSTA)); + int tipodet = _tiva->get_int (RMI_TIPODET); + int tipocr = _tiva->get_int (RMI_TIPOCR); + int gruppo = _tiva->get_int (RMI_GRUPPO); + int conto = _tiva->get_int (RMI_CONTO); + long sottoc = _tiva->get_long(RMI_SOTTOCONTO); + + m.set(F_IMPONIBILE, imponibile.string()); + m.set(F_CODIVA, codiva); + m.set(F_IMPOSTA, imposta.string()); + m.set(F_TIPODET, tipodet); + m.set(F_TIPOCR, tipocr); + m.set(F_GRUPPO, gruppo); + m.set(F_CONTO, conto); + m.set(F_SOTTOCONTO, sottoc); + + m.disable(F_DATA74TER); + m.disable(F_CODCF); + m.disable(F_RAGSOCOCC); + m.disable(F_INDOCC); + m.disable(F_LOCALITA); + m.disable(F_CAPOCC); + m.disable(F_PROVOCC); + + m.enable(F_IMPONIBILE); + m.enable(F_CODIVA); + m.enable(F_IMPOSTA); + m.enable(F_TIPODET); + m.enable(F_TIPOCR); + m.enable(F_GRUPPO); + m.enable(F_CONTO); + m.enable(F_SOTTOCONTO); + } + + return TRUE; +} + +bool TVar_mov::codice_registro_hnd(TMask_field& f, KEY k) +{ + TTable reg ("REG"); + TString descr,dep; + + if (k == K_TAB || k == K_ENTER) + { + TString codreg = f.get(); + char cr = codreg[0]; + TDate datareg (f.mask().get(F_DATAREG)); + int anno = date2esc(datareg); + + if (isdigit(cr)) + dep.format("%04d%03c", anno, cr); + else + dep.format("%04d%-3c", anno, cr); + + reg.zero(); + reg.put("CODTAB", dep); + if (reg.read() == NOERR) + { + descr = reg.get("S0"); + f.mask().set(F_DESCRREG, descr); + } + else + if (codreg.not_empty() && f.mask().is_running()) + return warning_box("Codice registro IVA non presente in tabella"); + } + + return TRUE; +} + +bool TVar_mov::codice_causale_hnd(TMask_field& f, KEY k) +{ + TLocalisamfile cau (LF_CAUSALI); + TString descr; + + if (k == K_TAB || k == K_ENTER) + { + TString codcau = f.get(); + + if (f.mask().is_running()) + { + TString codreg = f.mask().get(F_REGIVA); + + if (codreg.not_empty()) + if (codcau.empty()) + return warning_box("Il codice registro IVA e' significativo: deve essere significativo anche il codice causale"); + } + + cau.setkey(1); + cau.zero(); + cau.put("CODCAUS", codcau); + if (cau.read() == NOERR) + { + descr = cau.get("DESCR"); + f.mask().set(F_DESCRCAU, descr); + } + else + if (f.mask().is_running()) + return warning_box("Codice causale non presente in tabella"); + } + return TRUE; +} + +bool TVar_mov::numero_protocollo_hnd(TMask_field& f, KEY k) +{ + if (k != K_ENTER) return FALSE; + + TString codreg = f.mask().get(F_REGIVA); + long protiva = atol(f.mask().get(F_PROTIVA)); + long uprotiva = atol(f.mask().get(F_NUPROTIVA)); + + if (codreg.empty()) + if (protiva != 0) + return warning_box("Il codice registro IVA non e' significativo: non e' possibile compilare il numero protocollo IVA"); + + return TRUE; +} + +bool TVar_mov::ultimo_protocollo_hnd(TMask_field& f, KEY k) +{ + if (k != K_ENTER) return FALSE; + + TString codreg = f.mask().get(F_REGIVA); + long protiva = atol(f.mask().get(F_PROTIVA)); + long uprotiva = atol(f.mask().get(F_NUPROTIVA)); + + if (codreg.empty()) + if (uprotiva != 0) + return warning_box("Il codice registro IVA non e' significativo: non e' possibile compilare l' ultimo numero protocollo IVA"); + + if (protiva == 0) + if (uprotiva != 0) + return warning_box("Numero protocollo IVA non significativo: non e' possibile compilare il numero protocollo IVA riepilogato"); + + return TRUE; +} + +bool TVar_mov::codice_pagamento_hnd(TMask_field& f, KEY k) +{ + TTable pag ("%CPG"); + TString descr,codpag,dep; + + if (k == K_TAB || k == K_ENTER) + { + codpag = f.get(); + dep.format("%04s", (const char*)codpag); + + pag.zero(); + pag.put("CODTAB", dep); + if (pag.read() == NOERR) + { + descr = pag.get("S0"); + f.mask().set(F_DESCRPAG, descr); + } + else + if (codpag.not_empty() && k == K_ENTER) + return warning_box("Codice pagamento non presente in tabella"); + } + + return TRUE; +} + +bool TVar_mov::data_stampa(TMask_field& f, KEY k) +{ + if (k != K_ENTER) return FALSE; + + TDate datareg (f.mask().get(F_DATAREG)); + const int ae = date2esc(datareg); + + TLibro_giornale gio; + gio.read(ae); //se _ae e' zero la read considera come anno quello corrente + + if (datareg < gio.last_print()) + return warning_box("La data di registrazione e' minore della data di stampa del Libro Giornale"); + + TString codreg = f.mask().get(F_REGIVA); + + if (!codreg.blank()) //movimento iva (fattura) + { + TRegistro rg (codreg, ae); + + if (datareg < rg.last_print()) + return error_box("La data di registrazione e' minore della data stampa del registro IVA"); + } + + return TRUE; +} + +bool TVar_mov::controllo_partita(TMask_field& f, KEY k) +{ + if (k == K_TAB || k == K_ENTER) + { + int gruppo = f.mask().get_int (F_GRUPPO); + int conto = f.mask().get_int (F_CONTO); + long sottoc = f.mask().get_long(F_SOTTOCONTO); + + TConto tc (gruppo,conto,sottoc); + + TString descr = tc.descrizione(); + f.mask().set(F_DESCRPARTITA, descr); + + if (k == K_ENTER) + if (!tc.find()) + return warning_box("Sottoconto partita non presente in anagrafica Piano dei Conti oppure anagrafica Clienti / Fornitori"); + } + + return TRUE; +} + +bool TVar_mov::controllo_contropartita(TMask_field& f, KEY k) +{ + if (k == K_TAB || k == K_ENTER) + { + int gruppo = f.mask().get_int (F_GRUPPOC); + int conto = f.mask().get_int (F_CONTOC); + long sottoc = f.mask().get_long(F_SOTTOC); + + TConto tc (gruppo,conto,sottoc); + + TString descr = tc.descrizione(); + f.mask().set(F_DESCRCPARTITA, descr); + + if (k == K_ENTER) + if (gruppo != 0 && conto != 0 && sottoc != 0) + if (!tc.find()) + return warning_box("Sottoconto contropartita non presente in anagrafica Piano dei Conti oppure anagrafica Clienti / Fornitori"); + } + + return TRUE; +} + +bool TVar_mov::controllo_importo(TMask_field& f, KEY k) +{ + if (k == K_ENTER) + { + real importo (f.mask().get(F_IMPORTO)); + + if (importo == ZERO) + return warning_box("L' importo deve essere significativo"); + } + + return TRUE; +} + +bool TVar_mov::codice_clifo_hnd(TMask_field& f, KEY k) +{ + char tipo; + + if (k == K_TAB || k == K_ENTER) + { + long codcf = atol(f.get()); + if (app()._tiporeg == 1) + tipo = 'C'; + else + if (app()._tiporeg == 2) + tipo = 'F'; + + TConto tc (0,0,codcf,tipo); + + if (tc.find()) + { + TString descr = tc.descrizione(); + f.mask().set(F_RAGSOCCF, descr); + } + else + if (k == K_ENTER) + return warning_box("Campo NON VALIDO o codice non presente in archivio"); + } + + return TRUE; +} + +bool TVar_mov::codice_iva_hnd(TMask_field& f, KEY k) +{ + if (k == K_TAB || k == K_ENTER) + { + TString codiva = f.get(); + + bool ok = app().decodifica_codiva(codiva); + + f.mask().set(F_DESCRCODIVA, app()._descr_civa); + + if (k == K_ENTER) + { + real imponibile (f.mask().get(F_IMPONIBILE)); + real imposta (f.mask().get(F_IMPOSTA)); + + if ( (imponibile != ZERO || imposta != ZERO) && codiva.empty() ) + return warning_box("Il codice IVA deve essere indicato obbligatoriamente"); + + if (codiva.not_empty()) + if (!ok) + return warning_box("Codice non presente in tabella"); + } + } + + return TRUE; +} + +bool TVar_mov::decodifica_codiva(const TString& codiva) +{ + TTable iva ("%IVA"); + TString dep; + + dep.format("%-4s", (const char*)codiva); + + iva.zero(); + iva.put("CODTAB", dep); + if (iva.read() == NOERR) + { + _descr_civa = iva.get("S0"); + return TRUE; + } + else + { + _descr_civa = ""; + return FALSE; + } + + return TRUE; +} + +bool TVar_mov::imposta_hnd(TMask_field& f, KEY k) +{ + if (k == K_ENTER) + { + real imposta (f.mask().get(F_IMPOSTA)); + + if (app()._corrisp && imposta != ZERO) + return warning_box("Il movimento e' relativo ad un corrispettivo: l'imposta deve essere uguale a 0"); + } + + return TRUE; +} + +bool TVar_mov::detraibilita_hnd(TMask_field& f, KEY k) +{ + if (k == K_ENTER) + { + int det = atoi(f.get()); + + if (det != 0 && det != 1 && det != 3 && det != 9) + return warning_box("Valore non ammesso per il tipo detraibilita'"); + } + + return TRUE; +} + +bool TVar_mov::tipocr_hnd(TMask_field& f, KEY k) +{ + if (k == K_ENTER) + { + int tcr = atoi(f.get()); + + if (tcr != 0 && tcr != 1 && tcr != 2 && tcr != 3 + && tcr != 4 && tcr != 5 && tcr != 8 && tcr != 9) + return warning_box("Valore non ammesso per il tipo costo/ricavo"); + } + + return TRUE; +} + +void TVar_mov::registra_PN(TMask& m) +{ + if (!_righe) + { + long numreg = m.get_long(F_NUMREG); + int annorif = m.get_int (F_ANNO); + TDate datareg (m.get(F_DATAREG)); + TDate datadoc (m.get(F_DATADOC)); + TString numdoc = m.get (F_NUMDOC); + TString regiva = m.get (F_REGIVA); + long protiva = m.get_long(F_PROTIVA); + long nuprotiva = m.get_long(F_NUPROTIVA); + TString codcaus = m.get (F_CODCAUS); + TString codpag = m.get (F_CODPAG); + + registra_file_temp_mov(numreg,datareg,datadoc,numdoc,regiva,protiva,nuprotiva,codcaus,codpag); + registra_file_trasfer_t(numreg,annorif,datareg,datadoc,numdoc,regiva,protiva,nuprotiva,codcaus,codpag); + } + else + if (_righe) + { + long numreg = m.get_long(F_NUMREG); + int numrig = m.get_int (F_NUMRIG); + int gruppo = m.get_int (F_GRUPPO); + int conto = m.get_int (F_CONTO); + long sottoc = m.get_long(F_SOTTOCONTO); + char sezione = m.get (F_SEZIONE)[0]; + TString descr = m.get (F_DESCR); + int gruppoc = m.get_int (F_GRUPPOC); + int contoc = m.get_int (F_CONTOC); + long sottocc = m.get_long(F_SOTTOC); + real importo (m.get(F_IMPORTO)); + + registra_file_temp_rmov(numreg,numrig,gruppo,conto,sottoc,sezione,descr,gruppoc,contoc,sottocc,importo); + registra_file_trasfer_r(numreg,numrig,gruppo,conto,sottoc,sezione,descr,gruppoc,contoc,sottocc,importo); + } +} + +void TVar_mov::registra_file_temp_mov(long nr,const TDate& dr,const TDate& dd,const TString& nd,TString& ri, + long pi,long upi,const TString& cc,TString& cp) +{ + _tmov->setkey(1); + _tmov->zero(); + _tmov->put(MOV_NUMREG, nr); + if (_tmov->read() == NOERR) + { + _tmov->put(MOV_DATAREG, dr); + _tmov->put(MOV_DATADOC, dd); + _tmov->put(MOV_NUMDOC, nd); + _tmov->put(MOV_REG, ri); + _tmov->put(MOV_PROTIVA, pi); + _tmov->put(MOV_UPROTIVA, upi); + _tmov->put(MOV_CODCAUS, cc); + _tmov->put(MOV_CODPAG, cp); + + _tmov->rewrite(); + } +} + +void TVar_mov::registra_file_trasfer_t(long nr,int ar,const TDate& dr,const TDate& dd,const TString& nd,TString& ri, + long pi,long upi,const TString& cc,const TString& cp) +{ + TString app,str; + TRectype* rec; + rec = new TRectype (LF_RMOV); + + _trmov->setkey(1); + _trmov->zero(); + _trmov->put(RMV_NUMREG, nr); + *rec = _trmov->curr(); + + for (_trmov->read(); !_trmov->eof(); _trmov->next()) + { + if (_trmov->curr() > *rec) break; + + long numrec = _trmov->get_int(RMV_ANNOES); + numrec += _tras_file.start('Z'); + + _tras_file.read_rec_trasfer(numrec); //Leggo il record della prima nota + + app = dr.string(); + str = riconverti(app); + _tras_file.put(str,"Z1",0,numrec); + app = dd.string(); + str = riconverti(app); + _tras_file.put(str,"Z1",4,numrec); + str = format("%d", ar); + _tras_file.put(str,"Z1",50,numrec); + str = format("%-7s", (const char*) nd); + _tras_file.put(str,"Z1",5,numrec); + if (ri == "") + ri = " "; + _tras_file.put(ri,"Z1",6,numrec); + _tras_file.put(cc,"Z1",8,numrec); + str = format("%05ld", pi); + _tras_file.put(str,"Z1",7,numrec); + str = format("%05ld", upi); + _tras_file.put(str,"Z1",10,numrec); + str = format("%2s", (const char*) cp); + _tras_file.put(str,"Z1",9,numrec); + + _tras_file.write(numrec); + } + + delete rec; +} + +void TVar_mov::registra_file_temp_rmov(long nr,int nri,int g,int c,long s,char sez,const TString& desc, + int gc,int cc,long sc,const real& imp) +{ + _trmov->setkey(1); + _trmov->zero(); + _trmov->put(RMV_NUMREG, nr); + _trmov->put(RMV_NUMRIG, nri); + if (_trmov->read() == NOERR) + { + _trmov->put(RMV_GRUPPO, g); + _trmov->put(RMV_CONTO, c); + _trmov->put(RMV_SOTTOCONTO, s); + _trmov->put(RMV_SEZIONE, sez); + _trmov->put(RMV_DESCR, desc); + _trmov->put(RMV_GRUPPOC, gc); + _trmov->put(RMV_CONTOC, cc); + _trmov->put(RMV_SOTTOCONTOC, sc); + _trmov->put(RMV_IMPORTO, imp); + + _trmov->rewrite(); + } +} + +void TVar_mov::registra_file_trasfer_r(long nr,int nri,int g,int c,long s,char sez,const TString& desc, + int gc,int cc,long sc,const real& imp) +{ + TString app,str; + + _trmov->setkey(1); + _trmov->zero(); + _trmov->put(RMV_NUMREG, nr); + _trmov->put(RMV_NUMRIG, nri); + + if (_trmov->read() == NOERR) + { + long numrec = _trmov->get_int(RMV_ANNOES); + numrec += _tras_file.start('Z'); + + _tras_file.read_rec_trasfer(numrec); //Leggo il record della prima nota + + str = format("%02d", g); + _tras_file.put(str,"Z1",17,numrec); + str = format("%02d", c); + _tras_file.put(str,"Z1",18,numrec); + str = format("%06ld", s); + _tras_file.put(str,"Z1",19,numrec); + str = format("%c", sez); + _tras_file.put(str,"Z1",20,numrec); + str = format("%-30s", (const char*)desc); + _tras_file.put(str,"Z1",16,numrec); + str = format("%02d", gc); + _tras_file.put(str,"Z1",21,numrec); + str = format("%02d", cc); + _tras_file.put(str,"Z1",22,numrec); + str = format("%06ld", sc); + _tras_file.put(str,"Z1",23,numrec); + str = format("%011s", (const char*) imp.string()); + _tras_file.put(str,"Z1",24,numrec); + + _tras_file.write(numrec); + } +} + +void TVar_mov::registra_IVA(TMask& m) +{ + if (!_righe) + { + long numreg = m.get_long(F_NUMREG); + TDate data74ter (m.get(F_DATA74TER)); + long codcf = m.get_long(F_CODCF); + TString ragsococc = m.get (F_RAGSOCOCC); + TString indocc = m.get (F_INDOCC); + TString localita = m.get (F_LOCALITA); + TString capocc = m.get (F_CAPOCC); + TString provocc = m.get (F_PROVOCC); + + _tmov->setkey(1); + _tmov->zero(); + _tmov->put(MOV_NUMREG, numreg); + if (_tmov->read() == NOERR) + { + _tmov->put(MOV_DATA74TER, data74ter); + _tmov->put(MOV_CODCF, codcf); + + _tmov->rewrite(); + } + + registra_file_trasfer_t_iva(numreg,data74ter,codcf,ragsococc,indocc,localita,capocc,provocc); + } + else + if (_righe) + { + long numreg = m.get_long(F_NUMREG); + int numrig = m.get_int (F_NUMRIG); + real imponibile (m.get (F_IMPONIBILE)); + TString codiva = m.get (F_CODIVA); + real imposta (m.get (F_IMPOSTA)); + int tipodet = m.get_int (F_TIPODET); + int tipocr = m.get_int (F_TIPOCR); + int gruppo = m.get_int (F_GRUPPO); + int conto = m.get_int (F_CONTO); + long sottoc = m.get_long(F_SOTTOCONTO); + + registra_file_temp_riva(numreg,numrig,imponibile,codiva,imposta,tipodet,tipocr,gruppo,conto,sottoc); + registra_file_trasfer_r_iva(numreg,numrig,imponibile,codiva,imposta,tipodet,tipocr,gruppo,conto,sottoc); + } +} + +void TVar_mov::registra_file_trasfer_t_iva(long nr,const TDate& d74,long cf,const TString& rgo,const TString& io, + const TString& lo,const TString& co,const TString& po) +{ + TString app,str; + TRectype* rec; + rec = new TRectype (LF_RMOVIVA); + + _tiva->setkey(1); + _tiva->zero(); + _tiva->put(RMI_NUMREG, nr); + *rec = _tiva->curr(); + + for (_tiva->read(); !_tiva->eof(); _tiva->next()) + { + if (_tiva->curr() > *rec) break; + + long numrec = _tiva->get_int(RMI_ANNOES); + numrec += _tras_file.start('U'); + + _tras_file.read_rec_trasfer(numrec); //Leggo il record della prima nota + + app = d74.string(); + str = riconverti(app); + _tras_file.put(str,"U1",4,numrec); + str = format("%06d", cf); + _tras_file.put(str,"U1",6,numrec); + str = format("%-25s", (const char*)rgo ); + _tras_file.put(str,"U1",50,numrec); + str = format("%-22s", (const char*)io); + _tras_file.put(str,"U1",51,numrec); + str = format("%-18s", (const char*)lo); + _tras_file.put(str,"U1",52,numrec); + str = format("%05s", (const char*)co ); + _tras_file.put(str,"U1",53,numrec); + str = format("%-2s", (const char*)po); + _tras_file.put(str,"U1",54,numrec); + + _tras_file.write(numrec); + } + + delete rec; +} + +void TVar_mov::registra_file_temp_riva(long nr,int nri,const real& imp,const TString& civa,const real& imposta, + int tdet,int tcr,int g,int c,long s) +{ + _tiva->setkey(1); + _tiva->zero(); + _tiva->put(RMI_NUMREG, nr); + _tiva->put(RMI_NUMRIG, nri); + if (_tiva->read() == NOERR) + { + _tiva->put(RMI_IMPONIBILE, imp); + _tiva->put(RMI_CODIVA, civa); + _tiva->put(RMI_IMPOSTA, imposta); + _tiva->put(RMI_TIPODET, tdet); + _tiva->put(RMI_TIPOCR, tcr); + _tiva->put(RMI_GRUPPO, g); + _tiva->put(RMI_CONTO, c); + _tiva->put(RMI_SOTTOCONTO, s); + + _tiva->rewrite(); + } +} + +void TVar_mov::registra_file_trasfer_r_iva(long nr,int nri,const real& imp,const TString& civa,const real& imposta, + int tdet,int tcr,int g,int c,long s) +{ + TString app,str; + + _tiva->setkey(1); + _tiva->zero(); + _tiva->put(RMI_NUMREG, nr); + _tiva->put(RMI_NUMRIG, nri); + + if (_tiva->read() == NOERR) + { + long numrec = _tiva->get_int(RMI_ANNOES); + numrec += _tras_file.start('U'); + + _tras_file.read_rec_trasfer(numrec); //Leggo il record dell' iva + + str = format("%011s", (const char*) imp.string()); + _tras_file.put(str,"U1",14,numrec); + str = format("%02s", (const char*) civa); + _tras_file.put(str,"U1",13,numrec); + str = format("%09s", (const char*) imposta.string()); + _tras_file.put(str,"U1",15,numrec); + str = format("%d", tdet); + _tras_file.put(str,"U1",16,numrec); + str = format("%d", tcr); + _tras_file.put(str,"U1",17,numrec); + str = format("%02d", g); + _tras_file.put(str,"U1",19,numrec); + str = format("%02d", c); + _tras_file.put(str,"U1",20,numrec); + str = format("%06ld", s); + _tras_file.put(str,"U1",21,numrec); + + _tras_file.write(numrec); + } +} + +bool TVar_mov::leggi_trasfer() +{ + _trasf = _tras_file.path(_dittaric); + _trasf << "\\trasfer"; + + _tras_file.open(_trasf); + + if (_tras_file.exist()) + { + if (_tras_file.read_control_rec()) + _control_rec = _tras_file.record(); + else + return error_box("Rilevati gravi errori negli archivi:procedura interrotta"); + } + else + return error_box("Al momento non presenti trasferimenti attivi sulla ditta selezionata"); + + return TRUE; +} + +bool TVar_mov::esegui_controlli() +{ + TConfig conf(CONFIG_DITTA); + + _std = conf.get("FlStTra"); + + if (!prefix().exist(_dittaric)) + return error_box("Rilevati gravi errori negli archivi: procedura interrotta"); + + if (!leggi_trasfer()) + return FALSE; + + if (!controlli()) + return FALSE; + + return TRUE; +} + +void TVar_mov::setta_parametri_record(const TString& sigla,const TString& flag) +{ + TConfig conf (CONFIG_DITTA); + + conf.set("FlStTra", flag); + + leggi_record_controllo(); + _control_rec.overwrite(sigla,240); + + const int size = 256; + + _tras_file.write_control_rec(_control_rec, size); +} + +bool TVar_mov::controlli() +{ + if (_std == "T") + return error_box("Variazione NON POSSIBILE: eseguire prima la ricezione delle tabelle"); + + if (_std == "M") + return error_box("Variazione NON POSSIBILE: trasferimento movimenti gia' iniziato"); + + if (_std == "*") + { + warning_box("Trasferimento interamente completato: proseguire per cancellare il file"); + fremove(_trasf); + return FALSE; + } + + return TRUE; +} + +bool TVar_mov::menu(MENU_TAG m) +{ + if (m == BAR_ITEM(1)) + return main_loop(); + return FALSE; +} + +int cg2800 (int argc, char* argv[]) +{ + switch (*argv[2]) + { + case 'P': + { + TVar_mov main_app(*argv[2]); + main_app.run(argc, argv,main_app._titolo); + } + break; + case 'I': +{ + TVar_mov main_app(*argv[2]); + main_app.run(argc, argv,main_app._titolo); +} +break; + case 'S': +{ + TDitta_ric a; + a.run(argc, argv,"Scelta ditta per ricezione"); +} +break; + case 'A': +{ + TAnn_mov a; + a.run(argc, argv,"Annullamento movimenti da ricevere"); +} +break; + case 'V': +{ + TVis_ric a; + a.run(argc, argv,"Visualizzazione stato ricezione"); +} +break; +default: +break; +} +//main_app.run(argc, argv,main_app._titolo); +return TRUE; +} diff --git a/cg/cg2900.cpp b/cg/cg2900.cpp index 48e19960f..079fd52c6 100755 --- a/cg/cg2900.cpp +++ b/cg/cg2900.cpp @@ -1,2099 +1,2099 @@ -// Invio contabilita' - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "cg2900.h" -#include "cglib04.h" - -HIDDEN TString80 TEMP; - -HIDDEN int date2esc(const TDate& d, int* prevesc = NULL); - -class TInv_cont : public TApplication -{ - enum { BUFSIZE = 4096 }; - - TTransfer_file _tras_file; - TProgind* _prog; - - TString _control_rec, _trasf, _std, _stato, _marker, _nome_simbolico; - TString _files, _codcaus, _numdoc, _reg, _codpag, _tipodoc, _codcausm; - TString _ocfpi, _ragsococc, _indocc, _capocc, _localocc, _provocc, _codvali; - bool _esiste_ditta, _esiste_record; - long _ditta, _protiva, _uprotiva, _codcf, _numrec, _tot_rec; - long _dim_tot, _dim_disk; - int _num; - TDate _data, _datadoc, _data74ter; - real _corrlire, _cambioi, _corrval; - -public: - virtual bool create(); - virtual bool destroy(); - virtual bool menu(MENU_TAG m); - - bool main_loop(); - - bool esiste_tabella_studio(); - bool record_controllo(); - bool esegui_controlli(); - bool leggi_trasfer(); - bool controlli(); - bool sub_controlli(); - bool tabella_ditta(); - bool controlla_stato_invio(); - bool numero_data(); - void leggi_record_controllo(); - void codifica_ditta (TMask& m); - bool testata_mov_PN (long numreg); - bool testata_mov_IVA(long numreg); - void cerca_occasionale(); - void cerca_comune_occas(const TString& com); - - void crea_marker(TMask& m); - void setta_parametri_record(TMask& m,const TString& flag); - void setta_tabella_studio(TMask& m, bool flag_ditta = TRUE); - void setta_tabella_ditta(TMask& m, const char* flag, bool comp = TRUE); - void crea_record_controllo(TMask& m); - - bool invio_contabilita(TMask& m); - bool invio_tab_cau(TString& key,TMask& m); - bool invio_clifo (TString& key,TMask& m); - bool invio_pcon (TString& key,TMask& m); - bool invio_mov_PN (TString& key,TMask& m); - bool invio_mov_IVA(TString& key,TMask& m); - - void aggiorna_marker(TString& token, int pos); - void calcola_totale_record(); - - const char* converti (TString& data_AS400); - const char* riconverti (TString& data_PC); - const char* cerca_provincia(const TString& comcf); - - static bool setta_maschera_hnd(TMask_field& f, KEY k); - - int calcola_numero_dischi(TMask& m); - FILE* chiedi_disco(const char* name, int disk, char floppy, bool lettura); - long determina_dimensione(FILE* f); - bool scrivi_disco(char floppy, int disk, const char* work, FILE* i, TProgind& w); - - TInv_cont() {}; -}; - -HIDDEN TInv_cont& app() { return (TInv_cont &) main_app(); } - -FILE* TInv_cont::chiedi_disco(const char* name, int disk, char floppy, bool lettura) -{ - message_box("Inserire il disco %d nel drive %c:", disk, floppy); - - // name.ext(format("%03d", disk)); - - FILE* f = NULL; - bool retry = TRUE; - while (retry) - { - f = fopen(name, lettura ? "rb" : "wb"); - if (f == NULL) - retry = yesno_box("Il file %s non e' accessibile: riprovare?", (const char*)name); - else - { - retry = FALSE; - fclose(f); - } - } - - return f; -} - -long TInv_cont::determina_dimensione(FILE* f) -{ - CHECK(f, "Can't measure NULL file"); - fseek(f, 0, SEEK_END); - const long s = ftell(f); - fseek(f, 0, SEEK_SET); - return s; -} - -bool TInv_cont::scrivi_disco(char floppy, int disk, const char* work, - FILE* i, TProgind& w) -{ - // const TFilename from(filename); // File da splittare - - // TFilename work; - // work << floppy << ":/" << from.name(); // File su dischetto - - chiedi_disco(work, disk, floppy, FALSE); - - TString str; - str.format("%02d", disk); - aggiorna_marker(str,31); // Aggiorna il num. progr. disco su marker - - TString path_m; - path_m << floppy << ":\\marker"; - - TString path_t; - path_t << floppy << ":\\trasfer"; - - fcopy(_marker,path_m); // Copia il marker su disco - - //FILE* i = fopen(from, "rb"); - FILE* o = fopen(path_t, "wb"); - - //if (i == NULL) return error_box("Impossibile aprire il file '%s'", from); - - //TProgind w(_dim_disk, "Trasferimento su dischetti in corso... Prego attendere", TRUE, TRUE, 40); - - TString buffer(BUFSIZE); - - long tot_scritti = BUFSIZE; - - while (tot_scritti <= _dim_disk) - { - const word letti = fread((char*)(const char*)buffer, 1, BUFSIZE, i); - - long scritti = fwrite((char*)(const char*)buffer, letti, 1, o); - - tot_scritti += letti; - - if (letti < BUFSIZE) break; - - w.addstatus(letti); - } - - //fclose(i); - fclose(o); - - return TRUE; -} - -bool TInv_cont::main_loop() -{ - TString str; - bool ripartenza = FALSE; - - if (!esiste_tabella_studio()) return FALSE; - - if (!esegui_controlli()) return FALSE; - - TMask msk ("cg2900a"); - KEY tasto; - - if (_ditta != 0) - { - msk.set(F_DITTAINV, _ditta); - msk.disable(F_DITTAINV); - codifica_ditta(msk); - msk.set(F_NUMULINV, _num); - msk.set(F_DATAULIN, _data.string()); - msk.set(F_STATO, _stato); - - TString uselab = _tras_file.ult_file(); - TString chiave = _tras_file.key(); - msk.set(F_USELAB, uselab); - msk.set(F_CHIAVE, chiave); - msk.set(F_DATALIM, _data.string()); - msk.disable(F_DATALIM); - - ripartenza = TRUE; - } - - msk.disable(F_NUMULINV); - msk.disable(F_DATAULIN); - msk.disable(F_STATO); - msk.disable(F_USELAB); - msk.disable(F_CHIAVE); - - if (!ripartenza) - msk.set_handler(F_DITTAINV, setta_maschera_hnd); - - tasto = msk.run(); - - if (tasto != K_ENTER) return FALSE; - - if (!ripartenza) - { - crea_marker(msk); //Crea il record con le informazioni sul marker - setta_parametri_record(msk,"F"); //Aggiorna parametri contabili ditta - setta_tabella_studio(msk); //Aggiorna la tabella studio per invio - setta_tabella_ditta(msk,"F"); //Aggiorna la tabella ditta per invio - crea_record_controllo(msk); //Crea il record di controllo sul file trasfer - } - - if (!invio_contabilita(msk)) - return FALSE; - - calcola_totale_record(); - str.format("%06ld", _tot_rec); - aggiorna_marker(str,23); - - TMask mask ("cg2900b"); - KEY k; - - k = mask.run(); - - if (k == K_ENTER) - { - int num_disk = calcola_numero_dischi(mask); - char floppy = mask.get(F_FLOPPY)[0]; - - str.format("%02d", num_disk); - aggiorna_marker(str,29); - - const TFilename from(_trasf); // File da splittare - - TFilename work; - work << floppy << ":/" << from.name(); // File su dischetto - - FILE* i = fopen(from, "rb"); - - if (i == NULL) return error_box("Impossibile aprire il file '%s'", from); - - TProgind w(_dim_tot, "Trasferimento su dischetti in corso... Prego attendere", TRUE, TRUE, 60); - - for (int j = 0; j < num_disk; j++) - { - scrivi_disco(floppy,j+1,work,i,w); - } - fclose(i); - - setta_tabella_studio(msk,FALSE); //Aggiorna la tabella studio per invio - setta_tabella_ditta(msk," ",FALSE); //Aggiorna la tabella ditta per invio - setta_parametri_record(msk," "); //Aggiorna parametri contabili ditta - - _tras_file.open(_trasf); - leggi_record_controllo(); - TString record(256); - record.format("%-256s",(const char*) record); - _control_rec.overwrite(record,0); - _tras_file.write_control_rec(_control_rec,256); - - fremove(_marker); - fremove(_trasf); - } - - return FALSE; -} - -int TInv_cont::calcola_numero_dischi(TMask& msk) -{ - int numdisc = 0; - - FILE* t = fopen(_trasf, "rb"); - if (t == NULL) return error_box("Impossibile aprire il file '%s'", _trasf); - - long dim_t = determina_dimensione(t); //Determina la dimensione del trasfer - fclose(t); - - FILE* m = fopen(_marker, "rb"); - if (m == NULL) return error_box("Impossibile aprire il file '%s'", _marker); - - long dim_m = determina_dimensione(m); // Determina la dimensione del marker - fclose(m); - - _dim_tot = dim_t + dim_m; // Determina la dimensione totale - - int item = msk.get_int(F_DIM); - - switch (item) - { - case 1 : - _dim_disk = 1400000; - break; - case 2 : - _dim_disk = 1200000; - break; - case 3 : - _dim_disk = 720000; - break; - case 4 : - _dim_disk = 360000; - break; - default : - break; - }; - - if (_dim_tot < _dim_disk) - numdisc = 1; - else - { - //double dischi = _dim_tot / _dim_disk; - //numdisc = (int)ceil(dischi); - numdisc = _dim_tot / _dim_disk; - if ( (_dim_tot % _dim_disk) != 0) - numdisc += 1; - } - - return numdisc; -} - -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; -} - -bool TInv_cont::create() -{ - TApplication::create(); - - dispatch_e_menu (BAR_ITEM(1)); - - return TRUE; -} - -bool TInv_cont::destroy() -{ - return TApplication::destroy(); -} - -void TInv_cont::leggi_record_controllo() -{ - _tras_file.read_control_rec(); - _control_rec = _tras_file.record(); -} - -const char* TInv_cont::converti (TString& data_AS400) -{ - TEMP = data_AS400.mid(4,2); - TEMP << "-" <addstatus(1); - _tras_file.open(_trasf); - - record.spaces(); - - // Se trovo un codice causale alfanumerico l'invio deve essere interrotto - const char* codcau = cau.get(CAU_CODCAUS); - if (!real::is_natural(codcau)) - return error_box("Rilevato un codice causale alfanumerico nella causale %03s: impossibile proseguire",codcau); - str.format("%03s", codcau); - record.overwrite("W1",0); //Tipo record - record.overwrite(str,2); //Codice causale - - - //Salvataggio della sigla e della chiave sul record di controllo del file trasfer - leggi_record_controllo(); - TString chiave,app; - chiave.format("%2s%03s", (const char*) "W1", codcau); - app.format("%-15s", (const char*) chiave); - _control_rec.overwrite("W",240); - _control_rec.overwrite(app,241); - //_tras_file.write_control_rec(_control_rec,size); - //_tras_file.close(); - - TString descr = cau.get(CAU_DESCR); - descr.format("%-.20s", (const char*) descr); - record.overwrite(descr,15); //Descrizione - - TString tipodoc = cau.get(CAU_TIPODOC); - record.overwrite(tipodoc,35); //Tipo documento - - //Se trovo un registro IVA con lunghezza maggiore di 1 l'invio deve essere interrotto - TString reg = cau.get(CAU_REG); - if (reg.len() > 1) - return error_box("Rilevato un registro IVA con lunghezza superiore a 1 nella causale %03s: impossibile proseguire", codcau); - record.overwrite(reg,37); //Registro IVA - - bool alleg = cau.get_bool(CAU_ALLEG); - if (alleg) - record.overwrite("X",38); - else //Flag esclusione tipo documento da allegato - record.overwrite(" ",38); - - int m770 = atoi(cau.get(CAU_M770)); - str = format("%1d", m770); - record.overwrite(str,39); //Collegamento modello 770 - - TString cespiti = cau.get(CAU_COLLCESP); - record.overwrite(cespiti,40); //Collegamento cespiti - - bool numdoc = cau.get_bool(CAU_NUMDOC); - if (numdoc) - record.overwrite("1",206); - else //Flag immissione numero documento - record.overwrite("0",206); - - bool datadoc = cau.get_bool(CAU_DATADOC); - if (datadoc) - record.overwrite("1",207); - else //Flag immissione data documento - record.overwrite("0",207); - - const char* codcausim = cau.get(CAU_CODCAUSIM); - if (!real::is_natural(codcausim)) - return error_box("Rilevato un codice causale per incasso immediato alfanumerico nella causale %03s: impossibile proseguire",codcau); - str.format("%03s", codcausim); - record.overwrite(str,209); //Codice causale per incasso immediato - - bool intracom = cau.get_bool(CAU_INTRACOM); - if (intracom) - record.overwrite("X",246); - else //Flag per operazioni intracomunitarie - record.overwrite(" ",246); - - bool valintra = cau.get_bool(CAU_VALINTRA); - if (valintra) - record.overwrite("X",247); - else //Gestione valuta per oper. intracomunitarie - record.overwrite(" ",247); - - bool ritfatt = cau.get_bool(CAU_RITFATT); - if (ritfatt) - record.overwrite("X",248); - else //Flag causale per fattura ricevuta in ritardo - record.overwrite(" ",248); - - bool autofatt = cau.get_bool(CAU_AUTOFATT); - if (autofatt) - record.overwrite("X",249); - else //Autofattura art.34 - record.overwrite(" ",249); - - int num = 0; - int pos_gcs = 41; - int pos_sez = 191; - _codcaus = cau.get(CAU_CODCAUS); - - TLocalisamfile rcau (LF_RCAUSALI); - - do - { - num++; - - rcau.setkey(1); - rcau.zero(); - rcau.put(RCA_CODCAUS, _codcaus); - rcau.put(RCA_NRIGA, num); - - if (rcau.read() == NOERR) - { - int g = rcau.get_int (RCA_GRUPPO); - int c = rcau.get_int (RCA_CONTO); - - if (g > 99) - return error_box("Rilevato un gruppo composto da 3 cifre nella causale %03s riga %d: impossibile proseguire",codcau,num); - - if (c > 99) - return error_box("Rilevato un conto composto da 3 cifre nella causale %03s riga %d: impossibile proseguire",codcau,num); - - long s = rcau.get_long(RCA_SOTTOCONTO); - TString sez = rcau.get (RCA_SEZIONE); - - str = format("%02d", g); - record.overwrite(str,pos_gcs); //Gruppo - pos_gcs += 2; - str = format("%02d", c); - record.overwrite(str,pos_gcs); //Conto - pos_gcs += 2; - str = format("%06ld", s); - record.overwrite(str,pos_gcs); //Sottoconto - pos_gcs += 6; - - record.overwrite(sez,pos_sez); //Sezione - pos_sez++; - } - else - { - int g = 0; - int c = 0; - long s = 0; - TString sez = " "; - - str = format("%02d", g); - record.overwrite(str,pos_gcs); //Gruppo - pos_gcs += 2; - str = format("%02d", c); - record.overwrite(str,pos_gcs); //Conto - pos_gcs += 2; - str = format("%06ld", s); - record.overwrite(str,pos_gcs); //Sottoconto - pos_gcs += 6; - - record.overwrite(sez,pos_sez); //Sezione - pos_sez++; - } - - if (num == 15) - { - TString cau_app; - - rcau.next(); - if (!rcau.eof()) - cau_app = rcau.get(RCA_CODCAUS); - else - cau_app = ""; - - if (_codcaus == cau_app) - return error_box("Rilevata una causale con piu' di 15 righe: impossibile proseguire"); - } - } - while (num < 15); - - _numrec++; - TString stringa; - stringa.format("%06ld", _numrec); - int posiz = _files.find("W"); - _control_rec.overwrite(stringa,((posiz * 6) + 47)); - _tras_file.write_control_rec(_control_rec,size); - _tras_file.close(); - - _tras_file.open(_trasf,TRUE); - _tras_file.write_control_rec(record,size); - _tras_file.close(); - } - delete _prog; - - //Inizializzo l'ultima sigla file elaborato su trasfer con la sigla del file successivo da inviare - //e inizializzo la chiave, altrimenti se si blocca l'invio subito dopo aver finito un file si rischia di - //ritrasferire l'ultimo record quando si riparte; inoltre non si riesce a inviare il file successivo perche' - //la chiave e' compilata con i dati del file precedente. - _tras_file.open(_trasf); - leggi_record_controllo(); - TString chiave,app,sigla; - app.format("%-15s", (const char*) chiave); - char sigla_p = _tras_file.ult_file()[0]; - int posiz = _files.find(sigla_p); - TString nuova_sigla = " "; - if (posiz < _files.len()) - nuova_sigla = _files.mid(posiz+1,1); - - _control_rec.overwrite(nuova_sigla,240); - _control_rec.overwrite(app,241); - _tras_file.write_control_rec(_control_rec,size); - _tras_file.close(); - - setta_tabella_ditta(m,"D",FALSE); - setta_parametri_record(m,"D"); - - return TRUE; -} - -bool TInv_cont::invio_clifo(TString& key,TMask& m) -{ - int size = 256; - TString record(size); - char tipocf; - long codcf; - TLocalisamfile clifo (LF_CLIFO); - - long cicli = clifo.items(); - cicli -= _numrec; - _prog = new TProgind(cicli,"Invio anagrafica Clienti / Fornitori in corso... Prego attendere.",FALSE); - - if (key == "") - clifo.first(); - else - { - tipocf = (key.mid(2,1))[0]; - codcf = atol(key.mid(3,6)); - clifo.setkey(1); - clifo.zero(); - clifo.put(CLI_TIPOCF, tipocf); - clifo.put(CLI_CODCF, codcf); - clifo.read(); - } - - for (; !clifo.eof(); clifo.next()) - { - TString str; - - _prog->addstatus(1); - _tras_file.open(_trasf); - - record.spaces(); - - // Il tipocf su PC e' C = cliente F = fornitore. - // Il tipocf su AS400 e' 1 = cliente 2 = fornitore. - TString tipo_cod; - - char tipo = clifo.get_char(CLI_TIPOCF); - if (tipo == 'C') - tipo_cod = "1"; - else - if (tipo == 'F') - tipo_cod = "2"; - - record.overwrite("A1",0); //Tipo record - record.overwrite(tipo_cod,2); //Tipo cliente/fornitore - - long codice = clifo.get_long(CLI_CODCF); - str.format("%06ld", codice); - record.overwrite(str,3); //Codice cliente/fornitore - - //Salvataggio della chiave sul record di controllo del file trasfer - leggi_record_controllo(); - TString chiave,app; - chiave.format("%2s%s%06ld", (const char*) "A1", (const char*) tipo_cod, codice); - app.format("%-15s", (const char*) chiave); - _control_rec.overwrite("A",240); - _control_rec.overwrite(app,241); - // _tras_file.write_control_rec(_control_rec,size); - // _tras_file.close(); - - //Il tipo persona su PC e' F = fisica G = giuridica - //Il tipo persona su AS400 e' 0 = giuridica 1 = fisica - char tipop = clifo.get_char(CLI_TIPOPERS); - TString tipopers; - - if (tipop == 'F') - tipopers = "1"; - else - if (tipop == 'G') - tipopers = "0"; - - record.overwrite(tipopers,15); //Tipo persona - - TString ragsoc = clifo.get(CLI_RAGSOC); - TString cognome = ragsoc.mid(0,30); - TString nome = ragsoc.mid(30,20); - str.format("%-30s", (const char*) cognome); //Cognome o I ragione sociale - record.overwrite(str,16); - str.format("%-20s", (const char*) nome); - record.overwrite(str,46); //Nome o II ragione sociale - - //Se la partita IVA e' maggiore di 11 il programma di invio viene fermato - TString paiv = clifo.get(CLI_PAIV); - if (paiv.len() > 11) - return error_box("Rilevata partita IVA con piu' di 11 caratteri in codice %c%d: impossibile proseguire",tipo,codice); - str.format("%-11s", (const char*) paiv); - record.overwrite(str,66); //Partita IVA - - TString cofi = clifo.get(CLI_COFI); - str.format("%-16s", (const char*) cofi); - record.overwrite(str,77); //Codice fiscale - - TString indcf = clifo.get(CLI_INDCF); - str.format("%-35s", (const char*) indcf); - record.overwrite(str,93); //Indirizzo - - TString capcf = clifo.get(CLI_CAPCF); - record.overwrite(capcf,128); //Codice di avviamento postale - - TString localita = clifo.get(CLI_LOCCF); - str.format("%-.20s", (const char*) localita); - record.overwrite(str,133); //Localita' - - TString comcf = clifo.get(CLI_COMCF); - TString provincia = cerca_provincia(comcf); - str.format("%-2s", (const char*) provincia); - record.overwrite(str,153); //Provincia - - TString ptel = clifo.get(CLI_PTEL); - TString tel = clifo.get(CLI_TEL); - TString appoggio; - appoggio << ptel << " " << tel; - if (appoggio.len() > 12) - warning_box("Rilevato numero telefonico troppo lungo in codice %c%d: impossibile inviare",tipo,codice); - else //Numero telefono - record.overwrite(appoggio,155); - - TString alleg = clifo.get(CLI_ALLEG); - record.overwrite(alleg,167); //Flag gestione allegato - - int gruppo = clifo.get_int(CLI_GRUPPORIC); - int conto = clifo.get_int(CLI_CONTORIC); - - if (gruppo > 99) - return error_box("Rilevato gruppo costo/ricavo composto da 3 cifre in codice %c%d: impossibile proseguire",tipo,codice); - - if (conto > 99) - return error_box("Rilevato conto costo/ricavo composto da 3 cifre in codice %c%d: impossibile proseguire",tipo,codice); - - long sottoc = clifo.get_long(CLI_SOTTOCRIC); - str.format("%02d", gruppo); - record.overwrite(str,168); //Gruppo di costo/ricavo - str.format("%02d", conto); - record.overwrite(str,170); //Conto di costo/ricavo - str.format("%06ld", sottoc); - record.overwrite(str,172); //sottoconto di costo/ricavo - - long codalleg = clifo.get_long(CLI_CODALLEG); - str.format("%06ld", codalleg); - record.overwrite(str,179); - - //Se il codice di pagamento e' superiore alle 2 cifre l'invio deve essere interrotto - TString codpag = clifo.get(CLI_CODPAG); - if (codpag.len() > 2) - return error_box("Rilevato un codice di pagamento composto da 3 o piu' cifre in codice %c%d: impossibile proseguire",tipo,codice); - - str.format("%-2s", (const char*) codpag); - - _numrec++; - TString stringa; - stringa.format("%06ld", _numrec); - int posiz = _files.find("A"); - _control_rec.overwrite(stringa,((posiz * 6) + 47)); - _tras_file.write_control_rec(_control_rec,size); - _tras_file.close(); - - _tras_file.open(_trasf,TRUE); - _tras_file.write_control_rec(record,size); - _tras_file.close(); - } - delete _prog; - - //Inizializzo l'ultima sigla file elaborato su trasfer con la sigla del file successivo da inviare - //e inizializzo la chiave, altrimenti se si blocca l'invio subito dopo aver finito un file si rischia di - //ritrasferire l'ultimo record quando si riparte; inoltre non si riesce a inviare il file successivo perche' - //la chiave e' compilata con i dati del file precedente. - _tras_file.open(_trasf); - leggi_record_controllo(); - TString chiave,app,sigla; - app.format("%-15s", (const char*) chiave); - char sigla_p = _tras_file.ult_file()[0]; - int posiz = _files.find(sigla_p); - TString nuova_sigla = " "; - if (posiz < _files.len()) - nuova_sigla = _files.mid(posiz+1,1); - - _control_rec.overwrite(nuova_sigla,240); - _control_rec.overwrite(app,241); - _tras_file.write_control_rec(_control_rec,size); - _tras_file.close(); - - setta_tabella_ditta(m,"D",FALSE); - setta_parametri_record(m,"D"); - - return TRUE; -} - -bool TInv_cont::invio_pcon(TString& key,TMask& m) -{ - int size = 256; - TString record(size); - int gruppo,conto; - long sottoc; - TLocalisamfile pcon (LF_PCON); - - long cicli = pcon.items(); - cicli -= _numrec; - _prog = new TProgind(cicli,"Invio anagrafica Piano dei Conti in corso... Prego attendere.",FALSE); - - if (key == "") - pcon.first(); - else - { - gruppo = atoi(key.mid(2,2)); - conto = atoi(key.mid(4,2)); - sottoc = atol(key.mid(6,6)); - pcon.setkey(1); - pcon.zero(); - pcon.put(PCN_GRUPPO, gruppo); - pcon.put(PCN_CONTO, conto); - pcon.put(PCN_SOTTOCONTO, sottoc); - pcon.read(); - } - - for (; !pcon.eof(); pcon.next()) - { - TString str; - - _prog->addstatus(1); - _tras_file.open(_trasf); - - record.spaces(); - - int g = pcon.get_int (PCN_GRUPPO); - - if (g > 99) - return error_box("Rilevato un gruppo composto da 3 cifre in %03d: impossibile proseguire",g); - - int c = pcon.get_int (PCN_CONTO); - - if (c > 99) - return error_box("Rilevato un conto composto da 3 cifre in %03d: impossibile proseguire",c); - - long s = pcon.get_long(PCN_SOTTOCONTO); - - // Se si tratta di un GRUPPO - - if (g != 0 && c == 0 && s == 0) - { - //Salvataggio della sigla e della chiave sul record di controllo del file trasfer - leggi_record_controllo(); - TString chiave,app; - chiave.format("%2s%02d%02d%06ld", (const char*) "P1", g, c, s); - app.format("%-15s", (const char*) chiave); - _control_rec.overwrite("P",240); - _control_rec.overwrite(app,241); - // _tras_file.write_control_rec(_control_rec,size); - // _tras_file.close(); - - record.overwrite("P1",0); //Tipo record - str.format("%02d", g); - record.overwrite(str,2); //Gruppo - - TString descr (pcon.get(PCN_DESCR)); - str.format("%-.30s", (const char*) descr); - record.overwrite(str,15); //Descrizione gruppo - } - - // Se si tratta di un CONTO - - if (g != 0 && c != 0 && s == 0) - { - //Salvataggio della sigla e della chiave sul record di controllo del file trasfer - leggi_record_controllo(); - TString chiave,app; - chiave.format("%2s%02d%02d%06ld", (const char*) "P2", g, c, s); - app.format("%-15s", (const char*) chiave); - _control_rec.overwrite("P",240); - _control_rec.overwrite(app,241); - // _tras_file.write_control_rec(_control_rec,size); - // _tras_file.close(); - - record.overwrite("P2",0); //Tipo record - str.format("%02d", g); - record.overwrite(str,2); //Gruppo - - str.format("%02d", c); - record.overwrite(str,4); //Conto - - TString descr (pcon.get(PCN_DESCR)); - str.format("%-.30s", (const char*) descr); - record.overwrite(str,15); //Descrizione conto - - int indbil = pcon.get_int(PCN_INDBIL); - str.format("%d", indbil); - record.overwrite(str,45); //Indicatore di bilancio - - TString tmcf = pcon.get(PCN_TMCF); - record.overwrite(tmcf,46); //Flag conto cliente/fornitore - - bool stsottbil = pcon.get_bool(PCN_STSOTTBIL); - if (stsottbil) - str = "0"; - else - str = "1"; - record.overwrite(str,47); //Flag stampa dettaglio sottoconti su bilancio - - // Classe IV direttiva CEE - - TString sez = pcon.get(PCN_SEZIVD); - if (sez == "0") - sez = " "; - record.overwrite(sez,48); //Sezione IV dir - - TString let = pcon.get(PCN_LETTIVD); - record.overwrite(let,49); //Lettera IV dir - - int numrom = atoi(pcon.get(PCN_NUMRIVD)); - str.format("%03d", numrom); - record.overwrite(str,60); //Numero arabo corrispondente al numero romano - TString numr = itor(numrom); - str.format("%-8s", (const char*) numr); - record.overwrite(str,50); //Numero romano IV dir - - int num = pcon.get_int(PCN_NUMIVD); - str.format("%02d", num); - record.overwrite(str,58); //Numero arabo IV dir - - // Classe IV direttiva CEE di segno opposto - - TString sezop = pcon.get(PCN_SEZIVDOPP); - if (sezop == "0") - sezop = " "; - record.overwrite(sezop,63); //Sezione IV dir - - TString letop = pcon.get(PCN_LETTIVDOPP); - record.overwrite(letop,64); //Lettera IV dir - - int numromop = atoi(pcon.get(PCN_NUMRIVDOPP)); - str.format("%03d", numromop); - record.overwrite(str,75); //Numero arabo corrispondente al numero romano - TString numrop = itor(numromop); - str.format("%-8s", (const char*) numrop); - record.overwrite(str,65); //Numero romano IV dir - - int numop = pcon.get_int(PCN_NUMIVDOPP); - str.format("%02d", numop); - record.overwrite(str,73); //Numero arabo IV dir - } - - // Se si tratta di un SOTTOCONTO - - if (g != 0 && c != 0 && s != 0) - { - //Salvataggio della sigla e della chiave sul record di controllo del file trasfer - leggi_record_controllo(); - TString chiave,app; - chiave.format("%2s%02d%02d%06ld", (const char*) "P3", g, c, s); - app.format("%-15s", (const char*) chiave); - _control_rec.overwrite("P",240); - _control_rec.overwrite(app,241); - // _tras_file.write_control_rec(_control_rec,size); - // _tras_file.close(); - - record.overwrite("P3",0); //Tipo record - str.format("%02d", g); - record.overwrite(str,2); //Gruppo - - str.format("%02d", c); - record.overwrite(str,4); //Conto - - str.format("%06ld", s); - record.overwrite(str,6); - - TString descr (pcon.get(PCN_DESCR)); - str.format("%-.30s", (const char*) descr); - record.overwrite(str,15); //Descrizione sottoconto - - int tipospric = pcon.get_int(PCN_TIPOSPRIC); - str.format("%d", tipospric); - record.overwrite(str,45); //Tipo costo/ricavo - - int ricser = pcon.get_int(PCN_RICSER); - if (ricser == 0) - str = " "; - else - str.format("%d", ricser); - record.overwrite(str,46); //Tipo attivita' - - // Classe IV direttiva CEE - - TString sez = pcon.get(PCN_SEZIVD); - if (sez == "0") - sez = " "; - record.overwrite(sez,47); //Sezione IV dir - - TString let = pcon.get(PCN_LETTIVD); - record.overwrite(let,48); //Lettera IV dir - - int numrom = atoi(pcon.get(PCN_NUMRIVD)); - str.format("%03d", numrom); - record.overwrite(str,59); //Numero arabo corrispondente al numero romano - TString numr = itor(numrom); - str.format("%-8s", (const char*) numr); - record.overwrite(str,49); //Numero romano IV dir - - int num = pcon.get_int(PCN_NUMIVD); - str.format("%02d", num); - record.overwrite(str,57); //Numero arabo IV dir - - // Classe IV direttiva CEE di segno opposto - - TString sezop = pcon.get(PCN_SEZIVDOPP); - if (sezop == "0") - sezop = " "; - record.overwrite(sezop,62); //Sezione IV dir - - TString letop = pcon.get(PCN_LETTIVDOPP); - record.overwrite(letop,63); //Lettera IV dir - - int numromop = atoi(pcon.get(PCN_NUMRIVDOPP)); - str.format("%03d", numromop); - record.overwrite(str,74); //Numero arabo corrispondente al numero romano - TString numrop = itor(numromop); - str.format("%-8s", (const char*) numrop); - record.overwrite(str,64); //Numero romano IV dir - - int numop = pcon.get_int(PCN_NUMIVDOPP); - str.format("%02d", numop); - record.overwrite(str,72); //Numero arabo IV dir - } - - _numrec++; - TString stringa; - stringa.format("%06ld", _numrec); - int posiz = _files.find("P"); - _control_rec.overwrite(stringa,((posiz * 6) + 47)); - _tras_file.write_control_rec(_control_rec,size); - _tras_file.close(); - - _tras_file.open(_trasf,TRUE); - _tras_file.write_control_rec(record,size); - _tras_file.close(); - } - delete _prog; - - //Inizializzo l'ultima sigla file elaborato su trasfer con la sigla del file successivo da inviare - //e inizializzo la chiave, altrimenti se si blocca l'invio subito dopo aver finito un file si rischia di - //ritrasferire l'ultimo record quando si riparte; inoltre non si riesce a inviare il file successivo perche' - //la chiave e' compilata con i dati del file precedente. - _tras_file.open(_trasf); - leggi_record_controllo(); - TString chiave,app,sigla; - app.format("%-15s", (const char*) chiave); - char sigla_p = _tras_file.ult_file()[0]; - int posiz = _files.find(sigla_p); - TString nuova_sigla = " "; - if (posiz < _files.len()) - nuova_sigla = _files.mid(posiz+1,1); - - _control_rec.overwrite(nuova_sigla,240); - _control_rec.overwrite(app,241); - _tras_file.write_control_rec(_control_rec,size); - _tras_file.close(); - - setta_tabella_ditta(m,"D",FALSE); - setta_parametri_record(m,"D"); - - return TRUE; -} - -bool TInv_cont::testata_mov_PN(long numreg) -{ - TLocalisamfile mov (LF_MOV); - - mov.setkey(1); - mov.zero(); - mov.put(MOV_NUMREG, numreg); - if (mov.read() == NOERR) - { - _datadoc = mov.get_date(MOV_DATADOC); - _numdoc = mov.get (MOV_NUMDOC); - _reg = mov.get (MOV_REG); - _codcausm = mov.get (MOV_CODCAUS); - _codpag = mov.get (MOV_CODPAG); - _tipodoc = mov.get (MOV_TIPODOC); - _protiva = mov.get_long(MOV_PROTIVA); - _uprotiva = mov.get_long(MOV_UPROTIVA); - } - else - return FALSE; - - return TRUE; -} - -bool TInv_cont::invio_mov_PN(TString& key,TMask& m) -{ - int size = 256; - TString record(size); - long numreg,nreg_p; - int numrig; - TLocalisamfile rmov (LF_RMOV); - - nreg_p = -1; - - long cicli = rmov.items(); - cicli -= _numrec; - _prog = new TProgind(cicli,"Invio Movimenti di primanota in corso... Prego attendere.",FALSE); - - if (key == "") - rmov.first(); - else - { - numreg = atol(key.mid(2,6)); - numrig = atoi(key.mid(8,2)); - rmov.setkey(1); - rmov.zero(); - rmov.put(RMV_NUMREG, numreg); - rmov.put(RMV_NUMRIG, numrig); - rmov.read(); - } - - for (; !rmov.eof(); rmov.next()) - { - TString str; - - _prog->addstatus(1); - _tras_file.open(_trasf); - - record.spaces(); - - long nreg = rmov.get_long(RMV_NUMREG); - int nrig = rmov.get_int (RMV_NUMRIG); - - //Salvataggio della chiave sul record di controllo del file trasfer - leggi_record_controllo(); - TString chiave,app; - chiave.format("%2s%06ld%02d", (const char*) "Z1", nreg, nrig); - app.format("%-15s", (const char*) chiave); - _control_rec.overwrite("Z",240); - _control_rec.overwrite(app,241); - // _tras_file.write_control_rec(_control_rec,size); - // _tras_file.close(); - - if (nreg > 999999) - return error_box("Rilevato un numero di registrazione composto da 7 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); - - if (nrig > 99) - return error_box("Rilevato un numero di riga composto da 3 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); - - record.overwrite("Z1",0); //Tipo record - - str.format("%06ld", nreg); - record.overwrite(str,2); //Numero di registrazione - - str.format("%02d", nrig); - record.overwrite(str,8); //Numero di riga - - if (nreg != nreg_p) - if (!testata_mov_PN(nreg)) - return error_box("Rilevata riga mancante di testata: impossibile proseguire"); - - nreg_p = nreg; - - TDate datareg (rmov.get(RMV_DATAREG)); - TString dataregstr = datareg.string(); - str = riconverti(dataregstr); - record.overwrite(str,15); //Data di registrazione - - //Determino il segnalino della competenza - int segnalino; - - int annoes = rmov.get_int(RMV_ANNOES); - int anno = date2esc(datareg); - if (annoes == anno) - segnalino = 0; - else - segnalino = 1; - str.format("%d", segnalino); - record.overwrite(str,21); //Segnalino della competenza - - TString datadocstr = _datadoc.string(); - str = riconverti(datadocstr); - record.overwrite(str,22); //Data documento - - str.format("%-7s", (const char*) _numdoc); - record.overwrite(str,28); - - if (_reg.len() > 1) - return error_box("Rilevato un codice registro IVA composto da 2 o piu' cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); - record.overwrite(_reg,35); //Codice registro IVA - - str.format("%05d", _protiva); - record.overwrite(str,36); //Numero protocollo IVA - - // Se trovo un codice causale alfanumerico l'invio deve essere interrotto - const char* cod_causm = (const char*)_codcausm; - if (_codcausm != "") - if (!real::is_natural(cod_causm)) - return error_box("Rilevato un codice causale alfanumerico in %07ld riga %03d: impossibile proseguire",nreg,nrig); - str.format("%03s", (const char*)_codcausm); - record.overwrite(str,41); //Codice causale - - TString descr = rmov.get(RMV_DESCR); - str.format("%-.30s", (const char*) descr); - record.overwrite(str,44); //Descrizione riga di movimento - - int gruppo = rmov.get_int(RMV_GRUPPO); - if (gruppo > 99) - return error_box("Rilevato un gruppo di partita composto da 3 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); - str.format("%02d", gruppo); - record.overwrite(str,74); //Gruppo di partita - - int conto = rmov.get_int(RMV_CONTO); - if (conto > 99) - return error_box("Rilevato un conto di partita composto da 3 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); - str.format("%02d", conto); - record.overwrite(str,76); //Conto di partita - - long sottoc = rmov.get_long(RMV_SOTTOCONTO); - str.format("%06ld", sottoc); - record.overwrite(str,78); //Sottoconto di partita - - TString sez = rmov.get(RMV_SEZIONE); - str.format("%s", (const char*) sez); - record.overwrite(str,84); //Sezione importo - - int gruppoc = rmov.get_int(RMV_GRUPPOC); - if (gruppoc > 99) - return error_box("Rilevato un gruppo di contropartita composto da 3 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); - str.format("%02d", gruppoc); - record.overwrite(str,85); //Gruppo di contropartita - - int contoc = rmov.get_int(RMV_CONTOC); - if (contoc > 99) - return error_box("Rilevato un conto di contropartita composto da 3 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); - str.format("%02d", contoc); - record.overwrite(str,87); //Conto di contropartita - - long sottocc = rmov.get_long(RMV_SOTTOCONTOC); - str.format("%06ld", sottocc); - record.overwrite(str,89); //Sottoconto di contropartita - - if (_codpag.len() > 2) - return error_box("Rilevato un codice di pagamento composto da 3 o piu' cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); - str.format("%-2s", (const char*) _codpag); - record.overwrite(str,95); //Codice di pagamento - - real importo (rmov.get_real(RMV_IMPORTO)); - str.format("%011s", (const char*) importo.string()); - record.overwrite(str,97); //Importo riga di movimento - - str.format("%05d", _uprotiva); - record.overwrite(str,108); //Ultimo numero di protocollo IVA - - TString tipoc = rmov.get(RMV_TIPOC); - record.overwrite(tipoc,219); //Flag cliente/fornitore - - record.overwrite(_tipodoc,220); //Tipo documento - - _numrec++; - TString stringa; - stringa.format("%06ld", _numrec); - int posiz = _files.find("Z"); - _control_rec.overwrite(stringa,((posiz * 6) + 47)); - _tras_file.write_control_rec(_control_rec,size); - _tras_file.close(); - - _tras_file.open(_trasf,TRUE); - _tras_file.write_control_rec(record,size); - _tras_file.close(); - } - delete _prog; - - //Inizializzo l'ultima sigla file elaborato su trasfer con la sigla del file successivo da inviare - //e inizializzo la chiave, altrimenti se si blocca l'invio subito dopo aver finito un file si rischia di - //ritrasferire l'ultimo record quando si riparte; inoltre non si riesce a inviare il file successivo perche' - //la chiave e' compilata con i dati del file precedente. - _tras_file.open(_trasf); - leggi_record_controllo(); - TString chiave,app,sigla; - app.format("%-15s", (const char*) chiave); - char sigla_p = _tras_file.ult_file()[0]; - int posiz = _files.find(sigla_p); - TString nuova_sigla = " "; - if (posiz < _files.len()) - nuova_sigla = _files.mid(posiz+1,1); - - _control_rec.overwrite(nuova_sigla,240); - _control_rec.overwrite(app,241); - _tras_file.write_control_rec(_control_rec,size); - _tras_file.close(); - - setta_tabella_ditta(m,"D",FALSE); - setta_parametri_record(m,"D"); - - return TRUE; -} - -bool TInv_cont::testata_mov_IVA(long numreg) -{ - TLocalisamfile mov (LF_MOV); - - mov.setkey(1); - mov.zero(); - mov.put(MOV_NUMREG, numreg); - if (mov.read() == NOERR) - { - _codcf = mov.get_long(MOV_CODCF); - _data74ter = mov.get_date(MOV_DATA74TER); - _corrlire = mov.get_real(MOV_CORRLIRE); - _codvali = mov.get (MOV_CODVALI); - _cambioi = mov.get_real(MOV_CAMBIOI); - _corrval = mov.get_real(MOV_CORRVALUTA); - _ocfpi = mov.get (MOV_OCFPI); - if (_ocfpi.not_empty()) - cerca_occasionale(); - } - else - return FALSE; - - return TRUE; -} - -void TInv_cont::cerca_occasionale() -{ - TLocalisamfile occas (LF_OCCAS); - - occas.setkey(1); - occas.zero(); - occas.put(OCC_CFPI, _ocfpi); - if (occas.read() == NOERR) - { - _ragsococc = occas.get(OCC_RAGSOC); - _indocc = occas.get(OCC_INDIR); - _capocc = occas.get(OCC_CAP); - TString com = occas.get(OCC_COM); - cerca_comune_occas(com); - } - else - { - _ragsococc = ""; - _indocc = ""; - _capocc = ""; - _localocc = ""; - _provocc = ""; - } -} - -void TInv_cont::cerca_comune_occas(const TString& com) -{ - TLocalisamfile comuni (LF_COMUNI); - - comuni.setkey(1); - comuni.zero(); - comuni.put(COM_COM, com); - if (comuni.read() == NOERR) - { - _localocc = comuni.get(COM_DENCOM); - _provocc = comuni.get(COM_PROVCOM); - } -} - -bool TInv_cont::invio_mov_IVA(TString& key,TMask& m) -{ - int size = 256; - TString record(size); - long numreg,nreg_p; - int numrig; - int numero_righe = 0; - TLocalisamfile rmoviva (LF_RMOVIVA); - - nreg_p = -1; - - long cicli = rmoviva.items(); - cicli -= _numrec; - _prog = new TProgind(cicli,"Invio Movimenti iva in corso... Prego attendere.",FALSE); - - if (key == "") - rmoviva.first(); - else - { - numreg = atol(key.mid(2,6)); - numrig = atoi(key.mid(8,2)); - rmoviva.setkey(1); - rmoviva.zero(); - rmoviva.put(RMI_NUMREG, numreg); - rmoviva.put(RMI_NUMRIG, numrig); - rmoviva.read(); - } - - for (; !rmoviva.eof(); rmoviva.next()) - { - TString str; - - _prog->addstatus(1); - _tras_file.open(_trasf); - - record.spaces(); - - long nreg = rmoviva.get_long(RMI_NUMREG); - int nrig = rmoviva.get_int (RMI_NUMRIG); - - //Salvataggio della chiave sul record di controllo del file trasfer - leggi_record_controllo(); - TString chiave,app; - chiave.format("%2s%06ld%02d", (const char*) "U1", nreg, nrig); - app.format("%-15s", (const char*) chiave); - _control_rec.overwrite("U",240); - _control_rec.overwrite(app,241); - // _tras_file.write_control_rec(_control_rec,size); - // _tras_file.close(); - - if (nreg > 999999) - return error_box("Rilevato un numero di registrazione composto da 7 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); - - if (nrig > 99) - return error_box("Rilevato un numero di riga composto da 3 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); - - record.overwrite("U1",0); //Tipo record - - str.format("%06ld", nreg); - record.overwrite(str,2); //Numero di registrazione - - str.format("%02d", nrig); - record.overwrite(str,8); //Numero di riga - - if (nreg != nreg_p) - { - numero_righe = 0; - if (!testata_mov_IVA(nreg)) - return error_box("Rilevata riga mancante di testata: impossibile proseguire"); - } - - numero_righe++; - if (numero_righe > 9) - return error_box("Rilevata una registrazione IVA con piu' di 9 righe: impossibile proseguire"); - - nreg_p = nreg; - - str.format("%06ld", _codcf); - record.overwrite(str,15); //Codice cliente/fornitore - - real imponibile (rmoviva.get_real(RMI_IMPONIBILE)); - str.format("%011s", (const char*) imponibile.string()); - record.overwrite(str,21); //Imponibile - - //Se trovo un codice iva composto da piu' di 2 cifre l'invio viene interrotto - TString codiva (rmoviva.get(RMI_CODIVA)); - if (codiva.len() > 2) - return error_box("Rilevato un codice IVA composto da 3 o piu' cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); - str.format("%02s", (const char*) codiva); - record.overwrite(str,32); //Codice iva - - real imposta (rmoviva.get_real(RMI_IMPOSTA)); - str.format("%09s", (const char*) imposta.string()); - record.overwrite(str,34); //Imposta - - int tipocr = rmoviva.get_int(RMI_TIPOCR); - str.format("%01d", tipocr); - record.overwrite(str,43); //Tipo costo/ricavo - - int tipodet = rmoviva.get_int(RMI_TIPODET); - str.format("%01d", tipodet); - record.overwrite(str,44); //Tipo detraibilita' - - int gruppo = rmoviva.get_int(RMI_GRUPPO); - if (gruppo > 99) - return error_box("Rilevato un gruppo composto da 3 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); - str.format("%02d", gruppo); - record.overwrite(str,45); //Gruppo - - int conto = rmoviva.get_int(RMI_CONTO); - if (conto > 99) - return error_box("Rilevato un conto composto da 3 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); - str.format("%02d", conto); - record.overwrite(str,47); //Conto - - long sottoc = rmoviva.get_long(RMI_SOTTOCONTO); - str.format("%06ld", sottoc); - record.overwrite(str,49); //Sottoconto - - TString data74terstr = _data74ter.string(); - str = riconverti(data74terstr); - record.overwrite(str,55); //Data per registri 74 TER - - if (_ocfpi.not_empty()) - { - str.format("%-.25s", (const char*) _ragsococc); - record.overwrite(str,61); //Ragione sociale cliente occasionale - - str.format("%-.22s", (const char*) _indocc); - record.overwrite(str,86); //indirizzo cliente occasionale - - str.format("%-.18s", (const char*) _localocc); - record.overwrite(str,108); //Localita cliente occasionale - - str.format("%-5s", (const char*) _capocc); - record.overwrite(str,126); //Codice avviamento postale cliente occasionale - - str.format("%-.2s", (const char*) _provocc); - record.overwrite(str,131); //Provincia cliente occasionale - } - - int tipoatt = rmoviva.get_int(RMI_TIPOATT); - str.format("%01d", tipoatt); - record.overwrite(str,133); //Tipo attivita' - - str.format("%011s", (const char*) _corrlire.string()); - record.overwrite(str,135); //Corrispettivo in lire - - record.overwrite(_codvali,146); //Codice valuta - - str.format("%011s", (const char*) _cambioi.string()); - record.overwrite(str,149); //Cambio - - str.format("%014s", (const char*) _corrval.string()); - record.overwrite(str,160); //Corrispettivo in valuta - - _numrec++; - TString stringa; - stringa.format("%06ld", _numrec); - int posiz = _files.find("U"); - _control_rec.overwrite(stringa,((posiz * 6) + 47)); - _tras_file.write_control_rec(_control_rec,size); - _tras_file.close(); - - _tras_file.open(_trasf,TRUE); - _tras_file.write_control_rec(record,size); - _tras_file.close(); - } - delete _prog; - - //Inizializzo l'ultima sigla file elaborato su trasfer con la sigla del file successivo da inviare - //e inizializzo la chiave, altrimenti se si blocca l'invio subito dopo aver finito un file si rischia di - //ritrasferire l'ultimo record quando si riparte; inoltre non si riesce a inviare il file successivo perche' - //la chiave e' compilata con i dati del file precedente. - _tras_file.open(_trasf); - leggi_record_controllo(); - TString chiave,app,sigla; - app.format("%-15s", (const char*) chiave); - char sigla_p = _tras_file.ult_file()[0]; - int posiz = _files.find(sigla_p); - TString nuova_sigla = " "; - if (posiz < _files.len()) - nuova_sigla = _files.mid(posiz+1,1); - - _control_rec.overwrite(nuova_sigla,240); - _control_rec.overwrite(app,241); - _tras_file.write_control_rec(_control_rec,size); - _tras_file.close(); - - setta_tabella_ditta(m,"D",FALSE); - setta_parametri_record(m,"D"); - - return TRUE; -} - -bool TInv_cont::menu(MENU_TAG m) -{ - if (m == BAR_ITEM(1)) - return main_loop(); - return FALSE; -} - -int cg2900 (int argc, char* argv[]) -{ - TInv_cont a; - - a.run(argc,argv, "Invio contabilita'"); - - return TRUE; -} +// Invio contabilita' + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cg2900.h" +#include "cglib04.h" + +HIDDEN TString80 TEMP; + +HIDDEN int date2esc(const TDate& d, int* prevesc = NULL); + +class TInv_cont : public TApplication +{ + enum { BUFSIZE = 4096 }; + + TTransfer_file _tras_file; + TProgind* _prog; + + TString _control_rec, _trasf, _std, _stato, _marker, _nome_simbolico; + TString _files, _codcaus, _numdoc, _reg, _codpag, _tipodoc, _codcausm; + TString _ocfpi, _ragsococc, _indocc, _capocc, _localocc, _provocc, _codvali; + bool _esiste_ditta, _esiste_record; + long _ditta, _protiva, _uprotiva, _codcf, _numrec, _tot_rec; + long _dim_tot, _dim_disk; + int _num; + TDate _data, _datadoc, _data74ter; + real _corrlire, _cambioi, _corrval; + +public: + virtual bool create(); + virtual bool destroy(); + virtual bool menu(MENU_TAG m); + + bool main_loop(); + + bool esiste_tabella_studio(); + bool record_controllo(); + bool esegui_controlli(); + bool leggi_trasfer(); + bool controlli(); + bool sub_controlli(); + bool tabella_ditta(); + bool controlla_stato_invio(); + bool numero_data(); + void leggi_record_controllo(); + void codifica_ditta (TMask& m); + bool testata_mov_PN (long numreg); + bool testata_mov_IVA(long numreg); + void cerca_occasionale(); + void cerca_comune_occas(const TString& com); + + void crea_marker(TMask& m); + void setta_parametri_record(TMask& m,const TString& flag); + void setta_tabella_studio(TMask& m, bool flag_ditta = TRUE); + void setta_tabella_ditta(TMask& m, const char* flag, bool comp = TRUE); + void crea_record_controllo(TMask& m); + + bool invio_contabilita(TMask& m); + bool invio_tab_cau(TString& key,TMask& m); + bool invio_clifo (TString& key,TMask& m); + bool invio_pcon (TString& key,TMask& m); + bool invio_mov_PN (TString& key,TMask& m); + bool invio_mov_IVA(TString& key,TMask& m); + + void aggiorna_marker(TString& token, int pos); + void calcola_totale_record(); + + const char* converti (TString& data_AS400); + const char* riconverti (TString& data_PC); + const char* cerca_provincia(const TString& comcf); + + static bool setta_maschera_hnd(TMask_field& f, KEY k); + + int calcola_numero_dischi(TMask& m); + FILE* chiedi_disco(const char* name, int disk, char floppy, bool lettura); + long determina_dimensione(FILE* f); + bool scrivi_disco(char floppy, int disk, const char* work, FILE* i, TProgind& w); + + TInv_cont() {}; +}; + +HIDDEN TInv_cont& app() { return (TInv_cont &) main_app(); } + +FILE* TInv_cont::chiedi_disco(const char* name, int disk, char floppy, bool lettura) +{ + message_box("Inserire il disco %d nel drive %c:", disk, floppy); + + // name.ext(format("%03d", disk)); + + FILE* f = NULL; + bool retry = TRUE; + while (retry) + { + f = fopen(name, lettura ? "rb" : "wb"); + if (f == NULL) + retry = yesno_box("Il file %s non e' accessibile: riprovare?", (const char*)name); + else + { + retry = FALSE; + fclose(f); + } + } + + return f; +} + +long TInv_cont::determina_dimensione(FILE* f) +{ + CHECK(f, "Can't measure NULL file"); + fseek(f, 0, SEEK_END); + const long s = ftell(f); + fseek(f, 0, SEEK_SET); + return s; +} + +bool TInv_cont::scrivi_disco(char floppy, int disk, const char* work, + FILE* i, TProgind& w) +{ + // const TFilename from(filename); // File da splittare + + // TFilename work; + // work << floppy << ":/" << from.name(); // File su dischetto + + chiedi_disco(work, disk, floppy, FALSE); + + TString str; + str.format("%02d", disk); + aggiorna_marker(str,31); // Aggiorna il num. progr. disco su marker + + TString path_m; + path_m << floppy << ":\\marker"; + + TString path_t; + path_t << floppy << ":\\trasfer"; + + fcopy(_marker,path_m); // Copia il marker su disco + + //FILE* i = fopen(from, "rb"); + FILE* o = fopen(path_t, "wb"); + + //if (i == NULL) return error_box("Impossibile aprire il file '%s'", from); + + //TProgind w(_dim_disk, "Trasferimento su dischetti in corso... Prego attendere", TRUE, TRUE, 40); + + TString buffer(BUFSIZE); + + long tot_scritti = BUFSIZE; + + while (tot_scritti <= _dim_disk) + { + const word letti = fread((char*)(const char*)buffer, 1, BUFSIZE, i); + + long scritti = fwrite((char*)(const char*)buffer, letti, 1, o); + + tot_scritti += letti; + + if (letti < BUFSIZE) break; + + w.addstatus(letti); + } + + //fclose(i); + fclose(o); + + return TRUE; +} + +bool TInv_cont::main_loop() +{ + TString str; + bool ripartenza = FALSE; + + if (!esiste_tabella_studio()) return FALSE; + + if (!esegui_controlli()) return FALSE; + + TMask msk ("cg2900a"); + KEY tasto; + + if (_ditta != 0) + { + msk.set(F_DITTAINV, _ditta); + msk.disable(F_DITTAINV); + codifica_ditta(msk); + msk.set(F_NUMULINV, _num); + msk.set(F_DATAULIN, _data.string()); + msk.set(F_STATO, _stato); + + TString uselab = _tras_file.ult_file(); + TString chiave = _tras_file.key(); + msk.set(F_USELAB, uselab); + msk.set(F_CHIAVE, chiave); + msk.set(F_DATALIM, _data.string()); + msk.disable(F_DATALIM); + + ripartenza = TRUE; + } + + msk.disable(F_NUMULINV); + msk.disable(F_DATAULIN); + msk.disable(F_STATO); + msk.disable(F_USELAB); + msk.disable(F_CHIAVE); + + if (!ripartenza) + msk.set_handler(F_DITTAINV, setta_maschera_hnd); + + tasto = msk.run(); + + if (tasto != K_ENTER) return FALSE; + + if (!ripartenza) + { + crea_marker(msk); //Crea il record con le informazioni sul marker + setta_parametri_record(msk,"F"); //Aggiorna parametri contabili ditta + setta_tabella_studio(msk); //Aggiorna la tabella studio per invio + setta_tabella_ditta(msk,"F"); //Aggiorna la tabella ditta per invio + crea_record_controllo(msk); //Crea il record di controllo sul file trasfer + } + + if (!invio_contabilita(msk)) + return FALSE; + + calcola_totale_record(); + str.format("%06ld", _tot_rec); + aggiorna_marker(str,23); + + TMask mask ("cg2900b"); + KEY k; + + k = mask.run(); + + if (k == K_ENTER) + { + int num_disk = calcola_numero_dischi(mask); + char floppy = mask.get(F_FLOPPY)[0]; + + str.format("%02d", num_disk); + aggiorna_marker(str,29); + + const TFilename from(_trasf); // File da splittare + + TFilename work; + work << floppy << ":/" << from.name(); // File su dischetto + + FILE* i = fopen(from, "rb"); + + if (i == NULL) return error_box("Impossibile aprire il file '%s'", from); + + TProgind w(_dim_tot, "Trasferimento su dischetti in corso... Prego attendere", TRUE, TRUE, 60); + + for (int j = 0; j < num_disk; j++) + { + scrivi_disco(floppy,j+1,work,i,w); + } + fclose(i); + + setta_tabella_studio(msk,FALSE); //Aggiorna la tabella studio per invio + setta_tabella_ditta(msk," ",FALSE); //Aggiorna la tabella ditta per invio + setta_parametri_record(msk," "); //Aggiorna parametri contabili ditta + + _tras_file.open(_trasf); + leggi_record_controllo(); + TString record(256); + record.format("%-256s",(const char*) record); + _control_rec.overwrite(record,0); + _tras_file.write_control_rec(_control_rec,256); + + fremove(_marker); + fremove(_trasf); + } + + return FALSE; +} + +int TInv_cont::calcola_numero_dischi(TMask& msk) +{ + int numdisc = 0; + + FILE* t = fopen(_trasf, "rb"); + if (t == NULL) return error_box("Impossibile aprire il file '%s'", _trasf); + + long dim_t = determina_dimensione(t); //Determina la dimensione del trasfer + fclose(t); + + FILE* m = fopen(_marker, "rb"); + if (m == NULL) return error_box("Impossibile aprire il file '%s'", _marker); + + long dim_m = determina_dimensione(m); // Determina la dimensione del marker + fclose(m); + + _dim_tot = dim_t + dim_m; // Determina la dimensione totale + + int item = msk.get_int(F_DIM); + + switch (item) + { + case 1 : + _dim_disk = 1400000L; + break; + case 2 : + _dim_disk = 1200000L; + break; + case 3 : + _dim_disk = 720000L; + break; + case 4 : + _dim_disk = 360000L; + break; + default : + break; + }; + + if (_dim_tot < _dim_disk) + numdisc = 1; + else + { + //double dischi = _dim_tot / _dim_disk; + //numdisc = (int)ceil(dischi); + numdisc = int(_dim_tot / _dim_disk); + if ( (_dim_tot % _dim_disk) != 0) + numdisc += 1; + } + + return numdisc; +} + +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; +} + +bool TInv_cont::create() +{ + TApplication::create(); + + dispatch_e_menu (BAR_ITEM(1)); + + return TRUE; +} + +bool TInv_cont::destroy() +{ + return TApplication::destroy(); +} + +void TInv_cont::leggi_record_controllo() +{ + _tras_file.read_control_rec(); + _control_rec = _tras_file.record(); +} + +const char* TInv_cont::converti (TString& data_AS400) +{ + TEMP = data_AS400.mid(4,2); + TEMP << "-" <addstatus(1); + _tras_file.open(_trasf); + + record.spaces(); + + // Se trovo un codice causale alfanumerico l'invio deve essere interrotto + const char* codcau = cau.get(CAU_CODCAUS); + if (!real::is_natural(codcau)) + return error_box("Rilevato un codice causale alfanumerico nella causale %03s: impossibile proseguire",codcau); + str.format("%03s", codcau); + record.overwrite("W1",0); //Tipo record + record.overwrite(str,2); //Codice causale + + + //Salvataggio della sigla e della chiave sul record di controllo del file trasfer + leggi_record_controllo(); + TString chiave,app; + chiave.format("%2s%03s", (const char*) "W1", codcau); + app.format("%-15s", (const char*) chiave); + _control_rec.overwrite("W",240); + _control_rec.overwrite(app,241); + //_tras_file.write_control_rec(_control_rec,size); + //_tras_file.close(); + + TString descr = cau.get(CAU_DESCR); + descr.format("%-.20s", (const char*) descr); + record.overwrite(descr,15); //Descrizione + + TString tipodoc = cau.get(CAU_TIPODOC); + record.overwrite(tipodoc,35); //Tipo documento + + //Se trovo un registro IVA con lunghezza maggiore di 1 l'invio deve essere interrotto + TString reg = cau.get(CAU_REG); + if (reg.len() > 1) + return error_box("Rilevato un registro IVA con lunghezza superiore a 1 nella causale %03s: impossibile proseguire", codcau); + record.overwrite(reg,37); //Registro IVA + + bool alleg = cau.get_bool(CAU_ALLEG); + if (alleg) + record.overwrite("X",38); + else //Flag esclusione tipo documento da allegato + record.overwrite(" ",38); + + int m770 = atoi(cau.get(CAU_M770)); + str = format("%1d", m770); + record.overwrite(str,39); //Collegamento modello 770 + + TString cespiti = cau.get(CAU_COLLCESP); + record.overwrite(cespiti,40); //Collegamento cespiti + + bool numdoc = cau.get_bool(CAU_NUMDOC); + if (numdoc) + record.overwrite("1",206); + else //Flag immissione numero documento + record.overwrite("0",206); + + bool datadoc = cau.get_bool(CAU_DATADOC); + if (datadoc) + record.overwrite("1",207); + else //Flag immissione data documento + record.overwrite("0",207); + + const char* codcausim = cau.get(CAU_CODCAUSIM); + if (!real::is_natural(codcausim)) + return error_box("Rilevato un codice causale per incasso immediato alfanumerico nella causale %03s: impossibile proseguire",codcau); + str.format("%03s", codcausim); + record.overwrite(str,209); //Codice causale per incasso immediato + + bool intracom = cau.get_bool(CAU_INTRACOM); + if (intracom) + record.overwrite("X",246); + else //Flag per operazioni intracomunitarie + record.overwrite(" ",246); + + bool valintra = cau.get_bool(CAU_VALINTRA); + if (valintra) + record.overwrite("X",247); + else //Gestione valuta per oper. intracomunitarie + record.overwrite(" ",247); + + bool ritfatt = cau.get_bool(CAU_RITFATT); + if (ritfatt) + record.overwrite("X",248); + else //Flag causale per fattura ricevuta in ritardo + record.overwrite(" ",248); + + bool autofatt = cau.get_bool(CAU_AUTOFATT); + if (autofatt) + record.overwrite("X",249); + else //Autofattura art.34 + record.overwrite(" ",249); + + int num = 0; + int pos_gcs = 41; + int pos_sez = 191; + _codcaus = cau.get(CAU_CODCAUS); + + TLocalisamfile rcau (LF_RCAUSALI); + + do + { + num++; + + rcau.setkey(1); + rcau.zero(); + rcau.put(RCA_CODCAUS, _codcaus); + rcau.put(RCA_NRIGA, num); + + if (rcau.read() == NOERR) + { + int g = rcau.get_int (RCA_GRUPPO); + int c = rcau.get_int (RCA_CONTO); + + if (g > 99) + return error_box("Rilevato un gruppo composto da 3 cifre nella causale %03s riga %d: impossibile proseguire",codcau,num); + + if (c > 99) + return error_box("Rilevato un conto composto da 3 cifre nella causale %03s riga %d: impossibile proseguire",codcau,num); + + long s = rcau.get_long(RCA_SOTTOCONTO); + TString sez = rcau.get (RCA_SEZIONE); + + str = format("%02d", g); + record.overwrite(str,pos_gcs); //Gruppo + pos_gcs += 2; + str = format("%02d", c); + record.overwrite(str,pos_gcs); //Conto + pos_gcs += 2; + str = format("%06ld", s); + record.overwrite(str,pos_gcs); //Sottoconto + pos_gcs += 6; + + record.overwrite(sez,pos_sez); //Sezione + pos_sez++; + } + else + { + int g = 0; + int c = 0; + long s = 0; + TString sez = " "; + + str = format("%02d", g); + record.overwrite(str,pos_gcs); //Gruppo + pos_gcs += 2; + str = format("%02d", c); + record.overwrite(str,pos_gcs); //Conto + pos_gcs += 2; + str = format("%06ld", s); + record.overwrite(str,pos_gcs); //Sottoconto + pos_gcs += 6; + + record.overwrite(sez,pos_sez); //Sezione + pos_sez++; + } + + if (num == 15) + { + TString cau_app; + + rcau.next(); + if (!rcau.eof()) + cau_app = rcau.get(RCA_CODCAUS); + else + cau_app = ""; + + if (_codcaus == cau_app) + return error_box("Rilevata una causale con piu' di 15 righe: impossibile proseguire"); + } + } + while (num < 15); + + _numrec++; + TString stringa; + stringa.format("%06ld", _numrec); + int posiz = _files.find("W"); + _control_rec.overwrite(stringa,((posiz * 6) + 47)); + _tras_file.write_control_rec(_control_rec,size); + _tras_file.close(); + + _tras_file.open(_trasf,TRUE); + _tras_file.write_control_rec(record,size); + _tras_file.close(); + } + delete _prog; + + //Inizializzo l'ultima sigla file elaborato su trasfer con la sigla del file successivo da inviare + //e inizializzo la chiave, altrimenti se si blocca l'invio subito dopo aver finito un file si rischia di + //ritrasferire l'ultimo record quando si riparte; inoltre non si riesce a inviare il file successivo perche' + //la chiave e' compilata con i dati del file precedente. + _tras_file.open(_trasf); + leggi_record_controllo(); + TString chiave,app,sigla; + app.format("%-15s", (const char*) chiave); + char sigla_p = _tras_file.ult_file()[0]; + int posiz = _files.find(sigla_p); + TString nuova_sigla = " "; + if (posiz < _files.len()) + nuova_sigla = _files.mid(posiz+1,1); + + _control_rec.overwrite(nuova_sigla,240); + _control_rec.overwrite(app,241); + _tras_file.write_control_rec(_control_rec,size); + _tras_file.close(); + + setta_tabella_ditta(m,"D",FALSE); + setta_parametri_record(m,"D"); + + return TRUE; +} + +bool TInv_cont::invio_clifo(TString& key,TMask& m) +{ + int size = 256; + TString record(size); + char tipocf; + long codcf; + TLocalisamfile clifo (LF_CLIFO); + + long cicli = clifo.items(); + cicli -= _numrec; + _prog = new TProgind(cicli,"Invio anagrafica Clienti / Fornitori in corso... Prego attendere.",FALSE); + + if (key == "") + clifo.first(); + else + { + tipocf = (key.mid(2,1))[0]; + codcf = atol(key.mid(3,6)); + clifo.setkey(1); + clifo.zero(); + clifo.put(CLI_TIPOCF, tipocf); + clifo.put(CLI_CODCF, codcf); + clifo.read(); + } + + for (; !clifo.eof(); clifo.next()) + { + TString str; + + _prog->addstatus(1); + _tras_file.open(_trasf); + + record.spaces(); + + // Il tipocf su PC e' C = cliente F = fornitore. + // Il tipocf su AS400 e' 1 = cliente 2 = fornitore. + TString tipo_cod; + + char tipo = clifo.get_char(CLI_TIPOCF); + if (tipo == 'C') + tipo_cod = "1"; + else + if (tipo == 'F') + tipo_cod = "2"; + + record.overwrite("A1",0); //Tipo record + record.overwrite(tipo_cod,2); //Tipo cliente/fornitore + + long codice = clifo.get_long(CLI_CODCF); + str.format("%06ld", codice); + record.overwrite(str,3); //Codice cliente/fornitore + + //Salvataggio della chiave sul record di controllo del file trasfer + leggi_record_controllo(); + TString chiave,app; + chiave.format("%2s%s%06ld", (const char*) "A1", (const char*) tipo_cod, codice); + app.format("%-15s", (const char*) chiave); + _control_rec.overwrite("A",240); + _control_rec.overwrite(app,241); + // _tras_file.write_control_rec(_control_rec,size); + // _tras_file.close(); + + //Il tipo persona su PC e' F = fisica G = giuridica + //Il tipo persona su AS400 e' 0 = giuridica 1 = fisica + char tipop = clifo.get_char(CLI_TIPOPERS); + TString tipopers; + + if (tipop == 'F') + tipopers = "1"; + else + if (tipop == 'G') + tipopers = "0"; + + record.overwrite(tipopers,15); //Tipo persona + + TString ragsoc = clifo.get(CLI_RAGSOC); + TString cognome = ragsoc.mid(0,30); + TString nome = ragsoc.mid(30,20); + str.format("%-30s", (const char*) cognome); //Cognome o I ragione sociale + record.overwrite(str,16); + str.format("%-20s", (const char*) nome); + record.overwrite(str,46); //Nome o II ragione sociale + + //Se la partita IVA e' maggiore di 11 il programma di invio viene fermato + TString paiv = clifo.get(CLI_PAIV); + if (paiv.len() > 11) + return error_box("Rilevata partita IVA con piu' di 11 caratteri in codice %c%d: impossibile proseguire",tipo,codice); + str.format("%-11s", (const char*) paiv); + record.overwrite(str,66); //Partita IVA + + TString cofi = clifo.get(CLI_COFI); + str.format("%-16s", (const char*) cofi); + record.overwrite(str,77); //Codice fiscale + + TString indcf = clifo.get(CLI_INDCF); + str.format("%-35s", (const char*) indcf); + record.overwrite(str,93); //Indirizzo + + TString capcf = clifo.get(CLI_CAPCF); + record.overwrite(capcf,128); //Codice di avviamento postale + + TString localita = clifo.get(CLI_LOCCF); + str.format("%-.20s", (const char*) localita); + record.overwrite(str,133); //Localita' + + TString comcf = clifo.get(CLI_COMCF); + TString provincia = cerca_provincia(comcf); + str.format("%-2s", (const char*) provincia); + record.overwrite(str,153); //Provincia + + TString ptel = clifo.get(CLI_PTEL); + TString tel = clifo.get(CLI_TEL); + TString appoggio; + appoggio << ptel << " " << tel; + if (appoggio.len() > 12) + warning_box("Rilevato numero telefonico troppo lungo in codice %c%d: impossibile inviare",tipo,codice); + else //Numero telefono + record.overwrite(appoggio,155); + + TString alleg = clifo.get(CLI_ALLEG); + record.overwrite(alleg,167); //Flag gestione allegato + + int gruppo = clifo.get_int(CLI_GRUPPORIC); + int conto = clifo.get_int(CLI_CONTORIC); + + if (gruppo > 99) + return error_box("Rilevato gruppo costo/ricavo composto da 3 cifre in codice %c%d: impossibile proseguire",tipo,codice); + + if (conto > 99) + return error_box("Rilevato conto costo/ricavo composto da 3 cifre in codice %c%d: impossibile proseguire",tipo,codice); + + long sottoc = clifo.get_long(CLI_SOTTOCRIC); + str.format("%02d", gruppo); + record.overwrite(str,168); //Gruppo di costo/ricavo + str.format("%02d", conto); + record.overwrite(str,170); //Conto di costo/ricavo + str.format("%06ld", sottoc); + record.overwrite(str,172); //sottoconto di costo/ricavo + + long codalleg = clifo.get_long(CLI_CODALLEG); + str.format("%06ld", codalleg); + record.overwrite(str,179); + + //Se il codice di pagamento e' superiore alle 2 cifre l'invio deve essere interrotto + TString codpag = clifo.get(CLI_CODPAG); + if (codpag.len() > 2) + return error_box("Rilevato un codice di pagamento composto da 3 o piu' cifre in codice %c%d: impossibile proseguire",tipo,codice); + + str.format("%-2s", (const char*) codpag); + + _numrec++; + TString stringa; + stringa.format("%06ld", _numrec); + int posiz = _files.find("A"); + _control_rec.overwrite(stringa,((posiz * 6) + 47)); + _tras_file.write_control_rec(_control_rec,size); + _tras_file.close(); + + _tras_file.open(_trasf,TRUE); + _tras_file.write_control_rec(record,size); + _tras_file.close(); + } + delete _prog; + + //Inizializzo l'ultima sigla file elaborato su trasfer con la sigla del file successivo da inviare + //e inizializzo la chiave, altrimenti se si blocca l'invio subito dopo aver finito un file si rischia di + //ritrasferire l'ultimo record quando si riparte; inoltre non si riesce a inviare il file successivo perche' + //la chiave e' compilata con i dati del file precedente. + _tras_file.open(_trasf); + leggi_record_controllo(); + TString chiave,app,sigla; + app.format("%-15s", (const char*) chiave); + char sigla_p = _tras_file.ult_file()[0]; + int posiz = _files.find(sigla_p); + TString nuova_sigla = " "; + if (posiz < _files.len()) + nuova_sigla = _files.mid(posiz+1,1); + + _control_rec.overwrite(nuova_sigla,240); + _control_rec.overwrite(app,241); + _tras_file.write_control_rec(_control_rec,size); + _tras_file.close(); + + setta_tabella_ditta(m,"D",FALSE); + setta_parametri_record(m,"D"); + + return TRUE; +} + +bool TInv_cont::invio_pcon(TString& key,TMask& m) +{ + int size = 256; + TString record(size); + int gruppo,conto; + long sottoc; + TLocalisamfile pcon (LF_PCON); + + long cicli = pcon.items(); + cicli -= _numrec; + _prog = new TProgind(cicli,"Invio anagrafica Piano dei Conti in corso... Prego attendere.",FALSE); + + if (key == "") + pcon.first(); + else + { + gruppo = atoi(key.mid(2,2)); + conto = atoi(key.mid(4,2)); + sottoc = atol(key.mid(6,6)); + pcon.setkey(1); + pcon.zero(); + pcon.put(PCN_GRUPPO, gruppo); + pcon.put(PCN_CONTO, conto); + pcon.put(PCN_SOTTOCONTO, sottoc); + pcon.read(); + } + + for (; !pcon.eof(); pcon.next()) + { + TString str; + + _prog->addstatus(1); + _tras_file.open(_trasf); + + record.spaces(); + + int g = pcon.get_int (PCN_GRUPPO); + + if (g > 99) + return error_box("Rilevato un gruppo composto da 3 cifre in %03d: impossibile proseguire",g); + + int c = pcon.get_int (PCN_CONTO); + + if (c > 99) + return error_box("Rilevato un conto composto da 3 cifre in %03d: impossibile proseguire",c); + + long s = pcon.get_long(PCN_SOTTOCONTO); + + // Se si tratta di un GRUPPO + + if (g != 0 && c == 0 && s == 0) + { + //Salvataggio della sigla e della chiave sul record di controllo del file trasfer + leggi_record_controllo(); + TString chiave,app; + chiave.format("%2s%02d%02d%06ld", (const char*) "P1", g, c, s); + app.format("%-15s", (const char*) chiave); + _control_rec.overwrite("P",240); + _control_rec.overwrite(app,241); + // _tras_file.write_control_rec(_control_rec,size); + // _tras_file.close(); + + record.overwrite("P1",0); //Tipo record + str.format("%02d", g); + record.overwrite(str,2); //Gruppo + + TString descr (pcon.get(PCN_DESCR)); + str.format("%-.30s", (const char*) descr); + record.overwrite(str,15); //Descrizione gruppo + } + + // Se si tratta di un CONTO + + if (g != 0 && c != 0 && s == 0) + { + //Salvataggio della sigla e della chiave sul record di controllo del file trasfer + leggi_record_controllo(); + TString chiave,app; + chiave.format("%2s%02d%02d%06ld", (const char*) "P2", g, c, s); + app.format("%-15s", (const char*) chiave); + _control_rec.overwrite("P",240); + _control_rec.overwrite(app,241); + // _tras_file.write_control_rec(_control_rec,size); + // _tras_file.close(); + + record.overwrite("P2",0); //Tipo record + str.format("%02d", g); + record.overwrite(str,2); //Gruppo + + str.format("%02d", c); + record.overwrite(str,4); //Conto + + TString descr (pcon.get(PCN_DESCR)); + str.format("%-.30s", (const char*) descr); + record.overwrite(str,15); //Descrizione conto + + int indbil = pcon.get_int(PCN_INDBIL); + str.format("%d", indbil); + record.overwrite(str,45); //Indicatore di bilancio + + TString tmcf = pcon.get(PCN_TMCF); + record.overwrite(tmcf,46); //Flag conto cliente/fornitore + + bool stsottbil = pcon.get_bool(PCN_STSOTTBIL); + if (stsottbil) + str = "0"; + else + str = "1"; + record.overwrite(str,47); //Flag stampa dettaglio sottoconti su bilancio + + // Classe IV direttiva CEE + + TString sez = pcon.get(PCN_SEZIVD); + if (sez == "0") + sez = " "; + record.overwrite(sez,48); //Sezione IV dir + + TString let = pcon.get(PCN_LETTIVD); + record.overwrite(let,49); //Lettera IV dir + + int numrom = atoi(pcon.get(PCN_NUMRIVD)); + str.format("%03d", numrom); + record.overwrite(str,60); //Numero arabo corrispondente al numero romano + TString numr = itor(numrom); + str.format("%-8s", (const char*) numr); + record.overwrite(str,50); //Numero romano IV dir + + int num = pcon.get_int(PCN_NUMIVD); + str.format("%02d", num); + record.overwrite(str,58); //Numero arabo IV dir + + // Classe IV direttiva CEE di segno opposto + + TString sezop = pcon.get(PCN_SEZIVDOPP); + if (sezop == "0") + sezop = " "; + record.overwrite(sezop,63); //Sezione IV dir + + TString letop = pcon.get(PCN_LETTIVDOPP); + record.overwrite(letop,64); //Lettera IV dir + + int numromop = atoi(pcon.get(PCN_NUMRIVDOPP)); + str.format("%03d", numromop); + record.overwrite(str,75); //Numero arabo corrispondente al numero romano + TString numrop = itor(numromop); + str.format("%-8s", (const char*) numrop); + record.overwrite(str,65); //Numero romano IV dir + + int numop = pcon.get_int(PCN_NUMIVDOPP); + str.format("%02d", numop); + record.overwrite(str,73); //Numero arabo IV dir + } + + // Se si tratta di un SOTTOCONTO + + if (g != 0 && c != 0 && s != 0) + { + //Salvataggio della sigla e della chiave sul record di controllo del file trasfer + leggi_record_controllo(); + TString chiave,app; + chiave.format("%2s%02d%02d%06ld", (const char*) "P3", g, c, s); + app.format("%-15s", (const char*) chiave); + _control_rec.overwrite("P",240); + _control_rec.overwrite(app,241); + // _tras_file.write_control_rec(_control_rec,size); + // _tras_file.close(); + + record.overwrite("P3",0); //Tipo record + str.format("%02d", g); + record.overwrite(str,2); //Gruppo + + str.format("%02d", c); + record.overwrite(str,4); //Conto + + str.format("%06ld", s); + record.overwrite(str,6); + + TString descr (pcon.get(PCN_DESCR)); + str.format("%-.30s", (const char*) descr); + record.overwrite(str,15); //Descrizione sottoconto + + int tipospric = pcon.get_int(PCN_TIPOSPRIC); + str.format("%d", tipospric); + record.overwrite(str,45); //Tipo costo/ricavo + + int ricser = pcon.get_int(PCN_RICSER); + if (ricser == 0) + str = " "; + else + str.format("%d", ricser); + record.overwrite(str,46); //Tipo attivita' + + // Classe IV direttiva CEE + + TString sez = pcon.get(PCN_SEZIVD); + if (sez == "0") + sez = " "; + record.overwrite(sez,47); //Sezione IV dir + + TString let = pcon.get(PCN_LETTIVD); + record.overwrite(let,48); //Lettera IV dir + + int numrom = atoi(pcon.get(PCN_NUMRIVD)); + str.format("%03d", numrom); + record.overwrite(str,59); //Numero arabo corrispondente al numero romano + TString numr = itor(numrom); + str.format("%-8s", (const char*) numr); + record.overwrite(str,49); //Numero romano IV dir + + int num = pcon.get_int(PCN_NUMIVD); + str.format("%02d", num); + record.overwrite(str,57); //Numero arabo IV dir + + // Classe IV direttiva CEE di segno opposto + + TString sezop = pcon.get(PCN_SEZIVDOPP); + if (sezop == "0") + sezop = " "; + record.overwrite(sezop,62); //Sezione IV dir + + TString letop = pcon.get(PCN_LETTIVDOPP); + record.overwrite(letop,63); //Lettera IV dir + + int numromop = atoi(pcon.get(PCN_NUMRIVDOPP)); + str.format("%03d", numromop); + record.overwrite(str,74); //Numero arabo corrispondente al numero romano + TString numrop = itor(numromop); + str.format("%-8s", (const char*) numrop); + record.overwrite(str,64); //Numero romano IV dir + + int numop = pcon.get_int(PCN_NUMIVDOPP); + str.format("%02d", numop); + record.overwrite(str,72); //Numero arabo IV dir + } + + _numrec++; + TString stringa; + stringa.format("%06ld", _numrec); + int posiz = _files.find("P"); + _control_rec.overwrite(stringa,((posiz * 6) + 47)); + _tras_file.write_control_rec(_control_rec,size); + _tras_file.close(); + + _tras_file.open(_trasf,TRUE); + _tras_file.write_control_rec(record,size); + _tras_file.close(); + } + delete _prog; + + //Inizializzo l'ultima sigla file elaborato su trasfer con la sigla del file successivo da inviare + //e inizializzo la chiave, altrimenti se si blocca l'invio subito dopo aver finito un file si rischia di + //ritrasferire l'ultimo record quando si riparte; inoltre non si riesce a inviare il file successivo perche' + //la chiave e' compilata con i dati del file precedente. + _tras_file.open(_trasf); + leggi_record_controllo(); + TString chiave,app,sigla; + app.format("%-15s", (const char*) chiave); + char sigla_p = _tras_file.ult_file()[0]; + int posiz = _files.find(sigla_p); + TString nuova_sigla = " "; + if (posiz < _files.len()) + nuova_sigla = _files.mid(posiz+1,1); + + _control_rec.overwrite(nuova_sigla,240); + _control_rec.overwrite(app,241); + _tras_file.write_control_rec(_control_rec,size); + _tras_file.close(); + + setta_tabella_ditta(m,"D",FALSE); + setta_parametri_record(m,"D"); + + return TRUE; +} + +bool TInv_cont::testata_mov_PN(long numreg) +{ + TLocalisamfile mov (LF_MOV); + + mov.setkey(1); + mov.zero(); + mov.put(MOV_NUMREG, numreg); + if (mov.read() == NOERR) + { + _datadoc = mov.get_date(MOV_DATADOC); + _numdoc = mov.get (MOV_NUMDOC); + _reg = mov.get (MOV_REG); + _codcausm = mov.get (MOV_CODCAUS); + _codpag = mov.get (MOV_CODPAG); + _tipodoc = mov.get (MOV_TIPODOC); + _protiva = mov.get_long(MOV_PROTIVA); + _uprotiva = mov.get_long(MOV_UPROTIVA); + } + else + return FALSE; + + return TRUE; +} + +bool TInv_cont::invio_mov_PN(TString& key,TMask& m) +{ + int size = 256; + TString record(size); + long numreg,nreg_p; + int numrig; + TLocalisamfile rmov (LF_RMOV); + + nreg_p = -1; + + long cicli = rmov.items(); + cicli -= _numrec; + _prog = new TProgind(cicli,"Invio Movimenti di primanota in corso... Prego attendere.",FALSE); + + if (key == "") + rmov.first(); + else + { + numreg = atol(key.mid(2,6)); + numrig = atoi(key.mid(8,2)); + rmov.setkey(1); + rmov.zero(); + rmov.put(RMV_NUMREG, numreg); + rmov.put(RMV_NUMRIG, numrig); + rmov.read(); + } + + for (; !rmov.eof(); rmov.next()) + { + TString str; + + _prog->addstatus(1); + _tras_file.open(_trasf); + + record.spaces(); + + long nreg = rmov.get_long(RMV_NUMREG); + int nrig = rmov.get_int (RMV_NUMRIG); + + //Salvataggio della chiave sul record di controllo del file trasfer + leggi_record_controllo(); + TString chiave,app; + chiave.format("%2s%06ld%02d", (const char*) "Z1", nreg, nrig); + app.format("%-15s", (const char*) chiave); + _control_rec.overwrite("Z",240); + _control_rec.overwrite(app,241); + // _tras_file.write_control_rec(_control_rec,size); + // _tras_file.close(); + + if (nreg > 999999) + return error_box("Rilevato un numero di registrazione composto da 7 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); + + if (nrig > 99) + return error_box("Rilevato un numero di riga composto da 3 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); + + record.overwrite("Z1",0); //Tipo record + + str.format("%06ld", nreg); + record.overwrite(str,2); //Numero di registrazione + + str.format("%02d", nrig); + record.overwrite(str,8); //Numero di riga + + if (nreg != nreg_p) + if (!testata_mov_PN(nreg)) + return error_box("Rilevata riga mancante di testata: impossibile proseguire"); + + nreg_p = nreg; + + TDate datareg (rmov.get(RMV_DATAREG)); + TString dataregstr = datareg.string(); + str = riconverti(dataregstr); + record.overwrite(str,15); //Data di registrazione + + //Determino il segnalino della competenza + int segnalino; + + int annoes = rmov.get_int(RMV_ANNOES); + int anno = date2esc(datareg); + if (annoes == anno) + segnalino = 0; + else + segnalino = 1; + str.format("%d", segnalino); + record.overwrite(str,21); //Segnalino della competenza + + TString datadocstr = _datadoc.string(); + str = riconverti(datadocstr); + record.overwrite(str,22); //Data documento + + str.format("%-7s", (const char*) _numdoc); + record.overwrite(str,28); + + if (_reg.len() > 1) + return error_box("Rilevato un codice registro IVA composto da 2 o piu' cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); + record.overwrite(_reg,35); //Codice registro IVA + + str.format("%05d", _protiva); + record.overwrite(str,36); //Numero protocollo IVA + + // Se trovo un codice causale alfanumerico l'invio deve essere interrotto + const char* cod_causm = (const char*)_codcausm; + if (_codcausm != "") + if (!real::is_natural(cod_causm)) + return error_box("Rilevato un codice causale alfanumerico in %07ld riga %03d: impossibile proseguire",nreg,nrig); + str.format("%03s", (const char*)_codcausm); + record.overwrite(str,41); //Codice causale + + TString descr = rmov.get(RMV_DESCR); + str.format("%-.30s", (const char*) descr); + record.overwrite(str,44); //Descrizione riga di movimento + + int gruppo = rmov.get_int(RMV_GRUPPO); + if (gruppo > 99) + return error_box("Rilevato un gruppo di partita composto da 3 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); + str.format("%02d", gruppo); + record.overwrite(str,74); //Gruppo di partita + + int conto = rmov.get_int(RMV_CONTO); + if (conto > 99) + return error_box("Rilevato un conto di partita composto da 3 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); + str.format("%02d", conto); + record.overwrite(str,76); //Conto di partita + + long sottoc = rmov.get_long(RMV_SOTTOCONTO); + str.format("%06ld", sottoc); + record.overwrite(str,78); //Sottoconto di partita + + TString sez = rmov.get(RMV_SEZIONE); + str.format("%s", (const char*) sez); + record.overwrite(str,84); //Sezione importo + + int gruppoc = rmov.get_int(RMV_GRUPPOC); + if (gruppoc > 99) + return error_box("Rilevato un gruppo di contropartita composto da 3 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); + str.format("%02d", gruppoc); + record.overwrite(str,85); //Gruppo di contropartita + + int contoc = rmov.get_int(RMV_CONTOC); + if (contoc > 99) + return error_box("Rilevato un conto di contropartita composto da 3 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); + str.format("%02d", contoc); + record.overwrite(str,87); //Conto di contropartita + + long sottocc = rmov.get_long(RMV_SOTTOCONTOC); + str.format("%06ld", sottocc); + record.overwrite(str,89); //Sottoconto di contropartita + + if (_codpag.len() > 2) + return error_box("Rilevato un codice di pagamento composto da 3 o piu' cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); + str.format("%-2s", (const char*) _codpag); + record.overwrite(str,95); //Codice di pagamento + + real importo (rmov.get_real(RMV_IMPORTO)); + str.format("%011s", (const char*) importo.string()); + record.overwrite(str,97); //Importo riga di movimento + + str.format("%05d", _uprotiva); + record.overwrite(str,108); //Ultimo numero di protocollo IVA + + TString tipoc = rmov.get(RMV_TIPOC); + record.overwrite(tipoc,219); //Flag cliente/fornitore + + record.overwrite(_tipodoc,220); //Tipo documento + + _numrec++; + TString stringa; + stringa.format("%06ld", _numrec); + int posiz = _files.find("Z"); + _control_rec.overwrite(stringa,((posiz * 6) + 47)); + _tras_file.write_control_rec(_control_rec,size); + _tras_file.close(); + + _tras_file.open(_trasf,TRUE); + _tras_file.write_control_rec(record,size); + _tras_file.close(); + } + delete _prog; + + //Inizializzo l'ultima sigla file elaborato su trasfer con la sigla del file successivo da inviare + //e inizializzo la chiave, altrimenti se si blocca l'invio subito dopo aver finito un file si rischia di + //ritrasferire l'ultimo record quando si riparte; inoltre non si riesce a inviare il file successivo perche' + //la chiave e' compilata con i dati del file precedente. + _tras_file.open(_trasf); + leggi_record_controllo(); + TString chiave,app,sigla; + app.format("%-15s", (const char*) chiave); + char sigla_p = _tras_file.ult_file()[0]; + int posiz = _files.find(sigla_p); + TString nuova_sigla = " "; + if (posiz < _files.len()) + nuova_sigla = _files.mid(posiz+1,1); + + _control_rec.overwrite(nuova_sigla,240); + _control_rec.overwrite(app,241); + _tras_file.write_control_rec(_control_rec,size); + _tras_file.close(); + + setta_tabella_ditta(m,"D",FALSE); + setta_parametri_record(m,"D"); + + return TRUE; +} + +bool TInv_cont::testata_mov_IVA(long numreg) +{ + TLocalisamfile mov (LF_MOV); + + mov.setkey(1); + mov.zero(); + mov.put(MOV_NUMREG, numreg); + if (mov.read() == NOERR) + { + _codcf = mov.get_long(MOV_CODCF); + _data74ter = mov.get_date(MOV_DATA74TER); + _corrlire = mov.get_real(MOV_CORRLIRE); + _codvali = mov.get (MOV_CODVALI); + _cambioi = mov.get_real(MOV_CAMBIOI); + _corrval = mov.get_real(MOV_CORRVALUTA); + _ocfpi = mov.get (MOV_OCFPI); + if (_ocfpi.not_empty()) + cerca_occasionale(); + } + else + return FALSE; + + return TRUE; +} + +void TInv_cont::cerca_occasionale() +{ + TLocalisamfile occas (LF_OCCAS); + + occas.setkey(1); + occas.zero(); + occas.put(OCC_CFPI, _ocfpi); + if (occas.read() == NOERR) + { + _ragsococc = occas.get(OCC_RAGSOC); + _indocc = occas.get(OCC_INDIR); + _capocc = occas.get(OCC_CAP); + TString com = occas.get(OCC_COM); + cerca_comune_occas(com); + } + else + { + _ragsococc = ""; + _indocc = ""; + _capocc = ""; + _localocc = ""; + _provocc = ""; + } +} + +void TInv_cont::cerca_comune_occas(const TString& com) +{ + TLocalisamfile comuni (LF_COMUNI); + + comuni.setkey(1); + comuni.zero(); + comuni.put(COM_COM, com); + if (comuni.read() == NOERR) + { + _localocc = comuni.get(COM_DENCOM); + _provocc = comuni.get(COM_PROVCOM); + } +} + +bool TInv_cont::invio_mov_IVA(TString& key,TMask& m) +{ + int size = 256; + TString record(size); + long numreg,nreg_p; + int numrig; + int numero_righe = 0; + TLocalisamfile rmoviva (LF_RMOVIVA); + + nreg_p = -1; + + long cicli = rmoviva.items(); + cicli -= _numrec; + _prog = new TProgind(cicli,"Invio Movimenti iva in corso... Prego attendere.",FALSE); + + if (key == "") + rmoviva.first(); + else + { + numreg = atol(key.mid(2,6)); + numrig = atoi(key.mid(8,2)); + rmoviva.setkey(1); + rmoviva.zero(); + rmoviva.put(RMI_NUMREG, numreg); + rmoviva.put(RMI_NUMRIG, numrig); + rmoviva.read(); + } + + for (; !rmoviva.eof(); rmoviva.next()) + { + TString str; + + _prog->addstatus(1); + _tras_file.open(_trasf); + + record.spaces(); + + long nreg = rmoviva.get_long(RMI_NUMREG); + int nrig = rmoviva.get_int (RMI_NUMRIG); + + //Salvataggio della chiave sul record di controllo del file trasfer + leggi_record_controllo(); + TString chiave,app; + chiave.format("%2s%06ld%02d", (const char*) "U1", nreg, nrig); + app.format("%-15s", (const char*) chiave); + _control_rec.overwrite("U",240); + _control_rec.overwrite(app,241); + // _tras_file.write_control_rec(_control_rec,size); + // _tras_file.close(); + + if (nreg > 999999) + return error_box("Rilevato un numero di registrazione composto da 7 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); + + if (nrig > 99) + return error_box("Rilevato un numero di riga composto da 3 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); + + record.overwrite("U1",0); //Tipo record + + str.format("%06ld", nreg); + record.overwrite(str,2); //Numero di registrazione + + str.format("%02d", nrig); + record.overwrite(str,8); //Numero di riga + + if (nreg != nreg_p) + { + numero_righe = 0; + if (!testata_mov_IVA(nreg)) + return error_box("Rilevata riga mancante di testata: impossibile proseguire"); + } + + numero_righe++; + if (numero_righe > 9) + return error_box("Rilevata una registrazione IVA con piu' di 9 righe: impossibile proseguire"); + + nreg_p = nreg; + + str.format("%06ld", _codcf); + record.overwrite(str,15); //Codice cliente/fornitore + + real imponibile (rmoviva.get_real(RMI_IMPONIBILE)); + str.format("%011s", (const char*) imponibile.string()); + record.overwrite(str,21); //Imponibile + + //Se trovo un codice iva composto da piu' di 2 cifre l'invio viene interrotto + TString codiva (rmoviva.get(RMI_CODIVA)); + if (codiva.len() > 2) + return error_box("Rilevato un codice IVA composto da 3 o piu' cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); + str.format("%02s", (const char*) codiva); + record.overwrite(str,32); //Codice iva + + real imposta (rmoviva.get_real(RMI_IMPOSTA)); + str.format("%09s", (const char*) imposta.string()); + record.overwrite(str,34); //Imposta + + int tipocr = rmoviva.get_int(RMI_TIPOCR); + str.format("%01d", tipocr); + record.overwrite(str,43); //Tipo costo/ricavo + + int tipodet = rmoviva.get_int(RMI_TIPODET); + str.format("%01d", tipodet); + record.overwrite(str,44); //Tipo detraibilita' + + int gruppo = rmoviva.get_int(RMI_GRUPPO); + if (gruppo > 99) + return error_box("Rilevato un gruppo composto da 3 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); + str.format("%02d", gruppo); + record.overwrite(str,45); //Gruppo + + int conto = rmoviva.get_int(RMI_CONTO); + if (conto > 99) + return error_box("Rilevato un conto composto da 3 cifre in %07ld riga %03d: impossibile proseguire",nreg,nrig); + str.format("%02d", conto); + record.overwrite(str,47); //Conto + + long sottoc = rmoviva.get_long(RMI_SOTTOCONTO); + str.format("%06ld", sottoc); + record.overwrite(str,49); //Sottoconto + + TString data74terstr = _data74ter.string(); + str = riconverti(data74terstr); + record.overwrite(str,55); //Data per registri 74 TER + + if (_ocfpi.not_empty()) + { + str.format("%-.25s", (const char*) _ragsococc); + record.overwrite(str,61); //Ragione sociale cliente occasionale + + str.format("%-.22s", (const char*) _indocc); + record.overwrite(str,86); //indirizzo cliente occasionale + + str.format("%-.18s", (const char*) _localocc); + record.overwrite(str,108); //Localita cliente occasionale + + str.format("%-5s", (const char*) _capocc); + record.overwrite(str,126); //Codice avviamento postale cliente occasionale + + str.format("%-.2s", (const char*) _provocc); + record.overwrite(str,131); //Provincia cliente occasionale + } + + int tipoatt = rmoviva.get_int(RMI_TIPOATT); + str.format("%01d", tipoatt); + record.overwrite(str,133); //Tipo attivita' + + str.format("%011s", (const char*) _corrlire.string()); + record.overwrite(str,135); //Corrispettivo in lire + + record.overwrite(_codvali,146); //Codice valuta + + str.format("%011s", (const char*) _cambioi.string()); + record.overwrite(str,149); //Cambio + + str.format("%014s", (const char*) _corrval.string()); + record.overwrite(str,160); //Corrispettivo in valuta + + _numrec++; + TString stringa; + stringa.format("%06ld", _numrec); + int posiz = _files.find("U"); + _control_rec.overwrite(stringa,((posiz * 6) + 47)); + _tras_file.write_control_rec(_control_rec,size); + _tras_file.close(); + + _tras_file.open(_trasf,TRUE); + _tras_file.write_control_rec(record,size); + _tras_file.close(); + } + delete _prog; + + //Inizializzo l'ultima sigla file elaborato su trasfer con la sigla del file successivo da inviare + //e inizializzo la chiave, altrimenti se si blocca l'invio subito dopo aver finito un file si rischia di + //ritrasferire l'ultimo record quando si riparte; inoltre non si riesce a inviare il file successivo perche' + //la chiave e' compilata con i dati del file precedente. + _tras_file.open(_trasf); + leggi_record_controllo(); + TString chiave,app,sigla; + app.format("%-15s", (const char*) chiave); + char sigla_p = _tras_file.ult_file()[0]; + int posiz = _files.find(sigla_p); + TString nuova_sigla = " "; + if (posiz < _files.len()) + nuova_sigla = _files.mid(posiz+1,1); + + _control_rec.overwrite(nuova_sigla,240); + _control_rec.overwrite(app,241); + _tras_file.write_control_rec(_control_rec,size); + _tras_file.close(); + + setta_tabella_ditta(m,"D",FALSE); + setta_parametri_record(m,"D"); + + return TRUE; +} + +bool TInv_cont::menu(MENU_TAG m) +{ + if (m == BAR_ITEM(1)) + return main_loop(); + return FALSE; +} + +int cg2900 (int argc, char* argv[]) +{ + TInv_cont a; + + a.run(argc,argv, "Invio contabilita'"); + + return TRUE; +} diff --git a/cg/cglib.h b/cg/cglib.h index 8462eca88..4900b52f2 100755 --- a/cg/cglib.h +++ b/cg/cglib.h @@ -97,8 +97,8 @@ public: class TTab_conti : public TAssoc_array { public: - void aggiorna_conto(const TBill& tc, int anno_es, const real& importo, - char sezione, bool movap, bool provv, bool somma); + void aggiorna_conto(const TBill& tc, int anno_es, const TImporto& importo, + bool movap, bool provv, bool somma); TConto* add(const TBill& c, int anno); TConto* find(const TBill& c, int anno); @@ -108,7 +108,7 @@ public: class TSaldo_agg : public TObject { - TTab_conti _tab_conti; + TTab_conti _tab_conti; bool _movap; // se e' mov. d'apertura (aggiorno SALDO e FLAGSALINI in // saldi) bool _provv; @@ -120,7 +120,7 @@ class TSaldo_agg : public TObject public: void clear_saldi(int year); void registra(); - void aggiorna (const TBill& tc, const real& importo, char sezione, bool somma=TRUE); + void aggiorna (const TBill& tc, const TImporto& importo, bool somma=TRUE); void aggiorna (int gruppo, int conto, long sottoconto, const real& importo, char sezione, bool somma=TRUE); diff --git a/cg/cglib02.cpp b/cg/cglib02.cpp index 37666a1b6..63e36ffaa 100755 --- a/cg/cglib02.cpp +++ b/cg/cglib02.cpp @@ -40,30 +40,36 @@ void TTab_conti::remove(const TBill& c, int anno) } void TTab_conti::aggiorna_conto(const TBill& tcon, - int anno_es, const real& importo, char sezione, + int anno_es, const TImporto& importo, bool movap, bool provv, bool somma) { TConto* tc = find(tcon, anno_es); if (tc == NULL) tc = add(tcon, anno_es); - real i = somma ? importo : -importo; + const real i(somma ? importo.valore() : -importo.valore()); if (movap) { - if (sezione == 'D') tc->saldo() += i; - else tc->saldo() -= i; + if (importo.sezione() == 'D') + tc->saldo() += i; + else + tc->saldo() -= i; } else if (provv) { - if (sezione == 'D') tc->darepro() += i; - else tc->averepro() += i; + if (importo.sezione() == 'D') + tc->darepro() += i; + else + tc->averepro() += i; } else { - if (sezione == 'D') tc->dare() += i; - else tc->avere() += i; + if (importo.sezione() == 'D') + tc->dare() += i; + else + tc->avere() += i; } // rimuovo dalla tabella il conto se dare e avere vanno a zero @@ -83,15 +89,15 @@ TSaldo_agg::TSaldo_agg() reset(); // pulizia dell'array dei conti } -void TSaldo_agg::aggiorna(const TBill& tc, const real& importo, char sezione, bool somma) -{ - _tab_conti.aggiorna_conto(tc, _anno_es, importo, sezione, _movap, _provv, somma); +void TSaldo_agg::aggiorna(const TBill& tc, const TImporto& imp, bool somma) +{ + _tab_conti.aggiorna_conto(tc, _anno_es, imp, _movap, _provv, somma); } void TSaldo_agg::aggiorna(int gruppo, int conto, long sottoconto, const real& importo, char sezione, bool somma) { - _tab_conti.aggiorna_conto(TBill(gruppo, conto, sottoconto), _anno_es, importo, - sezione, _movap, _provv, somma); + const TImporto imp(sezione, importo); + _tab_conti.aggiorna_conto(TBill(gruppo, conto, sottoconto), _anno_es, imp, _movap, _provv, somma); } void TSaldo_agg::reset() diff --git a/cg/conto.cpp b/cg/conto.cpp index fd856c36b..daad236a3 100755 --- a/cg/conto.cpp +++ b/cg/conto.cpp @@ -81,36 +81,44 @@ const TBill& TBill::add_to(TToken_string& ts, int from, int mode) } -const char* TBill::file2type(int num) const -{ - const char* t = "TIPOC"; - - switch (num) - { - case LF_PARTITE: - case LF_SCADENZE: - t = "TIPOCF"; break; - default: - break; - } - - return t; +const char* TBill::field_name(int n, bool contro) const +{ + CHECKD(n >= 0 && n <= 3, "Invalid bill field", n); + + const char* f; + if (contro) + switch(n) + { + case 0: f = "GRUPPOC"; break; + case 1: f = "CONTOC"; break; + case 2: f = "SOTTOCONTC"; break; + default:f = "TIPOCC"; break; + } + else + switch(n) + { + case 0: f = "GRUPPO"; break; + case 1: f = "CONTO"; break; + case 2: f = "SOTTOCONTO"; break; + default:f = "TIPOC"; break; + } + return f; } -void TBill::put(TRectype& r) const +void TBill::put(TRectype& r, bool c) const { - r.put(file2type(r.num()), tipo()); - r.put("GRUPPO", gruppo()); - r.put("CONTO", conto()); - r.put("SOTTOCONTO", sottoconto()); + r.put(field_name(0, c), gruppo()); + r.put(field_name(1, c), conto()); + r.put(field_name(2, c), sottoconto()); + r.put(field_name(3, c), tipo()); } -bool TBill::get(const TRectype& r) +bool TBill::get(const TRectype& r, bool c) { - set(r.get_int("GRUPPO"), - r.get_int("CONTO"), - r.get_long("SOTTOCONTO"), - r.get_char(file2type(r.num()))); + set(r.get_int(field_name(0, c)), + r.get_int(field_name(1, c)), + r.get_long(field_name(2, c)), + r.get_char(field_name(3, c))); if (r.num() == LF_RMOVIVA) tipo_cr(r.get_int("TIPOCR")); @@ -285,83 +293,3 @@ const char* TBill::string(int mode) } -/////////////////////////////////////////////////////////// -// Importo -/////////////////////////////////////////////////////////// - -const TImporto& TImporto::add_to(TToken_string& s) const -{ - const bool dare = sezione() == 'D'; - const char* v = valore().string(); - s.add(dare ? v : "", 0); - s.add(dare ? "" : v, 1); - return *this; -} - -// Cerified 99% -// Ambigous section for ZERO -const TImporto& TImporto::operator =(TToken_string& sv) -{ - _valore = real(sv.get(0)); - if (_valore == ZERO) - { - _valore = real(sv.get()); - _sezione = 'A'; - } - else - _sezione = 'D'; - return *this; -} - - -const TImporto& TImporto::set(char s, const real& v) -{ - CHECKD(s == 'D' || s == 'A', "Sezione errata per importo: codice ", (int)s); - _sezione = s; _valore = v; - return *this; -} - - -const TImporto& TImporto::operator += (const TImporto& i) -{ - if (_valore.is_zero()) - _sezione = i._sezione; - - if (_sezione == i._sezione) - _valore += i._valore; - else - _valore -= i._valore; - return *this; -} - - -const TImporto& TImporto::operator -= (const TImporto& i) -{ - if (_valore.is_zero()) - _sezione = i._sezione; - - if (_sezione == i._sezione) - _valore -= i._valore; - else - _valore += i._valore; - return *this; -} - - -const TImporto& TImporto::swap_section() -{ - _sezione = (_sezione == 'D') ? 'A' : 'D'; - return *this; -} - - -const TImporto& TImporto::normalize() -{ - if (_valore.sign() < 0) - { - _valore = -_valore; - swap_section(); - } - return *this; -} - diff --git a/cg/conto.h b/cg/conto.h index 551137341..c94b5ee10 100755 --- a/cg/conto.h +++ b/cg/conto.h @@ -20,7 +20,7 @@ protected: virtual const char* class_name() const { return "Conto"; } const TBill& copy(const TBill& b); - const char* file2type(int logicnum) const; + const char* field_name(int n, bool contro) const; public: TBill(int g = 0, int c = 0, long s = 0L, char t = ' ', const char* d = NULL, int r = -1) @@ -56,39 +56,13 @@ public: bool sospeso() const { return _sospeso; } // _sospeso e' letto nella read() char sezione() const { return _sezione; } - void put(TRectype& r) const; - bool get(const TRectype& r); + void put(TRectype& r, bool contro = FALSE) const; + bool get(const TRectype& r, bool contro = FALSE); const char* string(int mode = 0); }; -class TImporto : public TObject -{ - char _sezione; - real _valore; - -public: - char sezione() const { return _sezione; } - const real& valore() const { return _valore; } - - bool is_zero() const { return _valore.is_zero(); } - - const TImporto& operator=(const TImporto& i) { return set(i.sezione(), i.valore()); } - const TImporto& operator=(TToken_string& sv); - const TImporto& operator+=(const TImporto& i); - const TImporto& operator-=(const TImporto& i); - const TImporto& normalize(); - const TImporto& swap_section(); - - const TImporto& set(char s, const real& v); - const TImporto& add_to(TToken_string& s) const; - - TImporto(char s = 'D', const real& v = ZERO) { set(s, v); } - TImporto(const TImporto& i) : _sezione(i._sezione), _valore(i._valore) {} -}; - - enum TIndbil { ib_null, ib_attivita, ib_passivita, ib_costi, ib_ricavi, ib_conti_ordine }; class TConto : public TBill diff --git a/cg/pagament.cpp b/cg/pagament.cpp index d21aa1dd3..94439e5d4 100755 --- a/cg/pagament.cpp +++ b/cg/pagament.cpp @@ -994,7 +994,9 @@ TPartita::TPartita(int anno, const char* num) } int TPartita::add_riga(const TRectype& r) -{ +{ + CHECK(r.num() == LF_PARTITE, "Tipo record errato"); + const char sez = r.get_char(PART_SEZ); const real val = r.get_real(PART_IMPORTO); const TImporto imp(sez, val); @@ -1025,6 +1027,13 @@ int TPartita::add_riga(const TRectype& r) return _part.add_row(r); } +void TPartita::remove_riga(TRectype& z) +{ + z.zero(PART_IMPORTO); + add_riga(z); + _part.destroy_row(z, TRUE); +} + int TPartita::add_rata(const TRectype& r) { return _scad.add_row(r); @@ -1093,7 +1102,27 @@ bool TPartita::rata_pagata(int r) const const bool pagata = importo.is_zero(); return pagata; } - + +real TPartita::importo_speso(long nreg, int numrig) const +{ + real imp; + + for (int r = righe(); r > 0; r--) + { + const TRectype& pag = riga(r); + + const long reg = pag.get_long(PART_NREG); + if (reg == nreg) + { + const int num = pag.get_int(PART_NUMRIG); + if (num == numrig) + imp += pag.get_real(PART_IMPORTO); + } + } + + return imp; +} + /////////////////////////////////////////////////////////// // TPartite_array /////////////////////////////////////////////////////////// @@ -1106,31 +1135,90 @@ const TString& TPartite_array::key(int anno, const char* num) } // Certified 99% -void TPartite_array::add(TPartita* p) -{ - const TString& k = key(p->anno(), p->numero()); - TAssoc_array::add(k, p); -} - -TPartita* TPartite_array::partita(int anno, const char* num) +TPartita* TPartite_array::find(int anno, const char* num, bool create) { const TString& k = key(anno, num); TPartita* p = (TPartita*)objptr(k); + if (p == NULL && create) + { + p = new TPartita(anno, num); + if (p->ok()) + add(k, p); + else + { + delete p; + p = NULL; + } + } return p; } +TPartita* TPartite_array::find(const TRectype& r, bool create) +{ + const int anno = r.get_int(PART_ANNO); + const char* num = r.get_str(PART_NUMPART); + return find(anno, num, create); +} + +TPartita& TPartite_array::partita(int anno, const char* num) +{ + TPartita* game = find(anno, num, TRUE); + CHECKS(game, "Partita errata ", num); + return *game; +} + +TPartita& TPartite_array::partita(const TRectype& r) +{ + TPartita* game = find(r, TRUE); + CHECK(game, "Partita errata"); + return *game; +} + bool TPartite_array::write(bool re) { int err = NOERR; + TPartita* game; restart(); - TPartita* p; - while ((p = (TPartita*)get()) != NULL) + while ((game = (TPartita*)get()) != NULL) { - err = p->write(re); + err = game->write(re); if (err != NOERR) // L'errore viene gia' segnalato dalla partita break; } return err == NOERR; } + +// Aggiunge all'array tutte le partite che si riferiscono alla registrazione nreg +int TPartite_array::add_reg_num(long nreg, int numrig) +{ + TRelation rel(LF_PARTITE); + TRectype& part = rel.lfile().curr(); + + // Costruzione filtro del cursore + part.zero(); + part.put(PART_NREG, nreg); + if (numrig > 0) + part.put(PART_NUMRIG, numrig); + + const TRectype filter(part); + + TCursor cur(&rel, "", 3, &filter, &filter); + + for (cur = 0; cur.ok(); ++cur) + partita(part); // Aggiungi partita se non esiste gia' + + return (int)cur.items(); +} + +real TPartite_array::importo_speso(long nreg, int numrig) +{ + real imp; + const int found = add_reg_num(nreg, numrig); + if (found) + for (TPartita* game = first(); game; game = next()) + imp += game->importo_speso(nreg, numrig); + return imp; +} + diff --git a/cg/pagament.h b/cg/pagament.h index 9093d376d..728ed23a7 100755 --- a/cg/pagament.h +++ b/cg/pagament.h @@ -163,6 +163,7 @@ public: // TObject public: int add_riga(const TRectype& r); const TRectype& riga(int r) const { return _part.row(r); } + void remove_riga(TRectype& z); int righe() const { return _part.rows(); } bool rata_pagata(int r) const; @@ -180,6 +181,8 @@ public: const TString& numero() const { return riga(1).get(PART_NUMPART); } const TString& descrizione() const { return riga(1).get(PART_DESCR); } const TImporto& totale() const { return _totale; } + + real importo_speso(long numreg, int numrig) const; TPartita(int anno, const char* num); }; @@ -187,22 +190,29 @@ public: class TPartite_array : private TAssoc_array { - TString16 _key; + TString16 _key; // Work string protected: - const TString& key(int anno, const char* num); + const TString& key(int anno, const char* num); // Build key for TAssoc_array + TPartita* find(int anno, const char* numero, bool create); + TPartita* find(const TRectype& part, bool create); -public: // TAssoc_array +public: // TAssoc_array virtual void destroy() { TAssoc_array::destroy(); } public: - TPartita* partita(int anno, const char* numero); - - void add(TPartita* p); + TPartita& partita(int anno, const char* numero); + TPartita& partita(const TRectype& r); bool write(bool re = FALSE); bool rewrite() { return write(TRUE); } + int add_reg_num(long numreg, int numrig); + real importo_speso(long numreg, int numrig); + + TPartita* first() { restart(); return next(); } + TPartita* next() { return (TPartita*)get(); } + TPartite_array() {} };