#include #include #include #include #include #include #include #include #include "effetti.h" #include "ef0.h" #include "ef0200.h" class Creazione_Effetti_da_EC : public TApplication { TMask * _msk; TArray_sheet * _Partite_aperte; real _residuo; void Load_Partite_Aperte(const long cli); static bool Gen_Handler(TMask_field& f, KEY k); static bool Gen_Notify(TSheet_field& sheet, int r, KEY k); static bool Cli_Handler(TMask_field& f, KEY k); virtual bool create(); virtual bool destroy(); virtual bool menu(MENU_TAG m); public: real get_res() {return _residuo;} void set_res(const real& a) {_residuo = a;} TMask* get_msk() {return _msk;} Creazione_Effetti_da_EC() : _residuo(0.0) {} }; inline Creazione_Effetti_da_EC& app() {return (Creazione_Effetti_da_EC&)main_app();} void Creazione_Effetti_da_EC::Load_Partite_Aperte(const long cli) { /* Caricamento partite aperte da E.C. Questo che segue e' pseudo-codice; andra' verificato non appena sara' completato lo scadenziario. TLocalisamfile Ec(LF_........); * Carica tutte le partite aperte del cliente * Ec.zero(); Ec.put(EC_CODCLI,cli); Ec.read(); Finche' si tratta dello stesso cliente... while (Ec.good() && Ec.get_long(EC_CODCLI) == cli) { Controlla se la partita esaminata e' aperta... if (Ec.get(EC_APERTA)) { Con questo le carica tutte nello sheet... TToken_string riga(80); riga.cut(0); riga.add(Ec.get(EC_ANNO)); riga.add(Ec.get(EC_NUMERO)); riga.add(Ec.get(EC_DATADOC)); riga.add(Ec.get(EC_SALDO)); _Partite_aperte->add(riga); } Legge il prossimo record Ec.next() } */ TToken_string riga(80); riga.cut(0); riga.add(""); riga.add("1994"); riga.add("1"); riga.add("10-11-94"); riga.add("19000000"); _Partite_aperte->add(riga); riga.cut(0); riga.add(""); riga.add("1994"); riga.add("2"); riga.add("11-11-94"); riga.add("18000000"); _Partite_aperte->add(riga); riga.cut(0); riga.add(""); riga.add("1994"); riga.add("3"); riga.add("16-11-94"); riga.add("23009000"); _Partite_aperte->add(riga); riga.cut(0); riga.add(""); riga.add("1994"); riga.add("4"); riga.add("19-11-94"); riga.add("450600"); _Partite_aperte->add(riga); } bool Creazione_Effetti_da_EC::Gen_Handler(TMask_field& f, KEY k) { if (k==K_TAB && f.focusdirty()) { real importo=(real)(const char*)f.mask().get(F_RATA); importo+=(real)(const char*)f.mask().get(F_SPESE); importo+=(real)(const char*)f.mask().get(F_BOLLI); f.mask().set(F_IMPEFF,importo.string(".")); f.set_focusdirty(FALSE); } return TRUE; } bool Creazione_Effetti_da_EC::Gen_Notify(TSheet_field& sheet, int r, KEY k) { if (k == K_CTRL + K_DEL) return TRUE; if (k == K_INS) { if (app().get_res().is_zero()) { warning_box("Residuo da ripartire gia' annullato"); return FALSE; } else return TRUE; } TToken_string & row = sheet.row(r); const real importo(row.get(1)); static real old_rata; switch (k) { case K_SPACE: old_rata = importo; break; case K_DEL: { const real new_res = app().get_res() + importo; app().set_res(new_res); } break; case K_ENTER: { const real new_res = app().get_res() - importo + old_rata; if (new_res < ZERO) { warning_box("Non e' possibile superare l'importo da ripartire"); if (old_rata.is_zero()) { row.add(app().get_res().string(),1); app().set_res(ZERO); } else row.add(old_rata.string(),1); } else app().set_res(new_res); real totale = importo; totale+= real(row.get(2)); totale+= real(row.get(3)); row.add(totale.string(),4); } break; default: break; } sheet.mask().set(F_RESIDUO,app().get_res().string(".")); return TRUE; } bool Creazione_Effetti_da_EC::Cli_Handler(TMask_field&f, KEY k) { if (f.focusdirty()) { TSheet_field& sheet =(TSheet_field&)f.mask().field(F_SHEET_EFF); sheet.reset(); sheet.force_update(); } return TRUE; } bool Creazione_Effetti_da_EC::create() { _msk = new TMask("ef0200a"); TSheet_field& sheet = (TSheet_field&) _msk->field(F_SHEET_EFF); sheet.set_notify(Gen_Notify); sheet.enable_column(4,FALSE); TMask& mask= sheet.sheet_mask(); mask.set_handler(F_RATA,Gen_Handler); mask.set_handler(F_SPESE,Gen_Handler); mask.set_handler(F_BOLLI,Gen_Handler); _msk->set_handler(F_CODCF,Cli_Handler); dispatch_e_menu(BAR_ITEM(1)); return TRUE; } bool Creazione_Effetti_da_EC::destroy() { if (_msk != NULL) delete _msk; return TRUE; } bool Creazione_Effetti_da_EC::menu(MENU_TAG) { KEY tasto; do { tasto=get_msk()->run(); switch (tasto) { case K_ENTER: // first check if the application can write effects { TSheet_field& sheet =(TSheet_field&)get_msk()->field(F_SHEET_EFF); if (!_residuo && sheet.items()>0) message_box("Perform writing procedure..."); break; } case K_F6: //Selects opened counts from E.C. { _residuo=0.0; _Partite_aperte = new TArray_sheet(-1,-1,0,0,"Selezione partite aperte","@1|Anno|Numero|Data documento|Saldo@15"); Load_Partite_Aperte(get_msk()->get_long(F_CODCF)); _Partite_aperte->run(); for (int i=0; i<_Partite_aperte->items(); i++) if (_Partite_aperte->checked(i)) _residuo+=(real)_Partite_aperte->row(i).get(4); delete _Partite_aperte; get_msk()->set(F_RESIDUO,_residuo.string(".")); TSheet_field& sheet = (TSheet_field&)get_msk()->field(F_SHEET_EFF); sheet.reset(); break; } default: break; } } while (tasto!=K_QUIT); return FALSE; } int ef0200(int argc, char* argv[]) { Creazione_Effetti_da_EC a ; a.run(argc, argv, "Creazione effetti da E.C."); return 0; }