#include "../ve/ve0100.h" #include "../ve/veini.h" #include "../ve/veuml.h" #include "lv0.h" #include "lvlib.h" #include "lvcondv.h" #include "lvrcondv.h" //definizione della maschera di inserimento class TGestione_bolle_msk : public TDocumento_mask { protected: static bool lv_bolla_handler(TMask_field& f, KEY k); public: virtual void user_set_handler( int fieldid, int index); TGestione_bolle_msk(const char* tipodoc):TDocumento_mask(tipodoc) {} }; bool TGestione_bolle_msk::lv_bolla_handler(TMask_field& f, KEY k) { bool ok = true; if (f.dlg() == F_CODCF) ok = TDocumento_mask::clifo_handler( f, k ); if (ok && k == K_TAB && f.focusdirty()) { TMask& msk = f.mask(); TDocumento_mask& dmsk = (TDocumento_mask&)msk; TDocumento& doc = dmsk.doc(); static long stcodcf = 0, stcodcont = 0; TSheet_field& sheet = dmsk.sfield(F_SHEET); int nrighe = sheet.items(); const long codcf = msk.get_long(F_CODCF); const int indsped = msk.get_int(F_CODINDSP); TDate datadoc = msk.get_date(F_DATADOC); if (!datadoc.ok()) datadoc = TODAY; const int anno = datadoc.year(); if (codcf <= 0) return false; const long codcont = lv_find_contract(codcf,indsped,datadoc); if (stcodcf == codcf && stcodcont == codcont && nrighe > 0) return false; if (codcont == 0) return warning_box(TR("Non ci sono contratti in essere alla data indicata")); dmsk.mask2doc(); stcodcf = codcf; stcodcont = codcont; //elimino tutte le righe del documento doc.destroy_rows(); //tipo riga const TString4 tprig = msk.get(F_LBTIPORIGA); //preparo la chiave per la tabella contratti TToken_string keycont; keycont.add(codcf); keycont.add(codcont); //instanzio una cache sulla tabella dei contratti const TRectype& tcont = cache().get(LF_LVCONDV,keycont); //estraggo i dati di interesse dalla cache const int tplis = tcont.get_int(LVCONDV_TIPOLIS); //tipo listino const bool prinbo = tcont.get_bool(LVCONDV_STPRZBOL); //prezzo in bolla //instanzio un recordset sulle righe del contratto considerato TISAM_recordset rcont("USE LVRCONDV\nFROM CODCF=#CODCF CODCONT=#CODCONT\nTO CODCF=#CODCF CODCONT=#CODCONT"); rcont.set_var("#CODCF",codcf); rcont.set_var("#CODCONT",codcont); //per ogni riga estraggo l'articolo, il relativo prezzo e l'eventaule sconto da applicare, //...riportati in bolla solo se necessario for (bool ok = rcont.move_first(); ok; ok = rcont.move_next()) { //creo una nuova riga documento TRiga_documento& rdoc = doc.new_row(tprig); //recupero i dati di interesse dalla riga del contratto e li inserisco sullo sheet const TString80 codart = rcont.get(LVRCONDV_CODART).as_string(); //instanzio una cache sulla tabella del magazzino const TRectype& anamag = cache().get(LF_ANAMAG,codart); rdoc.put(RDOC_CODART,codart); rdoc.put(RDOC_CODARTMAG,codart); rdoc.put(RDOC_CHECKED,'X'); rdoc.put(RDOC_DESCR,anamag.get(ANAMAG_DESCR)); rdoc.put(RDOC_UMQTA,rcont.get(LVRCONDV_UM).as_string()); rdoc.put(RDOC_CAUSMAG,rcont.get(LVRCONDV_CAUSLAV).as_string()); //elaborazione per il prezzo: o lo prendo dalle righe contratto, o dall'anagrafica magazzino if (prinbo) { TString16 scontostr = ""; TString16 prezzostr = ""; real prezzo; real sconto = rcont.get(LVRCONDV_SCONTPERC).as_real(); scontostr << sconto; //controllo da dove devo prendere il prezzo if (tplis == 0) prezzo = rcont.get(LVRCONDV_PREZZO).as_real(); else { prezzo = anamag.get_real(ANAMAG_COSTSTD); } prezzostr << prezzo; rdoc.put(RDOC_PREZZO,prezzo); } } dmsk.doc2mask(false); FOR_EACH_MASK_FIELD(dmsk, i, f) { if (f->has_check()) f->check(STARTING_CHECK); if (f->is_edit()) f->on_hit(); } } return ok; } void TGestione_bolle_msk::user_set_handler( int fieldid, int index) { if (index == 4101) set_field_handler(fieldid, lv_bolla_handler); else TDocumento_mask::user_set_handler(fieldid, index); } // Definizione della classe dell'applicazione motore class TGestione_bolle_app : public TMotore_application { protected: virtual TMask* get_mask( int mode ); public: TGestione_bolle_app() {} }; inline TGestione_bolle_app& gbapp() { return (TGestione_bolle_app &) main_app(); }; TMask* TGestione_bolle_app::get_mask( int mode ) { if (mode == MODE_INS || mode == MODE_MOD) { TString4 tipodoc; if (mode == MODE_MOD) tipodoc = get_relation()->curr().get(DOC_TIPODOC); // Lo prendo dalla relazione (Gelai) else tipodoc = TMotore_application::get_mask(MODE_QUERY)->get(F_TIPODOC); if (_doc_masks.objptr(tipodoc) == NULL) { TGestione_bolle_msk* m = new TGestione_bolle_msk(tipodoc); _doc_masks.add(tipodoc, m); const TTipo_documento& tdoc = m->doc().tipo(); const TString_array& handlers = tdoc.handlers(); FOR_EACH_ARRAY_ROW(handlers, i, row) { m->user_set_handler( row->get_int( 0 ), row->get_int( 1 ) ); } } } return TMotore_application::get_mask(mode); } int lv0600( int argc, char* argv[]) { TGestione_bolle_app a; a.run( argc, argv, TR("Documenti di Trasporto")); return 0; }