Patch level : 12.0 740

Files correlati     : fp0500, fplib
Commento            : Aggiunta possibilità di aggiungere nota in piede fattura
This commit is contained in:
Simone Palacino 2019-03-20 09:41:44 +01:00
parent 6e7d8ab89a
commit 71aad42a8a
6 changed files with 182 additions and 50 deletions

View File

@ -23,4 +23,5 @@
#define S_TIPORIGA 102
#define S_QTA 103
#define S_PREZZO 104
#define S_IMPONIBILE 105
#define S_IMPONIBILE 105
#define S_NOTAPF 106

View File

@ -99,6 +99,7 @@ BEGIN
ITEM "Qta"
ITEM "Prezzo"
ITEM "Imponibile"
ITEM "Nota piede\nFattura@15"
END
@ -155,11 +156,11 @@ ENDPAGE
ENDMASK
PAGE "Elementi spredsheet" 0 2 0 0
PAGE "Elementi spredsheet" -1 -1 60 12
STRING S_TIPODOC 4
BEGIN
PROMPT 15 1 "Tipo doc "
PROMPT 1 1 "Tipo doc "
HELP "Lasciare libero per tutti i tipo documento"
USE %TIP
SELECT S3[37,40]!=""
@ -173,7 +174,7 @@ END
STRING S_TIPORIGA 4
BEGIN
PROMPT 15 1 "Tipo riga "
PROMPT 1 2 "Tipo riga "
USE %TRI
INPUT CODTAB S_TIPORIGA
DISPLAY "Codice@10" CODTAB
@ -184,12 +185,12 @@ END
STRING S_QTA 10
BEGIN
PROMPT 0 2 "Qta"
PROMPT 1 3 "Qta"
END
STRING S_PREZZO 10
BEGIN
PROMPT 0 2 "Prezzo"
PROMPT 1 4 "Prezzo"
USE %FRR
INPUT CODTAB S_PREZZO
DISPLAY "Codice@10" CODTAB
@ -199,7 +200,7 @@ END
STRING S_IMPONIBILE 10
BEGIN
PROMPT 0 2 "Imponibile"
PROMPT 1 5 "Imponibile"
USE %FRR
INPUT CODTAB S_IMPONIBILE
DISPLAY "Codice" CODTAB
@ -207,6 +208,11 @@ BEGIN
OUTPUT S_IMPONIBILE CODTAB
END
MEMO S_NOTAPF 0 0
BEGIN
PROMPT 1 6 "Nota piede fattura"
END
ENDPAGE
TOOLBAR "Riga" 0 0 0 2

View File

