campo-sirio/src/li/li0400.cpp
Alessandro Bonazzi 59005050c9 Patch level : 12.0 982
Files correlati     : li0.exe f154.dir f154.trr li0200a.msk li0300a.msk li0400a.msk limenu.men
Commento            :

Ristrutturato modulo li
2020-07-26 19:57:29 +02:00

275 lines
6.7 KiB
C++
Executable File
Raw Blame History

#include <automask.h>
#include <defmask.h>
#include <relapp.h>
#include <tabutil.h>
#include "lilib01.h"
#include "li0.h"
#include "li0400a.h"
#include "letint.h"
//-------------------------------------------------------------------
// MASCHERA (li0400a)
//-------------------------------------------------------------------
class TLetint_mask : public TAutomask
{
protected:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
virtual bool on_key(KEY k);
bool block;
bool keyforced;
public:
TDate ultima_stampa(int anno);
bool is_registro(int anno) { return ultima_stampa(anno) > botime;}
TLetint_mask();
};
bool TLetint_mask::on_key(KEY k)
{
if (k == K_SHIFT+K_F12 && (edit_mode() || insert_mode()))
{
keyforced = true;
enable(DLG_SAVEREC);
enable(F_NUMPROT);
enable(F_UTILIZZATO);
}
if (k == K_SHIFT+K_F11)
keyforced = false;
return TAutomask::on_key(k);
}
bool TLetint_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
switch (o.dlg())
{
case F_ANNO:
if (e == fe_modify || e == fe_init || e == fe_close)
{
if (!is_registro(atoi(o.get())))
return error_box(FR("Manca il registro dichiarazioni d'intento per l'anno %d"), atoi(o.get()));
}
case F_NUMPROT:
if (e == fe_close && query_mode())
{
const long numprot = get_long(F_NUMPROT);
if (!keyforced && numprot > 1)
{
const int anno = get_int(F_ANNO);
TLocalisamfile letint(LF_LETINT);
letint.put(LETINT_ANNO, anno);
letint.put(LETINT_NUMPROT, numprot - 1);
if (letint.read() != NOERR)
return error_box(TR("Il numero di protocollo deve essere progressivo!"));
}
}
break;
case F_DATAREG:
if (e == fe_close && insert_mode())
{
const long numprot = get_long(F_NUMPROT);
if (numprot > 1)
{
const int anno = get_int(F_ANNO);
TLocalisamfile letint(LF_LETINT);
letint.put(LETINT_ANNO, anno);
letint.put(LETINT_NUMPROT, numprot - 1);
if (letint.read() == NOERR)
{
const TDate& old_data = letint.get_date(LETINT_DATAREG);
if (get_date(F_DATAREG) < old_data)
return error_box(TR("La data di registrazione non puo' essere antecedente a %s"), (const char*) old_data.string());
}
else
{
TDate ultima = ultima_stampa(anno);
if (get_date(F_DATAREG) <= ultima)
return error_box(TR("La data di registrazione non puo' essere antecedente a %s"), (const char*)ultima.string());
}
}
}
else
if (e == fe_modify)
{
}
break;
case F_DAL:
if(e != fe_modify)
break;
case F_TIPOOP:
// Controlli
if(!keyforced && insert_mode() && get_int(F_TIPOOP) == 3 && get_date(F_DAL) > TDate(01,03,2017))
{
error_box(TR("Non pu<70> esistere una dichiarazione di intento di tipo \"A Periodo\"\ncon data posteriore al 01/03/2017!"));
disable(DLG_SAVEREC);
}
else
{
enable(DLG_SAVEREC);
}
// Abilitazione date
switch (get_int(F_TIPOOP))
{
case 1:
disable(F_DAL);
disable(F_AL);
set(F_DAL, "");
set(F_AL, "");
break;
case 2:
enable(F_DAL);
disable(F_AL);
set(F_AL, "");
break;
case 3:
enable(F_DAL);
enable(F_AL);
break;
}
break;
default:
break;
}
return true;
}
TDate TLetint_mask::ultima_stampa(int anno)
{
TTable reg("REG");
TDate ultima_stampa = botime;
TString s; s.format("%0d", anno);
reg.put("CODTAB", s);
for (int err = reg.read(_isgteq); s == reg.get("CODTAB").left(4) && err == NOERR; err = reg.next())
if (reg.get_int("I0") == 10)
{
ultima_stampa = reg.get_date("D3");
if (!ultima_stampa.ok())
{
ultima_stampa.set_day(1);
ultima_stampa.set_month(1);
ultima_stampa.set_year(anno);
--ultima_stampa;
}
}
return ultima_stampa;
}
TLetint_mask::TLetint_mask() : TAutomask("li0400a"), block(false), keyforced(false)
{
first_focus(F_ANNO);
}
//--------------------------------------------------------------
// APPLICAZIONE
//--------------------------------------------------------------
class TLetint : public TRelation_application
{
TLetint_mask* _mask;
TRelation* _rel;
protected:
bool user_create();
bool user_destroy();
virtual TMask* get_mask(int mode) { return _mask; }
virtual bool changing_mask(int mode) { return false; }
virtual bool protected_record(TRectype &rec);
virtual void init_query_mode(TMask& m);
virtual void init_modify_mode(TMask& m);
virtual bool get_next_key(TToken_string& key);
public:
// @cmember Disabilita la verifica del modulo : essendo una anagrafica, va sempre abilitata
virtual bool check_autorization() const {return true;}
virtual TRelation* get_relation() const {return (TRelation*)_rel;}
};
bool TLetint::get_next_key(TToken_string& key)
{
TLocalisamfile& letint = _rel->lfile() ;
long numprot = 1L ;
const int anno(_mask->get_int(F_ANNO)) ;
if (!letint.empty())
{
letint.zero() ;
letint.setkey(1) ;
letint.put(LETINT_ANNO, anno);
letint.read(_isgteq);
if (letint.good()) //se e' tutto ok,si posiziona sull'ultimo record con l'anno selezionato
letint.last();
if (letint.good())
{
const int year(letint.get_int(LETINT_ANNO));
if (year == anno)
numprot += letint.get_long(LETINT_NUMPROT);
}
}
key.format("%d|%d|%d|%ld", F_ANNO, anno, F_NUMPROT, numprot);
return true;
}
bool TLetint::protected_record(TRectype& rec) //evita la cancellazione del record se STAMPATO
{
bool prot = TRelation_application::protected_record(rec);
if (!prot)
{
prot = rec.get_bool(LETINT_STAMPATO);
}
return prot;
}
void TLetint::init_query_mode(TMask& m) //evita la registrazione di un record modificato se STAMPATO
{
m.disable(F_UTILIZZATO);
}
void TLetint::init_modify_mode(TMask& m) //evita la registrazione di un record modificato se STAMPATO
{
const TRectype& rec = get_relation()->curr();
const bool stampato = rec.get_bool(LETINT_STAMPATO);
if (stampato)
{
m.disable(DLG_SAVEREC);
m.disable(DLG_DELREC);
TString msg = TR("Dichiarazione gi<67> stampata sul registro dell'esercizio ");
xvtil_statbar_set(msg);
}
m.disable(F_UTILIZZATO);
}
bool TLetint::user_create()
{
_rel = new TRelation(LF_LETINT);
_mask = new TLetint_mask;
return true;
}
bool TLetint::user_destroy()
{
delete _mask;
return true;
}
int li0400(int argc, char* argv[])
{
TLetint a;
a.run(argc, argv, TR("Lettere d'intento"));
return 0;
}