Files correlati : Ricompilazione Demo : [ ] Commento :correzioni pro compilazione nuova 2.2 git-svn-id: svn://10.65.10.50/trunk@13389 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			425 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			425 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
#include <applicat.h>
 | 
						|
#include <automask.h>
 | 
						|
#include <browfile.h>
 | 
						|
#include <currency.h>
 | 
						|
#include <defmask.h>
 | 
						|
#include <relation.h>
 | 
						|
#include <viswin.h>
 | 
						|
#include <xvtility.h>
 | 
						|
 | 
						|
#include "../cg/cglib01.h"
 | 
						|
#include "../cg/cglib02.h"
 | 
						|
 | 
						|
#include "sc2.h"
 | 
						|
#include "sc2500.h"
 | 
						|
 | 
						|
#include <clifo.h>
 | 
						|
#include <nditte.h>
 | 
						|
#include <partite.h>
 | 
						|
#include <pconti.h>
 | 
						|
#include <rmov.h>
 | 
						|
#include <rcausali.h>
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
// Maschera principale
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
 | 
						|
class TConfronta_mask : public TAutomask
 | 
						|
{   
 | 
						|
  bool _running;
 | 
						|
  int _last_perc;
 | 
						|
  
 | 
						|
protected:
 | 
						|
  virtual bool on_field_event(TOperable_field& f, TField_event e, long jolly);
 | 
						|
 | 
						|
public:   
 | 
						|
  int esercizio_corrente() const;
 | 
						|
  
 | 
						|
  TImporto importo_riga(const TRectype& riga) const;
 | 
						|
  real calcola_saldo_partite(char tipoc, int g, int c, long s, bool is_default = FALSE) const;
 | 
						|
  
 | 
						|
  bool add_saldo(int g, int c, long s, const TString& d, real salc, real salp);
 | 
						|
  void show_progress(long pos, long tot);
 | 
						|
  void fill_browse();
 | 
						|
 | 
						|
  TConfronta_mask();
 | 
						|
  virtual ~TConfronta_mask() { }
 | 
						|
};
 | 
						|
 | 
						|
int TConfronta_mask::esercizio_corrente() const
 | 
						|
{
 | 
						|
  TEsercizi_contabili esc;
 | 
						|
  TDate oggi(TODAY);
 | 
						|
  return esc.date2esc(oggi);
 | 
						|
}
 | 
						|
 | 
						|
