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:
angelo 1997-10-13 15:22:11 +00:00
parent 8ec9b32ff8
commit 77154d8360
2 changed files with 89 additions and 2 deletions

View File

@ -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"); }

View File

@ -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