From 7f3054a080ab173117eec90bc0297e747478f66a Mon Sep 17 00:00:00 2001 From: Mattia Tollari Date: Thu, 4 Oct 2018 18:10:17 +0200 Subject: [PATCH] Patch level : 12.0 no-patch Files correlati : fp Commento : - Rifatta interfaccia filtri - Aggiunte nuove funzioni per il filtraggio - Modificato warning in caricamento - Sistemati bug dove non caricava la query - Aggiunto salvataggio/caricamento campi - Aggiunta funzione get_coddest(...) - Sistemato log - Sistemata scrittura descrizione, adesso viene messa direttamente nel paf3000f - Aggiornamento sql per campi data --- src/fp/fp0100.cpp | 2 +- src/fp/fp0100a.uml | 6 +- src/fp/fp0300.cpp | 152 +++++++++++++++++++++++++++++------------- src/fp/fp0300a.h | 19 +++--- src/fp/fp0300a.uml | 133 +++++++++++++++++------------------- src/fp/fplib01.cpp | 100 ++++++++++++++++----------- src/fp/fplib01.h | 5 +- src/fp/sql/fp0104.sql | 86 ++++++++++++++++++++++++ 8 files changed, 332 insertions(+), 171 deletions(-) create mode 100644 src/fp/sql/fp0104.sql diff --git a/src/fp/fp0100.cpp b/src/fp/fp0100.cpp index 035c2cb91..383513680 100644 --- a/src/fp/fp0100.cpp +++ b/src/fp/fp0100.cpp @@ -109,7 +109,7 @@ bool TParametri_mask::on_key(KEY key) m.field(101).check_type(CHECK_REQUIRED); while(m.run() == K_ENTER) { - if (m.get(101) == "sirioFATT99") // Hardcode password are the best! + if (m.get(101) == "sirioFATT99") // Hardcoded password are the best! { for (int i = F_SETPATCH; i <= F_REBORNDB; i++) enable(i); diff --git a/src/fp/fp0100a.uml b/src/fp/fp0100a.uml index 0e3d42abc..4272b5ea2 100644 --- a/src/fp/fp0100a.uml +++ b/src/fp/fp0100a.uml @@ -17,7 +17,7 @@ ENDPAGE PAGE "Configurazione FP" 0 2 0 0 -GROUPBOX DLG_NULL 78 8 +GROUPBOX DLG_NULL 78 6 BEGIN PROMPT 1 1 "@BDatabase" END @@ -79,13 +79,13 @@ BEGIN MODULE RS END -STRING F_FLDDEST 300 50 +STRING F_FLDDEST 250 50 BEGIN PROMPT 2 13 "Destinazione Server " FLAGS "" END -STRING F_FLDUSRDEST 300 50 +STRING F_FLDUSRDEST 250 50 BEGIN PROMPT 2 14 "Destinazione User " DSELECT diff --git a/src/fp/fp0300.cpp b/src/fp/fp0300.cpp index 39b78c525..6ca03afd5 100644 --- a/src/fp/fp0300.cpp +++ b/src/fp/fp0300.cpp @@ -11,6 +11,7 @@ #include "fp0.h" #include "fp0300a.h" +#include ///////////////////////////////////////////////////////////////////////////////////// @@ -30,19 +31,25 @@ protected: void set_filter_changed(); virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); void next_page(int p); - bool checkNotEmpty(); - + bool check_not_empty(); + bool check_full_fields() const; + bool check_tipo_doc(const TTipo_documento& td); void fill(); void init(); bool is_fattura(const TRectype& doc) const; + void load_all_fields(); + bool _filter_changed; + unique_ptr _tipi_doc_scelti; public: TPA_mask() : TAutomask("fp0300a"), _filter_changed(true) { disable(DLG_OK); + load_all_fields(); } + void save_all_fields() const; }; bool TPA_mask::is_fattura(const TRectype& doc) const @@ -55,6 +62,40 @@ bool TPA_mask::is_fattura(const TRectype& doc) const return cn.tipo() == 2 && !cn.get_bool("B10"); // Controlla se fattura provvisioria esclusa da P.A. } +void TPA_mask::save_all_fields() const +{ + ini_set_string(CONFIG_DITTA, "fp", "dataini", get(F_DATAINI)); + ini_set_string(CONFIG_DITTA, "fp", "dataend", get(F_DATAEND)); + ini_set_string(CONFIG_DITTA, "fp", "codnum", get(F_CODNUM)); + + TToken_string tipidocs = get_tmp_string(); + FOR_EACH_SHEET_ROW(sfield(F_DOCUMENTI_TIPO), n, r) + { + tipidocs.add(r->get(0)); + } + ini_set_string(CONFIG_DITTA, "fp", "tipodocs", tipidocs); +} + +void TPA_mask::load_all_fields() +{ + set(F_DATAINI, ini_get_string(CONFIG_DITTA, "fp", "dataini")); + set(F_DATAEND, ini_get_string(CONFIG_DITTA, "fp", "dataend")); + set(F_CODNUM, ini_get_string(CONFIG_DITTA, "fp", "codnum")); + TToken_string tipidocs(ini_get_string(CONFIG_DITTA, "fp", "tipodocs")); + + auto& sheet = sfield(F_DOCUMENTI_TIPO); + sheet.hide(); + FOR_EACH_STR_TOKEN(tipidocs, tok) + { + + TToken_string& row = sheet.row(-1); + row.add(tok); + row.add(TTipo_documento(tok).tipo_doc_sdi()); + } + sheet.force_update(); + sheet.show(); +} + TString& add_filter(const TString& field, const TString& from, const TString& to) { TString& query = get_tmp_string(); @@ -78,7 +119,10 @@ TString& add_filter(const TString& field, const TString& from, const TString& to void TPA_mask::fill() { - + save_all_fields(); + // Pulisco i tipi documento + _tipi_doc_scelti.reset(); + TSheet_field& docs = sfield(F_DOCS); TString_array& sht = docs.rows_array(); docs.hide(); @@ -87,7 +131,7 @@ void TPA_mask::fill() const TDate dal = get(F_DATAINI); TString filter_selected = get(F_FATTSEL); - enable(DLG_OK, filter_selected != "N"); + enable(DLG_OK, filter_selected != "X"); // Record di controllo per eventuali elaborazioni precedenti TString hfatt(LEN_HFATT), bfatt(LEN_BFATT); @@ -95,27 +139,26 @@ void TPA_mask::fill() TString query; - query << "USE 33 " << - "SELECT (BETWEEN(33.DATADOC,#DADATADOC,#ADATADOC))&&(33.TIPOCF=='C')"; + query << "USE 33 KEY 3" << + "\nSELECT (33.TIPOCF=='C')&&" << + "(33.CODNUM==#CODNUM)"; - query << add_filter("33.TIPODOC", get(F_DATIPODOC), get(F_ATIPODOC)); - - query << "\nJOIN 20 INTO TIPOCF==TIPOCF CODCF==CODCF \n" << - "JOIN 17 TO 33 INTO TIPOCF==TIPOCF CODCF==CODCF \n" << - "JOIN %TIP TO 33 ALIAS 400 INTO CODTAB==TIPODOC"; + query << "\nJOIN 20 INTO TIPOCF==TIPOCF CODCF==CODCF \n" << + "JOIN 17 TO 33 INTO TIPOCF==TIPOCF CODCF==CODCF \n" << + "JOIN %TIP TO 33 ALIAS 400 INTO CODTAB==TIPODOC\n" << + "FROM DATADOC=#DADATADOC\n" << + "TO DATADOC=#ADATADOC"; TISAM_recordset rec(query); - if (get(F_DATIPODOC).full()) - rec.set_var("#DATIPODOC", get(F_DATIPODOC)); - if (get(F_ATIPODOC).full()) - rec.set_var("#ATIPODOC", get(F_ATIPODOC)); - + + rec.set_var("#CODNUM", get(F_CODNUM)); rec.set_var("#DADATADOC", get_date(F_DATAINI)); rec.set_var("#ADATADOC", get_date(F_DATAEND)); - TProgress_monitor pi(rec.items(), NULL); + TProgress_monitor pi(rec.items(), nullptr); bool first, show, ask = !((show = (first = true))); + int fat_no_cod = 0; // Disabilito la colonna del codice ufficio docs.enable_column(docs.cid2index(S_UFFICIO), false); @@ -128,13 +171,13 @@ void TPA_mask::fill() const TTipo_documento& td = cached_tipodoc(doc.get(DOC_TIPODOC)); // Controllo che il tipo documento sia OK - if (td.tipo_doc_sdi().empty() || td.reg_fisc().empty()) + if(!check_tipo_doc(td)) continue; bool sent = false; if (chiave_paf(doc, hfatt, bfatt)) { - if (paf0100f.search(NULL, hfatt, bfatt)) + if (paf0100f.search(nullptr, hfatt, bfatt)) { if (paf0100f.sq_get("P1_GESTIONE") != filter_selected) continue; @@ -169,29 +212,13 @@ void TPA_mask::fill() // Segno la riga errata if (first) { - // Abilito la colonna del codice ufficio per segnalare l'errore - docs.enable_column(docs.cid2index(S_UFFICIO)); + first = false; + // Abilito la colonna del codice ufficio per segnalare l'errore + docs.enable_column(docs.cid2index(S_UFFICIO)); } docs.set_back_and_fore_color(COLOR_RED, COLOR_WHITE, rec.current_row(), docs.cid2index(S_UFFICIO)); - - if (show) - { - TString msg; msg << "Trovata fattura " << rec.get(DOC_CODNUM).as_string() << "/" << rec.get(DOC_TIPODOC).as_string() << "/" << rec.get(DOC_NDOC).as_int() << " senza nessun codice destinatario/pec, Continuare?"; - const bool force_stop = !yesno_box(msg); - if (!first && !ask && !force_stop) - { - show = yesno_box("Continuare a mostrare questo messaggio?"); - ask = true; - } - if (force_stop) - { - row.cut(0); - docs.force_update(); - docs.show(); - return; - } - first = false; - } + + fat_no_cod++; } } if(rif.full()) @@ -220,6 +247,9 @@ void TPA_mask::fill() docs.force_update(); docs.show(); + + if (fat_no_cod > 0) + warning_box("Sono state trovate una o più fatture senza codice destinatario nè pec"); } void TPA_mask::set_filter_changed() @@ -283,7 +313,7 @@ bool TPA_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) break; default: break; } - if (e == fe_modify && jolly == 0) + if((e == fe_modify || e >= se_enter) && jolly == 0) { if (o.dlg() >= START_MASK && o.dlg() <= END_MASK) { @@ -295,20 +325,22 @@ bool TPA_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) void TPA_mask::next_page(int p) { - TAutomask::next_page(p); - if (_filter_changed) + bool ok = true; + if (_filter_changed && p != 1000) { - TSheet_field& sf = sfield(F_DOCS); - if (curr_win() == sf.parent()) + if ((ok = _filter_changed = check_full_fields())) { + TSheet_field& sf = sfield(F_DOCS); fill(); sf.force_update(); _filter_changed = false; } } + if(ok) + TAutomask::next_page(p); } -bool TPA_mask::checkNotEmpty() +bool TPA_mask::check_not_empty() { TSheet_field& sheet = sfield(F_DOCS); TString msg; @@ -325,6 +357,33 @@ bool TPA_mask::checkNotEmpty() return sheet.full(); } +bool TPA_mask::check_full_fields() const +{ + // Controllo ogni campo che sia valorizzato + FOR_EACH_MASK_FIELD(*this, i, f) + { + if (!f->on_key(K_ENTER)) + return false; + } + return true; +} + +bool TPA_mask::check_tipo_doc(const TTipo_documento& td) +{ + // Mi precarico la tabella dei documenti scelti + + if(_tipi_doc_scelti == nullptr) + { + _tipi_doc_scelti.reset(new TToken_string()); + FOR_EACH_SHEET_ROW(sfield(F_DOCUMENTI_TIPO), n, r) + { + _tipi_doc_scelti->add(r->get(0)); + } + } + // Controllo innanzitutto che sia tra quelli scelti + return _tipi_doc_scelti->find(td.codice()) >= 0 && td.tipo_doc_sdi().full() && td.reg_fisc().full(); +} + ///////////////////////////////////////////////////////////////////////////////////// // TDoc2Paf @@ -373,6 +432,7 @@ void TDoc2Paf::main_loop() { if (elab.commit() > 0) { + mask.save_all_fields(); message_box(FR("Sono stati elaborati %d documenti"), ndocs); } else diff --git a/src/fp/fp0300a.h b/src/fp/fp0300a.h index 2db5f221a..7d59607dd 100644 --- a/src/fp/fp0300a.h +++ b/src/fp/fp0300a.h @@ -1,12 +1,15 @@ #define START_MASK 301 -#define F_DATAINI 301 -#define F_DATAEND 302 -#define F_FATTSEL 303 -#define F_DACODNUM 304 -#define F_DATIPODOC 305 -#define F_ACODNUM 306 -#define F_ATIPODOC 307 -#define END_MASK 399 +#define F_DATAINI 401 +#define F_DATAEND 402 +#define F_FATTSEL 403 +#define F_CODNUM 404 +#define END_MASK 499 + + +#define F_DOCUMENTI_TIPO 301 + +#define S_TIPODOCSEL 101 +#define S_TIPODOCSDI 102 #define F_DOCS 201 diff --git a/src/fp/fp0300a.uml b/src/fp/fp0300a.uml index acf26e6e3..31f90c9da 100644 --- a/src/fp/fp0300a.uml +++ b/src/fp/fp0300a.uml @@ -5,103 +5,50 @@ TOOLBAR "topbar" 0 0 0 2 #include ENDPAGE -PAGE "Fatture Pubblica Amministrazione" 0 2 0 0 +PAGE "Fatturazione Elettronica" 0 2 0 0 DATE F_DATAINI BEGIN - PROMPT 1 0 "Data iniziale" + PROMPT 1 1 "Data iniziale" CHECKTYPE REQUIRED END DATE F_DATAEND BEGIN - PROMPT 30 0 "Data finale" + PROMPT 40 1 "Data finale " VALIDATE DATE_CMP_FUNC >= F_DATAINI WARNING "La data finale non può essere minore della data iniziale" CHECKTYPE REQUIRED END -RADIOBUTTON F_FATTSEL 100 +RADIOBUTTON F_FATTSEL 3 35 BEGIN - PROMPT 1 1 "Fatture da visualizzare" + PROMPT 1 2 "Fatture da visualizzare" ITEM "|Da inviare" - ITEM "D|Diagnosticate" - ITEM "P|Pronte" ITEM "X|XML Generato" ITEM "E|In errore" - ITEM "N|Accettate" - FLAGS "Z" END -STRING F_DACODNUM 4 +STRING F_CODNUM 4 BEGIN - PROMPT 1 4 "Da Numerazione" - FIELD CODNUM + PROMPT 40 2 "Numerazione " HELP "Codice numerazione" USE %NUM - INPUT CODTAB F_DACODNUM + INPUT CODTAB F_CODNUM DISPLAY "Codice" CODTAB DISPLAY "Descrizione@50" S0 - OUTPUT F_DACODNUM CODTAB - CHECKTYPE FORCED + OUTPUT F_CODNUM CODTAB + CHECKTYPE REQUIRED FLAG "UPA" WARNING "Numerazione assente" KEY 1 2 END -STRING F_DATIPODOC 4 +SPREADSHEET F_DOCUMENTI_TIPO 25 5 BEGIN - PROMPT 30 4 "Da tipo doc " - FIELD TIPODOC - HELP "Codice tipo documento" - USE %TIP - SELECT S3[37,40]!="" - INPUT CODTAB F_DATIPODOC - DISPLAY "Codice" CODTAB - DISPLAY "Descrizione@50" S0 - DISPLAY "Tipo SDI@10" S12 - OUTPUT F_DATIPODOC CODTAB - CHECKTYPE FORCED - FLAG "UP" -END - -STRING F_ACODNUM 4 -BEGIN - PROMPT 1 5 "A Numerazione " - FIELD CODNUM - HELP "Codice numerazione" - USE %NUM - INPUT CODTAB F_ACODNUM - DISPLAY "Codice" CODTAB - DISPLAY "Descrizione@50" S0 - OUTPUT F_ACODNUM CODTAB - CHECKTYPE FORCED - FLAG "UPA" - WARNING "Numerazione assente" - KEY 1 2 -END - -STRING F_ATIPODOC 4 -BEGIN - PROMPT 30 5 "A tipo doc " - FIELD TIPODOC - HELP "Codice tipo documento" - USE %TIP - SELECT S3[37,40]!="" - INPUT CODTAB F_ATIPODOC - DISPLAY "Codice" CODTAB - DISPLAY "Descrizione@50" S0 - DISPLAY "Tipo SDI@10" S12 - OUTPUT F_ATIPODOC CODTAB - CHECKTYPE FORCED - FLAG "UP" -END - -STRING DLG_PROFILE 256 -BEGIN - PROMPT 1 -1 "Profilo " - PSELECT - FLAGS "H" + PROMPT 40 3 "" + ITEM "Tipo Doc" + ITEM "Tipo SDI" END ENDPAGE @@ -129,9 +76,55 @@ BEGIN END ENDPAGE - ENDMASK +PAGE "Riga tipo doc" -1 -1 25 3 + +STRING S_TIPODOCSEL 4 +BEGIN + PROMPT 1 1 "Tipo doc " + HELP "Codice tipo documento" + USE %TIP + SELECT S3[37,40]!="" + INPUT CODTAB S_TIPODOCSEL + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + DISPLAY "Tipo SDI@10" S12 + OUTPUT S_TIPODOCSEL CODTAB + OUTPUT S_TIPODOCSDI S12 + CHECKTYPE FORCED + FLAG "UPA" +END + +STRING S_TIPODOCSDI 4 +BEGIN + PROMPT 1 2 "Tipo Doc SDI" + FLAG "D" +END + +ENDPAGE + +TOOLBAR "Tipo Documento" 0 0 0 2 + +BUTTON DLG_OK 2 2 +BEGIN + PROMPT 1 1 "" +END + +BUTTON DLG_DELREC 2 2 +BEGIN + PROMPT 1 1 "" +END + +BUTTON DLG_CANCEL 2 2 +BEGIN + PROMPT 1 1 "" +END + +ENDPAGE +ENDMASK + + PAGE "Documento" -1 -1 78 9 BOOLEAN S_SELECTED @@ -245,7 +238,5 @@ BEGIN PROMPT 1 1 "" END - ENDPAGE - -ENDMASK +ENDMASK \ No newline at end of file diff --git a/src/fp/fplib01.cpp b/src/fp/fplib01.cpp index 5a324102e..933b2d2ea 100644 --- a/src/fp/fplib01.cpp +++ b/src/fp/fplib01.cpp @@ -86,7 +86,7 @@ bool check_tables() if (r[0] == '-' && r[1] == '-') continue; s += r; - // Cerco un ; + // Cerco un ; const int limiter = s.find(';') + 1; if(limiter > 0) { @@ -150,6 +150,31 @@ bool chiave_paf(const TRectype& doc, TString& hfatt, TString& bfatt) return hfatt.full(); } +bool get_coddest(const char tipocf, const long codcf, TString& coddest, TString& pec) +{ + TCli_for clifo(tipocf, codcf); + coddest = clifo.vendite().get("PADESTIN"); + pec = clifo.get("PEC"); + bool enapec = false; + if (coddest.empty()) + { + // Controllo se ha la pec + if (pec.full()) + { + coddest = "0000000"; + enapec = true; + } + // Controllo se è straniero + else if (TAnagrafica(LF_CLIFO, tipocf, codcf).estero()) + { + coddest = "XXXXXXX"; + } + else + return false; + } + return true; +} + /*************************************************************************** * TPaf_record ***************************************************************************/ @@ -291,7 +316,7 @@ TString& TPaf_record::remove_string() query << fld << '=' << var2str(fld, var); } } - CHECKS(nkf >= 2, "Can't remove partial key on table ", (const char*)_table); + CHECKS(nkf >= 2, "Can't remove partial key on table ", static_cast(_table)); query << ';'; return query; } @@ -619,29 +644,32 @@ const TRectype& TDoc_fp::cco(const TRectype& doc) const { char tcon = doc.get_char(DOC_MODPAG); if (tcon < 'C') tcon = 'C'; - conkey.format("%c%6ld%s", tcon, doc.get_long(DOC_CODCF), (const char*)con); + conkey.format("%c%6ld%s", tcon, doc.get_long(DOC_CODCF), static_cast(con)); } return cache().get("&CON", conkey); } void TDoc_fp::log(int severity, const char* msg) { - if (severity < 0) + if (_log == nullptr) + { + _log = new TLog_report; + } + if (severity < 0) + { + _logpaf = msg; + } + else + { + if (_logpaf.full()) { - _logpaf = msg; - } - else if (_log == NULL) - { - _log = new TLog_report; - if (_logpaf.full()) - { - TString txt; - txt << _logpaf << ": " << msg; - _log->log(severity, txt); - } - else - _log->log(severity, msg); + TString txt; + txt << _logpaf << ": " << msg; + _log->log(severity, txt); } + else + _log->log(severity, msg); + } } bool TDoc_fp::show_log() @@ -730,7 +758,6 @@ bool TDoc_fp::add_row_alleg(TFilename& file, long& nprogr, TPaf_record& paf) return ok; } - bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) { TString8 hfatt; // Codice univoco di 6 caratteri dell'ufficio P.A. o di 7 caratteri per un privato @@ -740,23 +767,11 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) TString8 coddest = doc.clifor().vendite().get("PADESTIN"); TString pec = doc.clifor().get("PEC"); - bool enapec = false; - if (coddest.empty()) - { - // Controllo se ha la pec - if (pec.full()) - { - coddest = "0000000"; - enapec = true; - } - // Controllo se è straniero - else if (clifo.estero()) - { - coddest = "XXXXXXX"; - } - else - return false; - } + + if (!get_coddest(doc.clifor().tipo(), doc.clifor().codice(), coddest, pec)) + return false; + + const bool enapec = coddest == "0000000" && pec.full(); const bool privato = coddest.len() != 6; bool ok = true; @@ -1115,7 +1130,13 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) paf1800f.set("PI_KEYHEADERFATT", hfatt); paf1800f.set("PI_KEYBODYFATT", bfatt); paf1800f.set("PI_NUMEROLINEA", ++riga); - paf1800f.set("PI_DESCRIZIONE", descrizione(*rdoc)); + + TPaf_record paf3000f("PAF3000F"); + paf3000f.set("PT_KEYHEADERFATT", hfatt); + paf3000f.set("PT_KEYBODYFATT", bfatt); + paf3000f.set("PT_RIFNUMLINEA", riga); + paf3000f.set("PT_COMMENTO", descrizione(*rdoc)); + // paf1800f.set("PI_ALIQUOTAIVA", "22.00"); // Altrimenti scarta le righe di descrizione // @@ -1142,7 +1163,6 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) } // - set_IVA(codivadefault, paf1800f); if (rdoc->is_merce()) @@ -1185,7 +1205,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) const real perc = str; if (!perc.is_zero()) { - paf2000f.set("PJ_KEYNLINEA", (long)r); + paf2000f.set("PJ_KEYNLINEA", static_cast(r)); paf2000f.set("PJ_KEYNLINAR", ++nlin_sconto); if (perc > ZERO) { @@ -1261,7 +1281,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) if (qta.is_zero()) { TString msg; - msg.format("La riga spese a quantità %d ha quantità nulla (campo %s)", riga, (const char*)rdoc->field_qta()); + msg.format("La riga spese a quantità %d ha quantità nulla (campo %s)", riga, static_cast(rdoc->field_qta())); log(1, msg); qta = UNO; } @@ -1304,7 +1324,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) } paf1800f.set("PI_GESTIONE", "D"); - ok &= insert(paf1800f); + ok &= insert(paf1800f) && insert(paf3000f); } // diff --git a/src/fp/fplib01.h b/src/fp/fplib01.h index bb7912b94..6ef9ece9f 100644 --- a/src/fp/fplib01.h +++ b/src/fp/fplib01.h @@ -19,7 +19,7 @@ bool check_tables(); // Genera la chiave per i paf bool chiave_paf(const TDocumento& doc, TString& hfatt, TString& bfatt); bool chiave_paf(const TRectype& doc, TString& hfatt, TString& bfatt); - +bool get_coddest(const char tipocf, const long codcf, TString& coddest, TString& pec); // Contenitore di campi di un record di database MSSQLServer class TPaf_record : public TObject @@ -109,7 +109,8 @@ static bool get_bnp_iban(const TString& abi, const TString& static void set_IVA(const TRiga_documento& rdoc, TPaf_record& paf); bool add_row_art(const TString codice_tipo, const TString& codice_valore, TPaf_record& paf); bool add_row_alleg(TFilename& file, long& nprogr, TPaf_record& paf); - + void set_descrizione(const TRiga_documento* doc); + public: bool doc_to_paf(TDocumentoEsteso& doc); bool doc_to_paf(const TRectype& rec); diff --git a/src/fp/sql/fp0104.sql b/src/fp/sql/fp0104.sql new file mode 100644 index 000000000..62f30ee18 --- /dev/null +++ b/src/fp/sql/fp0104.sql @@ -0,0 +1,86 @@ +-- Aggiornamento campi date Campo, sta roba va fatta perchè abbiamo già dei clienti in produzione! + +-- FPERR00K +ALTER TABLE FPERR00K DROP CONSTRAINT FPERR00Q; +ALTER TABLE FPERR00K ALTER COLUMN PXUHRI DATETIME; +ALTER TABLE FPERR00K ADD CONSTRAINT FPERR00K_TLLNNAPRV1 DEFAULT '19700101 00:00:00' FOR PXUHRI; +UPDATE FPERR00K SET PXUHRI = '19700101 00:00:00' WHERE PXUHRI IS NULL; +ALTER TABLE FPERR00K ALTER COLUMN PXUHRI DATETIME NOT NULL; +ALTER TABLE FPERR00K ADD CONSTRAINT FPERR00Q PRIMARY KEY(PXPRGI, PXHFAT, PXBFAT, PXUHRI, PXNFIL, PXNLIN, PXNERR); + +-- FPPRO00F +ALTER TABLE FPPRO00F ALTER COLUMN PZ_DATAPROT DATETIME; +ALTER TABLE FPPRO00F ADD CONSTRAINT FPPRO00F_TLLNNAPRV1 DEFAULT '19700101 00:00:00' FOR PZ_DATAPROT; +UPDATE FPPRO00F SET PZ_DATAPROT = '19700101 00:00:00' WHERE PZ_DATAPROT IS NULL; +ALTER TABLE FPPRO00F ALTER COLUMN PZ_DATAPROT DATETIME NOT NULL; + +ALTER TABLE FPPRO00F ALTER COLUMN PZ_DATAACCET DATETIME; +ALTER TABLE FPPRO00F ADD CONSTRAINT FPPRO00F_TLLNNAPRV2 DEFAULT '19700101 00:00:00' FOR PZ_DATAACCET; +UPDATE FPPRO00F SET PZ_DATAACCET = '19700101 00:00:00' WHERE PZ_DATAACCET IS NULL; +ALTER TABLE FPPRO00F ALTER COLUMN PZ_DATAACCET DATETIME NOT NULL; + +ALTER TABLE FPPRO00F ALTER COLUMN PZ_DATACONT DATETIME; +ALTER TABLE FPPRO00F ADD CONSTRAINT FPPRO00F_TLLNNAPRV3 DEFAULT '19700101 00:00:00' FOR PZ_DATACONT; +UPDATE FPPRO00F SET PZ_DATACONT = '19700101 00:00:00' WHERE PZ_DATACONT IS NULL; +ALTER TABLE FPPRO00F ALTER COLUMN PZ_DATACONT DATETIME NOT NULL; + +ALTER TABLE FPPRO00F ALTER COLUMN PZ_DATAARCH DATETIME; +ALTER TABLE FPPRO00F ADD CONSTRAINT FPPRO00F_TLLNNAPRV4 DEFAULT '19700101 00:00:00' FOR PZ_DATAARCH; +UPDATE FPPRO00F SET PZ_DATAARCH = '19700101 00:00:00' WHERE PZ_DATAARCH IS NULL; +ALTER TABLE FPPRO00F ALTER COLUMN PZ_DATAARCH DATETIME NOT NULL; + +ALTER TABLE FPPRO00F ALTER COLUMN PZ_DATAORARIC DATETIME; +ALTER TABLE FPPRO00F ADD CONSTRAINT FPPRO00F_TLLNNAPRV5 DEFAULT '19700101 00:00:00' FOR PZ_DATAORARIC; +UPDATE FPPRO00F SET PZ_DATAORARIC = '19700101 00:00:00' WHERE PZ_DATAORARIC IS NULL; +ALTER TABLE FPPRO00F ALTER COLUMN PZ_DATAORARIC DATETIME NOT NULL; + +ALTER TABLE FPPRO00F ALTER COLUMN PZ_DATASTATO DATETIME; +ALTER TABLE FPPRO00F ADD CONSTRAINT FPPRO00F_TLLNNAPRV6 DEFAULT '19700101 00:00:00' FOR PZ_DATASTATO; +UPDATE FPPRO00F SET PZ_DATASTATO = '19700101 00:00:00' WHERE PZ_DATASTATO IS NULL; +ALTER TABLE FPPRO00F ALTER COLUMN PZ_DATASTATO DATETIME NOT NULL; + +-- PAA0100F +ALTER TABLE PAA0100F DROP CONSTRAINT PAA0100Q; +DROP INDEX PAA0101I ON PAA0100F; +ALTER TABLE PAA0100F ALTER COLUMN P1_DATAORARIC DATETIME; +ALTER TABLE PAA0100F ADD CONSTRAINT PAA0100F_TLLNNAPRV1 DEFAULT '19700101 00:00:00' FOR P1_DATAORARIC; +UPDATE PAA0100F SET P1_DATAORARIC = '19700101 00:00:00' WHERE P1_DATAORARIC IS NULL; +ALTER TABLE PAA0100F ALTER COLUMN P1_DATAORARIC DATETIME NOT NULL; + +ALTER TABLE PAA0100F ALTER COLUMN P1_DATASTATO DATETIME; +ALTER TABLE PAA0100F ADD CONSTRAINT PAA0100F_TLLNNAPRV2 DEFAULT '19700101 00:00:00' FOR P1_DATASTATO; +UPDATE PAA0100F SET P1_DATASTATO = '19700101 00:00:00' WHERE P1_DATASTATO IS NULL; +ALTER TABLE PAA0100F ALTER COLUMN P1_DATASTATO DATETIME NOT NULL; + +ALTER TABLE PAA0100F ADD CONSTRAINT PAA0100Q PRIMARY KEY(P1_KEYPRGINVIO, P1_KEYHEADERFATT, P1_KEYBODYFATT, P1_DATAORARIC); +CREATE INDEX PAA0101I ON PAA0100F (P1_KEYPRGINVIO ASC, P1_KEYHEADERFATT ASC, P1_KEYBODYFATT ASC, P1_DATAORARIC ASC); + +-- PAA2800F +ALTER TABLE PAA2800F ALTER COLUMN PR_DATAORARIT DATETIME; +ALTER TABLE PAA2800F ADD CONSTRAINT PAA2800F_TLLNNAPRV1 DEFAULT '19700101 00:00:00' FOR PR_DATAORARIT; +UPDATE PAA2800F SET PR_DATAORARIT = '19700101 00:00:00' WHERE PR_DATAORARIT IS NULL; +ALTER TABLE PAA2800F ALTER COLUMN PR_DATAORARIT DATETIME NOT NULL; + +ALTER TABLE PAA2800F ALTER COLUMN PR_DATAORACON DATETIME; +ALTER TABLE PAA2800F ADD CONSTRAINT PAA2800F_TLLNNAPRV2 DEFAULT '19700101 00:00:00' FOR PR_DATAORACON; +UPDATE PAA2800F SET PR_DATAORACON = '19700101 00:00:00' WHERE PR_DATAORACON IS NULL; +ALTER TABLE PAA2800F ALTER COLUMN PR_DATAORACON DATETIME NOT NULL; + +-- PAF2800F +ALTER TABLE PAF2800F ALTER COLUMN PR_DATAORARIT DATETIME; +ALTER TABLE PAF2800F ADD CONSTRAINT PAF2800F_TLLNNAPRV1 DEFAULT '19700101 00:00:00' FOR PR_DATAORARIT; +UPDATE PAF2800F SET PR_DATAORARIT = '19700101 00:00:00' WHERE PR_DATAORARIT IS NULL; +ALTER TABLE PAF2800F ALTER COLUMN PR_DATAORARIT DATETIME NOT NULL; + +ALTER TABLE PAF2800F ALTER COLUMN PR_DATAORACON DATETIME; +ALTER TABLE PAF2800F ADD CONSTRAINT PAF2800F_TLLNNAPRV2 DEFAULT '19700101 00:00:00' FOR PR_DATAORACON; +UPDATE PAF2800F SET PR_DATAORACON = '19700101 00:00:00' WHERE PR_DATAORACON IS NULL; +ALTER TABLE PAF2800F ALTER COLUMN PR_DATAORACON DATETIME NOT NULL; + +-- PAFW300F +ALTER TABLE PAFW300F ALTER COLUMN PW_UPAG DATETIME; +ALTER TABLE PAFW300F ADD CONSTRAINT PAFW300F_TLLNNAPRV1 DEFAULT '19700101 00:00:00' FOR PW_UPAG; +UPDATE PAFW300F SET PW_UPAG = '19700101 00:00:00' WHERE PW_UPAG IS NULL; +ALTER TABLE PAFW300F ALTER COLUMN PW_UPAG DATETIME NOT NULL; + +-- TLLNNAPRV -> Tolla non approva \ No newline at end of file