//Gestione acconti: questo assurdo prg viene usato solo se ho un acconto da versare
//(cosa stabilita dal prg di calcolo acconti) e serve per versare meno, cioe'
//per frodare il fisco.
#include <relapp.h>
#include <config.h>
#include <msksheet.h>
#include <tabutil.h>
#include "cg4700.h"

#define ACCONTO_MENO_CREDITO real(200000.0)

class GesAcc_app : public TRelation_application
{
    TRelation*       _rel;
    TMask*           _mask; 
    TTable*          _lim; 
  
  private:               
    static bool msk_credito(TMask_field&, KEY);
    static bool msk_acconto(TMask_field&, KEY);    
    
  protected:
    virtual bool       user_create();
    virtual bool       user_destroy();
    virtual TRelation* get_relation() const { return _rel; }
    virtual TMask*     get_mask(int mode);
    virtual bool       changing_mask(int mode) {return FALSE; }
    //virtual int        rewrite(const TMask&);
    //virtual void       init_query_mode (TMask&);
    //virtual void       init_query_insert_mode (TMask&);
};                    

inline GesAcc_app& app() 
{
  return (GesAcc_app&) main_app();
}

bool GesAcc_app::user_create()
{ 
  _lim = new TTable("LIM");
  _rel = new TRelation("%LIA");
  
  _mask = new TMask("cg4700a");
  _mask->set_handler(F_ACCONTO, msk_acconto);
  _mask->set_handler(F_CREDITO, msk_credito);
  
  set_search_field(F_CODDITTA);
  
  return TRUE; 
}

bool GesAcc_app::user_destroy()
{                                  
  delete _mask;
  delete _lim; 
  delete _rel;
  
  return TRUE;
}

bool GesAcc_app::msk_credito(TMask_field& f, KEY k)
{
  if (k == K_ENTER)
  {
    real credito (f.get());
    real acconto (f.mask().get(F_ACCONTO));
    if (credito.sign() < 0)
       return f.error_box("Introdurre un valore non negativo");
    if (credito > acconto)
      return f.error_box("Il credito non puo' essere superiore all'acconto");
    if (acconto.is_zero())
      if (!credito.is_zero())
        return f.error_box("Non e' possibile indicare il credito se l'acconto e' nullo");
  }
  return TRUE;
}

bool GesAcc_app::msk_acconto(TMask_field& f, KEY k)
{
  if (k == K_ENTER)
  {
    real credito (f.mask().get(F_CREDITO));
    real acconto (f.get());
    if (!acconto.is_zero())
    {
      if (acconto.sign() < 0)
        return f.error_box("Introdurre un valore non negativo"); 
      if (acconto - credito < ACCONTO_MENO_CREDITO)   
        return f.error_box("La differenza tra acconto e credito deve essere superiore a lire %s", ACCONTO_MENO_CREDITO.string("."));
    }
  }  
  return TRUE;
}

/*** Deve farlo il programma di stampa versamenti!
int GesAcc_app::rewrite(const TMask& m)
{
  TString16 chiave;
  int anno = m.get_int(F_ANNO);
  
  chiave << anno << 12;
  
  TTable lim ("LIM");
  lim.put("CODTAB", chiave);
  if (lim.read() == NOERR)
  {
   real new_acc (m.get(F_ACCONTO));
   real new_cred = lim.get_real("R12") - lim.get_real("R11") + new_acc;
   lim.put("R11", new_acc);
   lim.put("R12", new_cred);
   lim.put("R0",  lim.get_real("R13")- new_cred);   
   lim.rewrite();
  } 
   
  m.autosave(_rel);
  return _rel->rewrite();
}    
***/

TMask* GesAcc_app::get_mask(int mode)
{
  return _mask;
}

int cg4700(int argc, char* argv[])
{
  GesAcc_app app;
  app.run(argc, argv, "Gestione acconti");
  return 0;
}
