diff --git a/m770/77stq.cpp b/m770/77stq.cpp index 6ba9bb363..068a14d84 100755 --- a/m770/77stq.cpp +++ b/m770/77stq.cpp @@ -2,6 +2,15 @@ #include "77stba.h" #include "77stqab.h" #include "77stqc.h" + +// Quadro D +#define QD_FORMLEN 72 +#define POS_DITTA 120 +#define QD_PAGINE 4 +#define QD_RIGHE_PRIMA 4 +#define QD_RIGHE_SECONDA 7 +#define QD_RIGHE_TERZA 7 +#define QD_RIGHE_QUARTA 6 // // Lista modifiche @@ -168,6 +177,7 @@ bool TDicForm::print(const long codditta, const long NumFis, const long NumNoFis if (_PaginaCorrente == PRIMA) { if (_modulaser) ClearFlagModulaser(); + attiva_totali('F'); for (int righe=0; righe < QD_RIGHE_PRIMA; righe++) { @@ -201,7 +211,7 @@ bool TDicForm::print(const long codditta, const long NumFis, const long NumNoFis else ++(*cur); } - StabilitaInesistenzaFis = !Trovato; + StabilitaInesistenzaFis = _finite_fis = !Trovato; } if (StabilitaInesistenzaFis) @@ -219,7 +229,7 @@ bool TDicForm::print(const long codditta, const long NumFis, const long NumNoFis set_body(pr, 'F'); // La stampa e' finita se ho STAMPATO l'ultimo record LastRecord = cur->pos() >= _Items-1; - _EndPrintDitta = LastRecord; +// _EndPrintDitta = LastRecord; if (!LastRecord) { ++(*cur); @@ -254,7 +264,7 @@ bool TDicForm::print(const long codditta, const long NumFis, const long NumNoFis if (CtrFis == 0L) _finite_fis = TRUE; set_body(pr, 'F'); LastRecord = cur->pos() >= _Items-1; - _EndPrintDitta = LastRecord; +// _EndPrintDitta = LastRecord; if (!LastRecord) { ++(*cur); @@ -290,7 +300,7 @@ bool TDicForm::print(const long codditta, const long NumFis, const long NumNoFis if (CtrFis == 0L) _finite_fis = TRUE; set_body(pr, 'F'); LastRecord = cur->pos() >= _Items-1; - _EndPrintDitta = LastRecord; +// _EndPrintDitta = LastRecord; _CtrFisStampati++; if (!LastRecord) { @@ -305,7 +315,7 @@ bool TDicForm::print(const long codditta, const long NumFis, const long NumNoFis if (_PaginaCorrente == QUARTA) { - azzera_totali(); + attiva_totali('G'); for (int righe=0; righe < QD_RIGHE_QUARTA; righe++) { if (!righe) @@ -340,7 +350,7 @@ bool TDicForm::print(const long codditta, const long NumFis, const long NumNoFis else ++(*cur); } - StabilitaInesistenzaNoFis = !Trovato; + StabilitaInesistenzaNoFis = _finite_nofis = !Trovato; } if (StabilitaInesistenzaNoFis) @@ -354,10 +364,11 @@ bool TDicForm::print(const long codditta, const long NumFis, const long NumNoFis else { CtrNoFis--; - if (CtrNoFis == 0L) _finite_nofis = TRUE; + if (CtrNoFis == 0L) + _finite_nofis = TRUE; set_body(pr, 'G'); LastRecord = cur->pos() >= _Items-1; - _EndPrintDitta = LastRecord; +// _EndPrintDitta = LastRecord; _CtrNoFisStampati++; if (!LastRecord) { @@ -368,7 +379,9 @@ bool TDicForm::print(const long codditta, const long NumFis, const long NumNoFis } } PtrNoFis = cur->pos(); - } + _EndPrintDitta = _finite_fis && _finite_nofis; + } + } // for pagina.. } // while !_EndPrintDitta close_print(); @@ -591,13 +604,66 @@ void TDicForm::jump_to_line(TPrinter& pr, const int lin) fill_page(pr, lin - _RigaCorr); } -void TDicForm::stampa_totali(TPrinter& pr) + +int TDicForm::firma_dichiarante() +{ + TPrint_section& footer = section('F', last_page); + TForm_item& firma = footer.find_field(FIRMADIC); + + const int y = firma.y()-1; + + TString cognome = firma.get(); + if (cognome.len() > 30 && cognome[29] == ' ') + { + TString nome = cognome.mid(30, -1); + cognome.cut(30); cognome.trim(); + cognome << ' ' << nome; + firma.set(cognome); + + footer.row(y).reset(); + footer.row(y).put(cognome, firma.x()-1); + } + + return y; +} + +void TDicForm::attiva_totali(char tipo) +{ + TPrint_section& foot = section('F', last_page); + for (int f = foot.fields()-1; f >= 0; f--) + { + TForm_item& item = foot.field(f); + if (tipo == 'F') + { + _tot_giu.add(item.get(), f); + if (_tot_fis.items()) + item.set(_tot_fis.row(f)); + else + item.set(""); + } + else + { + _tot_fis.add(item.get(), f); + if (_tot_giu.items()) + item.set(_tot_giu.row(f)); + else + item.set(""); + } + } +} + +void TDicForm::stampa_totali(TPrinter& pr, bool tot, bool fir) { TPrint_section& totali = section('F', last_page); totali.update(); - for (int i = 0; i < totali.items(); i++) - { - pr.print(totali.row(i)); + + const int y = firma_dichiarante(); + for (int i = 0; i <= y; i++) + { + TPrintrow& row = totali.row(i); + if ((i < y && !tot) || (i == y && !fir)) + row.reset(); + pr.print(row); _RigaCorr++; } } @@ -650,9 +716,6 @@ void TDicForm::stampa_testata(TPrinter& pr) void TDicForm::next_page(TPrinter& pr) { - PaginaQuadro PagCorr = curr_page(); -// if (PagCorr >= TERZA) -// stampa_totali(pr); fill_page(pr, -1); // formfeed "adattato" inc_curr_page(); } @@ -660,8 +723,12 @@ void TDicForm::next_page(TPrinter& pr) void TDicForm::azzera_totali() { TPrint_section& foot = section('F', last_page); + foot.reset(); for (int f = foot.fields()-1; f >= 0; f--) foot.field(f).set(""); + + _tot_fis.destroy(); + _tot_giu.destroy(); } void TDicForm::set_body(TPrinter& pr, const char tipo) @@ -680,33 +747,6 @@ void TDicForm::set_body(TPrinter& pr, const char tipo) progind()->addstatus(1); } -void TDicForm::firma_dichiarante() -{ - TPrint_section& footer = section('F', last_page); - TForm_item& firma = footer.find_field(FIRMADIC); - - if (_PaginaCorrente == PRIMA) - firma.hide(); - if (_PaginaCorrente == QUARTA) - { - firma.show(); - const int y = firma.y()-1; - - TString cognome = firma.get(); - if (cognome.len() > 30 && cognome[29] == ' ') - { - TString nome = cognome.mid(30, -1); - cognome.cut(30); cognome.trim(); - cognome << ' ' << nome; - firma.set(cognome); - - footer.row(y).reset(); - footer.row(y).put(cognome, firma.x()-1); - } - } -// footer.update(); -} - void TDicForm::posiziona() { _GiaPosizionato = TRUE; @@ -755,8 +795,7 @@ void TQuadroG::inc_curr_page() if (_PaginaCorrente == PRIMA) _PaginaCorrente = SECONDA; else - if (_PaginaCorrente == SECONDA) - _PaginaCorrente = PRIMA; + _PaginaCorrente = PRIMA; } @@ -1124,10 +1163,10 @@ void TDistintaG::next_page(TPrinter& pr) { PaginaQuadro PagCorr = curr_page(); if (PagCorr == PRIMA) - jump_to_line(pr,58); + jump_to_line(pr,57); else if (PagCorr == SECONDA) - jump_to_line(pr,52); + jump_to_line(pr,51); stampa_totali(pr); TPrint_section& body = section('F', last_page); body.reset(); @@ -1205,9 +1244,7 @@ bool TDistintaG::print(const long codditta, const long NumFis, const long NumNoF _RigaCorr = 0; const long items = filtra(codditta); -// Questo modulo non ha MAI il posizionamento - _PaginaPosizionamento=FALSE; - + while (!_EndPrintDitta) { for (int pagina=1; pagina <= QGD_PAGINE; pagina++, next_page(pr)) @@ -1218,8 +1255,6 @@ bool TDistintaG::print(const long codditta, const long NumFis, const long NumNoF { if (_modulaser) ClearFlagModulaser(); - if (_EndPrintDitta) continue; - for (int righe=0; righe < QGD_RIGHE_PRIMA; righe++) { // Stampa intestazione, solo sul primo foglio. @@ -1229,9 +1264,8 @@ bool TDistintaG::print(const long codditta, const long NumFis, const long NumNoF stampa_testata(pr); } - _EndPrintDitta=(_finite_fis && _finite_nofis) || - cur->pos() >= cur->items()-1; - + _EndPrintDitta=_finite_fis && _finite_nofis; + if (_finite_fis || StabilitaInesistenzaFis) break; @@ -1287,7 +1321,6 @@ bool TDistintaG::print(const long codditta, const long NumFis, const long NumNoF if (_PaginaCorrente == SECONDA) { - if (_EndPrintDitta) continue; // Reset del flag di pagina con posiz. if (_posiziona && _PaginaPosizionamento) _PaginaPosizionamento = FALSE; for (int righe=0; righe < QGD_RIGHE_SECONDA; righe++) @@ -1299,9 +1332,6 @@ bool TDistintaG::print(const long codditta, const long NumFis, const long NumNoF if (!righe) fill_page(pr, HEADER_SECONDA_GD); - _EndPrintDitta=(_finite_fis && _finite_nofis) || - (StabilitaInesistenzaNoFis && StabilitaInesistenzaFis); - if (_finite_nofis || StabilitaInesistenzaNoFis) break; @@ -1332,9 +1362,6 @@ bool TDistintaG::print(const long codditta, const long NumFis, const long NumNoF // Gestisce i casi in cui non ci sono percipienti nella distinta.. if (items==0) _EndPrintDitta=TRUE; - - _EndPrintDitta=(_finite_fis && _finite_nofis) || - cur->pos() >= cur->items()-1; if (StabilitaInesistenzaNoFis) break; @@ -1784,20 +1811,22 @@ bool TQuadroD::controlla_percentuale(TCursor* cur, const real& perc_p) { bool stampa = TRUE; - long ditta_p = cur->curr().get_long(QUD_CODDITTA); - char tipo_p = cur->curr().get_char(QUD_TIPOA); - long codana_p = cur->curr().get_long(QUD_CODANAGR); - TString codcaus_p = cur->curr().get (QUD_CODCAUS); + const TRectype& rec = cur->curr(); + + long ditta_p = rec.get_long(QUD_CODDITTA); + char tipo_p = rec.get_char(QUD_TIPOA); + long codana_p = rec.get_long(QUD_CODANAGR); + TString codcaus_p = rec.get (QUD_CODCAUS); if (quadro()[0] == 'D') codcaus_p = cur->curr(-14).get(quadro() == "D" ? "S2" : "S3"); ++(*cur); - long ditta = cur->curr().get_long(QUD_CODDITTA); - char tipo = cur->curr().get_char(QUD_TIPOA); - long codana = cur->curr().get_long(QUD_CODANAGR); - real perc = cur->curr().get_real(QUD_PERC); + long ditta = rec.get_long(QUD_CODDITTA); + char tipo = rec.get_char(QUD_TIPOA); + long codana = rec.get_long(QUD_CODANAGR); + real perc = rec.get_real(QUD_PERC); - TString codcaus = cur->curr().get (QUD_CODCAUS); + TString codcaus = rec.get (QUD_CODCAUS); if (quadro()[0] == 'D') codcaus = cur->curr(-14).get(quadro() == "D" ? "S2" : "S3"); @@ -1893,16 +1922,6 @@ void TQuadroD::set_body(TPrinter& pr, const char tipo) void TQuadroD::next_page(TPrinter& pr) { - PaginaQuadro PagCorr = curr_page(); -// if (PagCorr >= TERZA) -// { -// if (PagCorr == TERZA) -// jump_to_line(pr,64); -// else -// if (PagCorr == QUARTA) -// jump_to_line(pr,61); -// stampa_totali(pr); -// } fill_page(pr, -1); // formfeed "adattato" inc_curr_page(); } @@ -1915,6 +1934,9 @@ bool TQuadroD::print(const long codditta, const long NumFis, const long NumNoFis long CtrNoFis = NumNoFis; long PtrFis = -1L, PtrNoFis=-1L; TPrinter& pr = printer(); + + bool StampatiTotaliFis = FALSE; + bool StampatiTotaliGiu = FALSE; _CtrFisStampati = _CtrNoFisStampati = 0; _finite_fis = _finite_nofis = FALSE; @@ -1934,11 +1956,11 @@ bool TQuadroD::print(const long codditta, const long NumFis, const long NumNoFis { for (int pagina=1; pagina <= QD_PAGINE; pagina++, next_page(pr)) { -// pr.formlen(QD_FORMLEN); - firma_dichiarante(); + pr.formlen(dic_form_len()); + if (_PaginaCorrente == PRIMA) { - pr.formlen(dic_form_len()); + attiva_totali('F'); if (_modulaser) ClearFlagModulaser(); bool testata = TRUE; @@ -1949,38 +1971,23 @@ bool TQuadroD::print(const long codditta, const long NumFis, const long NumNoFis if (testata) { (*cur) = PtrFis >= 0L ? PtrFis : 0L; -// if (_PaginaPosizionamento) + if (_PaginaPosizionamento) fill_page(pr, 9); -// else -// fill_page(pr, 12); + else + fill_page(pr, 12); stampa_testata(pr); testata = FALSE; } if (_finite_fis || StabilitaInesistenzaFis) break; - // La prima volta si deve posizionare sul primo record di p.f. - if (PtrFis<0L && !StabilitaInesistenzaFis) + if (PtrFis < 0L && !StabilitaInesistenzaFis) { - bool Trovato = FALSE; - - while (!Trovato) - { - const long ditta = cur->curr().get_long(QUD_CODDITTA); - if (ditta != codditta) - break; - const char tipo = cur->curr().get(QUD_TIPOA)[0]; - if (tipo != 'G') - { - PtrFis = cur->pos(); - Trovato = TRUE; - break; - } - else - ++(*cur); - } - StabilitaInesistenzaFis = !Trovato; + const char tipo = cur->curr().get(QUD_TIPOA)[0]; + const bool Trovato = tipo == 'F'; + StabilitaInesistenzaFis = _finite_fis = !Trovato; + PtrFis = 0L; } if (StabilitaInesistenzaFis) @@ -1997,7 +2004,7 @@ bool TQuadroD::print(const long codditta, const long NumFis, const long NumNoFis if (CtrFis == 0L) _finite_fis = TRUE; real perc_p = cur->curr().get_real(QUD_PERC); - stampa = controlla_percentuale(cur,perc_p); + stampa = controlla_percentuale(cur, perc_p); if (stampa) set_body(pr, 'F'); else @@ -2007,7 +2014,7 @@ bool TQuadroD::print(const long codditta, const long NumFis, const long NumNoFis } // all'inizio del ciclo ora lo devo decrementare. // La stampa e' finita se ho STAMPATO l'ultimo record LastRecord = cur->pos() >= _Items-1; - _EndPrintDitta = LastRecord; +// _EndPrintDitta = LastRecord; if (!LastRecord) { ++(*cur); @@ -2022,8 +2029,9 @@ bool TQuadroD::print(const long codditta, const long NumFis, const long NumNoFis if (_PaginaCorrente == SECONDA) { // Reset del flag di pagina con posiz. - if (_posiziona && _PaginaPosizionamento) _PaginaPosizionamento = FALSE; - pr.formlen(dic_form_len()); + if (_posiziona && _PaginaPosizionamento) + _PaginaPosizionamento = FALSE; + bool testata = TRUE; for (int righe=0; righe < QD_RIGHE_SECONDA; righe++) { @@ -2057,7 +2065,7 @@ bool TQuadroD::print(const long codditta, const long NumFis, const long NumNoFis righe--; } LastRecord = cur->pos() >= _Items-1; - _EndPrintDitta = LastRecord; + // _EndPrintDitta = LastRecord; if (!LastRecord) { ++(*cur); @@ -2071,7 +2079,6 @@ bool TQuadroD::print(const long codditta, const long NumFis, const long NumNoFis if (_PaginaCorrente == TERZA) { - pr.formlen(dic_form_len()); bool testata = TRUE; for (int righe=0; righe < QD_RIGHE_TERZA; righe++) { @@ -2082,24 +2089,18 @@ bool TQuadroD::print(const long codditta, const long NumFis, const long NumNoFis _CtrFisStampati = 0; // conta quelli che stampo sulla terza testata = FALSE; } - - if (_finite_fis) - { - jump_to_line(pr,64); - stampa_totali(pr); - } + if (_finite_fis || StabilitaInesistenzaFis) break; (*cur) = PtrFis; const char tipo = cur->curr().get(QUD_TIPOA)[0]; - if (tipo != 'F') - break; - else + if (tipo == 'F') { CtrFis--; - if (CtrFis == 0L) _finite_fis = TRUE; + if (CtrFis == 0L) + _finite_fis = TRUE; real perc_p = cur->curr().get_real(QUD_PERC); stampa = controlla_percentuale(cur,perc_p); @@ -2111,24 +2112,34 @@ bool TQuadroD::print(const long codditta, const long NumFis, const long NumNoFis righe--; } LastRecord = cur->pos() >= _Items-1; - _EndPrintDitta = LastRecord; +// _EndPrintDitta = LastRecord; _CtrFisStampati++; if (!LastRecord) { ++(*cur); PtrFis = cur->pos(); LastRecord = cur->pos() >= _Items-1; - } + } + } + else + break; } PtrFis = cur->pos(); + + if (_finite_fis && !StampatiTotaliFis) + { + jump_to_line(pr, 64); + stampa_totali(pr, TRUE, FALSE); + StampatiTotaliFis = TRUE; + } } if (_PaginaCorrente == QUARTA) { - pr.formlen(dic_form_len()); - azzera_totali(); + attiva_totali('G'); bool testata = TRUE; + for (int righe=0; righe < QD_RIGHE_QUARTA; righe++) { stampa = TRUE; @@ -2139,12 +2150,7 @@ bool TQuadroD::print(const long codditta, const long NumFis, const long NumNoFis fill_page(pr, HEADER_QUARTA); testata = FALSE; } - - if (_finite_nofis) - { - jump_to_line(pr,61); - stampa_totali(pr); - } + if (_finite_nofis || StabilitaInesistenzaNoFis) break; @@ -2170,7 +2176,7 @@ bool TQuadroD::print(const long codditta, const long NumFis, const long NumNoFis else ++(*cur); } - StabilitaInesistenzaNoFis = !Trovato; + StabilitaInesistenzaNoFis = _finite_nofis = !Trovato; } if (StabilitaInesistenzaNoFis) @@ -2179,9 +2185,7 @@ bool TQuadroD::print(const long codditta, const long NumFis, const long NumNoFis (*cur) = PtrNoFis; const char tipo = cur->curr().get(QUD_TIPOA)[0]; - if (tipo != 'G') - break; - else + if (tipo == 'G') { CtrNoFis--; if (CtrNoFis == 0L) _finite_nofis = TRUE; @@ -2196,18 +2200,31 @@ bool TQuadroD::print(const long codditta, const long NumFis, const long NumNoFis righe--; } LastRecord = cur->pos() >= _Items-1; - _EndPrintDitta = LastRecord; +// _EndPrintDitta = LastRecord; _CtrNoFisStampati++; if (!LastRecord) { ++(*cur); PtrNoFis = cur->pos(); - LastRecord = cur->pos() >= _Items-1; + LastRecord = PtrNoFis >= _Items-1; } } + else + break; } PtrNoFis = cur->pos(); - firma_dichiarante(); + + jump_to_line(pr, 61); + const bool stampa = _finite_nofis && !StampatiTotaliGiu; + if (stampa) + { + stampa_totali(pr, TRUE, TRUE); + StampatiTotaliGiu = TRUE; + } + else + stampa_totali(pr, FALSE, TRUE); + + _EndPrintDitta = _finite_fis && _finite_nofis; } } // for pagina.. } // while !_EndPrintDitta @@ -2217,19 +2234,19 @@ bool TQuadroD::print(const long codditta, const long NumFis, const long NumNoFis class TStampaQuadroD : public TStampaQuadro { - TQuadroD* _form; - TCursor* _cur; + TQuadroD* _form; + TCursor* _cur; protected: - virtual bool user_create(); - virtual bool user_destroy(); + virtual bool user_create(); + virtual bool user_destroy(); - virtual TDicForm* get_form() const { return _form; } - virtual TCursor* get_cursor() const { return _cur; } + virtual TDicForm* get_form() const { return _form; } + virtual TCursor* get_cursor() const { return _cur; } - public: - TStampaQuadroD(const char* quadro, char livel); - virtual ~TStampaQuadroD() { } +public: + TStampaQuadroD(const char* quadro, char livel); + virtual ~TStampaQuadroD() { } }; TStampaQuadroD::TStampaQuadroD(const char* quadro, char liv) @@ -2242,7 +2259,7 @@ bool TStampaQuadroD::user_create() _form = new TQuadroD("77QD", quadro()); TString sortkey(80); - sortkey.format("CODDITTA|TIPOA|216@->RAGSOC|CODANAGR|14@->S3|PERC", LF_QUAD, LF_QUAD); + sortkey.format("CODDITTA|TIPOA|216@->RAGSOC|CODANAGR|CODCAUS|PERC", LF_QUAD, LF_QUAD); _cur = new TSorted_cursor(_form->TForm::relation(), sortkey); return TRUE; @@ -2260,15 +2277,19 @@ bool TStampaQuadroD::user_destroy() // QUADRO D1 ///////////////////////////////////////////////////////////////////////////////////////////// +#define QD1_RIGHE_PRIMA 6 +#define QD1_RIGHE_SECONDA 9 +#define QD1_RIGHE_TERZA 9 +#define QD1_RIGHE_QUARTA 8 + class TQuadroD1 : public TDicForm { real _totale, _quotapro, _speseant, _imponibile, _importo, _netto; bool _devo_sommare; protected: - virtual void next_page(TPrinter& pr); virtual bool print(const long codditta, const long NumFis, const long NumNoFis); - + public: bool controlla_percentuale(TCursor* cur, const real& perc_p); void set_body(TPrinter& pr, const char tipo); @@ -2313,26 +2334,25 @@ bool TQuadroD1::controlla_percentuale(TCursor* cur, const real& perc_p) void TQuadroD1::leggi_importi() { - TCursor* cur = cursor(); - - _totale = cur->curr().get_real(QD1_TOTALE); - _quotapro = cur->curr().get_real(QD1_QUOTAPRO); - _speseant = cur->curr().get_real(QD1_SPESEANT); - _imponibile = cur->curr().get_real(QD1_IMPONIBILE); - _importo = cur->curr().get_real(QD1_IMPORTO); - _netto = cur->curr().get_real(QD1_NETTO); + const TRectype& rec = cursor()->curr(); + _totale = rec.get_real(QD1_TOTALE); + _quotapro = rec.get_real(QD1_QUOTAPRO); + _speseant = rec.get_real(QD1_SPESEANT); + _imponibile = rec.get_real(QD1_IMPONIBILE); + _importo = rec.get_real(QD1_IMPORTO); + _netto = rec.get_real(QD1_NETTO); } void TQuadroD1::setta_importi(TPrint_section& body) { - TCursor* cur = cursor(); + const TRectype& rec = cursor()->curr(); - real totale = cur->curr().get_real(QD1_TOTALE); - real quotapro = cur->curr().get_real(QD1_QUOTAPRO); - real speseant = cur->curr().get_real(QD1_SPESEANT); - real imponibile = cur->curr().get_real(QD1_IMPONIBILE); - real importo = cur->curr().get_real(QD1_IMPORTO); - real netto = cur->curr().get_real(QD1_NETTO); + real totale = rec.get_real(QD1_TOTALE); + real quotapro = rec.get_real(QD1_QUOTAPRO); + real speseant = rec.get_real(QD1_SPESEANT); + real imponibile = rec.get_real(QD1_IMPONIBILE); + real importo = rec.get_real(QD1_IMPORTO); + real netto = rec.get_real(QD1_NETTO); if (_devo_sommare) { @@ -2371,7 +2391,7 @@ void TQuadroD1::set_body(TPrinter& pr, const char tipo) { TPrint_section& body = section('B', odd_page); body.reset(); -// body.update(); + setta_importi(body); body.update(); const int body_righe = body.height(); @@ -2385,369 +2405,268 @@ void TQuadroD1::set_body(TPrinter& pr, const char tipo) progind()->addstatus(1); } -void TQuadroD1::next_page(TPrinter& pr) -{ - PaginaQuadro PagCorr = curr_page(); -// if (PagCorr >= TERZA) -// { -// if (PagCorr == TERZA) -// jump_to_line(pr,62); -// else -// if (PagCorr == QUARTA) -// jump_to_line(pr,62); -// stampa_totali(pr); -// } - fill_page(pr, -1); // formfeed "adattato" - inc_curr_page(); -} - bool TQuadroD1::print(const long codditta, const long NumFis, const long NumNoFis) { - bool StabilitaInesistenzaNoFis = FALSE; - bool StabilitaInesistenzaFis = FALSE; - bool StampatoRitenutaImposta = FALSE; - long CtrFis = NumFis; - long CtrNoFis = NumNoFis; - long PtrFis = -1L, PtrNoFis=-1L; - TPrinter& pr = printer(); - - _CtrFisStampati = _CtrNoFisStampati = 0; - _finite_fis = _finite_nofis = FALSE; - _GiaStampatiFis = _GiaStampatiNoFis = FALSE; - _EndPrintDitta = FALSE; // Vero se stampato l'ultimo record - bool LastRecord = FALSE; // Vero se letto l'ultimo record - bool stampa = TRUE; - - _PaginaCorrente = PRIMA; - if (!InitPrint(codditta)) return FALSE; + + TPrinter& pr = printer(); + + TRecnotype UltimoRitenutaAcconto = -1L; + TRecnotype UltimoRitenutaImposta = -1L; + bool StampatiTotaliFis = FALSE; + bool StampatiTotaliGiu = FALSE; + + TRecnotype PtrFis = -1L, PtrNoFis = -1L; - TCursor* cur = cursor(); + _finite_fis = _finite_nofis = FALSE; + + _EndPrintDitta = FALSE; // Vero se stampato l'ultimo record + + _PaginaCorrente = PRIMA; - while (!_EndPrintDitta) - { - for (int pagina=1; pagina <= QD_PAGINE; pagina++, next_page(pr)) - { -// pr.formlen(QD_FORMLEN); - firma_dichiarante(); - if (_PaginaCorrente == PRIMA) - { - pr.formlen(dic_form_len()); - if (_modulaser) ClearFlagModulaser(); - - bool testata = TRUE; - for (int righe=0; righe < QD1_RIGHE_PRIMA; righe++) - { - stampa = TRUE; -// Stampa intestazione, solo sul primo foglio. - if (testata) - { - (*cur) = PtrFis >= 0L ? PtrFis : 0L; -// if (_PaginaPosizionamento) - fill_page(pr,9); -// else -// fill_page(pr,12); - - const char tipo = cur->curr().get(QD1_TIPOA)[0]; - TPrint_section& head = section('H', first_page); - if (tipo == 'F') - { - const bool rit_acc = cur->curr(-14).get_bool("B0"); - head.find_field(21).set(rit_acc ? "X" : ""); - head.find_field(22).set(rit_acc ? "" : "X"); - if (!rit_acc) - StampatoRitenutaImposta = TRUE; - } - else - { - head.find_field(21).set(""); - head.find_field(22).set(""); - } - stampa_testata(pr); - testata = FALSE; - } - - if (_finite_fis || StabilitaInesistenzaFis) - break; - + TCursor& cur = *cursor(); + cur = 0L; // La prima volta si deve posizionare sul primo record di p.f. - if (PtrFis<0L && !StabilitaInesistenzaFis) - { - bool Trovato = FALSE; - - while (!Trovato) - { - const long ditta = cur->curr().get_long(QD1_CODDITTA); - if (ditta != codditta) - break; - const char tipo = cur->curr().get(QD1_TIPOA)[0]; - if (tipo != 'G') - { - PtrFis = cur->pos(); - Trovato = TRUE; - break; - } - else - ++(*cur); - } - StabilitaInesistenzaFis = !Trovato; - } - - if (StabilitaInesistenzaFis) - break; - - (*cur) = PtrFis; - const char tipo = cur->curr().get(QD1_TIPOA)[0]; - - if (tipo != 'F') - break; - else - { - const bool rit_acc = cur->curr(-14).get_bool("B0"); - if (righe > 0 && !rit_acc && !StampatoRitenutaImposta) break; - CtrFis--; - if (CtrFis == 0L) _finite_fis = TRUE; - - real perc_p = cur->curr().get_real(QD1_PERC); - stampa = controlla_percentuale(cur,perc_p); - if (stampa) - set_body(pr, 'F'); - else - { - leggi_importi(); - righe--; - } -// La stampa e' finita se ho STAMPATO l'ultimo record - LastRecord = cur->pos() >= _Items-1; - _EndPrintDitta = LastRecord; - if (!LastRecord) - { - ++(*cur); - PtrFis = cur->pos(); - LastRecord = cur->pos() >= _Items-1; - } - } - } // for righe.. - PtrFis = cur->pos(); - } - - if (_PaginaCorrente == SECONDA) + const TRectype& cur_rec = cur.curr(); + char tipo = cur_rec.get(QD1_TIPOA)[0]; + if (tipo == 'F') + { + PtrFis = 0L; + while (tipo == 'F') + { + const bool rit_acc = cur.curr(-14).get_bool("B0"); + if (rit_acc) { +#ifdef DBG + if (UltimoRitenutaImposta >= 0L) + NFCHECK("Bad sorting on cursor"); +#endif + UltimoRitenutaAcconto = cur.pos(); + } + else + UltimoRitenutaImposta = cur.pos(); + + ++cur; + if (cur.ok()) + { + tipo = cur_rec.get(QD1_TIPOA)[0]; + if (tipo == 'G') + { + PtrNoFis = cur.pos(); + break; + } + } + else + { + _finite_nofis = PtrNoFis < 0L; + break; + } + } + } + else + { + _finite_fis = TRUE; + if (tipo == 'G') + PtrNoFis = 0L; + else + { + _finite_nofis = TRUE; + _EndPrintDitta = TRUE; + } + } + + for (cur = 0L; !_EndPrintDitta; next_page(pr)) + { + pr.formlen(dic_form_len()); + + if (_PaginaCorrente == PRIMA) + { + if (_modulaser) ClearFlagModulaser(); + + // Stampa intestazione, solo sul primo foglio. + attiva_totali('F'); + + cur = _finite_fis ? 0L : PtrFis; + const char tipo = cur_rec.get(QD1_TIPOA)[0]; + TPrint_section& head = section('H', first_page); + if (tipo == 'F' && !_finite_fis) + { + const bool rit_acc = cur.curr(-14).get_bool("B0"); + head.find_field(21).set(rit_acc ? "X" : ""); + head.find_field(22).set(rit_acc ? "" : "X"); + } + else + { + head.find_field(21).set(""); + head.find_field(22).set(""); + _finite_fis = TRUE; + } + stampa_testata(pr); + + for (int righe = 0; righe < QD1_RIGHE_PRIMA && !_finite_fis; righe++) + { + cur = PtrFis; + + const char tipo = cur_rec.get(QD1_TIPOA)[0]; + if (tipo == 'F') + { + if (righe > 0 && PtrFis == UltimoRitenutaAcconto+1) + break; + + const real perc_p = cur_rec.get_real(QD1_PERC); + const bool stampa = controlla_percentuale(&cur, perc_p); + if (stampa) + set_body(pr, 'F'); + else + { + leggi_importi(); + righe--; + } + PtrFis++; + } + else + _finite_fis = TRUE; + } // for righe.. + } + + if (_PaginaCorrente == SECONDA) + { // Reset del flag di pagina con posiz. - if (_posiziona && _PaginaPosizionamento) _PaginaPosizionamento = FALSE; + if (_posiziona && _PaginaPosizionamento) + _PaginaPosizionamento = FALSE; + + fill_page(pr, HEADER_D1_SECONDA); - pr.formlen(dic_form_len()); - bool testata = TRUE; - for (int righe=0; righe < QD1_RIGHE_SECONDA; righe++) - { - stampa = TRUE; - if (testata) - { - fill_page(pr, HEADER_D1_SECONDA); - testata = FALSE; - } - - if (_finite_fis || StabilitaInesistenzaFis) - break; - - (*cur) = PtrFis; - const char tipo = cur->curr().get(QD1_TIPOA)[0]; - - if (tipo != 'F') - break; - else - { - const bool rit_acc = cur->curr(-14).get_bool("B0"); - if (!rit_acc && !StampatoRitenutaImposta) break; - - CtrFis--; - if (CtrFis == 0L) _finite_fis = TRUE; - - real perc_p = cur->curr().get_real(QD1_PERC); - stampa = controlla_percentuale(cur,perc_p); - if (stampa) - set_body(pr, 'F'); - else - { - leggi_importi(); - righe--; - } - LastRecord = cur->pos() >= _Items-1; - _EndPrintDitta = LastRecord; - if (!LastRecord) - { - ++(*cur); - PtrFis = cur->pos(); - LastRecord = cur->pos() >= _Items-1; - } - } - } - PtrFis = cur->pos(); - } - - if (_PaginaCorrente == TERZA) - { - bool testata = TRUE; - pr.formlen(dic_form_len()); - for (int righe=0; righe < QD1_RIGHE_TERZA; righe++) - { - stampa = TRUE; - if (testata) - { - fill_page(pr, HEADER_D1_TERZA); - _CtrFisStampati = 0; // conta quelli che stampo sulla terza - testata = FALSE; - } - - if (_finite_fis) - { - jump_to_line(pr,62); - stampa_totali(pr); - } - if (_finite_fis || StabilitaInesistenzaFis) - break; - - (*cur) = PtrFis; - const char tipo = cur->curr().get(QD1_TIPOA)[0]; - - if (tipo != 'F') - break; - else - { - const bool rit_acc = cur->curr(-14).get_bool("B0"); - if (!rit_acc && !StampatoRitenutaImposta) break; - - CtrFis--; - if (CtrFis == 0L) _finite_fis = TRUE; - - real perc_p = cur->curr().get_real(QD1_PERC); - stampa = controlla_percentuale(cur,perc_p); - if (stampa) - set_body(pr, 'F'); - else - { - leggi_importi(); - righe--; - } - LastRecord = cur->pos() >= _Items-1; - _EndPrintDitta = LastRecord; - _CtrFisStampati++; - if (!LastRecord) - { - ++(*cur); - PtrFis = cur->pos(); - LastRecord = cur->pos() >= _Items-1; - } - } - } - PtrFis = cur->pos(); - } - - if (_PaginaCorrente == QUARTA) + for (int righe=0; righe < QD1_RIGHE_SECONDA && !_finite_fis; righe++) { - pr.formlen(dic_form_len()); - azzera_totali(); - - bool testata = TRUE; - for (int righe=0; righe < QD1_RIGHE_QUARTA; righe++) - { - stampa = TRUE; - if (testata) - { - _CtrNoFisStampati = 0; -// All'inizio salta le righe in alto - fill_page(pr, HEADER_D1_QUARTA); - testata = FALSE; - } - - if (_finite_nofis) - { - jump_to_line(pr,62); - stampa_totali(pr); - } - if (_finite_nofis || StabilitaInesistenzaNoFis) + cur = PtrFis; + const char tipo = cur_rec.get(QD1_TIPOA)[0]; + if (tipo == 'F') + { + if (PtrFis == UltimoRitenutaAcconto+1) break; -// La prima volta si deve posizionare sul primo record di p.g. - if (PtrNoFis<0L && !StabilitaInesistenzaNoFis) + real perc_p = cur_rec.get_real(QD1_PERC); + const bool stampa = controlla_percentuale(&cur, perc_p); + if (stampa) + set_body(pr, 'F'); + else { - bool Trovato = FALSE; - bool eof = FALSE; - (*cur) = PtrFis-1 > 0L ? PtrFis-1 : 0L; // parti dall'inizio - while (!Trovato && !eof) - { - eof = cur->pos() >= _Items-1; - const long ditta = cur->curr().get_long(QD1_CODDITTA); - if (ditta != codditta) - break; - const char tipo = cur->curr().get(QD1_TIPOA)[0]; - if (tipo != 'F') - { - PtrNoFis = cur->pos(); - Trovato = TRUE; - break; - } - else - ++(*cur); - } - StabilitaInesistenzaNoFis = !Trovato; - } - - if (StabilitaInesistenzaNoFis) - break; - - (*cur) = PtrNoFis; - const char tipo = cur->curr().get(QD1_TIPOA)[0]; + leggi_importi(); + righe--; + } + PtrFis++; + } + else + _finite_fis = TRUE; + } + } - if (tipo != 'G') + if (_PaginaCorrente == TERZA) + { + for (int righe = 0; righe < QD1_RIGHE_TERZA && !_finite_fis; righe++) + { + fill_page(pr, HEADER_D1_TERZA); + + cur = PtrFis; + + const char tipo = cur_rec.get(QD1_TIPOA)[0]; + if (tipo == 'F') + { + if (PtrFis == UltimoRitenutaAcconto+1) break; - else + + real perc_p = cur_rec.get_real(QD1_PERC); + const bool stampa = controlla_percentuale(&cur, perc_p); + if (stampa) + set_body(pr, 'F'); + else { - CtrNoFis--; - if (CtrNoFis == 0L) _finite_nofis = TRUE; - - real perc_p = cur->curr().get_real(QD1_PERC); - stampa = controlla_percentuale(cur,perc_p); - if (stampa) - set_body(pr, 'G'); - else - { - leggi_importi(); - righe--; - } - LastRecord = cur->pos() >= _Items-1; - _EndPrintDitta = LastRecord; - _CtrNoFisStampati++; - if (!LastRecord) - { - ++(*cur); - PtrNoFis = cur->pos(); - LastRecord = cur->pos() >= _Items-1; - } + leggi_importi(); + righe--; } - } - PtrNoFis = cur->pos(); - firma_dichiarante(); - } - } // for pagina.. - } // while !_EndPrintDitta + PtrFis++; + } + else + _finite_fis = TRUE; + } + if (!StampatiTotaliFis && + PtrFis == UltimoRitenutaAcconto+1 || + PtrFis == UltimoRitenutaImposta+1) + { + jump_to_line(pr, 62); + stampa_totali(pr, TRUE, FALSE); + + if (PtrFis > UltimoRitenutaImposta) + { + _finite_fis = TRUE; + StampatiTotaliFis = TRUE; + } + else + _tot_fis.destroy(); + } + } + + if (_PaginaCorrente == QUARTA) + { + fill_page(pr, HEADER_D1_QUARTA); + attiva_totali('G'); + + for (int righe = 0; righe < QD1_RIGHE_QUARTA && !_finite_nofis; righe++) + { + cur = PtrNoFis; + + const char tipo = cur_rec.get(QD1_TIPOA)[0]; + if (tipo == 'G') + { + real perc_p = cur_rec.get_real(QD1_PERC); + const bool stampa = controlla_percentuale(&cur, perc_p); + if (stampa) + set_body(pr, 'G'); + else + { + leggi_importi(); + righe--; + } + PtrNoFis++; + } + else + _finite_nofis = TRUE; + } + if (PtrNoFis >= cur.items() || _finite_nofis) + { + _finite_nofis = TRUE; + jump_to_line(pr, 62); + + if (!StampatiTotaliGiu) + { + stampa_totali(pr, TRUE, TRUE); + StampatiTotaliGiu = TRUE; + } + else + stampa_totali(pr, FALSE, TRUE); + } + + _EndPrintDitta = _finite_fis && _finite_nofis; + } + } close_print(); return TRUE; } class TStampaQuadroD1 : public TStampaQuadro { - TQuadroD1* _form; - TCursor* _cur; - protected: - virtual bool user_create(); - virtual bool user_destroy(); - virtual TDicForm* get_form() const { return _form; } - virtual TCursor* get_cursor() const { return _cur; } - public: - TStampaQuadroD1(const char* quadro, char livel); - virtual ~TStampaQuadroD1() { } + TQuadroD1* _form; + TCursor* _cur; +protected: + virtual bool user_create(); + virtual bool user_destroy(); + virtual TDicForm* get_form() const { return _form; } + virtual TCursor* get_cursor() const { return _cur; } +public: + TStampaQuadroD1(const char* quadro, char livel); + virtual ~TStampaQuadroD1() { } }; TStampaQuadroD1::TStampaQuadroD1(const char* quadro, char liv) @@ -2758,7 +2677,7 @@ bool TStampaQuadroD1::user_create() { _form = new TQuadroD1("77QD1", quadro()); TString sortkey(80); - sortkey.format("CODDITTA|TIPOA|216@->RAGSOC|CODANAGR|CODCAUS|PERC", LF_QUAD1, LF_QUAD1); + sortkey.format("CODDITTA|TIPOA|14@->B0-|216@->RAGSOC|CODANAGR|PERC"); _cur = new TSorted_cursor(_form->TForm::relation(), sortkey); return TRUE; } @@ -3033,8 +2952,8 @@ void TQuadroG1::stampa_prospetto(TPrinter& pr) } else { - pr.print(head.row(j)); - _RigaCorr++; + pr.print(head.row(j)); + _RigaCorr++; } } } @@ -3888,7 +3807,6 @@ bool TBusta::print(const long codditta, const long, const long) pr.formlen(BUSTA_SENZA_POSIZ); _PaginaPosizionamento=FALSE; } -// TForm::print(0); } return ok; } @@ -4042,10 +3960,6 @@ int stampa_quadro(int argc, char* argv[]) { app = new TStampaQuadroAggL(quadro, livello); } - else if (quadro == "N") - { - app = new TStampaQuadroAggN(quadro, livello); - } if (app != NULL) { diff --git a/m770/77stq.h b/m770/77stq.h index 05019d087..d0ba4f2a6 100755 --- a/m770/77stq.h +++ b/m770/77stq.h @@ -72,19 +72,6 @@ typedef enum { STARTDOC, STARTDITTA, STARTPAGE, ENDDOC } ModulaserKey; #define H_NUM_FOGLIO 14 #define QD_STATO_ESTERO 12 -// Quadro D -#define QD_FORMLEN 72 -#define POS_DITTA 120 -#define QD_PAGINE 4 -#define QD_RIGHE_PRIMA 4 -#define QD_RIGHE_SECONDA 7 -#define QD_RIGHE_TERZA 7 -#define QD_RIGHE_QUARTA 7 -#define QD1_RIGHE_PRIMA 6 -#define QD1_RIGHE_SECONDA 9 -#define QD1_RIGHE_TERZA 9 -#define QD1_RIGHE_QUARTA 8 - #define HEADER_SECONDA 8 #define HEADER_TERZA 8 #define HEADER_QUARTA 13 @@ -126,16 +113,18 @@ class TDicForm : public TForm bool _can_print_tot_fis, _can_print_tot_nofis; bool _finite_fis, _finite_nofis, _LastDitta, _EndPrintDitta; bool _GiaStampatiFis, _GiaStampatiNoFis, _PaginaPosizionamento; - bool _GiaPosizionato, _GiaMessoStartDoc, _GiaMessoStartPage[QD_PAGINE]; // flag per modulaser + bool _GiaPosizionato, _GiaMessoStartDoc, _GiaMessoStartPage[4]; // flag per modulaser int _CtrNoFisStampati, _CtrFisStampati; // contatori p.f. e p.g. stampate long _codditta, _codditta_dic; // cod.ditta e cod.ditta dichiarante int _RigaCorr; // contatore riga corrente TString16 _quadro; // codice quadro in stampa - void firma_dichiarante(); + + TString_array _tot_fis, _tot_giu; + void attiva_totali(char tipo); + void stampa_testata(TPrinter& pr); virtual bool ultima_pagina() const { return _PaginaCorrente==QUARTA; } - virtual void stampa_totali(TPrinter& pr); -// virtual void aggiorna_totali(const char tipo); + virtual void stampa_totali(TPrinter& pr, bool tot, bool sig); virtual void set_body(TPrinter& pr, const char tipo); void StampaPagina(PaginaQuadro PaginaCorrente, const bool StampaTotali, const long Fis, const long NoFis); void posiziona(); @@ -175,7 +164,9 @@ class TDicForm : public TForm int num_foglio() const { return _num_foglio; } virtual void azzera_totali(); PaginaQuadro curr_page() const { return _PaginaCorrente; } -// TCursor& cur(); + + int firma_dichiarante(); + void set_progind(TProgind* prog) { _prog = prog; } TProgind* progind() { return _prog; } bool usa_progind() const { return _prog != NULL; }