git-svn-id: svn://10.65.10.50/branches/R_10_00@23043 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			1116 lines
		
	
	
		
			35 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			1116 lines
		
	
	
		
			35 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| // oggetto TCausale_magazzino
 | ||
| // oggetto TMov_Mag , multirecord del movimento di magazzino
 | ||
| // funzione di ricostruzione saldi
 | ||
| 
 | ||
| #include <diction.h> 
 | ||
| #include <progind.h> 
 | ||
| #include <recset.h> 
 | ||
| 
 | ||
| #include "clifogiac.h"
 | ||
| #include <cfven.h>
 | ||
| 
 | ||
| #include "../cg/cglib01.h"
 | ||
| #include "../db/dblib.h"
 | ||
| 
 | ||
| class TSaldo_mag : public TObject
 | ||
| {
 | ||
| 	int _codes;
 | ||
| 	TString8 _codmag;
 | ||
|   TCodice_articolo _codart;
 | ||
| 	TString16 _livello;
 | ||
| 	TString8 _codcaus;
 | ||
|   real _quant;
 | ||
| 	real _valore;
 | ||
| 
 | ||
| public: 
 | ||
| 	const int codes() const { return _codes;}
 | ||
| 	const TString& codmag() const  { return _codmag; }
 | ||
|   const TCodice_articolo & codart() const { return _codart; }
 | ||
|   const TString& livello() const  { return _livello; }
 | ||
| 	const TString& codcaus() const  { return _codcaus; }
 | ||
|   const real& quant() const  { return _quant; }
 | ||
|   const real& valore() const { return _valore; }
 | ||
|   void set(int codes, const char * codmag, const char * codart, const char * livello, const char * codcaus);
 | ||
|   int operator==(const TSaldo_mag&) const;
 | ||
|   
 | ||
|   virtual TObject* dup() const { return new TSaldo_mag(*this); }
 | ||
|   
 | ||
| 	bool is_deletable() const { return _quant == ZERO && _valore == ZERO; }
 | ||
| 	static TToken_string& key(const TRectype & head, const TRectype & row);
 | ||
| 	void add_quant(const real & q, bool plus = true) { _quant += (plus ? q : -q); }
 | ||
| 	void add_valore(const real & v, bool plus = true) { _valore += (plus ? v : -v); }
 | ||
| 	void add(const real & q, const real & v, bool plus = true) { add_quant(q, plus); add_valore(v, plus); }
 | ||
| 	void sub_quant(const real & q) { add_quant(q, false); }
 | ||
| 	void sub_valore(const real & v) { add_valore(v, false); }
 | ||
| 	void sub(const real & q, const real & v) { add(q, v, false); } 
 | ||
| 
 | ||
| 	TSaldo_mag(int codes, const char * codmag, const char * codart, const char * livello, const char * codcaus) {set(codes, codmag, codart, livello, codcaus);}
 | ||
| 	TSaldo_mag(const TRectype & head, const TRectype & row);
 | ||
| 	TSaldo_mag(const TSaldo_mag & s);
 | ||
|   virtual ~TSaldo_mag() {}; 
 | ||
| };
 | ||
| 
 | ||
| void TSaldo_mag::set(int codes, const char * codmag, const char * codart, const char * livello, const char * codcaus)
 | ||
| {
 | ||
| 	_codes = codes;
 | ||
|   _codmag = codmag;
 | ||
|   _codart = codart;
 | ||
|   _livello = livello;
 | ||
| 	_codcaus = codcaus;
 | ||
| }
 | ||
| 
 | ||
| int TSaldo_mag::operator==(const TSaldo_mag & s) const
 | ||
| {
 | ||
|   return (_codes == s._codes) &&
 | ||
| 				 (_codmag == s._codmag) &&
 | ||
| 				 (_codart == s._codart) &&
 | ||
| 				 (_livello == s._livello) &&
 | ||
| 				 (_codcaus == s._codcaus);
 | ||
| }
 | ||
| 
 | ||
| TToken_string & TSaldo_mag::key(const TRectype & head, const TRectype & row)
 | ||
| {
 | ||
| 	TToken_string& key = get_tmp_string();
 | ||
| 
 | ||
| 	key.add(head.get_int(MOVMAG_ANNOES));
 | ||
|   key.add(row.get(RMOVMAG_CODMAG));
 | ||
|   key.add(row.get(RMOVMAG_CODART));
 | ||
|   key.add(row.get(RMOVMAG_LIVGIAC));
 | ||
| 	const TString& c = row.get(RMOVMAG_CODCAUS);
 | ||
| 	key.add(c.full() ? c : head.get(MOVMAG_CODCAUS));
 | ||
|   return key;
 | ||
| }
 | ||
| 
 | ||
| TSaldo_mag::TSaldo_mag(const TRectype & head, const TRectype & row)
 | ||
| {
 | ||
| 	_codes = head.get_int(MOVMAG_ANNOES);
 | ||
|   _codmag = row.get(RMOVMAG_CODMAG);
 | ||
|   _codart = row.get(RMOVMAG_CODART);
 | ||
|   _livello = row.get(RMOVMAG_LIVGIAC);
 | ||
| 	_codcaus = row.get(RMOVMAG_CODCAUS);
 | ||
| 	if (_codcaus.blank())
 | ||
| 		_codcaus = head.get(MOVMAG_CODCAUS);
 | ||
| }
 | ||
| 
 | ||
| TSaldo_mag::TSaldo_mag(const TSaldo_mag & s)
 | ||
| {
 | ||
| 	set(s._codes, s._codmag, s._codart, s._livello, s._codcaus);
 | ||
| 	_quant = s._quant;
 | ||
| 	_valore = s._valore;
 | ||
| }
 | ||
| 
 | ||
| // Quintessenza della coglioneria programmatoria espressa dal Calderoli dell'informatica
 | ||
| // Invece di derivare da TSaldo_mag ed aggiunger il cliente, si crea un'orrida nuova classe
 | ||
| class TSaldo_mag_clifo : public TObject
 | ||
| {
 | ||
| 	int _codes;
 | ||
| 	char _tipocf;
 | ||
| 	TString8 _codcf;
 | ||
| 	int _codindsp;
 | ||
|   TCodice_articolo _codart;
 | ||
| 	TString16 _livello;
 | ||
| 	TString8 _codcaus;
 | ||
|   real _quant;
 | ||
| 	real _valore;
 | ||
| 
 | ||
| public: 
 | ||
| 	const int codes() const { return _codes;}
 | ||
| 	const char tipocf() const { return _tipocf;}
 | ||
| 	const TString& codcf() const  { return _codcf; }
 | ||
| 	const int codindsp() const { return _codindsp;}
 | ||
|   const TCodice_articolo & codart() const { return _codart; }
 | ||
|   const TString& livello() const  { return _livello; }
 | ||
| 	const TString& codcaus() const  { return _codcaus; }
 | ||
|   const real& quant() const  { return _quant; }
 | ||
|   const real& valore() const { return _valore; }
 | ||
|   void set(int codes, char tipocf, const char * codcf, int codindsp, const char * codart, const char * livello, const char * codcaus);
 | ||
|   int operator==(const TSaldo_mag_clifo&) const;
 | ||
|   
 | ||
|   virtual TObject* dup() const { return new TSaldo_mag_clifo(*this); }
 | ||
|   
 | ||
| 	bool is_deletable() const { return _quant.is_zero() && _valore.is_zero(); }
 | ||
| 	static TToken_string & key(const TRectype & head, const TRectype & row);
 | ||
| 	void add_quant(const real & q, bool plus = true) { _quant = _quant + (plus ? q : -q); }
 | ||
| 	void add_valore(const real & v, bool plus = true) { _valore = _valore + (plus ? v : -v); }
 | ||
| 	void add(const real & q, const real & v, bool plus = true) { add_quant(q, plus); add_valore(v, plus); }
 | ||
| 	void sub_quant(const real & q) { add_quant(q, false); }
 | ||
| 	void sub_valore(const real & v) { add_valore(v, false); }
 | ||
| 	void sub(const real & q, const real & v) { add(q, v, false); } 
 | ||
| 
 | ||
| 	TSaldo_mag_clifo(int codes, char tipocf, const char * codcf, int codindsp, const char * codart, const char * livello, const char * codcaus);
 | ||
| 	TSaldo_mag_clifo(const TRectype & head, const TRectype & row);
 | ||
| 	TSaldo_mag_clifo(const TSaldo_mag_clifo & s);
 | ||
|   virtual ~TSaldo_mag_clifo() {}; 
 | ||
| };
 | ||
