Patch level :10.0
Files correlati : Ricompilazione Demo : [ ] Commento : prima implementazione upload BR git-svn-id: svn://10.65.10.50/branches/R_10_00@21519 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
		
							parent
							
								
									129eb8cf76
								
							
						
					
					
						commit
						c7b85a1033
					
				| @ -252,6 +252,7 @@ void TFile2Txt::genera_clienti_txt(const long da_codcli) | |||||||
|     key_cfven.add(codcf); |     key_cfven.add(codcf); | ||||||
|     const TRectype& rec_cfven = cache().get(LF_CFVEN, key_cfven); |     const TRectype& rec_cfven = cache().get(LF_CFVEN, key_cfven); | ||||||
|     const TString& listino_cliente = rec_cfven.get(CFV_CODLIST); |     const TString& listino_cliente = rec_cfven.get(CFV_CODLIST); | ||||||
|  |     clienti.set("CodiceListino", listino_cliente); | ||||||
| 
 | 
 | ||||||
|     const TString& str_sconto = archivio_clienti.get(CFV_SCONTO).as_string(); |     const TString& str_sconto = archivio_clienti.get(CFV_SCONTO).as_string(); | ||||||
|     clienti.set("ScontoFineFattura", hd_find_sconto(str_sconto)); |     clienti.set("ScontoFineFattura", hd_find_sconto(str_sconto)); | ||||||
|  | |||||||
							
								
								
									
										199
									
								
								ha/ha1300.cpp
									
									
									
									
									
								
							
							
						
						
									
										199
									
								
								ha/ha1300.cpp
									
									
									
									
									
								
							| @ -3,8 +3,10 @@ | |||||||
| #include <progind.h> | #include <progind.h> | ||||||
| #include <reputils.h> | #include <reputils.h> | ||||||
| 
 | 
 | ||||||
| #include "halib.h" | #include "../mg/movmag.h" | ||||||
|  | #include "../mg/rmovmag.h" | ||||||
| 
 | 
 | ||||||
|  | #include "halib.h" | ||||||
| #include "ha1300a.h" | #include "ha1300a.h" | ||||||
| 
 | 
 | ||||||
| #define UPLOAD_FILE "upload.d" | #define UPLOAD_FILE "upload.d" | ||||||
| @ -251,6 +253,11 @@ class TUpload2Campo : public TSkeleton_application | |||||||
|   bool _can_write; |   bool _can_write; | ||||||
| 
 | 
 | ||||||
| protected: | protected: | ||||||
|  |   //metodi di basso livello
 | ||||||
|  |   const TString& check_agente(TString& codice_terminale, TLog_report& log); | ||||||
|  |   const TString& check_articolo(TString& codart, TLog_report& log); | ||||||
|  | 
 | ||||||
|  |     //metodi di alto livello
 | ||||||
