git-svn-id: svn://10.65.10.50/branches/R_10_00@22919 c028cbd2-c16b-5b4b-a496-9718f37d4682

This commit is contained in:
guy 2014-03-07 14:13:42 +00:00
parent d42478793d
commit a1ebb0c715
4 changed files with 158 additions and 33 deletions

@ -1079,7 +1079,7 @@ bool TSaldaconto_app::totval_handler(TMask_field& f, KEY key)
if (totdoc != imppag)
{
TString msg(80);
msg << TR("Il totale del documento in valuta e' diverso dall'importo pagato ")
msg << TR("Il totale del documento in valuta è diverso dall'importo pagato ")
<< imppag.string(".3")
<< TR("\nSi desidera continuare ugualmente?");
ok = f.yesno_box(msg);

@ -482,7 +482,7 @@ bool TPareggio_mask::ft2nc(const TRectype& rec)
err = _iskeynotfound;
}
if (err != NOERR)
return error_box(FR("Impossibile modificare la partita associata la movimento %ld: errore %d"), numreg, err);
return error_box(FR("Impossibile modificare la partita associata al movimento %ld: errore %d"), numreg, err);
return true;
}

@ -10,8 +10,10 @@
#include "../cg/cg2101.h"
#include "../cg/cg2103.h"
#include "../cg/cglib02.h"
#include "../cg/cgsaldac.h"
#include <clifo.h>
///////////////////////////////////////////////////////////
@ -22,8 +24,8 @@ enum { C_CHECKED, C_GRUPPO, C_CONTO, C_CODCF, C_RAGSOC, C_IMPORTO, C_RESIDUO, C_
class TAbbuona_sheet : public TArray_sheet
{
protected:
virtual bool get_cell_colors(int row, int col, COLOR& fore, COLOR& back) const;
public:
TAbbuona_sheet();
};
@ -40,7 +42,7 @@ bool TAbbuona_sheet::get_cell_colors(int /*row*/, int col, COLOR& fore, COLOR& b
}
TAbbuona_sheet::TAbbuona_sheet() : TArray_sheet(0, 0, 0, 0, TR("Scadenze aperte"),
HR("@1C|Grp.@3|Cnt.@3|Codice@R|Ragione Sociale@50|Importo@10R|Residuo@10R|Val.|Data@10|Anno@R|Partita@8R|Riga@R|Rata@R"),
HR("@1C|Grp.@3|Cnt.@3|Codice@R|Ragione Sociale@50|Importo\nRata@10R|Residuo\nRata@10R|Val.|Data@10|Anno@R|Partita@8R|Riga@R|Rata@R|Non\nass.@3C"),
0x1, 1)
{}
@ -145,12 +147,63 @@ protected: // Applicat
virtual void main_loop();
bool genera_abbuono(TPartita& game, int nriga, int nrata,
const TMovimentoPN& mov, TLog_report& log) const;
TImporto residuo(const TRiga_scadenze& rata, bool in_valuta) const;
int non_assegnati(const TPartita& part) const;
public:
void fill_sheet(const char tipocf, const TCurrency& impmin, TAbbuona_sheet& sheet);
bool elabora(const TMask& msk, TAbbuona_sheet& sheet) const;
};
TImporto TAbbuona_partite::residuo(const TRiga_scadenze& rata, bool in_valuta) const
{
TImporto res;
if (!rata.chiusa())
{
// Controllo se è una sola rata
int rate_aperte = 0;
const TPartita& part = rata.partita();
for (int r = part.last(); r > 0 && rate_aperte <= 0; r--)
{
const TRiga_partite& rp = part.riga(r);
if (rp.tipo() == tm_fattura)
{
for (int s = rp.rate(); s > 0; s--)
if (!rp.rata(s).chiusa())
rate_aperte++;
}
}
if (rate_aperte == 1)
res = part.calcola_saldo(in_valuta);
else
res = rata.residuo(in_valuta);
const char tipocf = rata.get_char(SCAD_TIPOCF);
res.normalize(tipocf == 'C' ? 'D' : 'A');
}
return res;
}
int TAbbuona_partite::non_assegnati(const TPartita& part) const
{
const char tipocf = part.conto().tipo();
int na = ((TPartita&)part).unassigned().rows();
for (int r = part.last(); r > 0; r = part.pred(r))
{
const TRiga_partite& riga = part.riga(r);
if (riga.tipo() == tm_fattura)
{
TImporto imp = riga.importo(true);
imp.normalize(tipocf == 'C' ? 'D' : 'A');
if (imp.valore() < ZERO)
na++;
}
}
return na;
}
void TAbbuona_partite::fill_sheet(const char tipocf, const TCurrency& imp_min, TAbbuona_sheet& sheet)
{
const bool in_valuta = !imp_min.is_firm_value();
@ -168,11 +221,11 @@ void TAbbuona_partite::fill_sheet(const char tipocf, const TCurrency& imp_min, T
TString msg;
msg << TR("Elaborazione scadenze aperte per meno di ") << imp_min.string(true) << ' ';
msg << (in_valuta ? cod_val : TCurrency::get_firm_val());
TProgind pi(scadenze.items(), msg);
TProgress_monitor pi(scadenze.items(), msg);
TToken_string row; // Riga di lavoro sullo sheet
for (bool ok = scadenze.move_first(); ok; ok = scadenze.move_next())
{
if (!pi.addstatus(1))
if (!pi.add_status(1))
break;
row.cut(0) << tipocf;
@ -205,11 +258,17 @@ void TAbbuona_partite::fill_sheet(const char tipocf, const TCurrency& imp_min, T
if (!partita.esiste(nriga, nrata))
continue;
TRiga_scadenze& rata = partita.rata(nriga, nrata);
TImporto imp_res = rata.residuo(in_valuta);
imp_res.normalize(tipocf == 'C' ? 'D' : 'A');
const TRiga_scadenze& rata = partita.rata(nriga, nrata);
TImporto imp_rat = rata.importo(in_valuta);
imp_rat.normalize(tipocf == 'C' ? 'D' : 'A');
if (imp_rat.valore() < ZERO)
continue; // Nota di credito
const TImporto imp_res = residuo(rata, in_valuta);
const TCurrency residuo(imp_res.valore(), cod_val);
if (residuo > zero_val && residuo <= imp_min)
// if (residuo > zero_val && residuo <= imp_min) // Vecchio modo (solo positivo)
if (!residuo.is_zero() && abs(residuo.get_num()) < imp_min.get_num()) // Nuovo modo (anche negativi)
{
TImporto imp_val = rata.importo(in_valuta);
imp_val.normalize(imp_res.sezione());
@ -228,6 +287,7 @@ void TAbbuona_partite::fill_sheet(const char tipocf, const TCurrency& imp_min, T
row.add(scad.get(SCAD_NUMPART));
row.add(nriga);
row.add(nrata);
row.add(non_assegnati(partita) ? "X" : "");
sheet.add(row);
}
}
@ -269,9 +329,22 @@ bool TAbbuona_partite::genera_abbuono(TPartita& game, int nriga, int nrata,
// Creo una nuova riga di pagamento assegnado il flag di saldo
TRiga_scadenze& scad = game.rata(nriga, nrata);
TRectype new_pag = scad.new_row(nrigp); // Creo nuova riga e la duplico
new_pag.put(PAGSCA_ACCSAL, 'S'); // Pongo pagamento a saldo
const bool empty = game.modifica_pagamento(new_pag, valuta, true);
const bool unass = non_assegnati(game) > 0;
if (unass) // Pago la differenza ... e non mi fido
{
const TRiga_scadenze& r = game.rata(nriga, nrata);
TImporto res = residuo(r, false);
new_pag.put(PAGSCA_IMPORTO, res.valore());
if (valuta.in_valuta())
{
res = residuo(r, true);
new_pag.put(PAGSCA_IMPORTOVAL, res.valore());
}
}
else
new_pag.put(PAGSCA_ACCSAL, 'S'); // Pongo pagamento a saldo ... e mi fido
const bool empty = game.modifica_pagamento(new_pag, valuta, true);
if (empty)
{
msg.insert(TR("Errore di chiusura della rata"));
@ -279,7 +352,10 @@ bool TAbbuona_partite::genera_abbuono(TPartita& game, int nriga, int nrata,
}
else
{
msg.insert(TR("Chiusa rata"));
if (unass)
msg.insert(TR("Chiusa partita con rata"));
else
msg.insert(TR("Chiusa singola rata"));
log.log(0, msg);
}
return !empty;
@ -297,6 +373,7 @@ bool TAbbuona_partite::elabora(const TMask& msk, TAbbuona_sheet& scad_sheet) con
const int annoes = esc.date2esc(datacomp);
const TCausale caus(msk.get(F_CAUSALE), datareg.year());
const int riga_abb = tipo_cf == 'C' ? RIGA_ABBUONI_PASSIVI : RIGA_ABBUONI_ATTIVI;
TBill conto_abbuoni; caus.bill(riga_abb, conto_abbuoni);
@ -353,36 +430,44 @@ bool TAbbuona_partite::elabora(const TMask& msk, TAbbuona_sheet& scad_sheet) con
can_write = false;
}
TImporto abbuoni, diffcam;
TImporto banca, abbuoni, diffcam;
for (int i = 0; i < mov.cg_items(); i++)
{
// Calcola importo speso sul saldaconto per ogni riga contabile
TImporto abb = partite.importo_speso(numreg, i+1, false, 0x2);
const TImporto abb = partite.importo_speso(numreg, i+1, false, 0x2);
abbuoni -= abb; // Aggiungi abbuono al relativo totalizzatore
TImporto imp = abb;
TImporto dic;
if (valuta.in_valuta())
{
dic = partite.importo_speso(numreg, i+1, false, 0x4);
diffcam -= dic; // Aggiungi differenza cambi al relativo totalizzatore
imp += dic;
imp.normalize();
}
const TImporto imp = partite.importo_speso(numreg, i+1);
banca -= imp;
banca += abb;
banca += dic;
TRectype& rmov = mov.cg(i);
rmov.put(RMV_SEZIONE, imp.sezione());
rmov.put(RMV_IMPORTO, imp.valore());
rmov.put(RMV_ANNOES, annoes);
}
if (abbuoni.is_zero())
if (!banca.is_zero())
{
log.log(2, TR("Il totale degli abbuoni è nullo."));
can_write = false;
banca.normalize();
TRectype& rmov = mov.cg(-1);
rmov.put(RMV_ROWTYPE, 'I'); // Importi
rmov.put(RMV_SEZIONE, banca.sezione());
rmov.put(RMV_IMPORTO, banca.valore());
rmov.put(RMV_ANNOES, annoes);
conto_abbuoni.put(rmov);
mov.curr().add(MOV_TOTDOC, -banca.valore());
}
else
if (!abbuoni.is_zero())
{
abbuoni.normalize();
@ -393,7 +478,6 @@ bool TAbbuona_partite::elabora(const TMask& msk, TAbbuona_sheet& scad_sheet) con
rmov.put(RMV_ANNOES, annoes);
conto_abbuoni.put(rmov);
}
if (!diffcam.is_zero())
{
diffcam.normalize();
@ -415,6 +499,16 @@ bool TAbbuona_partite::elabora(const TMask& msk, TAbbuona_sheet& scad_sheet) con
log.log(0, msg.cut(0));
msg << TR("Aggiornato saldaconto legato al movimento n.") << numreg;
log.log(1, msg);
TSaldo_agg sa;
for (int i = 0; i < mov.cg_items(); i++)
{
const TRectype& rmov = mov.cg(i);
sa.aggiorna(rmov);
}
sa.set_num_ulmov(mov.curr().get_long(MOV_NUMREG));
sa.set_data_ulmov(mov.curr().get_date(MOV_DATAREG));
sa.registra();
}
else
{
@ -455,3 +549,4 @@ int sc1400(int argc, char** argv)
return 0;
}

@ -129,7 +129,7 @@ public:
void print_header();
void update_totals(bool what,real& res,real& non,real& buo,
real& s1,real& s2,real& s3,real& s4,real& s5, real& s6, real& s7);
void compute_unassigned(TPartita& p);
void compute_unassigned(const TPartita& p);
void compute_all(TPartita& p, TBill& bill);
TStampaScaduto();
};
@ -182,17 +182,22 @@ void TStampaScaduto::update_totals(bool what, real& res, real& non, real& buo,
a.add(_codval,ll,is_key);
}
void TStampaScaduto::compute_unassigned(TPartita& p)
void TStampaScaduto::compute_unassigned(const TPartita& p)
{
TRecord_array& ra = p.unassigned();
const TRecord_array& ra = ((TPartita&)p).unassigned();
_uns = ZERO; _unsnc = ZERO;
_uns = _unsnc = ZERO;
for (int r = ra.last_row(); r > 0; r = ra.pred_row(r))
{
const TRectype& rec = ra.row(r);
const TRiga_partite& sum = p.riga(rec.get_int(PAGSCA_NRIGP));
const TDate data_reg = sum.get_date(PART_DATAREG);
if (data_reg > _limop || p.chiusa()) // Ignoro partite chiuse dal 27-01-2014
continue;
const char * field = (_stvaluta && sum.in_valuta() ? PAGSCA_IMPORTOVAL : PAGSCA_IMPORTO);
if (sum.get_int(PART_TIPOMOV) == 2) // Is it a credit note ?
if (sum.tipo() == tm_nota_credito) // Is it a credit note ?
_unsnc += rec.get_real(field);
else
_uns += rec.get_real(field);
@ -201,6 +206,29 @@ void TStampaScaduto::compute_unassigned(TPartita& p)
void TStampaScaduto::compute_all(TPartita& p, TBill& bill)
{
// 27-01-2014 Se una partita ha l'utlimo pagamento prima della data limite, posso ignorarla
if (p.chiusa())
{
TDate last_pag;
for (int r = p.last(); r > 0; r = p.pred(r)) // Browse all rows (partite)
{
const TRiga_partite& rp = p.riga(r);
if (rp.tipo() > tm_fattura)
{
const TDate datareg = rp.get(PART_DATAREG);
if (datareg > last_pag)
{
last_pag = datareg;
if (last_pag > _limop)
break;
}
}
}
if (last_pag.ok() && last_pag <= _limop)
return; // Ignora partite chiuse da tempo immemorabile
}
TGameLog gl(p);
real residuo,nonscad,buonf,s1,s2,s3,s4,s5,s6,s7,res_pagati;
@ -211,7 +239,9 @@ void TStampaScaduto::compute_all(TPartita& p, TBill& bill)
// se la data di registrazione della partita ' > di _limop (data lim operazione)
// non deve scorrere le scadenze
const TDate data_reg = rp.get_date(PART_DATAREG);
if (data_reg > _limop) continue;
if (data_reg > _limop)
continue;
for (int n=rp.rate(); n > 0; n--) // Browse all rows (scadenze)
{
const TRiga_scadenze& rs = rp.rata(n);
@ -248,11 +278,11 @@ void TStampaScaduto::compute_all(TPartita& p, TBill& bill)
const TRectype pg = rs.row(pp);
const TRiga_partite& sum = p.riga(pp);
const char sez = sum.sezione();
const int tipomov = sum.get_int(PART_TIPOMOV);
const tipo_movimento tipomov = sum.tipo();
// se tipomov e' 2 (Nota di credito assegnata)
// storna da scdz. In entrambi i casi si ha l'operatore +=, perche' nel TImporto e' gia'
// compresa la sezione opposta
if (tipomov==2)
if (tipomov==tm_nota_credito)
{
work_imp = TImporto(sez,pg.get_real(field));
scd += work_imp;