435 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			435 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
#include <relapp.h>
 | 
						|
#include <defmask.h>
 | 
						|
#include <pconti.h>
 | 
						|
#include <saldi.h>
 | 
						|
 | 
						|
#include "cg0.h"
 | 
						|
#include "cg0100.h"
 | 
						|
 | 
						|
#define ATTIVITA 1
 | 
						|
#define PASSIVITA 2
 | 
						|
#define COSTI 3
 | 
						|
#define RICAVI 4
 | 
						|
#define ORDINE 5
 | 
						|
 | 
						|
class CG0100_application : public TRelation_application
 | 
						|
{
 | 
						|
  TMask* _msk;
 | 
						|
  TRelation *_rel;
 | 
						|
  TLocalisamfile* _saldi;
 | 
						|
  TLocalisamfile* _tabcom;
 | 
						|
  bool _pcon_com;
 | 
						|
 | 
						|
  bool user_create();
 | 
						|
  bool user_destroy();
 | 
						|
  virtual TMask* get_mask(int mode) {return _msk;}
 | 
						|
  virtual bool changing_mask(int mode) {return FALSE;}
 | 
						|
  virtual bool protected_record(TRectype &rec);
 | 
						|
  virtual void init_query_mode(TMask& m);
 | 
						|
  virtual void init_insert_mode(TMask& m);
 | 
						|
  virtual void init_modify_mode(TMask& m) {init_insert_mode(m);}
 | 
						|
  virtual int write(const TMask& m);
 | 
						|
  virtual int rewrite(const TMask & m);
 | 
						|
  virtual int read(TMask& m);
 | 
						|
  virtual void on_firm_change();
 | 
						|
 | 
						|
public:
 | 
						|
  virtual TRelation* get_relation() const {return _rel;}
 | 
						|
  CG0100_application() : _pcon_com(FALSE) {}
 | 
						|
};
 | 
						|
HIDDEN inline CG0100_application & app() { return (CG0100_application &) main_app();}
 | 
						|
 | 
						|
 | 
						|
int CG0100_application::read(TMask& m) 
 | 
						|
 | 
						|
{
 | 
						|
  const TRelation *r = get_relation();
 | 
						|
  m.autoload(r);
 | 
						|
  if (m.get(FLD_CM1_LETTIVD).empty())
 | 
						|
  {
 | 
						|
    int sezivd = m.get_int(FLD_CM1_SEZIVD);
 | 
						|
    if (sezivd == 1 || sezivd == 2)
 | 
						|
      m.set(FLD_CM1_SEZIVD, sezivd + 5);
 | 
						|
  }
 | 
						|
  if (m.get(FLD_CM1_LETTIVDOPP).empty())
 | 
						|
  {
 | 
						|
    int sezivd = m.get_int(FLD_CM1_SEZIVDOPP);
 | 
						|
    if (sezivd == 1 || sezivd == 2)
 | 
						|
      m.set(FLD_CM1_SEZIVDOPP, sezivd + 5);
 | 
						|
  }
 | 
						|
  return NOERR;
 | 
						|
}
 | 
						|
 | 
						|
int CG0100_application::rewrite(const TMask& m) 
 | 
						|
 | 
						|
{
 | 
						|
  TRelation *r = get_relation();
 | 
						|
 | 
						|
  m.autosave(r);
 | 
						|
  int sezivd = m.get_int(FLD_CM1_SEZIVD);
 | 
						|
  TString16 sez;
 | 
						|
  
 | 
						|
  if (sezivd == 6 || sezivd == 7)
 | 
						|
  {
 | 
						|
    sez.format("%d", sezivd - 5);
 | 
						|
    r->lfile().put(PCN_SEZIVD, sez);
 | 
						|
  }         
 | 
						|
  sezivd = m.get_int(FLD_CM1_SEZIVDOPP);
 | 
						|
  if (sezivd == 6 || sezivd == 7)
 | 
						|
  {
 | 
						|
    sez.format("%d", sezivd - 5);
 | 
						|
    r->lfile().put(PCN_SEZIVDOPP, sez);
 | 
						|
  }         
 | 
						|
  const int err = r->rewrite();
 | 
						|
  if (err == NOERR)
 | 
						|
  {
 | 
						|
    const long sottoconto = m.get_long(FLD_CM1_SOTTOCONTO);
 | 
						|
    if (sottoconto == 0)
 | 
						|
    {
 | 
						|
      const TString16 cod_anbi(m.get(FLD_CM1_CODTABANALISI));
 | 
						|
      
 | 
						|
      if (cod_anbi.not_empty())
 | 
						|
      {        
 | 
						|
        r->save_status();              
 | 
						|
        TLocalisamfile & pcon = r->lfile();                        
 | 
						|
        TRectype rec_pcon(r->curr()) ;
 | 
						|
        
 | 
						|
        rec_pcon.zero();
 | 
						|
        rec_pcon.put(PCN_GRUPPO, m.get(FLD_CM1_GRUPPO));
 | 
						|
        rec_pcon.put(PCN_CONTO, m.get(FLD_CM1_CONTO));
 | 
						|
        pcon.curr() = rec_pcon;
 | 
						|
        for (pcon.read(_isgreat, _lock); pcon.good() && pcon.curr() <= rec_pcon; pcon.next(_lock))
 | 
						|
        {
 | 
						|
          if (pcon.get(PCN_CODCBL).not_empty())
 | 
						|
          {
 | 
						|
            pcon.zero(PCN_CODCBL);
 | 
						|
            pcon.rewrite();
 | 
						|
          }
 | 
						|
        }
 | 
						|
        r->restore_status();
 | 
						|
      }                             
 | 
						|
    }
 | 
						|
  }
 | 
						|
  return err;
 | 
						|
}
 | 
						|
 | 
						|
