Corretta ricontabilizzazione fatture aventi pagamenti già effettuati (soprattutto anticipi)

git-svn-id: svn://10.65.10.50/branches/R_10_00@22715 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2012-07-19 12:34:23 +00:00
parent 2180d9f27f
commit 065f1c7ea7
3 changed files with 83 additions and 55 deletions

View File

@ -1,8 +1,5 @@
#include <diction.h>
#include <dongle.h>
#include <execp.h>
#include <modaut.h>
#include <tabutil.h>
#include <printer.h>
#include <viswin.h>
@ -2863,11 +2860,11 @@ error_type TContabilizzazione::write_scadenze(TDocumento& doc)
// Crea una rimessa diretta con la data del documento per il valore dell'anticipo
pag.set_rata(0, in_valuta ? anticipo.get_num() : ZERO, anticipo_base.get_num(), first_date, 1, "", false);
}
const int nr = pag.n_rate();
real imponibile, imponibile_val;
int i;
for (i = pag.n_rate()-1; i >= 0; i--)
for (int i = nr-1; i >= 0; i--)
{
if (in_valuta)
imponibile_val += pag.tval_rata(i);
@ -2878,17 +2875,24 @@ error_type TContabilizzazione::write_scadenze(TDocumento& doc)
partita.put(PART_IMPOSTA, imposte);
partita.put(PART_SPESE, totspese.get_num());
newgame->scollega_pagamenti(nuova_riga); // Sempre meglio che perderli, ma andrebbero ricollegati
partita.elimina_rata(-1); // Elimina tutte le rate eventuali
// Se sto ricontabilizzando meno rate di quante esistevano prima!
if (nr < partita.rate())
{
// Collega eventuali pagamenti. Smpre meglio che perderli
newgame->scollega_pagamenti(nuova_riga, nr+1);
// Elimina tutte le rate in eccesso
for (int i = partita.rate(); i > nr; i--)
partita.elimina_rata(i);
}
const TString8 abipr(doc.get(DOC_CODABIP)), cabpr(doc.get(DOC_CODCABP)),
abi(doc.get(DOC_CODABIA)), cab(doc.get(DOC_CODCABA));
const int nr = pag.n_rate();
const TString16 codpag(head.get(MOV_CODPAG));
for (i = 0; i < nr; i++)
const TString8 codpag(head.get(MOV_CODPAG));
for (int i = 0; i < nr; i++)
{
TRiga_scadenze& scadenza = partita.new_row();
TRiga_scadenze* prs = i < partita.rate() ? &partita.rata(i+1) : &partita.new_row(i+1);
TRiga_scadenze& scadenza = *prs;
scadenza.put(SCAD_CODPAG, codpag); // Codice pagamento
scadenza.put(SCAD_CODAG, agente); // Codice agente
@ -3084,7 +3088,8 @@ error_type TContabilizzazione::write_all(TDocumento& doc, TMovimentoPN_VE & movi
// Aggiorno subito i saldi
aggiorna_saldi(saldo, movimento, true);
if (sc_enabled(head.get_date(MOV_DATAREG)))
const bool has_sc = sc_enabled(head.get_date(MOV_DATAREG));
if (has_sc)
write_scadenze(doc);
if (good() && in_enabled())
@ -3099,9 +3104,11 @@ error_type TContabilizzazione::write_all(TDocumento& doc, TMovimentoPN_VE & movi
if (good() && dongle().active(M77AUT) && do_770)
write_percip(doc, movimento);
if (doc.get_real(DOC_IMPPAGATO) != ZERO)
if (has_sc && !doc.get_real(DOC_IMPPAGATO).is_zero())
{
if (write_anticipo(doc) != no_error)
movimento.remove(); // Se si è verificato un errore nella scrittura dell'anticipo rimuove il movimento di prima nota
}
if (good())
{
@ -3374,45 +3381,16 @@ error_type TContabilizzazione::compile_rows_anticipo(TDocumento& doc)
error_type TContabilizzazione::write_pagamento_anticipo(TDocumento& doc)
{
TLocalisamfile& mov = _anticipo->lfile();
const TRectype& mov = _anticipo->curr();
const int anno = mov.get_date(MOV_DATAREG).year();
TString numpart(mov.get(MOV_NUMDOC)); // Nessun controllo se prot.iva o numdoc xche' tanto proviene dal mov precedentemente scritto
TPartita * partita = new TPartita(_co_cliente,anno,numpart);
partita->allinea();
TRiga_partite& riga_part = partita->new_row();
// Compila la riga di partita per il pagamento
riga_part.put(PART_TIPOMOV,_caus->tipomov());
riga_part.put(PART_TIPOPAG, 1 ); // Pagamento in contanti-> tipo 1
riga_part.put(PART_NREG,mov.get_long(MOV_NUMREG));
riga_part.put(PART_NUMRIG,1); // Riferimento alla riga 1 del movimento
riga_part.put(PART_DATAREG,mov.get_date(MOV_DATAREG));
riga_part.put(PART_DATADOC,mov.get_date(MOV_DATADOC));
riga_part.put(PART_DATAPAG,mov.get_date(MOV_DATADOC));
riga_part.put(PART_NUMDOC,numpart); // E' lo stesso riferimento
riga_part.put(PART_SEZ,sezione());
riga_part.put(PART_CODCAUS, _caus->codice());
const long numreg = mov.get_long(MOV_NUMREG);
const TString16 numpart(mov.get(MOV_NUMDOC)); // Nessun controllo se prot.iva o numdoc xche' tanto proviene dal mov precedentemente scritto
TCurrency_documento impval(doc.get_real(DOC_IMPPAGATO), doc);
TCurrency_documento imp(impval); imp.change_to_firm_val();
real cambio = doc.get_real(DOC_CAMBIO);
TString16 val(doc.get(DOC_CODVAL));
TDate datacam(doc.get_date(DOC_DATACAMBIO));
const bool valuta = val.not_empty();
riga_part.put(PART_IMPORTO,imp.get_num());
riga_part.put(PART_IMPORTOVAL,impval.get_num());
riga_part.put(PART_IMPTOTDOC,imp.get_num());
riga_part.put(PART_IMPTOTVAL,impval.get_num());
riga_part.put(PART_CODVAL,val);
riga_part.put(PART_CAMBIO,cambio);
riga_part.put(PART_DATACAM,doc.get_date(DOC_DATACAMBIO));
riga_part.put(PART_TIPOCF,_co_cliente.tipo());
riga_part.put(PART_SOTTOCONTO,_co_cliente.sottoconto());
riga_part.put(PART_DESCR, mov.get(MOV_DESCR));
TPartita* partita = new TPartita(_co_cliente,anno,numpart);
partita->allinea();
// Compila la riga di pagamento:
// reperire il numero della riga partita (nrigp) appena aggiunta
int nriga = (int) TPartita::UNASSIGNED, nrigp = riga_part.get_int(PART_NRIGA);
int nriga = (int) TPartita::UNASSIGNED;
// Cerca la riga di partita con riferimento alla fattura che si sta pagando
for (int r = partita->last(); r > 0; r = partita->pred(r))
{
@ -3434,6 +3412,52 @@ error_type TContabilizzazione::write_pagamento_anticipo(TDocumento& doc)
delete partita;
return write_part_error;
}
int nrigp = partita->primo_pagamento(numreg);
if (nrigp > 0)
{
const TRiga_partite& rfatt = partita->riga(nriga);
for (int r = rfatt.rate(); r > 0; r--)
partita->elimina_pagamento(nriga, r, nrigp);
partita->elimina_pagamento(TPartita::UNASSIGNED, TPartita::UNASSIGNED, nrigp);
if (partita->esiste(nrigp)) // Non dovrebbe succedere mai
nrigp = 0;
}
// Cerco di riutilizzare lo stesso nrigp della eventuale contabilizzazione precedente
TRiga_partite& riga_part = partita->new_row(nrigp);
nrigp = riga_part.get_int(PART_NRIGA);
// Compila la riga di partita per il pagamento
riga_part.put(PART_TIPOMOV,_caus->tipomov());
riga_part.put(PART_TIPOPAG, 1 ); // Pagamento in contanti-> tipo 1
riga_part.put(PART_NREG, numreg);
riga_part.put(PART_NUMRIG,1); // Riferimento alla riga 1 del movimento
riga_part.put(PART_DATAREG, mov.get_date(MOV_DATAREG));
riga_part.put(PART_DATADOC, mov.get_date(MOV_DATADOC));
riga_part.put(PART_DATAPAG, mov.get_date(MOV_DATADOC));
riga_part.put(PART_NUMDOC, numpart); // E' lo stesso riferimento
riga_part.put(PART_SEZ, sezione());
riga_part.put(PART_CODCAUS, _caus->codice());
TCurrency_documento impval(doc.get_real(DOC_IMPPAGATO), doc);
TCurrency_documento imp(impval); imp.change_to_firm_val();
real cambio = doc.get_real(DOC_CAMBIO);
TString16 val(doc.get(DOC_CODVAL));
TDate datacam(doc.get_date(DOC_DATACAMBIO));
const bool valuta = val.not_empty();
riga_part.put(PART_IMPORTO,imp.get_num());
riga_part.put(PART_IMPORTOVAL,impval.get_num());
riga_part.put(PART_IMPTOTDOC,imp.get_num());
riga_part.put(PART_IMPTOTVAL,impval.get_num());
riga_part.put(PART_CODVAL,val);
riga_part.put(PART_CAMBIO,cambio);
riga_part.put(PART_DATACAM,doc.get_date(DOC_DATACAMBIO));
riga_part.put(PART_TIPOCF,_co_cliente.tipo());
riga_part.put(PART_SOTTOCONTO,_co_cliente.sottoconto());
riga_part.put(PART_DESCR, mov.get(MOV_DESCR));
// Compila la riga di pagamento:
// Scorre le scadenze di questa fattura, e ne completa il pagamento partendo
// dalla rata piu' vecchia.
@ -3445,7 +3469,7 @@ error_type TContabilizzazione::write_pagamento_anticipo(TDocumento& doc)
TImporto old_abb, old_diffcam, new_abb, new_diffcam;
const int nrate = rpp.rate();
const bool is_saldo_doc = doc.get_bool(DOC_ACCSALDO);
char s_a;
char s_a = 'A';
for (int i=1; i<=nrate; i++)
{
TRiga_scadenze& rs = rpp.rata(i);

View File

@ -1463,7 +1463,7 @@ TVariable_mask* TDocumento_mask::riga_mask(int numriga)
if (browse )
{
const TCursor * cur = browse->cursor();
const TCursor* cur = browse->cursor();
if (cur)
{
const int num = cur->file().num();

View File

@ -615,8 +615,8 @@ bool tipo_riga_handler(TMask_field& f, KEY key)
{
const int curr_row = sf->selected();
TToken_string & row = sf->row(curr_row);
const TString16 old_tipo_riga = docmask.doc()[curr_row + 1].get(RDOC_TIPORIGA);
const TString16 tipo_riga = f.get();
const TString4 old_tipo_riga = docmask.doc()[curr_row + 1].get(RDOC_TIPORIGA);
const TString4 tipo_riga = f.get();
if (old_tipo_riga != tipo_riga)
{
@ -625,12 +625,15 @@ bool tipo_riga_handler(TMask_field& f, KEY key)
docmask.doc()[curr_row + 1].set_tipo(tipo_riga);
sf->post_insert(curr_row);
sf->check_row(curr_row);
const TTipo_riga_documento t(tipo_riga);
t.set_defaults(*sf, curr_row + 1);
sf->force_update(curr_row);
}
else
{
f.set(old_tipo_riga);
return f.error_box("Impossibile cambiare il tipo nella maschera di riga");
return f.error_box(TR("Impossibile cambiare il tipo nella maschera di riga"));
}
}
}
@ -1882,7 +1885,8 @@ bool codartmag_handler( TMask_field& f, KEY key )
if (key == K_TAB)
{
const bool artmag = !f.empty() && TRiga_documento::tipo(m.get(FR_TIPORIGA)).is_merce();
// const bool artmag = !f.empty() && TRiga_documento::tipo(m.get(FR_TIPORIGA)).is_merce();
const bool artmag = !f.empty() && !cache().get(LF_ANAMAG, f.get()).empty();
m.show(FR_UMQTA, artmag);
m.show(FR_UMQTA2, !artmag);