@ -361,6 +361,38 @@ public:
void TMancati_app::main_loop()
{
////////////////////////////////////////////////////////////////////////////
// TEST PER TDB_recordset
////////////////////////////////////////////////////////////////////////////
TString qq;
qq << "CONNECT(localhost@fp_cortelezzi, fp, fp, MSSQL)\n\
SELECT PZ_TIPOPROT AS TIPO_PROT, YEAR(P7_DATA) AS ANNO, P7_TIPODOC AS[TIPO_SDI], P7_NUMERO AS[NUM_DOC], P7_DATA AS[DATA_DOC], PQ_IMPTOTDOC AS[TOT_DOC], P2_ANADENOMIN AS[RAG_SOC], P2_ANANOME AS NOME, P2_ANACOGNOME AS COGNOME, P2_FISCIVACOD AS[P_IVA], P2_CODFISCALE AS[COD_FISC], P2_FISCIVAPAESE AS[COD_PAESE],\n\
COUNT(PP_ATTACHMENT) AS ATTACHMENT, P1_CODDEST AS[COD_SDI], PU_PEC AS PEC, P1_KEYPRGINVIO AS KEYPROG, P1_KEYHEADERFATT AS KEYHEAD, P1_KEYBODYFATT AS KEYFATT, PZ_TIPOPROT AS[TIPO_PROT], PZ_NUMPROT AS[NUM_PROT], PZ_ANNOPROT AS[ANNO_PROT], PZ_TIPOCF AS[TIPO_CF], PZ_CLIFOR AS[COD_CLIFOR]\n\
FROM PAA0100F PAA01\n\
JOIN PAA0200F PAA02 ON P1_KEYPRGINVIO = P2_KEYPRGINVIO and P1_KEYHEADERFATT = P2_KEYHEADERFATT and P1_KEYBODYFATT = P2_KEYBODYFATT\n\
JOIN PAA0700F PAA07 ON P1_KEYPRGINVIO = P7_KEYPRGINVIO and P1_KEYHEADERFATT = P7_KEYHEADERFATT and P1_KEYBODYFATT = P7_KEYBODYFATT\n\
JOIN PAA2700F PAA27 ON P1_KEYPRGINVIO = PQ_KEYPRGINVIO and P1_KEYHEADERFATT = PQ_KEYHEADERFATT and P1_KEYBODYFATT = PQ_KEYBODYFATT\n\
LEFT JOIN PAA2600F PAA26 ON P1_KEYPRGINVIO = PP_KEYPRGINVIO and P1_KEYHEADERFATT = PP_KEYHEADERFATT and P1_KEYBODYFATT = PP_KEYBODYFATT\n\
LEFT JOIN PAA3200F PAA32 ON P1_KEYPRGINVIO = PU_KEYPRGINVIO and P1_KEYHEADERFATT = PU_KEYHEADERFATT and P1_KEYBODYFATT = PU_KEYBODYFATT\n\
LEFT JOIN FPPRO00F FPPRO ON P1_KEYPRGINVIO = PZ_KEYPRGINVIO and P1_KEYHEADERFATT = PZ_KEYHEADERFATT and P1_KEYBODYFATT = PZ_KEYBODYFATT\n\
WHERE P7_DATA >= '20190301' AND P7_DATA <= '20190315'\n\
GROUP BY YEAR(P7_DATA), P7_TIPODOC, P7_NUMERO, P7_DATA, PQ_IMPTOTDOC, P2_ANADENOMIN, P2_ANANOME, P2_ANACOGNOME, P2_FISCIVACOD, P2_CODFISCALE, P2_FISCIVAPAESE,\n\
P1_CODDEST, PU_PEC, P1_KEYPRGINVIO, P1_KEYHEADERFATT, P1_KEYBODYFATT, PZ_TIPOPROT, PZ_NUMPROT, PZ_ANNOPROT, PZ_TIPOCF, PZ_CLIFOR\n\
ORDER BY PZ_ANNOPROT DESC, PZ_TIPOPROT ASC, PZ_NUMPROT DESC;";
TDB_recordset my_rec(qq, true);
my_rec.set("SELECT * FROM PAA0100F;");
int n = my_rec.items();
my_rec.move_to(0);
TRecordset_column_info info = my_rec.column_info(1);
bool conn = my_rec.is_connected();
int col = my_rec.columns();
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
TMancati_mask mask;
while (mask.run() == K_ENTER)
{

View File

@ -15,6 +15,47 @@
#define SQL_FLD "sql/"
#define MANCATA_SEND "S" // Se la mail di mancata consegna è già stata inviata P1_ERRINT è segnato con "S"
// Typedef per aiutare a capire cosa sono le chiavi
typedef TString MCodice_riga;
typedef TString MTipo_documento;
// Mannaggia il fruttivendolo
class TFP_righe_custom : public TObject
{
bool _loaded;
struct TCustCol
{
TString _col_qta;
// Le colonne prezzo e imp non sono lette se di default
TString _col_prezzo;
TString _col_imponibile;
TString _col_nota_piede;
};
// Mappa con in chiave COD_RIGA, TIPO_DOC
std::map<MCodice_riga, std::map<MTipo_documento, TCustCol>> _custom_table;
void load_map();
static TCustCol& get_no_custom();
TCustCol& get(const TString& codriga, const TString& tipodoc);
public:
static void write_ini_npf(TToken_string* r);
static TString get_ini_npf(TString codnum, TString tipodoc);
static void save_sheet(TSheet_field& sheet_field);
static void load_sheet(TSheet_field& sheet_field);
const TString& get_qta(const TString& codriga, const TString& tipodoc) { return get(codriga, tipodoc)._col_qta; }
const TString& get_prezzo(const TString& codriga, const TString& tipodoc) { return get(codriga, tipodoc)._col_prezzo; }
const TString& get_imponibile(const TString& codriga, const TString& tipodoc) { return get(codriga, tipodoc)._col_imponibile; }
const TString& get_nota_piede(const TString& codriga, const TString& tipodoc) { return get(codriga, tipodoc)._col_nota_piede; }
TFP_righe_custom();
};
enum { no_pdf = -1, pdf_ok = 0, no_alleg = -2};
// Ritorna la connessione al DB paf secondo i parametri impostati nel programma di configurazione
@ -137,6 +178,7 @@ private:
TPaf_container _paf_container;
int _count_r_conai;
bool _nascondi_sconti_righe_fatt;
TFP_righe_custom _righe_custom;
// Classe interna per gestire righe aggiuntive in riepilogo
class TRiepilogo_agg
@ -195,7 +237,7 @@ protected:
bool add_row_art(long& riga_art, const TString& codice_tipo, const TString& codice_valore, TPaf_record& paf);
bool add_row_alleg(TFilename& file, long& nprogr, TPaf_record& paf);
const TString& converti_prezzo(const real& prezzo) const;
void set_qta_prezzo(TPaf_record& paf1800f, TRiga_documento* rdoc) const;
void set_qta_prezzo(TPaf_record& paf1800f, TRiga_documento* rdoc);
void add_ritenuta(const TDocumentoEsteso& doc, const TSpesa_prest& sp, TPaf_record& paf0700f) const;
bool add_riepilogo_iva(TPaf_record& paf2200f, const TCodiceIVA& cod_iva, const char* eiva, const real& imponibile = ZERO, const real& imposta = ZERO);
bool add_cassa_previdenziale(TRiga_documento& rdoc);
@ -246,6 +288,7 @@ public:
const bool is_f8() const;
const bool get_check_not_block() const;
const TString& get_body_mail(int idx = -1) const;
const TString& get_npf(const char* codnum, const char* tipodoc, int idx) const;
const bool get_no_sconti_fatt() const;
// Setters
@ -264,9 +307,12 @@ public:
void set_f8(bool f8) const;
void set_check_not_block(bool not_block) const;
void set_body_mail(const char* msg, int idx = -1) const;
void set_npf(const char * codnum, const char * tipodoc, const char* msg, int idx) const;
void set_no_sconti_fatt(const bool no_sconti_fatt) const;
void remove_para_ini(int idx);
void remove_npf_ini(const char* codnum, const char* tipodoc, int idx);
void remove_line_npf(const char* codnum, const char* tipodoc, int idx) const;
};
inline TFP_settings& fp_settings()
@ -296,42 +342,6 @@ public:
TFP_selected_docs();
};
// Typedef per aiutare a capire cosa sono le chiavi
typedef TString MCodice_riga;
typedef TString MTipo_documento;
// Mannaggia il fruttivendolo
class TFP_righe_custom : public TObject
{
bool _loaded;
struct TCustCol
{
TString _col_qta;
// Le colonne prezzo e imp non sono lette se di default
TString _col_prezzo;
TString _col_imponibile;
};
// Mappa con in chiave COD_RIGA, TIPO_DOC
std::map<MCodice_riga, std::map<MTipo_documento, TCustCol>> _custom_table;
void load_map();
static TCustCol& get_no_custom();
TCustCol& get(const TString& codriga, const TString& tipodoc);
public:
static void save_sheet(TSheet_field& sheet_field);
static void load_sheet(TSheet_field& sheet_field);
const TString& get_qta(const TString& codriga, const TString& tipodoc) { return get(codriga, tipodoc)._col_qta; }
const TString& get_prezzo(const TString& codriga, const TString& tipodoc) { return get(codriga, tipodoc)._col_prezzo; }
const TString& get_imponibile(const TString& codriga, const TString& tipodoc) { return get(codriga, tipodoc)._col_imponibile; }
TFP_righe_custom();
};
class TFp_mail_sender
{
int _anno;

View File

@ -1161,16 +1161,14 @@ const TString& TDoc_fp::converti_prezzo(const real& prezzo) const
ret << prezzo;
return ret;
}
void TDoc_fp::set_qta_prezzo(TPaf_record& paf1800f, TRiga_documento* rdoc) const
void TDoc_fp::set_qta_prezzo(TPaf_record& paf1800f, TRiga_documento* rdoc)
{
// Setto l'unità di misura
paf1800f.set("PI_UNITAMISURA", rdoc->get(RDOC_UMQTA));
static TFP_righe_custom righe_custom;
const TString& field_qta = righe_custom.get_qta(rdoc->tipo().codice(), rdoc->doc().tipo().codice());
const TString& field_prezzo = righe_custom.get_prezzo(rdoc->tipo().codice(), rdoc->doc().tipo().codice());
const TString& field_imponibile = righe_custom.get_imponibile(rdoc->tipo().codice(), rdoc->doc().tipo().codice());
const TString& field_qta = _righe_custom.get_qta(rdoc->tipo().codice(), rdoc->doc().tipo().codice());
const TString& field_prezzo = _righe_custom.get_prezzo(rdoc->tipo().codice(), rdoc->doc().tipo().codice());
const TString& field_imponibile = _righe_custom.get_imponibile(rdoc->tipo().codice(), rdoc->doc().tipo().codice());
const bool custom_prezzo = field_prezzo.full();
@ -2014,6 +2012,22 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
}
}
const TString& nota_piede_fatt = _righe_custom.get_nota_piede(rdoc->tipo().codice(), rdoc->doc().tipo().codice());
if(nota_piede_fatt.full())
{
reset(paf1800f);
paf1800f.set("PI_NUMEROLINEA", riga);
reset(paf3000f);
paf3000f.set("PT_RIFNUMLINEA", riga);
paf3000f.set("PT_COMMENTO", nota_piede_fatt.left(900));
paf1800f.set("PI_QUANTITA", UNO);
paf1800f.set("PI_PREZZOUNIT", ZERO);
paf1800f.set("PI_PRZTOTALE", ZERO);
set_IVA(_codivadefault, paf1800f);
ok &= insert(paf1800f) && insert(paf3000f);
riga++;
}
// </DatiBeniServizi>
// <DatiDDT>
// Metto qua i dati DDT per capire se la fattura è accompagnatoria o deriva da bolla

