#include <applicat.h>
#include <filetext.h>
#include <form.h>
#include <mask.h>
#include <relation.h>
#include <tabutil.h>
#include <printer.h>
#include <progind.h>
#include <utility.h>         
#include <lffiles.h>         

#include "..\ve\velib.h"
#include "si0100a.h"

/////////////////////////////////////////////////////
// Classe TPag_file customizzata dalla TFile_text //
/////////////////////////////////////////////////////
class TPag_file: public TFile_text
{ 
protected:
  virtual void validate(TCursor& cur,TRecord_text &rec, TToken_string &val, TString& str);

public:
  TPag_file(const TString& file_name, const TString& config_name);
  virtual ~TPag_file() { }
};

// gestione dei messaggi estesi nei campi
void TPag_file::validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TString& str)
{
  const TString code(s.get(0));
  TString valore;
  str = valore;
}

TPag_file::TPag_file(const TString& file_name, const TString& config_name)
          : TFile_text(file_name, config_name)
{
}

/////////////////////////////////////////////////////
// Classe TCli_file customizzata dalla TFile_text //
/////////////////////////////////////////////////////
class TCli_file: public TFile_text
{ 
protected:
  virtual void validate(TCursor& cur,TRecord_text &rec, TToken_string &val, TString& str);

public:
  TCli_file(const TString& file_name, const TString& config_name);
  virtual ~TCli_file() { }
};

// gestione dei messaggi estesi nei campi
void TCli_file::validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TString& str)
{
  const TString code(s.get(0));
  TString valore;
  str = valore;
}

TCli_file::TCli_file(const TString& file_name, const TString& config_name)
          : TFile_text(file_name, config_name)
{
}

/////////////////////////////////////////////////////
// Classe TArt_file customizzata dalla TFile_text //
/////////////////////////////////////////////////////
class TArt_file: public TFile_text
{ 
protected:
  virtual void validate(TCursor& cur,TRecord_text &rec, TToken_string &val, TString& str);

public:
  TArt_file(const TString& file_name, const TString& config_name);
  virtual ~TArt_file() { }
};

// gestione dei messaggi estesi nei campi
void TArt_file::validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TString& str)
{
  const TString code(s.get(0));
  TString valore;
  str = valore;
}

TArt_file::TArt_file(const TString& file_name, const TString& config_name)
          : TFile_text(file_name, config_name)
{
}

class TImport: public TSkeleton_application
{
  
protected:
  virtual bool create(void);
  virtual void main_loop();
  virtual bool destroy(void) ;
  void transfer(void);
  bool check_seq(TConfig & c);
  bool localita2comune(const TString & cap, const TString & localita, TString & codice);
  void update_cli(TCli_file & in, TRecord_text & r, TLocalisamfile & cli);
  void update_art(TArt_file & in, TRecord_text & r, TLocalisamfile & art, TLocalisamfile & umart);
  void update_doc(TPag_file & in, TRecord_text & r, TDocumento &doc, const char * codnum, const char * tipodoc,
                  const char * tiporiga, const char * codiva, const char * codivaz);
  virtual const char * extra_modules() const { return "BA"; }

public:
  TImport() {}
  virtual ~TImport() {}
};

// restituisce un riferimento all' applicazione
inline TImport& app() { return (TImport&) main_app();}

// creazione dell'applicazione
bool TImport::create()
{                         
  open_files(LF_DOC, LF_RIGHEDOC, LF_CONDV, LF_RCONDV, LF_ANAMAG, LF_SCONTI, LF_UMART, 
             LF_TAB, LF_TABCOM, LF_CLIFO, LF_CFVEN, LF_INDSP, LF_OCCAS, LF_PCON,
             LF_MOVMAG, LF_RMOVMAG, LF_MAG, LF_SVRIEP, LF_AGENTI, LF_PERCPROV, LF_ATTIV, LF_CAUSALI, 0);

  return TSkeleton_application::create();
}

// distruzione dell'applicazione
bool TImport::destroy()
{
  return TSkeleton_application::destroy();
}

// carica la maschera 
void TImport::main_loop()
{ 
  transfer();
}

