From 77154d8360fba2d4f699afa009f504954e4ea374 Mon Sep 17 00:00:00 2001 From: angelo Date: Mon, 13 Oct 1997 15:22:11 +0000 Subject: [PATCH] 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 --- ve/velib.h | 8 +++++ ve/velib03.cpp | 83 ++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 89 insertions(+), 2 deletions(-) diff --git a/ve/velib.h b/ve/velib.h index f27a84ebd..a1800d44f 100755 --- a/ve/velib.h +++ b/ve/velib.h @@ -29,6 +29,10 @@ #include "../cg/cgpagame.h" #endif +#ifndef __PRLIB_H +#include "../pr/prlib.h" +#endif + #ifndef __DOC_H #include #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"); } diff --git a/ve/velib03.cpp b/ve/velib03.cpp index a68d8288f..2594831de 100755 --- a/ve/velib03.cpp +++ b/ve/velib03.cpp @@ -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