campo-sirio/ve/velib01.cpp
guy f34e8ca09a Patch level :
Files correlati     : ve1
Ricompilazione Demo : [ ]
Commento            :
Corretta gestione conferma e-mail


git-svn-id: svn://10.65.10.50/trunk@20415 c028cbd2-c16b-5b4b-a496-9718f37d4682
2010-05-03 11:19:29 +00:00

275 lines
6.1 KiB
C++
Executable File

#include "velib.h"
/////////////////////////////////////////////////////////////
// TCodice_numerazione
/////////////////////////////////////////////////////////////
TCodice_numerazione::TCodice_numerazione(const char* codnum)
: TRectype(LF_TABCOM)
{
settab("NUM");
if (codnum && *codnum)
read(codnum);
else
setempty(TRUE);
}
TCodice_numerazione::TCodice_numerazione(const TRectype& rec)
: TRectype(rec)
{ }
TCodice_numerazione::~TCodice_numerazione()
{ }
const TString& TCodice_numerazione::tipo_doc(int i) const
{
CHECK(i < 36, "Impossibbile tipo documento");
const char * field = i < 17 ? "S2" : "S3";
if (i >= 17)
i -= 17;
TString & tmp = get_tmp_string();
tmp = get(field).mid(i * 4, 4);
tmp.trim();
return tmp;
}
int TCodice_numerazione::ntipi_doc() const
{
int l = get("S3").len();
if (l > 0)
return ((l - 1) / 4) + 18;
l = get("S2").len();
return l ? (((l - 1) / 4) + 1) : 0;
}
void TCodice_numerazione::complete_num(long num, TString& codnum) const
{
codnum = prefisso();
codnum << num;
codnum << postfisso();
}
int TCodice_numerazione::read(const char* codnum)
{
*this = cache().get("%NUM", codnum);
int err = empty() ? _iskeynotfound : NOERR;
#ifdef DBG
if (err != NOERR)
NFCHECK("Codice numerazione errato: %s", codnum);
#endif
return err;
}
/////////////////////////////////////////////////////////////
// TSpesa_prest
/////////////////////////////////////////////////////////////
TSpesa_prest::TSpesa_prest(const char* codice, char tipo)
: TRectype(LF_TAB)
{
switch (tipo)
{
case RIGA_SPESEDOC :
settab("SPP");
break;
case RIGA_PRESTAZIONI :
settab("PRS");
break;
case RIGA_RISORSE :
settab("RSS");
break;
case RIGA_ATTREZZATURE :
settab("ATR");
break;
default :
settab("SPP");
break;
}
if (codice && *codice)
{
const int err = read(codice);
#ifdef DBG
if (err != NOERR)
switch (tipo)
{
case RIGA_SPESEDOC :
error_box("Spesa %s assente", codice);
break;
case RIGA_PRESTAZIONI :
error_box("Prestazione %s assente", codice);
break;
case RIGA_RISORSE :
error_box("Risorsa %s assente", codice);
break;
case RIGA_ATTREZZATURE :
error_box("Attrezzatura %s assente", codice);
break;
default :
error_box("Spesa %s assente", codice);
break;
}
#endif
}
}
TSpesa_prest::TSpesa_prest(const TRectype& rec)
: TRectype(rec)
{
}
char TSpesa_prest::genere() const
{
const TString & tipo = get("COD");
if (tipo == "SPP")
return RIGA_SPESEDOC;
else
if (tipo == "PRS")
return RIGA_PRESTAZIONI;
else
if (tipo == "RSS")
return RIGA_RISORSE;
else
if (tipo == "ATR")
return RIGA_ATTREZZATURE;
return ' ';
}
int TSpesa_prest::read(const char* codice)
{
const TString8 cod = get("COD");
*this = cache().get(cod, codice);
return empty() ? _iskeynotfound : NOERR;
}
const TString& TSpesa_prest::cod_iva() const
{
// La parte seguente di s3 e' utilizzata dalle atrezzature per altri campi
TString& tmp = get_tmp_string();
tmp = get("S3").left(4);
tmp.trim();
return tmp;
}
real TSpesa_prest::prezzo() const
{
real r = get("R10"); // Prezzo con tanti decimali
if (r.is_zero())
r = get_real("R0"); // Prezzo con pochi decimali
return r;
}
bool is_real_discount(const TString& exp)
{
if (exp.blank())
return false;
TString80 good;
real perc;
return scontoexpr2perc(exp, false , good, perc) && perc != UNO;
}
bool scontoexpr2perc(const char * exp, bool signal , TString & goodexp, real & val_perc )
{
bool valid = true;
goodexp.cut(0);
// Elimina gli spazi molesti
// work.strip_spaces( );
val_perc = 1.0;
if (exp && *exp)
{
TString80 num;
bool dec = false; // Flag che indica se si attende l'inizio di un numero
bool startnum = true; // Flag che indica se siamo all'inizio di un numero
int errorchar = ' ';
// Flag che indica se sono nella parte decimale di un numero
for (const char * s = exp; *s && errorchar == ' '; s++)
{
const char c = *s;
switch(c)
{
case '+':
case '-':
// Se ero in in numero ...
if( !startnum )
{
// Aggiunge il numero alla sequenza
real newval( num );
val_perc *= ( CENTO - newval ) / CENTO;
goodexp << num;
}
// Inizia il nuovo numero
num = (c == '-') ? "-" : "+";
startnum = true;
dec = false;
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
num << c;
startnum = false;
break;
case '.':
case ',':
if(!dec)
{
if( startnum )
num << '0'; // Se occorreva un numero ci metto lo 0
num << '.'; // Interpreto la virgola come punto
dec = true;
startnum = true;
}
else
errorchar = c; // Se siamo gi` nella parte decimale segnala un errore
break;
case ' ':
break;
default:
errorchar = c;
break;
}
}
// Controlla la validita`
valid = errorchar == ' ';
if (valid)
{
// Aggiunge l'ultimo numero preso
real lastval( num );
val_perc *= ( CENTO - lastval ) / CENTO;
goodexp << num; // Assegna la nuova espressione formattata bene
}
else
{
if (signal) // Se richiesto segnala l'errore
warning_box( "Espressione di sconto non valida. Errore sul carattere %c.", errorchar);
val_perc = UNO; // Azzera la sequenza di percentuali
goodexp = "";
}
}
return valid;
}
real prezzo_scontato(const real& prezzo, const TString& sconto)
{
if (sconto.full())
{
TString80 exp;
real val_sconto;
if (scontoexpr2perc(sconto, false , exp, val_sconto) && val_sconto != UNO)
return prezzo * val_sconto;
}
return prezzo;
}