Patch level : 10.0 patch 804

Files correlati     : ve0.exe ve6.exe
Ricompilazione Demo : [ ]
Commento            :

Bug 0001690:       Gestione documenti (ve0), Contabilizzazione documenti( ve6)

Aggiungere la possibilità di distribuire le spese sui conti contabili quando quest'ultime non hanno un conto proprio


git-svn-id: svn://10.65.10.50/branches/R_10_00@20829 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
alex 2010-09-08 10:09:59 +00:00
parent 3f11c4443a
commit 5d6a9bef1a
8 changed files with 212 additions and 60 deletions

View File

@ -1,5 +1,6 @@
#include <applicat.h>
#include "clifor.h"
#include "velib.h"
#include "../li/letint.h"
#include <modaut.h>
#include <relation.h>
@ -173,6 +174,38 @@ void TCli_for::init()
_use_lettere = ini_get_bool(CONFIG_DITTA, "ve", "USELETTERE");
}
void TCli_for::cli2doc(TDocumento & doc)
{
const TRectype & v = vendite();
doc.put(DOC_CODVAL, get(CLI_CODVAL));
doc.put(DOC_CODLIN, get(CLI_CODLIN));
doc.put(DOC_CODPAG, get(CLI_CODPAG));
doc.put(DOC_CODABIA, get(CLI_CODABI));
doc.put(DOC_CODCABA, get(CLI_CODCAB));
doc.put(DOC_IBAN, get(CLI_IBAN));
doc.put(DOC_CODABIP, v.get(CFV_CODABIPR));
doc.put(DOC_CODCABP, v.get(CFV_CODCABPR));
doc.put(DOC_RAGGR, v.get(CFV_RAGGDOC));
doc.put(DOC_RAGGREFF, v.get(CFV_RAGGEFF));
doc.put(DOC_CODINDSP, v.get(CFV_CODINDSP));
doc.put(DOC_CODAG, v.get(CFV_CODAG));
doc.put(DOC_CODAGVIS, v.get(CFV_CODAG1));
doc.put(DOC_CODSPMEZZO, v.get(CFV_CODSPMEZZO));
doc.put(DOC_CODPORTO, v.get(CFV_CODPORTO));
doc.put(DOC_CODNOTESP1, v.get(CFV_CODNOTESP1));
doc.put(DOC_CODNOTESP2, v.get(CFV_CODNOTESP2));
doc.put(DOC_CODNOTE, v.get(CFV_CODNOTE));
doc.put(DOC_CODVETT1, v.get(CFV_CODVETT1));
doc.put(DOC_CODVETT2, v.get(CFV_CODVETT2));
doc.put(DOC_CODVETT3, v.get(CFV_CODVETT3));
doc.put(DOC_PERCSPINC, v.get(CFV_PERCSPINC));
doc.put(DOC_ADDBOLLI, v.get(CFV_ADDBOLLI));
doc.put(DOC_CATVEN, v.get(CFV_CATVEN));
doc.put(DOC_LIQDIFF, get_int(CLI_ALLEG) == 7 && v.get_bool(CFV_FATTSOSP) ? "X" : "");
}
TCli_for::TCli_for(char tipo, long codice) : TMultiple_rectype( LF_CLIFO ), _ven_rec(LF_CFVEN),
_letint(LF_LETINT), _use_lettere(false), _lettera_found(false)
{

View File

@ -21,6 +21,8 @@
#include <occas.h>
#endif
class TDocumento;
class TOccasionale : public TRectype
{
public:
@ -67,6 +69,7 @@ public:
virtual int read(const TRectype& rec, word op = _isequal, word lockop = _nolock);
int read(char tipo, long codice, word op = _isequal, word lockop = _nolock);
virtual int remove(TBaseisamfile& f) const;
void cli2doc(TDocumento & doc);
TCli_for(char tipo = ' ', long codice = 0L);
TCli_for(const TRectype & rec);

View File

@ -868,6 +868,8 @@ public:
const TString & codesiva() const;
void get_protocolli_esenzione(TString & esenzione, TString & data_esenzione,
TString & registrazione, TString & data_registrazione) const;
void cli2doc() { clifor().cli2doc(*this); }
TDocumento ();
TDocumento (const TDocumento & d);
TDocumento(char provv, int anno, const char* codnum, long numdoc);

View File

@ -428,8 +428,11 @@ protected:
error_type compile_head_mov(TDocumento&);
// Compila la testata del movimento per le fatture da emettere / ricevere;
error_type compile_head_mov_re(TDocumento&);
bool spalma_spese() const { return get("I2") == "X"; }
// Funzione per distribuire le spese
void split_sp_amount(const real & amount, int decimals);
// Funzione per ricercare il conto di costo/ricavo
error_type search_costo_ricavo(TBill&, const TRiga_documento&);
error_type search_costo_ricavo(TBill& conto, const TRiga_documento& r, real & amount_to_split, const real & valore);
// Funzione per ricercare il conto di costo/ricavo materiali
error_type search_costo_ricavo_mat(TBill&, const TRiga_documento&);
// Funzione per aggiungere la riga iva al TAssoc_array _righe_iva
@ -613,7 +616,9 @@ class TContabilizzazione_analitica : public TElaborazione // velib04f
protected:
bool find_conti_iva_indetraibile(const TRiga_documento& riga, const TBill & bill, TString_array& conti, int annoes, const char tipomov, bool & pareggio);
bool find_conti(const TRiga_documento& riga, TString_array& conti, int annoes, bool riclassifica_fdr_fde, const char tipomov, bool & pareggio);
bool spalma_spese() const { return get("I2") == "X"; }
void split_sp_amount(TAnal_mov & mov, char sezione, bool pareggio, const real & amount, const real & no_ca_amount, int decimals);
bool find_conti(const TRiga_documento& riga, TString_array& conti, int annoes, bool riclassifica_fdr_fde, const char tipomov, real & amount_to_split, real & no_ca_amount, const real & valore, bool & pareggio);
void init();
virtual const TCausale& doc2caus(const TDocumento& doc);
@ -632,6 +637,7 @@ public:
TContabilizzazione_analitica(const char* cod = NULL);
TContabilizzazione_analitica(const TRectype& rec);
TContabilizzazione_analitica(const TContabilizzazione & el);
virtual ~TContabilizzazione_analitica();
};

View File

@ -1597,7 +1597,7 @@ error_type TContabilizzazione::compile_head_mov_re(TDocumento& doc)
return _error;
}
error_type TContabilizzazione::search_costo_ricavo(TBill& conto, const TRiga_documento& r)
error_type TContabilizzazione::search_costo_ricavo(TBill& conto, const TRiga_documento& r, real & amount_to_split, const real & valore)
{
const int items = _search_seq->items();
TLocalisamfile & cli_file = _clifo->lfile(); // YES, arriva qui dentro quando la relazione e' gia' posizionata
@ -1770,6 +1770,11 @@ error_type TContabilizzazione::search_costo_ricavo(TBill& conto, const TRiga_doc
if (!conto.ok() && t == RIGA_SPESEDOC && !__searching)
{
if (spalma_spese())
{
amount_to_split += valore;
return _error;
}
const int rows = r.doc().physical_rows();
int row = -1;
@ -1783,7 +1788,7 @@ error_type TContabilizzazione::search_costo_ricavo(TBill& conto, const TRiga_doc
if (row > 0)
{
__searching = true;
search_costo_ricavo(conto, r.doc()[row]);
search_costo_ricavo(conto, r.doc()[row], amount_to_split, valore);
__searching = false;
}
}
@ -2228,12 +2233,39 @@ bool TContabilizzazione::valid_row_type(const char* rt) const
return !tri.empty();
}
void TContabilizzazione::split_sp_amount(const real & amount, int decimals)
{
TGeneric_distrib d(amount, decimals);
FOR_EACH_ASSOC_OBJECT((*_righe_iva), obj, key, itm)
{
TRectype & r = (TRectype &)*itm;
const real imp = r.get_real(RMI_IMPONIBILE);
d.add(imp);
}
FOR_EACH_ASSOC_OBJECT((*_righe_iva), obj1, key1, itm1)
{
TRectype & r = (TRectype &)*itm1;
real imp = r.get_real(RMI_IMPONIBILE);
const TCodiceIVA i(r.get(RMI_CODIVA));
imp += d.get();
r.put(RMI_IMPONIBILE, imp);
real const imposta = i.imposta(imp);
r.put(RMI_IMPOSTA, imposta);
}
}
error_type TContabilizzazione::compile_rows_mov(TDocumento& doc)
// Compila le righe
{
TString4 tiporiga, codiva1, codiva2;
const int rows = doc.rows();
const int ndec = doc.decimals();
real amount_to_split;
const bool fat_com = doc.tipo().fattura_commerciale();
@ -2280,7 +2312,7 @@ error_type TContabilizzazione::compile_rows_mov(TDocumento& doc)
{
if (!riga_omaggio && r.imponibile().is_zero())
continue;
search_costo_ricavo(conto,r); // l'errore eventuale viene settato qui dentro
search_costo_ricavo(conto, r, amount_to_split, r.imponibile()); // l'errore eventuale viene settato qui dentro
if (good())
{
@ -2330,6 +2362,7 @@ error_type TContabilizzazione::compile_rows_mov(TDocumento& doc)
r.put(RDOC_CODIVA, codiva2); //Restore
}
else
{
if (ritenuta)
{
TCurrency_documento c(r.ritenuta(tipo_rit));
@ -2355,7 +2388,6 @@ error_type TContabilizzazione::compile_rows_mov(TDocumento& doc)
}
}
else
{
if (riga_omaggio)
{
_error = _righe_iva->add_omaggi(r, conto);
@ -2363,40 +2395,39 @@ error_type TContabilizzazione::compile_rows_mov(TDocumento& doc)
_nrow = i;
}
else
{
if (contomat.ok() && contomat != conto && pricemat != 0)
{
TRiga_documento rlav(r);
TRiga_documento rmat(r);
const real prezzo = r.get_real(RDOC_PREZZO);
rmat.put(RDOC_PREZZO, pricemat);
rmat.zero(RDOC_SCONTO);
const real valmat = rmat.imponibile();
const real diff = r.imponibile() - valmat;
if (contomat.ok() && contomat != conto && pricemat != 0)
{
TRiga_documento rlav(r);
TRiga_documento rmat(r);
const real prezzo = r.get_real(RDOC_PREZZO);
rmat.put(RDOC_PREZZO, pricemat);
rmat.zero(RDOC_SCONTO);
const real valmat = rmat.imponibile();
const real diff = r.imponibile() - valmat;
rlav.put(RDOC_PREZZO, diff);
rlav.put(RDOC_QTA, 1);
rlav.zero(RDOC_SCONTO);
rmat.put(RDOC_PREZZO, valmat);
rmat.put(RDOC_QTA, 1);
rmat.zero(RDOC_SCONTO);
_righe_iva->add(rlav, conto);
_righe_iva->add(rmat, contomat);
}
else
_righe_iva->add(r, conto);
}
rlav.put(RDOC_PREZZO, diff);
rlav.put(RDOC_QTA, 1);
rlav.zero(RDOC_SCONTO);
rmat.put(RDOC_PREZZO, valmat);
rmat.put(RDOC_QTA, 1);
rmat.zero(RDOC_SCONTO);
_righe_iva->add(rlav, conto);
_righe_iva->add(rmat, contomat);
}
else
if (conto.ok())
_righe_iva->add(r, conto);
if (r.doc().tipo().calcolo_lordo()) // Si ricorda che calcolo_lordo() e fattura_commerciale() sono esclusivi.
{
// Totalizza per ogni codice iva il lordo
const TString& cod = r.get(RDOC_CODIVA);
if (!_totali_lordi.is_key(cod))
_totali_lordi.add(cod, new real);
real& rl = (real&) _totali_lordi[cod];
rl += r.imponibile(true);
}
if (!ritenuta && r.doc().tipo().calcolo_lordo()) // Si ricorda che calcolo_lordo() e fattura_commerciale() sono esclusivi.
{
// Totalizza per ogni codice iva il lordo
const TString& cod = r.get(RDOC_CODIVA);
if (!_totali_lordi.is_key(cod))
_totali_lordi.add(cod, new real);
real& rl = (real&) _totali_lordi[cod];
rl += r.imponibile(true);
}
}
}
}
}
@ -2408,6 +2439,9 @@ error_type TContabilizzazione::compile_rows_mov(TDocumento& doc)
}
if (amount_to_split != ZERO)
split_sp_amount(amount_to_split, ndec);
if (good() && _righe_iva->empty())
_error = no_rows_error;
@ -2501,6 +2535,7 @@ error_type TContabilizzazione::compile_rows_mov_re(TDocumento& doc)
{
const int rows = doc.rows();
const int ndec = doc.decimals();
real amount_to_split;
_righe_iva->destroy(); // resetta l'assoc_array delle righe di iva
for (int i=1; good() && i<=rows; i++) // browse all this fucked document rows
@ -2512,10 +2547,12 @@ error_type TContabilizzazione::compile_rows_mov_re(TDocumento& doc)
const char tipo = r.tipo().tipo();
// Le righe omaggio senza addebito IVA vanno saltate
const bool riga_omaggio = tipo == RIGA_OMAGGI && r.get_bool(RDOC_ADDIVA);
const bool spesa = r.tipo().tipo() == RIGA_SPESEDOC;
if ((tipo != RIGA_DESCRIZIONI && tipo != RIGA_SCONTI && tipo != RIGA_RETTIFICHE) && !riga_omaggio)
{
TBill conto;
search_costo_ricavo(conto,r); // l'errore eventuale viene settato qui dentro
search_costo_ricavo(conto, r, amount_to_split, r.imponibile()); // l'errore eventuale viene settato qui dentro
if (good())
_righe_iva->add(r, conto);
}
@ -2527,6 +2564,7 @@ error_type TContabilizzazione::compile_rows_mov_re(TDocumento& doc)
}
}
split_sp_amount(amount_to_split, ndec);
if (good() && _righe_iva->items() == 0)
_error = no_rows_error;
@ -3692,7 +3730,7 @@ error_type TContabilizzazione::write_anal(TDocumento& doc, const TMovimentoPN& m
}
if (has_anal_bill)
{
TContabilizzazione_analitica canal;
TContabilizzazione_analitica canal(*this);
const long numreg_cg = movimento.curr().get_long(MOV_NUMREG);
TAnal_mov mov;
canal.elabora(doc, numreg_cg, _viswin, _can_write, mov);

View File

@ -263,9 +263,11 @@ bool TContabilizzazione_analitica::search_costo_ricavo(const TRiga_documento& r,
}
static int __searching = false;
if (!conto.ok() && t == RIGA_SPESEDOC && !__searching)
{
if (spalma_spese())
return true;
const int rows = r.doc().physical_rows();
int row = -1;
@ -367,7 +369,7 @@ bool TContabilizzazione_analitica::find_conti_iva_indetraibile(const TRiga_docum
return !conti.empty();
}
bool TContabilizzazione_analitica::find_conti(const TRiga_documento& riga, TString_array& conti, int annoes, bool riclassifica_fdr_fde, const char tipomov, bool & pareggio)
bool TContabilizzazione_analitica::find_conti(const TRiga_documento& riga, TString_array& conti, int annoes, bool riclassifica_fdr_fde, const char tipomov, real & amount_to_split, real & no_ca_amount, const real & valore, bool & pareggio)
{
bool bArcticleFound = false;
@ -392,8 +394,11 @@ bool TContabilizzazione_analitica::find_conti(const TRiga_documento& riga, TStri
{
if (!search_costo_ricavo(riga, bill, riclassifica_fdr_fde))
return true;
if (!bill.is_analitico())
if (!bill.is_analitico() && !_usepdcc && !riga.is_spese())
{
no_ca_amount += valore;
return true;
}
if (riga.is_articolo())
{
@ -406,8 +411,8 @@ bool TContabilizzazione_analitica::find_conti(const TRiga_documento& riga, TStri
}
else
{
if (riga.is_spese() || riga.is_prestazione() ||
riga.is_risorsa() || riga.is_attrezzatura())
if (riga.is_spese() || riga.is_prestazione() ||
riga.is_risorsa() || riga.is_attrezzatura())
{
const char tipo = riga.tipo().tipo();
const TSpesa_prest spp(riga.get(RDOC_CODART), tipo);
@ -417,6 +422,12 @@ bool TContabilizzazione_analitica::find_conti(const TRiga_documento& riga, TStri
contanal.format("%03d%03d%06ld", bill.gruppo(), bill.conto(), bill.sottoconto());
else
contanal = tipocf == 'F' ? spp.conto_analitico_acquisti() : spp.conto_analitico_vendite() ;
TFilename pname;
if (ini_get_bool(riga.doc().tipo().profile_name(pname), "MAIN", "DistribuzioneSpese", true) &&
riga.is_spese() && (contanal.blank() || atoi(contanal)))
amount_to_split += valore;
}
}
if (!bArcticleFound) // Se l'anagrafica non esiste va bene cosi'
@ -438,28 +449,32 @@ bool TContabilizzazione_analitica::find_conti(const TRiga_documento& riga, TStri
conto.add(100, 4);
conti.add(conto);
}
const TAnal_ripartizioni_batch & rip = _rip.righe(bill, annoes, tipomov);
pareggio = rip.rows() > 0;
for (int i = 1; i <= rip.rows(); i++)
if (bill.ok())
{
const TRectype& rigarip = rip.row(i);
const TAnal_ripartizioni_batch & rip = _rip.righe(bill, annoes, tipomov);
conto = rigarip.get(RRIP_CODCONTO);
pareggio = rip.rows() > 0;
for (int i = 1; i <= rip.rows(); i++)
{
const TRectype& rigarip = rip.row(i);
const TString costo = rigarip.get(RRIP_CODCOSTO);
conto = rigarip.get(RRIP_CODCONTO);
conto.add(costo.full() ? costo : riga_cos, 1);
const TString costo = rigarip.get(RRIP_CODCOSTO);
const TString & commessa = rigarip.get(RRIP_CODCMS);
conto.add(costo.full() ? costo : riga_cos, 1);
conto.add(commessa.full() ? commessa : riga_cms, 2);
const TString & commessa = rigarip.get(RRIP_CODCMS);
const TString & fase = rigarip.get(RRIP_CODFASE);
conto.add(commessa.full() ? commessa : riga_cms, 2);
conto.add(fase.full() ? fase: riga_fsc, 3);
conto.add(rigarip.get(RRIP_RIPARTO), 4);
conti.add(conto);
const TString & fase = rigarip.get(RRIP_CODFASE);
conto.add(fase.full() ? fase: riga_fsc, 3);
conto.add(rigarip.get(RRIP_RIPARTO), 4);
conti.add(conto);
}
}
return !conti.empty();
@ -492,6 +507,37 @@ void TContabilizzazione_analitica::calcola_date_comp(const TDocumento& doc, TDat
annoes = esercizi().date2esc(datacomp); //ci potrebbe andare datacomp? All'analisi l'ardua sentenza
}
void TContabilizzazione_analitica::split_sp_amount(TAnal_mov & mov, char sezione, bool pareggio, const real & amount, const real & no_ca_amount, int decimals)
{
TGeneric_distrib w(amount, decimals);
w.add(mov.get_real(MOVANA_TOTDOC));
w.add(no_ca_amount);
const real ca_amount = w.get();
TGeneric_distrib d(ca_amount, decimals);
const int rows = mov.rows();
for (int i = pareggio ? 2 : 1; i <= rows; i++)
{
TRectype& r = mov.body()[i];
TImporto imp(r.get_char(RMOVANA_SEZIONE), r.get_real(RMOVANA_IMPORTO));
imp.normalize(sezione);
d.add(imp.valore());
}
for (int i = pareggio ? 2 : 1; i <= rows; i++)
{
TRectype& r = mov.body()[i];
TImporto imp(r.get_char(RMOVANA_SEZIONE), r.get_real(RMOVANA_IMPORTO));
imp += TImporto(imp.sezione(), d.get());
imp.normalize();
r.put(RMOVANA_IMPORTO, imp.valore());
r.put(RMOVANA_SEZIONE, imp.sezione());
}
}
bool TContabilizzazione_analitica::elabora(TDocumento& doc, long numreg_cg, TViswin* viswin, bool can_write, TAnal_mov& mov, bool riclassifica_fdr_fde)
{
TDate datareg, datacomp, datafcomp;
@ -579,6 +625,9 @@ bool TContabilizzazione_analitica::elabora(TDocumento& doc, long numreg_cg, TVis
const TipoIVA tiva = caus.iva();
const bool vendita = tiva == iva_vendite;
TBill bill; caus.bill(RIGA_IVA_NON_DETRAIBILE, bill);
bool has_pareggio = false;
real amount_to_split;
real no_ca_amount;
// Scandisco le righe del documento,
const int righe_doc = doc.physical_rows(); //ignora sconti ed esenzioni (sennò sarebbe doc.rows()
@ -652,7 +701,7 @@ bool TContabilizzazione_analitica::elabora(TDocumento& doc, long numreg_cg, TVis
TString_array conti;
const char tipomov = mov.get_char(MOVANA_TIPOMOV);
const bool ok = find_conti(riga, conti, annoes, riclassifica_fdr_fde, tipomov, pareggio);
const bool ok = find_conti(riga, conti, annoes, riclassifica_fdr_fde, tipomov, amount_to_split, no_ca_amount, valore, pareggio);
if (!ok)
{
if (viswin != NULL)
@ -690,6 +739,7 @@ bool TContabilizzazione_analitica::elabora(TDocumento& doc, long numreg_cg, TVis
rmov.put(RMOVANA_IMPORTO, imp.valore());
totdoc += imp;
}
has_pareggio |= pareggio;
}
if (_usepdcc)
@ -746,6 +796,9 @@ bool TContabilizzazione_analitica::elabora(TDocumento& doc, long numreg_cg, TVis
}
}
if (amount_to_split != ZERO)
split_sp_amount(mov, sezione, has_pareggio, amount_to_split, no_ca_amount, doc.decimals());
if (can_write && mov.rows() > 0)
{
totdoc.normalize();
@ -894,6 +947,13 @@ TContabilizzazione_analitica::TContabilizzazione_analitica(const TRectype& rec)
init();
}
TContabilizzazione_analitica::TContabilizzazione_analitica(const TContabilizzazione & el)
: TElaborazione(el), _error(no_error), _caus(NULL)
{
put("I0", 7);
init();
}
TContabilizzazione_analitica::~TContabilizzazione_analitica()
{
if (_caus != NULL)

View File

@ -82,6 +82,7 @@
#define F_USA_DOCRIF 331
#define F_RIF_DOCIN 332
#define F_COMMESSA 333
#define F_SPALMA 334
#define F_PREZZO_DA_ORDINE 340
#define F_AGGIORNA_PREZZO 341

View File

@ -741,9 +741,18 @@ BEGIN
FIELD B8
END
LISTBOX F_SPALMA 1 12
BEGIN
PROMPT 2 17 "Spalma le spese"
ITEM " |Non spalmare"
ITEM "X|Spalma"
FIELD I2
GROUP 3 9
END
STRING F_RIF_DOCIN 4
BEGIN
PROMPT 2 17 "Numerazione documenti in entrata "
PROMPT 40 17 "Numerazione documenti in entrata"
USE %NUM
INPUT CODTAB F_RIF_DOCIN
DISPLAY "Codice" CODTAB