// ------------------------------------------------------------
// Calcolo liquidazioni
// Part 5: stampa 
// fv 21-1-94
// ------------------------------------------------------------

#include <utility.h>
#include "cg4300.h"

// flags per annuale
#define IS_PRORATA 0x0001


// minchietta per prospetto ventilazione
class _vDesc : public TObject
{
public:
  TString _codiva;
  real    _acq;
  real    _vnd;
  real    _viv;
  _vDesc() : _codiva(5) {}
  virtual ~_vDesc() {}
};

static char sep[] = 
"------------------------------------------------------------------"
"------------------------------------------------------------------";

void TLiquidazione_app::set_page(int file, int cnt)
{
  _DescrItem& d = (_DescrItem&)_descr_arr[cnt];

  set_auto_ff(FALSE);
  reset_print();

  switch(d._flags)
  {
  case CHG_PARMS:
    set_att(d);       
    break;
  case SET_FIRM:  
    set_firm(d);      
    break;
  case PIM_ROW:   
    set_pim(d);       
    break;
  case PIM_HEAD:   
    set_pim_head(d);       
    break;
  case MISC_LIQ:
    set_pumpam(d);    
    break;
  case TOT_ROW:
    set_plm(d);       
    break;
  case PLAFOND:
    set_plafond(d);  
    break;
  case VENTILA:   
    set_ventila(d);   
    break;
  case REGAGR:    
    set_regagr(d);    
    break;
  case REGVIA:    
    set_viaggio(d);   
    break;
  case THE_END:   
    set_grand(d);     
    break; 
  case LIQACC:
    set_liqacc(d);
    break;
  case ACCONTO:   
    set_acconto_p(d); 
    break;
  case ACCHEAD:   
    set_acchead_p(d); 
    break;
  case DELDEB:    
    set_deltab(d, FALSE); 
    break;
  case DELCRED:   
    set_deltab(d, TRUE); 
    break;
  }              
}

print_action TLiquidazione_app::postprocess_page(int file, int cnt)
{
  if (_descr_arr.items() == 0 || cnt == _descr_arr.items()-1)
    return NEXT_PAGE;
  return REPEAT_PAGE;
}

bool TLiquidazione_app::preprocess_page(int file, int cnt)
{
  return _descr_arr.items() != 0;
}

// ----------------------------------------------------------------
// Print description
// ----------------------------------------------------------------

void TLiquidazione_app::describe_att(int month, const char* codatt,
                                     bool isresult, char flags)
{
  TToken_string atts(codatt);
  
  if (_isprint && _canprint)
  {
    describe_name(month, atts, flags);
    if (atts.items() == 1 && _isplafond) 
      describe_plafond(month, codatt);
    if (atts.items() == 1 && _isvent) 
      describe_ventilation(month, codatt);
    if (atts.items() == 1 && _isagricolo) 
      describe_agricolo(month, codatt);
    if (atts.items() == 1 && _isviaggio) 
      describe_viaggio(month, codatt);
    if (/* isresult || month == 13 */ TRUE)
      describe_pims(month,codatt);
    if (atts.items() == 1)
      describe_consistence(codatt);
  }
}

void TLiquidazione_app::describe_name(int month, TToken_string& codatts, char flags)
{
  _DescrItem* d = new _DescrItem(CHG_PARMS);

  d->_s0 = _nditte->curr().get("CODDITTA");
  d->_s1 = _nditte->curr().get("RAGSOC");
  d->_s2 = _nditte->curr(LF_ATTIV).get("CODATT");
  d->_s3 = codatts.items() == 1 ? (const char*)_nditte->curr(LF_ATTIV).get("DESCR")  : "";
  d->_s4 = _freqviva;
  
  d->_f1 = month;
  d->_f2 = _isbenzinaro;
  d->_f3 = (word)flags;
  
  if (_mixed && codatts.items() == 1) 
    d->_f0 = atoi(codatts.mid(5));
  else d->_f0 = 0;
  _descr_arr.add(d);
}

void TLiquidazione_app::describe_firm(int month)
{
  if (!_isprint || !_canprint) return;

  _DescrItem* d = new _DescrItem(SET_FIRM);

  d->_s0 = _nditte->curr().get("CODDITTA");
  d->_s1 = _nditte->curr().get("RAGSOC");
  d->_s2 = _freqviva;
  d->_f1 = month;
  _descr_arr.add(d);
}

void TLiquidazione_app::describe_liqacc()
{
  if (!_isprint || !_canprint) return;
  
  if (!look_lia()) return;
  
  if (_lia->get("S8") != "A") return;
  
  _DescrItem* d = new _DescrItem(LIQACC);
  
  d->_r0 = _lia->get_real("R7");
  d->_r1 = _lia->get_real("R13");  
  d->_r2 = _lia->get_real("R14");
  d->_r3 = _lia->get_real("R9");
  d->_r4 = _lia->get_real("R10");
  d->_r5 = _lia->get_real("R8");
  d->_r6 = _lia->get_real("R12");
  d->_r7 = _lia->get_real("R11");
  d->_r8 = _lia->get_real("R4");
  TToken_string ff(_lia->get("S1"));
  real cre_pre (ff.get(0));
  real acq_intr (ff.get(1));
  d->_r9 = cre_pre;
  d->_r10 = acq_intr;
  
  _descr_arr.add(d);
}

void TLiquidazione_app::describe_plafond(int month, const char* codatt)
{
  // prepara la descrizione del riepilogo da stampare e lo accoda
  real t1, t2, t3;
  _DescrItem* d = new _DescrItem(PLAFOND);

  for (int jj = 1; jj <= 3; jj++) // three types of plafond
  {
    t1 = 0.0; t2 = 0.0; t3 = 0.0;
    for (int m = 1; m <= month && m < 13; m++) 
    { 
      if (is_month_ok(m,month) && look_ppa(m,codatt,jj))
      {
        t1 += _ppa->get_real("R0");
        t2 += _ppa->get_real("R1");
        t3  = _ppa->get_real("R2");
      }
    }
    switch (jj)
    {
    case 1: 
      d->_r0 = t1; d->_r1 = t2; d->_r2 = t3; 
      break;
    case 2: 
      d->_r3 = t1; d->_r4 = t2; d->_r5 = t3; 
      break;
    case 3: 
      d->_r6 = t1; d->_r7 = t2; d->_r8 = t3; 
      break;
    }  
  } // for tipo esenzione plafond 
  
  _descr_arr.add(d); 
  
  // bookmark
}

void TLiquidazione_app::describe_ventilation(int month, const char* codatt)
{                                      
  if (!_isvent || _isagricolo || _isviaggio) return;
  
  _DescrItem* d = new _DescrItem(VENTILA);
  TString att(codatt);
  
  look_plm(month, att);
  
  for (_pim->first(); !_pim->eof(); _pim->next())
  {
    if (strcmp(*_pim_codatt,att) != 0)
      continue;
    
    look_reg(*_pim_codreg);
    look_iva(*_pim_codiva);
    
    int     tipocr      = atoi(*_pim_tipocr);
    int     tipodet     = atoi(*_pim_tipodet);
    int     mese        = atoi(*_pim_mese);
    bool    corrisp     = _reg->get_bool("B0");  
    real    imponibile  = _pim->get_real("R0");
    real    imposta     = _pim->get_real("R1");
    tiporeg tipomov     = (tiporeg)_reg->get_long("I0");
    TString tipoiva    = _iva->get("S1");

    if (_year != *_pim_anno)  continue;                                      

    if (imponibile.is_zero() && imposta.is_zero()) continue;

    // questi non vanno in liquidazione, i totali sono
    // gia' calcolati altrove
    if (tipodet == 1 || (tipodet == 3 && tipocr == 5) || tipodet == 9)
      continue;     
    
    // questi non si devono vedere perche' so' bbrutti                          
    if (tipoiva == "NS" || tipoiva == "ES" || tipoiva == "NI")
      continue;
    
    if (mese <= month)
    {
      if (tipocr == 1 && tipomov == acquisto)
      {
        // somma agli acquisti
        _vDesc* vd = NULL;
        for (int i = 0; i < d->_arr.items(); i++)
        {
          _vDesc* vv = (_vDesc*)&(d->_arr[i]);
          if (strcmp(vv->_codiva,*_pim_codiva) == 0)
          { vd = vv; break; }
        }
        if (vd == NULL) { vd = new _vDesc; }

        vd->_acq += (imponibile+imposta);
        d->_r0   += (imponibile+imposta); 
        
        if (vd->_codiva.empty()) 
        {
          vd->_codiva = *_pim_codiva;
          d->_arr.add(vd);
        }
      }
      else if ((is_month_ok(mese,month)  || month == 13) && corrisp 
               && _pim->get_bool("B1") &&
               tipocr == 0 && tipomov == vendita)
        // non sono sicurissimo della above condition
      {
        // somma alle vendite
        _vDesc* vd = NULL;
        for (int i = 0; i < d->_arr.items(); i++)
        {
          _vDesc* vv = (_vDesc*)&(d->_arr[i]);
          if (strcmp(vv->_codiva,*_pim_codiva) == 0)
          { vd = vv; break; }
        }
        if (vd == NULL) { vd = new _vDesc; }

        vd->_vnd  += imponibile;
        vd->_viv  += imposta;
        
        d->_r1     += imponibile+imposta;
        
        if (vd->_codiva.empty()) 
        {
          vd->_codiva = *_pim_codiva;
          d->_arr.add(vd);
        }
      }
    }
  }  
  if (d->_r1.is_zero() || d->_r0.is_zero())
    delete d;
  else
    _descr_arr.add(d);
}

void TLiquidazione_app::describe_agricolo(int month, const char* codatt)
{
  _DescrItem* d  = new _DescrItem(REGAGR);
  
  for (int mese = 1; mese <= month; mese++)
  {
    if (!is_month_ok(mese,month)) 
      continue;

    if (!look_plm(mese, codatt)) 
      continue;       
    
    d->_r0 += _plm->get_real("R5"); 
    d->_r1 += _plm->get_real("R6");
    d->_r2 += _plm->get_real("R7");
    d->_r3 += _plm->get_real("R8");  
    d->_r4 += _plm->get_real("R9");     
    d->_r5 += _plm->get_real("R10");  
    d->_r6 += _plm->get_real("R11");     
    d->_r7 += _pum->get_real("R10");
    d->_r8 += _pum->get_real("R11");
  }  
  _descr_arr.add(d);
}