| 
 | ||
| void TSaldo_mag_clifo::set(int codes, char tipocf, const char * codcf, int codindsp, const char * codart, const char * livello, const char * codcaus)
 | ||
| {
 | ||
| 	_codes = codes;
 | ||
| 	_tipocf = tipocf;
 | ||
| 	_codcf = codcf;
 | ||
|   _codart = codart;
 | ||
| 	_codindsp =	codindsp;
 | ||
|   _codart = codart;
 | ||
|   _livello = livello;
 | ||
| 	_codcaus = codcaus;
 | ||
| }
 | ||
| 
 | ||
| int TSaldo_mag_clifo::operator==(const TSaldo_mag_clifo & s) const
 | ||
| {
 | ||
|   return (_codes == s._codes) &&
 | ||
| 				 (_tipocf == s._tipocf) &&
 | ||
| 				 (_codcf == s._codcf) &&
 | ||
| 				 (_codindsp == s._codindsp) &&
 | ||
| 				 (_codart == s._codart) &&
 | ||
| 				 (_livello == s._livello) &&
 | ||
| 				 (_codcaus == s._codcaus);
 | ||
| }
 | ||
| 
 | ||
| TToken_string & TSaldo_mag_clifo::key(const TRectype & head, const TRectype & row)
 | ||
| {
 | ||
| 	TToken_string& key = get_tmp_string();
 | ||
| 
 | ||
| 	key.add(head.get_int(MOVMAG_ANNOES));
 | ||
| 	key.add(head.get(MOVMAG_TIPOCF));
 | ||
| 	key.add(head.get(MOVMAG_CODCF));
 | ||
| 	key.add(head.get_int(MOVMAG_CODINDSP));
 | ||
|   key.add(row.get(RMOVMAG_CODART));
 | ||
|   key.add(row.get(RMOVMAG_LIVGIAC));
 | ||
| 
 | ||
|   const TString& c = row.get(RMOVMAG_CODCAUS);
 | ||
| 	key.add(c.full() ? c : head.get(MOVMAG_CODCAUS));
 | ||
|   
 | ||
|   return key;
 | ||
| }
 | ||
| 
 | ||
| TSaldo_mag_clifo::TSaldo_mag_clifo(const TRectype & head, const TRectype & row)
 | ||
| {
 | ||
| 	_codes = head.get_int(MOVMAG_ANNOES);
 | ||
| 	_tipocf = head.get_char(MOVMAG_TIPOCF);
 | ||
| 	_codcf = head.get(MOVMAG_CODCF);
 | ||
| 	_codindsp = head.get_int(MOVMAG_CODINDSP);
 | ||
|   _codart = row.get(RMOVMAG_CODART);
 | ||
|   _livello = row.get(RMOVMAG_LIVGIAC);
 | ||
| 	_codcaus = row.get(RMOVMAG_CODCAUS);
 | ||
| 	if (_codcaus.blank())
 | ||
| 		_codcaus = head.get(MOVMAG_CODCAUS);
 | ||
| }
 | ||
| 
 | ||
| TSaldo_mag_clifo::TSaldo_mag_clifo(const TSaldo_mag_clifo & s)
 | ||
| {
 | ||
| 	set(s._codes, s._tipocf, s._codcf, s._codindsp, s._codart, s._livello, s._codcaus);
 | ||
| 	_quant = s._quant;
 | ||
| 	_valore = s._valore;
 | ||
| }
 | ||
| 
 | ||
| // ********************************
 | ||
| // TMov_mag  
 | ||
| 
 | ||
| TMov_mag::TMov_mag() : TMultiple_rectype(LF_MOVMAG)
 | ||
| { add_file(LF_RMOVMAG,"NRIG"); }
 | ||
| 
 | ||
| TMov_mag::TMov_mag(long numreg) : TMultiple_rectype(LF_MOVMAG)
 | ||
