Files correlati : Ricompilazione Demo : [ ] Commento : git-svn-id: svn://10.65.10.50/trunk@17519 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			391 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			391 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
#define XVT_INCL_NATIVE
 | 
						|
 | 
						|
#include <applicat.h>
 | 
						|
#include <execp.h>
 | 
						|
 | 
						|
#include "../cg/cg2103.h"
 | 
						|
#include "../mg/anamag.h"
 | 
						|
 | 
						|
#include <mov.h>
 | 
						|
#include <doc.h>
 | 
						|
#include <rdoc.h>
 | 
						|
 | 
						|
#include "velib.h"
 | 
						|
 | 
						|
class TIndustriosa_app : public TSkeleton_application
 | 
						|
{    
 | 
						|
  int _len_commessa;
 | 
						|
  int _len_fase;
 | 
						|
  
 | 
						|
protected:
 | 
						|
  const TString& conto_industriale(const TRiga_documento& row, TString& conto) const;
 | 
						|
  void trim_and_cut(TString& val, int len) const;
 | 
						|
  void get_field(const TDocumento& doc, const TRectype& mov, TCausale& causale, 
 | 
						|
                 const TRectype& rec, const char* field, TString& val) const;
 | 
						|
  bool filerr(const char* name) const;
 | 
						|
  bool get_mci_path(TFilename& shell) const;
 | 
						|
  bool call_mci(TDocumento& doc, const TRectype& movimento);
 | 
						|
 | 
						|
public:
 | 
						|
  virtual void main_loop();
 | 
						|
};
 | 
						|
 | 
						|
const TString& TIndustriosa_app::conto_industriale(const TRiga_documento& row, TString& conto) const
 | 
						|
{                    
 | 
						|
  const TDocumento& doc = row.doc();
 | 
						|
  const bool acquisti = doc.get_char(DOC_TIPOCF) == 'F';
 | 
						|
  conto.cut(0);
 | 
						|
  if (row.is_merce())
 | 
						|
  {
 | 
						|
    const TRectype& rec = cache().get(LF_ANAMAG, row.get(RDOC_CODARTMAG));
 | 
						|
    conto = rec.get(acquisti ? ANAMAG_CONTOINDA : ANAMAG_CONTOINDV);
 | 
						|
  } else
 | 
						|
  if (row.is_prestazione())
 | 
						|
  {
 | 
						|
    const TRectype& rec = cache().get("PRS", row.get(RDOC_CODART));
 | 
						|
    conto = rec.get("S2");
 | 
						|
    if (acquisti)
 | 
						|
      conto = conto.mid(20,12);
 | 
						|
    else
 | 
						|
      conto = conto.left(12);
 | 
						|
    conto.trim();
 | 
						|
  }           
 | 
						|
  if (!conto.empty())
 | 
						|
  {
 | 
						|
    TString16 cnt;
 | 
						|
    cnt << conto.mid(1,2);
 | 
						|
    cnt << conto.mid(4,2);
 | 
						|
    cnt << conto.mid(6);
 | 
						|
    conto = cnt;
 | 
						|
  }
 | 
						|
  return conto;
 | 
						|
}
 | 
						|
 | 
						|
void TIndustriosa_app::trim_and_cut(TString& val, int len) const
 | 
						|
{
 | 
						|
  if (len > 0)
 | 
						|
  {
 | 
						|
    int zeroes = 0;
 | 
						|
    for (zeroes = 0; val[zeroes] == '0'; zeroes++);
 | 
						|
    if (zeroes > 0)
 | 
						|
      val.ltrim(zeroes);
 | 
						|
    val.cut(len);
 | 
						|
  }
 | 
						|
  else
 | 
						|
    val.cut(0);
 | 
						|
}
 | 
						|
 | 
						|
