// cg4306: liquidazione IVA
// funzionalita' accessorie (calcolo acconto, estrazione deleghe)

#include <defmask.h>
#include <progind.h>
#include <sheet.h>

#include "cg4300.h"
#include "cg4300b.h"
#include "cg4300c.h"

// -------------------------------------------------- estrazione deleghe
bool TLiquidazione_app::set_deleghe()
{
  TMask m("cg4300b.msk");
  int k = 0;
  long l, j;
  _calcall = FALSE;

  for (;;)
  {
    if (k == K_ESC || k == K_ENTER)
      break;

    k = m.run();

    //                  _isprint  = m.get_bool(CHK_CGB_PRINT);
    //                  _isbase   = m.get_bool(CHK_CGB_BASE);
    //                  _basecalc = (tbc)m.get_long(RDB_CGB_BASE);

    switch (k)
    {
    case DLG_SELECT:
      _selected.reset();
      _ditte->destroy();

      // build sheet
      for (l = 0l, _nditte->first(); !_nditte->eof(); l++, _nditte->next())
      {
        TString cod  = _nditte_r->get("CODDITTA");
        TString vers = _freqviva;

        TToken_string d(" ");
        
        // add record 
        d.add(cod);
        d.add(_nditte_r->get("RAGSOC"));
        d.add(vers);
        
        _ditte->add(d);
        if (_selected[l]) _ditte->check(l);
      }
      
      // scegli ditte
      _ditte->run();

      for (j = 0l; j < _ditte->items(); j++)
        if (_ditte->checked(j)) _selected.set(j);

      break;
    case BUT_CGB_ALL:
      _calcall = TRUE;
      k = K_ENTER;
      break;
    }
  }

  if (k == K_ENTER)
  {
    _year     = m.get(FLD_CGB_YEAR);
    _month    = atoi(m.get(FLD_CGB_MONTH));
  }

  return k == K_ENTER;
}

bool TLiquidazione_app::extract_deleghe()
{               
  char buf[256];

  long firm = TApplication::get_firm();
  _prind = new TProgind(_n_ditte,
                        "         Estrazione deleghe        "
                        "\n         Preparazione archivi      ",
                        TRUE,TRUE,40);

  long l;
  for (l = 0l, _nditte->first(); !_nditte->eof(); l++, _nditte->next())
  {
    if (_prind->iscancelled())
      break;

    if (!(_calcall || _selected[l])) continue;

    TApplication::set_firm(_nditte->curr().get_long("CODDITTA"));
    sprintf (buf,"Estrazione deleghe (%d):\nditta %s",
             _month,
             (const char*)_nditte_r->get("RAGSOC"));
    _prind->set_text(buf);
    if (is_month_ok(_month))
    {
      _isbenzinaro = _nditte->curr(LF_ATTIV).get_bool("ART74/4");
      _freqviva    = look_lia() ? _lia->get("S7") : _nditte->curr().get("FREQVIVA");
      bool   mens  = _freqviva == "M";
      _isannual    = (_month == 12 && !mens && !_isbenzinaro) ||
        (_month == 13 && (mens || _isbenzinaro));
      _isriepilogo = _month == 13;

      extract_delega(_month);
    }
    _prind->addstatus(1);
  }

  TApplication::set_firm(firm);
  delete _prind;

  return TRUE;
}

bool TLiquidazione_app::extract_delega(int month)
{
  if (_isriepilogo && !_isannual) 
    return FALSE;
  if (look_lim(month))
  {
    real topay = _lim->get_real("R0");
    if (topay.sign() <= 0) return TRUE;
    if (_isannual)
    {
      if (look_del(12,7))
      {
        topay -= _del->get_real("R0");
      }
    }
    else 
    {
      // importo rettifiche solo se non e' annuale
      topay += _lim->get_real("R5");
    }
    
    if (topay.sign() > 0)
    {
      look_del(month, _isannual ? 2 : 1, TRUE);
      _del->put("R0",topay);
      _del->rewrite();
    }
  }
  return TRUE;
}

