diff --git a/ve/velib04b.cpp b/ve/velib04b.cpp index 2ee19d7b9..9956ad3b8 100755 --- a/ve/velib04b.cpp +++ b/ve/velib04b.cpp @@ -1,8 +1,5 @@ -#include #include #include -#include -#include #include #include @@ -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); diff --git a/ve/velib06.cpp b/ve/velib06.cpp index 66af47a6d..6095fc95c 100755 --- a/ve/velib06.cpp +++ b/ve/velib06.cpp @@ -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(); diff --git a/ve/velib06a.cpp b/ve/velib06a.cpp index 6268fc814..58dcafee4 100755 --- a/ve/velib06a.cpp +++ b/ve/velib06a.cpp @@ -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);