Patch level : 12.0 724

Files correlati     : fp0500, fplib, config
Commento            :
- Monitor mancata consegna: aggiunta possibilità di inserire corpo alla mail
This commit is contained in:
Simone Palacino 2019-03-07 10:38:43 +01:00
parent 9aba94629f
commit 028ffdaedc
9 changed files with 96 additions and 25 deletions

View File

@ -26,7 +26,8 @@
class TMancati_mask : public TAutomask class TMancati_mask : public TAutomask
{ {
int _idx;
protected: protected:
enum {_codnum, _tipodoc, _dastato, _astato, _tiposdi}; enum {_codnum, _tipodoc, _dastato, _astato, _tiposdi};
@ -45,8 +46,9 @@ protected:
public: public:
TMancati_mask() : TAutomask("fp0500a"), _filter_changed(true) TMancati_mask() : TAutomask("fp0500a"), _filter_changed(true)
{ {
disable(DLG_OK); disable(DLG_OK);
load_all_fields(); _idx = -1;
load_all_fields();
} }
void save_all_fields() const; void save_all_fields() const;
}; };
@ -59,6 +61,20 @@ void TMancati_mask::save_all_fields() const
// Salvo lo sheet // Salvo lo sheet
TFP_selected_docs selected_docs; TFP_selected_docs selected_docs;
selected_docs.save_sheet(sfield(F_DOCUMENTI_TIPO)); selected_docs.save_sheet(sfield(F_DOCUMENTI_TIPO));
// Salvo messaggio corpo mail
TToken_string msg(get(F_BODYMAIL), '\n');
int idx = 0;
for(const char* row = msg.get(); row; row = msg.get())
fp_settings().set_body_mail(row, idx++);
if(idx < _idx)
{
for(int i=idx; i<_idx; i++)
{
fp_settings().remove_para_ini(idx);
}
}
} }
void TMancati_mask::load_all_fields() void TMancati_mask::load_all_fields()
@ -106,6 +122,19 @@ void TMancati_mask::load_all_fields()
} }
sheet.force_update(); sheet.force_update();
sheet.show(); sheet.show();
// Carico messaggio corpo mail già salvato o vuoto se mai inserito
TString msg;
int idx = 0;
for(TString row = fp_settings().get_body_mail(idx); row != "STOpsTOP"; row = fp_settings().get_body_mail(idx))
{
if (idx++ > 0)
msg << '\n';
msg << row;
}
_idx = idx;
set(F_BODYMAIL, msg);
} }
void TMancati_mask::fill() void TMancati_mask::fill()
@ -170,6 +199,7 @@ void TMancati_mask::fill()
|| filter_selected == "A") || filter_selected == "A")
{ {
TToken_string& row = docs.row(-1); TToken_string& row = docs.row(-1);
row = ""; row = "";
row.add(rec.get(DOC_ANNO).as_int(), 1); row.add(rec.get(DOC_ANNO).as_int(), 1);
row.add(rec.get(DOC_CODNUM).as_string()); row.add(rec.get(DOC_CODNUM).as_string());
@ -261,11 +291,8 @@ void TMancati_mask::next_page(int p)
{ {
TAutomask::next_page(p); TAutomask::next_page(p);
if (curr_page() == 1) if (curr_page() == 1)
{
enable(DLG_OK); enable(DLG_OK);
}
else enable(DLG_OK, false); else enable(DLG_OK, false);
} }
} }
@ -338,6 +365,7 @@ void TMancati_app::main_loop()
{ {
TString_array& sht = mask.sfield(F_DOCS).rows_array(); TString_array& sht = mask.sfield(F_DOCS).rows_array();
TFp_mail_sender mail_sender; TFp_mail_sender mail_sender;
const TString& msg = mask.get(F_BODYMAIL);
if ( !mail_sender.set_alleg(fp_settings().get_allega_fat()) ) if ( !mail_sender.set_alleg(fp_settings().get_allega_fat()) )
{ {
@ -372,7 +400,7 @@ void TMancati_app::main_loop()
bool sent = TString(riga->get(mask.sfield(F_DOCS).cid2index(S_SENT))) == "X"; bool sent = TString(riga->get(mask.sfield(F_DOCS).cid2index(S_SENT))) == "X";
mail_sender.set_doc(anno, ndoc, codnum, tipodoc, codcf, mail, accord, ragsoc, sent); mail_sender.set_doc(anno, ndoc, codnum, tipodoc, codcf, mail, accord, ragsoc, sent);
if (mail_sender.send()) { if (mail_sender.send(msg)) {
riga->add("", 0); // Se l'invio avviene con successo sfleggo la riga riga->add("", 0); // Se l'invio avviene con successo sfleggo la riga
riga->add("X", 11); // E segno inviata riga->add("X", 11); // E segno inviata
} }

View File

@ -5,6 +5,7 @@
#define F_SETDEFCOD 404 #define F_SETDEFCOD 404
#define F_SETCODEST 405 #define F_SETCODEST 405
#define F_VALCODEST 406 #define F_VALCODEST 406
#define F_BODYMAIL 407
#define END_MASK 499 #define END_MASK 499

View File

@ -54,6 +54,11 @@ BEGIN
ITEM "Tipo SDI" ITEM "Tipo SDI"
END END
MEMO F_BODYMAIL 78 10
BEGIN
PROMPT 1 12 "Messaggio del corpo della EMail (senza firma)"
END
ENDPAGE ENDPAGE
PAGE "Elenco Fatture" 0 2 0 0 PAGE "Elenco Fatture" 0 2 0 0

View File

@ -227,6 +227,7 @@ public:
const TString& get_esp_est_cod() const; const TString& get_esp_est_cod() const;
const bool is_f8() const; const bool is_f8() const;
const bool get_check_not_block() const; const bool get_check_not_block() const;
const TString& get_body_mail(int idx = -1) const;
// Setters // Setters
void set_db_indirizzo(const TString& ind) const; void set_db_indirizzo(const TString& ind) const;
@ -243,6 +244,9 @@ public:
void set_esp_est_cod(const TString& esp_est_cod) const; void set_esp_est_cod(const TString& esp_est_cod) const;
void set_f8(bool f8) const; void set_f8(bool f8) const;
void set_check_not_block(bool not_block) const; void set_check_not_block(bool not_block) const;
void set_body_mail(const char* msg, int idx = -1) const;
void remove_para_ini(int idx);
}; };
inline TFP_settings& fp_settings() inline TFP_settings& fp_settings()
@ -327,10 +331,10 @@ class TFp_mail_sender
public: public:
void set_doc(const int anno, const long ndoc, const TFixed_string& codnum, const TFixed_string& tipodoc, const long codcf, TString mail, bool accord, TString ragsoc, bool sent); void set_doc(const int anno, const long ndoc, const TFixed_string& codnum, const TFixed_string& tipodoc, const long codcf, TString mail, bool accord, TString ragsoc, bool sent);
bool genera_pdf(); bool genera_pdf();
bool send(); bool send(const TString& msg);
bool get_mail(TToken_string& to, TToken_string& cc, TToken_string& ccn, TString& subj, TString& text, TToken_string& attach, short& flags); bool get_mail(TToken_string& to, TToken_string& cc, TToken_string& ccn, TString& subj, TString& text, TToken_string& attach, short& flags);
bool spotlite_send_mail(const TFilename& pdf); bool spotlite_send_mail(const TFilename& pdf, const TString& msg);
bool spotlite_send_mail(); bool spotlite_send_mail(const TString& msg);
bool set_alleg(const bool allega_fat); bool set_alleg(const bool allega_fat);
TFp_mail_sender() { _error = -1; } TFp_mail_sender() { _error = -1; }

View File

@ -27,7 +27,7 @@ void set_connection(SSimple_query& s)
TString ip = fp_settings().get_db_indirizzo(); TString ip = fp_settings().get_db_indirizzo();
if (ip.upper() != "TESTCAMPO2012") if (ip.upper() != "TESTCAMPO2012")
{ {
if (s.sq_connect("TESTCAMPO2012@FP_HDI", if (s.sq_connect("TESTCAMPO2012@FP_CISLAGHI",
"fp", "fp",
"fp", "fp",
TSDB_MSSQL) != NOERR) TSDB_MSSQL) != NOERR)
@ -1875,7 +1875,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
paf1800f.set("PI_PREZZOUNIT", converti_prezzo(doc.spese_incasso(imponibile, 6, _netto))); paf1800f.set("PI_PREZZOUNIT", converti_prezzo(doc.spese_incasso(imponibile, 6, _netto)));
paf1800f.set("PI_PRZTOTALE", converti_prezzo(doc.spese_incasso(imponibile, 6, _netto))); paf1800f.set("PI_PRZTOTALE", converti_prezzo(doc.spese_incasso(imponibile, 6, _netto)));
set_IVA(ini_get_string(CONFIG_DITTA, "ve", "SPINCODIVA"), paf1800f); set_IVA(doc.clifor().vendite().get("ASSFIS"), paf1800f);
ok &= insert(paf1800f) && insert(paf3000f); ok &= insert(paf1800f) && insert(paf3000f);
} }
// Conai assolto // Conai assolto

View File

@ -20,6 +20,7 @@
#define FP_ESP_EST_COD "espestcod" #define FP_ESP_EST_COD "espestcod"
#define FP_F8 "f8" #define FP_F8 "f8"
#define FP_CHECK_NOT_BLOCK "checknotblock" #define FP_CHECK_NOT_BLOCK "checknotblock"
#define FP_MAIL "mail"
// Sheet fp0300 // Sheet fp0300
#define FP_SLD_COD "SLD" #define FP_SLD_COD "SLD"
@ -118,6 +119,11 @@ const bool TFP_settings::get_check_not_block() const
return ini_get_bool(FILE_CONFIG, FILE_SECTION, FP_CHECK_NOT_BLOCK); return ini_get_bool(FILE_CONFIG, FILE_SECTION, FP_CHECK_NOT_BLOCK);
} }
const TString& TFP_settings::get_body_mail(int idx) const
{
return ini_get_string(FILE_CONFIG, FILE_SECTION, FP_MAIL, "STOpsTOP", idx);
}
void TFP_settings::set_db_indirizzo(const TString& ind) const void TFP_settings::set_db_indirizzo(const TString& ind) const
{ {
ini_set_string(FILE_CONFIG, FILE_SECTION, FP_IP, ind); ini_set_string(FILE_CONFIG, FILE_SECTION, FP_IP, ind);
@ -188,6 +194,16 @@ void TFP_settings::set_check_not_block(const bool not_block) const
ini_set_bool(FILE_CONFIG, FILE_SECTION, FP_CHECK_NOT_BLOCK, not_block); ini_set_bool(FILE_CONFIG, FILE_SECTION, FP_CHECK_NOT_BLOCK, not_block);
} }
void TFP_settings::set_body_mail(const char* msg, int idx) const
{
ini_set_string(FILE_CONFIG, FILE_SECTION, FP_MAIL, msg, idx);
}
void TFP_settings::remove_para_ini(int idx)
{
ini_remove(FILE_CONFIG, FILE_SECTION, FP_MAIL, idx);
}
TRectype TFP_selected_docs::fill_rectype() const TRectype TFP_selected_docs::fill_rectype() const
{ {
TRectype r(LF_TABMOD); TRectype r(LF_TABMOD);

View File

@ -3,6 +3,7 @@
#include <spotlite.h> #include <spotlite.h>
#include <xvt_env.h> #include <xvt_env.h>
#include "modaut.h" #include "modaut.h"
#include "fp0500a.h"
class TExternal_app; class TExternal_app;
@ -48,7 +49,7 @@ bool TFp_mail_sender::genera_pdf()
} }
// Creo se non c'è il pdf e lo allego alla mail per l'invio // Creo se non c'è il pdf e lo allego alla mail per l'invio
bool TFp_mail_sender::send() bool TFp_mail_sender::send(const TString& msg)
{ {
// Controllo per sicurezza quando si prova a rifare l'invio di una fattura già spedita // Controllo per sicurezza quando si prova a rifare l'invio di una fattura già spedita
if (_sent) if (_sent)
@ -76,16 +77,16 @@ bool TFp_mail_sender::send()
else if (genera_pdf()) // Genero pdf se non esiste già (in tempdir) else if (genera_pdf()) // Genero pdf se non esiste già (in tempdir)
{ // Manda già un messaggio di errore generazione se fallisce la generazione { // Manda già un messaggio di errore generazione se fallisce la generazione
TFilename newf_pdf; newf_pdf << _pdf_path << _pdf_name; TFilename newf_pdf; newf_pdf << _pdf_path << _pdf_name;
ok = spotlite_send_mail(newf_pdf); ok = spotlite_send_mail(newf_pdf, msg);
} }
else { else {
TString msg; msg << "Inviare lo stesso la mail senza il pdf allegato?"; TString msg_err; msg_err << "Inviare lo stesso la mail senza il pdf allegato?";
if (noyes_box(msg)) // Se la generazione fallisce chiedo se procedere lo stesso if (noyes_box(msg_err)) // Se la generazione fallisce chiedo se procedere lo stesso
ok = spotlite_send_mail(); // Se sì, procedo con mail senza pdf ok = spotlite_send_mail(msg); // Se sì, procedo con mail senza pdf
} // Se no, esco senza inviare } // Se no, esco senza inviare
} }
else if (!_alleg && _accord) else if (!_alleg && _accord)
ok = spotlite_send_mail(); ok = spotlite_send_mail(msg);
if(ok) if(ok)
{ {
@ -140,10 +141,11 @@ bool TFp_mail_sender::get_mail(TToken_string& to, TToken_string& cc, TToken_stri
return true; return true;
} }
// Funzione per spedire un pdf via mail // Funzione per spedire un pdf via mail
bool TFp_mail_sender::spotlite_send_mail(const TFilename& pdf) bool TFp_mail_sender::spotlite_send_mail(const TFilename& pdf, const TString& msg)
{ {
TToken_string to(15, ';'), cc(15, ';'), ccn(15, ';'), attach(pdf, ';'); TToken_string to(15, ';'), cc(15, ';'), ccn(15, ';'), attach(pdf, ';');
TString subj, text; TString subj;
TString text; text << msg << "\n\n";
short flags = 0x1; // UI short flags = 0x1; // UI
bool ok = get_mail(to, cc, ccn, subj, text, attach, flags); bool ok = get_mail(to, cc, ccn, subj, text, attach, flags);
@ -157,10 +159,11 @@ bool TFp_mail_sender::spotlite_send_mail(const TFilename& pdf)
return ok; return ok;
} }
bool TFp_mail_sender::spotlite_send_mail() bool TFp_mail_sender::spotlite_send_mail(const TString& msg)
{ {
TToken_string to(15, ';'), cc(15, ';'), ccn(15, ';'), attach(15, ';'); TToken_string to(15, ';'), cc(15, ';'), ccn(15, ';'), attach(15, ';');
TString subj, text; TString subj;
TString text; text << msg << "\n\n";
short flags = 0x1; // UI short flags = 0x1; // UI
bool ok = get_mail(to, cc, ccn, subj, text, attach, flags); bool ok = get_mail(to, cc, ccn, subj, text, attach, flags);

View File

@ -899,7 +899,7 @@ TConfig::~TConfig()
const TString& ini_get_string(const char* file, const char* paragraph, const char* name, const char* defval, int idx) const TString& ini_get_string(const char* file, const char* paragraph, const char* name, const char* defval, int idx)
{ {
DECLARE_VARNAME(name, idx); DECLARE_VARNAME(name, idx);
TString& tmp = get_tmp_string(); TString& tmp = get_tmp_string(255);
const int len = xvt_sys_get_profile_string(file, paragraph, varname, defval, tmp.get_buffer(), tmp.size()); const int len = xvt_sys_get_profile_string(file, paragraph, varname, defval, tmp.get_buffer(), tmp.size());
if (len > tmp.size()) if (len > tmp.size())
{ {
@ -922,6 +922,13 @@ bool ini_set_string(const char* file, const char* paragraph, const char* name, c
return xvt_sys_set_profile_string(file, paragraph, varname, val) != 0; return xvt_sys_set_profile_string(file, paragraph, varname, val) != 0;
} }
bool ini_remove(const char* file, const char* para, const char* name, int idx)
{
TConfig c(file,para);
return c.remove(name, idx);
}
bool ini_get_bool(const char* file, const char* para, const char* name, bool defval, int idx) bool ini_get_bool(const char* file, const char* para, const char* name, bool defval, int idx)
{ {
const char b = ini_get_string(file, para, name, defval ? "1" : "0", idx)[0]; const char b = ini_get_string(file, para, name, defval ? "1" : "0", idx)[0];
@ -960,7 +967,13 @@ const TString& ini_get_string(int cfg, const char* paragraph, const char* name,
bool ini_set_string(int cfg, const char* paragraph, const char* name, const char* val, int idx) bool ini_set_string(int cfg, const char* paragraph, const char* name, const char* val, int idx)
{ {
DECLARE_FILENAME(cfg); DECLARE_FILENAME(cfg);
return ini_set_string(filename, paragraph, name, val); return ini_set_string(filename, paragraph, name, val, idx);
}
bool ini_remove(int cfg, const char* para, const char* name, int idx)
{
DECLARE_FILENAME(cfg);
return ini_remove(filename, para, name, idx);
} }
int ini_get_int(int cfg, const char* paragraph, const char* name, int defval, int idx) int ini_get_int(int cfg, const char* paragraph, const char* name, int defval, int idx)

View File

@ -191,7 +191,7 @@ const TString& ini_get_string(const char* file, const char* para, const char* na
bool ini_set_bool (const char* file, const char* para, const char* name, bool val, int idx = -1); bool ini_set_bool (const char* file, const char* para, const char* name, bool val, int idx = -1);
bool ini_set_int (const char* file, const char* para, const char* name, int val, int idx = -1); bool ini_set_int (const char* file, const char* para, const char* name, int val, int idx = -1);
bool ini_set_string(const char* file, const char* para, const char* name, const char* val, int idx = -1); bool ini_set_string(const char* file, const char* para, const char* name, const char* val, int idx = -1);
bool ini_remove (const char* file, const char* para, const char* name, int idx = -1);
// High level utilities // High level utilities
bool ini_get_bool (int cfg, const char* para, const char* name, bool defval = false, int idx = -1); bool ini_get_bool (int cfg, const char* para, const char* name, bool defval = false, int idx = -1);
int ini_get_int (int cfg, const char* para, const char* name, int defval = 0, int idx = -1); int ini_get_int (int cfg, const char* para, const char* name, int defval = 0, int idx = -1);
@ -199,6 +199,7 @@ const TString& ini_get_string(int cfg, const char* para, const char* name, const
bool ini_set_bool (int cfg, const char* para, const char* name, bool val, int idx = -1); bool ini_set_bool (int cfg, const char* para, const char* name, bool val, int idx = -1);
bool ini_set_int (int cfg, const char* para, const char* name, int val, int idx = -1); bool ini_set_int (int cfg, const char* para, const char* name, int val, int idx = -1);
bool ini_set_string(int cfg, const char* para, const char* name, const char* val, int idx = -1); bool ini_set_string(int cfg, const char* para, const char* name, const char* val, int idx = -1);
bool ini_remove (int cfg, const char* para, const char* name, int idx = -1);
const TString& get_oem_info(const char* varname, const char* defval = ""); // ini_get_string(CONFIG_OEM, "OEM_?", varname, defval); const TString& get_oem_info(const char* varname, const char* defval = ""); // ini_get_string(CONFIG_OEM, "OEM_?", varname, defval);
bool is_aga_version(bool power_user_only = false); bool is_aga_version(bool power_user_only = false);