// -------------------------------------------- calcolo acconto dicembre
bool TLiquidazione_app::set_acconto()
{
  TMask m("cg4300c.msk");
  m.set(CHK_CGC_PRINT,"X");

  int k = 0;
  _calcall = FALSE;
  _selected.reset();
  long j;

  for (;;)
  {
    if (k == K_ESC || k == K_ENTER)
      break;
    k = m.run();
    
    _year     = m.get(FLD_CGC_YEAR);
    _isprint  = m.get_bool(CHK_CGC_PRINT);
    _isbase   = m.get_bool(CHK_CGC_BASE);
    _basecalc = (tbc)m.get_long(RDB_CGC_BASE);
    
    switch (k)
    {
    case DLG_SELECT:
      _selected.reset();
      _ditte->destroy();

      // build sheet
      long l;
      for (l = 0l, _nditte->first(); !_nditte->eof(); l++, _nditte->next())
      {
        TString cod  = _nditte_r->get("CODDITTA");
        TString vers = _freqviva;
        
        TToken_string d(" ");
        
        // add record 
        d.add(cod);
        d.add(_nditte_r->get("RAGSOC"));
        d.add(vers);
        
        _ditte->add(d);
        if (_selected[l]) _ditte->check(l);
      }
      
      // scegli ditte
      _ditte->run();

      for (j = 0l; j < _ditte->items(); j++)
        if (_ditte->checked(j)) _selected.set(j);

      break;
    case BUT_CGC_ALL:
      _calcall = TRUE;
      k = K_ENTER;
      break;
    }
  }
  return k == K_ENTER;
}


bool TLiquidazione_app::recalc_acconti()
{                 
  char buf[256];

  long l; bool onemade = FALSE;
  
  long firm = TApplication::get_firm();
  _prind = new TProgind(_n_ditte,
                        "              Calcolo acconto         "
                        "\n         Preparazione archivi      ",
                        TRUE,TRUE,40);

  for (l = 0l, _nditte->first(); !_nditte->eof(); l++, _nditte->next()) 
  {
    if (_prind->iscancelled()) 
      break;
    if (_calcall || _selected[l])
    {
      if (onemade == FALSE && _isprint)
      {
        _DescrItem* d = new _DescrItem(ACCHEAD);
        d->_f0 = _basecalc == incorso;
        d->_f1 = _isbase;
        _descr_arr.add(d);
      }
      
      TApplication::set_firm(_nditte->curr().get_long("CODDITTA"));     
      sprintf (buf,"Calcolo acconto:\nditta %s",
               (const char*)_nditte_r->get("RAGSOC"));
      _prind->set_text(buf);
      recalc_acconto();
      onemade = TRUE;
    }
    _prind->addstatus(1);
  }
  
  TApplication::set_firm(firm);
  delete _prind;
  return TRUE;
}

bool TLiquidazione_app::recalc_acconto()
{
  real basecalcolo, acconto;
  bool isdifferita = FALSE;
  bool error = FALSE;
  
  // this is absolutely fundamental

  if (_basecalc == incorso)
  {
    // that's pazzesc but it turns out there's no better way
    _comp_acconto = TRUE;
    // force recalc of current month
    _recalc       = one;
    update_firm(12);
    
    // TBI calcola l'acconto!!!
    if (look_lim(12))
    {
      basecalcolo = _lim->get_real("R0");
      if (basecalcolo.sign() > 0)
        acconto = basecalcolo * ACCONTO_DICEMBRE;
    }
    else
    {
      acconto = real(-1);
    }
    // riaggiustati le palle
    _comp_acconto = FALSE;
    update_firm(12);
  }
else if (_basecalc == precedente)
{
  int yr = atoi(_year) - 1;
  _lim->zero();
  *_lim_anno = yr;
  *_lim_mese = 12;
  if (_lim->read() == NOERR)
  {
    basecalcolo = _lim->get_real("R0");
    if (basecalcolo.sign() > 0)
      acconto = basecalcolo * ACCONTO_DICEMBRE;
  }
  else error = TRUE;    
}

// sbatti l'acconto in LIA
if (look_lia())
{
  _lia->put("R4",acconto);
  isdifferita = _lia->get_bool("B1");
  _lia->rewrite();
}

if (acconto.sign() > 0)
{
  // crea o aggiorna delega
  look_del(12,7,TRUE);
  _del->put("R0", acconto);
  _del->rewrite();
}

// per questa volta lasciamo perdere la describe_acconto
if (_isprint)
{
  _DescrItem* d = new _DescrItem(ACCONTO);
  d->_r0 = basecalcolo;
  d->_r1 = acconto;
  d->_f0 = _basecalc == incorso;
  d->_f1 = _isbase;
  d->_f2 = error;
  d->_f3 = isdifferita;
  d->_s0 = _nditte->curr().get("CODDITTA");
  d->_s1 = _nditte->curr().get("RAGSOC");
  _descr_arr.add(d);
}  
return TRUE;
}