void TLiquidazione_app::describe_viaggio(int month, const char* codatt)
{
  if (!look_lim(month)) return;

  _DescrItem* d = new _DescrItem(REGVIA);

  for (int mese = 1; mese <= month; mese++)
  {
    if (!is_month_ok(mese,month) || !look_plm(mese, codatt)) 
      continue;                 

    d->_r0 += _plm->get_real("R5");  // corrispettivi CEE
    d->_r1 += _plm->get_real("R9");  // corrispettivi misti CEE 
    d->_r2 += _plm->get_real("R6");  // corrispettivi fuori CE
    d->_r3 += _plm->get_real("R7");  // acquisti CEE
    d->_r4 += _plm->get_real("R10"); // acquisti misti parte CEE
    d->_r5 += _plm->get_real("R8");  // acquisti fuori CEE
    d->_r6 += _plm->get_real("R11"); // acquisti misti parte fuori CEE
  } 
  
  // credito di costo precedente (CHECK annuale)
  d->_r8 = credito_costo_prec(month);

  _descr_arr.add(d);
}


void TLiquidazione_app::describe_pims(int month, const char* codatt)
  // le si passa una tokenstring (o un codatt) e lei, da brava, calcola
  // cumulando per tutte le attivita' nominatele
  // ogni riga riguarda un codiva ma tutti i registri
  // se il mese e' 13 si guarda tutto l'anno
  // se si tratta di una sola attivita' in att. mista evidenziata o servizievole,
  // stampa solo vendite e corrispettivi
{
  TToken_string atts(codatt);
  TString ref(atts.items() == 1 ? codatt : "ALL");
  const char*     tmpatt;
  int last      = _descr_arr.last();
  bool isfirst  = TRUE;
  real t0, t1, t2, t3, t4, t5;
  real autodafe, autodafe_iva;
  
  bool skip_acq = atts.items() == 1 && _mixed;
  
  // descrittore riga autodafe' 
  _DescrItem* ads = NULL;
  // descrittore riga iva dovuta ag. viaggio' 
  _DescrItem* iads = NULL;
  // questa cazzata serve per far apparire l'intestazione delle colonne
  // anche se le colonne non ci sono; in tal modo si ottiene una peggior 
  // chiarezza, una peggiore efficienza, una gran rottura di coglioni,
  // ma risulta identico al dio Sistema.
  _DescrItem* hea = new _DescrItem(PIM_HEAD);
  hea->_f0 = skip_acq; // cosi' non compare nemmeno la colonnina! contento?
  _descr_arr.add(hea);
  
  while ((tmpatt = atts.get()) != NULL)
  {
    TString att(tmpatt);          
    
    for (_pim->first(); !_pim->eof(); _pim->next())
    {
      _DescrItem* d = NULL;
      // compute
      bool ok = look_reg(*_pim_codreg);
      ok |= look_iva(*_pim_codiva);
      bool isnew    = FALSE;
      
      if (!ok) continue;

      tiporeg tipomov  = (tiporeg)_reg->get_long("I0");
      bool    corrisp  = _reg->get_bool("B0");  
      TString tipoiva  = _iva->get("S1");
      int     tipodet  = atoi(*_pim_tipodet);
      TString codiva((const char*)(*_pim_codiva));
      TString other    = _pim->get("S4");

      // ACHTUNG! Corrispettivi da ventileer possono ventilare
      // ad un altro codiva; in tal caso si scrive quello
      if (corrisp && !other.empty())
      {
        look_iva(other);
        codiva = other;
      }
      // se e' corrispettivo da ventilare non 
      // scrivo un cannolo ripieno visto che e' stato ventilato
      if (tipomov == vendita && tipoiva == "VE") continue;
      
      // se e' il dettaglio di una attivita' mista non stampa
      // gli acquisti, il perche' losalamadonna
      if (tipomov == acquisto && skip_acq) continue;
      
      // questi non vanno in liquidazione, i totali sono
      // gia' calcolati altrove
      if (tipodet == 1 || tipodet == 3 || tipodet == 9)
        continue;

      // se ha tutti gli importi nulli viene da un annullamento di
      // progressivi esistenti (achtung fatture con scontrino)
      if (_pim->get_real("R0").is_zero() && 
          _pim->get_real("R1").is_zero() &&
          _pim->get_real("R2").is_zero() &&
          _pim->get_real("R5").is_zero() &&
          _pim->get_real("R6").is_zero())
        continue;                                 
      
      if (strcmp((const char*)*_pim_codatt, att) == 0  &&
          (is_month_ok(atoi(*_pim_mese),month))        &&
          _year == (const char*)*_pim_anno)
      {
        // vedi se c'e' gia' un item corrispondente
        for(int i = last+1; i < _descr_arr.items(); i++)
        {
          d = (_DescrItem*)&_descr_arr[i];
          if (d->_flags == PIM_ROW &&
              d->_s0    == ref     &&
              d->_s1    == codiva)
            break;
          if (d->_s1 > codiva) 
          { 
            isnew = TRUE; 
            _DescrItem* dd = new _DescrItem(PIM_ROW); 
            // CicciaPrassi li vuole in ordine crescente
            _descr_arr.insert(dd,i); 
            // che due maron stereofonic: se quello dopo
            // era il primo, quello prima va dopo
            if (d->_f0)
            {   
              dd->_f0 = TRUE;
              d->_f0  = FALSE;
            }         
            else if (isfirst) 
            { 
              d->_f0 = TRUE; 
              isfirst = FALSE; 
            } 
            d = dd;
            break;
          }
        }
        if (!isnew && i == _descr_arr.items()) 
        { 
          isnew = TRUE; 
          d = new _DescrItem(PIM_ROW); 
          if (isfirst) { d->_f0 = TRUE; isfirst = FALSE; }
          _descr_arr.add(d);   
        }
        
        if (tipomov == acquisto)
        {
          d->_r4 += _pim->get_real("R0");
          d->_r5 += _pim->get_real("R1");
          t4     += _pim->get_real("R0"); 
          t5     += _pim->get_real("R1"); 
        }
        else  // vendita
        {
          // vedi corrispettivi veri e falsi
          real cvi = _pim->get_real("R0");  // imp. totale
          real cvv = _pim->get_real("R1");  // iva  totale
          real cfi = _pim->get_real("R13"); // imp. falsi corrispettivi
          real cfv = _pim->get_real("R14"); // iva  falsi corrispettivi   
          
          if (corrisp)
          {
            cvi -= cfi;
            cvv -= cfv;           
          }
          
          if (corrisp)
          {
            // usa R0 e R1 visto che la ventilazione e' gia' 
            // stata calcolata             
            real   ifs(_pim->get_real("R5"));  // imp. fatture con scontrino
            real   vfs(_pim->get_real("R6"));  // iva  fatture con scontrino
            
            d->_r2 += (cvi /* - ifs */);   // tolgo FS dai corrispettivi
            d->_r3 += (cvv /* - vfs */);
            d->_r0 += ifs;         // aggiungo FS alle vendite
            d->_r1 += vfs;
            t2     += (cvi /* - ifs */);   // idem per i totali
            t3     += (cvv /* - vfs */);   // non sono molto convinto ma vogliono cio'
            t0     += ifs;                 // ...avevo ragione e infatti l'ho cambiato
            t1     += vfs;
          }                                     
          
          if (!corrisp || (!cfv.is_zero() || !cfi.is_zero()))
          { 
            real adf, adi;  // autofatture non residenti art. 17                  
            
            real vendi = corrisp ? cfi : _pim->get_real("R0");
            real vendv = corrisp ? cfv : _pim->get_real("R1");
            
            // si scorporano solo per l'annuale, altrimenti
            // vengono normalmente considerati nelle vendite
            if (month == 13)
            {
              adf = _pim->get_real("R7");
              adi = _pim->get_real("R8");
            }
            
            d->_r0 += vendi - adf;
            d->_r1 += vendv - adi;
            t0     += vendi /* - adf */; 
            t1     += vendv /* - adi */; 
            
            autodafe     += adf;
            autodafe_iva += adi;
          }
        }
        if (isnew) 
        { 
          d->_s0 = ref;
          d->_s1 = codiva;
          // flag per stampare l'intestazione colonne
        }
      }
    }

    look_plm(month,att);
    real iva74t = _pom->get_real("R13");  
    if (iva74t.sign() > 0)
    {
      if(iads == NULL) iads = new _DescrItem(PIM_ROW);
      iads->_s0 = "74TER";                // cosi' vollero
      iads->_s1 = "IVA ";                 // cosi' vollero
      iads->_s2 = " dovuta - 74 ter";     // cosi' vollero
      iads->_r1 += iva74t;
      t1      += iva74t; 
      if (isfirst)
      {
        isfirst = FALSE;
        iads->_f0  = TRUE;
      }
    }
  }

  if (autodafe.sign() > 0 || autodafe_iva.sign() > 0)
  {
    _DescrItem* ads = new _DescrItem(PIM_ROW);
    ads->_s0 = ref;
    ads->_s1 = "A35";     // cosi' vollero
    ads->_r0 = autodafe;
    ads->_r1 = autodafe_iva; 
    if (isfirst)
    {
      isfirst = FALSE;
      ads->_f0  = TRUE;
    }
    _descr_arr.add(ads);        
  }

  // ag. viaggio: iva dovuta 74 ter la vogliono in mezzo ai progressivi   
  if (iads != NULL)  _descr_arr.add(iads);        

  // prepara una bella riga di totali
  if (/* !isfirst */ TRUE)
  {
    _DescrItem* d = new _DescrItem(TOT_ROW);
    d->_r0 = t0; d->_r1 = t1;
    d->_r2 = t2; d->_r3 = t3;
    d->_r4 = t4; d->_r5 = t5;

    // aggiunge dati ptm
    _DescrItem* t = new _DescrItem(MISC_LIQ);
    t->_f1 = isfirst;  // per il form feed
    
    TToken_string ttm("0|0|0");

    for (int m = 1; m <= month && m < 13; m++)
    {
      if (!is_month_ok(m,month)) continue;

      atts.restart();   
      while ((tmpatt = atts.get()) != NULL)
      {
        TString att(tmpatt);
        look_plm(m, att);                                
        real ad1, ad2;
        
        d->_r6  += _pom->get_real("R0");  // acq. intracomunitari
        d->_r7  += _pom->get_real("R1");  // inded. art 19
        d->_r8  += _pom->get_real("R2");  // IVA su inded. art. 19
        t->_r0  += _pom->get_real("R3");  // acq. ammortizz. detr 
        t->_r1  += _pom->get_real("R4");  // IVA acq. ammort. detr
        t->_r2  += _pum->get_real("R2");  // ammort. detr. 6% 
        t->_r3  += _pum->get_real("R3");  // IVA ammort detr. 6%
        t->_r4  += _pom->get_real("R5");  // acq. beni rivendita
        t->_r5  += _pom->get_real("R6");  // IVA acq. beni rivendita
        t->_r6  += _pom->get_real("R7");  // acq. leasing
        t->_r7  += _pom->get_real("R8");  // IVA acq. leasing
        t->_r8  += _pum->get_real("R0");  // cessioni beni ammort.
        t->_r9  += _pum->get_real("R1");  // IVA su cessioni ammort.
        t->_r10 += _pum->get_real("R4");  // tot. esenti IVA
        t->_r11 += _plm->get_real("R2");  // pro-rata indetraibile

        ad1 = real(ttm.get(1));
        ad2 = real(ttm.get(2));        
        ad1 += _pom->get_real("R11");
        ad2 += _pom->get_real("R12");        
        ttm.add(_plm->get("R12"), 0);     // % pro-rata 
        ttm.add(ad1.string(),1);          // imp. acq. amm. indetr.
        ttm.add(ad2.string(),2);          // IVA  acq. amm. indetr
        t->_s0  = ttm;   

        t->_f0  =  !_prorata.is_zero() && (month != 13);   // flag per segnalare l'esistenza      
        d->_r9  += _pom->get_real("R9");  // acq. inded. su ricavi esenti 
        d->_r10 += _pom->get_real("R10"); // IVA acq. inded. su ricavi esenti 

        // passaggi interni
        real aipip(d->_s0);           // progressivo ...
        real aipivp(d->_s1);          // ... (che mazzata sulle palle...)
        aipip  += _pum->get_real("R8"); // acq. inded. per pass. int
        aipivp += _pum->get_real("R9"); // IVA acq. inded. per pass. int
        d->_s0  = aipip.string();     // risbatto ...
        d->_s1  = aipivp.string();    // ..
        
        // spese generali.
        real spgnp(t->_s2);           // progressivo ...
        real spgnvp(t->_s3);          // ... (che doppia mazzata sulle palle...)
        spgnp  += _pam->get_real("R10"); // spese generali. 
        spgnvp += _pam->get_real("R11"); // IVA spese generali. 
        t->_s2  = spgnp.string();     // risbatto ...
        t->_s3  = spgnvp.string();    // ..
        
        // sospensione imposta: non piu' due palle, ma QUATTRO
        TToken_string tt(t->_s4);    
        real aqsi(tt.get(0));
        real aqsv(tt.get(1));
        real vnsi(tt.get(2));
        real vnsv(tt.get(3));
        
        aqsi += _pam->get_real("R6");
        aqsv += _pam->get_real("R7");
        vnsi += _pam->get_real("R8");
        vnsv += _pam->get_real("R9");
        
        tt = "";
        tt.add(aqsi.string());
        tt.add(aqsv.string());
        tt.add(vnsi.string());
        tt.add(vnsv.string());
        t->_s4 = tt;
        
      } // while (attivita')
    } // for (mese ok)
    
    
    // annual follows in _arr
    if (month == 13 && ref != "ALL")
    {
      // tutte quelle cose che vanno alla liquidazione annuale, come il
      // calcolo del prorata o del nuovo plafond o ....
      if (look_pla(codatt))
      { 
        real v1 = _pla->get_real("R14");
        real v2(_pla->get("S1"));
        real ris = v1 + v2;
        real e1 = _pla->get_real("R1");
        real e2 = _pla->get_real("R2");
        real e3 = _pla->get_real("R3");
        real am = _pla->get_real("R4");
        real iaq = _pla->get_real("R11"); // IVA acquisti
        real ppg = _pla->get_real("R12"); // pro-rata pagato

        // calcola nuovo prorata per ogni attivita' (miste: 1+2)
        real pr(0.0); 
        if (!ris.is_zero())
          pr = (e1/ris) * CENTO;
        real co = 0.0;  
        real topay = 0.0;
        pr.round(ROUND_LIRA);
        if (pr != _prorata)
        {
          // calcolo conguaglio -- se positivo e' a debito
          topay = (iaq + ppg) * (pr / CENTO);
          topay.round(ROUND_MILLELIRE);
          co = topay - ppg;
          co.round(ROUND_MILLELIRE);
        }
        
        _DescrItem* dd = new _DescrItem(ANNUAL);
        
        // prorata
        if (!_prorata.is_zero())
          dd->_f0 |= IS_PRORATA;
        dd->_r0 = ris;
        dd->_r1 = e1;
        dd->_r2 = pr;
        dd->_r3 = co;
        dd->_r4 = e2;
        dd->_r5 = e3;   
        dd->_r6 = topay;
        t->_arr.add(dd);
      }
    }
    _descr_arr.add(d);
    _descr_arr.add(t);
  }
}


