Allineamento file modificati durante la transizione da cvs a svn
git-svn-id: svn://10.65.10.50/branches/R_10_00@22612 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
cbe7122e89
commit
4dc843a0a2
@ -512,8 +512,20 @@ void TPrimanota_application::on_firm_change()
|
|||||||
TRelation_application::on_firm_change(); // May be useful, who knows?
|
TRelation_application::on_firm_change(); // May be useful, who knows?
|
||||||
|
|
||||||
_lastreg = 0;
|
_lastreg = 0;
|
||||||
if (_rel->lfile().last() == NOERR)
|
|
||||||
_lastreg = _rel->curr().get_long(MOV_NUMREG); // Init last registration number
|
TLocalisamfile& m = _rel->lfile();
|
||||||
|
TWait_cursor hourglass;
|
||||||
|
|
||||||
|
int err = m.last();
|
||||||
|
if (err != _isemptyfile)
|
||||||
|
{
|
||||||
|
while (err == _islocked)
|
||||||
|
{
|
||||||
|
xvt_sys_sleep(1000);
|
||||||
|
err = m.last();
|
||||||
|
}
|
||||||
|
_lastreg = m.get_long(MOV_NUMREG); // Init last registration number
|
||||||
|
}
|
||||||
|
|
||||||
_esercizi.update(); // Init exercises
|
_esercizi.update(); // Init exercises
|
||||||
}
|
}
|
||||||
@ -523,7 +535,7 @@ void TPrimanota_application::on_config_change()
|
|||||||
TConfig cnf(CONFIG_DITTA, "cg");
|
TConfig cnf(CONFIG_DITTA, "cg");
|
||||||
_ges_val = cnf.get_bool("GesVal");
|
_ges_val = cnf.get_bool("GesVal");
|
||||||
_ges_sal = cnf.get_bool("GesSal");
|
_ges_sal = cnf.get_bool("GesSal");
|
||||||
_easy_sal = _ges_sal && cnf.get_bool("EasySal", NULL, -1, false);
|
_easy_sal = _ges_sal && cnf.get_bool("EasySal", NULL, -1, false) && xvt_vobj_get_attr(NULL_WIN, ATTR_APPL_VERSION_YEAR) > 2101;
|
||||||
|
|
||||||
_npart_is_prot = cnf.get_bool("RifPro");
|
_npart_is_prot = cnf.get_bool("RifPro");
|
||||||
_liqdiff = cnf.get_bool("GesLiqDiff");
|
_liqdiff = cnf.get_bool("GesLiqDiff");
|
||||||
|
@ -1122,7 +1122,7 @@ void TPartita::carica_allineamento()
|
|||||||
_for_align = cd.get_bool("NrForDx") ? 'R' : 'L';
|
_for_align = cd.get_bool("NrForDx") ? 'R' : 'L';
|
||||||
|
|
||||||
// Nel nuovo saldaconto si possono rilevare le differenze cambi su pagamenti non a saldo
|
// Nel nuovo saldaconto si possono rilevare le differenze cambi su pagamenti non a saldo
|
||||||
_diffcam_always = cd.get_bool("EasySal") && cd.get_bool("DiffCamAlways");
|
_diffcam_always = cd.get_bool("EasySal") && cd.get_bool("DiffCamAlways") && xvt_vobj_get_attr(NULL_WIN, ATTR_APPL_VERSION_YEAR) > 2091;
|
||||||
}
|
}
|
||||||
|
|
||||||
char TPartita::allineamento_richiesto(char tipocf)
|
char TPartita::allineamento_richiesto(char tipocf)
|
||||||
@ -2170,7 +2170,7 @@ TPartita* TPartite_array::find(const TBill& clifo, int anno, const char* num, bo
|
|||||||
TPartita* TPartite_array::find(const TRectype& r, bool create)
|
TPartita* TPartite_array::find(const TRectype& r, bool create)
|
||||||
{
|
{
|
||||||
TBill zio; zio.get(r);
|
TBill zio; zio.get(r);
|
||||||
if (zio.gruppo() == 0)
|
if (zio.gruppo() == 0 && r.num() == LF_PARTITE)
|
||||||
{
|
{
|
||||||
zio.set(r.get_int(PART_GRUPPOCL), r.get_int(PART_CONTOCL),
|
zio.set(r.get_int(PART_GRUPPOCL), r.get_int(PART_CONTOCL),
|
||||||
zio.codclifo(), zio.tipo());
|
zio.codclifo(), zio.tipo());
|
||||||
|
@ -285,7 +285,7 @@ public:
|
|||||||
const TBill& conto() const { return _conto; }
|
const TBill& conto() const { return _conto; }
|
||||||
int anno() const { return _anno; }
|
int anno() const { return _anno; }
|
||||||
const TString& numero() const { return _num; }
|
const TString& numero() const { return _num; }
|
||||||
const TString& descrizione() const;
|
//const TString& descrizione() const;
|
||||||
const char* build_key(TString& key) const;
|
const char* build_key(TString& key) const;
|
||||||
|
|
||||||
TImporto importo_speso(long numreg, int numrig, bool valuta, int mode = 0xF) const;
|
TImporto importo_speso(long numreg, int numrig, bool valuta, int mode = 0xF) const;
|
||||||
|
@ -193,16 +193,16 @@ int TEffetto::remove(TLocalisamfile& f)const
|
|||||||
|
|
||||||
// restituisce true se l'effetto si riferisce ad una sola fattura
|
// restituisce true se l'effetto si riferisce ad una sola fattura
|
||||||
// ovvero se l'effetto non è raggruppato
|
// ovvero se l'effetto non è raggruppato
|
||||||
bool TEffetto::fatt(long num)
|
bool TEffetto::fatt() const
|
||||||
{
|
{
|
||||||
|
/* Codice inutile: rimosso il 14/03/2012
|
||||||
TLocalisamfile righe_eff(LF_REFFETTI);
|
TLocalisamfile righe_eff(LF_REFFETTI);
|
||||||
righe_eff.put(REFF_NPROGTR, num);
|
righe_eff.put(REFF_NPROGTR, num);
|
||||||
righe_eff.read();
|
righe_eff.read();
|
||||||
|
*/
|
||||||
// prende il numero delle righe dell'effetto
|
// prende il numero delle righe dell'effetto
|
||||||
// ovvero di fatture a cui fa riferimento
|
// ovvero di fatture a cui fa riferimento
|
||||||
int items = rows_r();
|
return rows_r() == 1;
|
||||||
bool condition = (items == 1);
|
|
||||||
return condition;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// restituisce i dati relativi alle fatture a cui si riferisce l'effetto
|
// restituisce i dati relativi alle fatture a cui si riferisce l'effetto
|
||||||
|
@ -86,7 +86,7 @@ public:
|
|||||||
// setta i campi per la prima chiave del file
|
// setta i campi per la prima chiave del file
|
||||||
void put_key(TRectype& rec,long numeff) const;
|
void put_key(TRectype& rec,long numeff) const;
|
||||||
// restituisce true se l'effetto si riferisce ad una sola fattura
|
// restituisce true se l'effetto si riferisce ad una sola fattura
|
||||||
bool fatt(long num);
|
bool fatt() const;
|
||||||
// restituisce i dati relativi alle fatture a cui si riferisce l'effetto
|
// restituisce i dati relativi alle fatture a cui si riferisce l'effetto
|
||||||
TToken_string& dati_fatt(long num, const bool valuta, TToken_string& dati);
|
TToken_string& dati_fatt(long num, const bool valuta, TToken_string& dati);
|
||||||
// restituisce i dati codnum, ndoc, anno relativi alle fatture a cui si riferisce l'effetto
|
// restituisce i dati codnum, ndoc, anno relativi alle fatture a cui si riferisce l'effetto
|
||||||
|
@ -255,7 +255,7 @@ int TVariazione_distinte::read(TMask& m)
|
|||||||
riga.add(cache().get(LF_CLIFO, codice, CLI_RAGSOC));
|
riga.add(cache().get(LF_CLIFO, codice, CLI_RAGSOC));
|
||||||
riga.add(get_ban_desc(eff));
|
riga.add(get_ban_desc(eff));
|
||||||
|
|
||||||
if (eff.fatt(numero))// se l'effetto contiene solo una fattura
|
if (eff.fatt())// se l'effetto contiene solo una fattura
|
||||||
{ // metto i riferimenti al documento ed al numero di rata
|
{ // metto i riferimenti al documento ed al numero di rata
|
||||||
const TRectype& rec_r = eff.row_r(1);
|
const TRectype& rec_r = eff.row_r(1);
|
||||||
riga.add(rec_r.get(REFF_NFATT));
|
riga.add(rec_r.get(REFF_NFATT));
|
||||||
@ -503,11 +503,11 @@ void TVariazione_distinte::carica_riba(int tipopag, const bool reset)
|
|||||||
// se non indico un tipo di effetto prendo il tipo del primo che
|
// se non indico un tipo di effetto prendo il tipo del primo che
|
||||||
// seleziono
|
// seleziono
|
||||||
const bool to_select = (tipopag == 0) || (tipopag == tipop) ||
|
const bool to_select = (tipopag == 0) || (tipopag == tipop) ||
|
||||||
((tipopag == 2 || tipopag ==5 || tipopag == 7) &&
|
((tipopag == 2 || tipopag == 5 || tipopag == 7) &&
|
||||||
(tipop == 2 || tipop ==5 || tipop == 7));
|
(tipop == 2 || tipop == 5 || tipop == 7));
|
||||||
const char tipo = eff.get_tipo();
|
const char tipo = eff.get_tipo();
|
||||||
|
|
||||||
TString16 valuta = eff.get(EFF_CODVAL);
|
const TString4 valuta = eff.get(EFF_CODVAL);
|
||||||
|
|
||||||
const bool valuta_ok = ::same_values(valuta, codval);
|
const bool valuta_ok = ::same_values(valuta, codval);
|
||||||
const long numero = eff.get_long(EFF_NPROGTR);
|
const long numero = eff.get_long(EFF_NPROGTR);
|
||||||
@ -524,7 +524,7 @@ void TVariazione_distinte::carica_riba(int tipopag, const bool reset)
|
|||||||
riga.add(cache().get(LF_CLIFO, codice, CLI_RAGSOC));
|
riga.add(cache().get(LF_CLIFO, codice, CLI_RAGSOC));
|
||||||
riga.add(get_ban_desc(eff));
|
riga.add(get_ban_desc(eff));
|
||||||
|
|
||||||
if (eff.fatt(numero))// se l'effetto contiene solo una fattura
|
if (eff.fatt())// se l'effetto contiene solo una fattura
|
||||||
{ // metto i riferimenti al documento ed al numero di rata
|
{ // metto i riferimenti al documento ed al numero di rata
|
||||||
const TRectype& rec_r = eff.row_r(1);
|
const TRectype& rec_r = eff.row_r(1);
|
||||||
riga.add(rec_r.get(REFF_NFATT));
|
riga.add(rec_r.get(REFF_NFATT));
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
#include <applicat.h>
|
#include <applicat.h>
|
||||||
#include <msksheet.h>
|
#include <msksheet.h>
|
||||||
|
#include <progind.h>
|
||||||
|
#include <recset.h>
|
||||||
#include <relation.h>
|
#include <relation.h>
|
||||||
|
|
||||||
#include "ef0.h"
|
#include "ef0.h"
|
||||||
@ -25,9 +27,7 @@ protected:
|
|||||||
static bool conferma_handler(TMask_field& f, KEY k);
|
static bool conferma_handler(TMask_field& f, KEY k);
|
||||||
static bool annulla_handler(TMask_field& f, KEY k);
|
static bool annulla_handler(TMask_field& f, KEY k);
|
||||||
static void elimina();
|
static void elimina();
|
||||||
public:
|
static void elimina_orfani(const TRectype* from);
|
||||||
TEliminazione_effetti() {};
|
|
||||||
virtual ~TEliminazione_effetti() {};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// restituisce un riferimento all' applicazione
|
// restituisce un riferimento all' applicazione
|
||||||
@ -140,6 +140,17 @@ bool TEliminazione_effetti::to_data_handler(TMask_field& f, KEY k)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TEliminazione_effetti::elimina_orfani(const TRectype* from)
|
||||||
|
{
|
||||||
|
TString query = "USE REFFETTI SELECT 31.NPROGTR=0\nJOIN 31 INTO NPROGTR==NPROGTR\n";
|
||||||
|
if (from && !from->empty())
|
||||||
|
query << "\nFROM NPROGTR=" << from->get("NPROGTR");
|
||||||
|
TISAM_recordset orfani(query);
|
||||||
|
TLocalisamfile& f = orfani.cursor()->file();
|
||||||
|
for (bool ok = orfani.move_first(); ok; ok = orfani.move_next())
|
||||||
|
f.remove();
|
||||||
|
}
|
||||||
|
|
||||||
// Si effettua l'istanziazione del cursore e si eliminano gli effetti che vi
|
// Si effettua l'istanziazione del cursore e si eliminano gli effetti che vi
|
||||||
// appartengono
|
// appartengono
|
||||||
void TEliminazione_effetti::elimina()
|
void TEliminazione_effetti::elimina()
|
||||||
@ -178,27 +189,37 @@ void TEliminazione_effetti::elimina()
|
|||||||
default : //cancello tutti gli effetti
|
default : //cancello tutti gli effetti
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
TCursor cur(rel,filter,key,from,to); // istanzio il cursore
|
TCursor cur(rel,filter,key,from,to); // istanzio il cursore
|
||||||
|
const long n = cur.items();// prendo il numero di elementi del cursore
|
||||||
|
|
||||||
|
if (n > 0)
|
||||||
|
{
|
||||||
|
if (noyes_box(TR("Si desidera veramente eliminare %ld effetti?"), n))
|
||||||
|
{
|
||||||
TLocalisamfile& delfile = cur.file();// prendo un riferimento al file
|
TLocalisamfile& delfile = cur.file();// prendo un riferimento al file
|
||||||
long n = cur.items();// prendo il numero di elementi del cursore
|
|
||||||
cur.freeze();// congelo lo stato del cursore
|
cur.freeze();// congelo lo stato del cursore
|
||||||
|
TProgind pi(n, main_app().title());
|
||||||
for (cur=0; cur.pos() < n; ++cur)// scandisco tutti gli elementi del cursore
|
for (cur=0; cur.pos() < n; ++cur)// scandisco tutti gli elementi del cursore
|
||||||
{
|
{
|
||||||
|
if (!pi.addstatus(1))
|
||||||
|
break;
|
||||||
TEffetto eff(delfile.curr());// istanzio un effetto
|
TEffetto eff(delfile.curr());// istanzio un effetto
|
||||||
eff.remove(delfile); // e lo cancello
|
eff.remove(delfile); // e lo cancello
|
||||||
}
|
}
|
||||||
|
elimina_orfani(from);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
warning_box(TR("Non sono stati selezionati effetti da eliminare"));
|
||||||
}
|
}
|
||||||
|
|
||||||
//Handler per gestire la conferma della cancellazione degli effetti
|
//Handler per gestire la conferma della cancellazione degli effetti
|
||||||
bool TEliminazione_effetti::conferma_handler(TMask_field& f, KEY k)
|
bool TEliminazione_effetti::conferma_handler(TMask_field& f, KEY k)
|
||||||
{
|
{
|
||||||
TMask &m = f.mask();
|
|
||||||
if (k == K_SPACE)
|
if (k == K_SPACE)
|
||||||
{
|
|
||||||
if (yesno_box(TR("Si desidera veramente eliminare gli effetti selezionati")))
|
|
||||||
elimina();
|
elimina();
|
||||||
}
|
return true;
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handler per gestire la conferma dell'annullamento dei dati
|
// Handler per gestire la conferma dell'annullamento dei dati
|
||||||
@ -216,7 +237,7 @@ bool TEliminazione_effetti::annulla_handler(TMask_field& f, KEY k)
|
|||||||
|
|
||||||
int ef0400(int argc, char* argv[])
|
int ef0400(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
TEliminazione_effetti a ;
|
TEliminazione_effetti a;
|
||||||
a.run(argc, argv, TR("Eliminazione Effetti"));
|
a.run(argc, argv, TR("Eliminazione Effetti"));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -75,7 +75,7 @@ BEGIN
|
|||||||
DISPLAY "Data scadenza" DATASCAD
|
DISPLAY "Data scadenza" DATASCAD
|
||||||
OUTPUT F_A_RIBA NPROGTR
|
OUTPUT F_A_RIBA NPROGTR
|
||||||
// CHECKTYPE NORMAL
|
// CHECKTYPE NORMAL
|
||||||
NUM_EXPR {#THIS_FIELD>=#F_DA_RIBA}
|
NUM_EXPR (#THIS_FIELD==0)||(#THIS_FIELD>=#F_DA_RIBA)
|
||||||
WARNING "Limite superiore non valido"
|
WARNING "Limite superiore non valido"
|
||||||
END
|
END
|
||||||
|
|
||||||
|
@ -693,7 +693,7 @@ bool TRiba_form::validate(TForm_item &cf, TToken_string &s)
|
|||||||
TEffetto effetto(cursor()->file().curr());// = eff.curr();
|
TEffetto effetto(cursor()->file().curr());// = eff.curr();
|
||||||
long num = effetto.numero();
|
long num = effetto.numero();
|
||||||
const bool in_valuta = effetto.in_valuta();
|
const bool in_valuta = effetto.in_valuta();
|
||||||
bool condition = (effetto.fatt(num));//TRUE se effetto non raggruppato
|
bool condition = (effetto.fatt());//TRUE se effetto non raggruppato
|
||||||
TToken_string dati; effetto.dati_fatt(num, in_valuta, dati);
|
TToken_string dati; effetto.dati_fatt(num, in_valuta, dati);
|
||||||
TString in(s.get());
|
TString in(s.get());
|
||||||
if (in[0]=='!')
|
if (in[0]=='!')
|
||||||
|
@ -505,7 +505,7 @@ void TApplication::run(
|
|||||||
|
|
||||||
bool TApplication::get_version_info(int& year, int& release, int& tag, int& patch)
|
bool TApplication::get_version_info(int& year, int& release, int& tag, int& patch)
|
||||||
{
|
{
|
||||||
const char* const VERSIONANDPATCH = "Don't cry for me Argentina.2091.10.00.0212.2313";
|
const char* const VERSIONANDPATCH = "Don't cry for me Argentina.2121.11.00.0000.2132";
|
||||||
|
|
||||||
TToken_string vep(VERSIONANDPATCH, '.');
|
TToken_string vep(VERSIONANDPATCH, '.');
|
||||||
year = vep.get_int(1);
|
year = vep.get_int(1);
|
||||||
|
@ -1640,7 +1640,7 @@ static void clean_string(TString& str)
|
|||||||
{
|
{
|
||||||
char* d = str.get_buffer();
|
char* d = str.get_buffer();
|
||||||
for (const char* s = d; *s; s++)
|
for (const char* s = d; *s; s++)
|
||||||
if (isalnum(*s)) *d++ = *s;
|
if (*s < '\0' || isalnum(*s)) *d++ = *s;
|
||||||
*d = '\0';
|
*d = '\0';
|
||||||
str.upper();
|
str.upper();
|
||||||
}
|
}
|
||||||
|
@ -1561,6 +1561,7 @@ TTreelist_window::TTreelist_window(int x, int y, int dx, int dy, WINDOW parent,
|
|||||||
wd->wtype = WC_TREELIST;
|
wd->wtype = WC_TREELIST;
|
||||||
wd->v.ctl.ctrl_id = owner->dlg();
|
wd->v.ctl.ctrl_id = owner->dlg();
|
||||||
wd->v.ctl.font_id = xvtil_default_font();
|
wd->v.ctl.font_id = xvtil_default_font();
|
||||||
|
wd->v.ctl.flags = owner->roman() ? CTL_FLAG_MULTIPLE : 0;
|
||||||
xvt_vobj_get_client_rect(win(), &wd->rct);
|
xvt_vobj_get_client_rect(win(), &wd->rct);
|
||||||
wd->ctlcolors = xcc;
|
wd->ctlcolors = xcc;
|
||||||
|
|
||||||
|
@ -1877,10 +1877,6 @@ bool TCondizione_vendita::cerca( int tiporicerca, const char * codriga , const r
|
|||||||
_condv.setkey( 1 );
|
_condv.setkey( 1 );
|
||||||
switch( tiporicerca )
|
switch( tiporicerca )
|
||||||
{
|
{
|
||||||
case A_CONTRATTI:
|
|
||||||
{
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case A_LISTINI:
|
case A_LISTINI:
|
||||||
{
|
{
|
||||||
_condv.put("TIPOCF", "");
|
_condv.put("TIPOCF", "");
|
||||||
@ -1889,9 +1885,7 @@ bool TCondizione_vendita::cerca( int tiporicerca, const char * codriga , const r
|
|||||||
_condv.put("CATVEN", "");
|
_condv.put("CATVEN", "");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case A_OFFERTE:
|
default:
|
||||||
{
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if( _condv.read() == NOERR )
|
if( _condv.read() == NOERR )
|
||||||
@ -1922,14 +1916,15 @@ bool TCondizione_vendita::cerca( int tiporicerca, const char * codriga , const r
|
|||||||
_rcondv.put( "CODRIGA", codriga);
|
_rcondv.put( "CODRIGA", codriga);
|
||||||
int err = _rcondv.read();
|
int err = _rcondv.read();
|
||||||
found = (err == NOERR);
|
found = (err == NOERR);
|
||||||
if (!found)
|
if (!found && config_ditta().get_bool("GESLIVART", "mg")) // Per articoli strutturati prova la riga precedente
|
||||||
if ((err = _rcondv.prev()) == NOERR)
|
|
||||||
if (_rcondv.get("TIPORIGA")[0] == 'A')
|
|
||||||
{
|
{
|
||||||
const TString cod_found(_rcondv.get("CODRIGA"));
|
if ((err = _rcondv.prev()) == NOERR && _rcondv.get("TIPORIGA")[0] == 'A')
|
||||||
|
{
|
||||||
|
const TString& cod_found(_rcondv.get("CODRIGA"));
|
||||||
found = cod_found.compare(codriga, cod_found.len()) == 0;
|
found = cod_found.compare(codriga, cod_found.len()) == 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 'R':
|
case 'R':
|
||||||
_rcondv.put("CODRIGA", anamag().get( "RAGGFIS"));
|
_rcondv.put("CODRIGA", anamag().get( "RAGGFIS"));
|
||||||
|
@ -3,20 +3,31 @@
|
|||||||
|
|
||||||
#include <applicat.h>
|
#include <applicat.h>
|
||||||
#include <automask.h>
|
#include <automask.h>
|
||||||
|
#include <progind.h>
|
||||||
#include <recset.h>
|
#include <recset.h>
|
||||||
#include <relation.h>
|
#include <relation.h>
|
||||||
#include <treectrl.h>
|
#include <treectrl.h>
|
||||||
|
|
||||||
|
#include <mov.h>
|
||||||
|
|
||||||
class TPareggio_tree : public TObject_tree
|
class TPareggio_tree : public TObject_tree
|
||||||
{
|
{
|
||||||
|
TPartite_array _games;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual TFieldtypes get_var(const TString& name, TVariant& var) const;
|
virtual TFieldtypes get_var(const TString& name, TVariant& var) const;
|
||||||
virtual bool marked() const { return rand() % 2 != 0; }
|
virtual bool marked() const { return rand() % 2 != 0; }
|
||||||
|
const TPartita& partita(const TRectype& rec) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
bool init(const TBill& bill, const TString& valuta, bool nc, int stato); // Stato- 1=aperte; 2=chiuse; 0 o 3 = tutte
|
bool init(const TBill& bill, const TString& valuta, bool nc, int stato); // Stato- 1=aperte; 2=chiuse; 0 o 3 = tutte
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const TPartita& TPareggio_tree::partita(const TRectype& rec) const
|
||||||
|
{
|
||||||
|
return ((TPartite_array&)_games).partita(rec);
|
||||||
|
}
|
||||||
|
|
||||||
TFieldtypes TPareggio_tree::get_var(const TString& name, TVariant& var) const
|
TFieldtypes TPareggio_tree::get_var(const TString& name, TVariant& var) const
|
||||||
{
|
{
|
||||||
TFieldtypes ft = _nullfld;
|
TFieldtypes ft = _nullfld;
|
||||||
@ -39,12 +50,20 @@ TFieldtypes TPareggio_tree::get_var(const TString& name, TVariant& var) const
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (name == PART_DATADOC)
|
if (name.starts_with("PART.", true))
|
||||||
{
|
{
|
||||||
|
const TString& fld = name.after(".");
|
||||||
if (rec.num() == LF_SCADENZE)
|
if (rec.num() == LF_SCADENZE)
|
||||||
{
|
{
|
||||||
var = rec.get_date(SCAD_DATASCAD);
|
const int nriga = rec.get_int(SCAD_NRIGA);
|
||||||
ft = _datefld;
|
const TPartita& game = partita(rec);
|
||||||
|
var = game.riga(nriga).get(fld);
|
||||||
|
ft = _alfafld;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var = rec.get(fld);
|
||||||
|
ft = _alfafld;
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
if (name == "RESIDUO")
|
if (name == "RESIDUO")
|
||||||
@ -55,7 +74,7 @@ TFieldtypes TPareggio_tree::get_var(const TString& name, TVariant& var) const
|
|||||||
case LF_SCADENZE:
|
case LF_SCADENZE:
|
||||||
if (!rec.get_bool(SCAD_PAGATA))
|
if (!rec.get_bool(SCAD_PAGATA))
|
||||||
{
|
{
|
||||||
const TPartita game(rec);
|
const TPartita& game = partita(rec);
|
||||||
const TRiga_scadenze& s = game.rata(rec.get_int(SCAD_NRIGA), rec.get_int(SCAD_NRATA));
|
const TRiga_scadenze& s = game.rata(rec.get_int(SCAD_NRIGA), rec.get_int(SCAD_NRATA));
|
||||||
saldo = s.residuo(true);
|
saldo = s.residuo(true);
|
||||||
}
|
}
|
||||||
@ -63,7 +82,7 @@ TFieldtypes TPareggio_tree::get_var(const TString& name, TVariant& var) const
|
|||||||
case LF_PARTITE:
|
case LF_PARTITE:
|
||||||
if (!rec.get_bool(PART_CHIUSA))
|
if (!rec.get_bool(PART_CHIUSA))
|
||||||
{
|
{
|
||||||
const TPartita game(rec);
|
const TPartita& game = partita(rec);
|
||||||
saldo = game.calcola_saldo(true);
|
saldo = game.calcola_saldo(true);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -113,8 +132,12 @@ bool TPareggio_tree::init(const TBill& bill, const TString& valuta, bool nc, int
|
|||||||
int last_year = 0;
|
int last_year = 0;
|
||||||
TString80 id_year, id_rec;
|
TString80 id_year, id_rec;
|
||||||
|
|
||||||
|
TProgind pi(games.items(), nc ? TR("Caricamento note di credito") : TR("Caricamento fatture"));
|
||||||
for (bool ok = games.move_first(); ok; ok = games.move_next())
|
for (bool ok = games.move_first(); ok; ok = games.move_next())
|
||||||
{
|
{
|
||||||
|
if (!pi.addstatus(1))
|
||||||
|
break;
|
||||||
|
|
||||||
const TString& codval = rec.get(PART_CODVAL);
|
const TString& codval = rec.get(PART_CODVAL);
|
||||||
if (!same_values(codval, valuta))
|
if (!same_values(codval, valuta))
|
||||||
continue;
|
continue;
|
||||||
@ -124,14 +147,22 @@ bool TPareggio_tree::init(const TBill& bill, const TString& valuta, bool nc, int
|
|||||||
if (nc)
|
if (nc)
|
||||||
{
|
{
|
||||||
add_riga = !rec.get_bool(PART_CHIUSA);
|
add_riga = !rec.get_bool(PART_CHIUSA);
|
||||||
|
if (add_riga)
|
||||||
|
{
|
||||||
// Se filtro le note di credito cerco di riconoscere le fatture negative
|
// Se filtro le note di credito cerco di riconoscere le fatture negative
|
||||||
if (add_riga && tm == tm_fattura)
|
if (tm == tm_fattura)
|
||||||
{
|
{
|
||||||
const char sezione_positiva = bill.tipo() == 'C' ? 'D' : 'A';
|
const char sezione_positiva = bill.tipo() == 'C' ? 'D' : 'A';
|
||||||
TImporto importo(rec.get_char(PART_SEZ), rec.get_real(PART_IMPORTO));
|
TImporto importo(rec.get_char(PART_SEZ), rec.get_real(PART_IMPORTO));
|
||||||
importo.normalize();
|
importo.normalize();
|
||||||
if (sezione_positiva == importo.sezione()) // Controlla se fattura positiva o negativa
|
add_riga = sezione_positiva != importo.sezione(); // Ignora fattura positiva
|
||||||
add_riga = false; // Ignora fattura positiva
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const int nriga = rec.get_int(PART_NRIGA);
|
||||||
|
const TPartita& game = partita(rec);
|
||||||
|
add_riga = ((TPartita&)game).unassigned().exist(nriga);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -144,6 +175,13 @@ bool TPareggio_tree::init(const TBill& bill, const TString& valuta, bool nc, int
|
|||||||
else
|
else
|
||||||
add_riga = stato == 1;
|
add_riga = stato == 1;
|
||||||
}
|
}
|
||||||
|
if (add_riga)
|
||||||
|
{
|
||||||
|
const char sezione_positiva = bill.tipo() == 'C' ? 'D' : 'A';
|
||||||
|
TImporto importo(rec.get_char(PART_SEZ), rec.get_real(PART_IMPORTO));
|
||||||
|
importo.normalize();
|
||||||
|
add_riga = sezione_positiva == importo.sezione(); // Ignora fattura negativa
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!add_riga)
|
if (!add_riga)
|
||||||
@ -213,8 +251,7 @@ bool TPareggio_tree::init(const TBill& bill, const TString& valuta, bool nc, int
|
|||||||
class TPareggio_mask : public TAutomask
|
class TPareggio_mask : public TAutomask
|
||||||
{
|
{
|
||||||
TPareggio_tree _nc, _ft;
|
TPareggio_tree _nc, _ft;
|
||||||
|
long _numreg;
|
||||||
private:
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
||||||
@ -245,6 +282,29 @@ bool TPareggio_mask::on_field_event(TOperable_field& o, TField_event e, long jol
|
|||||||
|
|
||||||
tfield(F_NC_TREE).set_tree(&_nc);
|
tfield(F_NC_TREE).set_tree(&_nc);
|
||||||
tfield(F_FT_TREE).set_tree(&_ft);
|
tfield(F_FT_TREE).set_tree(&_ft);
|
||||||
|
_numreg = 0;
|
||||||
|
disable(DLG_LINK);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case F_NC_TREE:
|
||||||
|
case F_FT_TREE:
|
||||||
|
if (e == fe_button || e == fe_modify)
|
||||||
|
{
|
||||||
|
TTree_field& tf = (TTree_field&)o;
|
||||||
|
TVariant var;
|
||||||
|
if (tf.tree()->get_var("PART.NREG", var))
|
||||||
|
_numreg = var.as_int();
|
||||||
|
else
|
||||||
|
_numreg = 0L;
|
||||||
|
enable(DLG_LINK, _numreg > 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case DLG_LINK:
|
||||||
|
if (_numreg > 0)
|
||||||
|
{
|
||||||
|
TRectype mov(LF_MOV); mov.put(MOV_NUMREG, _numreg);
|
||||||
|
if (mov.edit())
|
||||||
|
send_key(K_SPACE, F_TUTTE, &o);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default: break;
|
default: break;
|
||||||
@ -252,7 +312,7 @@ bool TPareggio_mask::on_field_event(TOperable_field& o, TField_event e, long jol
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
TPareggio_mask::TPareggio_mask() : TAutomask("sc0300a")
|
TPareggio_mask::TPareggio_mask() : TAutomask("sc0300a"), _numreg(0L)
|
||||||
{
|
{
|
||||||
RCT rct_nc; field(F_NC_TREE).get_rect(rct_nc);
|
RCT rct_nc; field(F_NC_TREE).get_rect(rct_nc);
|
||||||
RCT rct_ft; field(F_FT_TREE).get_rect(rct_ft);
|
RCT rct_ft; field(F_FT_TREE).get_rect(rct_ft);
|
||||||
@ -272,14 +332,18 @@ class TPareggio_partite : public TSkeleton_application
|
|||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
virtual void main_loop();
|
virtual void main_loop();
|
||||||
|
|
||||||
public:
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void TPareggio_partite::main_loop()
|
void TPareggio_partite::main_loop()
|
||||||
{
|
{
|
||||||
|
const int anno = xvt_vobj_get_attr(NULL_WIN, ATTR_APPL_VERSION_YEAR);
|
||||||
|
if (anno > 2101)
|
||||||
|
{
|
||||||
TPareggio_mask pm;
|
TPareggio_mask pm;
|
||||||
pm.run();
|
pm.run();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
error_box(TR("Versione non supportata: %d"), anno);
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
|
@ -8,10 +8,10 @@ BEGIN
|
|||||||
PICTURE TOOL_EDIT
|
PICTURE TOOL_EDIT
|
||||||
END
|
END
|
||||||
|
|
||||||
BUTTON DLG_NEWREC 2 2
|
BUTTON DLG_LINK 2 2
|
||||||
BEGIN
|
BEGIN
|
||||||
PROMPT 2 1 "Nuovo"
|
PROMPT 2 1 "Collega"
|
||||||
PICTURE TOOL_NEWREC
|
PICTURE TOOL_LINK
|
||||||
END
|
END
|
||||||
|
|
||||||
#include <helpbar.h>
|
#include <helpbar.h>
|
||||||
@ -172,9 +172,10 @@ BEGIN
|
|||||||
PROMPT 0 5 ""
|
PROMPT 0 5 ""
|
||||||
DISPLAY "Partita@12" NUMPART
|
DISPLAY "Partita@12" NUMPART
|
||||||
DISPLAY "Riga@4R" NRIGA
|
DISPLAY "Riga@4R" NRIGA
|
||||||
|
DISPLAY "Data@8" DATADOC
|
||||||
DISPLAY "Importo@10R" IMPORTO
|
DISPLAY "Importo@10R" IMPORTO
|
||||||
DISPLAY "Residuo@10R" RESIDUO
|
DISPLAY "Residuo@10R" RESIDUO
|
||||||
DISPLAY "Descrizione Nota di Credito@35" DESCR
|
DISPLAY "Descrizione Nota di Credito@35" PART.DESCR
|
||||||
DISPLAY "P.N.@6R" NREG
|
DISPLAY "P.N.@6R" NREG
|
||||||
END
|
END
|
||||||
|
|
||||||
@ -184,11 +185,12 @@ BEGIN
|
|||||||
DISPLAY "Partita@12" NUMPART
|
DISPLAY "Partita@12" NUMPART
|
||||||
DISPLAY "Riga@4R" NRIGA
|
DISPLAY "Riga@4R" NRIGA
|
||||||
DISPLAY "Rata@4R" NRATA
|
DISPLAY "Rata@4R" NRATA
|
||||||
DISPLAY "Data@8" DATADOC
|
DISPLAY "Scadenza@8" DATASCAD
|
||||||
DISPLAY "Importo@10R" IMPORTO
|
DISPLAY "Importo@10R" IMPORTO
|
||||||
DISPLAY "Residuo@10R" RESIDUO
|
DISPLAY "Residuo@10R" RESIDUO
|
||||||
DISPLAY "Descrizione Fattura@35" DESCR
|
DISPLAY "Descrizione Fattura@35" PART.DESCR
|
||||||
DISPLAY "P.N.@6R" NREG
|
DISPLAY "P.N.@6R" PART.NREG
|
||||||
|
FLAGS "M"
|
||||||
END
|
END
|
||||||
|
|
||||||
ENDMASK
|
ENDMASK
|
||||||
|
@ -5,6 +5,147 @@
|
|||||||
|
|
||||||
#include <wx/hashset.h>
|
#include <wx/hashset.h>
|
||||||
#include <wx/textfile.h>
|
#include <wx/textfile.h>
|
||||||
|
#include <wx/arrstr.h>
|
||||||
|
#include <wx/dynarray.h>
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
// Utilities
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
static wxString BuildKey(const wxSocketBase& sock, const wxChar* user, int session)
|
||||||
|
{
|
||||||
|
wxIPV4address peer; sock.GetPeer(peer);
|
||||||
|
wxString strUserAtHost;
|
||||||
|
if (user && *user)
|
||||||
|
strUserAtHost.Printf("%s@%s:%d", user, peer.Hostname().c_str(), session);
|
||||||
|
else
|
||||||
|
strUserAtHost.Printf("*@%s:%d", user, peer.Hostname().c_str(), session);
|
||||||
|
|
||||||
|
return strUserAtHost;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
// TModuleInfo
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
class TModuleInfo : public wxObject
|
||||||
|
{
|
||||||
|
size_t m_nModule, m_nMaxUsers;
|
||||||
|
wxArrayString m_Users;
|
||||||
|
|
||||||
|
public:
|
||||||
|
bool CanAddUser(const wxString& strUserAtHost) const;
|
||||||
|
bool AddUser(const wxString& strUserAtHost);
|
||||||
|
bool RemoveUser(const wxString& strUserAtHost);
|
||||||
|
|
||||||
|
size_t Users() const { return m_Users.GetCount(); }
|
||||||
|
size_t MaxUsers() const { return m_nMaxUsers; }
|
||||||
|
|
||||||
|
TModuleInfo(size_t nMod, size_t nMax) : m_nModule(nMod), m_nMaxUsers(nMax) { }
|
||||||
|
};
|
||||||
|
|
||||||
|
bool TModuleInfo::CanAddUser(const wxString& strUserAtHost) const
|
||||||
|
{
|
||||||
|
// Posso aggiungere un utente se ho licenze disponibili o se è già connesso
|
||||||
|
return Users() < MaxUsers() || m_Users.Index(strUserAtHost, false) >= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TModuleInfo::AddUser(const wxString& strUserAtHost)
|
||||||
|
{
|
||||||
|
wxASSERT(strUserAtHost.Index('@') > 0);
|
||||||
|
const bool ok = CanAddUser(strUserAtHost);
|
||||||
|
if (ok && m_Users.Index(strUserAtHost, false) < 0)
|
||||||
|
m_Users.Add(strUserAtHost);
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TModuleInfo::RemoveUser(const wxString& strUserAtHost)
|
||||||
|
{
|
||||||
|
wxASSERT(strUserAtHost.Index('@') > 0);
|
||||||
|
bool ok = false;
|
||||||
|
if (strUserAtHost.StartsWith("*@"))
|
||||||
|
{
|
||||||
|
const wxString strHost = strUserAtHost.Mid(2);
|
||||||
|
for (int i = m_Users.GetCount()-1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
const wxString& h = m_Users[i].AfterFirst('@');
|
||||||
|
if (h == strHost)
|
||||||
|
{
|
||||||
|
m_Users.RemoveAt(i);
|
||||||
|
ok = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const int i = m_Users.Index(strUserAtHost, false);
|
||||||
|
ok = i >= 0;
|
||||||
|
if (ok)
|
||||||
|
m_Users.RemoveAt(i);
|
||||||
|
|
||||||
|
}
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
WX_DECLARE_OBJARRAY(TModuleInfo*, TModulesArray);
|
||||||
|
|
||||||
|
class TModuleTable : public TModulesArray
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
bool AddConnection(wxSocketBase& sock, const wxChar* user, int session, size_t module);
|
||||||
|
bool RemoveConnection(wxSocketBase& sock, const wxChar* user, int session, size_t module);
|
||||||
|
bool KillSession(wxSocketBase& sock, int session) { return RemoveConnection(sock, NULL, session, size_t(-1)); }
|
||||||
|
|
||||||
|
unsigned short Users(size_t nModule) const;
|
||||||
|
unsigned short MaxUsers(size_t nModule) const;
|
||||||
|
|
||||||
|
void Init(const TDongle& dongle);
|
||||||
|
};
|
||||||
|
|
||||||
|
#include <wx/arrimpl.cpp>
|
||||||
|
WX_DEFINE_OBJARRAY(TModulesArray)
|
||||||
|
|
||||||
|
void TModuleTable::Init(const TDongle& dongle)
|
||||||
|
{
|
||||||
|
for (size_t m = 0; m < dongle.Modules(); m++)
|
||||||
|
{
|
||||||
|
const size_t u = dongle.MaxUsers(m);
|
||||||
|
Add(new TModuleInfo(m, u));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TModuleTable::AddConnection(wxSocketBase& sock, const wxChar* user, int session, size_t nModule)
|
||||||
|
{
|
||||||
|
bool ok = true;
|
||||||
|
if (nModule > 0 && nModule < GetCount())
|
||||||
|
{
|
||||||
|
const wxString strUser = BuildKey(sock, user, session);
|
||||||
|
ok = Item(nModule)->AddUser(strUser);
|
||||||
|
}
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TModuleTable::RemoveConnection(wxSocketBase& sock, const wxChar* user, int session, size_t nModule)
|
||||||
|
{
|
||||||
|
bool ok = false;
|
||||||
|
const wxString strUser = BuildKey(sock, user, session);
|
||||||
|
const size_t nModules = GetCount();
|
||||||
|
if (nModule >= nModules)
|
||||||
|
{
|
||||||
|
for (size_t m = nModules-1; m > 0; m--)
|
||||||
|
ok |= Item(m)->RemoveUser(strUser);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ok = Item(nModule)->RemoveUser(strUser);
|
||||||
|
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned short TModuleTable::Users(size_t nModule) const
|
||||||
|
{ return (nModule > 0 && nModule < GetCount()) ? Item(nModule)->Users() : 0; }
|
||||||
|
|
||||||
|
unsigned short TModuleTable::MaxUsers(size_t nModule) const
|
||||||
|
{ return nModule == 0 ? 0xFFFF : (nModule < GetCount() ? Item(nModule)->MaxUsers() : 0); }
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
// TUserInfo
|
// TUserInfo
|
||||||
@ -29,9 +170,6 @@ WX_DECLARE_HASH_MAP( wxString, TUserInfo*, wxStringHash, wxStringEqual, TUsersHa
|
|||||||
|
|
||||||
class TUserTable : public TUsersHashMap
|
class TUserTable : public TUsersHashMap
|
||||||
{
|
{
|
||||||
protected:
|
|
||||||
wxString BuildKey(wxSocketBase& sock, const wxChar* user, int session) const;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TUserInfo* AddConnection(wxSocketBase& sock, const wxChar* user, int session);
|
TUserInfo* AddConnection(wxSocketBase& sock, const wxChar* user, int session);
|
||||||
TUserInfo* Find(wxSocketBase& sock, const wxChar* user, int session);
|
TUserInfo* Find(wxSocketBase& sock, const wxChar* user, int session);
|
||||||
@ -71,14 +209,6 @@ size_t TUserTable::GetLicenses() const
|
|||||||
return hsHosts.size();
|
return hsHosts.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
wxString TUserTable::BuildKey(wxSocketBase& sock, const wxChar* user, int session) const
|
|
||||||
{
|
|
||||||
wxIPV4address peer; sock.GetPeer(peer);
|
|
||||||
wxString strUserAtHost;
|
|
||||||
strUserAtHost.Printf("%s@%s:%d", user, peer.Hostname().c_str(), session);
|
|
||||||
return strUserAtHost;
|
|
||||||
}
|
|
||||||
|
|
||||||
TUserInfo* TUserTable::AddConnection(wxSocketBase& sock, const wxChar* user, int session)
|
TUserInfo* TUserTable::AddConnection(wxSocketBase& sock, const wxChar* user, int session)
|
||||||
{
|
{
|
||||||
TUserInfo* ui = Find(sock, user, session);
|
TUserInfo* ui = Find(sock, user, session);
|
||||||
@ -176,18 +306,19 @@ private:
|
|||||||
unsigned int m_MaxTries;
|
unsigned int m_MaxTries;
|
||||||
|
|
||||||
TUserTable m_Users;
|
TUserTable m_Users;
|
||||||
|
TModuleTable m_Mods;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual const wxChar* GetAppName() const;
|
virtual const wxChar* GetAppName() const;
|
||||||
virtual bool ProcessCommand(wxString cmd, wxSocketBase& outs);
|
virtual bool ProcessCommand(wxString cmd, wxSocketBase& outs);
|
||||||
|
|
||||||
void AddNumber(TXmlItem& tr, int n) const;
|
void AddNumber(TXmlItem& tr, int n) const;
|
||||||
|
void AddNumberOfUsers(TXmlItem& tr, int n) const;
|
||||||
wxString DescribeModule(int m) const;
|
wxString DescribeModule(int m) const;
|
||||||
wxString ModuleCode(int m) const;
|
wxString ModuleCode(int m) const;
|
||||||
bool KeyIsGood(const wxString& key, const wxString& gar) const;
|
bool KeyIsGood(const wxString& key, const wxString& gar) const;
|
||||||
|
|
||||||
void InitModules();
|
void InitModules();
|
||||||
wxString GetModulesFilename() const;
|
|
||||||
|
|
||||||
wxString GarbleMD5(const char* str, const wxDateTime& date) const;
|
wxString GarbleMD5(const char* str, const wxDateTime& date) const;
|
||||||
wxString GarbleMD5(int n, const wxDateTime& date) const;
|
wxString GarbleMD5(int n, const wxDateTime& date) const;
|
||||||
@ -235,6 +366,7 @@ void TAuthorizationServer::InitModules()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
m_Mods.Init(m_Dongle);
|
||||||
}
|
}
|
||||||
|
|
||||||
wxString TAuthorizationServer::GarbleMD5(const char* str, const wxDateTime& date) const
|
wxString TAuthorizationServer::GarbleMD5(const char* str, const wxDateTime& date) const
|
||||||
@ -329,25 +461,14 @@ bool TAuthorizationServer::IsMagicName(wxString& strFilename) const
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxString TAuthorizationServer::GetModulesFilename() const
|
|
||||||
{ return wxT("../campo.aut"); }
|
|
||||||
|
|
||||||
wxString TAuthorizationServer::DescribeModule(int m) const
|
wxString TAuthorizationServer::DescribeModule(int m) const
|
||||||
{
|
{
|
||||||
wxString strModule;
|
return m_Dongle.ModuleDescription(m);
|
||||||
wxTextFile txt(GetModulesFilename());
|
|
||||||
if (txt.Open())
|
|
||||||
strModule = txt.GetLine(m).Mid(3);
|
|
||||||
return strModule;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
wxString TAuthorizationServer::ModuleCode(int m) const
|
wxString TAuthorizationServer::ModuleCode(int m) const
|
||||||
{
|
{
|
||||||
wxString strModule;
|
return m_Dongle.ModuleNumberToCode(m);
|
||||||
wxTextFile txt(GetModulesFilename());
|
|
||||||
if (txt.Open())
|
|
||||||
strModule = txt.GetLine(m).Left(2).Upper();
|
|
||||||
return strModule;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TAuthorizationServer::AddNumber(TXmlItem& tr, int n) const
|
void TAuthorizationServer::AddNumber(TXmlItem& tr, int n) const
|
||||||
@ -357,6 +478,19 @@ void TAuthorizationServer::AddNumber(TXmlItem& tr, int n) const
|
|||||||
td << wxString::Format("%d", n);
|
td << wxString::Format("%d", n);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TAuthorizationServer::AddNumberOfUsers(TXmlItem& tr, int n) const
|
||||||
|
{
|
||||||
|
TXmlItem& td = tr.AddChild("td");
|
||||||
|
td.SetAttr("align", "right");
|
||||||
|
if (n == 0)
|
||||||
|
td.AddChild("i") << "None"; else
|
||||||
|
if (n > 0 && n < 128)
|
||||||
|
td << wxString::Format("%d", n);
|
||||||
|
else
|
||||||
|
td.AddChild("b") << "Unlimited";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void TAuthorizationServer::GenerateIndex(wxString& strFilename)
|
void TAuthorizationServer::GenerateIndex(wxString& strFilename)
|
||||||
{
|
{
|
||||||
TXmlItem html;
|
TXmlItem html;
|
||||||
@ -372,9 +506,9 @@ void TAuthorizationServer::GenerateIndex(wxString& strFilename)
|
|||||||
wxString strModel;
|
wxString strModel;
|
||||||
switch (m_Dongle.hardware())
|
switch (m_Dongle.hardware())
|
||||||
{
|
{
|
||||||
case _dongle_xsec:
|
case _dongle_ssa:
|
||||||
img.SetAttr("src", "xsec.gif");
|
img.SetAttr("src", "ssa.gif");
|
||||||
strModel = wxT("XSec");
|
strModel = wxT("SSA");
|
||||||
break;
|
break;
|
||||||
case _dongle_hardlock:
|
case _dongle_hardlock:
|
||||||
img.SetAttr("src", "hardlock.gif");
|
img.SetAttr("src", "hardlock.gif");
|
||||||
@ -416,17 +550,17 @@ void TAuthorizationServer::GenerateIndex(wxString& strFilename)
|
|||||||
TXmlItem& tr2 = body.AddChild("tr");
|
TXmlItem& tr2 = body.AddChild("tr");
|
||||||
TXmlItem& mu = tr2.AddChild("td").AddChild("a");
|
TXmlItem& mu = tr2.AddChild("td").AddChild("a");
|
||||||
mu.SetAttr("href", "maxusers.htm") << "Maximum Users";
|
mu.SetAttr("href", "maxusers.htm") << "Maximum Users";
|
||||||
AddNumber(tr2, m_Dongle.MaxUsers());
|
AddNumberOfUsers(tr2, m_Dongle.MaxUsers());
|
||||||
|
|
||||||
TXmlItem& tr3 = body.AddChild("tr");
|
TXmlItem& tr3 = body.AddChild("tr");
|
||||||
TXmlItem& au = tr3.AddChild("td").AddChild("a");
|
TXmlItem& au = tr3.AddChild("td").AddChild("a");
|
||||||
au.SetAttr("href", "Users.htm"); au << "Active Users";
|
au.SetAttr("href", "Users.htm"); au << "Active Users";
|
||||||
AddNumber(tr3, m_Users.GetCount());
|
AddNumberOfUsers(tr3, m_Users.GetCount());
|
||||||
|
|
||||||
TXmlItem& tr3a = body.AddChild("tr");
|
TXmlItem& tr3a = body.AddChild("tr");
|
||||||
TXmlItem& lu = tr3a.AddChild("td").AddChild("a");
|
TXmlItem& lu = tr3a.AddChild("td").AddChild("a");
|
||||||
lu << "Active Licenses";
|
lu << "Active Licenses";
|
||||||
AddNumber(tr3a, m_Users.GetLicenses());
|
AddNumberOfUsers(tr3a, m_Users.GetLicenses());
|
||||||
|
|
||||||
TXmlItem& tr4 = body.AddChild("tr");
|
TXmlItem& tr4 = body.AddChild("tr");
|
||||||
TXmlItem& am = tr4.AddChild("td").AddChild("a");
|
TXmlItem& am = tr4.AddChild("td").AddChild("a");
|
||||||
@ -455,38 +589,40 @@ void TAuthorizationServer::GenerateModules(wxString& strFilename)
|
|||||||
{
|
{
|
||||||
TXmlItem html;
|
TXmlItem html;
|
||||||
TXmlItem& body = CreatePageBody(html, "Modules");
|
TXmlItem& body = CreatePageBody(html, "Modules");
|
||||||
TXmlItem& table = body.AddChild("table");
|
TXmlItem& table = body.AddChild("center").AddChild("table");
|
||||||
table.SetAttr("border", "1"); table.SetAttr("width", "100%");
|
table.SetAttr("border", "1").SetAttr("width", "100%");
|
||||||
|
|
||||||
TXmlItem& th = body.AddChild("thead");
|
TXmlItem& th = table.AddChild("thead");
|
||||||
th.AddChild("th").SetAttr("width", "7%") << "N.";
|
th.AddChild("th") << "N.";
|
||||||
th.AddChild("th").SetAttr("width", "8%") << "Module";
|
th.AddChild("th") << "Module";
|
||||||
th.AddChild("th").SetAttr("width", "70%") << "Description";
|
th.AddChild("th") << "Description";
|
||||||
|
th.AddChild("th") << "Users";
|
||||||
|
th.AddChild("th") << "Max.";
|
||||||
|
|
||||||
const bool bNormalUser = m_Dongle.Number() > 0;
|
const bool bNormalUser = m_Dongle.Number() > 0 && m_Dongle.hardware() != _dongle_ssa;
|
||||||
if (bNormalUser)
|
if (bNormalUser)
|
||||||
th.AddChild("th").SetAttr("width", "15%") << "De/Activate";
|
th.AddChild("th") << "De/Activate";
|
||||||
|
|
||||||
const wxString strAut = GetModulesFilename();
|
TXmlItem& tb = table.AddChild("tbody");
|
||||||
wxFileInputStream aut(strAut);
|
|
||||||
for (int nModule = 0; !aut.Eof(); nModule++)
|
for (size_t nModule = 1; ; nModule++)
|
||||||
{
|
{
|
||||||
wxString line;
|
const wxString strCode = m_Dongle.ModuleNumberToCode(nModule);
|
||||||
aut >> line;
|
if (strCode.IsEmpty())
|
||||||
if (line.IsEmpty())
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
const wxString strCode = line.Left(2).Lower();
|
if (strCode != "xx")
|
||||||
const wxString strDesc = line.Mid(3);
|
|
||||||
if (nModule > 0 && strCode != "xx" && !strDesc.IsEmpty())
|
|
||||||
{
|
{
|
||||||
const bool bOn = nModule == 0 || m_Dongle.Active(nModule);
|
const bool bOn = m_Dongle.Active(nModule);
|
||||||
TXmlItem& tr = body.AddChild("tr");
|
TXmlItem& tr = tb.AddChild("tr");
|
||||||
AddNumber(tr, nModule);
|
AddNumber(tr, nModule);
|
||||||
tr.AddChild("td").SetAttr("align", "center") << strCode;
|
tr.AddChild("td").SetAttr("align", "center") << strCode;
|
||||||
TXmlItem& td = tr.AddChild("td");
|
TXmlItem& td = tr.AddChild("td");
|
||||||
td.AddChild(bOn ? "b" : "i") << strDesc;
|
td.AddChild(bOn ? "b" : "i") << m_Dongle.ModuleDescription(nModule);
|
||||||
if (bNormalUser && nModule > 0)
|
AddNumberOfUsers(tr, m_Mods.Users(nModule));
|
||||||
|
AddNumberOfUsers(tr, m_Mods.MaxUsers(nModule));
|
||||||
|
|
||||||
|
if (bNormalUser)
|
||||||
{
|
{
|
||||||
const char* prompt = bOn ? "Deactivate" : "Activate";
|
const char* prompt = bOn ? "Deactivate" : "Activate";
|
||||||
const wxString href = wxString::Format("%s?%d", prompt, nModule);
|
const wxString href = wxString::Format("%s?%d", prompt, nModule);
|
||||||
@ -901,16 +1037,9 @@ void TAuthorizationServer::ProcessUserLogin(wxString cmd, wxSocketBase& sock)
|
|||||||
unsigned int num = 0;
|
unsigned int num = 0;
|
||||||
if (m_Dongle.Connected())
|
if (m_Dongle.Connected())
|
||||||
{
|
{
|
||||||
// Preliminary GUEST login
|
|
||||||
// if (wxStricmp(strUser,"******")==0 && wxStricmp(strProgram, "ba0100")==0)
|
|
||||||
// {
|
|
||||||
// num = 1;
|
|
||||||
// }
|
|
||||||
// else
|
|
||||||
{
|
|
||||||
if (m_Users.GetLicenses() >= m_Dongle.MaxUsers() && m_Users.Find(sock, NULL, session) == NULL)
|
if (m_Users.GetLicenses() >= m_Dongle.MaxUsers() && m_Users.Find(sock, NULL, session) == NULL)
|
||||||
{
|
{
|
||||||
WriteLog(_("*** Maximum number of users exceeded"), 1);
|
WriteLog(_("*** Maximum number of licenses exceeded"), 1);
|
||||||
num = 0;
|
num = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -920,12 +1049,16 @@ void TAuthorizationServer::ProcessUserLogin(wxString cmd, wxSocketBase& sock)
|
|||||||
else
|
else
|
||||||
num = DecodePassword(strPassword, strProgram);
|
num = DecodePassword(strPassword, strProgram);
|
||||||
if (num > 0)
|
if (num > 0)
|
||||||
|
{
|
||||||
|
const wxChar strModule[4] = { tolower(strProgram[0]), tolower(strProgram[1]), 0, 0 };
|
||||||
|
const size_t nModule = m_Dongle.ModuleCodeToNumber(strModule);
|
||||||
|
if (m_Mods.AddConnection(sock, strUser, session, nModule))
|
||||||
m_Users.AddConnection(sock, strUser, session);
|
m_Users.AddConnection(sock, strUser, session);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
WriteLog(_("*** Bad password"), 1);
|
WriteLog(_("*** Bad password"), 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
else
|
||||||
WriteLog(_("*** Dongle not responding"));
|
WriteLog(_("*** Dongle not responding"));
|
||||||
|
|
||||||
@ -944,9 +1077,19 @@ bool TAuthorizationServer::ProcessUserLogout(wxString cmd, wxSocketBase& sock)
|
|||||||
if (nStr < 2)
|
if (nStr < 2)
|
||||||
session = 0;
|
session = 0;
|
||||||
|
|
||||||
m_Users.RemoveConnection(sock, strUser, session);
|
|
||||||
if (wxStrcmp(strProgram, "ba0100") == 0)
|
if (wxStrcmp(strProgram, "ba0100") == 0)
|
||||||
|
{
|
||||||
m_Users.KillSession(sock, session);
|
m_Users.KillSession(sock, session);
|
||||||
|
m_Mods.KillSession(sock, session);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_Users.RemoveConnection(sock, strUser, session);
|
||||||
|
|
||||||
|
strProgram[2] = '\0';
|
||||||
|
const size_t nModule = m_Dongle.ModuleCodeToNumber(strProgram);
|
||||||
|
m_Mods.RemoveConnection(sock, strUser, session, nModule);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1062,9 +1205,9 @@ bool TAuthorizationServer::ProcessCommand(wxString cmd, wxSocketBase& outs)
|
|||||||
bool TAuthorizationServer::Initialization()
|
bool TAuthorizationServer::Initialization()
|
||||||
{
|
{
|
||||||
#ifdef __WXMSW__
|
#ifdef __WXMSW__
|
||||||
// Add global atom if not already present
|
// Add global atom if not already present (3.2 compatibility)
|
||||||
if (::GlobalFindAtom(ATOMIC_SEMAPHORE) == NULL)
|
if (::GlobalFindAtom(ATOMIC_SEMAPHORE) == NULL)
|
||||||
::GlobalAddAtom(ATOMIC_SEMAPHORE); // Same as old Frontend.exe
|
::GlobalAddAtom(ATOMIC_SEMAPHORE);
|
||||||
#endif
|
#endif
|
||||||
const int delay = GetConfigInt("Delay", 10);
|
const int delay = GetConfigInt("Delay", 10);
|
||||||
m_MaxTries = GetConfigInt("MaxTries", 8);
|
m_MaxTries = GetConfigInt("MaxTries", 8);
|
||||||
@ -1087,12 +1230,14 @@ bool TAuthorizationServer::Initialization()
|
|||||||
bool TAuthorizationServer::Deinitialization()
|
bool TAuthorizationServer::Deinitialization()
|
||||||
{
|
{
|
||||||
m_Dongle.Logout();
|
m_Dongle.Logout();
|
||||||
|
|
||||||
#ifdef __WXMSW__
|
#ifdef __WXMSW__
|
||||||
// Definitely kill global atom
|
// Definitely kill global atom (3.2 compatibility)
|
||||||
for (ATOM a = ::GlobalFindAtom(ATOMIC_SEMAPHORE);
|
for (ATOM a = ::GlobalFindAtom(ATOMIC_SEMAPHORE);
|
||||||
a != NULL;
|
a != NULL;
|
||||||
a = ::GlobalDeleteAtom(a));
|
a = ::GlobalDeleteAtom(a));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1100,3 +1245,4 @@ bool TAuthorizationServer::Deinitialization()
|
|||||||
|
|
||||||
IMPLEMENT_APP(TAuthorizationServer)
|
IMPLEMENT_APP(TAuthorizationServer)
|
||||||
|
|
||||||
|
|
||||||
|
@ -597,7 +597,9 @@ void TBaseServerApp::OnIdle(wxIdleEvent& evt)
|
|||||||
sock.Notify(true);
|
sock.Notify(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_Sockets.RemoveAt(0);
|
if (m_Sockets.GetCount() > 0)
|
||||||
|
m_Sockets.RemoveAt(0, 1);
|
||||||
|
|
||||||
evt.RequestMore(); // FONDAMENTALE per gestire richieste multiple!
|
evt.RequestMore(); // FONDAMENTALE per gestire richieste multiple!
|
||||||
}
|
}
|
||||||
wxApp::OnIdle(evt);
|
wxApp::OnIdle(evt);
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
#include "baseserv.h"
|
#include "baseserv.h"
|
||||||
#include "dongle.h"
|
#include "dongle.h"
|
||||||
|
|
||||||
|
#include <wx/textfile.h>
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
// TBit_array
|
// TBit_array
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
@ -346,15 +348,46 @@ inline void reset_bit(unsigned short& w, unsigned char b)
|
|||||||
w &= ~(1 << b);
|
w &= ~(1 << b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
// SSA Stuff
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
__declspec(dllimport) int Login(const char* session, const char* product);
|
||||||
|
__declspec(dllimport) int ApriModulo(const char* session, const char* product);
|
||||||
|
__declspec(dllimport) int ChiudiModulo(const char* session, const char* product);
|
||||||
|
__declspec(dllimport) int Logout(const char* session, const char* product);
|
||||||
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
// TDongle
|
// TDongle
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
|
|
||||||
TDongle::TDongle()
|
TDongle::TDongle()
|
||||||
: _hardware(_dongle_unknown), _type(_no_dongle), _serno(0xFFFF),
|
: _hardware(_dongle_unknown), _type(_no_dongle), _serno(0xFFFF),
|
||||||
_max_users(1), _year_assist(2007), _dirty(false)
|
_max_users(1), _year_assist(2011), _dirty(false)
|
||||||
{
|
{
|
||||||
memset(_eprom, 0, sizeof(_eprom));
|
memset(_eprom, 0, sizeof(_eprom));
|
||||||
|
memset(_user, 0, sizeof(_user));
|
||||||
|
|
||||||
|
wxTextFile aut("../campo.aut");
|
||||||
|
if (aut.Open())
|
||||||
|
{
|
||||||
|
for (size_t m = 0; m < aut.GetLineCount(); m++)
|
||||||
|
{
|
||||||
|
const wxString& l = aut[m];
|
||||||
|
_code.Add(l.Left(2).Lower());
|
||||||
|
wxString d = l.Mid(3);
|
||||||
|
d.Replace("a'", "à");
|
||||||
|
_desc.Add(d);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_code.Add("ba");
|
||||||
|
_desc.Add("Base");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TDongle::~TDongle()
|
TDongle::~TDongle()
|
||||||
@ -632,6 +665,58 @@ bool TDongle::eutron_login(bool test_all_keys)
|
|||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxString TDongle::GetSessionId() const
|
||||||
|
{
|
||||||
|
wxString strSession = wxGetHostName();
|
||||||
|
DWORD session = 0;
|
||||||
|
::ProcessIdToSessionId(::GetCurrentProcessId(), &session);
|
||||||
|
strSession << ':' << session;
|
||||||
|
const size_t len = strSession.Len();
|
||||||
|
if (len > 23)
|
||||||
|
strSession = strSession.Right(23);
|
||||||
|
return strSession;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TDongle::ssa_login(bool WXUNUSED(test_all_dongles))
|
||||||
|
{
|
||||||
|
const wxString u = GetSessionId();
|
||||||
|
const bool ok1 = ::Login(u, "Campo") == 0;
|
||||||
|
const bool ok2 = ::Login(u, "Enterprise") != 0; // Test for dll tampering
|
||||||
|
const bool ok = ok1 && ok2;
|
||||||
|
|
||||||
|
if (ok)
|
||||||
|
{
|
||||||
|
_hardware = _dongle_ssa;
|
||||||
|
_type = _sirio_dongle;
|
||||||
|
_serno = 0;
|
||||||
|
_last_update = wxDateTime::Now();
|
||||||
|
_year_assist = _last_update.GetYear();
|
||||||
|
|
||||||
|
_max_users = 1;
|
||||||
|
for (size_t m = 0; m < _code.GetCount(); m++)
|
||||||
|
{
|
||||||
|
const wxString c = ModuleNumberToCode(m);
|
||||||
|
if (::ApriModulo(u, c) == 0)
|
||||||
|
{
|
||||||
|
_module.set(m);
|
||||||
|
::ChiudiModulo(u, c);
|
||||||
|
unsigned short& mu = _user[m];
|
||||||
|
mu = ComputeMaxUsers(m);
|
||||||
|
if (mu > _max_users && mu < 128)
|
||||||
|
_max_users = mu;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TDongle::ssa_logout()
|
||||||
|
{
|
||||||
|
return ::Logout(GetSessionId(), "Campo") == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool TDongle::Login(bool test_all_keys)
|
bool TDongle::Login(bool test_all_keys)
|
||||||
{
|
{
|
||||||
bool ok = true;
|
bool ok = true;
|
||||||
@ -639,9 +724,14 @@ bool TDongle::Login(bool test_all_keys)
|
|||||||
if (_type != _no_dongle) // Already logged in
|
if (_type != _no_dongle) // Already logged in
|
||||||
Logout();
|
Logout();
|
||||||
|
|
||||||
|
#ifdef NDEBUG
|
||||||
TDongleHardware hw = _hardware;
|
TDongleHardware hw = _hardware;
|
||||||
if (hw == _dongle_unknown)
|
if (hw == _dongle_unknown)
|
||||||
hw = (TDongleHardware)GetServerApp().GetConfigInt("Donglehw");
|
hw = (TDongleHardware)GetServerApp().GetConfigInt("Donglehw");
|
||||||
|
#else
|
||||||
|
TDongleHardware hw = _dongle_ssa;
|
||||||
|
#endif
|
||||||
|
|
||||||
switch(hw)
|
switch(hw)
|
||||||
{
|
{
|
||||||
case _dongle_hardlock:
|
case _dongle_hardlock:
|
||||||
@ -650,6 +740,9 @@ bool TDongle::Login(bool test_all_keys)
|
|||||||
case _dongle_eutron:
|
case _dongle_eutron:
|
||||||
ok = eutron_login(test_all_keys);
|
ok = eutron_login(test_all_keys);
|
||||||
break;
|
break;
|
||||||
|
case _dongle_ssa:
|
||||||
|
ok = ssa_login(test_all_keys);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
ok = false;
|
ok = false;
|
||||||
break;
|
break;
|
||||||
@ -660,6 +753,8 @@ bool TDongle::Login(bool test_all_keys)
|
|||||||
ok = eutron_login(test_all_keys);
|
ok = eutron_login(test_all_keys);
|
||||||
if (!ok && hw != _dongle_hardlock)
|
if (!ok && hw != _dongle_hardlock)
|
||||||
ok = hardlock_login(test_all_keys);
|
ok = hardlock_login(test_all_keys);
|
||||||
|
if (!ok && hw != _dongle_ssa)
|
||||||
|
ok = ssa_login(test_all_keys);
|
||||||
if (ok)
|
if (ok)
|
||||||
GetServerApp().SetConfigInt("Donglehw",(int)_hardware);
|
GetServerApp().SetConfigInt("Donglehw",(int)_hardware);
|
||||||
}
|
}
|
||||||
@ -678,13 +773,14 @@ bool TDongle::Logout()
|
|||||||
case _dongle_eutron:
|
case _dongle_eutron:
|
||||||
if (_eutron_key)
|
if (_eutron_key)
|
||||||
{
|
{
|
||||||
#ifdef WIN32
|
|
||||||
_eutron_key->net_command = NET_KEY_CLOSE;
|
_eutron_key->net_command = NET_KEY_CLOSE;
|
||||||
#endif
|
|
||||||
_eutron_key->command = 0;
|
_eutron_key->command = 0;
|
||||||
smartlink(_eutron_key);
|
smartlink(_eutron_key);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case _dongle_ssa:
|
||||||
|
ssa_logout();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -904,7 +1000,7 @@ bool TDongle::burn_eutron()
|
|||||||
if (ok)
|
if (ok)
|
||||||
{
|
{
|
||||||
unsigned short data[sob]; memset(data, 0, sizeof(data));
|
unsigned short data[sob]; memset(data, 0, sizeof(data));
|
||||||
for (int module = 1; module < 256; module++)
|
for (size_t module = 1; module < _code.GetCount(); module++)
|
||||||
{
|
{
|
||||||
if (Active(module))
|
if (Active(module))
|
||||||
{
|
{
|
||||||
@ -928,7 +1024,7 @@ bool TDongle::Burn()
|
|||||||
{
|
{
|
||||||
case _dongle_hardlock: ok = burn_hardlock(); break;
|
case _dongle_hardlock: ok = burn_hardlock(); break;
|
||||||
case _dongle_eutron : ok = burn_eutron(); break;
|
case _dongle_eutron : ok = burn_eutron(); break;
|
||||||
default : break;
|
default : ok = false; break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ok)
|
if (ok)
|
||||||
@ -937,3 +1033,71 @@ bool TDongle::Burn()
|
|||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxString TDongle::ModuleNumberToCode(size_t module) const
|
||||||
|
{
|
||||||
|
return module < _code.GetCount() ? _code[module] : wxEmptyString;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t TDongle::ModuleCodeToNumber(const wxChar* code) const
|
||||||
|
{
|
||||||
|
size_t n = 0;
|
||||||
|
if (code && *code)
|
||||||
|
{
|
||||||
|
const wxChar k[4] = { code[0], code[1], '\0', '\0' };
|
||||||
|
n = _code.Index(k, false);
|
||||||
|
}
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxString TDongle::ModuleDescription(size_t module) const
|
||||||
|
{
|
||||||
|
return module < _desc.GetCount() ? _desc[module] : wxEmptyString;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned short TDongle::ComputeMaxUsers(size_t module) const
|
||||||
|
{
|
||||||
|
wxASSERT(_hardware == _dongle_ssa);
|
||||||
|
unsigned short n = module == 0 ? 0xFFFF : 0;
|
||||||
|
if (module > 0 && Active(module))
|
||||||
|
{
|
||||||
|
const wxString m = ModuleNumberToCode(module);
|
||||||
|
wxString u;
|
||||||
|
for (n = 0; n < 32; n++)
|
||||||
|
{
|
||||||
|
u.Printf("DummyDongle:%d", n);
|
||||||
|
if (::Login(u, "Campo") != 0 || ::ApriModulo(u, m) != 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
for (short i = 0; i < n; i++)
|
||||||
|
{
|
||||||
|
u.Printf("DummyDongle:%d", i);
|
||||||
|
::Logout(u, "Campo");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return n < 32 ? n : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned short TDongle::MaxUsers(size_t module) const
|
||||||
|
{
|
||||||
|
if (module == 0)
|
||||||
|
return _max_users;
|
||||||
|
if (!Active(module))
|
||||||
|
return 0;
|
||||||
|
return _hardware == _dongle_ssa ? _user[module] : _max_users;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TDongle::OpenModule(size_t module)
|
||||||
|
{
|
||||||
|
if (MaxUsers(module) == 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (_hardware == _dongle_ssa)
|
||||||
|
{
|
||||||
|
const wxString u = GetSessionId();
|
||||||
|
const wxString m = ModuleNumberToCode(module);
|
||||||
|
if (::ApriModulo(u, m) != 0)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
@ -5,8 +5,8 @@
|
|||||||
#include <wx/datetime.h>
|
#include <wx/datetime.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
enum TDongleHardware { _dongle_unknown, _dongle_hardlock, _dongle_eutron, _dongle_xsec };
|
enum TDongleHardware { _dongle_unknown, _dongle_hardlock, _dongle_eutron, _dongle_ssa };
|
||||||
enum TDongleType { _no_dongle, _user_dongle, _developer_dongle, _aga_dongle, _prassi_dongle };
|
enum TDongleType { _no_dongle, _user_dongle, _developer_dongle, _aga_dongle, _sirio_dongle };
|
||||||
enum { MAX_DONGLE_ASSIST = 8 };
|
enum { MAX_DONGLE_ASSIST = 8 };
|
||||||
|
|
||||||
class TBit_array : public wxObject
|
class TBit_array : public wxObject
|
||||||
@ -60,12 +60,23 @@ class TDongle : public wxObject
|
|||||||
TBit_array _module;
|
TBit_array _module;
|
||||||
bool _dirty;
|
bool _dirty;
|
||||||
|
|
||||||
|
// Module codes and descriptions
|
||||||
|
wxArrayString _code, _desc;
|
||||||
|
unsigned short _user[64];
|
||||||
|
|
||||||
|
wxString GetSessionId() const; // host:session
|
||||||
|
unsigned short ComputeMaxUsers(size_t module) const;
|
||||||
|
bool OpenModule(size_t module);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool already_programmed() const;
|
bool already_programmed() const;
|
||||||
|
|
||||||
bool hardlock_login(bool test_all_dongles);
|
bool hardlock_login(bool test_all_dongles);
|
||||||
bool eutron_login(bool test_all_dongles);
|
bool eutron_login(bool test_all_dongles);
|
||||||
|
|
||||||
|
bool ssa_login(bool test_all_dongles);
|
||||||
|
bool ssa_logout();
|
||||||
|
|
||||||
bool burn_hardlock();
|
bool burn_hardlock();
|
||||||
bool burn_eutron();
|
bool burn_eutron();
|
||||||
|
|
||||||
@ -79,12 +90,10 @@ public:
|
|||||||
bool Connected();
|
bool Connected();
|
||||||
|
|
||||||
unsigned short Number() const { return _serno; }
|
unsigned short Number() const { return _serno; }
|
||||||
unsigned short MaxUsers() const { return _max_users; }
|
|
||||||
unsigned short YearAssist() const { return _year_assist; }
|
unsigned short YearAssist() const { return _year_assist; }
|
||||||
|
unsigned short MaxUsers(size_t module = 0) const;
|
||||||
|
|
||||||
void garble(unsigned short* data) const;
|
void garble(unsigned short* data) const;
|
||||||
|
|
||||||
// Solo per un po' di tempo, poi diverranno protected (servono a ba1500 old style)
|
|
||||||
bool read_words(unsigned short reg, unsigned short len, unsigned short *data) const;
|
bool read_words(unsigned short reg, unsigned short len, unsigned short *data) const;
|
||||||
bool write_words(unsigned short reg, unsigned short len, unsigned short *data) const;
|
bool write_words(unsigned short reg, unsigned short len, unsigned short *data) const;
|
||||||
|
|
||||||
@ -97,11 +106,16 @@ public:
|
|||||||
void set_year_assist(unsigned short y) { _year_assist = y; _dirty = true; }
|
void set_year_assist(unsigned short y) { _year_assist = y; _dirty = true; }
|
||||||
const wxDateTime& last_update() const { return _last_update; }
|
const wxDateTime& last_update() const { return _last_update; }
|
||||||
|
|
||||||
bool dirty() const { return _dirty; }
|
bool IsDirty() const { return _dirty; }
|
||||||
bool Burn();
|
bool Burn();
|
||||||
|
|
||||||
TDongleHardware hardware() const { return _hardware; }
|
TDongleHardware hardware() const { return _hardware; }
|
||||||
|
|
||||||
|
size_t Modules() const { return _code.GetCount(); }
|
||||||
|
wxString ModuleNumberToCode(size_t module) const;
|
||||||
|
size_t ModuleCodeToNumber(const wxChar* code) const;
|
||||||
|
wxString ModuleDescription(size_t module) const;
|
||||||
|
|
||||||
TDongle();
|
TDongle();
|
||||||
virtual ~TDongle();
|
virtual ~TDongle();
|
||||||
};
|
};
|
||||||
|
589
setup/dninst.txt
589
setup/dninst.txt
File diff suppressed because it is too large
Load Diff
@ -643,7 +643,11 @@ bool UnzipFile(const char* strSrcFile, const char* strDestDir)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
wxZipInputStream fin(strZipFile, strFileName);
|
//wxZipInputStream fin(strZipFile, strFileName);
|
||||||
|
wxFileInputStream fstr(strZipFile);
|
||||||
|
wxZipInputStream fin(fstr);
|
||||||
|
wxZipEntry ze(strFileName);
|
||||||
|
fin.OpenEntry(ze);
|
||||||
|
|
||||||
wxString strOutFile = strDestDir;
|
wxString strOutFile = strDestDir;
|
||||||
if (!wxEndsWithPathSeparator(strOutFile) && !wxIsPathSeparator(strFileName[0]))
|
if (!wxEndsWithPathSeparator(strOutFile) && !wxIsPathSeparator(strFileName[0]))
|
||||||
@ -658,6 +662,8 @@ bool UnzipFile(const char* strSrcFile, const char* strDestDir)
|
|||||||
fout.Write(fin);
|
fout.Write(fin);
|
||||||
fout.Close();
|
fout.Close();
|
||||||
|
|
||||||
|
fin.CloseEntry();
|
||||||
|
|
||||||
if (strOutFile.EndsWith("res.zip"))
|
if (strOutFile.EndsWith("res.zip"))
|
||||||
UnzipFile(strOutFile , strPath);
|
UnzipFile(strOutFile , strPath);
|
||||||
}
|
}
|
||||||
|
@ -54,7 +54,7 @@ bool TCache_art::update_paper_composition(const char* key, TArticolo_pack& art)
|
|||||||
qry << "SELECT Paper_Composition_Group.CompDesc\n"
|
qry << "SELECT Paper_Composition_Group.CompDesc\n"
|
||||||
<< "FROM Mag_Existing_Article, Articles_Composition, Paper_Composition_Group\n"
|
<< "FROM Mag_Existing_Article, Articles_Composition, Paper_Composition_Group\n"
|
||||||
<< "WHERE (Mag_Existing_Article.ArtCode='" << key << "') AND "
|
<< "WHERE (Mag_Existing_Article.ArtCode='" << key << "') AND "
|
||||||
<< "(Mag_Existing_Article.ArticleCode=Articles_composition.ArticleCode) AND "
|
<< "(Mag_Existing_Article.ArticleCode=Articles_composition.ArticleCode) AND (Mag_Existing_Article.VariantCode=Articles_composition.VariantCode) AND "
|
||||||
<< "(Articles_Composition.CompCode=Paper_Composition_Group.CompCode);";
|
<< "(Articles_Composition.CompCode=Paper_Composition_Group.CompCode);";
|
||||||
TODBC_recordset paperset(qry);
|
TODBC_recordset paperset(qry);
|
||||||
bool done = paperset.move_first();
|
bool done = paperset.move_first();
|
||||||
@ -209,7 +209,6 @@ const TArticolo_pack& TCache_art::articolo()
|
|||||||
if (gruconto > 0 && sottoconto > 0)
|
if (gruconto > 0 && sottoconto > 0)
|
||||||
codart << "*" << gruconto << '*' << sottoconto;
|
codart << "*" << gruconto << '*' << sottoconto;
|
||||||
}
|
}
|
||||||
|
|
||||||
return *(const TArticolo_pack*)objptr(codart);
|
return *(const TArticolo_pack*)objptr(codart);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -765,7 +764,7 @@ bool TPack_ddt::trasferisci()
|
|||||||
if (_order_paper_info)
|
if (_order_paper_info)
|
||||||
get_paper_from_order(descr);
|
get_paper_from_order(descr);
|
||||||
|
|
||||||
if (bIsSingleSheet && descr.find('(') < 0) // E' un foglio singolo senza dimensioni?
|
if (descr.find('(') < 0) // E' un foglio singolo senza dimensioni?
|
||||||
{
|
{
|
||||||
TString80 misure;
|
TString80 misure;
|
||||||
misure << get_str("Height") << " x " << get_str("Width");
|
misure << get_str("Height") << " x " << get_str("Width");
|
||||||
|
@ -8,7 +8,7 @@ int main( int argc, char** argv )
|
|||||||
|
|
||||||
switch (r)
|
switch (r)
|
||||||
{
|
{
|
||||||
case 2: ve6200(argc, argv); break; // creazione fatture partendo da bolle
|
case 2: ve6200(argc, argv); break; // fatturazione bolle
|
||||||
case 3: ve6300(argc, argv); break; // generazione effetti
|
case 3: ve6300(argc, argv); break; // generazione effetti
|
||||||
case 4: ve6400(argc, argv); break; // generazione scontrini
|
case 4: ve6400(argc, argv); break; // generazione scontrini
|
||||||
case 5: ve6500(argc, argv); break; // generazione righe da penna ottica
|
case 5: ve6500(argc, argv); break; // generazione righe da penna ottica
|
||||||
|
@ -48,7 +48,7 @@ class TContabilizzazione_app : public TApplication
|
|||||||
TDate _data_reg; // data di registrazione immessa
|
TDate _data_reg; // data di registrazione immessa
|
||||||
TDate _data_ini; // data di inizio intervallo
|
TDate _data_ini; // data di inizio intervallo
|
||||||
TDate _data_fine; // data di fine intervallo
|
TDate _data_fine; // data di fine intervallo
|
||||||
bool _auto_data; // se TRUE prende in automatico la data di registrazione dalla data documento
|
bool _auto_data; // se true prende in automatico la data di registrazione dalla data documento
|
||||||
TMask *_msk; // maschera di selezione dati
|
TMask *_msk; // maschera di selezione dati
|
||||||
TArray_sheet *_num_sheet; // Array sheet selezionabile dei codici numerazione
|
TArray_sheet *_num_sheet; // Array sheet selezionabile dei codici numerazione
|
||||||
TString_array _tipi_doc; // Array di stringhe contenente i tipi documenti da elaborare
|
TString_array _tipi_doc; // Array di stringhe contenente i tipi documenti da elaborare
|
||||||
@ -91,15 +91,12 @@ bool TContabilizzazione_app::handle_data_range(TMask_field& f, KEY k)
|
|||||||
{
|
{
|
||||||
TMask& m = f.mask();
|
TMask& m = f.mask();
|
||||||
if (m.get_bool(F_DATA_AUTO))
|
if (m.get_bool(F_DATA_AUTO))
|
||||||
return TRUE; // Skip controls if data is automatic
|
return true; // Skip controls if data is automatic
|
||||||
TDate da(m.get_date(F_DATA_INI));
|
TDate da(m.get_date(F_DATA_INI));
|
||||||
TDate a(m.get_date(F_DATA_FIN));
|
TDate a(m.get_date(F_DATA_FIN));
|
||||||
m.field(F_DATA_REG).set_dirty();
|
m.field(F_DATA_REG).set_dirty();
|
||||||
if ((a - da) > 15)
|
if ((a - da) > 15)
|
||||||
{
|
return f.error_box(TR("L'intervallo tra le date non puo' eccedere i 15 giorni."));
|
||||||
f.error_box(TR("L'intervallo tra le date non puo' eccedere i 15 giorni."));
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
if (f.dlg() == F_DATA_FIN)
|
if (f.dlg() == F_DATA_FIN)
|
||||||
m.set(F_DATA_REG,f.get());
|
m.set(F_DATA_REG,f.get());
|
||||||
}
|
}
|
||||||
@ -109,7 +106,7 @@ bool TContabilizzazione_app::handle_data_range(TMask_field& f, KEY k)
|
|||||||
if (!m.get_bool(F_DATA_AUTO) && f.dlg() == F_DATA_FIN)
|
if (!m.get_bool(F_DATA_AUTO) && f.dlg() == F_DATA_FIN)
|
||||||
m.set(F_DATA_REG,f.get());
|
m.set(F_DATA_REG,f.get());
|
||||||
}
|
}
|
||||||
return TRUE;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TContabilizzazione_app::handle_data_reg(TMask_field& f, KEY k)
|
bool TContabilizzazione_app::handle_data_reg(TMask_field& f, KEY k)
|
||||||
@ -119,20 +116,15 @@ bool TContabilizzazione_app::handle_data_reg(TMask_field& f, KEY k)
|
|||||||
TMask& m = f.mask();
|
TMask& m = f.mask();
|
||||||
|
|
||||||
TDate data_reg(f.get());
|
TDate data_reg(f.get());
|
||||||
if (data_reg == botime) return TRUE;
|
if (data_reg == botime)
|
||||||
|
return true;
|
||||||
TDate da(m.get_date(F_DATA_INI));
|
TDate da(m.get_date(F_DATA_INI));
|
||||||
if ((data_reg - da) > 15)
|
if ((data_reg - da) > 15)
|
||||||
{
|
return f.error_box(TR("L'intervallo tra la data di registrazione e la data di inizio non puo' eccedere i 15 giorni."));
|
||||||
f.error_box(TR("L'intervallo tra la data di registrazione e la data di inizio non puo' eccedere i 15 giorni."));
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
if (data_reg < da)
|
if (data_reg < da)
|
||||||
{
|
return f.error_box(TR("La data di registrazione non puo' essere minore della data di inizio."));
|
||||||
f.error_box(TR("La data di registrazione non puo' essere minore della data di inizio."));
|
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
}
|
return true;
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TContabilizzazione_app::handle_cod_eld(TMask_field& f, KEY k)
|
bool TContabilizzazione_app::handle_cod_eld(TMask_field& f, KEY k)
|
||||||
@ -143,7 +135,7 @@ bool TContabilizzazione_app::handle_cod_eld(TMask_field& f, KEY k)
|
|||||||
f.mask().disable(DLG_OK);
|
f.mask().disable(DLG_OK);
|
||||||
app().build_num_sheet();
|
app().build_num_sheet();
|
||||||
}
|
}
|
||||||
return TRUE;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TContabilizzazione_app::handle_select(TMask_field& f, KEY k)
|
bool TContabilizzazione_app::handle_select(TMask_field& f, KEY k)
|
||||||
@ -160,7 +152,7 @@ bool TContabilizzazione_app::handle_select(TMask_field& f, KEY k)
|
|||||||
m.disable(DLG_OK);
|
m.disable(DLG_OK);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return TRUE;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TContabilizzazione_app::build_num_sheet()
|
void TContabilizzazione_app::build_num_sheet()
|
||||||
@ -227,7 +219,7 @@ bool TContabilizzazione_app::doc_tipo_stato_ok(const TRectype& doc)
|
|||||||
const TString16 tipox(t.get(0));
|
const TString16 tipox(t.get(0));
|
||||||
const char statox = t.get(1)[0];
|
const char statox = t.get(1)[0];
|
||||||
if (tipo == tipox && stato == statox)
|
if (tipo == tipox && stato == statox)
|
||||||
found = TRUE;
|
found = true;
|
||||||
}
|
}
|
||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
@ -252,7 +244,7 @@ bool TContabilizzazione_app::create()
|
|||||||
_num_sheet = new TArray_sheet(-1,-1,-4,-4,"Codici numerazione",
|
_num_sheet = new TArray_sheet(-1,-1,-4,-4,"Codici numerazione",
|
||||||
"@1|Cod. numerazione|Descrizione@50");
|
"@1|Cod. numerazione|Descrizione@50");
|
||||||
dispatch_e_menu(BAR_ITEM_ID(1));
|
dispatch_e_menu(BAR_ITEM_ID(1));
|
||||||
return TRUE;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TContabilizzazione_app::destroy()
|
bool TContabilizzazione_app::destroy()
|
||||||
@ -284,7 +276,7 @@ void TContabilizzazione_app::contabilize()
|
|||||||
const long items = _num_sheet->items();
|
const long items = _num_sheet->items();
|
||||||
int year_from = _data_ini.year();
|
int year_from = _data_ini.year();
|
||||||
int year_to = _data_fine.year();
|
int year_to = _data_fine.year();
|
||||||
TString16 codnum;
|
TString4 codnum;
|
||||||
TString msg,filt_expr;
|
TString msg,filt_expr;
|
||||||
TToken_string nums;
|
TToken_string nums;
|
||||||
TContabilizzazione cont(_cod_el);
|
TContabilizzazione cont(_cod_el);
|
||||||
@ -329,10 +321,10 @@ void TContabilizzazione_app::contabilize()
|
|||||||
TLista_documenti lista_in,lista_out;
|
TLista_documenti lista_in,lista_out;
|
||||||
|
|
||||||
doc_cur.freeze();
|
doc_cur.freeze();
|
||||||
msg = "Selezione documenti dal ";
|
msg = TR("Selezione documenti dal ");
|
||||||
msg << _data_ini.string() << " al ";
|
msg << _data_ini.string() << TR(" al ");
|
||||||
msg << _data_fine.string();
|
msg << _data_fine.string();
|
||||||
TProgind p(cur_items,msg,FALSE,TRUE);
|
TProgind p(cur_items,msg,FALSE,true);
|
||||||
const TRectype& cur_rec = doc_cur.curr();
|
const TRectype& cur_rec = doc_cur.curr();
|
||||||
|
|
||||||
// Scorre tutti i documenti che rientrano nell'intervallo selezionato
|
// Scorre tutti i documenti che rientrano nell'intervallo selezionato
|
||||||
@ -363,5 +355,5 @@ int ve6100 (int argc, char **argv)
|
|||||||
{
|
{
|
||||||
TContabilizzazione_app a;
|
TContabilizzazione_app a;
|
||||||
a.run(argc,argv,"Contabilizzazione documenti");
|
a.run(argc,argv,"Contabilizzazione documenti");
|
||||||
return TRUE;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -17,8 +17,7 @@ bool TFatturazione_bolle_app::create()
|
|||||||
LF_DOC, LF_RIGHEDOC, LF_ANAMAG, LF_MOVMAG, LF_RMOVMAG, LF_CONDV, LF_SVRIEP,
|
LF_DOC, LF_RIGHEDOC, LF_ANAMAG, LF_MOVMAG, LF_RMOVMAG, LF_CONDV, LF_SVRIEP,
|
||||||
LF_AGENTI, LF_PERCPROV, LF_CAUSALI, 0);
|
LF_AGENTI, LF_PERCPROV, LF_CAUSALI, 0);
|
||||||
|
|
||||||
TConfig cfg(CONFIG_DITTA, "ve");
|
_default_selection = ini_get_string(CONFIG_DITTA, "ve", "FATBOLSEL");
|
||||||
_default_selection = cfg.get("FATBOLSEL");
|
|
||||||
|
|
||||||
return TSkeleton_application::create();
|
return TSkeleton_application::create();
|
||||||
}
|
}
|
||||||
|
@ -268,10 +268,8 @@ void TGenerazioneEffetti_app::build_num_sheet()
|
|||||||
bool TGenerazioneEffetti_app::create()
|
bool TGenerazioneEffetti_app::create()
|
||||||
{
|
{
|
||||||
if (!has_module(EFAUT))
|
if (!has_module(EFAUT))
|
||||||
{
|
return error_box("Il modulo Effetti non e' abilitato");
|
||||||
error_box("Impossibile eseguire il programma se il modulo Effetti non e' abilitato");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
open_files(LF_TABCOM, LF_TAB, LF_CLIFO, LF_OCCAS, LF_INDSP, LF_CFVEN,
|
open_files(LF_TABCOM, LF_TAB, LF_CLIFO, LF_OCCAS, LF_INDSP, LF_CFVEN,
|
||||||
LF_DOC, LF_RIGHEDOC, LF_ANAMAG, LF_MOVMAG, LF_RMOVMAG, LF_CONDV,
|
LF_DOC, LF_RIGHEDOC, LF_ANAMAG, LF_MOVMAG, LF_RMOVMAG, LF_CONDV,
|
||||||
LF_SVRIEP, LF_AGENTI, LF_PERCPROV, LF_CESS, LF_CAUSALI, 0);
|
LF_SVRIEP, LF_AGENTI, LF_PERCPROV, LF_CESS, LF_CAUSALI, 0);
|
||||||
|
@ -111,22 +111,15 @@ int TLista_documenti::read(char provv, char tipocf, long clifo, int anno,
|
|||||||
stop.put(DOC_ANNO, anno_stop);
|
stop.put(DOC_ANNO, anno_stop);
|
||||||
}
|
}
|
||||||
|
|
||||||
TString filter(16);
|
TString filter;
|
||||||
if (codnum && *codnum)
|
if (codnum && *codnum > ' ')
|
||||||
{
|
{
|
||||||
bool numfilter = false;
|
if (!start.get(DOC_DATADOC).empty())
|
||||||
|
|
||||||
if (start.get(DOC_DATADOC).empty())
|
|
||||||
numfilter = true;
|
|
||||||
else
|
|
||||||
start.put(DOC_CODNUM, codnum);
|
start.put(DOC_CODNUM, codnum);
|
||||||
|
|
||||||
if (stop.get(DOC_DATADOC).empty())
|
if (!stop.get(DOC_DATADOC).empty())
|
||||||
numfilter = true;
|
|
||||||
else
|
|
||||||
stop.put(DOC_CODNUM, codnum);
|
stop.put(DOC_CODNUM, codnum);
|
||||||
|
|
||||||
if (numfilter)
|
|
||||||
filter << DOC_CODNUM << "=\"" << codnum << '"';
|
filter << DOC_CODNUM << "=\"" << codnum << '"';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -421,7 +421,7 @@ protected:
|
|||||||
// Testa il fatto che il documento sia una nota di credito/debito
|
// Testa il fatto che il documento sia una nota di credito/debito
|
||||||
bool test_swap();
|
bool test_swap();
|
||||||
// Istanzia la causale contabile
|
// Istanzia la causale contabile
|
||||||
TCausale * get_caus(const TDocumento& doc, const int year);
|
TCausale* get_caus(const TDocumento& doc, const int year) const;
|
||||||
|
|
||||||
// Ritorna l'ultimo numero di registrazione disponibile dei movimenti di prima nota
|
// Ritorna l'ultimo numero di registrazione disponibile dei movimenti di prima nota
|
||||||
error_type get_next_reg_num(long &);
|
error_type get_next_reg_num(long &);
|
||||||
|
@ -958,16 +958,17 @@ error_type TContabilizzazione::get_next_reg_num(long& nr)
|
|||||||
|
|
||||||
long TContabilizzazione::doc_contabilized(const TDocumento& doc, bool anticipo) const
|
long TContabilizzazione::doc_contabilized(const TDocumento& doc, bool anticipo) const
|
||||||
{
|
{
|
||||||
|
const char* const key[4] = { DOC_PROVV, DOC_ANNO, DOC_CODNUM, DOC_NDOC };
|
||||||
|
// NON usare la cache qui!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
|
||||||
long nreg = doc.get_long(anticipo ? DOC_NUMANT : DOC_NUMREG);
|
long nreg = doc.get_long(anticipo ? DOC_NUMANT : DOC_NUMREG);
|
||||||
if (nreg > 0)
|
if (nreg > 0)
|
||||||
{
|
{
|
||||||
// NON usare la cache qui!!!!!!!!!!!!!!!!!!!!!!
|
|
||||||
TLocalisamfile mov(LF_MOV);
|
TLocalisamfile mov(LF_MOV);
|
||||||
mov.put(MOV_NUMREG, nreg);
|
mov.put(MOV_NUMREG, nreg);
|
||||||
if (mov.read() == NOERR) // Il movimento esiste!
|
if (mov.read() == NOERR) // Il movimento esiste!
|
||||||
{
|
{
|
||||||
// Controlla che il movimento abbia ancora il riferimento esatto al documento
|
// Controlla che il movimento abbia ancora il riferimento esatto al documento
|
||||||
const char* const key[4] = { DOC_PROVV, DOC_ANNO, DOC_CODNUM, DOC_NDOC };
|
|
||||||
TString8 dkey, dval;
|
TString8 dkey, dval;
|
||||||
for (int k = 0; k < 4; k++)
|
for (int k = 0; k < 4; k++)
|
||||||
{
|
{
|
||||||
@ -983,24 +984,57 @@ long TContabilizzazione::doc_contabilized(const TDocumento& doc, bool anticipo)
|
|||||||
else
|
else
|
||||||
nreg = 0; // Il movimento non esiste più: l'hanno cancellato!
|
nreg = 0; // Il movimento non esiste più: l'hanno cancellato!
|
||||||
}
|
}
|
||||||
|
else if (!anticipo)
|
||||||
|
{
|
||||||
|
const TDate data_reg = _auto_data ? doc.get_date(DOC_DATADOC) : _data_reg;
|
||||||
|
const TCausale* caus = get_caus(doc, data_reg.year());
|
||||||
|
TLocalisamfile mov(LF_MOV);
|
||||||
|
mov.setkey(3);
|
||||||
|
mov.put(MOV_TIPO, doc.clifor().tipo());
|
||||||
|
mov.put(MOV_CODCF, doc.clifor().codice());
|
||||||
|
mov.put(MOV_DATAREG, data_reg);
|
||||||
|
for (int err = mov.read(_isgteq); err == NOERR; err = mov.next())
|
||||||
|
{
|
||||||
|
const TDate d = mov.get(MOV_DATAREG);
|
||||||
|
if (d != data_reg)
|
||||||
|
break;
|
||||||
|
const TString& cau = mov.get(MOV_CODCAUS);
|
||||||
|
if (cau != caus->codice())
|
||||||
|
continue; // Altra causale, probabilmente anticipo
|
||||||
|
|
||||||
|
// Controlla che il movimento abbia il riferimento esatto al documento
|
||||||
|
TString8 dkey, dval;
|
||||||
|
int k = 0;
|
||||||
|
for (k = 0; k < 4; k++)
|
||||||
|
{
|
||||||
|
dkey = "D"; dkey << key[k];
|
||||||
|
dval = mov.get(dkey);
|
||||||
|
if (dval != doc.get(key[k]))
|
||||||
|
break; // La chiave non corrisponde: è un altro documento
|
||||||
|
}
|
||||||
|
if (k == 4) // Ricontabilizziaaamoo!
|
||||||
|
{
|
||||||
|
nreg = mov.get_long(MOV_NUMREG);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
return nreg;
|
return nreg;
|
||||||
}
|
}
|
||||||
|
|
||||||
TCausale * TContabilizzazione::get_caus(const TDocumento& doc, const int year)
|
TCausale* TContabilizzazione::get_caus(const TDocumento& doc, const int year) const
|
||||||
{
|
{
|
||||||
TString16 codcaus;
|
TString8 codcaus;
|
||||||
TToken_string key;
|
TToken_string key;
|
||||||
|
|
||||||
if (!_fld_cms_cont.blank())
|
if (_fld_cms_cont.full())
|
||||||
{
|
{
|
||||||
const TString & cms = doc.commessa_principale();
|
const TString& cms = doc.commessa_principale();
|
||||||
|
if (cms.full())
|
||||||
if (!cms.blank())
|
|
||||||
{
|
{
|
||||||
key.add(cms);
|
key.add(cms);
|
||||||
const TString16 fld_val = cache().get(LF_COMMESSE, key, _fld_cms_cont);
|
const TString16 fld_val = cache().get(LF_COMMESSE, key, _fld_cms_cont);
|
||||||
|
if (fld_val.full())
|
||||||
if (!fld_val.blank())
|
|
||||||
{
|
{
|
||||||
key = "CTCMS";
|
key = "CTCMS";
|
||||||
key.add(doc.tipo().codice());
|
key.add(doc.tipo().codice());
|
||||||
@ -1020,7 +1054,17 @@ TCausale * TContabilizzazione::get_caus(const TDocumento& doc, const int year)
|
|||||||
codcaus = doc.tipo().causale(); // Istanzia la causale del documento corrente...
|
codcaus = doc.tipo().causale(); // Istanzia la causale del documento corrente...
|
||||||
}
|
}
|
||||||
|
|
||||||
return codcaus.blank() ? NULL : new TCausale(codcaus, year);
|
if (_caus != NULL && _caus->codice() == codcaus && _caus->reg().year() == year)
|
||||||
|
return _caus;
|
||||||
|
if (_caus != NULL)
|
||||||
|
{
|
||||||
|
delete _caus;
|
||||||
|
_caus = NULL;
|
||||||
|
}
|
||||||
|
if (codcaus.full())
|
||||||
|
_caus = new TCausale(codcaus, year);
|
||||||
|
|
||||||
|
return _caus;
|
||||||
}
|
}
|
||||||
|
|
||||||
error_type TContabilizzazione::compile_head_mov(TDocumento& doc)
|
error_type TContabilizzazione::compile_head_mov(TDocumento& doc)
|
||||||
@ -1062,12 +1106,12 @@ error_type TContabilizzazione::compile_head_mov(TDocumento& doc)
|
|||||||
{
|
{
|
||||||
msg << "stampato su bollato";
|
msg << "stampato su bollato";
|
||||||
_viswin->add_line(msg);
|
_viswin->add_line(msg);
|
||||||
}
|
} else
|
||||||
if (mov.get_bool(MOV_STAMPATO))
|
if (mov.get_bool(MOV_STAMPATO))
|
||||||
{
|
{
|
||||||
msg << "stampato sul giornale";
|
msg << "stampato sul giornale";
|
||||||
_viswin->add_line(msg);
|
_viswin->add_line(msg);
|
||||||
}
|
} else
|
||||||
if (mov.get_bool(MOV_INVIATO))
|
if (mov.get_bool(MOV_INVIATO))
|
||||||
{
|
{
|
||||||
msg << "inviato ad altra contabilità";
|
msg << "inviato ad altra contabilità";
|
||||||
@ -1101,20 +1145,11 @@ error_type TContabilizzazione::compile_head_mov(TDocumento& doc)
|
|||||||
}
|
}
|
||||||
numdoc.upper(); // Il numero documento e' uppercase!
|
numdoc.upper(); // Il numero documento e' uppercase!
|
||||||
|
|
||||||
// Istanzia la causale del documento corrente...
|
|
||||||
const TTipo_documento& tipo = doc.tipo();
|
const TTipo_documento& tipo = doc.tipo();
|
||||||
TString16 codcaus = tipo.causale();
|
|
||||||
|
|
||||||
TToken_string key;
|
|
||||||
key.add(doc.get(DOC_TIPOCF));
|
|
||||||
key.add(doc.get(DOC_CODCF));
|
|
||||||
const TRectype& cfven = cache().get(LF_CFVEN, key);
|
|
||||||
|
|
||||||
const TString& caus_cli = cfven.get(doc.is_nota_credito() ? CFV_CODCAUSNC : CFV_CODCAUS);
|
|
||||||
if (caus_cli.not_empty())
|
|
||||||
codcaus = caus_cli; // La causale del cliente prevale su quella del tipo documento
|
|
||||||
|
|
||||||
|
// Istanzia la causale del documento corrente...
|
||||||
_caus = get_caus(doc, data_reg.year());
|
_caus = get_caus(doc, data_reg.year());
|
||||||
|
|
||||||
_righe_iva->set_caus(_caus);
|
_righe_iva->set_caus(_caus);
|
||||||
if (_caus == NULL || !_caus->ok())
|
if (_caus == NULL || !_caus->ok())
|
||||||
{
|
{
|
||||||
@ -4015,7 +4050,7 @@ void TContabilizzazione::display_error(TDocumento& doc)
|
|||||||
TToken_string msg(256, '.');
|
TToken_string msg(256, '.');
|
||||||
const TString4 numerazione = doc.numerazione();
|
const TString4 numerazione = doc.numerazione();
|
||||||
const long numero = doc.numero();
|
const long numero = doc.numero();
|
||||||
const TString4 causale = _caus == NULL ? "" : _caus->codice();
|
const char* causale = _caus == NULL ? "" : _caus->codice();
|
||||||
|
|
||||||
switch (_error)
|
switch (_error)
|
||||||
{
|
{
|
||||||
@ -4267,8 +4302,12 @@ bool TContabilizzazione::elabora(TLista_documenti& doc_in, TLista_documenti& doc
|
|||||||
_error = no_error;
|
_error = no_error;
|
||||||
_nrow = 0;
|
_nrow = 0;
|
||||||
_total_docs = 0L;
|
_total_docs = 0L;
|
||||||
_caus = NULL;
|
|
||||||
_data_reg = data_elab;
|
_data_reg = data_elab;
|
||||||
|
if (_caus != NULL)
|
||||||
|
{
|
||||||
|
delete _caus;
|
||||||
|
_caus = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (interattivo)
|
if (interattivo)
|
||||||
{
|
{
|
||||||
|
@ -79,7 +79,7 @@ TGenerazione_effetti::~TGenerazione_effetti()
|
|||||||
void TGenerazione_effetti::display_error(TDocumento& doc)
|
void TGenerazione_effetti::display_error(TDocumento& doc)
|
||||||
{
|
{
|
||||||
TString msg;
|
TString msg;
|
||||||
TString numerazione = doc.numerazione();
|
const TString4 numerazione = doc.numerazione();
|
||||||
const long numero = doc.numero();
|
const long numero = doc.numero();
|
||||||
|
|
||||||
switch (_error)
|
switch (_error)
|
||||||
@ -696,7 +696,10 @@ void TGenerazione_effetti::generate_bill(TDocumento& doc, bool interattivo) // b
|
|||||||
reffetto.put(REFF_IMPFATT,totfatlit.get_num());
|
reffetto.put(REFF_IMPFATT,totfatlit.get_num());
|
||||||
reffetto.put(REFF_IMPORTOVAL,importo);
|
reffetto.put(REFF_IMPORTOVAL,importo);
|
||||||
}
|
}
|
||||||
if (_efffile->write() == NOERR && _refffile->write() == NOERR)
|
int err = _efffile->write();
|
||||||
|
if (err == NOERR)
|
||||||
|
err = _refffile->write_rewrite();
|
||||||
|
if (err == NOERR)
|
||||||
{
|
{
|
||||||
_total_bills++;
|
_total_bills++;
|
||||||
nprog++;
|
nprog++;
|
||||||
|
@ -3951,6 +3951,9 @@ long xvt_vobj_get_attr(WINDOW win, long data)
|
|||||||
case ATTR_APPL_VERSION_STRING:
|
case ATTR_APPL_VERSION_STRING:
|
||||||
ret = (long)(const char*)_appl_version;
|
ret = (long)(const char*)_appl_version;
|
||||||
break;
|
break;
|
||||||
|
case ATTR_APPL_VERSION_YEAR:
|
||||||
|
ret = wxAtoi(_appl_version.Left(4));
|
||||||
|
break;
|
||||||
case ATTR_APPL_ALREADY_RUNNING:
|
case ATTR_APPL_ALREADY_RUNNING:
|
||||||
ret = _appl_already_running;
|
ret = _appl_already_running;
|
||||||
break;
|
break;
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
* Agreement with XVT Software.
|
* Agreement with XVT Software.
|
||||||
*
|
*
|
||||||
* $RCSfile: xvt_defs.h,v $
|
* $RCSfile: xvt_defs.h,v $
|
||||||
* $Revision: 1.11.2.1 $
|
* $Revision: 1.11.2.2 $
|
||||||
*
|
*
|
||||||
* Purpose: Global XVT macro definitions.
|
* Purpose: Global XVT macro definitions.
|
||||||
*
|
*
|
||||||
@ -493,6 +493,7 @@
|
|||||||
#define ATTR_SPEECH_MODE (ATTR_BASE + 720) /* Added by Guy */
|
#define ATTR_SPEECH_MODE (ATTR_BASE + 720) /* Added by Guy */
|
||||||
#define ATTR_APPL_VERSION_STRING (ATTR_BASE + 721) /* Added by Guy */
|
#define ATTR_APPL_VERSION_STRING (ATTR_BASE + 721) /* Added by Guy */
|
||||||
#define ATTR_APPL_ALREADY_RUNNING (ATTR_BASE + 722) /* Added by Guy */
|
#define ATTR_APPL_ALREADY_RUNNING (ATTR_BASE + 722) /* Added by Guy */
|
||||||
|
#define ATTR_APPL_VERSION_YEAR (ATTR_BASE + 723) /* Added by Guy */
|
||||||
|
|
||||||
/* Font attributes */
|
/* Font attributes */
|
||||||
#define ATTR_FONT_MAPPER (ATTR_BASE + 800)
|
#define ATTR_FONT_MAPPER (ATTR_BASE + 800)
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
#include "wxinc.h"
|
#include "wxinc.h"
|
||||||
#include "xvt.h"
|
#include "xvt.h"
|
||||||
|
|
||||||
#include "../../ssa/h/ssadll.h"
|
#include "../../ssa/h/ssadll.h"
|
||||||
#include "../../ssa/h/ssaerr.h"
|
#include "../../ssa/h/ssaerr.h"
|
||||||
|
|
||||||
//#define SSA_MOD_NOTFOUND -201
|
#include <errno.h>
|
||||||
//#define SSA_NO_LOGIN -301
|
|
||||||
|
|
||||||
static int _ssa_serial = SSA_UTENTE_NON_LOGGATO;
|
static int _ssa_serial = SSA_UTENTE_NON_LOGGATO;
|
||||||
static wxString _ssa_module;
|
static wxString _ssa_module;
|
||||||
@ -27,6 +27,9 @@ int xvt_dongle_sa_login(const char* module)
|
|||||||
{
|
{
|
||||||
int err = _ssa_serial;
|
int err = _ssa_serial;
|
||||||
|
|
||||||
|
const int nAssYear = xvt_vobj_get_attr(NULL_WIN, ATTR_APPL_VERSION_YEAR);
|
||||||
|
if (nAssYear > 2091)
|
||||||
|
{
|
||||||
if (_ssa_serial < 0)
|
if (_ssa_serial < 0)
|
||||||
{
|
{
|
||||||
err = SSA_Login(xvt_dongle_sa_id(), "Campo");
|
err = SSA_Login(xvt_dongle_sa_id(), "Campo");
|
||||||
@ -44,6 +47,7 @@ int xvt_dongle_sa_login(const char* module)
|
|||||||
_ssa_module = module;
|
_ssa_module = module;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@ -53,7 +57,7 @@ int xvt_dongle_sa_crypt(unsigned short* data)
|
|||||||
if (_ssa_serial < 0)
|
if (_ssa_serial < 0)
|
||||||
return SSA_UTENTE_NON_LOGGATO;
|
return SSA_UTENTE_NON_LOGGATO;
|
||||||
if (data == NULL)
|
if (data == NULL)
|
||||||
return -ENOMEM;
|
return -EACCES;
|
||||||
data[0] ^= 0xDEAD;
|
data[0] ^= 0xDEAD;
|
||||||
data[1] ^= 0xBEEF;
|
data[1] ^= 0xBEEF;
|
||||||
data[2] ^= 0xDEAD;
|
data[2] ^= 0xDEAD;
|
||||||
|
@ -182,7 +182,7 @@ public:
|
|||||||
void Suspend();
|
void Suspend();
|
||||||
void Resume();
|
void Resume();
|
||||||
void Enable(const wxTreeItemId& id, bool on);
|
void Enable(const wxTreeItemId& id, bool on);
|
||||||
TwxTreeListCtrl(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size);
|
TwxTreeListCtrl(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, bool multisel);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TwxOutlookItem
|
struct TwxOutlookItem
|
||||||
@ -357,7 +357,8 @@ WINDOW xvt_ctl_create_def(WIN_DEF* win_def_p, WINDOW parent_win, long app_data)
|
|||||||
break;
|
break;
|
||||||
case WC_TREELIST:
|
case WC_TREELIST:
|
||||||
{
|
{
|
||||||
TwxTreeListCtrl* tv = new TwxTreeListCtrl(pParent, id, rct.GetPosition(), rct.GetSize());
|
const bool multisel = (win_def_p->v.ctl.flags & CTL_FLAG_MULTIPLE) != 0;
|
||||||
|
TwxTreeListCtrl* tv = new TwxTreeListCtrl(pParent, id, rct.GetPosition(), rct.GetSize(), multisel);
|
||||||
win = (WINDOW)tv;
|
win = (WINDOW)tv;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -2851,9 +2852,9 @@ void TwxTreeListCtrl::SetNodeImages(const wxTreeItemId& id, XVT_IMAGE item_image
|
|||||||
}
|
}
|
||||||
|
|
||||||
TwxTreeListCtrl::TwxTreeListCtrl(wxWindow *parent, wxWindowID id,
|
TwxTreeListCtrl::TwxTreeListCtrl(wxWindow *parent, wxWindowID id,
|
||||||
const wxPoint& pos, const wxSize& size)
|
const wxPoint& pos, const wxSize& size, bool multisel)
|
||||||
: wxTreeListCtrl(parent, id, pos, size,
|
: wxTreeListCtrl(parent, id, pos, size,
|
||||||
wxTR_HAS_BUTTONS|wxTR_HIDE_ROOT|wxTR_ROW_LINES|wxTR_COLUMN_LINES|wxTR_SINGLE),
|
wxTR_HAS_BUTTONS|wxTR_HIDE_ROOT|wxTR_ROW_LINES|wxTR_COLUMN_LINES|(multisel ? wxTR_MULTIPLE : wxTR_SINGLE)),
|
||||||
m_nFrozen(0)
|
m_nFrozen(0)
|
||||||
{
|
{
|
||||||
AddColumn(wxEmptyString, size.x);
|
AddColumn(wxEmptyString, size.x);
|
||||||
|
@ -249,6 +249,9 @@ TMessageBox::TMessageBox(wxWindow* pParent, const wxString& msg, int nStyle, int
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!bTerminalino)
|
if (!bTerminalino)
|
||||||
|
{
|
||||||
|
const int nAssYear = xvt_vobj_get_attr(NULL_WIN, ATTR_APPL_VERSION_YEAR);
|
||||||
|
if (nAssYear > 2091)
|
||||||
{
|
{
|
||||||
const wxBitmap bmpCopy = wxArtProvider::GetBitmap(wxART_COPY, wxART_BUTTON);
|
const wxBitmap bmpCopy = wxArtProvider::GetBitmap(wxART_COPY, wxART_BUTTON);
|
||||||
wxBitmapButton* btnCopy = new wxBitmapButton(this, wxID_COPY, bmpCopy);
|
wxBitmapButton* btnCopy = new wxBitmapButton(this, wxID_COPY, bmpCopy);
|
||||||
@ -261,6 +264,7 @@ TMessageBox::TMessageBox(wxWindow* pParent, const wxString& msg, int nStyle, int
|
|||||||
pSmallSizer->Add(btnMail, 0, wxALIGN_TOP);
|
pSmallSizer->Add(btnMail, 0, wxALIGN_TOP);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
SetSizerAndFit(pMainSizer);
|
SetSizerAndFit(pMainSizer);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user