View File

@ -21,6 +21,7 @@
#define FP_F8 "f8"
#define FP_CHECK_NOT_BLOCK "checknotblock"
#define FP_MAIL "mail"
#define FP_NOTA_PIEDE_F "npf" // Nota piede fattura
#define FP_CHECK_NO_SCONTI_FATT "noscontifatt"
// Sheet fp0300
@ -125,6 +126,12 @@ const TString& TFP_settings::get_body_mail(int idx) const
return ini_get_string(FILE_CONFIG, FILE_SECTION, FP_MAIL, "STOpsTOP", idx);
}
const TString& TFP_settings::get_npf(const char * codnum, const char * tipodoc, int idx) const
{
TString name; name << FP_NOTA_PIEDE_F << "_" << codnum << "-" << tipodoc;
return ini_get_string(FILE_CONFIG, FILE_SECTION, name, "FERMATIostrega", idx);
}
const bool TFP_settings::get_no_sconti_fatt() const
{
return ini_get_bool(FILE_CONFIG, FILE_SECTION, FP_CHECK_NO_SCONTI_FATT, false);
@ -205,6 +212,13 @@ void TFP_settings::set_body_mail(const char* msg, int idx) const
ini_set_string(FILE_CONFIG, FILE_SECTION, FP_MAIL, msg, idx);
}
// Set nota piede fattura
void TFP_settings::set_npf(const char * codnum, const char * tipodoc, const char* msg, int idx) const
{
TString name; name << FP_NOTA_PIEDE_F << "_" << codnum << "-" << tipodoc;
ini_set_string(FILE_CONFIG, FILE_SECTION, name, msg, idx);
}
void TFP_settings::set_no_sconti_fatt(const bool no_sconti_fatt) const
{
ini_set_bool(FILE_CONFIG, FILE_SECTION, FP_CHECK_NO_SCONTI_FATT, no_sconti_fatt);
@ -215,6 +229,19 @@ void TFP_settings::remove_para_ini(int idx)
ini_remove(FILE_CONFIG, FILE_SECTION, FP_MAIL, idx);
}
void TFP_settings::remove_npf_ini(const char * codnum, const char * tipodoc, int idx)
{
TString name; name << FP_NOTA_PIEDE_F << "_" << codnum << "-" << tipodoc;
ini_remove(FILE_CONFIG, FILE_SECTION, name, idx);
}
// Rimuove linea ini in eccesso per nota piede fattura
void TFP_settings::remove_line_npf(const char * codnum, const char * tipodoc, int idx) const
{
TString name; name << FP_NOTA_PIEDE_F << "_" << codnum << "-" << tipodoc;
ini_remove(FILE_CONFIG, FILE_SECTION, name, idx);
}
TRectype TFP_selected_docs::fill_rectype() const
{
TRectype r(LF_TABMOD);
@ -307,6 +334,44 @@ TFP_righe_custom::TCustCol& TFP_righe_custom::get(const TString& codriga, const
return get_no_custom();
}
void TFP_righe_custom::write_ini_npf(TToken_string* r)
{
// Prendo memo di ogni riga e la suddivido per gli a capo
TToken_string msg(r->get(5), '\n');
/* Vado a salvare in un config .ini tipo-riga/tipo-doc/messaggio su piu righe */
int indx = 0;
TString codnum, tipodoc; codnum << r->get(1); tipodoc << r->get(0);
// Conto quanti ne avevo salvati prima nel file ini per poi controllare
// che non sto salvando meno di quelli che ci sono già
int previous_indx = 0;
for (TString row = fp_settings().get_npf(codnum, tipodoc, previous_indx); row != "FERMATIostrega"; row = fp_settings().get_npf(codnum, tipodoc, previous_indx))
previous_indx++;
// Vado a salvare ogni riga nel file ini
for (const char* row = msg.get(); row; row = msg.get())
fp_settings().set_npf(codnum, tipodoc, row, indx++);
if (indx < previous_indx)
{
for (int i = indx; i < previous_indx; i++)
fp_settings().remove_npf_ini(codnum, tipodoc, indx);
}
}
TString TFP_righe_custom::get_ini_npf(TString codnum, TString tipodoc)
{
TString msg; msg.cut(0);
int indx = 0;
for (TString row = fp_settings().get_npf(codnum, tipodoc, indx); row != "FERMATIostrega"; row = fp_settings().get_npf(codnum, tipodoc, indx))
{
if(indx++ > 0)
msg << '\n';
msg << row;
}
return msg;
}
void TFP_righe_custom::load_map()
{
TRelation rel(LF_TABMOD);
@ -321,6 +386,7 @@ void TFP_righe_custom::load_map()
app._col_qta = rec.get(FP_SHT_COL_QTA).full() ? rec.get(FP_SHT_COL_QTA) : FP_SHT_DEF_QTA;
app._col_prezzo = rec.get(FP_SHT_COL_PREZZO).full() ? rec.get(FP_SHT_COL_PREZZO) : FP_SHT_DEF_PREZZO;
app._col_imponibile = rec.get(FP_SHT_COL_IMPONIBILE).full() ? rec.get(FP_SHT_COL_IMPONIBILE) : FP_SHT_DEF_IMPONIBILE;
app._col_nota_piede = rec.get(FP_NOTA_PIEDE_F);
}
_loaded = true;
@ -362,6 +428,8 @@ void TFP_righe_custom::save_sheet(TSheet_field& sheet_field)
rec.put(FP_SHT_COL_IMPONIBILE, r->get());
rec.write(tabmod);
write_ini_npf(r);
}
}
@ -381,6 +449,7 @@ void TFP_righe_custom::load_sheet(TSheet_field& sheet_field)
row.add(cur_rec.get(FP_SHT_COL_QTA));
row.add(cur_rec.get(FP_SHT_COL_PREZZO));
row.add(cur_rec.get(FP_SHT_COL_IMPONIBILE));
row.add(get_ini_npf(cur_rec.get(FP_SHT_TIPORIGA), cur_rec.get(FP_SHT_TIPODOC)));
}
sheet_field.force_update();
}