| {
 | ||
|   add_file(LF_RMOVMAG,"NRIG");
 | ||
|   if (numreg > 0)
 | ||
|   {
 | ||
|     TLocalisamfile movmag(LF_MOVMAG);
 | ||
|     put(MOVMAG_NUMREG, numreg);
 | ||
|     read(movmag); 
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| TMov_mag::~TMov_mag() 
 | ||
| { }
 | ||
| 
 | ||
| TCausale_magazzino& TMov_mag::causale(int row) const
 | ||
| {
 | ||
| 	const TRectype& rowrec = body()[row];
 | ||
| 	
 | ||
|   TString8 cod = rowrec.get(RMOVMAG_CODCAUS);
 | ||
|   if (cod.blank())
 | ||
|     cod = get(MOVMAG_CODCAUS);
 | ||
| 
 | ||
|   return cached_causale_magazzino(cod);
 | ||
| }
 | ||
| 
 | ||
| void TMov_mag::zero(char c)
 | ||
| {
 | ||
|   TMultiple_rectype::zero(c);
 | ||
|   _saldi_mag.destroy();   
 | ||
|   _saldi_mag_clifo.destroy();
 | ||
| }
 | ||
| 
 | ||
| // valuta il valore della chiave per un nuovo record
 | ||
| bool TMov_mag::renum()
 | ||
| {
 | ||
|   put(MOVMAG_NUMREG,get_next_key());
 | ||
|   return TRUE;
 | ||
| }
 | ||
| 
 | ||
| // copia la chiave dal file principale a quello delle righe
 | ||
| void TMov_mag::set_body_key(TRectype & rowrec)
 | ||
| {
 | ||
|   rowrec.put(RMOVMAG_NUMREG,get(MOVMAG_NUMREG));
 | ||
| } 
 | ||
| 
 | ||
| /*void TMov_mag::load_rows_file(int logicnum)
 | ||
| {
 | ||
|   CHECK(logicnum==LF_RMOVMAG,"L'unico file collegabile ai movimenti sono le righe"); 
 | ||
|   TMultiple_rectype::load_rows_file(logicnum);
 | ||
| }*/
 | ||
| 
 | ||
| int TMov_mag::read(TBaseisamfile& f, word op, word lockop)
 | ||
| {
 | ||
|   _saldi_mag.destroy();   
 | ||
|   _saldi_mag_clifo.destroy();
 | ||
| 	
 | ||
| 	const int err = TMultiple_rectype::read(f, op, lockop);
 | ||
| 
 | ||
| 	if (err == NOERR)
 | ||
| 		add_saldi(false);
 | ||
| 	return err;
 | ||
| }
 | ||
| 
 | ||
| int TMov_mag::remove(TBaseisamfile& f) const 
 | ||
| {
 | ||
|   const int res = TMultiple_rectype::remove(f);
 | ||
|   if (res == NOERR) 
 | ||
|     ((TMov_mag *)this)->update_balances();  
 | ||
|   return res;
 | ||
| }
 | ||
| 
 | ||
| void TMov_mag::add_extrarows() const
 | ||
| {
 | ||
|   add_autorows();
 | ||
|   add_explrows();
 | ||
| }
 | ||
| 
 | ||
| bool  TMov_mag::add_autorows() const
 | ||
| {
 | ||
|   bool added = false;
 | ||
|   TString8 codmag;
 | ||
|   
 | ||
|   // aggiunge le righe automatiche
 | ||
|   for (int r = rows(); r > 0; r--) 
 | ||
|   {        
 | ||
|     TRecord_array & b = body();             
 | ||
|     TRectype & row = b[r];
 | ||
| 		const TCausale_magazzino& cau = causale(r);
 | ||
|     const TString8 codcaus = cau.caus_collegata();
 | ||
| 		if (codcaus.full())
 | ||
|     {      
 | ||
| 			if (!row.get_bool(RMOVMAG_ESPLOSA))
 | ||
|       {
 | ||
|         // deve esserci una riga collegata
 | ||
|         if (!b.exist(r + 1) || b[r + 1].get_char(RMOVMAG_TIPORIGA) != riga_automatica)
 | ||
|         {
 | ||
|           // manca, la inserisco
 | ||
|           TRectype * linea_auto = new TRectype(row);
 | ||
|           
 | ||
|           codmag = codmag_rauto(r);
 | ||
|           if (codmag.empty())
 | ||
|           {
 | ||
|             const TCausale_magazzino& cau_coll = cached_causale_magazzino(codcaus);
 | ||
|             codmag = cau_coll.default_magdep();
 | ||
|           }
 | ||
|           if (codmag.not_empty())
 | ||
|             linea_auto->put(RMOVMAG_CODMAG, codmag);
 | ||
|           const char * prezzo = prezzo_rauto(r);
 | ||
|           if (prezzo != NULL)
 | ||
|             linea_auto->put(RMOVMAG_PREZZO, prezzo);
 | ||
|           linea_auto->put(RMOVMAG_NRIG, r+1);     
 | ||
|           linea_auto->put(RMOVMAG_TIPORIGA, (char) riga_automatica);
 | ||
|           linea_auto->put(RMOVMAG_CODCAUS, codcaus);
 | ||
|           b.insert_row(linea_auto);
 | ||
|           added=TRUE;
 | ||
|         }
 | ||
|       }
 | ||
|     }
 | ||
|   } // ciclo righe
 | ||
|   return added;
 | ||
| }
 | ||
| 
 | ||
| bool TMov_mag::add_explrows() const
 | ||
| {
 | ||
|   TDistinta_tree  distinta;
 | ||
|   TArray boom;
 | ||
|   bool added=FALSE;
 | ||
| 
 | ||
|   TRecord_array& b = body();             
 | ||
|   // aggiunge le righe da explosione distinta
 | ||
|   for (int r = rows(); r > 0; r--) 
 | ||
|   {        
 | ||
|     const TRectype& row = b[r];
 | ||
| 		const TCausale_magazzino& cau = causale(r);
 | ||
| 
 | ||
| 		if (cau.esplodente() && !row.get_bool(RMOVMAG_ESPLOSA))
 | ||
|     {
 | ||
|       const TCodice_articolo codart = row.get(RMOVMAG_CODART);
 | ||
|       const char tipo_costo = cau.get("S11")[0];
 | ||
|       const int livello = cau.get_int("I0");
 | ||
|       const TString4 umroot(row.get(RMOVMAG_UM));
 | ||
|       const int rigaprec = r - 1;
 | ||
|       const bool is_coll = r > 0 && b[r].get_char(RMOVMAG_TIPORIGA) == riga_automatica;
 | ||
|       // mancano le righe, le inserisco
 | ||
|       boom.destroy();
 | ||
|       bool ok=distinta.set_root(row);
 | ||
|       if (ok)
 | ||
|       { 
 | ||
|         bool stop_prod = cau.get_bool("B4");
 | ||
|         
 | ||
|         distinta.explode(boom, TRUE, RAGGR_EXP_NONE, livello, "A", 0, stop_prod);
 | ||
|         //TString codmag(codmag_rauto(r));
 | ||
|         real prezzo(prezzo_rauto(r));
 | ||
|         TRectype * linea_auto;
 | ||
|         for (int newrow=0; newrow < boom.items() ; newrow++)
 | ||
|         {       
 | ||
|           TRiga_esplosione & riga_esp=(TRiga_esplosione & )(boom[newrow]);
 | ||
|           linea_auto = new TRectype(row);
 | ||
|           linea_auto->put(RMOVMAG_CODART, riga_esp.articolo());
 | ||
|           linea_auto->put(RMOVMAG_LIVGIAC, riga_esp.giacenza());
 | ||
|           linea_auto->put(RMOVMAG_UM, riga_esp.um());
 | ||
|           linea_auto->put(RMOVMAG_QUANT, riga_esp.val());
 | ||
|           linea_auto->put(RMOVMAG_CODCAUS, cau.codice());
 | ||
|           //if (codmag.not_empty())
 | ||
|           //  linea_auto->put(RMOVMAG_CODMAG, codmag);
 | ||
|           //if (!prezzo.is_zero())
 | ||
|           const TArticolo & articolo = cached_article(riga_esp.articolo());
 | ||
|           if (tipo_costo == 'U')
 | ||
|             prezzo = articolo.get_real(ANAMAG_ULTCOS1);
 | ||
|           else
 | ||
|             if (tipo_costo == 'S')
 | ||
|               prezzo = articolo.get_real(ANAMAG_COSTSTD);
 | ||
|           linea_auto->put(RMOVMAG_PREZZO, prezzo);
 | ||
|           linea_auto->put(RMOVMAG_NRIG, r+1+newrow);
 | ||
|           linea_auto->put(RMOVMAG_ESPLOSA, TRUE);
 | ||
| 
 | ||
|           char coll_type = articolo.get_char(ANAMAG_COLLTYPE);
 | ||
|           TString8 codmag;
 | ||
|             
 | ||
|           if (coll_type == 'M')
 | ||
|           {
 | ||
|             if (is_coll)
 | ||
|               codmag = b[rigaprec].get(RMOVMAG_CODMAG);
 | ||
|           }
 | ||
|           else
 | ||
|             if (coll_type == 'F')
 | ||
|             {                         
 | ||
|               TString16 key("F|");                                
 | ||
|               key << articolo.get(ANAMAG_CODFORN);
 | ||
|               codmag = cache().get(LF_CFVEN, key, CFV_CODMAG);
 | ||
|             }
 | ||
|             else
 | ||
|               if (coll_type == 'A')
 | ||
|                 codmag = articolo.get(ANAMAG_CODMAG);
 | ||
|           if (codmag.not_empty())
 | ||
|             linea_auto->put(RMOVMAG_CODMAG, codmag);
 | ||
|           b.insert_row(linea_auto);
 | ||
|           added=TRUE;
 | ||
|         }
 | ||
|         // ora ci sono, mi basta eliminare la riga "padre"
 | ||
|         if (boom.items() > 0 )
 | ||
|         {
 | ||
|           if (boom.items() == 1 && codart == ((TRiga_esplosione &)boom[0]).articolo())
 | ||
|             error_box(FR("Movimento di magazzino %ld:\ndistinta %s ciclica"), get_long(MOVMAG_NUMREG),(const char *)codart);
 | ||
|           b.destroy_row(r,TRUE);
 | ||
|         }
 | ||
|         else
 | ||
|           message_box(FR("Movimento di magazzino %ld:\nimpossibile esplodere l'articolo %s"), get_long(MOVMAG_NUMREG),(const char *)codart);
 | ||
|       }
 | ||
| 			else 
 | ||
| 				if (b[r].get_char(RMOVMAG_TIPORIGA) == riga_automatica)
 | ||
| 					b.destroy_row(r,TRUE);
 | ||
| 
 | ||
|     }
 | ||
|   } // ciclo righe
 | ||
|   return added;
 | ||
| }
 | ||
| 
 | ||
| int TMov_mag::write(TBaseisamfile& f) const 
 | ||
| {
 | ||
|   int res;
 | ||
|   add_extrarows();
 | ||
|   if ((res=TMultiple_rectype::write(f))==NOERR ) 
 | ||
|   {
 | ||
|     TMov_mag &myself=((TMov_mag &)*this);
 | ||
|   
 | ||
|     myself.add_saldi();
 | ||
| 		myself.update_balances();  
 | ||
|     myself.add_saldi(false);
 | ||
|   }
 | ||
|   return res;
 | ||
| }
 | ||
| 
 | ||
| int TMov_mag::rewrite(TBaseisamfile& f) const 
 | ||
| {
 | ||
|   int res;
 | ||
|   add_extrarows();
 | ||
|   if ((res=TMultiple_rectype::rewrite(f))==NOERR ) 
 | ||
|   {
 | ||
|     TMov_mag &myself=((TMov_mag &)*this);
 | ||
|     
 | ||
|     myself.add_saldi();
 | ||
|     myself.update_balances();  
 | ||
|     myself.add_saldi(false);
 | ||
|   }
 | ||
|   return res;
 | ||
| }
 | ||
| 
 | ||
| const char* TMov_mag::get_next_key()  
 | ||
| {
 | ||
|   TLocalisamfile f(LF_MOVMAG);
 | ||
|   f.last();
 | ||
|   long a = f.get_long(MOVMAG_NUMREG)+1;
 | ||
|   TString& nextcod = get_tmp_string();
 | ||
|   nextcod.format("%ld", a);
 | ||
|   return nextcod;
 | ||
| }
 | ||
| 
 | ||
| bool TMov_mag::key_complete()
 | ||
| {
 | ||
|   const bool ok = head().get_long(MOVMAG_NUMREG) > 0L;
 | ||
|   return ok;
 | ||
| }
 | ||
| 
 | ||
| //*******
 | ||
| // gestione delle variazione dei saldi
 | ||
| //
 | ||
| //
 | ||
| bool TMov_mag::force_update_bal()
 | ||
| {
 | ||
|   // reset delle strutture per il controlli delle variazioni dei saldi
 | ||
| 	const TRecord_array & b = body();
 | ||
| 
 | ||
| 	_saldi_mag.destroy();
 | ||
| 	_saldi_mag_clifo.destroy();
 | ||
|   add_saldi();
 | ||
|   return update_balances(false);  
 | ||
| }
 | ||
| 
 | ||
| void TMov_mag::renum_mov(const long numreg)
 | ||
| {
 | ||
| 	put(MOVMAG_NUMREG, numreg);
 | ||
| 	renum_key();
 | ||
| }
 | ||
| 
 | ||
| // restituisce il valore dei dati
 | ||
| 
 | ||
| void TMov_mag::add_saldi(const bool plus)
 | ||
| {
 | ||
|   const TRecord_array& b = body();
 | ||
| 
 | ||
|   for (int i = b.last_row(); i > 0; i = b.pred_row(i))
 | ||
|   {
 | ||
| 		const TRectype & rec = b[i];
 | ||
| 		TToken_string & key_mag = TSaldo_mag::key(*this, rec);
 | ||
| 		TSaldo_mag * s_mag = (TSaldo_mag*) _saldi_mag.objptr(key_mag);
 | ||
| 
 | ||
| 		if (s_mag == NULL)
 | ||
| 		{
 | ||
| 			s_mag = new TSaldo_mag(*this, rec);
 | ||
| 			_saldi_mag.add(key_mag, s_mag);
 | ||
| 		}
 | ||
| 
 | ||
| 		real quant = rec.get_real(RMOVMAG_QUANT);
 | ||
| 	  const TCausale_magazzino& caus = causale(i);
 | ||
| 		TArticolo & art = articolo(i);
 | ||
| 		
 | ||
| 		quant =art.convert_to_um(quant, NULL, rec.get(RMOVMAG_UM));
 | ||
| 		
 | ||
| 		real valore = (quant.is_zero() && caus.update_val()) ? rec.get_real(RMOVMAG_PREZZO) : rec.get_real(RMOVMAG_PREZZO) * quant;
 | ||
| 		
 | ||
| 		s_mag->add(quant, valore, plus);
 | ||
| 
 | ||
| 		if (caus.aggiorna_clifo()&& get_long(MOVMAG_CODCF) > 0L)
 | ||
| 		{        
 | ||
| 			TToken_string & key_clifo = TSaldo_mag_clifo::key(*this, rec);
 | ||
| 			TSaldo_mag_clifo * s_clifo = (TSaldo_mag_clifo*) _saldi_mag_clifo.objptr(key_clifo);
 | ||
| 
 | ||
| 			if (s_clifo == NULL)
 | ||
| 			{
 | ||
| 				s_clifo = new TSaldo_mag_clifo(*this, rec);
 | ||
| 				_saldi_mag_clifo.add(key_clifo, s_clifo);
 | ||
| 			}
 | ||
| 			s_clifo->add(quant, valore, plus);
 | ||
| 		}
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| bool TMov_mag::unlock_anamag(const char *codart) 
 | ||
| {
 | ||
|   TLocalisamfile anamag(LF_ANAMAG);
 | ||
|   
 | ||
|   anamag.put(ANAMAG_CODART,codart);
 | ||
|   return (anamag.read(_isequal,_unlock)==NOERR);
 | ||
| }
 | ||
| 
 | ||
| bool TMov_mag::lock_anamag(const char *codart) 
 | ||
| {
 | ||
|   TLocalisamfile anamag(LF_ANAMAG);
 | ||
|   anamag.put(ANAMAG_CODART,codart);
 | ||
|   
 | ||
|   KEY key = K_ENTER;
 | ||
|   while (key != K_ESC)
 | ||
|   {
 | ||
|     if (anamag.read(_isequal,_testandlock)==NOERR) 
 | ||
|       return TRUE;
 | ||
| 
 | ||
|     TString mess;
 | ||
|     mess << TR("Il record di anagrafica dell'articolo '")<< codart << TR("' risulta essere gi<67> in uso.");
 | ||
|     TTimed_breakbox bbox(mess,10);
 | ||
| 
 | ||
|     key = bbox.run();  
 | ||
|   }
 | ||
|   return FALSE;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| void TMov_mag::giac_putkey(TRectype& mag, const TSaldo_mag & s) 
 | ||
| {
 | ||
|   mag.zero();    
 | ||
|   mag.put(MAG_ANNOES, s.codes());
 | ||
|   mag.put(MAG_CODMAG, s.codmag());
 | ||
|   mag.put(MAG_CODART, s.codart());
 | ||
|   mag.put(MAG_LIVELLO, s.livello());
 | ||
| }
 | ||
| 
 | ||
| void TMov_mag::giac_putkey_clifo(TRectype& clifomag, const TSaldo_mag_clifo & s)
 | ||
| {
 | ||
|   clifomag.zero();    
 | ||
|   clifomag.put(CLIFOGIAC_ANNOES, s.codes());
 | ||
|   clifomag.put(CLIFOGIAC_TIPOCF, s.tipocf());
 | ||
|   clifomag.put(CLIFOGIAC_CODCF, s.codcf());
 | ||
|   clifomag.put(CLIFOGIAC_INDSPED, s.codindsp());
 | ||
|   clifomag.put(CLIFOGIAC_CODART, s.codart());
 | ||
|   clifomag.put(CLIFOGIAC_LIVELLO, s.livello());
 | ||
| }
 | ||
| 
 | ||
| // aggiorna tutti i saldi in base alle modifiche fatte.
 | ||
| // il lock su anagrafica dovrebbe garantire il lock su tutte le giacenze dell'articolo
 | ||
| bool TMov_mag::update_balances(bool lock) 
 | ||
| {
 | ||
|   bool updated_bal = true;
 | ||
| 
 | ||
|   const TRecord_array& b = body();
 | ||
|   for (int i = b.last_row(); i > 0; i = b.pred_row(i)) if (causale(i).update_ultcos())
 | ||
|   { 
 | ||
| 		const TRectype& rec = b[i];
 | ||
| 		TArticolo& art = articolo(i);
 | ||
| 
 | ||
|     art.set_nuovo(false);
 | ||
| 		if (art.lock_and_prompt(lock ? _testandlock : _nolock))
 | ||
| 		{
 | ||
| 			const real prezzo = art.convert_to_um(rec.get_real(RMOVMAG_PREZZO), NULL, rec.get(RMOVMAG_UM), false);
 | ||
|       const long numreg = get_long(MOVMAG_NUMREG);
 | ||
| 			art.update_ultcosti(prezzo,get_date(MOVMAG_DATACOMP), numreg, i);
 | ||
| 			art.rewrite();
 | ||
| 		}
 | ||
| 		else
 | ||
|     {
 | ||
| 			if (lock)
 | ||
| 				art.unlock();
 | ||
|     }
 | ||
| 	}       
 | ||
| 
 | ||
|   if (_saldi_mag.items() > 0)
 | ||
| 	{
 | ||
|     TFast_isamfile mag(LF_MAG);
 | ||
|     mag.setkey(2);
 | ||
|     TRectype& magcurr = mag.curr();
 | ||
| 
 | ||
| 		TString_array keys_mag;
 | ||
| 		_saldi_mag.get_keys(keys_mag);
 | ||
| 		keys_mag.sort();
 | ||
| 
 | ||
|     TString msg; 
 | ||
|     msg << TR("Aggiornamento saldi del movimento ") << get(MOVMAG_NUMREG) 
 | ||
|         << ": " << get(MOVMAG_DESCR);
 | ||
|     TProgress_monitor pi(keys_mag.items(), msg, false);
 | ||
|     FOR_EACH_ARRAY_ROW(keys_mag, r, curr_key)
 | ||
| 		{
 | ||
| 			const TSaldo_mag& saldo = (const TSaldo_mag&)_saldi_mag[*curr_key];
 | ||
|       const TCodice_articolo& codart = saldo.codart();
 | ||
| 
 | ||
| 			TArticolo_giacenza& art = cached_article_balances(codart);
 | ||
|       const TCausale_magazzino& caus = cached_causale_magazzino(saldo.codcaus());
 | ||
| 
 | ||
| 			if (art.lock_and_prompt(lock ? _testandlock : _nolock))
 | ||
| 			{
 | ||
| 				giac_putkey(magcurr, saldo);
 | ||
|         int err = mag.read();
 | ||
| 				if (err != NOERR)
 | ||
| 				{
 | ||
|           TRecord_array& sld = art.mag(saldo.codes());
 | ||
|           const int nriga = sld.rows() + 1;
 | ||
| 					giac_putkey(magcurr, saldo);
 | ||
| 					magcurr.put(MAG_NRIGA, nriga);
 | ||
|           sld.add_row(magcurr);
 | ||
|           err = mag.write();
 | ||
|           CHECKD(err == NOERR, "Errore di write:" , err);
 | ||
| 				}
 | ||
|         update_balances(magcurr, saldo, caus);
 | ||
| 				err = mag.rewrite();
 | ||
|         if (err != NOERR)
 | ||
|           updated_bal = false;
 | ||
| 
 | ||
| 				if (lock)
 | ||
| 					art.unlock();
 | ||
| 			}       
 | ||
|       pi.add_status();
 | ||
| 		} 
 | ||
| 	}
 | ||
| 
 | ||
| 	if (_saldi_mag_clifo.items() > 0)
 | ||
| 	{
 | ||
|     TFast_isamfile clifomag(LF_CLIFOGIAC);
 | ||
|     clifomag.setkey(2);
 | ||
|     TRectype& clifomag_curr = clifomag.curr();
 | ||
| 
 | ||
| 		TString_array keys_clifo;
 | ||
| 
 | ||
| 		_saldi_mag_clifo.get_keys(keys_clifo);
 | ||
| 		keys_clifo.sort();
 | ||
| 
 | ||
| 		for (TToken_string* curr_key = (TToken_string*)keys_clifo.first_item();
 | ||
| 				 curr_key != NULL; curr_key = (TToken_string*)keys_clifo.succ_item())      
 | ||
| 		{ 
 | ||
| 			TSaldo_mag_clifo & saldo=(TSaldo_mag_clifo &)_saldi_mag_clifo[*curr_key];
 | ||
| 
 | ||
| 			TArticolo_giacenza & art = cached_article_balances(saldo.codart());
 | ||
| 	    
 | ||
| 			if (art.lock_and_prompt(lock ? _testandlock : _nolock))
 | ||
| 			{
 | ||
| 				giac_putkey_clifo(clifomag_curr, saldo);
 | ||
| 				if (clifomag.read() != NOERR)
 | ||
| 				{
 | ||
| 					// non trovato: aggiungo
 | ||
| 					clifomag.setkey(1);
 | ||
| 					giac_putkey_clifo(clifomag_curr, saldo);
 | ||
| 					clifomag_curr.put(CLIFOGIAC_NRIGA, 999);
 | ||
| 					if (clifomag.read(_isgteq) == NOERR)
 | ||
| 						clifomag.prev();
 | ||
| 					int nriga = 1;
 | ||
| 					if (clifomag_curr.get_int(CLIFOGIAC_ANNOES) == saldo.codes() &&
 | ||
| 							clifomag_curr.get_char(CLIFOGIAC_TIPOCF) == saldo.tipocf() &&
 | ||
| 							clifomag_curr.get(CLIFOGIAC_CODCF) == saldo.codcf() &&
 | ||
| 							clifomag_curr.get(CLIFOGIAC_CODART) == saldo.codart() &&
 | ||
| 							clifomag_curr.get(CLIFOGIAC_LIVELLO ) == saldo.livello())
 | ||
| 						nriga = clifomag_curr.get_int(CLIFOGIAC_NRIGA) + 1;
 | ||
| 					giac_putkey_clifo(clifomag_curr, saldo);
 | ||
| 					clifomag_curr.put(CLIFOGIAC_NRIGA, nriga);
 | ||
| 					clifomag.write();
 | ||
| 					clifomag.setkey(2);
 | ||
| 				} 
 | ||
| 				update_balances_clifo(clifomag_curr, saldo);
 | ||
| 				clifomag.rewrite();
 | ||
| 
 | ||
| 				if (lock)
 | ||
| 					art.unlock();
 | ||
| 			}
 | ||
| 		}
 | ||
| 	}
 | ||
| 	_saldi_mag.destroy();
 | ||
| 	_saldi_mag_clifo.destroy();
 | ||
|   return updated_bal;
 | ||
| }
 | ||
| 
 | ||
| // aggiorna i saldi del record corrente 
 | ||
| // in base alla causale e alla modifica fatta (con segno + o -)
 | ||
| void TMov_mag::update_balances(TRectype& magrec, const TSaldo_mag& s, const TCausale_magazzino& caus) const
 | ||
| {
 | ||
|   if (caus.update_qta())
 | ||
|   {
 | ||
| 		const real diff = s.quant();
 | ||
|     if (!diff.is_zero())
 | ||
|     {
 | ||
|       update_balance(magrec, MAG_GIAC, diff, caus.sgn(s_giac)); // update ..
 | ||
|       update_balance(magrec, MAG_ACQ, diff, caus.sgn(s_acq)); // update ..
 | ||
|       update_balance(magrec, MAG_ENT, diff, caus.sgn(s_ent));
 | ||
|       update_balance(magrec, MAG_VEN, diff, caus.sgn(s_ven));
 | ||
|       update_balance(magrec, MAG_USC, diff, caus.sgn(s_usc));
 | ||
|       update_balance(magrec, MAG_ORDC, diff, caus.sgn(s_ordc));
 | ||
|       update_balance(magrec, MAG_ORDF, diff, caus.sgn(s_ordf));
 | ||
|       update_balance(magrec, MAG_RIM, diff, caus.sgn(s_rim));
 | ||
|       update_balance(magrec, MAG_SCARTI, diff, caus.sgn(s_scart));
 | ||
|       update_balance(magrec, MAG_INCL, diff, caus.sgn(s_incl));
 | ||
|       update_balance(magrec, MAG_ACL, diff, caus.sgn(s_acl));
 | ||
|       update_balance(magrec, MAG_PRODCOMP, diff, caus.sgn(s_prodc));
 | ||
|       update_balance(magrec, MAG_PRODFIN, diff, caus.sgn(s_prodf));
 | ||
|       update_balance(magrec, MAG_NLABEL, diff, caus.sgn(s_label));
 | ||
|       update_balance(magrec, MAG_USER1, diff, caus.sgn(s_user1));
 | ||
|       update_balance(magrec, MAG_USER2, diff, caus.sgn(s_user2));
 | ||
|       update_balance(magrec, MAG_USER3, diff, caus.sgn(s_user3));
 | ||
|       update_balance(magrec, MAG_USER4, diff, caus.sgn(s_user4));
 | ||
|       update_balance(magrec, MAG_USER5, diff, caus.sgn(s_user5));
 | ||
|       update_balance(magrec, MAG_USER6, diff, caus.sgn(s_user6));
 | ||
|     }
 | ||
|   }
 | ||
|   if (caus.update_val())
 | ||
|   {
 | ||
| 		const real diff_val = s.valore();
 | ||
|     if (!diff_val.is_zero())
 | ||
|     {
 | ||
|       update_balance(magrec, MAG_VALACQ, diff_val, caus.sgn(s_acq)); // update ..
 | ||
|       update_balance(magrec, MAG_VALENT, diff_val, caus.sgn(s_ent));
 | ||
|       update_balance(magrec, MAG_VALVEN, diff_val, caus.sgn(s_ven));
 | ||
|       update_balance(magrec, MAG_VALUSC, diff_val, caus.sgn(s_usc));
 | ||
|       update_balance(magrec, MAG_VALORDC, diff_val, caus.sgn(s_ordc));
 | ||
|       update_balance(magrec, MAG_VALORDF, diff_val, caus.sgn(s_ordf));
 | ||
|       update_balance(magrec, MAG_VALRIM, diff_val, caus.sgn(s_rim));
 | ||
|       update_balance(magrec, MAG_VALSCARTI, diff_val, caus.sgn(s_scart));
 | ||
|       update_balance(magrec, MAG_USERVAL1, diff_val, caus.sgn(s_user1));
 | ||
|       update_balance(magrec, MAG_USERVAL2, diff_val, caus.sgn(s_user2));
 | ||
|       update_balance(magrec, MAG_USERVAL3, diff_val, caus.sgn(s_user3));
 | ||
|       update_balance(magrec, MAG_USERVAL4, diff_val, caus.sgn(s_user4));
 | ||
|       update_balance(magrec, MAG_USERVAL5, diff_val, caus.sgn(s_user5));
 | ||
|       update_balance(magrec, MAG_USERVAL6, diff_val, caus.sgn(s_user6));
 | ||
|     }
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| // aggiorna i saldi del record corrente 
 | ||
| // in base alla causale e alla modifica fatta (con segno + o -)
 | ||
| void TMov_mag::update_balances_clifo(TRectype & clifomagrec, const TSaldo_mag_clifo & s)
 | ||
| {
 | ||
|   const TCausale_magazzino& caus = cached_causale_magazzino(s.codcaus());
 | ||
| 
 | ||
| 	if (caus.update_qta())
 | ||
|   {
 | ||
| 		const real diff = s.quant();
 | ||
| 
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_GIAC, -diff, caus.sgn(s_giac)); // update ..
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_ACQ, diff, caus.sgn(s_ven)); // update ..
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_ENT, diff, caus.sgn(s_usc));
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_VEN, diff, caus.sgn(s_acq));
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_USC, diff, caus.sgn(s_ent));
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_ORDC, diff, caus.sgn(s_ordf));
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_ORDF, diff, caus.sgn(s_ordc));
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_RIM, -diff, caus.sgn(s_rim));
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_SCARTI, -diff, caus.sgn(s_scart));
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_INCL, diff, caus.sgn(s_acl));
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_ACL, diff, caus.sgn(s_incl));
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_PRODCOMP, -diff, caus.sgn(s_prodc));
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_PRODFIN, -diff, caus.sgn(s_prodf));
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_DOTIN, diff, caus.sgn(s_dotin));
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_DOTOD, diff, caus.sgn(s_dotod));
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_DOTTM, diff, caus.sgn(s_dottm));
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_CONSANNO, diff, caus.sgn(s_consanno));
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_USER1, diff, caus.sgn(s_user1));
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_USER2, diff, caus.sgn(s_user2));
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_USER3, diff, caus.sgn(s_user3));
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_USER4, diff, caus.sgn(s_user4));
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_USER5, diff, caus.sgn(s_user5));
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_USER6, diff, caus.sgn(s_user6));
 | ||