// trasferimento dati su file per ct bo
void TImport::transfer()
{  
  TMask msk("si0100a");
  TConfig c(CONFIG_STUDIO, "sipag");
  msk.set(F_FILESEQ, c.get("FileSeq"));
  msk.set(F_FILEPAG, c.get("FilePag"));
  msk.set(F_FILECLI, c.get("FileCli"));
  msk.set(F_FILEART, c.get("FileArt"));
  
  while (msk.run() != K_QUIT)
  {
    c.set("FileSeq", msk.get(F_FILESEQ));
    c.set("FilePag", msk.get(F_FILEPAG));
    c.set("FileCli", msk.get(F_FILECLI));
    c.set("FileArt", msk.get(F_FILEART));
  
    if (check_seq(c)) 
    {       
      TRecord_text rec;
      TProgind p(3L, "Trasferimento da AS/400");
      TFilename clisrc(msk.get(F_FILECLI));

      if (clisrc.exist())
      {
        TCli_file clifile(clisrc, "cli.ini");
        TLocalisamfile clienti(LF_CLIFO);
        
        clifile.open(clisrc,'r');  
        while (clifile.read(rec) == NOERR)
          update_cli(clifile, rec, clienti);
        clifile.close();
      }
      p.addstatus(1L);
      
      TFilename artsrc(msk.get(F_FILEART));

      if (artsrc.exist())
      {
        TArt_file artfile(artsrc, "art.ini");
        TLocalisamfile articoli(LF_ANAMAG);
        TLocalisamfile umart(LF_UMART);
        
        artfile.open(artsrc,'r');
        while (artfile.read(rec) == NOERR)
          update_art(artfile, rec, articoli, umart);
        artfile.close();
      }
      p.addstatus(1L);
      
      TFilename pagsrc(msk.get(F_FILEPAG));
      
      if (pagsrc.exist())
      {
        TPag_file pagfile(pagsrc, "pag.ini");
        TDocumento doc;
        TString codnum(c.get("CodNum"));
        TString tipodoc(c.get("TipoDoc"));
        TString tiporiga(c.get("TipoRiga"));                
        TString codiva(c.get("CodIva"));                
        TString codivaz(c.get("CodIvaZ"));                
        
        
        pagfile.open(pagsrc,'r');
        while (pagfile.read(rec) == NOERR)
          update_doc(pagfile, rec, doc, codnum, tipodoc, tiporiga, codiva, codivaz);
        pagfile.close();              
      }
      p.addstatus(1L);
      
      message_box("Operazione terminata");
    }           
  }
}

//inizializza il cursore
bool TImport::check_seq(TConfig & c)
{            
  TScanner seq(c.get("FileSeq")); 
  const int expected_seq = c.get_int("Seq") + 1;
  const int seqnum = seq.integer();
  
  if (expected_seq != seqnum)
    return error_box("Il numero di sequenza trovato %d\nnon coincide con quello atteso %d", seqnum, expected_seq);
  c.set("Seq", seqnum);
  
  return TRUE;
}

int si0100(int argc, char* argv[])
{
  TImport a ;
  a.run(argc, argv, "Ricezione da AS/400");
  return 0;
}
  
bool TImport::localita2comune(const TString & caporig, const TString & localita, TString & codice)
{             
  TLocalisamfile comuni (LF_COMUNI);                 
  TString cap(caporig);
  bool found = FALSE;

  if (cap.mid(2,1) == "1")
  {
    cap = cap.left(3);
    cap << "00";
  }
  
  comuni.setkey(3);
  comuni.zero();
  comuni.put("CAPCOM", cap);
  
  TRectype com (comuni.curr());  
  codice = "";
  
  for (comuni.read(_isgteq); !comuni.eof() && !found; comuni.next())
  {
    if (comuni.curr() != com)
      break;
    
    found = localita.compare(comuni.get("DENCOM"), 3, FALSE) == 0;
    if (found)
      codice = comuni.get("COM");
  } 
  return found;
}

