#include "../lv/lvlib.h"
#include "pl0002lib.h"
#include "pl0002100a.h"

#include <applicat.h>
#include <automask.h>
#include <defmask.h>
#include <progind.h>
#include <reprint.h>
#include <reputils.h>
#include <tabmod.h>
#include <tabutil.h>

#include <clifo.h>
#include <..\lv\lvcondv.h>
#include <..\lv\lvrcondv.h>
#include <..\mg\clifogiac.h>
#include <..\ve\condv.h>
#include <..\ve\rcondv.h>

const char* const APPNAME = TR("Conversione anagrafiche"); 

///////////////////////////////////////////////////////////
// Trasferimenti veri e propri
///////////////////////////////////////////////////////////

class TLif_clifo_co_clifor : public TLif_transfer
{
public:
  virtual bool trasferisci();
};

class TLif_clifo_ca_anagrafiche : public TLif_transfer
{
public:
  virtual bool trasferisci();
};

class TLif_clifo_ca_sedi : public TLif_transfer
{
protected:
  TISAM_recordset clifo(const char* ragsoc, const int key = 1) const;
  const long cerca_codf(const char* ragsoc) const;
public:
  virtual bool trasferisci();
};

class TLif_contratti : public TLif_transfer
{
public:
  virtual bool trasferisci();
};

class TLif_articoli : public TLif_transfer
{
public:
  virtual bool trasferisci();
};

class TLif_listini : public TLif_transfer
{
public:
  virtual bool trasferisci();
};

///////////////////////////////////////////////////////////
// TLif_clienti
///////////////////////////////////////////////////////////

// trasferisce la prima parte dei clienti
bool TLif_clifo_co_clifor::trasferisci()
{
  TString query = 
    "SELECT * "
		"FROM dbo.CO_CLIFOR";

  TRecordset& recset = create_recordset(query);
  TConfig& ini = config();
	
  TString_array lista_campi;
	ini.list_variables(lista_campi, true, "CO_CLIFOR", true);
  
  TSystemisamfile clienti(LF_CLIFO);
  clienti.open(_lock);
  TRectype& rec = clienti.curr();

  TSystemisamfile cfven(LF_CFVEN);
  cfven.open(_lock);
  TRectype& cfv_rec = cfven.curr();

  TLif_iterator hi(this);
  while (++hi)
  {
    const char     tipocf  = get_str("ind_clifor")[0];
    const long     codcf   = get_long("cod_clifor");
    const TString4 condpag = get_str("cod_pag");
    const real     fido    = get_real("val_fido");
    const char     sospeso = get_str("ind_bloccato")[0];

    TString16 codabi = get_str("cod_banca1");   codabi.lpad(5,'0');
    TString16 codcab = get_str("cod_agenzia1"); codcab.lpad(5,'0');
    TString80 iban   = get_str("sig_iban1");    iban << get_str("sig_bban1");

    const TString4 codspmezzo = get_str("cod_mezzo_trasp");
    const TString4 percprovv  = get_str("cod_catprovvi");
    const TString8 codag      = get_str("cod_agente");
    const bool     addbolli   = get_str("flg_addebito_bollo")[0] == '0' ? false : true;
    const long     percspinc  = get_str("flg_addebito_spese")[0] == '0' ? 0L : 100;
    const TString4 codporto   = get_str("cod_porto");

    TString8 codcli;
    codcli.format("%04d", codcf); codcli << "00";
    
    rec.zero();
    rec.put(CLI_TIPOCF,  tipocf);
    rec.put(CLI_CODCF,   codcli);
    rec.put(CLI_CODPAG,  condpag);
    rec.put(CLI_FIDO,    fido);
    rec.put(CLI_SOSPESO, sospeso == '0' ? false : true);
    rec.put(CLI_CODABI,  codabi);
    rec.put(CLI_CODCAB,  codcab);
    rec.put(CLI_IBAN,    iban);

    cfv_rec.zero();
    cfv_rec.put(CFV_TIPOCF,     tipocf);
    cfv_rec.put(CFV_CODCF,      codcli);
    cfv_rec.put(CFV_CODSPMEZZO, codspmezzo);
    cfv_rec.put(CFV_PERCPROVV,  percprovv);
    cfv_rec.put(CFV_CODAG,      codag);
    cfv_rec.put(CFV_ADDBOLLI,   addbolli);
    cfv_rec.put(CFV_PERCSPINC,  percspinc);
    cfv_rec.put(CFV_CODPORTO,   codporto);

    aggiorna_record(rec, lista_campi);
    if (test_write(clienti))
    {
			TString msg;
  		msg << TR("Inserito cliente ") << " '" << tipocf << "\' -> " 
          << codcli << " - " << rec.get(CLI_RAGSOC);
	  	log(msg);
    }
    aggiorna_record(cfv_rec, lista_campi);
    test_write(cfven);
  }
  cfven.close();
  clienti.close();
  return write_enabled();
  return true;
}