|   void elabora_SU(THardy_upload_recordset& recset, TLog_report& log); |   void elabora_SU(THardy_upload_recordset& recset, TLog_report& log); | ||||||
|   void elabora_BR(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_VC(THardy_upload_recordset& recset, TLog_report& log); | ||||||
| @ -264,6 +271,42 @@ public: | |||||||
|   virtual bool create(); |   virtual bool create(); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | //metodo che controlla se il terminale corrisponde ad un agente registrato e restituisce l'agente
 | ||||||
|  | const TString& TUpload2Campo::check_agente(TString& codice_terminale, TLog_report& log) | ||||||
|  | { | ||||||
|  |   codice_terminale.right_just(3, '0'); | ||||||
|  |   TString8 codice_agente = codice_terminale; | ||||||
|  |   codice_agente.right_just(5, '0'); | ||||||
|  | 
 | ||||||
|  |   const TRectype& rec_age = cache().get(LF_AGENTI, codice_agente); | ||||||
|  |   const TString& codage_campo = rec_age.get(AGE_CODAGE); | ||||||
|  | 
 | ||||||
|  |   if (codage_campo != codice_agente) | ||||||
|  |   { | ||||||
|  |     _can_write = false; | ||||||
|  |     TString msg; | ||||||
|  |     msg << "Codice agente " << codice_agente << " da terminale: sconosciuto"; | ||||||
|  |     log.log(2, msg); | ||||||
|  |   } | ||||||
|  |   return codage_campo; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | //metodo che controlla che l'articolo esista su Campo
 | ||||||
|  | const TString& TUpload2Campo::check_articolo(TString& codart, TLog_report& log) | ||||||
|  | { | ||||||
|  |   codart.trim(); | ||||||
|  |   const TRectype& rec_anamag = cache().get(LF_ANAMAG, codart); | ||||||
|  |   const TString& articolo_campo = rec_anamag.get(ANAMAG_CODART); | ||||||
|  |   if (articolo_campo != codart) | ||||||
|  |   { | ||||||
|  |     _can_write = false; | ||||||
|  |     TString msg; | ||||||
|  |     msg << "Codice articolo " << codart << " sconosciuto su Campo"; | ||||||
|  |     log.log(2, msg); | ||||||
|  |   } | ||||||
|  |   return rec_anamag.get(ANAMAG_DESCR); | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| void TUpload2Campo::elabora_SU(THardy_upload_recordset& recset, TLog_report& log) | void TUpload2Campo::elabora_SU(THardy_upload_recordset& recset, TLog_report& log) | ||||||
| { | { | ||||||
| @ -275,16 +318,6 @@ void TUpload2Campo::elabora_SU(THardy_upload_recordset& recset, TLog_report& log | |||||||
|   log.log(0, msg); |   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) | void TUpload2Campo::elabora_VC(THardy_upload_recordset& recset, TLog_report& log) | ||||||
| { | { | ||||||
|   const TString& cod_term = recset.get("CodiceTerminale").as_string(); |   const TString& cod_term = recset.get("CodiceTerminale").as_string(); | ||||||
| @ -300,34 +333,113 @@ void TUpload2Campo::elabora_SI(THardy_upload_recordset& recset, TLog_report& log | |||||||
| { | { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | void TUpload2Campo::elabora_BR(THardy_upload_recordset& recset, TLog_report& log) | ||||||
|  | { | ||||||
|  |   //dati dal recordset di upload
 | ||||||
|  |   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); | ||||||
|  | 
 | ||||||
|  |   const long curr_movmag = recset.get("NumeroDoc").as_int(); | ||||||
|  |   const TString& str_data_mov = recset.get("DataMov").as_string(); | ||||||
|  |   const TDate data_mov = upload_format_date6(str_data_mov); | ||||||
|  |   const int anno = data_mov.year(); | ||||||
|  |   TString descr; | ||||||
|  |   descr << "Agente: " << codice_terminale; | ||||||
|  | 
 | ||||||
|  |   //1) crea la testata
 | ||||||
|  |   //movimento di magazzino da riempire
 | ||||||
|  |   TMov_mag movmag; | ||||||
|  | 
 | ||||||
|  |   //const long numreg = atol(movmag.get_next_key());
 | ||||||
|  |   //movmag.put(MOVMAG_NUMREG, numreg);
 | ||||||
|  |   movmag.put(MOVMAG_ANNOES, anno); | ||||||
|  |   movmag.put(MOVMAG_DATAREG, data_mov); | ||||||
|  |   movmag.put(MOVMAG_DATACOMP, data_mov); | ||||||
|  |   movmag.put(MOVMAG_EXNUMDOC, curr_movmag); | ||||||
|  |   movmag.put(MOVMAG_EXDATADOC, data_mov); | ||||||
|  |   movmag.put(MOVMAG_DESCR, descr); | ||||||
|  |   //movmag.put(MOVMAG_CODCAUS, codcaus);
 | ||||||
|  | 
 | ||||||
|  |   bool go_on = true; | ||||||
|  |   // righe movimento di magazzino
 | ||||||
|  |   //scansione delle righe documento su record BR
 | ||||||
|  |   while (go_on) | ||||||
|  |   { | ||||||
|  |     //2) crea le righe (legge tutti i record di tipo BR successivi finchè hanno lo stesso numero documento!)
 | ||||||
|  | 
 | ||||||
|  |     //agginunge una nuova riga (solo merce, per quanto ne sappiamo)
 | ||||||
|  |     TRectype& rmovmag = movmag.new_row(); | ||||||
|  |     rmovmag.put(RMOVMAG_CODMAG, cod_magazzino); | ||||||
|  |     TString8 codart = recset.get("CodiceArticolo").as_string(); | ||||||
|  |     check_articolo(codart, log); | ||||||
|  |     rmovmag.put(RMOVMAG_CODART, codart); | ||||||
|  |     TToken_string key_umart; | ||||||
|  |     key_umart.add(codart); | ||||||
|  |     key_umart.add(1); | ||||||
|  |     const TString& um = cache().get(LF_UMART, key_umart, UMART_UM); | ||||||
|  |     rmovmag.put(RMOVMAG_UM, um); | ||||||
|  |     const TString& lotto = recset.get("CodiceLotto").as_string(); | ||||||
|  |     rmovmag.put(RMOVMAG_LIVGIAC, lotto); | ||||||
|  |      | ||||||
|  |     real qta = recset.get("Qta[int]").as_real(); | ||||||
|  |     qta += recset.get("Qta[dec]").as_real() / CENTO; | ||||||
|  |     rmovmag.put(RMOVMAG_QUANT, qta); | ||||||
|  | 
 | ||||||
|  |     //quando non trova un BR con lo stesso numero di movimento significa che le righe sono finite!
 | ||||||
|  |     go_on = recset.move_next(); | ||||||
|  | 
 | ||||||
|  |     if (go_on && (recset.get("TipoRecord").as_string() != "BR" || curr_movmag != recset.get("NumeroDoc").as_int())) | ||||||
|  |     { | ||||||
|  |       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 << "Doc.: " << curr_movmag << "  Terminale: " << codice_terminale; | ||||||
|  |   //se può scrivere...
 | ||||||
|  |   if (_can_write) | ||||||
|  |   { | ||||||
|  |     //alla fine della fiera salva il maggico movimento di magazzino
 | ||||||
|  |     TLocalisamfile file_movmag(LF_MOVMAG); | ||||||
|  |     int err = movmag.write(file_movmag); | ||||||
|  | 
 | ||||||
|  |     if (err == NOERR) | ||||||
|  |     { | ||||||
|  |       msg.insert("Registrato mov. magazzino: ", 0); | ||||||
|  |       log.log(0, msg); | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |       msg.insert("Impossibile registrare mov. magazzino: ", 0); | ||||||
|  |       log.log(2, msg); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   else  //..sennò avverte e basta
 | ||||||
|  |   { | ||||||
|  |     msg.insert("Controllato mov. magazzino: ", 0); | ||||||
|  |     log.log(0, msg); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   log.log(0, ""); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| void TUpload2Campo::elabora_TF(THardy_upload_recordset& recset, TLog_report& log) | void TUpload2Campo::elabora_TF(THardy_upload_recordset& recset, TLog_report& log) | ||||||
| { | { | ||||||
|   //1)  codice terminale (lungo 3) e codice agente (lungo 5)
 |   //1)  codice terminale (lungo 3) e codice agente (lungo 5)
 | ||||||
|   TString4 codice_terminale = recset.get("CodiceTerminale").as_string(); |   TString4 codice_terminale = recset.get("CodiceTerminale").as_string(); | ||||||
|   codice_terminale.right_just(3, '0'); |   const TString& codice_agente = check_agente(codice_terminale, log); | ||||||
|   TString8 codice_agente = codice_terminale; |   const TString8 codmag = cache().get(LF_AGENTI, codice_agente, AGE_CODMAG); | ||||||
|   codice_agente.right_just(5, '0'); |  | ||||||
| 
 |  | ||||||
|   const TRectype& rec_age = cache().get(LF_AGENTI, codice_agente); |  | ||||||
|   const TString& codage = rec_age.get(AGE_CODAGE); |  | ||||||
|   const TString8 codmag = rec_age.get(AGE_CODMAG);  //magazzino collegato all'agente (serve nelle righe)
 |  | ||||||
| 
 |  | ||||||
|   if (codage != codice_agente) |  | ||||||
|   { |  | ||||||
|     _can_write = false; |  | ||||||
|     TString msg; |  | ||||||
|     msg << "Codice agente " << codice_agente << " da terminale: sconosciuto"; |  | ||||||
|     log.log(2, msg); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
|   //2) Testata documento
 |   //2) Testata documento
 | ||||||
|   //genera una simpatico documento di cui raccatta la chiave
 |   //genera una simpatico documento di cui raccatta la chiave
 | ||||||
|   const TString& str_datadoc = recset.get(DOC_DATADOC).as_string(); |   const TString& str_datadoc = recset.get(DOC_DATADOC).as_string(); | ||||||
|   int anno = 2000 + atoi(str_datadoc.right(2)); |   const TDate datadoc = upload_format_date6(str_datadoc); | ||||||
|   const int mese = atoi(str_datadoc.mid(2,2)); |  | ||||||
|   const int giorno = atoi(str_datadoc.left(2)); |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
|   char rec_tipodoc = recset.get(DOC_TIPODOC).as_string()[0]; |   char rec_tipodoc = recset.get(DOC_TIPODOC).as_string()[0]; | ||||||
|   //2a) tipo documento
 |   //2a) tipo documento
 | ||||||
| @ -350,6 +462,7 @@ void TUpload2Campo::elabora_TF(THardy_upload_recordset& recset, TLog_report& log | |||||||
|   } |   } | ||||||
|   //2b) numerazione documento
 |   //2b) numerazione documento
 | ||||||
|   //il codnum dipende dal tipo documento del terminale (F,B,O...) e dal codice del terminale
 |   //il codnum dipende dal tipo documento del terminale (F,B,O...) e dal codice del terminale
 | ||||||
|  |   //se tipo 'V' va cambiato in tipo 'B' in quanto le bolle valorizzate sono normali bolle in Campo
 | ||||||
|   TString4 codnum; |   TString4 codnum; | ||||||
|   if (rec_tipodoc == 'V') |   if (rec_tipodoc == 'V') | ||||||
|     rec_tipodoc = 'B'; |     rec_tipodoc = 'B'; | ||||||
| @ -366,7 +479,7 @@ void TUpload2Campo::elabora_TF(THardy_upload_recordset& recset, TLog_report& log | |||||||
| 
 | 
 | ||||||
|   const long ndoc = recset.get(DOC_NDOC).as_int(); |   const long ndoc = recset.get(DOC_NDOC).as_int(); | ||||||
| 
 | 
 | ||||||
|   TDocumento doc('D', anno, codnum, ndoc); |   TDocumento doc('D', datadoc.year(), codnum, ndoc); | ||||||
| 
 | 
 | ||||||
|   //2c) tipo documento e data documento
 |   //2c) tipo documento e data documento
 | ||||||
|   doc.put(DOC_TIPODOC, tipodoc); |   doc.put(DOC_TIPODOC, tipodoc); | ||||||
| @ -374,7 +487,6 @@ void TUpload2Campo::elabora_TF(THardy_upload_recordset& recset, TLog_report& log | |||||||
|   const TString& caus_movmag = td.caus_mov(); |   const TString& caus_movmag = td.caus_mov(); | ||||||
|   doc.put(DOC_CAUSMAG, caus_movmag); |   doc.put(DOC_CAUSMAG, caus_movmag); | ||||||
| 
 | 
 | ||||||
|   TDate datadoc(giorno, mese, anno); |  | ||||||
|   doc.put(DOC_DATADOC, datadoc); |   doc.put(DOC_DATADOC, datadoc); | ||||||
|    |    | ||||||
|   //2d) cliente e campi collegati via cli2doc()
 |   //2d) cliente e campi collegati via cli2doc()
 | ||||||
| @ -425,21 +537,12 @@ void TUpload2Campo::elabora_TF(THardy_upload_recordset& recset, TLog_report& log | |||||||
|     //serie delle put sulla riga documento; ricordiamo che la chiave della riga viene riempita dalla new_row
 |     //serie delle put sulla riga documento; ricordiamo che la chiave della riga viene riempita dalla new_row
 | ||||||
|     //3a) articolo
 |     //3a) articolo
 | ||||||
|     TString8 codart = recset.get(RDOC_CODART).as_string(); |     TString8 codart = recset.get(RDOC_CODART).as_string(); | ||||||
|     codart.trim(); |     const TString& descr = check_articolo(codart, log); | ||||||
|     const TRectype& rec_anamag = cache().get(LF_ANAMAG, codart); |  | ||||||
|     const TString& articolo = rec_anamag.get(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_CODART, codart); | ||||||
|     rigadoc.put(RDOC_CODARTMAG, codart); |     rigadoc.put(RDOC_CODARTMAG, codart); | ||||||
|     rigadoc.put(RDOC_CHECKED, "X"); |     rigadoc.put(RDOC_CHECKED, "X"); | ||||||
|     rigadoc.put(RDOC_DESCR, rec_anamag.get(ANAMAG_DESCR)); |     rigadoc.put(RDOC_DESCR, descr); | ||||||
| 
 | 
 | ||||||
|     //3b) umart
 |     //3b) umart
 | ||||||
|     const TString& umqta = recset.get(RDOC_UMQTA).as_string(); |     const TString& umqta = recset.get(RDOC_UMQTA).as_string(); | ||||||
| @ -510,7 +613,7 @@ void TUpload2Campo::elabora_TF(THardy_upload_recordset& recset, TLog_report& log | |||||||
| 
 | 
 | ||||||
|   //incredibilmente arriva in fondo
 |   //incredibilmente arriva in fondo
 | ||||||
|   TString msg; |   TString msg; | ||||||
|   msg << anno << "-" << codnum << "-" << ndoc << "  Terminale: " << codice_terminale << "  Cliente: " << codcf; |   msg << datadoc.year() << "-" << codnum << "-" << ndoc << "  Terminale: " << codice_terminale << "  Cliente: " << codcf; | ||||||
|   //se può scrivere...
 |   //se può scrivere...
 | ||||||
|   if (_can_write) |   if (_can_write) | ||||||
|   { |   { | ||||||
| @ -550,7 +653,7 @@ void TUpload2Campo::elabora(const TMask& mask) | |||||||
|   recset.sort(ordina_upload); |   recset.sort(ordina_upload); | ||||||
| 
 | 
 | ||||||
| #ifdef DBG | #ifdef DBG | ||||||
|   recset.save_as("c:/temp/hardy/cazzone.txt"); |   recset.save_as("D:/dati/hardy/cazzone.txt"); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|   //creazione progind e log
 |   //creazione progind e log
 | ||||||
| @ -592,8 +695,8 @@ void TUpload2Campo::elabora(const TMask& mask) | |||||||
|     case 3: //tipo record: SI (incasso documenti)
 |     case 3: //tipo record: SI (incasso documenti)
 | ||||||
|       elabora_SI(recset, log); |       elabora_SI(recset, log); | ||||||
|       break; |       break; | ||||||
|     case 4: //tipo record: BR (movimenti magazzino)
 |     case 4: //tipo record: BR (righe movimenti magazzino)
 | ||||||
|       //elabora_BR(recset, log);  //non li importiamo perchè vengono eseguiti alla scrittura dei documenti importati su archivi
 |       elabora_BR(recset, log); | ||||||
|       break; |       break; | ||||||
|     case 5: //tipo record: VC (Variazioni Cliente)
 |     case 5: //tipo record: VC (Variazioni Cliente)
 | ||||||
|       //elabora_VC(recset, log);  //non serve! gli agenti non possono immettere clienti da terminale!
 |       //elabora_VC(recset, log);  //non serve! gli agenti non possono immettere clienti da terminale!
 | ||||||
|  | |||||||
| @ -401,6 +401,15 @@ const TString& hd_format_date6(const TDate& data) | |||||||
|   return str_data; |   return str_data; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | const TDate upload_format_date6(const TString& str_data) | ||||||
|  | { | ||||||
|  |   int anno = 2000 + atoi(str_data.right(2)); | ||||||
|  |   const int mese = atoi(str_data.mid(2,2)); | ||||||
|  |   const int giorno = atoi(str_data.left(2)); | ||||||
|  |   TDate data(giorno, mese, anno); | ||||||
|  |   return data; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // determina codice cliente campo a partire da codice hardy in base alle regole dettatemi da Robbi
 | // determina codice cliente campo a partire da codice hardy in base alle regole dettatemi da Robbi
 | ||||||
| 
 | 
 | ||||||
| long hd_key2cli(const TString& key) | long hd_key2cli(const TString& key) | ||||||
|  | |||||||
| @ -218,6 +218,7 @@ real hd_find_sconto(const TString& str_sconto); | |||||||
| const TString& hd_find_codag(long codcf);  // Da cliente campo ad agente Hardy ("007")
 | const TString& hd_find_codag(long codcf);  // Da cliente campo ad agente Hardy ("007")
 | ||||||
| const TString& hd_format_date8(const TDate& data); | const TString& hd_format_date8(const TDate& data); | ||||||
| const TString& hd_format_date6(const TDate& data); | const TString& hd_format_date6(const TDate& data); | ||||||
|  | const TDate upload_format_date6(const TString& str_data); | ||||||
| long hd_key2cli(const TString& key); | long hd_key2cli(const TString& key); | ||||||
| long hd_key2forn(const TString& key); | long hd_key2forn(const TString& key); | ||||||
| void hd_key2conto(const TString& key, int& gr, int& co, long& so); | void hd_key2conto(const TString& key, int& gr, int& co, long& so); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user