#include #include #include #include #include #include #include #include #include #include #include #include "ef0.h" #include "ef0301.h" #include "ef0500.h" class TRiba_form; class TDistinta_form; /////////////////////////////////////////////////////////////////////// // Classe per l'emissione di effetti e distinte su carta o su floppy // /////////////////////////////////////////////////////////////////////// class TEmissione: public TApplication { TMask* _msk; TRelation* _firmrel; // relazione di gestione dei dati della ditta corrente TLocalisamfile *_eff, *_reff, *_cession; TRiba_form *_formrb; TDistinta_form *_formdse; int _base_page_no; // numero della pagina base per la stampa del numero di pagina protected: virtual bool create(void); virtual bool destroy(void) ; virtual void on_firm_change(void); virtual bool menu(MENU_TAG); void conferma(void); virtual void print_rb(char tipost, int ndist, char tipodist, int ncopie, const bool is_vis); virtual void print_dse(char tipost, int ndist, char tipodist, int ncopie, const bool is_vis); virtual void print(void); void floppy(void); void aggiorna_rb(TCursor*); void aggiorna_dist(TCursor*); static bool annulla_handler(TMask_field& f, KEY k); public: int base_no() { return _base_page_no;} TEmissione() {}; virtual ~TEmissione() {}; }; // restituisce un riferimento all' applicazione inline TEmissione& app() { return (TEmissione&) main_app();} //////////////////////////////////////////////////////////// // Classe TRiba_form customizzata dalla Form per le Ri.Ba.// //////////////////////////////////////////////////////////// class TRiba_form: public TForm { protected: virtual bool validate(TForm_item &, TToken_string &); public: TRiba_form(const char *); virtual ~TRiba_form(){}; }; //////////////////////////////////////////////////////////////////// // Classe TDistinta_form customizzata dalla Form per le Distinte // //////////////////////////////////////////////////////////////////// class TDistinta_form: public TForm { TRelation *_firmrel; // relazione di gestione dei dati della ditta corrente TSorted_cursor *_cursor; // curosore che permette l'ordinamento degli effetti nella distinta protected: // per data scadenza o per dati fattura virtual bool validate(TForm_item &, TToken_string &); public: void set_order(const char tipo); // setta l'ordinamento del cursore virtual TCursor* cursor() const { return (TCursor*)_cursor;} // restituisce il cursore TDistinta_form(const char*, TRelation *); virtual ~TDistinta_form(); }; // creazione dell'applicazione bool TEmissione::create() { TApplication::create(); _formrb = NULL; // l'inizializzazione avviene nel metodo print() _formdse = NULL; // a seconda che si stampino le riba o la distinta _msk = new TMask("ef0500a"); _firmrel= new TRelation(LF_NDITTE); _firmrel->add(LF_ANAG, "TIPOA=TIPOA|CODANAGR=CODANAGR"); _firmrel->add(LF_UNLOC,"CODDITTA=CODDITTA"); // si posiziona sulla prima unita' locale della ditta _eff = new TLocalisamfile(LF_EFFETTI); _reff = new TLocalisamfile(LF_REFFETTI); _cession = new TLocalisamfile(LF_CESS); _msk->set_handler(DLG_CANCEL, annulla_handler); dispatch_e_menu(BAR_ITEM(1)); return TRUE; } // distruzione dell'applicazione bool TEmissione::destroy() { if (_formrb) delete _formrb; if (_formdse) delete _formdse; delete _msk; delete _firmrel; delete _eff; delete _reff; delete _cession; return TApplication::destroy(); } // carica la ditta corrente void TEmissione::on_firm_change() { TLocalisamfile &firmfile= _firmrel->lfile(); firmfile.put("CODDITTA", get_firm()); _firmrel->read(); } // carica la maschera per emissione effetti e distinte bool TEmissione::menu(MENU_TAG) { KEY key = K_ENTER; while (key != K_QUIT) // rimane in esecuzione finchè non si chiude la maschera { key = _msk->run(); if (key == K_ENTER) // se si confermano i dati inseriti conferma(); } return FALSE; } // gestisce la scelta fra le due possibili emissioni void TEmissione::conferma() { int tipoemis = _msk->get_int(F_TIPOEMIS); if (tipoemis == 1) // emissione su floppy floppy(); else print(); // emissione su carta } // gestione emissione su floppy void TEmissione::floppy() { } // aggiorna, su file, numero e data di emissione ed il flag di stampa // su tutti gli effetti nel cursore void TEmissione::aggiorna_rb(TCursor* cur) { TLocalisamfile &eff = cur->file(LF_EFFETTI); for (*cur = 0; cur->pos() < cur->items(); ++(*cur)) { TEffetto effetto = eff.curr(); long numero = effetto.numero(); effetto.put("NUMEMISS", numero); TDate data = _msk->get_date(F_DATAEMIS); effetto.put("DATAEMISS", data); bool cond = TRUE; effetto.put("EFFSTAMP", cond); effetto.rewrite(eff); } } // aggiorna, su file, il flag di stampa della distinta // su tutti gli effetti nel cursore void TEmissione::aggiorna_dist(TCursor* cur) { TLocalisamfile &eff = cur->file(LF_EFFETTI); for (*cur = 0; cur->pos() < cur->items(); ++(*cur)) { TEffetto effetto = eff.curr(); bool cond = TRUE; effetto.put("DISTSTAM", cond); effetto.rewrite(eff); } } // gestione emissione su carta delle riba void TEmissione::print_rb(char tipost, int ndist, char tipodist, int ncopie, const bool is_vis) { TCursor* fcur = _formrb->cursor(); TLocalisamfile &eff = fcur->file(LF_EFFETTI); TString16 filter; if (tipost == 'D') // se stampa definitiva effetti if (!_msk->get_bool(F_RIST)) // se non deve ristampare le riba filter = "EFFSTAMP=\" \""; // setta il filtro del cursore per ... fcur->setfilter(filter,TRUE); // ... stampare solo gli effetti non ancora stampati // setta la chiave 4 per il cursore per poter leggere tutti gli effetti della distinta fcur->setkey(4); TRectype darec(eff.curr()); // fissa i dati per la scelta degli ... darec.zero(); // ... effetti nel primo e nell'ultimo record del cursore darec.put("NDIST", ndist); darec.put("TIPODIST", tipodist); TRectype arec(darec); fcur->setregion(darec, arec); long n = fcur->items(); fcur->freeze(); // congela lo stato del cursore // se la stampa non si fa a video istanzia puntatore per la gestione della barra di attesa for (int j=0; j < ncopie; j++) { TProgind* pi; if (!is_vis) pi = new TProgind(n,"Stampa Effetti/Distinte...",FALSE,TRUE,10); for (*fcur = 0; fcur->pos() < n; ++(*fcur)) // ciclo sugli elementi del cursore di stampa { if (!is_vis) pi->addstatus(1L); // aggiorna la barra d'attesa _formrb->print(); // stampa il form } } if (tipost == 'D') // se emetto riba in definitiva ... aggiorna_rb(fcur); // ... devo aggiornare data, numero emissine e flag di stampa effetto } // gestione emissione su carta delle distinte void TEmissione::print_dse(char tipost, int ndist, char tipodist, int ncopie, const bool is_vis) { TCursor* fcur = _formdse->cursor(); TLocalisamfile &eff = fcur->file(LF_EFFETTI); // setta la chiave 4 per il cursore per poter leggere tutti gli effetti della distinta TString16 filter; fcur->setfilter(filter,TRUE); fcur->setkey(4); TRectype darec(eff.curr()); // fissa i dati per la scelta degli ... darec.zero(); // ... effetti nel primo e nell'ultimo record del cursore darec.put("NDIST", ndist); darec.put("TIPODIST", tipodist); TRectype arec(darec); fcur->setregion(darec, arec); long n = fcur->items(); fcur->freeze(); // congela lo stato del cursore // se la stampa non si fa a video istanzia puntatore per la gestione della barra di attesa for (int j=0; j < ncopie; j++) { TProgind* pi; if (!is_vis) pi = new TProgind(n,"Stampa Effetti/Distinte...",FALSE,TRUE,10); _base_page_no = 0; if (!is_vis) pi->addstatus(1L); // aggiorna la barra d'attesa _formdse->print(); // stampa il form _base_page_no = printer().getcurrentpage() -1; // stampa numero di pagina (solo nella distinta) } if (tipost == 'D') // se emetto distinta in definitiva ... aggiorna_dist(fcur); // ... devo aggiornare flag di stampa distinta } // gestione emissione su carta void TEmissione::print() { int ncopie = _msk->get_int(F_NCOPIE); if (ncopie == 0) ncopie = 1; printer().open(); // apre la stampante const bool is_vis = printer().printtype() == screenvis; // TRUE se si stampa a video int emis = _msk->get_int(F_EMIS); int ndist = _msk->get_int(F_NUMBER); char tipodist = _msk->get(F_TIPODIST)[0]; _eff->put("TIPODIST",tipodist); _eff->put("NDIST",ndist); _eff->put("NRIGADIST",1); _eff->setkey(4); _eff->read(); long codabi = _eff->get_long("CODABIP"); char tipost = _msk->get(F_TIPOST)[0]; char tipord = _msk->get(F_TIPORD)[0]; // se emetto riba istanzio il form per le riba // se emetto distinta istanzio il form per le distinte if (emis == 1) // emetto riba { TString16 nomeform; nomeform.format("rb%05ld.frm",codabi);// compongo il nome del form if (!fexist(nomeform)) // ne controllo l'esistenza nomeform = "rb.frm"; // se non esiste utilizzo il form generico _formrb = new TRiba_form(nomeform); print_rb(tipost,ndist,tipodist,ncopie,is_vis); } else // emetto distinta { TString16 nomeform; nomeform.format("dse%05ld.frm",codabi);// compongo il nome del form if (!fexist(nomeform)) // ne controllo l'esistenza nomeform = "dse.frm"; // se non esiste utilizzo il form generico _formdse = new TDistinta_form(nomeform, _firmrel); _formdse->set_order(tipord); print_dse(tipost,ndist,tipodist,ncopie,is_vis); } printer().close(); // chiude la stampante } // handler per gestire la conferma dell'annullamento dei dati inseriti nella maschera bool TEmissione::annulla_handler(TMask_field& f, KEY k) { TMask &m = f.mask(); if (k == K_SPACE) { if (yesno_box("Vuoi veramete annullare i dati inseriti")) m.reset(); } return TRUE; } // costruttore classe TRiba_form TRiba_form::TRiba_form(const char* name): TForm() { read(name); } // gestione dei messaggi estesi nei campi bool TRiba_form::validate(TForm_item &cf, TToken_string &s) { const TString code(s.get(0)); // prende il primo parametro, il codice del messaggio TString valore; if (code == "_FATT") { // gestione dei campi relativi alle/a fatture/a a cui si riferisce un effetto // sintassi: _FATT, // dove: è uno delle macro seguenti: // "!A" fattura o fatture // "!DATI" numero e data fattura // "!IMPFATT" importo fattura TCursor* fcur = cursor(); TLocalisamfile &eff = fcur->file(LF_EFFETTI); TEffetto effetto = eff.curr(); long num = effetto.numero(); bool condition = (effetto.fatt(num)); TToken_string* dati = effetto.dati_fatt(num); TString in(s.get()); if (in[0]=='!') { in.ltrim(1); // "!A" se 1 sola fattura stampa 'a' altrimenti stampa 'e' if (in == "A") { if (condition) cf.set("a"); else cf.set("e"); } // "!DATIFATT" stampa numero e data fattura delle fatture a cui si riferisce l'effetto if (in == "DATIFATT") { int elem = dati->items(); TString descfatt; for (int i = 0; i < elem; i+=3) { descfatt << dati->get(i); descfatt << " "; descfatt << dati->get(i+1); descfatt << " "; cf.set(descfatt); } } // "!IMPFATT" se 1 sola fattura ne stampa l' importo if (in == "IMPFATT") { if (condition) cf.set(dati->get(2)); } } valore = cf.get(); cf.put_paragraph(valore); cf.set(""); return (TRUE); } // fine _FATT return TForm::validate(cf, s); } // costruttore classe TDistinta_form TDistinta_form::TDistinta_form(const char* name, TRelation *rel): TForm(), _firmrel(rel) { read(name); _cursor = NULL; } // setta l'ordinamento del TSordet_cursor del form void TDistinta_form::set_order(const char tipo) { TString ordine; // ordinamento secondo la data di scadenza dell'effetto if (tipo == 'S') ordine = "DATASCAD|TIPODIST|NDIST|NRIGADIST"; // ordinamento seconda il numero e la data della fattura else if (tipo == 'F') ordine = "14->NFATT|TIPODIST|NDIST|NRIGADIST"; _cursor = new TSorted_cursor(relation(),ordine); } // distruttore classe TDistinta_form TDistinta_form::~TDistinta_form() { if (_cursor) delete _cursor; } // gestione dei messaggi estesi nei campi bool TDistinta_form::validate(TForm_item &cf, TToken_string &s) { const TString code(s.get(0)); // prende il primo parametro, il codice del messaggio TString valore; if (code == "_DITTA") { // gestione di campi della ditta corrente // sintassi: _DITTA, // dove: è uno delle macro seguenti: // "!RAGSOC" ragione sociale TString in(s.get()); if (in[0]=='!') { in.ltrim(1); // "!RAGSOC" prende la ragione sociale della ditta corrente if (in=="RAGSOC") cf.set(_firmrel->lfile().get("RAGSOC")); } valore = cf.get(); cf.put_paragraph(valore); cf.set(""); return (TRUE); } // fine _DITTA if (code == "_FATT") { // gestione dei campi relativi alle fatture a cui si riferisce un effetto // sintassi: _FATT, // dove: è uno delle macro seguenti: // "!DATI" numero e data fattura TCursor* fcur = cursor(); TLocalisamfile &eff = fcur->file(LF_EFFETTI); TEffetto effetto = eff.curr(); long num = effetto.numero(); TToken_string* dati = effetto.dati_fatt(num); int elem = dati->items(); TString descfatt; TString in(s.get()); // prende il primo parametro, il codice del messaggio if (in[0]=='!') { in.ltrim(1); // "!DATIFATT" stampa numero e data fattura delle fatture a cui si riferisce l'effetto if (in == "DATIFATT") { for (int i = 0; i < elem; i+=3) { descfatt << dati->get(i); descfatt << " "; descfatt << dati->get(i+1); descfatt << " "; cf.set(descfatt); } } } valore = cf.get(); cf.put_paragraph(valore); cf.set(""); // resetta il campo per la prossima stampa di questo item return (TRUE); } // fine _FATT if (code == "_FOOTER") { // gestione dei campi del fondo pagina della distinta // sintassi: _FOOTER, // dove: è uno delle macro seguenti: // "!NDOC" numero riba nella distinta // "!TOTALE" totale presentato TString in(s.get()); // prende il primo parametro, il codice del messaggio if (in[0]=='!') { in.ltrim(1); TCursor* fcur = cursor(); long i = fcur->items(); //"!NDOC" prende il numero riba nella distinta guardando quanti elementi ha il cursore di stampa if (in == "NDOC") cf.set(format("%ld",i)); //"!TOTALE" calcola il totale presentato prendendo i totale degli effetti nel cursore di stampa if (in == "TOTALE") { long totale = 0; TLocalisamfile &eff = fcur->file(LF_EFFETTI); for (*fcur = 0; fcur->pos() < i; ++(*fcur)) { TEffetto effetto = eff.curr(); long imp = effetto.importo(); totale +=imp; } cf.set(format("%ld",totale)); } } valore = cf.get(); cf.put_paragraph(valore); cf.set(""); return (TRUE); } // fine _FOOTER if (code== "_PAGENO") { // messaggio per stampare il numero di pagina corrente TString16 pg; pg << int(printer().getcurrentpage() - app().base_no()); cf.set(pg); cf.put_paragraph(pg); cf.set(""); } return TForm::validate(cf, s); } int ef0500(int argc, char* argv[]) { TEmissione a ; a.run(argc, argv, "Emissione Effetti e Distinte"); return 0; }