// trasferisce la seconda parte dei clienti
bool TLif_clifo_ca_anagrafiche::trasferisci()
{
  TString query = 
    "SELECT * "
		"FROM dbo.CA_ANAGRAFICHE";

  TRecordset& recset = create_recordset(query);
  TConfig& ini = config();
	
  TString_array lista_campi;
	ini.list_variables(lista_campi, true, "CA_ANAGRAFICHE", true);
  
  TSystemisamfile clienti(LF_CLIFO);
  clienti.open(_lock);
  TRectype& rec = clienti.curr();

  TLif_iterator hi(this);
  while (++hi)
  {
    const long codcf   = get_long("cod_anagra");
    
    TString8 codcli;
    codcli.format("%04d", codcf); codcli << "00";

    char tipocf = 'C';
    rec.zero();
    rec.put(CLI_TIPOCF, tipocf);
    rec.put(CLI_CODCF, codcli);
    int err = rec.read(clienti);
    if(err != NOERR)
    {
      tipocf = 'F';
      rec.zero();
      rec.put(CLI_TIPOCF, tipocf);
      rec.put(CLI_CODCF, codcli);
      err = rec.read(clienti);
    }

    if(err == NOERR)
    {
      const TString4  stato     = get_str("cod_naz");
      const TString80 ragsoc    = get_str("des_ragsoc");
      const TString16 cofi      = get_str("cod_cfisc");
      const TString16 paiv      = get_str("cod_piva");
      const long      tpper     = get_long("flg_per_fis");
      const TString80 mail      = get_str("des_email1");
      const TString80 tel       = get_str("sig_tel_fis");
      const TString80 fax       = get_str("sig_fax_fis");
      const TString80 indirizzo = get_str("des_indir_res");
      const TString   localita  = get_str("des_localita_fis");
      const long      cap       = get_long("cod_cap_fis");

      rec.put(CLI_TIPOCF,   tipocf);
      rec.put(CLI_CODCF,    codcli);
      rec.put(CLI_STATOCF,  stato);
      rec.put(CLI_RAGSOC,   ragsoc);
      rec.put(CLI_TIPOPERS, tpper == 0L ? 'G' : 'F');
      rec.put(CLI_COFI,     cofi);
      rec.put(CLI_PAIV,     paiv);
      rec.put(CLI_MAIL,     mail);
      rec.put(CLI_TEL,      tel);
      rec.put(CLI_FAX,      fax);
      rec.put(CLI_INDCF,    indirizzo);
      rec.put(CLI_LOCCF,    localita);
      rec.put(CLI_CAPCF,    cap);

      aggiorna_record(rec, lista_campi);
      if (test_write(clienti))
      {
			  TString msg;
  		  msg << TR("Inserito cliente ") << " '" << tipocf << "\' -> " 
            << codcf << " - " << rec.get(CLI_RAGSOC);
	  	  log(msg);
      }
    }
  }
  clienti.close();
  return write_enabled();
}

// trasferisce la terza parte dei clienti
bool TLif_clifo_ca_sedi::trasferisci()
{
  TString query = 
    "SELECT * "
		"FROM dbo.CA_SEDI";

  TRecordset& recset = create_recordset(query);
  TConfig& ini = config();
	
  TString_array lista_campi;
	ini.list_variables(lista_campi, true, "CA_SEDI", true);
  
  TSystemisamfile clienti(LF_CLIFO);
  clienti.open(_lock);
  TRectype& rec = clienti.curr();

  TSystemisamfile cfven(LF_CFVEN);
  cfven.open(_lock);
  TRectype& cfv_rec = cfven.curr();

  TLif_iterator hi(this);
  while (++hi)
  {
    TString8 codcf;   codcf.format("%04d", get_long("cod_anagra_sede"));
    TString4 codsede; codsede.format("%02d", get_long("cdn_sede"));
    TString8 codcli;  codcli << codcf << codsede;
    TString8 codcont; codcont << codcf << "00";

    TToken_string key;
    key.add('C');
    key.add(codcont);

    const TRectype& clifo_cache = cache().get(LF_CLIFO, key);
    const TRectype& cfven_cache = cache().get(LF_CFVEN, key);

    rec.zero();     rec = clifo_cache;
    cfv_rec.zero(); cfv_rec = cfven_cache;
        
    
    const TString80 ragsoc    = get_str("des_sede");
    const TString80 indirizzo = get_str("des_indir");
    const TString80 localita  = get_str("des_localita");
    const long      cap       = get_long("cod_cap");
    const TString4  prov      = get_str("sig_prov");
    const TString80 tel       = get_str("sig_tel");
    const TString16 cofi      = "";
    const TString   paiv      = "";
    const TString8  fatt_a    = codcont;

    rec.put(CLI_CODCF,     codcli);
    rec.put(CLI_RAGSOC,    ragsoc);
    rec.put(CLI_INDCF,     indirizzo);
    rec.put(CLI_LOCCF,     localita);
    rec.put(CLI_CAPCF,     cap);    
    rec.put(CLI_TEL,       tel);
    rec.put(CLI_COFI,      cofi);
    rec.put(CLI_PAIV,      paiv);
    rec.put(CLI_CODCFFATT, fatt_a);

    cfv_rec.put(CFV_CODCF, codcli);

    aggiorna_record(rec, lista_campi);
    test_write(clienti);
    test_write(cfven);
  }  
  clienti.close();
  cfven.close();
  return write_enabled();
  return true;
}

