diff --git a/ps/ps0398100.cpp b/ps/ps0398100.cpp index e7f9a237a..045ad6e5c 100755 --- a/ps/ps0398100.cpp +++ b/ps/ps0398100.cpp @@ -2,12 +2,20 @@ #include #include #include +#include +#include #include #include +#include #include #include #include +#include +#include +#include "../mg/anamag.h" +#include "../mg/umart.h" + #include "ps0398100a.h" /////////////////////////////////////////////// @@ -47,7 +55,7 @@ public: // RECORDSET ///////////////////////////////////////////// //creazione del recordset di ogni ordine -TTrasferimento_ordini_recordset::TTrasferimento_ordini_recordset(const char* filename) : TCSV_recordset("CSV(\";\")") +TTrasferimento_ordini_recordset::TTrasferimento_ordini_recordset(const char* filename) : TCSV_recordset("CSV(\"\t\")") { load_file(filename); }; @@ -66,7 +74,12 @@ class TTrasferimento_ordini : public TSkeleton_application protected: virtual const char * extra_modules() const {return "ve";} virtual bool create(); - void fill_string(const int curr_nriga, const TString& riga_txt, TString& str); + + bool ordine_gf(TTrasferimento_ordini_recordset& recset); + void elab_hd_ht(const TString& riga_txt, const int curr_nriga, TString& str); + void elab_hf(const TString& riga_txt, TConfig& curr_ini, const int curr_nriga, TLog_report& log, TString& ragsoc); + void elab_ro(const TString& riga_txt, TConfig& curr_ini, const int curr_nriga, TLog_report& log, TString& ho_note_generali); + void elab_ra(const TString& riga_txt, TConfig& curr_ini, const int curr_nriga, TLog_report& log); bool elabora(); public: @@ -74,40 +87,201 @@ public: }; -void TTrasferimento_ordini::fill_string(const int curr_nriga, const TString& riga_txt, TString& str) +//metodo per scoprire se l'ordine è di GF o no +bool TTrasferimento_ordini::ordine_gf(TTrasferimento_ordini_recordset& recset) +{ + //le righe articolo o sono tutte di GF o non lo sono (nessuna situazione mista) + bool is_ordine_gf = false; + + for (bool ok = recset.move_last(); ok; ok = recset.move_prev()) + { + const TString& riga_txt = recset.get(0L).as_string(); + const TString& tr = riga_txt.left(2); + if (tr == "RA") + { + TToken_string riga_ord(riga_txt.mid(5), ';'); + const TString& codart = riga_ord.get(); + //se il codice articolo non contiene il carattere '.' -> non è di GF -> scartato + const int dot_pos = codart.find('.'); + if (dot_pos >= 0) + { + is_ordine_gf = true; + break; + } + } + } + return is_ordine_gf; +} + +void TTrasferimento_ordini::elab_hf(const TString& riga_txt, TConfig& curr_ini, const int curr_nriga, TLog_report& log, TString& ragsoc) { switch (curr_nriga) { - case 3: - str = riga_txt; //indirizzo - str.trim(); + case 1: + { + ragsoc = riga_txt.mid(5); + ragsoc.trim(); + ragsoc.cut(50); + } break; - case 4: - str << " " << riga_txt.mid(5, 10); //cap - str.trim(); - str << " " << riga_txt.mid(15, 30); //città - str.trim(); - str << " " << riga_txt.mid(45, 30); //provincia - str.trim(); - str << " " << riga_txt.mid(75, 30); //nazione - str.trim(); + case 6: + { + const long codcf = atol(riga_txt.mid(14,6)); + //per prima cosa controlla se è possibile risalire al cliente che ha generato l'ordine.. + //..no cliente...no party! + if (codcf <= 0) + { + TString msg; + msg.format("Il cliente %s ha codice nullo!", (const char*)ragsoc); + log.log(2, msg); + } + else + { + curr_ini.set(DOC_TIPOCF, "C"); + curr_ini.set(DOC_CODCF, codcf); + } + } break; - default: break; } } +void TTrasferimento_ordini::elab_hd_ht(const TString& riga_txt, const int curr_nriga, TString& str) +{ + if (riga_txt.full()) + { + switch (curr_nriga) + { + case 3: + str << riga_txt; //indirizzo + str.trim(); + str << "\\n"; + break; + case 4: + str << " " << riga_txt.mid(5, 10); //cap + str.trim(); + str << " " << riga_txt.mid(15, 30); //città + str.trim(); + str << " " << riga_txt.mid(45, 30); //provincia + str.trim(); + str << " " << riga_txt.mid(75, 30); //nazione + str.trim(); + str << "\\n"; + break; + + default: + break; + } + } +} + + +void TTrasferimento_ordini::elab_ro(const TString& riga_txt, TConfig& curr_ini, const int curr_nriga, TLog_report& log, TString& ho_note_generali) +{ + switch (curr_nriga) + { + case 1: //numero ordine del sito web (per ora non serve, ma poi si vedrà...) + { + const long num_ord_web = atol(riga_txt.mid(5)); + } + break; + case 3: //datadoc (scritta alla cazzo) + { + TToken_string str_data(riga_txt.mid(5, 100).before(' '), '/'); + const TDate datadoc(str_data.get_int(0), str_data.get_int(1), str_data.get_int(2)); + if (!datadoc.ok()) + { + TString msg; + msg.format("Data documento non valida: %s", (const char*)str_data); + log.log(2, msg); + } + curr_ini.set(DOC_DATADOC, datadoc); + } + break; + case 4: //altre note ordine (da mettere in DOC_NOTE) + { + ho_note_generali = riga_txt.mid(5); + ho_note_generali.trim(); + } + break; + case 5: //codice condizione pagamento (anche questo x ora non serve, ma sempre si vedrà...) + { + const int cod_pag = atoi(riga_txt.mid(5)); + } + break; + default: + break; + } //switch(curr_nriga) +} + + +void TTrasferimento_ordini::elab_ra(const TString& riga_txt, TConfig& curr_ini, const int curr_nriga, TLog_report& log) +{ + TToken_string riga_ord(riga_txt.mid(5), ';'); + const TString codart = riga_ord.get(); + TString16 str_qta = riga_ord.get(); + str_qta.strip(". "); + str_qta.replace(',', '.'); + + //set_paragraph sulle righe (file 34, righedoc) + TString8 row_paragrafo; + row_paragrafo << LF_RIGHEDOC << ',' << curr_nriga; + curr_ini.set_paragraph(row_paragrafo); + + //l'articolo deve esistere per stare in codartmag e codart; + //se non esiste in anagrafica -> solo in codart con segnalazione + //la desc riga sarà la desc articolo + const TRectype& rec_anamag = cache().get(LF_ANAMAG, codart); + //se il record è vuoto l'articolo non è in anagrafica + if (rec_anamag.empty()) + { + TString msg; + msg.format("Articolo non in anagrafica: %s", (const char*)codart); + log.log(2, msg); + curr_ini.set(RDOC_DESCR, "Articolo non in anagrafica"); + } + else //sennò va tranquillo + { + curr_ini.set(RDOC_CODARTMAG, codart); + curr_ini.set(RDOC_DESCR, rec_anamag.get(ANAMAG_DESCR)); + curr_ini.set(RDOC_CHECKED, "X"); + + //alla qta associa la prima unità di misura + TToken_string key_umart; + key_umart.add(codart); + key_umart.add(1); + const TRectype& rec_umart = cache().get(LF_UMART, key_umart); + const TString& umqta = rec_umart.get(UMART_UM); + curr_ini.set(RDOC_UMQTA, umqta); + } + //queste le fa in ogni modo (forse rischiando) + curr_ini.set(RDOC_CODART, codart); + curr_ini.set(RDOC_QTA, str_qta); + + + const real prezzo = riga_ord.get(); //per adesso non ci va? + //e per ultime le eventuali note + const TString nota = riga_ord.get(); + if (nota.full()) + { + curr_ini.set(RDOC_DESCLUNGA, "X"); + curr_ini.set(RDOC_DESCEST, nota); + } +} + bool TTrasferimento_ordini::elabora() { TFilename src_files = _mask->get(F_PATH_SRC); - src_files.add("*.txt"); + src_files.add("*header.txt"); TString_array src_files_list; - //dalla cartella origine prende tutti i files .pdf e crea una simpatica lista + //dalla cartella origine prende tutti i files *HEADER.txt e crea una simpatica lista const int n_files_txt = list_files(src_files, src_files_list); - const bool delete_src_files = _mask->get_bool(F_ERASE_TRANSFERRED); + //già che c'è prende pure gli altri dati dalla maschera che gli servono poi + TFilename dst_path = _mask->get(F_PATH_DST); + //cartella dove saranno creati i .ini TFilename tmp; tmp.tempdir(); @@ -117,7 +291,7 @@ bool TTrasferimento_ordini::elabora() if (!crea_dir) { TString msg; - msg.format("Impossibile creare la cartella %s !", tmp); + msg.format("Impossibile creare la cartella di lavoro %s !", tmp); return error_box(msg); } @@ -125,6 +299,7 @@ bool TTrasferimento_ordini::elabora() TProgind pi(n_files_txt, TR("Acquisizione ordini in corso..."), true, true); TLog_report log("ERRORI DI TRASFERIMENTO"); + //ciclo su tutti i files .txt da esaminare for (int i = 0; i < n_files_txt; i++) { if (!pi.addstatus(1)) @@ -134,19 +309,45 @@ bool TTrasferimento_ordini::elabora() const TFilename curr_fname = src_files_list.row(i); //creazione del recordset associato al file TTrasferimento_ordini_recordset recset(curr_fname); + //se il file non è di GF (si vede dal codart) viene saltato! ohp! + if (!ordine_gf(recset)) + { + TString msg; + msg.format("Scartato file: %s ", (const char*)curr_fname.name()); + log.log(1, msg); + continue; + } + //avverte sul log quale file sta elaborando TString msg; - msg.format("Elaborazione file: %s", curr_fname.name()); + msg.format("Elaborazione file: %s", (const char*)curr_fname.name()); log.log(0, msg); //variabili da riempire ad ogni giro - TString4 curr_tiporiga; - int curr_nriga = 0; - long codcf = 0L; - TString ragsoc; - TString hd_indsped, ht_indfatt; + TString4 curr_tiporiga; //tipo riga in esame (HT...RA), ovvero sezione del file + int curr_nriga = 0; //n riga della sezione in esame + TString ragsoc, piva; + TString hd_spedizione; //questi stanno qui perchè valgono una volta per file .txt + TString ht_fatturazione; + TString ho_note_generali; + + //per ogni ordine in formato .txt genera un file.ini che andrà poi documentizzato + TFilename ini_fname = tmp; + ini_fname.add(format("ORD%05ld.ini", i)); + TConfig curr_ini(ini_fname); + + curr_ini.set_paragraph("Transaction"); //setto il paragrafo [Transaction] del file ini + + curr_ini.set("Action","INSERT"); + curr_ini.set("Mode",""); + + //set_paragraph sulle testate (file 33, doc) + TString8 head_paragrafo; + head_paragrafo << LF_DOC; + curr_ini.set_paragraph(head_paragrafo); //comincia il giro sulle righe del recordset + //va al contrario perchè se le righe non hanno articoli di GF -> salta il tutto for (bool ok = recset.move_first(); ok; ok = recset.move_next()) { //riga corrente del file di input @@ -160,76 +361,49 @@ bool TTrasferimento_ordini::elabora() } else curr_nriga ++; + //trattazione delle varie sezioni + // HF if (curr_tiporiga == "HF") - { - switch (curr_nriga) - { - case 1: - { - ragsoc = riga_txt.mid(5, 100); - ragsoc.trim(); - } - break; - case 6: - { - const long cc = atol(riga_txt.mid(14,6)); - if (cc > 0) - codcf = cc; - } - break; - default: - break; - } - - } //if(curr_tiporiga=HF + elab_hf(riga_txt, curr_ini, curr_nriga, log, ragsoc); + // HD if (curr_tiporiga == "HD") - fill_string(curr_nriga, riga_txt.mid(5, 100), hd_indsped); - if (curr_tiporiga == "HT") - fill_string(curr_nriga, riga_txt.mid(5, 100), ht_indfatt); + elab_hd_ht(riga_txt.mid(5, 100), curr_nriga, hd_spedizione); //(note spedizione) + // HT + if (curr_tiporiga == "HT") + elab_hd_ht(riga_txt.mid(5, 100), curr_nriga, ht_fatturazione); //(note fatturazione) + + // HO + if (curr_tiporiga == "HO") + elab_ro(riga_txt, curr_ini, curr_nriga, log, ho_note_generali); + + // RA //gestione delle righe ordine if (curr_tiporiga == "RA") - { - } + elab_ra(riga_txt, curr_ini, curr_nriga, log); + } //for(bool ok=recset.move.frst... - //per prima cosa controlla se è possibile risalire al cliente che ha generato l'ordine.. - //..no cliente...no party! - if (codcf <= 0) - { - TString msg; - msg.format("Il cliente %s ha codice nullo!", (const char*)ragsoc); - log.log(1, msg); - continue; - } + //scrive sul campo NOTE della testata quello che sa delle note spedizione e fatturazione + TString note; + note << '"'; - //per ogni ordine in formato .txt genera un file.ini che andrà poi documentizzato - TFilename ini_fname = tmp; - ini_fname.add(format("ORD%05ld.ini", i)); - TConfig curr_ini(ini_fname); + if (hd_spedizione.full()) + note << "Note Spedizione: " << hd_spedizione << "\\n"; + if (ht_fatturazione.full()) + note << "Note Fatturazione: " << ht_fatturazione << "\\n"; + if (ho_note_generali.full()) + note << "Note generali: " << ho_note_generali; - curr_ini.set_paragraph("Transaction"); //setto il paragrafo [Transaction] del file ini - - curr_ini.set("Action","INSERT"); - curr_ini.set("Mode",""); + note << '"'; + curr_ini.set(DOC_NOTE, note, head_paragrafo); - curr_ini.set_paragraph("33"); //setto il paragrafo [33] del file ini (testata) + //qui ci va il lancio di ve0 con l'ini generato - //eliminazione del file sorgente - if (delete_src_files) - { - const bool src_file_removed = remove_file(curr_fname); - if (!src_file_removed) - { - TString msg; - msg.format("Impossibile eliminare il file origine %s ", curr_fname.name()); - log.log(1, msg); - continue; - } - } + //qui ci va lo spostamento del file elaborato se ve0 ha funzionato correttamente } //for(int i... message_box(TR("Acquisizione ordini completata")); @@ -246,7 +420,9 @@ bool TTrasferimento_ordini::create() //se non ha la VE non può proseguire if (!has_module(VEAUT)) return error_box(TR("Modulo non autorizzato")); - + Tdninst dninst; + if (!dninst.can_I_run(true)) + return error_box(TR("Programma non autorizzato!")); return TSkeleton_application::create(); } diff --git a/ps/ps0398100a.h b/ps/ps0398100a.h index 46a6e1859..efacfba93 100755 --- a/ps/ps0398100a.h +++ b/ps/ps0398100a.h @@ -1,2 +1,2 @@ #define F_PATH_SRC 101 -#define F_ERASE_TRANSFERRED 102 \ No newline at end of file +#define F_PATH_DST 102 diff --git a/ps/ps0398100a.uml b/ps/ps0398100a.uml index a8f391ecd..a5e2ba600 100755 --- a/ps/ps0398100a.uml +++ b/ps/ps0398100a.uml @@ -2,20 +2,25 @@ PAGE "Trasferimento Ordini Web->Campo" -1 -1 78 5 -STRING F_PATH_SRC 255 45 +STRING F_PATH_SRC 255 50 BEGIN - PROMPT 1 1 "Cartella di origine " + PROMPT 1 1 "Cartella origine " DSELECT FLAGS "M" CHECKTYPE REQUIRED WARNING "Selezionare una cartella valida!" END -BOOLEAN F_ERASE_TRANSFERRED +STRING F_PATH_DST 255 50 BEGIN - PROMPT 1 3 "Eliminare i file di origine dopo la copia" + PROMPT 1 2 "Cartella destinazione " + DSELECT + FLAGS "M" + CHECKTYPE REQUIRED + WARNING "Selezionare una cartella valida!" END + STRING DLG_PROFILE 50 BEGIN PROMPT 1 -1 "Profilo " diff --git a/ps/ps1001300a.uml b/ps/ps1001300a.uml index 25aa5bfd5..570a146ba 100755 --- a/ps/ps1001300a.uml +++ b/ps/ps1001300a.uml @@ -253,7 +253,7 @@ BEGIN DISPLAY "Descrizione@50" DESCRIZ OUTPUT S_CDC CODCOSTO OUTPUT S_CDC_DESCR DESCRIZ - CHECKTYPE REQUIRED + CHECKTYPE NORMAL FLAGS "D" GROUP 1 END