void TLiquidazione_app::describe_liq(int month, const char* codatts, 
                                     _DescrItem* di)
{
  if (!_isprint || !_canprint) return;

  if (!look_lim(month)) return;
  
  _DescrItem* d = new _DescrItem(THE_END);
  
  // gli diamo la stessa struttura di LIM
  d->_r0  = _lim->get_real("R0");
  d->_r1  = _lim->get_real("R1");
  d->_r2  = _lim->get_real("R2");
  d->_r3  = _lim->get_real("R3");
  d->_r4  = _lim->get_real("R4");
  d->_r5  = _lim->get_real("R5");
  d->_r6  = _lim->get_real("R6");
  d->_r7  = _lim->get_real("R14");
  d->_r9  = _lim->get_real("R9");
  d->_r10 = _lim->get_real("R7"); // totale conguaglio prorata

  TToken_string tt(80); 
  tt.add(_lam->get_real("R0").string());
  tt.add(_lam->get_real("R1").string());
  tt.add(_lam->get_real("R2").string());
  tt.add(_lam->get_real("R3").string());

  d->_s0  = tt;
  d->_s1  = _lim->get_real("R11").string();
  d->_s2  = _lim->get_real("R12").string();
  d->_s3  = _lim->get_real("R13").string(); 

  // descrizione rettifiche
  if (month < 13)
  {
    d->_s4  = _lim->get("S0");
    d->_s5  = _lim->get("S1");   
  }
  d->_r11 = (const char*)_lim->get("R10");   // tasso di interesse
  
  d->_f1  = is_first_month(month);                      
  
  if (_is_visliq)                                    
  {
    // tutti i versamenti, sempre e comunque
    d->_r8 = versamenti_IVA(_month, "1"); 
  }
  else
    // rispettiamo tutte le casistiche per i versamenti
    d->_r8  = _lim->get_real("R8");


  // aggiunge eventuale satellite per rimborso infraannuale
  if (di != NULL) 
  {
    if (d->_r0.sign() < 0)
      d->_arr.add(di);
    else delete di;
  }                   
  
  if (!_is_visliq)
  {
    _DescrItem* dv = describe_deleghe(month);  
    if (dv != NULL) d->_arr.add(dv);
  }
  _descr_arr.add(d);
}

_DescrItem* TLiquidazione_app::describe_deleghe(int month)
{
  /*
     if (!look_del(month,1)) return NULL;    
     
     _DescrItem* d = new _DescrItem(DELEGA);
     
     if (_del->get_bool("B0"))
     {
     d->_s0 = _del->get("S2");  // localita'
     d->_s1 = _del->get("S1");  // banca
     d->_s2 = _del->get("S7");  // ABI
     d->_s3 = _del->get("S8");  // CAB
     d->_r0 = _del->get_real("R0");
     d->_d0 = _del->get_date("D0");
     } // altrimenti lascia tutto in bianco e ci scriveranno i dati a mano
     }
     return d; 
  */
  bool stampa_vers = FALSE;
  if (_lim->get_real("R0") > ZERO)
  {
    real iva = _lim->get_real("R0") + _lim->get_real("R14"); 
    if (_isannual) iva.round(ROUND_MILLELIRE);
    if (iva >= IVA_DA_RIPORTARE)
      stampa_vers = TRUE;
  }
  
  int mese = month; 
  if (_freqviva == "T" && _isannual) mese = 12;
  
  //17/11/1995
  /*
  if (!look_del(month,month == 13 ? 2 : 1) && 
      !look_del(mese,7) && !stampa_vers) return NULL; 
  */
  if (!look_del(mese,7) && !stampa_vers) return NULL;    
  //fine
  
  _DescrItem* d = new _DescrItem(DELEGA);
  
  d->_f0 = 0;
  
  if (stampa_vers) //solo se sono a debito 
    if (look_del(month,month == 13 ? 2 : 1))
    {
     if (_del->get("S9").not_empty())
       d->_f0 = 2;
     else d->_f0 = 1;  
     if (_del->get_bool("B0"))
     {
      d->_s0 = _del->get("S2");  // ufficio iva/concessione
      d->_s1 = _del->get("S1");  // descrizione banca
      d->_s2 = _del->get("S7");  // ABI
      d->_s3 = _del->get("S8");  // CAB   
      d->_r0 = _del->get_real("R0");
      d->_d0 = _del->get_date("D0");
     } // altrimenti lascia tutto in bianco e ci scriveranno i dati a mano
    } 
  
  if ( (month == 12 && (_freqviva == "M" || (_isbenzinaro && _gest4)))
      || (_isannual && _freqviva == "T" && !(_isbenzinaro && _gest4)) )
    if (look_del(12,7)) //sia che sia a debito oppure a credito
    {
      d->_s4 = "ACC";  
      if (_del->get("S9").not_empty())
        d->_f1 = 2;
      else d->_f1 = 1;
      TToken_string t;
      if (_del->get_bool("B0"))
      {
        t.add(_del->get("S2"));
        t.add(_del->get("S1"));
        t.add(_del->get("S7"));
        t.add(_del->get("S8"));
        t.add(_del->get_real("R0").string());
        t.add(_del->get("D0"));
      } 
      d->_s5 = t;
    }            
    
  return d;  
}                                   

