#include <applicat.h>
#include <automask.h>
#include <progind.h>
#include <recarray.h>
#include <relation.h>
#include <textset.h>

#include <mov.h>
#include <rmoviva.h>

#include "ps0713.h"
#include "ps0713100a.h"

///////////////////////////////////////////////////////////
// TEsporta_ps0713 maschera
///////////////////////////////////////////////////////////

class TEsporta_ps0713_mask : public TAutomask
{

public:
  virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
  TEsporta_ps0713_mask();
	~TEsporta_ps0713_mask();
};

bool TEsporta_ps0713_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
	switch (o.dlg())
	{
		//giochetto per avere la lista dei files validi nella directory di trasferimento!
		case F_ADATA:
			if (e == fe_modify || e == fe_close)
			{
				TDate adata = o.get();
				TString str_adata;
				str_adata << adata.date2ansi() << ".txt";
				set(F_NAME, str_adata);
			}
			break;
		default:
			break;
	}
  return true;
}

TEsporta_ps0713_mask::TEsporta_ps0713_mask() : TAutomask("ps0713100a") 
{
	//carica i parametri del file di configurazione
	TConfig configfile("ps0713conf.ini", "MAIN");
  for (int i = 0; i < fields() ; i++)
	{
		TMask_field& f = fld(i);
		const TFieldref* fr = f.field();
		if (fr != NULL)
			f.set(configfile.get(fr->name()));
	}
}

TEsporta_ps0713_mask::~TEsporta_ps0713_mask()
{
	//carica i parametri del file di configurazione
	TConfig configfile("ps0713conf.ini", "MAIN");
  for (int i = 0; i < fields() ; i++)
	{
		TMask_field& f = fld(i);
		const TFieldref* fr = f.field();
		if (fr != NULL)
			configfile.set(fr->name(), f.get());
	}
}

/////////////////////////////////////////////////////////////
//	TEsporta_ps0713 recordset (righe movimenti iva)
/////////////////////////////////////////////////////////////

class TEsporta_ps0713_recordset : public TCSV_recordset
{
public:
	TEsporta_ps0713_recordset();
};


TEsporta_ps0713_recordset::TEsporta_ps0713_recordset() 
: TCSV_recordset("CSV(\"\t\")")
{
}


///////////////////////////////////////////////////////////
// TEsporta_ps0713 applicazione
///////////////////////////////////////////////////////////

class TEsporta_ps0713_app : public TSkeleton_application
{

protected:
	virtual bool check_autorization() const {return false;}
  virtual const char * extra_modules() const {return "cg";}
	virtual void main_loop();

public:
	void esporta_righe_iva(const TMask& msk) const;
	void set_inviva(TISAM_recordset& rmoviva) const;
  
};

void TEsporta_ps0713_app::set_inviva(TISAM_recordset& rmoviva) const
{
	long last_numreg = 0L;
	const long items = rmoviva.items();
	TProgind pi(items, TR("Impostazione flag Inviata parte IVA..."), true, true);
	TLocalisamfile mov(LF_MOV);
	for (bool ok = rmoviva.move_first(); ok; ok = rmoviva.move_next())
	{
    if (!pi.addstatus(1))
      break;
		const long curr_numreg = rmoviva.get(RMI_NUMREG).as_int();
		if (curr_numreg != last_numreg)
		{
			mov.put(MOV_NUMREG, curr_numreg);
			int err = mov.read();
			if (err == NOERR)
			{
				mov.put(MOV_INVIVA, 'X');
				err = mov.rewrite();
			}
			if (err != NOERR)
			{
				TString cazzone;
				cazzone << TR("Impossibile aggiornare il movimento ");
				cazzone << curr_numreg;
				error_box(cazzone);
				break;
			}
			last_numreg = curr_numreg;
		}
	}
}

void TEsporta_ps0713_app::esporta_righe_iva(const TMask& m) const
{
	TFilename path = m.get(F_PATH);
	path.add(m.get(F_NAME));
	if (path.exist())
		if (!yesno_box(TR("ATTENZIONE! File gia' presente! Se si procede sara' azzerato il file esistente!\nContinuare?")))
			return;

  // query su righe iva joinati ai mov
	TString query;
  query << "USE RMOVIVA ";
	query << "SELECT ((NUM(ANSI(23.DATAREG))>=NUM(ANSI(#DADATA)))&&(NUM(ANSI(23.DATAREG))<=NUM(ANSI(#ADATA))))&&(23.INVIVA!=\"X\")\n";
	query << "JOIN MOV INTO NUMREG==NUMREG\n";
	query << "JOIN %IVA ALIAS 101 INTO CODTAB==CODIVA";
	
	TISAM_recordset rmoviva(query);
	const TDate& adata = m.get_date(F_ADATA);
	TDate dadata = adata;
	dadata.addyear(-1);
	rmoviva.set_var("#DADATA", dadata);
	rmoviva.set_var("#ADATA", adata);

	TEsporta_ps0713_recordset csv;

	const long items = rmoviva.items();
	TProgind pi(items, TR("Estrazione dati..."), true, true);
	TString ws;
	for (bool ok = rmoviva.move_first(); ok; ok = rmoviva.move_next())
	{
    if (!pi.addstatus(1))
      break;

		//creazione di un nuovo record da esportare
		csv.new_rec("");
		//..e successivo riempimento
		csv.set(0, rmoviva.get(RMI_CODCMS));
		csv.set(1, rmoviva.get(RMI_IMPONIBILE));
		csv.set(2, rmoviva.get("101@.R0"));
		csv.set(3, rmoviva.get(RMI_IMPOSTA));
		csv.set(4, rmoviva.get(RMI_GRUPPO));
		csv.set(5, rmoviva.get(RMI_CONTO));
		csv.set(6, rmoviva.get(RMI_SOTTOCONTO));

	}	//for(move_first()..
 	
	csv.save_as(path, fmt_text);

#ifdef DBG
	xvt_sys_goto_url(path, "open");
#endif

	TString msg;
	msg << TR("Si conferma l'esportazione definitiva dei movimenti IVA fino al ");
	msg << m.get(F_ADATA);
	if (yesno_box(msg))
		set_inviva(rmoviva);	//mette il flag di "INVIVA" alla testata movimento
}

void TEsporta_ps0713_app::main_loop()
{
  TEsporta_ps0713_mask m;
  while (m.run() == K_ENTER)
		esporta_righe_iva(m);
}

int ps0713100(int argc, char* argv[])
{
  TEsporta_ps0713_app app;
  app.run(argc, argv, TR("Trasferimento dati IVA"));
  return 0;
}