void TImport::update_cli(TCli_file & in, TRecord_text & r, TLocalisamfile & cli)
{                  
  cli.zero();
  cli.put("TIPOCF", "C");
  cli.put("CODCF", in.get_field(r, 1));
  bool newrec = cli.read() != NOERR;
  if (newrec)
  {
    cli.zero();
    cli.put("TIPOCF", "C");
    cli.put("CODCF", in.get_field(r, 1));
  }               
  
  cli.put("RAGSOC", in.get_field(r, 2));
  TString ind(in.get_field(r, 3));
  TString loc;
  
  int p = ind.find('-');
  if (p > 0)
  {
    loc = ind.mid(p+1);
    loc.strip("-");
    loc.trim();
    ind.cut(p);
    ind.trim();
  }
  
  p = ind.rfind(',');
  if (p > 0)
  {                    
    cli.put("INDCF", ind.left(p));
    cli.put("CIVCF", ind.mid(p+1));
  }
  else
    cli.put("INDCF", ind.left(35));
  
  TString cap(in.get_field(r, 4));
  
  cli.put("CAPCF", cap);
  cli.put("COFI", in.get_field(r, 6));
  cli.put("PAIV", in.get_field(r, 7));
  
  TString localita(in.get_field(r, 8));    
  TString codice;
  
  if (localita2comune(cap, localita, codice) == TRUE)
    localita = "";    

  if (loc.not_empty())
  {
    localita.insert(" ");
    localita.insert(loc);
  }
  cli.put("COMCF", codice);
  cli.put("LOCALITACF", localita);
  
  if (newrec)
    cli.write();
  else
    cli.rewrite();
}

void TImport::update_art(TArt_file & in, TRecord_text & r, TLocalisamfile & art, TLocalisamfile & umart)
{
  art.zero();
  art.put("CODART", in.get_field(r, 0));
  bool newrec = art.read() != NOERR;
  if (newrec)
  {
    art.zero();
    art.put("CODART", in.get_field(r, 0));
  }               
  
  art.put("DESCR", in.get_field(r, 1));
  
  if (newrec)
  {
    art.write();
    umart.zero();
    umart.put("CODART", in.get_field(r, 0));
    umart.put("NRIGA", "1");
    umart.put("UM", "N.");
    umart.put("FC", "1.00");
    umart.write();
  }  
  else
    art.rewrite();
}

void TImport::update_doc(TPag_file & in, TRecord_text & r, TDocumento &doc, const char * codnum, const char * tipodoc,
                         const char * tiporiga, const char * codiva, const char * codivaz)
{                                        
  doc.zero();
  const bool newdoc = doc.read('D', TDate(TODAY).year(), codnum, atol(in.get_field(r, 1))) != NOERR;
  const TDate oggi(TODAY);
  
  if (newdoc)
  {
    doc.zero();
    
    TDocumento::set_key(doc, 'D', oggi.year(), codnum, atol(in.get_field(r, 1)));
    doc.set_tipo(tipodoc);      
    doc.put("TIPOCF", "C");
    doc.put("CODCF", in.get_field(r, 1));
    doc.put("DATADOC", oggi);
    doc.put("DATACONS", oggi);
  }
                  
  TRiga_documento & riga = doc.new_row(tiporiga);
  
  const TString & cod = in.get_field(r, 2);
  riga.put("CODART", cod);
  riga.put("CODARTMAG", cod);

  TString descr = cache().get(LF_ANAMAG, cod, "DESCR");

  riga.put("DESCR", descr); 
  riga.put("CHECKED", "X"); 
  doc.put("DATACONS", oggi);
  
     
  real qta(in.get_field(r, 3)); 
  
  if (qta == ZERO)
    qta = 1.00;

  riga.put("UMQTA", "N."); 
  riga.put("QTA", qta); 
 
  TString prezzo_str(in.get_field(r, 4));
  prezzo_str.replace(',', '.');
  
  const real prezzo(prezzo_str);
  riga.put("PREZZO", prezzo); 
  if (cod[0] == 'Z')
  	riga.put("CODIVA", codivaz); 
  else
  	riga.put("CODIVA", codiva); 
                    
  if (newdoc)
    doc.write();
  else
    doc.rewrite();
}