From d5e5fe04351a902f372947324284439fe9579b0e Mon Sep 17 00:00:00 2001 From: Mattia Tollari Date: Thu, 30 May 2019 15:04:24 +0200 Subject: [PATCH] Patch level : 12.0 no-patch Files correlati : fp Commento : Inizio sviluppo personalizzazioni FP --- src/fp/fp0.cpp | 2 + src/fp/fp0.h | 2 + src/fp/fp0500.cpp | 148 +++++++++++++++++++++++++++++++++++++++++ src/fp/fp0500a.h | 23 +++++++ src/fp/fp0500a.uml | 162 +++++++++++++++++++++++++++++++++++++++++++++ src/fp/fp0600.cpp | 58 ++++++++++++++++ src/fp/fp0600a.h | 0 src/fp/fp0600a.uml | 0 src/fp/fplib.h | 66 +++++++++++++++++- src/fp/fplib01.cpp | 2 +- src/fp/fplib05.cpp | 91 +++++++++++++++++++++++++ 11 files changed, 552 insertions(+), 2 deletions(-) create mode 100644 src/fp/fp0500.cpp create mode 100644 src/fp/fp0500a.h create mode 100644 src/fp/fp0500a.uml create mode 100644 src/fp/fp0600.cpp create mode 100644 src/fp/fp0600a.h create mode 100644 src/fp/fp0600a.uml create mode 100644 src/fp/fplib05.cpp diff --git a/src/fp/fp0.cpp b/src/fp/fp0.cpp index 3cad13b6d..01e7be0cc 100644 --- a/src/fp/fp0.cpp +++ b/src/fp/fp0.cpp @@ -11,6 +11,8 @@ int main(int argc, char** argv) case 1: rt = fp0200(argc, argv); break; // Inserimento massivo PEC e Cod Sdi clifo case 2: rt = fp0300(argc, argv); break; // Gestione fatture attive (PAA, Ex Fattura PA) case 3: rt = fp0400(argc, argv); break; // Monitor fatture passive + case 4: rt = fp0500(argc, argv); break; // Customizzazioni FP per utente + case 5: rt = fp0600(argc, argv); break; // Customizzazioni FP per utente default: rt = fp0100(argc, argv); break; // Configurazione } return rt; diff --git a/src/fp/fp0.h b/src/fp/fp0.h index 402f3391e..2bedaf6f5 100644 --- a/src/fp/fp0.h +++ b/src/fp/fp0.h @@ -5,5 +5,7 @@ int fp0100(int argc, char* argv[]); int fp0200(int argc, char* argv[]); int fp0300(int argc, char* argv[]); int fp0400(int argc, char* argv[]); +int fp0500(int argc, char* argv[]); +int fp0600(int argc, char* argv[]); #endif diff --git a/src/fp/fp0500.cpp b/src/fp/fp0500.cpp new file mode 100644 index 000000000..1878c2f21 --- /dev/null +++ b/src/fp/fp0500.cpp @@ -0,0 +1,148 @@ +#include +#include +#include +#include + +#include "fp0.h" +#include "fp0500a.h" +#include "fplib.h" +#include "fpccaus.h" +#include "fpcart.h" +#include "fpcadg.h" + + +//------------------------------------------------------------------- +// MASCHERA (fp0500a) +//------------------------------------------------------------------- +class TFpcust_mask : public TAutomask +{ +protected: + bool on_field_event(TOperable_field& o, TField_event e, long jolly) override; +public: + + TFpcust_mask(); +}; + +bool TFpcust_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + default: + break; + } + return true; +} + +TFpcust_mask::TFpcust_mask() : TAutomask("fp0500a") +{ +} + + +//-------------------------------------------------------------- +// APPLICAZIONE +//-------------------------------------------------------------- +class TFpcust : public TRelation_application +{ + TFpcust_mask* _mask{ nullptr }; + TRelation* _rel{ nullptr }; + TFP_custom* _fpcust{ nullptr }; + +protected: + int read(TMask& m) override; + int write(const TMask& m) override; + int rewrite(const TMask& m) override; + + void load_cust(const TMask& m) const; + + bool user_create() override; + bool user_destroy() override; + TMask* get_mask(int mode) override { return _mask; } + bool changing_mask(int mode) override { return false; } + +public: + // @cmember Disabilita la verifica del modulo : essendo una anagrafica, va sempre abilitata + bool check_autorization() const override { return true; } + TRelation* get_relation() const override { return static_cast(_rel); } +}; + +int TFpcust::read(TMask& m) +{ + TRelation_application::read(m); + + // Carico tutti gli sheet + TFP_custom& fp_custom = dynamic_cast(get_relation()->lfile().curr()); + + TSheet_field& sheet_causali = m.sfield(F_CAUSALI); + sheet_causali.destroy(); + FOR_EACH_FPCAUS_ROW(fp_custom, r, rcaus) + { + TToken_string& row = sheet_causali.row(-1); + row.add(rcaus->get(FPCCAUS_VALORE), xvtil_cid2index(S_CAUS_VALORE)); + } + + TSheet_field& sheet_articoli = m.sfield(F_ARTICOLI); + sheet_articoli.destroy(); + FOR_EACH_FPART_ROW(fp_custom, r, rart) + { + TToken_string& row = sheet_articoli.row(-1); + row.add(rart->get(FPCART_TIPO), xvtil_cid2index(S_ART_TIPO)); + row.add(rart->get(FPCART_VALORE), xvtil_cid2index(S_ART_VALORE)); + } + + TSheet_field& sheet_adg = m.sfield(F_ADG); + sheet_adg.destroy(); + FOR_EACH_FPADG_ROW(fp_custom, r, radg) + { + TToken_string& row = sheet_adg.row(-1); + row.add(radg->get(FPCADG_TIPODATO), xvtil_cid2index(S_ADG_TIPODATO)); + row.add(radg->get(FPCADG_RTESTO), xvtil_cid2index(S_ADG_RTESTO)); + row.add(radg->get(FPCADG_RNUMERO), xvtil_cid2index(S_ADG_RNUMERO)); + row.add(radg->get(FPCADG_RDATA), xvtil_cid2index(S_ADG_RDATA)); + } + + return NOERR; +} + +int TFpcust::write(const TMask& m) +{ + load_cust(m); + return TRelation_application::write(m); +} + +int TFpcust::rewrite(const TMask& m) +{ + load_cust(m); + return TRelation_application::rewrite(m); +} + +void TFpcust::load_cust(const TMask& m) const +{ + _fpcust->set_codcust(m.get(F_CODICE), false); + _fpcust->autoload(m.sfield(F_CAUSALI), LF_FPCCAUS); + _fpcust->autoload(m.sfield(F_ARTICOLI), LF_FPCART); + _fpcust->autoload(m.sfield(F_ADG), LF_FPCADG); +} + + +bool TFpcust::user_create() +{ + _fpcust = new TFP_custom(); + _rel = new TRelation(LF_FPCUST); + _rel->lfile().set_curr(_fpcust); + _mask = new TFpcust_mask; + + return true; +} + +bool TFpcust::user_destroy() +{ + delete _mask; + return true; +} + +int fp0500(int argc, char* argv[]) +{ + TFpcust a; + a.run(argc, argv, TR("Lettere d'intento")); + return 0; +} \ No newline at end of file diff --git a/src/fp/fp0500a.h b/src/fp/fp0500a.h new file mode 100644 index 000000000..4cd25a556 --- /dev/null +++ b/src/fp/fp0500a.h @@ -0,0 +1,23 @@ +// lettere d'intento +// definizione campi per maschera fp0500a + +#define F_CODICE 201 +#define F_DESCR 202 + +#define F_CAUSALI 301 +#define F_ARTICOLI 401 +#define F_ADG 501 + + +// Causale +#define S_CAUS_VALORE 101 + +// Articoli +#define S_ART_TIPO 101 +#define S_ART_VALORE 102 + +// Altri Dati Gestionali +#define S_ADG_TIPODATO 101 +#define S_ADG_RTESTO 102 +#define S_ADG_RNUMERO 103 +#define S_ADG_RDATA 104 \ No newline at end of file diff --git a/src/fp/fp0500a.uml b/src/fp/fp0500a.uml new file mode 100644 index 000000000..d06236939 --- /dev/null +++ b/src/fp/fp0500a.uml @@ -0,0 +1,162 @@ +#include "fp0500a.h" + +TOOLBAR "Relapbar" 0 0 0 2 +#include +ENDPAGE + +PAGE "Pag. 1" -1 -1 78 20 + +STRING F_CODICE 10 +BEGIN + PROMPT 1 1 "Codice " + FIELD CODICE + USE FPCUST + INPUT CODICE F_CODICE + DISPLAY "Codice" CODICE + DISPLAY "Descrizione" DESCR + OUTPUT F_CODICE CODICE + OUTPUT F_DESCR DESCR + CHECKTYPE REQUIRED + KEY 1 +END + +STRING F_DESCR 50 +BEGIN + PROMPT 25 1 "Descrizione " + FIELD DESCR + USE FPCUST + INPUT DESCR F_CODICE + DISPLAY "Codice" CODICE + DISPLAY "Descrizione" DESCR + COPY OUTPUT F_CODICE + CHECKTYPE REQUIRED + KEY 2 +END + +SPREADSHEET F_CAUSALI 60 6 +BEGIN + PROMPT 1 3 "Causale" + ITEM "Valore@50" +END + +ENDPAGE + +PAGE "Pag. 2" 0 2 0 0 + +SPREADSHEET F_ARTICOLI 80 6 +BEGIN + PROMPT 1 1 "Codice Articolo" + ITEM "Tipo@50" + ITEM "Valore@50" +END + +SPREADSHEET F_ADG 0 6 +BEGIN + PROMPT 0 10 "Altri dati gestionali" + ITEM "Tipo Dato@50" + ITEM "Rif Testo@50" + ITEM "Rif Numero@20" + ITEM "Rif Data@20" +END + +ENDPAGE +ENDMASK + +PAGE "Riga Causale" -1 -1 60 12 + +STRING S_CAUS_VALORE 250 50 +BEGIN + PROMPT 1 1 "Valore " + HELP "Valore da inserire nella causale" +END + +ENDPAGE + +TOOLBAR "Riga" 0 0 0 2 + +BUTTON DLG_OK 2 2 +BEGIN + PROMPT 1 1 "" +END + +BUTTON DLG_CANCEL 2 2 +BEGIN + PROMPT 1 1 "" +END + +ENDPAGE +ENDMASK + +PAGE "Riga Articolo" -1 -1 60 12 + +STRING S_ART_TIPO 90 50 +BEGIN + PROMPT 1 1 "Tipo " + HELP "Tag TipoArticolo" +END + +STRING S_ART_VALORE 90 50 +BEGIN + PROMPT 1 1 "Valore " + HELP "Tag ValoreArticolo" +END + +ENDPAGE + +TOOLBAR "Riga" 0 0 0 2 + +BUTTON DLG_OK 2 2 +BEGIN + PROMPT 1 1 "" +END + +BUTTON DLG_CANCEL 2 2 +BEGIN + PROMPT 1 1 "" +END + +ENDPAGE +ENDMASK + +PAGE "Riga Altri Dati Gestionali" -1 -1 60 12 + +STRING S_ADG_TIPODATO 90 50 +BEGIN + PROMPT 1 1 "Tipo dato " + HELP "Tag 2.2.1.16.1 TipoDato" +END + +STRING S_ADG_RTESTO 90 50 +BEGIN + PROMPT 1 2 "Rif testo " + HELP "Tag 2.2.1.16.2 RiferimentoTesto" +END + +NUMBER S_ADG_RNUMERO 18 5 +BEGIN + PROMPT 1 3 "Rif numero " + HELP "Tag 2.2.1.16.3 RiferimentoNumero" +END + +DATE S_ADG_RDATA +BEGIN + PROMPT 1 4 "Rif data " + HELP "Tag 2.2.1.16.4 RiferimentoData" +END + +ENDPAGE + +TOOLBAR "Riga" 0 0 0 2 + +BUTTON DLG_OK 2 2 +BEGIN + PROMPT 1 1 "" +END + +BUTTON DLG_CANCEL 2 2 +BEGIN + PROMPT 1 1 "" +END + +ENDPAGE +ENDMASK \ No newline at end of file diff --git a/src/fp/fp0600.cpp b/src/fp/fp0600.cpp new file mode 100644 index 000000000..99eb573da --- /dev/null +++ b/src/fp/fp0600.cpp @@ -0,0 +1,58 @@ +#include +#include +#include +#include + +#include "fp0.h" +#include "fp0600a.h" +#include "fplib.h" +#include "fpccaus.h" + + +class TPop : public TSkeleton_application +{ + +public: + bool create() override; + bool destroy() override { return true; } + void main_loop() override; + + TPop() = default; +}; + +bool TPop::create() +{ + TFP_custom fp_custom("TEST"); + TRecord_array& record_array = fp_custom.body(LF_FPCCAUS); + + int nrow; + while((nrow = record_array.succ_row(1)) != record_array.rows()) + { + const TRectype& rec = record_array.row(nrow); + TString app = rec.get(FPCCAUS_NRIGA); + TString app2 = rec.get(FPCCAUS_VALORE); + bool maxitolla = true; + } + + + fp_custom.remove(); + + bool tolla = true; + return true; +} + +void TPop::main_loop() +{ + TFP_custom fp_custom("TEST"); + + + bool tolla = true; + +} + +int fp0600(int argc, char* argv[]) +{ + TPop pop; + pop.run(argc, argv, TR("Fatturazione F.P.")); + return 0; +} diff --git a/src/fp/fp0600a.h b/src/fp/fp0600a.h new file mode 100644 index 000000000..e69de29bb diff --git a/src/fp/fp0600a.uml b/src/fp/fp0600a.uml new file mode 100644 index 000000000..e69de29bb diff --git a/src/fp/fplib.h b/src/fp/fplib.h index 8d16d5635..13f6de61a 100644 --- a/src/fp/fplib.h +++ b/src/fp/fplib.h @@ -370,7 +370,7 @@ public: TFP_selected_docs(); }; -class TFp_mail_sender +class TFp_mail_sender : public TObject { int _anno; TString16 _codnum; @@ -415,4 +415,68 @@ public: TRecord_array& bodyof##__rdoc = (__doc).body(); \ for (int __r = bodyof##__rdoc.first_row(); bodyof##__rdoc.exist(__r) && (__rdoc=&(TFPRiga_documento&)bodyof##__rdoc.row(__r))!=NULL; __r=bodyof##__rdoc.succ_row(__r)) + +/*********************************************************************************************************************************************************************** + * PERSONALIZZAZIONI FP + ***********************************************************************************************************************************************************************/ + +struct TFP_row_art +{ + TString _codice_tipo; + TString _codice_valore; + TFP_row_art(const TString& codice_tipo, const TString& codice_valore) : _codice_tipo(codice_tipo), _codice_valore(codice_valore) {} +}; + +struct TFP_adg +{ + TString _tipo_dato; + TString _riferimento_testo; + int _riferimento_numero; + TDate _riferimento_data; + + TFP_adg(const TString& tipo_dato, const TString& riferimento_testo, const int riferimento_numero, + const TDate& riferimento_data) + : _tipo_dato(tipo_dato), + _riferimento_testo(riferimento_testo), + _riferimento_numero(riferimento_numero), + _riferimento_data(riferimento_data){} +}; + +/**< + * Classe per la gestione di personalizzazioni FP +*/ +class TFP_custom : public TMultiple_rectype +{ +protected: + TString _codcust; + TString_array _causale; + vector _articoli; + vector _altri_dati_gestionali; + bool _loaded; + void init(); + int write_rewrite(TBaseisamfile& f, bool re = FALSE) const override; + bool load(const char* codcust); + +public: + bool set_codcust(const char* codcust, const bool to_load) { return to_load ? load(codcust) : _codcust = codcust; } + void autoload(const TSheet_field& sf, const int file) const; + + TFP_custom(); + explicit TFP_custom(const TRectype& rec); + explicit TFP_custom(const char* codcust); +}; + +#define FOR_EACH_FPCAUS_ROW(__fpcust, __r, __rcaus) TRectype* __rcaus=NULL; \ + TRecord_array& bodyof##__rcaus = (__fpcust).body(LF_FPCCAUS); \ + for (int __r = bodyof##__rcaus.first_row(); bodyof##__rcaus.exist(__r) && (__rcaus=&(TRectype&)bodyof##__rcaus.row(__r))!=NULL; __r=bodyof##__rcaus.succ_row(__r)) + +#define FOR_EACH_FPART_ROW(__fpcust, __r, __rart) TRectype* __rart=NULL; \ + TRecord_array& bodyof##__rart = (__fpcust).body(LF_FPCART); \ + for (int __r = bodyof##__rart.first_row(); bodyof##__rart.exist(__r) && (__rart=&(TRectype&)bodyof##__rart.row(__r))!=NULL; __r=bodyof##__rart.succ_row(__r)) + +#define FOR_EACH_FPADG_ROW(__fpcust, __r, __radg) TRectype* __radg=NULL; \ + TRecord_array& bodyof##__radg = (__fpcust).body(LF_FPCADG); \ + for (int __r = bodyof##__radg.first_row(); bodyof##__radg.exist(__r) && (__radg=&(TRectype&)bodyof##__radg.row(__r))!=NULL; __r=bodyof##__radg.succ_row(__r)) + + #endif // __FPLIB_H diff --git a/src/fp/fplib01.cpp b/src/fp/fplib01.cpp index d291f912b..25cc16ea0 100644 --- a/src/fp/fplib01.cpp +++ b/src/fp/fplib01.cpp @@ -1240,7 +1240,6 @@ void TDoc_fp::set_qta_prezzo(TPaf_record& paf1800f, TFPRiga_documento* rdoc) con real prezzo_unit = rdoc->prezzo(_nascondi_sconti_righe_fatt, false); real prezzo_tot = rdoc->imponibile(false); - if(qta < ZERO) { // Metto la qualità senza il segno @@ -1250,6 +1249,7 @@ void TDoc_fp::set_qta_prezzo(TPaf_record& paf1800f, TFPRiga_documento* rdoc) con prezzo_unit = -abs(prezzo_unit); prezzo_tot = -abs(prezzo_tot); } + // Salvo tutto paf1800f.set("PI_QUANTITA", qta_string); paf1800f.set("PI_PREZZOUNIT", converti_prezzo(prezzo_unit)); diff --git a/src/fp/fplib05.cpp b/src/fp/fplib05.cpp new file mode 100644 index 000000000..691e6ee63 --- /dev/null +++ b/src/fp/fplib05.cpp @@ -0,0 +1,91 @@ +#include "fplib.h" +#include +#include +#include +#include + + +void TFP_custom::init() +{ + add_file(LF_FPCCAUS, FPCCAUS_NRIGA); + add_file(LF_FPCART, FPCART_NRIGA); + add_file(LF_FPCADG, FPCADG_NRIGA); +} + +int TFP_custom::write_rewrite(TBaseisamfile& f, bool re) const +{ + return TMultiple_rectype::write_rewrite(f, re); +} + +bool TFP_custom::load(const char* codcust) +{ + // Metto il codice nel rectype principale ed effettuo una read + put(FPCUST_CODICE, codcust); + + return _loaded = TMultiple_rectype::read() == NOERR; +} + +void TFP_custom::autoload(const TSheet_field& sf, const int file) const +{ + switch(file) + { + case LF_FPCCAUS: + { + TRecord_array& rcaus = body(file); + rcaus.destroy_rows(); + FOR_EACH_SHEET_ROW(sf, r, row) + { + TRectype& rec_row = rcaus.row(-1, true); + rec_row.put(FPCCAUS_VALORE, row->get(0)); + } + } + break; + case LF_FPCART: + { + TRecord_array& rart = body(file); + rart.destroy_rows(); + FOR_EACH_SHEET_ROW(sf, r, row) + { + TRectype& rec_row = rart.row(-1, true); + rec_row.put(FPCART_TIPO, row->get(0)); + rec_row.put(FPCART_VALORE, row->get()); + } + } + break; + case LF_FPCADG: + { + TRecord_array& radg = body(file); + radg.destroy_rows(); + FOR_EACH_SHEET_ROW(sf, r, row) + { + TRectype& rec_row = radg.row(-1, true); + rec_row.put(FPCADG_TIPODATO, row->get(0)); + rec_row.put(FPCADG_RTESTO, row->get()); + rec_row.put(FPCADG_RNUMERO, row->get()); + rec_row.put(FPCADG_RDATA, row->get()); + } + } + break; + default: + fatal_box("File non riconosciuto %d", file); + break; + } +} + +TFP_custom::TFP_custom() : TMultiple_rectype(LF_FPCUST), _codcust(""), _loaded(false) +{ + init(); +} + +TFP_custom::TFP_custom(const TRectype& rec) : TMultiple_rectype(rec) +{ + _codcust = get(FPCUST_CODICE); + _loaded = _codcust.full(); + init(); +} + +TFP_custom::TFP_custom(const char* codcust) : TFP_custom() +{ + init(); + load(codcust); +}