Files correlati : ps0713 Ricompilazione Demo : [ ] Commento : Modificati i programmi in modo che utilizzino ps0713lib e le tabelle di ripartizione per recuperare i dati di gruppo conto e sottoconto relativi a un dato codice commessa git-svn-id: svn://10.65.10.50/trunk@20468 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			343 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			343 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
#include <applicat.h>
 | 
						||
#include <automask.h>
 | 
						||
#include <progind.h>
 | 
						||
 | 
						||
#include "../ve/velib.h"
 | 
						||
 | 
						||
#include "ps0713400a.h"
 | 
						||
 | 
						||
#include "ps0713lib.h"
 | 
						||
 | 
						||
                                       ///////////////////////////////////
 | 
						||
                                       ////    TIMPORTA_FATVEN_MSK    ////
 | 
						||
                                       ///////////////////////////////////
 | 
						||
 | 
						||
//Classe TImporta_fatven_msk
 | 
						||
class TImporta_fatven_msk : public TAutomask
 | 
						||
{
 | 
						||
protected:
 | 
						||
  virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
 | 
						||
 | 
						||
public:
 | 
						||
  TImporta_fatven_msk();
 | 
						||
};
 | 
						||
  
 | 
						||
TImporta_fatven_msk::TImporta_fatven_msk() :TAutomask ("ps0713400a")
 | 
						||
{
 | 
						||
}  
 | 
						||
 | 
						||
//ON_FIELD_EVENT: metodo che gestisce i comportamenti dei vari campi della maschera
 | 
						||
//(per adesso segnaposto)
 | 
						||
bool TImporta_fatven_msk::on_field_event(TOperable_field& f, TField_event e, long jolly)
 | 
						||
{
 | 
						||
  return true;
 | 
						||
}
 | 
						||
 | 
						||
                                       ///////////////////////////////////
 | 
						||
                                       ////    TIMPORTA_FATVEN_APP    ////
 | 
						||
                                       ///////////////////////////////////
 | 
						||
 | 
						||
//Classe TImporta_fatven_app
 | 
						||
class TImporta_fatven_app : public TSkeleton_application
 | 
						||
{
 | 
						||
  TImporta_fatven_msk*	_msk;
 | 
						||
 | 
						||
protected:
 | 
						||
  virtual bool check_autorization() const {return false;}
 | 
						||
  virtual const char * extra_modules() const {return "ve";}
 | 
						||
 | 
						||
  long  togli_apici_numero(TVB_recset& s, int i);
 | 
						||
  const TString& togli_apici(TVB_recset& s, int i);
 | 
						||
  bool find_clifo(long& codcf, TString& paiv, long& abi, long& cab, TString& codpag);
 | 
						||
 | 
						||
public:           
 | 
						||
  virtual bool create();
 | 
						||
  virtual bool destroy();
 | 
						||
  virtual void main_loop();
 | 
						||
	bool transfer(const TFilename& file);
 | 
						||
 
 | 
						||
  TImporta_fatven_app() {}
 | 
						||
};
 | 
						||
 | 
						||
//TOGLI_APICI_NUMERO: metodo che restituisce un campo del recordset come numero
 | 
						||
//preoccupandosi prima di eliminare eventuali doppi apici
 | 
						||
long TImporta_fatven_app::togli_apici_numero(TVB_recset& s, int i)
 | 
						||
{
 | 
						||
  TString80 tmp = s.get(i).as_string();
 | 
						||
  tmp.strip("\"");
 | 
						||
  return atol(tmp);
 | 
						||
}
 | 
						||
 | 
						||
//TOGLI_APICI: metodo che restituisce un campo del recordset come stringa
 | 
						||
//preoccupandosi prima di eliminare eventuali doppi apici
 | 
						||
const TString& TImporta_fatven_app::togli_apici(TVB_recset & s, int i)
 | 
						||
{
 | 
						||
  TString& tmp = get_tmp_string();
 | 
						||
  tmp = s.get(i).as_string();
 | 
						||
  tmp.strip("\"");
 | 
						||
  tmp.trim();
 | 
						||
  return tmp;
 | 
						||
}
 | 
						||
 | 
						||
//FIND_CLIFO: metodo che cerca un cliente dati codcf e paiv: se lo trova setta tutti i campi di interesse
 | 
						||
//legati al cliente e restituisce true; in caso contrario restituisce false
 | 
						||