///////////////////////////////////////////////////////////
// TLif_contratti
///////////////////////////////////////////////////////////

bool TLif_contratti::trasferisci()
{
  TString query = 
    "SELECT * "
		"FROM dbo.LIF_Contratti";

  TRecordset& recset = create_recordset(query);
  TConfig& ini = config();
	TString_array lista_campi;
	ini.list_variables(lista_campi, true, "CONTRATTI", true);
  TSystemisamfile condv(LF_LVCONDV);
  TSystemisamfile rcondv(LF_LVRCONDV);
  TSystemisamfile clifogiac(LF_CLIFOGIAC);
  condv.open(_lock);
  rcondv.open(_lock);
  clifogiac.open(_lock);
  TRectype& trec = condv.curr();
  TRectype& rrec = rcondv.curr();
  TRectype& grec = clifogiac.curr();

  const int anno = TDate(TODAY).year();

  TLif_iterator hi(this);

  TAssoc_array contratti;
  
  while (++hi)
  {
    const long codcf  = get_long("cod_clifor");
    const long codsed = get_long("cdn_sede");

    TString8 cod_anagra_sede; cod_anagra_sede.format("%04d", codcf);
    TString4 cdn_sede;        cdn_sede.format("%02d", codsed);
     
    TString8 codcli; codcli << cod_anagra_sede << cdn_sede;

    if(!contratti.is_key(codcli))
    {
      TDate dadata(get_str("dat_inizio"));
      bool inbolla = get_str("flg_nonriportaddt")[0] == 'N' ? false : true;

      trec.zero();
      trec.put(LVCONDV_CODCF,    codcli);
      trec.put(LVCONDV_CODCONT,  1);
      trec.put(LVCONDV_DATAIN,   dadata);
      trec.put(LVCONDV_STPRZBOL, inbolla);
      trec.put(LVCONDV_PERFAT,   3);  //da accordi con Tassan in data 23/03/2011 la fatturazione � sempre mensile
      test_write(condv);
      contratti.add(codcli, codcli);
    }
    
    rrec.zero();
    grec.zero();
    rrec.put(LVRCONDV_CODCF,   codcli);
    rrec.put(LVRCONDV_CODCONT, 1);

    const real dotin(get_str("qta_iniziale"));
    const real dotod(get_str("qta_attuale"));
    const TString80 codart = get_str("cod_art");

    grec.put(CLIFOGIAC_ANNOES,  anno);
    grec.put(CLIFOGIAC_TIPOCF,  'C');
    grec.put(CLIFOGIAC_CODCF,   codcli);
    grec.put(CLIFOGIAC_INDSPED, 0);
    grec.put(CLIFOGIAC_CODART,  codart);
    grec.put(CLIFOGIAC_NRIGA,   1);
    grec.put(CLIFOGIAC_DOTIN,   dotin);
    grec.put(CLIFOGIAC_DOTOD,   dotod);

    test_write(clifogiac);
    
    real prezzo(get_str("prezzo_inuso"));
    real mincic(get_str("qta_minimociclaggio"));
    real valcon(get_str("valore_convenzionale"));
    real percfo(get_str("perc_forfait"));
    real przfis(get_str("prezzo_quotesisse"));
   
    int bloccato = get_str("flg_disabilitato")[0] == '0' ? 0 : 1; //articolo in sostituzione ->accordi Tassan il 16/03/2011

    rrec.put(LVRCONDV_CODART,    codart);
    rrec.put(LVRCONDV_PREZZO,    prezzo);
    rrec.put(LVRCONDV_MINCIC,    mincic);
    rrec.put(LVRCONDV_VALCONV,   valcon);
    rrec.put(LVRCONDV_FORFPERCL, percfo);
    rrec.put(LVRCONDV_ARTBLOC,   bloccato);
    rrec.put(LVRCONDV_IMPFISART, przfis);

    test_write(rcondv);
  }
  condv.close();
  rcondv.close();

  return write_enabled();
}

