diff --git a/ha/ha1100.cpp b/ha/ha1100.cpp index 0a2f85592..3783d87a6 100755 --- a/ha/ha1100.cpp +++ b/ha/ha1100.cpp @@ -5,6 +5,9 @@ #include #include +#include +#include +#include #include "../mg/umart.h" #include "halib.h" @@ -52,11 +55,15 @@ protected: //metodi di medio livello void crea_nome_txt(const TString& prefisso, TFilename& output_path); + void get_part_key(TConfig& ini, TToken_string& key) const; + bool find_part_key(TConfig& ini, const TString_array& ini_paragraphs, + const int logicnum, const TToken_string& key) const; //metodi di alto livello void genera_cliente_txt(TConfig& ini); void genera_riga_listino_txt(TConfig& ini); void genera_prodotto_txt(TConfig& ini); + void genera_sospeso_txt(TConfig& ini, TString_array& ini_paragraphs); virtual void main_loop(); @@ -336,11 +343,133 @@ void TIni2Txt::genera_prodotto_txt(TConfig& ini) } +void TIni2Txt::get_part_key(TConfig& ini, TToken_string& key) const +{ + //tracciato: tipocf-sottoconto(=codcf)-anno-numpart-nriga + key.cut(0); + key.add(ini.get(PART_TIPOCF)); + key.add(ini.get(PART_SOTTOCONTO)); + key.add(ini.get_int(PART_ANNO)); + key.add(ini.get(PART_NUMPART)); + key.add(ini.get_int(PART_NRIGA)); +} + + +bool TIni2Txt::find_part_key(TConfig& ini, const TString_array& ini_paragraphs, + const int logicnum, const TToken_string& key) const +{ + TString4 start; + start << logicnum << ','; + + //cerca i pagamenti della partita + FOR_EACH_ARRAY_ROW(ini_paragraphs, t, row) + { + if (row->starts_with(start)) + { + TToken_string key_row; + ini.set_paragraph(*row); + get_part_key(ini, key_row); + if (key_row == key) + return true; + } //if (part_row->starts_with("30... + } //FOR_EACH_ARRAY_ROW(ini_paragraphs, t... + return false; +} + +void TIni2Txt::genera_sospeso_txt(TConfig& ini, TString_array& ini_paragraphs) +{ + TEsporta_sospesiVAR_recordset sospeso; + sospeso.new_rec(""); + + const TString4 segno = ricava_segno(ini); + + //delirio di campi da part (28) pagsca (29) scad(30) + //-------------------------------------------------- + //ricava il numreg dal mov + const long numreg = ini.get_long(MOV_NUMREG, "23"); + TAssoc_array clienti; + + //costruisce la lista dei clienti presenti nel .ini + FOR_EACH_ARRAY_ROW(ini_paragraphs, r, riga) + { + if (riga->starts_with("28,")) + { + const long part_numreg = ini.get_long(PART_NREG, *riga); //va specificata il paragrafo alla prima get + const char tipocf = ini.get_char(PART_TIPOCF); + if (numreg == part_numreg && tipocf == 'C') + clienti.add(ini.get(PART_SOTTOCONTO)); + } + } + + FOR_EACH_ARRAY_ROW(ini_paragraphs, s, part_row) + { + if (part_row->starts_with("28,")) + { + const int tipomov = ini.get_int(PART_TIPOMOV, *part_row); + const char tipocf = ini.get_char(PART_TIPOCF); + const TString8 codcf = ini.get(PART_SOTTOCONTO); + const bool part_chiusa = ini.get_bool(PART_CHIUSA); + //cerca le partite, derivanti da fatture, dei soli clienti che ha nella lista clienti + if (!part_chiusa && tipomov == 1 && tipocf == 'C' && clienti.is_key(codcf)) + { + TToken_string key; + get_part_key(ini, key); + + const long numfatt = ini.get_long(PART_NUMDOC); + const TDate datadoc = ini.get(PART_DATADOC); + const TString8 numpart = key.get(3); + + //cerca i pagamenti della rata + if (find_part_key(ini, ini_paragraphs, LF_SCADENZE, key)) + { + real imp_rata = ini.get(SCAD_IMPORTO); + const TDate data_rata = ini.get(SCAD_DATASCAD); + real imp_pag; + if (find_part_key(ini, ini_paragraphs, LF_PAGSCA, key)) + { + const char acc_sal = ini.get(PAGSCA_ACCSAL)[0]; + imp_pag = acc_sal == 'S' ? imp_rata : real(ini.get(PAGSCA_IMPORTO)); + } + //se il pagamento non chiude la rata -> il saldo resta in sospeso e il record va aggiunto + if (imp_pag < imp_rata) + { + real residuo = imp_rata - imp_pag; + + //riempie il record da esportare + sospeso.set("CodiceTerminale", 0L); + sospeso.set("Segno", segno); + sospeso.set("CodiceCliente", codcf); + sospeso.set("NumeroFattura", numfatt); + sospeso.set("DataFattura", format_data_6(datadoc)); + residuo *= CENTO; + residuo.round(); + sospeso.set("ImportoResiduo", residuo); + imp_rata.round(); + sospeso.set("ImpOriginalDoc", imp_rata); + sospeso.set("DataScadenza", format_data_6(data_rata)); + sospeso.set("TipoDocumento", "F"); + } + } //if (find_part_key(ini, ini_paragraphs, LF_SCADENZE... + } //if (tipomov == 1 && tipocf... + } //if (part_row->starts_with("28,... + } //FOR_EACH_ARRAY_ROW(ini_paragraphs, s... + + //prepara il nome corretto del file .txt da generare + //-------------------------------------------------- + const TString prefisso = "sospesivar"; + TFilename output_path; + crea_nome_txt(prefisso, output_path); + + sospeso.save_as(output_path, fmt_text); + +} + + void TIni2Txt::main_loop() { //stabilisce una volta per tutte ad inizio programma quale cavolo è la directory dove sbattere i .txt generati TConfig hardy(CONFIG_DITTA, "ha"); - _output_dir = hardy.get("OuputPath"); + _output_dir = hardy.get("OutputPath"); //dalla riga di comando raccatta il path completo del file .ini da tradurre TFilename path = argv(2); @@ -358,6 +487,8 @@ void TIni2Txt::main_loop() genera_cliente_txt(input_ini_file); //sospesi + if (ini_paragraphs.find("28,1,1") >= 0) + genera_sospeso_txt(input_ini_file, ini_paragraphs); //listino if (ini_paragraphs.find("52") >= 0) diff --git a/ha/ha1200.cpp b/ha/ha1200.cpp index 5b2409db5..5a43a34d4 100755 --- a/ha/ha1200.cpp +++ b/ha/ha1200.cpp @@ -3,7 +3,8 @@ #include #include - +#include +#include "../cg/cgsaldac.h" #include "../ve/condv.h" #include "halib.h" @@ -211,6 +212,57 @@ void TFile2Txt::genera_clienti_txt() void TFile2Txt::genera_sospesi_txt() { + TEsporta_sospesi_recordset sospesi; + + TString query; + query << "USE PART"; + query << "\nSELECT (CHIUSA!=\"X\")&&(TIPOMOV=1)"; + query << "\nFROM TIPOC=C"; + query << "\nTO TIPOC=C"; + + TISAM_recordset archivio_part(query); + const long archivio_part_items = archivio_part.items(); + + TProgind progind(archivio_part_items, "Sospesi...", false, true); + for (bool ok = archivio_part.move_first(); ok; ok = archivio_part.move_next()) + { + progind.addstatus(1); + + sospesi.new_rec(""); + + sospesi.set("CodiceTerminale", 0L); + + //per riempire i campi è necessario un po' di casino sulla partita in esame + const TRectype& rec_part = archivio_part.cursor()->curr(); + TPartita partita(rec_part); + //cerca il saldo, il totale del doc originale, il residuo + TImporto saldo, doc, pag, imp; + partita.calcola_saldo(saldo, doc, pag, imp); + TImporto residuo = doc; + residuo -= saldo; + + const int nriga = rec_part.get_int(PART_NRIGA); + const TRiga_scadenze& scad = partita.rata(nriga, 1); + const TDate datascad = scad.get_date(SCAD_DATASCAD); + + //e vai che riempiamo i campi + const TString& codcf = rec_part.get(PART_SOTTOCONTO); + sospesi.set("CodiceCliente", codcf); + const TString& ndoc = rec_part.get(PART_NUMDOC); + sospesi.set("NumeroFattura", ndoc); + const TDate datadoc = rec_part.get_date(PART_DATADOC); + sospesi.set("DataFattura", format_data_6(datadoc)); + sospesi.set("ImportoResiduo", residuo.valore()); + sospesi.set("ImpOriginalDoc", doc.valore()); + sospesi.set("DataScadenza", format_data_6(datascad)); + TString16 cod_partita; + cod_partita << rec_part.get_int(PART_ANNO) << "-" << rec_part.get(PART_NUMPART); + sospesi.set("Partita", cod_partita); + sospesi.set("TipoDoc", "F"); + } + + TFilename output_path = genera_path("sospesi"); + sospesi.save_as(output_path, fmt_text); } //listini: i commenti del metodo sono nella genera_listino_txt() della ha1100 @@ -291,9 +343,9 @@ void TFile2Txt::genera_contratti_txt() righe_contratti.set(RCONDV_SCONTO, find_sconto(str_sconto)); TDate dataini = archivio_rcondv.get("CONDV.VALIN").as_date(); - righe_contratti.set(CONDV_VALIN, dataini.string(full, '\0')); + righe_contratti.set(CONDV_VALIN, format_data_8(dataini)); TDate datafine = archivio_rcondv.get("CONDV.VALFIN").as_date(); - righe_contratti.set(CONDV_VALFIN, datafine.string(full, '\0')); + righe_contratti.set(CONDV_VALFIN, format_data_8(datafine)); } TFilename output_path = genera_path("particolari"); diff --git a/ha/ha1300.cpp b/ha/ha1300.cpp index 3af313a21..ef6d80e51 100755 --- a/ha/ha1300.cpp +++ b/ha/ha1300.cpp @@ -42,6 +42,8 @@ class TUpload2Campo : public TSkeleton_application protected: void elabora_SU(THardy_upload_recordset& recset, TLog_report& log); + void elabora_BR(THardy_upload_recordset& recset, TLog_report& log); + void elabora_VC(THardy_upload_recordset& recset, TLog_report& log); void elabora(const TMask& mask); @@ -53,6 +55,32 @@ public: void TUpload2Campo::elabora_SU(THardy_upload_recordset& recset, TLog_report& log) { + const TString& cod_term = recset.get("CodiceTerminale").as_string(); + const TString& cod_age = recset.get(AGE_CODAGE).as_string(); + const TString& descr_age = recset.get(AGE_RAGSOC).as_string(); + TString msg; + msg << "Scartati dati agente " << cod_term << " " << descr_age; + log.log(0, msg); +} + +void TUpload2Campo::elabora_BR(THardy_upload_recordset& recset, TLog_report& log) +{ + const TString& cod_term = recset.get("CodiceTerminale").as_string(); + const long ndoc = recset.get("NumeroDoc").as_int(); + TString msg; + msg << "Scartato movimento magazzino. Terminale: " << cod_term << " N.Doc: " << ndoc; + log.log(0, msg); +} + + +void TUpload2Campo::elabora_VC(THardy_upload_recordset& recset, TLog_report& log) +{ + const TString& cod_term = recset.get("CodiceTerminale").as_string(); + const TString& codcf = recset.get(CLI_CODCF).as_string(); + const TString& ragsoc = recset.get(CLI_RAGSOC).as_string(); + TString msg; + msg << "Scartato nuovo cliente. Terminale: " << cod_term << " CodCli: " << codcf << " Ragsoc: " << ragsoc; + log.log(0, msg); } @@ -89,14 +117,19 @@ void TUpload2Campo::elabora(const TMask& mask) elabora_SU(recset, log); break; case 1: //tipo record: TF (Testata Fattura) + //elabora_TF(recset, log); break; case 2: //tipo record: RF (Riga Fattura) + //elabora_RF(recset, log); break; case 3: //tipo record: SI (incasso documenti) + //elabora_SI(recset, log); break; case 4: //tipo record: BR (movimenti magazzino) + elabora_BR(recset, log); break; case 5: //tipo record: VC (Variazioni Cliente) + //elabora_VC(recset, log); break; default: //se il tipo record non esiste nella lista dei tipi record si incazza e lo scrive! { @@ -105,7 +138,7 @@ void TUpload2Campo::elabora(const TMask& mask) log.log_error(msg); } break; - } + } //switch(pos).. diff --git a/ha/halib.cpp b/ha/halib.cpp index 87146d315..3037f090b 100755 --- a/ha/halib.cpp +++ b/ha/halib.cpp @@ -94,6 +94,9 @@ THardy_recordset::THardy_recordset(const int rec_lenght) : TAS400_recordset("AS4 } +///////////////////////////////////////////////////////////// +// Recordset specifici per i dati da trasferire INPUT +///////////////////////////////////////////////////////////// //questo invece è il metodo magico che vale per il caricamento da file esterno THardy_upload_recordset::THardy_upload_recordset(const TFilename& filename) : THardy_recordset(256) @@ -155,7 +158,7 @@ THardy_upload_recordset::THardy_upload_recordset(const TFilename& filename) //-------------- add_trc_field("RF", "TipoRecord", T_X, 1, 2); //x add_trc_field("RF", "CodiceTerminale", T_N, 3, 3); //x - add_trc_field("RF", RDOC_NDOC, T_N, 6, 5); //x + add_trc_field("RF", RDOC_NDOC, T_N, 6, 5); //x add_trc_field("RF", DOC_DATADOC, T_X, 11, 6); //x testata add_trc_field("RF", DOC_CODCF, T_X, 17, 6); //x testata add_trc_field("RF", DOC_CODCFFATT, T_X, 23, 6); //x testata @@ -180,6 +183,52 @@ THardy_upload_recordset::THardy_upload_recordset(const TFilename& filename) add_trc_field("RF", "CodcliGiro3", T_X, 98, 6); add_trc_field("RF", "CodiceLotto", T_X, 104,10); //noi lo leghiamo all'articolo + //Tipo record SI + //-------------- + add_trc_field("SI", "TipoRecord", T_X, 1, 2); //x + add_trc_field("SI", "CodiceTerminale", T_N, 3, 3); //x + add_trc_field("SI", "CodiceCliente", T_X, 6, 6); + add_trc_field("SI", "NumeroFattura", T_X, 12, 12); + add_trc_field("SI", "DataFattura", T_X, 24, 6); + add_trc_field("SI", "NonUsato", T_N, 30, 9); + add_trc_field("SI", "ImportoIncassato", T_Nv2N, 39, 9); + add_trc_field("SI", "DataIncasso", T_X, 48, 6); + add_trc_field("SI", "Partita", T_X, 54, 15); + add_trc_field("SI", "TipoDocumento", T_X, 69, 1); + add_trc_field("SI", "DataEmissione", T_X, 70, 6); + add_trc_field("SI", "PagamentoCarta", T_X, 76, 1); + + //Tipo record BR + //-------------- + add_trc_field("BR", "TipoRecord", T_X, 1, 2); //x + add_trc_field("BR", "CodiceTerminale", T_N, 3, 3); //x + add_trc_field("BR", "NumeroRiga", T_N, 6, 3); + add_trc_field("BR", "NumeroDoc", T_N, 9, 5); + add_trc_field("BR", "DataMov", T_X, 14, 6); + add_trc_field("BR", "CodiceArticolo", T_X, 20, 5); + add_trc_field("BR", "Qta[int]", T_N, 25, 5); + add_trc_field("BR", "Qta[dec]", T_N, 30, 2); + add_trc_field("BR", "Mittente", T_N, 32, 3); + add_trc_field("BR", "Destinatario", T_N, 35, 3); + add_trc_field("BR", "CausaleMov", T_N, 38, 2); + add_trc_field("BR", "CodiceLotto", T_X, 40, 10); + + //Tipo record VC + //-------------- + add_trc_field("VC", "TipoRecord", T_X, 1, 2); //x + add_trc_field("VC", "CodiceTerminale", T_N, 3, 3); //x + add_trc_field("VC", CLI_CODCF, T_X, 6, 6); //x + add_trc_field("VC", CLI_RAGSOC, T_X, 12, 34); //x + add_trc_field("VC", CLI_INDCF, T_X, 46, 34); //x + add_trc_field("VC", "Localita", T_X, 80, 20); //x attenzione che potrebbe essere il com_dencom + add_trc_field("VC", CLI_CAPCF, T_X, 100, 5); //x + add_trc_field("VC", "Provincia", T_X, 105, 2); //x da questo e da dencom ricaviamo il codcom + add_trc_field("VC", CLI_PAIV, T_X, 107, 16); //x + add_trc_field("VC", CLI_CODPAG, T_X, 123, 1); //x + add_trc_field("VC", "CodiceListino", T_X, 124, 3); + add_trc_field("VC", "TipoDocumento", T_X, 127, 1); + add_trc_field("VC", CLI_COFI, T_X, 128, 16); //x + load_file(filename); } @@ -249,6 +298,30 @@ TEsporta_clientiVAR_recordset::TEsporta_clientiVAR_recordset() insert_field("Segno", T_X, 4, 1); //x } + +//Sospesi +//------- +TEsporta_sospesi_recordset::TEsporta_sospesi_recordset(int rec_length) +: THardy_recordset(rec_length) +{ + add_field("CodiceTerminale", T_N, 1, 3); //x + add_field("CodiceCliente", T_X, 4, 6); //x + add_field("NumeroFattura", T_X, 10, 12); //x + add_field("DataFattura", T_X, 22, 6); //x + add_field("ImportoResiduo", T_Nv2N, 28, 9); //x + add_field("ImpOriginalDoc", T_N, 37, 9); //x + add_field("DataScadenza", T_X, 46, 6); //x + add_field("Partita", T_X, 52, 15); //x + add_field("TipoDocumento", T_X, 67, 1); //x +} +//..e variazioni sospesi +TEsporta_sospesiVAR_recordset::TEsporta_sospesiVAR_recordset() +: TEsporta_sospesi_recordset(68) +{ + insert_field("Segno", T_X, 4, 1); //x +} + + //Righe Listini //------------- TEsporta_listini_recordset::TEsporta_listini_recordset(int rec_length) @@ -408,12 +481,6 @@ TEsporta_pagamenti_recordset::TEsporta_pagamenti_recordset(int rec_length) -///////////////////////////////////////////////////////////// -// Recordset specifici per i dati da trasferire INPUT -///////////////////////////////////////////////////////////// - - - ///////////////////////////////////////////////////////////// // Metodi di utility ///////////////////////////////////////////////////////////// @@ -441,13 +508,23 @@ const TString& find_codag(const long codcf) return codag.right(3); //il loro codagente è lungo 3!!! } +//il dio dei programmatori ci perdoni! const TString& format_data_8(const TDate& data) { const int day = data.day(); const int month = data.month(); const int year = data.year(); TString& str_data = get_tmp_string(); - str_data << day << month << year; + str_data.format("%02d%02d%04d", day, month, year); return str_data; } +const TString& format_data_6(const TDate& data) +{ + const int day = data.day(); + const int month = data.month(); + const int year = data.year(); + TString& str_data = get_tmp_string(); + str_data.format("%02d%02d%02d", day, month, year%100); + return str_data; +} diff --git a/ha/halib.h b/ha/halib.h index 3bf4e033b..5a1e4150f 100755 --- a/ha/halib.h +++ b/ha/halib.h @@ -99,6 +99,21 @@ public: TEsporta_clientiVAR_recordset(); }; + +//Sospesi () +//----------------------- +class TEsporta_sospesi_recordset : public THardy_recordset +{ +public: + TEsporta_sospesi_recordset(int rec_length = 67); +}; +//..e variazioni sospesi! +class TEsporta_sospesiVAR_recordset : public TEsporta_sospesi_recordset +{ +public: + TEsporta_sospesiVAR_recordset(); +}; + //Listini (condv + rcondv) //------------------------ class TEsporta_listini_recordset : public THardy_recordset @@ -153,8 +168,8 @@ public: }; -//Rmovmag (Carico) -//---------------- +//Carico (rdoc di carico) +//----------------------- class TEsporta_carico_recordset : public THardy_recordset { public: @@ -215,3 +230,4 @@ public: real find_sconto(const TString& str_sconto); const TString& find_codag(const long codcf); const TString& format_data_8(const TDate& data); +const TString& format_data_6(const TDate& data); \ No newline at end of file