void TLiquidazione_app::describe_consistence(const char* codatt)
{
  // controlla eventuali condizioni di conflitto con le normative
  // per la ditta e crea i messaggi appropriati
  // tutte le condizioni sono valutate sull'esercizio precedente
  int pryear = atoi(_year) - 1;
  TString att = codatt;

  _pla->zero();
  *_pla_ditta  = get_firm();
  *_pla_anno   = pryear;
  *_pla_codatt = att;
  
  if (_pla->read() == NOERR)
  {
    real va  = _pla->get_real("R0");

    // 1) consistenza volume d'affari <-> frequenza versamenti
    // deve essere: trimestrale ammesso solo se < 360.000.000
    // per servizi, < 1.000.000.000 per altre imprese
    // a meno che non sia benzinaro che ha diritto comunque

    if (_freqviva == "T" && !_isbenzinaro)
    {
      bool err = FALSE;
      if (_isservizio)  err = va > SOGLIA_TRIM_SERVIZI;
      else              err = va > SOGLIA_TRIM_ALTRE;
      if (err)
        describe_error("Incoerenza volume affari/frequenza versamenti",
                       att);
    }
  }
}


void TLiquidazione_app::describe_error(const char* err, const char* codatt)
{                            
  if (!_isprint || !_canprint) return;
  _errors.add(new _ErrItem(err,codatt,_nditte->curr().get("CODDITTA")));
}

// ----------------------------------------------------------------
// Setrows
// ----------------------------------------------------------------

void TLiquidazione_app::set_firm(_DescrItem& d)
{
  TString tim_title(80);
  tim_title << "Liquidazione IVA";

  if (d._f1 == 13)
    tim_title << format(": Riepilogo Annuale %s",(const char*)_year);
  else
  {
    if (d._s2 == "T")
      tim_title << format(" del %d° Trimestre %s", d._f1/3, (const char *) _year);
    else
      tim_title << format(" del mese di %s %s", itom(d._f1), 
                          (const char*)_year); 
  }

  reset_header();
  int soh = 1;
  if (!_isregis)
  {
    set_header(soh++,"Ditta %s %s@109gData @<@125gPag. @#", 
               (const char*)(d._s0), (const char*)(d._s1)); 
    set_header(soh++,"");   
  }
  set_header(soh++,sep);
  set_header(soh++,"%s@102gFrequenza %s", 
             (const char*)tim_title, 
             d._s2 == "T" ? "Trimestrale" : "Mensile");
  set_header(soh++,sep);
  set_header(soh++,"");  
  
  // notify errors if any
  int j = 0;
  for (int i = 0; i < _errors.items(); i++)
  {
    _ErrItem& s = (_ErrItem&)_errors[i];
    if (s._att == "ALL" && s._firm == d._s0)
    { j++; set_row(i+3, "@5g@b*** %s ***@r", (const char*)s._err); }
  }
  if (j) set_row(i+3,"");
}


void TLiquidazione_app::set_att(_DescrItem& d)
{
  // set header
  TString tim_title(78);
  TString att_title(48);
  
  // Bookmark                   
  TString book_name(d._s3); 
  char flags = (char)d._f3;

  if      (flags == '1') book_name << " (servizi)";
  else if (flags == '2') book_name << " (altre)";
  else if (flags == 'M') book_name = "Riepilogo att. mista";
  else if (flags == 'Q') book_name = "Riepilogo quater";
  
  if (_firm_bookmark == -1)
    _firm_bookmark = set_bookmark(d._s1);
  _att_bookmark = set_bookmark(book_name, _firm_bookmark);
  
  tim_title << "Liquidazione IVA";

  if (d._f1 == 13)
  {
    if (d._s4 == "T" && !(d._f2)) // trimestrale e non benzinaro
      tim_title << format(": Riepilogo Annuale %s",(const char*)_year);
    else
      tim_title << format(": Dichiarazione Annuale %s",(const char*)_year);
  }
  else
  {
    if (d._s4 == "T")
      tim_title << format(" del %d° Trimestre %s", d._f1/3, (const char *) _year);
    else
      tim_title << format(" del mese di %s %s", itom(d._f1), 
                          (const char*)_year); 
  }

  TString tipatt;       
  
  if (d._f0 > 0)
    tipatt.format(d._f0 == 1 ? "SERVIZI" : "ALTRE ATTIVITA'"); 

  if (d._s3.empty())
  {
    att_title = flags == 'M' ? "Riepilogo attivita' mista" : 
    "Riepilogo quater";
    //    att_title << d._s2;
  }
  else
    att_title = format("Attivita' %s %s %s", 
                       (const char*)(d._s2),
                       (const char*)(d._s3), 
                       (const char*)tipatt);

  reset_header();
  int soh = 1;
  if (!_isregis)
  {
    set_header(soh++,"Ditta %s %s@109gData @<@125gPag. @#", 
               (const char*)(d._s0), (const char*)(d._s1)); 
    set_header(soh++,"");    
  }
  set_header(soh++,sep);
  set_header(soh++,"%s@55g%s", (const char*)tim_title, (const char*)att_title);
  set_header(soh++,sep);
  set_header(soh++,"");
  
  // notify errors if any
  int j = 0;
  for (int i = 0; i < _errors.items(); i++)
  {
    _ErrItem& s = (_ErrItem&)_errors[i];
    if (d._s2 == s._att && s._firm == d._s0)
    { j++; set_row(i+10, "@5g@b*** %s ***@r", (const char*)s._err); }
  }
  if (j) set_auto_ff(TRUE);
}


void TLiquidazione_app::set_plafond(_DescrItem& d)
{                                  
  //if (_isregis) return;
  if (_isregis && _isfinal) return;

  set_bookmark("Quadro plafond", _att_bookmark);

  real r1 = d._r2 - d._r1 - d._r0;
  real r2 = d._r5 - d._r4 - d._r3;
  real r3 = d._r8 - d._r7 - d._r6;

  set_print_zero(TRUE);

  set_row(1,"QUADRO RELATIVO ALLA DISPONIBILITA' ED ALL'UTILIZZO "
          "MENSILE DEI PLAFOND");

  set_row(2,""); set_row(3,"");
  set_row(4,"Art. 8 1° comma lettere a-b@31gDisponibile@48g%r",
          &(d._r2));
  set_row(5,"Utilizzato all'interno@48g%r", &(d._r0));
  set_row(6,"Utilizzato per l'importazione@48g%r@69gRiporto@78g%r",
          &(d._r1), &r1);

  set_row(7,"");
  set_row(8,"Art. 8bis 1° comma@31gDisponibile@48g%r",
          &(d._r5));
  set_row(9,"Utilizzato all'interno@48g%r", &(d._r3));
  set_row(10,"Utilizzato per l'importazione@48g%r@69gRiporto@78g%r",
          &(d._r4), &(r2));

  set_row(11,"");
  set_row(12,"Art. 9 1° comma@31gDisponibile@48g%r",
          &(d._r8));
  set_row(13,"Utilizzato all'interno@48g%r", &(d._r6));
  set_row(14,"Utilizzato per l'importazione@48g%r@69gRiporto@78g%r",
          &(d._r7), &r3);

  set_print_zero(FALSE);
  set_auto_ff();
}

void TLiquidazione_app::set_liqacc(_DescrItem& d)
{
  real r1 = d._r0 + d._r1 + d._r2 + d._r4; 
  real r2 = d._r5 + d._r10;
  real r3 = r2 + d._r9 + d._r7;
  if ((d._r3).sign() > 0) r1 += d._r3; 
  else r3 += abs(d._r3);
  
  set_row(1,""); set_row(2,""); set_row(3,""); set_row(4,"");
  set_row(5,"@11gCALCOLO ACCONTO SU OPERAZIONI EFFETTUATE");
  set_row(6,""); 
  set_row(7,"@72gCredito@90gDebito"); set_row(8,"");
  if (!_isdiffacc)
    set_row(9,"@11gIva sulle operazioni annotate fino al 20 Dicembre@81g%r",
            &(d._r0));
  else set_row(9,"@11gIva sulle operazioni di vendita@81g%r",
               &(d._r0));
  int i = 10;
  if (!_isdiffacc)
  {
    set_row(i++,"@11gIva su operazioni fino al 20 Dic., ma non fatturate@81g%r",
            &(d._r1));
    set_row(i++,"@11gIva su operazioni fino al 20 Dic., ma non annotate@81g%r",
            &(d._r2));        
  }
  set_row(i,"@11gRettifiche iva a debito");
  if (d._r3.sign() > 0)
    set_row(i,"@81g%r", &(d._r3));
  i++;
  set_row(i++,"@11gIva chiesta a rimborso@81g%r", &(d._r4));
  set_row(i++,"@11gRISULTATO@81g%r", &r1);  
  
  if (!_isdiffacc)
    set_row(i++,"@11gIva sugli acquisti annotati fino al 20 Dicembre@64g%r", 
            &r2);
  else set_row(i++,"@11gIva sulle operazioni di acquisto@64g%r", &r2);
  if (d._r6 != ZERO)
    set_row(i++,"@11gmeno perc. di prorata pari a lire  %r", &(d._r6));
  set_row(i++, "@11gCredito precedente@64g%r", &(d._r9));
  set_row(i, "@11gRettifiche iva a credito");
  if ((d._r3).sign() <= 0) 
  {
    real ab = abs(d._r3);
    set_row(i,"@64g%r", &ab);  
  }
  i++;
  set_row(i++,"@11gRISULTATO@64g%r", &r3);
  if ((d._r8).sign() < 0) 
  {
    real ab = abs(d._r8);
    set_row(i++,"@23gCREDITO DA EVIDENZIARE@64g%r", &ab);
  }
  else if ((d._r8).sign() > 0 && d._r8 > ACCONTO_MINIMO_DA_VERSARE)
    set_row(i++,"@23gACCONTO DA VERSARE@81g%r", &(d._r8));
  else if ((d._r8).sign() > 0 && d._r8 <= ACCONTO_MINIMO_DA_VERSARE)
    set_row(i++,"@23gACCONTO DA NON VERSARE@64g%r", &(d._r8));
  
  set_auto_ff();
}