bool TImporta_fatven_app::find_clifo(long& codcf, TString& paiv, long& abi, long& cab, TString& codpag)
 | 
						||
{
 | 
						||
  if (!paiv.blank())
 | 
						||
  {
 | 
						||
    TISAM_recordset clienti("USE CLIFO KEY 5\nFROM TIPOCF='C' STATOPAIV="" PAIV=#PAIV\nTO TIPOCF='C' STATOPAIV="" PAIV=#PAIV");
 | 
						||
    clienti.set_var("#PAIV", TVariant(paiv));
 | 
						||
    if (clienti.move_first())
 | 
						||
    {
 | 
						||
      codcf = clienti.get(CLI_CODCF).as_int(); 
 | 
						||
      paiv = clienti.get(CLI_PAIV).as_string();
 | 
						||
      abi = clienti.get(CLI_CODABI).as_int();
 | 
						||
      cab = clienti.get(CLI_CODCAB).as_int();
 | 
						||
      codpag = clienti.get(CLI_CODPAG).as_string();
 | 
						||
      return true;
 | 
						||
    }
 | 
						||
  }
 | 
						||
  return false;
 | 
						||
}
 | 
						||
 | 
						||
//TRANSFER: metodo che effettivamente fa l'elaborazione del file di input, generando i vari documenti
 | 
						||
//pronti per essere contabilizzati
 | 
						||
