campo-sirio/cg/cg0600.cpp
guy 8d5d6540be cg0600.cpp Tolto file principale _saldi e usato uno temporaneo
cg2.url       Aggiunto menu colori
cg2100.cpp    Aggiunta gestione menu colori
cg2100b.uml   Accorciata colonna tipo
cg2100c.uml   Accorciata colonna tipo
cg2102.cpp    Gestione righe colorate
cg2102.h      Aggiunte funzioni gestione righe colorate
cg3.cpp       Aggiunti mastrini a video
cg3.url       Aggiunto menu dei mastrini a video
conto.cpp     MEGAFIGATA, velocizzato TBill
conto.h       Sembra che funzioni bene!


git-svn-id: svn://10.65.10.50/trunk@3892 c028cbd2-c16b-5b4b-a496-9718f37d4682
1996-11-12 15:18:10 +00:00

219 lines
6.0 KiB
C++
Executable File

// --------------------------------------------------------------
// fv: cg0 -5 <tab>: gestione maschere contabilita'
// --------------------------------------------------------------
#include <tabapp.h>
#include <saldi.h>
#include <defmask.h>
#include <sheet.h>
#include "../ba/batbesc.h"
#include "cglib.h"
class CGTab_application : public Tab_application
{
// ------------- specifiche tabella esercizi ----
static bool dataini_handler(TMask_field& f, KEY k);
static bool checkbut_handler(TMask_field& f, KEY k);
void check_sheet();
bool check_esercizio(TString& cod, TDate s1, TDate f1);
// --------------------------------------------
protected:
virtual bool protected_record(TRectype & rec);
virtual bool user_create();
virtual bool user_destroy();
public:
static CGTab_application& app() { return (CGTab_application&)main_app(); }
CGTab_application() : Tab_application() {}
virtual ~CGTab_application() {}
};
bool CGTab_application::protected_record(TRectype &rec)
{
if (get_tabname() == "ESC")
{
// cerca saldo con questo esercizio
const TString16 cod(rec.get("CODTAB"));
TLocalisamfile saldi(LF_SALDI);
saldi.put(SLD_ANNOES, cod);
// se ce n'e' uno non si puo' cancellare
if (saldi.read(_isgteq) == NOERR && cod == rec.get("CODTAB"))
return TRUE;
}
return Tab_application::protected_record(rec);
}
bool CGTab_application::user_create()
{
bool ok = Tab_application::user_create();
if (ok)
{
if (get_tabname() == "ESC")
{
get_mask()->set_handler(F_DATAINI, dataini_handler);
get_mask()->set_handler(BUT_CHECK, checkbut_handler);
}
}
return ok;
}
bool CGTab_application::user_destroy()
{
return Tab_application::user_destroy();
}
// - esercizi-specific --------------------------------------------------------
bool CGTab_application::dataini_handler(TMask_field& f, KEY k)
{
if (k == K_ENTER && f.mask().is_running() && !f.mask().query_mode())
{
TString16 cod = f.mask().get(F_ANNO);
TDate s1 = f.mask().get_date(F_DATAINI);
TDate f1 = f.mask().get_date(F_DATAFIN);
return app().check_esercizio(cod, s1, f1);
}
return TRUE;
}
bool CGTab_application::check_esercizio(TString& cod, TDate s1, TDate f1)
{
// -----------------------------------------------------------------------------------------
// chiamata prima di registrare. Controlla:
// - se non ci sono altri esercizi, ok;
// - se ce ne sono altri:
// 1) controllo non sovrapposizione date
// 2) se ci sono es. con date inferiori, datainizio -1 deve essere = data fine altro es;
// 3) se ci sono es. con date superiori, datafine +1 deve essere = data inizio altro
// ----------------------------------------------------------------------------------------
byte err = 0x00; bool ret = TRUE;
TLocalisamfile& esc = get_relation()->lfile();
bool basta1 = FALSE, basta2 = FALSE;
for (esc.first(); !esc.eof(); esc.next())
{
if (esc.get("CODTAB") == cod)
continue;
TDate s2 = esc.get_date("D0");
TDate f2 = esc.get_date("D1");
TDate s1d = s1; --s1d;
TDate s2d = s2; --s2d;
// check sovrapposizione
if (s1 <= f2 && s2 <= f1)
err |= 0x01;
else
{
if (!basta1 && f1 < s2 && f1 != s2d)
err |= 0x02;
if (f1 < s2 && f1 == s2d)
{
err &= ~0x02;
basta1 = TRUE;
}
if (!basta2 && s1 > f2 && f2 != s1d)
err |= 0x04;
if (s1 > f2 && f2 == s1d)
{
err &= ~0x04;
basta2 = TRUE;
}
}
}
if (err)
{
ret = FALSE;
TString errstr(120);
errstr << "Date esercizio errate: \n";
// build error string
if (err & 0x01)
errstr << "\n - l'esercizio si sovrappone ad altro gia' esistente";
if (err & 0x02)
errstr << "\n - l'esercizio non e' contiguo ad esercizi successivi";
if (err & 0x04)
errstr << "\n - l'esercizio non e' contiguo ad esercizi precedenti";
if (!(err & 0x01))
{
errstr << "\nSi desidera registrare ugualmente?";
ret = yesno_box(errstr);
}
else error_box(errstr);
}
return ret;
}
void CGTab_application::check_sheet()
{
// crea 'nu bellu shit co'tutte le informazion e un messaggino
// di error se ce n'e' bisogn
TLocalisamfile& esc = get_relation()->lfile();
TArray escarr(10);
for (esc.first(); !esc.eof(); esc.next())
escarr.add(new TEsercizio(esc.curr()));
escarr.sort();
TArray_sheet as(-1,-1,70,20,"Esercizi contabili",
"Codice|Inizio@10|Fine@10|Scarico@10|Chiusura@10|Note@20",
0x10);
TDate s1;
for (int i = 0; i < escarr.items(); i++)
{
// sovrapposti non possono essere, perche' non si possono
// registrare; possono solo esserci discontinuita'
TEsercizio& e = (TEsercizio&)escarr[i];
TToken_string* tt = new TToken_string(80);
tt->add(e.codice());
tt->add(e.inizio().string());
tt->add(e.fine().string());
tt->add(e.scarico().string());
tt->add(e.chiusura().string());
if (i > 0 && e.inizio() != ++s1)
tt->add("*** non contiguo ***");
else tt->add("");
s1 = e.fine();
as.add(tt);
}
as.run();
}
bool CGTab_application::checkbut_handler(TMask_field& f, KEY k)
{
if (k == K_SPACE && f.mask().is_running())
app().check_sheet();
return TRUE;
}
// -------------------------------------------------------------
int cg0600(int argc, char* argv[])
{
CGTab_application a;
a.run(argc, argv, "Gestione tabelle contabili");
return 0;
}