campo-sirio/ve/velib01.cpp
alex e06bb56755 Patch level :
Files correlati     :
Ricompilazione Demo : [ ]
Commento            : Riportata la versione 98.01.03.pl015


git-svn-id: svn://10.65.10.50/trunk@6573 c028cbd2-c16b-5b4b-a496-9718f37d4682
1998-04-30 14:04:19 +00:00

238 lines
5.6 KiB
C++
Executable File

#include <tabutil.h>
#include "velib.h"
HIDDEN const real CENTO(100.0); // costante per evitare la chiamata dei costruttori real tante volte
TSpesa_prest::TSpesa_prest(const char* codice, char tipo)
: TRectype(LF_TAB)
{
settab(tipo == RIGA_SPESEDOC ? "SPP" : "PRS");
if (codice && *codice)
if (read(codice) != NOERR)
yesnofatal_box("Tipo spesa assente : %s", codice);
}
TSpesa_prest::TSpesa_prest(const TRectype& rec)
: TRectype(rec)
{
}
int TSpesa_prest::read(const char* codice)
{
zero();
TTable t(get("COD"));
put("CODTAB", codice);
int err = TRectype::read(t);
return err;
}
TIVA::TIVA(const char* codice)
: TRectype(LF_TABCOM)
{
settab("IVA");
if (codice && *codice)
read(codice);
}
TIVA::TIVA(const TRectype& rec)
: TRectype(rec)
{
}
int TIVA::read(const char* codice)
{
TTable t("%IVA");
put("CODTAB", codice);
int err = TRectype::read(t);
if (err != NOERR)
yesnofatal_box("Codice IVA assente : %s", codice);
return err;
}
///////////////////////////////////////////////////////////
// Funzioni per il calcolo dei prezzi netti/lordi
///////////////////////////////////////////////////////////
real lordo2netto(real& lordo, const TString& codiva, int ndec)
{
TTable tabiva("%IVA");
real aliquota = 0.0;
tabiva.put("CODTAB", codiva);
if (tabiva.read() == NOERR) aliquota = tabiva.get_real("R0");
return lordo2netto(lordo,aliquota, ndec);
}
real netto2lordo(const real& netto, const TString& codiva, int ndec)
{
TTable tabiva("%IVA");
real aliquota = 0.0;
tabiva.put("CODTAB", codiva);
if (tabiva.read() == NOERR) aliquota = tabiva.get_real("R0");
return netto2lordo(netto,aliquota, ndec);
}
real lordo2netto(real& lordo, const real& iva, int ndec)
{
real netto;
real imposta = 0.0;
real imposta_rec = 0.0;
if (!iva.is_zero())
{
imposta = (lordo * iva) / (iva + 100.0); // Calcola l'imposta...
if (imposta < ZERO)
imposta.floor(ndec);
else
imposta.ceil(ndec);
}
netto = lordo - imposta; // Questo e' l'importo netto
imposta_rec = (netto * iva) / 100.0; // Ricalcola l'imposta con il nuovo imponibile
if (imposta_rec < ZERO)
imposta_rec.floor(ndec);
else
imposta_rec.ceil(ndec);
if (imposta != imposta_rec) // In questo caso corregge l'importo lordo
lordo = netto + imposta_rec;
return netto;
}
real netto2lordo(const real& netto, const real& iva, int ndec)
{
real lordo;
real imposta = 0.0;
if (!iva.is_zero())
{
imposta = (netto * iva) / 100.0; // Calcola l'imposta
if(imposta < ZERO)
imposta.floor(ndec);
else
imposta.ceil(ndec);
}
lordo = imposta + netto; // prezzo lordo
return lordo;
}
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( );
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 = ' ';
val_perc = 1.0;
// 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 = 1.0; // Azzera la sequenza di percentuali
goodexp = "";
}
}
return valid;
}
real prezzo_scontato(const real& prezzo, const char * sconto)
{
real scontato = prezzo;
if (sconto && *sconto)
{
TString80 exp;
real val_sconto;
scontoexpr2perc(sconto, FALSE , exp, val_sconto);
scontato = val_sconto * prezzo;
}
return scontato;
}
real iva(real imponibile, const TIVA & iva,int ndec)
{
real val = imponibile * iva.aliquota() / 100.0;
if (ndec < 20)
{
if (val < ZERO)
val.floor(ndec);
else
val.ceil(ndec);
}
return val;
}