From 66243e8aaac6d5325c69828215df350f239a1ec1 Mon Sep 17 00:00:00 2001 From: guy Date: Wed, 20 May 2015 10:04:00 +0000 Subject: [PATCH] Supporto per allegati a fattura P.A. git-svn-id: svn://10.65.10.50/branches/R_10_00@23100 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- pa/pa0100.cpp | 195 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 167 insertions(+), 28 deletions(-) diff --git a/pa/pa0100.cpp b/pa/pa0100.cpp index 96f229cce..ff9c10b5a 100644 --- a/pa/pa0100.cpp +++ b/pa/pa0100.cpp @@ -3,7 +3,10 @@ #include #include #include +#include +#include #include +#include #include "../ve/velib05.h" @@ -46,7 +49,8 @@ static bool chiave_paf(const TDocumento& doc, TString& cess, TString& numdoc) // Crea la coppia di chiavi per il db PAF a partire da un semplice record di testata documento static bool chiave_paf(const TRectype& doc, TString& cess, TString& numdoc) { - TString8 key; key.format("C|%ld", doc.get_long(DOC_CODCF)); + const long codcf = doc.get_long(DOC_CODCF); + TString8 key; key.format("C|%ld", codcf); cess = cache().get(LF_CFVEN, key, CFV_PADESTIN); CHECK(cess.full(), "Destinatario fattura P.A. non valido"); @@ -466,12 +470,26 @@ class TPA_mask : public TAutomask { protected: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + void fill(); + void init(); + bool is_fattura(const TRectype& doc) const; public: - TPA_mask() : TAutomask("pa0100a") {} + TPA_mask() : TAutomask("pa0100a") { } }; +bool TPA_mask::is_fattura(const TRectype& doc) const +{ + const TTipo_documento& td = cached_tipodoc(doc.get(DOC_TIPODOC)); + if (!td.is_fattura()) // Tengo per buone solo le fatture e le note di credito + return false; + + const TCodice_numerazione& cn = cached_numerazione(doc.get(DOC_CODNUM)); + return !cn.get_bool("B10"); // Controlla se fattura provvisioria esclusa sda P.A. +} + + void TPA_mask::fill() { TSheet_field& docs = sfield(F_DOCS); @@ -553,9 +571,11 @@ bool TPA_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { case F_DATAINI: if (e == fe_init) - o.set("01-06-2014"); + o.set(ini_get_string(CONFIG_DITTA, "pa", "LastXML", "31-03-2015")); else if (e == fe_modify) - fill(); + fill(); else + if (e == fe_close) + ini_set_string(CONFIG_DITTA, "pa", "LastXML", o.get()); break; case F_SHOWALL: if (e == fe_modify) @@ -595,6 +615,8 @@ class TDoc2Paf : public TSkeleton_application TAnagrafica _ditta; TString16 _cofi; TFilename _dbname; + TLog_report* _log; + TString _logpaf; private: int parse_line(const TString& line, TString& var, TString& val) const; @@ -605,10 +627,14 @@ private: protected: bool parse_sconto(const TString& formula, TToken_string& sconti) const; + bool get_bnp_iban(const TString& abi, const TString& cab, int prg, TString& iban) const; bool get_bank(const TDocumento& doc, TString& iban, TString& abi, TString& cab, TString& istituto) const; const char* descrizione(const TRiga_documento& rdoc) const; const TRectype& cco(const TRectype& doc) const; // Contratto/Convenzione/Offerta + void log(int severity, const char* msg); + bool show_log(); + bool elabora(TDocumentoEsteso& doc); bool elabora(const TRectype& rec); bool elabora(const TDoc_key& key); @@ -619,6 +645,8 @@ public: virtual bool create(); virtual bool destroy(); virtual void main_loop(); + + TDoc2Paf() : _log(NULL) {} }; bool TDoc2Paf::parse_sconto(const TString& formula, TToken_string& sconti) const @@ -646,43 +674,66 @@ bool TDoc2Paf::parse_sconto(const TString& formula, TToken_string& sconti) const return sconti.full(); } +bool TDoc2Paf::get_bnp_iban(const TString& abi, const TString& cab, int nprog, TString& iban) const +{ + TTable bnp("BNP"); + TString16 key; + key << abi << cab; + if (nprog > 0) + { + TString4 sprog; sprog.format("%02d", nprog); + key << sprog; + } + bnp.put("CODTAB", key); + int err = bnp.read(_isgteq); + if (err == NOERR && !bnp.get("CODTAB").starts_with(abi)) + err = _iskeynotfound; + if (err == NOERR) + iban = bnp.get("S3"); + + return err == NOERR; +} + bool TDoc2Paf::get_bank(const TDocumento& doc, TString& iban, TString& abi, TString& cab, TString& istituto) const { bool found = false; - TToken_string key; - key.add("C"); key.add(doc.codcf()); key.add("N"); key.add(1); - const TRectype& cfban = cache().get(LF_CFBAN, key); - if (!cfban.empty()) + abi = doc.get(DOC_CODABIP); + cab = doc.get(DOC_CODCABP); + int prg = doc.get_int(DOC_PROGBNP); + + found = abi.full() && cab.full(); + if (found) + get_bnp_iban(abi, cab, prg, iban); + + if (!found) // Se non trovo banca sul DOC la cerco su CFBAN { - abi = cfban.get(CFBAN_ABI); - cab = cfban.get(CFBAN_CAB); - found = abi.full() && cab.full(); - iban = cfban.get(CFBAN_IBAN); - if (iban.blank() && found) + TToken_string key; + key.add("C"); key.add(doc.codcf()); key.add("N"); key.add(1); + const TRectype& cfban = cache().get(LF_CFBAN, key); + if (!cfban.empty()) { - key.cut(0) << abi << cab << cfban.get(CFBAN_PROGPR); - iban = cache().get("BNP", key, "S3"); + abi = cfban.get(CFBAN_ABI); + cab = cfban.get(CFBAN_CAB); + prg = cfban.get_int(CFBAN_PROGPR); + found = abi.full() && cab.full(); + iban = cfban.get(CFBAN_IBAN); + if (found && iban.blank()) + get_bnp_iban(abi, cab, prg, iban); } } - if (!found) + if (!found) // Se non trovo banca su CFBAN la cerco su CFVEN { const TRectype& cfven = doc.clifor().vendite(); abi = cfven.get(CFV_CODABIPR); cab = cfven.get(CFV_CODCABPR); found = abi.full() && cab.full(); - if (!found) - { - abi = doc.get(DOC_CODABIP); - cab = doc.get(DOC_CODCABP); - found = abi.full() && cab.full(); - } + if (found) + get_bnp_iban(abi, cab, 0, iban); } if (found) - { istituto = cache().get("%BAN", abi, "S0"); - } return found; } @@ -757,6 +808,38 @@ const TRectype& TDoc2Paf::cco(const TRectype& doc) const return cache().get("&CON", conkey); } +void TDoc2Paf::log(int severity, const char* msg) +{ + if (severity < 0) + { + _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); + } +} + +bool TDoc2Paf::show_log() +{ + bool ok = true; + if (_log) + { + _log->preview(); + delete _log; + _log = NULL; + ok = noyes_box(TR("Si desidera procedere con la generazione file xml?")); + } + return ok; +} bool TDoc2Paf::elabora(TDocumentoEsteso& doc) { @@ -764,6 +847,7 @@ bool TDoc2Paf::elabora(TDocumentoEsteso& doc) TString20 bfatt; // Codice univoco di 20 caratteri del documento if (!chiave_paf(doc, hfatt, bfatt)) return false; + log(-1, bfatt); const TFirm& firm = prefix().firm(); const char* const paese = "IT"; @@ -1052,6 +1136,9 @@ bool TDoc2Paf::elabora(TDocumentoEsteso& doc) paf1200f.insert(); } } + + if (cup.blank() && cig.blank()) + log(1, "CIG e CUP assenti"); // @@ -1219,7 +1306,7 @@ bool TDoc2Paf::elabora(TDocumentoEsteso& doc) paf2400f.set("PN_KEYBODYFATT", bfatt); paf2400f.remove(); // Cancella i dati pagamento - const TPagamento& pag = doc.pagamento(); + TPagamento& pag = doc.pagamento(); doc.scadenze_recalc(); // Ricalcola array delle rate TString_array& scad = doc.scadenze(); const int nrate = scad.items(); // Conta rate generate @@ -1247,6 +1334,11 @@ bool TDoc2Paf::elabora(TDocumentoEsteso& doc) paf2500f.set("PO_CAB", cab); } + if (cab.blank()) + log(2, TR("Non sono presenti ABI, CAB, IBAN per il pagamento")); else + if (iban.blank()) + log(1, TR("Non è presente il codice IBAN per il pagamento")); + for (int nr = 0; nr < nrate; nr++) { paf2500f.set("PO_KEYNPROGR", long(nr+1)); // Numero rata @@ -1270,6 +1362,52 @@ bool TDoc2Paf::elabora(TDocumentoEsteso& doc) paf2500f.insert(); } + TToken_string allegati = doc.get("COLL_GOLEM"); + if (allegati.full()) + { + TFilename fzip; + fzip = prefix().get_studio(); + fzip.add("sql"); fzip.add("attach"); + make_dir(fzip); + + TString20 code = bfatt; code.replace('/', '_'); + fzip.add(code); fzip << ".zip"; + + TFilename fname; + if (allegati.items() <= 2) // Una sola coppia (path|nome) + { + fname = allegati.get(0); + aga_zip(fname, fzip); + } + else + { + TFilename flist; flist.tempdir(); flist.add("ziplist.txt"); + ofstream list(flist); + FOR_EACH_TOKEN(allegati, str) + { + fname = str; + if (fname.exist()) + list << fname << endl; + } + list.close(); + aga_zip_filelist(flist, fzip); + xvt_fsys_remove_file(flist); + } + + TPaf_record paf2600f("PAF2600F"); + paf2600f.set("PP_KEYHEADERFATT", hfatt); + paf2600f.set("PP_KEYBODYFATT", bfatt); + paf2600f.remove(); // Cancella allegati + if (fzip.exist()) + { + paf2600f.set("PP_NOMEATTACHMENT", fname.name()); + paf2600f.set("PP_FMTATTACHMENT", fname.ext()); + paf2600f.set("PP_ATTACHMENT", fzip); + paf2600f.set("PP_COMPRESSIONE", "ZIP"); + paf2600f.insert(); + } + } + // return true; @@ -1396,7 +1534,8 @@ void TDoc2Paf::main_loop() } if (ndocs > 0) { - genera_xml(); + if (show_log()) + genera_xml(); return; } @@ -1424,7 +1563,7 @@ void TDoc2Paf::main_loop() break; } message_box(FR("Sono stati elaborati %d documenti"), ndocs); - if (ndocs > 0) + if (ndocs > 0 && show_log()) genera_xml(); } } @@ -1521,7 +1660,7 @@ bool TDoc2Paf::create_table(TScanner& paf, const TString& table) bool TDoc2Paf::create() { open_files(LF_TAB, LF_TABCOM, LF_TABMOD, LF_ANAG, - LF_CLIFO, LF_CFVEN, LF_NDITTE, + LF_CLIFO, LF_CFVEN, LF_CFBAN, LF_NDITTE, LF_DOC, LF_RIGHEDOC, 0); TRectype cfven(LF_CFVEN);