void TLiquidazione_app::set_pim_head(_DescrItem& d)  
{
  set_bookmark("Riepilogo progressivi", _att_bookmark);   
  if (d._f0)
  {
    set_row(1," Cod.@41gVENDITE@71gCORRISPETTIVI");
    set_row(2," IVA Descrizione@30gImponibile@49gImposta@63gImponibile@82gImposta");
  }
  else
  {
    set_row(1," Cod.@41gVENDITE@71gCORRISPETTIVI@106gACQUISTI");
    set_row(2," IVA Descrizione@30gImponibile@49gImposta@63gImponibile"
            "@82gImposta@96gImponibile@115gImposta");
  }
  set_row(3,"");
}

void TLiquidazione_app::set_pim(_DescrItem& d)
{        
  // succede con le autocazzate non residenti non movimentate eccetera
  if ((d._r0 + d._r1 + d._r2 + d._r3 + d._r4 + d._r5) == ZERO)
    return;
  
  int rw = 1;
  if (d._s1 == "A35") 
    d._s2 = "Artt.17c3/74c1";
  else if (d._s0 == "74TER")
    rw++;
  else
  {
    look_iva(d._s1);
    d._s2 = _iva->get("S0");
    if (d._s2.len() > 19) d._s2.cut(19);
  }

  if (d._f0)  // e' il primo: non fa piu' nulla perche' l'intestazione 
    // viene fatta comunque da set_pim_head
  {} 

  set_row(rw++,"%4s %s@25g%r@41g%r@58g%r@74g%r@91g%r@107g%r",
          (const char*)d._s1,
          (const char*)d._s2,
          &(d._r0),
          &(d._r1),
          &(d._r2),
          &(d._r3),
          &(d._r4),
          &(d._r5));
}

void TLiquidazione_app::set_plm(_DescrItem& d)
{
  int rw = 1; 
  if (!(d._r0.is_zero() &&
        d._r1.is_zero() &&
        d._r2.is_zero() &&
        d._r3.is_zero() &&
        d._r4.is_zero() &&
        d._r5.is_zero()))
  {    
    set_row(rw++,""); set_row(rw++,"");
    set_row(rw++,"Totale@25g%r@41g%r@58g%r@74g%r@91g%r@107g%r",
            &(d._r0),
            &(d._r1),
            &(d._r2),
            &(d._r3),
            &(d._r4),
            &(d._r5));
    set_row(rw++,"");
  }
  if (!d._r6.is_zero())
  {
    set_row(rw++,"di cui per acquisti intracomunitari@107g%r", &(d._r6)); 
  } 
  if (!(d._r7.is_zero() && d._r8.is_zero()))
  {
    set_row(rw++,"Totali acquisti indeducibili per art.19@91g%r@107g%r",
            &(d._r7), &(d._r8));
  }
  if (! (d._r9.is_zero() && d._r10.is_zero()))
  { 
    set_row(rw++, "Totale acquisti indeducibili su ricavi esenti@91g%r@107g%r", 
            &(d._r9), 
            &(d._r10));  
  }
  
  real acq_pint(d._s0);
  real acq_pint_iva(d._s1);

  if (! (acq_pint.is_zero() && acq_pint_iva.is_zero()))
  { 
    set_row(rw++, "Totale acquisti indeducibili per passaggi interni@91g%r@107g%r", 
            &acq_pint, 
            &acq_pint_iva);  
  }

  real tot1 = d._r7 + d._r4 + d._r9  + acq_pint; 
  real tot2 = d._r8 + d._r5 + d._r10 + acq_pint_iva; 

  if (tot1 != d._r4 || tot2 != d._r5)   
  { 
    // i corrispettivi finiscono nelle vendite
    d._r0 += d._r2;
    d._r1 += d._r3; 
    d._r2 = ZERO;
    d._r3 = ZERO;
    // per ora lascio r2 e r3 anche se sono sempre 0
    set_row(rw++, "");
    set_row(rw++,"Totale Generale IVA@25g%r@41g%r@58g%r@74g%r@91g%r@107g%r",
            &(d._r0),
            &(d._r1),
            &(d._r2),
            &(d._r3),
            &tot1,
            &tot2);  
  }
}


void TLiquidazione_app::set_pumpam(_DescrItem& d)
{
  bool printed = FALSE;
  
  // d._f1 dice se c'era qualcosa sopra nella stessa pagina
  real spgn(d._s2);
  real spgn_iva(d._s3);           

  TToken_string tt(d._s4);  // Token String
  TToken_string dp(d._s0);  // Due Palle
  real aqsi(tt.get(0));
  real aqsv(tt.get(1));
  real vnsi(tt.get(2));
  real vnsv(tt.get(3));            
  real ammindi(dp.get(1));
  real ammindv(dp.get(2));
  
  int row = 5;

  if (!(aqsi.is_zero() && aqsv.is_zero()))
  {
    printed = TRUE;
    set_row(row++, "Acquisti in sospensione di imposta@50g%r@69g%r", 
            &aqsi, 
            &aqsv);   
  }                          
  if (!(vnsi.is_zero() && vnsv.is_zero()))
  {
    printed = TRUE;
    set_row(row++, "Vendite in sospensione di imposta@50g%r@69g%r", 
            &vnsi, 
            &vnsv);   
  }                          
  if (!(d._r8.is_zero() && d._r9.is_zero()))
  {
    printed = TRUE;
    set_row(row++, "Cessione beni ammortizzabili@50g%r@69g%r",
            &(d._r8), 
            &(d._r9));
  }
  if (! (d._r4.is_zero() && d._r5.is_zero()))
  {
    printed = TRUE;
    set_row(row++, "Acquisto beni destinati alla rivendita@50g%r@69g%r", 
            &(d._r4), 
            &(d._r5));
  }
  if (! (ammindi.is_zero() && ammindv.is_zero()))
  {
    printed = TRUE;
    set_row(row++, "Acquisto beni ammortizzabili IVA indetraibile@50g%r@69g%r", 
            &ammindi, 
            &ammindv);
  }
  if (! (d._r0.is_zero() && d._r1.is_zero()))
  {
    printed = TRUE;
    set_row(row++, "Acquisto beni ammortizzabili IVA detraibile@50g%r@69g%r", 
            &(d._r0), 
            &(d._r1));
  }
  if (!(d._r6.is_zero() && d._r7.is_zero()))
  {
    printed = TRUE;
    set_row(row++, "Altri beni strumentali acquisiti in leasing@50g%r@69g%r", 
            &(d._r6), 
            &(d._r7));   
  }
  if (!(d._r2.is_zero() && d._r3.is_zero()))
  {
    printed = TRUE;
    real rn = d._r2 * real(DETRAZIONE_6PERCENTO);
    set_row(row++, "Acquisto beni soggetti a detrazione (6%%)"
            "@50g%r@69g%r@86g%r", 
            &(d._r2), 
            &(d._r3),
            &rn);
  }
  if (!(spgn.is_zero() && spgn_iva.is_zero()))
  {
    printed = TRUE;
    set_row(row++, "Spese generali@50g%r@69g%r", 
            &spgn, 
            &spgn_iva);
  }
  if (d._f0)
  {
    printed = TRUE;            
    real prc(dp.get(0));
    
    set_row(row++, "%% PRO-RATA ed IVA non detraibile (%s%%)@69g%r", 
            (const char*)prc.string(), &(d._r11));
  }
  
  // items vari per dichiarazione annuale
  for (int i = 0; i < d._arr.items(); i++)
  { 
    _DescrItem& dd = (_DescrItem&)d._arr[i];
    printed |= set_annual(dd);
  }
  
  if (printed)
  {           
    set_bookmark("Altri dati", _att_bookmark);

    set_row(1,"");
    set_row(2,"");
    set_row(3,"ALTRI DATI RELATIVI ALLA DICHIARAZIONE@55gimponibile"
            "@77gimposta@91gdetrazione");
    set_row(4,"");
  }
  else /* if (!d._f1)  */
    set_row(1,"");
  
  // form feed
  /* if (printed || !d._f1) */ set_auto_ff(TRUE);
}