bool TLif_articoli::trasferisci()
{
  TString query = 
    "SELECT * "
		"FROM dbo.MG_ARTICOLI";

  TRecordset& recset = create_recordset(query);
  TConfig& ini = config();
	
  TString_array lista_campi;
	ini.list_variables(lista_campi, true, "MG_ARTICOLI", true);
  
  TSystemisamfile anamag(LF_ANAMAG);
  anamag.open(_lock);
  TRectype& rec = anamag.curr();

  TSystemisamfile umart(LF_UMART);
  umart.open(_lock);
  TRectype& umrec = umart.curr();

  TAssoc_array articoli;

  TLif_iterator hi(this);
  while (++hi)
  {
    const TString80 codart = get_str("cod_art");
    const TString80 descr  = get_str("des_articolo");
    const TString   descragg = get_str("des_articolo_ex");
    const real      pnetto(get_str("qta_pes_netto_kg"));
    const long      ppconf = get_long("num_colli");
    const TString4  ump = pnetto > ZERO ? "GR" : "";

    rec.put(ANAMAG_CODART,   codart);
    rec.put(ANAMAG_DESCR,    descr);
    rec.put(ANAMAG_DESCRAGG, descragg);
    rec.put(ANAMAG_PESO,     pnetto);
    rec.put(ANAMAG_UMP,      ump);
    rec.put(ANAMAG_PPCONF,   ppconf);
    rec.put(ANAMAG_CODIVA,   "20");
    
    aggiorna_record(rec, lista_campi);
    if (test_write(anamag))
    {
      if(!articoli.is_key(codart))
      {
        umrec.put(UMART_CODART, codart);
        umrec.put(UMART_NRIGA,  1);
        umrec.put(UMART_UM,     "NR");
        test_write(umart);

        articoli.add(codart, codart);
      }
      TString msg;
		  msg << TR("Inserito articolo ") << " '" << codart << "\' -> " << descr;
  	  log(msg);
    }
  }
  anamag.close();
  return write_enabled();
  return true;
}

bool TLif_listini::trasferisci()
{
  TString query = 
    "SELECT * "
		"FROM dbo.PZ_PREZZIBASE";

  TRecordset& recset = create_recordset(query);
  TConfig& ini = config();
	
  TString_array lista_campi;
	ini.list_variables(lista_campi, true, "PZ_PREZZIBASE", true);
  
  TSystemisamfile umart(LF_UMART);
  umart.open(_lock);
  TRectype& umrec = umart.curr();

  TSystemisamfile condv(LF_LVCONDV);
  condv.open(_lock);
  TRectype& conrec = condv.curr();

  TSystemisamfile rcondv(LF_LVRCONDV);
  rcondv.open(_lock);
  
  TLif_iterator hi(this);

  TAssoc_array contratti;

  while (++hi)
  {
    const TString80 codart = get_str("cod_art");
    const TString4  codlis = get_str("cod_listino");
    const long      prglis = get_long("prg_listino");
    const real      prezzo(get_str("prz_listino"));

    TString8 listino = codlis; listino << prglis;

    umrec.zero();
    umrec.put(UMART_CODART, codart);
    umrec.put(UMART_NRIGA,  1);
    umrec.read(umart);
    umrec.put(UMART_CODART, codart);
    umrec.put(UMART_NRIGA,  1);
    umrec.put(UMART_PREZZO, prezzo);
    
    aggiorna_record(umrec, lista_campi);
    if (test_write(umart))
    {
      TString query;
      query << "USE LVRCONDV\n"
            << "SELECT CODART=\"" << codart << "\"";

      TISAM_recordset rcont(query);

      for(bool ok = rcont.move_first(); ok; ok = rcont.move_next())
      {
        TRectype& riga = rcont.cursor()->curr();
        riga.put(LVRCONDV_PREZDAN, prezzo);
        riga.rewrite(rcondv);

        const long codcf = riga.get_long(LVRCONDV_CODCF);
        const long codco = riga.get_long(LVRCONDV_CODCONT);

        TToken_string ckey;
        ckey.add(codcf);
        ckey.add(codco);

        if(!contratti.is_key(ckey))
        {
          conrec.put(LVCONDV_CODCF, codcf);
          conrec.put(LVCONDV_CODCONT, codco);
          conrec.read(condv);
          conrec.put(LVCONDV_CODCF, codcf);
          conrec.put(LVCONDV_CODCONT, codco);
          conrec.put(LVCONDV_ADDCAPROT, true);
          conrec.rewrite(condv);
        }
        contratti.add(ckey, ckey);
      }
    }
  }
  umart.close();
  condv.close();
  rcondv.close();

  return write_enabled();
}


