1997-06-27 09:21:13 +00:00
|
|
|
#include <tabutil.h>
|
1997-10-28 15:54:45 +00:00
|
|
|
#include "velib.h"
|
1997-08-06 12:31:10 +00:00
|
|
|
|
1997-10-28 15:54:45 +00:00
|
|
|
HIDDEN const real CENTO(100.0); // costante per evitare la chiamata dei costruttori real tante volte
|
1997-08-06 12:31:10 +00:00
|
|
|
|
1996-09-26 15:37:19 +00:00
|
|
|
TSpesa_prest::TSpesa_prest(const char* codice, char tipo)
|
|
|
|
: TRectype(LF_TAB)
|
|
|
|
{
|
1997-03-17 09:26:01 +00:00
|
|
|
settab(tipo == RIGA_SPESEDOC ? "SPP" : "PRS");
|
1996-09-26 15:37:19 +00:00
|
|
|
if (codice && *codice)
|
1998-04-30 14:04:19 +00:00
|
|
|
if (read(codice) != NOERR)
|
|
|
|
yesnofatal_box("Tipo spesa assente : %s", codice);
|
1996-09-26 15:37:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TSpesa_prest::TSpesa_prest(const TRectype& rec)
|
|
|
|
: TRectype(rec)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
int TSpesa_prest::read(const char* codice)
|
1998-04-30 14:04:19 +00:00
|
|
|
{
|
|
|
|
zero();
|
1996-09-26 15:37:19 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
1996-08-09 08:50:18 +00:00
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
// Funzioni per il calcolo dei prezzi netti/lordi
|
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
|
1996-09-26 15:37:19 +00:00
|
|
|
real lordo2netto(real& lordo, const TString& codiva, int ndec)
|
1996-08-09 08:50:18 +00:00
|
|
|
{
|
|
|
|
TTable tabiva("%IVA");
|
|
|
|
real aliquota = 0.0;
|
|
|
|
|
|
|
|
tabiva.put("CODTAB", codiva);
|
|
|
|
if (tabiva.read() == NOERR) aliquota = tabiva.get_real("R0");
|
|
|
|
|
1996-09-26 15:37:19 +00:00
|
|
|
return lordo2netto(lordo,aliquota, ndec);
|
1996-08-09 08:50:18 +00:00
|
|
|
}
|
|
|
|
|
1996-09-26 15:37:19 +00:00
|
|
|
real netto2lordo(const real& netto, const TString& codiva, int ndec)
|
1996-08-09 08:50:18 +00:00
|
|
|
{
|
|
|
|
TTable tabiva("%IVA");
|
|
|
|
real aliquota = 0.0;
|
|
|
|
|
|
|
|
tabiva.put("CODTAB", codiva);
|
|
|
|
if (tabiva.read() == NOERR) aliquota = tabiva.get_real("R0");
|
|
|
|
|
1996-09-26 15:37:19 +00:00
|
|
|
return netto2lordo(netto,aliquota, ndec);
|
1996-08-09 08:50:18 +00:00
|
|
|
}
|
|
|
|
|
1996-09-26 15:37:19 +00:00
|
|
|
real lordo2netto(real& lordo, const real& iva, int ndec)
|
1996-08-09 08:50:18 +00:00
|
|
|
{
|
|
|
|
real netto;
|
|
|
|
real imposta = 0.0;
|
1996-11-23 08:32:10 +00:00
|
|
|
real imposta_rec = 0.0;
|
1996-08-09 08:50:18 +00:00
|
|
|
if (!iva.is_zero())
|
|
|
|
{
|
|
|
|
imposta = (lordo * iva) / (iva + 100.0); // Calcola l'imposta...
|
1996-11-23 08:32:10 +00:00
|
|
|
if (imposta < ZERO)
|
|
|
|
imposta.floor(ndec);
|
|
|
|
else
|
|
|
|
imposta.ceil(ndec);
|
1996-08-09 08:50:18 +00:00
|
|
|
}
|
|
|
|
netto = lordo - imposta; // Questo e' l'importo netto
|
|
|
|
imposta_rec = (netto * iva) / 100.0; // Ricalcola l'imposta con il nuovo imponibile
|
1996-11-23 08:32:10 +00:00
|
|
|
if (imposta_rec < ZERO)
|
|
|
|
imposta_rec.floor(ndec);
|
|
|
|
else
|
|
|
|
imposta_rec.ceil(ndec);
|
1996-08-09 08:50:18 +00:00
|
|
|
if (imposta != imposta_rec) // In questo caso corregge l'importo lordo
|
|
|
|
lordo = netto + imposta_rec;
|
|
|
|
return netto;
|
|
|
|
}
|
|
|
|
|
1996-09-26 15:37:19 +00:00
|
|
|
real netto2lordo(const real& netto, const real& iva, int ndec)
|
1996-08-09 08:50:18 +00:00
|
|
|
{
|
|
|
|
real lordo;
|
|
|
|
real imposta = 0.0;
|
|
|
|
if (!iva.is_zero())
|
|
|
|
{
|
|
|
|
imposta = (netto * iva) / 100.0; // Calcola l'imposta
|
1996-11-23 08:32:10 +00:00
|
|
|
if(imposta < ZERO)
|
|
|
|
imposta.floor(ndec);
|
|
|
|
else
|
|
|
|
imposta.ceil(ndec);
|
1996-08-09 08:50:18 +00:00
|
|
|
}
|
|
|
|
lordo = imposta + netto; // prezzo lordo
|
|
|
|
return lordo;
|
|
|
|
}
|
|
|
|
|
1997-10-28 15:54:45 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
1996-09-26 15:37:19 +00:00
|
|
|
real prezzo_scontato(const real& prezzo, const char * sconto)
|
|
|
|
{
|
|
|
|
real scontato = prezzo;
|
|
|
|
|
|
|
|
if (sconto && *sconto)
|
|
|
|
{
|
1997-10-28 15:54:45 +00:00
|
|
|
TString80 exp;
|
|
|
|
real val_sconto;
|
|
|
|
scontoexpr2perc(sconto, FALSE , exp, val_sconto);
|
1996-09-26 15:37:19 +00:00
|
|
|
|
1997-10-28 15:54:45 +00:00
|
|
|
scontato = val_sconto * prezzo;
|
1996-09-26 15:37:19 +00:00
|
|
|
}
|
|
|
|
return scontato;
|
|
|
|
}
|
|
|
|
|
1997-10-28 15:54:45 +00:00
|
|
|
|
|
|
|
|
1996-09-26 15:37:19 +00:00
|
|
|
real iva(real imponibile, const TIVA & iva,int ndec)
|
|
|
|
{
|
|
|
|
real val = imponibile * iva.aliquota() / 100.0;
|
1996-11-23 08:32:10 +00:00
|
|
|
|
1997-02-03 15:28:53 +00:00
|
|
|
if (ndec < 20)
|
|
|
|
{
|
|
|
|
if (val < ZERO)
|
|
|
|
val.floor(ndec);
|
|
|
|
else
|
|
|
|
val.ceil(ndec);
|
|
|
|
}
|
1996-09-26 15:37:19 +00:00
|
|
|
return val;
|
|
|
|
}
|