From 8700b4dbd48dd1caa68953f92eb585469e75b38b Mon Sep 17 00:00:00 2001 From: luca83 Date: Tue, 20 Apr 2010 13:01:14 +0000 Subject: [PATCH] Patch level : 10.0 patch 710 Files correlati : lv0300a.msk lvlib lv3 Ricompilazione Demo : [ ] Commento : Aggiunto il programma di generazione inventario da terminale git-svn-id: svn://10.65.10.50/trunk@20360 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- lv/lv0300a.h | 107 ++++--- lv/lv0300a.uml | 113 +++++-- lv/lv3.cpp | 1 + lv/lv3.h | 1 + lv/lv3700.cpp | 837 +++++++++++++++++++++++++++++++++++++++++++++++++ lv/lv3700a.h | 16 + lv/lv3700a.uml | 143 +++++++++ lv/lvlib.cpp | 24 ++ lv/lvlib.h | 5 + 9 files changed, 1169 insertions(+), 78 deletions(-) create mode 100755 lv/lv3700.cpp create mode 100755 lv/lv3700a.h create mode 100755 lv/lv3700a.uml diff --git a/lv/lv0300a.h b/lv/lv0300a.h index d422da137..70d94044a 100755 --- a/lv/lv0300a.h +++ b/lv/lv0300a.h @@ -32,62 +32,67 @@ #define F_TIPODOC_ORC 218 #define F_DESTIPODOC_ORC 219 -#define F_BUONIRIT 220 -#define F_BUONIANT 221 -#define F_BUONIPREL 222 -#define F_DOCCONG 223 -#define F_DOCDOT 224 +#define F_CODNUM_INV 220 +#define F_DESNUM_INV 221 +#define F_TIPODOC_INV 222 +#define F_DESTIPODOC_INV 223 -#define F_CAUSLAV 225 -#define F_CAUSLAVDESC 226 -#define F_CAULVRITDT 227 -#define F_CAULVRITDTDE 228 -#define F_CAUCARMAG 229 -#define F_CAUCARMAGDE 230 -#define F_CAUSCARMAG 231 -#define F_CAUSCARMAGDE 232 +#define F_BUONIRIT 224 +#define F_BUONIANT 225 +#define F_BUONIPREL 226 +#define F_DOCCONG 227 +#define F_DOCDOT 228 -#define F_CODMAG 233 -#define F_DESMAG 234 -#define F_CODMAGN 235 -#define F_DESMAGN 236 -#define F_CODMAGC 237 -#define F_DESMAGC 238 -#define F_CODMAGP 239 -#define F_DESMAGP 240 -#define F_CODMAGCL 241 -#define F_DESMAGCL 242 +#define F_CAUSLAV 229 +#define F_CAUSLAVDESC 230 +#define F_CAULVRITDT 231 +#define F_CAULVRITDTDE 232 +#define F_CAUCARMAG 233 +#define F_CAUCARMAGDE 234 +#define F_CAUSCARMAG 235 +#define F_CAUSCARMAGDE 236 -#define F_UNICONT 243 -#define F_QTAMODI 244 -#define F_AUTGIRI 245 -#define F_ORDGIRI 246 -#define F_DATAFISSA 247 -#define F_AGGCONG 248 -#define F_PERARR 249 -#define F_RIFOR 250 -#define F_ARTCANFIS 251 -#define F_GESTSACA 252 -#define F_ALMANAC 253 -#define F_USEINDSP 254 -#define F_DATABCON 255 -#define F_CONDOM 256 -#define F_CODARTFIX 257 -#define F_DESARTFIX 258 -#define F_CODARTCAFIX 259 -#define F_DESARTCAFIX 260 -#define F_TIPOPR 261 -#define F_UMPESO 262 +#define F_CODMAG 237 +#define F_DESMAG 238 +#define F_CODMAGN 239 +#define F_DESMAGN 240 +#define F_CODMAGC 241 +#define F_DESMAGC 242 +#define F_CODMAGP 243 +#define F_DESMAGP 244 +#define F_CODMAGCL 245 +#define F_DESMAGCL 246 -#define F_PATH_CON 263 -#define F_SHEET_NAME 264 -#define F_PATH_MAN 265 -#define F_PATH_LAVA 266 -#define F_PATH_PUL 267 -#define F_FILE_PUL 268 +#define F_UNICONT 247 +#define F_QTAMODI 248 +#define F_AUTGIRI 249 +#define F_ORDGIRI 250 +#define F_DATAFISSA 251 +#define F_AGGCONG 252 +#define F_PERARR 253 +#define F_RIFOR 254 +#define F_ARTCANFIS 255 +#define F_GESTSACA 256 +#define F_ALMANAC 257 +#define F_USEINDSP 258 +#define F_DATABCON 259 +#define F_CONDOM 260 +#define F_CODARTFIX 261 +#define F_DESARTFIX 262 +#define F_CODARTCAFIX 263 +#define F_DESARTCAFIX 264 +#define F_TIPOPR 265 +#define F_UMPESO 266 -#define F_CODARTCOFIX 269 -#define F_DESARTCOFIX 270 +#define F_PATH_CON 267 +#define F_SHEET_NAME 268 +#define F_PATH_MAN 269 +#define F_PATH_LAVA 270 +#define F_PATH_PUL 271 +#define F_FILE_PUL 272 + +#define F_CODARTCOFIX 273 +#define F_DESARTCOFIX 274 #define F_BACKUP 300 diff --git a/lv/lv0300a.uml b/lv/lv0300a.uml index 907106d56..d8032ee24 100755 --- a/lv/lv0300a.uml +++ b/lv/lv0300a.uml @@ -121,12 +121,12 @@ END TEXT -1 BEGIN - PROMPT 1 4 "@bFatture" + PROMPT 1 3 "@bFatture" END STRING F_CODNUM_FAT 4 BEGIN - PROMPT 2 5 "Numerazione " + PROMPT 2 4 "Numerazione " FIELD NUM_FAT HELP "Codice numerazione" USE %NUM @@ -142,7 +142,7 @@ END STRING F_DESNUM_FAT 50 BEGIN - PROMPT 24 5 "" + PROMPT 24 4 "" HELP "Descrizione Numerazione" USE %NUM KEY 2 INPUT S0 F_DESNUM_FAT @@ -153,7 +153,7 @@ END STRING F_TIPODOC_FAT 4 BEGIN - PROMPT 2 6 "Tipo " + PROMPT 2 5 "Tipo " FIELD TIPODOC_FAT HELP "Codice tipo documento" USE %TIP @@ -168,7 +168,7 @@ END STRING F_DESTIPODOC_FAT 50 BEGIN - PROMPT 24 6 "" + PROMPT 24 5 "" HELP "Descrizione tipo documento" USE %TIP KEY 2 INPUT S0 F_DESTIPODOC_FAT @@ -179,13 +179,13 @@ END BOOLEAN F_RIFTEST BEGIN - PROMPT 2 7 "Scrivi riferimenti in testata documento" + PROMPT 2 6 "Scrivi riferimenti in testata documento" FIELD RifTest END STRING F_FELAB_DIF 8 BEGIN - PROMPT 2 8 "Tipo fatt. definitiva" + PROMPT 2 7 "Tipo fatt. definitiva" FLAG "U" USE %ELD SELECT I0==2 INPUT CODTAB F_FELAB_DIF @@ -199,7 +199,7 @@ END STRING F_FELAB_PRO 8 BEGIN - PROMPT 45 8 "Tipo fatt. di prova " + PROMPT 45 7 "Tipo fatt. di prova " FLAG "U" USE %ELD SELECT I0==2 INPUT CODTAB F_FELAB_PRO @@ -213,12 +213,12 @@ END TEXT -1 BEGIN - PROMPT 1 10 "@bOrdini fornitori" + PROMPT 1 8 "@bOrdini fornitori" END STRING F_CODNUM_ORF 4 BEGIN - PROMPT 2 11 "Numerazione " + PROMPT 2 9 "Numerazione " FIELD NUM_ORF HELP "Codice numerazione" USE %NUM @@ -234,7 +234,7 @@ END STRING F_DESNUM_ORF 50 BEGIN - PROMPT 24 11 "" + PROMPT 24 9 "" HELP "Descrizione Numerazione" USE %NUM KEY 2 INPUT S0 F_DESNUM_ORF @@ -245,7 +245,7 @@ END STRING F_TIPODOC_ORF 4 BEGIN - PROMPT 2 12 "Tipo " + PROMPT 2 10 "Tipo " FIELD TIPODOC_ORF HELP "Codice tipo documento" USE %TIP @@ -260,7 +260,7 @@ END STRING F_DESTIPODOC_ORF 50 BEGIN - PROMPT 24 12 "" + PROMPT 24 10 "" HELP "Descrizione tipo documento" USE %TIP KEY 2 INPUT S0 F_DESTIPODOC_ORF @@ -271,12 +271,12 @@ END TEXT -1 BEGIN - PROMPT 1 14 "@bOrdini clienti" + PROMPT 1 11 "@bOrdini clienti" END STRING F_CODNUM_ORC 4 BEGIN - PROMPT 2 15 "Numerazione " + PROMPT 2 12 "Numerazione " FIELD NUM_ORC HELP "Codice numerazione" USE %NUM @@ -292,7 +292,7 @@ END STRING F_DESNUM_ORC 50 BEGIN - PROMPT 24 15 "" + PROMPT 24 12 "" HELP "Descrizione Numerazione" USE %NUM KEY 2 INPUT S0 F_DESNUM_ORC @@ -303,7 +303,7 @@ END STRING F_TIPODOC_ORC 4 BEGIN - PROMPT 2 16 "Tipo " + PROMPT 2 13 "Tipo " FIELD TIPODOC_ORC HELP "Codice tipo documento" USE %TIP @@ -318,7 +318,7 @@ END STRING F_DESTIPODOC_ORC 50 BEGIN - PROMPT 24 16 "" + PROMPT 24 13 "" HELP "Descrizione tipo documento" USE %TIP KEY 2 INPUT S0 F_DESTIPODOC_ORC @@ -329,12 +329,71 @@ END TEXT -1 BEGIN - PROMPT 1 18 "@bCausali di default" + PROMPT 1 14 "@bInventari pacchi" +END + +STRING F_CODNUM_INV 4 +BEGIN + PROMPT 2 15 "Numerazione " + FIELD NUM_INV + HELP "Codice numerazione" + USE %NUM + INPUT CODTAB F_CODNUM_INV + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODNUM_INV CODTAB + OUTPUT F_DESNUM_INV S0 + CHECKTYPE REQUIRED + FLAGS "UPA" + WARNING "Numerazione assente" +END + +STRING F_DESNUM_INV 50 +BEGIN + PROMPT 24 15 "" + HELP "Descrizione Numerazione" + USE %NUM KEY 2 + INPUT S0 F_DESNUM_INV + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT F_CODNUM_INV +END + +STRING F_TIPODOC_INV 4 +BEGIN + PROMPT 2 16 "Tipo " + FIELD TIPODOC_INV + HELP "Codice tipo documento" + USE %TIP + INPUT CODTAB F_TIPODOC_INV + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_TIPODOC_INV CODTAB + OUTPUT F_DESTIPODOC_INV S0 + CHECKTYPE REQUIRED + FLAGS "UP" +END + +STRING F_DESTIPODOC_INV 50 +BEGIN + PROMPT 24 16 "" + HELP "Descrizione tipo documento" + USE %TIP KEY 2 + INPUT S0 F_DESTIPODOC_INV + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT F_TIPODOC_ORC +END + + +TEXT -1 +BEGIN + PROMPT 1 17 "@bCausali di default" END STRING F_CAUSLAV 3 BEGIN - PROMPT 2 19 "Cau. Rit/Con " + PROMPT 2 18 "Cau. Rit/Con " USE &CAU INPUT CODTAB F_CAUSLAV DISPLAY "Codice" CODTAB @@ -347,7 +406,7 @@ END STRING F_CAUSLAVDESC 48 BEGIN - PROMPT 26 19 "" + PROMPT 26 18 "" USE &CAU KEY 2 INPUT S0 F_CAUSLAVDESC DISPLAY "Descrizione@50" S0 @@ -358,7 +417,7 @@ END STRING F_CAULVRITDT 3 BEGIN - PROMPT 2 20 "Cau. Rit. dt. tmp" + PROMPT 2 19 "Cau. Rit. dt. tmp" USE &CAU INPUT CODTAB F_CAULVRITDT DISPLAY "Codice" CODTAB @@ -371,7 +430,7 @@ END STRING F_CAULVRITDTDE 48 BEGIN - PROMPT 26 20 "" + PROMPT 26 19 "" USE &CAU KEY 2 INPUT S0 F_CAUSLAVDESC DISPLAY "Descrizione@50" S0 @@ -382,7 +441,7 @@ END STRING F_CAUCARMAG 5 BEGIN - PROMPT 2 21 "Cau. Car. Mag. " + PROMPT 2 20 "Cau. Car. Mag. " USE %CAU KEY 1 INPUT CODTAB F_CAUCARMAG DISPLAY "Codice" CODTAB @@ -395,7 +454,7 @@ END STRING F_CAUCARMAGDE 50 46 BEGIN - PROMPT 28 21 "" + PROMPT 28 20 "" USE %CAU KEY 2 INPUT S0 F_CAUCARMAGDE DISPLAY "Descrizione@50" S0 @@ -406,7 +465,7 @@ END STRING F_CAUSCARMAG 5 BEGIN - PROMPT 2 22 "Cau. Scar. Mag. " + PROMPT 2 21 "Cau. Scar. Mag. " USE %CAU KEY 1 INPUT CODTAB F_CAUSCARMAG DISPLAY "Codice" CODTAB @@ -419,7 +478,7 @@ END STRING F_CAUSCARMAGDE 50 46 BEGIN - PROMPT 28 22 "" + PROMPT 28 21 "" USE %CAU KEY 2 INPUT S0 F_CAUSCARMAGDE DISPLAY "Descrizione@50" S0 diff --git a/lv/lv3.cpp b/lv/lv3.cpp index 3f97808aa..833c9548f 100755 --- a/lv/lv3.cpp +++ b/lv/lv3.cpp @@ -13,6 +13,7 @@ int main(int argc, char** argv) case 3: lv3400(argc, argv); break; // gestione manuale buoni di prelievo lv3400 case 4: lv3500(argc, argv); break; // sitauzione a mag. di un art. lv3500 case 5: lv3600(argc, argv); break; // invio dati a contapezzi Montanari lv3600 + case 6: lv3700(argc, argv); break; // inventario da terminale lv3700 default: lv3100(argc, argv); break; // gestione manuale bolle lv3100 } return 0; diff --git a/lv/lv3.h b/lv/lv3.h index 79ede08b6..0e56fb03a 100755 --- a/lv/lv3.h +++ b/lv/lv3.h @@ -7,5 +7,6 @@ int lv3300(int argc, char* argv[]); int lv3400(int argc, char* argv[]); int lv3500(int argc, char* argv[]); int lv3600(int argc, char* argv[]); +int lv3700(int argc, char* argv[]); #endif // __LV3_H diff --git a/lv/lv3700.cpp b/lv/lv3700.cpp new file mode 100755 index 000000000..3e7654d0e --- /dev/null +++ b/lv/lv3700.cpp @@ -0,0 +1,837 @@ +#include +#include +#include + +#include "lvlib.h" + +#include "lv3700a.h" + + /////////////////////////////////// + //// TDOC_INVENTARIO_ROW //// + /////////////////////////////////// + +//Classe TDoc_inventario_row +class TDoc_inventario_row: public TObject +{ + TRiga_documento& _rinv; +public: + const TString& codart() const; + const TString& desart() const; + const real qta() const; + const TString& um() const; + const int num_pacchi() const; + const TToken_string& cod_pacchi() const; + const TString& magazzino() const; + const TString& magazzinoc() const; + + void set_codart(const char* codart); + void set_desart(const TString& desart); + void set_qta(const real qta); + void set_um(const char* um); + void set_num_pacchi(const int numpacchi); + void set_cod_pacchi(const char* codpacchi); + void set_magazzino(const char* mag); + void set_magazzinoc(const char* magc); + + TDoc_inventario_row(TRiga_documento& rinv):_rinv(rinv){} +}; + +//CODART: metodo che restituisce il codice articolo della riga documento +const TString& TDoc_inventario_row::codart() const +{ + return _rinv.get(RDOC_CODART); +} + +//DESART: metodo che restiruisce la descrizione dell'articolo +const TString& TDoc_inventario_row::desart() const +{ + TString& str = get_tmp_string(); + str = _rinv.get(RDOC_DESCR); + + if (_rinv.get_bool(RDOC_DESCLUNGA)) + str << _rinv.get(RDOC_DESCEST); + + return str; +} + +//QTA: metodo che restiruisce la quantità salvata sulla riga +const real TDoc_inventario_row::qta() const +{ + return _rinv.get_real(RDOC_QTA); +} + +//UM: metodo che restiruisce l'unità di misura utilizzata sulla riga documento +const TString& TDoc_inventario_row::um() const +{ + return _rinv.get(RDOC_UMQTA); +} + +//NUM_PACCHI: metodo che resituisce il numero dei pacchi presenti per quell'articolo +const int TDoc_inventario_row::num_pacchi() const +{ + return _rinv.get_int(RDOC_NCOLLI); +} + +//COD_PACCHI: metodo che restiuisce l'elenco dei pacchi salvati su quella riga +const TToken_string& TDoc_inventario_row::cod_pacchi() const +{ + TToken_string& tmp = get_tmp_string(); + tmp = _rinv.get("CODPACCHI"); + + return tmp; +} + +//MAGAZZINO: metodo che restituisce il codice del magazzino/deposito +const TString& TDoc_inventario_row::magazzino() const +{ + return _rinv.get(RDOC_CODMAG); +} + +//MAGAZZINOC: metodo che restituisce il codice del magazzino/deposito collegato +const TString& TDoc_inventario_row::magazzinoc() const +{ + return _rinv.get(RDOC_CODMAGC); +} + +//SET_CODART: metodo che setta il codice articolo +void TDoc_inventario_row::set_codart(const char* codart) +{ + _rinv.put(RDOC_CODART, codart); + _rinv.put(RDOC_CODARTMAG, codart); +} + +//SET_DESART: metodo che setta la descrizione +void TDoc_inventario_row::set_desart(const TString& desart) +{ + if (desart.len() > 50) + { + _rinv.put(RDOC_DESCR, desart.left(50)); + _rinv.put(RDOC_DESCLUNGA, true); + _rinv.put(RDOC_DESCEST, desart.mid(50)); + } + else + _rinv.put(RDOC_DESCR, desart); +} + +//SET_QTA_RITIRATA: metodo che setta la quantità ritirata sulla riga +void TDoc_inventario_row::set_qta(const real qta) +{ + _rinv.put(RDOC_QTA, qta); +} + +//SET_UM: metodo che setta l'unità di misura +void TDoc_inventario_row::set_um(const char* um) +{ + _rinv.put(RDOC_UMQTA, um); +} + +//SET_NUM_PACCHI: metodo che setta il numero dei pacchi +void TDoc_inventario_row::set_num_pacchi(const int numpacchi) +{ + _rinv.put(RDOC_NCOLLI, numpacchi); +} + +//SET_COD_PACCHI: metodo che setta l'elenco dei pacchi salvati su quella riga +void TDoc_inventario_row::set_cod_pacchi(const char* codpacchi) +{ + _rinv.put("CODPACCHI", codpacchi); +} + +//SET_MAGAZZINO: metodo che setta il codice del magazzino/deposito +void TDoc_inventario_row::set_magazzino(const char* mag) +{ + _rinv.put(RDOC_CODMAG, mag); +} + +//SET_MAGAZZINOC: metodo che setta il codice del magazzino/deposito collegato +void TDoc_inventario_row::set_magazzinoc(const char* magc) +{ + _rinv.put(RDOC_CODMAGC, magc); +} + + /////////////////////////////// + //// TDOC_INVENTARIO //// + /////////////////////////////// + +//Classe TDoc_inventario +class TDoc_inventario: public TDocumento +{ +public: + const TToken_string& chiave() const; + const TDate datadoc() const; + + TDoc_inventario_row find_or_create_row(const char* codart); + + TDoc_inventario& operator= (const TDoc_inventario dinv){dinv;} + + TDoc_inventario(TDoc_key& key): TDocumento(key.provv(), key.anno(), key.codnum(), key.ndoc()){}; + TDoc_inventario(TDoc_inventario& dinv): TDocumento(dinv){}; +}; + +//CHIAVE: metodo che restituisce la chiave del documento +const TToken_string& TDoc_inventario::chiave() const +{ + TToken_string& k = get_tmp_string(); + k.add(get(DOC_PROVV)); + k.add(get(DOC_ANNO)); + k.add(get(DOC_CODNUM)); + k.add(get(DOC_NDOC)); + return k; +} + +//DATADOC: metodo che restiruisce la data documento +const TDate TDoc_inventario::datadoc() const +{ + return get_date(DOC_DATADOC); +} + +//FIND_OR_CREATE_ROW: metodo che cerca una riga con un certo codart e se non esiste la crea +TDoc_inventario_row TDoc_inventario::find_or_create_row(const char* codart) +{ + //scorro tutte le righe documento; se ne trovo una con quel codart + //allora la restituisco + for(int i = 1; i <= rows(); i++) + { + TRiga_documento& row = (*(TDocumento*)this)[i]; + const TString& cod = row.get(RDOC_CODART); + + if(cod == codart) + { + TDoc_inventario_row rinv(row); + return rinv; + } + } + + //se sono arrivato qui non ho trovato neanche una riga con quel codart; + //in queto caso ne aggiungo una + TRiga_documento& row = (*(TDocumento*)this).new_row("21"); + TDoc_inventario_row rinv(row); + return rinv; +} + + /////////////////////////////// + //// TPACCHI_CONTATI //// + /////////////////////////////// + +//Classe TPacchi_contati +class TPacchi_contati: public TObject +{ + real _qta; + TString4 _um; + int _npacchi; + TToken_string _codpacchi; + +public: + const real qta() const; + const TString& um() const; + const int npacchi() const; + const TToken_string& codpacchi() const; + + void set_qta(const real& qta); + void set_um(const char* um); + void set_npacchi(const int npacchi = 1); + void set_codpacchi(const TToken_string& codpacchi); + + void add_qta(const real& qta); + void add_pacchi(const int pacchi = 1); + void add_codpacco(const TString& codpacco); + void sub_codpacco(const TString& codpacco); + + TPacchi_contati(const real& qta = ZERO, const char* um = "", const int npacchi = 0, const char* codpacco = ""); +}; + +//QTA: metodo che restituisce la quantita +const real TPacchi_contati::qta() const +{ + return _qta; +} + +//UM: metodo che restituisce l'unità di misura +const TString& TPacchi_contati::um() const +{ + return _um; +} + +//NPACCHI: metodo che restituisce il numero dei pacchi pistolati +const int TPacchi_contati::npacchi() const +{ + return _npacchi; +} + +//CODPACCHI: metodo che restituisce i codici dei pacchi pistolati +const TToken_string& TPacchi_contati::codpacchi() const +{ + return _codpacchi; +} + +//SET_QTA: metodo che setta la quantità +void TPacchi_contati::set_qta(const real& qta) +{ + _qta = qta; +} + +//SET_UM: metodo che setta l'unità di misura +void TPacchi_contati::set_um(const char* um) +{ + _um = um; +} + +//SET_NPACCHI: metodo che setta il numero di pacchi +void TPacchi_contati::set_npacchi(const int npacchi) +{ + _npacchi = npacchi; +} + +//SET_CODPACCHI: metodo che setta i codici dei pacchi +void TPacchi_contati::set_codpacchi(const TToken_string& codpacchi) +{ + TToken_string tmp(codpacchi, '-'); + _codpacchi = tmp; +} + +//ADD_QTA_CON: metodo che aggiunge un quantitativo di roba alla quantità consegnata +void TPacchi_contati::add_qta(const real& qta) +{ + _qta += qta; +} + +//ADD_PACCHI: metodo che aggiunge un certo numero di pacchi a quelli consegnati (default = 1) +void TPacchi_contati::add_pacchi(const int pacchi) +{ + _npacchi += pacchi; +} + +//ADD_CODPACCO: metodo che aggiunge un codice di un pacco alla TToken_string che li contiene +void TPacchi_contati::add_codpacco(const TString& codpacco) +{ + _codpacchi.add(codpacco); +} + +//SUB_CODPACCO: metodo che toglie un codice di un pacco alla TToken_string che li contiene +void TPacchi_contati::sub_codpacco(const TString& codpacco) +{ + int pos = _codpacchi.get_pos(codpacco); + _codpacchi.destroy(pos); +} + +//metodo costruttore +TPacchi_contati::TPacchi_contati(const real& qta, const char* um, const int npacchi, const char* codpacco) +{ + set_qta(qta); + set_um(um); + set_npacchi(npacchi); + + TToken_string tmp(codpacco, '-'); + set_codpacchi(tmp); +} + + //////////////////////////////// + //// TRIGHE_INV_ARRAY //// + //////////////////////////////// + +//Classe TRighe_inv_array +class TRighe_inv_array: public TAssoc_array +{ +public: + TPacchi_contati* quantita(TString& codart, bool create); +}; + +//QUANTITA: metodo che cerca nel TAssoc_array le quantità della riga interessata in base ai parametri passati +//e lo crea in automatico se il parametro create vale "true" +TPacchi_contati* TRighe_inv_array::quantita(TString& codart, bool create) +{ + TPacchi_contati* pc = (TPacchi_contati*)objptr(codart); + + if(pc == NULL && create) + { + pc = new TPacchi_contati(); + add(codart, pc); + } + return pc; +} + + /////////////////////////////////// + //// TINVENTARIO_TER_MSK //// + /////////////////////////////////// + + +//Classe TInventario_ter_msk +class TInventario_ter_msk: public TAutomask +{ + TRighe_inv_array _ria; + bool _nuovo; + int _autoselect; + +protected: + bool precarica_righe(); + void registra(); + void aggiorna_campi(const char* codart, const TPacchi_contati& pc, const real& qtapacco); + void inventario_da_terminale(); + + virtual void on_idle(); + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + +public: + TInventario_ter_msk(); +}; + +//PRECARICA_RIGHE: metodo che carica in un TAssoc_array le righe fisiche del documento +bool TInventario_ter_msk::precarica_righe() +{ + //instanzio il documento inventario + TDoc_key kinv(get_int(F_ANNO), ini_get_string(CONFIG_DITTA, "lv", "NUM_INV", NULL), get_long(F_NINV)); + TDoc_inventario inv(kinv); + + if (inv.empty()) + { + warning_box(TR("L'inventario cercato è inesistente")); + return false; + } + + //controllo lo stato del documento + const TString4 stato = cache().get("%TIP", ini_get_string(CONFIG_DITTA, "lv", "TIPODOC_INV", NULL), "S2").mid(2,1); + if (inv.get(DOC_STATO) == stato) + { + TString str; + str << "L'inventario " << get_long(F_NINV) << " è già stato stampato e non può essere aggiornato"; + warning_box(str); + + reset(F_CHIAVE); + + return false; + } + + TDate oggi(TODAY); + + //metto ogni riga del documento nel TAssoc_array che contiene gli oggetti TPacchi_contati + //e che ha per chiave il codice articolo + FOR_EACH_PHYSICAL_RDOC(inv, i, row) + { + TDoc_inventario_row rinv(*row); + + TString80 codart = rinv.codart(); + + if (codart.blank()) + continue; + + TPacchi_contati* pc = _ria.quantita(codart, true); + pc->set_qta(rinv.qta()); + pc->set_um(rinv.um()); + pc->set_npacchi(rinv.num_pacchi()); + pc->set_codpacchi(rinv.cod_pacchi()); + } + return true; +} + +//REGISTRA: metodo che salva il buono di prelievo così com'è +void TInventario_ter_msk::registra() +{ + //se sto salvando un documento nuovo, allora lo genero, + //altrimenti aggiorno quello esiete già + TDoc_key kinv(get_date(F_DATAINV).year(), get(F_CODNUM), get_long(F_NINV)); + if (_nuovo) + kinv.set_ndoc(0); + + //instanzio il documento e salvo i dati di interesse sulle testate + //se necessario + TDoc_inventario inv(kinv); + if(_nuovo) + { + inv.put(DOC_TIPODOC, get(F_TPDOC)); + inv.put(DOC_DATADOC, get_date(F_DATAINV)); + + //aggiorno il numero documento con quello sicuramente corretto + TToken_string tmp = inv.chiave(); + TDoc_key chiave(tmp); + set(F_NINV, chiave.ndoc()); + _nuovo = false; + } + + //per ogni oggetto dell'array cerco o creo una riga merce del documento + FOR_EACH_ASSOC_OBJECT(_ria, obj, key, itm) + { + const TPacchi_contati& pc = *(TPacchi_contati*)itm; + const TString80 codart(key); + const TString& desart = cache().get(LF_ANAMAG, codart, "DESCR"); + + TString8 magazzino; + magazzino << ini_get_string(CONFIG_DITTA, "lv", "CODMAG") << ini_get_string(CONFIG_DITTA, "lv", "CODMAGP"); + + TDoc_inventario_row& rinv = inv.find_or_create_row(codart); + + rinv.set_codart(codart); + rinv.set_desart(desart); + rinv.set_qta(pc.qta()); + rinv.set_um(pc.um()); + rinv.set_num_pacchi(pc.npacchi()); + rinv.set_cod_pacchi(pc.codpacchi()); + rinv.set_magazzino(magazzino); //DA CONTROLLARE + rinv.set_magazzinoc(magazzino); //DA CONTROLLARE + } +} + +//AGGIORNA_CAMPI: metodo che aggiorna i campi della maschera +void TInventario_ter_msk::aggiorna_campi(const char* codart, const TPacchi_contati& pc, const real& qtapacco) +{ + set(F_CODART, codart); + set(F_PACCHI, pc.npacchi()); + set(F_QTACON, pc.qta()); + set(F_QTAPACCO, qtapacco); +} + +//INVENTARIO_DA_TERMINALE: metodo che somma alla riga corretta un pacco (quello pistolato) e lo assegna a un cliente, +//sottraendolo dal magazzino del pulito +void TInventario_ter_msk::inventario_da_terminale() +{ + //leggo il codice del pacco pistolato + const TString80 codpacco = get(F_BARCODE); + + if (codpacco.full()) + { + //se posso instanzio la riga pacco + TRiga_pacco rp(codpacco); + + if (rp.empty()) + { + warning_box(TR("Il pacco non esiste a magazzino")); + warning_box(TR("Non è stato possibile sommare il pacco a nessuna riga del buono")); + } + else + { + //leggo i dati di interesse dal pacco + TString80 codart = rp.articolo(); + const real qtapacco = rp.quantita(); + + //se è la prima volta, creo il nuovo TPacchi_contati, + //altrimenti aggiorno quello che già esiste + if(!_ria.is_key(codart)) + { + TPacchi_contati& pc = *(_ria.quantita(codart, true)); + + pc.set_qta(qtapacco); + + //recupero l'unità di misura principale di quest'articolo + TToken_string key; + key.add(codart); + key.add(1); + const TString4 um = cache().get(LF_UMART, key, UMART_UM); + pc.set_um(um); + pc.set_npacchi(); + + key.cut(0); + key.add(codpacco); + pc.set_codpacchi(key); + + aggiorna_campi(codart, pc, qtapacco); + } + else + { + TPacchi_contati& pc = *(TPacchi_contati*)_ria.objptr(codart); + + TToken_string codpacchi(pc.codpacchi()); + int pos = codpacchi.get_pos(codpacco); + + if(pos >= 0) + { + if(yesno_box(TR("Il pacco risulta già nell'inventario; si desidera annullarlo?"))) + { + pc.add_qta(-qtapacco); + pc.add_pacchi(-1); + pc.sub_codpacco(codpacco); + } + else + return; + } + + pc.add_qta(qtapacco); + pc.add_pacchi(); + pc.add_codpacco(codpacco); + + aggiorna_campi(codart, pc, qtapacco); + } + } + } +} + +//ON_FIELD_EVENT: metodo che gestisce gli eventi sui campi della maschera +bool TInventario_ter_msk::on_field_event(TOperable_field& f, TField_event e, long jolly) +{ + //a seconda del bottone premuto esegui un metodo diverso + switch (f.dlg()) + { + case DLG_NEWREC: + //se viene premuto nuovo, cerco il prossimo numero di inventario + //e mostro/nascondo i campi corretti + if (e == fe_button) + { + _nuovo = true; + + int ninv = 0; + + TString query; + query << "USE DOC\n" + << "FROM PROVV=\"D\" ANNO=" << get_int(F_ANNO) << " CODNUM=\"" << get(F_CODNUM) << "\"\n" + << "TO PROVV=\"D\" ANNO=" << get_int(F_ANNO) << " CODNUM=\"" << get(F_CODNUM) << "\""; + TISAM_recordset inventari(query); + if (inventari.move_last()) + ninv = inventari.get(DOC_NDOC).as_int(); + ninv++; + + set(F_NINV, ninv); disable(F_NINV); + + show(F_BARCODE); + show(F_CODART); + show(F_PACCHI); + show(F_QTAPACCO); + show(F_QTACON); + + hide(F_CHIAVE); + hide(F_ANNO); + hide(F_DATAINV); + + enable(DLG_SAVEREC); + enable(DLG_DELREC); + enable(DLG_CANCEL); + + field(F_BARCODE).set_focus(); + _autoselect = 1; + return false; + } + break; + case DLG_SAVEREC: + //se viene premuto salva, registro l'inventario + if (e == fe_button) + { + registra(); + return false; + } + break; + case DLG_DELREC: + //se viene premutop cancella, elimino l'inventario corrente, poi mostro/nascondo i campi corretti + if (e == fe_button && yesno_box(TR("Si vuole veramente cancellare l'inventario corrente?"))) + { + //se non è nuovo, lo rimuovo anche dagli archivi + if (!_nuovo) + { + TLocalisamfile doc(LF_DOC); + TDoc_key kinv(get_int(F_ANNO), get(F_CODNUM), get_long(F_NINV)); + + TDoc_inventario inv(kinv); + inv.destroy_rows(); + inv.remove(doc); + } + _ria.destroy(); + + reset(F_BARCODE); hide(F_BARCODE); + reset(F_CODART); hide(F_CODART); + reset(F_PACCHI); hide(F_PACCHI); + reset(F_QTAPACCO); hide(F_QTAPACCO); + reset(F_QTACON); hide(F_QTACON); + + enable(F_NINV); reset(F_NINV); + show(F_CHIAVE); reset(F_CHIAVE); + show(F_ANNO); + show(F_DATAINV); reset(F_DATAINV); + + disable(DLG_SAVEREC); + disable(DLG_DELREC); + disable(DLG_CANCEL); + } + break; + case DLG_CANCEL: + //se viene premuto annulla, lascio perdere quello che stavo facendo + //e torno alla situazione iniziale + if (e == fe_button) + { + reset(F_BARCODE); hide(F_BARCODE); + reset(F_CODART); hide(F_CODART); + reset(F_PACCHI); hide(F_PACCHI); + reset(F_QTAPACCO); hide(F_QTAPACCO); + reset(F_QTACON); hide(F_QTACON); + + enable(F_NINV); reset(F_NINV); + show(F_CHIAVE); reset(F_CHIAVE); + show(F_ANNO); + show(F_DATAINV); reset(F_DATAINV); + + disable(DLG_SAVEREC); + disable(DLG_DELREC); + disable(DLG_CANCEL); + + _ria.destroy(); + + return false; + } + break; + case F_CHIAVE: + { + //se viene riempito il campo chiave, cerca di caricare un documento + if (e == fe_modify) + { + TString kinv = f.get(); + if (kinv.full()) + { + set(F_ANNO, atol(kinv.left(4))); + set(F_NINV, atol(kinv.mid(4))); + field(F_NINV).check(); + + if(!precarica_righe()) + return false; + + hide(F_ANNO); + hide(F_DATAINV); + + show(F_BARCODE); + show(F_CODART); + show(F_PACCHI); + show(F_QTAPACCO); + show(F_QTACON); + + enable(DLG_SAVEREC); + enable(DLG_DELREC); + enable(DLG_CANCEL); + + disable(F_NINV); + + _autoselect = 1; + field(F_BARCODE).set_focus(); + f.hide(); + } + } + } + break; + case F_NINV: + { + //se viene riempito il campo NINV, cerca di caricare un documento + if (e == fe_modify && f.get_long() != 0 && get(F_CHIAVE).empty()) + { + field(F_NINV).check(); + _nuovo = false; + + if(!precarica_righe()) + return false; + + hide(F_ANNO); + hide(F_DATAINV); + + show(F_BARCODE); + show(F_CODART); + show(F_PACCHI); + show(F_QTAPACCO); + show(F_QTACON); + + enable(DLG_SAVEREC); + enable(DLG_DELREC); + enable(DLG_CANCEL); + + f.disable(); + + _autoselect = 1; + field(F_BARCODE).set_focus(); + } + } + break; + case F_BARCODE: + { + //se viene riempito il campo barcode, lanco la procedura dell'inventario + if (e == fe_modify && f.get().full()) + { + _autoselect = 1; + inventario_da_terminale(); + } + } + break; + default:break; + } + return true; +} + +void TInventario_ter_msk:: on_idle() +{ + TMask::on_idle(); + if (_autoselect >= 0 && get(F_BARCODE).full()) + { + reset(F_BARCODE); + field(F_BARCODE).set_focus(); + _autoselect = -1; + } +} + +TInventario_ter_msk::TInventario_ter_msk():TAutomask("lv3700a") +{ + //precarico i campi fissi + set(F_CODNUM, ini_get_string(CONFIG_DITTA, "lv", "NUM_INV", NULL)); + set(F_TPDOC, ini_get_string(CONFIG_DITTA, "lv", "TIPODOC_INV", NULL)); + + const TRectype& tpdoc = cache().get("%NUM", ini_get_string(CONFIG_DITTA, "lv", "NUM_INV", NULL)); + set(F_DESCR, tpdoc.get("S0")); + + TDate data(TODAY); + TEsercizi_contabili es; + int annoes = es.date2esc(data); + set(F_ANNO, annoes); + + hide(F_CODCF); + hide(F_RAGSOC); + hide(F_BARCODE); + hide(F_CODART); + hide(F_PACCHI); + hide(F_QTAPACCO); + hide(F_QTACON); + + disable(DLG_SAVEREC); + disable(DLG_DELREC); + disable(DLG_CANCEL); +} + + /////////////////////////////////// + //// TINVENTARIO_TER_APP //// + /////////////////////////////////// + +//classe TInventario_ter_app +class TInventario_ter_app : public TSkeleton_application +{ + TInventario_ter_msk* _msk; +protected: + virtual bool create(); + virtual bool destroy(); + +public: + bool transfer(); + virtual void main_loop(); +}; + +//CREATE: metodo costruttore +bool TInventario_ter_app::create() +{ + _msk = new TInventario_ter_msk(); + open_files(LF_DOC, LF_RIGHEDOC); + return TSkeleton_application::create(); +} + +//DESTROY: metodo distruttore +bool TInventario_ter_app::destroy() +{ + delete _msk; + return TApplication::destroy(); +} + +//TRANSFER: metodo che scorre i campi nome e, se sono pieni, richiama il metodo +//ELABORA_FILE(), che effettivamente fa l'elaborazione +bool TInventario_ter_app::transfer() +{ + return true; +} + +void TInventario_ter_app::main_loop() +{ + while (_msk->run() == K_ENTER) + transfer(); + } + +int lv3700(int argc, char *argv[]) +{ + TInventario_ter_app a; + a.run (argc, argv, "Evasione Buoni di Prelievo"); + return TRUE; +} \ No newline at end of file diff --git a/lv/lv3700a.h b/lv/lv3700a.h new file mode 100755 index 000000000..3dda06a12 --- /dev/null +++ b/lv/lv3700a.h @@ -0,0 +1,16 @@ +//Campi Maschera lv3700a +#define F_CODNUM 401 +#define F_TPDOC 402 +#define F_DESCR 403 +#define F_CHIAVE 404 +#define F_NINV 405 +#define F_ANNO 406 +#define F_DATAINV 407 +#define F_CODCF 408 +#define F_RAGSOC 409 +#define F_BARCODE 410 +#define F_CODART 411 +#define F_PACCHI 412 +#define F_QTAPACCO 413 +#define F_QTACON 414 +#define F_BLANK 415 \ No newline at end of file diff --git a/lv/lv3700a.uml b/lv/lv3700a.uml new file mode 100755 index 000000000..45a56a577 --- /dev/null +++ b/lv/lv3700a.uml @@ -0,0 +1,143 @@ +#include "lv3700a.h" + +TOOLBAR "Topbar" 0 0 0 2 + +BUTTON DLG_NEWREC 2 2 +BEGIN + PROMPT 1 1 "Nuovo" + PICTURE TOOL_NEWREC +END + +BUTTON DLG_SAVEREC 2 2 +BEGIN + PROMPT 1 1 "Salva" + PICTURE TOOL_SAVEREC +END + +BUTTON DLG_DELREC 2 2 +BEGIN + PROMPT 1 1 "Canc" + PICTURE TOOL_DELREC +END + +BUTTON DLG_CANCEL 2 2 +BEGIN + PROMPT 1 1 "Ann" + PICTURE TOOL_CANCEL +END + +BUTTON DLG_QUIT 2 2 +BEGIN + PROMPT 3 1 "Fine" + MESSAGE EXIT,K_QUIT + PICTURE TOOL_QUIT +END + +ENDPAGE + +PAGE "Inventario" 0 2 0 0 + +STRING F_CODNUM 4 +BEGIN + PROMPT 0 0 "" + FLAGS "D" +END + +STRING F_TPDOC 4 +BEGIN + PROMPT 5 0 "" + FLAGS "D" +END + +STRING F_DESCR 50 15 +BEGIN + PROMPT 10 0 "" + FLAGS "D" +END + +STRING F_CHIAVE 50 10 +BEGIN + PROMPT 1 1 "Barcode Invent" +END + +NUMBER F_NINV 6 +BEGIN + PROMPT 1 2 "Numero Doc. " + USE LF_DOC + JOIN LF_CLIFO TO LF_DOC INTO TIPOCF==TIPOCF CODCF==CODCF + INPUT PROVV "D" + INPUT ANNO F_ANNO SELECT + INPUT CODNUM F_CODNUM SELECT + INPUT NDOC F_NINV + DISPLAY "Ndoc@4" NDOC + DISPLAY "Data\ndocumento@10" DATADOC + DISPLAY "Cod\nCli@4" CODCF + DISPLAY "Ragione Sociale@10" LF_CLIFO->RAGSOC + OUTPUT F_NINV NDOC + OUTPUT F_DATAINV DATADOC + OUTPUT F_CODCF CODCF + OUTPUT F_RAGSOC LF_CLIFO->RAGSOC + CHECKTYPE REQUIRED + FLAGS "G" +END + +DATE F_DATAINV +BEGIN + PROMPT 1 3 "Data Inv. " + FLAGS "DA" +END + +NUMBER F_ANNO 4 +BEGIN + PROMPT 1 4 "Anno Esercizio " +END + +NUMBER F_CODCF 6 +BEGIN + PROMPT 1 0 "Cliente " + FLAGS "D" +END + +STRING F_RAGSOC 20 +BEGIN + PROMPT 1 1 "" + FLAGS "D" +END + +STRING F_BARCODE 50 12 +BEGIN + PROMPT 1 4 "Barcode " +END + +STRING F_CODART 6 +BEGIN + PROMPT 1 5 "Cod. Articolo " + FLAGS "D" +END + +NUMBER F_PACCHI 6 +BEGIN + PROMPT 1 6 "Pacchi " + FLAGS "D" +END + +NUMBER F_QTAPACCO 6 +BEGIN + PROMPT 1 7 "Quantità pacco" + FLAGS "D" +END + +NUMBER F_QTACON 6 +BEGIN + PROMPT 1 8 "Quantità Cont." + FLAGS "D" +END + +STRING F_BLANK 1 +BEGIN + PROMPT 100 100 "" +END + +ENDPAGE + +ENDMASK \ No newline at end of file diff --git a/lv/lvlib.cpp b/lv/lvlib.cpp index 3e4d86f90..de4929a8e 100755 --- a/lv/lvlib.cpp +++ b/lv/lvlib.cpp @@ -925,6 +925,30 @@ const long TDoc_key::ndoc() return get_int(3); } +//SET_PROVV: metodo che setta il campo provv +void TDoc_key::set_provv(const char provv) +{ + add(provv, 0); +} + +//SET_ANNO: metodo che setta il campo anno +void TDoc_key::set_anno(const int anno) +{ + add(anno, 1); +} + +//SET_CODNUM: metodo che setta il campo codnum +void TDoc_key::set_codnum(const char* codnum) +{ + add(codnum, 2); +} + +//SET_NDOC: metodo che setta il campo ndoc +void TDoc_key::set_ndoc(const long ndoc) +{ + add(ndoc, 3); +} + //metodi costruttori TDoc_key::TDoc_key(const int anno, const TString& codnum, const long ndoc, const char provv) { diff --git a/lv/lvlib.h b/lv/lvlib.h index e761897fb..f475e2010 100755 --- a/lv/lvlib.h +++ b/lv/lvlib.h @@ -204,6 +204,11 @@ public: const char* codnum(); const long ndoc(); + void set_provv(const char = 'D'); + void set_anno(const int anno); + void set_codnum(const char* codnum); + void set_ndoc(const long ndoc); + TDoc_key& operator= (const char* key){set(key);} TDoc_key(const int anno, const TString& codnum, const long ndoc, const char provv = 'D');