#include <mask.h>
#include <applicat.h>
#include <form.h>
#include <printer.h>
#include <progind.h>

#include "provv.h"
#include "pr1300a.h"


class TStampa_schedeprovv : public TSkeleton_application
{

  TMask * _m;
  void riporta_pagamenti(TCursor &cur);

protected:
  virtual bool create(); 
  virtual bool destroy(); 
  virtual void main_loop();
};

bool TStampa_schedeprovv::create()
{
  _m= new TMask ("pr1300a");
  return TSkeleton_application::create();
}

bool TStampa_schedeprovv::destroy()
{
  delete _m;
  return TSkeleton_application::destroy();
}

void TStampa_schedeprovv::riporta_pagamenti(TCursor &cur)
{
  if (cur.items()==0) return;
  const TRelation * r=cur.relation();
  TProgind barra(cur.items(),"Registro le provvigioni pagate");
  for (int c=0; c<cur.items(); c++)
  {
    cur=c;
    barra.setstatus(c);
    // stampa definitiva: riporta le provvigioni maturate sulle provv. pagate
    real val;
    val=r->lfile().get_real(PROV_PROVVMAT);
    if (!val.is_zero() && 
      !r->lfile().get_bool(PROV_SALDATA)) // this should never happen!
    {
      r->lfile().reread(_lock);
      val+=r->lfile().get_real(PROV_PROVVPAG);
      r->lfile().put(PROV_PROVVPAG,val);
      r->lfile().put(PROV_PROVVMAT,0);
      if (val>=r->lfile().get_real(PROV_IMPPROVV))
        r->lfile().put(PROV_SALDATA,"X");
      r->lfile().rewrite();
    }
  }
}

void TStampa_schedeprovv::main_loop()
{
  TForm frm("pr1300a");

  const int hh = 7;
  const int fh = 1;
  const int fl = printer().formlen();
    
  int rows[4];         // Righe orizzontali
  rows[0] = hh-3;
  rows[1] = hh;
  rows[2] = fl-1;
  rows[3] = 0;
  frm.genera_intestazioni(odd_page, hh-2);
  frm.genera_fincatura(odd_page, hh-3, fl-1, rows);
  

  while (_m->run()!=K_QUIT)
  {
  
    // filtro e regione
     if (_m->get(F_FILTRO).not_empty())
     {
       TString filter(PROV_SALDATA);
       if (_m->get(F_FILTRO)[0]=='P')
         filter << "==\"X\"" ;
       else
         filter << "!=\"X\"" ;
       frm.cursor()->setfilter(filter);
     } else
       frm.cursor()->setfilter("");

    TRectype start(LF_PROVV),end(LF_PROVV);
    if (_m->get(F_DAAGE).not_empty())
      start.put(PROV_CODAGE,_m->get(F_DAAGE));
    if (_m->get(F_AAGE).not_empty())
      end.put(PROV_CODAGE,_m->get(F_AAGE));
    frm.cursor()->setregion(start,end);
    // abilita le sezioni dei totali
    frm.find_field('B',odd_page,"CLIENTI").show(!_m->get_bool(F_RAGGCLI));
    frm.find_field('B',odd_page,"HCLIENTI").show(!_m->get_bool(F_RAGGDOC));
    frm.find_field('B',odd_page,"DOCUMENTI").show(!_m->get_bool(F_RAGGDOC));
    frm.find_field('B',odd_page,"HDOCUMENTI").show(!_m->get_bool(F_RAGGRATE));
    frm.find_field('B',odd_page,"RATEDOC").show(!_m->get_bool(F_RAGGRATE));
    frm.print();
    if (_m->get(F_DEFINITIVA)[0]=='D')
    {
      riporta_pagamenti(*frm.cursor());
    }
  }
}

int pr1300(int argc, char** argv)
{
  TStampa_schedeprovv a;
  a.run(argc,argv,"Stampa schede di provvigione");
  return 0;
}