void TLiquidazione_app::set_grand(_DescrItem& d)
{
  real& risultato  = d._r0;
  real& rimborso   = d._r1;
  real& cred_cost  = d._r2;
  real& deb_mens   = d._r3;
  real& rettifiche = d._r5;
  real& detrazioni = d._r6;
  real& interessi  = d._r7;
  real& versamenti = d._r8;
  real& vers_int   = d._r9;
  real& conguaglio = d._r10;
  TToken_string tt(d._s0);
  real iva_vend(tt.get(0));
  real iva_acq(tt.get(1));   
  real cred_prec(tt.get(2));
  real debt_prec(tt.get(3));
  
  real acc_dec(d._s1);
  real res_cred(d._s2);
  real res_debt(d._s3);
  real rett_debt(0.0);
  real rett_cred(0.0);                
  real& interesse = d._r11;
  
  if (rettifiche.sign() > 0) rett_debt = rettifiche;
  if (rettifiche.sign() < 0) rett_cred = -rettifiche;

  set_bookmark("Riepilogativo liquidazione", _firm_bookmark);

  set_row(1,""); set_row(2,""); set_row(3,""); set_row(4,"");
  set_row(5,"@11g@bCALCOLO LIQUIDAZIONE D'IMPOSTA@r");
  set_row(6,""); int rw = 7;
  set_row(rw++," @66gCredito@84gDebito"); set_row(rw++,"");
  set_row(rw++,"@11gIva sulle operazioni di vendita@75g%r", &iva_vend);
  set_row(rw++,"%s@11gRettifiche IVA a debito%s@75g%r",
          _is_visliq ? "$[r]" : "", _is_visliq ? "$[n]" : "", &rett_debt);
  set_row(rw++,"%s@11gIva chiesta a rimborso%s@75g%r",
          _is_visliq ? "$[r]" : "", _is_visliq ? "$[n]" : "", &rimborso);

  // conguaglio prorata
  if (conguaglio.sign() > 0)
    set_row(rw++,"@11gConguaglio pro-rata@75g%r", &conguaglio);

  // debito liq. precedente < 50000
  if (debt_prec > ZERO) 
    set_row(rw++,"@11gDebito da liquidazione precedente@75g%r", &debt_prec);
  
  set_row(rw++,"@11gRISULTATO@75g%r", &res_debt);
  set_row(rw++,"@11gIva sulle operazioni di acquisto@58g%r", &iva_acq);
  if (_isannual || d._f1)
    set_row(rw++,"@11gCredito inizio anno@58g%r", &cred_prec);
  else
    set_row(rw++,"@11gCredito precedente@58g%r", &cred_prec);

  if (!acc_dec.is_zero())
    set_row(rw++,"%s@11gVersamento acconto dicembre%s@58g%r", 
            _is_visliq ? "$[r]" : "", _is_visliq ? "$[n]" : "", &acc_dec);

  if (!detrazioni.is_zero())
    set_row(rw++,"@11gUlteriori detrazioni@58g%r", &detrazioni);

  set_row(rw++,"%s@11gRettifiche IVA a credito%s@58g%r", 
          _is_visliq ? "$[r]" : "", _is_visliq ? "$[n]" : "", &rett_cred);
  
  if (!_is_visliq)
  {
    // versamenti effettuati
    if (!versamenti.is_zero())
    {        
      set_row(rw++,"@11gVersamenti effettuati@58g%r", &versamenti);
    }
    // versamenti integrativi
    if (!vers_int.is_zero())
    {        
      set_row(rw++,"@11gVersamenti integrativi@58g%r", &vers_int);
    }  
  }
  if (conguaglio.sign() < 0) 
  {                                                            
    real cg = conguaglio;
    cg = -cg;
    set_row(rw++,"@11gConguaglio pro-rata@58g%r", &cg);
  }

  set_row(rw++,"@11gRISULTATO@58g%r", &res_cred);

  // se non c'e' nulla da versare stampa solo una riga vuota
  // Serve, non toglierla, stronzo.
  if (risultato.is_zero()) 
    set_row(rw++,"");
  else
  {
    if (risultato.sign() < 0) 
    {
      real iva = abs(risultato); 
      if (_isannual || _isriepilogo) iva.round(ROUND_MILLELIRE);
      set_row(rw++,"@23gCREDITO ATTUALE@58g%r",&iva);
    }
    else
    { 
      real iva = risultato + interessi; 
      if (_isannual || _isriepilogo) iva.round(ROUND_MILLELIRE);
      if (!iva.is_zero()) 
      {
        if (!interessi.is_zero())
        {
          set_row(rw++,"@23gIVA DOVUTA@75g%r",&risultato);  
          set_row(rw++,"@23gInteresse %6.2r %%@75g%r",&interesse, &interessi);
        }
        if (iva >= IVA_DA_RIPORTARE || _isannual || _isriepilogo)
          set_row(rw++,"@23gIVA DA VERSARE@75g%r",&iva);
        else
          set_row(rw++,"@23gIVA A DEBITO DA NON VERSARE@75g%r",&iva); 
      }                                      
    }
  }
  
  if (_is_visliq)
  {
    // stampa versamenti (anche 0) ad uso visualizzazione liquidazione IVA
    rw ++;
    set_row(rw++,"@11g$[r]Versamenti effettuati$[n]@58g%r", &versamenti);  
    set_row(rw++, "");
    set_row(rw++, "");
  } 

  if (!_is_visliq) 
  {
    // descrizione rettifiche 
    if (!(d._s4.empty() && d._s5.empty()))
    {
      rw++; 
      set_row(rw++, "@11g@bDESCRIZIONE RETTIFICHE@r");  
      rw++;
    }
    if (!d._s4.empty()) { set_row(rw++, "@11g%t", &(d._s4)); }
    if (!d._s5.empty()) { set_row(rw++, "@11g%t", &(d._s5)); }
  }             
  
  // rapportini per rimborso infraannuale 
  // non si stampano se la stampa serve per la visualizz.
  //modifica del 07/07/1995 
  //*** solo in st.di prova in coda ai registri deve scendere 
  //    il prospetto di rimborso
  //*** sempre (cioe' in bollato e in prova) deve scendere 
  //    il prospettino versamento (boh???????????????????)
  //if (d._arr.items() > 0 && !_is_visliq && !_isregis)
  if (d._arr.items() > 0 && !_is_visliq)
  {
    for (int i = 0; i < d._arr.items(); i++)
    {
      _DescrItem& di = (_DescrItem&)d._arr[i];
      
      if (di._flags == RIMBORSO)
      { 
        if (!_isregis || (_isregis && !_isfinal))
        {
          set_print_zero(TRUE);
          set_row(rw++,""); 
          set_row(rw++,"");

          set_bookmark("Prospetto di rimborso", _firm_bookmark);

          set_row(rw++, "    PROSPETTO DI RIMBORSO");

          if (di._f0)
          {    
            // esenti e non imponibili
            set_row(rw++,"");
            set_row(rw++,"1) Soggetto con quota di operazioni esenti e non"
                    " imponibili superiore al 25%%");

            real perc = (di._r0/di._r1); perc *= CENTO;  perc.ceil(ROUND_LIRA);
            
            TString sep(strlen(REAL_PICTURE)+2); sep.fill('-');
            set_row(rw++,"");
            set_row(rw++,"@26gTotale operazioni esenti e non imp.@66g%r", 
                    &(di._r0));
            set_row(rw++,"@66g%t  x 100 = %3r%%", &sep, &perc);
            set_row(rw++,"@26gVolume di affari lordo@66g%r", &(di._r1));
            set_row(rw++,"");
          }
          
          if (di._f1)
          {                                             
            set_row(rw++,"");
            set_row(rw++,"2) Soggetto con acquisti ad aliquota media "
                    "superiore a quella delle vendite");
            TString sep(strlen(REAL_PICTURE)+2); sep.fill('-');
            set_row(rw++,"");
            set_row(rw++,"@26gTotale imposte sugli acquisti@66g%r", &(di._r5));
            set_row(rw++,"@66g%t  x 100 = %5.2r%%", &sep, &(di._r7));
            set_row(rw++,"@26gTotale imponibili sugli acquisti@66g%r", 
                    &(di._r3));
            set_row(rw++,"");
            set_row(rw++,"@26gTotale imposte sulle vendite@66g%r", &(di._r4));
            set_row(rw++,"@66g%t  x 100 = %5.2r%%", &sep, &(di._r6));
            set_row(rw++,"@26gTotale imponibili sulle vendite@66g%r", &(di._r2));
          }                       
          
          set_print_zero(FALSE);
        } 
      }
      // prospettino versamento
      else if (di._flags == DELEGA)
      {                  
        int rr = rw;
        /*
           if (rw < (printer().formlen() - 10)) 
           rw = printer().formlen() - 10;
           */
        //11/10/1995
        int cont = 10;
        if (di._s4 == "ACC") 
        {
          TToken_string ac(di._s5);
          if (!ac.empty_items()) 
            cont = 14;
        }    
        if (rw < (printer().formlen() - cont)) 
          rw = printer().formlen() - cont;
        //fine
        
        for (int i = rr; i < rw; i++) set_row(i,"");

        set_bookmark("Riepilogo versamenti", _firm_bookmark);
        
        TString dt = di._d0.string();
        TString vr = di._r0.string("###.###.###.###");
        
        // la cincia non vuole lo zero                                                                    
        if (atof(vr) == 0.0 && vr[vr.len()-1] == '0') vr[vr.len()-1] =  ' ';
        
        //11/10/1995
        if (di._s4 == "ACC") 
        {
          TToken_string ac(di._s5);
          if (!ac.empty_items())
          { 
            TString dt (ac.get(5));
            real app (ac.get(4)); 
            TString vr (app.string("###.###.###.###"));
            TString loc (ac.get(0));
            TString ban (ac.get(1));     
            TString abi (ac.get(2));
            TString cab (ac.get(3));
            if (atof(vr) == 0.0 && vr[vr.len()-1] == '0') vr[vr.len()-1] = ' ';
            set_row(rw++, "- ACCONTO DICEMBRE -");
            set_row(rw, "Versamento di L. %s effettuato il %s",
                    (const char*)vr, 
                    (const char*)dt); 
            if (di._f1 == 1)
            {
              set_row(rw++, "@68gdiretto all'ufficio IVA di %s", (const char*)loc);
              set_row(rw++, "@68gtramite %s", (const char*)ban);
              set_row(rw++, "@68gcodice azienda %s codice dipendenza %s",
                      (const char*)abi, (const char*)cab);
            }
            else if (di._f1 == 2)
            {
              set_row(rw++, "@68gdiretto al Ministero delle Finanze");
              set_row(rw++, "@68gConcessione %s", (const char*)loc);             
            } 
          }
          set_row(rw++, "- SALDO -");
        }
        //fine

        set_row(rw, "Versamento di L. %s effettuato il %s",
                (const char*)vr, 
                (const char*)dt);   
        if (di._f0 == 1)
        {
          set_row(rw++, "@68gdiretto all'ufficio IVA di %s", 
                  (const char*)(di._s0));
          set_row(rw++, "@68gtramite %s", (const char*)(di._s1));
          set_row(rw++, "@68gcodice azienda %s codice dipendenza %s",
                  (const char*)(di._s2), (const char*)(di._s3));
        }
        else if (di._f0 == 2)
        {
          set_row(rw++, "@68gdiretto al Ministero delle Finanze");
          set_row(rw++, "@68gConcessione %s", (const char*)(di._s0));             
        }
        else 
        {
          set_row(rw++, "@68gdiretto");
          set_row(rw++, "@68gtramite");
        }        
      }  
    }
  }
  
  if (!_is_visliq) set_auto_ff(TRUE);
  else set_auto_ff(FALSE);       
  
  _firm_bookmark = -1;
}


