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
This commit is contained in:
alex 1997-10-29 11:08:40 +00:00
parent 720aa5089c
commit 2cc5c59b38
10 changed files with 411 additions and 163 deletions

View File

@ -22,6 +22,10 @@
#include <tabutil.h>
#endif
#ifndef __ANAMAG_H
#include "../mg/anamag.h"
#endif
#ifndef __VEINI_H
#include "veini.h"
#endif
@ -30,96 +34,18 @@
#include "velib.h"
#endif
#ifndef __AGE_H
#include "../pr/agenti.h"
#endif
#ifndef __PER_H
#include "../pr/percprov.h"
#endif
HIDDEN const real CENTO(100.0);
bool TCond_vendita::set_sconto( const char * exp, bool signal )
{
/*
TString80 goodexp;
// 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 = ' ';
_molt_sconto = 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 );
_molt_sconto *= ( 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 );
_molt_sconto *= ( 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);
_molt_sconto = 1.0; // Azzera la sequenza di percentuali
goodexp = "";
}
}
_sconto = goodexp;
*/
bool valid= scontoexpr2perc(exp,signal,_sconto,_molt_sconto );
if (_load_mask && _riga && _riga->id2pos(FR_SCONTO) >= 0 && _riga->field(FR_SCONTO).active())
@ -316,10 +242,126 @@ bool TCond_vendita::cerca( int tiporicerca )
// Ricerca fallita
return FALSE;
}
real TCond_vendita::get_percprovv(char tipoprovv, const TString & codpr, TLocalisamfile & age) const
{
real val = ZERO;
switch (tipoprovv)
{
case 'A':
val = age.get_real(AGE_PERCPROVV);
break;
case 'M':
val = anamag().get_real(ANAMAG_PERCPROVV);
break;
case 'C':
val = clifo().vendite().get_real(CFV_PERCPROVV);
break;
case 'V':
{
TString16 catven(testa().get(F_CATVEN));
if (catven.not_empty())
{
TTable cve("CVE");
cve.put("CODTAB", catven);
if (cve.read() == NOERR)
val = cve.get_real("R0");
}
}
break;
case 'O':
val = _rcondv.get_real("PERCPROVV");
break;
case '1':
case '2':
case '3':
case '4':
{
TTable apr("APR");
TString16 ord;
apr.put("CODTAB",codpr);
if (apr.read() == NOERR)
ord = apr.get("S3");
int len = ord.len();
TString key;
TString80 campo;
for (int i = 0; i < len; i++)
{
switch (ord[i])
{
case 'C':
campo = clifo().get(CLI_CODCF);
campo.lpad(clifo().length(CLI_CODCF));
break;
case 'V':
campo = testa().get(F_CATVEN);
campo.rpad(testa().field(F_CATVEN).size());
break;
case 'A':
campo = testa().get(F_CODAG);
campo.rpad(testa().field(F_CODAG).size());
break;
case 'P':
campo = testa().get(F_CODPAG);
campo.rpad(testa().field(F_CODPAG).size());
break;
case 'S':
campo = clifo().vendite().get(CFV_CODSCC);
campo.rpad(clifo().length(CFV_CODSCC));
break;
case 'Z':
campo = testa().get(F_CODZON);
campo.rpad(testa().field(F_CODZON).size());
break;
case 'M':
campo = riga().get( FR_CODARTMAG );
campo.rpad(riga().field(FR_CODARTMAG).size());
break;
case 'E':
campo = anamag().get(ANAMAG_GRMERC);
campo.rpad(anamag().curr().length(ANAMAG_GRMERC));
campo.cut(3);
break;
case 'R':
campo = anamag().get(ANAMAG_GRMERC);
campo.rpad(anamag().curr().length(ANAMAG_GRMERC));
break;
case 'F':
campo = anamag().get(ANAMAG_RAGGFIS);
campo.rpad(anamag().curr().length(ANAMAG_RAGGFIS));
break;
default:
campo.cut(0);
break;
}
key << campo;
}
TLocalisamfile perc(LF_PERCPROV);
perc.put(PER_CODPR, codpr);
perc.put(PER_KEYORD, key);
if (perc.read() == NOERR)
val= perc.get_real(PER_PERCPROVV);
}
break;
default:
break;
}
return val;
}
void TCond_vendita::ricerca(bool load_um_only, bool load_scagl_only)
{
TString codart = anamag().get( "CODART" );
TString codart = anamag().get(ANAMAG_CODART);
const TString codriga = riga().get( FR_CODARTMAG );
_ivarid = clifo().vendite().get_bool(CFV_IVARID);
@ -366,9 +408,9 @@ void TCond_vendita::ricerca(bool load_um_only, bool load_scagl_only)
if (_ivarid)
set_iva(anamag().get("CODIVAR"));
set_iva(anamag().get(ANAMAG_CODIVAR));
else
set_iva(anamag().get("CODIVA"));
set_iva(anamag().get(ANAMAG_CODIVA));
const char gestione = config_ditta().get_char( "GESSCORIGA", "ve" );
const bool sco_scagl = config_ditta().get_bool("GESCOSCA", "ve");
@ -480,56 +522,51 @@ void TCond_vendita::ricerca(bool load_um_only, bool load_scagl_only)
if (codage.not_empty())
{
TTable age("AGE");
TLocalisamfile age(LF_AGENTI);
age.put("CODTAB", codage);
age.put(AGE_CODAGE, codage);
if (age.read() == NOERR)
{
char tipoprovv = age.get("S6")[0];
{
TString16 seqric(age.get(AGE_SEQRIC));
TString16 fcodpr;
TString16 codpr;
real percprovv = ZERO;
if (tipoprovv <= ' ')
tipoprovv = config_ditta().get_char( "AGETIPOPERC", "ve" );
if (seqric[0] == '-')
seqric = config_ditta().get( "AGETIPOPERC", "ve" );
int len = seqric.len();
switch (tipoprovv)
{
case 'A':
set_provv(age.get_real("R0"));
break;
case 'C':
set_provv(real(clifo().vendite().get(CFV_PERCPROVV)));
break;
case 'L':
if (found_condv)
{
_load_mask |= load_scagl_only && sco_scagl;
_load_mask |= load_scagl_only && sco_um_gest;
set_provv(_rcondv.get_real("PERCPROVV"));
}
else
set_provv(anamag().get_real("PERCPROVV"));
break;
case 'V':
{
TString16 catven(testa().get(F_CATVEN));
if (catven.empty())
catven = clifo().vendite().get(CFV_CATVEN);
if (catven.not_empty())
{
TTable cve("CVE");
cve.put("CODTAB", catven);
if (cve.read() == NOERR)
set_provv(cve.get_real("R0"));
}
}
break;
default:
set_provv("");
break;
_load_mask |= load_scagl_only && sco_scagl;
_load_mask |= load_scagl_only && sco_um_gest;
for (int i = 0; percprovv == ZERO && i < len && seqric[i] != '-'; i++)
{
if (isdigit(seqric[i]))
{
fcodpr.format("CODRICPR%d", i+1);
codpr = age.get(fcodpr);
}
else
codpr.cut(0);
percprovv = get_percprovv(seqric[i], codpr, age);
}
}
real percalt = ZERO;
seqric = age.get(AGE_SEQALT);
for (i = 0; percalt == ZERO && i < len && seqric[i] != '-'; i++)
{
if (isdigit(seqric[i]))
{
fcodpr.format("CODALTPR%d", i+1);
codpr = age.get(fcodpr);
}
else
codpr.cut(0);
percalt = get_percprovv(seqric[i], codpr, age);
}
percprovv += percalt;
set_provv(percprovv);
}
}
}
if (found_condv && _testa->is_running())

View File

@ -59,6 +59,7 @@ public:
real sconto_val() const { return _molt_sconto;}
real get_prezzo() const { return _prezzo; }
real get_provv() const { return _provv; }
real get_percprovv(char tipoprovv, const TString & codpr, TLocalisamfile & age) const;
const TString & get_iva() const { return _codiva; }
void set_clifo( TCli_for * clifo) { _clifo = clifo; }

153
ve/vefields.txt Executable file
View File

@ -0,0 +1,153 @@
CUMULAALC Cumula articolo/listino/contratto
GES[ ... ] Flag di gestione Listini/Contratti/Offerte
Gli indici sono nel file VECONF.H
GESUM[ ... ] Gestione per unità di misura
GESSCA[ ... ] Gestione per scaglioni
GESSO[ ... ] Gestione sconti/omaggi
GESLISCV Gestione codice listino+codice cat. vendite
GESCONCC Gestione codice cliente+codice contratto
SEQRICRIGHE[1..4] Sequenza di ricerca delle righe
A|Codice articolo
L|Codice linea
C|Codice linea/categoria
R|Codice raggruppamento fiscale
GESSCO Gestione sconti
N|Non gestire
P|Percentuale su anagrafica
T|Gestione tabella sconti
A|Gestione archivio sconti
SCOKEY Chiave sconti
V|Tab. categorie vendite
C|Tab. sconti clienti
Z|Tab. zone
M|Tab. modalitÓ di pagamento
SCOTIPCAL Tipo di calcolo degli sconti
R|Sconti sulle righe merci
G|Sconti sul valore globale merci
GESSCOIMP Gestione sconti per importo
GESSCORIGA Gestione sconti per riga
N|Non gestire
L|Perc. su anagrafica/listini/contratti
A|Gest. arch. sconti
C|Perc. indicata su anagrafica cliente
GESSCORIGACV Gestione categoria vendita in chiave archivio sconti
// ve0200b
GESAGE Gestione agenti
GESSUBAGE Gestione subagenti
AGETIPOPERC Tipo percentuale
V|Tab. categorie vendite agenti
A|Tab. agenti
C|Archivio clienti
L|Archivio listini o contratti
P|Provvigioni sulla tabella agenti
AGEARCPROVV Gestione archivio provvigioni
AGEKEYPROVV[1..4] Chiavi archivio provvigioni
AGELIQPROVV Liquidazione provvigioni
F|Liquidate sul valore del fatturato
M|Liq. sul valore fatt. e sul valore merce
GESVAL Gestione documenti in valuta
GESVALAC Gestione archivio cambi
GESLIN Gestione documenti lingua
GESSOSPIMP Gestione documenti in sospensione di imposta
GESOCCAS Gestione clienti occasionali
GESOCCCHK Abilita il checko sul c.f./p.iva per occasionali
PIEDE[1..40] Etichette dei totalizzatori piede documento
ARRLIV[1..6] Scaglione di arrotondamento
ARRARG[1..7] Valore a cui arrotondare
// ve0200c
SCOPRCOD Sconti percentuale: Codice tabella sconti
SCOPRCODCON Sconti percentuale: Codice contabilit 2 + 2 6
SCOPRNPIEDE Sconti percentuale: Numero progressivo piede
SCOIMCOD Sconti a importo: Codice tabella sconti
SCOIMCODCON Sconti a importo: Codice contabilit 2 + 2+ 6
SCOIMNPIEDE Sconti a importo: Numero progressivo piede
// ve0200d
SPINADD Spese incasso: Flag addebito
SPINCODSP Spese incasso: Codice spese
SPINCODIVA Spese incasso: Codice IVA
SPINCODCON Spese incasso: Codice contabilit 2 + 2 + 6
SPININCPR Spese incasso: Incasso prima rata
SPINNPIEDE Spese incasso: Numero progressivo piede
SPINIMRD Spese incasso: Importo rimessa diretta
SPINIMTR Spese incasso: Importo tratta
SPINIMRB Spese incasso: Importo RiBa
SPINIMCES Spese incasso: Importo cessione
SPINIMPAG Spese incasso: Importo paghero'
SPINIMLET Spese incasso: Importo lettera di credito
SPINIMTA Spese incasso: Importo tratta accettata
SPINIMRID Spese incasso: Importo RID
SPINIMBON Spese incasso: Importo bonifico
SPBRBADD Spese bolli RB: Flag addebito
SPBRBCODSP Spese bolli RB: Codice spese
SPBRBCODIVA Spese bolli RB: Codice IVA
SPBRBCODCONT Spese bolli RB: Codice contabilita' 2 + 2 + 6
SPBRBINCPR Spese bolli RB: Incasso prima rata
SPBRBNPIEDE Spese bolli RB: Numero progressivo piede
SPBRBSCA[1..7] Spese bolli RB: Scaglioni
SPBRBIMP[1..7] Spese bolli RB: Importi scaglioni
SPBRBIMPMINRB Spese bolli RB: Importo minimo RiBa
SPBRBCODPAGALT Spese bolli RB: Cond. pagamento alternativo
SPBRBCLAPAGRB Spese bolli RB: Classif. pag. RB a richiesta
SPBFEADD Spese bolli FE: Flag addebito
SPBFECODSP Spese bolli FE: Codice spese
SPBFECODIVA Spese bolli FE: Codice IVA
SPBFECODCONT Spese bolli FE: Codice contabilit 2 + 2 + 6
SPBFEINCPR Spese bolli FE: Incasso prima rata
SPBFENPIEDE Spese bolli FE: Numero progressivo piede
SPBFEIMPMINFAT Spese bolli FE: Importo minimo fattura
SPBFEIMPBOLLO Spese bolli FE: Importo del bollo
SPTRADD Spese bolli TR: Flag addebito
SPTRCODSP Spese bolli TR: Codice spese
SPTRCODIVA Spese bolli TR: Codice IVA
SPTRCODCON Spese bolli TR: Codice contabilit 2 + 2 + 6
SPTRINCPR Spese bolli TR: Incasso prima rata
SPTRNPIEDE Spese bolli TR: Numero progressivo piede
SPTRPERCSPTR Spese bolli TR: Percentuale spese tratte
SPTRIMPMINBOL Spese bolli TR: Importo minimo bollo
SPTRIMPMINTR Spese bolli TR: importo minimo tratte
SPTRCODPAGALT Spese bolli TR: Cond. pagamento alternativo
SPTRCLASPAG Spese bolli TR: Classificazione pagamento
SPTECODSP Spese bolli TE: Codice spese
SPTECODIVA Spese bolli TE: Codice IVA
SPTECODCON Spese bolli TE: Codice contabilit 2 + 2 + 6
SPTEINCPR Spese bolli TE: Incasso prima rata
SPTENPIEDE Spese bolli TE: Numero progressivo piede
SPTEPERCSPTR Spese bolli TE: Percentuale spese tratte
SPTEIMPMINBOL Spese bolli TE: Importo minimo bollo
// ve0200e
CODARTDES Codice articolo: Descrizione
CODARTLUN[1..3] Codice articolo: Lunghezza campi
CODARTPIC[1..3] Codice articolo: Tipo campi
INDARTDES[1..2] Indici articolo: Descrizioni
INDARTLUN[1..2] Indici articolo: Lunghezze
INDARTPIC[1..2] Indici articolo: Tipo campi
ARTGESLIN Gestione articoli in lingua
ARTCODLIN[1..4] Codici delle lingue per la gestione articoli
ARTGESMAG Gestione di pi¨ magazzini
ARTGESDEP Gestione depositi
ARTGESCOMM Gestione commesse
ARTGESQDEC Gestione dei decimali sulle quantit
ARTGESVAL Gestione valuta
ARTRIPIND Ripetizione indice articolo
ARTGESDESCEST Gestione delle descrizioni estese
ARTGESLOTTI Gestione dei lotti
N|Non gestire
D|Gestiti con lotto data
Q|Gestiti con lotto descr. qualitÓ
ARTGESTAGLIA Gestione delle taglie
ARTDESCHI[1..2] Descrizione delle chiavi
ARTGESUM Gestione u. m. articolo
ARTGESCODIVA Gestione secondo codice IVA
ARTGESPLN Gestione pesi lordo e netto
ARTGESASPBEN Gestione aspetto beni
ARTGESCODGR Gestione codice gruppo
ARTGESDB Gestione campo distinta base
ARTGESCATVEN Gestione categoria vendita
ARTGESCATACQ Gestione categoria acquisto
ARTGESCODFOR Gestione codice fornitore
SPBRBIMP[1..7] Spese bolli RB: Importi scaglioni
SPBRBIMPMINRB Spese bolli RB: Importo minmo RB
SPTRIMPMINBOL Spese bolli TR: Importo minimo bollo
SPTRIMPMINTR Spese bolli TR: Importo minimoo tratte
SPTRCODPAGALT Spese bolli TR: Cond. pagamento alternativo
SPTRCLASPAG

Binary file not shown.

View File

@ -463,7 +463,9 @@ public:
TRiepilogo_iva() : _tipo(0) {}
~TRiepilogo_iva() {};
};
class TAgente ;
class TDocumento : public TMultiple_rectype // velib03
{
TRecfield *_tipocf;
@ -480,9 +482,6 @@ class TDocumento : public TMultiple_rectype // velib03
static bool _has_provv;
int _liv_len[4];
// TRecord_array _rows; // Array di TRectype per le righe documenti di vendita.
// bool _nuovo;
TCond_vendita * _condv;
TCli_for _cli_for;
TProvvigioni_agente* _provv_agente;
@ -519,7 +518,8 @@ public:
TAssoc_array & tabella_iva() { update_tabella_iva(); return _tabella_iva; }
TCond_vendita & condv() const {CHECK(_condv, "Condizioni di vendita nulle"); return *_condv;}
TCli_for & clifor() const;
TOccasionale & occas() const;
TOccasionale & occas() const;
const TAgente & agente() const;
void set_condv(TCond_vendita * condv) { _condv = condv; }
virtual TDocumento & operator =(const TDocumento & d) {return copy(d);}

View File

@ -235,4 +235,3 @@ real iva(real imponibile, const TIVA & iva,int ndec)
}
return val;
}

