Solleciti via mail

git-svn-id: svn://10.65.10.50/branches/R_10_00@22854 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2013-05-06 08:54:56 +00:00
parent 930208fa9f
commit 0e28e89c9f
11 changed files with 563 additions and 472 deletions

View File

@ -150,4 +150,29 @@ BEGIN
ADD RUN cg0 -1 F ADD RUN cg0 -1 F
END END
NUMBER F_NUMERO 7
BEGIN
PROMPT 1 4 "Registrazione "
USE LF_PARTITE SELECT (TIPOC=#F_TIPO)&&(NREG!="")
JOIN LF_CLIFO INTO TIPOCF=TIPOC CODCF==SOTTOCONTO
INPUT NREG F_NUMERO
DISPLAY "Numero" NREG
DISPLAY "Data@10" DATAREG
DISPLAY "Tipo" TIPOMOV
DISPLAY "C/F" TIPOC
DISPLAY "Gruppo" GRUPPOCL
DISPLAY "Conto" CONTOCL
DISPLAY "Sottonto" SOTTOCONTO
DISPLAY "Ragione sociale@50" LF_CLIFO->RAGSOC
DISPLAY "Descrizione@50" DESCR
OUTPUT F_NUMERO NREG
OUTPUT F_GRUPPO GRUPPOCL
OUTPUT F_CONTO CONTOCL
OUTPUT F_SOTTOCONTO SOTTOCONTO
OUTPUT F_CLIENTE SOTTOCONTO
OUTPUT F_FORNITORE SOTTOCONTO
CHECKTYPE SEARCH
END
ENDMASK ENDMASK

View File

@ -2,6 +2,7 @@
#include <mask.h> #include <mask.h>
#include <config.h> #include <config.h>
#include <progind.h> #include <progind.h>
#include <recarray.h>
#include <recset.h> #include <recset.h>
#include <relation.h> #include <relation.h>
#include <reputils.h> #include <reputils.h>
@ -34,6 +35,7 @@ void TAllinea_partite::on_config_change()
void TAllinea_partite::allinea(int logicnum, TLog_report& log, bool& can_write) void TAllinea_partite::allinea(int logicnum, TLog_report& log, bool& can_write)
{ {
TFast_isamfile fast(logicnum);
TString query; TString query;
query << "USE " << logicnum; query << "USE " << logicnum;
TISAM_recordset recset(query); TISAM_recordset recset(query);

View File

@ -183,12 +183,14 @@ void TAbbuona_partite::fill_sheet(const char tipocf, const TCurrency& imp_min, T
row.add(scad.get(SCAD_NUMPART)); row.add(scad.get(SCAD_NUMPART));
row.add(scad.get(SCAD_NRIGA)); row.add(scad.get(SCAD_NRIGA));
const TRectype& game_rec = cache().get(LF_PARTITE, row); const TRectype& game_rec = cache().get(LF_PARTITE, row);
if (game_rec.empty())
continue;
// Ignora partite con la valuta incompatibile // Ignora partite con la valuta incompatibile
const TString& game_val = game_rec.get(PART_CODVAL); const TString& game_val = game_rec.get(PART_CODVAL);
if (in_valuta) if (in_valuta)
{ {
if (game_val != cod_val) if (!same_values(game_val, cod_val))
continue; continue;
} }
else else
@ -200,7 +202,10 @@ void TAbbuona_partite::fill_sheet(const char tipocf, const TCurrency& imp_min, T
TPartita partita(game_rec); TPartita partita(game_rec);
const int nriga = scad.get_int(SCAD_NRIGA); const int nriga = scad.get_int(SCAD_NRIGA);
const int nrata = scad.get_int(SCAD_NRATA); const int nrata = scad.get_int(SCAD_NRATA);
TRiga_scadenze& rata = partita.riga(nriga).rata(nrata); if (!partita.esiste(nriga, nrata))
continue;
TRiga_scadenze& rata = partita.rata(nriga, nrata);
TImporto imp_res = rata.residuo(in_valuta); TImporto imp_res = rata.residuo(in_valuta);
imp_res.normalize(tipocf == 'C' ? 'D' : 'A'); imp_res.normalize(tipocf == 'C' ? 'D' : 'A');
const TCurrency residuo(imp_res.valore(), cod_val); const TCurrency residuo(imp_res.valore(), cod_val);

View File

@ -31,6 +31,8 @@ protected:
virtual bool get_next_mail(TToken_string& to, TToken_string& cc, TToken_string& ccn, virtual bool get_next_mail(TToken_string& to, TToken_string& cc, TToken_string& ccn,
TString& subj, TString& text, TToken_string& attach, short& ui) const; TString& subj, TString& text, TToken_string& attach, short& ui) const;
const TString& game_key(const TRectype& part) const; // Costruisce chiave univoca per TAssoc_array partite
bool ci_sono_scadenze_aperte(const TPartita& game, const TDate& dal, const TDate& al) const;
int print_sol(); // stampa l'elemento corrente int print_sol(); // stampa l'elemento corrente
public: public:
@ -92,6 +94,42 @@ bool TStampaSol_application::print_selected()
return TRUE; return TRUE;
} }
bool TStampaSol_application::ci_sono_scadenze_aperte(const TPartita& game, const TDate& dal, const TDate& al) const
{
bool found = false;
const int ultima = game.last();
if (ultima > 0 && !game.chiusa(true))
{
for (int r = ultima; r > 0; r = game.pred(r))
{
const TRiga_partite& row = game.riga(r);
if (row.is_fattura() && row.get_date(PART_DATAREG) <= al)
{
for (int s = row.rate(); s > 0 ;s--)
{
const TRiga_scadenze& rata = row.rata(s);
if (!rata.chiusa(true))
{
const TDate data = rata.get(SCAD_DATASCAD);
if (data >= dal && data <= al)
found = true;
}
}
}
}
}
return found;
}
const TString& TStampaSol_application::game_key(const TRectype& part) const
{
TToken_string& tok = get_tmp_string();
tok = part.get(PART_ANNO);
tok.add(part.get(PART_NUMPART));
return tok;
}
int TStampaSol_application::print_sol() int TStampaSol_application::print_sol()
{ {
TSol_form& f = form(); TSol_form& f = form();
@ -99,7 +137,7 @@ int TStampaSol_application::print_sol()
// preparazione variabili per controllo lingua // preparazione variabili per controllo lingua
const TRectype &clf= f.cursor()->file().curr(); const TRectype &clf= f.cursor()->file().curr();
const TString lincf(clf.get(CLI_CODLIN)); const TString lincf(clf.get(CLI_CODLIN));
bool ok= TRUE; bool ok = true;
// controllo lingua ditta corrente // controllo lingua ditta corrente
if ((f.lingua() == _lingua_ditta && !lincf.empty()) || f.lingua() != _lingua_ditta) ok= (lincf == f.lingua()); if ((f.lingua() == _lingua_ditta && !lincf.empty()) || f.lingua() != _lingua_ditta) ok= (lincf == f.lingua());
@ -113,40 +151,56 @@ int TStampaSol_application::print_sol()
partite.put(PART_SOTTOCONTO, clf.get(CLI_CODCF)); partite.put(PART_SOTTOCONTO, clf.get(CLI_CODCF));
const TRectype filter(partite.curr()); const TRectype filter(partite.curr());
bool one_printed = FALSE; // booleano di controllo di riuscita della stampa bool one_printed = false; // booleano di controllo di riuscita della stampa
const bool sel_tot_saldo = f.get_sel_tot_saldo(); // selezione sul saldo totale cliente const bool sel_tot_saldo = f.get_sel_tot_saldo(); // selezione sul saldo totale cliente
const real sel_importo(f.get_sel_importo()); // importo di selezione const real sel_importo(f.get_sel_importo()); // importo di selezione
const TDate data_limite_soll(f.data_limite_operazione()); const TDate data_inizio_soll = _msk->get(F_DATAINISCAD);
const TDate data_limite_scad(f.data_limite_scaduto()); const TDate data_limite_soll = f.data_limite_operazione();
const TDate data_limite_scaduto = f.data_limite_scaduto();
if (sel_tot_saldo && sel_importo > ZERO) TAssoc_array games_in_range;
if ((sel_tot_saldo && sel_importo > ZERO) || data_inizio_soll.ok())
{ {
real saldo; real saldo;
for (int err = partite.read(_isgteq); for (int err = partite.read(_isgteq);
err == NOERR && partite.curr() == filter; err == NOERR && partite.curr() == filter;
err = partite.read(_isgreat)) err = partite.read(_isgreat))
{ {
TPartita game(partite.curr()); const TPartita game(partite.curr());
saldo += game.calcola_scaduto_al(FALSE, data_limite_soll); // Era data_limite_scad! const real sld = game.calcola_scaduto_al(false, data_limite_soll);
if (sld > ZERO && data_inizio_soll.ok() &&
ci_sono_scadenze_aperte(game, data_inizio_soll, data_limite_soll))
games_in_range.add(game_key(partite.curr()));
saldo += sld;
partite.put(PART_NRIGA, 9999); partite.put(PART_NRIGA, 9999);
} }
if (saldo < sel_importo)
if (sel_tot_saldo && sel_importo > ZERO && saldo < sel_importo)
return 0; return 0;
if (data_inizio_soll.ok() && games_in_range.empty())
return 0;
partite.curr() = filter; partite.curr() = filter;
} }
for (int err = partite.read(_isgteq); for (int err = partite.read(_isgteq);
err == NOERR && partite.curr() == filter; err == NOERR && partite.curr() == filter;
err = partite.read(_isgreat)) err = partite.read(_isgreat))
{ {
TPartita game(partite.curr()); if (data_inizio_soll.ok() && !games_in_range.is_key(game_key(partite.curr())))
const real saldo = game.calcola_scaduto_al(FALSE, data_limite_scad); continue; // Scarta parite fuori range di date
const TPartita game(partite.curr());
const real saldo = game.calcola_scaduto_al(false, data_limite_scaduto);
TImporto unreferenced; //Totale non assegnati per questa partita. TImporto unreferenced; //Totale non assegnati per questa partita.
{ {
// E' giusto calcolare il saldo, comprendente i non assegnati. // E' giusto calcolare il saldo, comprendente i non assegnati.
// se il saldo della partita chiude in avere va sommato ad unreferenced // se il saldo della partita chiude in avere va sommato ad unreferenced
const TRiga_partite& sum = game.riga(game.first()); const TRiga_partite& sum = game.riga(game.first());
unreferenced = game.calcola_saldo_al(game.in_valuta() && f.in_valuta(),data_limite_soll, data_limite_scad, data_limite_scad); unreferenced = game.calcola_saldo_al(game.in_valuta() && f.in_valuta(),data_limite_soll, data_limite_scaduto, data_limite_scaduto);
if (unreferenced.valore() > ZERO && unreferenced.sezione() == 'A') if (unreferenced.valore() > ZERO && unreferenced.sezione() == 'A')
{ {
unreferenced.normalize('A'); //per i non assegnati/anticipi c'e' solo la colonna AVERE unreferenced.normalize('A'); //per i non assegnati/anticipi c'e' solo la colonna AVERE
@ -227,10 +281,13 @@ bool TStampaSol_application::get_next_mail(TToken_string& to, TToken_string& cc,
if (ok) if (ok)
{ {
const TRectype& clifo = form().cursor()->curr(); const TRectype& clifo = form().cursor()->curr();
const TDate oggi = mask().get(F_DATASEND); TDate oggi = mask().get(F_DATALIMSOL);
if (!oggi.ok())
oggi = mask().get_date(F_DATASEND);
subj << TR("Sollecito ") << prefix().firm().ragione_sociale(); subj << TR("Sollecito ") << prefix().firm().ragione_sociale();
text << "Spett. " << clifo.get(CLI_RAGSOC) << '\n'; TString ragsoc = clifo.get(CLI_RAGSOC); ragsoc.strip_double_spaces();
text << "Spett. " << ragsoc << '\n';
text << TR("Si sollecita il rispetto delle scadenze aperte al ") << oggi << TR(" riepilogate nel file ") << attach text << TR("Si sollecita il rispetto delle scadenze aperte al ") << oggi << TR(" riepilogate nel file ") << attach
<< "\n" << prefix().firm().ragione_sociale(); << "\n" << prefix().firm().ragione_sociale();
if (to.full()) if (to.full())
@ -292,7 +349,7 @@ bool TStampaSol_application::mail_selected()
{ {
fc = i; // muove il cursore alla posizione corrente fc = i; // muove il cursore alla posizione corrente
printer().set_printtype(exportprinter); printer().set_export_file("soll.pdf", true);
printer().open(); printer().open();
const int ret = print_sol(); const int ret = print_sol();
printer().close(); printer().close();

View File

@ -5,9 +5,10 @@
#include "sc2100a.h" #include "sc2100a.h"
#endif #endif
#define F_DATALIMSOL 106 #define F_DATAINISCAD 130
#define F_STAMPESP 107 #define F_DATALIMSOL 131
#define F_IMPORMIN 108 #define F_STAMPESP 132
#define F_RIFIMPMIN 109 #define F_IMPORMIN 133
#define F_RIFIMPMIN 134
#endif #endif

View File

@ -97,16 +97,20 @@ BEGIN
PROMPT 2 4 "Data limite operazione " PROMPT 2 4 "Data limite operazione "
END END
DATE F_DATALIMSOL DATE F_DATALIMSOL
BEGIN BEGIN
PROMPT 2 5 "Data limite sollecito " PROMPT 2 5 "Data limite solleciti "
FLAGS "A" FLAGS "A"
// VALIDATE DATE_CMP_FUNC <= F_DATASEND
// WARNING "La data limite sollecito deve essere specificata e non puo' essere superiore alla data di invio"
CHECKTYPE REQUIRED CHECKTYPE REQUIRED
END END
DATE F_DATAINISCAD
BEGIN
PROMPT 42 5 "Dal "
VALIDATE DATE_CMP_FUNC <= F_DATALIMSOL
WARNING "Inserire una data precedente a quella limite"
END
CURRENCY F_IMPORMIN 18 CURRENCY F_IMPORMIN 18
BEGIN BEGIN
PROMPT 2 6 "Importo minimo " PROMPT 2 6 "Importo minimo "

View File

@ -230,8 +230,8 @@ void TESSL_row::print_on(TPrint_section& body)
dare.set(""); dare.set("");
} }
TForm_item& importo_in_lire = body.find_field(PEC_IMPEURO); TForm_item& importo_in_euro = body.find_field(PEC_IMPEURO);
set_imp(importo_in_lire, _importo_lire, ""); // In generale va espresso nella valuta della ditta set_imp(importo_in_euro, _importo_euro, ""); // In generale va espresso nella valuta della ditta
TForm_item& scaduto = body.find_field(PEC_SCADUTO); TForm_item& scaduto = body.find_field(PEC_SCADUTO);
set_imp(scaduto, _scaduto, cod_valuta); set_imp(scaduto, _scaduto, cod_valuta);
@ -429,7 +429,7 @@ void TESSL_array::add_row(const TRiga_partite& row)
real importo_in_lire; real importo_in_lire;
const char sezione = form().sezione_normale(); const char sezione = form().sezione_normale();
const TDate data_op(row.get(PART_DATAREG)); const TDate data_op = row.get(PART_DATAREG);
if (data_op <= form().data_limite_operazione()) if (data_op <= form().data_limite_operazione())
{ {
if (row.is_fattura()) if (row.is_fattura())
@ -437,14 +437,13 @@ void TESSL_array::add_row(const TRiga_partite& row)
for (int r = 1; r <= row.rate(); r++) for (int r = 1; r <= row.rate(); r++)
{ {
const TRiga_scadenze& rata = row.rata(r); const TRiga_scadenze& rata = row.rata(r);
const TDate data_scad(rata.get(SCAD_DATASCAD)); const TDate data_scad = rata.get(SCAD_DATASCAD);
TESSL_row& rec = new_row(row, data_scad, rata.importo(in_valuta), r); TESSL_row& rec = new_row(row, data_scad, rata.importo(in_valuta), r);
if (in_valuta) if (in_valuta)
{ {
TImporto il(rata.importo(FALSE)); TImporto il(rata.importo(false));
il.normalize(sezione); il.normalize(sezione);
rec.importo_in_lire(il.valore()); rec.importo_in_euro(il.valore());
} }
if (data_scad <= form().data_limite_scaduto()) if (data_scad <= form().data_limite_scaduto())
{ {
@ -462,7 +461,7 @@ void TESSL_array::add_row(const TRiga_partite& row)
{ {
TImporto i(row.importo(FALSE, 0x1)); TImporto i(row.importo(FALSE, 0x1));
i.normalize(sezione); i.normalize(sezione);
riga.importo_in_lire(i.valore()); riga.importo_in_euro(i.valore());
} }
const int tipo_pag = row.get_int(PART_TIPOPAG); const int tipo_pag = row.get_int(PART_TIPOPAG);
@ -496,7 +495,7 @@ void TESSL_array::add_row(const TRiga_partite& row)
if (in_valuta) if (in_valuta)
{ {
ritenute.normalize(sezione); ritenute.normalize(sezione);
r.importo_in_lire(ritenute.valore()); r.importo_in_euro(ritenute.valore());
} }
else else
r.importo(ritenute); r.importo(ritenute);
@ -511,7 +510,7 @@ void TESSL_array::add_row(const TRiga_partite& row)
{ {
TImporto il(row.importo(FALSE, 0x2)); TImporto il(row.importo(FALSE, 0x2));
il.normalize(sezione == 'D' ? 'A' : 'D'); il.normalize(sezione == 'D' ? 'A' : 'D');
r.importo_in_lire(il.valore()); r.importo_in_euro(il.valore());
} }
} }
@ -670,7 +669,7 @@ void TESSL_form::stampa_riporti(TPrinter& pr)
TESSL_row rip(desc, t.importo().normalize(),val); TESSL_row rip(desc, t.importo().normalize(),val);
rip.scaduto(t.scaduto()); rip.scaduto(t.scaduto());
rip.esposto(t.esposto()); rip.esposto(t.esposto());
rip.importo_in_lire(t.importo_euro()); rip.importo_in_euro(t.importo_euro());
rip.print_on(body); rip.print_on(body);
pr.setfooterline(j + 1, body.row(0)); pr.setfooterline(j + 1, body.row(0));
} }
@ -932,7 +931,7 @@ bool TESSL_form::print_game(const TPartita& game)
TPrint_section& body = section('B'); TPrint_section& body = section('B');
TImporto saldo; TImporto saldo;
real scaduto, esposto, implire; real scaduto, esposto, impeuro;
// Stampa le righe di partita // Stampa le righe di partita
@ -964,12 +963,12 @@ bool TESSL_form::print_game(const TPartita& game)
pr.print(body.row(0)); pr.print(body.row(0));
totali().add(riga.importo(), riga.scaduto(), riga.esposto(), totali().add(riga.importo(), riga.scaduto(), riga.esposto(),
riga.importo_in_lire(), riga.valuta().codice()); riga.importo_in_euro(), riga.valuta().codice());
saldo += riga.importo(); saldo += riga.importo();
scaduto += riga.scaduto(); scaduto += riga.scaduto();
esposto += riga.esposto(); esposto += riga.esposto();
implire += riga.importo_in_lire(); impeuro += riga.importo_in_euro();
ok = TRUE; ok = TRUE;
} }
@ -990,7 +989,7 @@ bool TESSL_form::print_game(const TPartita& game)
sld.scaduto(scaduto); sld.scaduto(scaduto);
sld.esposto(esposto); sld.esposto(esposto);
sld.importo_in_lire(implire); sld.importo_in_euro(impeuro);
sld.print_on(body); sld.print_on(body);
pr.print(body.row(0)); pr.print(body.row(0));
} }
@ -1051,10 +1050,10 @@ TESSL_form::TESSL_form(const TESSL_mask& m, bool gesval, short id_datalim, short
TCursor_sheet& cs = m.cur_sheet(); TCursor_sheet& cs = m.cur_sheet();
_cursore = cs.cursor(); _cursore = cs.cursor();
_dlo = id_datalim > 0 ? TDate(m.get(id_datalim)) : eotime; _dlo = id_datalim > 0 ? m.get_date(id_datalim) : eotime;
if (!_dlo.ok()) if (!_dlo.ok())
_dlo = eotime; _dlo = eotime;
_dls = id_datascad > 0 ? TDate(m.get(id_datascad)) : eotime; _dls = id_datascad > 0 ? m.get_date(id_datascad) : eotime;
if (id_giorni_rischio > 0) if (id_giorni_rischio > 0)
_giorni_rischio = m.get_int(id_giorni_rischio); _giorni_rischio = m.get_int(id_giorni_rischio);

View File

@ -57,12 +57,12 @@ public:
}; };
class TESSL_form; class TESSL_form;
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
// TESSL_row // TESSL_row
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
class TESSL_row : public TSortable class TESSL_row : public TSortable
{ {
TDate _data; // Data scadenza o pagamento TDate _data; // Data scadenza o pagamento
int _riga; // Riga della fattura int _riga; // Riga della fattura
@ -76,7 +76,7 @@ class TESSL_row : public TSortable
long _num_prot; // Protocollo IVA long _num_prot; // Protocollo IVA
long _num_reg; // Numero registrazione long _num_reg; // Numero registrazione
TImporto _importo; // Importo in valuta TImporto _importo; // Importo in valuta
real _importo_lire; // Importo in lire real _importo_euro; // Importo in euro
real _scaduto; // Importo scaduto real _scaduto; // Importo scaduto
real _esposto; // Importo esposto real _esposto; // Importo esposto
bool _salvo_buon_fine; // Importo esposto salvo buon fine bool _salvo_buon_fine; // Importo esposto salvo buon fine
@ -98,7 +98,7 @@ public:
void importo(const TImporto& i) { _importo = i; } void importo(const TImporto& i) { _importo = i; }
void scaduto(const real& s) { _scaduto = s; } void scaduto(const real& s) { _scaduto = s; }
void esposto(const real& e) { _esposto = e; } void esposto(const real& e) { _esposto = e; }
void importo_in_lire(const real& il) { _importo_lire = il; } void importo_in_euro(const real& imp) { _importo_euro = imp; }
void salvo_buon_fine(bool sbf) { _salvo_buon_fine = sbf; } void salvo_buon_fine(bool sbf) { _salvo_buon_fine = sbf; }
const TString& causale() const { return _causale; } const TString& causale() const { return _causale; }
@ -106,9 +106,9 @@ public:
long num_reg() const { return _num_reg; } long num_reg() const { return _num_reg; }
const TValuta& valuta() const { return _valuta; } const TValuta& valuta() const { return _valuta; }
const TImporto& importo() const { return _importo; } const TImporto& importo() const { return _importo; }
real importo_in_lire() const { return _importo_lire; } const real& importo_in_euro() const { return _importo_euro; }
real scaduto() const { return _scaduto; } const real& scaduto() const { return _scaduto; }
real esposto() const { return _esposto; } const real& esposto() const { return _esposto; }
const TDate& data() const { return _data; } const TDate& data() const { return _data; }
bool in_valuta() const { return _valuta.in_valuta(); } bool in_valuta() const { return _valuta.in_valuta(); }
@ -134,7 +134,6 @@ class TESSL_form : public TForm
TCursor* _cursore; TCursor* _cursore;
TTotalizer _totali; TTotalizer _totali;
TString _lingua; TString _lingua;
TDate _dlo, _dls, _dir; TDate _dlo, _dls, _dir;

View File

@ -45,7 +45,6 @@ public:
bool get_sel_tot_saldo() const { return _sel_tot_saldo;} bool get_sel_tot_saldo() const { return _sel_tot_saldo;}
const real & get_sel_importo() const { return _sel_importo; } const real & get_sel_importo() const { return _sel_importo; }
TSol_form(const TSol_mask& m, bool gesval, short id_datalim, short id_datascad); TSol_form(const TSol_mask& m, bool gesval, short id_datalim, short id_datascad);
virtual ~TSol_form() {}
}; };
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////