Aggiunti 2 metodi a TDocumento:
calc_provv() e write_provv(), per calcolare e scrivere sui files delle provvigioni. git-svn-id: svn://10.65.10.50/trunk@5357 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
8ec9b32ff8
commit
77154d8360
@ -29,6 +29,10 @@
|
||||
#include "../cg/cgpagame.h"
|
||||
#endif
|
||||
|
||||
#ifndef __PRLIB_H
|
||||
#include "../pr/prlib.h"
|
||||
#endif
|
||||
|
||||
#ifndef __DOC_H
|
||||
#include <doc.h>
|
||||
#endif
|
||||
@ -478,6 +482,7 @@ class TDocumento : public TMultiple_rectype // velib03
|
||||
|
||||
TCond_vendita * _condv;
|
||||
TCli_for _cli_for;
|
||||
TProvvigioni_agente* _provv_agente;
|
||||
TOccasionale _occas;
|
||||
TPagamento _pag;
|
||||
TRiga_documento * _sconto; // Riga per lo sconto di testata
|
||||
@ -539,6 +544,9 @@ public:
|
||||
int write(bool re = FALSE) const { TLocalisamfile f(LF_DOC); return write_rewrite(f, re);}
|
||||
int rewrite() const { return write(TRUE); }
|
||||
int remove() const { TLocalisamfile f(LF_DOC); return remove(f);}
|
||||
|
||||
TProvvigioni_agente& calc_provvigioni();
|
||||
int write_provvigioni() { return calc_provvigioni().write();}
|
||||
|
||||
char tipo_numerazione() const { return get_char("PROVV"); }
|
||||
int anno() const { return get_int("ANNO"); }
|
||||
|
@ -261,6 +261,7 @@ TDocumento::TDocumento()
|
||||
_tipocf = new TRecfield(*this, "TIPOCF");
|
||||
_codcf = new TRecfield(*this, "CODCF");
|
||||
_cod_occas = new TRecfield(*this, "OCFPI");
|
||||
_provv_agente = new TProvvigioni_agente;
|
||||
set_memo_fld("G1");
|
||||
for (int i = 3 ; i >= 0; i--)
|
||||
_liv_len[i] = 0;
|
||||
@ -285,6 +286,7 @@ TDocumento::TDocumento(char provv, int anno, const char* codnum, long numdoc,
|
||||
_tipocf = new TRecfield(*this, "TIPOCF");
|
||||
_codcf = new TRecfield(*this, "CODCF");
|
||||
_cod_occas = new TRecfield(*this, "OCFPI");
|
||||
_provv_agente = new TProvvigioni_agente;
|
||||
set_memo_fld("G1");
|
||||
check_modules();
|
||||
if (numdoc <= 0)
|
||||
@ -299,13 +301,14 @@ TDocumento::TDocumento(char provv, int anno, const char* codnum, long numdoc,
|
||||
}
|
||||
|
||||
TDocumento::TDocumento(const TRectype& rec, TCond_vendita * condv)
|
||||
: TMultiple_rectype(LF_DOC), _condv(condv), _sconto(NULL),
|
||||
: TMultiple_rectype(LF_DOC), _condv(condv), _sconto(NULL), _provv_agente(NULL),
|
||||
_esenzione(NULL), _stato_originale(' ')
|
||||
{
|
||||
add_file(LF_RIGHEDOC, "NRIGA");
|
||||
_tipocf = new TRecfield(*this, "TIPOCF");
|
||||
_codcf = new TRecfield(*this, "CODCF");
|
||||
_cod_occas = new TRecfield(*this, "OCFPI");
|
||||
_provv_agente = new TProvvigioni_agente;
|
||||
set_memo_fld("G1");
|
||||
read(rec);
|
||||
for (int i = 3 ; i >= 0; i--)
|
||||
@ -319,6 +322,7 @@ TDocumento::~TDocumento()
|
||||
delete _tipocf;
|
||||
delete _codcf;
|
||||
delete _cod_occas;
|
||||
delete _provv_agente;
|
||||
if (_sconto != NULL) delete _sconto;
|
||||
if (_esenzione != NULL) delete _esenzione;
|
||||
}
|
||||
@ -997,7 +1001,82 @@ int TDocumento::remove(TBaseisamfile& f) const
|
||||
if (_docs_to_agg.items() == 0)
|
||||
_st_agg.update();
|
||||
}
|
||||
return TMultiple_rectype::remove(f);
|
||||
return TMultiple_rectype::remove(f);
|
||||
}
|
||||
|
||||
TProvvigioni_agente& TDocumento::calc_provvigioni()
|
||||
{
|
||||
CHECK (_provv_agente, "Bad TProvvigione_agente object");
|
||||
|
||||
TString agente(get(DOC_CODAG));
|
||||
const int anno = TDocumento::anno();
|
||||
TString codnum(numerazione());
|
||||
const long ndoc = numero();
|
||||
TDate datadoc(data());
|
||||
|
||||
_provv_agente->read(agente, anno,codnum,ndoc); // Legge le provvigioni per questo documento
|
||||
const real perc = _provv_agente->perc_fatt();
|
||||
const real tot_provv = provvigione();
|
||||
real provv_fat = (tot_provv / 100.0) * perc; // Provvigione sul fatturato (rata 0)
|
||||
provv_fat.round();
|
||||
real provv_pag = tot_provv - provv_fat; // Provvigione sul pagato (da suddivere secondo il pagamento)
|
||||
const real change(cambio());
|
||||
|
||||
// Calcolo rate per provvigioni e documento
|
||||
TPagamento& pag1 = pagamento(); // Per rate documento
|
||||
TPagamento* pag2 = new TPagamento(pag1.code(), datadoc.string()); // Per rate documento
|
||||
real totspese = spese();
|
||||
real totimposte = imposta();
|
||||
real totimponibili = totale_doc() - totimposte - totspese;
|
||||
const bool valuta = in_valuta();
|
||||
if (valuta)
|
||||
{
|
||||
real val1 = totimponibili * change;
|
||||
real val2 = totimposte * change;
|
||||
real val3 = totspese * change;
|
||||
pag1.set_total_valuta(totimponibili, totimposte, totspese, change, val1, val2, val3);
|
||||
pag2->set_total_valuta(provv_pag, ZERO, ZERO, change, provv_pag*change, ZERO, ZERO);
|
||||
}
|
||||
else
|
||||
{
|
||||
pag1.set_total(totimponibili, totimposte, totspese);
|
||||
pag2->set_total(provv_pag, ZERO, ZERO);
|
||||
}
|
||||
pag1.set_rate_auto();
|
||||
pag2->set_rate_auto();
|
||||
|
||||
// Crea le nuove rate provvigionali
|
||||
const bool isnew = _provv_agente->items() == 0; // Il documento non ha righe provvigionali
|
||||
TRate_doc& rd = _provv_agente->rate(anno, codnum, ndoc, isnew ? TRUE : FALSE);
|
||||
// A questo punto rd e' vuoto: settiamo i dati del documento:
|
||||
|
||||
TToken_string t;
|
||||
t.add(anno); t.add(codnum);t.add(ndoc);
|
||||
t.add(datadoc.string()); t.add(totale_doc().string());
|
||||
t.add(tot_provv.string());t.add(""/*Importo netto base di calcolo provvigioni (metodo da implementare)*/);
|
||||
t.add(codcf());t.add(""/* Tipo pagamento da prendere da %CPG->S4 oppure implementare un TPagamento()*/);
|
||||
t.add(TDocumento::valuta());t.add(change.string());
|
||||
t.add(get(DOC_DATACAMBIO));
|
||||
rd.set(t);
|
||||
|
||||
// Adesso si possono aggiungere le rate (per quelle gia' esistenti sostituisce solo alcuni valori)
|
||||
// - Rata 0 : importo rata = 0; importo provvigione = provvigione all'atto della fattura (percentuale sugli agenti)
|
||||
// data scadenza viene settata uguale alla data documento
|
||||
// la provvigione rimanente va suddivisa in rate a seconda del codice pagamento
|
||||
const int nrate = pag1.n_rate();
|
||||
for (int i = 0; i < nrate+1; i++)
|
||||
{
|
||||
TRata& rt = rd.row(i, isnew);
|
||||
rt.set_rata(i);
|
||||
rt.set_datascad(i == 0 ? datadoc : pag1.data_rata(i-1));
|
||||
rt.set_imprata(i == 0 ? ZERO : pag1.importo_rata(i-1,valuta ? TRUE : FALSE));
|
||||
rt.set_impprovv(i == 0 ? provv_fat : pag2->importo_rata(i-1,valuta ? TRUE : FALSE));
|
||||
}
|
||||
// Rimuove eventuali righe in eccesso
|
||||
for (i = nrate; i < _provv_agente->items(); i++)
|
||||
rd.remove_rata(i);
|
||||
delete pag2;
|
||||
return *_provv_agente;
|
||||
}
|
||||
|
||||
bool TDocumento::in_valuta() const
|
||||
|
Loading…
x
Reference in New Issue
Block a user