int CG0100_application::write(const TMask& m) 
 | 
						|
 | 
						|
{
 | 
						|
  TRelation *r = get_relation();
 | 
						|
  TString16 sez;
 | 
						|
 | 
						|
  m.autosave(r);
 | 
						|
  int sezivd = m.get_int(FLD_CM1_SEZIVD);
 | 
						|
  
 | 
						|
  if (sezivd == 6 || sezivd == 7)
 | 
						|
  {
 | 
						|
    sez.format("%d", sezivd - 5);
 | 
						|
    r->lfile().put(PCN_SEZIVD, sez);
 | 
						|
  }
 | 
						|
  sezivd = m.get_int(FLD_CM1_SEZIVDOPP);
 | 
						|
  if (sezivd == 6 || sezivd == 7)
 | 
						|
  {
 | 
						|
    sez.format("%d", sezivd - 5);
 | 
						|
    r->lfile().put(PCN_SEZIVDOPP, sez);
 | 
						|
  }
 | 
						|
  return r->write();
 | 
						|
}
 | 
						|
 | 
						|
// Controlla se puo' essere effettuata la cancellazione di un conto
 | 
						|
void CG0100_application::on_firm_change()
 | 
						|
{
 | 
						|
  TDir d;
 | 
						|
  d.get(LF_PCON, _nolock, _nordir, _sysdirop);
 | 
						|
  _pcon_com = d.is_com();
 | 
						|
}
 | 
						|
 | 
						|
bool CG0100_application::protected_record(TRectype &rec)
 | 
						|
{                           
 | 
						|
  if (_pcon_com ) return TRUE;
 | 
						|
  TMask* m = get_mask(MODE_MOD);
 | 
						|
  TLocalisamfile& pconti = _rel->lfile();
 | 
						|
  const int gruppo = atoi(m->get(FLD_CM1_GRUPPO));
 | 
						|
  const int conto = atoi(m->get(FLD_CM1_CONTO));
 | 
						|
  const long  sottoc = atol(m->get(FLD_CM1_SOTTOCONTO));
 | 
						|
 | 
						|
  // Se e' un sottoconto posso cancellarlo se non esistono saldi
 | 
						|
  if ((gruppo != 0) && (conto != 0) && (sottoc != 0))
 | 
						|
  {
 | 
						|
    _saldi->zero();
 | 
						|
    _saldi->put(PCN_GRUPPO, gruppo);
 | 
						|
    _saldi->put(PCN_CONTO, conto);
 | 
						|
    _saldi->put(PCN_SOTTOCONTO, sottoc);
 | 
						|
    _saldi->read(_isgteq);
 | 
						|
    bool ok = FALSE;
 | 
						|
    
 | 
						|
    if (_saldi->good())
 | 
						|
      ok = _saldi->get_real(SLD_SALDO) != ZERO ||
 | 
						|
        _saldi->get_real(SLD_PDARE) != ZERO ||
 | 
						|
          _saldi->get_real(SLD_PAVERE) != ZERO ||
 | 
						|
            _saldi->get_real(SLD_PDARESCA) != ZERO ||
 | 
						|
              _saldi->get_real(SLD_PAVERESCA) != ZERO ||
 | 
						|
                _saldi->get_real(SLD_PDAREPRO) != ZERO ||
 | 
						|
                  _saldi->get_real(SLD_PAVEREPRO) != ZERO;
 | 
						|
    return ok && gruppo ==_saldi->get_int(PCN_GRUPPO) &&
 | 
						|
      conto ==_saldi->get_int(PCN_CONTO) &&
 | 
						|
        sottoc ==_saldi->get_long(PCN_SOTTOCONTO);
 | 
						|
  }
 | 
						|
  get_relation()->save_status();
 | 
						|
  pconti.zero() ;
 | 
						|
  pconti.put(PCN_GRUPPO, gruppo);
 | 
						|
  // Se e' un conto controllo se ha dei sottoconti
 | 
						|
  if (conto != 0)
 | 
						|
    pconti.put(PCN_CONTO, conto);
 | 
						|
  TRectype rec1(pconti.curr());
 | 
						|
 | 
						|
  pconti.setkey(1) ;
 | 
						|
  pconti.read();
 | 
						|
  pconti.next();
 | 
						|
  const bool  prot = (pconti.good() && (pconti.curr() == rec1));
 | 
						|
  get_relation()->restore_status();
 | 
						|
  return prot;
 | 
						|
}
 | 
						|
 | 
						|
