Patch level : 10.0 218

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

Contabilizzazione schede percipiente


git-svn-id: svn://10.65.10.50/trunk@18167 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
alex 2009-01-30 17:06:03 +00:00
parent d69a5b2854
commit fff659f797

View File

@ -29,6 +29,10 @@
#include "../in/inlib01.h"
#include "../mg/anamag.h"
#include "../ca/movana.h"
#include "../m770/scperc.h"
#include "../m770/rpag.h"
#include "../m770/rver.h"
#include "../m770/perc.h"
#include <comuni.h>
#include <unloc.h>
@ -2787,7 +2791,13 @@ error_type TContabilizzazione::write_all(TDocumento& doc, TMovimentoPN_VE & movi
if (good() && (dongle().active(CMAUT) || dongle().active(CAAUT)))
write_anal(doc, movimento);
if (doc.get_real(DOC_IMPPAGATO) != ZERO)
const int tipocoll = _caus->link_m770();
const bool do_770 = tipocoll == 1 || tipocoll == 5 || tipocoll == 6;
if (good() && dongle().active(M77AUT) && do_770)
write_percip(doc, movimento);
if (doc.get_real(DOC_IMPPAGATO) != ZERO)
if (write_anticipo(doc) != no_error)
movimento.remove(); // Se si è verificato un errore nella scrittura dell'anticipo rimuove il movimento di prima nota
@ -3530,6 +3540,229 @@ error_type TContabilizzazione::write_anal(TDocumento& doc, const TMovimentoPN& m
return _error;
}
error_type TContabilizzazione::write_percip(TDocumento& doc, const TMovimentoPN& movimento)
{
const char tipopercip = doc.clifor().get_char(CLI_TIPOAPER);
const long codpercip = doc.clifor().get_long(CLI_CODANAGPER);
if (codpercip > 0L)
{
TBit_array to_delete;
TArray schede;
TLocalisamfile schperc(LF_SCPERC);
TLocalisamfile rpag(LF_RPAG);
TLocalisamfile rver(LF_RVER);
TLocalisamfile perc(LF_PERC);
const long numreg = movimento.lfile().get_long(MOV_NUMREG);
int numsch = 0;
schperc.setkey(3);
schperc.put(SCH_CODDITTA, prefix().firm().codice());
schperc.put(SCH_NUMREG, numreg);
TRectype schcmp(schperc.curr());
int err;
for (err = schperc.read(_isgteq); err == NOERR && schperc.curr() == schcmp; err = schperc.next())
{
schede.add(schperc.curr());
to_delete.set(numsch++);
}
bool changed_percip = (numsch == 0) || (tipopercip != ((TRectype &) schede[0]).get_char(SCH_TIPOA)) ||
(codpercip != ((TRectype &) schede[0]).get_long(SCH_CODANAGR));
int newprog = 0L;
const int orig_numsch = numsch;
const int doc_rows = doc.physical_rows();
int i = 1;
schperc.setkey(1);
schperc.zero();
schperc.put(SCH_CODDITTA, prefix().firm().codice());
schperc.put(SCH_TIPOA, tipopercip);
schperc.put(SCH_CODANAGR, codpercip);
schcmp = schperc.curr();
schperc.put(SCH_NPROG, 9999);
if (schperc.read(_isgteq) == NOERR)
schperc.prev();
if (schperc.curr() == schcmp)
newprog = schperc.get_int(SCH_NPROG);
newprog++;
for (i = 1; i <= doc_rows; i++)
{
const TRiga_documento & row = doc[i];
if (row.is_spese())
{
const TSpesa_prest & sp = row.spesa();
if (sp.tipo_ritenuta() == 'F')
{
const int caus_770 = sp.caus_770();
if (caus_770 > 0)
{
TString val ;
bool found = false;
int j = 0;
int recpos = -1;
val.format("%02d", caus_770);
if (!changed_percip)
for (j = 0; recpos < 0 && j < numsch; j++)
{
TRectype & rec = (TRectype &) schede[j];
if (val == rec.get(SCH_CODCAUS))
recpos = j;
}
TRectype * schrow = NULL;
bool reset_row = false;
if (recpos >= 0)
schrow = (TRectype *) schede.objptr(recpos);
else
{
schrow = new TRectype(LF_SCPERC);
schrow->put(SCH_CODDITTA, prefix().firm().codice());
schrow->put(SCH_TIPOA, tipopercip);
schrow->put(SCH_CODANAGR, codpercip);
schrow->put(SCH_NPROG, newprog++);
schrow->put(SCH_NUMREG, numreg);
schede.add(schrow);
recpos = numsch++;
}
const TRectype & rec_caus = cache().get("%CA7", val);
schrow->put(SCH_CODCAUS, val);
const TDate datarif = doc.get_date(DOC_DATADOCRIF);
schrow->put(SCH_DATADOC, datarif);
const TString & docnum = doc.get(DOC_NUMDOCRIF);
schrow->put(SCH_NUMDOC, docnum);
const real ritenuta = doc.ritenute('F');
const real spese = doc.get_real("SP770");
schrow->put(SCH_COMPENSO, doc.imponibile() - spese);
schrow->put(SCH_SPESE, spese);
schrow->put(SCH_IVA, doc.imposta());
schrow->put(SCH_TOTALE, doc.totale_doc());
schrow->put(SCH_TOTRIT, ritenuta);
schrow->put(SCH_RITSOC, doc.ritenute('S'));
const TDate datadoc = doc.get_date(DOC_DATADOC);
schrow->put(SCH_MESEC, datadoc.month());
schrow->put(SCH_ANNOC, datadoc.year());
schrow->put(SCH_CAUSQUA, rec_caus.get("S1"));
schrow->put(SCH_FLAGTS, rec_caus.get("S4"));
// i pagamenti non sono gestiti qui per ora
to_delete.reset(recpos);
}
}
}
}
err = NOERR;
for (i = 0; err == NOERR && i < numsch; i++)
{
TRectype & rec = (TRectype &) schede[i];
const char tipo = rec.get_char(SCH_TIPOA);
const long codanagr = rec.get_long(SCH_CODANAGR);
if (to_delete[i])
{
TToken_string msg(256, '.');
const int nprog = rec.get_int(SCH_NPROG);
msg.format("Sono state eliminate le righe di pagamento e versamento relative alla scheda %c/%ld/%d."
"Dovranno quindi essere ripristinate dell'utente.", tipo, codanagr, nprog);
err = rec.remove(schperc);
rver.curr().zero();
rver.put(VER_CODDITTA, prefix().firm().codice());
rver.put(VER_TIPOA, tipopercip);
rver.put(VER_CODANAGR, codpercip);
rver.put(VER_NPROG, nprog);
const TRectype rvercmp(rver.curr());
bool removed = false;
for (int errver = rver.read(_isgteq); errver == NOERR && rver.curr() == rvercmp; errver = rver.next())
{
rver.remove();
}
if (removed)
msg.format("Sono state eliminate le righe di versamento relative alla scheda %c/%ld/%d."
"Dovranno quindi essere ripristinate dell'utente.", tipo, codanagr, nprog);
rpag.curr().zero();
rver.put(PAG_CODDITTA, prefix().firm().codice());
rver.put(PAG_TIPOA, tipopercip);
rver.put(PAG_CODANAGR, codpercip);
rver.put(PAG_NPROG, nprog);
const TRectype rpagcmp(rpag.curr());
removed = false;
for (int errpag = rpag.read(_isgteq); errpag == NOERR && rpag.curr() == rpagcmp; errpag = rpag.next())
{
removed = true;
rpag.remove();
}
if (removed)
{
TString s;
s.format("Sono state eliminate le righe di pagamento relative alla scheda %c/%ld/%d."
"Dovranno quindi essere ripristinate dell'utente.", tipo, codanagr, nprog);
msg << s;
}
if (_viswin && msg.full())
{
TString riga;
FOR_EACH_TOKEN(msg, line)
{
if (*line)
{
riga = riga.empty() ? "*** " : " ";
riga << line << '.';
_viswin->add_line(riga);
}
}
}
else
message_box(msg);
}
else
if (i < orig_numsch)
{
err = rec.rewrite(schperc);
if (err == _iskeynotfound)
err = rec.write(schperc);
}
else
{
err = rec.write(schperc);
while (err == _isreinsert)
{
int newprog = rec.get_int(SCH_NPROG) + 1;
rec.put(SCH_NPROG, newprog);
err = rec.rewrite(schperc);
}
}
perc.zero();
perc.put(PRC_CODDITTA, prefix().firm().codice());
perc.put(PRC_TIPOA, tipo);
perc.put(PRC_CODANAGR, codanagr);
perc.write();
}
if (err != NOERR)
_error = m770_write_error;
}
return _error;
}
void TContabilizzazione::aggiorna_saldi(TSaldo_agg& saldo, TMovimentoPN& mv, bool save)
{
const TRectype& mov = mv.curr();
@ -3713,7 +3946,11 @@ void TContabilizzazione::display_error(TDocumento& doc)
"E' necessario contabilizzare tutti i documenti in sequenza.",
(const char*)numerazione, numero);
break;
default: // errori generici o non indicati vengono visualizzati nel punto dell'errore
case m770_write_error:
msg.format("Errore in scrittura della scheda percipiente relativa\nal documento %s/%ld.",
(const char*)numerazione, numero);
break;
default: // errori generici o non indicati vengono visualizzati nel punto dell'errore
//msg.format("E' stato rilevato un errore generico contabilizzando il documento %s/%ld.",
// (const char*)numerazione,numero);
break;