789 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			789 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
#include <config.h>
 | 
						|
#include <tabutil.h>
 | 
						|
#include <utility.h>
 | 
						|
#include <urldefid.h>
 | 
						|
#include <execp.h>
 | 
						|
 | 
						|
#include "cg2100.h"
 | 
						|
#include "cg2102.h"
 | 
						|
 | 
						|
// Nomi dei campi
 | 
						|
#include <mov.h>
 | 
						|
#include <causali.h>
 | 
						|
#include <rcausali.h>
 | 
						|
 | 
						|
TPrimanota_application::TPrimanota_application()
 | 
						|
: _rel(NULL), _lastreg(0), _mode(0), _iva(nessuna_iva)
 | 
						|
{
 | 
						|
  memset(_msk, 0, sizeof(_msk));
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
TMask* TPrimanota_application::load_mask(int n)
 | 
						|
{
 | 
						|
  if (_msk[n] != NULL) 
 | 
						|
    return _msk[n];
 | 
						|
  
 | 
						|
  if (n == 1 || n == 2)
 | 
						|
    for (int i = 1; i < 3; i++)                  // Try to save windows resources!
 | 
						|
      if (_msk[i] != NULL) 
 | 
						|
      {
 | 
						|
        delete _msk[i];
 | 
						|
        _msk[i] = NULL;
 | 
						|
      }  
 | 
						|
  
 | 
						|
  TFilename name("cg2100"); name << char(n == 3 ? 'o' : 'a'+n);
 | 
						|
  TMask* m = new TMask(name);
 | 
						|
  
 | 
						|
  switch (n)
 | 
						|
  {
 | 
						|
  case 0:        
 | 
						|
  {
 | 
						|
    m->set_handler(F_NUMREG, num_handler);
 | 
						|
    m->set_handler(F_CODCAUS, caus_query_handler);
 | 
						|
    m->set_handler(F_DATAREG, datareg_handler);
 | 
						|
    m->set_handler(F_DATACOMP, datacomp_handler);
 | 
						|
    TConfig c(CONFIG_STUDIO, "cg");
 | 
						|
    const bool dr = c.get_bool("PoCuDr");              // Scelta primo campo col focus
 | 
						|
    m->first_focus(dr ? F_DATAREG : F_CODCAUS);
 | 
						|
  }  
 | 
						|
  break;
 | 
						|
 case 1: 
 | 
						|
  m->set_handler(F_VISVAL, visval_handler);
 | 
						|
  m->set_handler(F_DESCR, descr_handler);
 | 
						|
  break;
 | 
						|
 case 2:
 | 
						|
{
 | 
						|
  m->set_handler(F_CODREG, reg_handler);
 | 
						|
  m->set_handler(F_CLIENTE, clifo_handler);
 | 
						|
  m->set_handler(F_FORNITORE, clifo_handler);
 | 
						|
  m->set_handler(F_TOTALE, totale_handler);
 | 
						|
  m->set_handler(F_RITFIS, ritfis_handler);
 | 
						|
  m->set_handler(F_RITSOC, ritsoc_handler);
 | 
						|
  m->set_handler(F_CODIVA, main_codiva_handler);
 | 
						|
  m->set_handler(F_VISVAL, visval_handler);
 | 
						|
  m->set_handler(F_OCCASEDIT, occas_handler);
 | 
						|
  m->set_handler(F_SOLAIVA, solaiva_handler);
 | 
						|
  m->set_handler(F_SHEETIVA, iva_handler);
 | 
						|
 | 
						|
  TSheet_field& is = (TSheet_field&)m->field(F_SHEETIVA);
 | 
						|
  is.set_notify(iva_notify);
 | 
						|
  TMask& ism = is.sheet_mask();
 | 
						|
  ism.set_handler(101, imponibile_handler);
 | 
						|
  ism.set_handler(102, codiva_handler);
 | 
						|
  ism.set_handler(104, imposta_handler);
 | 
						|
  ism.set_handler(109, suspended_handler);
 | 
						|
  ism.set_handler(209, suspended_handler);
 | 
						|
  ism.set_handler(309, suspended_handler);
 | 
						|
}  
 | 
						|
break;
 | 
						|
 case 3:
 | 
						|
 m->set_handler(O_CODICE, occas_code_handler);
 | 
						|
 break;  
 | 
						|
default:
 | 
						|
CHECKD(0, "Che cavolo di maschera e' la ", n);
 | 
						|
break;  
 | 
						|
}
 | 
						|
if (n == 1 || n == 2)
 | 
						|
{
 | 
						|
  m->set_handler(F_DATAREG, datareg_handler);
 | 
						|
  m->set_handler(F_DATACOMP, datacomp_handler);
 | 
						|
  m->set_handler(F_CODCAUS, caus_modify_handler);
 | 
						|
  m->set_handler(F_SHEETCG, cg_handler);
 | 
						|
 | 
						|
  TSheet_field& cg = (TSheet_field&)m->field(F_SHEETCG);                                                      
 | 
						|
  cg.set_notify(cg_notify);
 | 
						|
  TMask& cgm = cg.sheet_mask();
 | 
						|
  cgm.set_handler(101, dareavere_handler);
 | 
						|
  cgm.set_handler(102, dareavere_handler);
 | 
						|
  cgm.set_handler(105, suspended_handler);
 | 
						|
  cgm.set_handler(106, suspended_handler);
 | 
						|
  cgm.set_handler(206, cg_clifo_handler);
 | 
						|
  cgm.set_handler(306, cg_clifo_handler);
 | 
						|
  cgm.set_handler(112, suspended_handler);
 | 
						|
  cgm.set_handler(113, suspended_handler);
 | 
						|
  cgm.set_handler(213, cg_clifo_handler);
 | 
						|
  cgm.set_handler(313, cg_clifo_handler);
 | 
						|
}
 | 
						|
 | 
						|
return _msk[n] = m;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
bool TPrimanota_application::user_create()
 | 
						|
{
 | 
						|
  _tabcom = new TLocalisamfile(LF_TABCOM);
 | 
						|
  _tab = new TLocalisamfile(LF_TAB);
 | 
						|
  _caus = new TLocalisamfile(LF_CAUSALI);
 | 
						|
  _rcaus = new TLocalisamfile(LF_RCAUSALI);
 | 
						|
  _clifo = new TLocalisamfile(LF_CLIFO);
 | 
						|
  _pcon = new TLocalisamfile(LF_PCON);
 | 
						|
  _attiv = new TLocalisamfile(LF_ATTIV);
 | 
						|
  _saldo = new TLocalisamfile(LF_SALDI);
 | 
						|
  _comuni = new TLocalisamfile(LF_COMUNI);
 | 
						|
  _occas = new TLocalisamfile(LF_OCCAS);
 | 
						|
  _nditte = new TLocalisamfile(LF_NDITTE);
 | 
						|
 | 
						|
  _rel = new TMovimentoPN;
 | 
						|
  _rel->lfile().last();
 | 
						|
  _lastreg = _rel->lfile().get_long(MOV_NUMREG);  // Init last registration number
 | 
						|
  
 | 
						|
  set_search_field(F_NUMREG);                     // Set field for default search
 | 
						|
  
 | 
						|
  load_mask(0);                                   
 | 
						|
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
bool TPrimanota_application::user_destroy()
 | 
						|
{ 
 | 
						|
  if (_msk[3] != NULL) delete _msk[3];
 | 
						|
  if (_msk[2] != NULL) delete _msk[2];
 | 
						|
  if (_msk[1] != NULL) delete _msk[1];
 | 
						|
  if (_msk[0] != NULL) delete _msk[0];
 | 
						|
 | 
						|
  delete _rel;
 | 
						|
  delete _nditte;
 | 
						|
  delete _occas;
 | 
						|
  delete _comuni;
 | 
						|
  delete _saldo;
 | 
						|
  delete _attiv;
 | 
						|
  delete _pcon;
 | 
						|
  delete _clifo;
 | 
						|
  delete _rcaus;
 | 
						|
  delete _caus;
 | 
						|
  delete _tab;
 | 
						|
  delete _tabcom;
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
// Legge la causale di codice cod ed il relativo registro dell'anno year
 | 
						|
// Certified 99%
 | 
						|
bool TPrimanota_application::read_caus(const char* cod, int year)
 | 
						|
{
 | 
						|
  const bool ok = causale().read(cod, year);
 | 
						|
  
 | 
						|
  bool nob = FALSE, dob = FALSE;
 | 
						|
  if (ok)
 | 
						|
  {
 | 
						|
    nob = _causale.num_doc();
 | 
						|
    dob = _causale.data_doc();
 | 
						|
  }
 | 
						|
  
 | 
						|
  TMask& m = *load_mask(causale().iva() == nessuna_iva ? 1 : 2);
 | 
						|
  TEdit_field& nd = (TEdit_field&)m.field(F_NUMDOC);  // Numero documento obbligatorio?
 | 
						|
  nd.check_type(nob ? CHECK_REQUIRED : CHECK_NORMAL);
 | 
						|
  TEdit_field& dd = (TEdit_field&)m.field(F_DATADOC); // Data documento obbligatoria?
 | 
						|
  dd.check_type(dob ? CHECK_REQUIRED : CHECK_NORMAL);
 | 
						|
 | 
						|
  return ok;
 | 
						|
} 
 | 
						|
 | 
						|
void TPrimanota_application::print()
 | 
						|
{
 | 
						|
  TExternal_app stampa("cg3 -0");
 | 
						|
  stampa.run();
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
bool TPrimanota_application::changing_mask(int mode)
 | 
						|
{
 | 
						|
  if (mode == MODE_QUERY) 
 | 
						|
    return _mode != MODE_QUERY;
 | 
						|
 | 
						|
  _iva = nessuna_iva;
 | 
						|
  
 | 
						|
  TString16 causale;
 | 
						|
  //  TString16 registro;
 | 
						|
  int annoes = 0, annoiva = 0;
 | 
						|
 | 
						|
  switch (mode)
 | 
						|
  {
 | 
						|
  case MODE_INS:
 | 
						|
    annoes = _msk[0]->get_int(F_ANNOES);
 | 
						|
    annoiva = _msk[0]->get_int(F_ANNOIVA);
 | 
						|
    causale = _msk[0]->get(F_CODCAUS);
 | 
						|
    read_caus(causale, annoiva);
 | 
						|
    break;
 | 
						|
  case MODE_MOD:
 | 
						|
    annoes  = _rel->lfile().get_int("ANNOES");
 | 
						|
    annoiva = _rel->lfile().get_int("ANNOIVA");
 | 
						|
    causale = _rel->lfile().get("CODCAUS");
 | 
						|
    giornale().read(annoes);
 | 
						|
    //  registro = _rel->lfile()->get("REG");
 | 
						|
    //   _causale.read(causale, 0);
 | 
						|
    //   _causale.reg().read(registro, annoiva);
 | 
						|
    read_caus(causale, annoiva);
 | 
						|
    break;
 | 
						|
  default:
 | 
						|
    break;
 | 
						|
  }
 | 
						|
  _iva = _causale.iva();
 | 
						|
  
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
TMask* TPrimanota_application::get_mask(int mode)
 | 
						|
{
 | 
						|
  _mode = mode;
 | 
						|
  const int m = (mode == MODE_QUERY) ? 0 : (iva() == nessuna_iva ? 1 : 2);
 | 
						|
  return load_mask(m);
 | 
						|
} 
 | 
						|
 | 
						|
 | 
						|
void TPrimanota_application::read_firm_params()
 | 
						|
{
 | 
						|
  TConfig c(CONFIG_DITTA, "cg");
 | 
						|
  _ges_val = c.get_bool("GesVal");
 | 
						|
  _ges_sal = c.get_bool("GesSal");
 | 
						|
}
 | 
						|
 | 
						|
void TPrimanota_application::init_mask(TMask& m)
 | 
						|
{
 | 
						|
  disable_menu_item(M_FILE_PRINT);
 | 
						|
  
 | 
						|
  fill_sheet(m);
 | 
						|
 | 
						|
  if (_iva != nessuna_iva)
 | 
						|
  {                        
 | 
						|
    read_firm_params();
 | 
						|
    
 | 
						|
    char clig, forg;
 | 
						|
    if (_iva == iva_acquisti)
 | 
						|
    {
 | 
						|
      forg = 's';
 | 
						|
      clig = 'h';
 | 
						|
    } 
 | 
						|
    else
 | 
						|
    {
 | 
						|
      forg = 'h';
 | 
						|
      clig = causale().reg().corrispettivi() ? 'h' : 's';
 | 
						|
    }
 | 
						|
    m.send_key(K_SHIFT+K_CTRL+clig, -1);  // group 1 (clienti)
 | 
						|
    m.send_key(K_SHIFT+K_CTRL+forg, -2);  // group 2 (fornitori)
 | 
						|
    
 | 
						|
    const bool intra = _causale.intra();
 | 
						|
    m.show(F_CORRLIRE, intra);
 | 
						|
    
 | 
						|
    const bool corrval = intra && _causale.corrval();
 | 
						|
    m.show(F_CORRVALUTA, corrval);
 | 
						|
    
 | 
						|
    // Show/Hide campi valuta: F_VALUTA, F_CAMBIO, F_VISVAL (GROUP 3)
 | 
						|
    const bool valuta = _causale.valuta() && gestione_valuta();
 | 
						|
    m.send_key(K_SHIFT+K_CTRL+(valuta ? 's' : 'h'), -3);
 | 
						|
    if (valuta) 
 | 
						|
      m.set(F_VISVAL, "X");
 | 
						|
    
 | 
						|
    m.efield(F_CODPAG).check_type(gestione_saldaconto() ? CHECK_REQUIRED : CHECK_NORMAL);
 | 
						|
  }
 | 
						|
 | 
						|
  m.disable(DLG_NEWREC);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void TPrimanota_application::init_query_mode(TMask& m)
 | 
						|
{
 | 
						|
  m.enable(DLG_NEWREC);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void TPrimanota_application::fill_sheet(TMask& m) const
 | 
						|
{
 | 
						|
  TSheet_field& cgs = (TSheet_field&)m.field(F_SHEETCG);
 | 
						|
  for (int r = cgs.items(); r < 16; r++)
 | 
						|
    cgs.row(r);
 | 
						|
 | 
						|
  if (_iva != nessuna_iva)
 | 
						|
  {
 | 
						|
    TSheet_field& ivas = (TSheet_field&)m.field(F_SHEETIVA);
 | 
						|
    for (r = ivas.items(); r < 16; r++) ivas.row(r);
 | 
						|
    ivas.enable_column(4, _iva == iva_acquisti);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
// Ritorna il prossimo numero di registrazione libero
 | 
						|
// Certified 100%
 | 
						|
const char* TPrimanota_application::get_next_key()
 | 
						|
{
 | 
						|
  return format("%d|%ld", F_NUMREG, _lastreg+1);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void TPrimanota_application::init_insert_mode(TMask& m)
 | 
						|
{
 | 
						|
  m.set(F_DATAREG, _msk[0]->get(F_DATAREG));
 | 
						|
  m.set(F_DATACOMP, _msk[0]->get(F_DATACOMP));
 | 
						|
  m.set(F_ANNOES, _msk[0]->get(F_ANNOES));
 | 
						|
  m.set(F_ANNOIVA, _msk[0]->get(F_ANNOIVA));
 | 
						|
  if (iva() != nessuna_iva)
 | 
						|
    occas_mask().reset();
 | 
						|
 | 
						|
  init_mask(m);
 | 
						|
  _saldi.reset();                        // Inizializza saldi
 | 
						|
  _saldi.set_movprovv(_rel->lfile().get_char("PROVVIS") > ' ' ? TRUE : FALSE);
 | 
						|
  _saldi.set_movap(_causale.apertura());
 | 
						|
  _saldi.set_anno_es(m.get_int(F_ANNOES));
 | 
						|
  _saldi.set_num_ulmov(m.get_long(F_NUMREG));
 | 
						|
  _saldi.set_data_ulmov(TDate(m.get(F_DATAREG)));
 | 
						|
 | 
						|
  if (_iva != nessuna_iva)
 | 
						|
  {    
 | 
						|
    const long protiva = causale().reg().protocol();
 | 
						|
    m.set(F_PROTIVA, protiva+1);
 | 
						|
    
 | 
						|
    TMask_field& vv = m.field(F_VISVAL);       
 | 
						|
    if (vv.active() && m.get(F_VALUTA).empty())        // Se e' un movimento in valuta
 | 
						|
    { 
 | 
						|
      const bool ok = m.field(F_VALUTA).on_key(K_F9);  // Richiedi valuta
 | 
						|
      vv.set(ok ? "X" : " ");               
 | 
						|
      if (ok) vv.on_hit();                             // Cambia decimali
 | 
						|
    }  
 | 
						|
  }  
 | 
						|
 | 
						|
  if (m.get(F_CODCAUS).empty()) return;
 | 
						|
  
 | 
						|
  TString80 desc;                    
 | 
						|
  for (int i = 1; i < _causale.size(); i++)
 | 
						|
  {
 | 
						|
    const TRectype* rcaus = (TRectype*)_causale.objptr(i);
 | 
						|
    if (rcaus == NULL) continue;        // Evita eventuali righe nulle
 | 
						|
 | 
						|
    const int nriga = rcaus->get_int(RCA_NRIGA);
 | 
						|
    if (nriga < 1) continue;            // Considera solo righe reali (non riempimenti)
 | 
						|
 | 
						|
    TBill tc; _causale.bill(nriga, tc);
 | 
						|
    if (tc.conto() < 1) continue;       // Considera solo conti validi
 | 
						|
 | 
						|
    char sezione = rcaus->get_char(RCA_SEZIONE);
 | 
						|
    if (sezione != 'A') sezione = 'D';
 | 
						|
    const TImporto zero(sezione, ZERO);
 | 
						|
 | 
						|
    desc = rcaus->get(RCA_DESC);
 | 
						|
 | 
						|
    if (nriga == 1) m.set(F_DESCR, desc);
 | 
						|
    
 | 
						|
    if (iva() == nessuna_iva)
 | 
						|
    {
 | 
						|
      set_cgs_row(-1,zero,tc,desc,' ');
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
      if (nriga == 3 || nriga == 4 || nriga == 8 || nriga == 9)
 | 
						|
        continue;       // Conti per IVA detraibile e non, ritenute sociali e fiscali
 | 
						|
 | 
						|
      const bool rigaiva = rcaus->get_bool(RCA_RIGAIVA);
 | 
						|
      if (nriga == 2 || (nriga >= 5 && nriga <= 7) || rigaiva)
 | 
						|
      {
 | 
						|
        const TString16 codiva(rcaus->get(RCA_CODIVA));
 | 
						|
        set_ivas_row(-1,codiva,tc,desc);
 | 
						|
      }
 | 
						|
      else
 | 
						|
      {
 | 
						|
        const char tipo = nriga < 2 ? 'T' : ' ';
 | 
						|
        set_cgs_row(-1,zero,tc,desc,tipo);
 | 
						|
        
 | 
						|
        if (nriga == 1 && tc.tipo() > ' ' && tc.sottoconto() > 0)
 | 
						|
          m.set(tc.tipo() == 'C' ? F_CLIENTE : F_FORNITORE, tc.sottoconto());
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void TPrimanota_application::init_modify_mode(TMask& m)
 | 
						|
{
 | 
						|
  init_mask(m);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
bool TPrimanota_application::get_conto(const TRectype& r, TBill& c) const
 | 
						|
{
 | 
						|
  c.set(r.get_int("GRUPPO"), r.get_int("CONTO"),
 | 
						|
        r.get_long("SOTTOCONTO"), r.get_char("TIPOC"));
 | 
						|
  return c.ok();
 | 
						|
}
 | 
						|
 | 
						|
void TPrimanota_application::put_conto(TRectype& r, const TBill& c) const
 | 
						|
{
 | 
						|
  r.put("TIPOC", c.tipo());
 | 
						|
  r.put("GRUPPO", c.gruppo());
 | 
						|
  r.put("CONTO", c.conto());
 | 
						|
  r.put("SOTTOCONTO", c.sottoconto());
 | 
						|
}
 | 
						|
 | 
						|
bool TPrimanota_application::test_swap(bool ritsoc)
 | 
						|
{
 | 
						|
  bool s = FALSE;
 | 
						|
 | 
						|
  const char sez = ritsoc ? causale().sezione_ritsoc() : causale().sezione_clifo();
 | 
						|
  s = (iva() == iva_vendite) ^ sez == 'D';
 | 
						|
  return s;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
int TPrimanota_application::read(TMask& m)
 | 
						|
{   
 | 
						|
  m.autoload(_rel);
 | 
						|
  
 | 
						|
  if (_iva != nessuna_iva)
 | 
						|
  { 
 | 
						|
    const TString16 occode(_rel->lfile().get("OCFPI"));
 | 
						|
    occas_mask().set(O_CODICE, occode);
 | 
						|
    
 | 
						|
    const char clifo = toupper(m.get(F_CLIFO)[0]);
 | 
						|
 | 
						|
    if (_iva == iva_acquisti && clifo == 'C')
 | 
						|
      error_box("Registrazione di acquisto attribuita ad un cliente"); else
 | 
						|
        if (_iva == iva_vendite && clifo == 'F')
 | 
						|
          error_box("Registrazione di vendita attribuita ad un fornitore");
 | 
						|
 | 
						|
    if (_iva == iva_vendite)
 | 
						|
    {
 | 
						|
      TEdit_field& f = (TEdit_field&)m.field(F_CLIENTE);
 | 
						|
      f.check_type(clifo == 'C' ? CHECK_REQUIRED : CHECK_NORMAL);
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  TSheet_field& cgs = (TSheet_field&)m.field(F_SHEETCG);
 | 
						|
  cgs.reset();
 | 
						|
  
 | 
						|
  _saldi.reset(); // Azzera saldi
 | 
						|
  _saldi.set_movprovv(_rel->lfile().get_char("PROVVIS") > ' ' ? TRUE : FALSE);
 | 
						|
  _saldi.set_movap(_causale.apertura());
 | 
						|
  _saldi.set_anno_es(m.get_int(F_ANNOES));
 | 
						|
  _saldi.set_num_ulmov(m.get_long(F_NUMREG));
 | 
						|
  _saldi.set_data_ulmov((TDate)m.get(F_DATAREG));
 | 
						|
 | 
						|
  TToken_string riga(255);
 | 
						|
  
 | 
						|
  for (int i = 0; i < _rel->cg_items(); i++)
 | 
						|
  {
 | 
						|
    const TRectype& r = _rel->cg(i);
 | 
						|
    riga.cut(0);                                 // Vuota la riga
 | 
						|
 | 
						|
    const int rcontr = r.get_int("RCONTR") -1;
 | 
						|
#ifdef DBG
 | 
						|
    if (rcontr < -1 || rcontr >= _rel->cg_items() || rcontr == i)
 | 
						|
      error_box("La riga %d non puo' avere per contropartita la %d", i+1, rcontr+1);
 | 
						|
#endif
 | 
						|
 | 
						|
    const real im(r.get_real("IMPORTO"));
 | 
						|
    const char sezione = toupper(r.get_char("SEZIONE"));
 | 
						|
 | 
						|
    TImporto import(sezione, im);
 | 
						|
    import.add_to(riga);                         // Dare/Avere 101-102
 | 
						|
 | 
						|
    TConto conto;   get_conto(r, conto);
 | 
						|
    riga.add(conto.string(0x3));                 // Conto 103-107
 | 
						|
    if (conto.ok())
 | 
						|
      _saldi.aggiorna(conto, im, sezione, FALSE);
 | 
						|
    
 | 
						|
    riga.add("");                                // Codice descrizione 108
 | 
						|
    riga.add(r.get("DESCR"));                    // Descrizione riga 109
 | 
						|
 | 
						|
    if (rcontr >= 0 && rcontr < _rel->cg_items())
 | 
						|
    {
 | 
						|
      get_conto(_rel->cg(rcontr), conto);
 | 
						|
      riga.add(conto.string(0x3));               // Contropartita 110-114
 | 
						|
    }
 | 
						|
    else riga.add(" | | | | ");
 | 
						|
 | 
						|
    const char tipo = r.get_char("ROWTYPE");         
 | 
						|
    riga.add(tipo);                              // Tipo di riga 115
 | 
						|
 | 
						|
    cgs.row(i) = riga;
 | 
						|
    disable_cgs_cells(i, tipo);
 | 
						|
  }
 | 
						|
 | 
						|
  if (_iva == nessuna_iva) 
 | 
						|
    return _rel->status();
 | 
						|
  
 | 
						|
  const bool solaiva = i == 0;
 | 
						|
  m.set(F_SOLAIVA, solaiva ? "X" : " ");
 | 
						|
  m.field(F_SOLAIVA).on_hit();
 | 
						|
  
 | 
						|
  TSheet_field& ivas = (TSheet_field&)m.field(F_SHEETIVA);
 | 
						|
  ivas.reset();
 | 
						|
  
 | 
						|
  const bool to_swap = test_swap(FALSE);
 | 
						|
  
 | 
						|
  for (i = 0; i < _rel->iva_items(); i++)
 | 
						|
  {
 | 
						|
    TRectype& r = _rel->iva(i);
 | 
						|
    riga.cut(0);
 | 
						|
    
 | 
						|
    real imponibile(r.get("IMPONIBILE"));
 | 
						|
    if (to_swap) imponibile = -imponibile;
 | 
						|
    riga.add(imponibile.string());       // Imponibile 101
 | 
						|
 | 
						|
    riga.add(r.get("CODIVA"));           // IVA        102
 | 
						|
    riga.add(r.get("TIPODET"));          // Detrazione 103
 | 
						|
    riga.add(r.get("IMPOSTA"));          // Imposta    104
 | 
						|
 | 
						|
    TBill c; get_conto(r, c);
 | 
						|
    if (c.ok())
 | 
						|
      c.add_to(riga, 4, 0x7);            // 105-110
 | 
						|
    else 
 | 
						|
      riga.add(" | | | | | ");
 | 
						|
    
 | 
						|
    ivas.row(i) = riga;
 | 
						|
  }
 | 
						|
 | 
						|
  TMask_field& vv = m.field(F_VISVAL);
 | 
						|
  if (vv.active()) vv.on_hit();
 | 
						|
 | 
						|
  return _rel->status();
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
void TPrimanota_application::mask2rel(const TMask& m)
 | 
						|
{
 | 
						|
  _rel->lfile().zero();
 | 
						|
  m.autosave(_rel);
 | 
						|
  
 | 
						|
  const long numreg = m.get_long(F_NUMREG);
 | 
						|
  const TDate datareg(m.get(F_DATAREG));
 | 
						|
  const int annoes = (int) m.get_long(F_ANNOES);
 | 
						|
 | 
						|
  _saldi.set_movprovv(m.get_bool(F_PROVVISORIO));
 | 
						|
  _saldi.set_movap(_causale.apertura());
 | 
						|
  _saldi.set_anno_es(annoes);
 | 
						|
 | 
						|
  _rel->destroy_rows();                  // Destroy all records
 | 
						|
  cgs_pack();                            // Destroy all null rows
 | 
						|
 | 
						|
  TArray& rows = cgs().rows_array();
 | 
						|
  int cur = 1;                      
 | 
						|
  
 | 
						|
  // Controlla se e' un movimento con righe contabili
 | 
						|
  if (iva() == nessuna_iva || !m.get_bool(F_SOLAIVA))  
 | 
						|
  {
 | 
						|
    for (int i = 0; i < rows.items(); i++)
 | 
						|
    {
 | 
						|
      TToken_string& row = (TToken_string&)rows[i];
 | 
						|
 | 
						|
      TImporto n; n = row;                         
 | 
						|
      const TConto conto(row, 2, 0x3);
 | 
						|
      if (conto.ok())
 | 
						|
        _saldi.aggiorna(conto, n.valore(), n.sezione(), TRUE);
 | 
						|
 | 
						|
      TRectype &r = _rel->cg(cur-1);
 | 
						|
      r.zero();
 | 
						|
 | 
						|
      r.put("IMPORTO", n.valore());         // Importo
 | 
						|
      r.put("SEZIONE", n.sezione());        // Sezione
 | 
						|
 | 
						|
      r.put("NUMREG", numreg);
 | 
						|
      r.put("ANNOES", annoes);
 | 
						|
      r.put("DATAREG", datareg);
 | 
						|
      r.put("NUMRIG", cur);
 | 
						|
      
 | 
						|
      put_conto(r, conto);                  // Conto
 | 
						|
      
 | 
						|
      row.get();                            // Codice descrizione
 | 
						|
      r.put("DESCR", row.get());            // Descrizione riga
 | 
						|
 | 
						|
      int rcontr = 0;                       // Riga contropartita
 | 
						|
      const TBill contro(row, -1, 0x3);    // Conto contropartita
 | 
						|
      if (contro.ok())
 | 
						|
      {
 | 
						|
        rcontr = bill2contr(contro, n.sezione())+1;
 | 
						|
        if (rcontr < 1)
 | 
						|
        {
 | 
						|
          warning_box("La riga contabile %d non ha una contropartita", cur);
 | 
						|
          rcontr = 0;
 | 
						|
        }
 | 
						|
      }
 | 
						|
      r.put("RCONTR", rcontr);    // Contropartita
 | 
						|
      
 | 
						|
      const char tipo = row.get_char();
 | 
						|
      r.put("ROWTYPE", tipo);
 | 
						|
      
 | 
						|
      cur++;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  if (_iva == nessuna_iva) return;
 | 
						|
  
 | 
						|
  if (causale().reg().corrispettivi())
 | 
						|
  {
 | 
						|
    TRectype& rec = _rel->lfile().curr();
 | 
						|
    rec.put("TIPO", ""); 
 | 
						|
    rec.put("CODCF", "");  // Azzera il cliente nei movimenti dei corrispettivi
 | 
						|
  }
 | 
						|
  else
 | 
						|
  {
 | 
						|
    int err = ~NOERR;    
 | 
						|
    if (m.get_bool(F_OCCASIONALE)) 
 | 
						|
    {
 | 
						|
      TRelation occas(LF_OCCAS);
 | 
						|
      const TMask& om = occas_mask();
 | 
						|
      om.autosave(&occas);
 | 
						|
      
 | 
						|
      err = occas.write();
 | 
						|
      if (err == _isreinsert)
 | 
						|
        err = occas.rewrite();
 | 
						|
      
 | 
						|
      if (err == NOERR)
 | 
						|
        _rel->lfile().put("OCFPI", occas_mask().get(O_CODICE));
 | 
						|
      else
 | 
						|
        error_box("Errore di scrittura sul file dei clienti/fornitori occasionali: %d", err);  
 | 
						|
    }
 | 
						|
    if (err) _rel->lfile().zero("OCFPI");
 | 
						|
  }
 | 
						|
  
 | 
						|
  const bool to_swap = test_swap(FALSE);                                   
 | 
						|
  TArray& irows = ivas().rows_array();
 | 
						|
  cur = 1;
 | 
						|
  for (int i = 0; i < irows.items(); i++)
 | 
						|
  {
 | 
						|
    TToken_string& row = (TToken_string&)irows[i];
 | 
						|
    if (row.empty_items())
 | 
						|
      continue;
 | 
						|
 | 
						|
    TRectype &r = _rel->iva(cur-1);
 | 
						|
    r.zero();
 | 
						|
    r.put("ANNOES", annoes);
 | 
						|
    r.put("NUMREG", numreg);
 | 
						|
    r.put("NUMRIG", cur);
 | 
						|
    
 | 
						|
    real imponibile(row.get(0));
 | 
						|
    if (to_swap) imponibile = -imponibile;
 | 
						|
    r.put("IMPONIBILE", imponibile);
 | 
						|
    
 | 
						|
    r.put("CODIVA", row.get());
 | 
						|
    r.put("TIPODET", row.get());
 | 
						|
    r.put("IMPOSTA", row.get());
 | 
						|
    r.put("TIPOCR", row.get());
 | 
						|
 | 
						|
    const TBill c(row, -1, 0x1);
 | 
						|
    const int rimp = bill2pos(c, 'I')+1;
 | 
						|
    r.put("RIGAIMP", rimp);
 | 
						|
    put_conto(r, c);
 | 
						|
    
 | 
						|
    cur++;
 | 
						|
  } 
 | 
						|
  
 | 
						|
  // Resetta il flag di calcolato sulla liquidazione IVA del mese di registrazione        
 | 
						|
  const TDate d(m.get(F_DATAREG));
 | 
						|
  TString16 chiave; chiave << d.year() << d.month();
 | 
						|
  TTable lim("LIM");
 | 
						|
  lim.put("CODTAB", chiave);
 | 
						|
  if (lim.read() == NOERR)
 | 
						|
  {
 | 
						|
    const bool calcolato = lim.get_bool("B0");
 | 
						|
    if (calcolato)
 | 
						|
    {
 | 
						|
      lim.put("B0", FALSE);
 | 
						|
      lim.rewrite();
 | 
						|
    }  
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
int TPrimanota_application::write(const TMask& m)
 | 
						|
{                                 
 | 
						|
  const long numreg = m.get_long(F_NUMREG);
 | 
						|
  if (numreg > _lastreg) _lastreg = numreg;             // Aggiorna ultima registrazione
 | 
						|
 | 
						|
  mask2rel(m);
 | 
						|
  const int err = _rel->write(TRUE);
 | 
						|
  if (err == NOERR)
 | 
						|
  {
 | 
						|
    _saldi.registra();
 | 
						|
    const TString16 causimm(_causale.causale_inc_imm());
 | 
						|
    if (causimm.not_empty())
 | 
						|
      genera_incasso(causimm);
 | 
						|
    if (TRUE)  // TBI controlla pagamento da scadenzare
 | 
						|
      aggiorna_scadenzario(m);
 | 
						|
  } 
 | 
						|
  return err;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
int TPrimanota_application::rewrite(const TMask& m)
 | 
						|
{
 | 
						|
  mask2rel(m);
 | 
						|
  const int err = _rel->rewrite(TRUE);
 | 
						|
  if (err == NOERR)
 | 
						|
    _saldi.registra();
 | 
						|
  if (TRUE)  // TBI controlla pagamento da scadenzare e/o variazione che ne implichi
 | 
						|
    // la modifica
 | 
						|
    aggiorna_scadenzario(m);
 | 
						|
  return err;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
bool TPrimanota_application::remove()
 | 
						|
{
 | 
						|
  const bool ok = TRelation_application::remove();
 | 
						|
  if (ok)
 | 
						|
    _saldi.registra();
 | 
						|
  return ok;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void TPrimanota_application::genera_incasso(const char* causimm)
 | 
						|
{
 | 
						|
  TMask m("cg2100i");
 | 
						|
  m.set_handler(F_DATAREG, datareg_handler);
 | 
						|
  m.set_handler(F_DATACOMP, datacomp_handler);
 | 
						|
  
 | 
						|
  TFilename tmp; tmp.temp();          // File temporaneo di scambio
 | 
						|
  _msk[2]->set_workfile(tmp);
 | 
						|
  _msk[2]->save();                    // Copia la maschera principale ...
 | 
						|
  m.set_workfile(tmp);
 | 
						|
  m.load();                           // ... nella maschera di incasso
 | 
						|
  ::remove(tmp);                      // Cancella file temporaneo
 | 
						|
  
 | 
						|
  const TCausale caus(causimm);       // Causale da usare
 | 
						|
  m.set(F_NUMREG, ++_lastreg);        // Incrementa numero di registrazione
 | 
						|
  m.set(F_CODCAUS, causimm);          // Cambia causale e ...
 | 
						|
  m.set(F_TIPODOC, caus.tipo_doc());  // relativo tipo documento
 | 
						|
  
 | 
						|
  if (m.run() == K_SAVE)
 | 
						|
  {
 | 
						|
    TMovimentoPN inc;                  // Nuovo movimento di incasso immediato
 | 
						|
    
 | 
						|
    TRectype r(_rel->cg(0));           // Copia la prima riga contabile
 | 
						|
    m.autosave(&inc);
 | 
						|
    
 | 
						|
    inc.lfile().put("REG", "");       // Annulla eventuale registro IVA
 | 
						|
    
 | 
						|
    const real imp(m.get(F_TOTALE));
 | 
						|
    const char sez = r.get_char("SEZIONE");
 | 
						|
 | 
						|
    r.put("NUMREG", _lastreg);
 | 
						|
    r.put("NUMRIG", 1);
 | 
						|
    r.put("IMPORTO", imp);
 | 
						|
    r.put("ROWTYPE", ' ');
 | 
						|
    r.put("SEZIONE", sez == 'A' ? 'D' : 'A');
 | 
						|
    inc.cg(0) = r;
 | 
						|
 | 
						|
    TBill conto; caus.bill(2, conto);            // Conto della seconda riga della causale
 | 
						|
    
 | 
						|
    r.put("TIPOC", conto.tipo());            
 | 
						|
    r.put("GRUPPO", conto.gruppo());
 | 
						|
    r.put("CONTO", conto.conto());
 | 
						|
    r.put("SOTTOCONTO", conto.sottoconto());
 | 
						|
 | 
						|
    r.put("NUMRIG", 2);
 | 
						|
    r.put("SEZIONE", sez);
 | 
						|
    inc.cg(1) = r;
 | 
						|
    
 | 
						|
    while (inc.write() == _isreinsert)            // In caso di riscrittura
 | 
						|
      inc.lfile().put("NUMREG", ++_lastreg);     // Incrementa numero registrazione
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
int cg2100 (int argc, char** argv)
 | 
						|
{
 | 
						|
  TPrimanota_application a;
 | 
						|
  a.run(argc, argv, "Prima nota");
 | 
						|
  return 0;
 | 
						|
}
 |