campo-sirio/ve/velib01.cpp
alex 2cc5c59b38 Sostituito il file vefields.wri con il file vefields.txt
Sostituite le tabelle Agenti e Provvigioni con i rispettivi archivi.
!!! Devono essere sostituite sui menu e si devono controllare di conseguenza
    i moduli statistiche di vendita e magazzino !!!
Modificato il meccanismo di ricerca delle percentuali di provvigione.
Bisogna testare tutte le combinazioni basandosi sulle possibilita' offerte
dal nuovo archivio agenti. Per quanto riguarda il valore della provvigione
alla percentuale di base viene aggiunta la percentuale reperita con la
sequenza alternativa definita sull'archivio agenti.
Aggiunto il metodo agente sui documenti.
Aggiunto sui tipi documento il flag attivo per le provvigioni di ovvio
significato e lo stato a partire dal quale si debbono memorizzare le
provvigioni.
Aggiunta la funzione TOTPROVV(ndec = AUTO_DECIMALS) per i documenti.
Restituisce il valore totale delle provvigioni tenedo conto anche del campo
provvigioni definito per l'agente. !!! Deve essere utilizzato solo per avere
il valore della provvigione da utilizzare in un calcolo e non per visualizzare
o calcolare la provvigione stessa.
Aggiunta definizione del campo provvigione della riga (PROVV=....) nei
profili riga dei documenti per definire la provvigione della riga quando
non e' il default (importo scontato * percentuale di provvigione della
riga). Aggiunto il metodo provvigioni alle righe.
Aggiunta definizione del campo provvigione del documento (TOTPROVV=....)
nei profili documento per definire la provvigione totale quando non e' il
default (somma delle provvigioni della riga). Il campo che viene definito
come totale delle provvigioni non puo' contenere la funzione TOTPROVV.
Aggiunto il metodo provvigione del documento.


git-svn-id: svn://10.65.10.50/trunk@5478 c028cbd2-c16b-5b4b-a496-9718f37d4682
1997-10-29 11:08:40 +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)
read(codice);
}
TSpesa_prest::TSpesa_prest(const TRectype& rec)
: TRectype(rec)
{
}
int TSpesa_prest::read(const char* codice)
{
TTable t(get("COD"));
put("CODTAB", codice);
int err = TRectype::read(t);
if (err != NOERR)
yesnofatal_box("Tipo spesa assente : %s", codice);
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;
}