bool TLiquidazione_app::set_annual(_DescrItem& d)
{
  // chiamata internamente a set_pims 
  bool ret = FALSE;
  
  int row = get_maxrow()+1; 
  if (d._f0 & IS_PRORATA)
  {                                    
    // non lo ha stampato prima se annuale, perche' vladimiro il nefido
    // pretende l'assurdo aggiornamento della perc. a quella nuova
    set_row(++row, "%% PRO-RATA ed IVA non detraibile (%s%%)@69g%r", 
            (const char*)(d._r2.string()), &(d._r6));
    row++;

    set_bookmark("Calcolo pro-rata", _att_bookmark);

    ret = TRUE;
    set_print_zero(TRUE);
    set_row(row++,"");
    set_row(row++,"CALCOLO DELLA PERCENTUALE DI INDETRAIBILITA'");
    set_row(row++,"");
    set_row(row++,"Operazioni esenti riga B1@30g%r", &(d._r1));
    set_row(row++,"Operazioni esenti riga B2@30g%r", &(d._r4));
    set_row(row++,"Operazioni esenti riga B3@30g%r", &(d._r5));
    set_row(row++,"Volume d'affari   riga B4@30g%r", &(d._r0));
    set_row(row++,"Indetraibilita'@30g%r%%",         &(d._r2));
    if (!(d._r3.is_zero()))
    { 
      const char* sss = d._r3.sign() < 0 ? "credito" : "debito";
      real ccc = abs(d._r3);
      set_row(row++,"Conguaglio a %s@30g%r", sss, &ccc);
    }
    set_print_zero(FALSE);
  }
  return ret;
}


void TLiquidazione_app::set_ventila(_DescrItem& d)
{
  if (d._arr.items() == 0 || d._r0.is_zero())
    return;

  set_bookmark("Prospetto ventilazione", _att_bookmark);

  set_row(1,"@54gPROSPETTO VENTILAZIONE");
  set_row(2,"");
  set_row(3,""); 
  set_row(4,"@10gTotale acquisti destinati alla rivendita@55g%r",
          &(d._r0));
  set_row(5,"@10gTotale dei corrispettivi da ventilare@55g%r",
          &(d._r1));
  real m = d._r1 / d._r0;
  set_row(6,"@10gMoltiplicatore@59g%3.9r",&m);
  set_row(7,"");
  set_row(8,"@10gCod.");
  set_row(9,"@10gIVA@17gDescrizione@48gAcquisti"
          "@65gImponibile vendite@89gImposta vendite");
  set_row(10,"");
  int row = 11;
  real t1, t2, t3;
  for(int i = 0; i < d._arr.items(); i++)
  {
    _vDesc& vd = (_vDesc&)d._arr[i];
    look_iva(vd._codiva);
    TString s0 = _iva->get("S0");
    set_row(row+i,"@8g%5s@17g%s@41g%r@68g%r@89g%r",
            (const char*)vd._codiva,
            (const char*)s0,
            &(vd._acq),
            &(vd._vnd),
            &(vd._viv));
    t1 += vd._acq;
    t2 += vd._vnd;
    t3 += vd._viv;
  }
  set_row(row+i+1,"");
  set_row(row+i+2,"@10gTotale@41g%r@68g%r@89g%r",
          &t1, &t2, &t3);
  set_auto_ff(TRUE);
}

void TLiquidazione_app::set_regagr(_DescrItem& d)
{
  set_print_zero(TRUE);

  real& agr_1  = d._r0;
  real& agr_2  = d._r1;
  real& agr_3  = d._r2;
  real& agr_4  = d._r3;
  real& agr_5  = d._r4;
  real& agr_6  = d._r5;
  real& agr_7  = d._r6;                                     
  real& agr_1i = d._r7;
  real& agr_2i = d._r8;

  real ara = agr_5 + agr_6;
  real arn = agr_3 + agr_4;
  
  // percentuale detraibilita'
  //  real pdetr = ();
  set_bookmark("Prospetto regime agricolo", _att_bookmark);

  set_row(1,"@50gPROSPETTO REGIME AGRICOLO");
  set_row(2,"");
  set_row(3,  "Cessioni in regime agricolo (Tabella A/I)@54g%r",&agr_1);
  set_row(4,  "");
  set_row(5,  "Cessioni non in regime agricolo@54g%r",&agr_2);
  set_row(6,  "");
  set_row(7,  "Acquisti in regime agricolo@54g%r",&ara);
  set_row(8,  "");
  set_row(9,  "Acquisti non in regime agricolo@54g%r",&arn);
  set_row(10, "... di cui beni ammortizzabili@54g%r",&agr_4);
  set_row(11,  "");
  set_row(12,  "Acquisti ad uso promiscuo@54g%r",&agr_7);
  
  if (/*agr_7.sign() > 0*/ TRUE)
  {
    real pdetr  = (agr_2i / (agr_1i + agr_2i)); 
    pdetr.round(2);
    real ivadt  = agr_7 * pdetr;           
    pdetr *= CENTO; 
    pdetr.round(ROUND_LIRA);
    ivadt.round(ROUND_LIRA);

    TString up = agr_2i.string(".");
    up << " x 100";
    TString dn = agr_1i.string(".");
    dn << " + " << agr_2i.string(".");
    int ln = max(up.len(), dn.len()) + 2; 
    TString den(ln); den.fill('-');
    up.center_just(ln); dn.center_just(ln);

    set_row(13, "");
    set_row(14, "@31g%s", (const char*)up);
    set_row(15, "Percentuale di detraibilita'@31g%s = @54g%r",
            (const char*)den, 
            &pdetr);
    set_row(16, "@31g%s", (const char*)dn);

    up = agr_7.string(".");
    up << " x " << pdetr.string(".");
    dn = "100";
    if ((max(up.len(), dn.len()) + 2) > ln)
      ln = max(up.len(), dn.len()) + 2; 
    TString den1(ln); den1.fill('-');
    up.center_just(ln); dn.center_just(ln);

    set_row(17, "");
    set_row(18, "@31g%s", (const char*)up);
    set_row(19, "Iva detraibile@31g%s = @54g%r",
            (const char*)den1, 
            &ivadt);
    set_row(20, "@31g%s", (const char*)dn);
  }
  
  set_auto_ff(TRUE);
  set_print_zero(FALSE);
}