|   }
 | ||
|   if (caus.update_val())
 | ||
|   {
 | ||
| 		const real diff_val = s.valore();
 | ||
| 
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_VALACQ, diff_val, caus.sgn(s_ven)); // update ..
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_VALENT, diff_val, caus.sgn(s_usc));
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_VALVEN, diff_val, caus.sgn(s_acq));
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_VALUSC, diff_val, caus.sgn(s_ven));
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_VALORDC, diff_val, caus.sgn(s_ordf));
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_VALORDF, diff_val, caus.sgn(s_ordc));
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_VALRIM, -diff_val, caus.sgn(s_rim));
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_VALSCARTI, -diff_val, caus.sgn(s_scart));
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_USERVAL1, diff_val, caus.sgn(s_user1));
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_USERVAL2, diff_val, caus.sgn(s_user2));
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_USERVAL3, diff_val, caus.sgn(s_user3));
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_USERVAL4, diff_val, caus.sgn(s_user4));
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_USERVAL5, diff_val, caus.sgn(s_user5));
 | ||
|     update_balance(clifomagrec, CLIFOGIAC_USERVAL6, diff_val, caus.sgn(s_user6));
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| void TMov_mag::update_balances(TRectype& magrec, int numrig, bool plus) 
 | ||
| {
 | ||
| 	const TRectype& rec = body()[numrig];
 | ||
|   TSaldo_mag saldo(*this, rec);
 | ||
|   const TCausale_magazzino& caus = cached_causale_magazzino(saldo.codcaus());
 | ||
| 	TArticolo& art = articolo(numrig);
 | ||
| 
 | ||
| 	real quant = rec.get_real(RMOVMAG_QUANT);
 | ||
| 	quant = art.convert_to_um(quant, NULL, rec.get(RMOVMAG_UM));
 | ||
| 
 | ||
| 	const real valore = (quant.is_zero() && caus.update_val()) ? rec.get_real(RMOVMAG_PREZZO) : rec.get_real(RMOVMAG_PREZZO) * quant;
 | ||
| 		
 | ||
| 	saldo.add(quant, valore, plus);
 | ||
| 
 | ||
|   return update_balances(magrec, saldo, caus);
 | ||
| }
 | ||