void TIndustriosa_app::get_field(const TDocumento& doc, const TRectype& mov, TCausale& causale, 
 | 
						|
                                 const TRectype& rec, const char* field, TString& val) const
 | 
						|
{
 | 
						|
  if (field[0] == '"' || field[0] == '\'')
 | 
						|
  {
 | 
						|
    val = field;
 | 
						|
    val.rtrim(1);
 | 
						|
    val.ltrim(1);
 | 
						|
  } else
 | 
						|
  if (field[0] == '_')
 | 
						|
  {
 | 
						|
    val.cut(0);
 | 
						|
    if (xvt_str_compare_ignoring_case(field, "_CANTIERE") == 0)
 | 
						|
    { 
 | 
						|
      TString cms, fas;
 | 
						|
      cms = rec.get(RDOC_CODCMS);
 | 
						|
      if (cms.blank())
 | 
						|
      {
 | 
						|
        cms = doc.get(DOC_CODCMS);                                   
 | 
						|
        fas = doc.get(DOC_FASCMS);
 | 
						|
      }
 | 
						|
      else
 | 
						|
        fas = rec.get(RDOC_FASCMS);
 | 
						|
      trim_and_cut(cms, _len_commessa);
 | 
						|
      trim_and_cut(fas, _len_fase);
 | 
						|
      val << cms << fas;
 | 
						|
    } else
 | 
						|
    if (xvt_str_compare_ignoring_case(field, "_CODCAUS") == 0)
 | 
						|
    {                 
 | 
						|
      val = causale.codice();
 | 
						|
    } else
 | 
						|
    if (xvt_str_compare_ignoring_case(field, "_CONINDU") == 0)
 | 
						|
    {
 | 
						|
      conto_industriale((TRiga_documento&)rec, val);
 | 
						|
    } else
 | 
						|
    if (xvt_str_compare_ignoring_case(field, "_IMPORTO") == 0)
 | 
						|
    {
 | 
						|
      TCurrency_documento imp(((TRiga_documento&)rec).importo(TRUE, FALSE), doc);
 | 
						|
      imp.change_to_firm_val();
 | 
						|
      val = imp.get_num().stringa();
 | 
						|
    } else
 | 
						|
    if (xvt_str_compare_ignoring_case(field, "_IMPORTOVAL") == 0)
 | 
						|
    {
 | 
						|
      if (doc.in_valuta())
 | 
						|
      {
 | 
						|
        const TCurrency_documento imp(((TRiga_documento&)rec).importo(TRUE, FALSE), doc);
 | 
						|
        val = imp.get_num().stringa();
 | 
						|
      }
 | 
						|
    } else
 | 
						|
    if (xvt_str_compare_ignoring_case(field, "_IMPOSTADOC") == 0)
 | 
						|
    {             
 | 
						|
      TString16 conto;                          
 | 
						|
      real impval;
 | 
						|
      for (int i = 1; i <= doc.physical_rows(); i++)
 | 
						|
      {
 | 
						|
        const TRiga_documento& rdoc = doc[i];
 | 
						|
        conto_industriale(rdoc, conto);
 | 
						|
        if (conto.not_empty())
 | 
						|
          impval += rdoc.imposta();
 | 
						|
      }
 | 
						|
      TCurrency_documento imposta(impval, doc);
 | 
						|
      imposta.change_to_firm_val();
 | 
						|
      val = imposta.get_num().stringa();  
 | 
						|
    } else
 | 
						|
    if (xvt_str_compare_ignoring_case(field, "_SEZIONE") == 0)
 | 
						|
    {
 | 
						|
      const char str[2] = { causale.sezione(2), '\0' };
 | 
						|
      val = str;
 | 
						|
    } else
 | 
						|
    if (xvt_str_compare_ignoring_case(field, "_TOTDOC") == 0)
 | 
						|
    {            
 | 
						|
      TString16 conto;                           
 | 
						|
      real totval;
 | 
						|
      for (int i = 1; i <= doc.physical_rows(); i++)
 | 
						|
      {
 | 
						|
        const TRiga_documento& rdoc = doc[i];
 | 
						|
        conto_industriale(rdoc, conto);
 | 
						|
        if (conto.not_empty())
 | 
						|
          totval += rdoc.importo(TRUE, FALSE);
 | 
						|
      }
 | 
						|
      TCurrency_documento tot(totval, doc);
 | 
						|
      tot.change_to_firm_val();
 | 
						|
      val = tot.get_num().stringa();   
 | 
						|
      if (val[0] == '-')
 | 
						|
        val.ltrim(1);
 | 
						|
    }
 | 
						|
  }
 | 
						|
  else
 | 
						|
  {
 | 
						|
    const TRectype* r = &rec;
 | 
						|
    if (strncmp(field, "33->", 4) == 0)
 | 
						|
    {  
 | 
						|
      r = &doc;
 | 
						|
      field += 4; 
 | 
						|
    }  else
 | 
						|
    if (strncmp(field, "23->", 4) == 0)
 | 
						|
    {
 | 
						|
      r = &mov;
 | 
						|
      field += 4; 
 | 
						|
    }
 | 
						|
 | 
						|
    const TFieldtypes ft = r->type(field);
 | 
						|
    switch (ft)
 | 
						|
    {
 | 
						|
    case _alfafld:
 | 
						|
      val = r->get(field);
 | 
						|
      if (r->num() == LF_DOC && val.not_empty() && real::is_real(val)) // Campo virtuale numerico
 | 
						|
      {
 | 
						|
        const real n(val);
 | 
						|
        val = n.stringa();
 | 
						|
      }
 | 
						|
      break;
 | 
						|
    case _nullfld: 
 | 
						|
      val.cut(0); 
 | 
						|
      break;
 | 
						|
    case _realfld:
 | 
						|
      { 
 | 
						|
        const real n(r->get(field));
 | 
						|
        if (!n.is_zero())
 | 
						|
        {
 | 
						|
          val = n.stringa();
 | 
						|
          if (val[0] == '-' && r->num() == LF_MOV && xvt_str_compare_ignoring_case(field, MOV_TOTDOC) == 0)
 | 
						|
            val.ltrim(1);
 | 
						|
        }
 | 
						|
        else
 | 
						|
          val.cut(0);  
 | 
						|
      }
 | 
						|
      break;
 | 
						|
    default: 
 | 
						|
      val = r->get(field); 
 | 
						|
      break;
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
bool TIndustriosa_app::filerr(const char* name) const
 | 
						|
{
 | 
						|
  return error_box("Impossibile accedere al file '%s'", name);
 | 
						|
}
 | 
						|
 | 
						|
bool TIndustriosa_app::get_mci_path(TFilename& shell) const
 | 
						|
{                                
 | 
						|
  char winpath[_MAX_PATH];
 | 
						|
  ::GetWindowsDirectory(winpath, sizeof(winpath));
 | 
						|
  
 | 
						|
  shell = winpath;
 | 
						|
  shell.add("mci4.ini");
 | 
						|
  
 | 
						|
  bool ok = FALSE;    
 | 
						|
      
 | 
						|
  if (shell.exist())
 | 
						|
  {    
 | 
						|
    TConfig mci4(shell, "Paths");
 | 
						|
    TString8 lcl = mci4.get("lcldrive");
 | 
						|
    
 | 
						|
    shell = mci4.get("inilocation");
 | 
						|
 | 
						|
    if (!lcl.empty())
 | 
						|
    {    
 | 
						|
      lcl.cut(1);
 | 
						|
      lcl << ":";
 | 
						|
      shell.insert(lcl);
 | 
						|
    }
 | 
						|
    shell.add("appl.ini");
 | 
						|
    if (shell.exist())
 | 
						|
    {
 | 
						|
      TConfig appl(shell, "Paths");
 | 
						|
      shell = appl.get("exelocation");
 | 
						|
      shell.insert(lcl);
 | 
						|
      
 | 
						|
      shell.add("mci.exe");
 | 
						|
      ok = shell.exist();
 | 
						|
      if (!ok)
 | 
						|
        filerr(shell);
 | 
						|
    }
 | 
						|
    else
 | 
						|
      filerr(shell);
 | 
						|
  }
 | 
						|
  else
 | 
						|
    filerr(shell);
 | 
						|
 | 
						|
  return ok;
 | 
						|
}
 | 
						|
 | 
						|
bool TIndustriosa_app::call_mci(TDocumento& doc, const TRectype& movimento)
 | 
						|
{
 | 
						|
  TConfig mci("ve6600.ini");
 | 
						|
  TString_array para;
 | 
						|
  mci.list_paragraphs(para);
 | 
						|
  
 | 
						|
  _len_commessa = mci.get_int("LCommessa", "General", -1, 20);
 | 
						|
  _len_fase = mci.get_int("LFase", "General", -1, 0);
 | 
						|
  
 | 
						|
  int pos =para.find("General");
 | 
						|
  if (pos >= 0)
 | 
						|
    para.destroy(pos, TRUE);
 | 
						|
  bool ok = FALSE;
 | 
						|
 | 
						|
  TFilename ininame; ininame.temp();
 | 
						|
  if (para.items() >= 2)
 | 
						|
  {
 | 
						|
    TConfig ini(ininame);
 | 
						|
  
 | 
						|
    TString val;
 | 
						|
  
 | 
						|
    TAssoc_array& hvar = mci.list_variables(para.row(0));
 | 
						|
    ini.set_paragraph(para.row(0));
 | 
						|
    
 | 
						|
    const TTipo_documento& td = doc.tipo(); 
 | 
						|
    const TString16 codcaus = td.causale();
 | 
						|
    TCausale causale(codcaus);
 | 
						|
    
 | 
						|
    FOR_EACH_ASSOC_STRING(hvar, obj, key, field)
 | 
						|
    {                   
 | 
						|
      get_field(doc, movimento, causale, movimento, field, val);
 | 
						|
      ini.set(key, val);
 | 
						|
    }
 | 
						|
  
 | 
						|
    TAssoc_array& rvar = mci.list_variables(para.row(1)); 
 | 
						|
    int i = 1;
 | 
						|
    
 | 
						|
    for (int r = 1; r <= doc.physical_rows(); r++)
 | 
						|
    {
 | 
						|
      const TRiga_documento& rdoc = doc[r];
 | 
						|
      TString16 conto;
 | 
						|
      conto_industriale(rdoc, conto);
 | 
						|
      if (conto.not_empty())
 | 
						|
      {
 | 
						|
        TString16 pr; pr.format("%s_%d", (const char*)para.row(1), i++); // Paragrafo riga contabile
 | 
						|
   
 | 
						|
        ini.set_paragraph(pr);
 | 
						|
        FOR_EACH_ASSOC_STRING(rvar, obj, key, field)
 | 
						|
        {                   
 | 
						|
          get_field(doc, movimento, causale, doc[r], field, val);
 | 
						|
          ini.set(key, val);
 | 
						|
        }
 | 
						|
      }
 | 
						|
    } 
 | 
						|
    mci.set_paragraph(para.row(0));  // Forza scrittura ultima riga
 | 
						|
  }
 | 
						|
  else
 | 
						|
    error_box("Il file ve6600.ini non e' valido");
 | 
						|
  
 | 
						|
  if (ininame.exist())  
 | 
						|
  {
 | 
						|
    TFilename shell;
 | 
						|
    if (get_mci_path(shell))
 | 
						|
    {
 | 
						|
      shell << " -c " << ininame << ',';
 | 
						|
      TExternal_app app(shell);
 | 
						|
      ok = app.run() == 0;
 | 
						|
      if (ok)
 | 
						|
      {
 | 
						|
        TConfig ini(ininame, para.row(0));
 | 
						|
        const TString16 oldnumreg = doc.get("NUMREGIND");
 | 
						|
        const TString16 newnumreg = ini.get("NumReg");
 | 
						|
        if (oldnumreg != newnumreg)
 | 
						|
        {
 | 
						|
          doc.put("NUMREGIND", newnumreg);
 | 
						|
          doc.rewrite();
 | 
						|
        }
 | 
						|
      }
 | 
						|
      else
 | 
						|
        error_box("Impossibile eseguire %s", (const char*)shell);
 | 
						|
    }
 | 
						|
    ::remove(ininame);
 | 
						|
  }
 | 
						|
  
 | 
						|
  return ok;
 | 
						|
}
 | 
						|
 | 
						|
void TIndustriosa_app::main_loop()
 | 
						|
{                  
 | 
						|
  if (argc() > 2)  
 | 
						|
  {
 | 
						|
    TFilename ininame;
 | 
						|
    ininame = argv(2);
 | 
						|
    ininame.ltrim(2); // toglie /i
 | 
						|
  
 | 
						|
    if (ininame.exist())
 | 
						|
    {            
 | 
						|
      open_files(LF_TAB, LF_TABCOM, LF_CAUSALI, LF_RCAUSALI, LF_DOC, LF_RIGHEDOC, LF_CLIFO, LF_CFVEN, LF_MOV, LF_ANAMAG, 0);
 | 
						|
      
 | 
						|
      TString8 para; para.format("%d", LF_DOC);
 | 
						|
      TConfig ini(ininame, para);
 | 
						|
      const char provv = ini.get(DOC_PROVV)[0];
 | 
						|
      const int anno = ini.get_int(DOC_ANNO);
 | 
						|
      const TString8 codnum = ini.get(DOC_CODNUM);
 | 
						|
      const long ndoc = ini.get_long(DOC_NDOC);
 | 
						|
      TDocumento doc(provv, anno, codnum, ndoc);
 | 
						|
      
 | 
						|
      para.format("%d", LF_MOV);
 | 
						|
      ini.set_paragraph(para);
 | 
						|
      const long numreg = ini.get_long(MOV_NUMREG);
 | 
						|
      const TRectype& mov = cache().get(LF_MOV, numreg);
 | 
						|
  
 | 
						|
      call_mci(doc, mov);
 | 
						|
    }
 | 
						|
    else
 | 
						|
      filerr(ininame);
 | 
						|
  }
 | 
						|
  else
 | 
						|
    error_box("Specificare il file con la transazione");
 | 
						|
}
 | 
						|
 | 
						|
//////  Esecuzione del programma  ///////////
 | 
						|
 | 
						|
int ve6600(int argc, char** argv)
 | 
						|
{
 | 
						|
  TIndustriosa_app app;
 | 
						|
  app.run(argc,argv, "Contabilizzazione industriale");
 | 
						|
  return 0;
 | 
						|
}
 |