#include <config.h>
#include <currency.h>
#include <execp.h>
#include <mask.h>
#include <printapp.h>
#include <progind.h>
#include <utility.h>

#include "../cg/cgsaldac.h"
#include "../cg/cglib02.h"
#include "pd1890.h"
#include "pd1890100.h"    

#include <clifo.h> 
#include <nditte.h>
#include <pconti.h>

class TPartite2Euroasis : public TSkeleton_application
{ 
  TMask* _msk;
                                            
protected:
  virtual bool create();
  virtual bool destroy();  
  virtual void main_loop();
  int calcola_esposto(const TRiga_scadenze& scad, const TDate& dataanalisi, const TDate& dataesposto, 
  										TDate& datascad, TImporto& esposto) const;

public:
  TMask& mask() { return *_msk; }
  TPartite2Euroasis() {};
  virtual ~TPartite2Euroasis() {}
};

bool TPartite2Euroasis::create()
{      
	open_files(LF_SCADENZE, LF_PARTITE, LF_CLIFO, 0);
	_msk = new TMask("pd1890100a");
  return TSkeleton_application::create();
}

bool TPartite2Euroasis::destroy()
{ 
  delete _msk;
  return TSkeleton_application::destroy();
}

int TPartite2Euroasis::calcola_esposto(const TRiga_scadenze& scad, const TDate& dataanalisi, const TDate& dataesposto, 
																			TDate& datascad, TImporto& esposto) const
{     
	const bool rischio = dataanalisi != dataesposto;
	int tipo = scad.get_int(SCAD_TIPOPAG);
	datascad = scad.get_date(SCAD_DATASCAD);
	for (int i=scad.last(); i>0; i= scad.pred(i))
	{
		const TRiga_partite& pag = scad.partita().riga(i);
		const int tp = pag.get_int(PART_TIPOPAG);
		if (tp >= 2 && tp <= 7)
		{
			tipo = tp;
			const TDate datapag = pag.get_date(PART_DATAPAG);
			bool is_esposto = FALSE;
      if (rischio && datapag > dataesposto && datapag <= dataanalisi)
        is_esposto = TRUE; 
      else
        if (datapag > dataanalisi)
          is_esposto = TRUE;
			if (is_esposto)
			{        
				const char sez = pag.sezione();
        const TImporto imp(sez, scad.row(i).get_real(PAGSCA_IMPORTO));
        esposto+=imp;
			}
			if (datapag > datascad)
				datascad = datapag;
		}
	}
	return tipo;
}                                                     

void TPartite2Euroasis::main_loop()
{                  
	TRelation rel(LF_SCADENZE);
	rel.add(LF_PARTITE,"TIPOC==TIPOC|GRUPPO==GRUPPO|CONTO==CONTO|SOTTOCONTO==SOTTOCONTO|ANNO=ANNO|NUMPART==NUMPART",1,0);
	rel.add(LF_PAGSCA, "TIPOC==TIPOC|GRUPPO==GRUPPO|CONTO==CONTO|SOTTOCONTO==SOTTOCONTO|ANNO==ANNO|NUMPART==NUMPART|NRIGA==NRIGA|NRATA==NRATA");
	TCursor cur(&rel, "29->TIPOC == \"C\"", 2);  // verificare la chiave 
  TMask& m = mask();
	TConfig config("pd1890100.ini");
	TString80 exe = config.get("EXE");
	m.set(F_PATH, config.get("PATH"));
  while (m.run() != K_QUIT)
  {
    const TString& path = m.get(F_PATH);
    config.set("PATH", path);
	  TFilename scadname = path;
	  scadname.ext("dbf");
  	TFilename scadtrr = "pd1890.trr"; 
  	scadtrr.custom_path();
	  TExternisamfile filescad(scadname, scadtrr);
		filescad.zap();
    const TDate oggi(TODAY);
    TString16 ora;
	  time_t tempo; 
  	time(&tempo);
  	const struct tm* d = localtime(&tempo);
  	ora.format("%02d:%02d:%02d", d->tm_hour, d->tm_min, d->tm_sec);
    const TDate dataanalisi = m.get_date(F_DATA);
    const int giorni = m.get_int(F_GIORNI);      
    const TDate dataesposto = dataanalisi - (long) giorni;
	  TRectype& recscad = cur.curr();
	  const TRectype& recpartita = cur.curr(LF_PARTITE);
	  const long items = cur.items();
	  TProgind p(items, "Elaborazione scadenze in corso ...", TRUE, TRUE, 10);
	  p.setstatus(1);
	  int err = NOERR;
	  
		for (cur=0; cur.pos()<items && !p.iscancelled() && err==NOERR; ++(cur))    
		{
			p.addstatus(1);        
			const int nriga = recscad.get_int(SCAD_NRIGA);
			const int nrata = recscad.get_int(SCAD_NRATA);
			
			const long codcli = recscad.get_long(SCAD_SOTTOCONTO);
			if (codcli == 11062)
			{
				int i = 0;
				i++;
			}	
						
			TPartita partita(recpartita);
			const TRiga_scadenze& scad = partita.rata(nriga, nrata);
			const TRiga_partite& rigapartite = scad.riga();
      TDate datascad = scad.get(SCAD_DATASCAD);
      TImporto esposto;
      const int tipop = calcola_esposto(scad, dataanalisi, dataesposto, datascad, esposto);
    	if (!scad.chiusa() || !esposto.is_zero())
			{
				TImporto importo = scad.residuo(FALSE);
				importo.normalize('D');                                                
				filescad.zero();
				filescad.put("DATAGEN", oggi); 
				filescad.put("ORAGEN", ora); 
				filescad.put("GIORNI", giorni); 
				filescad.put("DATA", dataanalisi);
				filescad.put("CLIENTE", recscad.get(SCAD_SOTTOCONTO));
				TString16 tipodoc = "  ";
				if (rigapartite.is_fattura())
					tipodoc = "FV";
				else if	(rigapartite.is_nota_credito())
					tipodoc = "NC";
				filescad.put("TIPODOC", tipodoc);
				filescad.put("NUMDOC", recpartita.get(PART_NUMDOC));
				TString16 strpartita = recpartita.get(PART_ANNO);
				strpartita << "/";
				strpartita << recpartita.get(PART_NUMPART);
				filescad.put("PARTITA", strpartita);
				if (tipop >= 2 && tipop <= 7)
					filescad.put("TIPOPAG", "RB");
				else
					filescad.put("TIPOPAG", "RD");					
				filescad.put("DATASCAD", datascad);
				filescad.put("IMPORTO", importo.valore());
				filescad.put("ESPOSTO", esposto.valore());
				err = filescad.write();	
			}	
		}	  
		
		if (err == NOERR)
		{
			if (exe.not_empty())
			{
				TExternal_app oasis(exe);
				if (oasis.can_run())
					oasis.run();
			}	
		}
		else
			error_box("Errore %d in scrittura file dbf. Elaborazione non terminata.", err);	
  }
}                
int pd1890100(int argc, char** argv)
{
  TPartite2Euroasis app;
  app.run(argc, argv, "Esportazione scadenzario");    
  return 0;
}