#include <applicat.h>
#include <automask.h>
#include <execp.h>
#include <progind.h>
#include <recset.h>
#include <relation.h>
#include <reprint.h>
#include <tabutil.h>

#include "../cg/cg2103.h"
#include "../gv/gvlib.h"
#include "velib.h"
#include "velib07.h"

#include <nditte.h>

#include "ve8.h"
#include "ve8100a.h"

////////////////////////////////////////////////////////
//	MASCHERA
////////////////////////////////////////////////////////
class TListaRitFisc_mask : public TAutomask
{
protected:
  bool on_field_event(TOperable_field& o, TField_event e, long jolly);

public:
  TListaRitFisc_mask();
  virtual ~TListaRitFisc_mask() {}
};

bool TListaRitFisc_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{ 
  bool ok = true;
	/*
  switch (o.dlg())
  {
	case :
    if (e == fe_init || e == fe_modify)
    {
    }
    break;
  default: break;
  }
	*/
  return ok;
}

TListaRitFisc_mask::TListaRitFisc_mask():TAutomask("ve8100")
{
}

////////////////////////////////////////////////////////
//	APPLICAZIONE
////////////////////////////////////////////////////////
class TListaRitFisc : public TSkeleton_application
{
protected:
  virtual void main_loop();
public:
	bool crea_righe(const TListaRitFisc_mask& m) const;
};


bool TListaRitFisc::crea_righe(const TListaRitFisc_mask& m) const
{
  // cerca abi e cab della ditta
  const TString& abi = m.get(F_CODABI);
  const TString& cab = m.get(F_CODCAB);
	const TDate datascad = m.get(F_DATASCAD);

	int err=NOERR;
	TLocalisamfile righe(LF_RIGHEF24);
	TDocument_recordset rdoc("USE RDOC\nSELECT (TIPORIGA=='04')&&(110@->S10!='')&&(33.NDOC>=#DANUM)&&(33.NDOC<=#ANUM)\nJOIN SPP ALIAS 110 INTO CODTAB=CODART\nJOIN DOC INTO PROVV=PROVV ANNO=ANNO CODNUM=CODNUM NDOC=NDOC\nFROM CODNUM=#NUM\nTO CODNUM=#NUM");
	TVariant var;
	var = m.get(F_NUMINI);
	rdoc.set_var("#DANUM", var);
	var = m.get(F_NUMFIN);
	rdoc.set_var("#ANUM", var);
	var = m.get(F_CODNUM);
	rdoc.set_var("#NUM", var);
	// calcolo importo e chiedo conferma all'operatore
	const TRecordset& curr = rdoc;
	real totale = ZERO;
	for (bool ok = rdoc.move_first(); ok; ok = rdoc.move_next())
		totale += curr.get("RDOC.RITENUTA").as_real();
	err = NOERR;
	if (yesno_box("Verranno generate %d righe per un importo di %s euro. Si desidera creare le righe?", rdoc.items(), totale.string()))
	{
		long cont = get_next_progr_f24();
		long numf24 = get_next_f24();
		// trucco per poter usare la get (nei TDocument_recordset la get ha 2 par. ed e' protected!)
		for (bool ok1 = rdoc.move_first(); ok1; ok1 = rdoc.move_next())
		{
			righe.zero();
			righe.put("PROGR", cont++);
			righe.put("F24", numf24++);	
			righe.put("TRIBUTO", curr.get("SPP.S10").as_string());
			righe.put("TIPOINTEST", 'C');
			righe.put("INTEST", curr.get("DOC.CODCF").as_int());
			righe.put("DESCR", "Riga generata");
			righe.put("IMPORTODEB", curr.get("RDOC.RITENUTA").as_real());
			righe.put("ABI", abi);
			righe.put("CAB", cab);
			righe.put("DATASCAD", datascad);
			err = righe.write();
		}	
	}
	return (err==NOERR);
}

void TListaRitFisc::main_loop()
{
	TListaRitFisc_mask m;
  // cerca abi e cab della ditta
  const TString& abi = prefix().firm().get(NDT_ABIBAN);
  const TString& cab = prefix().firm().get(NDT_CABBAN);
	m.set(F_CODABI, abi);
	m.set(F_CODCAB, cab);
	KEY key = K_ENTER;
  while (key != K_QUIT)
  {
    key = m.run();
		switch (key)
		{
			case K_SAVE:
				crea_righe(m);
			break;
			case K_QUIT:
			break;
			case K_ENTER:
			{
				//report e book dei report
				TDocument_report rep;
				rep.load("ve8100a");
				TRecordset * r = rep.recordset();
				if (r != NULL)
				{
					TVariant var;
					var = m.get(F_NUMINI);
					r->set_var("#DANUM", var);
					var = m.get(F_NUMFIN);
					r->set_var("#ANUM", var);
					var = m.get(F_CODNUM);
					r->set_var("#NUM", var);
				}
				TReport_book book;
				book.add(rep);
				book.print_or_preview();	//stampa il book dei report
			}
		}
	}
}


int ve8100(int argc, char* argv[])
{
  TListaRitFisc a;
  a.run(argc, argv, TR("Lista ritenute per F24"));
  return 0;
}