| 
 | ||
| void TMov_mag::update_balances_clifo(TRectype& cliforec, int numrig, bool plus) 
 | ||
| {
 | ||
| 	const TRectype & rec = body()[numrig];
 | ||
|   TSaldo_mag_clifo saldo(*this, rec);
 | ||
| 	real quant = rec.get_real(RMOVMAG_QUANT);
 | ||
|   const TCausale_magazzino& caus = cached_causale_magazzino(saldo.codcaus());
 | ||
| 	TArticolo & art = articolo(numrig);
 | ||
| 			
 | ||
| 	quant = art.convert_to_um(quant, NULL, rec.get(RMOVMAG_UM));
 | ||
| 
 | ||
| 	real valore = (quant.is_zero() && caus.update_val()) ? rec.get_real(RMOVMAG_PREZZO) : rec.get_real(RMOVMAG_PREZZO) * quant;
 | ||
| 		
 | ||
| 	saldo.add(quant, valore, plus);
 | ||
| 
 | ||
|   return update_balances_clifo(cliforec, saldo);
 | ||
| }
 | ||
| 
 | ||
| int TMov_mag::codice_esercizio(const TDate& d) const
 | ||
| {
 | ||
|   return esercizi().date2esc(d);
 | ||
| }
 | ||
| 
 | ||