bool TImporta_fatven_app::transfer(const TFilename& file)
 | 
						||
{
 | 
						||
  const TString4 codnum = "F01"; //Da analisi
 | 
						||
  const TString4 tpdoc = "F01";  //Da analisi
 | 
						||
 | 
						||
  TVB_recset s(file, ',');
 | 
						||
 | 
						||
  TProgind pi(s.items(),"Importazione fatture in corso ...",true,true);
 | 
						||
 | 
						||
  long ndoc_old;
 | 
						||
 | 
						||
  s.move_first();
 | 
						||
  //campi documento
 | 
						||
  const long ndoc = ndoc_old = togli_apici_numero(s,0);  //ndoc
 | 
						||
  const TDate datadoc = togli_apici(s,1);                //datadoc  
 | 
						||
  const int anno = datadoc.year();                       //anno documento
 | 
						||
  
 | 
						||
  TDocumento doctmp('D', anno, codnum, ndoc_old);
 | 
						||
  if (doctmp.rows() > 0)
 | 
						||
  {
 | 
						||
    warning_box(TR("I documenti che si sta cercando di importare esistono gi<67>"));
 | 
						||
    return true;
 | 
						||
  }
 | 
						||
 | 
						||
  for (bool ok = s.move_first(); ok; ok = s.move_next())
 | 
						||
  {
 | 
						||
    if (!pi.addstatus(1)) 
 | 
						||
      break;
 | 
						||
 | 
						||
    if (s.get(0).as_string().blank())
 | 
						||
      break;
 | 
						||
 | 
						||
    //leggo il contenuto del tracciato record
 | 
						||
    //campi documento
 | 
						||
    const long ndoc = togli_apici_numero(s,0);  //ndoc
 | 
						||
    const TDate datadoc = togli_apici(s,1);     //datadoc  
 | 
						||
    const int anno = datadoc.year();            //anno documento
 | 
						||
    
 | 
						||
    //correggo l'imponibile dell'ultima riga del documento precedente per far tornare i conti
 | 
						||
    if (ndoc != ndoc_old)
 | 
						||
    {
 | 
						||
      //carico il documento
 | 
						||
      TDocumento doc('D', anno, codnum, ndoc_old);
 | 
						||
 | 
						||
      s.move_prev();
 | 
						||
      real tot_doc = togli_apici(s,18);
 | 
						||
      real tot_imp = doc.get_real("TOTVALORE");
 | 
						||
 | 
						||
      //se <20> necessario, faccio la modifica sull'ultima riga
 | 
						||
      if (tot_imp != tot_doc)
 | 
						||
      {
 | 
						||
        //calcolo la differenza
 | 
						||
        real diff = tot_doc - tot_imp;
 | 
						||
        
 | 
						||
        //estraggo l'imponibile dell'ultima riga        
 | 
						||
        TRiga_documento& rdoc = doc[doc.rows()];
 | 
						||
        real imp = rdoc.get_real(RDOC_PREZZO);
 | 
						||
 | 
						||
        //calcolo l'imponibile esatto e lo inserisco nella riga documento
 | 
						||
        imp += diff;
 | 
						||
        rdoc.put(RDOC_PREZZO, imp);
 | 
						||
        doc.write();
 | 
						||
      }
 | 
						||
      //passo al nuovo documento
 | 
						||
      ndoc_old = ndoc;
 | 
						||
      s.move_next();
 | 
						||
    }
 | 
						||
 | 
						||
    //campi articolo 1
 | 
						||
    TString descr1 = togli_apici(s,2);                    //descrizione aritcolo 1
 | 
						||
    const TString80 art1 = togli_apici(s,3);              //articolo 1
 | 
						||
    const real imp1 = togli_apici(s,4);                   //imponibile articolo 1
 | 
						||
    //campi articolo 2
 | 
						||
    const TString descr2 = togli_apici(s,5);              //descrizione articolo 2
 | 
						||
    const real imp2 = togli_apici(s,6);                   //imponibile articolo 2
 | 
						||
    //campi articolo 3
 | 
						||
    const TString16 descr3 = togli_apici(s,7);            //articolo 3
 | 
						||
    const real impives = togli_apici(s,8);                //imponibile iva esente
 | 
						||
 | 
						||
    //partita iva, mi serve per sapere se un cliente esiste gi<67> in clifo
 | 
						||
    TString16 paiv = togli_apici(s,9);              //partita iva
 | 
						||
 | 
						||
    //prendo codiva da anamag
 | 
						||
    const TRectype& anamag = cache().get(LF_ANAMAG,art1);
 | 
						||
    const TString16 codiva = anamag.get(ANAMAG_CODIVA);
 | 
						||
 | 
						||
    //codice commessa
 | 
						||
    const TString16 codcms = togli_apici(s,17);
 | 
						||
    
 | 
						||
    //cerco gli altri dati di interesse
 | 
						||
    long codcf;
 | 
						||
    long abi;
 | 
						||
    long cab;
 | 
						||
    TString4 codpag;
 | 
						||
 | 
						||
    if (!find_clifo(codcf, paiv, abi, cab, codpag))
 | 
						||
    {
 | 
						||
      //campi cliente (da utilizzare se non esiste gi<67>)
 | 
						||
      const TString80 ragsoc = togli_apici(s,10);      //ragione sociale
 | 
						||
      const TString80 ind = togli_apici(s,11);         //indirizzo
 | 
						||
      const TString4 nciv = togli_apici_numero(s,12);  //numero civico
 | 
						||
      const long cap = togli_apici_numero(s,13);       //CAP
 | 
						||
      const TString80 comune = togli_apici(s,14);      //comune
 | 
						||
      const TString80 loc = togli_apici(s,15);         //localit<69>
 | 
						||
      const TString4 prov = togli_apici(s,16);         //provincia
 | 
						||
 | 
						||
      const TString& codcom = cap2comune(cap, comune); //codice comune
 | 
						||
 | 
						||
      TLocalisamfile clifo(LF_CLIFO);
 | 
						||
 | 
						||
      //calcolo il prossimo codice cliente libero
 | 
						||
      codcf = 1L ;  
 | 
						||
      if (!clifo.empty())
 | 
						||
      {
 | 
						||
        clifo.put(CLI_TIPOCF, 'F');
 | 
						||
        if (clifo.read(_isgteq) == NOERR)
 | 
						||
          clifo.prev();
 | 
						||
		    else
 | 
						||
			    clifo.last();
 | 
						||
 | 
						||
        if (clifo.get_char(CLI_TIPOCF) == 'C')
 | 
						||
          codcf += clifo.get_long(CLI_CODCF);
 | 
						||
      }
 | 
						||
 | 
						||
      //inserisco i dati di interesse
 | 
						||
      clifo.put(CLI_TIPOCF, "C");
 | 
						||
      clifo.put(CLI_CODCF, codcf);
 | 
						||
      clifo.put(CLI_RAGSOC, ragsoc);
 | 
						||
      clifo.put(CLI_PAIV, paiv);
 | 
						||
      clifo.put(CLI_INDCF, ind);
 | 
						||
      clifo.put(CLI_CIVCF, nciv);
 | 
						||
      clifo.put(CLI_CAPCF, cap);
 | 
						||
      clifo.put(CLI_COMCF, codcom);
 | 
						||
      clifo.put(CLI_LOCCF, loc);
 | 
						||
 | 
						||
      clifo.write();
 | 
						||
 | 
						||
      abi = 0;
 | 
						||
      cab = 0;
 | 
						||
      codpag = "";
 | 
						||
    }
 | 
						||
 | 
						||
 | 
						||
    TDocumento doc('D', anno, codnum, ndoc);
 | 
						||
 | 
						||
    doc.put(DOC_TIPODOC, tpdoc);
 | 
						||
    doc.put(DOC_DATADOC, datadoc);
 | 
						||
    doc.put(DOC_TIPOCF, 'C');
 | 
						||
    doc.put(DOC_CODCF, codcf);
 | 
						||
    doc.put(DOC_CODABIA, abi);
 | 
						||
    doc.put(DOC_CODCABA, cab);
 | 
						||
    doc.put(DOC_CODPAG, codpag);
 | 
						||
    doc.put(DOC_CODCMS, codcms);                
 | 
						||
 | 
						||
    if (imp1 != 0)
 | 
						||
    {      
 | 
						||
      TRiga_documento& rdoc = doc.new_row("01");
 | 
						||
 | 
						||
      if (descr1.len() <= 50)
 | 
						||
        rdoc.put(RDOC_DESCR, descr1);
 | 
						||
      else
 | 
						||
      {
 | 
						||
        rdoc.put(RDOC_DESCR, descr1.sub(0,49));
 | 
						||
        rdoc.put(RDOC_DESCLUNGA, true);
 | 
						||
        rdoc.put(RDOC_DESCEST, descr1.sub(50));
 | 
						||
      }
 | 
						||
      rdoc.put(RDOC_PREZZO, imp1);
 | 
						||
      rdoc.put(RDOC_QTA, 1);
 | 
						||
      rdoc.put(RDOC_CODART, art1);
 | 
						||
      rdoc.put(RDOC_CODARTMAG, art1);
 | 
						||
      rdoc.put(RDOC_CHECKED, "X");
 | 
						||
      rdoc.put(RDOC_CODIVA, codiva);
 | 
						||
    }
 | 
						||
      
 | 
						||
    if (imp2 != 0)
 | 
						||
    {
 | 
						||
      TRiga_documento& rdoc = doc.new_row("01");
 | 
						||
 | 
						||
      rdoc.put(RDOC_DESCR, descr2);
 | 
						||
      rdoc.put(RDOC_PREZZO, imp2);
 | 
						||
      rdoc.put(RDOC_QTA, 1);
 | 
						||
      rdoc.put(RDOC_CODART, art1);
 | 
						||
      rdoc.put(RDOC_CODARTMAG, art1);
 | 
						||
      rdoc.put(RDOC_CHECKED, "X");
 | 
						||
      rdoc.put(RDOC_CODIVA, codiva);
 | 
						||
    }
 | 
						||
 | 
						||
    if (impives != 0)
 | 
						||
    {
 | 
						||
      TRiga_documento& rdoc = doc.new_row("01");      
 | 
						||
 | 
						||
      rdoc.put(RDOC_PREZZO, impives);
 | 
						||
      rdoc.put(RDOC_QTA, 1);     
 | 
						||
      rdoc.put(RDOC_CHECKED, "X");
 | 
						||
      rdoc.put(RDOC_CODIVA, codiva); //??????????????????????????????????
 | 
						||
    }      
 | 
						||
    doc.write();
 | 
						||
  }
 | 
						||
  return true;
 | 
						||
}
 | 
						||
 | 
						||
