437 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			437 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
// ba3700.cpp  - Tabella condizioni di pagamento
 | 
						|
 | 
						|
#include <relapp.h>       
 | 
						|
#include <tabutil.h>
 | 
						|
#include <urldefid.h>
 | 
						|
#include <utility.h>   
 | 
						|
#include <msksheet.h>
 | 
						|
 | 
						|
#include "ba3700.h"
 | 
						|
#include "../cg/pagament.h"
 | 
						|
 | 
						|
#define ALIAS 1
 | 
						|
 | 
						|
class BA3700_application : public TRelation_application
 | 
						|
{   
 | 
						|
  TRelation*   _rel;
 | 
						|
  TMask*       _msk;
 | 
						|
  Pagamento*   _pag;
 | 
						|
  TSheet_field* _cs;
 | 
						|
  int          _mode;              // Modo maschera corrente
 | 
						|
  int          _interv_rate; 
 | 
						|
  int          _numero_rate;
 | 
						|
  int          _riga;
 | 
						|
 | 
						|
protected:
 | 
						|
 | 
						|
  virtual bool         user_create();
 | 
						|
  virtual bool         user_destroy();
 | 
						|
  
 | 
						|
  // minchia di cristo
 | 
						|
  virtual TRelation*   get_relation() const    { return _rel;  }
 | 
						|
  virtual TMask*       get_mask(int mode)      { return _msk;  }
 | 
						|
  virtual bool         changing_mask(int mode) { return FALSE; }
 | 
						|
 | 
						|
  // file intertface
 | 
						|
  virtual bool         remove();
 | 
						|
  virtual void         init_insert_mode(TMask&);
 | 
						|
  virtual void         init_query_mode(TMask&);
 | 
						|
  virtual int          rewrite(const TMask& m);
 | 
						|
  virtual int          write(const TMask& m);
 | 
						|
  virtual int          read(TMask& m);
 | 
						|
 | 
						|
  // notifier
 | 
						|
  static bool          sheet_action(int r, KEY k);
 | 
						|
  
 | 
						|
  // handlers           
 | 
						|
  static bool intervallo_rate     (TMask_field& f, KEY k);                  
 | 
						|
  static bool rate_differenziate  (TMask_field& f, KEY k);                  
 | 
						|
  static bool tipo_prima_rata     (TMask_field& f, KEY k);                  
 | 
						|
  static bool numero_rate         (TMask_field& f, KEY k);                  
 | 
						|
  static bool mese_commerciale    (TMask_field& f, KEY k);                  
 | 
						|
  
 | 
						|
  void*  _app_data;  
 | 
						|
  
 | 
						|
public:
 | 
						|
  
 | 
						|
  void   set_app_data(void* v) { _app_data = v;    }                
 | 
						|
  static void* get_app_data()  { return ((BA3700_application*)MainApp())->_app_data; }
 | 
						|
  
 | 
						|
  BA3700_application() : TRelation_application() {} 
 | 
						|
  virtual ~BA3700_application() {}
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
// app-data per handlers          
 | 
						|
struct sht {
 | 
						|
  TMask*        _msk;
 | 
						|
  Pagamento*    _pag;
 | 
						|
  TSheet_field* _sht;
 | 
						|
  TArray*       _rws;
 | 
						|
} shuttle;    
 | 
						|
 | 
						|
 | 
						|
 | 
						|
bool BA3700_application::user_create()
 | 
						|
{
 | 
						|
  _rel = new TRelation(TAB_CPG);
 | 
						|
  _rel->add(TAB_RPG, "CODTAB[1,4]=CODTAB" ,1, 0, ALIAS);
 | 
						|
 | 
						|
  _interv_rate = 30;
 | 
						|
  _pag = NULL;
 | 
						|
  _msk = new TMask("ba3700a");
 | 
						|
  _cs = &((TSheet_field&)_msk->field(F_SHEET_RPG));
 | 
						|
  _cs->set_notify(sheet_action);
 | 
						|
  
 | 
						|
  _msk->set_handler (F_INT_RATE        , intervallo_rate);        
 | 
						|
  _msk->set_handler (F_RATE_DIFF       , rate_differenziate);     
 | 
						|
  _msk->set_handler (F_TIPO_PRIMA_RATA , tipo_prima_rata);        
 | 
						|
  _msk->set_handler (F_NUM_RATE        , numero_rate);            
 | 
						|
  _msk->set_handler (F_MESECOMM        , mese_commerciale);       
 | 
						|
  
 | 
						|
  shuttle._msk = _msk;
 | 
						|
  shuttle._sht = _cs;
 | 
						|
  
 | 
						|
  set_app_data(&shuttle);
 | 
						|
  
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
bool BA3700_application::user_destroy()
 | 
						|
{
 | 
						|
  delete _msk;
 | 
						|
  delete _rel;
 | 
						|
  if (_pag) delete _pag;
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
int BA3700_application::read(TMask& m)
 | 
						|
{
 | 
						|
  m.autoload(_rel);
 | 
						|
 | 
						|
  TString code(m.get(F_CODICE));
 | 
						|
  int ir = m.get_int(F_INT_RATE); if (ir == 0) ir = -1;
 | 
						|
  shuttle._pag = _pag = new Pagamento(code);
 | 
						|
  _pag->set_sheet(*_cs, ir);
 | 
						|
  if (_pag->n_rate() > 1)
 | 
						|
    _interv_rate = _pag->scad_rata(_pag->n_rate() - 1);
 | 
						|
 | 
						|
  TArray* arr = new TArray;
 | 
						|
  if (shuttle._rws != NULL) delete shuttle._rws;
 | 
						|
  (*arr) = _cs->rows_array();
 | 
						|
  shuttle._rws = arr;  
 | 
						|
  
 | 
						|
  //  shuttle._msk->field(F_INT_RATE).set(format("%d",_interv_rate));
 | 
						|
  shuttle._msk->field(F_NUM_RATE).set(format("%d",_pag->n_rate()));
 | 
						|
  shuttle._msk->field(F_RATE_DIFF).set(_pag->rate_differenziate() ? "1" : "2");
 | 
						|
  
 | 
						|
  return NOERR;
 | 
						|
}
 | 
						|
 | 
						|
void BA3700_application::init_insert_mode(TMask& m)
 | 
						|
{
 | 
						|
  TString code(m.get(F_CODICE));
 | 
						|
  shuttle._pag = _pag = new Pagamento(code);
 | 
						|
  _pag->set_sheet(*_cs);
 | 
						|
  TArray* arr = new TArray;
 | 
						|
  if (shuttle._rws != NULL) delete shuttle._rws;
 | 
						|
  (*arr) = _cs->rows_array();
 | 
						|
  shuttle._rws = arr;       
 | 
						|
  shuttle._msk->field(F_INT_RATE).set("30");
 | 
						|
  shuttle._msk->field(F_INIZIOSCAD).set("F");
 | 
						|
  shuttle._msk->field(F_NUM_RATE).set("1"); 
 | 
						|
  shuttle._msk->field(F_RATE_DIFF).set("2");
 | 
						|
}
 | 
						|
 | 
						|
void BA3700_application::init_query_mode(TMask& m)
 | 
						|
{
 | 
						|
  _cs->reset(); _cs->force_update();
 | 
						|
  if (shuttle._rws != NULL) delete shuttle._rws;
 | 
						|
  shuttle._rws = new TArray;
 | 
						|
}
 | 
						|
 | 
						|
// handlers
 | 
						|
 | 
						|
bool BA3700_application::intervallo_rate(TMask_field& f, KEY k)
 | 
						|
{          
 | 
						|
  // ricalcola tutte le scadenze
 | 
						|
  // occorre pag->set_intervallo_rate(intervallo)       
 | 
						|
  if (k != K_TAB) return TRUE;
 | 
						|
  
 | 
						|
  sht* s = (sht*)get_app_data();
 | 
						|
  Pagamento*    pag = s->_pag;
 | 
						|
  TSheet_field* shf = s->_sht;
 | 
						|
  TMask*        msk = s->_msk;
 | 
						|
  
 | 
						|
  if (!pag || msk->get(F_INT_RATE).empty()) return TRUE;
 | 
						|
 | 
						|
  pag->set_intervallo_rate(msk->get_int(F_INT_RATE));                                               
 | 
						|
  if (pag->dirty())
 | 
						|
  {
 | 
						|
    pag->set_sheet(*shf);  
 | 
						|
    (*(s->_rws)) = shf->rows_array(); 
 | 
						|
    msk->field(F_MESECOMM).set(pag->mese_commerciale() ? "X" : "");
 | 
						|
  }
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
bool BA3700_application::rate_differenziate(TMask_field& f, KEY k)                  
 | 
						|
{
 | 
						|
  // se erano differenziate e non lo sono piu' occorre riaggiustare
 | 
						|
  // il riaggiustabile; altrimenti si lascia cosi'
 | 
						|
  // pag->set_rate_differenziate() 
 | 
						|
  if (k != K_TAB) return TRUE;
 | 
						|
 | 
						|
  sht* s = (sht*)get_app_data();
 | 
						|
  Pagamento*    pag = s->_pag;
 | 
						|
  TSheet_field* shf = s->_sht;
 | 
						|
  TMask*        msk = s->_msk;
 | 
						|
  TArray*       rws = s->_rws;
 | 
						|
  
 | 
						|
  if (!pag) return TRUE;
 | 
						|
  pag->set_rate_differenziate(msk->get_int(F_RATE_DIFF));
 | 
						|
  if (pag->dirty())
 | 
						|
  {
 | 
						|
    pag->set_sheet(*shf);
 | 
						|
    (*rws) = shf->rows_array(); 
 | 
						|
  }
 | 
						|
  return TRUE;
 | 
						|
}                                                                 
 | 
						|
 | 
						|
bool BA3700_application::tipo_prima_rata(TMask_field& f, KEY k)                  
 | 
						|
{   
 | 
						|
  // aggiunge o toglie se necessario rata 0, lasciando 
 | 
						|
  // le altre e shiftando le scadenze 
 | 
						|
  // pag->set_tipo_prima_rata()
 | 
						|
  if (k != K_TAB) return TRUE;
 | 
						|
 | 
						|
  sht* s = (sht*)get_app_data();
 | 
						|
  Pagamento*    pag = s->_pag;
 | 
						|
  TSheet_field* shf = s->_sht;
 | 
						|
  TMask*        msk = s->_msk;
 | 
						|
  TArray*       rws = s->_rws;
 | 
						|
  
 | 
						|
  if (!pag || pag->n_rate() == 0) return TRUE;
 | 
						|
 | 
						|
  int ir = msk->get_int(F_INT_RATE);
 | 
						|
  if (ir == 0) ir = -1;
 | 
						|
 | 
						|
  pag->set_tipo_prima_rata(msk->get_int(F_TIPO_PRIMA_RATA),ir);
 | 
						|
  if (pag->dirty())
 | 
						|
  {
 | 
						|
    pag->set_sheet(*shf);  
 | 
						|
    (*rws) = shf->rows_array(); 
 | 
						|
  }
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
bool BA3700_application::numero_rate(TMask_field& f, KEY k)                  
 | 
						|
{
 | 
						|
  // azzera tutto e ricrea da capo mantenendo le scadenze che ci sono 
 | 
						|
  if (k != K_TAB) return TRUE;
 | 
						|
 | 
						|
  sht* s = (sht*)get_app_data();
 | 
						|
  Pagamento*    pag = s->_pag;
 | 
						|
  TSheet_field* shf = s->_sht;
 | 
						|
  TMask*        msk = s->_msk;
 | 
						|
  TArray*       rws = s->_rws;
 | 
						|
  int nr = msk->get_int(F_NUM_RATE);
 | 
						|
  if (!pag || nr == pag->n_rate() || msk->get(F_NUM_RATE).empty()) return TRUE;
 | 
						|
  int ir = msk->get_int(F_INT_RATE);
 | 
						|
  if (ir == 0) ir = -1;
 | 
						|
  
 | 
						|
  pag->set_numero_rate(msk->get_int(F_NUM_RATE),ir);       
 | 
						|
  if (pag->dirty())
 | 
						|
  {
 | 
						|
    pag->set_sheet(*shf);  
 | 
						|
    (*rws) = shf->rows_array(); 
 | 
						|
  }                              
 | 
						|
  
 | 
						|
  msk->field(F_NUM_RATE).set(format("%d",pag->n_rate()));
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
bool BA3700_application::mese_commerciale(TMask_field& f, KEY k)                  
 | 
						|
{
 | 
						|
  // setta mcomm e ricalcola le scadenze 
 | 
						|
  // pag->set_mese_commerciale()
 | 
						|
  //  if (k != K_ENTER) return FALSE;
 | 
						|
 | 
						|
  sht* s = (sht*)get_app_data();
 | 
						|
  Pagamento*    pag = s->_pag;
 | 
						|
  TSheet_field* shf = s->_sht;
 | 
						|
  TMask*        msk = s->_msk; 
 | 
						|
  TArray*       rws = s->_rws;
 | 
						|
 | 
						|
  if (!pag) return TRUE;
 | 
						|
  int ir = msk->get_int(F_INT_RATE);
 | 
						|
  if (ir == 0) ir = -1;
 | 
						|
 | 
						|
  pag->set_mese_commerciale(msk->get_bool(F_MESECOMM),ir);
 | 
						|
  if (pag->dirty())
 | 
						|
  {
 | 
						|
    pag->set_sheet(*shf);
 | 
						|
    (*rws) = shf->rows_array(); 
 | 
						|
    msk->field(F_INT_RATE).set(format("%d",ir)); 
 | 
						|
  }
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
// qui viene il belloccio                  
 | 
						|
bool BA3700_application::sheet_action(int r, KEY k)                                                                                
 | 
						|
{                                              
 | 
						|
  bool doit = TRUE, m_perc = FALSE, m_pag = FALSE;
 | 
						|
  bool m_scad = FALSE, m_tipo = FALSE, mod = FALSE;
 | 
						|
  word ahiahi = P_OK;                                
 | 
						|
 | 
						|
  sht* s = (sht*)get_app_data();
 | 
						|
  Pagamento*    pag = s->_pag;
 | 
						|
  TSheet_field* shf = s->_sht;
 | 
						|
  TMask*        msk = s->_msk;
 | 
						|
  TArray*       rws = s->_rws;
 | 
						|
  
 | 
						|
  if (!pag) return TRUE;
 | 
						|
 | 
						|
  TString news(15), newp(15), newt(2);                                  
 | 
						|
  TToken_string ts(36), ns(36);
 | 
						|
  bool recalc = TRUE;                
 | 
						|
  
 | 
						|
 | 
						|
  switch (k)
 | 
						|
  {
 | 
						|
  case K_SPACE:
 | 
						|
    break;
 | 
						|
  case K_ENTER:
 | 
						|
  {     
 | 
						|
    ns  = shf->row(r);     
 | 
						|
    ts  = (TToken_string&)(*rws)[r];    
 | 
						|
    
 | 
						|
    news = ns.get(0);
 | 
						|
    newp = ns.get(1);
 | 
						|
    newt = ns.get(2);                                            
 | 
						|
    
 | 
						|
    // qui viene il bello, si fa per dire 
 | 
						|
    if (ts.get_int(0) != atoi(news))  // modificata scadenza
 | 
						|
    {                            
 | 
						|
      mod  = m_scad = TRUE;        
 | 
						|
    }
 | 
						|
    const real p0(ts.get(1));
 | 
						|
    const real p1(newp);
 | 
						|
 | 
						|
    if (p0 != p1)  // modificata percentuale
 | 
						|
    {                
 | 
						|
      mod  = m_perc = TRUE;        
 | 
						|
    }
 | 
						|
    if (strcmp(ts.get(2),newt) != 0)  // modificato tipo pagamento
 | 
						|
    {                 
 | 
						|
      mod  = m_tipo = TRUE;      
 | 
						|
    }
 | 
						|
  }
 | 
						|
    break;
 | 
						|
  case K_DEL:
 | 
						|
  case K_INS:
 | 
						|
    doit = FALSE;
 | 
						|
    break;
 | 
						|
  default:
 | 
						|
    break;
 | 
						|
  }          
 | 
						|
  
 | 
						|
 | 
						|
  // settato da recalc_rate se occorre ridefinire lo sheet
 | 
						|
  // aggiungendo o togliendo righe
 | 
						|
  bool need_recalc = FALSE;      
 | 
						|
 | 
						|
  if (k == K_ENTER) 
 | 
						|
  {
 | 
						|
    if (mod && recalc)
 | 
						|
    {
 | 
						|
      // ricalcola sheet come sai fare tu
 | 
						|
      int rdiff = atoi(msk->get(F_RATE_DIFF));
 | 
						|
      ahiahi = pag->recalc_rate(r, m_perc, 
 | 
						|
                                (m_perc ? (const char*)newp : NULL),
 | 
						|
                                (m_scad ? (const char*)news : NULL),
 | 
						|
                                (m_tipo ? (const char*)newt : NULL), 
 | 
						|
                                rdiff, 
 | 
						|
                                pag->mese_commerciale(),
 | 
						|
                                need_recalc);
 | 
						|
      // see if parameters changed                          
 | 
						|
      msk->field(F_RATE_DIFF).set(pag->rate_differenziate() ? "1" : "2");
 | 
						|
      msk->field(F_MESECOMM).set(pag->mese_commerciale()   ? "X" : "");
 | 
						|
    }
 | 
						|
    if (!recalc)
 | 
						|
    {                              
 | 
						|
      ahiahi = P_OK;
 | 
						|
      // put data as they are
 | 
						|
      TToken_string& trw = pag->rata(r);
 | 
						|
      TToken_string  srw = trw;
 | 
						|
      if (m_scad)  trw.add(news,0);
 | 
						|
      if (m_perc)  trw.add(newp,1);
 | 
						|
      if (m_tipo)  trw.add(newt,2);
 | 
						|
      // validate the payment
 | 
						|
      if ((ahiahi = pag->validate()) != P_OK)
 | 
						|
        pag->rata(r) = srw;
 | 
						|
    }
 | 
						|
    if (ahiahi)  // any error?
 | 
						|
      // rimetti le righe com'erano prima
 | 
						|
    {  
 | 
						|
      beep(); 
 | 
						|
      
 | 
						|
      // se gli errori sono voluti, spiegali
 | 
						|
      if (!recalc)
 | 
						|
      {                    
 | 
						|
        TString s(256);
 | 
						|
        pag->strerr(ahiahi,s);
 | 
						|
        warning_box(s);
 | 
						|
      }
 | 
						|
      
 | 
						|
      shf->row(r) = (TToken_string&)(*rws)[r]; 
 | 
						|
      shf->force_update(r); 
 | 
						|
    } 
 | 
						|
    
 | 
						|
else if (recalc && mod && need_recalc) 
 | 
						|
{                                   
 | 
						|
  // ridefinisci lo sheet sulla base delle nuove rate
 | 
						|
  pag->set_sheet(*shf);
 | 
						|
  shf->force_update(-1);         
 | 
						|
  rws->destroy();
 | 
						|
  (*rws) = shf->rows_array();      
 | 
						|
}                                                 
 | 
						|
 | 
						|
msk->field(F_NUM_RATE).set(format("%d", pag->n_rate())); 
 | 
						|
}
 | 
						|
 | 
						|
return doit;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
int BA3700_application::rewrite(const TMask& m)
 | 
						|
{
 | 
						|
  TTable& tab_rpg = (TTable&)_rel->lfile(-ALIAS);
 | 
						|
  const int err = _pag->rewrite(tab_rpg); 
 | 
						|
  if (err != NOERR) return err; 
 | 
						|
  m.autosave(_rel);
 | 
						|
  return _rel->lfile().rewrite();
 | 
						|
}
 | 
						|
 | 
						|
int BA3700_application::write(const TMask& m)
 | 
						|
{
 | 
						|
  TTable& tab_rpg = (TTable&)_rel->lfile(-ALIAS);  
 | 
						|
  const int err = _pag->write(tab_rpg);  
 | 
						|
  if (err != NOERR) return err; 
 | 
						|
  m.autosave(_rel);
 | 
						|
  return _rel->lfile().write();
 | 
						|
}
 | 
						|
 | 
						|
bool BA3700_application::remove()
 | 
						|
{
 | 
						|
  TTable& tab_rpg = (TTable&)_rel->lfile(-ALIAS);
 | 
						|
  return _pag->remove(tab_rpg) == NOERR && _rel->lfile().remove() == NOERR;
 | 
						|
}
 | 
						|
 | 
						|
int ba3700(int argc, char* argv[])
 | 
						|
{
 | 
						|
  BA3700_application a;
 | 
						|
  a.run(argc, argv, "Condizioni di pagamento");
 | 
						|
  return 0;
 | 
						|
}
 |