From 4a8623e5d245971ed3a413c23f1d28b1a0f13ece Mon Sep 17 00:00:00 2001 From: mtollari Date: Thu, 13 Jul 2017 12:27:06 +0000 Subject: [PATCH] Patch level : 12.0 420 Files correlati : Commento : Maschera: - Tolti attributi ghost ai campi clifoDoc - Aggiunto bottone invio per programma Java Programma: - Sistemata getCli - aggiunta xvt_fsys_fupdate() per copiare ssa nella cartella di ModuliSirio - definita macro IF_IS_ENABLED - Ottimizzate funzioni con reference - Aggiunta TTrFa_app::copySSA() - Reso funzionante la funzione di marcatura dei record esportati git-svn-id: svn://10.65.10.50/branches/R_10_00@23940 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- src/tf/tf0100.cpp | 138 +++++++++++++++++++++++++++++------------- src/tf/tf0100a.uml | 8 ++- src/tf/tf0100b.h | 17 ++++-- src/tf/tf0101.cpp | 148 +++++++++++++++++++++++++++------------------ src/tf/tf0102.cpp | 27 +++------ 5 files changed, 215 insertions(+), 123 deletions(-) diff --git a/src/tf/tf0100.cpp b/src/tf/tf0100.cpp index aef09537a..0ef19d313 100644 --- a/src/tf/tf0100.cpp +++ b/src/tf/tf0100.cpp @@ -96,24 +96,22 @@ TRectype getTrasFatt(TString reg, TString codiva) return cache().get(LF_TRASFATT, key); } -TRectype getCli(TString tipocf, TString codcf) +TRectype getCli(const TString& tipocf, const TString& codcf, const TString& ocfpi) { - if(tipocf != "O") - { - TString key = tipocf; key << "|" << codcf; - return cache().get(LF_CLIFO, key); - } - // Cliente occasionale! - else + TString key = tipocf; key << "|" << codcf; + const TRectype& cli = cache().get(LF_CLIFO, key); + if(cli.get_bool("OCCAS")) { TRectype cli(LF_CLIFO); - TRectype occas = cache().get(LF_OCCAS, codcf); + TRectype occas = cache().get(LF_OCCAS, ocfpi); cli.put("RAGSOC" , occas.get("RAGSOC")); cli.put("CODRFSO" , ""); cli.put("PAIV" , occas.get("PAIV")); cli.put("COFI" , occas.get("COFI")); return cli; } + else + return cli; } // Cerca una stringa all'interno di una SLIST (Potrebbe diventare una funzione di XVT.h) @@ -129,6 +127,26 @@ static SLIST_ELT xvt_slist_find_str(SLIST list, const char* str) return e; } +// Aggiorna il file dst se più vecchio di src (Potrebbe diventare una funzione di XVT.h) +bool xvt_fsys_fupdate(const char* src, const char* dst) +{ + bool ok = false; + if (xvt_fsys_file_exists(src)) + { + const long tsrc = xvt_fsys_file_attr(src, XVT_FILE_ATTR_MTIME); + if (tsrc > 0) + { + long tdst = 0; + if (xvt_fsys_file_exists(dst)) + tdst = xvt_fsys_file_attr(dst, XVT_FILE_ATTR_MTIME); + if (tsrc > tdst) + ok = xvt_fsys_fcopy(src, dst) != 0; + } + } + + return ok; +} + // Controlla se l'azienda ha un RFSO bool haveRFSO(TString& codrfso) { @@ -627,7 +645,8 @@ bool TTrFa_app::create() { createDB(); } - return TSkeleton_application::create(); + + return TSkeleton_application::create(); } // Sincronizzo il DB SQL con quello di campo @@ -674,6 +693,36 @@ bool TTrFa_app::createDB() return true; } +bool TTrFa_app::copySSA() +{ + TFilename tmp; + + // Copia eventuali protezioni software + TString_array files; + if (list_files(SPESOMETROBASE "/*.ssa", files) == 0) + { + list_files("*.ssa", files); + FOR_EACH_ARRAY_ROW(files, i, row) + { + tmp = SPESOMETROBASE; tmp.add(*row); + xvt_fsys_fupdate(*row, tmp); + } + } + files.destroy(); + if (list_files(SPESOMETROBASE "/*.ssa", files) != 1) + { + warning_box(FR("Nella cartella %s deve essere presente esattamente un file .ssa"), SPESOMETROBASE); + return false; + } + + TFilename home; + xvt_sys_get_env("USERPROFILE", home.get_buffer(), home.size()); + home.add("SoftwareSirio"); home.add(SPESOMETROBASE); + if (!dexist(home)) + make_dir(home); + return true; +} + bool TTrFa_app::send(TTrFa_mask* msk) { // Controllo se è la prima esecuzione, in caso positivo chiedo se vuole controllare p.iva e cf @@ -719,7 +768,14 @@ bool TTrFa_app::send(TTrFa_mask* msk) message_box("Ho esportato correttamente!"); // Imposto l'esportazione if(yesno_box("Vuoi segnare i record esportati?")) - setEsportato(sheet); + { + if(setEsportato(sheet)) + message_box("Record segnati correttamente!"); + else + message_box("Ci sono stati degli errori durante la riscrittura dei records"); + msk->setFilterChanged(); + } + } else message_box("Errore durante il salvataggio delle modifiche"); @@ -794,6 +850,7 @@ bool TTrFa_app::tff0100(TSheet_field& sheet) bool cli = false, fo = false; FOR_EACH_SHEET_ROW(sheet, r, strarr) { + IF_IS_ENABLED(strarr); if(strarr->get_char(_tipocf) == 'C') cli = true; else @@ -802,9 +859,10 @@ bool TTrFa_app::tff0100(TSheet_field& sheet) } // Metto qua il numero di telefono per dopo TString80 tel; tel << firm.get("PTEL") << firm.get("TEL"); - bool ok = true; + bool ok = false; if(cli) { + ok = true; TTrFa_record dte("TFF0100F"); // Controllo la presenza di un caricamento in attesa @@ -841,6 +899,7 @@ bool TTrFa_app::tff0100(TSheet_field& sheet) } if(fo) { + ok = true; TTrFa_record dtr("TFF0100F"); // Controllo la presenza di un caricamento in attesa @@ -985,7 +1044,8 @@ bool TTrFa_app::tff0400(TSheet_field& sheet) { if(!p.add_status()) return false; - if(strcmp(strarr->get(_invio), "X") != 0) continue; // Non mi interessa se non è selezionata + + IF_IS_ENABLED(strarr); // Controllo il clifo, se non c'è lo aggiungo altrimenti salto sto giro TString checkClifo; checkClifo << strarr->get_char(_tipocf) << strarr->get_long(_codcf); @@ -994,14 +1054,8 @@ bool TTrFa_app::tff0400(TSheet_field& sheet) else continue; - TAnagrafica cedeprest(LF_CLIFO, strarr->get_char(_tipocf), strarr->get_long(_codcf)); - TString keyCedPrest; keyCedPrest << strarr->get_char(_tipocf) << "|" << strarr->get_long(_codcf); - - TRectype r_cedeprest = cache().get(LF_CLIFO, keyCedPrest); - TString statocli = cache().get("%STA", r_cedeprest.get("STATOCF"), "S10"); - // Se rimane vuoto è italiano - if(statocli == "") - statocli = "IT"; + TRectype r_cedeprest = getCli(strarr->get(_tipocf), strarr->get(_codcf), strarr->get(_occas)); + TAnagrafica cedeprest(r_cedeprest); TTrFa_record tff0400f("TFF0400F"); tff0400f.set("P4_KEYPRGINVIO", getKey(strarr)); @@ -1016,28 +1070,26 @@ bool TTrFa_app::tff0400(TSheet_field& sheet) } else // Fattura normale { - // Per le bolle doganali metto OO e 11 "9" in id paese e id fiscale iva - if(strcmp(strarr->get(_codnum),"BD") == 0) + if (cedeprest.stato_partita_IVA().full() && cedeprest.partita_IVA().full()) { - tff0400f.set("P4_FISCIVAPAESE", "OO"); - tff0400f.set("P4_FISCIVACOD", "99999999999"); + tff0400f.set("P4_FISCIVAPAESE", cedeprest.stato_partita_IVA()); + tff0400f.set("P4_FISCIVACOD", cedeprest.partita_IVA()); } else { - if (cedeprest.stato_partita_IVA().full() && cedeprest.partita_IVA().full()) + // Se non ho nemmeno un dato e sto processando una bolla doganale metto OO e 11 "9" in id paese e id fiscale iva + if(cedeprest.codice_fiscale().empty() && strcmp(strarr->get(_codnum),"BD") == 0) { - tff0400f.set("P4_FISCIVAPAESE", cedeprest.stato_partita_IVA()); - tff0400f.set("P4_FISCIVACOD", cedeprest.partita_IVA()); + tff0400f.set("P4_FISCIVAPAESE", "OO"); + tff0400f.set("P4_FISCIVACOD", "99999999999"); } else - { tff0400f.set("P4_CODFISC", cedeprest.codice_fiscale()); - } } } // Sono sicuro che se è di tipo 3,7 o 8 ha la ragione sociale - char tipo = r_cedeprest.get_char(CLI_ALLEG); + char tipo = r_cedeprest.exist(CLI_ALLEG) ? r_cedeprest.get_char(CLI_ALLEG) : '\0'; bool rsoc = cedeprest.giuridica() || (tipo == '3' || tipo == '7' || tipo == '8'); bool privato = tipo == '6'; @@ -1146,8 +1198,9 @@ bool TTrFa_app::tff0700(TSheet_field& sheet) { if(!p.add_status()) return false; - if(strcmp(strarr->get(_invio), "X") != 0) continue; // Non mi interessa se non è selezionata - + + IF_IS_ENABLED(strarr); + TString checkFatt; checkFatt << strarr->get_char(_tipocf) << "|" << strarr->get_long(_codcf) << "|" << strarr->get(_numdoc); if(fattSent.get_pos(checkFatt) < 0) { @@ -1273,8 +1326,11 @@ bool TTrFa_app::setEsportato(TSheet_field& sheet) { if(!p.add_status()) return false; - if(strcmp(strarr->get(_invio), "X") != 0) continue; // Non mi interessa se non è selezionata - if(strcmp(strarr->get(_forzata), "X") == 0) + + IF_IS_ENABLED(strarr); + + TString modificato = strarr->get(_forzata); + if(modificato == "X") { ok = saveRec(*strarr, true); if(!ok) return false; @@ -1282,7 +1338,7 @@ bool TTrFa_app::setEsportato(TSheet_field& sheet) else { TRectype row = cache().get(LF_MOV, TString(strarr->get(_numero))); - row.put("TFINVIO", "X"); + row.put("TFINVIO", "I"); row.put("TFDATA", TDate(TODAY).string()); ok = row.rewrite(TLocalisamfile(LF_MOV)) == NOERR; if(!ok) return false; @@ -1306,20 +1362,20 @@ bool TTrFa_app::emptyTables(TString key) void TTrFa_app::main_loop() { + // Sposto SSA + if(!copySSA()) return; + TTrFa_mask msk("tf0100a"); while (msk.run() == K_ENTER) { - if(msk.checkNotEmpty()) - send(&msk); + if(msk.checkNotEmpty() && send(&msk)) + ini_set_string(CONFIG_DITTA, "tf", "LastSend", ++TDate(msk.get(F_DATAFIN))); } } bool TTrFa_app::destroy() { - if (_cofi.full()) - ini_set_string(CONFIG_DITTA, "pa", "TRASMITTCOD", _cofi); - xvt_sql_close(_db); _db = NULL; return TSkeleton_application::destroy(); } diff --git a/src/tf/tf0100a.uml b/src/tf/tf0100a.uml index 500924edb..0c1335033 100644 --- a/src/tf/tf0100a.uml +++ b/src/tf/tf0100a.uml @@ -31,6 +31,12 @@ BEGIN PICTURE TOOL_ELABORA END +BUTTON DLG_EMAIL 2 2 +BEGIN + PROMPT 1 1 "Crea XML" + PICTURE TOOL_EMAIL +END + #include ENDPAGE @@ -250,7 +256,6 @@ BEGIN OUTPUT A_COFI COFI ADD RUN cg0 -1 FIELD CODCF - FLAGS "G" END STRING A_OCFPI 16 @@ -270,7 +275,6 @@ BEGIN GROUP 3 ADD RUN cg0 -6 FIELD OCFPI - FLAGS "G" END STRING A_RAGSOC 50 47 diff --git a/src/tf/tf0100b.h b/src/tf/tf0100b.h index 4c8af7ae6..4d70ed4cf 100644 --- a/src/tf/tf0100b.h +++ b/src/tf/tf0100b.h @@ -53,6 +53,7 @@ enum filter_fatt #define FLAG_ERRORE "E" #define FLAG_NINVIO "N" #define FLAG_FORZATO "F" +#define SPESOMETROBASE "ModuliSirio\\Spesometro" /* Così facendo basta modificare la maschera (e le dichiarazioni di conseguenza) * per avere l'inserimento nello sheet corretto */ @@ -93,9 +94,11 @@ int getTipoDoc(TString id); // Ritorna il record custom TRectype getTrasFatt(TString reg, TString codiva); // Ritorna il cliente in un record di $clifo, con tipocf = "O" lo cerca in $occas -TRectype getCli(TString tipocf, TString codcf); +TRectype getCli(const TString& tipocf, const TString& codcf, const TString& ocfpi); // Cerca una stringa all'interno di una SLIST (Potrebbe diventare una funzione di XVT.h) static SLIST_ELT xvt_slist_find_str(SLIST list, const char* str); +// Aggiorna il file dst se più vecchio di src (Potrebbe diventare una funzione di XVT.h) +bool xvt_fsys_fupdate(const char* src, const char* dst); // Controlla se l'azienda ha un RFSO bool haveRFSO(TString& codrfso); // Decodifica il tipo di documento per il trasferimento fatture @@ -104,6 +107,8 @@ const char * decodTipo(TToken_string* strarr); bool saveRec(TToken_string row, bool esportato = false); // Ritorno una data in formato ANSI inline TDate toDate(const char * date) { return TDate(date).string(); } +// Salto se la riga non è abilitata +#define IF_IS_ENABLED(strarr) if(strcmp(strarr->get(_invio), FLAG_INVIO) != 0 && strcmp(strarr->get(_invio), FLAG_FORZATO) != 0) continue; ///////////////////////////////////////////////////////////////////////////////////// // TTrFa_record @@ -161,8 +166,8 @@ class TTrFa_cursors : TObject // Se trovo un record custom devo saltare tutti quelli che trovo successivamente, per fare ciò utilizzo una TToken_string TToken_string _alqCust; - TRectype _next(return_code& code, TString& tipocf, TString& codcf); // Si sposta avanti di un elemento - TRectype _nextCust(return_code& code, TString& tipocf, TString& codcf); // Si sposta avanti di un elemento tra quelli custom + TRectype _next(return_code& code, TString& tipocf, TString& codcf, TString& ocfpi); // Si sposta avanti di un elemento + TRectype _nextCust(return_code& code, TString& tipocf, TString& codcf, TString& ocfpi); // Si sposta avanti di un elemento tra quelli custom bool checkRecord(TISAM_recordset* rec); public: //TTrFa_cursors(); @@ -170,7 +175,7 @@ public: long int getIvaItems() { return c_rmoviva->items(); } long int getIvaPos() { return c_rmoviva->cursor()->pos(); } TRectype getIva() { return c_rmoviva->cursor()->curr(); } - int next(TAssoc_array& recimposte, bool& ok, TString& tipocf, TString& codcf); // Legge tutto il prossimo movimento, in importi mette per ogni codiva la somma + int next(TAssoc_array& recimposte, bool& ok, TString& tipocf, TString& codcf, TString& ocfpi); // Legge tutto il prossimo movimento, in importi mette per ogni codiva la somma int updateFilters(const char tipocf, const long codcf, TDate dal, TDate al, int cod = toSend); }; @@ -197,6 +202,7 @@ protected: TRecnotype nuovo_progr() const; void changeInvio(TString tipocf, TString codcf, TString numdoc, TString invio) const; virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + void openJava(); public: void setFilterChanged() { _filter_changed = true; } @@ -212,7 +218,7 @@ public: // Controllo tutti i records bool checkAll(); // Testo validità record - bool checkRec(TPrinter* stampa, TToken_string rec); + bool checkRec(TPrinter* stampa, TToken_string& rec); // Controllo che siano presenti records bool checkNotEmpty(); // Controllo finale prima di inviare il tutto, se ci sono fatture @@ -268,6 +274,7 @@ protected: bool show_log(); bool syncronizeDB(); bool createDB(); + bool copySSA(); public: virtual bool create(); diff --git a/src/tf/tf0101.cpp b/src/tf/tf0101.cpp index ded405d54..2f3d8e7ca 100644 --- a/src/tf/tf0101.cpp +++ b/src/tf/tf0101.cpp @@ -166,27 +166,27 @@ bool TTrFa_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) } } } + break; case A_TIPOCF: case A_CODCF: case A_OCFPI: { if(e != fe_modify) break; - TString tipocf, codcf; - // Controllo se è un cliente occasionale - tipocf = "O"; - codcf = o.mask().get(A_OCFPI); - if(codcf.empty()) - { - tipocf = o.mask().get(A_TIPOCF); - codcf = o.mask().get(A_CODCF); - } - TRectype app = getCli(tipocf, codcf); + // Leggo dal clifo + TString tipocf, codcf, ocfpi; + tipocf = o.mask().get(A_TIPOCF); + codcf = o.mask().get(A_CODCF); + ocfpi = o.mask().get(A_OCFPI); + TRectype app = getCli(tipocf, codcf, ocfpi); o.mask().set(A_RAGSOC, app.get("RAGSOC")); o.mask().set(A_RFSO, app.get("CODRFSO")); o.mask().set(A_RAGSOCRFSO, getRFSO(app.get("CODRFSO"))); o.mask().set(A_PAIV, app.get("PAIV")); o.mask().set(A_COFI, app.get("COFI")); + // Abilito se il cliente è occasionale + o.mask().enable(A_OCFPI, app.get_bool("OCCAS")); + // Controllo autofattura TString key; key << prefix().firm().get("TIPOA") << "|" << prefix().firm().get("CODANAGR"); TString piva = cache().get(LF_ANAG, key, "PAIV"); @@ -196,6 +196,7 @@ bool TTrFa_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) o.mask().set(A_AUTOFATT, "X"); } } + break; case DLG_SAVEREC: if(e == fe_button) saveAll(); @@ -257,14 +258,26 @@ bool TTrFa_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) return error_box(FR("Errore di cancellazione: %d"), err); } // In qualsiasi caso elimino sta riga - TSheet_field& s = o.mask().sfield(F_RIGHE); - TToken_string& row = s.row(jolly); - row.destroy(jolly); + TSheet_field& sheet = sfield(F_RIGHE); + // Vado a cercare la riga + FOR_EACH_SHEET_ROW(sheet, r, strarr) + { + long thisProg; + TString thisAlq; + strarr->get(_numero, thisProg); + strarr->get(_aliquota, thisAlq); + if(thisProg == progr && thisAlq == codalq) break; + } + sheet.destroy(r); // Aggiorna in automatico } else return error_box(TR("Riga non cancellabile")); } break; + case DLG_EMAIL: + if(e == fe_button) + openJava(); + break; default: break; } @@ -295,6 +308,27 @@ bool TTrFa_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) return true; } +void TTrFa_mask::openJava() +{ + TFilename tmp; + tmp = SPESOMETROBASE "\\ModuliSirio.jar"; + tmp.make_absolute_path(); + + DIRECTORY old_dir; xvt_fsys_get_dir(&old_dir); + DIRECTORY new_dir; xvt_fsys_convert_str_to_dir(tmp.path(), &new_dir); + xvt_fsys_set_dir(&new_dir); + const bool good = goto_url(tmp); + if (good) + { + xvt_sys_sleep(3000); + } + else + { + error_box(FR("Impossibile eseguire Java -jar %s"), (const char*)tmp); + } + xvt_fsys_set_dir(&old_dir); +} + void TTrFa_mask::loadConfig() { // Rilevo i tipi scelti @@ -326,6 +360,7 @@ bool TTrFa_mask::saveAll() TSheet_field& sheet = sfield(F_RIGHE); //TString_array& strarr = sheet.rows_array(); TString mod = ""; + TLocalisamfile mov(LF_MOV); FOR_EACH_SHEET_ROW(sheet, r, strarr) { strarr->get(_forzata, mod); @@ -345,6 +380,12 @@ bool TTrFa_mask::saveAll() if(!ok) return false; } + // Salvo il valore di invio se è stato modificato + else if(strcmp(strarr->get(_invio), "X") != 0) + { + TRectype rmov = cache().get(LF_MOV, strarr->get(_numero)); + mov.rewrite(rmov); + } } return true; } @@ -401,7 +442,7 @@ inline void printError(TPrinter* stampa, TString movimento, TString documento, T stampa->print(riga); } -bool TTrFa_mask::checkRec(TPrinter* stampa, TToken_string rec) +bool TTrFa_mask::checkRec(TPrinter* stampa, TToken_string& rec) { bool ok = true; TString numMov = rec.get(_numero), numDoc = rec.get(_numdoc); @@ -438,17 +479,8 @@ bool TTrFa_mask::checkRec(TPrinter* stampa, TToken_string rec) coderr << "3;"; } - // Controllo Stato *********************************************************************************** - /* - TRectype clifo = getCli(rec.get(_tipocf), rec.get(_codcf)); - if(clifo.get("STATOCF") == "" && - */ // Flaggo il record con i messaggi di errore - if(!ok) - { - rec.add("E", _invio); - rec.add(coderr, _coderr); - } + rec.add(coderr, _coderr); // Sempre potrebbero esserci errori non bloccanti return ok; } @@ -499,6 +531,8 @@ void TTrFa_mask::theFinalCheckDown() cliDocs.add(key, newNumero); } } + // Forzo l'aggiornamento dello sheet + sfield(F_RIGHE).force_update(); } void TTrFa_mask::flagRow(int nrow, TString flag) @@ -549,7 +583,6 @@ void TTrFa_mask::load_sheet() TTrFa_cursors c; TSheet_field& sheet = sfield(F_RIGHE); - TString_array& strarr = sheet.rows_array(); sheet.hide(); // Nascondo lo sheet per guadagnare un 20% di velocità di caricamento, le ottimizzazioni da PRO! if(!sheet.empty()) @@ -558,14 +591,14 @@ void TTrFa_mask::load_sheet() int items = c.updateFilters(tipo, codice, dal, al, get_int(F_FATTSEL)); for(bool ok = true; items > 0 && ok;) { - TString tipocf, codcf; - int err = c.next(recimposte, ok, tipocf, codcf); + TString tipocf, codcf, ocfpi; + int err = c.next(recimposte, ok, tipocf, codcf, ocfpi); // Carico i clienti - TRectype cli = getCli(tipocf, codcf); + TRectype cli = getCli(tipocf, codcf, ocfpi); FOR_EACH_ASSOC_OBJECT(recimposte, h, iva, rec) { - TToken_string* row = new TToken_string; + TToken_string& row = sheet.row(-1); TRectype movimento = *(TRectype*)rec; // Controllo che sia un tipo documento da leggere @@ -575,27 +608,27 @@ void TTrFa_mask::load_sheet() * basta settare i valori negli enum e lo sheet */ TRectype isCust = getTrasFatt(movimento.get("NUMREG"), iva); - - row->add(isCust.get_bool("TFINVIO") ? "X" : "", _spedita); // Spedita - row->add("X"); // Da spedire, sempre! - row->add(isCust.full() ? "X" : "", _forzata); // Modificato - row->add(movimento.get_long("NUMREG"), _numero); // Numero registrazione - row->add(movimento.get_date("DATAREG"), _datareg); // Data Registrazione - row->add(movimento.get("TIPO"), _tipocf); // Tipo Cli/For - row->add(movimento.get("CODCF"), _codcf); // Codice Cli/For - row->add(movimento.get("OCCAS"), _occas); // Codice Occasionale - row->add(cli.get("RAGSOC"), _ragsoc); // Ragione sociale - row->add(cli.get("CODRFSO"), _rfso); // Codice RF/SO - row->add(getRFSO(cli.get("CODRFSO")), _ragsocrfso); // Ragione Sociale RF/SO - row->add(movimento.get("TIPODOC"), _codnum); // Tipo documento - row->add(movimento.get("NUMDOC"), _numdoc); // Numero documento - row->add(movimento.get_date("DATADOC"), _datadoc); // Data documento - row->add(natura(iva), _natura); // NATURA! - row->add(iva, _aliquota); // Codice aliquota! - row->add(findDetraib(movimento.get("TIPODET")), _detraibile); // Detraibilità - row->add(movimento.get_real("IMPONIBILE"), _imponibile); // Imponibile - row->add(movimento.get_real("IMPOSTA"), _importoIVA); // Imposta - row->add(revCharge(movimento.get("NUMREG")), _reverse); // Rev.Charge + + row.add(isCust.get("TFINVIO") == "I", _spedita); // Spedita + row.add("X"); // Da spedire, sempre! + row.add(isCust.full() ? "X" : "", _forzata); // Modificato + row.add(movimento.get_long("NUMREG"), _numero); // Numero registrazione + row.add(movimento.get_date("DATAREG"), _datareg); // Data Registrazione + row.add(movimento.get("TIPO"), _tipocf); // Tipo Cli/For + row.add(movimento.get("CODCF"), _codcf); // Codice Cli/For + row.add(movimento.get("OCCAS"), _occas); // Codice Occasionale + row.add(cli.get("RAGSOC"), _ragsoc); // Ragione sociale + row.add(cli.get("CODRFSO"), _rfso); // Codice RF/SO + row.add(getRFSO(cli.get("CODRFSO")), _ragsocrfso); // Ragione Sociale RF/SO + row.add(movimento.get("TIPODOC"), _codnum); // Tipo documento + row.add(movimento.get("NUMDOC"), _numdoc); // Numero documento + row.add(movimento.get_date("DATADOC"), _datadoc); // Data documento + row.add(natura(iva), _natura); // NATURA! + row.add(iva, _aliquota); // Codice aliquota! + row.add(findDetraib(movimento.get("TIPODET")), _detraibile); // Detraibilità + row.add(movimento.get_real("IMPONIBILE"), _imponibile); // Imponibile + row.add(movimento.get_real("IMPOSTA"), _importoIVA); // Imposta + row.add(revCharge(movimento.get("NUMREG")), _reverse); // Rev.Charge /* * Possono esistere movimenti custom dove il cliente ha una partita IVA propria @@ -604,18 +637,17 @@ void TTrFa_mask::load_sheet() */ if(movimento.get("AUTOFATT") == "X" || pivaDitta == cli.get("PAIV")) // Se è un autofattura { - row->add("X", _autofatt); // AutoFatt - row->add(pivaDitta, _paiv); // P.IVA - row->add(cofiDitta, _codfis); // Codice Fiscale + row.add("X", _autofatt); // AutoFatt + row.add(pivaDitta, _paiv); // P.IVA + row.add(cofiDitta, _codfis); // Codice Fiscale } else { - row->add("", _autofatt); // AutoFatt - row->add(cli.get("PAIV"), _paiv); // P.IVA - row->add(cli.get("COFI"), _codfis); // Codice Fiscale + row.add("", _autofatt); // AutoFatt + row.add(cli.get("PAIV"), _paiv); // P.IVA + row.add(cli.get("COFI"), _codfis); // Codice Fiscale } - - strarr.add(row); + sheet.enable_cell(sheet.items()-1, _occas, movimento.get("OCCAS").full()); } recimposte.destroy(); } diff --git a/src/tf/tf0102.cpp b/src/tf/tf0102.cpp index 6e48b85f8..8bf1720da 100644 --- a/src/tf/tf0102.cpp +++ b/src/tf/tf0102.cpp @@ -13,17 +13,17 @@ TTrFa_cursors::~TTrFa_cursors() delete c_trasfatt; } -int TTrFa_cursors::next(TAssoc_array& recimposte, bool& ok, TString& tipocf, TString& codcf) +int TTrFa_cursors::next(TAssoc_array& recimposte, bool& ok, TString& tipocf, TString& codcf, TString& ocfpi) { // Azzero recimposte recimposte.destroy(); // Return code return_code err; // Record - TRectype record = _next(err, tipocf, codcf); + TRectype record = _next(err, tipocf, codcf, ocfpi); if(err == eof) { - record = _nextCust(err, tipocf, codcf); + record = _nextCust(err, tipocf, codcf, ocfpi); } while(err < nextmov) { @@ -44,7 +44,7 @@ int TTrFa_cursors::next(TAssoc_array& recimposte, bool& ok, TString& tipocf, TSt recimposte.add(record.get("CODIVA"), record); } if(err == foundidcust) break; - record = _next(err, tipocf, codcf); + record = _next(err, tipocf, codcf, ocfpi); } ok = err != eofcust; return err; @@ -53,7 +53,7 @@ int TTrFa_cursors::next(TAssoc_array& recimposte, bool& ok, TString& tipocf, TSt /* * Questa funzione precarica un array associativo con il movimento diviso per codiva e lo ritorna */ -TRectype TTrFa_cursors::_next(return_code& code, TString& tipocf, TString& codcf) +TRectype TTrFa_cursors::_next(return_code& code, TString& tipocf, TString& codcf, TString& ocfpi) { TString numMov = c_rmoviva->get("23.NUMREG").as_string(); // Record di ritorno @@ -62,17 +62,9 @@ TRectype TTrFa_cursors::_next(return_code& code, TString& tipocf, TString& codcf if(_newMov) { _newMov = false; - // Se è un cliente occasionale passo "O" - if(c_rmoviva->get("23.OCFPI").as_string() != "") - { - tipocf = "O"; - codcf = c_rmoviva->get("23.OCFPI").as_string(); - } - else - { - tipocf = c_rmoviva->get("23.TIPO").as_string(); - codcf = c_rmoviva->get("23.CODCF").as_string(); - } + tipocf = c_rmoviva->get("23.TIPO").as_string(); + codcf = c_rmoviva->get("23.CODCF").as_string(); + ocfpi = c_rmoviva->get("23.OCFPI").as_string(); } else { @@ -131,7 +123,7 @@ TRectype TTrFa_cursors::_next(return_code& code, TString& tipocf, TString& codcf return retRec; } -TRectype TTrFa_cursors::_nextCust(return_code& code, TString& tipocf, TString& codcf) +TRectype TTrFa_cursors::_nextCust(return_code& code, TString& tipocf, TString& codcf, TString& ocfpi) { bool ok; // Preparo il nuovo cursore @@ -146,6 +138,7 @@ TRectype TTrFa_cursors::_nextCust(return_code& code, TString& tipocf, TString& c } tipocf = c_trasfatt->get("TIPO").as_string(); codcf = c_trasfatt->get("CODCF").as_string(); + ocfpi = c_trasfatt->get("OCFPI").as_string(); code = ok ? foundidcust : eofcust; return c_trasfatt->cursor()->curr(); }