diff --git a/sc/sc0300.cpp b/sc/sc0300.cpp index fd20aaff6..a777bf11f 100644 --- a/sc/sc0300.cpp +++ b/sc/sc0300.cpp @@ -122,6 +122,7 @@ TFieldtypes TPareggio_tree::get_var(const TString& name, TVariant& var) const bool TPareggio_tree::init(const TBill& bill, const TString& valuta, bool nc, int stato) { + _games.destroy(); goto_root(); kill_node(); @@ -276,6 +277,16 @@ bool TScad_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) case F_TUTTE: if (e == se_query_add || e == se_query_del) return false; + if (e = fe_close) + { + TSheet_field& s = (TSheet_field&)o; + real tot, imp = get_real(F_IMPORTO); + FOR_EACH_SHEET_ROW(s, r, row) + tot += real(row->get(0)); + if (tot > imp) + return error_box(FR("Il totale degli importi (%s) supera la cifra disponibile (%s)"), + tot.stringa(), imp.stringa()); + } break; default: break; } @@ -294,23 +305,25 @@ class TPareggio_mask : public TAutomask protected: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); - const TString& causale_nc_reg(const TString& reg) const; - bool converti(const TRectype& rec); + const TString& reg2caus(const TString& reg) const; + bool ft2nc(const TRectype& rec); bool abbuona_rata(const real& imp, const TRectype& nota, TRiga_scadenze& scad); - bool elabora(const TRectype& nota, const TPointer_array& fatture); + bool elabora(const TRectype& nota, TPointer_array& scadenze); + void refill(); public: TPareggio_mask(); }; -// Cerca una causale di nota di credito sul registro reg -const TString& TPareggio_mask::causale_nc_reg(const TString& reg) const +// Cerca una causale di nota di credito compatibile col registro reg +const TString& TPareggio_mask::reg2caus(const TString& reg) const { if (reg.full()) { - const TString& codcaus = get(get(F_TIPO) == "C" ? F_CODCAUS_C : F_CODCAUS_F); - const TString& cr = cache().get(LF_CAUSALI, codcaus, CAU_REG); - if (cr == reg) + const char tipocf = get(F_TIPO)[0]; + const TString& codcaus = get(tipocf == 'F' ? F_CODCAUS_F : F_CODCAUS_C); + const TString& cod = cache().get(LF_CAUSALI, codcaus, CAU_REG); + if (cod == reg) return codcaus; // Siamo fortunati: va bene la causale standard TISAM_recordset recset("USE CAUS SELECT (REG=#CODREG)&&(TIPOMOV=2)"); @@ -321,14 +334,15 @@ const TString& TPareggio_mask::causale_nc_reg(const TString& reg) const return EMPTY_STRING; } -bool TPareggio_mask::converti(const TRectype& rec) +// Trasforma una fattura negativa in nota di credito +bool TPareggio_mask::ft2nc(const TRectype& rec) { CHECK(rec.num() == LF_PARTITE, "Solo partite, grazie!"); const long numreg = rec.get_long(PART_NREG); const TString4 codreg = rec.get(PART_REG); - const TString4 codcau = causale_nc_reg(codreg); + const TString4 codcau = reg2caus(codreg); if (codcau.blank()) - return error_box(FR("E' necessario creare una causale di note di credito sul registro %s"), (const char*)codreg); + return error_box(FR("E' necessario creare una causale di nota di credito sul registro %s"), (const char*)codreg); TString msg; msg << TR("Si desidera trasformare la fattura in nota di credito con causale ") @@ -379,11 +393,12 @@ bool TPareggio_mask::abbuona_rata(const real& imp, const TRectype& nota, TRiga_s const TValuta valuta(scad.riga()); const char* imp_field = valuta.in_valuta() ? PAGSCA_IMPORTOVAL : PAGSCA_IMPORTO; - TPartita& old_nc = _nc.partita(nota); + TPartita& nc = _nc.partita(nota); TPartita& ft = scad.partita(); TRiga_partite& new_nc = ft.new_row(); new_nc.put(PART_SEZ, scad.riga().get_char(PART_SEZ) == 'D' ? 'A' : 'D'); + new_nc.put(PART_TIPOMOV, tm_nota_credito); new_nc.put(PART_NREG, nota.get(PART_NREG)); new_nc.put(PART_CODCAUS, nota.get(PART_CODCAUS)); new_nc.put(PART_REG, nota.get(PART_REG)); @@ -393,30 +408,34 @@ bool TPareggio_mask::abbuona_rata(const real& imp, const TRectype& nota, TRiga_s TRectype new_pag = scad.new_row(new_nc.get_int(PART_NRIGA)); new_pag.put(imp_field, imp); ft.modifica_pagamento(new_pag, valuta, true); + ft.write(true); - TRectype unass = old_nc.unassigned().row(nota.get_int(PART_NRIGA)); + TRectype unass = nc.unassigned().row(nota.get_int(PART_NRIGA)); if (new_nc.get(PART_SEZ) == nota.get(PART_SEZ)) unass.add(imp_field, -imp); else unass.add(imp_field, imp); - old_nc.modifica_pagamento(unass, valuta, true); + nc.modifica_pagamento(unass, valuta, true); + nc.write(true); return true; } -bool TPareggio_mask::elabora(const TRectype& nota, const TPointer_array& scadenze) +bool TPareggio_mask::elabora(const TRectype& nota, TPointer_array& scadenze) { CHECK(nota.num() == LF_PARTITE, "Solo partite, grazie!"); const tipo_movimento tm = (tipo_movimento)nota.get_int(PART_TIPOMOV); - if (tm == tm_fattura && !converti(nota)) + if (tm == tm_fattura && !ft2nc(nota)) return false; TScad_mask ass; const TString& codval = get(F_CODVAL); ass.set(F_CODVAL, codval); - TSheet_field& sheet = ass.sfield(F_TUTTE); real residuo_nc = abs(nota.get_real(is_true_value(codval) ? PART_IMPORTOVAL : PART_IMPORTO)); + ass.set(F_IMPORTO, residuo_nc); + + TSheet_field& sheet = ass.sfield(F_TUTTE); TString_array rate; FOR_EACH_ARRAY_ITEM(scadenze, i, s) { @@ -428,9 +447,9 @@ bool TPareggio_mask::elabora(const TRectype& nota, const TPointer_array& scadenz imp = residuo_scad; row.add(imp.string()); residuo_nc -= imp; + row.add(scad.get(SCAD_DATASCAD)); row.add(residuo_scad.string()); row.add(scad.importo(true).valore().string()); - row.add(scad.get(SCAD_DATASCAD)); } if (ass.run() == K_ENTER) @@ -449,6 +468,25 @@ bool TPareggio_mask::elabora(const TRectype& nota, const TPointer_array& scadenz return true; } +void TPareggio_mask::refill() +{ + TWait_cursor hourglass; + const short id = efield(F_FORNITORE).active() ? F_FORNITORE : + (efield(F_SOTTOCONTO).active() ? F_SOTTOCONTO : F_CLIENTE); + TBill bill; bill.get(*this, F_GRUPPO, F_CONTO, id, F_TIPO); + const int tipo = get_int(F_TUTTE); + const TString& codval = get(F_CODVAL); + _nc.init(bill, codval, true, 1); // Solo aperte + _ft.init(bill, codval, false, tipo); + + tfield(F_NC_TREE).set_tree(&_nc); + tfield(F_FT_TREE).set_tree(&_ft); + + _numreg = 0; + disable(DLG_LINK); + disable(DLG_RECALC); +} + bool TPareggio_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { switch (o.dlg()) @@ -456,25 +494,13 @@ bool TPareggio_mask::on_field_event(TOperable_field& o, TField_event e, long jol //case F_SOTTOCONTO: case F_CLIENTE: case F_FORNITORE: + if (e == fe_modify && !o.empty()) + refill(); + break; case F_CODVAL: case F_TUTTE: - if (e == fe_modify && !o.empty()) - { - TWait_cursor hourglass; - const short id = efield(F_FORNITORE).active() ? F_FORNITORE : - (efield(F_SOTTOCONTO).active() ? F_SOTTOCONTO : F_CLIENTE); - TBill bill; bill.get(*this, F_GRUPPO, F_CONTO, id, F_TIPO); - const int tipo = get_int(F_TUTTE); - const TString& codval = get(F_CODVAL); - _nc.init(bill, codval, true, 1); // Solo aperte - _ft.init(bill, codval, false, tipo); - - tfield(F_NC_TREE).set_tree(&_nc); - tfield(F_FT_TREE).set_tree(&_ft); - _numreg = 0; - disable(DLG_LINK); - disable(DLG_RECALC); - } + if (e == fe_modify) + refill(); break; case F_CODCAUS_C: case F_CODCAUS_F: @@ -514,7 +540,7 @@ bool TPareggio_mask::on_field_event(TOperable_field& o, TField_event e, long jol TRectype mov(LF_MOV); mov.put(MOV_NUMREG, _numreg); if (mov.edit()) - send_key(K_SPACE, F_TUTTE, &o); + refill(); } break; case DLG_RECALC: @@ -523,38 +549,37 @@ bool TPareggio_mask::on_field_event(TOperable_field& o, TField_event e, long jol TTree_field& nc = tfield(F_NC_TREE); TPareggio_tree* nct = (TPareggio_tree*)nc.tree(); const TRectype* nota = nct->node2rec(EMPTY_STRING); - if (nota != NULL && converti(*nota)) - send_key(K_SPACE, F_TUTTE, &o); + if (nota != NULL && ft2nc(*nota)) + refill(); } break; case DLG_ELABORA: if (e == fe_button) { - TTree_field& nc = tfield(F_NC_TREE); - TTree_field& ft = tfield(F_FT_TREE); - - TPareggio_tree* nct = (TPareggio_tree*)nc.tree(); - const TRectype* nota = nct->node2rec(EMPTY_STRING); + const TRectype* nota = _nc.node2rec(EMPTY_STRING); if (nota == NULL) return error_box(TR("Selezionare una nota di credito nel pannello di sinistra")); - TPointer_array fatture; + const TTree_field& ft = tfield(F_FT_TREE); + TPointer_array rate; TString_array a; if (ft.selection(a) > 0) { - TPareggio_tree* ftt = (TPareggio_tree*)ft.tree(); FOR_EACH_ARRAY_ROW(a, r, riga) { - const TRectype* rec = ftt->node2rec(*riga); + const TRectype* rec = _ft.node2rec(*riga); if (rec) - fatture.add((TRectype*)rec); + rate.add((TRectype*)rec); } } - if (fatture.items() > 0) - elabora(*nota, fatture); + if (rate.items() > 0) + { + if (elabora(*nota, rate)) + refill(); + } else - return error_box(TR("Selezionare almeno una fattura nel pannello di destra")); + return error_box(TR("Selezionare almeno una rata nel pannello di destra")); } break; default: break; @@ -564,14 +589,17 @@ bool TPareggio_mask::on_field_event(TOperable_field& o, TField_event e, long jol TPareggio_mask::TPareggio_mask() : TAutomask("sc0300a"), _numreg(0L) { - RCT rct_nc; field(F_NC_TREE).get_rect(rct_nc); - RCT rct_ft; field(F_FT_TREE).get_rect(rct_ft); + TTree_field& nc = tfield(F_NC_TREE); + TTree_field& ft = tfield(F_FT_TREE); + + RCT rct_nc; nc.get_rect(rct_nc); + RCT rct_ft; ft.get_rect(rct_ft); rct_nc.right = rct_ft.left-8; rct_ft.right = rct_ft.left + rct_nc.right - rct_nc.left; - field(F_NC_TREE).set_rect(rct_nc); - field(F_FT_TREE).set_rect(rct_ft); + nc.set_rect(rct_nc); + ft.set_rect(rct_ft); } /////////////////////////////////////////////////////////// @@ -587,7 +615,7 @@ protected: void TPareggio_partite::main_loop() { const int anno = xvt_vobj_get_attr(NULL_WIN, ATTR_APPL_VERSION_YEAR); - if (anno > 2101) + if (anno >= 2121) { TPareggio_mask pm; pm.run(); diff --git a/sc/sc0300a.h b/sc/sc0300a.h index 0fe8c2a52..0a8c92bbe 100644 --- a/sc/sc0300a.h +++ b/sc/sc0300a.h @@ -1,6 +1,7 @@ #include "sc0200b.h" -#define F_CODCAUS_C 119 -#define F_CODCAUS_F 120 -#define F_NC_TREE 121 -#define F_FT_TREE 122 +#define F_CODCAUS_C 120 +#define F_CODCAUS_F 121 +#define F_IMPORTO 122 +#define F_NC_TREE 131 +#define F_FT_TREE 132 diff --git a/sc/sc0300a.uml b/sc/sc0300a.uml index aeb0b1d1b..a8a5abbea 100644 --- a/sc/sc0300a.uml +++ b/sc/sc0300a.uml @@ -222,8 +222,8 @@ BEGIN DISPLAY "Riga@4R" NRIGA DISPLAY "Rata@4R" NRATA DISPLAY "Scadenza@8" DATASCAD - DISPLAY "Importo@10R" IMPORTO DISPLAY "Residuo@10R" RESIDUO + DISPLAY "Importo@10R" IMPORTO DISPLAY "Descrizione Fattura@35" PART.DESCR DISPLAY "P.N.@6R" PART.NREG FLAGS "M" diff --git a/sc/sc0300b.uml b/sc/sc0300b.uml index 6122352ba..14c87dbc2 100644 --- a/sc/sc0300b.uml +++ b/sc/sc0300b.uml @@ -4,17 +4,24 @@ PAGE "Assegnamento" -1 -1 75 12 STRING F_CODVAL 3 BEGIN - PROMPT 1 0 "" - FLAGS "H" + PROMPT 41 0 "Valuta" + FLAGS "D" +END + +CURRENCY F_IMPORTO 15 +BEGIN + PROMPT 1 0 "Importo da suddividere " + DRIVENBY F_CODVAL + FLAGS "D" END SPREADSHEET F_TUTTE BEGIN PROMPT 0 1 "" ITEM "Importo\nnota credito@15R" + ITEM "Scadenza\nrata@10" ITEM "Residuo\nrata@15R" ITEM "Importo\nrata@15R" - ITEM "Scadenza\nrata@10" END ENDPAGE @@ -41,28 +48,30 @@ CURRENCY 101 15 BEGIN PROMPT 1 1 "Importo nota credito " DRIVENBY -F_CODVAL + NUM_EXPR #THIS_FIELD>=0 + WARNING "Inserire un importo positivo" END -CURRENCY 102 15 +DATE 102 +BEGIN + PROMPT 1 4 "Data scadenza " + FLAGS "D" +END + +CURRENCY 103 15 BEGIN PROMPT 1 2 "Residuo rata " FLAGS "D" DRIVENBY -F_CODVAL END -CURRENCY 103 15 +CURRENCY 104 15 BEGIN PROMPT 1 3 "Importo rata " FLAGS "D" DRIVENBY -F_CODVAL END -DATE 104 -BEGIN - PROMPT 1 4 "Data scadenza " - FLAGS "D" -END - ENDPAGE TOOLBAR "" -2 0 0 2