046e2c06cb
Ricompilazione Demo : [ ] Commento : Riportata la versione 3.1 patch 848 git-svn-id: svn://10.65.10.50/trunk@14993 c028cbd2-c16b-5b4b-a496-9718f37d4682
474 lines
11 KiB
C++
Executable File
474 lines
11 KiB
C++
Executable File
#include <automask.h>
|
|
#include <diction.h>
|
|
#include <recset.h>
|
|
#include <relation.h>
|
|
#include <recarray.h>
|
|
#include <reprint.h>
|
|
#include <utility.h>
|
|
|
|
#include "turni.h"
|
|
#include "../include/user.h"
|
|
#include "vdlib.h"
|
|
#include "vdmask.h"
|
|
#include "../cg/cgpagame.h"
|
|
#include "../ve/velib.h"
|
|
|
|
|
|
class TApri_mask : public TAutomask
|
|
{
|
|
const TTurno_vendita & _turno;
|
|
public:
|
|
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
|
|
|
TApri_mask(const TTurno_vendita & t) : TAutomask("vdlib01"), _turno(t) {}
|
|
virtual ~TApri_mask() { }
|
|
};
|
|
|
|
bool TApri_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
|
{
|
|
switch (o.dlg())
|
|
{
|
|
case F_USERNAME:
|
|
if (e == fe_modify)
|
|
set(F_TURNO, "", 0x3);
|
|
break;
|
|
case F_TURNO:
|
|
case F_PASSWORD:
|
|
if (e == fe_modify)
|
|
{
|
|
const TString & user = get(F_USERNAME);
|
|
const TRectype & rec = cache().get(LF_USER, user);
|
|
const TString & pwd = rec.get(USR_PASSWORD);
|
|
const TString pass = get(F_PASSWORD);
|
|
const bool ok = !rec.empty() && pass == decode(pwd);
|
|
const bool old_turno = get(F_TURNO).full();
|
|
enable(-1, ok && !old_turno);
|
|
enable(DLG_OK, ok);
|
|
if (old_turno)
|
|
clear(-1);
|
|
}
|
|
break;
|
|
case F_SINIZIO:
|
|
if (e == fe_close)
|
|
{
|
|
const TDate & ultima_data = _turno.ultima_data();
|
|
|
|
if (ultima_data == get_date(F_DATA))
|
|
{
|
|
const long ora_fine = _turno.ora_fine();
|
|
const long ora_inizio = get_int(F_HINIZIO) * 10000 + get_int(F_MINIZIO) * 100 + get_int(F_SINIZIO);
|
|
|
|
if (ora_inizio < ora_fine)
|
|
return error_box("Ora inizio %02d:%02d:%02d antecedente alla fine del turno precedente (%02d:%02d:%02d)",
|
|
get_int(F_HINIZIO), get_int(F_MINIZIO), get_int(F_SINIZIO),
|
|
ora_fine / 10000, (ora_fine / 100) % 100, ora_fine % 100);
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
class TChiudi_mask : public TAutomask
|
|
{
|
|
TBit_array _rim;
|
|
TTurno_vendita & _turno;
|
|
|
|
public:
|
|
real calcola_differenza();
|
|
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
|
|
|
TChiudi_mask(TTurno_vendita & t);
|
|
virtual ~TChiudi_mask() {}
|
|
};
|
|
|
|
TChiudi_mask::TChiudi_mask(TTurno_vendita & t)
|
|
: TAutomask("vdlib02"), _turno(t)
|
|
{
|
|
TConfig d(CONFIG_DITTA);
|
|
|
|
for (int i = 1; i <= 8; i++)
|
|
{
|
|
const TString & codpag = d.get("CODPAG", NULL, i);
|
|
TReport_field * label = _turno.report().section('B', 1).find_field(100 + i);
|
|
TReport_field * value = _turno.report().section('B', 1).find_field(200 + i);
|
|
|
|
if (codpag.full())
|
|
{
|
|
TPagamento p(codpag);
|
|
TTipo_pag t = p.tipo_rata(0);
|
|
|
|
_rim.set(i, t == _rim_dir);
|
|
|
|
const TString & desc = d.get("LABPAG", NULL, i);
|
|
|
|
field(F_INC01 +i -1).set_prompt(desc);
|
|
if (label != NULL)
|
|
label->set(desc);
|
|
if (value != NULL)
|
|
value->show(true);
|
|
}
|
|
else
|
|
{
|
|
field(F_INC01 + i - 1).hide();
|
|
if (label != NULL)
|
|
label->hide();
|
|
if (value != NULL)
|
|
value->hide();
|
|
}
|
|
}
|
|
}
|
|
|
|
real TChiudi_mask::calcola_differenza()
|
|
{
|
|
real diff = get_real(F_CASSAFIN) - get_real(F_CASSAINI) + get_real(F_RESTI);
|
|
|
|
for (short id = F_INC01; id <= F_INC08; id++)
|
|
{
|
|
const int i = id - F_INC01 + 1;
|
|
|
|
if (_rim[i])
|
|
diff -= get_real(id);
|
|
}
|
|
return diff;
|
|
}
|
|
|
|
bool TChiudi_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
|
{
|
|
switch (o.dlg())
|
|
{
|
|
case F_PASSWORD:
|
|
if (e == fe_modify)
|
|
{
|
|
const TString & user = get(F_USERNAME);
|
|
const TRectype & rec = cache().get(LF_USER, user);
|
|
const TString & pwd = rec.get(USR_PASSWORD);
|
|
const TString pass = get(F_PASSWORD);
|
|
const bool on = !rec.empty() && pass == decode(pwd);
|
|
enable(-1, on && !_turno.riaperto());
|
|
enable(DLG_OK, on);
|
|
}
|
|
break;
|
|
case F_SFINE:
|
|
if (e == fe_close)
|
|
{
|
|
const long ora_inizio = _turno.ora_inizio();
|
|
const long ora_fine = get_int(F_HFINE) * 10000 + get_int(F_MFINE) * 100 + get_int(F_SFINE);
|
|
|
|
if (ora_fine <= ora_inizio)
|
|
return error_box("Ora fine %02d:%02d:%02d antecedente alla inizio del turno (%02d:%02d:%02d)",
|
|
get_int(F_HFINE), get_int(F_MFINE), get_int(F_SFINE),
|
|
ora_inizio / 10000, (ora_inizio / 100) % 100, ora_inizio % 100);
|
|
}
|
|
break;
|
|
case F_INC01:
|
|
case F_INC02:
|
|
case F_INC03:
|
|
case F_INC04:
|
|
case F_INC05:
|
|
case F_INC06:
|
|
case F_INC07:
|
|
case F_INC08:
|
|
case F_CASSAFIN:
|
|
{
|
|
const real diff = calcola_differenza();
|
|
set(F_DIFF, diff);
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void TTurno_vendita::leggi(long progr)
|
|
{
|
|
bool aperto = false;
|
|
|
|
const TString use = format("USE %d\nFROM CODCASSA=%d ANNO=%d\nTO CODCASSA=%d ANNO=%d\n", LF_TURNI, _cassa, _anno, _cassa, _anno);
|
|
TISAM_recordset r(use);
|
|
|
|
if (progr > 0L)
|
|
{
|
|
TRectype & rec = r.cursor()->curr();
|
|
|
|
rec.zero();
|
|
rec.put(TRN_CODCASSA, _cassa);
|
|
rec.put(TRN_ANNO, _anno);
|
|
rec.put(TRN_PROGR, progr);
|
|
r.cursor()->read();
|
|
_rec = rec;
|
|
return;
|
|
}
|
|
if (r.items() > 0L)
|
|
{
|
|
r.move_last();
|
|
_rec = r.cursor()->curr();
|
|
const long fine = _rec.get_long(TRN_FINE);
|
|
|
|
progr = _rec.get_long(TRN_PROGR);
|
|
aperto = fine == 0L;
|
|
}
|
|
if (!aperto)
|
|
{
|
|
_datafine = _rec.get(TRN_DATA);
|
|
_orafine = _rec.get_long(TRN_FINE);
|
|
progr++;
|
|
_rec.zero();
|
|
_rec.put(TRN_CODCASSA, _cassa);
|
|
_rec.put(TRN_ANNO, _anno);
|
|
_rec.put(TRN_PROGR, progr);
|
|
}
|
|
else
|
|
{
|
|
_datafine = TDate(TODAY);
|
|
_orafine = 0L;
|
|
}
|
|
}
|
|
|
|
const long TTurno_vendita::ora_inizio() const
|
|
{
|
|
return _rec.get_long(TRN_INIZIO);
|
|
}
|
|
|
|
bool TTurno_vendita::apri(const bool select_prev)
|
|
{
|
|
leggi();
|
|
if (aperto())
|
|
return error_box(FR("Turno aperto dall'Utente %s"), (const char *) _rec.get(TRN_USERNAME));
|
|
|
|
TApri_mask m(*this);
|
|
TDocumento d('D', _anno, _codnum, 0L);
|
|
const long fndoc = d.renum_ndoc();
|
|
const long ora = daytime();
|
|
|
|
m.show(F_TURNO, select_prev);
|
|
m.set(F_CASSA, _cassa);
|
|
m.set(F_USERNAME, user());
|
|
m.set(F_HINIZIO, ora / 10000);
|
|
m.set(F_MINIZIO, (ora / 100) % 100);
|
|
m.set(F_SINIZIO, ora % 100);
|
|
if (m.run() == K_ENTER)
|
|
{
|
|
const long idturno = m.get_long(F_TURNO);
|
|
|
|
if (idturno > 0L)
|
|
{
|
|
leggi(idturno);
|
|
riapri();
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
const real cassa_ini = m.get_real(F_CASSAINI);
|
|
const long ora_inizio = m.get_int(F_HINIZIO) * 10000 + m.get_int(F_MINIZIO) * 100 + m.get_int(F_SINIZIO);
|
|
TLocalisamfile f(LF_TURNI);
|
|
|
|
_rec.put(TRN_USERNAME, m.get(F_USERNAME));
|
|
_rec.put(TRN_CASSAINI, cassa_ini);
|
|
_rec.put(TRN_CASSAFIN, cassa_ini);
|
|
_rec.put(TRN_DATA, m.get_date(F_DATA));
|
|
_rec.put(TRN_INIZIO, ora_inizio);
|
|
_rec.put(TRN_FNDOC, fndoc);
|
|
_err = _rec.write(f);
|
|
}
|
|
return _err == NOERR;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// @ cmember riapri il turno
|
|
bool TTurno_vendita::riapri()
|
|
{
|
|
_rec.zero(TRN_CHIUSO);
|
|
return true;
|
|
}
|
|
|
|
// @ cmember chiudi il turno
|
|
bool TTurno_vendita::chiudi()
|
|
{
|
|
if (!riaperto())
|
|
leggi();
|
|
if (chiuso())
|
|
return error_box(FR("Turno chiuso"));
|
|
|
|
TChiudi_mask m(*this);
|
|
TArray inc;
|
|
real resti, sospesi;
|
|
const TString user = _rec.get(TRN_USERNAME);
|
|
const long fndoc = _rec.get_long(TRN_FNDOC);
|
|
const long lndoc = _rec.get_long(TRN_LNDOC);
|
|
const long ora = daytime();
|
|
int numscontr = 0;
|
|
|
|
m.set(F_CASSA, _cassa);
|
|
m.set(F_DATA, _rec.get(TRN_DATA));
|
|
m.set(F_USERNAME, user);
|
|
m.set(F_CASSAINI, _rec.get(TRN_CASSAINI));
|
|
m.set(F_HFINE, ora / 10000);
|
|
m.set(F_MFINE, (ora / 100) % 100);
|
|
m.set(F_SFINE, ora % 100);
|
|
m.set(F_CASSAFIN, _rec.get(TRN_CASSAFIN));
|
|
m.set(F_DIFF, _rec.get(TRN_DIFF));
|
|
|
|
for (int i = 0; i <= 8; i++)
|
|
inc.add(ZERO);
|
|
|
|
for (long ndoc = fndoc; ndoc <= lndoc; ndoc++)
|
|
{
|
|
TDocumento d('D', _anno, _codnum, ndoc);
|
|
|
|
if (user == d.get(TRN_USERNAME))
|
|
{
|
|
if (d.chiuso())
|
|
{
|
|
(real &) inc[1] += d.get_real(TRN_INC01);
|
|
(real &) inc[2] += d.get_real(TRN_INC02);
|
|
(real &) inc[3] += d.get_real(TRN_INC03);
|
|
(real &) inc[4] += d.get_real(TRN_INC04);
|
|
(real &) inc[5] += d.get_real(TRN_INC05);
|
|
(real &) inc[6] += d.get_real(TRN_INC06);
|
|
(real &) inc[7] += d.get_real(TRN_INC07);
|
|
(real &) inc[8] += d.get_real(TRN_INC08);
|
|
}
|
|
else
|
|
sospesi = d.totale_doc();
|
|
resti += d.get_real(TRN_RESTI);
|
|
numscontr++;
|
|
}
|
|
}
|
|
m.set(F_INC01, (real &) inc[1]);
|
|
m.set(F_INC02, (real &) inc[2]);
|
|
m.set(F_INC03, (real &) inc[3]);
|
|
m.set(F_INC04, (real &) inc[4]);
|
|
m.set(F_INC05, (real &) inc[5]);
|
|
m.set(F_INC06, (real &) inc[6]);
|
|
m.set(F_INC07, (real &) inc[7]);
|
|
m.set(F_INC08, (real &) inc[8]);
|
|
m.set(F_SOSPESI, sospesi);
|
|
m.set(F_RESTI, resti);
|
|
|
|
const real diff = m.calcola_differenza();
|
|
|
|
m.set(F_DIFF, diff);
|
|
|
|
if (m.run() == K_ENTER)
|
|
{
|
|
TLocalisamfile f(LF_TURNI);
|
|
|
|
if (_rec.get(TRN_FINE).blank())
|
|
{
|
|
const long ora_fine = m.get_int(F_HFINE) * 10000 + m.get_int(F_MFINE) * 100 + m.get_int(F_SFINE);
|
|
_rec.put(TRN_FINE, ora_fine);
|
|
}
|
|
_rec.put(TRN_CHIUSO, (bool) true);
|
|
_rec.put(TRN_INC01, m.get_real(F_INC01));
|
|
_rec.put(TRN_INC02, m.get_real(F_INC02));
|
|
_rec.put(TRN_INC03, m.get_real(F_INC03));
|
|
_rec.put(TRN_INC04, m.get_real(F_INC04));
|
|
_rec.put(TRN_INC05, m.get_real(F_INC05));
|
|
_rec.put(TRN_INC06, m.get_real(F_INC06));
|
|
_rec.put(TRN_INC07, m.get_real(F_INC07));
|
|
_rec.put(TRN_INC08, m.get_real(F_INC08));
|
|
_rec.put(TRN_SOSPESI, m.get_real(F_SOSPESI));
|
|
_rec.put(TRN_CASSAFIN, m.get_real(F_CASSAFIN));
|
|
_rec.put(TRN_DIFF, m.get_real(F_DIFF));
|
|
_rec.put(TRN_LNDOC, ndoc);
|
|
_rec.put(TRN_NUMSCONTR, numscontr);
|
|
_err = _rec.rewrite(f);
|
|
if (_err == NOERR)
|
|
{
|
|
TReport & rep = report();
|
|
TReport_book book;
|
|
TVariant var;
|
|
|
|
var = _rec.get(TRN_CODCASSA);
|
|
rep.recordset()->set_var("#CODCASSA", var);
|
|
var = _rec.get(TRN_ANNO);
|
|
rep.recordset()->set_var("#ANNO", var);
|
|
var = _rec.get(TRN_PROGR);
|
|
rep.recordset()->set_var("#PROGR", var);
|
|
|
|
book.add(rep);
|
|
book.print();
|
|
return true;
|
|
}
|
|
else
|
|
return error_box(FR("Errore di scrittura turno %d"), _err);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const real TTurno_vendita::cassa_attuale()
|
|
{
|
|
if (!riaperto())
|
|
leggi();
|
|
return _rec.get_real(TRN_CASSAFIN);
|
|
}
|
|
|
|
bool TTurno_vendita::aggiorna(const long ndoc, const real & saldo)
|
|
{
|
|
if (!riaperto())
|
|
leggi();
|
|
if (chiuso())
|
|
return error_box(FR("Turno chiuso"));
|
|
|
|
TLocalisamfile f(LF_TURNI);
|
|
const long fndoc = _rec.get_long(TRN_FNDOC);
|
|
const long lndoc = _rec.get_long(TRN_LNDOC);
|
|
|
|
if (ndoc < fndoc)
|
|
_rec.put(TRN_FNDOC, ndoc);
|
|
if (ndoc > lndoc)
|
|
_rec.put(TRN_LNDOC, ndoc);
|
|
_rec.put(TRN_CASSAFIN, saldo);
|
|
|
|
_err = _rec.rewrite(f);
|
|
if (_err != NOERR)
|
|
return error_box(FR("Errore di scrittura turno %d"), _err);
|
|
return true;
|
|
}
|
|
|
|
bool TTurno_vendita::aperto() const
|
|
{
|
|
return _rec.get_long(TRN_INIZIO) > 0L && !_rec.get_bool(TRN_CHIUSO);
|
|
}
|
|
|
|
const TString & TTurno_vendita::user() const
|
|
{
|
|
return _rec.get(TRN_USERNAME);
|
|
}
|
|
|
|
int TTurno_vendita::nturno() const
|
|
{
|
|
return _rec.get_int(TRN_PROGR);
|
|
}
|
|
|
|
TTurno_vendita::TTurno_vendita() : _rec(LF_TURNI)
|
|
{
|
|
{
|
|
TConfig w(CONFIG_WST);
|
|
|
|
_cassa = w.get_int("NCASSA");
|
|
}
|
|
|
|
_anno = TDate(TODAY).year();
|
|
TConfig d(CONFIG_DITTA);
|
|
|
|
_codnum = d.get("CODNUM");
|
|
if (_codnum.empty())
|
|
fatal_box(TR("E' necessario configurare il modulo prima di utilizzare questo programma!"));
|
|
_rep.load("vdlib02r");
|
|
leggi();
|
|
}
|
|
|
|
TOperatore::TOperatore(const char * user) : _rec(LF_TAB)
|
|
{
|
|
_rec = cache().get("OPD", user);
|
|
}
|
|
|