#include <applicat.h>
#include <automask.h>
#include <execp.h>
#include <filetext.h>
#include <progind.h>
#include <printer.h>
#include <sort.h>
#include <utility.h>

#include "co0.h"
#include "co0800a.h"
#include "colib.h"

#include "clifo.h"
#include "comuni.h"
#include "doc.h"
#include "rdoc.h"

#include "..\cg\cglib01.h"
#include "..\ve\velib.h"

// TAutomask

class TImportazioneConf_mask : public TAutomask
{
protected:
  bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
  TImportazioneConf_mask();
  virtual ~TImportazioneConf_mask() {};
};
  
TImportazioneConf_mask::TImportazioneConf_mask() :TAutomask("co0800a")
{
}  

bool TImportazioneConf_mask::on_field_event(TOperable_field& f, TField_event e, long jolly)
{ 
  switch (f.dlg())
  {                             
  case F_PERCORSO:
    if (e == fe_button)
    {
			FILE_SPEC fs;
			
			memset(&fs, 0, sizeof(FILE_SPEC));
			strcpy(fs.type, "");
			strcpy(fs.name, f.get());
			xvt_fsys_get_default_dir(&fs.dir);
			xvt_fsys_save_dir();
			if (xvt_dm_post_file_open(&fs, TR("Selezione file")) == FL_OK)
			{       
				TFilename n;
				xvt_fsys_convert_dir_to_str(&fs.dir, n.get_buffer(n.size()), n.size());
				n.add(fs.name);
				f.set(n);
			}
			xvt_fsys_restore_dir();
			f.set_focus();
    }
		else
	    if(e==fe_close)                //se e = alla pressione del bottone 'chiudi' (fe_close) controlla che il campo sia stato
			{                              //riempito correttamente nella maschera
				TFilename n=f.get();

				return n.exist();
			}     

    break;
  }  
  return TRUE;
}


// TSkeleton_application

class TImportazioneConf : public TSkeleton_application
{
  TRelation*      _rel;
  TCursor*        _cur;
  TProgind*       _prog;  

public:           
	virtual bool create();
  virtual bool destroy();
  virtual void main_loop();
  TImportazioneConf() {}
};

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

bool TImportazioneConf::create()
{
  open_files(LF_CLIFO, 0);
  return TSkeleton_application::create();
}

bool TImportazioneConf::destroy()
{
  return TApplication::destroy();
}

