#include #include #include #include #include "anamag.h" #include "mag.h" #include "stomag.h" #include "umart.h" #include "movmag.h" #include "rmovmag.h" #include "../ve/veconf.h" #include "mglib.h" #include "mg4300.h" #include "mg4frm.h" class TRegistro_giornalemag : public TRegistro_std { public: int freq_stampa() const { return get_int("I3"); } bool raggruppato() const { return get_bool("B1"); } bool ragg_mag() const { return get_bool("B2"); } bool ragg_giac() const { return get_bool("B3"); } bool ragg_clafis() const { return get_bool("B4"); } bool ragg_grpfis() const { return get_bool("B5"); } bool ragg_caus() const { return get_bool("B6"); } long last_numreg() const { return get_long("I4"); } void set_last_numreg(long n) { put("I4",n); } // data ultima stampa esercizio precedente TDate last_print_prec() const { return get_date("D4"); } // pagina ultima stampa esercizio precedente int pag_stampate_prec() const{ return get_int("I6"); } TRegistro_giornalemag(const char* code = "", int year = 0); virtual ~TRegistro_giornalemag() {} }; // ************************************************ // TEMP!!!!!!!!!!!!!!!! TRegistro_giornalemag::TRegistro_giornalemag(const char* cod, int year) :TRegistro_std(cod,year) { if (tipo()!=TIPOREG_GIOMAG) fatal_box(TR("Il registro richiesto non è relativo ad un libro giornale di magazzino")); } class TGiornalemag : public TForm_stampemg { static TDate _dadata; static TDate _adata; static int freq_stampa; static bool stampa_def; static bool ragg_mag; static bool ragg_articoli; static bool ragg_classi; static bool ragg_raggart; static bool ragg_caus; static TCursor * cur; static TGiornalemag* giofrm; static TAssoc_array _cod_magazzini; static TAssoc_array _cau_magazzino; static int _annoes; static int livello_giac; TConfig *conf_ditta; TArticolo_giacenza * _curr_art; TString16 _codlist,_catven; word last_pag_stampata; long last_num_reg; TRegistro_giornalemag *_reg_giorn; private: TArticolo_giacenza &curr_art(); static const char * get_fiscfield(TVariable_rectype & r); static const char * get_cronofield(TVariable_rectype & r); static bool filter_func(const TRelation* r); protected: // void add_mag(TRectype & magrec,const char * codreg); void calcola_range_movimenti(TRecnotype& primo, TRecnotype& ultimo) const; public: void set_parametri(TMask & m); bool can_be_printed(); bool validate(TForm_item &cf, TToken_string &s); TGiornalemag(const char *name,const char *code) ; ~TGiornalemag(); }; TArticolo_giacenza &TGiornalemag::curr_art() { TRectype & magrec=relation()->lfile(LF_MAG).curr(); if (_curr_art==NULL || _curr_art->codice()!=magrec.get(MAG_CODART) ) { if (_curr_art) delete _curr_art; _curr_art=new TArticolo_giacenza(magrec.get(MAG_CODART)); } return *_curr_art; } bool TGiornalemag::validate(TForm_item &cf, TToken_string &s) { const TString code(s.get(0)); // prende il primo parametro, il codice del messaggio TString valore,vv; TString subcode; if (code=="_USER") { subcode=s.get(); if (subcode== "INTEST_REG") { cf.set(_reg_giorn->intest()); return TRUE; } else if (subcode== "INTEST_DITTA") { if (_reg_giorn->stampa_intditta()) s = "_DITTA,!RAGSOC"; else return TRUE; } else if (subcode== "PAGENO") { valore << (int)(last_pag_stampata+printer().getcurrentpage()); cf.set(valore); return TRUE; } else if (subcode== "NUMREGST") { valore << last_num_reg; cf.set(valore); return TRUE; } else if (subcode=="INCNUMREGST") { last_num_reg=max(last_num_reg,_reg_giorn->last_numreg())+1; if (stampa_def) { _reg_giorn->set_last_numreg(last_num_reg); _reg_giorn->rewrite(); } return TRUE; } else if (subcode== "REGISTRASTAMPA") { TRectype & movr=cursor()->relation()->lfile(LF_MOVMAG).curr(); if ((1 || movr.get_long("NUMREGST")<=last_num_reg )&& stampa_def) { // movimento ancora da registrare movr.put("NUMREGST",last_num_reg+1); cursor()->relation()->lfile(LF_MOVMAG).rewrite(); _reg_giorn->set_pag_stampate(last_pag_stampata+printer().getcurrentpage()); _reg_giorn->set_last_print(TDate(TODAY)); _reg_giorn->rewrite(); } } else if (subcode== "INFO_CRONO") { TDate datamov(cursor()->relation()->curr(LF_MOVMAG).get_date("DATAREG")); switch (freq_stampa ) { case 0: valore.format(FR("%7g Movimento del %s "), (double)last_num_reg+1, (const char *)datamov.string()); valore << cursor()->relation()->curr(LF_MOVMAG).get("DESCR"); break; default: valore.format(FR("%7g Movimenti di %s, dal %d al %d"), (double)last_num_reg+1, (const char *)itom(datamov.month()), (int)((datamov.day()-1)/freq_stampa)*freq_stampa+1, (int)min(((datamov.day()-1)/freq_stampa+1)*freq_stampa,TDate::last_day(datamov.month(),datamov.year())) ); break; } cf.set(valore); return TRUE; } else if (subcode== "INFO_FISC") { valore.cut(0); if (!ragg_mag) { vv=cursor()->relation()->lfile(LF_RMOVMAG).get("CODMAG"); valore << TR("Mag.") << vv.mid(0,3); vv=vv.mid(3,2); if (vv.not_empty()) valore << '-' << vv ; else valore << " " ; valore << ' '; vv = ""; } const TRectype& anamag = cursor()->relation()->curr(LF_ANAMAG); if (ragg_articoli) { valore << TR("Art.") << cursor()->relation()->lfile(LF_ANAMAG).get(ANAMAG_CODART) << ' '; TString livello(cursor()->relation()->curr(LF_RMOVMAG).get("LIVGIAC")); if (livello.not_empty() && livello_giac != 0) { for (int lev=1; lev <= livello_giac; lev++) { if (!livelli_giacenza().enabled(lev)) continue; const int starts = livelli_giacenza().code_start(lev) -1; const int length = livelli_giacenza().code_length(lev); valore << livello.mid(starts,length); valore << "/"; } valore << livelli_giacenza().name(livello_giac); valore << " " << livelli_giacenza().group_descr_packed(livello,livello_giac) << " "; } } else { if (ragg_classi) { valore << TR("Classe fiscale ") << cursor()->relation()->lfile(LF_ANAMAG).get(ANAMAG_CLASSEFIS) << ' '; if (ragg_raggart) { valore << TR(" ragg. ") << cursor()->relation()->lfile(LF_ANAMAG).get(ANAMAG_RAGGFIS) << ' '; } } else { vv.cut(0); vv << TR("Art. ") << cursor()->relation()->lfile(LF_ANAMAG).get(ANAMAG_CODART); } } valore << vv; cf.set(valore); return TRUE; } else if (subcode== "INFO_CAUS") { const TRectype& rec_caus = cache().get("%CAU", cf.get()); if (ragg_caus) { const TString16 raggcau = rec_caus.get("S8"); if (raggcau.blank()) valore << TR("Causali varie"); else { const TRectype& rec_rag = cache().get("%RFC", raggcau); valore << TR("Causali gruppo ") << raggcau << ' ' << rec_rag.get("S0"); } } else { valore << TR("Causale ") << cf.get() << ' ' << rec_caus.get("S0"); } cf.set(valore); return TRUE; } } return TForm_stampemg::validate(cf, s); } const char * TGiornalemag::get_cronofield(TVariable_rectype & rmovmag) { // static buffer static TString * valore=NULL; if (valore == NULL ) valore = new TString16; const TRectype& movmag = cache().get(LF_MOVMAG, rmovmag.get(RMOVMAG_NUMREG)); const TDate datamov = movmag.get_date(MOVMAG_DATAREG); // gestione frequenza valore->cut(0); switch (freq_stampa ) { case 0: valore->format("%4d%2d%2d%7d",datamov.year(), datamov.month(), datamov.day(), movmag.get_long("NUMREG")); break; default: valore->format("%4d%2d%2d",datamov.year(), datamov.month(), (int)(datamov.day()/freq_stampa)); } return *valore; } const char * TGiornalemag::get_fiscfield(TVariable_rectype & rmovmag) { static TString * valore=NULL; if (valore == NULL ) valore = new TString80 ; TString80 vv; valore->cut(0); const TString80 codart = rmovmag.get(RMOVMAG_CODART); // gestione ragruppamenti if (!ragg_mag) { valore->format("%-15s",(const char *)rmovmag.get(RMOVMAG_CODMAG)); } if (ragg_articoli) { *valore << codart; if (livello_giac) { const TString80 c2 = rmovmag.get("LIVGIAC"); *valore << livelli_giacenza().unpack_grpcode(c2, livello_giac); } } else { if (ragg_classi) { const TRectype& anamag = cache().get(LF_ANAMAG, codart); *valore << anamag.get(ANAMAG_CLASSEFIS); if (ragg_raggart) *valore << anamag.get(ANAMAG_RAGGFIS); } else { if (!ragg_caus && freq_stampa==0) { vv.format("%4d",rmovmag.get_int(RMOVMAG_NRIG)); } else { vv.format("%-20s", (const char *)codart); } } } TString16 codcaus = rmovmag.get(RMOVMAG_CODCAUS); if (codcaus.empty()) { const TRectype& movmag = cache().get(LF_MOVMAG, rmovmag.get(RMOVMAG_NUMREG)); codcaus = movmag.get(MOVMAG_CODCAUS); } if (ragg_caus) // raggruppo per "tipo" di causale { TCausale_magazzino* caus = (TCausale_magazzino*)_cau_magazzino.objptr(codcaus); *valore << caus->get("S8"); } else *valore << codcaus; *valore << vv; return *valore; } void TGiornalemag::calcola_range_movimenti(TRecnotype& primo, TRecnotype& ultimo) const { TRelation rel(LF_MOVMAG); TRectype recfr(LF_MOVMAG), recto(LF_MOVMAG); if (_dadata.ok()) recfr.put(MOVMAG_DATAREG, _dadata); if (_adata.ok()) recto.put(MOVMAG_DATAREG, _adata); TCursor cur(&rel, "", 3, &recfr, &recto); const TRecnotype items = cur.items(); cur.freeze(); primo = 0; ultimo = 0; for (cur = 0L; cur.pos() < items; ++cur) { const long numreg = rel.curr().get_long(MOVMAG_NUMREG); if (primo == 0 || numreg < primo) primo = numreg; if (numreg > ultimo) ultimo = numreg; } } void TGiornalemag::set_parametri(TMask & m) { // set static variables _dadata=m.get_date(F_DATAIN); _adata=m.get_date(F_DATAFIN); freq_stampa = m.get_int(F_FREQ); stampa_def = (*m.get(F_DEFINITIVA) == 'D'); ragg_mag = m.get_bool(F_RAGGMAG); ragg_articoli = m.get_bool(F_RAGGARTICOLI ); ragg_classi = m.get_bool(F_CLASSEFISART ); ragg_raggart = m.get_bool(F_RAGGFISART ); ragg_caus = m.get_bool(F_RAGGCAUS ); livello_giac = m.get_int(F_TOLIVELLOGIAC); _annoes=m.get_int(F_ANNOES); cur=cursor(); giofrm = this; // load Tregistro if (_reg_giorn) delete _reg_giorn; _reg_giorn= new TRegistro_giornalemag(m.get(F_CODREG),m.get_int(F_ANNOES)); last_pag_stampata=_reg_giorn->pag_stampate(); last_num_reg=_reg_giorn->last_numreg(); // show/hide sections find_field('B',odd_page,"HEADER_RAGG_FISC").show( ragg_articoli || ragg_classi || ragg_caus); find_field('B',odd_page,"HEADER_MOV").show(freq_stampa==0); TVariable_rectype *vrec_rmov= new TVariable_rectype(LF_RMOVMAG); vrec_rmov->add_field(new TVariable_field ("CRONO_FIELD",get_cronofield,32)); vrec_rmov->add_field(new TVariable_field ("FISC_FIELD",get_fiscfield,48)); cursor()->relation()->lfile().set_curr(vrec_rmov); // inserisce tutti i magazzini collegati _cod_magazzini.destroy(); TTable mag("MAG"); int err; for (err = mag.first(); err == NOERR; err = mag.next()) { const TString16 codmag(mag.get("CODTAB").left(3)); if (codmag.len() == 3 && mag.get("S8")==m.get(F_CODREG)) _cod_magazzini.add(codmag); } _cau_magazzino.destroy(); TTable cau("%CAU"); for (err = cau.first(); err == NOERR; err = cau.next()) { TCausale_magazzino* cm = new TCausale_magazzino(cau.curr()); _cau_magazzino.add(cm->codice(), cm); } TRecnotype primo, ultimo; calcola_range_movimenti(primo, ultimo); TRectype recfr(LF_RMOVMAG), recto(LF_RMOVMAG); if (primo > 0) recfr.put(RMOVMAG_NUMREG, primo); if (ultimo > 0) recto.put(RMOVMAG_NUMREG, ultimo); cursor()->setregion(recfr, recto); // setta il filtro sui magazzini di questo giornale cursor()->set_filterfunction(filter_func,FALSE); } bool TGiornalemag::filter_func(const TRelation* r) { // const TRectype& movmag = r->curr(LF_MOVMAG); const TRectype& rmovmag = r->curr(LF_RMOVMAG); const TRectype& movmag = cache().get(LF_MOVMAG, rmovmag.get(RMOVMAG_NUMREG)); const TDate datareg = movmag.get_date(MOVMAG_DATAREG); if (datareg.year() != _annoes) return FALSE; if (!_dadata.empty() && datareg < _dadata) return FALSE; if (!_adata.empty() && datareg > _adata) return FALSE; const TString4 codmag = rmovmag.get(RMOVMAG_CODMAG).left(3); if (!_cod_magazzini.is_key(codmag)) return FALSE; // considera solo le causali "fiscali" o quelle che movimentano le rimanenze iniziali(movimenti d'apertura) bool rval = FALSE; TString16 codcaus = rmovmag.get(RMOVMAG_CODCAUS); if (codcaus.empty()) codcaus = movmag.get(MOVMAG_CODCAUS); TCausale_magazzino* caus = (TCausale_magazzino*)_cau_magazzino.objptr(codcaus); if (caus != NULL) rval = caus->is_fiscale() || caus->sgn(s_rim); return rval; } bool TGiornalemag::can_be_printed() { if (stampa_def) { TLocalisamfile mov(LF_MOVMAG); mov.setkey(3); mov.put(MOVMAG_DATAREG,_dadata); mov.read(); mov.prev(); if (!mov.eof() || mov.get(MOVMAG_NUMREGST)!=_reg_giorn->last_numreg()) return FALSE; } return TRUE; } TGiornalemag::TGiornalemag(const char *name,const char *code) : TForm_stampemg(name,code),_curr_art(NULL), last_pag_stampata(0),last_num_reg(0),_reg_giorn(NULL) { } TGiornalemag::~TGiornalemag() { if (_curr_art) delete _curr_art; if (_reg_giorn) delete _reg_giorn; } // dichiarazioni degli static TDate TGiornalemag::_dadata; TDate TGiornalemag::_adata; int TGiornalemag::freq_stampa; bool TGiornalemag::ragg_mag; bool TGiornalemag::stampa_def; bool TGiornalemag::ragg_articoli; bool TGiornalemag::ragg_classi; bool TGiornalemag::ragg_raggart; bool TGiornalemag::ragg_caus; int TGiornalemag::livello_giac; TCursor * TGiornalemag::cur; TGiornalemag * TGiornalemag::giofrm; TAssoc_array TGiornalemag::_cod_magazzini; TAssoc_array TGiornalemag::_cau_magazzino; int TGiornalemag::_annoes; // STAMPA giornale class TStampa_giornalemag : public TSkeleton_application { TStampemg_mask * _mask; TGiornalemag * _giorn_mag; // to be moved into TPrint_application TCursor * _cur; protected: virtual bool create(); virtual bool destroy(); virtual void main_loop(); public: TStampa_giornalemag() {} }; bool TStampa_giornalemag::create() { open_files(LF_ANAMAG, LF_MOVMAG, LF_RMOVMAG, LF_TAB, LF_TABCOM, 0); _mask = new TStampemg_mask("mg4300"); _mask->show(F_TOLIVELLOGIAC, livelli_giacenza().enabled()); // Abilita la gestione del dettaglio livello giacenza return TSkeleton_application::create(); } bool TStampa_giornalemag::destroy() { delete _mask; return TRUE; } void TStampa_giornalemag::main_loop() { while (_mask->run() == K_ENTER) { if (_mask->magazz_ini().gestmag(TRUE)) { _giorn_mag = new TGiornalemag("mg4300", ""); _giorn_mag->set_parametri(*_mask); if (_giorn_mag->can_be_printed()) _giorn_mag->print(); else error_box(TR("Impossibile stampare il giornale dalla data indicata")); delete _giorn_mag; } } // while true return ; } int mg4300(int argc, char* argv[]) { TStampa_giornalemag a; a.run(argc,argv,TR("Stampa giornale di magazzino")); return 0; }