From 5ddf52804486892aa63f002669e6a69e18fe1010 Mon Sep 17 00:00:00 2001 From: luca Date: Tue, 26 Oct 2010 15:46:30 +0000 Subject: [PATCH] Patch level :10.0 830 Files correlati : Ricompilazione Demo : [ ] Commento : riporto hardy da 11.0 git-svn-id: svn://10.65.10.50/branches/R_10_00@21075 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ha/ha0200a.h | 62 ++++---- ha/ha0200a.uml | 63 ++++++++ ha/ha1300.cpp | 424 ++++++++++++++++++++++++++++++++++++++++++++++++- ha/ha1300a.h | 3 +- ha/ha1300a.uml | 5 + ha/halib.cpp | 137 ---------------- ha/halib.h | 12 -- ha/hamenu.men | 11 +- 8 files changed, 528 insertions(+), 189 deletions(-) diff --git a/ha/ha0200a.h b/ha/ha0200a.h index 12ff9205b..2c262ca28 100755 --- a/ha/ha0200a.h +++ b/ha/ha0200a.h @@ -1,38 +1,44 @@ -#define F_CODTIPO_FAT 201 -#define F_DESCRTIPO_FAT 202 -#define F_STATO_INI_FAT 203 -#define F_STATO_FIN_FAT 204 +#define F_CODTIPO_FAT 201 +#define F_DESCRTIPO_FAT 202 +#define F_STATO_INI_FAT 203 +#define F_STATO_FIN_FAT 204 //------------------------------ -#define F_CO_ANT_NUM 205 //COntratti ANTicipo: NUMerazione -#define F_CO_ANT_TIP 207 //COntratti ANTicipo: TIPo -#define F_CO_ANT_SPE 208 //COntratti ANTicipo: codice SPEsa (è il codart della riga di tipo spesa, verigh02) +#define F_CO_ANT_NUM 205 //COntratti ANTicipo: NUMerazione +#define F_CO_ANT_TIP 207 //COntratti ANTicipo: TIPo +#define F_CO_ANT_SPE 208 //COntratti ANTicipo: codice SPEsa (è il codart della riga di tipo spesa, verigh02) -#define F_NA_ANT_NUM 210 //Note Accredito ANTicipo: NUMerazione -#define F_NA_ANT_TIP 212 //Note Accredito ANTicipo: TIPo -#define F_NA_ANT_SPE 213 //Note Accredito ANTicipo: codice SPEsa (è il codart delle righe delle note di accredito) +#define F_NA_ANT_NUM 210 //Note Accredito ANTicipo: NUMerazione +#define F_NA_ANT_TIP 212 //Note Accredito ANTicipo: TIPo +#define F_NA_ANT_SPE 213 //Note Accredito ANTicipo: codice SPEsa (è il codart delle righe delle note di accredito) //------------------------------ -#define F_CO_POST_NUM 215 -#define F_CO_POST_TIP 217 -//#define F_CO_POST_SPE 218 in teoria questo non potrebbe esistere! +#define F_CO_POST_NUM 215 +#define F_CO_POST_TIP 217 +//#define F_CO_POST_SPE 218 in teoria questo non potrebbe esistere! -#define F_NA_POST_NUM 220 -#define F_NA_POST_TIP 222 -#define F_NA_POST_SPE 223 +#define F_NA_POST_NUM 220 +#define F_NA_POST_TIP 222 +#define F_NA_POST_SPE 223 //------------------------------ -#define F_CO_RIFA_NUM 225 -#define F_CO_RIFA_TIP 227 -#define F_CO_RIFA_SPE 228 +#define F_CO_RIFA_NUM 225 +#define F_CO_RIFA_TIP 227 +#define F_CO_RIFA_SPE 228 -#define F_NA_RIFA_NUM 230 -#define F_NA_RIFA_TIP 232 -#define F_NA_RIFA_SPE 233 +#define F_NA_RIFA_NUM 230 +#define F_NA_RIFA_TIP 232 +#define F_NA_RIFA_SPE 233 //============================== //pagina 2 -#define F_OUTPUT_PATH 250 -#define F_CARDOC_NUM 251 -#define F_CARDOC_TIP 252 -#define F_CARDOC_STA 253 -#define F_BARCODE_TIP 254 +//esportazione dati +#define F_OUTPUT_PATH 250 +#define F_CARDOC_NUM 251 +#define F_CARDOC_TIP 252 +#define F_CARDOC_STA 253 +#define F_BARCODE_TIP 254 -#define F_INPUT_PATH 255 +//importazione dati +#define F_INPUT_PATH 260 +#define F_IN_TIPODOC_F 261 +#define F_IN_TIPODOC_B 262 +#define F_IN_TIPODOC_O 263 +#define F_IN_TIPODOC_V 264 diff --git a/ha/ha0200a.uml b/ha/ha0200a.uml index 1c0756c12..ec681b299 100755 --- a/ha/ha0200a.uml +++ b/ha/ha0200a.uml @@ -406,6 +406,69 @@ BEGIN FIELD InputPath END +TEXT DLG_NULL +BEGIN + PROMPT 2 10 "@bTipi documento generati in importazione" +END + +STRING F_IN_TIPODOC_F 4 +BEGIN + PROMPT 2 11 "Fatture " + USE %TIP + INPUT CODTAB F_IN_TIPODOC_F + DISPLAY "Codice@8" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_IN_TIPODOC_F CODTAB + CHECKTYPE REQUIRED + FIELD InpFatTip +END + +STRING F_IN_TIPODOC_B 4 +BEGIN + PROMPT 18 11 "Bolle " + USE %TIP + INPUT CODTAB F_IN_TIPODOC_B + DISPLAY "Codice@8" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_IN_TIPODOC_B CODTAB + CHECKTYPE REQUIRED + FIELD InpBolTip +END + +STRING F_IN_TIPODOC_O 4 +BEGIN + PROMPT 34 11 "Ordini " + USE %TIP + INPUT CODTAB F_IN_TIPODOC_O + DISPLAY "Codice@8" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_IN_TIPODOC_O CODTAB + CHECKTYPE REQUIRED + FIELD InpOrdTip +END + +STRING F_IN_TIPODOC_V 4 +BEGIN + PROMPT 50 11 "Bolle valorizz. " + USE %TIP + INPUT CODTAB F_IN_TIPODOC_V + DISPLAY "Codice@8" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_IN_TIPODOC_V CODTAB + CHECKTYPE REQUIRED + FIELD InpValTip +END + +TEXT DLG_NULL +BEGIN + PROMPT 2 13 "Le numerazioni sono generate automaticamente in base al tipo documento ricevuto" +END + +TEXT DLG_NULL +BEGIN + PROMPT 2 14 "ed al codice terminale, secondo la regola: 'TipoDocumento'+'CodiceTerminale. Es. 'F'+'001' -> F001" +END + ENDPAGE ENDMASK \ No newline at end of file diff --git a/ha/ha1300.cpp b/ha/ha1300.cpp index ef6d80e51..10fd6b06a 100755 --- a/ha/ha1300.cpp +++ b/ha/ha1300.cpp @@ -9,6 +9,215 @@ #define UPLOAD_FILE "upload.d" + +//funzione di ordinamento del file di upload una volta caricato in memoria +int ordina_upload(const TObject** o1, const TObject** o2) +{ + const TString& s1 = *(TString*)*o1; + const TString& s2 = *(TString*)*o2; + + if (s1[1] == 'F' && s2[1] == 'F') + { + TToken_string k[2]; + for (int i = 0; i < 2; i++) + { + const TString& rec = i == 0 ? s1 : s2; + TToken_string& key = k[i]; + if (rec[0] == 'T') + { + key.add(rec.mid(14,2)); //anno + key.add(rec.mid(16,1)); //tipodoc + key.add(rec.mid(5,5)); //numdoc + } + else + { + key.add(rec.mid(14,2)); //anno + key.add(rec.mid(28,1)); //tipodoc + key.add(rec.mid(5,5)); //numdoc + key.add(rec.mid(29,5)); //codart + } + } + return k[0].compare(k[1]); + } + else + { + if (s1[1] == 'F') + return +1; + if (s2[1] == 'F') + return -1; + } + + return s1.compare(s2); +} + + +//------------------------------------------------------------ +// Hardy_upload_recordset: serve per l'INPUT +//------------------------------------------------------------ +class THardy_upload_recordset : public THardy_recordset +{ +protected: + virtual TRecnotype new_rec(const char* trc); + +public: + THardy_upload_recordset(const TFilename& filename); +}; + +///////////////////////////////////////////////////////////// +// Recordset specifici per i dati da trasferire INPUT +///////////////////////////////////////////////////////////// + +TRecnotype THardy_upload_recordset::new_rec(const char* trc) +{ + if (trc && *trc > ' ') + { + TString rec; rec << trc << "\r\n"; + return TText_recordset::new_rec(rec); + } + return -1; +} + +//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) +{ + TFilename cazzone; + //as400 con lunghezza 256 e chiave lunga 2 (a partire dall'inizio): è il tipo record + parse_query("AS400(256,2)", cazzone); + + //Tipo record SU + //-------------- + add_trc_field("SU", "TipoRecord", T_X, 1, 2); //x + add_trc_field("SU", "CodiceTerminale", T_N, 3, 3); //x + add_trc_field("SU", AGE_CODAGE, T_N, 6, 3); //x + add_trc_field("SU", "NonUsato", T_X, 9, 6); + add_trc_field("SU", "Targa", T_X, 15, 8); + add_trc_field("SU", "nDDT", T_N, 23, 5); + add_trc_field("SU", "nFATT", T_N, 28, 5); + add_trc_field("SU", "nBOLLA", T_N, 33, 5); + add_trc_field("SU", AGE_RAGSOC, T_X, 38, 30); //x + + //Tipo record TF + //-------------- + add_trc_field("TF", "TipoRecord", T_X, 1, 2); //x + add_trc_field("TF", "CodiceTerminale", T_N, 3, 3); //x + add_trc_field("TF", DOC_NDOC, T_N, 6, 5); //x + add_trc_field("TF", DOC_DATADOC, T_X, 11, 6); //x + add_trc_field("TF", DOC_TIPODOC, T_X, 17, 1); //x + add_trc_field("TF", DOC_CODCF, T_X, 18, 6); //x + add_trc_field("TF", DOC_CODCFFATT, T_X, 24, 6); //x + add_trc_field("TF", "ImponibileLordo", T_Nv2N, 30, 8); // campi seguenti da righe doc + add_trc_field("TF", "ScontoFattura", T_2Nv2N,38, 4); + add_trc_field("TF", "ImponibileDoc", T_Nv2N, 42, 8); + add_trc_field("TF", "TotaleDoc", T_Nv2N, 50, 8); + add_trc_field("TF", "ScontoTotale", T_Nv2N, 58, 8); + add_trc_field("TF", "ImponibileOmaggi", T_Nv2N, 66, 8); + add_trc_field("TF", "ImponibileSost", T_Nv2N, 74, 8); + add_trc_field("TF", "Incasso", T_Nv2N, 82, 8); //forse IMPPAGATO ? + add_trc_field("TF", DOC_CODPAG, T_X, 90, 2); //x + add_trc_field("TF", DOC_DATAPART, T_X, 92, 6); //x + add_trc_field("TF", "Iva1", T_N, 98, 2); //anche questi da righe doc + add_trc_field("TF", "Imponibile1", T_Nv2N, 100,8); + add_trc_field("TF", "Imposta1", T_Nv2N, 108,7); + add_trc_field("TF", "Iva2", T_N, 115,2); + add_trc_field("TF", "Imponibile2", T_Nv2N, 117,8); + add_trc_field("TF", "Imposta2", T_Nv2N, 125,7); + add_trc_field("TF", "Iva3", T_N, 132,2); + add_trc_field("TF", "Imponibile3", T_Nv2N, 134,8); + add_trc_field("TF", "Imposta3", T_Nv2N, 142,7); + add_trc_field("TF", "Iva4", T_N, 149,2); + add_trc_field("TF", "Imponibile4", T_Nv2N, 151,8); + add_trc_field("TF", "Imposta4", T_Nv2N, 159,7); + add_trc_field("TF", "CodcliGiro3", T_X, 166,6); + add_trc_field("TF", "IvaOmag1", T_N, 172,2); + add_trc_field("TF", "ImponibileOmag1", T_Nv2N, 174,6); + add_trc_field("TF", "ImpostaOmag1", T_Nv2N, 180,5); + add_trc_field("TF", "IvaOmag2", T_N, 185,2); + add_trc_field("TF", "ImponibileOmag2", T_Nv2N, 187,6); + add_trc_field("TF", "ImpostaOmag2", T_Nv2N, 193,5); + add_trc_field("TF", "DataEmissione", T_X, 198,6); + add_trc_field("TF", "PagamentoCarta", T_X, 204,1); + + //Tipo record RF + //-------------- + 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", 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 + add_trc_field("RF", DOC_TIPODOC, T_X, 29, 1); //x testata + add_trc_field("RF", RDOC_CODART, T_X, 30, 5); //x + add_trc_field("RF", "TipoCessione", T_X, 35, 1); + add_trc_field("RF", "Qta[int]", T_N, 36, 5); //x + add_trc_field("RF", "Qta[dec]", T_N, 41, 2); //x + add_trc_field("RF", "Sconto1", T_2Nv2N,43, 4); + add_trc_field("RF", "Sconto2", T_2Nv2N,47, 4); + add_trc_field("RF", "Sconto3", T_2Nv2N,51, 4); + add_trc_field("RF", "ScontoLibero", T_2Nv2N,55, 4); + add_trc_field("RF", RDOC_PREZZO, T_Nv3N, 59, 7); //x forse PREZZOL ? + add_trc_field("RF", "TotaleRiga", T_Nv3N, 66, 8); + add_trc_field("RF", "TotaleSconto", T_Nv3N, 74, 8); + add_trc_field("RF", "AliquotaIva", T_N, 82, 2); //noi abbiamo il codice + add_trc_field("RF", RDOC_UMQTA, T_X, 84, 2); //x + add_trc_field("RF", "PrezzoScontato", T_Nv3N, 86, 7); + add_trc_field("RF", "Fascia", T_X, 93, 1); + add_trc_field("RF", "ScontoFascia", T_2N, 94, 2); + add_trc_field("RF", "NonUsato", T_N, 96, 2); + 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 + + + TText_recordset::load_file(filename); +} + + /////////////////////////////////////////////////////////// // TAutomask /////////////////////////////////////////////////////////// @@ -39,11 +248,13 @@ TUpload2Campo_mask::TUpload2Campo_mask() : TAutomask ("ha1300a") class TUpload2Campo : public TSkeleton_application { TFilename _intput_dir; + bool _can_write; 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_TF(THardy_upload_recordset& recset, TLog_report& log); void elabora(const TMask& mask); @@ -84,6 +295,192 @@ void TUpload2Campo::elabora_VC(THardy_upload_recordset& recset, TLog_report& log } +void TUpload2Campo::elabora_TF(THardy_upload_recordset& recset, TLog_report& log) +{ + //1) codice terminale + const TString4 codice_terminale = recset.get("CodiceTerminale").as_string(); + const TString& codage = cache().get(LF_AGENTI, codice_terminale, AGE_CODAGE); + if (codage != codice_terminale) + { + _can_write = false; + TString msg; + msg << "Codice terminale " << codice_terminale << "- codice agente" << codage << " non corrispondenti"; + log.log(2, msg); + } + + + //2) Testata documento + //genera una simpatico documento di cui raccatta la chiave + const TString& rec_anno = recset.get(DOC_DATADOC).as_string().right(2); + int anno = 2000 + atoi(rec_anno); + const char rec_tipodoc = recset.get(DOC_TIPODOC).as_string()[0]; + //2a) tipo documento + TString4 tipodoc; + TConfig hardy(CONFIG_DITTA, "ha"); + switch (rec_tipodoc) + { + case 'F': tipodoc = hardy.get("InpFatTip"); break; + case 'B': tipodoc = hardy.get("InpBolTip"); break; + case 'V': tipodoc = hardy.get("InpValTip"); break; + case 'O': tipodoc = hardy.get("InpOrdTip"); break; + default: + { + _can_write = false; + TString msg; + msg << "Tipo documento in input " << rec_tipodoc << " sconosciuto"; + log.log(2, msg); + } + break; + } + //2b) numerazione documento + //il codnum dipende dal tipo documento del terminale (F,B,O...) e dal codice del terminale + TString4 codnum; + codnum << rec_tipodoc << codice_terminale; + const TString& numerazione = cache().get("%NUM", codnum, "CODTAB"); + if (numerazione != codnum) + { + _can_write = false; + TString msg; + msg << "Codice numerazione " << codnum << " sconosciuto"; + log.log(2, msg); + } + + const long ndoc = recset.get(DOC_NDOC).as_int(); + + TDocumento doc('D', anno, codnum, ndoc); + + doc.put(DOC_TIPODOC, tipodoc); + doc.put(DOC_TIPOCF, "C"); + + //2c) cliente + const long codcf = recset.get(DOC_CODCF).as_int(); + TToken_string key_clifo; + key_clifo.add("C"); + key_clifo.add(codcf); + const long cliente = atol(cache().get(LF_CLIFO, key_clifo, CLI_CODCF)); + if (cliente != codcf) + { + _can_write = false; + TString msg; + msg << "Codice cliente " << codcf << " sconosciuto"; + log.log(2, msg); + } + doc.put(DOC_CODCF, codcf); + doc.put(DOC_CODCFFATT, recset.get(DOC_CODCFFATT).as_int()); + //sconto in fattura, sconto totale, incasso ecc.... che cazzo sono? + //TString8 scontone = recset.get(); + doc.put(DOC_CODPAG, recset.get(DOC_CODPAG).as_string()); + //data spedizione...datapart o datacons? (solo per ordini) + + //al simpatico documento appiccia tutte le righe RF che seguono il record TF.. + //..dopo il magico ordinamento iniziale del recordset + //intanto azzera le righe eventualmente già presenti (riscrittura) + doc.destroy_rows(); + + + //3) righe documento + //scansione delle righe documento su record RF + while (recset.move_next()) + { + if (recset.get("TipoRecord").as_string() != "RF") //quando non trova un RF significa che le righe della testata sono finite! + { + recset.move_prev(); //allora torna indietro di un record per riposizionarsi sull'ultimo non letto + break; + } + + //agginunge una nuova riga (solo merce, per quanto ne sappiamo) + TRiga_documento& rigadoc = doc.new_row("01"); + + //serie delle put sulla riga documento; ricordiamo che la chiave della riga viene riempita dalla new_row + //3a) articolo + const TString& codart = recset.get(RDOC_CODART).as_string(); + const TString& articolo = cache().get(LF_ANAMAG, codart, ANAMAG_CODART); + if (articolo != codart) + { + _can_write = false; + TString msg; + msg << "Codice articolo " << codart << " sconosciuto"; + log.log(2, msg); + } + + rigadoc.put(RDOC_CODART, codart); + rigadoc.put(RDOC_CODARTMAG, codart); + rigadoc.put(RDOC_CHECKED, "X"); + //3b) umart + const TString& umqta = recset.get(RDOC_UMQTA).as_string(); + TToken_string key_um; + key_um.add(codart); + key_um.add(umqta); + const TString& umart = cache().get(LF_UMART, key_um, UMART_UM); + if (umart != umqta) + { + _can_write = false; + TString msg; + msg << "U.m. " << umqta << " dell'articolo " << codart << " sconosciuta"; + log.log(2, msg); + } + rigadoc.put(RDOC_UMQTA, umqta); + + + real qta = recset.get("Qta[int]").as_real(); + qta += recset.get("Qta[dec]").as_real() / CENTO; + rigadoc.put(RDOC_QTA, qta); + + //panegirico sugli sconti + TString str_sconto; + real sconto[4]; + sconto[0] = recset.get("Sconto1").as_real(); + sconto[1] = recset.get("Sconto2").as_real() / CENTO; + sconto[2] = recset.get("Sconto3").as_real() / CENTO; + sconto[3] = recset.get("ScontoLibero").as_real() / CENTO; + for (int s = 0; s < 4; s++) + { + if (!sconto[s].is_zero()) + str_sconto << (sconto[s] / CENTO) << '+'; + } + str_sconto.rtrim(1); + + rigadoc.put(RDOC_SCONTO, str_sconto); + + + real prezzo_lordo = recset.get(RDOC_PREZZO).as_real(); + prezzo_lordo /= 1000; + rigadoc.put(RDOC_PREZZO, ""); + rigadoc.put(RDOC_PREZZOL, prezzo_lordo); + + //3x) iva + const int aliquota_iva = recset.get("AliquotaIva").as_int(); + //rigadoc.put(RDOC_CODIVA, codiva); + + rigadoc.put(RDOC_LIVELLO, recset.get("CodiceLotto").as_string()); + } + + //incredibilmente arriva in fondo + TString msg; + msg << anno << "-" << codnum << "-" << ndoc << " Terminale: " << codice_terminale << " Cliente: " << codcf; + //se può scrivere... + if (_can_write) + { + int err = doc.write(); + + if (err == NOERR) + { + msg.insert("Registrato documento: ", 0); + log.log(0, msg); + } + else + { + msg.insert("Impossibile registrare documento: ", 0); + log.log(2, msg); + } + } + else //..sennò avverte e basta + { + msg.insert("Controllato documento: ", 0); + log.log(0, msg); + } +} + void TUpload2Campo::elabora(const TMask& mask) { TToken_string tipi_record("SU|TF|RF|SI|BR|VC"); @@ -94,11 +491,23 @@ void TUpload2Campo::elabora(const TMask& mask) THardy_upload_recordset recset(src_file); const long items = recset.items(); + //ordinamento del file in memoria; sotto ogni TF (testata) mette le sue righe (RF)...MAGIA!!! + recset.sort(ordina_upload); + +#ifdef DBG + recset.save_as("c:/temp/hardy/cazzone.txt"); +#endif //creazione progind e log TProgind pi(items, TR("Acquisizione dati in corso..."), true, true); TLog_report log("Segnalazioni su acquisizione"); - + log.kill_duplicates(); + //parametro di controllo; solo se resta true fino alla fine il documento viene writato + //solo in caso di elaborazione definitiva può diventare true + _can_write = false; + if (mask.get_bool(F_DEFINITIVO)) + _can_write = true; + //giro su tutti i record del terribile recordset per l'acquisizione dei dati for (bool ok = recset.move_first(); ok; ok = recset.move_next()) { @@ -106,7 +515,8 @@ void TUpload2Campo::elabora(const TMask& mask) break; //acquisizione tipo record da riga corrente del file di input - const TString& tipo_record = recset.get(0u).as_string(); + TString4 tipo_record = recset.rec_type(); + tipo_record.trim(); const int pos = tipi_record.get_pos(tipo_record); @@ -117,9 +527,9 @@ void TUpload2Campo::elabora(const TMask& mask) elabora_SU(recset, log); break; case 1: //tipo record: TF (Testata Fattura) - //elabora_TF(recset, log); + elabora_TF(recset, log); break; - case 2: //tipo record: RF (Riga Fattura) + case 2: //tipo record: RF (Riga Fattura) //non serve! lo fa l'elaborazione di testata //elabora_RF(recset, log); break; case 3: //tipo record: SI (incasso documenti) @@ -134,8 +544,8 @@ void TUpload2Campo::elabora(const TMask& mask) default: //se il tipo record non esiste nella lista dei tipi record si incazza e lo scrive! { TString msg; - msg << "Tipo record non riconosciuto " << tipo_record; - log.log_error(msg); + msg << "Tipo record non riconosciuto '" << tipo_record << "' alla riga " << (recset.current_row() + 1); + log.log(2, msg); } break; } //switch(pos).. @@ -143,6 +553,8 @@ void TUpload2Campo::elabora(const TMask& mask) } //for (bool ok... + + log.preview(); } diff --git a/ha/ha1300a.h b/ha/ha1300a.h index 625d883bf..6a2628dd7 100755 --- a/ha/ha1300a.h +++ b/ha/ha1300a.h @@ -1 +1,2 @@ -#define F_PATH 201 \ No newline at end of file +#define F_PATH 201 +#define F_DEFINITIVO 202 \ No newline at end of file diff --git a/ha/ha1300a.uml b/ha/ha1300a.uml index 22c4becb2..2289e566d 100755 --- a/ha/ha1300a.uml +++ b/ha/ha1300a.uml @@ -8,6 +8,11 @@ BEGIN FLAGS "D" END +BOOLEAN F_DEFINITIVO +BEGIN + PROMPT 1 3 "Elaborazione definitiva (scrittura sul database)" +END + ENDPAGE TOOLBAR "topbar" 0 0 0 2 diff --git a/ha/halib.cpp b/ha/halib.cpp index 3037f090b..579ac1ca3 100755 --- a/ha/halib.cpp +++ b/ha/halib.cpp @@ -94,144 +94,7 @@ 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) -{ - //Tipo record SU - //-------------- - add_trc_field("SU", "TipoRecord", T_X, 1, 2); //x - add_trc_field("SU", "CodiceTerminale", T_N, 3, 3); //x - add_trc_field("SU", AGE_CODAGE, T_N, 6, 3); //x - add_trc_field("SU", "NonUsato", T_X, 9, 6); - add_trc_field("SU", "Targa", T_X, 15, 8); - add_trc_field("SU", "nDDT", T_N, 23, 5); - add_trc_field("SU", "nFATT", T_N, 28, 5); - add_trc_field("SU", "nBOLLA", T_N, 33, 5); - add_trc_field("SU", AGE_RAGSOC, T_X, 38, 30); //x - //Tipo record TF - //-------------- - add_trc_field("TF", "TipoRecord", T_X, 1, 2); //x - add_trc_field("TF", "CodiceTerminale", T_N, 3, 3); //x - add_trc_field("TF", DOC_NDOC, T_N, 6, 5); //x - add_trc_field("TF", DOC_DATADOC, T_X, 11, 6); //x - add_trc_field("TF", DOC_TIPODOC, T_X, 17, 1); //x - add_trc_field("TF", DOC_CODCF, T_X, 18, 6); //x - add_trc_field("TF", DOC_CODCFFATT, T_X, 24, 6); //x - add_trc_field("TF", "ImponibileLordo", T_Nv2N, 30, 8); // campi seguenti da righe doc - add_trc_field("TF", "ScontoFattura", T_2Nv2N,38, 4); - add_trc_field("TF", "ImponibileDoc", T_Nv2N, 42, 8); - add_trc_field("TF", "TotaleDoc", T_Nv2N, 50, 8); - add_trc_field("TF", "ScontoTotale", T_Nv2N, 58, 8); - add_trc_field("TF", "ImponibileOmaggi", T_Nv2N, 66, 8); - add_trc_field("TF", "ImponibileSost", T_Nv2N, 74, 8); - add_trc_field("TF", "Incasso", T_Nv2N, 82, 8); //forse IMPPAGATO ? - add_trc_field("TF", DOC_CODPAG, T_X, 90, 2); //x - add_trc_field("TF", DOC_DATAPART, T_X, 92, 6); //x - add_trc_field("TF", "Iva1", T_N, 98, 2); //anche questi da righe doc - add_trc_field("TF", "Imponibile1", T_Nv2N, 100,8); - add_trc_field("TF", "Imposta1", T_Nv2N, 108,7); - add_trc_field("TF", "Iva2", T_N, 115,2); - add_trc_field("TF", "Imponibile2", T_Nv2N, 117,8); - add_trc_field("TF", "Imposta2", T_Nv2N, 125,7); - add_trc_field("TF", "Iva3", T_N, 132,2); - add_trc_field("TF", "Imponibile3", T_Nv2N, 134,8); - add_trc_field("TF", "Imposta3", T_Nv2N, 142,7); - add_trc_field("TF", "Iva4", T_N, 149,2); - add_trc_field("TF", "Imponibile4", T_Nv2N, 151,8); - add_trc_field("TF", "Imposta4", T_Nv2N, 159,7); - add_trc_field("TF", "CodcliGiro3", T_X, 166,6); - add_trc_field("TF", "IvaOmag1", T_N, 172,2); - add_trc_field("TF", "ImponibileOmag1", T_Nv2N, 174,6); - add_trc_field("TF", "ImpostaOmag1", T_Nv2N, 180,5); - add_trc_field("TF", "IvaOmag2", T_N, 185,2); - add_trc_field("TF", "ImponibileOmag2", T_Nv2N, 187,6); - add_trc_field("TF", "ImpostaOmag2", T_Nv2N, 193,5); - add_trc_field("TF", "DataEmissione", T_X, 198,6); - add_trc_field("TF", "PagamentoCarta", T_X, 204,1); - - //Tipo record RF - //-------------- - 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", 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 - add_trc_field("RF", DOC_TIPODOC, T_X, 29, 1); //x testata - add_trc_field("RF", RDOC_CODART, T_X, 30, 5); //x - add_trc_field("RF", "TipoCessione", T_X, 35, 1); - add_trc_field("RF", "Qta[int]", T_N, 36, 5); //x - add_trc_field("RF", "Qta[dec]", T_N, 41, 2); //x - add_trc_field("RF", "Sconto1", T_2Nv2N,43, 4); - add_trc_field("RF", "Sconto2", T_2Nv2N,47, 4); - add_trc_field("RF", "Sconto3", T_2Nv2N,51, 4); - add_trc_field("RF", "ScontoLibero", T_2Nv2N,55, 4); - add_trc_field("RF", RDOC_PREZZO, T_Nv3N, 59, 7); //x forse PREZZOL ? - add_trc_field("RF", "TotaleRiga", T_Nv3N, 66, 8); - add_trc_field("RF", "TotaleSconto", T_Nv3N, 74, 8); - add_trc_field("RF", "AliquotaIva", T_N, 82, 2); //noi abbiamo il codice - add_trc_field("RF", RDOC_UMQTA, T_X, 84, 2); //x - add_trc_field("RF", "PrezzoScontato", T_Nv3N, 86, 7); - add_trc_field("RF", "Fascia", T_X, 93, 1); - add_trc_field("RF", "ScontoFascia", T_2N, 94, 2); - add_trc_field("RF", "NonUsato", T_N, 96, 2); - 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); -} //------------------------------------------------------------------------------------ //Clienti diff --git a/ha/halib.h b/ha/halib.h index 5a1e4150f..1b3f69c99 100755 --- a/ha/halib.h +++ b/ha/halib.h @@ -210,18 +210,6 @@ public: }; -//------------------------------------------------------------ -// Hardy_upload_recordset: serve per l'INPUT -//------------------------------------------------------------ -class THardy_upload_recordset : public THardy_recordset -{ -public: - THardy_upload_recordset(const TFilename& filename); -}; - - - - //---------------------------------------------------------- diff --git a/ha/hamenu.men b/ha/hamenu.men index 0a7fbc5ec..096782216 100755 --- a/ha/hamenu.men +++ b/ha/hamenu.men @@ -7,11 +7,12 @@ Item_01 = "Gestione contratti premio", "ha0 -2", "" Item_02 = "Contabilizzazione contratti premio", "ve6 -1", "F" Item_03 = "Generazione NAC", "ha0 -4", "" Item_04 = "Elaborazione contratti premio pareggiati", "ha0 -3", "F" -Item_05 = "Gestione listini", "ve2 -4", "" -Item_06 = "Stampa listini", "ve3 -4 L", "" -Item_07 = "Esportazione archivi formato txt", "ha1 -1", "F" -Item_08 = "Importazione dati da file", "ha1 -2", "F" -Item_09 = "Servizi", [HAMENU_002] +Item_05 = "Listini", "ve2 -4 L", "" +Item_06 = "Listini cliente", "ve2 -4 C", "" +Item_07 = "Stampa listini", "ve3 -4 L", "" +Item_08 = "Esportazione archivi formato txt", "ha1 -1", "F" +Item_09 = "Importazione dati da file", "ha1 -2", "F" +Item_10 = "Servizi", [HAMENU_002] [HAMENU_002] Caption = "Servizi"