void TImportazioneConf::main_loop()
{  
	//TConfig configfile("co0800.ini");
  TImportazioneConf_mask mask;
	TFilename trecfile;

	TConfig confditta(CONFIG_DITTA, "co");
	const real ritqta = real(confditta.get("RitQta"));
	const real ritprezzo = real(confditta.get("RitPrezzo"));


  //mask.set(F_PERCORSO,	configfile.get("PERCORSO", "OPZIONI"));

  while (mask.run() == K_ENTER)
  {
		const TString4 codnum = mask.get(F_CODNUM);
		const TString4 codtipo = mask.get(F_TIPO);
		const long codmercato = mask.get_long(F_CODMERCATO);
		TDocumento_mask m(codtipo);
		TFilename nomefile = mask.get(F_PERCORSO);
		TString16 last_cf;
		TDate last_data;
		int fcf = -1, fdata = -1;
		TLocalisamfile clifo(LF_CLIFO);

	 	trecfile = "cotr"; trecfile << codmercato;
		if (!trecfile.custom_path())
			trecfile = "co0800.ini";

		TFile_text input_docs(nomefile, trecfile);     //crea un oggetto articoli di tipo TFile_text
		TRecord_text trec;                             //crea un record vuoto con nome trec 
		TTracciato_record& rec = *(input_docs.t_rec(""));
    const int nfields = rec.tracciati_campo().items();
		
    clifo.setkey(4);
		for (int f = 0; f < nfields; f++)
		{
			const TTracciato_campo& c = rec.get(f);
			const TString name = c.name();
			if (name == "CF")
				fcf = f;
			else
				if (name == DOC_DATADOC)
					fdata = f;
		}

		if (fcf < 0)
		{
			error_box("Manca il campo codice fiscale nel tracciato");
			return;
		}
		if (fdata < 0)
		{
			error_box("Manca il campo data documento nel tracciato");
			return; 
		}
		const long size = fsize(nomefile);
		input_docs.open();                                      //applico il metodo open che apre il file in lettura (contenuta in TFile_text)
		ifstream & rf = *input_docs.read_file();

		TProgind p(size, TR("Importazione conferimenti"), true, true);
		TDocumento * d = NULL;
 		for (int i = 0; input_docs.ok_r(); i++)             //ok_r � una funzione che indica la fine del file
		{ 
			if (!p.setstatus(rf.tellg()))
				break;
			if (input_docs.read(trec) == NOERR)
			{ 

				const TString16 cf = trec.get(fcf);
				const TDate datadoc(trec.get(fdata));

				if (d != NULL && d->rows() > 0)
				{
					m.doc() = *d;
					m.doc2mask();
					m.mask2doc();
					*d = m.doc();
					TSheet_field& sh = m.sheet();
					for (int i = 1; i <= m.doc().physical_rows(); i++)
					{
						TRiga_documento& r = (*d)[i];

						r.autosave(sh);
						r.put(RDOC_SCONTO, ritprezzo);	

						const TString & cod = r.get(RDOC_CODARTMAG);
				
						if (cod.full())
						{
							const TString & codiva = cache().get(LF_ANAMAG, cod, ANAMAG_CODIVA);
							if (codiva.full())
								r.put(RDOC_CODIVA, codiva);		
						}
					}
					update_spese_doc(codmercato, *d);
					d->stato(d->tipo().stato_finale_inserimento());
					d->write();
					delete d;
					d = NULL;
				}
				d = new TDocumento;
				d->zero();
				d->set_key(*d, 'D', datadoc.year(), codnum, 0L);
				clifo.put(CLI_TIPOCF, "F");
				clifo.put(CLI_COFI, cf);

				int err = clifo.read(_isequal);
				if (err != NOERR)
					error_box("Fornitore con codice fiscale %s assente errore : %d)", (const char *) cf, err);

				const long codcf = clifo.get_long(CLI_CODCF);
				d->put(DOC_TIPODOC, codtipo);
				d->put(DOC_TIPOCF, "F");
				d->put(DOC_CODCF, codcf);
				d->put(DOC_DATADOC, datadoc);
				d->put("MERCATO", codmercato);
				for (int f = 0; f < nfields; f++)
				{
					const TTracciato_campo& c = rec.get(f);
					const TString& name = c.name();

					if (name != "CF" && name != "DATADOC")
						if (name.full() && ((name.find("->") < 0) || (name.starts_with("33->"))))
							d->put(name, trec.get(f));
				}
				last_cf = cf;
				last_data = datadoc;

				TRiga_documento& row = d->new_row("CO");

				if (d->physical_rows() > 1)
					message_box("Attenzione il conferimento socio (cod.%ld) del %s ha piu' di una riga", codcf, datadoc.string());

				for (int f = 0; f < nfields; f++)
				{
					const TTracciato_campo& c = rec.get(f);
					TString name = c.name();
					TString val;

					if (name.starts_with("34->"))
					{
						name.ltrim(4);
						val = trec.get(f);
						if (row.type(name) == _realfld)
						{
							val.replace(',', '.');
							real v(val);
							row.put(name, v);
						}
						else
							row.put(name, val);
					}
				}
				TString80 codice = row.get(RDOC_CODART);
				TString80 key;  
				key.format("%06ld%s", codmercato, (const char*) codice);
				const TRectype& rec = cache().get("%COA", key);

				if (!rec.empty())
				{
					codice = rec.get("S1");
					row.put(RDOC_CODART, codice);			
				}
				real qta = row.get(RDOC_QTAGG1);
				if (ritqta > ZERO)
					qta -= qta*ritqta/CENTO;
				row.put(RDOC_QTA, qta);		
	
			}                                                       
		} 
		if (d != NULL && d->rows() > 0)
		{
			m.doc() = *d;
			m.doc2mask();
			m.mask2doc();
			*d = m.doc();
			TSheet_field& sh = m.sheet();
			for (int i = 1; i <= m.doc().physical_rows(); i++)
			{
				TRiga_documento& r = (*d)[i];

				r.autosave(sh);
				r.put(RDOC_SCONTO, ritprezzo);	
				const TString & cod = r.get(RDOC_CODARTMAG);
		
				if (cod.full())
				{
					const TString & codiva = cache().get(LF_ANAMAG, cod, ANAMAG_CODIVA);
					if (codiva.full())
						r.put(RDOC_CODIVA, codiva);		
				}
			}
			update_spese_doc(codmercato, *d);
			d->stato(d->tipo().stato_finale_inserimento());
			d->write();
		}
		input_docs.close();
  }   
}


int co0800(int argc, char* argv[])
{
  TImportazioneConf main_app;
  main_app.run(argc, argv, TR("Importazione conferimenti"));
  return TRUE;
}