//CREATE: metodo che instanzia maschera e appicazione
 | 
						||
bool TImporta_fatven_app::create()
 | 
						||
{
 | 
						||
  _msk = new TImporta_fatven_msk();
 | 
						||
         
 | 
						||
  return TSkeleton_application::create();
 | 
						||
}
 | 
						||
 | 
						||
//DESTROY: metodo che rilascia maschera e applicazione
 | 
						||
bool TImporta_fatven_app::destroy()
 | 
						||
{
 | 
						||
	delete _msk;
 | 
						||
  return TApplication::destroy();
 | 
						||
}
 | 
						||
 | 
						||
void TImporta_fatven_app::main_loop()
 | 
						||
{
 | 
						||
  KEY	tasto;
 | 
						||
	tasto = _msk->run();
 | 
						||
  if (tasto == K_ENTER)
 | 
						||
  {		
 | 
						||
    //genero il nome del file da caricare
 | 
						||
    TFilename name = _msk->get(F_PATH);
 | 
						||
    name.add(_msk->get(F_NAME));
 | 
						||
    transfer(name);		
 | 
						||
  }   
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
TImporta_fatven_app& app() { return (TImporta_fatven_app&) main_app(); }
 | 
						||
 | 
						||
 | 
						||
int ps0713400 (int argc, char* argv[])
 | 
						||
{
 | 
						||
  TImporta_fatven_app main_app;
 | 
						||
  main_app.run(argc, argv, TR("Importazione Fatture"));
 | 
						||
  return true;
 | 
						||
} |