void TLiquidazione_app::set_viaggio(_DescrItem& d)
{
  // the longest & stronzest
  // Nel corso della scrittura di questa funzione
  // Berlusconi + Fini + Bossi hanno vinto le elezioni
  // ... lungo commento cancellato
  
  real& corr_CEE     = d._r0;
  real& corr_misCEE  = d._r1;
  real& corr_noCEE   = d._r2;
  real& acq_CEE      = d._r3;
  real& acq_misCEE   = d._r4;
  real& acq_noCEE    = d._r5;
  real& acq_misnoCEE = d._r6;
  real& cred_cos     = d._r8;

  real perc_r   = (acq_misCEE * CENTO)/(acq_misCEE + acq_misnoCEE); perc_r.round(2);
  real ivm      = (corr_misCEE * perc_r)/CENTO; ivm.round(ROUND_LIRA);
  real tc       = (corr_CEE + ivm);
  real ta       = (acq_CEE + acq_misCEE);
  real bi       = tc - ta - cred_cos;

  real tcc      = corr_CEE + corr_noCEE + corr_misCEE;
  real tco      = acq_CEE + acq_noCEE + acq_misCEE + acq_misnoCEE;
  real tma      = acq_CEE + acq_misCEE;
  //  real rip = perc_r; rip.round(2);
  //  real cim = (d._r1 * d._r7)/CENTO; cim.round(ROUND_LIRA);


  set_print_zero(TRUE);

  set_bookmark("Prospetto 74 ter", _att_bookmark);

  set_row(1,"");
  set_row(2,"@54gRIEPILOGO 74 TER");
  set_row(3,"");
  set_row(4,"Ammontare dei corrispettivi relativi a viaggi eseguiti"
          " interamente nella CEE .....................@100g%r", &(corr_CEE));
  set_row(5,"Ammontare dei corrispettivi relativi a viaggi misti (dentro"
          " e fuori CEE) ......................... @100g%r", &(corr_misCEE));
  set_row(6,"Ammontare dei corrispettivi relativi a viaggi eseguiti"
          " interamente fuori CEE ..................... @100g%r", &(corr_noCEE));


  set_row(7,"");
  set_row(8,"@56gTotale corrispettivi@100g%r", &tcc);
  set_row(9,"");

  set_row(10,"Ammontare dei costi relativi a viaggi interamente"
          " svolti nella CEE ............................... @100g%r", 
          &(acq_CEE));
  set_row(11,"Ammontare dei costi relativi a viaggi misti (per la"
          " parte CEE) ................................... @100g%r", 
          &(acq_misCEE));
  set_row(12,"Ammontare dei costi relativi a viaggi interamente"
          " svolti fuori CEE ............................... @100g%r", 
          &(acq_noCEE));
  set_row(13,"Ammontare dei costi relativi a viaggi misti (per la"
          " parte fuori CEE) .............................@100g%r",
          &(acq_misnoCEE));


  set_row(14,"");
  set_row(15,"@64gTotale costi@100g%r", &tco);

  set_row(16,"");
  set_row(17,"DETERMINAZIONE CORRISPETTIVI IMPONIBILI "
          "RELATIVI A VIAGGI MISTI");
  set_row(18,"");

  // la bella frazioncina della percentuale di ripartizione
  TString tmp(acq_misCEE.string(REAL_PICTURE)); tmp.ltrim(); 
  TString up = tmp;
  up << " x 100";
  TString dn = tmp;
  tmp = acq_misnoCEE.string(REAL_PICTURE); tmp.ltrim();
  dn << " + " << tmp;
  int ln = max(up.len(), dn.len()) + 2;
  TString den(ln); den.fill('-');
  up.center_just(ln); dn.center_just(ln);
  
  // la bella frazioncina degli imponibili viaggi misti
  TString tmp2 = corr_misCEE.string(REAL_PICTURE); tmp2.ltrim(); 
  TString up2 = tmp2;
  up2 << " x " << perc_r.string(2);
  TString dn2 = "100";
  int ln2 = max(up2.len(), 3) + 2;
  TString den2(ln2); den2.fill('-');
  up2.center_just(ln2); dn2.center_just(ln2);

  // la gran frazionazza centrata e stupenda
  int tot  = 35 + ln + ln2; 
  int rem1 = (100 - tot)/2; if (rem1 < 0) rem1 = 0;
  int pos1 = rem1 + 13;
  int rem2 = pos1+ den.len() + 11;
  int pos2 = rem2 + 20;


  set_row(19,format("@%dg%%t@%dg%%t", pos1, pos2),
          &up, &up2);
  set_row(20,format("@%dgPerc. rip. = %%t = %%5.2r; @%dg"
                    "Imp. viaggi misti = %%t = @100g%%r", 
                    rem1, rem2),
          &den, &perc_r, &den2, &ivm);
  set_row(21,format("@%dg%%t@%dg%%t", pos1, pos2),
          &dn, &dn2);

  real tmr = corr_CEE + ivm;

  // whew, come dicono su Topolino

  tmp = corr_CEE.string(REAL_PICTURE); tmp.ltrim();
  up = "("; up << tmp << " + "; 
  tmp = ivm.string(REAL_PICTURE); tmp.ltrim();
  up << tmp << ")";
  den.fill('.',59-up.len());
  set_row(23,"Ammontare dei corrispettivi imponibili@40g%t %t@100g%r", 
          &up, &den, &tmr);

  // se e' l'annuale non ha senso altro
  if (d._f1) return;

  tmp = acq_CEE.string(REAL_PICTURE); tmp.ltrim();
  up = "("; up << tmp << " + "; 
  tmp = acq_misCEE.string(REAL_PICTURE); tmp.ltrim();
  up << tmp << ")";
  den.fill('.',59-up.len());
  set_row(24,"Ammontare dei costi deducibili@40g%t %t@100g%r", 
          &up, &den, &tma);
  den.fill('.',60);
  set_row(25,"Credito di costo precedente @40g%t@100g%r", &den, &(cred_cos));
  
  tmp = tmr.string(REAL_PICTURE); tmp.ltrim();
  up = "["; up << tmp << " - (";
  tmp = tma.string(REAL_PICTURE); tmp.ltrim();
  up << tmp << " + ";
  tmp = d._r8.string(REAL_PICTURE); tmp.ltrim();
  up << tmp << ")]";
  den.fill('.',59-up.len());

  set_row(26,"Base imponibile lorda@40g%t %t@100g%r", &up, &den, &bi);
  set_row(27,"");

  if (bi.sign() > 0)
  {
    real aliva  = aliquota_agvia();
    real alcnt  = aliva + CENTO;
    real dovuta = (bi/(alcnt/CENTO)) * (aliva/CENTO); 
    dovuta.ceil(ROUND_LIRA);          // ceil voluto da MI3074
    
    tmp = bi.string(REAL_PICTURE); tmp.ltrim(); 
    up = tmp;
    up << " x " << aliva.string(5,2);
    dn = alcnt.string();
    ln = max(up.len(), 3) + 2;
    den.fill('-',ln);
    up.center_just(ln); dn.center_just(ln);
    
    tmp.fill('.', 59 - den.len());

    set_row(28,"@40g%t",&up);
    set_row(29,"IVA A DEBITO@40g%t %t@100g%r", &den, &tmp, &dovuta);
    set_row(30,"@40g%t", &dn);
  }
  else if (bi.sign() < 0)
  {
    bi = abs(bi);
    set_row(28,"");
    set_row(29,"CREDITO DI COSTO DA RIPORTARE@100g%r", &bi);
  }

  set_print_zero(FALSE);
  set_auto_ff(TRUE);
}

void TLiquidazione_app::set_acconto_p(_DescrItem& d)
{
  //set_print_zero(TRUE);                      
  
  const char* errmsg[3] = {
  {"manca la tabella risultati liquidazione per l'anno corrente"},
{"manca la tabella risultati liquidazione per l'anno precedente"},
{"manca la tabella dichiarazione annuale per l'anno precedente"}};

set_row(1,"%t@7g%t",&(d._s0), &(d._s1));
if (d._f2) 
  set_row(1,"@50g@b*** %s ***@r", errmsg[d._f2 -1]);
else
{
  if (d._f0) // base anno in corso
  {
    if (d._f1) // stampa base di calcolo
    {
      /***
        real bc = d._r0; 
        if (bc.sign() < 0) 
        {
        bc = abs(bc);
        set_row(1,"@73g%r@86g%r@119g%s", &bc, &d._r1, 
        d._f3 ? "Si" : "No"); 
        }
        else
        set_row(1,"@55g%r@86g%r@119g%s", &bc, &(d._r1), 
        d._f3 ? "Si" : "No");
        ***/
      set_row(1,"@58g%r@74g%r@96g%r@122g%s", &(d._r3), 
              &(d._r2), &(d._r1), d._f3 ? "Si" : "No");            
    }
    else set_row(1,"@62g%r@91g%s", &(d._r1), d._f3 ? "Si" : "No"); 
  }
  else //metodo storico
  {
    if (d._f1 && (d._r0).sign()>0) // stampa base di calcolo
      set_row(1,"@58g%r@88g%r", &(d._r0), &(d._r1));
    else
      set_row(1,"@87g%r",&(d._r1));
  }
}
//set_print_zero(FALSE);
}

void TLiquidazione_app::set_acchead_p(_DescrItem& d)
{
  reset_header();
  set_header(1,"Gestione IVA@109gData @<@125gPag. @#");
  set_header(3,sep);
  
  if (d._f0) // base anno in corso
  {
    set_header(2,"@40gCALCOLO ACCONTI IVA DICEMBRE %s "
               "(base anno in corso)", (const char*) _year);
    if (d._f1) // stampa base calcolo
    {
      set_header(4,"@58g------- Base di calcolo -------");
      set_header(5,"Ditta@7gDenominazione@62gDebito@78gCredito"
                 "@94gACCONTO calcolato@115gLiq. differita"); 
      set_header(6,sep);
      set_header(7,"");   
    }
    else 
    {
      set_header(4,"Ditta@7gDenominazione@60gACCONTO calcolato"
                 "@84gLiq. differita");
      set_header(5,sep);
      set_header(6,"");   
    }   
  }
  else
  {
    set_header(2,"@40gCALCOLO ACCONTI IVA DICEMBRE %s", (const char*) _year);
    set_header(5,sep);
    set_header(6,"");   
    if (d._f1)
      set_header(4,"Ditta@7gDenominazione@58gBase di calcolo"
                 "@86gACCONTO calcolato");
    else
      set_header(4,"Ditta@7gDenominazione@85gACCONTO calcolato");
  }
}


// ---------------------------------------------------------------------
// Tabulato deleghe
// --------------------------------------------------------------------- 

void TLiquidazione_app::set_deltab(_DescrItem& d, bool iscred)
{
  reset_header();
  int rw = 1;                                              
  static bool credpr;

  if (iscred)
  {
    // set header
    set_header(1,"ELENCO DITTE A CREDITO@30g%s %s@109gData @<@125gPag. @#",
               d._f0 == 13 ? "Annuale " : itom(d._f0), (const char*)_year);
    set_header(2,sep);
    set_header(3,"@40gF@60gImporto a");
    set_header(4,"Cod.@8gDenominazione@40gR@62gcredito");
    set_header(5,sep);
    set_header(6,"");
    
    // set rows
    for (int i = 0; i < d._arr.items(); i++)
    {            
      TToken_string& tt = (TToken_string&)(d._arr)[i];
      TString cod(tt.get(0));
      TParagraph_string rgs(tt.get(1), 30);
      TString diocantaro(rgs.get(0));
      TString frq(tt.get(2));
      real tp (tt.get(3));
      real in (tt.get(4));   
      tp -= in;
      tp = -tp;
      set_row(rw++, "%-5s@8g%-30s@40g%1s@54g%r", 
              (const char*)cod, (const char*)diocantaro, 
              (const char*)frq, &tp); 
      for (int i = 1; i < rgs.items(); i++)
        set_row(rw++, "@8g%-30s", (const char*)rgs.get(i));    
    }    
  }
  else 
  {
    // set header
    set_header(1,"ELENCO DITTE A DEBITO@30g%s %s@109gData @<@125gPag. @#",
               d._f0 == 13 ? "Annuale " : itom(d._f0), (const char*)_year);
    set_header(2,sep);
    set_header(3,"@40gF@60gImporto da@73gCodice@83gCod.");
    set_header(4,"Cod.@8gDenominazione@40gR Numero telefonico@63gversare Banca Dip.  Con.");
    set_header(5,sep);
    set_header(6,"");


    // set rows
    for (int i = 0; i < d._arr.items(); i++)
    {
      TToken_string& tt = (TToken_string&)(d._arr)[i];
      TString cod(tt.get(0));
      TParagraph_string rgs(tt.get(1), 30);
      TString diocantaro(rgs.get(0));
      TString frq(tt.get(2));
      real tp (tt.get(3));  
      real in (tt.get(4)); 
      TString abi(tt.get(5));  
      TString cab(tt.get(6));   
      TString con(tt.get(7));   
      TString tel(tt.get(8)); 
      if (!tel.blank()) 
        tel << '/';
      tel << tt.get(9); 
      TString desc(tt.get(10));
      
      //tp += in;  //comprendeva gia' gli interessi!      
      
      set_row(rw++, "%-5s@8g%-30s@40g%1s %s @55g%r %5s %5s %3s %-.45s", 
              (const char*)cod, (const char*)diocantaro, (const char*)frq, 
              (const char*)tel, &tp, (const char*)abi, 
              (const char*)cab, (const char*)con, (const char*)desc);
      
      for (int i = 1; i < rgs.items(); i++)
        set_row(rw++, "@8g%-30s", (const char*)rgs.get(i));    
    }  
  }
  set_auto_ff(TRUE);
}
