From 26dffcf566489e864f2e069ff37e28eb9f1fedb9 Mon Sep 17 00:00:00 2001 From: augusto Date: Fri, 27 Jun 1997 16:45:59 +0000 Subject: [PATCH] Storico suddiviso per magazzini Aggiunte parametrizzazioni da Config_ditta,ve git-svn-id: svn://10.65.10.50/trunk@4778 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ve/ve2400.cpp | 362 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 306 insertions(+), 56 deletions(-) diff --git a/ve/ve2400.cpp b/ve/ve2400.cpp index b87adec95..19f7c1d22 100755 --- a/ve/ve2400.cpp +++ b/ve/ve2400.cpp @@ -1,8 +1,5 @@ #include #include -#include -#include -#include #include #include #include @@ -21,16 +18,18 @@ class TMask_anamag: public TMask { TMetachar * metac; int last_annogiac; int last_annosto; + TString16 um_principale; static bool handle_codice(TMask_field &, KEY); // handler del campo codice articolo static bool handle_livart(TMask_field &, KEY); // handler dei campi codice articolo (livelli) static bool handle_anno(TMask_field &, KEY); // handler del campo anno delle giacenze static bool handle_stoanno(TMask_field &, KEY); // handler del campo anno delle giacenze static bool handle_sheet_um(TMask_field &, KEY); // handler dello sheet delle unità di misura - static bool notify_sheet_um(TSheet_field & s, int r, KEY k); // handler dello sheet delle unità di misura + static bool notify_sheet_um(TSheet_field & s, int r, KEY k); // notify dello sheet delle unità di misura static bool handle_sheet_deslin(TMask_field &, KEY); // handler dello sheet delle descrizioni in lingua static bool handle_sheet_cod(TMask_field &, KEY); // handler dello sheet dei codici alternativi static bool handle_sheetgiac(TMask_field &, KEY); // handler dello sheet giacenze + static bool notify_sheet_sto(TSheet_field & s, int r, KEY k); // notify dello storico static bool handle_sheetstomag(TMask_field &, KEY); // handler dello sheet storico giacenze static bool handle_sheet_um_um(TMask_field &, KEY); // handler del campo UM dello sheet delle unità di misura static bool handle_sheet_um_price(TMask_field &, KEY); // handler del campo PREZZO e PREZZO_LORDO dello sheet delle unità di misura @@ -42,15 +41,21 @@ class TMask_anamag: public TMask { void clear_info_sto(); bool info_sto_dirty(); + void converti_storico(TString newum); + int add_totali_storico(TString &codmag); + bool remove_totali_storico(TString & codmag); + void update_totali_storico(TString & codmag); + bool check_totali_storico(); public: - TMask_anamag(TRelation * rel, bool enable_mag, bool enable_artliv); - virtual ~TMask_anamag(); + TEsercizi_contabili esercizi_contabili; + TMask_anamag(TRelation * rel,bool mg_autorized); + virtual ~TMask_anamag(); }; // costruttore della maschera anagrafica di magazzino -TMask_anamag::TMask_anamag(TRelation * rel, bool enable_mag, bool enable_artliv) : TMask("ve2400") +TMask_anamag::TMask_anamag(TRelation * rel,bool mg_autorized) : TMask("ve2400") { _rel=rel; // imposta il riconoscimento dei caratteri del formato dell'ultima parte dell'articolo @@ -77,6 +82,7 @@ TMask_anamag::TMask_anamag(TRelation * rel, bool enable_mag, bool enable_artliv) ((TSheet_field &)field(F_SHEETGIAC)).set_userget(sheetgiac_get); ((TSheet_field &)field(F_SHEETGIAC)).set_userput(sheetgiac_put); set_handler(F_SHEETSTOMAG, handle_sheetstomag); + ((TSheet_field &)field(F_SHEETSTOMAG)).set_notify(notify_sheet_sto); ((TSheet_field &)field(F_SHEETSTOMAG)).set_userget(sheetsto_get); ((TSheet_field &)field(F_SHEETSTOMAG)).set_userput(sheetsto_put); @@ -87,17 +93,21 @@ TMask_anamag::TMask_anamag(TRelation * rel, bool enable_mag, bool enable_artliv) fm.set_handler(FS_PREZZO, handle_sheet_um_price); fm.set_handler(FS_PREZZO_LORDO, handle_sheet_um_price); + // *************************************************** + // ABILITAZIONI PARAMETRICHE + TConfig mgconfig(CONFIG_DITTA, "mg"); + // Abilita la pagina delle giacenze - if (enable_mag) + if (mg_autorized && mgconfig.get_bool("GESMAG")) { + enable_page(3,TRUE); enable_page(4,TRUE); - // setta i campi della maschera - // per la pagina giacenze + // setta i campi della maschera per la pagina giacenze TSheet_field &fld_giac= (TSheet_field &)field(F_SHEETGIAC); // disabilita le colonne quando non sono utilizzati i livelli di giacenza - for (int i=0; i<4; i++) + for (int i=0; i<4; i++) { - if (livelli_giac->enabled(1+i)) { + if (mgconfig.get_bool("GESLIVGIAC") && livelli_giac->enabled(1+i)) { fld_giac.sheet_mask().field(F_LIV1+i).show(); fld_giac.set_column_header(fld_giac.cid2index(F_LIV1+i),livelli_giac->name(1+i)); fld_giac.sheet_mask().field(F_LIV1+i).set_prompt(livelli_giac->name(1+i)); @@ -107,12 +117,12 @@ TMask_anamag::TMask_anamag(TRelation * rel, bool enable_mag, bool enable_artliv) } } // disabilita la colonna numero distinte - if (0) { + if (FALSE) { fld_giac.delete_column(fld_giac.cid2index(F_NDIST)); fld_giac.sheet_mask().field(F_NDIST).enable(FALSE); } // abilita la gestione delle ubicazioni (manuale/su tabella) - if (1) { + if (mgconfig.get("GESUBICAZ")=="M") { fld_giac.sheet_mask().field(F_UBICAZ).show(FALSE); fld_giac.sheet_mask().field(F_UBICAZD).show(FALSE); fld_giac.sheet_mask().field(F_UBICAZ2).show(TRUE); @@ -123,9 +133,10 @@ TMask_anamag::TMask_anamag(TRelation * rel, bool enable_mag, bool enable_artliv) } } else { enable_page(4,FALSE); + enable_page(3,FALSE); } // abilita la visualizzazione dei campi distinti per i livelli articolo - if (enable_artliv) + if (FALSE) { field(F_CODART).hide(); field(F_GCA).hide(); @@ -144,7 +155,7 @@ TMask_anamag::TMask_anamag(TRelation * rel, bool enable_mag, bool enable_artliv) } } } else { - if (livelli_art->enabled()) + if (mgconfig.get_bool("GESCODART") && livelli_art->enabled()) { set_handler(F_CODART, handle_codice); for (int i=0; i<9; i++) @@ -187,13 +198,13 @@ void TMask_anamag::sheetsto_get(TSheet_field &sheet_sto, int item) bool TMask_anamag::info_sto_dirty() { return - field(F_STOULTCOS1).dirty() || - field(F_STOULTCOS2).dirty() || - field(F_STOCOSTOSTD).dirty() || - field(F_STOCOSTOMEDIO).dirty()|| - field(F_STOCATVEN ).dirty()|| - field(F_STOCODLIST).dirty()|| - field(F_STOPREZZOLIST).dirty(); + field(F_STOULTCOS1).focusdirty() || + field(F_STOULTCOS2).focusdirty() || + field(F_STOCOSTOSTD).focusdirty() || + field(F_STOCOSTOMEDIO).focusdirty()|| + field(F_STOCATVEN ).focusdirty()|| + field(F_STOCODLIST).focusdirty()|| + field(F_STOPREZZOLIST).focusdirty(); } @@ -276,6 +287,11 @@ bool TMask_anamag::handle_anno(TMask_field &fld, KEY k) { TSheet_field &fld_giac= (TSheet_field &)mask.field(F_SHEETGIAC); + if (mask.get(F_ANNO).empty() ) + { + mask.set(F_ANNORIF, mask.esercizi_contabili.last()) ; + mask.set(F_ANNO, mask.get(F_ANNORIF)); + } if (mask.last_annogiac>0 && mask.last_annogiac!=fld.mask().get_int(F_ANNO)) { if (fld_giac.dirty() && handle_sheetgiac(fld_giac,K_ENTER)) { if (fld.yesno_box("Vuoi salvare le righe di giacenza per l'anno %d",mask.last_annogiac )) { @@ -303,25 +319,32 @@ bool TMask_anamag::handle_stoanno(TMask_field &fld, KEY k) { TSheet_field &fld_stomag= (TSheet_field &)fld.mask().field(F_SHEETSTOMAG); - if (mask.last_annosto>0 && mask.last_annosto!=fld.mask().get_int(F_STOANNO)) + if (mask.get(F_STOANNO).empty() ) + { + mask.set(F_STOANNORIF, mask.esercizi_contabili.pred(mask.get_int(F_ANNORIF)) ); + mask.set(F_STOANNO, mask.get(F_STOANNORIF)); + } + if ( fld.focusdirty() && mask.last_annosto>0 && mask.last_annosto!=fld.mask().get_int(F_STOANNO)) { if ((mask.field(F_SHEETSTOMAG).dirty() || mask.info_sto_dirty()) && - handle_sheetstomag(fld_stomag,K_ENTER) && fld_stomag.items()>0 ) { - if (fld.yesno_box("Vuoi salvare le righe di storico per l'anno %d",mask.last_annosto)) { + if (fld.yesno_box("Vuoi salvare lo storico per l'anno %d",mask.last_annosto) && + handle_sheetstomag(fld_stomag,K_ENTER)) { fld_stomag.autosave(*mask._rel); fld_stomag.record()->write(TRUE); } } mask.field(F_STOANNORIF).set(fld.get()); + mask.last_annosto=mask.get_int(F_STOANNORIF); // rilegge lo storico relativo a quell'anno ed aggiorna il layout mask.clear_info_sto(); fld_stomag.record()->read(*fld_stomag.putkey(*mask._rel)); fld_stomag.autoload(*mask._rel); + handle_sheetstomag(mask.field(F_SHEETSTOMAG),K_SPACE); fld_stomag.force_update(); - } - mask.last_annosto=mask.get_int(F_STOANNO); + } else + mask.last_annosto=mask.get_int(F_STOANNORIF); } return(TRUE); } @@ -329,9 +352,10 @@ bool TMask_anamag::handle_stoanno(TMask_field &fld, KEY k) bool TMask_anamag::handle_sheet_um(TMask_field &fld, KEY k) { + TSheet_field &f= (TSheet_field &)fld; // typecast del campo al suo sheet corrispondente + TMask_anamag & m= (TMask_anamag &)(fld.mask()); if (k == K_ENTER) { - TSheet_field &f= (TSheet_field &)fld; // typecast del campo al suo sheet corrispondente const int items = f.items(); if (items > 0) { @@ -341,12 +365,20 @@ bool TMask_anamag::handle_sheet_um(TMask_field &fld, KEY k) const TString16 um(f.cell(i,0)); if (um.empty()) - return error_box("Le unita' di misura non possono essere vuote"); + //return error_box("Le unita' di misura non possono essere vuote"); if (v.add(um)) return error_box("Le unità di misura devono essere diverse tra loro"); // aggiunge all'hash table l'elemento 0 (primo) della riga corrente e controlla che non esista già } } + } else if (k==K_TAB) { + if (m.um_principale!=f.cell(0,0)) { + m.converti_storico(f.cell(0,0)); + m.um_principale=f.cell(0,0); + } + } else if (k==K_SPACE) { + m.um_principale=f.cell(0,0); } + return TRUE; } @@ -354,11 +386,10 @@ bool TMask_anamag::notify_sheet_um(TSheet_field &s, int r, KEY k) { if (k == K_TAB) s.sheet_mask().enable(DLG_DELREC, r > 0); - TMask_field &mf=s.sheet_mask().field(DLG_DELREC); - return TRUE; } + bool TMask_anamag::handle_sheet_deslin(TMask_field &fld, KEY k) { if (k == K_ENTER) @@ -446,28 +477,244 @@ bool TMask_anamag::handle_sheetgiac(TMask_field &fld, KEY k) return TRUE; } + +int TMask_anamag::add_totali_storico(TString & codmag) +{ + TSheet_field &s =(TSheet_field &)field(F_SHEETSTOMAG); + bool need_rigatotali(TRUE); + for (int r=0 ; r< s.items() && codmag>=s.cell(r,s.cid2index(F_STOCODMAG)); r++) + { + if (*s.cell(r,s.cid2index(F_STOTIPORIGA))==SIMBOLO_TOTALI + && codmag==s.cell(r,s.cid2index(F_STOCODMAG))) + need_rigatotali=FALSE; + } + if (need_rigatotali ) + { + real totq,totval; + TLocalisamfile mag(LF_MAG); + mag.setkey(2); + mag.put(MAG_ANNOES,esercizi_contabili.next(get_int(F_STOANNORIF))); + //mag.put(MAG_CODART,get(F_CODART)); + mag.put(MAG_CODMAG,codmag); + mag.read(); + while (!mag.eof() + && esercizi_contabili.next(get_int(F_STOANNORIF))==mag.get_int(MAG_ANNOES) + && strncmp((const char *)codmag,mag.get(MAG_CODMAG),3)==0) + { + if (get(F_CODART)==mag.get(MAG_CODART)) + { + totq+=mag.get_real(MAG_RIM); + totval+=mag.get_real(MAG_VALRIM); + } + mag.next(); + } + s.insert(r,FALSE); + s.row(r ).add(SIMBOLO_TOTALI,s.cid2index(F_STOTIPORIGA)); + s.row(r ).add(codmag,s.cid2index(F_STOCODMAG)); + s.row(r ).add("----",s.cid2index(F_STOANNOES)); + s.row(r ).add(um_principale,s.cid2index(F_STOUM)); + s.disable_cell(r,-1); + s.insert(r+1,FALSE); + s.row(r+1).add(SIMBOLO_TOTALI,s.cid2index(F_STOTIPORIGA)); + s.row(r+1).add(codmag,s.cid2index(F_STOCODMAG)); + s.row(r+1).add("",s.cid2index(F_STOANNOES)); + s.row(r+1).add(um_principale,s.cid2index(F_STOUM)); + s.row(r+1).add(totq.string(),s.cid2index(F_STOQUANT)); + s.row(r+1).add(totval.string(),s.cid2index(F_STOVAL)); + s.disable_cell(r+1,-1); + s.force_update(r+1); + } + update_totali_storico(codmag); + return r; +} + +void TMask_anamag::update_totali_storico(TString & codmag) +{ + TSheet_field &s =(TSheet_field &)field(F_SHEETSTOMAG); + real tot1,tot2; + // find first occourrence.. + int i=0 ; + while (i< s.items() && codmag>s.cell(i,s.cid2index(F_STOCODMAG))) + i++; + // ...sum... + for (; i< s.items() && *s.cell(i,s.cid2index(F_STOTIPORIGA))!=SIMBOLO_TOTALI ; i++) + { + tot1+=s.cell(i,s.cid2index(F_STOQUANT)); + tot2+=s.cell(i,s.cid2index(F_STOVAL)); + } + //... display + if (i< s.items()) + { + s.row(i).add(tot1.string(),s.cid2index(F_STOQUANT)); + s.row(i).add(tot2.string(),s.cid2index(F_STOVAL)); + s.force_update(i); + } +} + + + +bool TMask_anamag::remove_totali_storico(TString & codmag) +{ + TSheet_field &s =(TSheet_field &)field(F_SHEETSTOMAG); + + bool found_some(FALSE); + if (codmag==" ") + return FALSE; + + for (int r=0 ; + !found_some && r< s.items()-1 + && !(*s.cell(r,s.cid2index(F_STOTIPORIGA))==SIMBOLO_TOTALI + && codmag==s.cell(r,s.cid2index(F_STOCODMAG))); + r++) + { + if (*s.cell(r,s.cid2index(F_STOTIPORIGA))!=SIMBOLO_TOTALI + && codmag==s.cell(r,s.cid2index(F_STOCODMAG))) + found_some=TRUE; + } + if (!found_some) + { + // ultima riga + s.destroy(r,FALSE); + s.destroy(r,FALSE); + } + return !found_some; +} + + +bool TMask_anamag::check_totali_storico() +{ + TSheet_field &s =(TSheet_field &)field(F_SHEETSTOMAG); + for (int r=0 ; r< s.items() ; r++) + { + for (; r< s.items() && *s.cell(r,s.cid2index(F_STOTIPORIGA))!=SIMBOLO_TOTALI; r++) ; + real totq1(s.cell(r,s.cid2index(F_STOQUANT))),totq2(s.cell(r+1,s.cid2index(F_STOQUANT))); + if (totq1!=totq2) + return yesno_box("La somma delle composizioni dello storico non corrisponde alla rimanenza\n Proseguo ugualmente ?"); + real totval1(s.cell(r,s.cid2index(F_STOVAL))),totval2(s.cell(r+1,s.cid2index(F_STOVAL))); + if (totval1!=totval2) + return yesno_box("La somma del valore delle composizioni dello storico non corrisponde al valore della rimanenza\n Proseguo ugualmente ?"); + } + return TRUE; +} + +bool TMask_anamag::notify_sheet_sto(TSheet_field &s, int r, KEY k) +{ + static TString16 oldcodmag,newcodmag,oldanno,newanno; + TMask_anamag & m=(TMask_anamag &)s.mask(); + bool need_rigatotali=TRUE; + switch (k) + { + case K_DEL: + if (*s.cell(r,s.cid2index(F_STOTIPORIGA))==SIMBOLO_TOTALI) + return FALSE; + break; + + case (K_CTRL+K_DEL): + if (m.remove_totali_storico(oldcodmag)) + s.force_update(); + break; + + case K_TAB: // posizionamento sulla riga + oldcodmag=s.cell(r,s.cid2index(F_STOCODMAG)); + oldanno=s.cell(r,s.cid2index(F_STOANNOES)); + break; + + case (K_ENTER): // fine modifica + newcodmag=(s.cell(r,s.cid2index(F_STOCODMAG))); + // modifica + m.update_totali_storico(newcodmag); + if (oldcodmag==s.cell(r,s.cid2index(F_STOCODMAG))) + { + if (oldanno==s.cell(r,s.cid2index(F_STOANNOES)) ) + break; + } else { + m.remove_totali_storico(oldcodmag); + } + case (K_CTRL + K_INS ): + newcodmag=(s.cell(r,s.cid2index(F_STOCODMAG))); + newanno=(s.cell(r,s.cid2index(F_STOANNOES))); + if (newcodmag != " ") + { + // ordina + while (r< s.items()-1 && (newcodmag > s.cell(r+1,s.cid2index(F_STOCODMAG)) || + (newcodmag == s.cell(r+1,s.cid2index(F_STOCODMAG)) && + (newanno > s.cell(r+1,s.cid2index(F_STOANNOES)) && *s.cell(r+1,s.cid2index(F_STOTIPORIGA))!=SIMBOLO_TOTALI)) )) + { + s.swap_rows(r,r+1); + r++; + } + while (r>0 && (newcodmag < s.cell(r-1,s.cid2index(F_STOCODMAG)) || + (newcodmag == s.cell(r-1,s.cid2index(F_STOCODMAG)) && + (newanno < s.cell(r-1,s.cid2index(F_STOANNOES)) || *s.cell(r-1,s.cid2index(F_STOTIPORIGA))==SIMBOLO_TOTALI )) )) + { + s.swap_rows(r,r-1); + r--; + } + m.add_totali_storico(newcodmag); + TSheet_field & s_um=(TSheet_field & )s.mask().field(F_SHEETUM); + s.row(r).add(m.um_principale,s.cid2index(F_STOUM)); + s.force_update(); + } + break; + } + return TRUE; +} + + + bool TMask_anamag::handle_sheetstomag(TMask_field &fld, KEY k) { + TSheet_field & f=(TSheet_field &)fld; + TMask_anamag &m=(TMask_anamag &) f.mask(); // prende la maschere d'origine del campo if (k==K_ENTER) { - TSheet_field & f=(TSheet_field &)fld; const int items = f.items(); + real totrim,totvalrim; if (items > 0) { - TMask &m= f.mask(); // prende la maschere d'origine del campo + if (!m.check_totali_storico()) + return FALSE; TAssoc_array v; // istanzia l'hash table per il controllo di univocità for (int i= 0; i< items; i++) { - TString codeser(f.cell(i,F_STOANNOES-FIRST_FIELD)); - if (codeser.empty()) - return error_box("I codici degli esercizi non possono essere vuoti"); - // aggiunge all'hash table l'elemento 0 (primo) della riga corrente e controlla che non esista già - if (v.add(codeser)) - return error_box("La composizione delle rimananenze deve far riferimento a esercizi tutti diversi tra loro"); + if (*f.cell(i,f.cid2index(F_STOTIPORIGA))!=SIMBOLO_TOTALI) + { + TString codeser(f.cell(i,f.cid2index(F_STOANNOES))); + if (codeser.empty()) + return error_box("I codici degli esercizi non possono essere vuoti"); + // aggiunge all'hash table l'elemento 0 (primo) della riga corrente e controlla che non esista già + if (v.add(codeser)) + return error_box("La composizione delle rimanenze deve far riferimento a esercizi tutti diversi tra loro"); + TLocalisamfile stor_aux(LF_STOMAG); + + stor_aux.put(STOMAG_CODART,fld.mask().get(F_CODART)); + stor_aux.put(STOMAG_ANNOESRIF,fld.mask().get(F_STOANNO)); + stor_aux.put(STOMAG_ANNOES,codeser); + + totrim=totrim+(real)f.cell(i,f.cid2index(F_STOQUANT)); + totvalrim=totvalrim+(real)f.cell(i,f.cid2index(F_STOVAL)); + } } + for (i= 0; i< items;) + { + if (*f.cell(i,f.cid2index(F_STOTIPORIGA))==SIMBOLO_TOTALI) + f.rows_array().remove(i,TRUE); + else + i++; + } + // ordina le righe per ANNO + //f.rows_array().sort(); + if ( m.get(F_STOANNO)