bool TConfronta_mask::add_saldo(int g, int c, long s, const TString& d, real salc, real salp)     //+
 | 
						|
{           
 | 
						|
  bool ok = !(salc.is_zero() && salp.is_zero()) && (salc != salp || get_bool(F_BILANCIATI));
 | 
						|
  if (ok)
 | 
						|
  {
 | 
						|
    char sezs = 'D';
 | 
						|
    real sals = salc - salp;
 | 
						|
    if (sals.sign() < 0)
 | 
						|
    {
 | 
						|
      sals = -sals;
 | 
						|
      sezs = 'A';
 | 
						|
    }
 | 
						|
    char sezc = 'D';
 | 
						|
    if (salc.sign() < 0)
 | 
						|
    {
 | 
						|
      salc = -salc;
 | 
						|
      sezc = 'A';
 | 
						|
    }
 | 
						|
    char sezp = 'D';
 | 
						|
    if (salp.sign() < 0)
 | 
						|
    {
 | 
						|
      salp = -salp;
 | 
						|
      sezp = 'A';
 | 
						|
    }
 | 
						|
    TString256 str;
 | 
						|
    TString80 i0, i1, i2, i3; 
 | 
						|
    const TCurrency impc(salc), impp(salp), imps(sals);
 | 
						|
    i0 = d.left(30);
 | 
						|
    i1.format("%17s %c", impc.string(TRUE), sezc);
 | 
						|
    i2.format("%17s %c", impp.string(TRUE), sezp);
 | 
						|
    i3.format("%17s %c", imps.string(TRUE), sezs);
 | 
						|
    str.format("%3d %3d %6ld %-30s %s %s %s", g, c, s, (const char*)i0, (const char*)i1, (const char*)i2, (const char*)i3); //+
 | 
						|
    
 | 
						|
    TBrowsefile_field& b = (TBrowsefile_field&)field(F_PREVIEW);
 | 
						|
    b.add_line(str);
 | 
						|
  }
 | 
						|
  return ok;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
TImporto TConfronta_mask::importo_riga(const TRectype& riga) const
 | 
						|
{
 | 
						|
  TImporto i(riga.get_char(PART_SEZ), riga.get_real(PART_IMPORTO));
 | 
						|
 | 
						|
  if (riga.get_int(PART_TIPOMOV) > 1) // Non e' una fattura
 | 
						|
  {               
 | 
						|
    const TString16 codval = riga.get(PART_CODVAL);
 | 
						|
    const bool in_valuta = is_true_value(codval);  // Determina se in valuta
 | 
						|
 | 
						|
    real abb = riga.get_real(PART_ABBUONI);
 | 
						|
    if (in_valuta)
 | 
						|
    {
 | 
						|
      TCurrency abbval(abb, codval, riga.get_real(PART_CAMBIO)); 
 | 
						|
      abbval.change_to_firm_val();
 | 
						|
      abb = abbval.get_num();
 | 
						|
    }  
 | 
						|
      
 | 
						|
    TImporto abbuoni(riga.get_char(PART_SEZABB), abb);  
 | 
						|
    i += abbuoni;
 | 
						|
      
 | 
						|
    if (in_valuta)
 | 
						|
    {
 | 
						|
      const TImporto diffcam(riga.get_char(PART_SEZDIFCAM), riga.get_real(PART_DIFFCAM));
 | 
						|
      i += diffcam;
 | 
						|
    }  
 | 
						|
    else
 | 
						|
    {
 | 
						|
      i.valore() += riga.get_real(PART_RITENUTE);
 | 
						|
 | 
						|
      const real ritsoc = riga.get_real(PART_RITSOC);
 | 
						|
      if (!ritsoc.is_zero())
 | 
						|
      {
 | 
						|
        TString16 key; key << riga.get(PART_CODCAUS) << "|14";  // Riga ritenute sociali
 | 
						|
        const char sezcaus = cache().get(LF_RCAUSALI, key, RCA_SEZIONE)[0];
 | 
						|
        const sezrs = sezcaus > ' ' ? (sezcaus == 'D' ? 'A' : 'D') : riga.get_char(PART_SEZ);
 | 
						|
        i += TImporto(sezrs, ritsoc);
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
  return i;
 | 
						|
}
 | 
						|
 | 
						|
real TConfronta_mask::calcola_saldo_partite(char tipoc, int g, int c, long s, bool is_default) const
 | 
						|
{ 
 | 
						|
  TRelation rel(LF_PARTITE);
 | 
						|
  TString filter = "(NRIGA!=9999)";
 | 
						|
  TRectype region(LF_PARTITE);
 | 
						|
  region.put(PART_TIPOCF, tipoc);
 | 
						|
  if (tipoc > ' ')
 | 
						|
  {
 | 
						|
    // Accetta anche GRUPPOCL nullo per ora
 | 
						|
    filter << "&&((GRUPPOCL=0)||((GRUPPOCL=" << g << ")&&(CONTOCL=" << c << ")))";
 | 
						|
  }
 | 
						|
  else
 | 
						|
  {
 | 
						|
    region.put(PART_GRUPPO, g);
 | 
						|
    region.put(PART_CONTO, c);
 | 
						|
  }
 | 
						|
  region.put(PART_SOTTOCONTO, s);
 | 
						|
  
 | 
						|
  TCursor part(&rel, filter, 1, ®ion, ®ion);
 | 
						|
  const TRecnotype items = part.items();
 | 
						|
  part.freeze();
 | 
						|
  
 | 
						|
  real saldo;
 | 
						|
  const TRectype& rec = part.curr();
 | 
						|
  for (part = 0; part.pos() < items; ++part)
 | 
						|
  {
 | 
						|
    if (tipoc > ' ' && rec.get_int(PART_GRUPPOCL) == 0)
 | 
						|
    {
 | 
						|
      int gprovv = 0, cprovv = 0;   // Conto cliente provvisorio
 | 
						|
      
 | 
						|
      // Cerco di determinare il conto dalla riga di movimento
 | 
						|
      const long numreg = rec.get_long(PART_NREG);
 | 
						|
      const int numrig = rec.get_int(PART_NUMRIG);
 | 
						|
      if (numreg > 0 && numrig > 0)
 | 
						|
      {                                                  
 | 
						|
        TString16 key; key.format("%ld|%d", numreg, numrig);
 | 
						|
        const TRectype& rmov = cache().get(LF_RMOV, key);
 | 
						|
        if (!rmov.empty())  // Ho trovato la riga contabile corrispondente
 | 
						|
        {
 | 
						|
          gprovv = rmov.get_int(RMV_GRUPPO);
 | 
						|
          cprovv = rmov.get_int(RMV_CONTO);
 | 
						|
        }
 | 
						|
      }
 | 
						|
      if (gprovv == 0 && is_default)  // Non ho trovato il movimento contabile
 | 
						|
      {
 | 
						|
        gprovv = g;
 | 
						|
        cprovv = c;
 | 
						|
      }
 | 
						|
      if (gprovv != g || cprovv != c) // Scarto la riga in quanto non corrispondente
 | 
						|
        continue;
 | 
						|
    }
 | 
						|
    
 | 
						|
    const TImporto imp = importo_riga(rec);
 | 
						|
    if (imp.sezione() == 'D')
 | 
						|
      saldo += imp.valore();
 | 
						|
    else
 | 
						|
      saldo -= imp.valore();
 | 
						|
  }
 | 
						|
  return saldo;
 | 
						|
}
 | 
						|
 | 
						|
void TConfronta_mask::show_progress(long pos, long tot)
 | 
						|
{
 | 
						|
  const int perc = int((pos+1) * 100L / tot);
 | 
						|
  if (perc != _last_perc)
 | 
						|
  {
 | 
						|
    TString80 str; str.format(FR("%d%% completato"), perc);
 | 
						|
    xvtil_statbar_set(str);
 | 
						|
    _last_perc = perc;
 | 
						|
    do_events();
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
void TConfronta_mask::fill_browse()
 | 
						|
{                   
 | 
						|
  TWait_cursor hourglass;
 | 
						|
  TBrowsefile_field& b = (TBrowsefile_field&)field(F_PREVIEW);
 | 
						|
  TViswin& w = b.vis_win();
 | 
						|
  w.destroy_lines();
 | 
						|
//crea la nuova intestazione
 | 
						|
  TString intestazione;
 | 
						|
	const long firm = main_app().get_firm();
 | 
						|
  const TString & ragsoc = cache().get(LF_NDITTE, firm, NDT_RAGSOC);
 | 
						|
 | 
						|
  intestazione << FR("@bDitta ") << firm;
 | 
						|
  intestazione << " " << ragsoc; 
 | 
						|
  intestazione.rpad(97);
 | 
						|
  TDate oggi(TODAY);
 | 
						|
  intestazione << oggi;
 | 
						|
     
 | 
						|
  b.add_line(intestazione);
 | 
						|
  b.add_line(FR("@bSTAMPA CONTROLLO SALDI"));
 | 
						|
  b.add_line("@b_________________________________________________________________________________________________________");
 | 
						|
  b.add_line("");
 | 
						|
  b.add_line(FR("@bGrp Cnt Sottoc Descrizione                        Saldo Contabile       Saldo Partite           Sbilancio"));
 | 
						|
  b.add_line("@b_________________________________________________________________________________________________________");
 | 
						|
  b.add_line("");
 | 
						|
 | 
						|
  TToken_string str;
 | 
						|
  
 | 
						|
  TSaldo sld;
 | 
						|
  const int annoes = esercizio_corrente();
 | 
						|
  const char tipoc = get(F_TIPOC)[0];
 | 
						|
  _running = TRUE;
 | 
						|
  
 | 
						|
  xvtil_statbar_set(TR("Inizializzazione..."));
 | 
						|
  _last_perc = -1;
 | 
						|
  do_events();
 | 
						|
 | 
						|
  if (tipoc <= ' ')
 | 
						|
  {
 | 
						|
    TRelation rel(LF_PCON); 
 | 
						|
    TRectype da_con(LF_PCON), a_con(LF_PCON);
 | 
						|
    da_con.put(PCN_GRUPPO, get(F_GRUPPO));
 | 
						|
    da_con.put(PCN_CONTO, get(F_CONTO));
 | 
						|
    da_con.put(PCN_SOTTOCONTO, get(F_SOTTOCONTO));
 | 
						|
    a_con.put(PCN_GRUPPO, get(F_AGRUPPO));
 | 
						|
    a_con.put(PCN_CONTO, get(F_ACONTO));
 | 
						|
    a_con.put(PCN_SOTTOCONTO, get(F_ASOTTOCONTO));
 | 
						|
    TCursor piano(&rel, "SOTTOCONTO!=\"\"", 1, &da_con, &a_con);
 | 
						|
    const TRecnotype items = piano.items();
 | 
						|
    piano.freeze();
 | 
						|
    const TRectype& rec = piano.curr();
 | 
						|
    for (piano = 0; piano.pos() < items && _running; ++piano)
 | 
						|
    { 
 | 
						|
      show_progress(piano.pos(), items);
 | 
						|
      const int g = rec.get_int(PCN_GRUPPO);
 | 
						|
      const int c = rec.get_int(PCN_CONTO);
 | 
						|
      const long s = rec.get_long(PCN_SOTTOCONTO);
 | 
						|
      const TString d = piano.curr().get(PCN_DESCR); //+
 | 
						|
      
 | 
						|
      str.format("%d|%d", g, c);       
 | 
						|
      const int indbil = cache().get(LF_PCON, str).get_int(PCN_INDBIL);
 | 
						|
      sld.ultima_immissione_bilancio(annoes, g, c, s, indbil, 1);
 | 
						|
      const real salc = sld.saldo();
 | 
						|
      const real salp = calcola_saldo_partite(' ', g, c, s);
 | 
						|
      add_saldo(g, c, s, d, salc, salp);   //+
 | 
						|
    }
 | 
						|
  }
 | 
						|
  else
 | 
						|
  {
 | 
						|
    TString_array conti;
 | 
						|
    if (get_int(F_CONTO) > 0)
 | 
						|
    {
 | 
						|
      str.cut(0) << get(F_GRUPPO) << '|' << get(F_CONTO);
 | 
						|
      conti.add(str);
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
      TRelation rel(LF_PCON);
 | 
						|
      str.cut(0) << PCN_TMCF << "==\"" << tipoc << '\"';
 | 
						|
      TCursor pcon(&rel, str);
 | 
						|
      const TRecnotype conticf = pcon.items();    
 | 
						|
      for (pcon = 0; pcon.pos() < conticf; ++pcon)
 | 
						|
      {
 | 
						|
        str = pcon.curr().get(PCN_GRUPPO);
 | 
						|
        str << '|' << pcon.curr().get(PCN_CONTO);
 | 
						|
        conti.add(str);
 | 
						|
      }
 | 
						|
    }
 | 
						|
    for (int c = conti.last(); c >= 0; c--)
 | 
						|
    {                                                
 | 
						|
      TToken_string& k = conti.row(c);
 | 
						|
      const TRectype& pcon = cache().get(LF_PCON, k);
 | 
						|
      if (!pcon.empty())
 | 
						|
        k.add(pcon.get(PCN_INDBIL));
 | 
						|
    }
 | 
						|
 | 
						|
    TRelation rel(LF_CLIFO); 
 | 
						|
    TRectype da_cli(LF_CLIFO), a_cli(LF_CLIFO);   
 | 
						|
    da_cli.put(CLI_TIPOCF, tipoc);
 | 
						|
    da_cli.put(CLI_CODCF, get(F_SOTTOCONTO));
 | 
						|
    a_cli.put(CLI_TIPOCF, get(F_TIPOC));
 | 
						|
    a_cli.put(CLI_CODCF, get(F_ASOTTOCONTO));
 | 
						|
    TCursor clienti(&rel, "", 1, &da_cli, &a_cli);
 | 
						|
    const TRecnotype items = clienti.items();
 | 
						|
    clienti.freeze();
 | 
						|
    
 | 
						|
    for (clienti = 0; clienti.pos() < items && _running; ++clienti)
 | 
						|
    {      
 | 
						|
      show_progress(clienti.pos(), items);
 | 
						|
      const int def_grp = clienti.curr().get_int(CLI_GRUPPO);
 | 
						|
      const int def_cnt = clienti.curr().get_int(CLI_CONTO);
 | 
						|
      int def_conto = 0;  // Per il momento assumiamo che il conto di default sia il primo
 | 
						|
      for (int i = 0; i < conti.items() && _running; i++)
 | 
						|
      {               
 | 
						|
        str = conti.row(i);
 | 
						|
        const int  g = str.get_int(0);
 | 
						|
        const int  c = str.get_int(1);
 | 
						|
        const long s = clienti.curr().get_long(CLI_CODCF);
 | 
						|
        const TString d = clienti.curr().get(CLI_RAGSOC);    //+
 | 
						|
        const int indbil = str.get_int(2);
 | 
						|
        if (g == def_grp && c == def_cnt)  // Abbiamo trovato il vero conto di default
 | 
						|
          def_conto = i;
 | 
						|
        sld.ultima_immissione_bilancio(annoes, g, c, s, indbil, 1);
 | 
						|
        const real salc = sld.saldo();
 | 
						|
        const real salp = calcola_saldo_partite(tipoc, g, c, s, def_conto == i);
 | 
						|
        add_saldo(g, c, s, d, salc, salp);     //+
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
  _running = FALSE;
 | 
						|
  w.goto_top();
 | 
						|
}
 | 
						|
 | 
						|
bool TConfronta_mask::on_field_event(TOperable_field& f, TField_event e, long jolly)
 | 
						|
{     
 | 
						|
  switch (f.dlg())
 | 
						|
  {       
 | 
						|
  case DLG_ELABORA:
 | 
						|
    if (e == fe_button)
 | 
						|
    {                       
 | 
						|
      // disabilito campi di selezione e bottone elabora
 | 
						|
      disable(-4);
 | 
						|
      field(DLG_PRINT).set_focus();                                      
 | 
						|
      // sostituisco elabora con annulla
 | 
						|
      hide(DLG_ELABORA); show(F_CANCEL);
 | 
						|
      // elaborazione
 | 
						|
      fill_browse(); 
 | 
						|
      // sostituisco annulla con elabora
 | 
						|
      hide(F_CANCEL); show(DLG_ELABORA);
 | 
						|
      // abilito bottone stampa
 | 
						|
      enable(-6);
 | 
						|
    }  
 | 
						|
    break;
 | 
						|
  case F_CANCEL:
 | 
						|
    if (e == fe_button)
 | 
						|
      _running = FALSE;
 | 
						|
    break;    
 | 
						|
  case DLG_PRINT:
 | 
						|
    if (e == fe_button)
 | 
						|
    {
 | 
						|
      TBrowsefile_field& b = (TBrowsefile_field&)field(F_PREVIEW);
 | 
						|
      TViswin& w = b.vis_win();
 | 
						|
      TTextfile& f = w.text();
 | 
						|
      f.print();
 | 
						|
    }
 | 
						|
    break;    
 | 
						|
  case F_AZZERA:
 | 
						|
    if (e == fe_button)
 | 
						|
    {                             
 | 
						|
      // azzero il campo risultato della stampa
 | 
						|
      TBrowsefile_field& b = (TBrowsefile_field&)field(F_PREVIEW);
 | 
						|
      TViswin& w = b.vis_win();
 | 
						|
      w.destroy_lines();
 | 
						|
      w.goto_top();
 | 
						|
      // disabilito bottone stampa
 | 
						|
      disable(-6);     
 | 
						|
      // abilito campi di selezione e bottone elabora
 | 
						|
      enable(-4);
 | 
						|
    }
 | 
						|
    break;  
 | 
						|
  default:
 | 
						|
    break;
 | 
						|
  }
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
TConfronta_mask::TConfronta_mask()
 | 
						|
               : TAutomask("sc2500"), _running(FALSE)
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
// Applicazione principale
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
 | 
						|
class TConfronta_saldi : public TSkeleton_application
 | 
						|
{
 | 
						|
public:  
 | 
						|
  virtual void main_loop();
 | 
						|
};        
 | 
						|
 | 
						|
void TConfronta_saldi::main_loop()
 | 
						|
{   
 | 
						|
  open_files(LF_TAB, LF_TABCOM, LF_PCON, LF_CLIFO, LF_SALDI, 
 | 
						|
             LF_RCAUSALI, LF_PARTITE, LF_RMOV, 0);
 | 
						|
  TConfronta_mask m;
 | 
						|
  while (m.run() != K_QUIT);
 | 
						|
}
 | 
						|
 | 
						|
int sc2500(int argc, char** argv)     
 | 
						|
{
 | 
						|
  TConfronta_saldi app;
 | 
						|
  app.run(argc, argv, TR("Stampa controllo saldi"));
 | 
						|
  return 0;
 | 
						|
}
 |