#include <applicat.h>
#include <automask.h>
#include <execp.h>
#include <progind.h>
#include <tabutil.h>
#include "../ve/velib.h"

#include <clifo.h>
#include <doc.h>
#include <rdoc.h>

#include "ps0713lib.h"
#include "ps0713300a.h"

                                 ///////////////////////////////////
                                 ////    TIMPORTA_FATACQ_MSK    ////
                                 ///////////////////////////////////

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

public:
  TImporta_fatacq_msk();
};
  
TImporta_fatacq_msk::TImporta_fatacq_msk() :TAutomask ("ps0713300a")
{
}  

//ON_FIELD_EVENT: metodo che gestisce i comportamenti dei vari campi della maschera
//(per adesso segnaposto)
bool TImporta_fatacq_msk::on_field_event(TOperable_field& f, TField_event e, long jolly)
{
  return true;
}
                                 ///////////////////////////////////
                                 ////    TIMPORTA_FATACQ_APP    ////
                                 ///////////////////////////////////

//Classe TImporta_fatacq_app
class TImporta_fatacq_app : public TSkeleton_application
{
  TImporta_fatacq_msk*  _msk;

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

public:           
  virtual bool create();
  virtual bool destroy();
  virtual void main_loop();
	bool get_doc(const TFilename& file, const TMask & m);
	void add_spesa(TDocumento & doc, const TString & cod, const real & perc);
 
  TImporta_fatacq_app() {};
};

void TImporta_fatacq_app::add_spesa(TDocumento & doc, const TString & cod, const real & perc)
{
	if (cod.full() && perc != ZERO)
	{
		TSpesa_prest p(cod);
		TString tiporiga = p.get("S8").left(4);

		TRiga_documento & row = doc.new_row(tiporiga);

		row.put(RDOC_CODART, cod);
		row.put(RDOC_CHECKED, "X");
		row.put(RDOC_QTA, perc);
		const TString & ivacli = doc.clifor().vendite().get(CFV_ASSFIS);
		row.put(RDOC_CODIVA, ivacli.full() ? ivacli : p.cod_iva());
	}
}

bool TImporta_fatacq_app::get_doc(const TFilename& file, const TMask & m)
{
	const TDate datadoc(m.get_date(F_DATAREG));
	TDocumento doc('D', datadoc.year(), m.get(F_CODNUM), 0L);
  TVB_recset s(file, ',');

  TProgind pi(s.items(),"Importazione fatture in corso ...",true,true);

  doc.put(DOC_TIPODOC, m.get(F_TIPODOC));
  doc.put(DOC_TIPOCF, "F");
  doc.put(DOC_CODCF, m.get(F_CODCF));
  doc.put(DOC_DATADOC, datadoc);
	doc.cli2doc();

	int nriga  = 1;  
	TSpesa_prest p("GENPR", 'P');

	for (bool ok = s.move_first(); ok; ok = s.move_next())
  {
    if (!pi.addstatus(1)) 
      break;

		TString16 tmp = s.get(1).as_string();

		tmp.strip(".");
		tmp.replace(',', '.');

		real imp(tmp);  imp.round(doc.decimals());
		if (imp != ZERO)
		{
			TRiga_documento & row = doc.new_row("A6");

			row.put(RDOC_CODART, p.codice());
			row.put(RDOC_CHECKED, "X");
			
			row.put(RDOC_QTA, 1);
			row.put(RDOC_UMQTA, p.um());
			row.put(RDOC_PREZZO, imp);
			const TString & ivacli = doc.clifor().vendite().get(CFV_ASSFIS);
			row.put(RDOC_CODIVA, ivacli.full() ? ivacli : p.cod_iva());

			const TString16 codcom = s.get(0).as_string();
			TCommessa cms(codcom);
			TCommessa_string ankey = cms.cmsstr();    
			TString descr;

			descr << " Id. Lavoro " << codcom;
		
			row.put(RDOC_DESCR, descr);
			row.put(RDOC_CODCMS, codcom);
			row.put(RDOC_QTAGG1, ankey.gruppo());
			row.put(RDOC_QTAGG2, ankey.conto());
			row.put(RDOC_QTAGG3, ankey.sotco());
		}
	}
	TString16 codsp = m.get(F_CODSP1);
	real perc = m.get(F_PERCSP1);

	add_spesa(doc, codsp, perc);
	codsp = m.get(F_CODSP2);
	perc = m.get_real(F_PERCSP2);
	add_spesa(doc, codsp, perc);
	codsp = m.get(F_CODSP3);
	perc = m.get_real(F_PERCSP3);
	add_spesa(doc, codsp, perc);

  return doc.write() == NOERR;
}

const char* nomeini = "ps0713300fatt.ini";

bool TImporta_fatacq_app::create()
{
  xvt_fsys_remove_file(nomeini);

	_msk = new TImporta_fatacq_msk();
         
  return TSkeleton_application::create();
}

bool TImporta_fatacq_app::destroy()
{
	delete _msk;
  return TApplication::destroy();
}

void TImporta_fatacq_app::main_loop()
{
  if (_msk->run() == K_ENTER)
  {
		//genero il nome del file da caricare
		TFilename name = _msk->get(F_PATH);
		TFilename tmp = _msk->get(F_NAME);
		name.add(tmp.name());
		if (get_doc(name, *_msk))
			message_box(TR("Importazione fatture completata"));
  }   
}

TImporta_fatacq_app& app() { return (TImporta_fatacq_app&) main_app(); }


int ps0713300 (int argc, char* argv[])
{
  TImporta_fatacq_app main_app;
  main_app.run(argc, argv, TR("Importazione Fatture"));
  return true;
}