void CG0100_application::init_query_mode(TMask& m)
 | 
						|
 | 
						|
{
 | 
						|
  m.show(-1);
 | 
						|
  m.show(-2);
 | 
						|
  m.show(-3);
 | 
						|
}
 | 
						|
 | 
						|
HIDDEN bool tmcf_handler(TMask_field& f, KEY key)
 | 
						|
 | 
						|
{     
 | 
						|
  if (f.active() && key == K_SPACE)
 | 
						|
  {
 | 
						|
    TMask& m = f.mask();
 | 
						|
    const int conto = atoi(m.get(FLD_CM1_CONTO));
 | 
						|
    const long sottoc = atol(m.get(FLD_CM1_SOTTOCONTO));
 | 
						|
    const bool enable_sezsaldi = (sottoc != 0) || (sottoc == 0 && conto != 0 && m.get(FLD_CM1_TMCF).not_empty());
 | 
						|
 | 
						|
    m.show(FLD_CM2_SEZSALDI, enable_sezsaldi);
 | 
						|
  }
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void CG0100_application::init_insert_mode(TMask& m)
 | 
						|
 | 
						|
{
 | 
						|
  const int gruppo = atoi(m.get(FLD_CM1_GRUPPO));
 | 
						|
  const int conto = atoi(m.get(FLD_CM1_CONTO));
 | 
						|
  const long sottoc = atol(m.get(FLD_CM1_SOTTOCONTO));
 | 
						|
  bool ivd_enable = TRUE;
 | 
						|
 | 
						|
  if (conto == 0 && sottoc == 0)
 | 
						|
    m.show(-1, FALSE);
 | 
						|
  else
 | 
						|
    if (sottoc == 0)
 | 
						|
      m.show(-2, FALSE);
 | 
						|
    else
 | 
						|
      m.show(-3, FALSE);
 | 
						|
 | 
						|
  TLocalisamfile& pconti = _rel->lfile();
 | 
						|
  TString s(15), s2(1), s3(8), s4(2);
 | 
						|
  int s1 = 0;
 | 
						|
 | 
						|
  pconti.setkey(1) ;
 | 
						|
 | 
						|
  int indbil = 0;
 | 
						|
 | 
						|
  if (sottoc != 0)
 | 
						|
  {
 | 
						|
    pconti.zero();
 | 
						|
    pconti.put(PCN_GRUPPO, gruppo);
 | 
						|
    pconti.put(PCN_CONTO, conto);
 | 
						|
    pconti.read();
 | 
						|
    if (pconti.good())
 | 
						|
    {
 | 
						|
      s = pconti.get(PCN_CODCBL);
 | 
						|
      s1 = atoi(pconti.get(PCN_SEZIVD));
 | 
						|
      s2 = pconti.get(PCN_LETTIVD);
 | 
						|
      s3 = pconti.get(PCN_NUMRIVD);
 | 
						|
      s4 = pconti.get(PCN_NUMIVD);
 | 
						|
      indbil = pconti.get_int(PCN_INDBIL);
 | 
						|
    }
 | 
						|
    ivd_enable =  (s1 == 0) && s2.empty() && s3.empty() && s4.empty();
 | 
						|
  }
 | 
						|
  m.show(FLD_CM1_RICSER, indbil == PASSIVITA || indbil == RICAVI);
 | 
						|
  if (conto != 0)
 | 
						|
  {
 | 
						|
    m.enable(FLD_CM1_SEZIVD, ivd_enable);
 | 
						|
    m.show(FLD_CM1_LETTIVD, ivd_enable);
 | 
						|
    m.show(FLD_CM1_NUMRIVD, ivd_enable);
 | 
						|
    m.show(FLD_CM1_NUMIVD, ivd_enable);
 | 
						|
    m.show(FLD_CM1_LETTIVDH, !ivd_enable);
 | 
						|
    m.show(FLD_CM1_NUMRIVDH, !ivd_enable);
 | 
						|
    m.show(FLD_CM1_NUMIVDH, !ivd_enable);
 | 
						|
    if (!ivd_enable)
 | 
						|
    {
 | 
						|
      m.set(FLD_CM1_SEZIVD, s1);
 | 
						|
      m.set(FLD_CM1_LETTIVDH, s2);
 | 
						|
      m.set(FLD_CM1_NUMRIVDH, s3);
 | 
						|
      m.set(FLD_CM1_NUMIVDH, s4);
 | 
						|
      m.enable(FLD_CM1_SEZIVDOPP);
 | 
						|
    }
 | 
						|
    pconti.zero();
 | 
						|
    pconti.put(PCN_GRUPPO, gruppo);
 | 
						|
    pconti.read();
 | 
						|
    if (pconti.good()) 
 | 
						|
      if (s.empty()) s = pconti.get(PCN_CODCBL);
 | 
						|
  }
 | 
						|
  if (s.not_empty())
 | 
						|
  {
 | 
						|
    m.set(FLD_CM1_CODANALISIH, s);     
 | 
						|
    m.show(FLD_CM1_CODANALISIH);
 | 
						|
    m.hide(FLD_CM1_CODTABANALISI);
 | 
						|
    m.disable(FLD_CM1_DESCRANALISI);
 | 
						|
  }
 | 
						|
  else
 | 
						|
  {
 | 
						|
    m.show(FLD_CM1_CODTABANALISI);
 | 
						|
    m.hide(FLD_CM1_CODANALISIH);
 | 
						|
    m.enable(FLD_CM1_DESCRANALISI);
 | 
						|
  }
 | 
						|
  const bool enable_sezsaldi = (sottoc != 0) || (sottoc == 0 && conto != 0 && m.get(FLD_CM1_TMCF).not_empty());
 | 
						|
  m.show(FLD_CM2_SEZSALDI, enable_sezsaldi);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
HIDDEN bool gruppo_handler(TMask_field& f, KEY key)
 | 
						|
{
 | 
						|
  TMask& m    = f.mask();
 | 
						|
  const int gruppo  = m.get_int(FLD_CM1_GRUPPO);
 | 
						|
  const int conto   = m.get_int(FLD_CM1_CONTO);
 | 
						|
  const long sottoc = m.get_long(FLD_CM1_SOTTOCONTO);
 | 
						|
  
 | 
						|
  if (key == K_ENTER)
 | 
						|
  {
 | 
						|
    TLocalisamfile& pconti = app().get_relation()->lfile();
 | 
						|
    if (gruppo != 0 && conto != 0)
 | 
						|
    {
 | 
						|
      pconti.zero() ;
 | 
						|
      pconti.put(PCN_GRUPPO, gruppo) ;
 | 
						|
      pconti.setkey(1) ;
 | 
						|
      pconti.read();
 | 
						|
      if (pconti.bad())
 | 
						|
        return f.warning_box ("Il gruppo non esiste");
 | 
						|
    }
 | 
						|
  }
 | 
						|
  else
 | 
						|
    if (m.query_mode() && key == K_TAB)
 | 
						|
    {                     
 | 
						|
      const int next = m.next_fld();  
 | 
						|
      bool key_ok = TRUE;
 | 
						|
      
 | 
						|
      if (sottoc > 0)
 | 
						|
        key_ok = gruppo > 0 && conto > 0;
 | 
						|
      else  
 | 
						|
        if (conto > 0)
 | 
						|
          key_ok = gruppo > 0;
 | 
						|
      if (key_ok && next != DLG_NULL && next != f.dlg() && 
 | 
						|
          !m.field(next).in_key(1))
 | 
						|
        return m.stop_run(K_AUTO_ENTER);
 | 
						|
    }
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
HIDDEN bool conto_handler(TMask_field& f, KEY key)
 | 
						|
{
 | 
						|
  TMask& m    = f.mask();
 | 
						|
  const int gruppo  = m.get_int(FLD_CM1_GRUPPO);
 | 
						|
  const int conto   = m.get_int(FLD_CM1_CONTO);
 | 
						|
  const long sottoc = m.get_long(FLD_CM1_SOTTOCONTO);
 | 
						|
  
 | 
						|
  if (key == K_ENTER)
 | 
						|
  {
 | 
						|
    TLocalisamfile& pconti = app().get_relation()->lfile();
 | 
						|
 | 
						|
    if (gruppo != 0 && conto != 0 && sottoc != 0)
 | 
						|
    {
 | 
						|
      pconti.zero() ;
 | 
						|
      pconti.put(PCN_GRUPPO, gruppo) ;
 | 
						|
      pconti.put(PCN_CONTO, conto) ;
 | 
						|
      pconti.setkey(1) ;
 | 
						|
      pconti.read();
 | 
						|
      if (pconti.bad())
 | 
						|
        return m.field(FLD_CM1_CONTO).warning_box ("Il conto non esiste");
 | 
						|
      else
 | 
						|
      {
 | 
						|
        if (pconti.get(PCN_TMCF).not_empty())
 | 
						|
          return m.field(FLD_CM1_SOTTOCONTO).warning_box ("Non e' possibile inserire un sottoconto di un conto relativo ad un cliente/fornitore");
 | 
						|
      }
 | 
						|
    }
 | 
						|
  } 
 | 
						|
  else
 | 
						|
    if (m.query_mode() && key == K_TAB)
 | 
						|
    {                     
 | 
						|
      const int next = m.next_fld();
 | 
						|
      bool key_ok = TRUE;
 | 
						|
      
 | 
						|
      if (sottoc > 0)
 | 
						|
        key_ok = gruppo > 0 && conto > 0;
 | 
						|
      else  
 | 
						|
        if (conto > 0)
 | 
						|
          key_ok = gruppo > 0;
 | 
						|
      if (key_ok && next != DLG_NULL && next != f.dlg() && 
 | 
						|
          !m.field(next).in_key(1))
 | 
						|
        return m.stop_run(K_AUTO_ENTER);
 | 
						|
    }
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
HIDDEN bool sottoc_handler(TMask_field& f, KEY key)
 | 
						|
{
 | 
						|
  TMask& m    = f.mask();
 | 
						|
  if (m.query_mode() && key == K_TAB)
 | 
						|
  {                     
 | 
						|
    const int gruppo  = m.get_int(FLD_CM1_GRUPPO);
 | 
						|
    const int conto   = m.get_int(FLD_CM1_CONTO);
 | 
						|
    const long sottoc = m.get_long(FLD_CM1_SOTTOCONTO);
 | 
						|
    const int next = m.next_fld();
 | 
						|
 | 
						|
    if (gruppo == 0) return TRUE;
 | 
						|
    if (sottoc != 0 && conto == 0) 
 | 
						|
      return m.field(FLD_CM1_CONTO).error_box("Manca il conto");
 | 
						|
    if (next != DLG_NULL && next != f.dlg() && !m.field(next).in_key(1))
 | 
						|
      return m.stop_run(K_AUTO_ENTER);
 | 
						|
  }
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
bool CG0100_application::user_create()
 | 
						|
{
 | 
						|
  _msk = new TMask("cg0100a") ;
 | 
						|
  _msk->set_handler(FLD_CM1_GRUPPO, gruppo_handler);
 | 
						|
  _msk->set_handler(FLD_CM1_CONTO, conto_handler);
 | 
						|
  _msk->set_handler(FLD_CM1_SOTTOCONTO, sottoc_handler);
 | 
						|
  _msk->set_handler(FLD_CM1_TMCF, tmcf_handler);
 | 
						|
 | 
						|
  _rel = new TRelation(LF_PCON);
 | 
						|
  _saldi = new TLocalisamfile(LF_SALDI);
 | 
						|
  _saldi->setkey(2);
 | 
						|
  set_search_field(FLD_CM1_GRUPPO);
 | 
						|
 | 
						|
 | 
						|
  return TRUE;
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
bool CG0100_application::user_destroy()
 | 
						|
{
 | 
						|
  delete  _msk;
 | 
						|
  delete _rel;
 | 
						|
  delete _saldi;
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
int cg0100(int argc, char* argv[])
 | 
						|
{
 | 
						|
  CG0100_application a ;
 | 
						|
  a.run(argc, argv, "Piano dei conti");
 | 
						|
  return 0;
 | 
						|
}
 |