Patch level :
Files correlati : Ricompilazione Demo : [ ] Commento : git-svn-id: svn://10.65.10.50/branches/R_10_00@22439 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
67cf6dcf15
commit
8dc1c4c8f3
17
ba/ba2.cpp
17
ba/ba2.cpp
@ -8,14 +8,15 @@ int main(int argc, char** argv)
|
||||
|
||||
switch (r)
|
||||
{
|
||||
case 1: ba2200(argc, argv); break; //backup
|
||||
case 2: ba2300(argc, argv); break; //autoformazione
|
||||
case 3: ba2400(argc, argv); break; //stampa versamenti
|
||||
case 4: ba2500(argc, argv); break; //stampa deleghe IVA
|
||||
case 5: ba2600(argc, argv); break; //editor maschere
|
||||
case 6: ba2700(argc, argv); break; //creazione dizionario
|
||||
default: ba2100(argc, argv); break; //parametrizzazione stampa
|
||||
case 1: ba2200(argc, argv); break; // backup
|
||||
case 2: ba2300(argc, argv); break; // autoformazione
|
||||
case 3: ba2400(argc, argv); break; // stampa versamenti
|
||||
case 4: ba2500(argc, argv); break; // stampa deleghe IVA
|
||||
case 5: ba2600(argc, argv); break; // editor maschere
|
||||
case 6: ba2700(argc, argv); break; // creazione dizionario
|
||||
case 7: ba2800(argc, argv); break; // dninst manager
|
||||
default:ba2100(argc, argv); break; // parametrizzazione stampa
|
||||
}
|
||||
exit(0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
1
ba/ba2.h
1
ba/ba2.h
@ -8,6 +8,7 @@ int ba2400(int argc, char* argv[]);
|
||||
int ba2500(int argc, char* argv[]);
|
||||
int ba2600(int argc, char* argv[]);
|
||||
int ba2700(int argc, char* argv[]);
|
||||
int ba2800(int argc, char* argv[]);
|
||||
|
||||
#endif // __BA2_H
|
||||
|
||||
|
683
ba/ba2800.cpp
Normal file
683
ba/ba2800.cpp
Normal file
@ -0,0 +1,683 @@
|
||||
#include <applicat.h>
|
||||
#include <assoc.h>
|
||||
#include <automask.h>
|
||||
#include <colors.h>
|
||||
#include <config.h>
|
||||
#include <dongle.h>
|
||||
#include <odbcrset.h>
|
||||
#include <progind.h>
|
||||
#include <utility.h>
|
||||
#include <xml.h>
|
||||
|
||||
#include "ba2800a.h"
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// Utilities
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
const TString& smart_trim(const TString& str, int len)
|
||||
{
|
||||
TString& tmp = get_tmp_string();
|
||||
tmp = str;
|
||||
tmp.trim();
|
||||
if (tmp.len() > len)
|
||||
{
|
||||
TParagraph_string p(tmp, len);
|
||||
tmp = p.get();
|
||||
}
|
||||
return tmp;
|
||||
}
|
||||
|
||||
int smart_cmp(const char* s1, const char* s2)
|
||||
{
|
||||
if (s1 == NULL || *s1 <= ' ') s1 = "";
|
||||
if (s2 == NULL || *s2 <= ' ') s2 = "";
|
||||
if (isdigit(*s1) && isdigit(*s2))
|
||||
return atoi(s1) - atoi(s2);
|
||||
|
||||
return xvt_str_compare_ignoring_case(s1, s2);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////a
|
||||
// TOEM_cache
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
class TOEM_cache
|
||||
{
|
||||
public:
|
||||
int Agente2OEM(int agente) const;
|
||||
TOEM_cache();
|
||||
};
|
||||
|
||||
// Trasforma un codice OEM del DB in quello di oem.ini
|
||||
int TOEM_cache::Agente2OEM(int agente) const
|
||||
{
|
||||
int oem = -1;
|
||||
switch (agente)
|
||||
{
|
||||
case 1: // Administrator
|
||||
case 2: oem = 0; break;
|
||||
case 3: oem = 1; break;
|
||||
case 4: oem = 3; break;
|
||||
case 5: oem = 6; break;
|
||||
case 6: oem = 5; break;
|
||||
case 7: oem = 7; break;
|
||||
case 8: oem = 8; break;
|
||||
default: break;
|
||||
}
|
||||
return oem;
|
||||
}
|
||||
|
||||
// Carica la lista di tutti gli OEM dal file setup/oem.ini
|
||||
TOEM_cache::TOEM_cache()
|
||||
{ }
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// Tdnist_full
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
class Tdnist_full
|
||||
{
|
||||
TArray _chiavi;
|
||||
|
||||
public:
|
||||
void set(int key, const char* var, const TString& value);
|
||||
const TString& get(int key, const char* var) const;
|
||||
int last() const { return _chiavi.last(); }
|
||||
bool exists(int key) const { return _chiavi.objptr(key) != NULL; }
|
||||
|
||||
bool load();
|
||||
bool save() const;
|
||||
};
|
||||
|
||||
const char* const DNINST_ZIP = "setup/dninst.zip";
|
||||
const char* const DNINST_TXT = "setup/dninst.txt";
|
||||
|
||||
void Tdnist_full::set(int key, const char* var, const TString& value)
|
||||
{
|
||||
CHECKD(key > 0, "Invalid key ", key);
|
||||
TAssoc_array* info = (TAssoc_array*)_chiavi.objptr(key);
|
||||
if (info == NULL)
|
||||
{
|
||||
info = new TAssoc_array;
|
||||
_chiavi.add(info, key);
|
||||
}
|
||||
if (value.full())
|
||||
info->add(var, value, true);
|
||||
else
|
||||
info->remove(var);
|
||||
}
|
||||
|
||||
const TString& Tdnist_full::get(int key, const char* var) const
|
||||
{
|
||||
TAssoc_array* info = (TAssoc_array*)_chiavi.objptr(key);
|
||||
if (info == NULL)
|
||||
return EMPTY_STRING;
|
||||
const TString* val = (const TString*)info->objptr(var);
|
||||
return val ? *val : EMPTY_STRING;
|
||||
}
|
||||
|
||||
// Decodifica l'intero dninst.zip in memoria
|
||||
bool Tdnist_full::load()
|
||||
{
|
||||
_chiavi.destroy();
|
||||
|
||||
TFilename txt = DNINST_TXT;
|
||||
Tdninst dninst;
|
||||
if (dninst.decode(txt))
|
||||
{
|
||||
TScanner s(txt);
|
||||
const int anno = atoi(s.line());
|
||||
int key = 0;
|
||||
TString16 var;
|
||||
TString256 val;
|
||||
while (s.good())
|
||||
{
|
||||
TString& line = s.line();
|
||||
if (line[0] == '[')
|
||||
{
|
||||
line.strip("[]");
|
||||
key = atoi(line);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (key > 0)
|
||||
{
|
||||
const int equal = line.find('=');
|
||||
if (equal > 0)
|
||||
{
|
||||
var = line.left(equal); var.trim();
|
||||
val = line.mid(equal+1); val.strip("\""); val.trim();
|
||||
set(key, var, val);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
cantread_box(DNINST_ZIP);
|
||||
|
||||
return !_chiavi.empty();
|
||||
}
|
||||
|
||||
bool Tdnist_full::save() const
|
||||
{
|
||||
Tdninst dninst;
|
||||
bool done = dninst.ok();
|
||||
|
||||
if (done)
|
||||
{
|
||||
ofstream out(DNINST_TXT);
|
||||
out << dninst.assist_year() << endl;
|
||||
FOR_EACH_ARRAY_ITEM(_chiavi, key, obj)
|
||||
{
|
||||
out << '[' << key << ']' << endl;
|
||||
TAssoc_array& info = (TAssoc_array&)*obj;
|
||||
FOR_EACH_ASSOC_OBJECT(info, o, k, i)
|
||||
out << k << '=' << *i << endl;
|
||||
}
|
||||
}
|
||||
|
||||
if (done)
|
||||
done = dninst.encode(DNINST_TXT);
|
||||
|
||||
return done;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// Tdnist_mask
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
static int _c_key, _c_oem, _c_owner, _c_suspend, _c_killed;
|
||||
static int _c_dboem, _c_dbowner, _c_dbsuspend, _c_dbkilled;
|
||||
static int _c_xmloem, _c_xmlowner, _c_xmlaccess;
|
||||
|
||||
class Tdnist_mask : public TAutomask
|
||||
{
|
||||
TOEM_cache _oem;
|
||||
Tdnist_full _dninst;
|
||||
|
||||
private:
|
||||
static int dongle_compare(const TSortable& o1, const TSortable& o2, void* jolly);
|
||||
|
||||
const TString& remote_dninst() const;
|
||||
TToken_string& find_or_create_line(TString_array& a, int key) const;
|
||||
|
||||
void load_dninst(TString_array& a);
|
||||
bool load_odbc(TString_array& a) const;
|
||||
bool load_xml(TString_array& a) const;
|
||||
|
||||
protected:
|
||||
void fill_sheet();
|
||||
void merge_sheet();
|
||||
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
||||
|
||||
public:
|
||||
Tdnist_mask();
|
||||
};
|
||||
|
||||
int Tdnist_mask::dongle_compare(const TSortable& o1, const TSortable& o2, void* jolly)
|
||||
{
|
||||
TToken_string& d1 = (TToken_string&)o1;
|
||||
TToken_string& d2 = (TToken_string&)o2;
|
||||
const int sort = *(int*)jolly;
|
||||
|
||||
if (sort == 1)
|
||||
{
|
||||
const char* o1 = d1.get(_c_oem);
|
||||
if (o1 == NULL || *o1 <= ' ')
|
||||
o1 = d1.get(_c_dboem);
|
||||
const char* o2 = d2.get(_c_oem);
|
||||
if (o2 == NULL || *o2 <= ' ')
|
||||
o2 = d2.get(_c_dboem);
|
||||
const int cmp = smart_cmp(o1, o2);
|
||||
if (cmp != 0)
|
||||
return cmp;
|
||||
}
|
||||
if (sort >= 1)
|
||||
{
|
||||
const char* o1 = d1.get(_c_owner);
|
||||
if (o1 == NULL || *o1 <= ' ')
|
||||
o1 = d1.get(_c_dbowner);
|
||||
const char* o2 = d2.get(_c_owner);
|
||||
if (o2 == NULL || *o2 <= ' ')
|
||||
o2 = d2.get(_c_dbowner);
|
||||
const int cmp = smart_cmp(o1, o2);
|
||||
if (cmp != 0)
|
||||
return cmp;
|
||||
}
|
||||
|
||||
return atoi(d1) - atoi(d2);
|
||||
}
|
||||
|
||||
const TString& Tdnist_mask::remote_dninst() const
|
||||
{
|
||||
TString& path = get_tmp_string();
|
||||
if (get_bool(F_DNINST_ON))
|
||||
{
|
||||
path = get(F_DNINST); path.lower();
|
||||
if (!path.ends_with(DNINST_ZIP))
|
||||
path << "/" << DNINST_ZIP;
|
||||
}
|
||||
return path;
|
||||
}
|
||||
|
||||
void Tdnist_mask::load_dninst(TString_array& a)
|
||||
{
|
||||
_dninst.load();
|
||||
|
||||
const int last_key = _dninst.last();
|
||||
TToken_string str;
|
||||
for (int key = 1; key <= last_key; key++) if (_dninst.exists(key))
|
||||
{
|
||||
str.cut(0) << key;
|
||||
str.add(_dninst.get(key, "OEM"), _c_oem);
|
||||
str.add(smart_trim(_dninst.get(key, "Owner"), 50), _c_owner);
|
||||
str.add(_dninst.get(key, "MustCall"), _c_suspend);
|
||||
str.add(_dninst.get(key, "*"), _c_killed);
|
||||
a.add(str);
|
||||
}
|
||||
}
|
||||
|
||||
TToken_string& Tdnist_mask::find_or_create_line(TString_array& a, int key) const
|
||||
{
|
||||
int mi = 0, ma = a.last();
|
||||
int k = 0;
|
||||
while (mi <= ma)
|
||||
{
|
||||
const int me = (mi+ma)/2;
|
||||
k = a.row(me).get_int(0);
|
||||
if (k == key)
|
||||
return a.row(me);
|
||||
if (k < key)
|
||||
mi = me+1;
|
||||
else
|
||||
ma = me-1;
|
||||
}
|
||||
while (mi < a.items() && key > a.row(mi).get_int(0))
|
||||
mi++;
|
||||
TToken_string* str = new TToken_string;
|
||||
str->add(key);
|
||||
a.insert(str, mi);
|
||||
return *str;
|
||||
}
|
||||
|
||||
bool Tdnist_mask::load_odbc(TString_array& a) const
|
||||
{
|
||||
if (!get_bool(F_DSN_ON))
|
||||
return false;
|
||||
|
||||
TString query;
|
||||
query << "ODBC(" << get(F_DSN) << ")\n"
|
||||
<< "SELECT chiavette.codice AS Chiave, Agente, RagioneSociale, DataDisattivazione\n"
|
||||
<< "FROM chiavette,clienti WHERE chiavette.cliente=clienti.codice\n"
|
||||
<< "ORDER BY Chiave";
|
||||
|
||||
TODBC_recordset att(query);
|
||||
TProgind pi(att.items(), get(F_DSN));
|
||||
for (bool ok = att.move_first(); ok; ok = att.move_next())
|
||||
{
|
||||
if (!pi.addstatus(1)) break;
|
||||
const int key = att.get("Chiave").as_int();
|
||||
|
||||
if (key > 0)
|
||||
{
|
||||
TToken_string& r = find_or_create_line(a, key);
|
||||
const int agente = att.get("Agente").as_int();
|
||||
r.add(_oem.Agente2OEM(agente), _c_dboem);
|
||||
r.add(smart_trim(att.get("RagioneSociale").as_string(), 50), _c_dbowner);
|
||||
|
||||
const TString& kill = att.get("DataDisattivazione").as_string();
|
||||
if (kill.full() && kill.len() == 10)
|
||||
{
|
||||
const TString& stato = att.get("Stato").as_string();
|
||||
switch (stato[0])
|
||||
{
|
||||
case 'D': r.add(kill, _c_dbkilled); break; // Disdetto
|
||||
case 'S': r.add(kill, _c_dbsuspend); break; // Sospeso
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return !att.empty();
|
||||
}
|
||||
|
||||
static bool XmlScanner(TXmlItem& item, long jolly)
|
||||
{
|
||||
TToken_string& row = *(TToken_string*)jolly;
|
||||
if (item.GetTag() == "firm")
|
||||
{
|
||||
if (item.GetBoolAttr("Current"))
|
||||
row.add(item.GetAttr("RAGSOC"), _c_xmlowner);
|
||||
} else
|
||||
if (item.GetTag() == "dongle")
|
||||
{
|
||||
row.add(item.GetAttr("OEM"), _c_xmloem);
|
||||
} else
|
||||
if (item.GetTag() == "module")
|
||||
{
|
||||
const TDate date_new = item.GetAttr("Date");
|
||||
const TDate date_old = row.get(_c_xmlaccess);
|
||||
if (date_new > date_old)
|
||||
row.add(date_new, _c_xmlaccess);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Tdnist_mask::load_xml(TString_array& a) const
|
||||
{
|
||||
if (!get_bool(F_FTP_ON))
|
||||
return false;
|
||||
|
||||
TFilename path = get(F_FTP);
|
||||
if (!path.ends_with(".xml"))
|
||||
{
|
||||
if (!path.ends_with("/"))
|
||||
path << '/';
|
||||
path << "?????.xml";
|
||||
}
|
||||
|
||||
TString_array xml;
|
||||
list_files(path, xml);
|
||||
|
||||
TString msg; msg.format(FR("Scansione cartella %s: %d files"), (const char*)path, xml.items());
|
||||
TProgind pi(xml.items(), msg);
|
||||
|
||||
TFilename fname;
|
||||
FOR_EACH_ARRAY_ROW(xml, r, row)
|
||||
{
|
||||
if (!pi.addstatus(1)) break;
|
||||
fname = *row;
|
||||
const TString& n = fname.name_only();
|
||||
const int sn = atoi(n);
|
||||
if (sn > 0)
|
||||
{
|
||||
TToken_string& r = find_or_create_line(a, sn);
|
||||
TXmlItem i; i.Load(fname);
|
||||
i.ForEach(XmlScanner, (long)&r);
|
||||
}
|
||||
}
|
||||
|
||||
return !xml.empty();
|
||||
}
|
||||
|
||||
void Tdnist_mask::fill_sheet()
|
||||
{
|
||||
TSheet_field& s = sfield(F_DNSHEET);
|
||||
s.destroy();
|
||||
|
||||
TString_array& a = s.rows_array();
|
||||
load_dninst(a);
|
||||
load_odbc(a);
|
||||
load_xml(a);
|
||||
|
||||
const int sort = get_int(F_SORT);
|
||||
a.TArray::sort(dongle_compare, (void*)&sort);
|
||||
|
||||
FOR_EACH_ARRAY_ROW(a, r, row)
|
||||
{
|
||||
const char* o1 = row->get(_c_owner);
|
||||
const char* o2 = row->get(_c_dbowner);
|
||||
const char* o3 = row->get(_c_xmlowner);
|
||||
|
||||
if (o2 && *o2 > ' ')
|
||||
{
|
||||
const double cmp = xvt_str_fuzzy_compare_ignoring_case(o1, o2);
|
||||
if (cmp < 0.7)
|
||||
{
|
||||
if (cmp == 0)
|
||||
s.set_back_and_fore_color(FOCUS_BACK_COLOR, FOCUS_COLOR, r, _c_dbowner);
|
||||
else
|
||||
s.set_back_and_fore_color(REQUIRED_BACK_COLOR, NORMAL_COLOR, r, _c_dbowner);
|
||||
}
|
||||
}
|
||||
if (o3 && *o3 > ' ')
|
||||
{
|
||||
const char* o1 = row->get(2);
|
||||
const double cmp = xvt_str_fuzzy_compare_ignoring_case(o1, o3);
|
||||
if (cmp < 0.7)
|
||||
{
|
||||
if (cmp == 0)
|
||||
s.set_back_and_fore_color(FOCUS_BACK_COLOR, FOCUS_COLOR, r, _c_xmlowner);
|
||||
else
|
||||
s.set_back_and_fore_color(REQUIRED_BACK_COLOR, NORMAL_COLOR, r, _c_xmlowner);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
s.force_update();
|
||||
|
||||
enable(DLG_ELABORA, !s.empty());
|
||||
}
|
||||
|
||||
void Tdnist_mask::merge_sheet()
|
||||
{
|
||||
TSheet_field& sheet = sfield(F_DNSHEET);
|
||||
|
||||
TString16 killed;
|
||||
TString o1, o2, o3;
|
||||
TString c1, c2, c3;
|
||||
|
||||
int changed = 0;
|
||||
FOR_EACH_SHEET_ROW(sheet, r, row)
|
||||
{
|
||||
const int key = row->get_int(_c_key);
|
||||
c1 = row->get(_c_owner);
|
||||
c2 = row->get(_c_dbowner);
|
||||
c3 = row->get(_c_xmlowner);
|
||||
if (c1.blank())
|
||||
{
|
||||
if (c2.full())
|
||||
{
|
||||
c1 = c2;
|
||||
o1 = row->get(_c_dboem);
|
||||
} else
|
||||
if (c3.full())
|
||||
{
|
||||
c1 = c3;
|
||||
o1 = row->get(_c_xmloem);
|
||||
}
|
||||
if (c1.full())
|
||||
{
|
||||
row->add(o1, _c_oem);
|
||||
row->add(c1, _c_owner);
|
||||
changed++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
o1 = row->get(_c_oem);
|
||||
if (o1.blank())
|
||||
{
|
||||
o2 = row->get(_c_dboem);
|
||||
if (o2.full())
|
||||
{
|
||||
row->add(o2, _c_oem);
|
||||
changed++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
killed = row->get(_c_killed);
|
||||
if (killed.blank())
|
||||
{
|
||||
killed = row->get(_c_dbkilled);
|
||||
if (killed.full())
|
||||
row->add(killed, _c_killed);
|
||||
}
|
||||
}
|
||||
|
||||
sheet.force_update();
|
||||
TString msg; msg.format(FR("Sono state aggiornate %d chiavi"), changed);
|
||||
xvt_dm_popup_message(msg);
|
||||
}
|
||||
|
||||
bool Tdnist_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
||||
{
|
||||
switch (o.dlg())
|
||||
{
|
||||
case DLG_RECALC:
|
||||
if (e == fe_button && check_fields())
|
||||
{
|
||||
save_profile();
|
||||
|
||||
const TString& n = remote_dninst();
|
||||
if (n.full())
|
||||
{
|
||||
TFilename tmp; tmp.tempdir(); tmp.add("dninst.zip");
|
||||
if (fcopy(n, tmp, false, true) && fsize(tmp) > 0)
|
||||
{
|
||||
fcopy(tmp, DNINST_ZIP);
|
||||
tmp.fremove();
|
||||
}
|
||||
else
|
||||
cantread_box(n);
|
||||
}
|
||||
fill_sheet();
|
||||
}
|
||||
break;
|
||||
case DLG_ELABORA:
|
||||
if (e == fe_button && yesno_box(TR("Riporare sul DNINST tutte le chiavi presenti solo su DB?")))
|
||||
{
|
||||
merge_sheet();
|
||||
}
|
||||
break;
|
||||
case DLG_SAVEREC:
|
||||
if (e == fe_button)
|
||||
{
|
||||
TSheet_field& sheet = sfield(F_DNSHEET);
|
||||
TString str;
|
||||
FOR_EACH_SHEET_ROW(sheet, r, row)
|
||||
{
|
||||
const int key = row->get_int(0);
|
||||
str = row->get(_c_oem);
|
||||
_dninst.set(key, "OEM", str.trim());
|
||||
str = row->get(_c_owner);
|
||||
_dninst.set(key, "Owner", str.trim());
|
||||
str = row->get(_c_suspend);
|
||||
_dninst.set(key, "MustCall", str.trim());
|
||||
str = row->get(_c_killed);
|
||||
_dninst.set(key, "*", str.trim());
|
||||
}
|
||||
if (_dninst.save())
|
||||
{
|
||||
fill_sheet();
|
||||
const TString& ftp = remote_dninst();
|
||||
if (ftp != DNINST_ZIP && ftp.starts_with("ftp://")
|
||||
&& yesno_box(FR("Copiare il DNINST locale in %s?"), (const char*)ftp))
|
||||
{
|
||||
if (!xvt_fsys_fcopy(DNINST_ZIP, ftp))
|
||||
cantwrite_box(ftp);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case F_DSN:
|
||||
if (e == fe_button && !o.empty())
|
||||
{
|
||||
TString query;
|
||||
query << "ODBC(" << get(F_DSN) << ")\n"
|
||||
<< "SELECT * FROM chiavette,clienti WHERE chiavette.cliente=clienti.codice\n"
|
||||
<< "ORDER BY ";
|
||||
switch(get_int(F_SORT))
|
||||
{
|
||||
case 1: query << "agente,RagioneSociale"; break;
|
||||
case 2: query << "RagioneSociale,chiavette.codice"; break;
|
||||
default: query << "chiavette.codice"; break;
|
||||
}
|
||||
|
||||
TODBC_recordset att(query);
|
||||
if (att.move_first())
|
||||
{
|
||||
TRecordset_sheet sheet(att, TR("Chiavi"),0x10);
|
||||
sheet.run();
|
||||
}
|
||||
}
|
||||
break;
|
||||
case F_SORT:
|
||||
if (e == fe_modify)
|
||||
{
|
||||
TSheet_field& s = sfield(F_DNSHEET);
|
||||
const int sort = get_int(F_SORT);
|
||||
s.rows_array().TArray::sort(dongle_compare, (void*)&sort);
|
||||
s.force_update();
|
||||
}
|
||||
break;
|
||||
case F_DNSHEET:
|
||||
if (e == se_query_add || e == se_query_del)
|
||||
return false;
|
||||
break;
|
||||
case F_SUSPEND:
|
||||
case F_KILLED:
|
||||
if (e == fe_magic)
|
||||
{
|
||||
const TDate oggi(TODAY);
|
||||
o.set(oggi.string());
|
||||
}
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
Tdnist_mask::Tdnist_mask() : TAutomask("ba2800a")
|
||||
{
|
||||
const TSheet_field& s = sfield(F_DNSHEET);
|
||||
TMask& m = s.sheet_mask();
|
||||
|
||||
_c_key = s.cid2index(F_NUMBER);
|
||||
_c_oem = s.cid2index(F_OEM);
|
||||
_c_owner = s.cid2index(F_OWNER);
|
||||
_c_suspend = s.cid2index(F_SUSPEND);
|
||||
_c_killed = s.cid2index(F_KILLED);
|
||||
_c_dboem = s.cid2index(F_DBOEM);
|
||||
_c_dbowner = s.cid2index(F_DBOWNER);
|
||||
_c_dbsuspend= s.cid2index(F_DBSUSPEND);
|
||||
_c_dbkilled = s.cid2index(F_DBKILLED);
|
||||
_c_xmloem = s.cid2index(F_ATOEM);
|
||||
_c_xmlowner = s.cid2index(F_ATOWNER);
|
||||
_c_xmlaccess= s.cid2index(F_ATACCESS);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// Tdninst_manager
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
class Tdninst_manager : public TSkeleton_application
|
||||
{
|
||||
protected:
|
||||
virtual bool use_files() const { return false; }
|
||||
virtual bool create();
|
||||
virtual void main_loop();
|
||||
};
|
||||
|
||||
bool Tdninst_manager::create()
|
||||
{
|
||||
const word n = dongle().number();
|
||||
if (n != 8453 && !is_power_station())
|
||||
return error_box(TR("Postazione non abilitata"));
|
||||
|
||||
if (user() != dongle().administrator())
|
||||
return error_box(TR("Utente non abilitato"));
|
||||
|
||||
TSheet_field::set_line_number_width(4); // Numero di chiavette ~ 1000
|
||||
|
||||
return TSkeleton_application::create();
|
||||
}
|
||||
|
||||
void Tdninst_manager::main_loop()
|
||||
{
|
||||
Tdnist_mask m;
|
||||
m.run();
|
||||
}
|
||||
|
||||
int ba2800(int argc, char* argv[])
|
||||
{
|
||||
Tdninst_manager a;
|
||||
a.run(argc, argv, TR("Gestione attivazioni"));
|
||||
return 0;
|
||||
}
|
||||
|
22
ba/ba2800a.h
Normal file
22
ba/ba2800a.h
Normal file
@ -0,0 +1,22 @@
|
||||
#define F_DNINST 201
|
||||
#define F_DSN 202
|
||||
#define F_FTP 203
|
||||
#define F_DNINST_ON 211
|
||||
#define F_DSN_ON 212
|
||||
#define F_FTP_ON 213
|
||||
|
||||
#define F_SORT 219
|
||||
#define F_DNSHEET 220
|
||||
|
||||
#define F_NUMBER 101
|
||||
#define F_OEM 102
|
||||
#define F_OWNER 103
|
||||
#define F_SUSPEND 104
|
||||
#define F_KILLED 105
|
||||
#define F_DBOEM 106
|
||||
#define F_DBOWNER 107
|
||||
#define F_DBSUSPEND 108
|
||||
#define F_DBKILLED 109
|
||||
#define F_ATOEM 110
|
||||
#define F_ATOWNER 111
|
||||
#define F_ATACCESS 112
|
229
ba/ba2800a.uml
Normal file
229
ba/ba2800a.uml
Normal file
@ -0,0 +1,229 @@
|
||||
#include "ba2800a.h"
|
||||
|
||||
TOOLBAR "toolbar" 0 0 0 2
|
||||
|
||||
BUTTON DLG_RECALC 2 2
|
||||
BEGIN
|
||||
PROMPT 1 1 "Aggiorna"
|
||||
PICTURE TOOL_CONVERT
|
||||
END
|
||||
|
||||
BUTTON DLG_ELABORA 2 2
|
||||
BEGIN
|
||||
PROMPT 2 1 "Elabora"
|
||||
PICTURE TOOL_ELABORA
|
||||
END
|
||||
|
||||
BUTTON DLG_SAVEREC 2 2
|
||||
BEGIN
|
||||
PROMPT 2 1 "Salva"
|
||||
PICTURE TOOL_SAVEREC
|
||||
END
|
||||
|
||||
|
||||
#include <helpbar.h>
|
||||
|
||||
ENDPAGE
|
||||
|
||||
PAGE "Gestione attivazioni" 0 2 0 0
|
||||
|
||||
BOOLEAN F_DNINST_ON
|
||||
BEGIN
|
||||
PROMPT 1 0 "DNINST (HTTP/FTP)"
|
||||
MESSAGE FALSE DISABLE,F_DNINST
|
||||
MESSAGE TRUE ENABLE,F_DNINST
|
||||
END
|
||||
|
||||
STRING F_DNINST 256 50
|
||||
BEGIN
|
||||
PROMPT 28 0 ""
|
||||
CHECKTYPE REQUIRED
|
||||
END
|
||||
|
||||
BOOLEAN F_DSN_ON
|
||||
BEGIN
|
||||
PROMPT 1 1 "DSN (ODBC)"
|
||||
MESSAGE FALSE DISABLE,F_DSN
|
||||
MESSAGE TRUE ENABLE,F_DSN
|
||||
END
|
||||
|
||||
STRING F_DSN 256 50
|
||||
BEGIN
|
||||
PROMPT 28 1 ""
|
||||
CHECKTYPE REQUIRED
|
||||
FLAGS "B"
|
||||
END
|
||||
|
||||
BOOLEAN F_FTP_ON
|
||||
BEGIN
|
||||
PROMPT 1 2 "XML (FTP)"
|
||||
MESSAGE FALSE DISABLE,F_FTP
|
||||
MESSAGE TRUE ENABLE,F_FTP
|
||||
END
|
||||
|
||||
STRING F_FTP 256 50
|
||||
BEGIN
|
||||
PROMPT 28 2 ""
|
||||
CHECKTYPE REQUIRED
|
||||
END
|
||||
|
||||
LIST F_SORT 1 16
|
||||
BEGIN
|
||||
PROMPT 1 3 "Ordinamento "
|
||||
ITEM "0|Chiave"
|
||||
ITEM "1|Rivenditore"
|
||||
ITEM "2|Cliente"
|
||||
END
|
||||
|
||||
SPREADSHEET F_DNSHEET
|
||||
BEGIN
|
||||
PROMPT 0 5 ""
|
||||
ITEM "Key@5F"
|
||||
ITEM "DNINST OEM@10F"
|
||||
ITEM "DNINST Cliente@50F"
|
||||
ITEM "Sospeso@10F"
|
||||
ITEM "Disdetto@10F"
|
||||
ITEM "DB OEM@10"
|
||||
ITEM "DB Cliente@50"
|
||||
ITEM "DB Sospeso@10"
|
||||
ITEM "DB Disdetto@10"
|
||||
ITEM "XML OEM@10"
|
||||
ITEM "XML Cliente@50"
|
||||
ITEM "Ultimo accesso"
|
||||
DEFAULT "*"
|
||||
END
|
||||
|
||||
STRING DLG_PROFILE 256
|
||||
BEGIN
|
||||
PROMPT 1 -1 "Profilo "
|
||||
PSELECT
|
||||
FLAGS "H"
|
||||
END
|
||||
|
||||
ENDPAGE
|
||||
|
||||
ENDMASK
|
||||
|
||||
PAGE "Informazioni" -1 -1 60 10
|
||||
|
||||
NUMBER F_NUMBER 5
|
||||
BEGIN
|
||||
PROMPT 1 1 "Numero "
|
||||
FLAGS "D"
|
||||
END
|
||||
|
||||
LIST F_OEM 1 12
|
||||
BEGIN
|
||||
PROMPT 1 2 "OEM "
|
||||
ITEM " |"
|
||||
ITEM "0|Aga"
|
||||
ITEM "1|Sirio"
|
||||
ITEM "2|Silav"
|
||||
ITEM "3|Geisoft"
|
||||
ITEM "4|Tetractis"
|
||||
ITEM "5|Procom"
|
||||
ITEM "6|Socogem"
|
||||
ITEM "7|Itertec"
|
||||
ITEM "8|Metacalabria"
|
||||
END
|
||||
|
||||
TEXT DLG_NULL
|
||||
BEGIN
|
||||
PROMPT 28 1 "Sospeso"
|
||||
END
|
||||
|
||||
TEXT DLG_NULL
|
||||
BEGIN
|
||||
PROMPT 43 1 "@bDisdetto"
|
||||
END
|
||||
|
||||
|
||||
DATE F_SUSPEND
|
||||
BEGIN
|
||||
PROMPT 28 2 ""
|
||||
END
|
||||
|
||||
DATE F_KILLED
|
||||
BEGIN
|
||||
PROMPT 43 2 ""
|
||||
END
|
||||
|
||||
STRING F_OWNER 50
|
||||
BEGIN
|
||||
PROMPT 1 3 "Owner "
|
||||
END
|
||||
|
||||
LIST F_DBOEM 1 12
|
||||
BEGIN
|
||||
PROMPT 1 4 "OEM "
|
||||
ITEM " |"
|
||||
ITEM "0|Aga"
|
||||
ITEM "1|Sirio"
|
||||
ITEM "2|Silav"
|
||||
ITEM "3|Geisoft"
|
||||
ITEM "4|Tetractis"
|
||||
ITEM "5|Procom"
|
||||
ITEM "6|Socogem"
|
||||
ITEM "7|Itertec"
|
||||
ITEM "8|Metacalabria"
|
||||
END
|
||||
|
||||
STRING F_DBOWNER 50
|
||||
BEGIN
|
||||
PROMPT 1 5 "Owner "
|
||||
END
|
||||
|
||||
DATE F_DBSUSPEND
|
||||
BEGIN
|
||||
PROMPT 28 4 ""
|
||||
END
|
||||
|
||||
DATE F_DBKILLED
|
||||
BEGIN
|
||||
PROMPT 43 4 ""
|
||||
END
|
||||
|
||||
LIST F_ATOEM 1 12
|
||||
BEGIN
|
||||
PROMPT 1 6 "OEM "
|
||||
ITEM " |"
|
||||
ITEM "0|Aga"
|
||||
ITEM "1|Sirio"
|
||||
ITEM "2|Silav"
|
||||
ITEM "3|Geisoft"
|
||||
ITEM "4|Tetractis"
|
||||
ITEM "5|Procom"
|
||||
ITEM "6|Socogem"
|
||||
ITEM "7|Itertec"
|
||||
ITEM "8|Metacalabria"
|
||||
END
|
||||
|
||||
STRING F_ATOWNER 50
|
||||
BEGIN
|
||||
PROMPT 1 7 "Owner "
|
||||
END
|
||||
|
||||
DATE F_ATACCESS
|
||||
BEGIN
|
||||
PROMPT 28 6 "Ultimo aggiornamento "
|
||||
END
|
||||
ENDPAGE
|
||||
|
||||
TOOLBAR "" 0 0 0 2
|
||||
|
||||
BUTTON DLG_OK 2 2
|
||||
BEGIN
|
||||
PROMPT 1 1 ""
|
||||
END
|
||||
|
||||
BUTTON DLG_CANCEL 2 2
|
||||
BEGIN
|
||||
PROMPT 2 1 ""
|
||||
END
|
||||
|
||||
ENDPAGE
|
||||
|
||||
ENDMASK
|
||||
|
||||
|
||||
|
@ -599,7 +599,7 @@ bool TReport_mask::delete_report()
|
||||
const bool ok = path.exist() && yesno_box(FR("Si desidera eliminare il file '%s'"), (const char*)path);
|
||||
if (ok)
|
||||
{
|
||||
::remove(path);
|
||||
path.fremove();
|
||||
global_reset();
|
||||
}
|
||||
return ok;
|
||||
@ -615,18 +615,10 @@ void TReport_mask::on_print(bool preview)
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef DBG
|
||||
TFilename tmp; tmp.tempdir();
|
||||
tmp.add("ba8300.txt");
|
||||
TReport_book book(tmp);
|
||||
#else
|
||||
TReport_book book;
|
||||
#endif
|
||||
book.add(_report);
|
||||
if (preview)
|
||||
book.preview();
|
||||
_report.preview();
|
||||
else
|
||||
book.print();
|
||||
_report.print();
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user