#include "../ve/ve0100.h" #include "../ve/veini.h" #include "../ve/veuml.h" #include "../ve/verig.h" #include "../ve/vepriv.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 void arrotonda(const TMask& msk, real& quantita); static bool lv_bolla_handler(TMask_field& f, KEY k); static bool lv_ritirato_handler(TMask_field& f, KEY k); static bool lv_consegnato_handler(TMask_field& f, KEY k); static bool lv_codart_handler(TMask_field& f, KEY k); public: virtual void user_set_handler( short fieldid, int index); virtual void user_set_row_handler(TMask& rm, short field, int index); TGestione_bolle_msk(const char* tipodoc) : TDocumento_mask(tipodoc) {} }; void TGestione_bolle_msk::arrotonda(const TMask& msk, real& quantita) { const TString& codart = msk.get(FR_CODART); //instanzio una cache sulla tabella del magazzino const TRectype& anamag = cache().get(LF_ANAMAG,codart); //recupero i dati di interesse dall'anagrafica di magazzino const long ppconf = anamag.get_long(ANAMAG_PPCONF); if (ppconf > 0) { TDocumento_mask& dmsk = (TDocumento_mask&) msk.get_sheet()->mask(); //recupero dal documento i dati di interesse per recuperare... //...i dati dalla riga contratto const long codcf = dmsk.get_long(F_CODCF); const int indsped = dmsk.get_int(F_CODINDSP); TDate datadoc = dmsk.get_date(F_DATADOC); if (!datadoc.ok()) datadoc = TODAY; const TLaundry_contract cont(codcf, indsped, datadoc); //leggo la riga del contratto per l'articolo corrente const TRectype& rcont = cont.row(codart); //recupero i dati di interesse dalla riga del contratto if (rcont.get_bool(LVRCONDV_ARROT)) { //calcolo di quanti pezzi sforo const long arr = quantita.integer() % ppconf; //se sforo (arr > 0) allora calcolo quanti pezzi in pił gli devo dare e aggiorno la quantitą if (arr > 0) quantita += ppconf - arr; } } } bool TGestione_bolle_msk::lv_ritirato_handler(TMask_field& f, KEY k) { if (f.to_check(k, false) && !f.empty()) { TMask& msk = f.mask(); if (msk.field(FR_QTA).empty()) { real ritirato = f.get(); arrotonda(msk,ritirato); msk.set(FR_QTA,ritirato); } } return true; } bool TGestione_bolle_msk::lv_consegnato_handler(TMask_field& f, KEY k) { bool ok = true; switch(f.dlg()) { case FR_QTA: ok = qta_handler( f, k ); break; default: break; } if (ok && f.to_check(k) && !f.empty()) { TMask& msk = f.mask(); real ritirato = msk.get_real(FR_QTAGG1); real consegnato = f.get(); arrotonda(msk, consegnato); arrotonda(msk, ritirato); if (consegnato.integer() != ritirato.integer() && !yesno_box(TR("Si desidera consegnare una quantita' di merce diversa da quella ritirata?"))) f.set(ritirato.string()); else f.set(consegnato.string()); } return ok; } bool TGestione_bolle_msk::lv_codart_handler(TMask_field& f, KEY k) { bool ok = true; switch(f.dlg()) { case FR_CODART: ok = codart_handler( f, k ); break; default: break; } if (ok && f.to_check(k)) { TMask& msk = f.mask(); const TString& codart = msk.get(FR_CODART); TDocumento_mask& dmsk = (TDocumento_mask&) msk.get_sheet()->mask(); //recupero dal documento i dati di interesse per recuperare... //...i dati dalla riga contratto const long codcf = dmsk.get_long(F_CODCF); const int indsped = dmsk.get_int(F_CODINDSP); TDate datadoc = dmsk.get_date(F_DATADOC); if (!datadoc.ok()) datadoc = TODAY; const TLaundry_contract cont(codcf, indsped, datadoc); if (cont.row(codart).empty() && yesno_box(TR("L'articolo in esame non fa parte della dotazione standard di questo cliente." "Si desidera aggiungerla ai contratti?"))) cont.edit(); } return ok; } bool TGestione_bolle_msk::lv_bolla_handler(TMask_field& f, KEY k) { bool ok = true; switch(f.dlg()) { case F_CODCF: ok = TDocumento_mask::clifo_handler( f, k ); break; case F_DATADOC: ok = data_hndl( f, k ); break; default: break; } if (ok && k == K_TAB && f.focusdirty()) { f.set_focusdirty(false); TDocumento_mask& dmsk = (TDocumento_mask&)f.mask(); TDocumento& doc = dmsk.doc(); static long stcodcf = 0, stcodcont = 0; TSheet_field& sheet = dmsk.sfield(F_SHEET); int nrighe = sheet.items(); const long codcf = dmsk.get_long(F_CODCF); const int indsped = dmsk.get_int(F_CODINDSP); TDate datadoc = dmsk.get_date(F_DATADOC); if (!datadoc.ok()) datadoc = TODAY; const int anno = datadoc.year(); if (codcf <= 0) return true; const long codcont = lv_find_contract(codcf,indsped,datadoc); if (codcont <= 0) { warning_box(TR("Non ci sono contratti in essere alla data indicata")); return true; } if (stcodcf == codcf && stcodcont == codcont && nrighe > 0) return true; dmsk.mask2doc(); stcodcf = codcf; stcodcont = codcont; //elimino tutte le righe del documento doc.destroy_rows(); //tipo riga const TString& tprig = dmsk.get(F_LBTIPORIGA); //instanzio una cache sulla tabella dei contratti const TLaundry_contract tcont(codcf, codcont); //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_CODAGG1,rcont.get(LVRCONDV_CAUSLAV).as_string()); //elaborazione per il prezzo: o lo prendo dalle righe contratto, o dall'anagrafica magazzino if (prinbo) { const TString& sconto = rcont.get(LVRCONDV_SCONTPERC).as_string(); rdoc.put(RDOC_SCONTO, sconto); //controllo da dove devo prendere il prezzo real prezzo; if (tplis == 0) prezzo = rcont.get(LVRCONDV_PREZZO).as_real(); else prezzo = anamag.get_real(ANAMAG_COSTSTD); 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_row_handler(TMask& rm, short field, int index) { switch(index) { case 4101: rm.set_handler(field, lv_ritirato_handler); break; case 4102: rm.set_handler(field, lv_consegnato_handler); break; case 4103: rm.set_handler(field, lv_codart_handler); break; default : TDocumento_mask::user_set_row_handler(rm, field, index); break; } } void TGestione_bolle_msk::user_set_handler( short fieldid, int index) { switch(index) { case 4101: set_field_handler(fieldid, lv_bolla_handler); break; default : TDocumento_mask::user_set_handler(fieldid, index); break; } } // 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 lv3100( int argc, char* argv[]) { TGestione_bolle_app a; a.run( argc, argv, TR("Documenti di Trasporto")); return 0; }