///////////////////////////////////////////////////////////
// TImportazione_lif_msk
///////////////////////////////////////////////////////////

class TImportazione_lif_msk : public TAutomask
{
protected:
  virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
  void serialize(bool bSave);

public:
  void trasferisci();

  TImportazione_lif_msk();
  virtual ~TImportazione_lif_msk();
};

// Funzione di trasferimento dati da/verso file .ini con lo stesso nome della maschera
// Andrebbe messo in libreria
void TImportazione_lif_msk::serialize(bool bSave)
{
  TFilename n = source_file(); n.ext("ini");  // Construisce il nome del .ini in base al .msk
  TConfig cfg(n, "Main");                     // Crea il file di configurazione
  TString4 id; 
  for (int i = fields()-1; i >= 0; i--)       // Scandisce tutti i campi della maschera ...   
  {
    TMask_field& f = fld(i);
    if (f.active() && f.is_loadable())        // ... selezionando solo quelli editabili
    {
      id.format("%d", f.dlg());
      if (bSave)                              // A seconda del flag di scrittura ... 
        cfg.set(id, f.get());                 // ... o scrive sul .ini 
      else 
        f.set(cfg.get(id));                   // ... o legge dal .ini
    }
  }
}

void TImportazione_lif_msk::trasferisci()
{
  TString query_header1;
  TString query_header2;

  query_header1 << "ODBC(" << get(F_DSN1) << ',' << get(F_USR) << ',' << get(F_PWD) << ")\n";
  query_header2 << "ODBC(" << get(F_DSN2) << ',' << get(F_USR) << ',' << get(F_PWD) << ")\n";

  TReport_book book;
  TLif_log log;

  bool rep_to_print = false;
  bool go_on = true;

  if (go_on && get_bool(F_ANAGRAFICHE))
  {
    TLif_clifo_co_clifor pc;
    pc.init(TR("Clienti / Fornitori"), query_header1, log);
    go_on = pc.trasferisci();

    TLif_clifo_ca_anagrafiche pc1;
    pc1.init(TR("Clienti / Fornitori"), query_header2, log);
    go_on = pc1.trasferisci();

    TLif_clifo_ca_sedi pc2;
    pc2.init(TR("Sedi"), query_header2, log);
    go_on = pc2.trasferisci();

    book.add(log);
		rep_to_print = true;
  }

  if (go_on && get_bool(F_CONTRATTI))
  {
    TLif_contratti pc;
    pc.init(TR("Contratti"), query_header1, log);
    go_on = pc.trasferisci();
    book.add(log);
		rep_to_print = true;
  }

  if (go_on && get_bool(F_ARTICOLI))
  {
    TLif_articoli pc;
    pc.init(TR("Articoli"), query_header1, log);
    go_on = pc.trasferisci();

    TLif_listini pc1;
    pc1.init(TR("Listini"), query_header1, log);
    go_on = pc1.trasferisci();

    book.add(log);
		rep_to_print = true;
  }

  if (rep_to_print && book.pages() > 0)
		book.preview();
}

bool TImportazione_lif_msk::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
  switch (o.dlg())
  {
  case DLG_OK:
    if (e == fe_button)
      serialize(true);
    break;
  default:
    break;
  }
  return true;
}

TImportazione_lif_msk::TImportazione_lif_msk() : TAutomask("pl0002100a")
{
  serialize(false);
}

TImportazione_lif_msk::~TImportazione_lif_msk()
{ }

                                      /////////////////////////////////////
                                      ////    TIMPORTAZIONE_LIF_APP    ////
                                      /////////////////////////////////////

class TImportazione_lif_app : public TSkeleton_application
{
protected:
  virtual const char * extra_modules() const {return "ba";}
  virtual void main_loop();
};

void TImportazione_lif_app::main_loop()
{
  TImportazione_lif_msk mask;
  while (mask.run() == K_ENTER)
    mask.trasferisci();
}

int pl0002100(int argc, char* argv[])
{
  TImportazione_lif_app ih;
  ih.run(argc, argv, APPNAME);
  return 0;
}