From 0289403dce890ecc8fd6348a597f5628c76d9b65 Mon Sep 17 00:00:00 2001 From: luca Date: Thu, 27 Jan 2011 15:16:23 +0000 Subject: [PATCH] Patch level :10.0 910 Files correlati : Ricompilazione Demo : [ ] Commento : HardY - tamente! git-svn-id: svn://10.65.10.50/branches/R_10_00@21530 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ha/ha0.cpp | 5 +- ha/ha0.h | 1 + ha/ha0100.cpp | 74 +++++++++++++++++++++++ ha/ha1300.cpp | 161 +++++++++++++++++++++++++++++++++++++++++++++++-- ha/hamenu.men | 1 + ha/hatbcau.h | 5 ++ ha/hatbcau.uml | 74 +++++++++++++++++++++++ 7 files changed, 314 insertions(+), 7 deletions(-) create mode 100755 ha/ha0100.cpp create mode 100755 ha/hatbcau.h create mode 100755 ha/hatbcau.uml diff --git a/ha/ha0.cpp b/ha/ha0.cpp index f87e08c2b..7c5fc5707 100755 --- a/ha/ha0.cpp +++ b/ha/ha0.cpp @@ -3,7 +3,7 @@ #include "ha0.h" -#define usage "Error - usage : %s -{1|2|3|4}" +#define usage "Error - usage : %s -{0|1|2|3|4}" int main(int argc,char** argv) @@ -13,6 +13,9 @@ int main(int argc,char** argv) switch (r) { + case 0: + rt = ha0100(argc, argv) ; break; //gestore tabelle modulo HA + break; case 1: rt = ha0200(argc, argv) ; break; //configurazione modulo break; diff --git a/ha/ha0.h b/ha/ha0.h index 8b3a1ad9d..3ceb2fe2e 100755 --- a/ha/ha0.h +++ b/ha/ha0.h @@ -1,3 +1,4 @@ +int ha0100(int argc, char* argv[]); int ha0200(int argc, char* argv[]); int ha0300(int argc, char* argv[]); int ha0400(int argc, char* argv[]); diff --git a/ha/ha0100.cpp b/ha/ha0100.cpp new file mode 100755 index 000000000..806b2f1b2 --- /dev/null +++ b/ha/ha0100.cpp @@ -0,0 +1,74 @@ +// gestione tabelle di modulo hardy + +#include +#include +#include + +#include "hatbcau.h" + +/////////////////////////////////////////////////////////// +// Maschera generica di gestione tabelle hardy +/////////////////////////////////////////////////////////// + +class THA_table_mask : public TAutomask +{ +protected: + virtual bool on_field_event(TOperable_field &o, TField_event e, long jolly); + +public: + THA_table_mask(const char* name) : TAutomask(name) {} +}; + +bool THA_table_mask::on_field_event(TOperable_field &o, TField_event e, long jolly) +{ + return true; +} + +/////////////////////////////////////////////////////////// +// Applicazione generica di gestione tabelle hardy +/////////////////////////////////////////////////////////// + +// applicazione per la gestione delle tabelle di lavanderia +class THA_table_app : public TTable_module_application +{ +protected: // TRelation_application + virtual TMask* user_create_mask(); + virtual int write(const TMask& m); + virtual int rewrite(const TMask& m); + +public: +}; + +// Ridefinire questo metodo per le eventuali maschere speciali +// che abbiano controlli speciali da effettuare nella on_field_event +TMask* THA_table_app::user_create_mask() +{ + const TString4 name = get_relation()->file(0).name(); + if (name == "???") + return new THA_table_mask("???"); + // Le maschere normali sono gia' gestite dalla TTable_module_application + return TTable_module_application::user_create_mask(); +} + + +// Ridefinizione del metodo write +int THA_table_app::write(const TMask& m) +{ + const TString4 name = get_relation()->file(0).name(); + return TTable_module_application::write(m); +} + +// Ridefinizione del metodo rewrite +int THA_table_app::rewrite(const TMask& m) +{ + const TString4 name = get_relation()->file(0).name(); + return TTable_module_application::rewrite(m); +} + + +int ha0100(int argc, char* argv[]) +{ + THA_table_app a; + a.run(argc, argv, TR("Tabella Caffe' Hardy")); + return 0; +} diff --git a/ha/ha1300.cpp b/ha/ha1300.cpp index 1927f54d5..1d732908c 100755 --- a/ha/ha1300.cpp +++ b/ha/ha1300.cpp @@ -216,6 +216,14 @@ THardy_upload_recordset::THardy_upload_recordset(const TFilename& filename) add_trc_field("VC", CLI_COFI, T_X, 128, 16); //x + //Tipo record RC + //-------------- + add_trc_field("RC", "TipoRecord", T_X, 1, 2); //x + add_trc_field("RC", "CodiceTerminale", T_N, 3, 3); //x + add_trc_field("RC", "CodiceArticolo", T_X, 6, 5); //x + add_trc_field("RC", "Quantita", T_Nv2N, 11, 7); //x + add_trc_field("RC", "DataCarico", T_X, 18, 6); //x + TText_recordset::load_file(filename); } @@ -256,6 +264,8 @@ protected: //metodi di basso livello const TString& check_agente(TString& codice_terminale, TLog_report& log); const TString& check_articolo(TString& codart, TLog_report& log); + void check_magazzino(const TString& codmag_age, TLog_report& log); + void check_causale(TString& codcaus, TLog_report& log); //metodi di alto livello void elabora_SU(THardy_upload_recordset& recset, TLog_report& log); @@ -263,6 +273,7 @@ protected: void elabora_VC(THardy_upload_recordset& recset, TLog_report& log); void elabora_TF(THardy_upload_recordset& recset, TLog_report& log); void elabora_SI(THardy_upload_recordset& recset, TLog_report& log); + void elabora_RC(THardy_upload_recordset& recset, TLog_report& log); void elabora(const TMask& mask); @@ -308,6 +319,19 @@ const TString& TUpload2Campo::check_articolo(TString& codart, TLog_report& log) return rec_anamag.get(ANAMAG_DESCR); } + +void TUpload2Campo::check_magazzino(const TString& codmag_age, TLog_report& log) +{ + const TString& codmag_campo = cache().get("MAG", codmag_age, "CODTAB"); + if (codmag_campo != codmag_age) + { + _can_write = false; + TString msg; + msg << "Codice magazzino " << codmag_age << " sconosciuto su Campo"; + log.log(2, msg); + } +} + void TUpload2Campo::elabora_SU(THardy_upload_recordset& recset, TLog_report& log) { const TString& cod_term = recset.get("CodiceTerminale").as_string(); @@ -340,6 +364,7 @@ void TUpload2Campo::elabora_BR(THardy_upload_recordset& recset, TLog_report& log TString4 codice_terminale = recset.get("CodiceTerminale").as_string(); const TString& codice_agente = check_agente(codice_terminale, log); const TString8 cod_magazzino = cache().get(LF_AGENTI, codice_agente, AGE_CODMAG); + check_magazzino(cod_magazzino, log); const long curr_movmag = recset.get("NumeroDoc").as_int(); const TString& str_data_mov = recset.get("DataMov").as_string(); @@ -360,7 +385,18 @@ void TUpload2Campo::elabora_BR(THardy_upload_recordset& recset, TLog_report& log movmag.put(MOVMAG_EXNUMDOC, curr_movmag); movmag.put(MOVMAG_EXDATADOC, data_mov); movmag.put(MOVMAG_DESCR, descr); - //movmag.put(MOVMAG_CODCAUS, codcaus); + + //la causale va trascodificata con l'apposita tabella &CAU + const TString& caus_term = recset.get("CausaleMov").as_string(); + const TString& codcaus = cache().get("&CAU", caus_term, "S7"); + if (codcaus.empty()) + { + _can_write = false; + TString msg; + msg << "Causale movimento " << caus_term << " non codificata"; + log.log(2, msg); + } + movmag.put(MOVMAG_CODCAUS, codcaus); bool go_on = true; // righe movimento di magazzino @@ -395,7 +431,7 @@ void TUpload2Campo::elabora_BR(THardy_upload_recordset& recset, TLog_report& log recset.move_prev(); //allora torna indietro di un record per riposizionarsi sull'ultimo non letto go_on = false; } - } + } //while(go_on)... //incredibilmente arriva in fondo @@ -435,6 +471,7 @@ void TUpload2Campo::elabora_TF(THardy_upload_recordset& recset, TLog_report& log TString4 codice_terminale = recset.get("CodiceTerminale").as_string(); const TString& codice_agente = check_agente(codice_terminale, log); const TString8 codmag = cache().get(LF_AGENTI, codice_agente, AGE_CODMAG); + check_magazzino(codmag, log); //2) Testata documento //genera una simpatico documento di cui raccatta la chiave @@ -544,7 +581,7 @@ void TUpload2Campo::elabora_TF(THardy_upload_recordset& recset, TLog_report& log rigadoc.put(RDOC_CHECKED, "X"); rigadoc.put(RDOC_DESCR, descr); - //3b) umart + //3b) umart e qta const TString& umqta = recset.get(RDOC_UMQTA).as_string(); TLocalisamfile file_umart(LF_UMART); file_umart.setkey(2); @@ -560,7 +597,6 @@ void TUpload2Campo::elabora_TF(THardy_upload_recordset& recset, TLog_report& log } 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); @@ -581,7 +617,7 @@ void TUpload2Campo::elabora_TF(THardy_upload_recordset& recset, TLog_report& log rigadoc.put(RDOC_SCONTO, str_sconto); - + //prezzi real prezzo_lordo = recset.get(RDOC_PREZZO).as_real(); prezzo_lordo /= 1000; rigadoc.put(RDOC_PREZZO, prezzo_lordo); @@ -639,9 +675,119 @@ void TUpload2Campo::elabora_TF(THardy_upload_recordset& recset, TLog_report& log log.log(0, ""); } + +void TUpload2Campo::elabora_RC(THardy_upload_recordset& recset, TLog_report& log) +{ + //1) codice terminale (lungo 3) e codice agente (lungo 5) + TString4 codice_terminale = recset.get("CodiceTerminale").as_string(); + const TString& codice_agente = check_agente(codice_terminale, log); + const TRectype& rec_agente = cache().get(LF_AGENTI, codice_agente); + const TString8 codmag = rec_agente.get(AGE_CODMAG); + const long codcf = rec_agente.get_long(AGE_CODFORN); //cliente (legato all'agente) + + //2) Testata documento + const TString& str_datadoc = recset.get("DataCarico").as_string(); + const TDate datadoc = upload_format_date6(str_datadoc); + const int anno = datadoc.year(); + + //2a) numerazione e tipo documento + TConfig hardy(CONFIG_DITTA, "ha"); + const TString4 codnum = hardy.get("CarDocNum"); + const TString4 tipodoc = hardy.get("CarDoctip"); + const TString4 stato = hardy.get("CarDocSta"); + + //2b) documento vero e proprio (stessi campi del caso tipo record = TF) + TDocumento doc; + + doc.put(DOC_CODNUM, codnum); + doc.put(DOC_ANNO, anno); + doc.put(DOC_PROVV, "D"); + doc.put(DOC_TIPODOC, tipodoc); + doc.put(DOC_STATO, stato); + doc.put(DOC_DATADOC, datadoc); + doc.put(DOC_TIPOCF, "C"); + doc.put(DOC_CODCF, codcf); + + TTipo_documento td(tipodoc); + const TString& caus_movmag = td.caus_mov(); + doc.put(DOC_CAUSMAG, caus_movmag); + + TCli_for clifor('C', codcf); + clifor.cli2doc(doc); + + doc.destroy_rows(); + + // righe documento di carico + bool go_on = true; + //scansione delle righe documento su record RC + while (go_on) + { + //3) crea le righe (legge tutti i record di tipo RC successivi) + 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 + TString8 codart = recset.get("CodiceArticolo").as_string(); + const TString& descr = check_articolo(codart, log); + + rigadoc.put(RDOC_CODART, codart); + rigadoc.put(RDOC_CODARTMAG, codart); + rigadoc.put(RDOC_CHECKED, "X"); + rigadoc.put(RDOC_DESCR, descr); + + TToken_string key_umart; + key_umart.add(codart); + key_umart.add(1); + const TString& um = cache().get(LF_UMART, key_umart, UMART_UM); + rigadoc.put(RDOC_UMQTA, um); + + const real qta = recset.get("Quantita").as_real() / CENTO; + rigadoc.put(RDOC_QTA, qta); + + rigadoc.put(RDOC_CODMAG, codmag); + + //quando non trova un RC significa che le righe sono finite! + go_on = recset.move_next(); + + if (go_on && (recset.get("TipoRecord").as_string() != "RC")) + { + recset.move_prev(); //allora torna indietro di un record per riposizionarsi sull'ultimo non letto + go_on = false; + } + } + + //incredibilmente arriva in fondo + TString msg; + msg << anno << "-" << codnum << " Terminale: " << codice_terminale << " Cliente: " << codcf; + //se può scrivere... + if (_can_write) + { + int err = doc.write(); + + if (err == NOERR) + { + msg.insert("Registrato documento di carico: ", 0); + log.log(0, msg); + } + else + { + msg.insert("Impossibile registrare documento di carico: ", 0); + log.log(2, msg); + } + } + else //..sennò avverte e basta + { + msg.insert("Controllato documento di carico: ", 0); + log.log(0, msg); + } + + log.log(0, ""); +} + + void TUpload2Campo::elabora(const TMask& mask) { - TToken_string tipi_record("SU|TF|RF|SI|BR|VC"); + TToken_string tipi_record("SU|TF|RF|SI|BR|VC|RC"); //creazione del filename del file da importare TFilename src_file = mask.get(F_PATH); @@ -701,6 +847,9 @@ void TUpload2Campo::elabora(const TMask& mask) case 5: //tipo record: VC (Variazioni Cliente) //elabora_VC(recset, log); //non serve! gli agenti non possono immettere clienti da terminale! break; + case 6: //tipo record: RC (Richiesta Carico) + elabora_RC(recset, log); + break; default: //se il tipo record non esiste nella lista dei tipi record si incazza e lo scrive! { TString msg; diff --git a/ha/hamenu.men b/ha/hamenu.men index 7fa582907..a976d2c57 100755 --- a/ha/hamenu.men +++ b/ha/hamenu.men @@ -34,6 +34,7 @@ Module = 46 Flags = "F" Item_01 = "Esportazione archivi formato txt", "ha1 -1", "F" Item_02 = "Importazione dati da file", "ha1 -2", "F" +Item_03 = "Tabella codifica causali", "ha0 -0 &CAU", "" [HAMENU_005] Caption = "Servizi" diff --git a/ha/hatbcau.h b/ha/hatbcau.h new file mode 100755 index 000000000..f2d9313e2 --- /dev/null +++ b/ha/hatbcau.h @@ -0,0 +1,5 @@ +//campi tabella &CAU del modulo HA +#define F_CODICE_TERMINALE 201 +#define F_DESCR_TERMINALE 202 +#define F_CODICE_CAMPO 203 +#define F_DESCR_CAMPO 204 diff --git a/ha/hatbcau.uml b/ha/hatbcau.uml new file mode 100755 index 000000000..af887e7c3 --- /dev/null +++ b/ha/hatbcau.uml @@ -0,0 +1,74 @@ +#include "hatbcau.h" + +PAGE "Causali Terminalini - Campo" -1 -1 78 10 + +GROUPBOX DLG_NULL 76 4 +BEGIN + PROMPT 1 1 "@bTerminalini" +END + +NUMBER F_CODICE_TERMINALE 2 +BEGIN + PROMPT 2 2 "Codice " + FLAGS "U" + USE &CAU + INPUT CODTAB F_CODICE_TERMINALE + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODICE_TERMINALE CODTAB + OUTPUT F_DESCR_TERMINALE S0 + CHECKTYPE REQUIRED + FIELD CODTAB + KEY 1 +END + +STRING F_DESCR_TERMINALE 50 +BEGIN + PROMPT 2 3 "Descrizione " + USE &CAU KEY 2 + INPUT S0 F_DESCR_TERMINALE + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT F_CODICE_TERMINALE + FIELD S0 + KEY 2 + CHECKTYPE NORMAL +END + +GROUPBOX DLG_NULL 76 4 +BEGIN + PROMPT 1 5 "@bCampo" +END + +STRING F_CODICE_CAMPO 4 +BEGIN + PROMPT 2 6 "Codice " + FLAGS "U" + USE %CAU + INPUT CODTAB F_CODICE_CAMPO + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODICE_CAMPO CODTAB + OUTPUT F_DESCR_CAMPO S0 + CHECKTYPE REQUIRED + FIELD S7 +END + +STRING F_DESCR_CAMPO 50 +BEGIN + PROMPT 2 7 "Descrizione " + USE %CAU KEY 2 + INPUT S0 F_DESCR_CAMPO + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT F_CODICE_CAMPO + CHECKTYPE NORMAL +END + +ENDPAGE + +TOOLBAR "" 0 0 0 2 +#include "relapbar.h" +ENDPAGE + +ENDMASK \ No newline at end of file