View File

@ -566,6 +566,9 @@ int TExpr_documento::parse_user_func(const char * name, int nparms) const
else
if (strcmp(name, "IMPOSTE") == 0)
return nparms < 3 ? _imposte : -1;
else
if (strcmp(name, "TOTPROVV") == 0)
return nparms < 3 ? _totprovv : -1;
else
return -1;
}
@ -813,6 +816,19 @@ void TExpr_documento::evaluate_user_func(int index, int nparms, TEval_stack & st
val = _doc->imposta(spese, ndec);
}
break;
case _totprovv:
{
int ndec = AUTO_DECIMALS;
if (nparms > 0)
ndec = (int) stack.peek_real().integer();
else
stack.push(ZERO);
real & val = stack.peek_real();
val = _doc->provvigione(ndec);
}
break;
default:
TExpression::evaluate_user_func(index, nparms, stack, type);
break;

View File

@ -42,6 +42,10 @@
#include "../sv/svlib01.h"
#endif
#ifndef __PRLIB_H
#include "../pr/prlib.h"
#endif
#include "../mg/movmag.h"
///////////////////////////////////////////////////////////
// Movimento di magazzino
@ -156,17 +160,25 @@ void TTipo_documento::read_formule()
_formule.add(_spese);
if (provvigioni())
{
_totprovv = profile.get("TOTPROVV", "MAIN");
if (_totprovv.empty())
_totprovv = "TOTPROVV";
TString80 campo(profile.get("TOTPROVV", "MAIN"));
if (campo.empty())
campo = "TOTPROVV";
frd.put("CODTAB", _totprovv);
frd.put("CODTAB", campo);
_totprovv = "_";
_totprovv << campo;
if (frd.read() != NOERR)
_formule_documento.add(_totprovv, new TFormula_documento(_documento, _totprovv, "SOMMA(\"PROVV()\")"), TRUE);
if (_formule.find(_totprovv) < 0)
_formule.add(_totprovv);
}
frd.zero();
TString80 expr(frd.get("S1"));
if (expr.empty())
expr = "SOMMA(\"PROVV()\")";
_formule_documento.add(_totprovv, new TFormula_documento(_documento, _totprovv, expr, TRUE));
if (_formule.find(campo) < 0)
_formule.add(campo);
_formule.add(_totprovv);
_formule_documento.add(campo, new TFormula_documento(_documento, campo, "TOTPROVV()"), TRUE);
}
}
bool TTipo_documento::stato_with_mov_mag(const char stato) const
@ -238,6 +250,23 @@ TRiepilogo_iva::TRiepilogo_iva(const TIVA & codiva) : _codiva(codiva)
_tipo = 1;
}
///////////////////////////////////////////////////////////
// Agenti
///////////////////////////////////////////////////////////
class TAgenti_cache : public TRecord_cache
{
protected:
virtual TObject* rec2obj(const TRectype& rec) const { return new TAgente(rec);}
public:
const TAgente& agente(const char* chiave) { return (const TAgente &) get(chiave);}
TAgenti_cache() : TRecord_cache(LF_AGENTI) {}
virtual ~TAgenti_cache() { }
};
HIDDEN TAgenti_cache _agenti;
///////////////////////////////////////////////////////////
// Documento per vendite
///////////////////////////////////////////////////////////
@ -951,17 +980,22 @@ int TDocumento::write_rewrite(TBaseisamfile & f, bool re) const
err = TMultiple_rectype::write_rewrite(f, re);
if (err == NOERR && clifor().occasionale())
if (err == NOERR)
{
if (get("OCFPI").not_empty())
if (clifor().occasionale())
{
TLocalisamfile o(LF_OCCAS);
TOccasionale & occ = occas();
err = occ.write(o);
if (err == _isreinsert)
err = occ.rewrite(o);
if (get("OCFPI").not_empty())
{
TLocalisamfile o(LF_OCCAS);
TOccasionale & occ = occas();
err = occ.write(o);
if (err == _isreinsert)
err = occ.rewrite(o);
}
}
if (_has_provv && tipo().provvigioni() && tipo().stato_provvigioni() >= stato())
myself.write_provvigioni();
}
if (tipo().statistiche() && _has_stat_ven)
{
@ -1454,9 +1488,12 @@ real TDocumento::provvigione(int ndec) const
real val;
if (ndec == AUTO_DECIMALS)
ndec = in_valuta() ? 3 : 0;
// update for agente ???
const TString16 & field = tipo().totprovv();
ndec = in_valuta() ? 3 : 0;
TString16 field(agente().campoprovv());
if (field.empty())
field = tipo().totprovv();
if (field.not_empty())
return get_real(field);
@ -1534,6 +1571,11 @@ TOccasionale & TDocumento::occas() const
}
return (TOccasionale &) _occas;
}
const TAgente & TDocumento::agente() const
{
return _agenti.agente(get(DOC_CODAG));
}
TDocumento & TDocumento::copy(const TDocumento & d)
{

View File

@ -116,7 +116,7 @@ bool TFatturazione_bolle::raggruppa(TDocumento& doc_in, TDocumento& doc_out)
if (riga_uguale(2)) campi_riga.add("PREZZO|SCONTO");
}
for (int r = 1; r <= doc_in.physical_rows(); r++)
for (int r = 1; r <= doc_in.physical_rows(); r++)
{
const TRiga_documento& rin = doc_in[r];
const bool rindesc = rin.sola_descrizione(); // La riga di input e' descrittiva

View File

@ -1,5 +1,5 @@
enum _formule {_somma, _bolli, _bolli_int, _spinc, _prezzo, _importo, _imponibile, _sconto, _iva, _provv, _tipo, _imponibili, _imposte};
enum _formule {_somma, _bolli, _bolli_int, _spinc, _prezzo, _importo, _imponibile, _sconto, _iva, _provv, _tipo, _imponibili, _imposte, _totprovv};
enum TTipo_calcolo { _nessun_calcolo, _qtaprezzo, _valore, _percentuale, _scontoimp, _scontoperc};
void row_set_handler( TMask& m, const int field, const int index );