| void TMov_mag::update_balance(TRectype& rec, const char* fieldname, const real& val, const int sgn) const
 | ||
| {
 | ||
|   if (sgn != 0 && !val.is_zero())
 | ||
|   {
 | ||
|     if (sgn > 0)
 | ||
|       rec.add(fieldname, val);
 | ||
|     else
 | ||
|       rec.add(fieldname, -val);
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| struct TBalance_params
 | ||
| {
 | ||
| 	bool zero_giac;
 | ||
| 	bool closed;
 | ||
| 	int codes;
 | ||
| 	int codesprec;
 | ||
| 	TTipo_valorizz tipov;
 | ||
| 	const char* catv;
 | ||
| 	const char* codl;
 | ||
| };
 | ||
| 
 | ||
| HIDDEN bool reset_giac(const TRelation& rel, void* pJolly)
 | ||
| {
 | ||
| 	TBalance_params& p = *((TBalance_params *)pJolly);
 | ||
| 	TArticolo_giacenza articolo(rel.curr());
 | ||
|   if (p.zero_giac)
 | ||
|     articolo.azzera_saldi(p.codes, p.codesprec);
 | ||
|   else
 | ||
|     articolo.riporta_saldi(p.codesprec, p.codes, p.tipov, p.catv, p.codl);
 | ||
| 	return true;
 | ||
| }
 | ||
| 
 | ||
| void reset_clifogiac(TRectype& rec, const TRectype& oldrec, bool closed)
 | ||
| {
 | ||
| 	if (!oldrec.empty())
 | ||
| 	{
 | ||
| 	  const real acq = oldrec.get_real(CLIFOGIAC_ACQ) +  oldrec.get_real(CLIFOGIAC_RIM);
 | ||
| 		const real valacq = oldrec.get_real(CLIFOGIAC_VALACQ) + oldrec.get_real(CLIFOGIAC_VALRIM);                       
 | ||
| 		real val = acq.is_zero() ? ZERO : valacq / acq;
 | ||
|     const TPrice p(val);
 | ||
|     real rim;
 | ||
| 		
 | ||
| 		rim += oldrec.get_real(CLIFOGIAC_GIAC); 
 | ||
|     rim += oldrec.get_real(CLIFOGIAC_PRODFIN);
 | ||
|     rim -= oldrec.get_real(CLIFOGIAC_PRODCOMP);
 | ||
|     rim += oldrec.get_real(CLIFOGIAC_ACL);
 | ||
|     rim -= oldrec.get_real(CLIFOGIAC_INCL);
 | ||
| 
 | ||
|     const real valrim = p.get_num() * rim;
 | ||
| 		const TCurrency c(valrim); // Arrontonda alla valuta
 | ||
| 
 | ||
|     rec.put(CLIFOGIAC_RIM, rim); rec.put(CLIFOGIAC_VALRIM, c.get_num());
 | ||
|     rec.zero(CLIFOGIAC_ACQ); rec.zero(CLIFOGIAC_VALACQ);
 | ||
|     rec.zero(CLIFOGIAC_ENT); rec.zero(CLIFOGIAC_VALENT);
 | ||
|     rec.zero(CLIFOGIAC_VEN); rec.zero(CLIFOGIAC_VALVEN);
 | ||
|     rec.zero(CLIFOGIAC_USC); rec.zero(CLIFOGIAC_VALUSC);
 | ||
|     rec.zero(CLIFOGIAC_SCARTI);
 | ||
|     if (!riporta_ordinato() || !closed)
 | ||
|     {
 | ||
|       rec.zero(CLIFOGIAC_ORDF);
 | ||
| 			rec.zero(CLIFOGIAC_VALORDF);
 | ||
|       rec.zero(CLIFOGIAC_ORDC);
 | ||
| 			rec.zero(CLIFOGIAC_VALORDC);
 | ||
|     }
 | ||
| 		//if (closed)  // Gestione che pare insensata
 | ||
| 		{
 | ||
| 	    rec.put(CLIFOGIAC_DOTOD, oldrec.get(CLIFOGIAC_DOTOD));
 | ||
| 		  rec.put(CLIFOGIAC_DOTIN, oldrec.get(CLIFOGIAC_DOTIN));
 | ||
| 			rec.put(CLIFOGIAC_DOTTM, oldrec.get(CLIFOGIAC_DOTTM));
 | ||
| 		}
 | ||
|     /*
 | ||
| 		else
 | ||
| 		{
 | ||
| 			rec.zero(CLIFOGIAC_DOTOD);
 | ||
| 	    rec.zero(CLIFOGIAC_DOTIN);
 | ||
| 		  rec.zero(CLIFOGIAC_DOTTM);
 | ||
| 		}
 | ||
|     */
 | ||
|   }
 | ||
| 	else
 | ||
| 	{
 | ||
|     for (int i = 0; zero_fields[i]; i++)
 | ||
|       rec.zero(zero_fields[i]);
 | ||
|     rec.zero(CLIFOGIAC_DOTIN);
 | ||
|     rec.zero(CLIFOGIAC_DOTOD);
 | ||
|     rec.zero(CLIFOGIAC_DOTTM);
 | ||
| 	}
 | ||
|   rec.zero(CLIFOGIAC_CONSANNO);
 | ||
| }
 | ||
| 
 | ||
| void update_clifogiac(TRectype & rec, const TRectype & oldrec)
 | ||
| {
 | ||
| 	if (!oldrec.empty())
 | ||
| 	{
 | ||
| 	  const real acq = oldrec.get_real(CLIFOGIAC_ACQ) +  oldrec.get_real(CLIFOGIAC_RIM);
 | ||
| 		const real valacq = oldrec.get_real(CLIFOGIAC_VALACQ) + oldrec.get_real(CLIFOGIAC_VALRIM);                       
 | ||
| 		real val = acq.is_zero() ? ZERO : valacq / acq;
 | ||
|     const TPrice p(val);
 | ||
|     const real rim_prec = rec.get_real(CLIFOGIAC_RIM);
 | ||
|     real rim = oldrec.get_real(CLIFOGIAC_GIAC);
 | ||
| 		
 | ||
|     rim += oldrec.get_real(CLIFOGIAC_PRODFIN);
 | ||
|     rim -= oldrec.get_real(CLIFOGIAC_PRODCOMP);
 | ||
|     rim += oldrec.get_real(CLIFOGIAC_ACL);
 | ||
|     rim -= oldrec.get_real(CLIFOGIAC_INCL);
 | ||
| 
 | ||
|     const real valrim = p.get_num() * rim;
 | ||
| 		const TCurrency c(valrim); // Arrontonda alla valuta
 | ||
| 
 | ||
|     rec.put(CLIFOGIAC_RIM, rim); rec.put(CLIFOGIAC_VALRIM, c.get_num());
 | ||
| 		rec.add(CLIFOGIAC_GIAC, rim - rim_prec); 
 | ||
|     if (riporta_ordinato())
 | ||
|     {
 | ||
|       rec.add(CLIFOGIAC_ORDF, oldrec.get_real(CLIFOGIAC_ORDF));
 | ||
| 			rec.add(CLIFOGIAC_VALORDF, oldrec.get_real(CLIFOGIAC_VALORDF));
 | ||
|       rec.add(CLIFOGIAC_ORDC, oldrec.get_real(CLIFOGIAC_ORDC));
 | ||
| 			rec.add(CLIFOGIAC_VALORDC, oldrec.get_real(CLIFOGIAC_VALORDC));
 | ||
|     }
 | ||
| 	  rec.add(CLIFOGIAC_DOTOD, oldrec.get_real(CLIFOGIAC_DOTOD));
 | ||
| 		rec.add(CLIFOGIAC_DOTIN, oldrec.get_real(CLIFOGIAC_DOTIN));
 | ||
| 		rec.add(CLIFOGIAC_DOTTM, oldrec.get_real(CLIFOGIAC_DOTTM));
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| HIDDEN bool rel_reset_clifogiac(const TRelation& rel, void* pJolly)
 | ||
| {
 | ||
| 	const TBalance_params& p = *((TBalance_params *)pJolly);
 | ||
| 
 | ||
|   TLocalisamfile& cg = rel.lfile();
 | ||
|   const TRectype oldrec = cg.curr();  // DON'T USE const TRectype& ON READING FILE!
 | ||
|   CHECK(oldrec.get_int(CLIFOGIAC_ANNOES) == p.codesprec, "Anno esercizio non valido");
 | ||
| 
 | ||
|   TRectype& newrec = cg.curr();
 | ||
| 	newrec.put(CLIFOGIAC_ANNOES, p.codes); // cambio da vecchio a nuovo anno
 | ||
| 	if (cg.read() != NOERR) // verifica se record esiste gi<67>
 | ||
| 	{
 | ||
| 		newrec = oldrec;
 | ||
| 		newrec.put(CLIFOGIAC_ANNOES, p.codes);
 | ||
| 	}
 | ||
| 	reset_clifogiac(newrec, oldrec, p.closed);
 | ||
| 	return cg.write_rewrite() == NOERR;
 | ||
| }
 | ||
| 
 | ||
| HIDDEN bool rel_reset_newclifogiac(const TRelation& rel, void* pJolly)
 | ||
| {
 | ||
| 	const TBalance_params& p = *((TBalance_params *)pJolly);
 | ||
|   if (p.codesprec > 0) // Always!
 | ||
|   {
 | ||
|     TLocalisamfile& cg = rel.lfile();
 | ||
|     TRectype newrec = cg.curr();
 | ||
|     CHECK(newrec.get_int(CLIFOGIAC_ANNOES) == p.codes, "Anno esercizio non valido");
 | ||
|   	cg.put(CLIFOGIAC_ANNOES, p.codesprec); // cambio da nuovo a vecchio anno
 | ||
| 	  if (cg.read() != NOERR)                // verifica se prima non esisteva allora azzero anno nuovo
 | ||
|     {
 | ||
|       cg.zero();
 | ||
|       reset_clifogiac(newrec, cg.curr(), p.closed);
 | ||
|       newrec.rewrite(cg);
 | ||
|     }
 | ||
|   }
 | ||
|   return true;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| bool recalc_mov(const TRelation& rel, void* pJolly)
 | ||
| {
 | ||
| 	TMov_mag & mov_rec = (TMov_mag &) rel.lfile().curr();
 | ||
| 	bool & ok = *((bool *) pJolly);
 | ||
| 
 | ||
|   ok = mov_rec.force_update_bal();
 | ||
| 	return true;
 | ||
| }
 | ||
| 
 | ||
| bool rebuild_balances(int codes, const TTipo_valorizz tipo_valorizz,
 | ||
| 											const char* catven, const char* codlis)
 | ||
| {
 | ||
| 	TSystemisamfile a(LF_MOVMAG);
 | ||
| 	if (a.open(_excllock) != NOERR)
 | ||
| 		return false;
 | ||
| 
 | ||
|   const TEsercizi_contabili& esc = esercizi();
 | ||
| 
 | ||
|   TBalance_params p;
 | ||
| 	p.codes = codes;
 | ||
| 	p.codesprec = esc.pred(codes);
 | ||
|   p.closed = p.codesprec <= 0 || esc[p.codesprec].chiusura_mag().ok();
 | ||
|   p.zero_giac = p.closed;
 | ||
| 	p.catv = catven;
 | ||
| 	p.codl = codlis;
 | ||
| 	p.tipov = tipo_valorizz;
 | ||
| 	
 | ||
|   TString msg;
 | ||
|   {
 | ||
|     // azzera tutte giacenze (ciclo sulle giacenze)
 | ||
|     TRelation anamag_rel(LF_ANAMAG);
 | ||
| 	  TCursor anamag_cur(&anamag_rel);
 | ||
|   
 | ||
| 	  //anamag_cur.relation()->lfile().set_curr(new TArticolo_giacenza());
 | ||
| 	  msg.format(FR("Ricostruzione saldi esercizio %04d: azzeramento..."), codes);
 | ||
| 	  anamag_cur.scan(reset_giac, (void*)&p, msg);
 | ||
|   }
 | ||
| 
 | ||
|   if (p.codesprec > 0)
 | ||
|   {
 | ||
|     TRelation clifogiac_rel(LF_CLIFOGIAC);
 | ||
|     TRectype filter = clifogiac_rel.curr();
 | ||
|     filter.put(CLIFOGIAC_ANNOES, p.codesprec);          // Scandisce anno precedente 
 | ||
|     TCursor c(&clifogiac_rel, "", 1, &filter, &filter); // ANNO+CODCF+CODART+NRIGA
 | ||
|     msg.format(FR("Ricostruzione saldi esercizio %04d: azzeramento giacenze clienti..."), codes);
 | ||
|     c.scan(rel_reset_clifogiac, (void*)&p, msg);
 | ||
| 
 | ||
|     filter.put(CLIFOGIAC_ANNOES, p.codes);              // Scandisce anno corrente
 | ||
|     c.setregion(filter, filter);
 | ||
|     msg.format(FR("Ricostruzione saldi esercizio %04d: ricalcolo dotazione iniziale..."), codes);
 | ||
|     c.scan(rel_reset_newclifogiac, (void*)&p, msg);
 | ||
|   }
 | ||
| 
 | ||
|   // Compattamento giacenze dopo cancellazione
 | ||
|   {
 | ||
|     //prefix().close_closeable_isamfiles(); // Altrimenti segnala -69 durante la pack
 | ||
|   	TSystemisamfile mag(LF_MAG);
 | ||
|     mag.pack(true, true);
 | ||
| 
 | ||
|     /* Mi da sempre errore di compattamento
 | ||
|     if (p.codesprec > 0)
 | ||
|     {
 | ||
|   	  TSystemisamfile clifogiac(LF_CLIFOGIAC);
 | ||
|       clifogiac.pack(true, true);
 | ||
|     }
 | ||
|     */
 | ||
|   }
 | ||
|     
 | ||
|   // ricostruisce i saldi (ciclo sui movimenti)
 | ||
|   bool ok = true;
 | ||
|   {
 | ||
|     TRelation relmovmag(LF_MOVMAG);
 | ||
| 	  TRectype& rec = relmovmag.curr();
 | ||
| 	  rec.put(MOVMAG_ANNOES, codes);
 | ||
| 
 | ||
| 	  TCursor mov_cur(&relmovmag, "", 2, &rec, &rec);
 | ||
|     relmovmag.lfile().set_curr(new TMov_mag());
 | ||
| 	  msg.format(FR("Ricostruzione saldi esercizio %04d ..."), codes);
 | ||
| 	  mov_cur.scan(recalc_mov, (void*)&ok, msg);
 | ||
|   }
 | ||
| 
 | ||
| 	a.close();
 | ||
| 
 | ||
|   return ok;
 | ||
| }
 |