Patch level :4.0 nopatch

Files correlati     :
Ricompilazione Demo : [ ]
Commento            :gestione saldo/acconto avanzata nel trasferimento a proforma


git-svn-id: svn://10.65.10.50/trunk@14966 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
luca 2007-02-28 14:33:29 +00:00
parent 58999ae889
commit cee65844db

View File

@ -17,6 +17,7 @@
#include "../ca/calib01.h"
#include "../ca/movana.h"
#include "../ca/rmovana.h"
#include "../ve/velib.h"
#include <doc.h>
#include <rdoc.h>
@ -1199,7 +1200,7 @@ long TInvioP::calcola_fattura_originale(long nreg) const
struct TPay_info : public TObject
{
real _somma;
char _accsal;
char _as;
};
bool TInvioP::i_proforma_pagamenti()
@ -1284,7 +1285,7 @@ bool TInvioP::i_proforma_pagamenti()
if (pi == NULL)
{
pi = new TPay_info;
pi->_accsal = 'A';
pi->_as = 'A';
pagame.add(indice, pi);
}
@ -1292,7 +1293,7 @@ bool TInvioP::i_proforma_pagamenti()
const real importo_pagato = calcola_pagamento(curpag_rec, iva_indet);
pi->_somma += importo_pagato;
if (curpag_rec.get_char(PAGSCA_ACCSAL) == 'S')
pi->_accsal = 'S';
pi->_as = 'S';
}
// scrive i record risultanti
@ -1306,11 +1307,115 @@ bool TInvioP::i_proforma_pagamenti()
keypart.add(pagame.get_hashobj()->key());
const TRectype& fattura = cache().get(LF_PARTITE, keypart);
_nregpag = cur_rec.get_long(MOV_NUMREG); //registrazione del movimento di pagamento
//deve cercare la prima registrazione da cui deriva il pagamento..
const long nregfatt = fattura.get_long(PART_NREG);
_nregcosto = calcola_fattura_originale(nregfatt);
_importo = pi->_somma;
_accsal = pi->_accsal;
//acconto/saldo in modo standard
_accsal = pi->_as;
//Casino plutonico dell'acconto-saldo in ottica CSA
//Se il doc in esame discende da una FDR (fattura da ricevere) e' necessario..
//..cercare tutte le righe dei documenti che pagano tale FDR e sommare gli importi di tali..
//..rdocs con quello corrente; solo se tale somma risulatsse >= del totale delle righe..
//..della FDR originale il flag _accsal deve essere messo a saldo 'S'
if (_nregcosto != nregfatt)
{
//deve risalire al documento FDR del movimento _nregcosto
const TRectype& mov_fdr = cache().get(LF_MOV, _nregcosto);
const TString8 fdr_codnum = mov_fdr.get(MOV_DCODNUM);
const int fdr_anno = mov_fdr.get_int(MOV_DANNO);
const char fdr_provv = mov_fdr.get_char(MOV_DPROVV);
const long fdr_ndoc = mov_fdr.get_long(MOV_DNDOC);
//adesso che ha la chiave del documento padre FDR, deve crearsi la query..
//..su RDOC alla ricerca di tutte le righe doc che discendono dall'FDR..
//..In pratica cerca le "sorelle" dell'attuale fattura nregfatt
TString query;
query << "USE RDOC KEY 4";
query << "\nFROM DACODNUM=" << fdr_codnum << " DAANNO=" << fdr_anno << " DAPROVV=" << fdr_provv << " DANDOC=" << fdr_ndoc;
query << "\nTO DACODNUM=" << fdr_codnum << " DAANNO=" << fdr_anno << " DAPROVV=" << fdr_provv << " DANDOC=" << fdr_ndoc;
TISAM_recordset recset(query);
const int righe_delle_sorelle = recset.items();
TAssoc_array sorelle;
TToken_string key;
//cerco la mia data di fattura;
const TDate datadoc_fattura = cache().get(LF_MOV, nregfatt, MOV_DATAREG);
//dalle righe risale ai documenti di tali righe (che posssono essere meno)
for (bool ok = recset.move_first(); ok; ok = recset.move_next())
{
key = recset.get(RDOC_PROVV).as_string();
key.add(recset.get(RDOC_ANNO).as_string());
key.add(recset.get(RDOC_CODNUM).as_string());
key.add(recset.get(RDOC_NDOC).as_string());
const TDate datadoc = cache().get(LF_DOC, key, DOC_DATADOC);
//se non sono l'ultima fattura (sorella piu' giovane) allora e'..
//..sicuramente Acconto! Quindi esce dai cicli for e if
if (datadoc > datadoc_fattura)
{
sorelle.destroy();
_accsal = 'A';
break;
}
//accresce l'array delle sorelle
sorelle.add(key, key);
}
//tutto il casino s'ha da fare solo in caso ci sia piu' di una fattura..
//.."sorella" di quella in esame
if (sorelle.items() > 1)
{
real importo_totale_sorelle;
//giro su tutti i documenti delle sorelle
FOR_EACH_ASSOC_OBJECT(sorelle, obj, chiave, itm)
{
TToken_string& ts = *(TToken_string*)itm;
TDocumento sorella(ts.get_char(0), ts.get_int(1), ts.get(2), ts.get_long(3));
//per ogni documento deve cercare le righe discendenti dall'FDR
for (int r = 1; r <= sorella.rows(); r++)
{
const TRiga_documento nipotina = sorella[r];
//servono solo le righe discendenti dall'FDR madre!
if (nipotina.get(RDOC_DACODNUM) == fdr_codnum && nipotina.get_int(RDOC_DAANNO) == fdr_anno &&
nipotina.get_char(RDOC_DAPROVV) == fdr_provv && nipotina.get_long(RDOC_DANDOC) == fdr_ndoc)
{
const real importo_da_aggiungere = nipotina.importo(true, false); //importo scontato netto
importo_totale_sorelle += importo_da_aggiungere;
}
}
} //FOR_EACH_ASSOC..
//Se arriva fin qui la fattura in esame e' la sorella piu' giovane; adesso..
//..deve controllare se gli importi di tutte le sorelle sommati saldano..
//..o meno l'importo dell'originale mamma FDR...
//intanto ha bisogno del totale documento FDR originale a partire dal movimento FDR...
real totale_fdr = ZERO;
TMovimentoPN movimento_fdr;
movimento_fdr.curr().put(MOV_NUMREG, _nregcosto);
if (movimento_fdr.read() == NOERR)
totale_fdr = totale_documento(movimento_fdr, false); //non include ritenute
real rimanenza = totale_fdr - importo_totale_sorelle;
//arrotonda
rimanenza.round();
//Se l'importo e' inferiore la FDR non e' ancora stata saldata (nasceranno..
//..una o piu' sorelle per saldare mamma FDR in futuro)
if (rimanenza > ZERO)
_accsal = 'A';
//Se l'importo e' >= -> la mamma e' saldata e non sono previste ulteriori..
//..sorelle (per la felicita' del papa'!)
else
_accsal = 'S';
} //if(sorelle.items()>1..
} //if(_nregcosto!=nregfatt..
//..e finalmente scrive 'sta minchia di riga
TRecord_text recpag;
recpag.set_type("G");
@ -1328,7 +1433,7 @@ bool TInvioP::i_proforma_pagamenti()
trasfilepag->autoload(recpag, curpag);
trasfilepag->write(recpag);
}
}
} //for(
}//if curpag_items..
}//for curpart =..