#include "lvlib.h" #include "lvrcondv.h" #include "lvcondv.h" #include "../cg/cglib01.h" #include "../mg/clifogiac.h" #include #include #include /////////////////////////////////////////////////////////// // Utilities /////////////////////////////////////////////////////////// void lv_set_creation_info(TRectype& rec) { rec.set_creation_info(); } void lv_set_update_info(TRectype& rec) { rec.set_modify_info(); } //funzione che restituisce true se la data che gli passo è una festività bool lv_is_holiday(const TDate& data) { static TAssoc_array calendari; const int anno = data.year(); TString16 key; key.format("%05ld%4d",prefix().get_codditta(),anno); TString* cal = (TString*)calendari.objptr(key); if (cal == NULL) { TConfig ini(CONFIG_DITTA); cal = new TString(366); calendari.add(key,cal); *cal = ini.get("CAL", "lv", anno); cal->left_just(366,'-'); } const TDate primo(1,1,anno); const long index = data - primo; return (*cal)[index] == 'X'; } //funzione che restituisce un codice contratto valido dato cliente, indirizzo di spedizione e data long lv_find_contract(const long codcf, const long indsped, const TDate& data) { TString query; query << "USE LVCONDV\n" << "SELECT BETWEEN(#DATA,DATAIN,DATASC)&&BETWEEN(CODINDSP,#INDSPED,#INDSPED)&&(PROPOSTA!=\"X\")\n" << "FROM CODCF=#CODCF\nTO CODCF=#CODCF"; TISAM_recordset contr(query); contr.set_var("#DATA",data); contr.set_var("#INDSPED",indsped); contr.set_var("#CODCF",codcf); long cod = 0L; if (contr.move_first()) cod = contr.get("CODCONT").as_int(); return cod; } /////////////////////////////////////////////////////////// // TLaundry_contract /////////////////////////////////////////////////////////// TRectype& TLaundry_contract::modify_row(const char* codart) { const long codcf = get_int(LVRCONDV_CODCF); const long codcont = get_int(LVRCONDV_CODCONT); TLocalisamfile rcondv(LF_LVRCONDV); rcondv.put(LVRCONDV_CODCF, codcf); rcondv.put(LVRCONDV_CODCONT, codcont); rcondv.put(LVRCONDV_CODART, codart); int err = rcondv.read(); TRectype& riga = rcondv.curr(); return riga; } // Ritorna la riga di contratto corrispondente a codart const TRectype& TLaundry_contract::row(const char* codart) const { TToken_string key; key.add(get(LVRCONDV_CODCF)); key.add(get(LVRCONDV_CODCONT)); key.add(codart); return cache().get(LF_LVRCONDV, key); } // Controlla se il contratto esiste veramente bool TLaundry_contract::ok() const { return !empty(); } bool TLaundry_contract::can_be_deleted() const { const TString4 codnum = ini_get_string(CONFIG_DITTA, "lv", "NUM_GEN"); TString query; query << "USE DOC KEY 4 SELECT CODNUM=#CODNUM \n" << "FROM TIPOCF=C CODCF=#CODCF PROVV=D \n" << "TO TIPOCF=C CODCF=#CODCF PROVV=D \n"; TISAM_recordset rset(query); rset.set_var("#CODNUM",TVariant(codnum)); rset.set_var("#CODCF",get_long(LVCONDV_CODCF)); return !rset.move_first(); } //aggiunge una riga al contratto con quel codart int TLaundry_contract::add_row(const char* codart) { const long codcf = get_int(LVRCONDV_CODCF); const long codcont = get_int(LVRCONDV_CODCONT); TLocalisamfile rcondv(LF_LVRCONDV); rcondv.put(LVRCONDV_CODCF, codcf); rcondv.put(LVRCONDV_CODCONT, codcont); rcondv.put(LVRCONDV_CODART, codart); return rcondv.rewrite_write(); } //fa l'update di una riga del contratto int TLaundry_contract::update_row(const char* codart, const char* fieldname, const bool bol) { const long codcf = get_int(LVRCONDV_CODCF); const long codcont = get_int(LVRCONDV_CODCONT); TLocalisamfile rcondv(LF_LVRCONDV); rcondv.put(LVRCONDV_CODCF, codcf); rcondv.put(LVRCONDV_CODCONT, codcont); rcondv.put(LVRCONDV_CODART, codart); int err = rcondv.read(); //se il record esiste if (err == NOERR) { rcondv.put(LVRCONDV_CODCF, codcf); rcondv.put(LVRCONDV_CODCONT, codcont); rcondv.put(LVRCONDV_CODART, codart); rcondv.put(fieldname, bol); err = rcondv.rewrite(); } return err; } //fa l'update di una riga del contratto int TLaundry_contract::update_row(const char* codart, const char* fieldname, const char* str) { const long codcf = get_int(LVRCONDV_CODCF); const long codcont = get_int(LVRCONDV_CODCONT); TLocalisamfile rcondv(LF_LVRCONDV); rcondv.put(LVRCONDV_CODCF, codcf); rcondv.put(LVRCONDV_CODCONT, codcont); rcondv.put(LVRCONDV_CODART, codart); int err = rcondv.read(); //se il record esiste if (err == NOERR) { rcondv.put(LVRCONDV_CODCF, codcf); rcondv.put(LVRCONDV_CODCONT, codcont); rcondv.put(LVRCONDV_CODART, codart); rcondv.put(fieldname, str); err = rcondv.rewrite(); } return err; } //fa l'update di una riga del contratto int TLaundry_contract::update_row(const char* codart, const char* fieldname, const long nmr) { const long codcf = get_int(LVRCONDV_CODCF); const long codcont = get_int(LVRCONDV_CODCONT); TLocalisamfile rcondv(LF_LVRCONDV); rcondv.put(LVRCONDV_CODCF, codcf); rcondv.put(LVRCONDV_CODCONT, codcont); rcondv.put(LVRCONDV_CODART, codart); int err = rcondv.read(); //se il record esiste if (err == NOERR) { rcondv.put(LVRCONDV_CODCF, codcf); rcondv.put(LVRCONDV_CODCONT, codcont); rcondv.put(LVRCONDV_CODART, codart); rcondv.put(fieldname, nmr); err = rcondv.rewrite(); } return err; } //fa l'update di una riga del contratto int TLaundry_contract::update_row(const char* codart, const char* fieldname, const real nmr) { const long codcf = get_int(LVRCONDV_CODCF); const long codcont = get_int(LVRCONDV_CODCONT); TLocalisamfile rcondv(LF_LVRCONDV); rcondv.put(LVRCONDV_CODCF, codcf); rcondv.put(LVRCONDV_CODCONT, codcont); rcondv.put(LVRCONDV_CODART, codart); int err = rcondv.read(); //se il record esiste if (err == NOERR) { rcondv.put(LVRCONDV_CODCF, codcf); rcondv.put(LVRCONDV_CODCONT, codcont); rcondv.put(LVRCONDV_CODART, codart); rcondv.put(fieldname, nmr); err = rcondv.rewrite(); } return err; } //fa l'update di una riga del contratto int TLaundry_contract::update_row(const char* codart, const char* fieldname, const TDate& data) { const long codcf = get_int(LVRCONDV_CODCF); const long codcont = get_int(LVRCONDV_CODCONT); TLocalisamfile rcondv(LF_LVRCONDV); rcondv.put(LVRCONDV_CODCF, codcf); rcondv.put(LVRCONDV_CODCONT, codcont); rcondv.put(LVRCONDV_CODART, codart); int err = rcondv.read(); //se il record esiste if (err == NOERR) { rcondv.curr().zero(); rcondv.put(LVRCONDV_CODCF, codcf); rcondv.put(LVRCONDV_CODCONT, codcont); rcondv.put(LVRCONDV_CODART, codart); rcondv.put(fieldname, data); err = rcondv.rewrite(); } return err; } // Legge un contratto tramite la chiave primaria cliente+codice bool TLaundry_contract::read(const long codcf, const long codcont) { if (codcf > 0 && codcont > 0) // Campi obbligatori! { TString16 key; key.format("%ld|%ld", codcf, codcont); *((TRectype*)this) = cache().get(LF_LVCONDV, key); } else zero(); return ok(); } // Cerca il contratto in essere alla data di un certo cliente+indirizzo bool TLaundry_contract::read(const long codcf, const long indsped, const TDate& data) { const long codcont = lv_find_contract(codcf, indsped, data); return read(codcf, codcont); } // Inizializza un contratto vuoto: servira' una read successiva TLaundry_contract::TLaundry_contract() : TRectype(LF_LVCONDV) { zero(); } TLaundry_contract::TLaundry_contract(const TRectype & rec): TRectype(rec) { } // Inizializza un contratto in base alla chiave primaria TLaundry_contract::TLaundry_contract(const long codcf, const long codcont) : TRectype(LF_LVCONDV) { read(codcf, codcont); } // Tenta di inizilizzare il contratto corrente di un cliente TLaundry_contract::TLaundry_contract(const long codcf, const long indsped, const TDate& data) : TRectype(LF_LVCONDV) { read(codcf, indsped, data); } /////////////////////////////////////////////////////////// // TRecmag_lavanderie /////////////////////////////////////////////////////////// void TRecmag_lavanderie::update() { if (_update_time > 0L) return; _update_time = 1L; TString query, filter; const int anno = get_int(CLIFOGIAC_ANNOES); const TString4 tipocf(get(CLIFOGIAC_TIPOCF)); const long codcf = get_long(CLIFOGIAC_CODCF); const int indsped = get_int(CLIFOGIAC_INDSPED); const TString80 codart(get(CLIFOGIAC_CODART)); const TString80 livello(get(CLIFOGIAC_LIVELLO)); const TDate oggi(TODAY); TDate imese; TEsercizi_contabili & esc = esercizi(); const TArticolo & artrec = cached_article(codart); if (anno >= esc.date2esc(oggi)) { imese = oggi; imese.set_day(1); } else imese = esc.esercizio(anno).fine(); query="USE MOVMAG KEY 2\n"; query << "SELECT (TIPOCF='C')&&(CODCF==" << codcf << ")&&(STR(CODINDSP==" << indsped << "))&&(BETWEEN(DATACOMP," << imese.date2ansi() << "," << oggi.date2ansi() << "))\n"; query << "FROM ANNOES=" << anno << "\n"; query << "TO ANNOES=" << anno << "\n"; TISAM_recordset recmag(query); for (bool ok=recmag.move_first(); ok; ok=recmag.move_next()) { const TDate datareg = recmag.get(MOVMAG_DATAREG).as_date(); TString queryrmag="USE RMOVMAG\n"; queryrmag << " SELECT (CODART=\"" << codart << "\")&&(LIVGIAC=\"" << livello << "\")\n"; queryrmag << "FROM NUMREG=" << recmag.get(MOVMAG_NUMREG) << "\n" << "TO NUMREG=" << recmag.get(MOVMAG_NUMREG) << "\n"; TISAM_recordset recrmag(queryrmag); for (bool ok=recrmag.move_first(); ok; ok=recrmag.move_next()) { const TString& codcaus = recrmag.get(RMOVMAG_CODCAUS).as_string(); const TCausale_magazzino & tcaus = cached_causale_magazzino(codcaus.full() ? codcaus : recmag.get(MOVMAG_CODCAUS).as_string()); int sgn_consmese = tcaus.sgn(s_consmese); if (sgn_consmese != 0) { const TString4 um = recrmag.get(RMOVMAG_UM).as_string(); const real qta = ((TArticolo &)artrec).convert_to_um(recrmag.get(RMOVMAG_QUANT).as_real(), NULL,um); _consmese += real(qta * sgn_consmese); } } } } int TRecmag_lavanderie::name2index(const char* fieldname) const { if (strcmp(fieldname, "CONSMESE") == 0) return 0; return -1; } TFieldtypes TRecmag_lavanderie::type(const char* fieldname) const { if (name2index(fieldname) >= 0) return _realfld; return TRectype::type(fieldname); } int TRecmag_lavanderie::length(const char* fieldname) const { if (name2index(fieldname) >= 0) return 15; return TRectype::length(fieldname); } int TRecmag_lavanderie::ndec(const char* fieldname) const { if (name2index(fieldname) >= 0) return 5; return TRectype::ndec(fieldname); } bool TRecmag_lavanderie::exist(const char* fieldname) const { if (name2index(fieldname) >= 0) return true; return TRectype::exist(fieldname); } const TString & TRecmag_lavanderie::get_str(const char* fieldname) const { const int index = name2index(fieldname); if (index >= 0) ((TRecmag_lavanderie *)this)->update(); switch (index) { case 0: return get_tmp_string() = _consmese.string(); default: break; } // rec.put(CLIFOGIAC_DOTOD, oldrec.get(CLIFOGIAC_DOTOD)); // rec.put(CLIFOGIAC_DOTIN, oldrec.get(CLIFOGIAC_DOTIN)); return TVariable_rectype::get_str(fieldname); } TRecmag_lavanderie::TRecmag_lavanderie() : TVariable_rectype(LF_CLIFOGIAC) { } TObject* TRecmag_lavanderie::dup() const { TRecmag_lavanderie* o = new TRecmag_lavanderie(*this); return o; } /////////////////////////////////////////////////////////// // TArticolo_lavanderie /////////////////////////////////////////////////////////// const TString & TArticolo_lavanderie::get_str(const char* fieldname) const { if (*fieldname != '#') return TRectype::get_str(fieldname); char * fname = (char *) fieldname + 1; const int logicnum = atoi(fname); if (logicnum != LF_CLIFOGIAC) return TArticolo_giacenza_data::get_str(fieldname); const char * op1 = strchr(fname, '_'); int index = 0; if (op1) { op1=op1+1; fname = (char *) op1; if (*op1 == '#') index = atoi(fname + 1); } const char * op2 = strchr(fname, '_'); if (op2) { op2=op2+1; fname = (char *) op2 + 1; } const char * op3 = strchr(fname, '_'); if (op3) { op3=op3+1; fname = (char *) op3 + 1; } const char * op4 = strchr(fname, '_'); if (op4) { op4=op4+1; fname = (char *) op2 + 1; } const char * op5 = strchr(fname, '_'); if (op5) op5=op5+1; const char * op6 = strstr(fname, "->"); CHECKS(op6, "Can't find '->' in string ", fieldname); op6=op6+2; if (logicnum == LF_CLIFOGIAC && op2 && op3 && op4) { ((TArticolo_lavanderie *)this)->set_tipocf(*op2); ((TArticolo_lavanderie *)this)->set_codcf(atol(op3)); ((TArticolo_lavanderie *)this)->set_indsped(atol(op4)); if (index == 0) index = find_clifomag(op1, op5); if (index > 0) return clifomag(op1).row(index).get(op4); } return EMPTY_STRING; } void TArticolo_lavanderie::set_body_key(TRectype & rowrec) { const int logicnum = rowrec.num(); const char * cod = (const char *) codice(); switch (logicnum) { case LF_CLIFOGIAC: rowrec.put(CLIFOGIAC_ANNOES, _anno_lav); rowrec.put(CLIFOGIAC_CODART, cod); rowrec.put(CLIFOGIAC_TIPOCF, _tipocf); rowrec.put(CLIFOGIAC_CODCF, _codcf); rowrec.put(CLIFOGIAC_INDSPED, _indsped); break; default: TArticolo_giacenza_data::set_body_key(rowrec); break; } } void TArticolo_lavanderie::set_anno_lav (int anno) { if (_anno_lav != anno) remove_body(LF_CLIFOGIAC); _anno_lav = anno; } TRectype * TArticolo_lavanderie::new_body_record(int logicnum) { if (logicnum == LF_CLIFOGIAC) return new TRecmag_lavanderie(); return new TRectype(logicnum ? logicnum : TArticolo_giacenza_data::num()); } int TArticolo_lavanderie::find_clifomag(TRecord_array& rclifomag, const char * livello, int from) const { const int last = rclifomag.last_row(); if (last > 0 && from < last) { const int livello_len = livello ? strlen(livello) : 0; if (livello_len == 0) return from + 1; for (int i = rclifomag.succ_row(from); i <= last; i = rclifomag.succ_row(i)) { const TRectype & rec = rclifomag.row(i); if (livello_len == 0 || rec.get(CLIFOGIAC_LIVELLO).compare(livello, livello_len) == 0) return i; } } return -1; } int TArticolo_lavanderie::find_clifomag(int annoes, const char * livello, int from) const { TRecord_array & rclifomag = clifomag(annoes); return find_clifomag(rclifomag, livello, from); } TRecord_array & TArticolo_lavanderie::clifomag(int annoes) const { ((TArticolo_lavanderie*)this)->set_anno_lav(annoes > 0 ? annoes : esercizi().last_mag()); TRecord_array & recarr = body(LF_CLIFOGIAC); if (recarr.rows() == 0) { TString query; const char * cod = (const char *) codice(); const int esprec = esercizi().pred(annoes); query << "USE " << LF_CLIFOGIAC << "\n"; query << "FROM " << CLIFOGIAC_ANNOES << '=' << esprec << ' ' << CLIFOGIAC_TIPOCF << '=' << _tipocf << ' ' << CLIFOGIAC_CODCF << '=' << _codcf << ' ' << CLIFOGIAC_INDSPED << '=' << _indsped << ' ' << CLIFOGIAC_CODART << '=' << cod << '\n'; query << "TO " << CLIFOGIAC_ANNOES << '=' << esprec << ' ' << CLIFOGIAC_TIPOCF << '=' << _tipocf << ' ' << CLIFOGIAC_CODCF << '=' << _codcf << ' ' << CLIFOGIAC_INDSPED << '=' << _indsped << ' ' << CLIFOGIAC_CODART << '=' << cod << '\n'; TISAM_recordset recmag(query); for (bool ok=recmag.move_first(); ok; ok=recmag.move_next()) { const TRecmag_lavanderie oldrec(recmag.cursor()->curr()); const int r = recarr.add_row(oldrec); TRecmag_lavanderie & rec = (TRecmag_lavanderie &) recarr[r]; rec.put(CLIFOGIAC_ANNOES, annoes); ::reset_clifogiac(rec, oldrec); } } return recarr; } const TRecmag_lavanderie & TArticolo_lavanderie::find_rec(int annoes) const { static TRecmag_lavanderie __rec; const int i = find_clifomag(annoes); if (i >= 0) return (const TRecmag_lavanderie &) clifomag(annoes).row(i); __rec.zero(); return __rec; } TArticolo_lavanderie::TArticolo_lavanderie(const char* codice, const char tipocf, const long codcf, const int indsped) : TArticolo_giacenza_data(codice), _anno_lav(0), _tipocf(tipocf), _codcf(codcf), _indsped(indsped) { add_file(LF_CLIFOGIAC ,"NRIGA"); } TArticolo_lavanderie::TArticolo_lavanderie(const TRectype & rec, const char tipocf, const long codcf, const int indsped) : TArticolo_giacenza_data(rec), _anno_lav(0), _tipocf(tipocf), _codcf(codcf), _indsped(indsped) { add_file(LF_CLIFOGIAC ,"NRIGA"); } /////////////////////////////////////////////////////////// // TCache_articoli_lavanderie /////////////////////////////////////////////////////////// class TCache_articoli_lavanderie : public TRecord_cache { protected: virtual TObject* rec2obj(const TRectype& rec) const { return new TArticolo_lavanderie(rec);} public: TArticolo_lavanderie& lav(const char* key) { return (TArticolo_lavanderie&)query(key); } TCache_articoli_lavanderie(); virtual ~TCache_articoli_lavanderie() { } }; TCache_articoli_lavanderie::TCache_articoli_lavanderie() : TRecord_cache(LF_ANAMAG, 1) { test_file_changes(); // Tieni d'occhio le modifiche sul file set_items_limit(256); // Standard } TArticolo_lavanderie & cached_article_laundry(const char * codart, const char tipocf, const long codcf, const int indsped) { HIDDEN TCache_articoli_lavanderie __cache_articoli_lavanderie; TArticolo_lavanderie & art = __cache_articoli_lavanderie.lav(codart); art.set_tipocf(tipocf); art.set_codcf(codcf); art.set_indsped(indsped); return art; } /////////////////////////////////////////////////////////// // TLavanderie_calendar /////////////////////////////////////////////////////////// // Serve per aggiungere le feste dei Patroni void TLavanderie_calendar::set_holiday(const TDate & date, bool holiday) { if (_year == date.year()) { const TDate inizio(1, 1, _year); long ndays = date - inizio; _days.set(ndays, holiday); } } bool TLavanderie_calendar::is_holiday(const TDate& date) const { if (_year == date.year()) { const TDate inizio(1, 1, _year); long ndays = date - inizio; return _days[ndays]; } return false; } int TLavanderie_calendar::read(int year) { if (year != 0) _year = year; TConfig cfg(CONFIG_DITTA); const TString val = cfg.get("CAL", "lv", _year); if (val.full()) { const int len = val.len(); for (int i = 0; i < len; i++) _days.set(i, val[i] == 'X'); } else { const TDate inizio(1, 1, _year); const TDate fine(31, 12, _year); TDate data(inizio); for (int i = 0; data <= fine; ++data, i++) _days.set(i, data.is_holiday()); } return NOERR; } int TLavanderie_calendar::write() const { TString val(366); const TDate inizio(1, 1, _year); const TDate fine(31, 12, _year); TDate data(inizio); TConfig cfg(CONFIG_DITTA); for (int i = 0; data <= fine; ++data, i++) val << (_days[i] ? 'X' : '-'); cfg.set("CAL", val, "lv", true, _year); return NOERR; } int TLavanderie_calendar::remove() const { TString val(366); TConfig cfg(CONFIG_DITTA); const TDate inizio(1, 1, _year); const TDate fine(31, 12, _year); TDate data(inizio); for (int i = 0; data <= fine; ++data, i++) val << data.is_holiday() ? 'X' : '-'; cfg.set("CAL", val, "lv", true, _year); return NOERR; } TLavanderie_calendar::TLavanderie_calendar(const int year) : _year(year) { read(); } /////////////////////////////////// //// TCausale_lavanderie //// /////////////////////////////////// TCausale_lavanderie::TCausale_lavanderie(const char * codice): TRectype(cache().get("&CAU", codice)), _rit(caurit()), _cons(caucon()) { } //////////////////////// //// TDOC_KEY //// //////////////////////// //CODNUM: metodo che restituisce il codnum dalla TToken_string chiave dei documenti const char TDoc_key::provv() { return get(0)[0]; } //ANNO: metodo che restituisce l'anno dalla TToken_string chiave dei documenti const int TDoc_key::anno() { return get_int(1); } //CODNUM: metodo che restituisce il codnum dalla TToken_string chiave dei documenti const char* TDoc_key::codnum() { return get(2); } //NDOC: metodo che restituisce il numero documento dalla TToken_string chiave dei documenti const long TDoc_key::ndoc() { return get_int(3); } //metodi costruttori TDoc_key::TDoc_key(const int anno, const TString& codnum, const long ndoc, const char provv) { add(provv); add(anno); add(codnum); add(ndoc); } ///////////////////////////////////////////////////// //// TBUONO_PRELIEVO & TBUONO_PRELIEVO_ROW //// ///////////////////////////////////////////////////// //classe TBuono_prelievo //CHIAVE: metodo che restituisce una TToken_string (da castare a TDoc_key) che contiene la chiave del documento const TToken_string& TBuono_prelievo::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 restituisce la data del documento const TDate TBuono_prelievo::datadoc() const { return get_date(DOC_DATADOC); } //CODCONT: metodo che restituisce il codice contratto const long TBuono_prelievo::codcont() const { return get_long(DOC_CODCONT); } //SET_DATAPRCO: metodo che setta la data di prevista consegna void TBuono_prelievo::set_dataprco(const TDate& data) { put("DATAPRCO", data); } //SET_ITINERARIO: metodo che setta il codice dell'itinerario void TBuono_prelievo::set_itinerario(const int coditi) { put("CODITI", coditi); } //SET_CONRTATTO: metodo che setta il codice contratto void TBuono_prelievo::set_contratto(const int codcont) { put("CODCONT", codcont); } //classe TBuono_prelievo_row //EVASO: metodo che indica se la riga in questione ha il flag di evaso a true const bool TBuono_prelievo_row::evaso() const { return _rdoc.get_bool(RDOC_RIGAEVASA); } //CODART: metodo che restiuisce il codice articolo di quella riga const TString& TBuono_prelievo_row::codart() const { return _rdoc.get(RDOC_CODART); } //DESART: metodo che restituisce la descrizione dell'articolo const TString& TBuono_prelievo_row::desart() const { TString& str = get_tmp_string(); str = _rdoc.get(RDOC_DESCR); if (_rdoc.get_bool(RDOC_DESCLUNGA)) str << _rdoc.get(RDOC_DESCEST); return str; } //CAUSALE: metodo che restituisce il codice della causale della riga const TString& TBuono_prelievo_row::causale() const { return _rdoc.get(RDOC_CODAGG1); } //QTA_RITIRATA: metodo che restituisce la quantità ritirata const long TBuono_prelievo_row::qta_ritirata() const { return _rdoc.get_long(RDOC_QTAGG1); } //QTA_DACONS: metodo che restituisce la quantità da consegnare const long TBuono_prelievo_row::qta_dacons() const { return _rdoc.get_long(RDOC_QTA); } //QTA_CONSEGNATA: metodo che restituisce la quantità effettivamente consegnata const long TBuono_prelievo_row::qta_consegnata() const { return _rdoc.get_long(RDOC_QTAEVASA); } //NUM_PACCHI: metodo che restituisce il numero dei pacchi consegnati const int TBuono_prelievo_row::num_pacchi() const { return _rdoc.get_int(RDOC_NCOLLI); } //CONG_PRE: metodo che restituisce il valore del conguaglio al momento dell'inizio delle operazioni const long TBuono_prelievo_row::cong_pre() const { return _rdoc.get_long("CONGPRE"); } //CONG_ATT: metodo che restituisce il valore del conguaglio al termine dell'operazione attuale const long TBuono_prelievo_row::cong_att() const { return _rdoc.get_long("CONGATT"); } //RIFBCON: metodo che restituisce i riferimenti al buono di consegna associato const TToken_string& TBuono_prelievo_row::rifbcon() const { TToken_string& kdoc = get_tmp_string(); kdoc = _rdoc.get("RIFBCON"); return kdoc; } //RIFBRIT: metodo che restituisce i riferimenti al buono di ritiro associato const TToken_string& TBuono_prelievo_row::rifbrit() const { TToken_string& kdoc = get_tmp_string(); kdoc = _rdoc.get("RIFBRIT"); return kdoc; } //SET_EVASO: metodo che setta il contenuto del flag evaso void TBuono_prelievo_row::set_evaso(const bool evaso) { _rdoc.put(RDOC_RIGAEVASA, evaso); } //SET_CODART: metodo che setta il codice articolo void TBuono_prelievo_row::set_codart(const char* codart) { _rdoc.put(RDOC_CODART, codart); } //SET_DESART: metodo che setta la descrizione void TBuono_prelievo_row::set_desart(const TString& desart) { if (desart.len() > 50) { _rdoc.put(RDOC_DESCR, desart.left(50)); _rdoc.put(RDOC_DESCLUNGA, true); _rdoc.put(RDOC_DESCEST, desart.mid(50)); } else _rdoc.put(RDOC_DESCR, desart); } //SET_CAUSALE: metodo che setta la causale sulla riga void TBuono_prelievo_row::set_causale(const char* causale) { _rdoc.put(RDOC_CODAGG1, causale); } //SET_QTA_RITIRATA: metodo che setta la quantità ritirata sulla riga void TBuono_prelievo_row::set_qta_ritirata(const long qta) { _rdoc.put(RDOC_QTAGG1, qta); } //SET_QTA_DACONS: metodo che setta la quyantità da consegnare void TBuono_prelievo_row::set_qta_dacons(const long qta) { _rdoc.put(RDOC_QTA, qta); } //SET_QTA_CONSEGNATA: metodo che setta la quantita consegnata void TBuono_prelievo_row::set_qta_consegnata(const long qta) { _rdoc.put(RDOC_QTAEVASA, qta); } //SET_NUM_PACCHI: metodo che setta il numero dei pacchi void TBuono_prelievo_row::set_num_pacchi(const int numpacchi) { _rdoc.put(RDOC_NCOLLI, numpacchi); } //SET_CONG_PRE: metodo che setta il valore del conguaglio precedente void TBuono_prelievo_row::set_cong_pre(const long qtacong) { _rdoc.put("CONGPRE", qtacong); } //SET_CONG_ATT: metodo che setta il valore del conguaglio attuale void TBuono_prelievo_row::set_cong_att(const long qtacong) { _rdoc.put("CONGATT", qtacong); } //SET_RIFBCON: metodo che setta i riferimenti al buono di consegna associato void TBuono_prelievo_row::set_rifbcon(const TToken_string& keybcon) { TString str = keybcon; str.replace('|', ' '); _rdoc.put("RIFBCON", str); } //SET_RIFBRIT: metodo che setta i riferimenti al buono di ritiro associato void TBuono_prelievo_row::set_rifbrit(const TToken_string& keybrit) { TString str = keybrit; str.replace('|', ' '); _rdoc.put("RIFBRIT", str); } //ADD_QTA_CONSEGNATA: metodo che somma una quantita alla quantità presente in una riga documento void TBuono_prelievo_row::add_qta_consegnata(const long qta) { _rdoc.add(RDOC_QTAEVASA, qta); } //ADD_PACCHI: metodo che aggiunge un certo numero di pacchi al numero presente sulla riga void TBuono_prelievo_row::add_pacchi(const int nmr) { _rdoc.add(RDOC_NCOLLI, nmr); } /////////////////////////// //// TRIGA_PACCO //// /////////////////////////// //READ: cerca una riga pacco in base alla chiave primaria bool TRiga_pacco::read(const TString& codpacco, const long codriga) { if (codpacco.full()) // Campo obbligatorio! { TString80 key; key.format("%s|%ld", codpacco, codriga); *((TRectype*)this) = cache().get(LF_PACCHI, key); } else zero(); return ok(); } //CODPACCO: metodo che restituisce il codice univoco del pacco const TString& TRiga_pacco::codpacco() const { return get(PACCHI_CODPACCO); } //KEY: metodo che restiuisce la chiave univoca del record analizzato (per le lavanderie CODRIGA sempre 1) const TToken_string& TRiga_pacco::key() const { TToken_string& k = get_tmp_string(); k.add(get(PACCHI_CODPACCO)); k.add(get(PACCHI_CODRIGA)); return k; } //ARTICOLO: metodo che restituisce il codice articolo specificato in questa riga const TString& TRiga_pacco::articolo() const { return get(PACCHI_CODART); } //QUANTITA: metodo che restituisce il numero dei pezzi nella confezione const real TRiga_pacco::quantita() const { return get_real(PACCHI_QTA); } //UM: metodo che restituisce l'unità di misura const TString& TRiga_pacco::um() const { return get(PACCHI_UM); } //DATA: metodo che restituisce la data in cui il pacco è creato const TDate TRiga_pacco::data() const { return get_date(PACCHI_DATA); } //CLIENTE; metodo che restituisce il codice del cliente a cui è stato assegnato il pacco const long TRiga_pacco::cliente() const { return get_long(PACCHI_CODCF); } //DATA: metodo che restituisce la data in cui il pacco è stato assegnato a qualcuno const TDate TRiga_pacco::databo() const { return get_date(PACCHI_DATABO); } //ANNULLATO: metodo che ritorna true se il pacco è stato annullato const bool TRiga_pacco::annullato() const { return get_bool(PACCHI_ANNULLATO); } //RIGABOLLA: metodo che restituisce una TToken_string contenete alla riga del documento che ha consegnato il pacco const TToken_string& TRiga_pacco::rigabolla() const { TToken_string& bolla = get_tmp_string(); bolla.add(get_char(PACCHI_PROVV)); bolla.add(get_int(PACCHI_ANNO)); bolla.add(get(PACCHI_CODNUM)); bolla.add(get_int(PACCHI_NDOC)); bolla.add(get_int(PACCHI_IDRIGA)); return bolla; } //MOVMAG: metodo che restituisce i riferimenti al movimento di magazzino generato dal pacco const long TRiga_pacco::movmag() const { return get_long(PACCHI_MGNUMREG); } //SET_KEY: metodo che setta la chiave (da usare su un TRiga_pacco vuota) void TRiga_pacco::set_key(const char* codpacco, const int codriga) { put(PACCHI_CODPACCO, codpacco); put(PACCHI_CODRIGA, codriga); } //SET_ARTICOLO: metodo che setta il codice articolo sul record corrente void TRiga_pacco::set_articolo(const char* codart) { put(PACCHI_CODART, codart); } //SET_QUANTITA: metodo che setta la quantita sul record corrente void TRiga_pacco::set_quantita(const real qta) { put(PACCHI_QTA, qta); } //SET_UM: metodo che setta l'unità di misura void TRiga_pacco::set_um(const char* um) { put(PACCHI_UM, um); } //SET_DATA: metodo che setta la data di creazione del record corrente void TRiga_pacco::set_data(const TDate& data) { put(PACCHI_DATA, data); } //SET_CLIENTE: metodo che setta il codice cliente sul record corrente void TRiga_pacco::set_cliente(const long codcf) { put(PACCHI_CODCF, codcf); } //SET_DATA: metodo che setta la data di evasione sul record corrente void TRiga_pacco::set_databo(const TDate& data) { put(PACCHI_DATABO, data); } //SET_ANNULLATO: metodo che setta il flag di annullato void TRiga_pacco::set_annullato(const bool ann) { put(PACCHI_ANNULLATO, ann); } //SET_RIGABOLLA: metodo che setta i riferimenti alla riga di bolla che evade il pacco sul record corrente void TRiga_pacco::set_rigabolla(const int anno, const char* codnum, const long ndoc, const long idriga) { put(PACCHI_PROVV, 'D'); put(PACCHI_ANNO, anno); put(PACCHI_CODNUM, codnum); put(PACCHI_NDOC, ndoc); put(PACCHI_IDRIGA, idriga); } //SET_MOVMAG: metodo che setta il movimento di magazzino generato dal pacco void TRiga_pacco::set_movmag(const long movmag) { put(PACCHI_MGNUMREG, movmag); } //IS_ANNULATO: metodo che restituisce "true" se il campo annullato sul record attuale è 'S' bool TRiga_pacco::is_annullato() { return get_bool(PACCHI_ANNULLATO); } //IS_ASSOCIATO: metodo che restitusce "true" se il campo cliente è valorizzato bool TRiga_pacco::is_associato() { return get_int(PACCHI_CODCF) && 1; } //Metodi costruttori TRiga_pacco::TRiga_pacco(const TRectype& rec) : TRectype(rec) { } TRiga_pacco::TRiga_pacco(const TRiga_pacco& rpacco) : TRectype(rpacco) { } TRiga_pacco::TRiga_pacco(const char* codpacco, const long codriga) : TRectype(LF_PACCHI) { read(codpacco, codriga); } TRiga_pacco::TRiga_pacco() : TRectype(LF_PACCHI) { zero(); }