From e0f1f18c7e68b61529e0a0c0a27c148473cac7bf Mon Sep 17 00:00:00 2001 From: guy Date: Fri, 1 Sep 1995 15:06:35 +0000 Subject: [PATCH] Gestione saldaconto git-svn-id: svn://10.65.10.50/trunk@1776 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- cg/cg2100.cpp | 3 +- cg/cg2100p.h | 3 +- cg/cg2100p.uml | 3 +- cg/cg2100s.uml | 3 - cg/cg2102.h | 1 + cg/cg2105.cpp | 355 +++++++++++++++++++++++++++++------------------- cg/saldacon.cpp | 139 ++++++++++++------- cg/saldacon.h | 27 ++-- 8 files changed, 326 insertions(+), 208 deletions(-) diff --git a/cg/cg2100.cpp b/cg/cg2100.cpp index 80511012d..269c3fed9 100755 --- a/cg/cg2100.cpp +++ b/cg/cg2100.cpp @@ -312,7 +312,7 @@ bool TPrimanota_application::read_caus(const char* cod, int year) char tipr = ' '; if (_is_saldaconto) { - if (nriga < 12 && nriga != 10) continue; // Si considerano solo le spese + if (nriga < 13 && nriga != 10) continue; // Si considerano solo le spese tipr = 'G'; } const int pos = set_cgs_row(-1, zero, tc, desc, tipr); @@ -564,6 +564,7 @@ void TPrimanota_application::init_modify_mode(TMask& m) { const long numreg = m.get_long(F_NUMREG); partite().add_numreg(numreg); + remove_unassigned(); } } diff --git a/cg/cg2100p.h b/cg/cg2100p.h index f2435741f..4963deb8a 100755 --- a/cg/cg2100p.h +++ b/cg/cg2100p.h @@ -7,7 +7,8 @@ #define P_ANNO 107 #define P_NUMERO 108 #define P_SHOWALL 180 -#define P_SCAMBIO 190 +#define P_SCAMBIO 181 +#define P_NUOVO 182 #define P_PARTITE 201 #define P_SCADENZE 202 diff --git a/cg/cg2100p.uml b/cg/cg2100p.uml index efb2964f0..193503aa2 100755 --- a/cg/cg2100p.uml +++ b/cg/cg2100p.uml @@ -2,9 +2,10 @@ TOOLBAR "" 0 20 0 2 -BUTTON DLG_NEWREC 10 2 +BUTTON P_NUOVO 10 2 BEGIN PROMPT -12 -1 "~Nuovo" + PICTURE 105 END BUTTON DLG_OK 10 2 diff --git a/cg/cg2100s.uml b/cg/cg2100s.uml index 0ccc33607..d0a4417c1 100755 --- a/cg/cg2100s.uml +++ b/cg/cg2100s.uml @@ -125,10 +125,7 @@ BEGIN PROMPT 2 8 "Importo pagamento " PICTURE "." FLAGS "U" - WARNING "Inserire un importo inferiore al residuo" FIELD IMPORTO - MESSAGE EMPTY CLEAR,S_RITENUTE - MESSAGE ENABLE,S_RITENUTE END NUMBER S_IMPORTOVAL 15 2 diff --git a/cg/cg2102.h b/cg/cg2102.h index 5375cf897..5042f803e 100755 --- a/cg/cg2102.h +++ b/cg/cg2102.h @@ -224,6 +224,7 @@ protected: bool notify_cgline_deletion(int numrig); bool notify_edit_pagamento(TPartita& partita, TRectype& new_pag, int deleting = -1); + bool remove_unassigned(); long calcola_m770(int tipo_coll, real& spese, real& compenso, real& iva, real& ritfis); bool link_m770(); diff --git a/cg/cg2105.cpp b/cg/cg2105.cpp index 80d5777e4..174fb39ec 100755 --- a/cg/cg2105.cpp +++ b/cg/cg2105.cpp @@ -56,11 +56,11 @@ TGame_mask::TGame_mask(const TBill& bill) : TMask("cg2100p"), _conto(bill) set(P_SOTTOCONTO, _conto.sottoconto()); set(P_DESCR, ((TBill&)_conto).descrizione()); - set_handler(P_ANNO, annopart_handler); - set_handler(P_NUMERO, numpart_handler); - set_handler(P_SHOWALL, show_all_handler); - set_handler(P_SCAMBIO, scambio_handler); - set_handler(DLG_NEWREC, nuovo_handler); + set_handler(P_ANNO, annopart_handler); + set_handler(P_NUMERO, numpart_handler); + set_handler(P_SHOWALL, show_all_handler); + set_handler(P_SCAMBIO, scambio_handler); + set_handler(P_NUOVO, nuovo_handler); partite().set_notify(partite_notify); scadenze().sheet_mask().set_handler(100, edit_scadenza_handler); @@ -206,8 +206,8 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k) row.add(rigp.get(PART_NREG)); row.add(rigp.get(PART_DATAREG)); row.add(scad.get(SCAD_DATASCAD)); - row.add(pag.get_real(SCAD_IMPORTO).string()); - row.add(in_valuta ? pag.get_real(SCAD_IMPORTOVAL).string(0, 2) : ""); + row.add(pag.get_real(PAGSCA_IMPORTO).string()); + row.add(in_valuta ? pag.get_real(PAGSCA_IMPORTOVAL).string(0, 2) : ""); row.add(rigp.get(PART_DESCR)); row.add(rigp.get(PART_NUMDOC)); row.add(""); @@ -229,6 +229,28 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k) } sal.add("Saldo della rata "); sal << ra; } + + TRecord_array& unas = game->unassigned(); + const int lastp = unas.last_row(); + for (int pa = unas.first_row(); pa <= lastp; pa = unas.succ_row(pa)) + { + const TRectype& pag = unas.row(pa); + const TRiga_partite& rigp = game->riga(pa); + + TToken_string& row = scadenze.row(scadenze.add("")); + row.add(pag.get(PAGSCA_NRIGA)); + row.add(pag.get(PAGSCA_NRATA)); + row.add(rigp.get(PART_DATADOC)); + row.add(rigp.get(PART_NREG)); + row.add(rigp.get(PART_DATAREG)); + row.add(""); + row.add(pag.get_real(PAGSCA_IMPORTO).string()); + row.add(in_valuta ? pag.get_real(PAGSCA_IMPORTOVAL).string(0, 2) : ""); + row.add(rigp.get(PART_DESCR)); + row.add(rigp.get(PART_NUMDOC)); + row.add(""); + row.add(pa); + } } gm.scadenze().force_update(); @@ -259,10 +281,10 @@ bool TGame_mask::edit_scadenza_handler(TMask_field& f, KEY k) int nrigp = m.get_int(112); if (nrigp == 0) - { - nrigp = app().nuovo_pagamento(game, nriga, nrata, rmov); - if (nrigp < 1) + { + if (game.rata_pagata(nriga, nrata)) return f.error_box("La rata %d e' gia' stata pagata", nrata); + nrigp = app().nuovo_pagamento(game, nriga, nrata, rmov); } else { @@ -272,8 +294,7 @@ bool TGame_mask::edit_scadenza_handler(TMask_field& f, KEY k) if (cur_reg != nreg) return f.error_box("Il movimento corrente e' il %ld", cur_reg); - const TRiga_scadenze& scad = game.rata(nriga, nrata); - const int paga = scad.pagata(); + const int paga = game.rata_pagata(nriga, nrata); if (paga != 0 && paga != nrigp) return f.error_box("Pagamento non modificabile"); } @@ -295,21 +316,34 @@ bool TGame_mask::nuovo_handler(TMask_field& f, KEY k) { if (k == K_SPACE) { - TMask new_game("Nuova partita", 1, 24, 6); - new_game.add_number(101, 0, "Anno ", 1, 1, 4); - new_game.add_string(102, 0, "Partita ", 1, 2, 7); - new_game.add_button(DLG_OK, 0, "", -12, -1, 8); - new_game.add_button(DLG_CANCEL, 0, "", -22, -1, 8); - new_game.set(101, TDate(TODAY).year()); + TMask new_game("Nuova partita", 1, 24, 5); + new_game.add_number(P_ANNO, 0, "Anno ", 1, 1, 4, "A"); + new_game.add_string(P_NUMERO, 0, "Partita ", 1, 2, 7); + new_game.add_button(DLG_OK, 0, "", -12, 3, 8, 2); + new_game.add_button(DLG_CANCEL, 0, "", -22, 3, 8, 2); if (new_game.run() == K_ENTER) { - const TGame_mask& gm = (TGame_mask&)f.mask(); - const int anno = new_game.get_int(101); - const TString16 numero(new_game.get(102)); + TGame_mask& gm = (TGame_mask&)f.mask(); + const int anno = new_game.get_int(P_ANNO); + const TString16 numero(new_game.get(P_NUMERO)); TPartita& game = app().partite().partita(gm.conto(), anno, numero); if (game.ok()) return error_box("La partita %d %s esiste gia'.", anno, (const char*)numero); + const int nriga = TPartita::UNASSIGNED; + const int nrata = TPartita::UNASSIGNED; + const int nrigp = app().nuovo_pagamento(game, nriga, nrata, app().cgs().selected()+1); + + app().edit_pagamento(game, nriga, nrata, nrigp); + if (game.ok()) + { + game.write(); + gm.send_key(K_SPACE, P_SHOWALL); // Aggiorna sheet partite + gm.set(P_ANNO, anno); + gm.set(P_NUMERO, numero, TRUE); // Selezione nuova partita + } + else + app().partite().destroy(gm.conto(), anno, numero); } } return TRUE; @@ -470,39 +504,63 @@ void TGame_mask::fill_partite(bool all) const class TPay_mask : public TMask { bool _in_valuta; - real _residuo, _residuo_val; + real _da_pagare; protected: static bool importo_handler(TMask_field& f, KEY k); public: - void set_scad(const TRiga_scadenze& scad); + void set_pag(const TRectype& oldpag, const TRiga_scadenze& scad); + void get_pag(TRectype& oldpag) const; TPay_mask(); virtual ~TPay_mask() {} }; -TPay_mask::TPay_mask() : TMask("cg2100p") +TPay_mask::TPay_mask() : TMask("cg2100s") { - set_handler(S_IMPORTO, importo_handler); - set_handler(S_IMPORTOVAL, importo_handler); } -void TPay_mask::set_scad(const TRiga_scadenze& scad) -{ +void TPay_mask::set_pag(const TRectype& oldpag, const TRiga_scadenze& scad) +{ + TRelation rel(LF_PAGSCA); // Working relation + rel.lfile().curr() = oldpag; + autoload(&rel); // Load current record on mask + + const TRiga_partite& parbas = scad.riga(); + set(S_NUMDOC, parbas.get(PART_NUMDOC)); // Numero documento + set(S_DATADOC, parbas.get(PART_DATADOC)); // Data documento + set(S_NUMPROT, parbas.get(PART_PROTIVA)); // Protocollo IVA + set(S_DESCR, parbas.get(PART_DESCR)); // Descrizione documento + set(S_DATASCAD, scad.get(SCAD_DATASCAD)); // Data della scadenza set(S_SEZIONE_SCAD, scad.riga().sezione()); // Sezione della rata - set(S_RATA, scad.get(SCAD_NRATA)); set(S_IMPORTO_SCAD, scad.get(SCAD_IMPORTO)); // Importo della rata set(S_IMPORTOVAL_SCAD, scad.get(SCAD_IMPORTOVAL)); // Importo in valuta _in_valuta = scad.in_valuta(); - _residuo = scad.residuo(FALSE); - _residuo_val = scad.residuo(TRUE); + _da_pagare = scad.residuo(_in_valuta); // Calcola residuo in valuta TReal_field& res = (TReal_field&)field(S_RESIDUO); res.set_decimals(_in_valuta ? 2 : 0); - res.set(_in_valuta ? _residuo_val.string() : _residuo.string()); + res.set(_da_pagare.string()); + if (!_da_pagare.is_zero()) + set_handler(_in_valuta ? S_IMPORTOVAL : S_IMPORTO, importo_handler); + + // Ricorda l'importo da pagare + _da_pagare += oldpag.get_real(_in_valuta ? PAGSCA_IMPORTOVAL : PAGSCA_IMPORTO); + + show(S_IMPORTOVAL_SCAD, _in_valuta); + show(S_IMPORTOVAL, _in_valuta); + +} + +void TPay_mask::get_pag(TRectype& newpag) const +{ + TRelation rel(LF_PAGSCA); // Working relation + rel.lfile().curr() = newpag; + autosave(&rel); // Load current record from mask + newpag = rel.lfile().curr(); } bool TPay_mask::importo_handler(TMask_field& f, KEY k) @@ -510,25 +568,19 @@ bool TPay_mask::importo_handler(TMask_field& f, KEY k) TPay_mask& m = (TPay_mask&)f.mask(); if (k == K_F8) - { - m.set(S_IMPORTO, m._residuo.string()); - if (m._in_valuta) - m.set(S_IMPORTOVAL, m._residuo_val.string(), f.dlg() == S_IMPORTO); + { + f.set(m._da_pagare.string()); k = K_TAB; } if (k == K_TAB && f.focusdirty()) { - if (!m._in_valuta || f.dlg() == S_IMPORTOVAL) - { - const real& res = (f.dlg() == S_IMPORTO) ? m._residuo : m._residuo_val; - const real i(f.get()); - if (i >= res) - m.set(S_SALDOACC, "S"); - - const real residuo(res-i); - m.set(S_RESIDUO, residuo.string()); - } + const real i(f.get()); + if (i >= m._da_pagare) + m.set(S_SALDOACC, "S"); + + const real residuo(m._da_pagare - i); + m.set(S_RESIDUO, residuo.string()); } return TRUE; @@ -597,31 +649,25 @@ bool TPrimanota_application::edit_partite(int riga) int TPrimanota_application::nuovo_pagamento(TPartita& partita, int nriga, int rata, int rmov) { - const TRiga_partite& riga_part = partita.riga(nriga); - CHECKD(rata >= 1 && rata <= riga_part.rate(), "Rata errata ", rata); - - TRiga_scadenze& riga_scad = riga_part.rata(rata); - if (riga_scad.pagata()) - return -1; + CHECKD(!partita.rata_pagata(nriga, rata), "Rata pagata ", rata); TBill conto; partita.conto(conto); // Legge conto principale const long numreg = curr_mask().get_long(F_NUMREG); int nrigp = partita.mov2rig(numreg, rmov); // Cerca riga partita relativa alla riga rmov - if (nrigp < 1) // Devo creare una nuova riga di partita + if (nrigp <= 0) // Devo creare una nuova riga di partita { TRiga_partite& part = partita.nuova_riga(); // Creazione nuova riga vuota nrigp = part.get_int(PART_NRIGA); // Copia dati movimento corrente - part.put(PART_NREG, numreg); // Numero operazione - part.put(PART_NUMRIG, rmov); // Riga su cui ho cliccato + part.put(PART_NREG, numreg); // Numero operazione + part.put(PART_NUMRIG, rmov); // Riga su cui ho cliccato part.put(PART_DATAREG, curr_mask().get(F_DATAREG)); part.put(PART_DATADOC, curr_mask().get(F_DATADOC)); part.put(PART_NUMDOC, curr_mask().get(F_NUMDOC)); part.put(PART_DESCR, curr_mask().get(F_DESCR)); - part.put(PART_CODVAL, curr_mask().get(S_VALUTA)); part.put(PART_CAMBIO, curr_mask().get(S_CAMBIO)); part.put(PART_DATACAM, curr_mask().get(S_DATACAMBIO)); @@ -630,52 +676,64 @@ int TPrimanota_application::nuovo_pagamento(TPartita& partita, int nriga, int ra const int tipomov = causale().tipomov(); part.put(PART_TIPOMOV, tipomov); part.put(PART_CODCAUS, causale().codice()); - const TRegistro& reg = causale().reg(); - part.put(PART_REG, reg.name()); - part.put(PART_PROTIVA, reg.protocol()); + if (causale().iva() != nessuna_iva) + { + part.put(PART_REG, curr_mask().get(F_CODREG)); + part.put(PART_PROTIVA, curr_mask().get(F_PROTIVA)); + } // Complesso algoritmo per calcolare la sezione di una nuova riga partita - char sezione = ' '; // Sezione nulla - TBill bill; causale().bill(1, bill); // Legge primo conto causale - if (bill.tipo() == conto.tipo()) // Se il tipo coincide ... - sezione = causale().sezione(1); // ... usa la sezione della causale - + char sezione = causale().sezione(1); // Usa la sezione della causale if (sezione <= ' ') // Se non c'e' la sezione bell'e' ch'e' pronta { if (tipomov == 1 || tipomov == 5) // calcola in base al tipo movimento e sezione = (conto.tipo() == 'C') ? 'D' : 'A'; // al tipo cliente/fornitore else sezione = (conto.tipo() == 'C') ? 'A' : 'D'; - - if (bill.tipo() != conto.tipo()) // Compensazioni + } + + if (conto.tipo() > ' ') // Se il tipo e' C o F + { + TBill bill; causale().bill(1, bill); // Legge primo conto causale + if (bill.tipo() != conto.tipo()) sezione = (sezione == 'D') ? 'A' : 'D'; // scambia segno } + part.put(PART_SEZ, sezione); // Memorizza solo la sezione (importi nulli) part.put(PART_SEZABB, sezione); part.put(PART_SEZDIFCAM, sezione); } - TRectype& pagamento = riga_scad.new_row(nrigp); // Crea nuovo pagamento + TRectype& pagamento = partita.pagamento(nriga, rata, nrigp); // Crea nuovo pagamento int caus = 2; // Calcola riga causale per la contropartita in base al tipo pagamento - switch (riga_scad.get_int(SCAD_TIPOPAG)) - { - case 2: // Tratta - case 7: // Tratta accettata - caus = 3; break; - case 3: // Ricevuta bancaria - caus = 4; break; - case 4: // Cessione - caus = 5; break; - case 5: // Paghero' - caus = 6; break; - case 6: // Fattura di credito - caus = 7; break; - case 1: // Rimessa - case 8: // Rapporti interbancari diretti - case 9: // Bonifico - default: - caus = 2; break; + if (rata != TPartita::UNASSIGNED) + { + const TRiga_scadenze& scad = partita.rata(nriga, rata); + switch (scad.get_int(SCAD_TIPOPAG)) + { + case 2: // Tratta + case 7: // Tratta accettata + caus = 3; break; + case 3: // Ricevuta bancaria + caus = 4; break; + case 4: // Cessione + caus = 5; break; + case 5: // Paghero' + caus = 6; break; + case 6: // Fattura di credito + caus = 7; break; + case 1: // Rimessa + case 8: // Rapporti interbancari diretti + case 9: // Bonifico + default: + caus = 2; break; + } + pagamento.put(PAGSCA_CODABIPR, scad.get(SCAD_CODABIPR)); + pagamento.put(PAGSCA_CODCABPR, scad.get(SCAD_CODCABPR)); + pagamento.put(PAGSCA_CODABI, scad.get(SCAD_CODABI)); + pagamento.put(PAGSCA_CODCAB, scad.get(SCAD_CODCAB)); + pagamento.put(PAGSCA_CODAG, scad.get(SCAD_CODAG)); } TBill contro; causale().bill(caus, contro); // Legge conto contropartita @@ -683,46 +741,35 @@ int TPrimanota_application::nuovo_pagamento(TPartita& partita, int nriga, int ra causale().bill(caus = 1, contro); // ... prende il primo contro.put(pagamento, TRUE); // Scrive conto contropartita - // Da regalare a Ferdinando - if (conto.tipo() > ' ') // Se cliente o fornitore cerca sua banca - { - TRelation cliforel(LF_CLIFO); - cliforel.add(LF_CFVEN, "TIPOCF=TIPOCF|CODCF=CODCF"); - TRectype& clifo = cliforel.lfile().curr(); - - clifo.put(CLI_TIPOCF, conto.tipo()); - clifo.put(CLI_CODCF, conto.codclifo()); - const int err = cliforel.read(); - CHECK(err == NOERR, "Chiss'e' fregato il clifo"); - - pagamento.put(PAGSCA_CODABI, clifo.get(CLI_CODABI)); - pagamento.put(PAGSCA_CODCAB, clifo.get(CLI_CODCAB)); - pagamento.put(PAGSCA_CODAG, cliforel.lfile(LF_CFVEN).get(CLI_CODAG)); - } - - /* Prossima implementazione - pagamento.put(PAGSCA_CODABI, riga_scad.get(SCAD_CODABI)); - pagamento.put(PAGSCA_CODCAB, riga_scad.get(SCAD_CODCAB)); - pagamento.put(PAGSCA_CODAG, riga_scad.get(SCAD_CODAG)); - */ - pagamento.put(PAGSCA_CODABIPR, riga_scad.get(SCAD_CODABIPR)); - pagamento.put(PAGSCA_CODCABPR, riga_scad.get(SCAD_CODCABPR)); - + /* TBG Da regalare a Ferdinando + if (conto.tipo() > ' ') // Se cliente o fornitore cerca sua banca + { + TRelation cliforel(LF_CLIFO); + cliforel.add(LF_CFVEN, "TIPOCF=TIPOCF|CODCF=CODCF"); + TRectype& clifo = cliforel.lfile().curr(); + + clifo.put(CLI_TIPOCF, conto.tipo()); + clifo.put(CLI_CODCF, conto.codclifo()); + const int err = cliforel.read(); + CHECK(err == NOERR, "Chiss'e' fregato il clifo"); + + pagamento.put(PAGSCA_CODABI, clifo.get(CLI_CODABI)); + pagamento.put(PAGSCA_CODCAB, clifo.get(CLI_CODCAB)); + pagamento.put(PAGSCA_CODAG, cliforel.lfile(LF_CFVEN).get(CLI_CODAG)); + } + */ return nrigp; } + bool TPrimanota_application::notify_edit_pagamento(TPartita& p, TRectype& new_pag, int deleting) { if (deleting != 0) { const int nriga = new_pag.get_int(PAGSCA_NRIGA); // Riga fattura - const TRiga_partite& parbas = p.riga(nriga); - const int nrata = new_pag.get_int(PAGSCA_NRATA); // Numero rata - TRiga_scadenze& scaden = parbas.rata(nrata); - const int nrigp = new_pag.get_int(PAGSCA_NRIGP); // Riga pagamento - const TRectype& old_pag = scaden.row(nrigp); + const TRectype& old_pag = p.pagamento(nriga, nrata, nrigp); const TRiga_partite& somma = p.riga(nrigp); const char sez = somma.sezione(); // Sezione importo e ritenute @@ -853,31 +900,26 @@ bool TPrimanota_application::notify_edit_pagamento(TPartita& p, TRectype& new_pa bool TPrimanota_application::edit_pagamento(TPartita& p, int nriga, int nrata, int nrigp) { + const TRectype& oldpag = p.pagamento(nriga, nrata, nrigp); + TRiga_partite& somma = p.riga(nrigp); + TPay_mask m; - const TRiga_partite& parbas = p.riga(nriga); - const TRiga_scadenze& scaden = parbas.rata(nrata); - const TRectype& oldpag = scaden.row(nrigp); - TRiga_partite& somma = p.riga(nrigp); - - const bool in_valuta = scaden.in_valuta(); - m.show(S_IMPORTOVAL_SCAD, in_valuta); - m.show(S_IMPORTOVAL, in_valuta); - - TRelation rel(LF_PAGSCA); // Working relation - rel.lfile().curr() = oldpag; - m.autoload(&rel); // Load current record on mask - - m.set(S_DESCAGG, somma.get(PART_DESCR)); - - // Dati del documento (fattura) che ha generato la scadenza - m.set(S_NUMDOC, parbas.get(PART_NUMDOC)); // Numero documento - m.set(S_DATADOC, parbas.get(PART_DATADOC)); // Data documento - m.set(S_NUMPROT, parbas.get(PART_PROTIVA)); // Protocollo IVA - m.set(S_DESCR, parbas.get(PART_DESCR)); // Descrizione documento - // Dati della scadenza che ha generato la partita - m.set_scad(scaden); + if (nriga != TPartita::UNASSIGNED) + { + const TRiga_scadenze& scaden = p.rata(nriga, nrata); + m.set_pag(oldpag, scaden); + } + else + { + nriga = p.primo_pagamento(); + TRiga_partite& riga = p.riga(nriga); + TRiga_scadenze& scaden = riga.new_row(); + m.set_pag(oldpag, scaden); + riga.destroy_rows(); + } + m.set(S_DESCAGG, somma.get(PART_DESCR)); const KEY key = m.run(); if (key == K_ENTER || key == K_DEL) @@ -893,8 +935,8 @@ bool TPrimanota_application::edit_pagamento(TPartita& p, int nriga, int nrata, i somma.put(PART_DESCR, m.get(S_DESCAGG)); // Aggiorna descrizione (comune ai pagamenti) } - m.autosave(&rel); - TRectype& new_pag = rel.lfile().curr(); + TRectype new_pag(oldpag); + m.get_pag(new_pag); notify_edit_pagamento(p, new_pag); } @@ -953,3 +995,38 @@ bool TPrimanota_application::notify_cgline_deletion(int numrig) return found; } + +bool TPrimanota_application::remove_unassigned() +{ + bool found = FALSE; + + const long nreg = curr_mask().get_long(F_NUMREG); + for (TPartita* game = partite().first(); game; game = partite().next()) + { + if (game->prima_fattura() > 0) + { + TRecord_array& unas = game->unassigned(); + for (int u = unas.last_row(); u > 0; u = unas.pred_row(u)) + { + const TRectype& pag = unas.row(u); + const int nrigp = pag.get_int(PAGSCA_NRIGP); + TRiga_partite& sum = game->riga(nrigp); + if (sum.get_long(PART_NREG) == nreg) + { + const int rmov = sum.get_int(PART_NUMRIG)-1; + const TImporto imp(sum.sezione(), pag.get_real(PAGSCA_IMPORTO)); + add_cgs_imp(rmov, imp); + + TRectype zero(pag); zero.zero(); + sum.update(pag, zero, PART_IMPORTO); + sum.update(pag, zero, PART_IMPORTOVAL); + sum.update(pag, zero, PART_RITENUTE); + unas.destroy_row(u); + found = TRUE; + } + } + } + } + + return found; +} diff --git a/cg/saldacon.cpp b/cg/saldacon.cpp index ede03d77d..5bfa1cbbf 100755 --- a/cg/saldacon.cpp +++ b/cg/saldacon.cpp @@ -464,15 +464,18 @@ bool TPartita::reread() return read(zio, year, num); } -bool TPartita::write(bool re) +bool TPartita::write(bool re) const { - const bool ok = _part.write(re); - return ok; + int err = _part.write(re); + if (err == NOERR) + err = _unassigned.write(re); + return err == NOERR; } bool TPartita::remove() { _part.destroy_rows(); + _unassigned.destroy_rows(); return rewrite(); } @@ -489,11 +492,48 @@ TRiga_partite& TPartita::nuova_riga() TRiga_scadenze& TPartita::rata(int nriga, int nrata) const { - if (nriga < 1) nriga = prima_fattura(); + if (nriga <= 0) nriga = prima_fattura(); const TRiga_partite& r = riga(nriga); return r.rata(nrata); } +int TPartita::rata_pagata(int nriga, int nrata) const +{ + int pag = 0; + if (nriga != UNASSIGNED) + { + const TRiga_scadenze& r = rata(nriga, nrata); + pag = r.pagata(); + } + return pag; +} + +TRectype& TPartita::pagamento(int nriga, int nrata, int nrigp) +{ + if (nriga == UNASSIGNED) + return _unassigned.row(nrigp, TRUE); + TRiga_scadenze& r = rata(nriga, nrata); + return r.row(nrigp); +} + +bool TPartita::esiste(int nriga, int nrata, int nrigp) const +{ + if (nriga == UNASSIGNED) + return _unassigned.exist(nrigp); + + if (nrata <= 0) + return _part.exist(nriga); + + if (nrigp <= 0) + { + const TRiga_partite& r = riga(nriga); + return r.rows_array().exist(nrata); + } + + const TRiga_scadenze& r = rata(nriga, nrata); + return r.rows_array().exist(nrigp); +} + TImporto TPartita::importo_speso(long nreg, int numrig, bool extra) const { TImporto imp; @@ -661,46 +701,39 @@ bool TPartita::utilizzata(int nrigp) const return _unassigned.exist(nrigp); } - -bool TPartita::remove_unassigned(long nreg) -{ - bool found = FALSE; - - for (int u = _unassigned.last_row(); u > 0; u = _unassigned.pred_row(u)) - { - const TRectype& pag = _unassigned.row(u); - const int nrigp = pag.get_int(PAGSCA_NRIGP); - TRiga_partite& sum = riga(nrigp); - if (sum.get_long(PART_NREG) == nreg) - { - TRectype zero(pag); zero.zero(); - sum.update(pag, zero, PART_IMPORTO); - sum.update(pag, zero, PART_IMPORTOVAL); - sum.update(pag, zero, PART_RITENUTE); - _unassigned.destroy_row(u); - found = TRUE; - } - } - - return found; -} - bool TPartita::modifica_pagamento(const TRectype& new_pag, char& old_ap, TImporto& old_abb, TImporto& old_diffcam, char& new_ap, TImporto& new_abb, TImporto& new_diffcam) { const int nriga = new_pag.get_int(PAGSCA_NRIGA); - const TRiga_partite& fattura = riga(nriga); - const int nrata = new_pag.get_int(PAGSCA_NRATA); - TRiga_scadenze& scaden = fattura.rata(nrata); - const int nrigp = new_pag.get_int(PAGSCA_NRIGP); - const TRectype& old_pag = scaden.row(nrigp); - const bool empty = scaden.modifica_pagamento(new_pag, - old_ap, old_abb, old_diffcam, - new_ap, new_abb, new_diffcam); + bool empty = FALSE; + + if (nriga != UNASSIGNED) + { + TRiga_scadenze& scaden = rata(nriga, nrata); + empty = scaden.modifica_pagamento(new_pag, + old_ap, old_abb, old_diffcam, + new_ap, new_abb, new_diffcam); + } + else + { + const TRectype& old_pag = pagamento(nriga, nrata, nrigp); + + TRiga_partite& sum = riga(nrigp); + empty = sum.update(old_pag, new_pag, PART_IMPORTO); + sum.update(old_pag, new_pag, PART_IMPORTOVAL); + sum.update(old_pag, new_pag, PART_RITENUTE); + + if (new_pag.get_real(PAGSCA_IMPORTO).is_zero()) + _unassigned.destroy_row(nrigp); + else + _unassigned.row(nrigp, FALSE) = new_pag; + + old_ap = new_ap = ' '; // Non ci possono essere abbuoni di sorta! + } if (empty && !utilizzata(nrigp)) _part.destroy_row(nrigp); @@ -709,9 +742,14 @@ bool TPartita::modifica_pagamento(const TRectype& new_pag, } bool TPartita::chiusa(bool update) -{ - const TRiga_partite& row = riga(first()); - bool chiusa = row.get_bool(PART_CHIUSA); +{ + bool chiusa = FALSE; + const int ultima = last(); + if (ultima > 0) + { + const TRiga_partite& row = riga(ultima); + chiusa = row.get_bool(PART_CHIUSA); + } if (update) { @@ -738,7 +776,7 @@ bool TPartita::chiusa(bool update) chiusa = forse_chiusa; for (p = last(); p > 0; p = pred(p)) { - TRiga_partite& part = riga(first()); + TRiga_partite& part = riga(p); part.put(PART_CHIUSA, chiusa); } } @@ -770,13 +808,7 @@ TPartita* TPartite_array::find(const TBill& clifo, int anno, const char* num, bo if (p == NULL && create) { p = new TPartita(clifo, anno, num); - if (p->ok()) - add(k, p); - else - { - delete p; - p = NULL; - } + add(k, p); } return p; } @@ -792,7 +824,7 @@ TPartita* TPartite_array::find(const TRectype& r, bool create) TPartita& TPartite_array::partita(const TBill& clifo, int anno, const char* num) { TPartita* game = find(clifo, anno, num, TRUE); - CHECKS(game, "Partita errata ", num); + CHECK(game, "Partita errata"); return *game; } @@ -803,6 +835,12 @@ TPartita& TPartite_array::partita(const TRectype& r) return *game; } +bool TPartite_array::destroy(const TBill& clifo, int anno, const char* num) +{ + const TString& k = key(clifo, anno, num); + return remove(k); +} + bool TPartite_array::write(bool re) { int err = NOERR; @@ -843,10 +881,7 @@ int TPartite_array::add_numreg(long nreg) TCursor cur(&rel, "", 2, &filter, &filter); for (cur = 0; cur.ok(); ++cur) - { - TPartita& p = partita(part); // Aggiungi partita se non esiste gia' - p.remove_unassigned(nreg); // Togli righe non assegnate - } + partita(part); // Aggiungi partita se non esiste gia' _numreg = nreg; } diff --git a/cg/saldacon.h b/cg/saldacon.h index ea45a776f..4445f0aeb 100755 --- a/cg/saldacon.h +++ b/cg/saldacon.h @@ -39,8 +39,9 @@ protected: // TRectype public: const TRectype& row(int r) const { return _recarr.row(r); } - TRectype& row(int r) { return _recarr.row(r, FALSE); } + TRectype& row(int r) { return _recarr.row(r, TRUE); } TRectype& new_row(int r = -1) { return _recarr.row(r > 0 ? r : last()+1, TRUE); } + void destroy_rows() { _recarr.destroy_rows(); } int first() const { return _recarr.first_row(); } int last() const { return _recarr.last_row(); } @@ -95,10 +96,6 @@ class TRiga_partite : public TTree_rectype friend class TRiga_scadenze; TPartita* _partita; -protected: - bool update(const TRectype& vec, const TRectype& nuo, const char* field); - bool update(const TImporto& vec, const TImporto& nuo, const char* sez, const char* val); - public: // TTree_rectype virtual TObject* dup() const { return new TRiga_partite(*this); } virtual int read(TBaseisamfile& f, word op); @@ -113,6 +110,9 @@ public: char sezione() const { return get_char(PART_SEZ); } bool in_valuta() const { return get(PART_CODVAL).not_empty(); } + bool update(const TRectype& vec, const TRectype& nuo, const char* field); + bool update(const TImporto& vec, const TImporto& nuo, const char* sez, const char* val); + TPartita& partita() const { CHECK(_partita, "Partita nulla"); return *_partita; } TRiga_partite(TPartita* game); @@ -122,8 +122,6 @@ public: class TPartita : public TObject { - enum { UNASSIGNED = 9999 }; - TRecord_array _part; TRecord_array _unassigned; @@ -131,11 +129,16 @@ public: // TObject virtual bool ok() const { return _part.rows() > 0; } public: + enum { UNASSIGNED = 9999 }; + TRiga_partite& riga(int r) const { return (TRiga_partite&)_part.row(r); } TRiga_partite& nuova_riga(); void rimuovi_riga(int r) { _part.destroy_row(r); } TRiga_scadenze& rata(int nriga, int nrata) const; - + TRectype& pagamento(int nriga, int nrata, int nrigp); + int rata_pagata(int nriga, int nrata) const; + bool esiste(int nriga, int nrata = 0, int nrigp = 0) const; + int succ(int r) const { return _part.succ_row(r); } int pred(int r) const { return _part.pred_row(r); } int first() const { return _part.first_row(); } @@ -143,8 +146,8 @@ public: bool reread(); bool read(const TBill& clifo, int anno, const char* num); - bool write(bool re = FALSE); - bool rewrite() { return write(TRUE); } + bool write(bool re = FALSE) const; + bool rewrite() const { return write(TRUE); } bool remove(); int mov2rig(long nreg, int rmov) const; @@ -153,7 +156,7 @@ public: int primo_pagamento(long nreg = -1l) const; bool utilizzata(int r) const; // Controlla se esistono pagamenti sommati alla riga r - bool remove_unassigned(long nreg); + TRecord_array& unassigned() { return _unassigned; } bool chiusa(bool update = FALSE); @@ -199,6 +202,8 @@ public: TPartita* exist(const TRectype& part) const { return ((TPartite_array*)this)->find(part, FALSE); } + bool destroy(const TBill& clifo, int anno, const char* num); + bool write(bool re = FALSE); bool rewrite() { return write(TRUE); }